5#include "TRootApplication.h"
6#include "TRootHelpDialog.h"
11#include "TGFileDialog.h"
12#include "TGStatusBar.h"
13#include "TGTextEditDialogs.h"
18#include "TPadPainter.h"
20#include "TClassTree.h"
23#include "TColorWheel.h"
25#include "TApplication.h"
27#include "TInterpreter.h"
31#include "TGDockableFrame.h"
36#include "TVirtualPadEditor.h"
37#include "TRootControlBar.h"
39#include "TGuiBuilder.h"
42#include "TGDNDManager.h"
43#include "TBufferFile.h"
44#include "TRootBrowser.h"
46#include "TGedEditor.h"
48#include "TPluginManager.h"
49#include "TVirtualGL.h"
52#include "TWin32SplashThread.h"
146static std::array<const char*, 6>
gOpenTypes = {
"ROOT files",
"*.root",
"All files",
"*",
nullptr,
nullptr};
148static std::array<const char*, 32>
gSaveAsTypes = {
"PDF",
"*.pdf",
"PostScript",
"*.ps",
"Encapsulated PostScript",
149 "*.eps",
"SVG",
"*.svg",
"TeX",
"*.tex",
150 "GIF",
"*.gif",
"ROOT macros",
"*.C",
"ROOT files",
151 "*.root",
"XML",
"*.xml",
"PNG",
"*.png",
152 "XPM",
"*.xpm",
"JPEG",
"*.jpg",
"TIFF",
153 "*.tiff",
"XCF",
"*.xcf",
"All files",
"*",
158 {
"open.xpm",
"Open", kFALSE,
kFileOpen,
nullptr},
159 {
"save.xpm",
"Save As", kFALSE,
kFileSaveAs,
nullptr},
160 {
"printer.xpm",
"Print", kFALSE,
kFilePrint,
nullptr},
161 {
"",
"", kFALSE, -1,
nullptr},
164 {
"",
"", kFALSE, -1,
nullptr},
165 {
"inspect.xpm",
"Inspect", kFALSE,
kInspectRoot,
nullptr},
167 {
nullptr,
nullptr, kFALSE, 0,
nullptr}}};
170 {
"arc.xpm",
"Arc", kFALSE,
kToolArc,
nullptr},
171 {
"line.xpm",
"Line", kFALSE,
kToolLine,
nullptr},
172 {
"arrow.xpm",
"Arrow", kFALSE,
kToolArrow,
nullptr},
173 {
"diamond.xpm",
"Diamond", kFALSE,
kToolDiamond,
nullptr},
174 {
"ellipse.xpm",
"Ellipse", kFALSE,
kToolEllipse,
nullptr},
175 {
"pad.xpm",
"Pad", kFALSE,
kToolPad,
nullptr},
176 {
"pave.xpm",
"Pave", kFALSE,
kToolPave,
nullptr},
177 {
"pavelabel.xpm",
"Pave Label", kFALSE,
kToolPLabel,
nullptr},
178 {
"pavetext.xpm",
"Pave Text", kFALSE,
kToolPText,
nullptr},
179 {
"pavestext.xpm",
"Paves Text", kFALSE,
kToolPsText,
nullptr},
180 {
"graph.xpm",
"Graph", kFALSE,
kToolGraph,
nullptr},
182 {
"curlyarc.xpm",
"Curly Arc", kFALSE,
kToolCurlyArc,
nullptr},
183 {
"latex.xpm",
"Text/Latex", kFALSE,
kToolLatex,
nullptr},
184 {
"marker.xpm",
"Marker", kFALSE,
kToolMarker,
nullptr},
185 {
"cut.xpm",
"Graphical Cut", kFALSE,
kToolCutG,
nullptr},
186 {
nullptr,
nullptr, kFALSE, 0,
nullptr}}};
209 TGFrame::HandleConfigureNotify(ev);
216 void SavePrimitive(std::ostream& out, Option_t* =
"")
override;
225 gVirtualX->GrabButton(fId, kAnyButton, kAnyModifier, kButtonPressMask | kButtonReleaseMask | kPointerMotionMask, kNone, kNone);
227 AddInput(kKeyPressMask | kKeyReleaseMask | kPointerMotionMask | kExposureMask | kStructureNotifyMask | kLeaveWindowMask);
228 fEditDisabled = kEditDisable;
237 const auto* viewPort =
static_cast<const TGViewPort*
>(fParent);
238 UInt_t page = viewPort->GetHeight() / 4;
240 gVirtualX->SetInputFocus(GetMainFrame()->GetId());
242 if(event->fCode == kButton4) {
247 if(event->fCode == kButton5) {
257 : TGMainFrame(gClient->GetRoot(), width, height), TCanvasImp(canvas)
265 Resize(width, height);
270 : TGMainFrame(gClient->GetRoot(), width, height), TCanvasImp(canvas)
278 MoveResize(x, y, width, height);
299 static Int_t img = 0;
302 Int_t sav = gErrorIgnoreLevel;
303 gErrorIgnoreLevel = kFatal;
304 img = TImage::Create() !=
nullptr ? 1 : -1;
305 gErrorIgnoreLevel = sav;
315 fFileMenu =
new TGPopupMenu(fClient->GetDefaultRoot());
331 fEditMenu =
new TGPopupMenu(fClient->GetDefaultRoot());
353 fViewMenu =
new TGPopupMenu(fClient->GetDefaultRoot());
369 fOptionMenu =
new TGPopupMenu(fClient->GetDefaultRoot());
387 if(gStyle->GetOptStat() != 0) {
390 if(gStyle->GetOptTitle() != 0) {
393 if(gStyle->GetOptFit() != 0) {
396 if(gROOT->GetEditHistograms()) {
400 fToolsMenu =
new TGPopupMenu(fClient->GetDefaultRoot());
408 fHelpMenu =
new TGPopupMenu(fClient->GetDefaultRoot());
432 fMenuBarLayout =
new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX, 0, 0, 1, 1);
437 fMenuBar =
new TGMenuBar(
this, 1, 1, kHorizontalFrame);
468 fMainFrame =
new TGCompositeFrame(
this, GetWidth() + 4, GetHeight() + 4, kHorizontalFrame);
473 fEditorLayout =
new TGLayoutHints(kLHintsExpandY | kLHintsLeft);
481 if(fCanvas->UseGL()) {
482 fCanvas->SetSupportGL(kFALSE);
484 if(gGLManager ==
nullptr) {
485 TString osString =
"win32";
486 if(gVirtualX->InheritsFrom(
"TGX11")) {
488 }
else if(gVirtualX->InheritsFrom(
"TGCocoa")) {
491 TPluginHandler* pluginHandler = gROOT->GetPluginManager()->FindHandler(
"TGLManager", osString);
493 if(pluginHandler !=
nullptr && pluginHandler->LoadPlugin() != -1) {
494 if(pluginHandler->ExecPlugin(0) == 0) {
495 Error(
"CreateCanvas",
"GL manager plugin failed");
502 const Int_t glCtx = gGLManager->CreateGLContext(
fCanvasID);
504 fCanvas->SetSupportGL(kTRUE);
505 fCanvas->SetGLDevice(glCtx);
507 Error(
"CreateCanvas",
"GL context creation failed.");
510 Error(
"CreateCanvas",
"GL window creation failed\n");
519 Window_t win = gVirtualX->GetWindowID(
fCanvasID);
522 fCanvasLayout =
new TGLayoutHints(kLHintsExpandX | kLHintsExpandY | kLHintsRight);
530 fCanvas->Connect(
"ProcessedEvent(Int_t, Int_t, Int_t, TObject*)",
"GRootCanvas",
this,
531 "EventInfo(Int_t, Int_t, Int_t, TObject*)");
534 std::array<int, 4> parts = {33, 10, 10, 47};
536 fStatusBar->SetParts(parts.data(), parts.size());
538 fStatusBarLayout =
new TGLayoutHints(kLHintsBottom | kLHintsLeft | kLHintsExpandX, 2, 2, 1, 1);
545 fIconPic = SetIconPixmap(
"macro_s.xpm");
546 SetClassHints(
"ROOT",
"Canvas");
548 SetEditDisabled(kEditDisable);
561 Resize(GetDefaultSize());
563 gVirtualX->SetDNDAware(fId, fDNDTypeList);
581 Disconnect(
fToolDock,
"Docked()",
this,
"AdjustSize()");
582 Disconnect(
fToolDock,
"Undocked()",
this,
"AdjustSize()");
587 if(MustCleanup() == 0) {
627 TVirtualPadEditor* gged = TVirtualPadEditor::GetPadEditor(kFALSE);
628 if((gged !=
nullptr) && gged->GetCanvas() == fCanvas) {
630 static_cast<TGedEditor*
>(gged)->SetModel(
nullptr,
nullptr, kButton1Down);
631 static_cast<TGedEditor*
>(gged)->SetCanvas(
nullptr);
637 gVirtualX->CloseWindow();
645 TVirtualPadEditor* gged = TVirtualPadEditor::GetPadEditor(kFALSE);
646 if((gged !=
nullptr) && gged->GetCanvas() == fCanvas) {
648 static_cast<TGedEditor*
>(gged)->SetModel(
nullptr,
nullptr, kButton1Down);
649 static_cast<TGedEditor*
>(gged)->SetCanvas(
nullptr);
656 Disconnect(fCanvas,
"ProcessedEvent(Int_t, Int_t, Int_t, TObject*)",
this,
657 "EventInfo(Int_t, Int_t, Int_t, TObject*)");
659 TVirtualPad* savepad = gPad;
661 gInterpreter->DeleteGlobal(fCanvas);
696 gVirtualX->GetWindowSize(fId, x, y, w, h);
698 Window_t childdum = 0;
699 gVirtualX->TranslateCoordinates(fId, gClient->GetDefaultRoot()->GetId(), 0, 0, x, y, childdum);
700 if(!fCanvas->GetShowEditor()) {
719 switch(GET_MSG(msg)) {
723 switch(GET_SUBMSG(msg)) {
731 case kToolArc: gROOT->SetEditorMode(
"Arc");
break;
732 case kToolLine: gROOT->SetEditorMode(
"Line");
break;
733 case kToolArrow: gROOT->SetEditorMode(
"Arrow");
break;
734 case kToolDiamond: gROOT->SetEditorMode(
"Diamond");
break;
735 case kToolEllipse: gROOT->SetEditorMode(
"Ellipse");
break;
736 case kToolPad: gROOT->SetEditorMode(
"Pad");
break;
737 case kToolPave: gROOT->SetEditorMode(
"Pave");
break;
738 case kToolPLabel: gROOT->SetEditorMode(
"PaveLabel");
break;
739 case kToolPText: gROOT->SetEditorMode(
"PaveText");
break;
740 case kToolPsText: gROOT->SetEditorMode(
"PavesText");
break;
741 case kToolGraph: gROOT->SetEditorMode(
"PolyLine");
break;
744 case kToolLatex: gROOT->SetEditorMode(
"Text");
break;
745 case kToolMarker: gROOT->SetEditorMode(
"Marker");
break;
747 gROOT->SetEditorMode(
"CutG");
752 gROOT->MakeDefCanvas();
756 static TString dir(
".");
759 fileInfo.fIniDir = StrDup(dir);
760 new TGFileDialog(fClient->GetDefaultRoot(),
this, kFDOpen, &fileInfo);
761 if(fileInfo.fFilename ==
nullptr) {
764 dir = fileInfo.fIniDir;
765 new TFile(fileInfo.fFilename,
"update");
768 TString workdir = gSystem->WorkingDirectory();
769 static TString dir(
".");
770 static Int_t typeidx = 0;
771 static Bool_t overwr = kFALSE;
773 TString defaultType = gEnv->GetValue(
"Canvas.SaveAsDefaultType",
".pdf");
777 if(ftype.EndsWith(defaultType.Data())) {
784 fileInfo.fIniDir = StrDup(dir);
785 fileInfo.fFileTypeIdx = typeidx;
786 fileInfo.fOverwrite = overwr;
787 new TGFileDialog(fClient->GetDefaultRoot(),
this, kFDSave, &fileInfo);
788 gSystem->ChangeDirectory(workdir.Data());
789 if(fileInfo.fFilename ==
nullptr) {
792 Bool_t appendedType = kFALSE;
793 TString fn = fileInfo.fFilename;
794 TString ft = fileInfo.fFileTypes[fileInfo.fFileTypeIdx + 1];
795 dir = fileInfo.fIniDir;
796 typeidx = fileInfo.fFileTypeIdx;
797 overwr = fileInfo.fOverwrite;
799 if(fn.EndsWith(
".root") || fn.EndsWith(
".ps") || fn.EndsWith(
".eps") || fn.EndsWith(
".pdf") ||
800 fn.EndsWith(
".svg") || fn.EndsWith(
".tex") || fn.EndsWith(
".gif") || fn.EndsWith(
".xml") ||
801 fn.EndsWith(
".xpm") || fn.EndsWith(
".jpg") || fn.EndsWith(
".png") || fn.EndsWith(
".xcf") ||
802 fn.EndsWith(
".tiff")) {
804 }
else if(fn.EndsWith(
".C")) {
805 fCanvas->SaveSource(fn);
808 if(ft.Index(
".") != kNPOS) {
809 fn += ft(ft.Index(
"."), ft.Length());
810 appendedType = kTRUE;
814 Warning(
"ProcessMessage",
"file %s cannot be saved with this extension", fileInfo.fFilename);
818 ftype.ReplaceAll(
"*.",
".");
819 if(fn.EndsWith(ftype.Data())) {
836 if(!gApplication->ReturnFromRun()) {
837 if((TVirtualPadEditor::GetPadEditor(kFALSE) !=
nullptr)) {
838 TVirtualPadEditor::Terminate();
842 if(TVirtualPadEditor::GetPadEditor(kFALSE) !=
nullptr) {
843 TVirtualPadEditor::Terminate();
845 if(TClass::GetClass(
"TStyleManager") !=
nullptr) {
846 gROOT->ProcessLine(
"TStyleManager::Terminate()");
848 gApplication->Terminate(0);
853 if(TClass::GetClass(
"TStyleManager") ==
nullptr) {
854 gSystem->Load(
"libGed");
856 gROOT->ProcessLine(
"TStyleManager::Show()");
890 TVirtualPad* padsav = gPad->GetCanvas();
895 auto* wheel =
new TColorWheel();
903 if(padsav !=
nullptr) {
911 TVirtualPad* padsav = gPad->GetCanvas();
912 auto* m =
new GCanvas(
"markers",
"Marker Types", 600, 200);
913 TMarker::DisplayMarkerTypes();
915 if(padsav !=
nullptr) {
920 case kViewX3D: gPad->GetViewer3D(
"x3d");
break;
922 gPad->GetViewer3D(
"ogl");
927 fCanvas->ToggleAutoExec();
928 if(fCanvas->GetAutoExec()) {
954 if(fCanvas->OpaqueMoving()) {
955 fCanvas->MoveOpaque(0);
958 fCanvas->MoveOpaque(1);
963 if(fCanvas->OpaqueResizing()) {
964 fCanvas->ResizeOpaque(0);
967 fCanvas->ResizeOpaque(1);
977 if(gStyle->GetOptStat() != 0) {
978 gStyle->SetOptStat(0);
979 delete gPad->FindObject(
"stats");
982 gStyle->SetOptStat(1);
989 if(gStyle->GetOptTitle() != 0) {
990 gStyle->SetOptTitle(0);
991 delete gPad->FindObject(
"title");
994 gStyle->SetOptTitle(1);
1001 if(gStyle->GetOptFit() != 0) {
1002 gStyle->SetOptFit(0);
1005 gStyle->SetOptFit(1);
1012 if(gROOT->GetEditHistograms()) {
1013 gROOT->SetEditHistograms(kFALSE);
1016 gROOT->SetEditHistograms(kTRUE);
1030 gROOT->ProcessLine(
"new TGRecorder()");
1036 auto* canvasList =
static_cast<TList*
>(gROOT->GetListOfCanvases());
1037 if(canvasList->FindObject(
"ClassTree") !=
nullptr) {
1038 cdef = TString::Format(
"ClassTree_%d", canvasList->GetSize() + 1);
1042 new TClassTree(cdef.Data(),
"TObject");
1048 TPluginHandler* handler = gROOT->GetPluginManager()->FindHandler(
"TFitEditor");
1049 if((handler !=
nullptr) && handler->LoadPlugin() != -1) {
1050 if(handler->ExecPlugin(2, fCanvas, 0) == 0) {
1051 Error(
"FitPanel",
"Unable to crate the FitPanel");
1054 Error(
"FitPanel",
"Unable to find the FitPanel plug-in");
1065 rootx = gSystem->Getenv(
"ROOTSYS");
1066 if(!rootx.IsNull()) {
1070 rootx +=
"/root -a &";
1071 gSystem->Exec(rootx);
1074 new TWin32SplashThread(kTRUE);
1077 std::ostringstream str;
1078 str <<
"About ROOT " << gROOT->GetVersion() <<
"...";
1079 helperDialog =
new GRootHelpDialog(
this, str.str(), 600, 400);
1080 helperDialog->SetText(gHelpAbout);
1081 helperDialog->Popup();
1086 auto* helperDialog =
new TRootHelpDialog(
this,
"Help on Canvas...", 600, 400);
1087 helperDialog->SetText(gHelpCanvas);
1088 helperDialog->Popup();
1092 auto* helperDialog =
new TRootHelpDialog(
this,
"Help on Menus...", 600, 400);
1093 helperDialog->SetText(gHelpPullDownMenus);
1094 helperDialog->Popup();
1098 auto* helperDialog =
new TRootHelpDialog(
this,
"Help on Graphics Editor...", 600, 400);
1099 helperDialog->SetText(gHelpGraphicsEditor);
1100 helperDialog->Popup();
1104 auto* helperDialog =
new TRootHelpDialog(
this,
"Help on Browser...", 600, 400);
1105 helperDialog->SetText(gHelpBrowser);
1106 helperDialog->Popup();
1110 auto* helperDialog =
new TRootHelpDialog(
this,
"Help on Objects...", 600, 400);
1111 helperDialog->SetText(gHelpObjects);
1112 helperDialog->Popup();
1116 auto* helperDialog =
new TRootHelpDialog(
this,
"Help on PostScript...", 600, 400);
1117 helperDialog->SetText(gHelpPostscript);
1118 helperDialog->Popup();
1134 if(fCanvas->OpaqueMoving()) {
1137 if(fCanvas->OpaqueResizing()) {
1178 if(gThreadXAR ==
nullptr) {
1179 gSystem->ProcessEvents();
1181 gSystem->ProcessEvents();
1190 gVirtualX->RaiseWindow(GetId());
1198 SetWindowName(title);
1200 fToolDock->SetWindowName(Form(
"ToolBar: %s", title));
1210 unsigned int oopt = opt;
1226 Bool_t pname = kTRUE;
1227 char* printer =
nullptr;
1228 char* printCmd =
nullptr;
1229 static TString sprinter;
1230 static TString sprintCmd;
1232 if(sprinter ==
"") {
1233 printer = StrDup(gEnv->GetValue(
"Print.Printer",
""));
1235 printer = StrDup(sprinter);
1237 if(sprintCmd ==
"") {
1239 printCmd = StrDup(gEnv->GetValue(
"Print.Command",
""));
1241 printCmd = StrDup(gEnv->GetValue(
"Print.Command",
"start AcroRd32.exe /p"));
1244 printCmd = StrDup(sprintCmd);
1247 new TGPrintDialog(fClient->GetDefaultRoot(),
this, 400, 150, &printer, &printCmd, &ret);
1250 sprintCmd = printCmd;
1252 if(sprinter ==
"") {
1256 TString fn =
"rootprint";
1257 FILE* f = gSystem->TempFileName(fn, gEnv->GetValue(
"Print.Directory", gSystem->TempDirectory()));
1261 fn += TString::Format(
".%s", gEnv->GetValue(
"Print.FileType",
"pdf"));
1264 TString cmd = sprintCmd;
1265 if(cmd.Contains(
"%p")) {
1266 cmd.ReplaceAll(
"%p", sprinter);
1273 if(cmd.Contains(
"%f")) {
1274 cmd.ReplaceAll(
"%f", fn);
1283 gSystem->Unlink(fn);
1296 if(!fCanvas->GetShowToolTips() || selected ==
nullptr || event != kMouseMotion ||
fButton != 0) {
1300 TString objInfo = selected->GetObjectInfo(px, py);
1301 if(objInfo.BeginsWith(
"-")) {
1303 objInfo.Remove(TString::kLeading,
'-');
1306 const char* title = selected->GetTitle();
1307 tipInfo += TString::Format(
"%s::%s", selected->ClassName(), selected->GetName());
1308 if((title !=
nullptr) && (strlen(title) != 0u)) {
1309 tipInfo += TString::Format(
"\n%s", selected->GetTitle());
1311 tipInfo += TString::Format(
"\n%d, %d", px, py);
1312 if(!objInfo.IsNull()) {
1313 tipInfo += TString::Format(
"\n%s", objInfo.Data());
1317 fToolTip->SetPosition(px + 15, py + 15);
1338 UInt_t dh = fClient->GetDisplayHeight();
1339 UInt_t ch = fCanvas->GetWindowHeight();
1341 UInt_t h = GetHeight();
1361 Resize(GetWidth(), h);
1369 TVirtualPad* savedPad =
nullptr;
1373 UInt_t w = GetWidth();
1375 UInt_t h = GetHeight();
1378 if((fParent !=
nullptr) && fParent != fClient->GetDefaultRoot()) {
1379 const auto*
main =
static_cast<const TGMainFrame*
>(fParent->GetMainFrame());
1381 if((
main !=
nullptr) &&
main->InheritsFrom(
"TRootBrowser")) {
1382 auto* browser =
const_cast<TRootBrowser*
>(
static_cast<const TRootBrowser*
>(
main));
1384 browser->GetTabRight()->Connect(
"Selected(Int_t)",
"GRootCanvas",
this,
"Activated(Int_t)");
1387 if(show && ((
fEditor ==
nullptr) || !
static_cast<TGedEditor*
>(
fEditor)->IsMapped())) {
1388 if(browser->GetTabLeft()->GetTabTab(
"Pad Editor") ==
nullptr) {
1389 browser->StartEmbedding(TRootBrowser::kLeft);
1391 fEditor = TVirtualPadEditor::GetPadEditor(kTRUE);
1393 static_cast<TGedEditor*
>(
fEditor)->ReparentWindow(fClient->GetRoot());
1394 static_cast<TGedEditor*
>(
fEditor)->MapWindow();
1396 browser->StopEmbedding(
"Pad Editor");
1398 gROOT->GetListOfCleanups()->Remove(
static_cast<TGedEditor*
>(
fEditor));
1400 static_cast<TGedEditor*
>(
fEditor)->SetCanvas(fCanvas);
1401 static_cast<TGedEditor*
>(
fEditor)->SetModel(fCanvas, fCanvas, kButton1Down);
1404 fEditor = TVirtualPadEditor::GetPadEditor(kFALSE);
1407 browser->GetTabLeft()->SetTab(
"Pad Editor");
1415 TVirtualPadEditor* gged = TVirtualPadEditor::GetPadEditor(kFALSE);
1416 if((gged !=
nullptr) && gged->GetCanvas() == fCanvas) {
1441 if(savedPad !=
nullptr) {
1455 Int_t show = gEnv->GetValue(
"Canvas.ShowEditor", 0);
1456 gEnv->SetValue(
"Canvas.ShowEditor",
"true");
1457 fEditor = TVirtualPadEditor::LoadEditor();
1466 gEnv->SetValue(
"Canvas.ShowEditor",
"false");
1475 if(show && (
fToolBar ==
nullptr)) {
1481 for(Int_t i = 0;
gToolBarData[i].fPixmap !=
nullptr; i++) {
1491 fVertical1Layout =
new TGLayoutHints(kLHintsLeft | kLHintsExpandY, 4, 2, 0, 0);
1497 for(Int_t i = 0;
gToolBarData1[i].fPixmap !=
nullptr; i++) {
1507 fToolDock->SetWindowName(Form(
"ToolBar: %s", GetWindowName()));
1508 fToolDock->Connect(
"Docked()",
"GRootCanvas",
this,
"AdjustSize()");
1509 fToolDock->Connect(
"Undocked()",
"GRootCanvas",
this,
"AdjustSize()");
1516 UInt_t h = GetHeight();
1546 Resize(GetWidth(), h);
1598 return ((fCanvas) !=
nullptr) && fCanvas->GetShowToolTips();
1606 UInt_t h = GetHeight();
1625 Resize(GetWidth(), h);
1633 UInt_t button =
event->fCode;
1634 Int_t x =
event->fX;
1635 Int_t y =
event->fY;
1637 if(event->fType == kButtonPress) {
1638 if((
fToolTip !=
nullptr) && fCanvas->GetShowToolTips()) {
1640 gVirtualX->UpdateWindow(0);
1641 gSystem->ProcessEvents();
1644 if(button == kButton1) {
1645 if((event->fState & kKeyShiftMask) != 0u) {
1646 (
static_cast<GCanvas*
>(fCanvas))->HandleInput(kButton1Shift, x, y);
1647 }
else if((event->fState & kKeyControlMask) != 0u) {
1650 (
static_cast<GCanvas*
>(fCanvas))->HandleInput(kButton1Down, x, y);
1653 if(button == kButton2) {
1654 (
static_cast<GCanvas*
>(fCanvas))->HandleInput(kButton2Down, x, y);
1656 if(button == kButton3) {
1657 (
static_cast<GCanvas*
>(fCanvas))->HandleInput(kButton3Down, x, y);
1661 }
else if(event->fType == kButtonRelease) {
1662 if(button == kButton4) {
1663 (
static_cast<GCanvas*
>(fCanvas))->HandleInput(kWheelUp, x, y);
1665 if(button == kButton5) {
1666 (
static_cast<GCanvas*
>(fCanvas))->HandleInput(kWheelDown, x, y);
1668 if(button == kButton1) {
1669 (
static_cast<GCanvas*
>(fCanvas))->HandleInput(kButton1Up, x, y);
1671 if(button == kButton2) {
1672 (
static_cast<GCanvas*
>(fCanvas))->HandleInput(kButton2Up, x, y);
1674 if(button == kButton3) {
1675 (
static_cast<GCanvas*
>(fCanvas))->HandleInput(kButton3Up, x, y);
1689 UInt_t button =
event->fCode;
1690 Int_t x =
event->fX;
1691 Int_t y =
event->fY;
1693 if(button == kButton1) {
1694 (
static_cast<GCanvas*
>(fCanvas))->HandleInput(kButton1Double, x, y);
1696 if(button == kButton2) {
1697 (
static_cast<GCanvas*
>(fCanvas))->HandleInput(kButton2Double, x, y);
1699 if(button == kButton3) {
1700 (
static_cast<GCanvas*
>(fCanvas))->HandleInput(kButton3Double, x, y);
1715 if(fCanvas->HasFixedAspectRatio()) {
1717 static UInt_t dh = 0;
1721 UInt_t h = TMath::Nint(
fCanvasContainer->GetWidth() / fCanvas->GetAspectRatio()) + dh;
1740 static EGEventType previous_event = kOtherEvent;
1741 static UInt_t previous_keysym = 0;
1744 std::array<char, 2> str;
1745 gVirtualX->LookupString(event, str.data(), str.size(), keysym);
1747 if(event->fType == kGKeyPress) {
1750 if(str[0] == kESC) {
1752 static_cast<GCanvas*
>(fCanvas)->HandleInput(kButton1Up, 0, 0);
1753 static_cast<GCanvas*
>(fCanvas)->HandleInput(kMouseMotion, 0, 0);
1758 gROOT->SetInterrupt();
1762 if(keysym > 0x1011 && keysym < 0x1016) {
1771 wid = gVirtualX->GetDefaultRootWindow();
1772 gVirtualX->QueryPointer(wid, dum1, dum2, mx, my, mx, my, mask);
1773 gVirtualX->TranslateCoordinates(gClient->GetDefaultRoot()->GetId(),
fCanvasContainer->GetId(), mx, my, tx, ty, dum1);
1779 if((previous_keysym == keysym) && (previous_event == kGKeyPress)) {
1797 previous_keysym = keysym;
1799 static_cast<GCanvas*
>(fCanvas)->HandleInput(kKeyPress, str[0], keysym);
1801 }
else if(event->fType == kKeyRelease) {
1802 if(keysym > 0x1011 && keysym < 0x1016) {
1811 wid = gVirtualX->GetDefaultRootWindow();
1812 gVirtualX->QueryPointer(wid, dum1, dum2, mx, my, mx, my, mask);
1814 auto* gCanvas =
static_cast<GCanvas*
>(gPad->GetCanvas());
1816 gVirtualX->TranslateCoordinates(gClient->GetDefaultRoot()->GetId(),
fCanvasContainer->GetId(), mx, my, tx, ty,
1819 previous_keysym = keysym;
1821 auto* gCanvas =
static_cast<GCanvas*
>(gPad->GetCanvas());
1827 previous_event =
event->fType;
1836 Int_t x =
event->fX;
1837 Int_t y =
event->fY;
1840 static_cast<GCanvas*
>(fCanvas)->HandleInput(kMouseMotion, x, y);
1843 if((event->fState & kKeyShiftMask) != 0u) {
1844 static_cast<GCanvas*
>(fCanvas)->HandleInput(
static_cast<EEventType
>(8), x, y);
1846 static_cast<GCanvas*
>(fCanvas)->HandleInput(kButton1Motion, x, y);
1850 static_cast<GCanvas*
>(fCanvas)->HandleInput(kButton2Motion, x, y);
1861 if(event->fCount == 0) {
1873 Int_t x =
event->fX;
1874 Int_t y =
event->fY;
1878 if(event->fType == kLeaveNotify && event->fCode == kNotifyNormal) {
1879 (
static_cast<GCanvas*
>(fCanvas))->HandleInput(kMouseLeave, x, y);
1890 static Atom_t rootObj = gVirtualX->InternAtom(
"application/root", kFALSE);
1891 static Atom_t uriObj = gVirtualX->InternAtom(
"text/uri-list", kFALSE);
1893 if(data->fDataType == rootObj) {
1894 TBufferFile buf(TBuffer::kRead, data->fDataLength, data->fData);
1896 auto* obj =
reinterpret_cast<TObject*
>(buf.ReadObjectAny(TObject::Class()));
1897 if(obj ==
nullptr) {
1901 if(obj->InheritsFrom(
"TKey")) {
1902 auto*
object =
reinterpret_cast<TObject*
>(gROOT->ProcessLine(Form(
"((TKey *)0x%lx)->ReadObj();",
reinterpret_cast<ULong_t
>(obj))));
1903 if(
object ==
nullptr) {
1906 if(object->InheritsFrom(
"TGraph")) {
1907 object->Draw(
"ALP");
1908 }
else if(object->InheritsFrom(
"TImage")) {
1910 }
else if(object->IsA()->GetMethodAllAny(
"Draw") !=
nullptr) {
1913 }
else if(obj->InheritsFrom(
"TGraph")) {
1915 }
else if(obj->IsA()->GetMethodAllAny(
"Draw") !=
nullptr) {
1922 if(data->fDataType == uriObj) {
1923 TString sfname(
reinterpret_cast<char*
>(data->fData));
1924 if(sfname.Length() > 7) {
1925 sfname.ReplaceAll(
"\r\n",
"");
1926 TUrl uri(sfname.Data());
1927 if(sfname.EndsWith(
".bmp") || sfname.EndsWith(
".gif") || sfname.EndsWith(
".jpg") || sfname.EndsWith(
".png") ||
1928 sfname.EndsWith(
".ps") || sfname.EndsWith(
".eps") || sfname.EndsWith(
".pdf") || sfname.EndsWith(
".tiff") ||
1929 sfname.EndsWith(
".xpm")) {
1930 TImage* img = TImage::Open(uri.GetFile());
1931 if(img !=
nullptr) {
1933 img->SetEditable(kTRUE);
1948 TPad* pad = fCanvas->Pick(x, y,
nullptr);
1949 if(pad !=
nullptr) {
1951 gROOT->SetSelectedPad(pad);
1963 static Atom_t rootObj = gVirtualX->InternAtom(
"application/root", kFALSE);
1964 static Atom_t uriObj = gVirtualX->InternAtom(
"text/uri-list", kFALSE);
1966 for(
int i = 0; typelist[i] != kNone; ++i) {
1967 if(typelist[i] == rootObj) {
1970 if(typelist[i] == uriObj) {
1992 auto* sender =
reinterpret_cast<TGTab*
>(gTQSender);
1993 if(sender !=
nullptr) {
1994 TGCompositeFrame* cont = sender->GetTabContainer(
id);
1995 if(cont == fParent) {
1997 fEditor = TVirtualPadEditor::GetPadEditor(kFALSE);
1999 if(
fEditor !=
nullptr &&
static_cast<TGedEditor*
>(
fEditor)->IsMapped()) {
2000 static_cast<TGedEditor*
>(
fEditor)->SetCanvas(fCanvas);
2001 static_cast<TGedEditor*
>(
fEditor)->SetModel(fCanvas, fCanvas, kButton1Down);
2014 <<
" // canvas container" << std::endl;
2015 out <<
" Int_t canvasID = gVirtualX->InitWindow((ULong_t)" << GetParent()->GetParent()->GetName() <<
"->GetId());" << std::endl;
2016 out <<
" Window_t winC = gVirtualX->GetWindowID(canvasID);" << std::endl;
2017 out <<
" TGCompositeFrame *";
2018 out << GetName() <<
" = new TGCompositeFrame(gClient, winC, " << GetParent()->GetName() <<
");" << std::endl;
int main(int argc, char **argv)
static std::array< const char *, 32 > gSaveAsTypes
static std::array< ToolBarData_t, 18 > gToolBarData1
constexpr int kButton1Ctrl
static std::array< const char *, 6 > gOpenTypes
constexpr int kButton1CtrlMotion
static std::array< ToolBarData_t, 11 > gToolBarData
static std::string sh(const std::string &cmd)
bool HandleArrowKeyPress(Event_t *event, const UInt_t *keysym)
bool HandleKeyboardPress(Event_t *event, const UInt_t *keysym)
Bool_t HandleContainerMotion(Event_t *event)
void SetWindowSize(UInt_t w, UInt_t h) override
TGCanvas * fCanvasWindow
canvas widget
void EventInfo(Int_t event, Int_t px, Int_t py, TObject *selected)
Int_t fButton
currently pressed button
TGPopupMenu * fEditClearMenu
clear cascade submenu
TGCompositeFrame * fEditorFrame
side frame for current pad editor
Bool_t HandleContainerCrossing(Event_t *event)
void SetWindowTitle(const char *title) override
TGLayoutHints * fToolBarLayout
layout for toolbar widget
void ShowToolTips(Bool_t show=kTRUE) override
TGLayoutHints * fDockLayout
layout hints for dockable frame widget
void ShowStatusBar(Bool_t show=kTRUE) override
Bool_t HandleContainerDoubleClick(Event_t *event)
TGVertical3DLine * fVertical2
toolbar vertical separator
const TGPicture * fIconPic
icon picture
TGHorizontal3DLine * fHorizontal1
toolbar sepatator
TGPopupMenu * fOptionMenu
option menu
friend class GRootContainer
Bool_t HandleContainerKey(Event_t *event)
TGLayoutHints * fEditorLayout
layout for editor frame
Bool_t HandleContainerConfigure(Event_t *ev)
Bool_t HandleContainerExpose(Event_t *event)
void CreateCanvas(const char *name)
Bool_t HasToolTips() const override
TGMenuBar * fMenuBar
menubar
TGLayoutHints * fHorizontal1Layout
layout hints for separator
TGVertical3DLine * fVertical1
toolbar vertical separator
TGLayoutHints * fStatusBarLayout
layout hints for statusbar
TGDockableFrame * fToolDock
dockable frame holding the toolbar
Bool_t HandleDNDLeave() override
Bool_t HasEditor() const override
void SetCanvasSize(UInt_t w, UInt_t h) override
TGLayoutHints * fCanvasLayout
layout for canvas widget
GRootCanvas(const GRootCanvas &)
TGLayoutHints * fVertical2Layout
layout hints for separator
TGPopupMenu * fFileSaveMenu
save cascade submenu
TGHorizontal3DLine * fToolBarSep
toolbar separator
TGLayoutHints * fMenuBarLayout
menubar layout hints
Bool_t HasStatusBar() const override
TGLayoutHints * fVertical1Layout
layout hints for separator
TGPopupMenu * fToolsMenu
tools menu
Bool_t HasToolBar() const override
Int_t InitWindow() override
TGLayoutHints * fMainFrameLayout
layout for main frame
Bool_t ProcessMessage(Long_t msg, Long_t parm1, Long_t parm2) override
void RaiseWindow() override
TGStatusBar * fStatusBar
statusbar widget
Bool_t HandleContainerButton(Event_t *event)
Atom_t HandleDNDEnter(Atom_t *typelist) override
GRootContainer * fCanvasContainer
container in canvas widget
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
TGToolTip * fToolTip
tooltip for object info
Bool_t fEmbedded
true if embedded in any other frame (e.g. in the browser)
Bool_t fAutoFit
when true canvas container keeps same size as canvas
UInt_t GetCheight() const
void ReallyDelete() override
TGPopupMenu * fHelpMenu
help menu
TGPopupMenu * fViewWithMenu
view with... cascade submenu
TVirtualPadEditor * fEditor
pointer to currently loaded pad editor
TGCompositeFrame * fMainFrame
main frame containing canvas and side frame
TGPopupMenu * fEditMenu
edit menu
TGLayoutHints * fMenuBarHelpLayout
layout hint for help menu in menubar
void ShowMenuBar(Bool_t show=kTRUE) override
TGToolBar * fToolBar
icon button toolbar
void CloseWindow() override
TGPopupMenu * fViewMenu
view menu
UInt_t GetWindowGeometry(Int_t &x, Int_t &y, UInt_t &w, UInt_t &h) override
TGPopupMenu * fFileMenu
file menu
TGLayoutHints * fMenuBarItemLayout
layout hints for menu in menubar
Bool_t HandleDNDDrop(TDNDData *data) override
Int_t fCanvasID
index in fWindows array of TGX11
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
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