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"
30#include "TGDockableFrame.h"
35#include "TVirtualPadEditor.h"
36#include "TRootControlBar.h"
37#include "TGuiBuilder.h"
40#include "TGDNDManager.h"
41#include "TBufferFile.h"
42#include "TRootBrowser.h"
44#include "TGedEditor.h"
46#include "TPluginManager.h"
47#include "TVirtualGL.h"
50#include "TWin32SplashThread.h"
144static std::array<const char*, 6>
gOpenTypes = {
"ROOT files",
"*.root",
"All files",
"*",
nullptr,
nullptr};
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",
"*",
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},
162 {
"",
"", kFALSE, -1,
nullptr},
163 {
"inspect.xpm",
"Inspect", kFALSE,
kInspectRoot,
nullptr},
165 {
nullptr,
nullptr, kFALSE, 0,
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},
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}}};
207 TGFrame::HandleConfigureNotify(ev);
214 void SavePrimitive(std::ostream& out, Option_t* =
"")
override;
223 gVirtualX->GrabButton(fId, kAnyButton, kAnyModifier, kButtonPressMask | kButtonReleaseMask | kPointerMotionMask, kNone, kNone);
225 AddInput(kKeyPressMask | kKeyReleaseMask | kPointerMotionMask | kExposureMask | kStructureNotifyMask | kLeaveWindowMask);
226 fEditDisabled = kEditDisable;
235 const auto* viewPort =
static_cast<const TGViewPort*
>(fParent);
236 UInt_t page = viewPort->GetHeight() / 4;
238 gVirtualX->SetInputFocus(GetMainFrame()->GetId());
240 if(event->fCode == kButton4) {
245 if(event->fCode == kButton5) {
255 : TGMainFrame(gClient->GetRoot(), width, height), TCanvasImp(canvas)
263 Resize(width, height);
268 : TGMainFrame(gClient->GetRoot(), width, height), TCanvasImp(canvas)
276 MoveResize(x, y, width, height);
297 static Int_t img = 0;
300 Int_t sav = gErrorIgnoreLevel;
301 gErrorIgnoreLevel = kFatal;
302 img = TImage::Create() !=
nullptr ? 1 : -1;
303 gErrorIgnoreLevel = sav;
313 fFileMenu =
new TGPopupMenu(fClient->GetDefaultRoot());
329 fEditMenu =
new TGPopupMenu(fClient->GetDefaultRoot());
351 fViewMenu =
new TGPopupMenu(fClient->GetDefaultRoot());
367 fOptionMenu =
new TGPopupMenu(fClient->GetDefaultRoot());
385 if(gStyle->GetOptStat() != 0) {
388 if(gStyle->GetOptTitle() != 0) {
391 if(gStyle->GetOptFit() != 0) {
394 if(gROOT->GetEditHistograms()) {
398 fToolsMenu =
new TGPopupMenu(fClient->GetDefaultRoot());
406 fHelpMenu =
new TGPopupMenu(fClient->GetDefaultRoot());
430 fMenuBarLayout =
new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX, 0, 0, 1, 1);
435 fMenuBar =
new TGMenuBar(
this, 1, 1, kHorizontalFrame);
466 fMainFrame =
new TGCompositeFrame(
this, GetWidth() + 4, GetHeight() + 4, kHorizontalFrame);
471 fEditorLayout =
new TGLayoutHints(kLHintsExpandY | kLHintsLeft);
479 if(fCanvas->UseGL()) {
480 fCanvas->SetSupportGL(kFALSE);
482 if(gGLManager ==
nullptr) {
483 TString osString =
"win32";
484 if(gVirtualX->InheritsFrom(
"TGX11")) {
486 }
else if(gVirtualX->InheritsFrom(
"TGCocoa")) {
489 TPluginHandler* pluginHandler = gROOT->GetPluginManager()->FindHandler(
"TGLManager", osString);
491 if(pluginHandler !=
nullptr && pluginHandler->LoadPlugin() != -1) {
492 if(pluginHandler->ExecPlugin(0) == 0) {
493 Error(
"CreateCanvas",
"GL manager plugin failed");
500 const Int_t glCtx = gGLManager->CreateGLContext(
fCanvasID);
502 fCanvas->SetSupportGL(kTRUE);
503 fCanvas->SetGLDevice(glCtx);
505 Error(
"CreateCanvas",
"GL context creation failed.");
508 Error(
"CreateCanvas",
"GL window creation failed\n");
517 Window_t win = gVirtualX->GetWindowID(
fCanvasID);
520 fCanvasLayout =
new TGLayoutHints(kLHintsExpandX | kLHintsExpandY | kLHintsRight);
528 fCanvas->Connect(
"ProcessedEvent(Int_t, Int_t, Int_t, TObject*)",
"GRootCanvas",
this,
529 "EventInfo(Int_t, Int_t, Int_t, TObject*)");
532 std::array<int, 4> parts = {33, 10, 10, 47};
534 fStatusBar->SetParts(parts.data(), parts.size());
536 fStatusBarLayout =
new TGLayoutHints(kLHintsBottom | kLHintsLeft | kLHintsExpandX, 2, 2, 1, 1);
543 fIconPic = SetIconPixmap(
"macro_s.xpm");
544 SetClassHints(
"ROOT",
"Canvas");
546 SetEditDisabled(kEditDisable);
559 Resize(GetDefaultSize());
561 gVirtualX->SetDNDAware(fId, fDNDTypeList);
579 Disconnect(
fToolDock,
"Docked()",
this,
"AdjustSize()");
580 Disconnect(
fToolDock,
"Undocked()",
this,
"AdjustSize()");
585 if(MustCleanup() == 0) {
625 TVirtualPadEditor* gged = TVirtualPadEditor::GetPadEditor(kFALSE);
626 if((gged !=
nullptr) && gged->GetCanvas() == fCanvas) {
628 static_cast<TGedEditor*
>(gged)->SetModel(
nullptr,
nullptr, kButton1Down);
629 static_cast<TGedEditor*
>(gged)->SetCanvas(
nullptr);
635 gVirtualX->CloseWindow();
643 TVirtualPadEditor* gged = TVirtualPadEditor::GetPadEditor(kFALSE);
644 if((gged !=
nullptr) && gged->GetCanvas() == fCanvas) {
646 static_cast<TGedEditor*
>(gged)->SetModel(
nullptr,
nullptr, kButton1Down);
647 static_cast<TGedEditor*
>(gged)->SetCanvas(
nullptr);
654 Disconnect(fCanvas,
"ProcessedEvent(Int_t, Int_t, Int_t, TObject*)",
this,
655 "EventInfo(Int_t, Int_t, Int_t, TObject*)");
657 TVirtualPad* savepad = gPad;
659 gInterpreter->DeleteGlobal(fCanvas);
694 gVirtualX->GetWindowSize(fId, x, y, w, h);
696 Window_t childdum = 0;
697 gVirtualX->TranslateCoordinates(fId, gClient->GetDefaultRoot()->GetId(), 0, 0, x, y, childdum);
698 if(!fCanvas->GetShowEditor()) {
717 switch(GET_MSG(msg)) {
721 switch(GET_SUBMSG(msg)) {
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;
742 case kToolLatex: gROOT->SetEditorMode(
"Text");
break;
743 case kToolMarker: gROOT->SetEditorMode(
"Marker");
break;
745 gROOT->SetEditorMode(
"CutG");
750 gROOT->MakeDefCanvas();
754 static TString dir(
".");
757 fileInfo.fIniDir = StrDup(dir);
758 new TGFileDialog(fClient->GetDefaultRoot(),
this, kFDOpen, &fileInfo);
759 if(fileInfo.fFilename ==
nullptr) {
762 dir = fileInfo.fIniDir;
763 new TFile(fileInfo.fFilename,
"update");
766 TString workdir = gSystem->WorkingDirectory();
767 static TString dir(
".");
768 static Int_t typeidx = 0;
769 static Bool_t overwr = kFALSE;
771 TString defaultType = gEnv->GetValue(
"Canvas.SaveAsDefaultType",
".pdf");
775 if(ftype.EndsWith(defaultType.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) {
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;
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")) {
802 }
else if(fn.EndsWith(
".C")) {
803 fCanvas->SaveSource(fn);
806 if(ft.Index(
".") != kNPOS) {
807 fn += ft(ft.Index(
"."), ft.Length());
808 appendedType = kTRUE;
812 Warning(
"ProcessMessage",
"file %s cannot be saved with this extension", fileInfo.fFilename);
816 ftype.ReplaceAll(
"*.",
".");
817 if(fn.EndsWith(ftype.Data())) {
834 if(!gApplication->ReturnFromRun()) {
835 if((TVirtualPadEditor::GetPadEditor(kFALSE) !=
nullptr)) {
836 TVirtualPadEditor::Terminate();
840 if(TVirtualPadEditor::GetPadEditor(kFALSE) !=
nullptr) {
841 TVirtualPadEditor::Terminate();
843 if(TClass::GetClass(
"TStyleManager") !=
nullptr) {
844 gROOT->ProcessLine(
"TStyleManager::Terminate()");
846 gApplication->Terminate(0);
851 if(TClass::GetClass(
"TStyleManager") ==
nullptr) {
852 gSystem->Load(
"libGed");
854 gROOT->ProcessLine(
"TStyleManager::Show()");
888 TVirtualPad* padsav = gPad->GetCanvas();
893 auto* wheel =
new TColorWheel();
901 if(padsav !=
nullptr) {
909 TVirtualPad* padsav = gPad->GetCanvas();
910 auto* m =
new GCanvas(
"markers",
"Marker Types", 600, 200);
911 TMarker::DisplayMarkerTypes();
913 if(padsav !=
nullptr) {
918 case kViewX3D: gPad->GetViewer3D(
"x3d");
break;
920 gPad->GetViewer3D(
"ogl");
925 fCanvas->ToggleAutoExec();
926 if(fCanvas->GetAutoExec()) {
952 if(fCanvas->OpaqueMoving()) {
953 fCanvas->MoveOpaque(0);
956 fCanvas->MoveOpaque(1);
961 if(fCanvas->OpaqueResizing()) {
962 fCanvas->ResizeOpaque(0);
965 fCanvas->ResizeOpaque(1);
975 if(gStyle->GetOptStat() != 0) {
976 gStyle->SetOptStat(0);
977 delete gPad->FindObject(
"stats");
980 gStyle->SetOptStat(1);
987 if(gStyle->GetOptTitle() != 0) {
988 gStyle->SetOptTitle(0);
989 delete gPad->FindObject(
"title");
992 gStyle->SetOptTitle(1);
999 if(gStyle->GetOptFit() != 0) {
1000 gStyle->SetOptFit(0);
1003 gStyle->SetOptFit(1);
1010 if(gROOT->GetEditHistograms()) {
1011 gROOT->SetEditHistograms(kFALSE);
1014 gROOT->SetEditHistograms(kTRUE);
1028 gROOT->ProcessLine(
"new TGRecorder()");
1034 auto* canvasList =
static_cast<TList*
>(gROOT->GetListOfCanvases());
1035 if(canvasList->FindObject(
"ClassTree") !=
nullptr) {
1036 cdef = TString::Format(
"ClassTree_%d", canvasList->GetSize() + 1);
1040 new TClassTree(cdef.Data(),
"TObject");
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");
1052 Error(
"FitPanel",
"Unable to find the FitPanel plug-in");
1063 rootx = gSystem->Getenv(
"ROOTSYS");
1064 if(!rootx.IsNull()) {
1068 rootx +=
"/root -a &";
1069 gSystem->Exec(rootx);
1072 new TWin32SplashThread(kTRUE);
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();
1084 auto* helperDialog =
new TRootHelpDialog(
this,
"Help on Canvas...", 600, 400);
1085 helperDialog->SetText(gHelpCanvas);
1086 helperDialog->Popup();
1090 auto* helperDialog =
new TRootHelpDialog(
this,
"Help on Menus...", 600, 400);
1091 helperDialog->SetText(gHelpPullDownMenus);
1092 helperDialog->Popup();
1096 auto* helperDialog =
new TRootHelpDialog(
this,
"Help on Graphics Editor...", 600, 400);
1097 helperDialog->SetText(gHelpGraphicsEditor);
1098 helperDialog->Popup();
1102 auto* helperDialog =
new TRootHelpDialog(
this,
"Help on Browser...", 600, 400);
1103 helperDialog->SetText(gHelpBrowser);
1104 helperDialog->Popup();
1108 auto* helperDialog =
new TRootHelpDialog(
this,
"Help on Objects...", 600, 400);
1109 helperDialog->SetText(gHelpObjects);
1110 helperDialog->Popup();
1114 auto* helperDialog =
new TRootHelpDialog(
this,
"Help on PostScript...", 600, 400);
1115 helperDialog->SetText(gHelpPostscript);
1116 helperDialog->Popup();
1132 if(fCanvas->OpaqueMoving()) {
1135 if(fCanvas->OpaqueResizing()) {
1176 if(gThreadXAR ==
nullptr) {
1177 gSystem->ProcessEvents();
1179 gSystem->ProcessEvents();
1188 gVirtualX->RaiseWindow(GetId());
1196 SetWindowName(title);
1198 fToolDock->SetWindowName(Form(
"ToolBar: %s", title));
1208 unsigned int oopt = opt;
1224 Bool_t pname = kTRUE;
1225 char* printer =
nullptr;
1226 char* printCmd =
nullptr;
1227 static TString sprinter;
1228 static TString sprintCmd;
1230 if(sprinter ==
"") {
1231 printer = StrDup(gEnv->GetValue(
"Print.Printer",
""));
1233 printer = StrDup(sprinter);
1235 if(sprintCmd ==
"") {
1237 printCmd = StrDup(gEnv->GetValue(
"Print.Command",
""));
1239 printCmd = StrDup(gEnv->GetValue(
"Print.Command",
"start AcroRd32.exe /p"));
1242 printCmd = StrDup(sprintCmd);
1245 new TGPrintDialog(fClient->GetDefaultRoot(),
this, 400, 150, &printer, &printCmd, &ret);
1248 sprintCmd = printCmd;
1250 if(sprinter ==
"") {
1254 TString fn =
"rootprint";
1255 FILE* f = gSystem->TempFileName(fn, gEnv->GetValue(
"Print.Directory", gSystem->TempDirectory()));
1259 fn += TString::Format(
".%s", gEnv->GetValue(
"Print.FileType",
"pdf"));
1262 TString cmd = sprintCmd;
1263 if(cmd.Contains(
"%p")) {
1264 cmd.ReplaceAll(
"%p", sprinter);
1271 if(cmd.Contains(
"%f")) {
1272 cmd.ReplaceAll(
"%f", fn);
1281 gSystem->Unlink(fn);
1294 if(!fCanvas->GetShowToolTips() || selected ==
nullptr || event != kMouseMotion ||
fButton != 0) {
1298 TString objInfo = selected->GetObjectInfo(px, py);
1299 if(objInfo.BeginsWith(
"-")) {
1301 objInfo.Remove(TString::kLeading,
'-');
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());
1309 tipInfo += TString::Format(
"\n%d, %d", px, py);
1310 if(!objInfo.IsNull()) {
1311 tipInfo += TString::Format(
"\n%s", objInfo.Data());
1315 fToolTip->SetPosition(px + 15, py + 15);
1336 UInt_t dh = fClient->GetDisplayHeight();
1337 UInt_t ch = fCanvas->GetWindowHeight();
1339 UInt_t h = GetHeight();
1359 Resize(GetWidth(), h);
1367 TVirtualPad* savedPad =
nullptr;
1371 UInt_t w = GetWidth();
1373 UInt_t h = GetHeight();
1376 if((fParent !=
nullptr) && fParent != fClient->GetDefaultRoot()) {
1377 const auto*
main =
static_cast<const TGMainFrame*
>(fParent->GetMainFrame());
1379 if((
main !=
nullptr) &&
main->InheritsFrom(
"TRootBrowser")) {
1380 auto* browser =
const_cast<TRootBrowser*
>(
static_cast<const TRootBrowser*
>(
main));
1382 browser->GetTabRight()->Connect(
"Selected(Int_t)",
"GRootCanvas",
this,
"Activated(Int_t)");
1385 if(show && ((
fEditor ==
nullptr) || !
static_cast<TGedEditor*
>(
fEditor)->IsMapped())) {
1386 if(browser->GetTabLeft()->GetTabTab(
"Pad Editor") ==
nullptr) {
1387 browser->StartEmbedding(TRootBrowser::kLeft);
1389 fEditor = TVirtualPadEditor::GetPadEditor(kTRUE);
1391 static_cast<TGedEditor*
>(
fEditor)->ReparentWindow(fClient->GetRoot());
1392 static_cast<TGedEditor*
>(
fEditor)->MapWindow();
1394 browser->StopEmbedding(
"Pad Editor");
1396 gROOT->GetListOfCleanups()->Remove(
static_cast<TGedEditor*
>(
fEditor));
1398 static_cast<TGedEditor*
>(
fEditor)->SetCanvas(fCanvas);
1399 static_cast<TGedEditor*
>(
fEditor)->SetModel(fCanvas, fCanvas, kButton1Down);
1402 fEditor = TVirtualPadEditor::GetPadEditor(kFALSE);
1405 browser->GetTabLeft()->SetTab(
"Pad Editor");
1413 TVirtualPadEditor* gged = TVirtualPadEditor::GetPadEditor(kFALSE);
1414 if((gged !=
nullptr) && gged->GetCanvas() == fCanvas) {
1439 if(savedPad !=
nullptr) {
1453 Int_t show = gEnv->GetValue(
"Canvas.ShowEditor", 0);
1454 gEnv->SetValue(
"Canvas.ShowEditor",
"true");
1455 fEditor = TVirtualPadEditor::LoadEditor();
1464 gEnv->SetValue(
"Canvas.ShowEditor",
"false");
1473 if(show && (
fToolBar ==
nullptr)) {
1479 for(Int_t i = 0;
gToolBarData[i].fPixmap !=
nullptr; i++) {
1489 fVertical1Layout =
new TGLayoutHints(kLHintsLeft | kLHintsExpandY, 4, 2, 0, 0);
1495 for(Int_t i = 0;
gToolBarData1[i].fPixmap !=
nullptr; i++) {
1505 fToolDock->SetWindowName(Form(
"ToolBar: %s", GetWindowName()));
1506 fToolDock->Connect(
"Docked()",
"GRootCanvas",
this,
"AdjustSize()");
1507 fToolDock->Connect(
"Undocked()",
"GRootCanvas",
this,
"AdjustSize()");
1514 UInt_t h = GetHeight();
1544 Resize(GetWidth(), h);
1596 return ((fCanvas) !=
nullptr) && fCanvas->GetShowToolTips();
1604 UInt_t h = GetHeight();
1623 Resize(GetWidth(), h);
1631 UInt_t button =
event->fCode;
1632 Int_t x =
event->fX;
1633 Int_t y =
event->fY;
1635 if(event->fType == kButtonPress) {
1636 if((
fToolTip !=
nullptr) && fCanvas->GetShowToolTips()) {
1638 gVirtualX->UpdateWindow(0);
1639 gSystem->ProcessEvents();
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) {
1648 (
static_cast<GCanvas*
>(fCanvas))->HandleInput(kButton1Down, x, y);
1651 if(button == kButton2) {
1652 (
static_cast<GCanvas*
>(fCanvas))->HandleInput(kButton2Down, x, y);
1654 if(button == kButton3) {
1655 (
static_cast<GCanvas*
>(fCanvas))->HandleInput(kButton3Down, x, y);
1659 }
else if(event->fType == kButtonRelease) {
1660 if(button == kButton4) {
1661 (
static_cast<GCanvas*
>(fCanvas))->HandleInput(kWheelUp, x, y);
1663 if(button == kButton5) {
1664 (
static_cast<GCanvas*
>(fCanvas))->HandleInput(kWheelDown, x, y);
1666 if(button == kButton1) {
1667 (
static_cast<GCanvas*
>(fCanvas))->HandleInput(kButton1Up, x, y);
1669 if(button == kButton2) {
1670 (
static_cast<GCanvas*
>(fCanvas))->HandleInput(kButton2Up, x, y);
1672 if(button == kButton3) {
1673 (
static_cast<GCanvas*
>(fCanvas))->HandleInput(kButton3Up, x, y);
1687 UInt_t button =
event->fCode;
1688 Int_t x =
event->fX;
1689 Int_t y =
event->fY;
1691 if(button == kButton1) {
1692 (
static_cast<GCanvas*
>(fCanvas))->HandleInput(kButton1Double, x, y);
1694 if(button == kButton2) {
1695 (
static_cast<GCanvas*
>(fCanvas))->HandleInput(kButton2Double, x, y);
1697 if(button == kButton3) {
1698 (
static_cast<GCanvas*
>(fCanvas))->HandleInput(kButton3Double, x, y);
1713 if(fCanvas->HasFixedAspectRatio()) {
1715 static UInt_t dh = 0;
1719 UInt_t h = TMath::Nint(
fCanvasContainer->GetWidth() / fCanvas->GetAspectRatio()) + dh;
1738 static EGEventType previous_event = kOtherEvent;
1739 static UInt_t previous_keysym = 0;
1742 std::array<char, 2> str;
1743 gVirtualX->LookupString(event, str.data(), str.size(), keysym);
1745 if(event->fType == kGKeyPress) {
1748 if(str[0] == kESC) {
1750 static_cast<GCanvas*
>(fCanvas)->HandleInput(kButton1Up, 0, 0);
1751 static_cast<GCanvas*
>(fCanvas)->HandleInput(kMouseMotion, 0, 0);
1756 gROOT->SetInterrupt();
1760 if(keysym > 0x1011 && keysym < 0x1016) {
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);
1777 if((previous_keysym == keysym) && (previous_event == kGKeyPress)) {
1795 previous_keysym = keysym;
1797 static_cast<GCanvas*
>(fCanvas)->HandleInput(kKeyPress, str[0], keysym);
1799 }
else if(event->fType == kKeyRelease) {
1800 if(keysym > 0x1011 && keysym < 0x1016) {
1809 wid = gVirtualX->GetDefaultRootWindow();
1810 gVirtualX->QueryPointer(wid, dum1, dum2, mx, my, mx, my, mask);
1812 auto* gCanvas =
static_cast<GCanvas*
>(gPad->GetCanvas());
1814 gVirtualX->TranslateCoordinates(gClient->GetDefaultRoot()->GetId(),
fCanvasContainer->GetId(), mx, my, tx, ty,
1817 previous_keysym = keysym;
1819 auto* gCanvas =
static_cast<GCanvas*
>(gPad->GetCanvas());
1825 previous_event =
event->fType;
1834 Int_t x =
event->fX;
1835 Int_t y =
event->fY;
1838 static_cast<GCanvas*
>(fCanvas)->HandleInput(kMouseMotion, x, y);
1841 if((event->fState & kKeyShiftMask) != 0u) {
1842 static_cast<GCanvas*
>(fCanvas)->HandleInput(
static_cast<EEventType
>(8), x, y);
1844 static_cast<GCanvas*
>(fCanvas)->HandleInput(kButton1Motion, x, y);
1848 static_cast<GCanvas*
>(fCanvas)->HandleInput(kButton2Motion, x, y);
1859 if(event->fCount == 0) {
1871 Int_t x =
event->fX;
1872 Int_t y =
event->fY;
1876 if(event->fType == kLeaveNotify && event->fCode == kNotifyNormal) {
1877 (
static_cast<GCanvas*
>(fCanvas))->HandleInput(kMouseLeave, x, y);
1888 static Atom_t rootObj = gVirtualX->InternAtom(
"application/root", kFALSE);
1889 static Atom_t uriObj = gVirtualX->InternAtom(
"text/uri-list", kFALSE);
1891 if(data->fDataType == rootObj) {
1892 TBufferFile buf(TBuffer::kRead, data->fDataLength, data->fData);
1894 auto* obj =
reinterpret_cast<TObject*
>(buf.ReadObjectAny(TObject::Class()));
1895 if(obj ==
nullptr) {
1899 if(obj->InheritsFrom(
"TKey")) {
1900 auto*
object =
reinterpret_cast<TObject*
>(gROOT->ProcessLine(Form(
"((TKey *)0x%lx)->ReadObj();",
reinterpret_cast<ULong_t
>(obj))));
1901 if(
object ==
nullptr) {
1904 if(object->InheritsFrom(
"TGraph")) {
1905 object->Draw(
"ALP");
1906 }
else if(object->InheritsFrom(
"TImage")) {
1908 }
else if(object->IsA()->GetMethodAllAny(
"Draw") !=
nullptr) {
1911 }
else if(obj->InheritsFrom(
"TGraph")) {
1913 }
else if(obj->IsA()->GetMethodAllAny(
"Draw") !=
nullptr) {
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) {
1931 img->SetEditable(kTRUE);
1946 TPad* pad = fCanvas->Pick(x, y,
nullptr);
1947 if(pad !=
nullptr) {
1949 gROOT->SetSelectedPad(pad);
1961 static Atom_t rootObj = gVirtualX->InternAtom(
"application/root", kFALSE);
1962 static Atom_t uriObj = gVirtualX->InternAtom(
"text/uri-list", kFALSE);
1964 for(
int i = 0; typelist[i] != kNone; ++i) {
1965 if(typelist[i] == rootObj) {
1968 if(typelist[i] == uriObj) {
1990 auto* sender =
reinterpret_cast<TGTab*
>(gTQSender);
1991 if(sender !=
nullptr) {
1992 TGCompositeFrame* cont = sender->GetTabContainer(
id);
1993 if(cont == fParent) {
1995 fEditor = TVirtualPadEditor::GetPadEditor(kFALSE);
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);
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;
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
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