Always delete TObjArrays created by TString::Tokenize (Ruben)
[u/mrichter/AliRoot.git] / MUON / AliMUONPainterMasterFrame.cxx
CommitLineData
0145e89a 1/**************************************************************************
2* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3* *
4* Author: The ALICE Off-line Project. *
5* Contributors are mentioned in the code where appropriate. *
6* *
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**************************************************************************/
15
16// $Id$
17
18#include "AliMUONPainterMasterFrame.h"
19
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"
29#include "AliLog.h"
30#include <Riostream.h>
31#include <TApplication.h>
32#include <TCanvas.h>
33#include <TEnv.h>
34#include <TGComboBox.h>
fcabdc0c 35#include <TGFileDialog.h>
0145e89a 36#include <TGLabel.h>
37#include <TObjArray.h>
38#include <TObjString.h>
39#include <TGButtonGroup.h>
40#include <TGMsgBox.h>
fcabdc0c 41#include <TSystem.h>
0145e89a 42
43/// \class AliMUONPainterMasterFrame
44///
45/// Main window of the 2D display
46///
47/// \author Laurent Aphecetche, Subatech
48
49///\cond CLASSIMP
50ClassImp(AliMUONPainterMasterFrame)
51///\endcond
52
0145e89a 53const Int_t AliMUONPainterMasterFrame::fgkBorderSize = 10;
54
55//_____________________________________________________________________________
56AliMUONPainterMasterFrame::AliMUONPainterMasterFrame(const TGWindow* p,
fcabdc0c 57 UInt_t w, UInt_t h, AliMUONPainterMatrix* matrix)
0145e89a 58: TGCompositeFrame(p,w,h,kVerticalFrame),
fcabdc0c 59fNavigationFrame(0x0),
60fPainterMatrixFrame(0x0),
61fBackButton(0x0),
62fForwardButton(0x0),
63fGroupTitle(0x0),
64fPrintMeButton(0x0),
65fPrintAsButton(0x0),
66fNavigation(),
67fCurrentNavigationPosition(-1),
68fAttPainterSelectorFrame(0x0)
0145e89a 69{
70 /// ctor
71
72 UInt_t wi = w - fgkBorderSize*2;
73 UInt_t hi = h - fgkBorderSize*3;
74
75 fNavigationFrame = new TGHorizontalFrame(this,wi);
76
77 AddFrame(fNavigationFrame,new TGLayoutHints(kLHintsExpandX|kLHintsTop,
78 fgkBorderSize,fgkBorderSize,
79 fgkBorderSize,fgkBorderSize));
fcabdc0c 80
0145e89a 81 fBackButton = new TGPictureButton(fNavigationFrame,
fcabdc0c 82 gClient->GetPicture("tb_back.xpm"));
0145e89a 83
84 fForwardButton = new TGPictureButton(fNavigationFrame,
fcabdc0c 85 gClient->GetPicture("tb_forw.xpm"));
86
87 fPrintMeButton = new TGTextButton(fNavigationFrame,"Print");
88 fPrintAsButton = new TGTextButton(fNavigationFrame,"Print As...");
0145e89a 89
90 fAttPainterSelectorFrame = new AliMUONAttPainterSelectorFrame(fNavigationFrame,w/2,20);
91
92 fGroupTitle = new TGLabel(fNavigationFrame,"");
93
94 fNavigationFrame->AddFrame(fBackButton,new TGLayoutHints(kLHintsCenterY));
95 fNavigationFrame->AddFrame(fForwardButton,new TGLayoutHints(kLHintsCenterY));
96
97 fNavigationFrame->AddFrame(fAttPainterSelectorFrame,new TGLayoutHints(kLHintsCenterY,10));
fcabdc0c 98
99 fNavigationFrame->AddFrame(fPrintMeButton,new TGLayoutHints(kLHintsCenterY,10));
100 fNavigationFrame->AddFrame(fPrintAsButton,new TGLayoutHints(kLHintsCenterY,10));
101
0145e89a 102 fAttPainterSelectorFrame->Connect("Clicked(AliMUONAttPainter*)",
103 "AliMUONPainterMasterFrame",
104 this,
105 "AttributesChanged(AliMUONAttPainter*)");
106
107 fNavigationFrame->AddFrame(fGroupTitle,new TGLayoutHints(kLHintsExpandX|kLHintsCenterX|kLHintsCenterY,10));
108
109 fForwardButton->Connect("Clicked()","AliMUONPainterMasterFrame",
110 this,
111 "Forward()");
112
113 fBackButton->Connect("Clicked()","AliMUONPainterMasterFrame",
114 this,
115 "Backward()");
116
fcabdc0c 117 fPrintMeButton->Connect("Clicked()","AliMUONPainterMasterFrame",
118 this,
119 "PrintMe()");
120
121 fPrintAsButton->Connect("Clicked()","AliMUONPainterMasterFrame",
122 this,
123 "PrintAs()");
0145e89a 124
0145e89a 125 UInt_t w1 = wi;
9016a84e 126 // UInt_t h1 = hi - fNavigationFrame->GetHeight() - 3*fgkBorderSize;
127 UInt_t h1 = hi - 7*12;
0145e89a 128
fcabdc0c 129 MakeTopPainterMatrix(w1,h1,matrix);
0145e89a 130
131 AddFrame(fPainterMatrixFrame,new TGLayoutHints(kLHintsExpandX,
132 fgkBorderSize,fgkBorderSize,
133 0,fgkBorderSize));
134
135 AliMUONPainterInterfaceHelper::SetBackgroundColor("MasterFrame.Navigation",*fNavigationFrame);
136 AliMUONPainterInterfaceHelper::SetBackgroundColor("MasterFrame.Main",*this);
137
138 AliDebug(1,Form("fNavigation=%p",&fNavigation));
139
140 AliMUONPainterRegistry::Instance()->Connect("PainterMatrixWantToShow(AliMUONPainterMatrix*)",
141 "AliMUONPainterMasterFrame",
142 this,
143 "PainterMatrixWantToShow(AliMUONPainterMatrix*)");
144
fcabdc0c 145 fPainterMatrixFrame->DataSourceWasChanged(matrix->DataPattern().Data(),matrix->Data(),matrix->DataIndex());
0145e89a 146}
147
148//_____________________________________________________________________________
149AliMUONPainterMasterFrame::~AliMUONPainterMasterFrame()
150{
151 /// dtor
152 Cleanup();
153}
154
155//_____________________________________________________________________________
156void
157AliMUONPainterMasterFrame::AddPainterMatrix(AliMUONPainterMatrix* painterMatrix)
158{
159 /// array is adopted (by the registry)
160
1130977f 161 AliDebug(1,Form("matrix=%p %s",painterMatrix,painterMatrix->GetName()));
0145e89a 162
163 Int_t i = AliMUONPainterRegistry::Instance()->Register(painterMatrix);
164
165 SetNavigation(i);
166}
167
168//_____________________________________________________________________________
169void
170AliMUONPainterMasterFrame::PainterMatrixWantToShow(AliMUONPainterMatrix* group)
171{
9016a84e 172 /// FIXME: should check whether we are the active window before
173 /// responding to this message ?
0145e89a 174
1130977f 175 AliDebug(1,Form("group=%p %s",group,group->GetName()));
0145e89a 176
177 Int_t i = AliMUONPainterRegistry::Instance()->FindIndexOf(group);
178
179 Int_t alreadyThere(-1);
180
181 for ( Int_t j = 0; j < fNavigation.GetSize(); ++j )
182 {
183 if ( fNavigation[j] == i ) alreadyThere = j;
184 }
185
186 if (alreadyThere<0)
187 {
188 SetNavigation(i);
189 }
190 else
191 {
192 fCurrentNavigationPosition = alreadyThere;
193 }
194
195 ShowPainterMatrix(group);
196}
fcabdc0c 197
198//_____________________________________________________________________________
199void
200AliMUONPainterMasterFrame::PrintAs() const
201{
202 /// Handle the PrintAs button
203
204 TGFileInfo fileInfo;
205
206 new TGFileDialog(gClient->GetRoot(),gClient->GetRoot(),
207 kFDSave,&fileInfo);
208
209 if ( fileInfo.fFilename )
210 {
211 SaveAs(gSystem->ExpandPathName(Form("%s",fileInfo.fFilename)),"RECREATE");
212 }
213}
214
215//_____________________________________________________________________________
216void
217AliMUONPainterMasterFrame::PrintMe() const
218{
219 /// Handle the PrintMe button
220
221 SaveAs(gSystem->ExpandPathName(Form("%s.png",fPainterMatrixFrame->Matrix()->GetName())),"RECREATE");
222}
223
0145e89a 224//_____________________________________________________________________________
225void
226AliMUONPainterMasterFrame::SetNavigation(Int_t i)
227{
228 /// Change navigation position
229
230 ++fCurrentNavigationPosition;
231 fNavigation.Set(fCurrentNavigationPosition+1);
232 fNavigation[fCurrentNavigationPosition] = i;
233}
234
235//_____________________________________________________________________________
236void
237AliMUONPainterMasterFrame::ShowPainterMatrix(AliMUONPainterMatrix* painterMatrix)
238{
239 /// Change the painter matrix we show
240
241 fPainterMatrixFrame->Use(painterMatrix);
242
243 painterMatrix->Connect("Clicked(AliMUONVPainter*,Double_t*)",
244 "AliMUONPainterMasterFrame",this,
245 "Clicked(AliMUONVPainter*,Double_t*)");
246
247 painterMatrix->Connect("ShiftClicked(AliMUONVPainter*,Double_t*)",
248 "AliMUONPainterMasterFrame",this,
249 "ShiftClicked(AliMUONVPainter*,Double_t*)");
250
251 fPainterMatrixFrame->Connect("TitleHasChanged(const char*)",
252 "AliMUONPainterMasterFrame",this,
253 "ChangeTitle(const char*)");
254 UpdateNavigation();
255
256 UpdateAttributes(*(fPainterMatrixFrame->Matrix()));
257
258 AliMUONPainterRegistry::Instance()->AddToHistory(painterMatrix);
259
260 Layout();
261}
262
263//_____________________________________________________________________________
264void
265AliMUONPainterMasterFrame::ChangeTitle(const char* newTitle)
266{
267 /// Change the top title
268
269 fGroupTitle->SetText(newTitle);
270 fGroupTitle->Resize();
271 Layout();
272}
273
274//_____________________________________________________________________________
275void
276AliMUONPainterMasterFrame::Backward()
277{
278 /// Move back one step in the history
279 --fCurrentNavigationPosition;
280
281 AliMUONPainterMatrix* group =
282 AliMUONPainterRegistry::Instance()->PainterMatrix(fNavigation[fCurrentNavigationPosition]);
283
284 ShowPainterMatrix(group);
285
286 UpdateNavigation();
287}
288
289//_____________________________________________________________________________
290void
291AliMUONPainterMasterFrame::Forward()
292{
293 /// Move forward one step in history
294
295 ++fCurrentNavigationPosition;
296
297 AliMUONPainterMatrix* group =
298 AliMUONPainterRegistry::Instance()->PainterMatrix(fNavigation[fCurrentNavigationPosition]);
299
300 ShowPainterMatrix(group);
301
302 UpdateNavigation();
303}
304
305//_____________________________________________________________________________
306void
307AliMUONPainterMasterFrame::Clicked(AliMUONVPainter* painter, Double_t* values)
308{
309 /// A given painter was (singly) clicked
0145e89a 310
49419555 311 if ( painter->CanBeDetached() )
312 {
313 fPainterMatrixFrame->MouseLeave(painter);
0145e89a 314
49419555 315 AliMUONPainterMatrix* matrix = new AliMUONPainterMatrix(painter->Name().Data());
0145e89a 316
49419555 317 AliMUONVPainter* p = painter->Detach();
0145e89a 318
49419555 319 p->SetResponder(1);
0145e89a 320
49419555 321 matrix->Adopt(p);
0145e89a 322
49419555 323 AddPainterMatrix(matrix);
324 ShowPainterMatrix(matrix);
325 }
326 else
327 {
328 painter->DrawHistogram(values);
329 }
0145e89a 330}
331
332//_____________________________________________________________________________
333void
334AliMUONPainterMasterFrame::ShiftClicked(AliMUONVPainter* painter, Double_t*)
335{
336 /// A given painter was shift-clicked
337
49419555 338 if ( !painter->CanBeDetached() ) return;
339
0145e89a 340 AliMUONPainterMatrix* currentMatrix = fPainterMatrixFrame->Matrix();
341
342 AliMUONAttPainter a = painter->Attributes();
343
344 TString basename(Form("%s-DUAL",painter->GetName()));
345
fcabdc0c 346 TString newName = AliMUONPainterMatrix::NameIt(currentMatrix->Whatname(),basename.Data(),a);
0145e89a 347
49419555 348 AliMUONPainterMatrix* matrix = AliMUONPainterRegistry::Instance()->PainterMatrix(newName.Data());
0145e89a 349
350 if (!matrix)
351 {
352 // No. So we must make a new matrix painter from the existing one,
353 // and add to this new matrix the painters of the other one, but
354 // using the new attributes...
355
356 // create "opposite" attributes
357 AliMUONAttPainter a1(a);
358 AliMUONAttPainter a2(a);
1ffbeb9d 359
360 a2.Invert();
0145e89a 361
362 a1.SetCathodeAndPlaneDisabled(kTRUE);
363 a2.SetCathodeAndPlaneDisabled(kTRUE);
49419555 364
0145e89a 365 AliMUONVPainter* p1 = AliMUONVPainter::CreatePainter(painter->ClassName(),
366 a1,
367 painter->ID0(),
368 painter->ID1());
369
370 AliMUONVPainter* p2 = AliMUONVPainter::CreatePainter(painter->ClassName(),
49419555 371 a2,
372 painter->ID0(),
373 painter->ID1());
0145e89a 374
375 if (!p1 || !p2)
376 {
377 Int_t ret;
378 new TGMsgBox(gClient->GetRoot(), this,
379 "Invalid combination", "Cannot create 2 views from this painter",
380 kMBIconExclamation, kMBOk, &ret);
381 PainterMatrixWantToShow(currentMatrix);
382 delete p1;
383 delete p2;
384 return;
385 }
386
0145e89a 387 p1->UpdateGroupsFrom(*(painter->Master()));
388 p2->UpdateGroupsFrom(*(painter->Master()));
389
390 p1->SetResponder(1);
391 p2->SetResponder(1);
392
393 Int_t nx(2);
394 Int_t ny(1);
395
396 AliMpArea area(painter->Area());
49419555 397
6e97fbb8 398 if ( area.GetDimensionX() > 1.2*area.GetDimensionY() )
0145e89a 399 {
400 nx = 1;
401 ny = 2;
402 }
403
404 matrix = new AliMUONPainterMatrix(basename.Data(),nx,ny);
405
406 matrix->Adopt(p1);
407 matrix->Adopt(p2);
408
409 AddPainterMatrix(matrix);
410 }
411
412 matrix->SetData(currentMatrix->DataPattern(),
413 currentMatrix->Data(),
414 currentMatrix->DataIndex());
415
416 fPainterMatrixFrame->MouseLeave(painter);
417
418 PainterMatrixWantToShow(matrix);
419}
420
421//_____________________________________________________________________________
10eb3d17 422void
423AliMUONPainterMasterFrame::SaveAs(const char* filename, Option_t* option) const
424{
425 /// Save painter matrix (in the sense of "print") in filename
426 fPainterMatrixFrame->SaveAs(filename,option);
427}
428
429//_____________________________________________________________________________
0145e89a 430void
431AliMUONPainterMasterFrame::Update()
432{
433 /// Update ourselves
434
435 fPainterMatrixFrame->Update();
fcabdc0c 436 fPainterMatrixFrame->UpdateInterface(kFALSE);
0145e89a 437}
438
439//_____________________________________________________________________________
440void
441AliMUONPainterMasterFrame::UpdateAttributes(const AliMUONPainterMatrix& painterMatrix)
442{
443 /// Update the view buttons from the matrix we actually plot
444
445 fAttPainterSelectorFrame->Update(painterMatrix.Attributes());
446}
447
448//_____________________________________________________________________________
449void
fcabdc0c 450AliMUONPainterMasterFrame::MakeTopPainterMatrix(UInt_t w, UInt_t h, AliMUONPainterMatrix* matrix)
0145e89a 451{
452 /// Create the first painter matrix that appears when we are create
453 /// FIXME: how to make this more flexible ?
454
455 fPainterMatrixFrame = new AliMUONPainterMatrixFrame(this,w,h);
456
fcabdc0c 457 if (matrix)
0145e89a 458 {
fcabdc0c 459 PainterMatrixWantToShow(matrix);
0145e89a 460 }
461 else
462 {
fcabdc0c 463 AliError("Cannot work without a painterMatrix");
0145e89a 464 }
465}
466
467//_____________________________________________________________________________
468void
469AliMUONPainterMasterFrame::UpdateNavigation()
470{
471 /// Update navigation frame
472
473 fBackButton->SetEnabled(kTRUE);
474 fForwardButton->SetEnabled(kTRUE);
475
476 if ( fCurrentNavigationPosition == 0 )
477 {
478 fBackButton->SetEnabled(kFALSE);
479 }
480 if ( fCurrentNavigationPosition == fNavigation.GetSize()-1 )
481 {
482 fForwardButton->SetEnabled(kFALSE);
483 }
484}
485
486//_____________________________________________________________________________
487void
57e2ad1a 488AliMUONPainterMasterFrame::AttributesChanged(const AliMUONAttPainter* newValues)
0145e89a 489{
490 /// Attributes changed (e.g. from cath0 to cath1 or bending to nonbending, etc...)
491
492 AliMUONPainterMatrix* currentMatrix = fPainterMatrixFrame->Matrix();
493
494 AliMUONAttPainter a = currentMatrix->Validate(*newValues);
495
496 if (!a.IsValid())
497 {
498 Int_t ret;
499 new TGMsgBox(gClient->GetRoot(), this,
500 "Invalid combination", "Change of attributes not possible for this object",
501 kMBIconExclamation, kMBOk, &ret);
502 PainterMatrixWantToShow(currentMatrix);
503 return;
504 }
505
506 // First check if we already have this matrix available
507
fcabdc0c 508 TString newName = AliMUONPainterMatrix::NameIt(currentMatrix->Whatname(),currentMatrix->Basename(),a);
0145e89a 509
49419555 510 AliMUONPainterMatrix* matrix = AliMUONPainterRegistry::Instance()->PainterMatrix(newName.Data());
0145e89a 511
512 if (!matrix)
513 {
514 // No. So we must make a new matrix painter from the existing one,
515 // and add to this new matrix the painters of the other one, but
516 // using the new attributes...
517
518 matrix = currentMatrix->Clone(a);
519
520 AddPainterMatrix(matrix);
521 }
522
523 matrix->SetData(currentMatrix->DataPattern(),
524 currentMatrix->Data(),
525 currentMatrix->DataIndex());
526
527 PainterMatrixWantToShow(matrix);
528}