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