AliEveEventManager
[u/mrichter/AliRoot.git] / EVE / EveBase / AliEveEventManagerEditor.cxx
1 // @(#)root/eve:$Id$
2 // Author: Matevz Tadel 2007
3
4 /**************************************************************************
5  * Copyright(c) 1998-2008, ALICE Experiment at CERN, all rights reserved. *
6  * See http://aliceinfo.cern.ch/Offline/AliRoot/License.html for          *
7  * full copyright notice.                                                 *
8  **************************************************************************/
9
10 #include "AliEveEventManagerEditor.h"
11 #include "AliEveEventManager.h"
12
13 #include "TVirtualPad.h"
14 #include "TColor.h"
15
16 #include <TEveGValuators.h>
17 #include <TGButton.h>
18 #include <TGTextView.h>
19 #include <TGLabel.h>
20
21 //______________________________________________________________________________
22 // GUI editor for AliEveEventManager.
23 //
24
25 ClassImp(AliEveEventManagerEditor)
26
27 //______________________________________________________________________________
28 AliEveEventManagerEditor::AliEveEventManagerEditor(const TGWindow *p, Int_t width, Int_t height,
29                                                    UInt_t options, Pixel_t back) :
30   TGedFrame(p, width, height, options | kVerticalFrame, back),
31   fM(0),
32   fNextEvent(0),
33   fEventInfo(0)
34 {
35   // Constructor.
36
37   MakeTitle("AliEveEventManager");
38
39   {
40     TGHorizontalFrame* f = new TGHorizontalFrame(this);
41     fNextEvent = new TGTextButton(f, "Next Event");
42     fNextEvent->SetWidth(100);
43     fNextEvent->ChangeOptions(fNextEvent->GetOptions() | kFixedWidth);
44     f->AddFrame(fNextEvent, new TGLayoutHints(kLHintsNormal, 4,0,0,0));
45     fNextEvent->Connect("Clicked()",
46                         "AliEveEventManagerEditor", this, "DoNextEvent()");
47     AddFrame(f, new TGLayoutHints(kLHintsExpandX, 8,8,8,0));
48   }
49   {
50     TGVerticalFrame* f = new TGVerticalFrame(this);
51
52     TGLabel *eventInfoLabel = new TGLabel(f, "Event Information:");
53     f->AddFrame(eventInfoLabel, new TGLayoutHints(kLHintsNormal, 0,0,6,2));
54
55     fEventInfo = new TGTextView(f, 200, 300);
56     f->AddFrame(fEventInfo, new TGLayoutHints(kLHintsNormal | kLHintsExpandX));
57
58     AddFrame(f, new TGLayoutHints(kLHintsNormal | kLHintsExpandX));
59   }
60 }
61
62 /******************************************************************************/
63
64 //______________________________________________________________________________
65 void AliEveEventManagerEditor::SetModel(TObject* obj)
66 {
67   // Set model object.
68
69   fM = dynamic_cast<AliEveEventManager*>(obj);
70
71   fEventInfo->LoadBuffer(fM->GetEventInfoVertical());
72 }
73
74 /******************************************************************************/
75
76 //______________________________________________________________________________
77 void AliEveEventManagerEditor::DoNextEvent()
78 {
79   // Load next event
80
81   fM->NextEvent();
82 }
83
84
85 //==============================================================================
86 // AliEveEventManagerWindow
87 //==============================================================================
88
89 //______________________________________________________________________________
90 //
91 // Horizontal GUI for AliEveEventManager, to be placed in the
92 // bottom part of ROOT browser.
93
94 ClassImp(AliEveEventManagerWindow)
95
96 AliEveEventManagerWindow::AliEveEventManagerWindow() :
97   TGMainFrame(gClient->GetRoot(), 400, 100, kVerticalFrame),
98   fFirstEvent   (0),
99   fPrevEvent    (0),
100   fNextEvent    (0),
101   fLastEvent    (0),
102   fRefresh      (0),
103   fEventId      (0),
104   fInfoLabel    (0),
105   fAutoLoad     (0),
106   fAutoLoadTime (0),
107   fEventInfo    (0)
108 {
109   // Constructor.
110
111   const TString cls("AliEveEventManagerWindow");
112   TGTextButton *b = 0;
113   {
114     Int_t width = 50;
115
116     TGHorizontalFrame* f = new TGHorizontalFrame(this);
117     AddFrame(f, new TGLayoutHints(kLHintsExpandX, 0,0,2,2));
118
119     fFirstEvent = b = MkTxtButton(f, "First", width);
120     b->Connect("Clicked()", cls, this, "DoFirstEvent()");
121     fPrevEvent = b = MkTxtButton(f, "Prev", width);
122     b->Connect("Clicked()", cls, this, "DoPrevEvent()");
123
124     fEventId = new TGNumberEntry(f, 0, 5, -1,TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative,
125                                  TGNumberFormat::kNELLimitMinMax, 0, 10000);
126     f->AddFrame(fEventId, new TGLayoutHints(kLHintsNormal, 10, 5, 0, 0));
127     fEventId->Connect("ValueSet(Long_t)", cls, this, "DoSetEvent()");
128     fInfoLabel = new TGLabel(f);
129     f->AddFrame(fInfoLabel, new TGLayoutHints(kLHintsNormal, 5, 10, 4, 0));
130
131     fNextEvent = b = MkTxtButton(f, "Next", width);
132     b->Connect("Clicked()", cls, this, "DoNextEvent()");
133     fLastEvent = b = MkTxtButton(f, "Last", width);
134     b->Connect("Clicked()", cls, this, "DoLastEvent()");
135
136     MkLabel(f, "||", 0, 8, 8);
137
138     fRefresh = b = MkTxtButton(f, "Refresh", width + 8);
139     b->Connect("Clicked()",cls, this, "DoRefresh()");
140
141     MkLabel(f, "||", 0, 8, 8);
142
143     fAutoLoad = new TGCheckButton(f, "Autoload");
144     f->AddFrame(fAutoLoad, new TGLayoutHints(kLHintsLeft, 0, 4, 3, 0));
145     fAutoLoad->SetToolTipText("Automatic event loading.");
146     fAutoLoad->Connect("Toggled(Bool_t)", cls, this, "DoSetAutoLoad()");
147
148     fAutoLoadTime = new TEveGValuator(f, "Time: ", 110, 0);
149     f->AddFrame(fAutoLoadTime);    
150     fAutoLoadTime->SetShowSlider(kFALSE);
151     fAutoLoadTime->SetNELength(4);
152     fAutoLoadTime->Build();
153     fAutoLoadTime->SetLimits(0, 1000);
154     fAutoLoadTime->SetToolTip("Automatic event loading time in seconds.");
155     fAutoLoadTime->Connect("ValueSet(Double_t)", cls, this, "DoSetAutoLoadTime()");
156   }
157
158   fEventInfo = new TGTextView(this, 400, 600);
159   AddFrame(fEventInfo, new TGLayoutHints(kLHintsNormal | kLHintsExpandX | kLHintsExpandY));
160
161   gAliEveEvent->Connect("NewEventLoaded()", cls, this, "Update()");
162
163   SetCleanup(kDeepCleanup);
164   Layout();
165   MapSubwindows();
166   MapWindow();
167 }
168
169 //______________________________________________________________________________
170 AliEveEventManagerWindow::~AliEveEventManagerWindow()
171 {
172   // Destructor.
173
174   gAliEveEvent->Disconnect("NewEventLoaded()", this);
175 }
176
177 //______________________________________________________________________________
178 void AliEveEventManagerWindow::DoFirstEvent()
179 {
180   // Load previous event
181   gAliEveEvent->GotoEvent(0);
182 }
183
184 //______________________________________________________________________________
185 void AliEveEventManagerWindow::DoPrevEvent()
186 {
187   // Load previous event
188   gAliEveEvent->PrevEvent();
189 }
190
191 //______________________________________________________________________________
192 void AliEveEventManagerWindow::DoNextEvent()
193 {
194   // Load next event
195   gAliEveEvent->NextEvent();
196 }
197
198 //______________________________________________________________________________
199 void AliEveEventManagerWindow::DoLastEvent()
200 {
201   // Load previous event
202   gAliEveEvent->GotoEvent(-1);
203 }
204
205 //______________________________________________________________________________
206 void AliEveEventManagerWindow::DoSetEvent()
207 {
208   // Set current event
209   gAliEveEvent->GotoEvent((Int_t) fEventId->GetNumber());
210 }
211
212 //______________________________________________________________________________
213 void AliEveEventManagerWindow::DoRefresh()
214 {
215   // Refresh event status.
216
217   Int_t ev = gAliEveEvent->GetEventId();
218   gAliEveEvent->Close();
219   gAliEveEvent->Open();
220   gAliEveEvent->GotoEvent(ev);
221 }
222
223 //______________________________________________________________________________
224 void AliEveEventManagerWindow::DoSetAutoLoad()
225 {
226   // Set the auto-load flag
227
228   gAliEveEvent->SetAutoLoad(fAutoLoad->IsOn());
229   Update();
230 }
231
232 //______________________________________________________________________________
233 void AliEveEventManagerWindow::DoSetAutoLoadTime()
234 {
235   // Set the auto-load time in seconds
236
237   gAliEveEvent->SetAutoLoadTime(fAutoLoadTime->GetValue());
238 }
239
240 //______________________________________________________________________________
241 void AliEveEventManagerWindow::Update()
242 {
243   // Update current event, number of available events.
244
245   Bool_t autoLoad = gAliEveEvent->GetAutoLoad();
246   Bool_t extCtrl  = gAliEveEvent->IsUnderExternalControl();
247   Bool_t evNavOn  = !autoLoad && !extCtrl;
248
249   fFirstEvent->SetEnabled(evNavOn);
250   fPrevEvent ->SetEnabled(evNavOn);
251   fLastEvent ->SetEnabled(evNavOn);
252   fNextEvent ->SetEnabled(!autoLoad);
253   fRefresh   ->SetEnabled(evNavOn);
254
255   fEventId->SetNumber(gAliEveEvent->GetEventId());
256   fEventId->SetState(evNavOn);
257   fInfoLabel->SetText(Form("/ %d", gAliEveEvent->GetMaxEventId()));
258
259   // fAutoLoadTime->SetEnabled(gAliEveEvent->GetAutoLoad());
260   fAutoLoad->SetState(gAliEveEvent->GetAutoLoad() ? kButtonDown : kButtonUp);
261   fAutoLoadTime->SetValue(gAliEveEvent->GetAutoLoadTime());
262
263   fEventInfo->LoadBuffer(gAliEveEvent->GetEventInfoHorizontal());
264
265   Layout();
266 }
267
268 //------------------------------------------------------------------------------
269 // Protected methods
270 //------------------------------------------------------------------------------
271
272 //______________________________________________________________________________
273 TGTextButton* AliEveEventManagerWindow::MkTxtButton(TGCompositeFrame* p,
274                                                     const char* txt, Int_t width,
275                                                     Int_t lo, Int_t ro, Int_t to, Int_t bo)
276 {
277   // Create a standard button.
278   // If width is not zero, the fixed-width flag is set.
279
280   TGTextButton* b = new TGTextButton(p, txt);
281   if (width > 0) {
282     b->SetWidth(width);
283     b->ChangeOptions(b->GetOptions() | kFixedWidth);
284   }
285   p->AddFrame(b, new TGLayoutHints(kLHintsNormal, lo,ro,to,bo));
286   return b;
287 }
288
289 //______________________________________________________________________________
290 TGLabel* AliEveEventManagerWindow::MkLabel(TGCompositeFrame* p,
291                                            const char* txt, Int_t width,
292                                            Int_t lo, Int_t ro, Int_t to, Int_t bo)
293 {
294   // Create a standard button.
295   // If width is not zero, the fixed-width flag is set.
296
297   TGLabel* l = new TGLabel(p, txt);
298   if (width > 0) {
299     l->SetWidth(width);
300     l->ChangeOptions(l->GetOptions() | kFixedWidth);
301   }
302   p->AddFrame(l, new TGLayoutHints(kLHintsNormal, lo,ro,to,bo));
303   return l;
304 }