o add Reset function to CalPad and CalROC o Add functionality to AliTPCdataQA - Reset...
[u/mrichter/AliRoot.git] / MUON / AliMUONPainterInterfaceHelper.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 "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
b80faac0 46using std::cout;
47using std::endl;
0145e89a 48///\cond CLASSIMP
49ClassImp(AliMUONPainterInterfaceHelper)
50///\endcond
51
52//_____________________________________________________________________________
53AliMUONPainterInterfaceHelper::AliMUONPainterInterfaceHelper() : TObject()
54{
55 /// ctor
56}
57
58//_____________________________________________________________________________
59AliMUONPainterInterfaceHelper::~AliMUONPainterInterfaceHelper()
60{
61 /// dtor
62}
63
64//_____________________________________________________________________________
65void
66AliMUONPainterInterfaceHelper::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//_____________________________________________________________________________
82void
83AliMUONPainterInterfaceHelper::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//_____________________________________________________________________________
99void
100AliMUONPainterInterfaceHelper::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//_____________________________________________________________________________
123void
124AliMUONPainterInterfaceHelper::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//_____________________________________________________________________________
152void
153AliMUONPainterInterfaceHelper::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));
49419555 161 if ( button )
162 {
a4ecce1e 163 cout << Form("i %2d button %s id %lu wid %d ON %d",
0145e89a 164 i,button->GetTitle(),button->GetId(),
165 button->WidgetId(),
166 button->IsOn()) << endl;
49419555 167 }
168 else
169 {
170 cout << Form("i %2d button = 0x0",i) << endl;
171 }
0145e89a 172 }
173}
174
175//_____________________________________________________________________________
176TGButton*
177AliMUONPainterInterfaceHelper::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));
49419555 185 if (!button)
0145e89a 186 {
49419555 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 }
0145e89a 196 }
197 }
198 return 0x0;
199}
200
201//_____________________________________________________________________________
202TGButton*
203AliMUONPainterInterfaceHelper::FindButtonByUserData(const TGButtonGroup& bg,
57e2ad1a 204 const void* userData)
0145e89a 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//_____________________________________________________________________________
220TGButton*
221AliMUONPainterInterfaceHelper::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//_____________________________________________________________________________
241void
242AliMUONPainterInterfaceHelper::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//_____________________________________________________________________________
259void
260AliMUONPainterInterfaceHelper::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//_____________________________________________________________________________
284void
285AliMUONPainterInterfaceHelper::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//_____________________________________________________________________________
311void
312AliMUONPainterInterfaceHelper::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
49419555 335//_____________________________________________________________________________
336void
337AliMUONPainterInterfaceHelper::RemoveButton(TGButtonGroup& bg,
57e2ad1a 338 const TGButton* button)
49419555 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}