next50 trigger mask in AliHLTGlobalEsdConverterComponent
[u/mrichter/AliRoot.git] / MUON / AliMUONPainterInterfaceHelper.cxx
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 "AliMUONPainterInterfaceHelper.h"
19
20 ///\class AliMUONPainterInterfaceHelper
21 ///
22 /// Helper class to work with TGButtonGroup
23 ///
24 /// This class only works if the buttons in the TGButtonGroup have contiguous
25 /// ids, and if those ids start at ButtonStartingId().
26 /// Not bullet-proof, I admit, but this is the only way I've found with
27 /// the current TGButtonGroup implementation which does not allow to loop
28 /// easily on all buttons.
29 ///
30 // Author Laurent Aphecetche, Subatech
31
32 #include "AliMUONPainterEnv.h"
33 #include "AliMUONPainterHelper.h"
34 #include "AliLog.h"
35 #include <Riostream.h>
36 #include <TClass.h>
37 #include <TGButtonGroup.h>
38 #include <TGButton.h>
39 #include <TGClient.h>
40 #include <TObjArray.h>
41 #include <TObjString.h>
42 #include <TString.h>
43 #include <RVersion.h>
44 #include <cassert>
45
46 using std::cout;
47 using std::endl;
48 ///\cond CLASSIMP
49 ClassImp(AliMUONPainterInterfaceHelper)
50 ///\endcond
51
52 //_____________________________________________________________________________
53 AliMUONPainterInterfaceHelper::AliMUONPainterInterfaceHelper() : TObject()
54 {
55   /// ctor
56 }
57
58 //_____________________________________________________________________________
59 AliMUONPainterInterfaceHelper::~AliMUONPainterInterfaceHelper()
60 {
61   /// dtor
62 }
63
64 //_____________________________________________________________________________
65 void
66 AliMUONPainterInterfaceHelper::AddRadioButton(TGButtonGroup& bg,
67                                               const TString& name,
68                                               void* userData,
69                                               Bool_t select)
70 {
71   /// Add a radio button to a group
72   Int_t n = bg.GetCount();
73   
74   TGButton* button = new TGRadioButton(&bg,
75                                        name.Data(),
76                                        n+ButtonStartingId());
77   button->SetUserData(userData);
78   button->SetOn(select,kFALSE);  
79 }
80
81 //_____________________________________________________________________________
82 void
83 AliMUONPainterInterfaceHelper::AddCheckButton(TGButtonGroup& bg,
84                                               const TString& name,
85                                               void* userData,
86                                               Bool_t select)
87 {
88   /// Add a check button to a group
89   Int_t n = bg.GetCount();
90   
91   TGButton* button = new TGCheckButton(&bg,
92                                        name.Data(),
93                                        n+ButtonStartingId());
94   button->SetUserData(userData);
95   button->SetOn(select,kFALSE);
96 }
97
98 //_____________________________________________________________________________
99 void 
100 AliMUONPainterInterfaceHelper::ClearButtons(TGButtonGroup& bg)
101 {
102   /// Remove all buttons from group.
103   /// Bear in mind that you're thus disconnecting the group from
104   /// any signals it might have. So you must re-connect them after
105   /// a call to this method, if you want to.
106   
107   while ( bg.GetCount() > 0 )
108   {
109     TGTextButton* button = (TGTextButton*)(bg.GetButton(bg.GetCount()));
110     if ( !button ) 
111     {
112       AliFatalClass(Form("Got a null button for bg.Count()=%d",bg.GetCount()));
113     }
114     bg.Remove(button);
115 #if ROOT_VERSION_CODE <= ROOT_VERSION(5,16,0)
116     button->DestroyWindow();
117 #endif
118     delete button;
119   }
120 }
121
122 //_____________________________________________________________________________
123 void
124 AliMUONPainterInterfaceHelper::Copy(const TGButtonGroup& src, TGButtonGroup& dest)
125 {
126   /// Copy a button group into another one
127   AliDebugClass(1,Form("src=%p (%s) count=%d dest=%p (%s) count=%d",
128                        &src,src.GetTitle(),src.GetCount(),
129                        &dest,dest.GetTitle(),dest.GetCount()));
130
131   StdoutToAliDebugClass(1,cout << "---copying:" << endl; Dump(src);
132                         cout << "---to:" << endl; Dump(dest));
133   
134   ClearButtons(dest);
135   
136   dest.SetTitle(src.GetTitle());
137   
138   if ( &src != &dest )
139   {
140     for ( Int_t i = ButtonStartingId(); i < ButtonStartingId() + src.GetCount(); ++i )
141     {
142       TGTextButton* tb = static_cast<TGTextButton*>(src.GetButton(i));
143       TGButton* button = new TGRadioButton(&dest,tb->GetTitle(),tb->WidgetId());
144       assert(tb->WidgetId()==i);
145       button->SetUserData(tb->GetUserData());
146       button->SetOn(tb->IsOn(),kFALSE);
147     }
148   }
149 }
150
151 //_____________________________________________________________________________
152 void 
153 AliMUONPainterInterfaceHelper::Dump(const TGButtonGroup& bg)
154 {
155   /// Printout
156   cout << Form("ButtonGroup %s %s",bg.GetName(),bg.GetTitle()) << endl;
157   
158   for ( Int_t i = ButtonStartingId(); i < bg.GetCount() + ButtonStartingId(); ++i ) 
159   {
160     TGTextButton* button = static_cast<TGTextButton*>(bg.GetButton(i));
161     if ( button ) 
162     {
163       cout << Form("i %2d button %s id %lu wid %d ON %d",
164                  i,button->GetTitle(),button->GetId(),
165                  button->WidgetId(),
166                  button->IsOn()) << endl;
167     }
168     else
169     {
170       cout << Form("i %2d button = 0x0",i) << endl;
171     }
172   }
173 }
174
175 //_____________________________________________________________________________
176 TGButton* 
177 AliMUONPainterInterfaceHelper::FindButtonByName(const TGButtonGroup& bg, 
178                                                 const TString& name)
179 {
180   /// Find a button by name
181   
182   for ( Int_t i = ButtonStartingId(); i < ButtonStartingId() + bg.GetCount(); ++i )
183   {
184     TGTextButton* button = static_cast<TGTextButton*>(bg.GetButton(i));
185     if (!button)
186     {
187       AliErrorClass(Form("(%s) : Something wrong",name.Data()));
188       Dump(bg);
189     }
190     else
191     {
192       if ( name == button->GetTitle() )
193       {
194         return button;
195       }
196     }
197   }
198   return 0x0;
199 }
200
201 //_____________________________________________________________________________
202 TGButton* 
203 AliMUONPainterInterfaceHelper::FindButtonByUserData(const TGButtonGroup& bg, 
204                                                     const void* userData)
205 {
206   /// Find a button by userData
207   
208   for ( Int_t i = ButtonStartingId(); i < ButtonStartingId() + bg.GetCount(); ++i )
209   {
210     TGButton* button = bg.GetButton(i);
211     if ( button->GetUserData() == userData )
212     {
213       return button;
214     }
215   }
216   return 0x0;
217 }
218
219 //_____________________________________________________________________________
220 TGButton* 
221 AliMUONPainterInterfaceHelper::FindDownButton(const TGButtonGroup& bg)
222 {
223   /// Find which button is down (in a radio group)
224   
225   AliDebugClass(1,Form("bg %s",bg.GetTitle()));
226   
227   for ( Int_t i = ButtonStartingId(); i < ButtonStartingId() + bg.GetCount(); ++i )
228   {
229     TGButton* button = bg.GetButton(i);
230     if ( button->IsOn() ) 
231     {
232       AliDebugClass(1,Form("button %s",button->GetTitle()));
233       return button;
234     }
235   }
236   return 0x0;
237 }
238
239
240 //_____________________________________________________________________________
241 void 
242 AliMUONPainterInterfaceHelper::SetBackgroundColor(const char* resourceBaseName, 
243                                                   TGWindow& window)
244 {
245   /// Set the background color of the window
246   TString rs(Form("%s.BackgroundColor",resourceBaseName));
247   TString colorName = AliMUONPainterHelper::Instance()->Env()->String(rs.Data(),"#c0c0c0");
248
249   Pixel_t color;
250   Bool_t ok = gClient->GetColorByName(colorName, color);
251   if ( ok ) 
252   {
253     window.SetBackgroundColor(color);
254     AliDebugClass(1,Form("Setting %s color to %s",rs.Data(),colorName.Data()));
255   }
256 }
257
258 //_____________________________________________________________________________
259 void 
260 AliMUONPainterInterfaceHelper::SetState(TGButtonGroup& bg, Bool_t state)
261 {
262   /// should not be needed with root > 5.16/00 as there's a TGButtonGroup::SetState
263   /// method now...
264
265 #if ROOT_VERSION_CODE > ROOT_VERSION(5,16,0)
266   bg.SetState(state);
267 #else
268   for ( Int_t i = ButtonStartingId(); i < ButtonStartingId() + bg.GetCount(); ++i ) 
269   {
270     TGTextButton* button = (TGTextButton*)(bg.GetButton(i));
271     if ( state ) 
272     {
273       button->SetState(kButtonUp);
274     }
275     else
276     {
277       button->SetState(kButtonDisabled);
278     }
279   }
280 #endif  
281 }
282
283 //_____________________________________________________________________________
284 void 
285 AliMUONPainterInterfaceHelper::Select(TGButtonGroup& bg, 
286                                       const TString& buttonName,
287                                       Bool_t emit)
288 {
289   /// Select which button should be on
290   
291   AliDebugClass(1,Form("bg %s buttonName %s",bg.GetTitle(),buttonName.Data()));
292   
293   for ( Int_t i = ButtonStartingId(); i < ButtonStartingId() + bg.GetCount(); ++i ) 
294   {
295     TGTextButton* button = (TGTextButton*)(bg.GetButton(i));
296     if ( buttonName == button->GetTitle() || buttonName == "*" ) 
297     {
298       if ( emit ) 
299       {
300         button->Clicked();
301       }
302       else
303       {        
304         button->SetOn(kTRUE);
305       }
306     }
307   }  
308 }
309
310 //_____________________________________________________________________________
311 void 
312 AliMUONPainterInterfaceHelper::Unselect(TGButtonGroup& bg, 
313                                         const TString& buttonName,
314                                         Bool_t emit)
315 {
316   /// Unselect a given button
317   
318   for ( Int_t i = ButtonStartingId(); i < ButtonStartingId() + bg.GetCount(); ++i ) 
319   {
320     TGTextButton* button = (TGTextButton*)(bg.GetButton(i));
321     if ( buttonName == button->GetTitle() || buttonName == "*" ) 
322     {
323       if ( emit ) 
324       {
325         button->Released();
326       }
327       else
328       {        
329         button->SetOn(kFALSE);
330       }
331     }
332   }  
333 }
334
335 //_____________________________________________________________________________
336 void
337 AliMUONPainterInterfaceHelper::RemoveButton(TGButtonGroup& bg,
338                                             const TGButton* button)
339 {
340   /// Remove a button
341   
342   // need to redo it from scratch in order not the leave holes in the
343   // id numbering
344   
345   TGButtonGroup bgtmp(bg.GetParent(),bg.GetTitle());
346   
347   Int_t id(ButtonStartingId());
348   
349   for ( Int_t i = ButtonStartingId(); i < ButtonStartingId() + bg.GetCount(); ++i ) 
350   {
351     TGTextButton* b = static_cast<TGTextButton*>(bg.GetButton(i));
352
353     if ( b != button ) 
354     {
355       TGButton* bc = new TGRadioButton(&bgtmp,b->GetTitle(),id);
356       ++id;
357       bc->SetUserData(b->GetUserData());
358       bc->SetOn(b->IsOn());
359     }    
360   }    
361
362   ClearButtons(bg);
363
364   Copy(bgtmp,bg);
365   
366   bg.Show();
367 }