CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
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 // user include files
39 
42 
47 
51 
52 #include <fstream>
53 
54 //
55 // constants, enums and typedefs
56 //
57 
58 //
59 // static data member definitions
60 //
61 
62 
63 // AMT: temprary workaround until TGPack::ResizeExistingFrames() is public
64 class FWPack : public TGPack
65 {
66  friend class CmsShowMainFrame;
67 public:
68  FWPack(const TGWindow* w) : TGPack(w, 100, 100) {}
69  virtual ~FWPack() {}
70 };
71 
72 //
73 // constructors and destructor
74 //
75 CmsShowMainFrame::CmsShowMainFrame(const TGWindow *p,UInt_t w,UInt_t h,FWGUIManager *m) :
76  TGMainFrame(p, w, h),
79  m_runEntry(0),
80  m_lumiEntry(0),
81  m_eventEntry(0),
83  m_manager(m),
84  m_fworksAbout(0)
85 {
86  const unsigned int backgroundColor=0x2f2f2f;
87  const unsigned int textColor= 0xb3b3b3;
88  gClient->SetStyle("classic");
89 
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, 0, 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, 0, 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, 0, 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, 0, 20);
517 
518  TEveCompositeFrameInPack *slot = new TEveCompositeFrameInPack(csArea, 0, csArea);
519  csArea->AddFrameWithWeight(slot, 0, 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*
556 CmsShowMainFrame::createNewViewerAction(const std::string& iActionName, bool separator)
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 != 0) {
609  if (enable) {
611  m_goToFirst->enable();
613  } else {
615  m_goToFirst->disable();
618  }
619  }
620 }
621 
622 void
624 {
625  if (m_nextEvent != 0) {
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  virtual ~InfoFrame() {}
751 
752  virtual void CloseWindow() override
753  {
754  UnmapWindow();
755  }
756 };
757 
758 void
760 {
761  if (m_fworksAbout == 0)
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
FWNumberEntryField * m_lumiEntry
EventNumber_t event() const
Definition: EventID.h:41
int i
Definition: DBlmapReader.cc:9
void bindCSGActionKeys(const TGMainFrame *f) const
const std::string sShowCommonInsp
Definition: ActionsList.cc:30
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
FWCore Framework interface EventSetupRecordImplementation h
Helper function to determine trigger accepts.
CSGContinuousAction * playEventsBackwardsAction() const
void createViews(TEveWindowSlot *slot)
virtual void enableActions(bool enable=true)
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
int loop
CMSSW
void enableNext(bool enable=true)
const std::string sOpenData
Definition: ActionsList.cc:12
virtual void CloseWindow() override
FWIntValueListener * m_delaySliderListener
LuminosityBlockNumber_t luminosityBlock() const
Definition: EventID.h:40
const std::string sRedo
Definition: ActionsList.cc:34
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
virtual ~InfoFrame()
T x() const
Cartesian x coordinate.
const std::string sSaveConfig
Definition: ActionsList.cc:17
const TGPicture * m_filterIcons[9]
void createCustomIconsButton(TGCompositeFrame *p, const TGPicture *upPic, const TGPicture *downPic, const TGPicture *disabledPic, const TGPicture *upRunningPic, const TGPicture *downRunningPic, TGLayoutHints *l=0, Int_t id=-1, GContext_t norm=TGButton::GetDefaultGC()(), UInt_t option=0)
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)
FWNumberEntryField * m_eventEntry
virtual ~CmsShowMainFrame()
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
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger but the state exists so we define the behavior If all triggers are the negative crieriion will lead to accepting the event(this again matches the behavior of"!*"before the partial wildcard feature was incorporated).The per-event"cost"of each negative criterion with multiple relevant triggers is about the same as!*was in the past
const std::string sAutoRewind
Definition: ActionsList.cc:10
void createMenuEntry(TGPopupMenu *menu)
Definition: CSGAction.cc:213
Bool_t HandleKey(Event_t *event)
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)
virtual void enableActions(bool enable=true)
const std::string sShowObjInsp
Definition: ActionsList.cc:39
FWCustomIconsButton * createCustomIconsButton(TGCompositeFrame *p, const TGPicture *upPic, const TGPicture *downPic, const TGPicture *disabledPic, TGLayoutHints *l=0, Int_t id=-1, GContext_t norm=TGButton::GetDefaultGC()(), UInt_t option=0)
Definition: CSGAction.cc:162
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
CSGAction * m_goToLast
virtual void CloseWindow()
const std::string sShowInvMassDialog
Definition: ActionsList.cc:43
string action
Definition: mps_fire.py:28
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:59
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
virtual void HandleMenu(Int_t id)
void makeFixedSizeLabel(TGHorizontalFrame *p, const char *txt, UInt_t bgCol, UInt_t txtCol, Int_t width, Int_t height)
virtual ~FWPack()
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
CmsShowMainFrame(const TGWindow *p=0, UInt_t w=1, UInt_t h=1, FWGUIManager *m=0)
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
TGStatusBar * m_statBar
const std::string sSearchFiles
Definition: ActionsList.cc:14
tuple status
Definition: mps_update.py:57