1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
18 #include "AliMUONPainterMasterFrame.h"
20 #include "AliMUONChamberPainter.h"
21 #include "AliMUONPainterGroup.h"
22 #include "AliMUONPainterMatrix.h"
23 #include "AliMUONPainterMatrixFrame.h"
24 #include "AliMUONPainterInterfaceHelper.h"
25 #include "AliMUONPainterRegistry.h"
26 #include "AliMUONAttPainterSelectorFrame.h"
27 #include "AliMUONVPainter.h"
28 #include "AliCodeTimer.h"
30 #include <Riostream.h>
31 #include <TApplication.h>
34 #include <TGComboBox.h>
36 #include <TObjArray.h>
37 #include <TObjString.h>
38 #include <TGButtonGroup.h>
41 /// \class AliMUONPainterMasterFrame
43 /// Main window of the 2D display
45 /// \author Laurent Aphecetche, Subatech
48 ClassImp(AliMUONPainterMasterFrame)
53 UInt_t UniqueID(Int_t nx, Int_t ny)
55 return ny | (nx << 8);
58 Int_t Nx(UInt_t uniqueID)
60 return ( uniqueID & 0xFF00 ) >> 8;
63 Int_t Ny(UInt_t uniqueID)
65 return uniqueID & 0xFF;
70 const Int_t AliMUONPainterMasterFrame::fgkBorderSize = 10;
72 //_____________________________________________________________________________
73 AliMUONPainterMasterFrame::AliMUONPainterMasterFrame(const TGWindow* p,
75 : TGCompositeFrame(p,w,h,kVerticalFrame),
76 fNavigationFrame(0x0),
77 fPainterMatrixFrame(0x0),
82 fCurrentNavigationPosition(-1),
83 fAttPainterSelectorFrame(0x0)
87 UInt_t wi = w - fgkBorderSize*2;
88 UInt_t hi = h - fgkBorderSize*3;
90 fNavigationFrame = new TGHorizontalFrame(this,wi);
92 AddFrame(fNavigationFrame,new TGLayoutHints(kLHintsExpandX|kLHintsTop,
93 fgkBorderSize,fgkBorderSize,
94 fgkBorderSize,fgkBorderSize));
96 fBackButton = new TGPictureButton(fNavigationFrame,
97 gClient->GetPicture("tb_back.xpm"));
99 fForwardButton = new TGPictureButton(fNavigationFrame,
100 gClient->GetPicture("tb_forw.xpm"));
102 fAttPainterSelectorFrame = new AliMUONAttPainterSelectorFrame(fNavigationFrame,w/2,20);
104 fGroupTitle = new TGLabel(fNavigationFrame,"");
106 fNavigationFrame->AddFrame(fBackButton,new TGLayoutHints(kLHintsCenterY));
107 fNavigationFrame->AddFrame(fForwardButton,new TGLayoutHints(kLHintsCenterY));
109 fNavigationFrame->AddFrame(fAttPainterSelectorFrame,new TGLayoutHints(kLHintsCenterY,10));
111 fAttPainterSelectorFrame->Connect("Clicked(AliMUONAttPainter*)",
112 "AliMUONPainterMasterFrame",
114 "AttributesChanged(AliMUONAttPainter*)");
116 fNavigationFrame->AddFrame(fGroupTitle,new TGLayoutHints(kLHintsExpandX|kLHintsCenterX|kLHintsCenterY,10));
118 fForwardButton->Connect("Clicked()","AliMUONPainterMasterFrame",
122 fBackButton->Connect("Clicked()","AliMUONPainterMasterFrame",
129 // UInt_t h1 = hi - fNavigationFrame->GetHeight() - 3*fgkBorderSize;
130 UInt_t h1 = hi - 7*12;
132 MakeTopPainterMatrix(w1,h1);
134 AddFrame(fPainterMatrixFrame,new TGLayoutHints(kLHintsExpandX,
135 fgkBorderSize,fgkBorderSize,
138 AliMUONPainterInterfaceHelper::SetBackgroundColor("MasterFrame.Navigation",*fNavigationFrame);
139 AliMUONPainterInterfaceHelper::SetBackgroundColor("MasterFrame.Main",*this);
141 AliDebug(1,Form("fNavigation=%p",&fNavigation));
143 AliMUONPainterRegistry::Instance()->Connect("PainterMatrixWantToShow(AliMUONPainterMatrix*)",
144 "AliMUONPainterMasterFrame",
146 "PainterMatrixWantToShow(AliMUONPainterMatrix*)");
148 fPainterMatrixFrame->DataSourceWasChanged("*",0x0,-1);
151 //_____________________________________________________________________________
152 AliMUONPainterMasterFrame::~AliMUONPainterMasterFrame()
158 //_____________________________________________________________________________
160 AliMUONPainterMasterFrame::AddPainterMatrix(AliMUONPainterMatrix* painterMatrix)
162 /// array is adopted (by the registry)
164 AliDebug(1,Form("matrix=%x %s",painterMatrix,painterMatrix->GetName()));
166 Int_t i = AliMUONPainterRegistry::Instance()->Register(painterMatrix);
171 //_____________________________________________________________________________
173 AliMUONPainterMasterFrame::PainterMatrixWantToShow(AliMUONPainterMatrix* group)
175 /// FIXME: should check whether we are the active window before
176 /// responding to this message ?
178 AliDebug(1,Form("group=%x %s",group,group->GetName()));
180 Int_t i = AliMUONPainterRegistry::Instance()->FindIndexOf(group);
182 Int_t alreadyThere(-1);
184 for ( Int_t j = 0; j < fNavigation.GetSize(); ++j )
186 if ( fNavigation[j] == i ) alreadyThere = j;
195 fCurrentNavigationPosition = alreadyThere;
198 ShowPainterMatrix(group);
201 //_____________________________________________________________________________
203 AliMUONPainterMasterFrame::SetNavigation(Int_t i)
205 /// Change navigation position
207 ++fCurrentNavigationPosition;
208 fNavigation.Set(fCurrentNavigationPosition+1);
209 fNavigation[fCurrentNavigationPosition] = i;
212 //_____________________________________________________________________________
214 AliMUONPainterMasterFrame::ShowPainterMatrix(AliMUONPainterMatrix* painterMatrix)
216 /// Change the painter matrix we show
218 fPainterMatrixFrame->Use(painterMatrix);
220 painterMatrix->Connect("Clicked(AliMUONVPainter*,Double_t*)",
221 "AliMUONPainterMasterFrame",this,
222 "Clicked(AliMUONVPainter*,Double_t*)");
224 painterMatrix->Connect("ShiftClicked(AliMUONVPainter*,Double_t*)",
225 "AliMUONPainterMasterFrame",this,
226 "ShiftClicked(AliMUONVPainter*,Double_t*)");
228 fPainterMatrixFrame->Connect("TitleHasChanged(const char*)",
229 "AliMUONPainterMasterFrame",this,
230 "ChangeTitle(const char*)");
233 UpdateAttributes(*(fPainterMatrixFrame->Matrix()));
235 AliMUONPainterRegistry::Instance()->AddToHistory(painterMatrix);
240 //_____________________________________________________________________________
242 AliMUONPainterMasterFrame::ChangeTitle(const char* newTitle)
244 /// Change the top title
246 fGroupTitle->SetText(newTitle);
247 fGroupTitle->Resize();
251 //_____________________________________________________________________________
253 AliMUONPainterMasterFrame::Backward()
255 /// Move back one step in the history
256 --fCurrentNavigationPosition;
258 AliMUONPainterMatrix* group =
259 AliMUONPainterRegistry::Instance()->PainterMatrix(fNavigation[fCurrentNavigationPosition]);
261 ShowPainterMatrix(group);
266 //_____________________________________________________________________________
268 AliMUONPainterMasterFrame::Forward()
270 /// Move forward one step in history
272 ++fCurrentNavigationPosition;
274 AliMUONPainterMatrix* group =
275 AliMUONPainterRegistry::Instance()->PainterMatrix(fNavigation[fCurrentNavigationPosition]);
277 ShowPainterMatrix(group);
282 //_____________________________________________________________________________
284 AliMUONPainterMasterFrame::Clicked(AliMUONVPainter* painter, Double_t* values)
286 /// A given painter was (singly) clicked
288 AliDebug(1,Form("%s x %7.3f y %7.3f",painter->GetName(),values[0],values[1]));
292 fPainterMatrixFrame->MouseLeave(painter);
294 AliMUONPainterMatrix* matrix = new AliMUONPainterMatrix(painter->Name().Data());
296 AliMUONVPainter* p = painter->Detach();
302 AddPainterMatrix(matrix);
303 ShowPainterMatrix(matrix);
306 //_____________________________________________________________________________
308 AliMUONPainterMasterFrame::ShiftClicked(AliMUONVPainter* painter, Double_t*)
310 /// A given painter was shift-clicked
312 AliMUONPainterMatrix* currentMatrix = fPainterMatrixFrame->Matrix();
314 AliMUONAttPainter a = painter->Attributes();
316 TString basename(Form("%s-DUAL",painter->GetName()));
318 TString newName = AliMUONPainterMatrix::NameIt(basename.Data(),a);
320 AliMUONPainterMatrix* matrix =
321 AliMUONPainterRegistry::Instance()->FindPainterMatrix(newName.Data());
325 // No. So we must make a new matrix painter from the existing one,
326 // and add to this new matrix the painters of the other one, but
327 // using the new attributes...
329 // create "opposite" attributes
330 AliMUONAttPainter a1(a);
331 AliMUONAttPainter a2(a);
333 if ( a.IsCathodeDefined() )
335 a2.SetCathode(!a.IsCathode0(),!a.IsCathode1());
338 if ( a.IsPlaneDefined() )
340 a2.SetPlane(!a.IsBendingPlane(),!a.IsNonBendingPlane());
343 a1.SetCathodeAndPlaneDisabled(kTRUE);
344 a2.SetCathodeAndPlaneDisabled(kTRUE);
346 AliMUONVPainter* p1 = AliMUONVPainter::CreatePainter(painter->ClassName(),
351 AliMUONVPainter* p2 = AliMUONVPainter::CreatePainter(painter->ClassName(),
359 new TGMsgBox(gClient->GetRoot(), this,
360 "Invalid combination", "Cannot create 2 views from this painter",
361 kMBIconExclamation, kMBOk, &ret);
362 PainterMatrixWantToShow(currentMatrix);
368 p1->UpdateGroupsFrom(*(painter->Master()));
369 p2->UpdateGroupsFrom(*(painter->Master()));
377 AliMpArea area(painter->Area());
379 if ( area.Dimensions().X() > 1.2*area.Dimensions().Y() )
385 matrix = new AliMUONPainterMatrix(basename.Data(),nx,ny);
390 AddPainterMatrix(matrix);
393 matrix->SetData(currentMatrix->DataPattern(),
394 currentMatrix->Data(),
395 currentMatrix->DataIndex());
397 fPainterMatrixFrame->MouseLeave(painter);
399 PainterMatrixWantToShow(matrix);
402 //_____________________________________________________________________________
404 AliMUONPainterMasterFrame::SaveAs(const char* filename, Option_t* option) const
406 /// Save painter matrix (in the sense of "print") in filename
407 fPainterMatrixFrame->SaveAs(filename,option);
410 //_____________________________________________________________________________
412 AliMUONPainterMasterFrame::Update()
416 fPainterMatrixFrame->Update();
419 //_____________________________________________________________________________
421 AliMUONPainterMasterFrame::UpdateAttributes(const AliMUONPainterMatrix& painterMatrix)
423 /// Update the view buttons from the matrix we actually plot
425 fAttPainterSelectorFrame->Update(painterMatrix.Attributes());
428 //_____________________________________________________________________________
430 AliMUONPainterMasterFrame::MakeTopPainterMatrix(UInt_t w, UInt_t h)
432 /// Create the first painter matrix that appears when we are create
433 /// FIXME: how to make this more flexible ?
435 fPainterMatrixFrame = new AliMUONPainterMatrixFrame(this,w,h);
437 AliMUONAttPainter att;
439 att.SetCathode(kTRUE,kFALSE);
440 att.SetViewPoint(kTRUE,kFALSE);
442 TString name = AliMUONPainterMatrix::NameIt("Tracker",att);
444 AliMUONPainterMatrix* painterMatrix = AliMUONPainterRegistry::Instance()->FindPainterMatrix(name);
448 AliError(Form("Could not get pre-defined painter matrix %s : check that !",name.Data()));
452 PainterMatrixWantToShow(painterMatrix);
453 // fPainterMatrixFrame->Use(painterMatrix);
454 // ShowPainterMatrix(painterMatrix);
458 //_____________________________________________________________________________
460 AliMUONPainterMasterFrame::UpdateNavigation()
462 /// Update navigation frame
464 fBackButton->SetEnabled(kTRUE);
465 fForwardButton->SetEnabled(kTRUE);
467 if ( fCurrentNavigationPosition == 0 )
469 fBackButton->SetEnabled(kFALSE);
471 if ( fCurrentNavigationPosition == fNavigation.GetSize()-1 )
473 fForwardButton->SetEnabled(kFALSE);
477 //_____________________________________________________________________________
479 AliMUONPainterMasterFrame::AttributesChanged(AliMUONAttPainter* newValues)
481 /// Attributes changed (e.g. from cath0 to cath1 or bending to nonbending, etc...)
483 AliMUONPainterMatrix* currentMatrix = fPainterMatrixFrame->Matrix();
485 AliMUONAttPainter a = currentMatrix->Validate(*newValues);
490 new TGMsgBox(gClient->GetRoot(), this,
491 "Invalid combination", "Change of attributes not possible for this object",
492 kMBIconExclamation, kMBOk, &ret);
493 PainterMatrixWantToShow(currentMatrix);
497 // First check if we already have this matrix available
499 TString newName = AliMUONPainterMatrix::NameIt(currentMatrix->Basename(),a);
501 AliMUONPainterMatrix* matrix =
502 AliMUONPainterRegistry::Instance()->FindPainterMatrix(newName.Data());
506 // No. So we must make a new matrix painter from the existing one,
507 // and add to this new matrix the painters of the other one, but
508 // using the new attributes...
510 matrix = currentMatrix->Clone(a);
512 AddPainterMatrix(matrix);
515 matrix->SetData(currentMatrix->DataPattern(),
516 currentMatrix->Data(),
517 currentMatrix->DataIndex());
519 PainterMatrixWantToShow(matrix);