CMS 3D CMS Logo

CmsShowMainFrame.cc
Go to the documentation of this file.
1 
2 // -*- C++ -*-
3 //
4 // Package: Core
5 // Class : CmsShowMainFrame
6 //
7 // Implementation:
8 // <Notes on implementation>
9 //
10 // Original Author: Chris Jones
11 // Created: Thu May 29 20:58:23 CDT 2008
12 
14 
15 // system include files
16 #include <TCollection.h>
17 #include <TApplication.h>
18 #include <TEveWindow.h>
19 #include <TGClient.h>
20 #include <TGLayout.h>
21 #include <TGButton.h>
22 #include <TGMenu.h>
23 #include <TGLabel.h>
24 #include <TGTab.h>
25 #include <TGPack.h>
26 #include <TGStatusBar.h>
27 #include <KeySymbols.h>
28 #include <TGSlider.h>
29 
30 #include <TSystem.h>
31 #include <TImage.h>
32 #include <TEnv.h>
33 // user include files
40 
43 
48 
52 
53 #include <fstream>
54 
55 //
56 // constants, enums and typedefs
57 //
58 
59 //
60 // static data member definitions
61 //
62 
63 
64 // AMT: temprary workaround until TGPack::ResizeExistingFrames() is public
65 class FWPack : public TGPack
66 {
67  friend class CmsShowMainFrame;
68 public:
69  FWPack(const TGWindow* w) : TGPack(w, 100, 100) {}
70  ~FWPack() override {}
71 };
72 
73 //
74 // constructors and destructor
75 //
76 CmsShowMainFrame::CmsShowMainFrame(const TGWindow *p,UInt_t w,UInt_t h,FWGUIManager *m) :
77  TGMainFrame(p, w, h),
84  m_manager(m),
86 {
87  const unsigned int backgroundColor=0x2f2f2f;
88  const unsigned int textColor= 0xb3b3b3;
89  gClient->SetStyle("classic");
90  CSGAction *openData = new CSGAction(this, cmsshow::sOpenData.c_str());
91  CSGAction *appendData = new CSGAction(this, cmsshow::sAppendData.c_str());
92  CSGAction *searchFiles = new CSGAction(this, cmsshow::sSearchFiles.c_str());
93 
94  CSGAction *loadConfig = new CSGAction(this, cmsshow::sLoadConfig.c_str());
95  CSGAction *saveConfig = new CSGAction(this, cmsshow::sSaveConfig.c_str());
96  CSGAction *saveConfigAs = new CSGAction(this, cmsshow::sSaveConfigAs.c_str());
97 
98 
99  CSGAction *loadPartialConfig = new CSGAction(this, cmsshow::sLoadPartialConfig.c_str());
100  CSGAction *savePartialConfig = new CSGAction(this, cmsshow::sSavePartialConfig.c_str());
101  CSGAction *savePartialConfigAs = new CSGAction(this, cmsshow::sSavePartialConfigAs.c_str());
102 
103 
104  CSGAction *exportImage = new CSGAction(this, cmsshow::sExportImage.c_str());
105  CSGAction *exportImages = new CSGAction(this, cmsshow::sExportAllImages.c_str());
106  CSGAction *quit = new CSGAction(this, cmsshow::sQuit.c_str());
107 
108  CSGAction *undo = new CSGAction(this, cmsshow::sUndo.c_str());
109  undo->disable(); //NOTE: All disables happen again later in this routine
110  CSGAction *redo = new CSGAction(this, cmsshow::sRedo.c_str());
111  redo->disable(); //NOTE: All disables happen again later in this routine
112  CSGAction *cut = new CSGAction(this, cmsshow::sCut.c_str());
113  cut->disable(); //NOTE: All disables happen again later in this routine
114  CSGAction *copy = new CSGAction(this, cmsshow::sCopy.c_str());
115  copy->disable(); //NOTE: All disables happen again later in this routine
116  CSGAction *paste = new CSGAction(this, cmsshow::sPaste.c_str());
117  paste->disable();//NOTE: All disables happen again later in this routine
118 
119  CSGAction *goToFirst = new CSGAction(this, cmsshow::sGotoFirstEvent.c_str());
120  CSGAction *goToLast = new CSGAction(this, cmsshow::sGotoLastEvent.c_str());
121 
122  CSGAction *nextEvent = new CSGAction(this, cmsshow::sNextEvent.c_str());
123  CSGAction *previousEvent = new CSGAction(this, cmsshow::sPreviousEvent.c_str());
124 
125  CSGContinuousAction *playEvents = new CSGContinuousAction(this, cmsshow::sPlayEvents.c_str());
126  CSGContinuousAction *playEventsBack = new CSGContinuousAction(this, cmsshow::sPlayEventsBack.c_str());
128 
129  CSGAction *showCommonInsp = new CSGAction(this, cmsshow::sShowCommonInsp.c_str());
130  CSGAction *colorset = new CSGAction(this, cmsshow::sBackgroundColor.c_str());
131 
132  CSGAction *showObjInsp = new CSGAction(this, cmsshow::sShowObjInsp.c_str());
133  CSGAction *showEventDisplayInsp = new CSGAction(this, cmsshow::sShowEventDisplayInsp.c_str());
134  CSGAction *showMainViewCtl = new CSGAction(this, cmsshow::sShowMainViewCtl.c_str());
135  CSGAction *showAddCollection = new CSGAction(this, cmsshow::sShowAddCollection.c_str());
136  CSGAction *showInvMassDialog = new CSGAction(this, cmsshow::sShowInvMassDialog.c_str());
137 
138  CSGAction *help = new CSGAction(this, cmsshow::sHelp.c_str());
139  CSGAction *keyboardShort = new CSGAction(this, cmsshow::sKeyboardShort.c_str());
140  CSGAction *helpGL = new CSGAction(this, cmsshow::sHelpGL.c_str());
141 
142  m_nextEvent = nextEvent;
143  m_previousEvent = previousEvent;
144  m_goToFirst = goToFirst;
145  m_goToLast = goToLast;
146  m_playEvents = playEvents;
147  m_playEventsBack = playEventsBack;
148  m_loopAction = loop;
149 
150  goToFirst->setToolTip("Goto first event");
151  goToLast->setToolTip("Goto last event");
152  previousEvent->setToolTip("Goto previous event");
153  nextEvent->setToolTip("Goto next event");
154  playEvents->setToolTip("Play events");
155  playEventsBack->setToolTip("Play events backwards");
156 
157  TGCompositeFrame *menuTopFrame = new TGCompositeFrame(this, 1, 1, kHorizontalFrame, backgroundColor);
158 
159  TGMenuBar *menuBar = new TGMenuBar(menuTopFrame, this->GetWidth(), 28, kHorizontalFrame);
160 
161  TGPopupMenu *fileMenu = new TGPopupMenu(gClient->GetRoot());
162  menuBar->AddPopup("File", fileMenu, new TGLayoutHints(kLHintsTop | kLHintsLeft, 0, 4, 2, 0));
163 
164  openData->createMenuEntry(fileMenu);
165  appendData->createMenuEntry(fileMenu);
166  searchFiles->createMenuEntry(fileMenu);
167  //searchFiles->disable();
168 
169  fileMenu->AddSeparator();
170  loadConfig->createMenuEntry(fileMenu);
171  saveConfig->createMenuEntry(fileMenu);
172  saveConfigAs->createMenuEntry(fileMenu);
173 
174 
175  TGPopupMenu* partialSaveMenu = new TGPopupMenu(gClient->GetRoot());
176  fileMenu->AddPopup("Advanced Configuration", partialSaveMenu);
177 
178  loadPartialConfig->createMenuEntry(partialSaveMenu);
179  savePartialConfig->createMenuEntry(partialSaveMenu);
180  savePartialConfigAs->createMenuEntry(partialSaveMenu);
181  fileMenu->AddSeparator();
182 
183  exportImage->createMenuEntry(fileMenu);
184  exportImages->createMenuEntry(fileMenu);
185  fileMenu->AddSeparator();
186 
187  quit->createMenuEntry(fileMenu);
188 
189  openData->createShortcut(kKey_O, "CTRL", GetId());
190  loadConfig->createShortcut(kKey_L, "CTRL", GetId());
191  saveConfig->createShortcut(kKey_S, "CTRL", GetId());
192  saveConfigAs->createShortcut(kKey_S, "CTRL+SHIFT", GetId());
193  exportImage->createShortcut(kKey_P, "CTRL", GetId());
194  // comment out the followinf one, seems to get double open file dialog events on OSX
195  // exportImages->createShortcut(kKey_P, "CTRL+SHIFT", GetId());
196  quit->createShortcut(kKey_Q, "CTRL", GetId());
197 
198  TGPopupMenu *editMenu = new TGPopupMenu(gClient->GetRoot());
199  menuBar->AddPopup("Edit", editMenu, new TGLayoutHints(kLHintsTop | kLHintsLeft, 0, 4, 2, 0));
200 
201  showCommonInsp->createMenuEntry(editMenu);
202  showCommonInsp->createShortcut(kKey_A, "CTRL+SHIFT", GetId());
203  colorset->createMenuEntry(editMenu);
204  colorset->createShortcut(kKey_B, "CTRL", GetId());
205  editMenu->AddSeparator();
206 
207  undo->createMenuEntry(editMenu);
208  undo->createShortcut(kKey_Z, "CTRL", GetId());
209  redo->createMenuEntry(editMenu);
210  redo->createShortcut(kKey_Z, "CTRL+SHIFT", GetId());
211  editMenu->AddSeparator();
212 
213  cut->createMenuEntry(editMenu);
214  cut->createShortcut(kKey_X, "CTRL", GetId());
215  copy->createMenuEntry(editMenu);
216  copy->createShortcut(kKey_C, "CTRL", GetId());
217  paste->createMenuEntry(editMenu);
218  paste->createShortcut(kKey_V, "CTRL", GetId());
219 
220  TGPopupMenu *viewMenu = new TGPopupMenu(gClient->GetRoot());
221  menuBar->AddPopup("View", viewMenu, new TGLayoutHints(kLHintsTop | kLHintsLeft, 0, 4, 2, 0));
222 
223  m_newViewerMenu = new TGPopupMenu(gClient->GetRoot());
224  viewMenu->AddPopup("New Viewer", m_newViewerMenu);
225 
226  viewMenu->AddSeparator();
227 
228  nextEvent->createMenuEntry(viewMenu);
229  nextEvent->createShortcut(kKey_Right, "CTRL", GetId());
230  previousEvent->createMenuEntry(viewMenu);
231  previousEvent->createShortcut(kKey_Left, "CTRL", GetId());
232  goToFirst->createMenuEntry(viewMenu);
233  goToLast->createMenuEntry(viewMenu);
234  playEvents->createMenuEntry(viewMenu);
235  playEvents->createShortcut(kKey_Space, "CTRL", GetId());
236  playEventsBack->createMenuEntry(viewMenu);
237  playEventsBack->createShortcut(kKey_Space, "CTRL+SHIFT", GetId());
238  loop->createMenuEntry(viewMenu);
239 
240  TGPopupMenu* windowMenu = new TGPopupMenu(gClient->GetRoot());
241  menuBar->AddPopup("Window", windowMenu, new TGLayoutHints(kLHintsTop | kLHintsLeft, 0, 4, 2, 0));
242 
243  showCommonInsp->createMenuEntry(windowMenu);
244  showObjInsp->createMenuEntry(windowMenu);
245  showEventDisplayInsp->createShortcut(kKey_I, "CTRL", GetId());
246  showEventDisplayInsp->createMenuEntry(windowMenu);
247  showAddCollection->createMenuEntry(windowMenu);
248  showMainViewCtl->createMenuEntry(windowMenu);
249  showInvMassDialog->createMenuEntry(windowMenu);
250 
251  TGPopupMenu *helpMenu = new TGPopupMenu(gClient->GetRoot());
252  menuBar->AddPopup("Help", helpMenu, new TGLayoutHints(kLHintsTop | kLHintsLeft, 0, 4, 2, 0));
253  help->createMenuEntry(helpMenu);
254  keyboardShort->createMenuEntry(helpMenu);
255  helpMenu->AddSeparator();
256  helpGL->createMenuEntry(helpMenu);
257 
258  // colors
259  menuBar->SetBackgroundColor(backgroundColor);
260  TIter next(menuBar->GetTitles());
261  TGMenuTitle *title;
262  while ((title = (TGMenuTitle *)next()))
263  title->SetTextColor(textColor);
264 
265  menuTopFrame->AddFrame(menuBar, new TGLayoutHints(kLHintsLeft, 0, 0, 0, 0));
266 
267 
268  AddFrame(menuTopFrame, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
269 
270  // !!!! MT Line separating menu from other window components.
271  // I would even remove it and squeeze the navigation buttons up.
272  AddFrame(new TGFrame(this, 1, 1, kChildFrame, 0x503020),
273  new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
274 
275  m_statBar = new TGStatusBar(this, this->GetWidth(), 12);
276  AddFrame(m_statBar, new TGLayoutHints(kLHintsBottom | kLHintsExpandX));
277 
278  TGHorizontalFrame *fullbar = new TGHorizontalFrame(this, this->GetWidth(), 30,0, backgroundColor);
279 
280  /**************************************************************************/
281  // controls
282 
283  TGCompositeFrame* controlFrame = new TGVerticalFrame(fullbar, 10, 20, 0, backgroundColor);
284 
285  TGCompositeFrame* buttonFrame = new TGHorizontalFrame(controlFrame, 10, 10, 0, backgroundColor);
286  TImage *imgBtn = TImage::Open(FWCheckBoxIcon::coreIcondir()+"slider-bg-up.png");
287  buttonFrame->SetBackgroundPixmap(imgBtn->GetPixmap());
288 
289 
290  goToFirst->createCustomIconsButton(buttonFrame,
291  fClient->GetPicture(FWCheckBoxIcon::coreIcondir()+"button-gotofirst.png"),
292  fClient->GetPicture(FWCheckBoxIcon::coreIcondir()+"button-gotofirst-over.png"),
293  fClient->GetPicture(FWCheckBoxIcon::coreIcondir()+"button-gotofirst-disabled.png"),
294  new TGLayoutHints(kLHintsCenterY| kLHintsLeft, 4, 3, 10, 0));
295 
296  playEventsBack->createCustomIconsButton(buttonFrame,
297  fClient->GetPicture(FWCheckBoxIcon::coreIcondir()+"button-backward.png"),
298  fClient->GetPicture(FWCheckBoxIcon::coreIcondir()+"button-backward-over.png"),
299  fClient->GetPicture(FWCheckBoxIcon::coreIcondir()+"button-backward-disabled.png"),
300  fClient->GetPicture(FWCheckBoxIcon::coreIcondir()+"button-pause.png"),
301  fClient->GetPicture(FWCheckBoxIcon::coreIcondir()+"button-pause-over.png"),
302  new TGLayoutHints(kLHintsCenterY| kLHintsLeft, 2, 3, 10, 0));
303 
304  previousEvent->createCustomIconsButton(buttonFrame,
305  fClient->GetPicture(FWCheckBoxIcon::coreIcondir()+"button-stepback.png"),
306  fClient->GetPicture(FWCheckBoxIcon::coreIcondir()+"button-stepback-over.png"),
307  fClient->GetPicture(FWCheckBoxIcon::coreIcondir()+"button-stepback-disabled.png"),
308  new TGLayoutHints(kLHintsCenterY| kLHintsLeft, 2, 3, 10, 0));
309 
310  nextEvent->createCustomIconsButton(buttonFrame,
311  fClient->GetPicture(FWCheckBoxIcon::coreIcondir()+"button-stepforward.png"),
312  fClient->GetPicture(FWCheckBoxIcon::coreIcondir()+"button-stepforward-over.png"),
313  fClient->GetPicture(FWCheckBoxIcon::coreIcondir()+"button-stepforward-disabled.png"),
314  new TGLayoutHints(kLHintsCenterY| kLHintsLeft, 2, 3, 10, 0));
315 
316 
317  playEvents->createCustomIconsButton(buttonFrame,
318  fClient->GetPicture(FWCheckBoxIcon::coreIcondir()+"button-forward.png"),
319  fClient->GetPicture(FWCheckBoxIcon::coreIcondir()+"button-forward-over.png"),
320  fClient->GetPicture(FWCheckBoxIcon::coreIcondir()+"button-forward-disabled.png"),
321  fClient->GetPicture(FWCheckBoxIcon::coreIcondir()+"button-pause.png"),
322  fClient->GetPicture(FWCheckBoxIcon::coreIcondir()+"button-pause-over.png"),
323  new TGLayoutHints(kLHintsCenterY| kLHintsLeft, 2, 3, 10, 0));
324 
325  goToLast->createCustomIconsButton(buttonFrame,
326  fClient->GetPicture(FWCheckBoxIcon::coreIcondir()+"button-gotolast.png"),
327  fClient->GetPicture(FWCheckBoxIcon::coreIcondir()+"button-gotolast-over.png"),
328  fClient->GetPicture(FWCheckBoxIcon::coreIcondir()+"button-gotolast-disabled.png"),
329  new TGLayoutHints(kLHintsCenterY| kLHintsLeft, 2, 3, 10, 0));
330 
331  controlFrame->AddFrame(buttonFrame, new TGLayoutHints(kLHintsTop, 10, 0, 0, 0));
332 
333  /**************************************************************************/
334 
335  TGHorizontalFrame* sliderFrame = new TGHorizontalFrame(controlFrame, 10, 10, 0, backgroundColor);
336  TImage *imgSld = TImage::Open(FWCheckBoxIcon::coreIcondir()+"slider-bg-down.png");
337  sliderFrame->SetBackgroundPixmap(imgSld->GetPixmap());
338  TString sldBtn = FWCheckBoxIcon::coreIcondir() +"slider-button.png";
339 
340  m_delaySlider = new TGHSlider(sliderFrame, 109, kSlider1 | kScaleNo);
341  sliderFrame->AddFrame(m_delaySlider, new TGLayoutHints(kLHintsTop | kLHintsLeft, 39, 8, 1, 3));
342  m_delaySlider->SetRange(0, 10000);
343  m_delaySlider->SetPosition(0);
344  m_delaySlider->SetBackgroundColor(0x1a1a1a);
345  m_delaySlider->ChangeSliderPic(sldBtn);
346 
347  controlFrame->AddFrame(sliderFrame, new TGLayoutHints(kLHintsTop, 10, 0, 0, 0));
348 
349  fullbar->AddFrame(controlFrame, new TGLayoutHints(kLHintsLeft, 2, 2, 5, 8));
350 
352  TQObject::Connect(m_delaySlider, "PositionChanged(Int_t)", "FWIntValueListenerBase", m_delaySliderListener, "setValue(Int_t)");
353 
354  //==============================================================================
355 
356  // delay label
357  {
358  TGVerticalFrame* delayFrame = new TGVerticalFrame(fullbar, 60, 10, 0, backgroundColor);
359 
360  TGLabel *label = new TGLabel(delayFrame, "Delay");
361  label->SetTextJustify(kTextCenterX);
362  label->SetTextColor(0xb3b3b3);
363  label->SetBackgroundColor(backgroundColor);
364  delayFrame->AddFrame(label, new TGLayoutHints(kLHintsTop | kLHintsCenterX, 0, 0, 22, 0));
365 
366  TGHorizontalFrame *labFixed = new TGHorizontalFrame(delayFrame, 70, 20, kFixedSize, backgroundColor);
367  m_delayLabel = new TGLabel(labFixed, "0.0s");
368  m_delayLabel->SetBackgroundColor(backgroundColor);
369  m_delayLabel->SetTextJustify(kTextCenterX);
370  m_delayLabel->SetTextColor(0xffffff);
371  labFixed->AddFrame(m_delayLabel, new TGLayoutHints(kLHintsTop | kLHintsCenterX | kLHintsExpandX, 0, 0, 0, 0));
372  delayFrame->AddFrame(labFixed, new TGLayoutHints(kLHintsLeft, 0, 4, 0, 0));
373 
374  fullbar->AddFrame(delayFrame, new TGLayoutHints(kLHintsLeft, 0, 0, 0, 0));
375  }
376 
377  //==============================================================================
378 
379  // text/num entries
380 
381  Int_t entryHeight = 22;
382  TGVerticalFrame *texts = new TGVerticalFrame(fullbar, 400, 10, 0, backgroundColor);
383 
384  // upper row
385  {
386  TGPack *runInfo = new TGPack(texts, 400, entryHeight, kFixedHeight);
387  runInfo->SetVertical(kFALSE);
388  runInfo->SetUseSplitters(kFALSE);
389  runInfo->SetBackgroundColor(backgroundColor);
390 
391  TGHorizontalFrame *rLeft = new TGHorizontalFrame(runInfo, 1, entryHeight);
392  makeFixedSizeLabel(rLeft, "Run", backgroundColor, 0xffffff, 26, entryHeight);
393  m_runEntry = new FWNumberEntryField(rLeft, -1, 0, TGNumberFormat::kNESInteger, TGNumberFormat::kNEAPositive);
394  rLeft->AddFrame(m_runEntry, new TGLayoutHints(kLHintsLeft | kLHintsExpandX, 0,8,0,0));
395  runInfo->AddFrameWithWeight(rLeft, nullptr, 0.28);
396 
397  TGHorizontalFrame *rMid = new TGHorizontalFrame(runInfo, 1, entryHeight);
398  makeFixedSizeLabel(rMid, "Lumi", backgroundColor, 0xffffff, 36, entryHeight);
399  m_lumiEntry = new FWNumberEntryField(rMid, -1, 0, TGNumberFormat::kNESInteger, TGNumberFormat::kNEAPositive);
400  rMid->AddFrame(m_lumiEntry, new TGLayoutHints(kLHintsLeft | kLHintsExpandX, 0,8,0,0));
401  runInfo->AddFrameWithWeight(rMid, nullptr, 0.32);
402 
403  TGHorizontalFrame *rRight = new TGHorizontalFrame(runInfo, 1, entryHeight);
404  makeFixedSizeLabel(rRight, "Event", backgroundColor, 0xffffff, 42, entryHeight);
405  m_eventEntry = new FWNumberEntryField(rRight, -1, 0, TGNumberFormat::kNESInteger, TGNumberFormat::kNEAPositive);
406  rRight->AddFrame(m_eventEntry, new TGLayoutHints(kLHintsLeft | kLHintsExpandX, 0,0,0,0));
407  runInfo->AddFrameWithWeight(rRight, nullptr, 0.4);
408 
409  texts->AddFrame(runInfo, new TGLayoutHints(kLHintsTop | kLHintsExpandX, 0,0,0,4));
410  }
411 
412  // lower row
413  {
414  TGHorizontalFrame *filterFrame = new TGHorizontalFrame(texts, 400, entryHeight, 0, backgroundColor);
415 
416  // filter state Off
417  m_filterIcons[0] = fClient->GetPicture("unchecked_t.xpm");
418  m_filterIcons[1] = fClient->GetPicture("unchecked_t.xpm");
419  m_filterIcons[2] = fClient->GetPicture("unchecked_dis_t.xpm");
420 
421  // filter state On
422  m_filterIcons[3] = fClient->GetPicture("checked_t.xpm");
423  m_filterIcons[4] = fClient->GetPicture("checked_t.xpm");
424  m_filterIcons[5] = fClient->GetPicture("checked_dis_t.xpm");
425 
426  // filter withdrawn
427  m_filterIcons[6] = fClient->GetPicture(FWCheckBoxIcon::coreIcondir() + "icon-alert-ltgraybg.png");
428  m_filterIcons[7] = fClient->GetPicture(FWCheckBoxIcon::coreIcondir() + "icon-alert-ltgraybg-over.png");
429  m_filterIcons[8] = fClient->GetPicture(FWCheckBoxIcon::coreIcondir() + "icon-alert-ltgraybg.png");
430 
432  m_filterEnableBtn->SetBackgroundColor(backgroundColor);
433  m_filterEnableBtn->SetToolTipText("Enable/disable event filtering");
434  filterFrame->AddFrame(m_filterEnableBtn, new TGLayoutHints(kLHintsLeft, 4,0,3,0));
435 
436  m_filterShowGUIBtn = new TGTextButton(filterFrame,"Event filtering is OFF");
437  m_filterShowGUIBtn->ChangeOptions(kRaisedFrame);
438  m_filterShowGUIBtn->SetBackgroundColor(backgroundColor);
439  m_filterShowGUIBtn->SetTextColor(0xFFFFFF);
440  m_filterShowGUIBtn->SetToolTipText("Edit filters");
441  filterFrame->AddFrame(m_filterShowGUIBtn, new TGLayoutHints(kLHintsLeft | kLHintsExpandX, 6,7,0,0));
442 
443  texts->AddFrame(filterFrame, new TGLayoutHints(kLHintsTop | kLHintsExpandX, 0,0,4,0));
444  }
445 
446  fullbar->AddFrame(texts, new TGLayoutHints(kLHintsLeft | kLHintsExpandX, 5, 5, 12, 0));
447 
448  //==============================================================================
449 
450  TGVerticalFrame *texts2 = new TGVerticalFrame(fullbar, 200, 44, kFixedSize, backgroundColor);
451 
452  // time
453  m_timeText = new TGLabel(texts2, "...");
454  m_timeText->SetTextJustify(kTextLeft);
455  m_timeText->SetTextColor(0xffffff);
456  m_timeText->SetBackgroundColor(backgroundColor);
457  texts2->AddFrame(m_timeText, new TGLayoutHints(kLHintsTop | kLHintsExpandX, 0,0,0,1));
458 
459  fullbar->AddFrame(texts2, new TGLayoutHints(kLHintsLeft, 5, 5, 16, 5));
460 
461  //==============================================================================
462 
463  // logo
464  {
465  TGVerticalFrame* parentLogoFrame = new TGVerticalFrame(fullbar, 70, 53, kFixedSize);
466  parentLogoFrame->SetBackgroundColor(backgroundColor);
467  fullbar->AddFrame(parentLogoFrame, new TGLayoutHints(kLHintsRight | kLHintsCenterY));
468 
469  TGVerticalFrame* logoFrame = new TGVerticalFrame(parentLogoFrame, 53, 53, kFixedSize);
470  TImage *logoImg = TImage::Open(FWCheckBoxIcon::coreIcondir() + "CMSRedOnBlackThick.png");
471  logoFrame->SetBackgroundPixmap(logoImg->GetPixmap());
472  parentLogoFrame->AddFrame(logoFrame, new TGLayoutHints(kLHintsRight | kLHintsCenterY, 0, 14, 0, 0));
473  }
474  {
475  TGCompositeFrame *logoFrame = new TGCompositeFrame(this, 61, 23, kFixedSize | kHorizontalFrame, backgroundColor);
476  FWCustomIconsButton *infoBut =
477  new FWCustomIconsButton(logoFrame, fClient->GetPicture(FWCheckBoxIcon::coreIcondir()+"fireworksSmallGray.png"),
478  fClient->GetPicture(FWCheckBoxIcon::coreIcondir()+"fireworksSmallGray-green.png"),
479  fClient->GetPicture(FWCheckBoxIcon::coreIcondir()+"fireworksSmallGray-red.png"),
480  fClient->GetPicture(FWCheckBoxIcon::coreIcondir()+"fireworksSmallGray-red.png"));
481  logoFrame->AddFrame(infoBut);
482  infoBut->Connect("Clicked()", "CmsShowMainFrame", this, "showFWorksInfo()");
483  //TImage *logoImg = TImage::Open( FWCheckBoxIcon::coreIcondir() + "fireworksSmallGray.png");
484  //logoFrame->SetBackgroundPixmap(logoImg->GetPixmap());
485  menuTopFrame->AddFrame(logoFrame, new TGLayoutHints(kLHintsRight | kLHintsBottom, 0, 13, 3, 1));
486  }
487 
488  //==============================================================================
489 
490  AddFrame(fullbar, new TGLayoutHints(kLHintsExpandX, 0, 0, 0, 0));
491 
492  //Start disabled
493  goToFirst->disable();
494  goToLast->disable();
495  previousEvent->disable();
496  nextEvent->disable();
497  playEvents->disable();
498  playEventsBack->disable();
499  loop->disable();
500 
501  //NOTE: There appears to be a bug in ROOT such that creating a menu item and setting it as
502  // disabled immediately is ignored. Therefore we have to wait till here to actually get ROOT
503  // to disable these menu items
504  undo->disable();
505  redo->disable();
506  cut->disable();
507  copy->disable();
508  paste->disable();
509 
510  //==============================================================================
511 
512  FWPack *csArea = new FWPack(this);
513  csArea->SetVertical(kFALSE);
514 
515  TGCompositeFrame *cf = m_manager->createList(csArea);
516  csArea->AddFrameWithWeight(cf, nullptr, 20);
517 
518  TEveCompositeFrameInPack *slot = new TEveCompositeFrameInPack(csArea, nullptr, csArea);
519  csArea->AddFrameWithWeight(slot, nullptr, 80);
520  TEveWindowSlot *ew_slot = TEveWindow::CreateDefaultWindowSlot();
521  ew_slot->PopulateEmptyFrame(slot);
522  m_manager->createViews(ew_slot);
523 
524  AddFrame(csArea,new TGLayoutHints(kLHintsTop | kLHintsExpandX | kLHintsExpandY, 0, 0, 0, 2));
525  csArea->MapSubwindows();
526 
527  SetWindowName("cmsShow");
528 }
529 
530 // CmsShowMainFrame::CmsShowMainFrame(const CmsShowMainFrame& rhs)
531 // {
532 // // do actual copying here;
533 // }
534 
536  Cleanup();
537 }
538 
539 //
540 // assignment operators
541 //
542 // const CmsShowMainFrame& CmsShowMainFrame::operator=(const CmsShowMainFrame& rhs)
543 // {
544 // //An exception safe implementation is
545 // CmsShowMainFrame temp(rhs);
546 // swap(rhs);
547 //
548 // return *this;
549 // }
550 
551 //
552 // member functions
553 //
554 
555 CSGAction*
557 {
558  CSGAction* action(new CSGAction(this, iActionName.c_str()));
560  if (separator) m_newViewerMenu->AddSeparator();
561  return action;
562 }
563 
565 {
566  m_runEntry ->SetUIntNumber(event.id().run());
569 
570  m_timeText->SetText( fireworks::getLocalTime( event ).c_str() );
571 }
572 
574 {
575  m_nextEvent->enable();
577  m_goToFirst->enable();
578  m_goToLast->enable();
579  m_playEvents->enable();
581  m_loopAction->enable();
582 }
583 
585 {
587 }
588 
591 }
592 
593 void
595 {
597 
598  m_runEntry->SetEnabled(enable);
599  m_lumiEntry->SetEnabled(enable);
600  m_eventEntry->SetEnabled(enable);
601  m_filterEnableBtn->SetEnabled(enable);
602  m_filterShowGUIBtn->SetEnabled(enable);
603 }
604 
605 void
607 {
608  if (m_previousEvent != nullptr) {
609  if (enable) {
611  m_goToFirst->enable();
613  } else {
615  m_goToFirst->disable();
618  }
619  }
620 }
621 
622 void
624 {
625  if (m_nextEvent != nullptr) {
626  if (enable) {
627  m_nextEvent->enable();
628  m_goToLast->enable();
629  m_playEvents->enable();
630  } else {
631  m_nextEvent->disable();
632  m_goToLast->disable();
634  m_playEvents->stop();
635  }
636  }
637 }
638 
642 void
644 {
645  if (enable)
646  m_goToLast->enable();
647  else
648  m_goToLast->disable();
649 }
650 
651 bool
653 {
654  return m_nextEvent->isEnabled();
655 }
656 
657 bool
659 {
660  return m_previousEvent->isEnabled();
661 }
662 
664  m_statBar->SetText(status, 0);
665  //force the status bar to update its image
666  gClient->ProcessEventsFor(m_statBar);
667 }
668 
670 {
671  m_statBar->SetText("", 0);
672  //don't process immediately since we want this on the event queue
673  // since results of the last action may still be happening
674 }
675 
677  switch(id) {
678  case 1:
679  {
680  gApplication->Terminate(0);
681  }
682  break;
683  default:
684  fwLog(fwlog::kInfo) << "Invalid menu id\n";
685  break;
686  }
687 }
688 
690 
691  if (event->fType == kGKeyPress) {
692  const std::vector<CSGAction*>& alist = getListOfActions();
693  std::vector<CSGAction*>::const_iterator it_act;
694  Int_t keycode;
695  Int_t modcode;
696  for (it_act = alist.begin(); it_act != alist.end(); ++it_act) {
697  keycode = (*it_act)->getKeycode();
698  modcode = (*it_act)->getModcode();
699  if ((event->fCode == (UInt_t)keycode) &&
700  ((event->fState == (UInt_t)modcode) ||
701  (event->fState == (UInt_t)(modcode | kKeyMod2Mask)) ||
702  (event->fState == (UInt_t)(modcode | kKeyLockMask)) ||
703  (event->fState == (UInt_t)(modcode | kKeyMod2Mask | kKeyLockMask)))) {
704  (*it_act)->activated.emit();
705  // return kTRUE;
706  return false;
707  }
708  }
709 
710  // special case is --live option where Space key is grabbed
711  static UInt_t spacecode = gVirtualX->KeysymToKeycode((int)kKey_Space);
712  if (event->fCode == spacecode && event->fState == 0 ) {
713  if (playEventsAction()->isRunning() )
715  else if (playEventsBackwardsAction()->isRunning() )
717  }
718  }
719  return kFALSE;
720 }
721 
722 void
723 CmsShowMainFrame::setPlayDelayGUI(Float_t val, Bool_t sliderChanged)
724 {
725  m_delayLabel->SetText(Form("%.1fs", val));
726  if (sliderChanged)
727  m_delaySlider->SetPosition(Int_t(val*1000));
728 }
729 
730 void
731 CmsShowMainFrame::makeFixedSizeLabel(TGHorizontalFrame* p, const char* txt,
732  UInt_t bgCol, UInt_t txtCol,
733  Int_t width, Int_t height)
734 {
735  // Utility function.
736 
737 
738  p->SetBackgroundColor(bgCol);
739  TGCompositeFrame *lframe = new TGHorizontalFrame(p, width, height, kFixedSize, bgCol);
740  TGLabel* label = new TGLabel(lframe, txt);
741  label->SetBackgroundColor(bgCol);
742  label->SetTextColor(txtCol);
743  lframe->AddFrame(label, new TGLayoutHints(kLHintsRight | kLHintsTop, 0, 4));
744  p->AddFrame(lframe, new TGLayoutHints(kLHintsLeft, 0, 0, 3, 0));
745 }
746 
747 class InfoFrame : public TGMainFrame {
748 public:
749  InfoFrame(const TGWindow* p, UInt_t w, UInt_t h, UInt_t opts) : TGMainFrame(p, w, h, opts) {}
750  ~InfoFrame() override {}
751 
752  void CloseWindow() override
753  {
754  UnmapWindow();
755  }
756 };
757 
758 void
760 {
761  if (m_fworksAbout == nullptr)
762  {
763  UInt_t ww = 280, hh = 190;
764  int number_of_lines = 0;
765  int fontSize = 8;
766  TString infoText;
767  if (gSystem->Getenv("CMSSW_VERSION"))
768  {
769  infoText = "Version ";
770  infoText += gSystem->Getenv("CMSSW_VERSION");
771  infoText +="\n";
772  number_of_lines += 1;
773  }
774  else
775  {
776  TString infoFileName("/data/version.txt");
777  fireworks::setPath(infoFileName);
779  std::ifstream infoFile(infoFileName);
780  while (std::getline(infoFile, line))
781  {
782  ++number_of_lines;
783  infoText += line.c_str();
784  infoText += "\n";
785  }
786  infoFile.close();
787  }
788  infoText += "\nIt works or we fix it for free!\nhn-cms-visualization@cern.ch\n";
789 
790  hh = 130 + 2* fontSize*(number_of_lines + 1);
791 
792  m_fworksAbout = new InfoFrame(gClient->GetRoot(), ww, hh, kVerticalFrame | kFixedSize);
793  m_fworksAbout->SetWMSizeHints(ww, hh, ww, hh, 0, 0);
794  m_fworksAbout->SetBackgroundColor(0x2f2f2f);
795 
796  TGFrame* logoFrame = new TGFrame(m_fworksAbout, 140, 48, kFixedSize);
797  TImage *logoImg = TImage::Open(FWCheckBoxIcon::coreIcondir()+"logo-fireworks.png");
798  logoFrame->SetBackgroundPixmap(logoImg->GetPixmap());
799  m_fworksAbout->AddFrame(logoFrame, new TGLayoutHints(kLHintsTop | kLHintsCenterX, 0, 0, 16, 0));
800 
801  TGLabel* label = new TGLabel(m_fworksAbout, infoText);
802  label->SetBackgroundColor(0x2f2f2f);
803  label->SetForegroundColor(0xffffff);
804 
805  FontStruct_t defaultFontStruct = label->GetDefaultFontStruct();
806  try
807  {
808  TGFontPool *pool = gClient->GetFontPool();
809  TGFont* defaultFont = pool->GetFont(defaultFontStruct);
810  FontAttributes_t attributes = defaultFont->GetFontAttributes();
811  label->SetTextFont(pool->GetFont(attributes.fFamily, fontSize,
812  attributes.fWeight, attributes.fSlant));
813  }
814  catch(...)
815  {
816  }
817 
818  m_fworksAbout->AddFrame(label, new TGLayoutHints(kLHintsCenterX | kLHintsCenterY, 0, 0, 12, 0));
819 
820  TGTextButton* btn = new TGTextButton(m_fworksAbout, " OK ");
821  btn->SetBackgroundColor(0x2f2f2f);
822  btn->SetForegroundColor(0xffffff);
823  m_fworksAbout->AddFrame(btn, new TGLayoutHints(kLHintsBottom | kLHintsCenterX, 0, 0, 0, 12));
824  btn->Connect("Clicked()", "TGMainFrame", m_fworksAbout, "CloseWindow()");
825 
826  m_fworksAbout->MapSubwindows();
827  m_fworksAbout->Layout();
828  }
829 
830  m_fworksAbout->MapRaised();
831 }
832 
833 
834 void
835 CmsShowMainFrame::bindCSGActionKeys(const TGMainFrame* f) const
836 {
837  for (std::vector<CSGAction*>::const_iterator i = m_actionList.begin(); i != m_actionList.end(); ++i)
838  {
839  if ((*i)-> getKeycode())
840  f->BindKey(this, (*i)->getKeycode(), (*i)->getModcode());
841  }
842 }
843 
844 void
846 {
847 
848  TGFrameElement* fe = (TGFrameElement*) GetList()->Last();
849  FWPack* pack = (FWPack*)(fe->fFrame);
850 
851  TGFrameElementPack* fep;
852  fep = (TGFrameElementPack*)pack->GetList()->At(1);
853  fep->fWeight = x;
854 
855  fep = (TGFrameElementPack*)pack->GetList()->At(3);
856  fep->fWeight = 100 -x;
857 
858  pack->ResizeExistingFrames();
859  pack->Layout();
860 }
861 
862 float
864 {
865  TGFrameElement* fe = (TGFrameElement*)GetList()->Last();
866  TGPack* pack = (TGPack*)(fe->fFrame);
867 
868  TGFrameElementPack* fep = (TGFrameElementPack*)pack->GetList()->At(1);
869  return fep->fWeight;
870 
871 }
const std::string sKeyboardShort
Definition: ActionsList.cc:46
TGVerticalFrame * createList(TGCompositeFrame *p)
RunNumber_t run() const
Definition: EventID.h:39
static const TString & coreIcondir()
const std::string sSavePartialConfig
Definition: ActionsList.cc:21
void CloseWindow() override
FWNumberEntryField * m_lumiEntry
EventNumber_t event() const
Definition: EventID.h:41
def pack(high, low)
void bindCSGActionKeys(const TGMainFrame *f) const
const std::string sShowCommonInsp
Definition: ActionsList.cc:30
string separator
Definition: mps_merge.py:77
virtual void SetUIntNumber(UInt_t n)
FWPack(const TGWindow *w)
const std::string sHelp
Definition: ActionsList.cc:45
const std::string sCut
Definition: ActionsList.cc:35
InfoFrame(const TGWindow *p, UInt_t w, UInt_t h, UInt_t opts)
const std::string sSavePartialConfigAs
Definition: ActionsList.cc:22
void loadEvent(const edm::EventBase &event)
const double w
Definition: UKUtility.cc:23
CSGContinuousAction * playEventsBackwardsAction() const
void createViews(TEveWindowSlot *slot)
virtual void enableActions(bool enable=true)
~CmsShowMainFrame() override
void HandleMenu(Int_t id) override
void enable()
Definition: CSGAction.cc:284
const std::string sBackgroundColor
Definition: ActionsList.cc:31
const std::string sPlayEvents
Definition: ActionsList.cc:7
sigc::signal< void > activated
Definition: CSGAction.h:88
FWGUIManager * m_manager
FWCustomIconsButton * m_filterEnableBtn
void enableNext(bool enable=true)
const std::string sOpenData
Definition: ActionsList.cc:12
#define nullptr
FWIntValueListener * m_delaySliderListener
LuminosityBlockNumber_t luminosityBlock() const
Definition: EventID.h:40
const std::string sRedo
Definition: ActionsList.cc:34
void createCustomIconsButton(TGCompositeFrame *p, const TGPicture *upPic, const TGPicture *downPic, const TGPicture *disabledPic, const TGPicture *upRunningPic, const TGPicture *downRunningPic, TGLayoutHints *l=nullptr, Int_t id=-1, GContext_t norm=TGButton::GetDefaultGC()(), UInt_t option=0)
const std::string sSaveConfigAs
Definition: ActionsList.cc:18
void disable()
Definition: CSGAction.cc:289
CSGContinuousAction * m_playEventsBack
CSGAction * m_nextEvent
const std::string sNextEvent
Definition: ActionsList.cc:5
TGSlider * m_delaySlider
const std::string sSaveConfig
Definition: ActionsList.cc:17
Bool_t HandleKey(Event_t *event) override
const TGPicture * m_filterIcons[9]
std::vector< CSGAction * > m_actionList
virtual void SetULong64Number(ULong64_t n)
const std::string sAppendData
Definition: ActionsList.cc:13
void setToolTip(const std::string &tip)
Definition: CSGAction.cc:116
virtual Bool_t isEnabled() const
Definition: CSGAction.cc:308
CSGContinuousAction * m_loopAction
TGMainFrame * m_fworksAbout
CSGAction * createNewViewerAction(const std::string &iActionName, bool seaprator)
void CloseWindow() override
FWNumberEntryField * m_eventEntry
void updateStatusBar(const char *status)
const std::string sShowAddCollection
Definition: ActionsList.cc:42
double f[11][100]
const std::string sGotoLastEvent
Definition: ActionsList.cc:4
TGPopupMenu * m_newViewerMenu
const std::string sExportImage
Definition: ActionsList.cc:25
const std::string sAutoRewind
Definition: ActionsList.cc:10
void createMenuEntry(TGPopupMenu *menu)
Definition: CSGAction.cc:213
const std::string sShowMainViewCtl
Definition: ActionsList.cc:41
FWNumberEntryField * m_runEntry
const std::string sPlayEventsBack
Definition: ActionsList.cc:8
CSGAction * getAction(const std::string &name)
void enableActions(bool enable=true) override
const std::string sShowObjInsp
Definition: ActionsList.cc:39
~FWPack() override
CSGAction * m_previousEvent
#define fwLog(_level_)
Definition: fwLog.h:50
const std::string sGotoFirstEvent
Definition: ActionsList.cc:3
const std::string sCopy
Definition: ActionsList.cc:36
CmsShowMainFrame(const TGWindow *p=nullptr, UInt_t w=1, UInt_t h=1, FWGUIManager *m=nullptr)
CSGAction * m_goToLast
const std::string sShowInvMassDialog
Definition: ActionsList.cc:43
void setSummaryViewWeight(float)
const std::string sShowEventDisplayInsp
Definition: ActionsList.cc:40
void enablePrevious(bool enable=true)
const std::string sPreviousEvent
Definition: ActionsList.cc:6
CSGContinuousAction * m_playEvents
edm::EventID id() const
Definition: EventBase.h:60
~InfoFrame() override
std::string getLocalTime(const edm::EventBase &event)
float getSummaryViewWeight() const
const std::vector< CSGAction * > & getListOfActions() const
CSGAction * m_goToFirst
const std::string sLoadConfig
Definition: ActionsList.cc:16
FWCustomIconsButton * createCustomIconsButton(TGCompositeFrame *p, const TGPicture *upPic, const TGPicture *downPic, const TGPicture *disabledPic, TGLayoutHints *l=nullptr, Int_t id=-1, GContext_t norm=TGButton::GetDefaultGC()(), UInt_t option=0)
Definition: CSGAction.cc:162
void makeFixedSizeLabel(TGHorizontalFrame *p, const char *txt, UInt_t bgCol, UInt_t txtCol, Int_t width, Int_t height)
void createShortcut(UInt_t key, const char *mod, int windowID)
Definition: CSGAction.cc:182
const std::string sExportAllImages
Definition: ActionsList.cc:26
const std::string sPaste
Definition: ActionsList.cc:37
void enableComplexNavigation(bool enable=true)
const std::string sQuit
Definition: ActionsList.cc:28
TGTextButton * m_filterShowGUIBtn
const std::string sHelpGL
Definition: ActionsList.cc:47
void setPlayDelayGUI(Float_t val, Bool_t sliderChanged)
const std::string sLoadPartialConfig
Definition: ActionsList.cc:20
CSGContinuousAction * playEventsAction() const
const std::string sUndo
Definition: ActionsList.cc:33
void setPath(TString &v)
Definition: fwPaths.cc:15
Definition: event.py:1
TGStatusBar * m_statBar
const std::string sSearchFiles
Definition: ActionsList.cc:14