Changeset 959 for trunk/MagicSoft/Mars/meventdisp
- Timestamp:
- 10/02/01 14:46:56 (23 years ago)
- Location:
- trunk/MagicSoft/Mars/meventdisp
- Files:
-
- 4 added
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/MagicSoft/Mars/meventdisp/EvtDispLinkDef.h
r586 r959 5 5 #pragma link off all functions; 6 6 7 #pragma link C++ class MGFadcDisp ; 7 #pragma link C++ class MGEvtDisplay; 8 9 #pragma link C++ class MGFadcDisp; 10 #pragma link C++ class MGCamDisplay; 8 11 9 12 #endif -
trunk/MagicSoft/Mars/meventdisp/MGFadcDisp.cc
r956 r959 1 /* 1 /*======================================================================== *\ 2 2 ! 3 3 ! * … … 16 16 ! 17 17 ! 18 ! Author(s): Harald Kornmayer 1/2001 (harald@mppmu.mpg.de) 19 ! Author(s): Thomas Bretz 12/2000 (tbretz@uni-sw.gwdg.de) 18 ! Author(s): Thomas Bretz 10/2001 (tbretz@uni-sw.gwdg.de) 20 19 ! 21 20 ! Copyright: MAGIC Software Development, 2000-2001 … … 44 43 // use TGSplitter instead for root<3.00 45 44 #include "MParList.h" 45 #include "MTaskList.h" 46 46 #include "MReadTree.h" 47 #include "MEvtLoop.h" 47 48 #include "MRawEvtData.h" 48 49 #include "MRawEvtPixelIter.h" … … 52 53 enum MGFadcDispCommand 53 54 { 54 M_PIXELLIST = 4201, 55 M_PREVEVT, 56 M_NEXTEVT, 57 M_EVTNUMBER, 58 59 M_PREVPIXEL, 60 M_NEXTPIXEL, 61 62 M_PRINT, 63 M_CLOSE 64 }; 65 66 void MGFadcDisp::AddTopFramePart1(TGVerticalFrame *frame, 67 const char *filename, 68 const char *treename) 69 { 70 // 71 // --- the top1 part of the window --- 72 // 73 TGHorizontalFrame *top1 = new TGHorizontalFrame(frame, 300, 100); 74 fList->Add(top1); 75 76 // 77 // create gui elements 78 // 79 TGLabel *lfile = new TGLabel(top1, new TGString("File:")); 80 TGLabel *file = new TGLabel(top1, new TGString(filename)); 81 TGLabel *ltree = new TGLabel(top1, new TGString("Tree:")); 82 TGLabel *tree = new TGLabel(top1, new TGString(treename)); 83 84 fList->Add(lfile); 85 fList->Add(file); 86 fList->Add(ltree); 87 fList->Add(tree); 88 89 // 90 // layout and add gui elements in/to frame 91 // 92 TGLayoutHints *laystd = new TGLayoutHints(kLHintsLeft, 10, 10, 10, 10); 93 fList->Add(laystd); 94 95 top1->AddFrame(lfile, laystd); 96 top1->AddFrame(file, laystd); 97 top1->AddFrame(ltree, laystd); 98 top1->AddFrame(tree, laystd); 99 100 // 101 // layout and add frame 102 // 103 TGLayoutHints *laytop1 = new TGLayoutHints(kLHintsTop); 104 fList->Add(laytop1); 105 106 frame->AddFrame(top1, laytop1); 107 } 108 109 void MGFadcDisp::AddTopFramePart2(TGVerticalFrame *frame) 110 { 111 // 112 // --- the top2 part of the window --- 113 // 114 TGHorizontalFrame *top2 = new TGHorizontalFrame(frame, 300, 100); 115 fList->Add(top2); 116 117 // 118 // Create the gui elements 119 // 120 TGTextButton *prevevt = new TGTextButton(top2, "<< Previous Event", M_PREVEVT); 121 prevevt->Associate(this); 122 123 TGLabel *evtnr = new TGLabel(top2, new TGString("Event: ")); 124 125 fTxtEvtNr = new TGTextEntry(top2, new TGTextBuffer(100), M_EVTNUMBER); 126 fTxtEvtNr->Resize(60, fTxtEvtNr->GetDefaultHeight()); 127 fTxtEvtNr->Associate(this); 128 129 char wortdummy[100]; 130 sprintf(wortdummy, "out of %d Events", fReadTree->GetEntries()); 131 TGLabel *totnr = new TGLabel(top2, new TGString(wortdummy)); 132 133 TGTextButton *nextevt = new TGTextButton (top2, "Next Event >>", M_NEXTEVT); 134 nextevt->Associate(this); 135 136 // 137 // Add gui elements to 'atotodel' 138 // 139 fList->Add(prevevt); 140 fList->Add(evtnr); 141 fList->Add(fTxtEvtNr); 142 fList->Add(totnr); 143 fList->Add(nextevt); 144 145 // 146 // add the gui elements to the frame 147 // 148 TGLayoutHints *laystd = new TGLayoutHints(kLHintsLeft, 10, 10, 10, 10); 149 TGLayoutHints *laytentry = new TGLayoutHints(kLHintsNormal, 5, 5, 5, 5); 150 151 fList->Add(laystd); 152 fList->Add(laytentry); 153 154 top2->AddFrame(prevevt, laystd); 155 top2->AddFrame(evtnr, laystd); 156 top2->AddFrame(fTxtEvtNr, laytentry); 157 top2->AddFrame(totnr, laystd); 158 top2->AddFrame(nextevt, laystd); 159 160 frame->AddFrame(top2, new TGLayoutHints(kLHintsCenterX)); 161 } 162 163 void MGFadcDisp::AddMidFrame(TGHorizontalFrame *frame) 164 { 165 // 166 // create tab control 167 // 168 TGTab *tabs = new TGTab(frame, 300, 300); 169 170 // 171 // Create Tab1 172 // 173 TGCompositeFrame *tab1 = tabs->AddTab("PixelList"); 174 tab1->ChangeOptions(kHorizontalFrame); 55 M_PREVPIXEL = 0x1000, 56 M_NEXTPIXEL = 0x1001 57 }; 58 59 // -------------------------------------------------------------------------- 60 // 61 // Add the missing GUI elements: These are the pixel number controls 62 // 63 void MGFadcDisp::AddSetupElements() 64 { 65 fTab1->ChangeOptions(kHorizontalFrame); 175 66 176 67 // 177 68 // Create first gui element for tab1 178 69 // 179 fPixelList = new TGListBox( tab1, M_PIXELLIST);70 fPixelList = new TGListBox(fTab1, M_PIXELLIST); 180 71 fPixelList->Associate(this); 181 72 fPixelList->Resize(80, 230); 182 73 183 74 TGLayoutHints *layplist = new TGLayoutHints(kLHintsExpandY|kLHintsLeft, 5, 5, 5, 5); 184 tab1->AddFrame(fPixelList, layplist); 185 186 // 187 // Crete second gui elemet for tab1 (TGVertical Frame) 188 // 189 TGVerticalFrame *mid1 = new TGVerticalFrame(tab1, 300, 100); 75 fTab1->AddFrame(fPixelList, layplist); 76 77 TGVerticalFrame *fMidFrame = new TGVerticalFrame(fTab1, 300, 100); 78 fList->Add(fMidFrame); 79 80 TGLayoutHints *laytab = new TGLayoutHints(kLHintsRight|kLHintsExpandY, 5, 5, 5, 5); 81 fList->Add(laytab); 82 83 fTab1->AddFrame(fMidFrame, laytab); 190 84 191 85 // 192 86 // Create gui elements for vertical frame 193 87 // 194 TGTextButton *prevpix = new TGTextButton( mid1, "<< Prev Pixel", M_PREVPIXEL);195 TGTextButton *nextpix = new TGTextButton( mid1, "Next Pixel >>", M_NEXTPIXEL);88 TGTextButton *prevpix = new TGTextButton(fMidFrame, "<< Prev Pixel", M_PREVPIXEL); 89 TGTextButton *nextpix = new TGTextButton(fMidFrame, "Next Pixel >>", M_NEXTPIXEL); 196 90 prevpix->Associate(this); 197 91 nextpix->Associate(this); 198 92 199 TGVSlider *slider = new TGVSlider( mid1, 200, kSlider1|kScaleBoth);93 TGVSlider *slider = new TGVSlider(fMidFrame, 200, kSlider1|kScaleBoth); 200 94 slider->Associate(this); 201 95 slider->SetRange(0, 576); … … 207 101 TGLayoutHints *layslider = new TGLayoutHints(kLHintsCenterX|kLHintsExpandY); 208 102 209 mid1->AddFrame(prevpix, laybut); 210 mid1->AddFrame(slider, layslider); 211 mid1->AddFrame(nextpix, laybut); 212 213 TGLayoutHints *laytab = new TGLayoutHints(kLHintsRight|kLHintsExpandY, 5, 5, 5, 5); 214 tab1->AddFrame(mid1, laytab); 215 216 TGLayoutHints *laytabs = new TGLayoutHints(kLHintsNormal|kLHintsExpandY, 10, 10, 10, 10); 217 frame->AddFrame(tabs, laytabs); 218 219 // 220 // Create second part of frame 221 // 222 TGTab *tabdisp = new TGTab(frame, 300, 300); 223 224 TGCompositeFrame *tab2 = tabdisp->AddTab("Digital Scope"); 225 226 TRootEmbeddedCanvas *canvas = new TRootEmbeddedCanvas("Digi Scope", tab2, 400, 400); 227 228 TGLayoutHints *laycanvas = new TGLayoutHints(kLHintsCenterX|kLHintsCenterY|kLHintsExpandX|kLHintsExpandY); 229 tab2->AddFrame(canvas, laycanvas); 230 231 fCanvas = canvas->GetCanvas(); 232 233 // 234 // Add second part to frame 235 // 236 TGLayoutHints *laydisp = new TGLayoutHints(kLHintsNormal|kLHintsExpandY|kLHintsExpandX, 10, 10, 10, 10); 237 frame->AddFrame(tabdisp, laydisp); 238 239 // 240 // Now add all gui elements to 'autodel'-list 241 // 242 fList->Add(tabdisp); 243 fList->Add(canvas); 244 fList->Add(laycanvas); 245 fList->Add(laydisp); 246 fList->Add(fPixelList); 247 fList->Add(layplist); 248 fList->Add(mid1); 249 fList->Add(prevpix); 250 fList->Add(laybut); 251 fList->Add(slider); 252 fList->Add(layslider); 253 fList->Add(nextpix); 254 fList->Add(laytab); 255 fList->Add(laytabs); 256 257 } 258 259 void MGFadcDisp::AddLowFrame(TGHorizontalFrame *frame) 260 { 261 TGTextButton *but1 = new TGTextButton(frame, "Print", M_PRINT); 262 TGTextButton *but2 = new TGTextButton(frame, "Close", M_CLOSE); 263 264 but1->Associate(this); 265 but2->Associate(this); 266 267 fList->Add(but1); 268 fList->Add(but2); 269 270 TGLayoutHints *laybut = new TGLayoutHints(kLHintsLeft, 10, 10, 10, 10); 271 fList->Add(laybut); 272 273 frame->AddFrame(but1, laybut); 274 frame->AddFrame(but2, laybut); 275 } 276 277 void MGFadcDisp::CreateGui(const char *filename, const char *treename) 278 { 279 // 280 // Create the frame elements and add gui elements to it 281 // 282 TGVerticalFrame *frametop = new TGVerticalFrame(this, 300, 100); 283 AddTopFramePart1(frametop, filename, treename); 284 AddTopFramePart2(frametop); 285 286 TGHorizontal3DLine *line1 = new TGHorizontal3DLine(this); 287 288 TGHorizontalFrame *framemid = new TGHorizontalFrame(this, 300, 100); 289 AddMidFrame(framemid); 290 291 TGHorizontal3DLine *line2 = new TGHorizontal3DLine(this); 292 293 TGHorizontalFrame *framelow = new TGHorizontalFrame(this, 300, 100); 294 AddLowFrame(framelow); 295 296 // 297 // add frame elements to 'autodel' 298 // 299 fList->Add(frametop); 300 fList->Add(line1); 301 fList->Add(framemid); 302 fList->Add(line2); 303 fList->Add(framelow); 304 305 // 306 // Layout frame elements and add elements to frame 307 // 308 TGLayoutHints *laytop = new TGLayoutHints(kLHintsTop|kLHintsCenterX); 309 TGLayoutHints *layline = new TGLayoutHints(kLHintsTop|kLHintsExpandX); 310 TGLayoutHints *laymid = new TGLayoutHints(kLHintsExpandY|kLHintsExpandX); 311 TGLayoutHints *laylow = new TGLayoutHints(kLHintsTop); 312 313 fList->Add(laytop); 314 fList->Add(layline); 315 fList->Add(laymid); 316 fList->Add(laylow); 317 318 AddFrame(frametop, laytop); 319 AddFrame(line1, layline); 320 AddFrame(framemid, laymid); 321 AddFrame(line2, layline); 322 AddFrame(framelow, laylow); 323 } 324 325 void MGFadcDisp::SetupFileAccess(const char *filename, const char *treename) 326 { 327 // 328 // Create the file access elements 329 // 330 fEvtData = new MRawEvtData(); 331 332 pList = new MParList(); 333 pList->AddToList(fEvtData); 334 335 fReadTree = new MReadTree(treename, filename); 336 fReadTree->PreProcess(pList); 337 fReadTree->GetEvent(); 338 } 339 103 fMidFrame->AddFrame(prevpix, laybut); 104 fMidFrame->AddFrame(slider, layslider); 105 fMidFrame->AddFrame(nextpix, laybut); 106 } 107 108 // -------------------------------------------------------------------------- 109 // 110 // Constructor 111 // 340 112 MGFadcDisp::MGFadcDisp(char *filename, char *treename, 341 113 const TGWindow *p, const TGWindow *main, 342 114 UInt_t w, UInt_t h) 343 : TGTransientFrame(p, main, w, h) 344 { 345 346 // 347 // create an autodelete-list for the gui elements 348 // 349 fList = new TList; 350 fList->SetOwner(); 351 352 SetupFileAccess(filename, treename); 353 CreateGui(filename, treename); 115 : MGEvtDisplay(filename, treename, p, main, w, h) 116 { 117 // 118 // Add the missing GUI elements (pixellist, pixel number controls) 119 // 120 AddSetupElements(); 121 122 // 123 // preprocess eventloop and read in first event (process) 124 // 125 fEvtLoop->PreProcess(); 126 GetTaskList()->Process(); 354 127 355 128 // … … 362 135 Layout(); 363 136 364 SetWindowName("FadcDisplay"); 365 SetIconName("FadcDisp"); 137 SetWindowName("Fadc Event Display"); 138 SetIconName("Fadc"); 139 140 UpdateDisplay(); 141 UpdateNumOfEvts(); 142 UpdateEventCounter(); 366 143 367 144 MapWindow(); 368 145 369 CreatePixelList(); 370 UpdateEventCounter(); 371 } 372 373 374 MGFadcDisp::~MGFadcDisp() 375 { 376 // 377 // close the file 378 // 379 fReadTree->PostProcess(); 380 381 delete fEvtData; 382 delete pList; 383 384 delete fReadTree; 385 386 // 387 // destruct the graphical members 388 // 389 delete fList; 390 } 391 392 393 void MGFadcDisp::CloseWindow() 394 { 395 // Got close message for this MainFrame. Calls parent CloseWindow() 396 // (which destroys the window) and terminate the application. 397 // The close message is generated by the window manager when its close 398 // window menu item is selected. 399 400 delete this; 401 } 402 403 146 } 147 148 // -------------------------------------------------------------------------- 149 // 150 // return pointer to event data 151 // 152 MRawEvtData *MGFadcDisp::GetEvent() const 153 { 154 return (MRawEvtData*)GetParList()->FindObject("MRawEvtData"); 155 } 156 157 // -------------------------------------------------------------------------- 158 // 159 // after a new event is read in one has to update 160 // the list of pixels in the fPixelList (TGListBox) 161 // 404 162 void MGFadcDisp::CreatePixelList(Int_t lastsel) 405 163 { 406 // 407 // after a new event is read in one has to update 408 // the list of pixels in the fPixelList (TGListBox) 409 // 164 MRawEvtData *data = GetEvent(); 410 165 411 166 // 412 167 // put the selection of the last event in memory 413 168 // 414 MRawEvtPixelIter pixel( fEvtData);169 MRawEvtPixelIter pixel(data); 415 170 while (pixel.Next()) 416 171 { 417 char wortdummy[100];418 sprintf( wortdummy, "%d", pixel.GetPixelId());419 fPixelList->AddEntry( wortdummy, pixel.GetPixelId());172 char txt[100]; 173 sprintf(txt, "%d", pixel.GetPixelId()); 174 fPixelList->AddEntry(txt, pixel.GetPixelId()); 420 175 } 421 176 … … 433 188 pixel.Reset(); 434 189 lastsel=pixel.GetPixelId(); 435 436 190 } 437 191 438 char wortdummy[100];439 sprintf( wortdummy, "GRAPH%d", lastsel);440 fEvtData->Draw(wortdummy);192 char txt[100]; 193 sprintf(txt, "GRAPH%d", lastsel); 194 data->Draw(txt); 441 195 fPixelList->Select(lastsel, kTRUE); 442 196 … … 445 199 } 446 200 447 void MGFadcDisp::UpdateEventCounter() 448 { 449 // Update the event counter 450 451 char wortdummy[256]; 452 453 sprintf(wortdummy, "%d", fReadTree->GetEventNum()); 454 455 fTxtEvtNr->SetText(wortdummy); 456 } 457 458 void MGFadcDisp::ReadinEvent(UInt_t iEvt) 459 { 460 Int_t buttons = 4; 461 Int_t retval = 0; 462 463 // first check if the new event is in the range of possible events 464 465 if (iEvt >= fReadTree->GetEntries()) 466 { 467 new TGMsgBox(fClient->GetRoot(), this, 468 "WARNING!", 469 "The event number is out of range!!!", 470 kMBIconExclamation, buttons, &retval); 471 } 472 else 473 { 474 const Int_t lastsel = fPixelList->GetSelected(); 475 476 fPixelList->RemoveEntries(0, fEvtData->GetNumPixels()); 477 478 fReadTree->SetEventNum(iEvt); 479 fReadTree->GetEvent(); 480 481 CreatePixelList(lastsel); 482 } 483 484 UpdateEventCounter(); 485 } 486 201 // -------------------------------------------------------------------------- 202 // 203 // Update the contents of the canvas 204 // 205 void MGFadcDisp::UpdateDisplay() 206 { 207 const Int_t lastsel = fPixelList->GetSelected(); 208 209 fPixelList->RemoveEntries(0, GetEvent()->GetNumPixels()); 210 211 CreatePixelList(lastsel); 212 } 213 214 // -------------------------------------------------------------------------- 215 // 216 // Display another pixel 217 // 487 218 void MGFadcDisp::DisplayPix(UInt_t i) 488 219 { 489 char wortdummy[256]; 490 491 sprintf(wortdummy, "GRAPH%d", i); 220 MRawEvtData *data = GetEvent(); 492 221 493 222 fCanvas->Clear(); 494 223 fCanvas->cd(); 495 224 496 fEvtData->Draw(wortdummy); 225 char txt[256]; 226 sprintf(txt, "GRAPH%d", i); 227 data->Draw(txt); 497 228 498 229 fCanvas->Modified(); … … 502 233 // FIXME: too complicated! 503 234 // 504 fPixelList->RemoveEntries(0, fEvtData->GetNumPixels());235 fPixelList->RemoveEntries(0, data->GetNumPixels()); 505 236 CreatePixelList(i); 506 237 } 507 238 239 // -------------------------------------------------------------------------- 240 // 241 // ProcessMessage(Long_t msg, Long_t parm1, Long_t parm2) 242 // 243 // Processes information from all GUI items. 244 // Selecting an item usually generates an event with 4 parameters. 245 // The first two are packed into msg (first and second bytes). 246 // The other two are parm1 and parm2. 247 // 508 248 Bool_t MGFadcDisp::ProcessMessage(Long_t msg, Long_t parm1, Long_t parm2) 509 249 { 510 //------------------------------------------------------------------511 //512 // ProcessMessage(Long_t msg, Long_t parm1, Long_t parm2)513 //514 // Processes information from all GUI items.515 // Selecting an item usually generates an event with 4 parameters.516 // The first two are packed into msg (first and second bytes).517 // The other two are parm1 and parm2.518 //519 //------------------------------------------------------------------520 521 250 switch(GET_MSG(msg)) 522 251 { … … 527 256 switch (parm1) 528 257 { 529 case M_PREVEVT:530 ReadinEvent(fReadTree->GetEventNum()-1);531 return kTRUE;532 533 case M_NEXTEVT:534 ReadinEvent(fReadTree->GetEventNum()+1);535 return kTRUE;536 537 258 case M_PREVPIXEL: 538 259 DisplayPix(fPixelList->GetSelected()-1); … … 542 263 DisplayPix(fPixelList->GetSelected()+1); 543 264 return kTRUE; 544 545 case M_PRINT:546 cout << "Sorry, not yet implemented!" << endl;547 return kTRUE;548 549 case M_CLOSE:550 CloseWindow();551 return kTRUE;552 265 } 553 return kTRUE;266 break; 554 267 555 268 case kCM_LISTBOX: 556 269 if (parm1 != M_PIXELLIST) 557 return kTRUE;270 break; 558 271 559 272 DisplayPix(fPixelList->GetSelected()); 560 273 return kTRUE; 561 274 } 562 return kTRUE; 563 564 case kC_TEXTENTRY: 565 if (GET_SUBMSG(msg) == kTE_ENTER) 566 ReadinEvent(atoi(fTxtEvtNr->GetText())); 567 568 return kTRUE; 275 break; 569 276 } 570 277 571 return kTRUE;572 } 278 return MGEvtDisplay::ProcessMessage(msg, parm1, parm2); 279 } -
trunk/MagicSoft/Mars/meventdisp/MGFadcDisp.h
r957 r959 6 6 #endif 7 7 8 #ifndef ROOT_TGFrame9 #include <TGFrame.h>8 #ifndef MGEVTDISPLAY_H 9 #include "MGEvtDisplay.h" 10 10 #endif 11 11 12 class MParList; 13 class MReadTree; 12 class TGListBox; 14 13 class MRawEvtData; 15 14 16 class TList; 17 class TCanvas; 18 class TGListBox; 19 class TGTextEntry; 20 21 class MGFadcDisp : public TGTransientFrame 15 class MGFadcDisp : public MGEvtDisplay 22 16 { 23 17 private: 24 //25 // GUI stuff26 //27 TList *fList;28 29 TGTextEntry *fTxtEvtNr;30 18 TGListBox *fPixelList; 31 19 32 TCanvas *fCanvas; 20 void AddSetupElements(); 21 void DisplayPix(UInt_t i); 22 void UpdateDisplay(); 23 void CreatePixelList(Int_t lastsel=-1); 33 24 34 void AddTopFramePart1(TGVerticalFrame *frame, 35 const char *filename, 36 const char *treename); 37 void AddTopFramePart2(TGVerticalFrame *frame); 38 void AddMidFrame(TGHorizontalFrame *frame); 39 void AddLowFrame(TGHorizontalFrame *frame); 40 41 void CreateGui(const char *filename, const char *treename); 42 void SetupFileAccess(const char *filename, const char *treename); 43 44 // 45 // File Access stuff 46 // 47 MParList *pList; 48 MRawEvtData *fEvtData; 49 MReadTree *fReadTree; 50 51 void ReadinEvent(UInt_t iEvt); 52 void DisplayPix(UInt_t i); 25 MRawEvtData *GetEvent() const; 53 26 54 27 public: … … 56 29 MGFadcDisp(char *filename, char *treename, 57 30 const TGWindow *p, const TGWindow *main, UInt_t w, UInt_t h); 58 59 ~MGFadcDisp();60 61 void CloseWindow();62 63 void CreatePixelList(Int_t lastsel=-1);64 void UpdateEventCounter();65 31 66 32 virtual Bool_t ProcessMessage(Long_t msg, Long_t parm1, Long_t parm2); -
trunk/MagicSoft/Mars/meventdisp/Makefile
r665 r959 22 22 # connect the include files defined in the config.mk file 23 23 # 24 INCLUDES = -I. -I../mbase -I../mraw 24 INCLUDES = -I. -I../mbase -I../mraw -I../mgui -I../manalysis 25 25 26 26 #------------------------------------------------------------------------------ … … 28 28 .SUFFIXES: .c .cc .cxx .h .hxx .o 29 29 30 SRCFILES = MGFadcDisp.cc 30 SRCFILES = MGEvtDisplay.cc \ 31 MGFadcDisp.cc \ 32 MGCamDisplay.cc 31 33 32 34 SRCS = $(SRCFILES)
Note:
See TracChangeset
for help on using the changeset viewer.