GRSISort "v4.0.0.5"
An extension of the ROOT analysis Framework
Loading...
Searching...
No Matches
GRootCanvas.cxx
Go to the documentation of this file.
1#include "RConfigure.h"
2
3#include "GRootCanvas.h"
4
5#include "TRootApplication.h"
6#include "TRootHelpDialog.h"
7#include "TGClient.h"
8#include "TGCanvas.h"
9#include "TGMenu.h"
10#include "TGWidget.h"
11#include "TGFileDialog.h"
12#include "TGStatusBar.h"
13#include "TGTextEditDialogs.h"
14#include "TROOT.h"
15#include "TClass.h"
16#include "TSystem.h"
17#include "TCanvas.h"
18#include "TPadPainter.h"
19#include "TBrowser.h"
20#include "TClassTree.h"
21#include "TMarker.h"
22#include "TStyle.h"
23#include "TColorWheel.h"
24#include "TVirtualX.h"
25#include "TApplication.h"
26#include "TFile.h"
27#include "TInterpreter.h"
28#include "TEnv.h"
29#include "TMath.h"
30#include "TGDockableFrame.h"
31
32#include "TG3DLine.h"
33#include "TGToolBar.h"
34#include "TGToolTip.h"
35#include "TVirtualPadEditor.h"
36#include "TRootControlBar.h"
37#include "TGuiBuilder.h"
38#include "TImage.h"
39#include "TError.h"
40#include "TGDNDManager.h"
41#include "TBufferFile.h"
42#include "TRootBrowser.h"
43#include "TGTab.h"
44#include "TGedEditor.h"
45
46#include "TPluginManager.h"
47#include "TVirtualGL.h"
48
49#ifdef WIN32
50#include "TWin32SplashThread.h"
51#endif
52
53#include "HelpText.h"
54
55#include "GCanvas.h"
56
57// Canvas menu command ids
140
141constexpr int kButton1Ctrl = 9;
142//constexpr int kButton1CtrlMotion = 10;
143
144static std::array<const char*, 6> gOpenTypes = {"ROOT files", "*.root", "All files", "*", nullptr, nullptr};
145
146static std::array<const char*, 32> gSaveAsTypes = {"PDF", "*.pdf", "PostScript", "*.ps", "Encapsulated PostScript",
147 "*.eps", "SVG", "*.svg", "TeX", "*.tex",
148 "GIF", "*.gif", "ROOT macros", "*.C", "ROOT files",
149 "*.root", "XML", "*.xml", "PNG", "*.png",
150 "XPM", "*.xpm", "JPEG", "*.jpg", "TIFF",
151 "*.tiff", "XCF", "*.xcf", "All files", "*",
152 nullptr, nullptr};
153
154static std::array<ToolBarData_t, 11> gToolBarData = {{//{ filename, tooltip, staydown,id, button}
155 {"newcanvas.xpm", "New", kFALSE, kFileNewCanvas, nullptr},
156 {"open.xpm", "Open", kFALSE, kFileOpen, nullptr},
157 {"save.xpm", "Save As", kFALSE, kFileSaveAs, nullptr},
158 {"printer.xpm", "Print", kFALSE, kFilePrint, nullptr},
159 {"", "", kFALSE, -1, nullptr},
160 {"interrupt.xpm", "Interrupt", kFALSE, kOptionInterrupt, nullptr},
161 {"refresh2.xpm", "Refresh", kFALSE, kOptionRefresh, nullptr},
162 {"", "", kFALSE, -1, nullptr},
163 {"inspect.xpm", "Inspect", kFALSE, kInspectRoot, nullptr},
164 {"browser.xpm", "Browser", kFALSE, kToolsBrowser, nullptr},
165 {nullptr, nullptr, kFALSE, 0, nullptr}}};
166
167static std::array<ToolBarData_t, 18> gToolBarData1 = {{{"pointer.xpm", "Modify", kFALSE, kToolModify, nullptr},
168 {"arc.xpm", "Arc", kFALSE, kToolArc, nullptr},
169 {"line.xpm", "Line", kFALSE, kToolLine, nullptr},
170 {"arrow.xpm", "Arrow", kFALSE, kToolArrow, nullptr},
171 {"diamond.xpm", "Diamond", kFALSE, kToolDiamond, nullptr},
172 {"ellipse.xpm", "Ellipse", kFALSE, kToolEllipse, nullptr},
173 {"pad.xpm", "Pad", kFALSE, kToolPad, nullptr},
174 {"pave.xpm", "Pave", kFALSE, kToolPave, nullptr},
175 {"pavelabel.xpm", "Pave Label", kFALSE, kToolPLabel, nullptr},
176 {"pavetext.xpm", "Pave Text", kFALSE, kToolPText, nullptr},
177 {"pavestext.xpm", "Paves Text", kFALSE, kToolPsText, nullptr},
178 {"graph.xpm", "Graph", kFALSE, kToolGraph, nullptr},
179 {"curlyline.xpm", "Curly Line", kFALSE, kToolCurlyLine, nullptr},
180 {"curlyarc.xpm", "Curly Arc", kFALSE, kToolCurlyArc, nullptr},
181 {"latex.xpm", "Text/Latex", kFALSE, kToolLatex, nullptr},
182 {"marker.xpm", "Marker", kFALSE, kToolMarker, nullptr},
183 {"cut.xpm", "Graphical Cut", kFALSE, kToolCutG, nullptr},
184 {nullptr, nullptr, kFALSE, 0, nullptr}}};
185
186/////////////////////////////////////////////////////////////////////////
187///
188/// \class GRootContainer
189///
190/// Utility class used by GRootCanvas. The GRootContainer is the frame
191/// embedded in the TGCanvas widget. The ROOT graphics goes into this
192/// frame. This class is used to enable input events on this graphics
193/// frame and forward the events to the GRootCanvas handlers.
194///
195/////////////////////////////////////////////////////////////////////////
196
197class GRootContainer : public TGCompositeFrame {
198private:
199 GRootCanvas* fCanvas; // pointer back to canvas imp
200public:
201 GRootContainer(GRootCanvas* c, Window_t id, const TGWindow* p);
202
203 Bool_t HandleButton(Event_t* event) override;
204 Bool_t HandleDoubleClick(Event_t* ev) override { return fCanvas->HandleContainerDoubleClick(ev); }
205 Bool_t HandleConfigureNotify(Event_t* ev) override
206 {
207 TGFrame::HandleConfigureNotify(ev);
209 }
210 Bool_t HandleKey(Event_t* ev) override { return fCanvas->HandleContainerKey(ev); }
211 Bool_t HandleMotion(Event_t* ev) override { return fCanvas->HandleContainerMotion(ev); }
212 Bool_t HandleExpose(Event_t* ev) override { return fCanvas->HandleContainerExpose(ev); }
213 Bool_t HandleCrossing(Event_t* ev) override { return fCanvas->HandleContainerCrossing(ev); }
214 void SavePrimitive(std::ostream& out, Option_t* = "") override;
215 void SetEditable(Bool_t) override {}
216};
217
218//______________________________________________________________________________
219GRootContainer::GRootContainer(GRootCanvas* canvas, Window_t id, const TGWindow* p) : TGCompositeFrame(gClient, id, p), fCanvas(canvas)
220{
221 /// Create a canvas container.
222
223 gVirtualX->GrabButton(fId, kAnyButton, kAnyModifier, kButtonPressMask | kButtonReleaseMask | kPointerMotionMask, kNone, kNone);
224
225 AddInput(kKeyPressMask | kKeyReleaseMask | kPointerMotionMask | kExposureMask | kStructureNotifyMask | kLeaveWindowMask);
226 fEditDisabled = kEditDisable;
227}
228
229//______________________________________________________________________________
230Bool_t GRootContainer::HandleButton(Event_t* event)
231{
232 /// Directly handle scroll mouse buttons (4 and 5), only pass buttons
233 /// 1, 2 and 3 on to the TCanvas.
234
235 const auto* viewPort = static_cast<const TGViewPort*>(fParent);
236 UInt_t page = viewPort->GetHeight() / 4;
237
238 gVirtualX->SetInputFocus(GetMainFrame()->GetId());
239
240 if(event->fCode == kButton4) {
241 // scroll up
242 auto newpos = fCanvas->fCanvasWindow->GetVsbPosition() - page;
243 fCanvas->fCanvasWindow->SetVsbPosition(newpos);
244 }
245 if(event->fCode == kButton5) {
246 // scroll down
247 auto newpos = fCanvas->fCanvasWindow->GetVsbPosition() + page;
248 fCanvas->fCanvasWindow->SetVsbPosition(newpos);
249 }
250 return fCanvas->HandleContainerButton(event);
251}
252
253//______________________________________________________________________________
254GRootCanvas::GRootCanvas(GCanvas* canvas, const char* name, UInt_t width, UInt_t height)
255 : TGMainFrame(gClient->GetRoot(), width, height), TCanvasImp(canvas)
256{
257 /// Create a basic ROOT canvas.
258 CreateCanvas(name);
259
260 ShowToolBar(kFALSE);
261 ShowEditor(kFALSE);
262
263 Resize(width, height);
264}
265
266//______________________________________________________________________________
267GRootCanvas::GRootCanvas(GCanvas* canvas, const char* name, Int_t x, Int_t y, UInt_t width, UInt_t height)
268 : TGMainFrame(gClient->GetRoot(), width, height), TCanvasImp(canvas)
269{
270 /// Create a basic ROOT canvas.
271 CreateCanvas(name);
272
273 ShowToolBar(kFALSE);
274 ShowEditor(kFALSE);
275
276 MoveResize(x, y, width, height);
277 SetWMPosition(x, y);
278}
279
280//______________________________________________________________________________
281void GRootCanvas::CreateCanvas(const char* name)
282{
283 /// Create the actual canvas.
284
285 fButton = 0;
286 fAutoFit = kTRUE; // check also menu entry
287 fEditor = nullptr;
288 fEmbedded = kFALSE;
289
290 // Create menus
291 fFileSaveMenu = new TGPopupMenu(fClient->GetDefaultRoot());
292 fFileSaveMenu->AddEntry(Form("%s.&ps", name), kFileSaveAsPS);
293 fFileSaveMenu->AddEntry(Form("%s.&eps", name), kFileSaveAsEPS);
294 fFileSaveMenu->AddEntry(Form("%s.p&df", name), kFileSaveAsPDF);
295 fFileSaveMenu->AddEntry(Form("%s.&gif", name), kFileSaveAsGIF);
296
297 static Int_t img = 0;
298
299 if(img == 0) {
300 Int_t sav = gErrorIgnoreLevel;
301 gErrorIgnoreLevel = kFatal;
302 img = TImage::Create() != nullptr ? 1 : -1;
303 gErrorIgnoreLevel = sav;
304 }
305 if(img > 0) {
306 fFileSaveMenu->AddEntry(Form("%s.&jpg", name), kFileSaveAsJPG);
307 fFileSaveMenu->AddEntry(Form("%s.&png", name), kFileSaveAsPNG);
308 }
309
310 fFileSaveMenu->AddEntry(Form("%s.&C", name), kFileSaveAsC);
311 fFileSaveMenu->AddEntry(Form("%s.&root", name), kFileSaveAsRoot);
312
313 fFileMenu = new TGPopupMenu(fClient->GetDefaultRoot());
314 fFileMenu->AddEntry("&New Canvas", kFileNewCanvas);
315 fFileMenu->AddEntry("&Open...", kFileOpen);
316 fFileMenu->AddEntry("&Close Canvas", kFileCloseCanvas);
317 fFileMenu->AddSeparator();
318 fFileMenu->AddPopup("&Save", fFileSaveMenu);
319 fFileMenu->AddEntry("Save &As...", kFileSaveAs);
320 fFileMenu->AddSeparator();
321 fFileMenu->AddEntry("&Print...", kFilePrint);
322 fFileMenu->AddSeparator();
323 fFileMenu->AddEntry("&Quit ROOT", kFileQuit);
324
325 fEditClearMenu = new TGPopupMenu(fClient->GetDefaultRoot());
326 fEditClearMenu->AddEntry("&Pad", kEditClearPad);
327 fEditClearMenu->AddEntry("&Canvas", kEditClearCanvas);
328
329 fEditMenu = new TGPopupMenu(fClient->GetDefaultRoot());
330 fEditMenu->AddEntry("&Style...", kEditStyle);
331 fEditMenu->AddSeparator();
332 fEditMenu->AddEntry("Cu&t", kEditCut);
333 fEditMenu->AddEntry("&Copy", kEditCopy);
334 fEditMenu->AddEntry("&Paste", kEditPaste);
335 fEditMenu->AddSeparator();
336 fEditMenu->AddPopup("C&lear", fEditClearMenu);
337 fEditMenu->AddSeparator();
338 fEditMenu->AddEntry("&Undo", kEditUndo);
339 fEditMenu->AddEntry("&Redo", kEditRedo);
340
341 fEditMenu->DisableEntry(kEditCut);
342 fEditMenu->DisableEntry(kEditCopy);
343 fEditMenu->DisableEntry(kEditPaste);
344 fEditMenu->DisableEntry(kEditUndo);
345 fEditMenu->DisableEntry(kEditRedo);
346
347 fViewWithMenu = new TGPopupMenu(fClient->GetDefaultRoot());
348 fViewWithMenu->AddEntry("&X3D", kViewX3D);
349 fViewWithMenu->AddEntry("&OpenGL", kViewOpenGL);
350
351 fViewMenu = new TGPopupMenu(fClient->GetDefaultRoot());
352 fViewMenu->AddEntry("&Editor", kViewEditor);
353 fViewMenu->AddEntry("&Toolbar", kViewToolbar);
354 fViewMenu->AddEntry("Event &Statusbar", kViewEventStatus);
355 fViewMenu->AddEntry("T&oolTip Info", kViewToolTips);
356 fViewMenu->AddSeparator();
357 fViewMenu->AddEntry("&Colors", kViewColors);
358 fViewMenu->AddEntry("&Fonts", kViewFonts);
359 fViewMenu->AddEntry("&Markers", kViewMarkers);
360 fViewMenu->AddSeparator();
361 fViewMenu->AddEntry("&Iconify", kViewIconify);
362 fViewMenu->AddSeparator();
363 fViewMenu->AddPopup("&View With", fViewWithMenu);
364
365 fViewMenu->DisableEntry(kViewFonts);
366
367 fOptionMenu = new TGPopupMenu(fClient->GetDefaultRoot());
368 fOptionMenu->AddEntry("&Auto Resize Canvas", kOptionAutoResize);
369 fOptionMenu->AddEntry("&Resize Canvas", kOptionResizeCanvas);
370 fOptionMenu->AddEntry("&Move Opaque", kOptionMoveOpaque);
371 fOptionMenu->AddEntry("Resize &Opaque", kOptionResizeOpaque);
372 fOptionMenu->AddSeparator();
373 fOptionMenu->AddEntry("&Interrupt", kOptionInterrupt);
374 fOptionMenu->AddEntry("R&efresh", kOptionRefresh);
375 fOptionMenu->AddSeparator();
376 fOptionMenu->AddEntry("&Pad Auto Exec", kOptionAutoExec);
377 fOptionMenu->AddSeparator();
378 fOptionMenu->AddEntry("&Statistics", kOptionStatistics);
379 fOptionMenu->AddEntry("Histogram &Title", kOptionHistTitle);
380 fOptionMenu->AddEntry("&Fit Parameters", kOptionFitParams);
381 fOptionMenu->AddEntry("Can Edit &Histograms", kOptionCanEdit);
382
383 // Opaque options initialized in InitWindow()
384 fOptionMenu->CheckEntry(kOptionAutoResize);
385 if(gStyle->GetOptStat() != 0) {
386 fOptionMenu->CheckEntry(kOptionStatistics);
387 }
388 if(gStyle->GetOptTitle() != 0) {
389 fOptionMenu->CheckEntry(kOptionHistTitle);
390 }
391 if(gStyle->GetOptFit() != 0) {
392 fOptionMenu->CheckEntry(kOptionFitParams);
393 }
394 if(gROOT->GetEditHistograms()) {
395 fOptionMenu->CheckEntry(kOptionCanEdit);
396 }
397
398 fToolsMenu = new TGPopupMenu(fClient->GetDefaultRoot());
399 fToolsMenu->AddEntry("&Inspect ROOT", kInspectRoot);
400 fToolsMenu->AddEntry("&Class Tree", kClassesTree);
401 fToolsMenu->AddEntry("&Fit Panel", kFitPanel);
402 fToolsMenu->AddEntry("&Start Browser", kToolsBrowser);
403 fToolsMenu->AddEntry("&Gui Builder", kToolsBuilder);
404 fToolsMenu->AddEntry("&Event Recorder", kToolsRecorder);
405
406 fHelpMenu = new TGPopupMenu(fClient->GetDefaultRoot());
407 fHelpMenu->AddLabel("Basic Help On...");
408 fHelpMenu->AddSeparator();
409 fHelpMenu->AddEntry("&Canvas", kHelpOnCanvas);
410 fHelpMenu->AddEntry("&Menus", kHelpOnMenus);
411 fHelpMenu->AddEntry("&Graphics Editor", kHelpOnGraphicsEd);
412 fHelpMenu->AddEntry("&Browser", kHelpOnBrowser);
413 fHelpMenu->AddEntry("&Objects", kHelpOnObjects);
414 fHelpMenu->AddEntry("&PostScript", kHelpOnPS);
415 fHelpMenu->AddSeparator();
416 fHelpMenu->AddEntry("&About ROOT...", kHelpAbout);
417
418 // This main frame will process the menu commands
419 fFileMenu->Associate(this);
420 fFileSaveMenu->Associate(this);
421 fEditMenu->Associate(this);
422 fEditClearMenu->Associate(this);
423 fViewMenu->Associate(this);
424 fViewWithMenu->Associate(this);
425 fOptionMenu->Associate(this);
426 fToolsMenu->Associate(this);
427 fHelpMenu->Associate(this);
428
429 // Create menubar layout hints
430 fMenuBarLayout = new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX, 0, 0, 1, 1);
431 fMenuBarItemLayout = new TGLayoutHints(kLHintsTop | kLHintsLeft, 0, 4, 0, 0);
432 fMenuBarHelpLayout = new TGLayoutHints(kLHintsTop | kLHintsRight);
433
434 // Create menubar
435 fMenuBar = new TGMenuBar(this, 1, 1, kHorizontalFrame);
436 fMenuBar->AddPopup("&File", fFileMenu, fMenuBarItemLayout);
437 fMenuBar->AddPopup("&Edit", fEditMenu, fMenuBarItemLayout);
438 fMenuBar->AddPopup("&View", fViewMenu, fMenuBarItemLayout);
439 fMenuBar->AddPopup("&Options", fOptionMenu, fMenuBarItemLayout);
440 fMenuBar->AddPopup("&Tools", fToolsMenu, fMenuBarItemLayout);
441 fMenuBar->AddPopup("&Help", fHelpMenu, fMenuBarHelpLayout);
442
443 AddFrame(fMenuBar, fMenuBarLayout);
444
445 fHorizontal1 = new TGHorizontal3DLine(this);
446 fHorizontal1Layout = new TGLayoutHints(kLHintsTop | kLHintsExpandX);
448
449 // Create toolbar dock
450 fToolDock = new TGDockableFrame(this);
451 fToolDock->SetCleanup();
452 fToolDock->EnableHide(kFALSE);
453 AddFrame(fToolDock, fDockLayout = new TGLayoutHints(kLHintsExpandX));
454
455 // will alocate it later
456 fToolBar = nullptr;
457 fVertical1 = nullptr;
458 fVertical2 = nullptr;
459 fVertical1Layout = nullptr;
460 fVertical2Layout = nullptr;
461
462 fToolBarSep = new TGHorizontal3DLine(this);
463 fToolBarLayout = new TGLayoutHints(kLHintsTop | kLHintsExpandX);
464 AddFrame(fToolBarSep, fToolBarLayout);
465
466 fMainFrame = new TGCompositeFrame(this, GetWidth() + 4, GetHeight() + 4, kHorizontalFrame);
467 fMainFrameLayout = new TGLayoutHints(kLHintsExpandX | kLHintsExpandY);
468
469 // Create editor frame that will host the pad editor
470 fEditorFrame = new TGCompositeFrame(fMainFrame, 175, fMainFrame->GetHeight() + 4, kFixedWidth);
471 fEditorLayout = new TGLayoutHints(kLHintsExpandY | kLHintsLeft);
473
474 // Create canvas and canvas container that will host the ROOT graphics
475 fCanvasWindow = new TGCanvas(fMainFrame, GetWidth() + 4, GetHeight() + 4, kSunkenFrame | kDoubleBorder);
476
477 fCanvasID = -1;
478
479 if(fCanvas->UseGL()) {
480 fCanvas->SetSupportGL(kFALSE);
481 // first, initialize GL (if not yet)
482 if(gGLManager == nullptr) {
483 TString osString = "win32";
484 if(gVirtualX->InheritsFrom("TGX11")) {
485 osString = "x11";
486 } else if(gVirtualX->InheritsFrom("TGCocoa")) {
487 osString = "osx";
488 }
489 TPluginHandler* pluginHandler = gROOT->GetPluginManager()->FindHandler("TGLManager", osString);
490
491 if(pluginHandler != nullptr && pluginHandler->LoadPlugin() != -1) {
492 if(pluginHandler->ExecPlugin(0) == 0) {
493 Error("CreateCanvas", "GL manager plugin failed");
494 }
495 }
496 } else {
497 fCanvasID = gGLManager->InitGLWindow(static_cast<ULong_t>(fCanvasWindow->GetViewPort()->GetId()));
498 if(fCanvasID != -1) {
499 // Create gl context.
500 const Int_t glCtx = gGLManager->CreateGLContext(fCanvasID);
501 if(glCtx != -1) {
502 fCanvas->SetSupportGL(kTRUE);
503 fCanvas->SetGLDevice(glCtx); // Now, fCanvas is responsible for context deletion!
504 } else {
505 Error("CreateCanvas", "GL context creation failed.");
506 }
507 } else {
508 Error("CreateCanvas", "GL window creation failed\n");
509 }
510 }
511 }
512
513 if(fCanvasID == -1) {
514 fCanvasID = gVirtualX->InitWindow(static_cast<ULong_t>(fCanvasWindow->GetViewPort()->GetId()));
515 }
516
517 Window_t win = gVirtualX->GetWindowID(fCanvasID);
518 fCanvasContainer = new GRootContainer(this, win, fCanvasWindow->GetViewPort());
519 fCanvasWindow->SetContainer(fCanvasContainer);
520 fCanvasLayout = new TGLayoutHints(kLHintsExpandX | kLHintsExpandY | kLHintsRight);
521
523 AddFrame(fMainFrame, fMainFrameLayout);
524
525 // create the tooltip with a timeout of 250 ms
526 fToolTip = new TGToolTip(fClient->GetDefaultRoot(), fCanvasWindow, "", 250);
527
528 fCanvas->Connect("ProcessedEvent(Int_t, Int_t, Int_t, TObject*)", "GRootCanvas", this,
529 "EventInfo(Int_t, Int_t, Int_t, TObject*)");
530
531 // Create status bar
532 std::array<int, 4> parts = {33, 10, 10, 47};
533 fStatusBar = new TGStatusBar(this, 10, 10);
534 fStatusBar->SetParts(parts.data(), parts.size());
535
536 fStatusBarLayout = new TGLayoutHints(kLHintsBottom | kLHintsLeft | kLHintsExpandX, 2, 2, 1, 1);
537
538 AddFrame(fStatusBar, fStatusBarLayout);
539
540 // Misc
541 SetWindowName(name);
542 SetIconName(name);
543 fIconPic = SetIconPixmap("macro_s.xpm");
544 SetClassHints("ROOT", "Canvas");
545
546 SetEditDisabled(kEditDisable);
547 MapSubwindows();
548
549 // by default status bar, tool bar and pad editor are hidden
550 HideFrame(fStatusBar);
551 HideFrame(fToolDock);
552 HideFrame(fToolBarSep);
553 HideFrame(fHorizontal1);
554
555 ShowToolBar(kFALSE);
556 ShowEditor(kFALSE);
557
558 // we need to use GetDefaultSize() to initialize the layout algorithm...
559 Resize(GetDefaultSize());
560
561 gVirtualX->SetDNDAware(fId, fDNDTypeList);
562 SetDNDTarget(kTRUE);
563}
564
565//______________________________________________________________________________
567{
568 /// Delete ROOT basic canvas. Order is significant. Delete in reverse
569 /// order of creation.
570
571 delete fToolTip;
572 if(fIconPic != nullptr) {
573 gClient->FreePicture(fIconPic);
574 }
575 if((fEditor != nullptr) && !fEmbedded) {
576 delete fEditor;
577 }
578 if(fToolBar != nullptr) {
579 Disconnect(fToolDock, "Docked()", this, "AdjustSize()");
580 Disconnect(fToolDock, "Undocked()", this, "AdjustSize()");
581 fToolBar->Cleanup();
582 delete fToolBar;
583 }
584
585 if(MustCleanup() == 0) {
586 delete fStatusBar;
587 delete fStatusBarLayout;
588 delete fCanvasContainer;
589 delete fCanvasWindow;
590
591 delete fEditorFrame;
592 delete fEditorLayout;
593 delete fMainFrame;
594 delete fMainFrameLayout;
595 delete fToolBarSep;
596#ifndef __APPLE__
597 delete fToolDock;
598#endif
599 delete fToolBarLayout;
600 delete fHorizontal1;
601 delete fHorizontal1Layout;
602 delete fMenuBarLayout;
603 delete fMenuBarItemLayout;
604 delete fMenuBarHelpLayout;
605 delete fCanvasLayout;
606 delete fDockLayout;
607 }
608
609 delete fFileMenu;
610 delete fFileSaveMenu;
611 delete fEditMenu;
612 delete fEditClearMenu;
613 delete fViewMenu;
614 delete fViewWithMenu;
615 delete fOptionMenu;
616 delete fToolsMenu;
617 delete fHelpMenu;
618}
619
620//______________________________________________________________________________
622{
623 /// Called via TCanvasImp interface by TCanvas.
624
625 TVirtualPadEditor* gged = TVirtualPadEditor::GetPadEditor(kFALSE);
626 if((gged != nullptr) && gged->GetCanvas() == fCanvas) {
627 if(fEmbedded) {
628 static_cast<TGedEditor*>(gged)->SetModel(nullptr, nullptr, kButton1Down);
629 static_cast<TGedEditor*>(gged)->SetCanvas(nullptr);
630 } else {
631 gged->Hide();
632 }
633 }
634
635 gVirtualX->CloseWindow();
636}
637
638//______________________________________________________________________________
640{
641 /// Really delete the canvas and this GUI.
642
643 TVirtualPadEditor* gged = TVirtualPadEditor::GetPadEditor(kFALSE);
644 if((gged != nullptr) && gged->GetCanvas() == fCanvas) {
645 if(fEmbedded) {
646 static_cast<TGedEditor*>(gged)->SetModel(nullptr, nullptr, kButton1Down);
647 static_cast<TGedEditor*>(gged)->SetCanvas(nullptr);
648 } else {
649 gged->Hide();
650 }
651 }
652
653 fToolTip->Hide();
654 Disconnect(fCanvas, "ProcessedEvent(Int_t, Int_t, Int_t, TObject*)", this,
655 "EventInfo(Int_t, Int_t, Int_t, TObject*)");
656
657 TVirtualPad* savepad = gPad;
658 gPad = nullptr; // hide gPad from CINT
659 gInterpreter->DeleteGlobal(fCanvas);
660 gPad = savepad; // restore gPad for ROOT
661 delete fCanvas; // will in turn delete this object
662}
663
664//______________________________________________________________________________
666{
667 /// In case window is closed via WM we get here.
668
669 DeleteWindow();
670}
671
672//______________________________________________________________________________
674{
675 /// Return width of canvas container.
676
677 return fCanvasContainer->GetWidth();
678}
679
680//______________________________________________________________________________
682{
683 /// Return height of canvas container.
684
685 return fCanvasContainer->GetHeight();
686}
687
688//______________________________________________________________________________
689UInt_t GRootCanvas::GetWindowGeometry(Int_t& x, Int_t& y, UInt_t& w, UInt_t& h)
690{
691 /// Gets the size and position of the window containing the canvas. This
692 /// size includes the menubar and borders.
693
694 gVirtualX->GetWindowSize(fId, x, y, w, h);
695
696 Window_t childdum = 0;
697 gVirtualX->TranslateCoordinates(fId, gClient->GetDefaultRoot()->GetId(), 0, 0, x, y, childdum);
698 if(!fCanvas->GetShowEditor()) {
699 return 0;
700 }
701 return fEditorFrame->GetWidth();
702}
703
704//______________________________________________________________________________
705void GRootCanvas::SetStatusText(const char* txt, Int_t partidx)
706{
707 /// Set text in status bar.
708
709 fStatusBar->SetText(txt, partidx);
710}
711
712//______________________________________________________________________________
713Bool_t GRootCanvas::ProcessMessage(Long_t msg, Long_t parm1, Long_t)
714{
715 /// Handle menu and other command generated by the user.
716
717 switch(GET_MSG(msg)) {
718
719 case kC_COMMAND:
720
721 switch(GET_SUBMSG(msg)) {
722
723 case kCM_BUTTON:
724 case kCM_MENU:
725
726 switch(parm1) {
727 // Handle toolbar items...
728 case kToolModify: gROOT->SetEditorMode(); break;
729 case kToolArc: gROOT->SetEditorMode("Arc"); break;
730 case kToolLine: gROOT->SetEditorMode("Line"); break;
731 case kToolArrow: gROOT->SetEditorMode("Arrow"); break;
732 case kToolDiamond: gROOT->SetEditorMode("Diamond"); break;
733 case kToolEllipse: gROOT->SetEditorMode("Ellipse"); break;
734 case kToolPad: gROOT->SetEditorMode("Pad"); break;
735 case kToolPave: gROOT->SetEditorMode("Pave"); break;
736 case kToolPLabel: gROOT->SetEditorMode("PaveLabel"); break;
737 case kToolPText: gROOT->SetEditorMode("PaveText"); break;
738 case kToolPsText: gROOT->SetEditorMode("PavesText"); break;
739 case kToolGraph: gROOT->SetEditorMode("PolyLine"); break;
740 case kToolCurlyLine: gROOT->SetEditorMode("CurlyLine"); break;
741 case kToolCurlyArc: gROOT->SetEditorMode("CurlyArc"); break;
742 case kToolLatex: gROOT->SetEditorMode("Text"); break;
743 case kToolMarker: gROOT->SetEditorMode("Marker"); break;
744 case kToolCutG:
745 gROOT->SetEditorMode("CutG");
746 break;
747
748 // Handle File menu items...
749 case kFileNewCanvas:
750 gROOT->MakeDefCanvas();
751 // GCanvas::MakeDefCanvas();
752 break;
753 case kFileOpen: {
754 static TString dir(".");
755 TGFileInfo fileInfo;
756 fileInfo.fFileTypes = gOpenTypes.data();
757 fileInfo.fIniDir = StrDup(dir);
758 new TGFileDialog(fClient->GetDefaultRoot(), this, kFDOpen, &fileInfo);
759 if(fileInfo.fFilename == nullptr) {
760 return kTRUE;
761 }
762 dir = fileInfo.fIniDir;
763 new TFile(fileInfo.fFilename, "update");
764 } break;
765 case kFileSaveAs: {
766 TString workdir = gSystem->WorkingDirectory();
767 static TString dir(".");
768 static Int_t typeidx = 0;
769 static Bool_t overwr = kFALSE;
770 TGFileInfo fileInfo;
771 TString defaultType = gEnv->GetValue("Canvas.SaveAsDefaultType", ".pdf");
772 if(typeidx == 0) {
773 for(int i = 1; gSaveAsTypes[i] != nullptr; i += 2) {
774 TString ftype = gSaveAsTypes[i];
775 if(ftype.EndsWith(defaultType.Data())) {
776 typeidx = i - 1;
777 break;
778 }
779 }
780 }
781 fileInfo.fFileTypes = gSaveAsTypes.data();
782 fileInfo.fIniDir = StrDup(dir);
783 fileInfo.fFileTypeIdx = typeidx;
784 fileInfo.fOverwrite = overwr;
785 new TGFileDialog(fClient->GetDefaultRoot(), this, kFDSave, &fileInfo);
786 gSystem->ChangeDirectory(workdir.Data());
787 if(fileInfo.fFilename == nullptr) {
788 return kTRUE;
789 }
790 Bool_t appendedType = kFALSE;
791 TString fn = fileInfo.fFilename;
792 TString ft = fileInfo.fFileTypes[fileInfo.fFileTypeIdx + 1];
793 dir = fileInfo.fIniDir;
794 typeidx = fileInfo.fFileTypeIdx;
795 overwr = fileInfo.fOverwrite;
796 again:
797 if(fn.EndsWith(".root") || fn.EndsWith(".ps") || fn.EndsWith(".eps") || fn.EndsWith(".pdf") ||
798 fn.EndsWith(".svg") || fn.EndsWith(".tex") || fn.EndsWith(".gif") || fn.EndsWith(".xml") ||
799 fn.EndsWith(".xpm") || fn.EndsWith(".jpg") || fn.EndsWith(".png") || fn.EndsWith(".xcf") ||
800 fn.EndsWith(".tiff")) {
801 fCanvas->SaveAs(fn);
802 } else if(fn.EndsWith(".C")) {
803 fCanvas->SaveSource(fn);
804 } else {
805 if(!appendedType) {
806 if(ft.Index(".") != kNPOS) {
807 fn += ft(ft.Index("."), ft.Length());
808 appendedType = kTRUE;
809 goto again; // NOLINT(cppcoreguidelines-avoid-goto)
810 }
811 }
812 Warning("ProcessMessage", "file %s cannot be saved with this extension", fileInfo.fFilename);
813 }
814 for(int i = 1; gSaveAsTypes[i] != nullptr; i += 2) {
815 TString ftype = gSaveAsTypes[i];
816 ftype.ReplaceAll("*.", ".");
817 if(fn.EndsWith(ftype.Data())) {
818 typeidx = i - 1;
819 break;
820 }
821 }
822 } break;
823 case kFileSaveAsRoot: fCanvas->SaveAs(".root"); break;
824 case kFileSaveAsC: fCanvas->SaveSource(); break;
825 case kFileSaveAsPS: fCanvas->SaveAs(); break;
826 case kFileSaveAsEPS: fCanvas->SaveAs(".eps"); break;
827 case kFileSaveAsPDF: fCanvas->SaveAs(".pdf"); break;
828 case kFileSaveAsGIF: fCanvas->SaveAs(".gif"); break;
829 case kFileSaveAsJPG: fCanvas->SaveAs(".jpg"); break;
830 case kFileSaveAsPNG: fCanvas->SaveAs(".png"); break;
831 case kFilePrint: PrintCanvas(); break;
832 case kFileCloseCanvas: SendCloseMessage(); break;
833 case kFileQuit:
834 if(!gApplication->ReturnFromRun()) {
835 if((TVirtualPadEditor::GetPadEditor(kFALSE) != nullptr)) {
836 TVirtualPadEditor::Terminate();
837 }
838 SendCloseMessage();
839 }
840 if(TVirtualPadEditor::GetPadEditor(kFALSE) != nullptr) {
841 TVirtualPadEditor::Terminate();
842 }
843 if(TClass::GetClass("TStyleManager") != nullptr) {
844 gROOT->ProcessLine("TStyleManager::Terminate()");
845 }
846 gApplication->Terminate(0);
847 break;
848
849 // Handle Edit menu items...
850 case kEditStyle:
851 if(TClass::GetClass("TStyleManager") == nullptr) {
852 gSystem->Load("libGed");
853 }
854 gROOT->ProcessLine("TStyleManager::Show()");
855 break;
856 case kEditCut:
857 // still noop
858 break;
859 case kEditCopy:
860 // still noop
861 break;
862 case kEditPaste:
863 // still noop
864 break;
865 case kEditUndo:
866 // noop
867 break;
868 case kEditRedo:
869 // noop
870 break;
871 case kEditClearPad:
872 gPad->Clear();
873 gPad->Modified();
874 gPad->Update();
875 break;
876 case kEditClearCanvas:
877 fCanvas->Clear();
878 fCanvas->Modified();
879 fCanvas->Update();
880 break;
881
882 // Handle View menu items...
883 case kViewEditor: fCanvas->ToggleEditor(); break;
884 case kViewToolbar: fCanvas->ToggleToolBar(); break;
885 case kViewEventStatus: fCanvas->ToggleEventStatus(); break;
886 case kViewToolTips: fCanvas->ToggleToolTips(); break;
887 case kViewColors: {
888 TVirtualPad* padsav = gPad->GetCanvas();
889 // This was the code with the old color table
890 // TCanvas *m = new TCanvas("colors","Color Table");
891 // TPad::DrawColorTable();
892 // m->Update();
893 auto* wheel = new TColorWheel();
894 wheel->Draw();
895
896 // tp: with Cocoa, window is visible (and repainted)
897 // before wheel->Draw() was called and you can see "empty"
898 // canvas.
899 gPad->Update();
900 //
901 if(padsav != nullptr) {
902 padsav->cd();
903 }
904 } break;
905 case kViewFonts:
906 // noop
907 break;
908 case kViewMarkers: {
909 TVirtualPad* padsav = gPad->GetCanvas();
910 auto* m = new GCanvas("markers", "Marker Types", 600, 200);
911 TMarker::DisplayMarkerTypes();
912 m->Update();
913 if(padsav != nullptr) {
914 padsav->cd();
915 }
916 } break;
917 case kViewIconify: Iconify(); break;
918 case kViewX3D: gPad->GetViewer3D("x3d"); break;
919 case kViewOpenGL:
920 gPad->GetViewer3D("ogl");
921 break;
922
923 // Handle Option menu items...
924 case kOptionAutoExec:
925 fCanvas->ToggleAutoExec();
926 if(fCanvas->GetAutoExec()) {
927 fOptionMenu->CheckEntry(kOptionAutoExec);
928 } else {
929 fOptionMenu->UnCheckEntry(kOptionAutoExec);
930 }
931 break;
932 case kOptionAutoResize: {
933 fAutoFit = fAutoFit ? kFALSE : kTRUE;
934 unsigned int opt = fCanvasContainer->GetOptions();
935 if(fAutoFit) {
936 opt &= ~kFixedSize;
937 fOptionMenu->CheckEntry(kOptionAutoResize);
938 } else {
939 opt |= kFixedSize;
940 fOptionMenu->UnCheckEntry(kOptionAutoResize);
941 }
942 fCanvasContainer->ChangeOptions(opt);
943 // in case of autofit this will generate a configure
944 // event for the container and this will force the
945 // update of the TCanvas
946 // Layout();
947 }
948 Layout();
949 break;
950 case kOptionResizeCanvas: FitCanvas(); break;
952 if(fCanvas->OpaqueMoving()) {
953 fCanvas->MoveOpaque(0);
954 fOptionMenu->UnCheckEntry(kOptionMoveOpaque);
955 } else {
956 fCanvas->MoveOpaque(1);
957 fOptionMenu->CheckEntry(kOptionMoveOpaque);
958 }
959 break;
961 if(fCanvas->OpaqueResizing()) {
962 fCanvas->ResizeOpaque(0);
963 fOptionMenu->UnCheckEntry(kOptionResizeOpaque);
964 } else {
965 fCanvas->ResizeOpaque(1);
966 fOptionMenu->CheckEntry(kOptionResizeOpaque);
967 }
968 break;
969 case kOptionInterrupt: gROOT->SetInterrupt(); break;
970 case kOptionRefresh:
971 fCanvas->Paint();
972 fCanvas->Update();
973 break;
975 if(gStyle->GetOptStat() != 0) {
976 gStyle->SetOptStat(0);
977 delete gPad->FindObject("stats");
978 fOptionMenu->UnCheckEntry(kOptionStatistics);
979 } else {
980 gStyle->SetOptStat(1);
981 fOptionMenu->CheckEntry(kOptionStatistics);
982 }
983 gPad->Modified();
984 fCanvas->Update();
985 break;
986 case kOptionHistTitle:
987 if(gStyle->GetOptTitle() != 0) {
988 gStyle->SetOptTitle(0);
989 delete gPad->FindObject("title");
990 fOptionMenu->UnCheckEntry(kOptionHistTitle);
991 } else {
992 gStyle->SetOptTitle(1);
993 fOptionMenu->CheckEntry(kOptionHistTitle);
994 }
995 gPad->Modified();
996 fCanvas->Update();
997 break;
998 case kOptionFitParams:
999 if(gStyle->GetOptFit() != 0) {
1000 gStyle->SetOptFit(0);
1001 fOptionMenu->UnCheckEntry(kOptionFitParams);
1002 } else {
1003 gStyle->SetOptFit(1);
1004 fOptionMenu->CheckEntry(kOptionFitParams);
1005 }
1006 gPad->Modified();
1007 fCanvas->Update();
1008 break;
1009 case kOptionCanEdit:
1010 if(gROOT->GetEditHistograms()) {
1011 gROOT->SetEditHistograms(kFALSE);
1012 fOptionMenu->UnCheckEntry(kOptionCanEdit);
1013 } else {
1014 gROOT->SetEditHistograms(kTRUE);
1015 fOptionMenu->CheckEntry(kOptionCanEdit);
1016 }
1017 break;
1018
1019 // Handle Tools menu items...
1020 case kInspectRoot:
1021 fCanvas->cd();
1022 gROOT->Inspect();
1023 fCanvas->Update();
1024 break;
1025 case kToolsBrowser: new TBrowser("browser"); break;
1026 case kToolsBuilder: TGuiBuilder::Instance(); break;
1027 case kToolsRecorder:
1028 gROOT->ProcessLine("new TGRecorder()");
1029 break;
1030
1031 // Handle Tools menu items...
1032 case kClassesTree: {
1033 TString cdef;
1034 auto* canvasList = static_cast<TList*>(gROOT->GetListOfCanvases());
1035 if(canvasList->FindObject("ClassTree") != nullptr) {
1036 cdef = TString::Format("ClassTree_%d", canvasList->GetSize() + 1);
1037 } else {
1038 cdef = "ClassTree";
1039 }
1040 new TClassTree(cdef.Data(), "TObject");
1041 fCanvas->Update();
1042 } break;
1043
1044 case kFitPanel: {
1045 // use plugin manager to create instance of TFitEditor
1046 TPluginHandler* handler = gROOT->GetPluginManager()->FindHandler("TFitEditor");
1047 if((handler != nullptr) && handler->LoadPlugin() != -1) {
1048 if(handler->ExecPlugin(2, fCanvas, 0) == 0) {
1049 Error("FitPanel", "Unable to crate the FitPanel");
1050 }
1051 } else {
1052 Error("FitPanel", "Unable to find the FitPanel plug-in");
1053 }
1054 } break;
1055
1056 // Handle Help menu items...
1057 case kHelpAbout: {
1058#ifdef R__UNIX
1059 TString rootx;
1060#ifdef ROOTBINDIR
1061 rootx = ROOTBINDIR;
1062#else
1063 rootx = gSystem->Getenv("ROOTSYS");
1064 if(!rootx.IsNull()) {
1065 rootx += "/bin";
1066 }
1067#endif // ROOTBINDIR
1068 rootx += "/root -a &";
1069 gSystem->Exec(rootx);
1070#else // R__UNIX
1071#ifdef WIN32
1072 new TWin32SplashThread(kTRUE);
1073#else
1074
1075 std::ostringstream str;
1076 str << "About ROOT " << gROOT->GetVersion() << "...";
1077 helperDialog = new GRootHelpDialog(this, str.str(), 600, 400);
1078 helperDialog->SetText(gHelpAbout);
1079 helperDialog->Popup();
1080#endif // WIN32
1081#endif // R__UNIX
1082 } break;
1083 case kHelpOnCanvas: {
1084 auto* helperDialog = new TRootHelpDialog(this, "Help on Canvas...", 600, 400);
1085 helperDialog->SetText(gHelpCanvas); // NOLINT(cppcoreguidelines-pro-bounds-array-to-pointer-decay)
1086 helperDialog->Popup();
1087 break;
1088 }
1089 case kHelpOnMenus: {
1090 auto* helperDialog = new TRootHelpDialog(this, "Help on Menus...", 600, 400);
1091 helperDialog->SetText(gHelpPullDownMenus); // NOLINT(cppcoreguidelines-pro-bounds-array-to-pointer-decay)
1092 helperDialog->Popup();
1093 break;
1094 }
1095 case kHelpOnGraphicsEd: {
1096 auto* helperDialog = new TRootHelpDialog(this, "Help on Graphics Editor...", 600, 400);
1097 helperDialog->SetText(gHelpGraphicsEditor); // NOLINT(cppcoreguidelines-pro-bounds-array-to-pointer-decay)
1098 helperDialog->Popup();
1099 break;
1100 }
1101 case kHelpOnBrowser: {
1102 auto* helperDialog = new TRootHelpDialog(this, "Help on Browser...", 600, 400);
1103 helperDialog->SetText(gHelpBrowser); // NOLINT(cppcoreguidelines-pro-bounds-array-to-pointer-decay)
1104 helperDialog->Popup();
1105 break;
1106 }
1107 case kHelpOnObjects: {
1108 auto* helperDialog = new TRootHelpDialog(this, "Help on Objects...", 600, 400);
1109 helperDialog->SetText(gHelpObjects); // NOLINT(cppcoreguidelines-pro-bounds-array-to-pointer-decay)
1110 helperDialog->Popup();
1111 break;
1112 }
1113 case kHelpOnPS: {
1114 auto* helperDialog = new TRootHelpDialog(this, "Help on PostScript...", 600, 400);
1115 helperDialog->SetText(gHelpPostscript); // NOLINT(cppcoreguidelines-pro-bounds-array-to-pointer-decay)
1116 helperDialog->Popup();
1117 break;
1118 }
1119 }
1120 default: break;
1121 }
1122 default: break;
1123 }
1124 return kTRUE;
1125}
1126
1127//______________________________________________________________________________
1129{
1130 /// Called by TCanvas ctor to get window indetifier.
1131
1132 if(fCanvas->OpaqueMoving()) {
1133 fOptionMenu->CheckEntry(kOptionMoveOpaque);
1134 }
1135 if(fCanvas->OpaqueResizing()) {
1136 fOptionMenu->CheckEntry(kOptionResizeOpaque);
1137 }
1138
1139 return fCanvasID;
1140}
1141
1142//______________________________________________________________________________
1143void GRootCanvas::SetCanvasSize(UInt_t w, UInt_t h)
1144{
1145 /// Set size of canvas container. Units in pixels.
1146
1147 // turn off autofit, we want to stay at the given size
1148 fAutoFit = kFALSE;
1149 fOptionMenu->UnCheckEntry(kOptionAutoResize);
1150 unsigned int opt = fCanvasContainer->GetOptions();
1151 opt |= kFixedSize; // turn on fixed size mode
1152 fCanvasContainer->ChangeOptions(opt);
1153 fCanvasContainer->SetWidth(w);
1154 fCanvasContainer->SetHeight(h);
1155 Layout(); // force layout (will update container to given size)
1156 fCanvas->Resize();
1157 fCanvas->Update();
1158}
1159
1160//______________________________________________________________________________
1162{
1163 /// Set canvas position (units in pixels).
1164
1165 Move(x, y);
1166}
1167
1168//______________________________________________________________________________
1169void GRootCanvas::SetWindowSize(UInt_t w, UInt_t h)
1170{
1171 /// Set size of canvas (units in pixels).
1172
1173 Resize(w, h);
1174
1175 // Make sure the change of size is really done.
1176 if(gThreadXAR == nullptr) {
1177 gSystem->ProcessEvents();
1178 gSystem->Sleep(10);
1179 gSystem->ProcessEvents();
1180 }
1181}
1182
1183//______________________________________________________________________________
1185{
1186 /// Put canvas window on top of the window stack.
1187
1188 gVirtualX->RaiseWindow(GetId());
1189}
1190
1191//______________________________________________________________________________
1192void GRootCanvas::SetWindowTitle(const char* title)
1193{
1194 /// Change title on window.
1195
1196 SetWindowName(title);
1197 SetIconName(title);
1198 fToolDock->SetWindowName(Form("ToolBar: %s", title));
1199}
1200
1201//______________________________________________________________________________
1203{
1204 /// Fit canvas container to current window size.
1205
1206 if(!fAutoFit) {
1207 unsigned int opt = fCanvasContainer->GetOptions();
1208 unsigned int oopt = opt;
1209 opt &= ~kFixedSize; // turn off fixed size mode
1210 fCanvasContainer->ChangeOptions(opt);
1211 Layout(); // force layout
1212 fCanvas->Resize();
1213 fCanvas->Update();
1214 fCanvasContainer->ChangeOptions(oopt);
1215 }
1216}
1217
1218//______________________________________________________________________________
1220{
1221 /// Print the canvas.
1222
1223 Int_t ret = 0;
1224 Bool_t pname = kTRUE;
1225 char* printer = nullptr;
1226 char* printCmd = nullptr;
1227 static TString sprinter;
1228 static TString sprintCmd;
1229
1230 if(sprinter == "") {
1231 printer = StrDup(gEnv->GetValue("Print.Printer", ""));
1232 } else {
1233 printer = StrDup(sprinter);
1234 }
1235 if(sprintCmd == "") {
1236#ifndef WIN32
1237 printCmd = StrDup(gEnv->GetValue("Print.Command", ""));
1238#else
1239 printCmd = StrDup(gEnv->GetValue("Print.Command", "start AcroRd32.exe /p"));
1240#endif
1241 } else {
1242 printCmd = StrDup(sprintCmd);
1243 }
1244
1245 new TGPrintDialog(fClient->GetDefaultRoot(), this, 400, 150, &printer, &printCmd, &ret);
1246 if(ret != 0) {
1247 sprinter = printer;
1248 sprintCmd = printCmd;
1249
1250 if(sprinter == "") {
1251 pname = kFALSE;
1252 }
1253
1254 TString fn = "rootprint";
1255 FILE* f = gSystem->TempFileName(fn, gEnv->GetValue("Print.Directory", gSystem->TempDirectory()));
1256 if(f != nullptr) {
1257 fclose(f);
1258 }
1259 fn += TString::Format(".%s", gEnv->GetValue("Print.FileType", "pdf"));
1260 fCanvas->Print(fn);
1261
1262 TString cmd = sprintCmd;
1263 if(cmd.Contains("%p")) {
1264 cmd.ReplaceAll("%p", sprinter);
1265 } else if(pname) {
1266 cmd += " ";
1267 cmd += sprinter;
1268 cmd += " ";
1269 }
1270
1271 if(cmd.Contains("%f")) {
1272 cmd.ReplaceAll("%f", fn);
1273 } else {
1274 cmd += " ";
1275 cmd += fn;
1276 cmd += " ";
1277 }
1278
1279 gSystem->Exec(cmd);
1280#ifndef WIN32
1281 gSystem->Unlink(fn);
1282#endif
1283 }
1284 delete[] printer;
1285 delete[] printCmd;
1286}
1287
1288//______________________________________________________________________________
1289void GRootCanvas::EventInfo(Int_t event, Int_t px, Int_t py, TObject* selected)
1290{
1291 /// Display a tooltip with infos about the primitive below the cursor.
1292
1293 fToolTip->Hide();
1294 if(!fCanvas->GetShowToolTips() || selected == nullptr || event != kMouseMotion || fButton != 0) {
1295 return;
1296 }
1297 TString tipInfo;
1298 TString objInfo = selected->GetObjectInfo(px, py);
1299 if(objInfo.BeginsWith("-")) {
1300 // if the string begins with '-', display only the object info
1301 objInfo.Remove(TString::kLeading, '-');
1302 tipInfo = objInfo;
1303 } else {
1304 const char* title = selected->GetTitle();
1305 tipInfo += TString::Format("%s::%s", selected->ClassName(), selected->GetName());
1306 if((title != nullptr) && (strlen(title) != 0u)) {
1307 tipInfo += TString::Format("\n%s", selected->GetTitle());
1308 }
1309 tipInfo += TString::Format("\n%d, %d", px, py);
1310 if(!objInfo.IsNull()) {
1311 tipInfo += TString::Format("\n%s", objInfo.Data());
1312 }
1313 }
1314 fToolTip->SetText(tipInfo.Data());
1315 fToolTip->SetPosition(px + 15, py + 15);
1316 fToolTip->Reset();
1317}
1318
1319//______________________________________________________________________________
1321{
1322 /// Show or hide menubar.
1323
1324 if(show) {
1325 ShowFrame(fMenuBar);
1326 } else {
1327 HideFrame(fMenuBar);
1328 }
1329}
1330
1331//______________________________________________________________________________
1333{
1334 /// Show or hide statusbar.
1335
1336 UInt_t dh = fClient->GetDisplayHeight();
1337 UInt_t ch = fCanvas->GetWindowHeight();
1338
1339 UInt_t h = GetHeight();
1340 UInt_t sh = fStatusBar->GetHeight() + 2;
1341
1342 if(show) {
1343 ShowFrame(fStatusBar);
1344 fViewMenu->CheckEntry(kViewEventStatus);
1345 if(dh - ch >= sh) {
1346 h = h + sh;
1347 } else {
1348 h = ch;
1349 }
1350 } else {
1351 HideFrame(fStatusBar);
1352 fViewMenu->UnCheckEntry(kViewEventStatus);
1353 if(dh - ch < sh) {
1354 h = ch;
1355 } else {
1356 h = h - sh;
1357 }
1358 }
1359 Resize(GetWidth(), h);
1360}
1361
1362//______________________________________________________________________________
1364{
1365 /// Show or hide side frame.
1366
1367 TVirtualPad* savedPad = nullptr;
1368 savedPad = gPad;
1369 gPad = Canvas();
1370
1371 UInt_t w = GetWidth();
1372 UInt_t e = fEditorFrame->GetWidth();
1373 UInt_t h = GetHeight();
1374 UInt_t s = fHorizontal1->GetHeight();
1375
1376 if((fParent != nullptr) && fParent != fClient->GetDefaultRoot()) {
1377 const auto* main = static_cast<const TGMainFrame*>(fParent->GetMainFrame()); // fParent is of type TGWindow, so GetMainFrame returns "const TGWindow*"
1378 fMainFrame->HideFrame(fEditorFrame);
1379 if((main != nullptr) && main->InheritsFrom("TRootBrowser")) {
1380 auto* browser = const_cast<TRootBrowser*>(static_cast<const TRootBrowser*>(main)); // NOLINT(cppcoreguidelines-pro-type-const-cast)
1381 if(!fEmbedded) {
1382 browser->GetTabRight()->Connect("Selected(Int_t)", "GRootCanvas", this, "Activated(Int_t)");
1383 }
1384 fEmbedded = kTRUE;
1385 if(show && ((fEditor == nullptr) || !static_cast<TGedEditor*>(fEditor)->IsMapped())) {
1386 if(browser->GetTabLeft()->GetTabTab("Pad Editor") == nullptr) {
1387 browser->StartEmbedding(TRootBrowser::kLeft);
1388 if(fEditor == nullptr) {
1389 fEditor = TVirtualPadEditor::GetPadEditor(kTRUE);
1390 } else {
1391 static_cast<TGedEditor*>(fEditor)->ReparentWindow(fClient->GetRoot());
1392 static_cast<TGedEditor*>(fEditor)->MapWindow();
1393 }
1394 browser->StopEmbedding("Pad Editor");
1395 fEditor->SetGlobal(kFALSE);
1396 gROOT->GetListOfCleanups()->Remove(static_cast<TGedEditor*>(fEditor));
1397 if(fEditor != nullptr) {
1398 static_cast<TGedEditor*>(fEditor)->SetCanvas(fCanvas);
1399 static_cast<TGedEditor*>(fEditor)->SetModel(fCanvas, fCanvas, kButton1Down);
1400 }
1401 }
1402 fEditor = TVirtualPadEditor::GetPadEditor(kFALSE);
1403 }
1404 if(show) {
1405 browser->GetTabLeft()->SetTab("Pad Editor");
1406 }
1407 }
1408 } else {
1409 if(show) {
1410 if(fEditor == nullptr) {
1411 CreateEditor();
1412 }
1413 TVirtualPadEditor* gged = TVirtualPadEditor::GetPadEditor(kFALSE);
1414 if((gged != nullptr) && gged->GetCanvas() == fCanvas) {
1415 gged->Hide();
1416 }
1417 if(!fViewMenu->IsEntryChecked(kViewToolbar) || fToolDock->IsUndocked()) {
1418 ShowFrame(fHorizontal1);
1419 h = h + s;
1420 }
1421 fMainFrame->ShowFrame(fEditorFrame);
1422 fEditor->Show();
1423 fViewMenu->CheckEntry(kViewEditor);
1424 w = w + e;
1425 } else {
1426 if(!fViewMenu->IsEntryChecked(kViewToolbar) || fToolDock->IsUndocked()) {
1427 HideFrame(fHorizontal1);
1428 h = h - s;
1429 }
1430 if(fEditor != nullptr) {
1431 fEditor->Hide();
1432 }
1433 fMainFrame->HideFrame(fEditorFrame);
1434 fViewMenu->UnCheckEntry(kViewEditor);
1435 w = w - e;
1436 }
1437 Resize(w, h);
1438 }
1439 if(savedPad != nullptr) {
1440 gPad = savedPad;
1441 }
1442}
1443
1444//______________________________________________________________________________
1446{
1447 /// Create embedded editor.
1448
1449 fEditorFrame->SetEditDisabled(kEditEnable);
1450 fEditorFrame->SetEditable();
1451 gPad = Canvas();
1452 // next two lines are related to the old editor
1453 Int_t show = gEnv->GetValue("Canvas.ShowEditor", 0);
1454 gEnv->SetValue("Canvas.ShowEditor", "true");
1455 fEditor = TVirtualPadEditor::LoadEditor();
1456 if(fEditor != nullptr) {
1457 fEditor->SetGlobal(kFALSE);
1458 }
1459 fEditorFrame->SetEditable(kEditDisable != 0u);
1460 fEditorFrame->SetEditable(kFALSE);
1461
1462 // next line is related to the old editor
1463 if(show == 0) {
1464 gEnv->SetValue("Canvas.ShowEditor", "false");
1465 }
1466}
1467
1468//______________________________________________________________________________
1470{
1471 /// Show or hide toolbar.
1472
1473 if(show && (fToolBar == nullptr)) {
1474
1475 fToolBar = new TGToolBar(fToolDock, 60, 20, kHorizontalFrame);
1477
1478 Int_t spacing = 6;
1479 for(Int_t i = 0; gToolBarData[i].fPixmap != nullptr; i++) {
1480 if(strlen(gToolBarData[i].fPixmap) == 0) {
1481 spacing = 6;
1482 continue;
1483 }
1484 fToolBar->AddButton(this, &gToolBarData[i], spacing);
1485 spacing = 0;
1486 }
1487 fVertical1 = new TGVertical3DLine(fToolBar);
1488 fVertical2 = new TGVertical3DLine(fToolBar);
1489 fVertical1Layout = new TGLayoutHints(kLHintsLeft | kLHintsExpandY, 4, 2, 0, 0);
1490 fVertical2Layout = new TGLayoutHints(kLHintsLeft | kLHintsExpandY);
1493
1494 spacing = 6;
1495 for(Int_t i = 0; gToolBarData1[i].fPixmap != nullptr; i++) {
1496 if(strlen(gToolBarData1[i].fPixmap) == 0) {
1497 spacing = 6;
1498 continue;
1499 }
1500 fToolBar->AddButton(this, &gToolBarData1[i], spacing);
1501 spacing = 0;
1502 }
1503 fToolDock->MapSubwindows();
1504 fToolDock->Layout();
1505 fToolDock->SetWindowName(Form("ToolBar: %s", GetWindowName()));
1506 fToolDock->Connect("Docked()", "GRootCanvas", this, "AdjustSize()");
1507 fToolDock->Connect("Undocked()", "GRootCanvas", this, "AdjustSize()");
1508 }
1509
1510 if(fToolBar == nullptr) {
1511 return;
1512 }
1513
1514 UInt_t h = GetHeight();
1515 UInt_t sh = fToolBarSep->GetHeight();
1516 UInt_t dh = fToolBar->GetHeight();
1517
1518 if(show) {
1519 ShowFrame(fToolDock);
1520 if(!fViewMenu->IsEntryChecked(kViewEditor)) {
1521 ShowFrame(fHorizontal1);
1522 h = h + sh;
1523 }
1524 ShowFrame(fToolBarSep);
1525 fViewMenu->CheckEntry(kViewToolbar);
1526 h = h + dh + sh;
1527 } else {
1528 if(fToolDock->IsUndocked()) {
1529 fToolDock->DockContainer();
1530 h = h + 2 * sh;
1531 } else {
1532 h = h - dh;
1533 }
1534
1535 HideFrame(fToolDock);
1536 if(!fViewMenu->IsEntryChecked(kViewEditor)) {
1537 HideFrame(fHorizontal1);
1538 h = h - sh;
1539 }
1540 HideFrame(fToolBarSep);
1541 h = h - sh;
1542 fViewMenu->UnCheckEntry(kViewToolbar);
1543 }
1544 Resize(GetWidth(), h);
1545}
1546
1547//______________________________________________________________________________
1549{
1550 /// Enable or disable tooltip info.
1551
1552 if(show) {
1553 fViewMenu->CheckEntry(kViewToolTips);
1554 } else {
1555 fViewMenu->UnCheckEntry(kViewToolTips);
1556 }
1557}
1558
1559//______________________________________________________________________________
1561{
1562 /// Returns kTRUE if the editor is shown.
1563
1564 return ((fEditor) != nullptr) && fViewMenu->IsEntryChecked(kViewEditor);
1565}
1566
1567//______________________________________________________________________________
1569{
1570 /// Returns kTRUE if the menu bar is shown.
1571
1572 return ((fMenuBar) != nullptr) && fMenuBar->IsMapped();
1573}
1574
1575//______________________________________________________________________________
1577{
1578 /// Returns kTRUE if the status bar is shown.
1579
1580 return ((fStatusBar) != nullptr) && fStatusBar->IsMapped();
1581}
1582
1583//______________________________________________________________________________
1585{
1586 /// Returns kTRUE if the tool bar is shown.
1587
1588 return ((fToolBar) != nullptr) && fToolBar->IsMapped();
1589}
1590
1591//______________________________________________________________________________
1593{
1594 /// Returns kTRUE if the tooltips are enabled.
1595
1596 return ((fCanvas) != nullptr) && fCanvas->GetShowToolTips();
1597}
1598
1599//______________________________________________________________________________
1601{
1602 /// Keep the same canvas size while docking/undocking toolbar.
1603
1604 UInt_t h = GetHeight();
1605 UInt_t dh = fToolBar->GetHeight();
1606 UInt_t sh = fHorizontal1->GetHeight();
1607
1608 if(fToolDock->IsUndocked()) {
1609 if(!fViewMenu->IsEntryChecked(kViewEditor)) {
1610 HideFrame(fHorizontal1);
1611 h = h - sh;
1612 }
1613 HideFrame(fToolBarSep);
1614 h = h - dh - sh;
1615 } else {
1616 if(!fViewMenu->IsEntryChecked(kViewEditor)) {
1617 ShowFrame(fHorizontal1);
1618 h = h + sh;
1619 }
1620 ShowFrame(fToolBarSep);
1621 h = h + dh + sh;
1622 }
1623 Resize(GetWidth(), h);
1624}
1625
1626//______________________________________________________________________________
1628{
1629 /// Handle mouse button events in the canvas container.
1630
1631 UInt_t button = event->fCode;
1632 Int_t x = event->fX;
1633 Int_t y = event->fY;
1634
1635 if(event->fType == kButtonPress) {
1636 if((fToolTip != nullptr) && fCanvas->GetShowToolTips()) {
1637 fToolTip->Hide();
1638 gVirtualX->UpdateWindow(0);
1639 gSystem->ProcessEvents();
1640 }
1641 fButton = button;
1642 if(button == kButton1) {
1643 if((event->fState & kKeyShiftMask) != 0u) {
1644 (static_cast<GCanvas*>(fCanvas))->HandleInput(kButton1Shift, x, y);
1645 } else if((event->fState & kKeyControlMask) != 0u) {
1646 (static_cast<GCanvas*>(fCanvas))->HandleInput(kButton1Ctrl, x, y);
1647 } else {
1648 (static_cast<GCanvas*>(fCanvas))->HandleInput(kButton1Down, x, y);
1649 }
1650 }
1651 if(button == kButton2) {
1652 (static_cast<GCanvas*>(fCanvas))->HandleInput(kButton2Down, x, y);
1653 }
1654 if(button == kButton3) {
1655 (static_cast<GCanvas*>(fCanvas))->HandleInput(kButton3Down, x, y);
1656 fButton = 0; // button up is consumed by TContextMenu
1657 }
1658
1659 } else if(event->fType == kButtonRelease) {
1660 if(button == kButton4) {
1661 (static_cast<GCanvas*>(fCanvas))->HandleInput(kWheelUp, x, y);
1662 }
1663 if(button == kButton5) {
1664 (static_cast<GCanvas*>(fCanvas))->HandleInput(kWheelDown, x, y);
1665 }
1666 if(button == kButton1) {
1667 (static_cast<GCanvas*>(fCanvas))->HandleInput(kButton1Up, x, y);
1668 }
1669 if(button == kButton2) {
1670 (static_cast<GCanvas*>(fCanvas))->HandleInput(kButton2Up, x, y);
1671 }
1672 if(button == kButton3) {
1673 (static_cast<GCanvas*>(fCanvas))->HandleInput(kButton3Up, x, y);
1674 }
1675
1676 fButton = 0;
1677 }
1678
1679 return kTRUE;
1680}
1681
1682//______________________________________________________________________________
1684{
1685 /// Handle mouse button double click events in the canvas container.
1686
1687 UInt_t button = event->fCode;
1688 Int_t x = event->fX;
1689 Int_t y = event->fY;
1690
1691 if(button == kButton1) {
1692 (static_cast<GCanvas*>(fCanvas))->HandleInput(kButton1Double, x, y);
1693 }
1694 if(button == kButton2) {
1695 (static_cast<GCanvas*>(fCanvas))->HandleInput(kButton2Double, x, y);
1696 }
1697 if(button == kButton3) {
1698 (static_cast<GCanvas*>(fCanvas))->HandleInput(kButton3Double, x, y);
1699 }
1700
1701 return kTRUE;
1702}
1703
1704//______________________________________________________________________________
1706{
1707 /// Handle configure (i.e. resize) event.
1708 if(fAutoFit) {
1709 fCanvas->Resize();
1710 fCanvas->Update();
1711 }
1712
1713 if(fCanvas->HasFixedAspectRatio()) {
1714 // get menu height
1715 static UInt_t dh = 0;
1716 if(dh == 0) {
1717 dh = GetHeight() - fCanvasContainer->GetHeight();
1718 }
1719 UInt_t h = TMath::Nint(fCanvasContainer->GetWidth() / fCanvas->GetAspectRatio()) + dh;
1720 SetWindowSize(GetWidth(), h);
1721 }
1722 return kTRUE;
1723}
1724
1725//______________________________________________________________________________
1727{
1728 /// Handle keyboard events in the canvas container.
1729
1730 ///
1731 /// This is the function I wanted to edit so bad that
1732 /// I went through all the trouble to copy this thing.
1733 /// This will allow us to take complete control of the
1734 /// canvas interface make a more root-ish/radware-isf
1735 /// work enviorment. pcb.
1736 ///
1737
1738 static EGEventType previous_event = kOtherEvent;
1739 static UInt_t previous_keysym = 0;
1740
1741 UInt_t keysym = 0;
1742 std::array<char, 2> str;
1743 gVirtualX->LookupString(event, str.data(), str.size(), keysym);
1744
1745 if(event->fType == kGKeyPress) {
1746 fButton = event->fCode;
1747
1748 if(str[0] == kESC) { // ESC sets the escape flag
1749 gROOT->SetEscape();
1750 static_cast<GCanvas*>(fCanvas)->HandleInput(kButton1Up, 0, 0);
1751 static_cast<GCanvas*>(fCanvas)->HandleInput(kMouseMotion, 0, 0);
1752 gPad->Modified();
1753 return kTRUE;
1754 }
1755 if(str[0] == 3) { // ctrl-c sets the interrupt flag
1756 gROOT->SetInterrupt();
1757 }
1758
1759 // handle arrow keys
1760 if(keysym > 0x1011 && keysym < 0x1016) {
1761 Window_t dum1 = 0;
1762 Window_t dum2 = 0;
1763 Window_t wid = 0;
1764 UInt_t mask = 0;
1765 Int_t mx = 0;
1766 Int_t my = 0;
1767 Int_t tx = 0;
1768 Int_t ty = 0;
1769 wid = gVirtualX->GetDefaultRootWindow();
1770 gVirtualX->QueryPointer(wid, dum1, dum2, mx, my, mx, my, mask);
1771 gVirtualX->TranslateCoordinates(gClient->GetDefaultRoot()->GetId(), fCanvasContainer->GetId(), mx, my, tx, ty, dum1);
1772
1773 //((GCanvas*)fCanvas)->HandleInput(kArrowKeyPress, tx, ty);
1774 static_cast<GCanvas*>(fCanvas)->HandleInput(static_cast<EEventType>(kArrowKeyPress), tx, keysym);
1775 // handle case where we got consecutive same keypressed events coming
1776 // from auto-repeat on Windows (as it fires only successive keydown events)
1777 if((previous_keysym == keysym) && (previous_event == kGKeyPress)) {
1778 switch(keysym) {
1779 case 0x1012: // left
1780 // gVirtualX->Warp(--mx, my, wid); --tx;
1781 break;
1782 case 0x1013: // up
1783 // gVirtualX->Warp(mx, --my, wid); --ty;
1784 break;
1785 case 0x1014: // right
1786 // gVirtualX->Warp(++mx, my, wid); ++tx;
1787 break;
1788 case 0x1015: // down
1789 // gVirtualX->Warp(mx, ++my, wid); ++ty;
1790 break;
1791 default: break;
1792 }
1793 static_cast<GCanvas*>(fCanvas)->HandleInput(static_cast<EEventType>(kArrowKeyRelease), tx, ty);
1794 }
1795 previous_keysym = keysym;
1796 } else {
1797 static_cast<GCanvas*>(fCanvas)->HandleInput(kKeyPress, str[0], keysym);
1798 }
1799 } else if(event->fType == kKeyRelease) {
1800 if(keysym > 0x1011 && keysym < 0x1016) {
1801 Window_t dum1 = 0;
1802 Window_t dum2 = 0;
1803 Window_t wid = 0;
1804 UInt_t mask = 0;
1805 Int_t mx = 0;
1806 Int_t my = 0;
1807 Int_t tx = 0;
1808 Int_t ty = 0;
1809 wid = gVirtualX->GetDefaultRootWindow();
1810 gVirtualX->QueryPointer(wid, dum1, dum2, mx, my, mx, my, mask);
1811
1812 auto* gCanvas = static_cast<GCanvas*>(gPad->GetCanvas());
1813 gCanvas->HandleArrowKeyPress(event, &keysym);
1814 gVirtualX->TranslateCoordinates(gClient->GetDefaultRoot()->GetId(), fCanvasContainer->GetId(), mx, my, tx, ty,
1815 dum1);
1816 static_cast<GCanvas*>(fCanvas)->HandleInput(static_cast<EEventType>(kArrowKeyRelease), tx, ty);
1817 previous_keysym = keysym;
1818 } else {
1819 auto* gCanvas = static_cast<GCanvas*>(gPad->GetCanvas());
1820 gCanvas->HandleKeyboardPress(event, &keysym);
1821 }
1822
1823 fButton = 0;
1824 }
1825 previous_event = event->fType;
1826 return kTRUE;
1827}
1828
1829//______________________________________________________________________________
1831{
1832 /// Handle mouse motion event in the canvas container.
1833
1834 Int_t x = event->fX;
1835 Int_t y = event->fY;
1836
1837 if(fButton == 0) {
1838 static_cast<GCanvas*>(fCanvas)->HandleInput(kMouseMotion, x, y);
1839 }
1840 if(fButton == kButton1) {
1841 if((event->fState & kKeyShiftMask) != 0u) {
1842 static_cast<GCanvas*>(fCanvas)->HandleInput(static_cast<EEventType>(8), x, y);
1843 } else {
1844 static_cast<GCanvas*>(fCanvas)->HandleInput(kButton1Motion, x, y);
1845 }
1846 }
1847 if(fButton == kButton2) {
1848 static_cast<GCanvas*>(fCanvas)->HandleInput(kButton2Motion, x, y);
1849 }
1850
1851 return kTRUE;
1852}
1853
1854//______________________________________________________________________________
1856{
1857 /// Handle expose events.
1858
1859 if(event->fCount == 0) {
1860 fCanvas->Flush();
1861 }
1862
1863 return kTRUE;
1864}
1865
1866//______________________________________________________________________________
1868{
1869 /// Handle enter/leave events. Only leave is activated at the moment.
1870
1871 Int_t x = event->fX;
1872 Int_t y = event->fY;
1873
1874 // pointer grabs create also an enter and leave event but with fCode
1875 // either kNotifyGrab or kNotifyUngrab, don't propagate these events
1876 if(event->fType == kLeaveNotify && event->fCode == kNotifyNormal) {
1877 (static_cast<GCanvas*>(fCanvas))->HandleInput(kMouseLeave, x, y);
1878 }
1879
1880 return kTRUE;
1881}
1882
1883//______________________________________________________________________________
1884Bool_t GRootCanvas::HandleDNDDrop(TDNDData* data)
1885{
1886 /// Handle drop events.
1887
1888 static Atom_t rootObj = gVirtualX->InternAtom("application/root", kFALSE);
1889 static Atom_t uriObj = gVirtualX->InternAtom("text/uri-list", kFALSE);
1890
1891 if(data->fDataType == rootObj) {
1892 TBufferFile buf(TBuffer::kRead, data->fDataLength, data->fData);
1893 buf.SetReadMode();
1894 auto* obj = reinterpret_cast<TObject*>(buf.ReadObjectAny(TObject::Class()));
1895 if(obj == nullptr) {
1896 return kTRUE;
1897 }
1898 gPad->Clear();
1899 if(obj->InheritsFrom("TKey")) {
1900 auto* object = reinterpret_cast<TObject*>(gROOT->ProcessLine(Form("((TKey *)0x%lx)->ReadObj();", reinterpret_cast<ULong_t>(obj)))); // NOLINT(performance-no-int-to-ptr)
1901 if(object == nullptr) {
1902 return kTRUE;
1903 }
1904 if(object->InheritsFrom("TGraph")) {
1905 object->Draw("ALP");
1906 } else if(object->InheritsFrom("TImage")) {
1907 object->Draw("x");
1908 } else if(object->IsA()->GetMethodAllAny("Draw") != nullptr) {
1909 object->Draw();
1910 }
1911 } else if(obj->InheritsFrom("TGraph")) {
1912 obj->Draw("ALP");
1913 } else if(obj->IsA()->GetMethodAllAny("Draw") != nullptr) {
1914 obj->Draw();
1915 }
1916 gPad->Modified();
1917 gPad->Update();
1918 return kTRUE;
1919 }
1920 if(data->fDataType == uriObj) {
1921 TString sfname(reinterpret_cast<char*>(data->fData));
1922 if(sfname.Length() > 7) {
1923 sfname.ReplaceAll("\r\n", "");
1924 TUrl uri(sfname.Data());
1925 if(sfname.EndsWith(".bmp") || sfname.EndsWith(".gif") || sfname.EndsWith(".jpg") || sfname.EndsWith(".png") ||
1926 sfname.EndsWith(".ps") || sfname.EndsWith(".eps") || sfname.EndsWith(".pdf") || sfname.EndsWith(".tiff") ||
1927 sfname.EndsWith(".xpm")) {
1928 TImage* img = TImage::Open(uri.GetFile());
1929 if(img != nullptr) {
1930 img->Draw("x");
1931 img->SetEditable(kTRUE);
1932 }
1933 }
1934 gPad->Modified();
1935 gPad->Update();
1936 }
1937 }
1938 return kFALSE;
1939}
1940
1941//______________________________________________________________________________
1942Atom_t GRootCanvas::HandleDNDPosition(Int_t x, Int_t y, Atom_t action, Int_t /*xroot*/, Int_t /*yroot*/)
1943{
1944 /// Handle dragging position events.
1945
1946 TPad* pad = fCanvas->Pick(x, y, nullptr);
1947 if(pad != nullptr) {
1948 pad->cd();
1949 gROOT->SetSelectedPad(pad);
1950 // make sure the pad is highlighted (on Windows)
1951 pad->Update();
1952 }
1953 return action;
1954}
1955
1956//______________________________________________________________________________
1957Atom_t GRootCanvas::HandleDNDEnter(Atom_t* typelist)
1958{
1959 /// Handle drag enter events.
1960
1961 static Atom_t rootObj = gVirtualX->InternAtom("application/root", kFALSE);
1962 static Atom_t uriObj = gVirtualX->InternAtom("text/uri-list", kFALSE);
1963 Atom_t ret = kNone;
1964 for(int i = 0; typelist[i] != kNone; ++i) {
1965 if(typelist[i] == rootObj) {
1966 ret = rootObj;
1967 }
1968 if(typelist[i] == uriObj) {
1969 ret = uriObj;
1970 }
1971 }
1972 return ret;
1973}
1974
1975//______________________________________________________________________________
1977{
1978 /// Handle drag leave events.
1979
1980 return kTRUE;
1981}
1982
1983//______________________________________________________________________________
1985{
1986 /// Slot handling tab switching in the browser, to properly set the canvas
1987 /// and the model to the editor.
1988
1989 if(fEmbedded) {
1990 auto* sender = reinterpret_cast<TGTab*>(gTQSender);
1991 if(sender != nullptr) {
1992 TGCompositeFrame* cont = sender->GetTabContainer(id);
1993 if(cont == fParent) {
1994 if(fEditor == nullptr) {
1995 fEditor = TVirtualPadEditor::GetPadEditor(kFALSE);
1996 }
1997 if(fEditor != nullptr && static_cast<TGedEditor*>(fEditor)->IsMapped()) {
1998 static_cast<TGedEditor*>(fEditor)->SetCanvas(fCanvas);
1999 static_cast<TGedEditor*>(fEditor)->SetModel(fCanvas, fCanvas, kButton1Down);
2000 }
2001 }
2002 }
2003 }
2004}
2005
2006//______________________________________________________________________________
2007void GRootContainer::SavePrimitive(std::ostream& out, Option_t* /*= ""*/)
2008{
2009 /// Save a canvas container as a C++ statement(s) on output stream out.
2010
2011 out << std::endl
2012 << " // canvas container" << std::endl;
2013 out << " Int_t canvasID = gVirtualX->InitWindow((ULong_t)" << GetParent()->GetParent()->GetName() << "->GetId());" << std::endl;
2014 out << " Window_t winC = gVirtualX->GetWindowID(canvasID);" << std::endl;
2015 out << " TGCompositeFrame *";
2016 out << GetName() << " = new TGCompositeFrame(gClient, winC, " << GetParent()->GetName() << ");" << std::endl;
2017}
int main(int argc, char **argv)
#define kArrowKeyRelease
Definition GCanvas.cxx:49
#define kArrowKeyPress
Definition GCanvas.cxx:48
ERootCanvasCommands
@ kOptionInterrupt
@ kToolLatex
@ kFitPanel
@ kToolsBuilder
@ kToolPLabel
@ kEditStyle
@ kOptionCanEdit
@ kOptionResizeOpaque
@ kEditClearCanvas
@ kToolPad
@ kFilePrint
@ kViewOpenGL
@ kEditRedo
@ kHelpOnCanvas
@ kToolDiamond
@ kToolCurlyLine
@ kViewFonts
@ kToolLine
@ kFileSaveAsPDF
@ kViewIconify
@ kFileCloseCanvas
@ kViewX3D
@ kFileSaveAs
@ kToolEllipse
@ kToolPsText
@ kToolModify
@ kFileSaveAsGIF
@ kFileQuit
@ kToolArrow
@ kToolArc
@ kToolsRecorder
@ kToolsBrowser
@ kOptionResizeCanvas
@ kToolPave
@ kHelpOnGraphicsEd
@ kFileNewCanvas
@ kOptionFitParams
@ kOptionRefresh
@ kHelpOnObjects
@ kEditCopy
@ kFileSaveAsEPS
@ kInspectRoot
@ kViewToolTips
@ kOptionMoveOpaque
@ kViewEditor
@ kHelpOnBrowser
@ kClassesTree
@ kToolPText
@ kViewToolbar
@ kOptionAutoExec
@ kHelpOnMenus
@ kEditUndo
@ kHelpOnPS
@ kFileSaveAsPNG
@ kViewMarkers
@ kEditClearPad
@ kToolCurlyArc
@ kEditCut
@ kFileSaveAsC
@ kViewColors
@ kToolGraph
@ kViewEventStatus
@ kFileSaveAsPS
@ kOptionStatistics
@ kFileSaveAsJPG
@ kOptionHistTitle
@ kHelpAbout
@ kToolCutG
@ kToolMarker
@ kFileSaveAsRoot
@ kFileOpen
@ kEditPaste
@ kOptionAutoResize
static std::array< const char *, 32 > gSaveAsTypes
static std::array< ToolBarData_t, 18 > gToolBarData1
constexpr int kButton1Ctrl
static std::array< const char *, 6 > gOpenTypes
static std::array< ToolBarData_t, 11 > gToolBarData
static std::string sh(const std::string &cmd)
Definition Globals.h:158
bool HandleArrowKeyPress(Event_t *event, const UInt_t *keysym)
Definition GCanvas.cxx:352
bool HandleKeyboardPress(Event_t *event, const UInt_t *keysym)
Definition GCanvas.cxx:366
Bool_t HandleContainerMotion(Event_t *event)
void SetWindowSize(UInt_t w, UInt_t h) override
TGCanvas * fCanvasWindow
canvas widget
Definition GRootCanvas.h:51
void EventInfo(Int_t event, Int_t px, Int_t py, TObject *selected)
Int_t fButton
currently pressed button
Definition GRootCanvas.h:92
TGPopupMenu * fEditClearMenu
clear cascade submenu
Definition GRootCanvas.h:57
TGCompositeFrame * fEditorFrame
side frame for current pad editor
Definition GRootCanvas.h:70
Bool_t HandleContainerCrossing(Event_t *event)
void SetWindowTitle(const char *title) override
TGLayoutHints * fToolBarLayout
layout for toolbar widget
Definition GRootCanvas.h:73
void ShowToolTips(Bool_t show=kTRUE) override
TGLayoutHints * fDockLayout
layout hints for dockable frame widget
Definition GRootCanvas.h:84
void ShowStatusBar(Bool_t show=kTRUE) override
Bool_t HandleContainerDoubleClick(Event_t *event)
TGVertical3DLine * fVertical2
toolbar vertical separator
Definition GRootCanvas.h:78
const TGPicture * fIconPic
icon picture
Definition GRootCanvas.h:85
TGHorizontal3DLine * fHorizontal1
toolbar sepatator
Definition GRootCanvas.h:79
TGPopupMenu * fOptionMenu
option menu
Definition GRootCanvas.h:60
friend class GRootContainer
Definition GRootCanvas.h:48
Bool_t HandleContainerKey(Event_t *event)
TGLayoutHints * fEditorLayout
layout for editor frame
Definition GRootCanvas.h:71
UInt_t GetCwidth() const
Bool_t HandleContainerConfigure(Event_t *ev)
Bool_t HandleContainerExpose(Event_t *event)
void CreateCanvas(const char *name)
Bool_t HasToolTips() const override
void Activated(Int_t id)
TGMenuBar * fMenuBar
menubar
Definition GRootCanvas.h:53
TGLayoutHints * fHorizontal1Layout
layout hints for separator
Definition GRootCanvas.h:82
TGVertical3DLine * fVertical1
toolbar vertical separator
Definition GRootCanvas.h:77
TGLayoutHints * fStatusBarLayout
layout hints for statusbar
Definition GRootCanvas.h:68
TGDockableFrame * fToolDock
dockable frame holding the toolbar
Definition GRootCanvas.h:83
void CreateEditor()
Bool_t HandleDNDLeave() override
Bool_t HasEditor() const override
void SetCanvasSize(UInt_t w, UInt_t h) override
TGLayoutHints * fCanvasLayout
layout for canvas widget
Definition GRootCanvas.h:66
GRootCanvas(const GRootCanvas &)
TGLayoutHints * fVertical2Layout
layout hints for separator
Definition GRootCanvas.h:81
TGPopupMenu * fFileSaveMenu
save cascade submenu
Definition GRootCanvas.h:55
TGHorizontal3DLine * fToolBarSep
toolbar separator
Definition GRootCanvas.h:75
TGLayoutHints * fMenuBarLayout
menubar layout hints
Definition GRootCanvas.h:63
Bool_t HasStatusBar() const override
TGLayoutHints * fVertical1Layout
layout hints for separator
Definition GRootCanvas.h:80
TGPopupMenu * fToolsMenu
tools menu
Definition GRootCanvas.h:61
Bool_t HasToolBar() const override
Int_t InitWindow() override
TGLayoutHints * fMainFrameLayout
layout for main frame
Definition GRootCanvas.h:76
Bool_t ProcessMessage(Long_t msg, Long_t parm1, Long_t parm2) override
void RaiseWindow() override
TGStatusBar * fStatusBar
statusbar widget
Definition GRootCanvas.h:67
Bool_t HandleContainerButton(Event_t *event)
Atom_t HandleDNDEnter(Atom_t *typelist) override
GRootContainer * fCanvasContainer
container in canvas widget
Definition GRootCanvas.h:52
void Iconify() override
Atom_t HandleDNDPosition(Int_t x, Int_t y, Atom_t action, Int_t xroot, Int_t yroot) override
void ShowToolBar(Bool_t show=kTRUE) override
void SetWindowPosition(Int_t x, Int_t y) override
void ShowEditor(Bool_t show=kTRUE) override
Bool_t HasMenuBar() const override
void Close() override
TGToolTip * fToolTip
tooltip for object info
Definition GRootCanvas.h:86
Bool_t fEmbedded
true if embedded in any other frame (e.g. in the browser)
Definition GRootCanvas.h:89
Bool_t fAutoFit
when true canvas container keeps same size as canvas
Definition GRootCanvas.h:91
UInt_t GetCheight() const
void ReallyDelete() override
TGPopupMenu * fHelpMenu
help menu
Definition GRootCanvas.h:62
TGPopupMenu * fViewWithMenu
view with... cascade submenu
Definition GRootCanvas.h:59
TVirtualPadEditor * fEditor
pointer to currently loaded pad editor
Definition GRootCanvas.h:88
TGCompositeFrame * fMainFrame
main frame containing canvas and side frame
Definition GRootCanvas.h:72
TGPopupMenu * fEditMenu
edit menu
Definition GRootCanvas.h:56
TGLayoutHints * fMenuBarHelpLayout
layout hint for help menu in menubar
Definition GRootCanvas.h:65
void ShowMenuBar(Bool_t show=kTRUE) override
TGToolBar * fToolBar
icon button toolbar
Definition GRootCanvas.h:74
void CloseWindow() override
TGPopupMenu * fViewMenu
view menu
Definition GRootCanvas.h:58
UInt_t GetWindowGeometry(Int_t &x, Int_t &y, UInt_t &w, UInt_t &h) override
TGPopupMenu * fFileMenu
file menu
Definition GRootCanvas.h:54
TGLayoutHints * fMenuBarItemLayout
layout hints for menu in menubar
Definition GRootCanvas.h:64
Bool_t HandleDNDDrop(TDNDData *data) override
Int_t fCanvasID
index in fWindows array of TGX11
Definition GRootCanvas.h:90
void SetStatusText(const char *txt=nullptr, Int_t partidx=0) override
Bool_t HandleDoubleClick(Event_t *ev) override
Bool_t HandleCrossing(Event_t *ev) override
Bool_t HandleButton(Event_t *event) override
Bool_t HandleMotion(Event_t *ev) override
Bool_t HandleKey(Event_t *ev) override
void SetEditable(Bool_t) override
GRootCanvas * fCanvas
GRootContainer(GRootCanvas *c, Window_t id, const TGWindow *p)
Bool_t HandleExpose(Event_t *ev) override
void SavePrimitive(std::ostream &out, Option_t *="") override
Bool_t HandleConfigureNotify(Event_t *ev) override