Changeset 629 in dev for trunk/ab5.0/abdev/abdev/MessageCallOperation.cpp
- Timestamp:
- Jun 2, 2008, 11:50:24 PM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/ab5.0/abdev/abdev/MessageCallOperation.cpp
r625 r629 41 41 CallBackNameLen=pWindowInfo->GetCallbackName().size(); 42 42 43 buffer = ReadBuffer( projectInfo.GetWorkDir().GetPath() + pWindowInfo->GetSourceFileName () );43 buffer = ReadBuffer( projectInfo.GetWorkDir().GetPath() + pWindowInfo->GetSourceFileNameForOldVer( projectInfo.GetWorkDir().GetPath() ) ); 44 44 45 45 *num=0; … … 50 50 //メッセージ 51 51 *ppItemEventInfo=(ITEMEVENTINFO *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,sizeof(ITEMEVENTINFO)); 52 for(i=0,i4=0;;i++){ 53 if(buffer[i]=='\0') break;54 55 //注釈(複数行)56 if(buffer[i]=='/'&&buffer[i+1]=='*'){57 i+=2; 58 while(!(buffer[i]=='*'&&buffer[i+1]=='/')){59 if(buffer[i]=='\0'){60 i--;61 break;62 }63 i++;64 }65 continue;66 }67 68 if((buffer[i]=='\r'&&buffer[i+1]=='\n'&&buffer[i+2]!='\0')||i==0){69 if(buffer[i]=='\r'&&buffer[i+1]=='\n') i2=i+2;70 else i2=i; 71 while(buffer[i2]>='0'&&buffer[i2]<='9') i2++;72 while(buffer[i2]==' '||buffer[i2]=='\t') i2++;73 if(memicmp(buffer+i2,"Sub",3)==0&&(buffer[i2+3]==' '||buffer[i2+3]=='\t')){74 i2+=4;52 53 if( buffer ) 54 { 55 for(i=0,i4=0;;i++){ 56 if(buffer[i]=='\0') break; 57 58 //注釈(複数行) 59 if(buffer[i]=='/'&&buffer[i+1]=='*'){ 60 i+=2; 61 while(!(buffer[i]=='*'&&buffer[i+1]=='/')){ 62 if(buffer[i]=='\0'){ 63 i--; 64 break; 65 } 66 i++; 67 } 68 continue; 69 } 70 71 if((buffer[i]=='\r'&&buffer[i+1]=='\n'&&buffer[i+2]!='\0')||i==0){ 72 if(buffer[i]=='\r'&&buffer[i+1]=='\n') i2=i+2; 73 else i2=i; 74 while(buffer[i2]>='0'&&buffer[i2]<='9') i2++; 75 75 while(buffer[i2]==' '||buffer[i2]=='\t') i2++; 76 strncpy(temporary,buffer+i2,NameLen); 77 temporary[NameLen]=0; 78 if( pWindowInfo->GetName() == temporary && buffer[i2+NameLen] == '_' ){ 79 for(i2+=NameLen+1,i3=0;;i2++,i3++){ 80 if(!IsVariableChar(buffer[i2])){ 81 temporary[i3]=0; 82 break; 83 } 84 temporary[i3]=buffer[i2]; 85 } 86 i6=GetItemMessageInfo(WndInfoNum,temporary,temp2); 87 if(i6){ 88 //アイテムメッセージ(WM_COMMAND、WM_NOTIFY) 89 for(i5=0;;i5++){ 90 if((*ppItemEventInfo)[i5].IdName==0){ 91 *ppItemEventInfo=(ITEMEVENTINFO *)HeapReAlloc(hHeap,HEAP_ZERO_MEMORY,*ppItemEventInfo,(i4+2)*sizeof(ITEMEVENTINFO)); 92 (*ppItemEventInfo)[i4].IdName=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1); 93 lstrcpy((*ppItemEventInfo)[i4].IdName,temporary); 94 (*ppItemEventInfo)[i4].pEventNames=(char **)HeapAlloc(hHeap,0,1); 95 (*ppItemEventInfo)[i4].ClassID=i6; 96 i4++; 76 if(memicmp(buffer+i2,"Sub",3)==0&&(buffer[i2+3]==' '||buffer[i2+3]=='\t')){ 77 i2+=4; 78 while(buffer[i2]==' '||buffer[i2]=='\t') i2++; 79 strncpy(temporary,buffer+i2,NameLen); 80 temporary[NameLen]=0; 81 if( pWindowInfo->GetName() == temporary && buffer[i2+NameLen] == '_' ){ 82 for(i2+=NameLen+1,i3=0;;i2++,i3++){ 83 if(!IsVariableChar(buffer[i2])){ 84 temporary[i3]=0; 97 85 break; 98 86 } 99 if(lstrcmp((*ppItemEventInfo)[i5].IdName,temporary)==0) break;87 temporary[i3]=buffer[i2]; 100 88 } 101 (*ppItemEventInfo)[i5].pEventNames=(char **)HeapReAlloc(hHeap,0,(*ppItemEventInfo)[i5].pEventNames,((*ppItemEventInfo)[i5].EventNum+1)*sizeof(char *)); 102 (*ppItemEventInfo)[i5].pEventNames[(*ppItemEventInfo)[i5].EventNum]=(char *)HeapAlloc(hHeap,0,lstrlen(temp2)+1); 103 lstrcpy((*ppItemEventInfo)[i5].pEventNames[(*ppItemEventInfo)[i5].EventNum],temp2); 104 (*ppItemEventInfo)[i5].EventNum++; 89 i6=GetItemMessageInfo(WndInfoNum,temporary,temp2); 90 if(i6){ 91 //アイテムメッセージ(WM_COMMAND、WM_NOTIFY) 92 for(i5=0;;i5++){ 93 if((*ppItemEventInfo)[i5].IdName==0){ 94 *ppItemEventInfo=(ITEMEVENTINFO *)HeapReAlloc(hHeap,HEAP_ZERO_MEMORY,*ppItemEventInfo,(i4+2)*sizeof(ITEMEVENTINFO)); 95 (*ppItemEventInfo)[i4].IdName=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1); 96 lstrcpy((*ppItemEventInfo)[i4].IdName,temporary); 97 (*ppItemEventInfo)[i4].pEventNames=(char **)HeapAlloc(hHeap,0,1); 98 (*ppItemEventInfo)[i4].ClassID=i6; 99 i4++; 100 break; 101 } 102 if(lstrcmp((*ppItemEventInfo)[i5].IdName,temporary)==0) break; 103 } 104 (*ppItemEventInfo)[i5].pEventNames=(char **)HeapReAlloc(hHeap,0,(*ppItemEventInfo)[i5].pEventNames,((*ppItemEventInfo)[i5].EventNum+1)*sizeof(char *)); 105 (*ppItemEventInfo)[i5].pEventNames[(*ppItemEventInfo)[i5].EventNum]=(char *)HeapAlloc(hHeap,0,lstrlen(temp2)+1); 106 lstrcpy((*ppItemEventInfo)[i5].pEventNames[(*ppItemEventInfo)[i5].EventNum],temp2); 107 (*ppItemEventInfo)[i5].EventNum++; 108 } 109 else if(temporary[0]){ 110 //一般メッセージ 111 ppNames=(char **)HeapReAlloc(hHeap,0,ppNames,(*num+1)*sizeof(char *)); 112 ppNames[*num]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1); 113 lstrcpy(ppNames[*num],temporary); 114 (*num)++; 115 } 105 116 } 106 else if(temporary[0]){ 107 //一般メッセージ 108 ppNames=(char **)HeapReAlloc(hHeap,0,ppNames,(*num+1)*sizeof(char *)); 109 ppNames[*num]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1); 110 lstrcpy(ppNames[*num],temporary); 111 (*num)++; 117 } 118 if(memicmp(buffer+i2,"Function",8)==0&&(buffer[i2+8]==' '||buffer[i2+8]=='\t')){ 119 //[WndName]_WindowProcのみFunction定義 120 i2+=9; 121 while(buffer[i2]==' '||buffer[i2]=='\t') i2++; 122 if(memicmp(buffer+i2,pWindowInfo->GetCallbackName().c_str(),CallBackNameLen)==0&& 123 (buffer[i2+CallBackNameLen]==' '||buffer[i2+CallBackNameLen]=='\t'||buffer[i2+CallBackNameLen]=='(')){ 124 *pbAlways=1; 112 125 } 113 126 } 114 127 } 115 if(memicmp(buffer+i2,"Function",8)==0&&(buffer[i2+8]==' '||buffer[i2+8]=='\t')){ 116 //[WndName]_WindowProcのみFunction定義 117 i2+=9; 118 while(buffer[i2]==' '||buffer[i2]=='\t') i2++; 119 if(memicmp(buffer+i2,pWindowInfo->GetCallbackName().c_str(),CallBackNameLen)==0&& 120 (buffer[i2+CallBackNameLen]==' '||buffer[i2+CallBackNameLen]=='\t'||buffer[i2+CallBackNameLen]=='(')){ 121 *pbAlways=1; 122 } 123 } 124 } 125 } 126 HeapDefaultFree(buffer); 128 } 129 HeapDefaultFree(buffer); 130 } 127 131 128 132 return ppNames; … … 136 140 ActiveBasic::PM::WindowInfo *pWindowInfo = projectInfo.windowInfos[WndInfoNum]; 137 141 138 hChild=OpenFileWithExtension( projectInfo.GetWorkDir().GetPath() + pWindowInfo->GetSourceFileName () );142 hChild=OpenFileWithExtension( projectInfo.GetWorkDir().GetPath() + pWindowInfo->GetSourceFileNameForOldVer( projectInfo.GetWorkDir().GetPath() ) ); 139 143 if(!hChild) return; 140 144 WndNum=GetWndNum(hChild); 141 145 142 pBuf=MdiInfo[WndNum] .pMdiTextEdit->buffer;146 pBuf=MdiInfo[WndNum]->pMdiTextEdit->buffer; 143 147 144 148 for(i=0;;i++){ … … 195 199 TextEdit_SetSel(WndNum,i+2,i+i2); 196 200 } 197 SetFocus(MdiInfo[WndNum] .pMdiTextEdit->hEdit);201 SetFocus(MdiInfo[WndNum]->pMdiTextEdit->hEdit); 198 202 } 199 203 void InsertEventToList(HWND hList,int ItemNum,char *EventName,char *MessageName,char *OutLine){ … … 221 225 222 226 MaxCount=ListView_GetItemCount(hList); 223 if(MdiInfo[WndNum] .MdiRadInfo->SelectingItem[0]==SELECT_WINDOW){227 if(MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]==SELECT_WINDOW){ 224 228 if(dwEventType==EVENTTYPE_DEFAULT){ 225 229 for(i=0;i<MaxCount;i++){ … … 296 300 sprintf(EventName,"%s_%s_%s", 297 301 pWindowInfo->GetName().c_str(), 298 pWindowInfo->childWindowInfos[MdiInfo[WndNum] .MdiRadInfo->SelectingItem[0]]->GetName().c_str(),302 pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->GetName().c_str(), 299 303 temporary); 300 304 break; … … 303 307 if(i==MaxCount) return 0; 304 308 305 if(pWindowInfo->childWindowInfos[MdiInfo[WndNum] .MdiRadInfo->SelectingItem[0]]->Control==CT_LISTVIEW){309 if(pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->Control==CT_LISTVIEW){ 306 310 //ListView 307 311 if(i==0) lstrcpy(Parameter,"ByRef nmListView As NMLISTVIEW"); … … 327 331 else if(i==20) lstrcpy(Parameter,"ByRef nmLVDispInfo As NMLVDISPINFO"); 328 332 } 329 else if(pWindowInfo->childWindowInfos[MdiInfo[WndNum] .MdiRadInfo->SelectingItem[0]]->Control==CT_PROGRESSBAR){333 else if(pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->Control==CT_PROGRESSBAR){ 330 334 //ProgressBar 331 335 lstrcpy(Parameter,"ByRef nmHdr As NMHDR"); 332 336 } 333 else if(pWindowInfo->childWindowInfos[MdiInfo[WndNum] .MdiRadInfo->SelectingItem[0]]->Control==CT_TRACKBAR){337 else if(pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->Control==CT_TRACKBAR){ 334 338 //TrackBar 335 339 lstrcpy(Parameter,"ByRef nmHdr As NMHDR"); 336 340 } 337 else if(pWindowInfo->childWindowInfos[MdiInfo[WndNum] .MdiRadInfo->SelectingItem[0]]->Control==CT_TREEVIEW){341 else if(pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->Control==CT_TREEVIEW){ 338 342 //TreeView 339 343 if(0<=i&&i<=7) lstrcpy(Parameter,"ByRef nmHdr As NMHDR"); 340 344 else lstrcpy(Parameter,"ByRef nmTreeView As NMTREEVIEW"); 341 345 } 342 else if(pWindowInfo->childWindowInfos[MdiInfo[WndNum] .MdiRadInfo->SelectingItem[0]]->Control==CT_UPDOWN){346 else if(pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->Control==CT_UPDOWN){ 343 347 //UpDown 344 348 if(i==0) lstrcpy(Parameter,"ByRef nmHdr As NMHDR"); … … 400 404 401 405 WndNum=GetWndNum(GetWindow(hClient,GW_CHILD)); 402 ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[WndNum] .path);406 ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[WndNum]->path); 403 407 i=0; 404 if(MdiInfo[WndNum] .MdiRadInfo->SelectingItem[0]==SELECT_WINDOW){408 if(MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]==SELECT_WINDOW){ 405 409 EnableWindow(GetDlgItem(hDlg,IDC_DEFAULT),1); 406 410 EnableWindow(GetDlgItem(hDlg,IDC_MENU),1); … … 458 462 EnableWindow(GetDlgItem(hDlg,IDC_MMSYS),0); 459 463 SendDlgItemMessage(hDlg,IDC_DEFAULT,BM_SETCHECK,BST_CHECKED,0); 460 if(pWindowInfo->childWindowInfos[MdiInfo[WndNum] .MdiRadInfo->SelectingItem[0]]->Control==CT_BUTTON){464 if(pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->Control==CT_BUTTON){ 461 465 //Button 462 466 InsertEventToList(hList,i++,"Click","BN_CLICKED","ボタンがクリックされた時"); 463 467 InsertEventToList(hList,i++,"DblClick","BN_DBLCLK","ボタンがダブル クリックされた時"); 464 468 } 465 else if(pWindowInfo->childWindowInfos[MdiInfo[WndNum] .MdiRadInfo->SelectingItem[0]]->Control==CT_CHECKBOX){469 else if(pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->Control==CT_CHECKBOX){ 466 470 //CheckBox 467 471 InsertEventToList(hList,i++,"Click","BN_CLICKED","チェック ボックスがクリックされた時"); 468 472 InsertEventToList(hList,i++,"DblClick","BN_DBLCLK","チェック ボックスがダブル クリックされた時"); 469 473 } 470 else if(pWindowInfo->childWindowInfos[MdiInfo[WndNum] .MdiRadInfo->SelectingItem[0]]->Control==CT_COMBOBOX){474 else if(pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->Control==CT_COMBOBOX){ 471 475 //ComboBox 472 476 InsertEventToList(hList,i++,"CloseUp","CBN_CLOSEUP","リスト ボックスが非表示になる時"); … … 482 486 InsertEventToList(hList,i++,"SetFocus","CBN_SETFOCUS","入力フォーカスを取得した時"); 483 487 } 484 else if(pWindowInfo->childWindowInfos[MdiInfo[WndNum] .MdiRadInfo->SelectingItem[0]]->Control==CT_EDIT){488 else if(pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->Control==CT_EDIT){ 485 489 //Edit 486 490 InsertEventToList(hList,i++,"Change","EN_CHANGE","エディット ボックスの内容が変更された時(後処理)"); … … 493 497 InsertEventToList(hList,i++,"VScroll","EN_VSCROLL","垂直スクロールを行った時"); 494 498 } 495 else if(pWindowInfo->childWindowInfos[MdiInfo[WndNum] .MdiRadInfo->SelectingItem[0]]->Control==CT_IMAGEBOX){499 else if(pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->Control==CT_IMAGEBOX){ 496 500 //ImageBox 497 501 InsertEventToList(hList,i++,"Click","STN_CLICKED","イメージ ボックスがクリックされた時"); 498 502 InsertEventToList(hList,i++,"DblClick","STN_DBLCLK","イメージ ボックスがダブル クリックされた時"); 499 503 } 500 else if(pWindowInfo->childWindowInfos[MdiInfo[WndNum] .MdiRadInfo->SelectingItem[0]]->Control==CT_LISTBOX){504 else if(pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->Control==CT_LISTBOX){ 501 505 //ListBox 502 506 InsertEventToList(hList,i++,"SelChange","LBN_SELCHANGE","リスト内の選択が変更された時"); … … 507 511 InsertEventToList(hList,i++,"SetFocus","LBN_SETFOCUS","入力フォーカスを取得した時"); 508 512 } 509 else if(pWindowInfo->childWindowInfos[MdiInfo[WndNum] .MdiRadInfo->SelectingItem[0]]->Control==CT_LISTVIEW){513 else if(pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->Control==CT_LISTVIEW){ 510 514 //ListView 511 515 i=SetDefaultNotifyMessagesInList(hList,CT_LISTVIEW); 512 516 } 513 else if(pWindowInfo->childWindowInfos[MdiInfo[WndNum] .MdiRadInfo->SelectingItem[0]]->Control==CT_PROGRESSBAR){517 else if(pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->Control==CT_PROGRESSBAR){ 514 518 //ProgressBar 515 519 InsertEventToList(hList,i++,"OutOfMemory","NM_OUTOFMEMORY","メモリ不足でコントロールの動作が完了できない時"); 516 520 } 517 else if(pWindowInfo->childWindowInfos[MdiInfo[WndNum] .MdiRadInfo->SelectingItem[0]]->Control==CT_RADIOBUTTON){521 else if(pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->Control==CT_RADIOBUTTON){ 518 522 //RadioButton 519 523 InsertEventToList(hList,i++,"Click","BN_CLICKED","ラジオ ボタンがクリックされた時"); 520 524 InsertEventToList(hList,i++,"DblClick","BN_DBLCLK","ラジオ ボタンがダブル クリックされた時"); 521 525 } 522 else if(pWindowInfo->childWindowInfos[MdiInfo[WndNum] .MdiRadInfo->SelectingItem[0]]->Control==CT_STATIC){526 else if(pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->Control==CT_STATIC){ 523 527 //Static 524 528 InsertEventToList(hList,i++,"Click","STN_CLICKED","スタティック テキストがクリックされた時"); 525 529 InsertEventToList(hList,i++,"DblClick","STN_DBLCLK","スタティック テキストがダブル クリックされた時"); 526 530 } 527 else if(pWindowInfo->childWindowInfos[MdiInfo[WndNum] .MdiRadInfo->SelectingItem[0]]->Control==CT_TRACKBAR){531 else if(pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->Control==CT_TRACKBAR){ 528 532 //TrackBar 529 533 InsertEventToList(hList,i++,"OutOfMemory","NM_OUTOFMEMORY","メモリ不足でコントロールの動作が完了できない時"); … … 531 535 InsertEventToList(hList,i++,"CustomDraw","NM_CUSTOMDRAW ","カスタム描画操作の通知"); 532 536 } 533 else if(pWindowInfo->childWindowInfos[MdiInfo[WndNum] .MdiRadInfo->SelectingItem[0]]->Control==CT_TREEVIEW){537 else if(pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->Control==CT_TREEVIEW){ 534 538 //TreeView 535 539 i=SetDefaultNotifyMessagesInList(hList,CT_TREEVIEW); 536 540 } 537 else if(pWindowInfo->childWindowInfos[MdiInfo[WndNum] .MdiRadInfo->SelectingItem[0]]->Control==CT_UPDOWN){541 else if(pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->Control==CT_UPDOWN){ 538 542 //UpDown 539 543 InsertEventToList(hList,i++,"OutOfMemory","NM_OUTOFMEMORY","メモリ不足でコントロールの動作が完了できない時"); … … 595 599 hList=GetDlgItem(hwnd,IDC_EVENTLIST); 596 600 WndNum=GetWndNum(GetWindow(hClient,GW_CHILD)); 597 WndInfoNum=GetWndInfoNum(MdiInfo[WndNum] .path);601 WndInfoNum=GetWndInfoNum(MdiInfo[WndNum]->path); 598 602 599 603 ListView_DeleteAllItems(hList); … … 644 648 { 645 649 WndNum=GetWndNum(GetWindow(hClient,GW_CHILD)); 646 ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[WndNum] .path);650 ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[WndNum]->path); 647 651 NowMenuNum=GetMenuInfoNum(pWindowInfo->GetMenuIdName().c_str()); 648 652 } … … 671 675 hList=GetDlgItem(hwnd,IDC_EVENTLIST); 672 676 WndNum=GetWndNum(GetWindow(hClient,GW_CHILD)); 673 WndInfoNum=GetWndInfoNum(MdiInfo[WndNum] .path);677 WndInfoNum=GetWndInfoNum(MdiInfo[WndNum]->path); 674 678 if(GetEventProcedureNameFromListView(hList,WndNum,WndInfoNum,temporary,temp2,dwEventType)){ 675 679 SelectProcedureOfMessageCall(WndInfoNum,temporary,temp2); … … 689 693 hList=GetDlgItem(hwnd,IDC_EVENTLIST); 690 694 WndNum=GetWndNum(GetWindow(hClient,GW_CHILD)); 691 WndInfoNum=GetWndInfoNum(MdiInfo[WndNum] .path);695 WndInfoNum=GetWndInfoNum(MdiInfo[WndNum]->path); 692 696 if(GetEventProcedureNameFromListView(hList,WndNum,WndInfoNum,temporary,temp2,dwEventType)){ 693 697 sprintf(temporary+lstrlen(temporary),"(%s)",temp2);
Note:
See TracChangeset
for help on using the changeset viewer.