21 #include "RConfigure.h"
78 enum ERootCanvasCommands {
162 static const char *gOpenTypes[] = {
"ROOT files",
"*.root",
166 static const char *gSaveAsTypes[] = {
"PDF",
"*.pdf",
167 "PostScript",
"*.ps",
168 "Encapsulated PostScript",
"*.eps",
172 "ROOT macros",
"*.C",
173 "ROOT files",
"*.root",
183 static ToolBarData_t gToolBarData[] = {
185 {
"newcanvas.xpm",
"New", kFALSE, kFileNewCanvas, 0 },
186 {
"open.xpm",
"Open", kFALSE, kFileOpen, 0 },
187 {
"save.xpm",
"Save As", kFALSE, kFileSaveAs, 0 },
188 {
"printer.xpm",
"Print", kFALSE, kFilePrint, 0 },
189 {
"",
"", kFALSE, -1, 0 },
190 {
"interrupt.xpm",
"Interrupt", kFALSE, kOptionInterrupt,0 },
191 {
"refresh2.xpm",
"Refresh", kFALSE, kOptionRefresh, 0 },
192 {
"",
"", kFALSE, -1, 0 },
193 {
"inspect.xpm",
"Inspect", kFALSE, kInspectRoot, 0 },
194 {
"browser.xpm",
"Browser", kFALSE, kToolsBrowser, 0 },
195 { 0, 0, kFALSE, 0, 0 }
198 static ToolBarData_t gToolBarData1[] = {
199 {
"pointer.xpm",
"Modify", kFALSE, kToolModify, 0 },
200 {
"arc.xpm",
"Arc", kFALSE, kToolArc, 0 },
201 {
"line.xpm",
"Line", kFALSE, kToolLine, 0 },
202 {
"arrow.xpm",
"Arrow", kFALSE, kToolArrow, 0 },
203 {
"diamond.xpm",
"Diamond", kFALSE, kToolDiamond, 0 },
204 {
"ellipse.xpm",
"Ellipse", kFALSE, kToolEllipse, 0 },
205 {
"pad.xpm",
"Pad", kFALSE, kToolPad, 0 },
206 {
"pave.xpm",
"Pave", kFALSE, kToolPave, 0 },
207 {
"pavelabel.xpm",
"Pave Label", kFALSE, kToolPLabel, 0 },
208 {
"pavetext.xpm",
"Pave Text", kFALSE, kToolPText, 0 },
209 {
"pavestext.xpm",
"Paves Text", kFALSE, kToolPsText, 0 },
210 {
"graph.xpm",
"Graph", kFALSE, kToolGraph, 0 },
211 {
"curlyline.xpm",
"Curly Line", kFALSE, kToolCurlyLine, 0 },
212 {
"curlyarc.xpm",
"Curly Arc", kFALSE, kToolCurlyArc, 0 },
213 {
"latex.xpm",
"Text/Latex", kFALSE, kToolLatex, 0 },
214 {
"marker.xpm",
"Marker", kFALSE, kToolMarker, 0 },
215 {
"cut.xpm",
"Graphical Cut", kFALSE, kToolCutG, 0 },
216 { 0, 0, kFALSE, 0, 0 }
230 class TRootContainer :
public TGCompositeFrame {
232 TRootCanvas *fCanvas;
234 TRootContainer(TRootCanvas *c, Window_t
id,
const TGWindow *parent);
236 Bool_t HandleButton(Event_t *ev);
237 Bool_t HandleDoubleClick(Event_t *ev)
238 {
return fCanvas->HandleContainerDoubleClick(ev); }
239 Bool_t HandleConfigureNotify(Event_t *ev)
240 { TGFrame::HandleConfigureNotify(ev);
241 return fCanvas->HandleContainerConfigure(ev); }
242 Bool_t HandleKey(Event_t *ev)
243 {
return fCanvas->HandleContainerKey(ev); }
244 Bool_t HandleMotion(Event_t *ev)
245 {
return fCanvas->HandleContainerMotion(ev); }
246 Bool_t HandleExpose(Event_t *ev)
247 {
return fCanvas->HandleContainerExpose(ev); }
248 Bool_t HandleCrossing(Event_t *ev)
249 {
return fCanvas->HandleContainerCrossing(ev); }
250 void SavePrimitive(std::ostream &out, Option_t * =
"");
251 void SetEditable(Bool_t) { }
257 TRootContainer::TRootContainer(TRootCanvas *c, Window_t
id,
const TGWindow *p)
258 : TGCompositeFrame(gClient, id, p)
262 gVirtualX->GrabButton(fId, kAnyButton, kAnyModifier,
263 kButtonPressMask | kButtonReleaseMask |
264 kPointerMotionMask, kNone, kNone);
266 AddInput(kKeyPressMask | kKeyReleaseMask | kPointerMotionMask |
267 kExposureMask | kStructureNotifyMask | kLeaveWindowMask);
268 fEditDisabled = kEditDisable;
275 Bool_t TRootContainer::HandleButton(Event_t *event)
277 TGViewPort *vp = (TGViewPort*)fParent;
278 UInt_t page = vp->GetHeight()/4;
281 gVirtualX->SetInputFocus(GetMainFrame()->GetId());
283 if (event->fCode == kButton4) {
285 newpos = fCanvas->fCanvasWindow->GetVsbPosition() - page;
286 if (newpos < 0) newpos = 0;
287 fCanvas->fCanvasWindow->SetVsbPosition(newpos);
290 if (event->fCode == kButton5) {
292 newpos = fCanvas->fCanvasWindow->GetVsbPosition() + page;
293 fCanvas->fCanvasWindow->SetVsbPosition(newpos);
296 return fCanvas->HandleContainerButton(event);
299 ClassImp(TRootCanvas);
304 TRootCanvas::TRootCanvas(TCanvas *c,
const char *name, UInt_t width, UInt_t height)
305 : TGMainFrame(gClient->GetRoot(), width, height), TCanvasImp(c)
312 Resize(width, height);
318 TRootCanvas::TRootCanvas(TCanvas *c,
const char *name, Int_t x, Int_t y, UInt_t width, UInt_t height)
319 : TGMainFrame(gClient->GetRoot(), width, height), TCanvasImp(c)
326 MoveResize(x, y, width, height);
333 void TRootCanvas::CreateCanvas(
const char *name)
341 fFileSaveMenu =
new TGPopupMenu(fClient->GetDefaultRoot());
342 fFileSaveMenu->AddEntry(Form(
"%s.&ps", name), kFileSaveAsPS);
343 fFileSaveMenu->AddEntry(Form(
"%s.&eps", name), kFileSaveAsEPS);
344 fFileSaveMenu->AddEntry(Form(
"%s.p&df", name), kFileSaveAsPDF);
345 fFileSaveMenu->AddEntry(Form(
"%s.&tex", name), kFileSaveAsTEX);
346 fFileSaveMenu->AddEntry(Form(
"%s.&gif", name), kFileSaveAsGIF);
348 static Int_t img = 0;
351 Int_t sav = gErrorIgnoreLevel;
352 gErrorIgnoreLevel = kFatal;
353 TImage* itmp = TImage::Create();
359 gErrorIgnoreLevel = sav;
362 fFileSaveMenu->AddEntry(Form(
"%s.&jpg",name), kFileSaveAsJPG);
363 fFileSaveMenu->AddEntry(Form(
"%s.&png",name), kFileSaveAsPNG);
366 fFileSaveMenu->AddEntry(Form(
"%s.&C", name), kFileSaveAsC);
367 fFileSaveMenu->AddEntry(Form(
"%s.&root",name), kFileSaveAsRoot);
369 fFileMenu =
new TGPopupMenu(fClient->GetDefaultRoot());
370 fFileMenu->AddEntry(
"&New Canvas", kFileNewCanvas);
371 fFileMenu->AddEntry(
"&Open...", kFileOpen);
372 fFileMenu->AddEntry(
"&Close Canvas", kFileCloseCanvas);
373 fFileMenu->AddSeparator();
374 fFileMenu->AddPopup(
"&Save", fFileSaveMenu);
375 fFileMenu->AddEntry(
"Save &As...", kFileSaveAs);
376 fFileMenu->AddSeparator();
377 fFileMenu->AddEntry(
"&Print...", kFilePrint);
378 fFileMenu->AddSeparator();
379 fFileMenu->AddEntry(
"&Quit ROOT", kFileQuit);
381 fEditClearMenu =
new TGPopupMenu(fClient->GetDefaultRoot());
382 fEditClearMenu->AddEntry(
"&Pad", kEditClearPad);
383 fEditClearMenu->AddEntry(
"&Canvas", kEditClearCanvas);
385 fEditMenu =
new TGPopupMenu(fClient->GetDefaultRoot());
386 fEditMenu->AddEntry(
"&Style...", kEditStyle);
387 fEditMenu->AddSeparator();
388 fEditMenu->AddEntry(
"Cu&t", kEditCut);
389 fEditMenu->AddEntry(
"&Copy", kEditCopy);
390 fEditMenu->AddEntry(
"&Paste", kEditPaste);
391 fEditMenu->AddSeparator();
392 fEditMenu->AddPopup(
"C&lear", fEditClearMenu);
393 fEditMenu->AddSeparator();
394 fEditMenu->AddEntry(
"&Undo", kEditUndo);
395 fEditMenu->AddEntry(
"&Redo", kEditRedo);
397 fEditMenu->DisableEntry(kEditCut);
398 fEditMenu->DisableEntry(kEditCopy);
399 fEditMenu->DisableEntry(kEditPaste);
400 fEditMenu->DisableEntry(kEditUndo);
401 fEditMenu->DisableEntry(kEditRedo);
403 fViewWithMenu =
new TGPopupMenu(fClient->GetDefaultRoot());
404 fViewWithMenu->AddEntry(
"&X3D", kViewX3D);
405 fViewWithMenu->AddEntry(
"&OpenGL", kViewOpenGL);
407 fViewMenu =
new TGPopupMenu(fClient->GetDefaultRoot());
408 fViewMenu->AddEntry(
"&Editor", kViewEditor);
409 fViewMenu->AddEntry(
"&Toolbar", kViewToolbar);
410 fViewMenu->AddEntry(
"Event &Statusbar", kViewEventStatus);
411 fViewMenu->AddEntry(
"T&oolTip Info", kViewToolTips);
412 fViewMenu->AddSeparator();
413 fViewMenu->AddEntry(
"&Colors", kViewColors);
414 fViewMenu->AddEntry(
"&Fonts", kViewFonts);
415 fViewMenu->AddEntry(
"&Markers", kViewMarkers);
416 fViewMenu->AddSeparator();
417 fViewMenu->AddEntry(
"&Iconify", kViewIconify);
418 fViewMenu->AddSeparator();
419 fViewMenu->AddPopup(
"&View With", fViewWithMenu);
421 fViewMenu->DisableEntry(kViewFonts);
423 fOptionMenu =
new TGPopupMenu(fClient->GetDefaultRoot());
424 fOptionMenu->AddEntry(
"&Auto Resize Canvas", kOptionAutoResize);
425 fOptionMenu->AddEntry(
"&Resize Canvas", kOptionResizeCanvas);
426 fOptionMenu->AddEntry(
"&Move Opaque", kOptionMoveOpaque);
427 fOptionMenu->AddEntry(
"Resize &Opaque", kOptionResizeOpaque);
428 fOptionMenu->AddSeparator();
429 fOptionMenu->AddEntry(
"&Interrupt", kOptionInterrupt);
430 fOptionMenu->AddEntry(
"R&efresh", kOptionRefresh);
431 fOptionMenu->AddSeparator();
432 fOptionMenu->AddEntry(
"&Pad Auto Exec", kOptionAutoExec);
433 fOptionMenu->AddSeparator();
434 fOptionMenu->AddEntry(
"&Statistics", kOptionStatistics);
435 fOptionMenu->AddEntry(
"Histogram &Title", kOptionHistTitle);
436 fOptionMenu->AddEntry(
"&Fit Parameters", kOptionFitParams);
437 fOptionMenu->AddEntry(
"Can Edit &Histograms", kOptionCanEdit);
440 fOptionMenu->CheckEntry(kOptionAutoResize);
441 if (gStyle->GetOptStat())
442 fOptionMenu->CheckEntry(kOptionStatistics);
443 if (gStyle->GetOptTitle())
444 fOptionMenu->CheckEntry(kOptionHistTitle);
445 if (gStyle->GetOptFit())
446 fOptionMenu->CheckEntry(kOptionFitParams);
447 if (gROOT->GetEditHistograms())
448 fOptionMenu->CheckEntry(kOptionCanEdit);
450 fToolsMenu =
new TGPopupMenu(fClient->GetDefaultRoot());
451 fToolsMenu->AddEntry(
"&Inspect ROOT", kInspectRoot);
452 fToolsMenu->AddEntry(
"&Class Tree", kClassesTree);
453 fToolsMenu->AddEntry(
"&Fit Panel", kFitPanel);
454 fToolsMenu->AddEntry(
"&Start Browser", kToolsBrowser);
455 fToolsMenu->AddEntry(
"&Gui Builder", kToolsBuilder);
456 fToolsMenu->AddEntry(
"&Event Recorder", kToolsRecorder);
458 fHelpMenu =
new TGPopupMenu(fClient->GetDefaultRoot());
459 fHelpMenu->AddLabel(
"Basic Help On...");
460 fHelpMenu->AddSeparator();
461 fHelpMenu->AddEntry(
"&Canvas", kHelpOnCanvas);
462 fHelpMenu->AddEntry(
"&Menus", kHelpOnMenus);
463 fHelpMenu->AddEntry(
"&Graphics Editor", kHelpOnGraphicsEd);
464 fHelpMenu->AddEntry(
"&Browser", kHelpOnBrowser);
465 fHelpMenu->AddEntry(
"&Objects", kHelpOnObjects);
466 fHelpMenu->AddEntry(
"&PostScript", kHelpOnPS);
467 fHelpMenu->AddSeparator();
468 fHelpMenu->AddEntry(
"&About ROOT...", kHelpAbout);
471 fFileMenu->Associate(
this);
472 fFileSaveMenu->Associate(
this);
473 fEditMenu->Associate(
this);
474 fEditClearMenu->Associate(
this);
475 fViewMenu->Associate(
this);
476 fViewWithMenu->Associate(
this);
477 fOptionMenu->Associate(
this);
478 fToolsMenu->Associate(
this);
479 fHelpMenu->Associate(
this);
482 fMenuBarLayout =
new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX, 0, 0, 1, 1);
483 fMenuBarItemLayout =
new TGLayoutHints(kLHintsTop | kLHintsLeft, 0, 4, 0, 0);
484 fMenuBarHelpLayout =
new TGLayoutHints(kLHintsTop | kLHintsRight);
487 fMenuBar =
new TGMenuBar(
this, 1, 1, kHorizontalFrame);
488 fMenuBar->AddPopup(
"&File", fFileMenu, fMenuBarItemLayout);
489 fMenuBar->AddPopup(
"&Edit", fEditMenu, fMenuBarItemLayout);
490 fMenuBar->AddPopup(
"&View", fViewMenu, fMenuBarItemLayout);
491 fMenuBar->AddPopup(
"&Options", fOptionMenu, fMenuBarItemLayout);
492 fMenuBar->AddPopup(
"&Tools", fToolsMenu, fMenuBarItemLayout);
493 fMenuBar->AddPopup(
"&Help", fHelpMenu, fMenuBarHelpLayout);
495 AddFrame(fMenuBar, fMenuBarLayout);
497 fHorizontal1 =
new TGHorizontal3DLine(
this);
498 fHorizontal1Layout =
new TGLayoutHints(kLHintsTop | kLHintsExpandX);
499 AddFrame(fHorizontal1, fHorizontal1Layout);
502 fToolDock =
new TGDockableFrame(
this);
503 fToolDock->SetCleanup();
504 fToolDock->EnableHide(kFALSE);
505 AddFrame(fToolDock, fDockLayout =
new TGLayoutHints(kLHintsExpandX));
511 fVertical1Layout = 0;
512 fVertical2Layout = 0;
514 fToolBarSep =
new TGHorizontal3DLine(
this);
515 fToolBarLayout =
new TGLayoutHints(kLHintsTop | kLHintsExpandX);
516 AddFrame(fToolBarSep, fToolBarLayout);
518 fMainFrame =
new TGCompositeFrame(
this, GetWidth() + 4, GetHeight() + 4,
520 fMainFrameLayout =
new TGLayoutHints(kLHintsExpandX | kLHintsExpandY);
523 fEditorFrame =
new TGCompositeFrame(fMainFrame, 175, fMainFrame->GetHeight()+4, kFixedWidth);
524 fEditorLayout =
new TGLayoutHints(kLHintsExpandY | kLHintsLeft);
525 fMainFrame->AddFrame(fEditorFrame, fEditorLayout);
528 fCanvasWindow =
new TGCanvas(fMainFrame, GetWidth()+4, GetHeight()+4,
529 kSunkenFrame | kDoubleBorder);
533 if (fCanvas->UseGL()) {
534 fCanvas->SetSupportGL(kFALSE);
538 if (gVirtualX->InheritsFrom(
"TGX11"))
540 else if (gVirtualX->InheritsFrom(
"TGCocoa"))
543 TPluginHandler *ph = gROOT->GetPluginManager()->FindHandler(
"TGLManager", x);
545 if (ph && ph->LoadPlugin() != -1) {
546 if (!ph->ExecPlugin(0))
547 Error(
"CreateCanvas",
"GL manager plugin failed");
552 fCanvasID = gGLManager->InitGLWindow((ULong_t)fCanvasWindow->GetViewPort()->GetId());
553 if (fCanvasID != -1) {
555 const Int_t glCtx = gGLManager->CreateGLContext(fCanvasID);
557 fCanvas->SetSupportGL(kTRUE);
558 fCanvas->SetGLDevice(glCtx);
560 Error(
"CreateCanvas",
"GL context creation failed.");
562 Error(
"CreateCanvas",
"GL window creation failed\n");
567 fCanvasID = gVirtualX->InitWindow((ULong_t)fCanvasWindow->GetViewPort()->GetId());
569 Window_t win = gVirtualX->GetWindowID(fCanvasID);
570 fCanvasContainer =
new TRootContainer(
this, win, fCanvasWindow->GetViewPort());
571 fCanvasWindow->SetContainer(fCanvasContainer);
572 fCanvasLayout =
new TGLayoutHints(kLHintsExpandX | kLHintsExpandY | kLHintsRight);
574 fMainFrame->AddFrame(fCanvasWindow, fCanvasLayout);
575 AddFrame(fMainFrame, fMainFrameLayout);
578 fToolTip =
new TGToolTip(fClient->GetDefaultRoot(), fCanvasWindow,
"", 250);
580 fCanvas->Connect(
"ProcessedEvent(Int_t, Int_t, Int_t, TObject*)",
582 "EventInfo(Int_t, Int_t, Int_t, TObject*)");
585 int parts[] = { 33, 10, 10, 47 };
586 fStatusBar =
new TGStatusBar(
this, 10, 10);
587 fStatusBar->SetParts(parts, 4);
589 fStatusBarLayout =
new TGLayoutHints(kLHintsBottom | kLHintsLeft | kLHintsExpandX, 2, 2, 1, 1);
591 AddFrame(fStatusBar, fStatusBarLayout);
596 fIconPic = SetIconPixmap(
"macro_s.xpm");
597 SetClassHints(
"ROOT",
"Canvas");
599 SetEditDisabled(kEditDisable);
603 HideFrame(fStatusBar);
604 HideFrame(fToolDock);
605 HideFrame(fToolBarSep);
606 HideFrame(fHorizontal1);
612 Resize(GetDefaultSize());
614 gVirtualX->SetDNDAware(fId, fDNDTypeList);
622 TRootCanvas::~TRootCanvas()
625 if (fIconPic) gClient->FreePicture(fIconPic);
626 if (fEditor && !fEmbedded)
delete fEditor;
628 Disconnect(fToolDock,
"Docked()",
this,
"AdjustSize()");
629 Disconnect(fToolDock,
"Undocked()",
this,
"AdjustSize()");
634 if (!MustCleanup()) {
636 delete fStatusBarLayout;
637 delete fCanvasContainer;
638 delete fCanvasWindow;
641 delete fEditorLayout;
643 delete fMainFrameLayout;
646 delete fToolBarLayout;
648 delete fHorizontal1Layout;
651 delete fMenuBarLayout;
652 delete fMenuBarItemLayout;
653 delete fMenuBarHelpLayout;
654 delete fCanvasLayout;
659 delete fFileSaveMenu;
661 delete fEditClearMenu;
663 delete fViewWithMenu;
672 void TRootCanvas::Close()
674 TVirtualPadEditor* gged = TVirtualPadEditor::GetPadEditor(kFALSE);
675 if(gged && gged->GetCanvas() == fCanvas) {
677 ((TGedEditor *)gged)->SetModel(0, 0, kButton1Down);
678 ((TGedEditor *)gged)->SetCanvas(0);
683 gVirtualX->CloseWindow();
689 void TRootCanvas::ReallyDelete()
691 TVirtualPadEditor* gged = TVirtualPadEditor::GetPadEditor(kFALSE);
692 if(gged && gged->GetCanvas() == fCanvas) {
694 ((TGedEditor *)gged)->SetModel(0, 0, kButton1Down);
695 ((TGedEditor *)gged)->SetCanvas(0);
701 Disconnect(fCanvas,
"ProcessedEvent(Int_t, Int_t, Int_t, TObject*)",
702 this,
"EventInfo(Int_t, Int_t, Int_t, TObject*)");
704 fCanvas->SetCanvasImp(0);
706 fCanvas->SetName(
"");
707 if (gPad && gPad->GetCanvas() == fCanvas)
715 void TRootCanvas::CloseWindow()
723 UInt_t TRootCanvas::GetCwidth()
const
725 return fCanvasContainer->GetWidth();
731 UInt_t TRootCanvas::GetCheight()
const
733 return fCanvasContainer->GetHeight();
740 UInt_t TRootCanvas::GetWindowGeometry(Int_t &x, Int_t &y, UInt_t &w, UInt_t &h)
742 gVirtualX->GetWindowSize(fId, x, y, w, h);
745 gVirtualX->TranslateCoordinates(fId, gClient->GetDefaultRoot()->GetId(),
746 0, 0, x, y, childdum);
747 if (!fCanvas->GetShowEditor())
return 0;
748 return fEditorFrame->GetWidth();
754 void TRootCanvas::SetStatusText(
const char *txt, Int_t partidx)
756 fStatusBar->SetText(txt, partidx);
762 Bool_t TRootCanvas::ProcessMessage(Long_t msg, Long_t parm1, Long_t)
767 switch (GET_MSG(msg)) {
771 switch (GET_SUBMSG(msg)) {
779 gROOT->SetEditorMode();
782 gROOT->SetEditorMode(
"Arc");
785 gROOT->SetEditorMode(
"Line");
788 gROOT->SetEditorMode(
"Arrow");
791 gROOT->SetEditorMode(
"Diamond");
794 gROOT->SetEditorMode(
"Ellipse");
797 gROOT->SetEditorMode(
"Pad");
800 gROOT->SetEditorMode(
"Pave");
803 gROOT->SetEditorMode(
"PaveLabel");
806 gROOT->SetEditorMode(
"PaveText");
809 gROOT->SetEditorMode(
"PavesText");
812 gROOT->SetEditorMode(
"PolyLine");
815 gROOT->SetEditorMode(
"CurlyLine");
818 gROOT->SetEditorMode(
"CurlyArc");
821 gROOT->SetEditorMode(
"Text");
824 gROOT->SetEditorMode(
"Marker");
827 gROOT->SetEditorMode(
"CutG");
832 gROOT->MakeDefCanvas();
836 static TString dir(
".");
838 fi.fFileTypes = gOpenTypes;
839 fi.fIniDir = StrDup(dir);
840 new TGFileDialog(fClient->GetDefaultRoot(),
this, kFDOpen,&fi);
841 if (!fi.fFilename)
return kTRUE;
843 new TFile(fi.fFilename,
"update");
848 TString workdir = gSystem->WorkingDirectory();
849 static TString dir(
".");
850 static Int_t typeidx = 0;
851 static Bool_t overwr = kFALSE;
853 TString defaultType = gEnv->GetValue(
"Canvas.SaveAsDefaultType",
".pdf");
855 for (
int i=1;gSaveAsTypes[i];i+=2) {
856 TString ftype = gSaveAsTypes[i];
857 if (ftype.EndsWith(defaultType.Data())) {
863 fi.fFileTypes = gSaveAsTypes;
864 fi.fIniDir = StrDup(dir);
865 fi.fFileTypeIdx = typeidx;
866 fi.fOverwrite = overwr;
867 new TGFileDialog(fClient->GetDefaultRoot(),
this, kFDSave, &fi);
868 gSystem->ChangeDirectory(workdir.Data());
869 if (!fi.fFilename)
return kTRUE;
870 Bool_t appendedType = kFALSE;
871 TString fn = fi.fFilename;
872 TString ft = fi.fFileTypes[fi.fFileTypeIdx+1];
874 typeidx = fi.fFileTypeIdx;
875 overwr = fi.fOverwrite;
877 if (fn.EndsWith(
".root") ||
878 fn.EndsWith(
".ps") ||
879 fn.EndsWith(
".eps") ||
880 fn.EndsWith(
".pdf") ||
881 fn.EndsWith(
".svg") ||
882 fn.EndsWith(
".tex") ||
883 fn.EndsWith(
".gif") ||
884 fn.EndsWith(
".xml") ||
885 fn.EndsWith(
".xpm") ||
886 fn.EndsWith(
".jpg") ||
887 fn.EndsWith(
".png") ||
888 fn.EndsWith(
".xcf") ||
889 fn.EndsWith(
".tiff")) {
891 }
else if (fn.EndsWith(
".C"))
892 fCanvas->SaveSource(fn);
895 if (ft.Index(
".") != kNPOS) {
896 fn += ft(ft.Index(
"."), ft.Length());
897 appendedType = kTRUE;
901 Warning(
"ProcessMessage",
"file %s cannot be saved with this extension", fi.fFilename);
903 for (
int i=1;gSaveAsTypes[i];i+=2) {
904 TString ftype = gSaveAsTypes[i];
905 ftype.ReplaceAll(
"*.",
".");
906 if (fn.EndsWith(ftype.Data())) {
913 case kFileSaveAsRoot:
914 fCanvas->SaveAs(
".root");
917 fCanvas->SaveSource();
923 fCanvas->SaveAs(
".eps");
926 fCanvas->SaveAs(
".pdf");
929 fCanvas->SaveAs(
".gif");
932 fCanvas->SaveAs(
".jpg");
935 fCanvas->SaveAs(
".png");
938 fCanvas->SaveAs(
".tex");
943 case kFileCloseCanvas:
947 if (!gApplication->ReturnFromRun()) {
948 if ((TVirtualPadEditor::GetPadEditor(kFALSE) != 0))
949 TVirtualPadEditor::Terminate();
952 if (TVirtualPadEditor::GetPadEditor(kFALSE) != 0)
953 TVirtualPadEditor::Terminate();
954 if (TClass::GetClass(
"TStyleManager"))
955 gROOT->ProcessLine(
"TStyleManager::Terminate()");
956 gApplication->Terminate(0);
961 if (!TClass::GetClass(
"TStyleManager"))
962 gSystem->Load(
"libGed");
963 gROOT->ProcessLine(
"TStyleManager::Show()");
985 case kEditClearCanvas:
993 fCanvas->ToggleEditor();
996 fCanvas->ToggleToolBar();
998 case kViewEventStatus:
999 fCanvas->ToggleEventStatus();
1002 fCanvas->ToggleToolTips();
1006 TVirtualPad *padsav = gPad->GetCanvas();
1011 TColorWheel *wheel =
new TColorWheel();
1019 if (padsav) padsav->cd();
1027 TVirtualPad *padsav = gPad->GetCanvas();
1028 TCanvas *m =
new TCanvas(
"markers",
"Marker Types",600,200);
1029 TMarker::DisplayMarkerTypes();
1031 if (padsav) padsav->cd();
1038 gPad->GetViewer3D(
"x3d");
1041 gPad->GetViewer3D(
"ogl");
1045 case kOptionAutoExec:
1046 fCanvas->ToggleAutoExec();
1047 if (fCanvas->GetAutoExec()) {
1048 fOptionMenu->CheckEntry(kOptionAutoExec);
1050 fOptionMenu->UnCheckEntry(kOptionAutoExec);
1053 case kOptionAutoResize:
1055 fAutoFit = fAutoFit ? kFALSE : kTRUE;
1056 int opt = fCanvasContainer->GetOptions();
1059 fOptionMenu->CheckEntry(kOptionAutoResize);
1062 fOptionMenu->UnCheckEntry(kOptionAutoResize);
1064 fCanvasContainer->ChangeOptions(opt);
1072 case kOptionResizeCanvas:
1075 case kOptionMoveOpaque:
1076 if (fCanvas->OpaqueMoving()) {
1077 fCanvas->MoveOpaque(0);
1078 fOptionMenu->UnCheckEntry(kOptionMoveOpaque);
1080 fCanvas->MoveOpaque(1);
1081 fOptionMenu->CheckEntry(kOptionMoveOpaque);
1084 case kOptionResizeOpaque:
1085 if (fCanvas->OpaqueResizing()) {
1086 fCanvas->ResizeOpaque(0);
1087 fOptionMenu->UnCheckEntry(kOptionResizeOpaque);
1089 fCanvas->ResizeOpaque(1);
1090 fOptionMenu->CheckEntry(kOptionResizeOpaque);
1093 case kOptionInterrupt:
1094 gROOT->SetInterrupt();
1096 case kOptionRefresh:
1100 case kOptionStatistics:
1101 if (gStyle->GetOptStat()) {
1102 gStyle->SetOptStat(0);
1103 delete gPad->FindObject(
"stats");
1104 fOptionMenu->UnCheckEntry(kOptionStatistics);
1106 gStyle->SetOptStat(1);
1107 fOptionMenu->CheckEntry(kOptionStatistics);
1112 case kOptionHistTitle:
1113 if (gStyle->GetOptTitle()) {
1114 gStyle->SetOptTitle(0);
1115 delete gPad->FindObject(
"title");
1116 fOptionMenu->UnCheckEntry(kOptionHistTitle);
1118 gStyle->SetOptTitle(1);
1119 fOptionMenu->CheckEntry(kOptionHistTitle);
1124 case kOptionFitParams:
1125 if (gStyle->GetOptFit()) {
1126 gStyle->SetOptFit(0);
1127 fOptionMenu->UnCheckEntry(kOptionFitParams);
1129 gStyle->SetOptFit(1);
1130 fOptionMenu->CheckEntry(kOptionFitParams);
1135 case kOptionCanEdit:
1136 if (gROOT->GetEditHistograms()) {
1137 gROOT->SetEditHistograms(kFALSE);
1138 fOptionMenu->UnCheckEntry(kOptionCanEdit);
1140 gROOT->SetEditHistograms(kTRUE);
1141 fOptionMenu->CheckEntry(kOptionCanEdit);
1152 new TBrowser(
"browser");
1155 TGuiBuilder::Instance();
1157 case kToolsRecorder:
1158 gROOT->ProcessLine(
"new TGRecorder()");
1165 lc = (TList*)gROOT->GetListOfCanvases();
1166 if (lc->FindObject(
"ClassTree")) {
1167 cdef = TString::Format(
"ClassTree_%d", lc->GetSize()+1);
1171 new TClassTree(cdef.Data(),
"TObject");
1179 TPluginHandler *handler = gROOT->GetPluginManager()->FindHandler(
"TFitEditor");
1180 if (handler && handler->LoadPlugin() != -1) {
1181 if (handler->ExecPlugin(2, fCanvas, 0) == 0)
1182 Error(
"FitPanel",
"Unable to crate the FitPanel");
1185 Error(
"FitPanel",
"Unable to find the FitPanel plug-in");
1193 TString rootx = TROOT::GetBinDir() +
"/root -a &";
1194 gSystem->Exec(rootx);
1197 new TWin32SplashThread(kTRUE);
1201 sprintf(str,
"About ROOT %s...", gROOT->GetVersion());
1202 hd =
new TRootHelpDialog(
this, str, 600, 400);
1203 hd->SetText(gHelpAbout);
1210 hd =
new TRootHelpDialog(
this,
"Help on Canvas...", 600, 400);
1211 hd->SetText(gHelpCanvas);
1215 hd =
new TRootHelpDialog(
this,
"Help on Menus...", 600, 400);
1216 hd->SetText(gHelpPullDownMenus);
1219 case kHelpOnGraphicsEd:
1220 hd =
new TRootHelpDialog(
this,
"Help on Graphics Editor...", 600, 400);
1221 hd->SetText(gHelpGraphicsEditor);
1224 case kHelpOnBrowser:
1225 hd =
new TRootHelpDialog(
this,
"Help on Browser...", 600, 400);
1226 hd->SetText(gHelpBrowser);
1229 case kHelpOnObjects:
1230 hd =
new TRootHelpDialog(
this,
"Help on Objects...", 600, 400);
1231 hd->SetText(gHelpObjects);
1235 hd =
new TRootHelpDialog(
this,
"Help on PostScript...", 600, 400);
1236 hd->SetText(gHelpPostscript);
1252 Int_t TRootCanvas::InitWindow()
1254 if (fCanvas->OpaqueMoving())
1255 fOptionMenu->CheckEntry(kOptionMoveOpaque);
1256 if (fCanvas->OpaqueResizing())
1257 fOptionMenu->CheckEntry(kOptionResizeOpaque);
1265 void TRootCanvas::SetCanvasSize(UInt_t w, UInt_t h)
1269 fOptionMenu->UnCheckEntry(kOptionAutoResize);
1270 int opt = fCanvasContainer->GetOptions();
1272 fCanvasContainer->ChangeOptions(opt);
1273 fCanvasContainer->SetWidth(w);
1274 fCanvasContainer->SetHeight(h);
1283 void TRootCanvas::SetWindowPosition(Int_t x, Int_t y)
1291 void TRootCanvas::SetWindowSize(UInt_t w, UInt_t h)
1296 gVirtualX->Update(1);
1298 gSystem->Sleep(100);
1299 gSystem->ProcessEvents();
1301 gSystem->ProcessEvents();
1308 void TRootCanvas::RaiseWindow()
1310 gVirtualX->RaiseWindow(GetId());
1316 void TRootCanvas::SetWindowTitle(
const char *title)
1318 SetWindowName(title);
1320 fToolDock->SetWindowName(Form(
"ToolBar: %s", title));
1326 void TRootCanvas::FitCanvas()
1329 int opt = fCanvasContainer->GetOptions();
1332 fCanvasContainer->ChangeOptions(opt);
1336 fCanvasContainer->ChangeOptions(oopt);
1343 void TRootCanvas::PrintCanvas()
1346 Bool_t pname = kTRUE;
1347 char *printer, *printCmd;
1348 static TString sprinter, sprintCmd;
1351 printer = StrDup(gEnv->GetValue(
"Print.Printer",
""));
1353 printer = StrDup(sprinter);
1354 if (sprintCmd ==
"")
1356 printCmd = StrDup(gEnv->GetValue(
"Print.Command",
""));
1358 printCmd = StrDup(gEnv->GetValue(
"Print.Command",
"start AcroRd32.exe /p"));
1361 printCmd = StrDup(sprintCmd);
1363 new TGPrintDialog(fClient->GetDefaultRoot(),
this, 400, 150,
1364 &printer, &printCmd, &ret);
1367 sprintCmd = printCmd;
1372 TString fn =
"rootprint";
1373 FILE *f = gSystem->TempFileName(fn, gEnv->GetValue(
"Print.Directory", gSystem->TempDirectory()));
1375 fn += TString::Format(
".%s",gEnv->GetValue(
"Print.FileType",
"pdf"));
1378 TString cmd = sprintCmd;
1379 if (cmd.Contains(
"%p"))
1380 cmd.ReplaceAll(
"%p", sprinter);
1382 cmd +=
" "; cmd += sprinter; cmd +=
" ";
1385 if (cmd.Contains(
"%f"))
1386 cmd.ReplaceAll(
"%f", fn);
1388 cmd +=
" "; cmd += fn; cmd +=
" ";
1393 gSystem->Unlink(fn);
1403 void TRootCanvas::EventInfo(Int_t event, Int_t px, Int_t py, TObject *selected)
1406 if (!fCanvas->GetShowToolTips() || selected == 0 ||
1407 event != kMouseMotion || fButton != 0)
1410 TString objInfo = selected->GetObjectInfo(px, py);
1411 if (objInfo.BeginsWith(
"-")) {
1413 objInfo.Remove(TString::kLeading,
'-');
1417 const char *title = selected->GetTitle();
1418 tipInfo += TString::Format(
"%s::%s", selected->ClassName(),
1419 selected->GetName());
1420 if (title && strlen(title))
1421 tipInfo += TString::Format(
"\n%s", selected->GetTitle());
1422 tipInfo += TString::Format(
"\n%d, %d", px, py);
1423 if (!objInfo.IsNull())
1424 tipInfo += TString::Format(
"\n%s", objInfo.Data());
1426 fToolTip->SetText(tipInfo.Data());
1427 fToolTip->SetPosition(px+15, py+15);
1434 void TRootCanvas::ShowMenuBar(Bool_t show)
1436 if (show) ShowFrame(fMenuBar);
1437 else HideFrame(fMenuBar);
1443 void TRootCanvas::ShowStatusBar(Bool_t show)
1445 UInt_t dh = fClient->GetDisplayHeight();
1446 UInt_t ch = fCanvas->GetWindowHeight();
1448 UInt_t h = GetHeight();
1449 UInt_t sh = fStatusBar->GetHeight()+2;
1452 ShowFrame(fStatusBar);
1453 fViewMenu->CheckEntry(kViewEventStatus);
1454 if (dh - ch >= sh) h = h + sh;
1457 HideFrame(fStatusBar);
1458 fViewMenu->UnCheckEntry(kViewEventStatus);
1459 if (dh - ch < sh) h = ch;
1462 Resize(GetWidth(), h);
1468 void TRootCanvas::ShowEditor(Bool_t show)
1470 TVirtualPad *savedPad = 0;
1471 savedPad = (TVirtualPad *) gPad;
1474 UInt_t w = GetWidth();
1475 UInt_t e = fEditorFrame->GetWidth();
1476 UInt_t h = GetHeight();
1477 UInt_t s = fHorizontal1->GetHeight();
1479 if (fParent && fParent != fClient->GetDefaultRoot()) {
1480 TGMainFrame *main = (TGMainFrame *)fParent->GetMainFrame();
1481 fMainFrame->HideFrame(fEditorFrame);
1482 if (main && main->InheritsFrom(
"TRootBrowser")) {
1483 TRootBrowser *browser = (TRootBrowser *)main;
1485 browser->GetTabRight()->Connect(
"Selected(Int_t)",
"TRootCanvas",
1486 this,
"Activated(Int_t)");
1488 if (show && (!fEditor || !((TGedEditor *)fEditor)->IsMapped())) {
1489 if (!browser->GetTabLeft()->GetTabTab(
"Pad Editor")) {
1490 if (browser->GetActFrame()) {
1491 TTimer::SingleShot(200,
"TRootCanvas",
this,
"ShowEditor(=kTRUE)");
1493 browser->StartEmbedding(TRootBrowser::kLeft);
1495 fEditor = TVirtualPadEditor::GetPadEditor(kTRUE);
1497 ((TGedEditor *)fEditor)->ReparentWindow(fClient->GetRoot());
1498 ((TGedEditor *)fEditor)->MapWindow();
1500 browser->StopEmbedding(
"Pad Editor");
1502 fEditor->SetGlobal(kFALSE);
1503 gROOT->GetListOfCleanups()->Remove((TGedEditor *)fEditor);
1504 ((TGedEditor *)fEditor)->SetCanvas(fCanvas);
1505 ((TGedEditor *)fEditor)->SetModel(fCanvas, fCanvas, kButton1Down);
1510 fEditor = TVirtualPadEditor::GetPadEditor(kFALSE);
1512 if (show) browser->GetTabLeft()->SetTab(
"Pad Editor");
1517 if (!fEditor) CreateEditor();
1518 TVirtualPadEditor* gged = TVirtualPadEditor::GetPadEditor(kFALSE);
1519 if(gged && gged->GetCanvas() == fCanvas){
1522 if (!fViewMenu->IsEntryChecked(kViewToolbar) || fToolDock->IsUndocked()) {
1523 ShowFrame(fHorizontal1);
1526 fMainFrame->ShowFrame(fEditorFrame);
1528 fViewMenu->CheckEntry(kViewEditor);
1531 if (!fViewMenu->IsEntryChecked(kViewToolbar) || fToolDock->IsUndocked()) {
1532 HideFrame(fHorizontal1);
1535 if (fEditor) fEditor->Hide();
1536 fMainFrame->HideFrame(fEditorFrame);
1537 fViewMenu->UnCheckEntry(kViewEditor);
1542 if (savedPad) gPad = savedPad;
1548 void TRootCanvas::CreateEditor()
1550 fEditorFrame->SetEditDisabled(kEditEnable);
1551 fEditorFrame->SetEditable();
1554 Int_t show = gEnv->GetValue(
"Canvas.ShowEditor", 0);
1555 gEnv->SetValue(
"Canvas.ShowEditor",
"true");
1556 fEditor = TVirtualPadEditor::LoadEditor();
1557 if (fEditor) fEditor->SetGlobal(kFALSE);
1558 fEditorFrame->SetEditable(kEditDisable);
1559 fEditorFrame->SetEditable(kFALSE);
1562 if (show == 0) gEnv->SetValue(
"Canvas.ShowEditor",
"false");
1568 void TRootCanvas::ShowToolBar(Bool_t show)
1570 if (show && !fToolBar) {
1572 fToolBar =
new TGToolBar(fToolDock, 60, 20, kHorizontalFrame);
1573 fToolDock->AddFrame(fToolBar, fHorizontal1Layout);
1575 Int_t spacing = 6, i;
1576 for (i = 0; gToolBarData[i].fPixmap; i++) {
1577 if (strlen(gToolBarData[i].fPixmap) == 0) {
1581 fToolBar->AddButton(
this, &gToolBarData[i], spacing);
1584 fVertical1 =
new TGVertical3DLine(fToolBar);
1585 fVertical2 =
new TGVertical3DLine(fToolBar);
1586 fVertical1Layout =
new TGLayoutHints(kLHintsLeft | kLHintsExpandY, 4,2,0,0);
1587 fVertical2Layout =
new TGLayoutHints(kLHintsLeft | kLHintsExpandY);
1588 fToolBar->AddFrame(fVertical1, fVertical1Layout);
1589 fToolBar->AddFrame(fVertical2, fVertical2Layout);
1592 for (i = 0; gToolBarData1[i].fPixmap; i++) {
1593 if (strlen(gToolBarData1[i].fPixmap) == 0) {
1597 fToolBar->AddButton(
this, &gToolBarData1[i], spacing);
1600 fToolDock->MapSubwindows();
1601 fToolDock->Layout();
1602 fToolDock->SetWindowName(Form(
"ToolBar: %s", GetWindowName()));
1603 fToolDock->Connect(
"Docked()",
"TRootCanvas",
this,
"AdjustSize()");
1604 fToolDock->Connect(
"Undocked()",
"TRootCanvas",
this,
"AdjustSize()");
1607 if (!fToolBar)
return;
1609 UInt_t h = GetHeight();
1610 UInt_t sh = fToolBarSep->GetHeight();
1611 UInt_t dh = fToolBar->GetHeight();
1614 ShowFrame(fToolDock);
1615 if (!fViewMenu->IsEntryChecked(kViewEditor)) {
1616 ShowFrame(fHorizontal1);
1619 ShowFrame(fToolBarSep);
1620 fViewMenu->CheckEntry(kViewToolbar);
1623 if (fToolDock->IsUndocked()) {
1624 fToolDock->DockContainer();
1628 HideFrame(fToolDock);
1629 if (!fViewMenu->IsEntryChecked(kViewEditor)) {
1630 HideFrame(fHorizontal1);
1633 HideFrame(fToolBarSep);
1635 fViewMenu->UnCheckEntry(kViewToolbar);
1637 Resize(GetWidth(), h);
1643 void TRootCanvas::ShowToolTips(Bool_t show)
1646 fViewMenu->CheckEntry(kViewToolTips);
1648 fViewMenu->UnCheckEntry(kViewToolTips);
1654 Bool_t TRootCanvas::HasEditor()
const
1656 return (fEditor) && fViewMenu->IsEntryChecked(kViewEditor);
1662 Bool_t TRootCanvas::HasMenuBar()
const
1664 return (fMenuBar) && fMenuBar->IsMapped();
1670 Bool_t TRootCanvas::HasStatusBar()
const
1672 return (fStatusBar) && fStatusBar->IsMapped();
1678 Bool_t TRootCanvas::HasToolBar()
const
1680 return (fToolBar) && fToolBar->IsMapped();
1686 Bool_t TRootCanvas::HasToolTips()
const
1688 return (fCanvas) && fCanvas->GetShowToolTips();
1694 void TRootCanvas::AdjustSize()
1696 UInt_t h = GetHeight();
1697 UInt_t dh = fToolBar->GetHeight();
1698 UInt_t sh = fHorizontal1->GetHeight();
1700 if (fToolDock->IsUndocked()) {
1701 if (!fViewMenu->IsEntryChecked(kViewEditor)) {
1702 HideFrame(fHorizontal1);
1705 HideFrame(fToolBarSep);
1708 if (!fViewMenu->IsEntryChecked(kViewEditor)) {
1709 ShowFrame(fHorizontal1);
1712 ShowFrame(fToolBarSep);
1715 Resize(GetWidth(), h);
1721 Bool_t TRootCanvas::HandleContainerButton(Event_t *event)
1723 Int_t button =
event->fCode;
1724 Int_t x =
event->fX;
1725 Int_t y =
event->fY;
1727 if (event->fType == kButtonPress) {
1728 if (fToolTip && fCanvas->GetShowToolTips()) {
1730 gVirtualX->UpdateWindow(0);
1731 gSystem->ProcessEvents();
1734 if (button == kButton1) {
1735 if (event->fState & kKeyShiftMask)
1736 fCanvas->HandleInput(kButton1Shift, x, y);
1738 fCanvas->HandleInput(kButton1Down, x, y);
1740 if (button == kButton2)
1741 fCanvas->HandleInput(kButton2Down, x, y);
1742 if (button == kButton3) {
1743 fCanvas->HandleInput(kButton3Down, x, y);
1747 }
else if (event->fType == kButtonRelease) {
1748 if (button == kButton4)
1749 fCanvas->HandleInput(kWheelUp, x, y);
1750 if (button == kButton5)
1751 fCanvas->HandleInput(kWheelDown, x, y);
1752 if (button == kButton1)
1753 fCanvas->HandleInput(kButton1Up, x, y);
1754 if (button == kButton2)
1755 fCanvas->HandleInput(kButton2Up, x, y);
1756 if (button == kButton3)
1757 fCanvas->HandleInput(kButton3Up, x, y);
1768 Bool_t TRootCanvas::HandleContainerDoubleClick(Event_t *event)
1770 Int_t button =
event->fCode;
1771 Int_t x =
event->fX;
1772 Int_t y =
event->fY;
1774 if (button == kButton1)
1775 fCanvas->HandleInput(kButton1Double, x, y);
1776 if (button == kButton2)
1777 fCanvas->HandleInput(kButton2Double, x, y);
1778 if (button == kButton3)
1779 fCanvas->HandleInput(kButton3Double, x, y);
1787 Bool_t TRootCanvas::HandleContainerConfigure(Event_t *)
1794 if (fCanvas->HasFixedAspectRatio()) {
1796 static Int_t dh = 0;
1798 dh = GetHeight() - fCanvasContainer->GetHeight();
1799 UInt_t h = TMath::Nint(fCanvasContainer->GetWidth()/
1800 fCanvas->GetAspectRatio()) + dh;
1801 SetWindowSize(GetWidth(), h);
1809 Bool_t TRootCanvas::HandleContainerKey(Event_t *event)
1811 static EGEventType previous_event = kOtherEvent;
1812 static UInt_t previous_keysym = 0;
1814 if (event->fType == kGKeyPress) {
1815 fButton =
event->fCode;
1818 gVirtualX->LookupString(event, str,
sizeof(str), keysym);
1820 if (str[0] == kESC){
1822 fCanvas->HandleInput(kButton1Up, 0, 0);
1823 fCanvas->HandleInput(kMouseMotion, 0, 0);
1828 gROOT->SetInterrupt();
1831 if (keysym > 0x1011 && keysym < 0x1016) {
1832 Window_t dum1, dum2, wid;
1834 Int_t mx, my, tx, ty;
1835 wid = gVirtualX->GetDefaultRootWindow();
1836 gVirtualX->QueryPointer(wid, dum1, dum2, mx, my, mx, my, mask);
1837 gVirtualX->TranslateCoordinates(gClient->GetDefaultRoot()->GetId(),
1838 fCanvasContainer->GetId(),
1839 mx, my, tx, ty, dum1);
1840 fCanvas->HandleInput(kArrowKeyPress, tx, ty);
1843 if ((previous_keysym == keysym) && (previous_event == kGKeyPress)) {
1846 gVirtualX->Warp(--mx, my, wid); --tx;
1849 gVirtualX->Warp(mx, --my, wid); --ty;
1852 gVirtualX->Warp(++mx, my, wid); ++tx;
1855 gVirtualX->Warp(mx, ++my, wid); ++ty;
1860 fCanvas->HandleInput(kArrowKeyRelease, tx, ty);
1862 previous_keysym = keysym;
1865 fCanvas->HandleInput(kKeyPress, str[0], keysym);
1867 }
else if (event->fType == kKeyRelease) {
1870 gVirtualX->LookupString(event, str,
sizeof(str), keysym);
1872 if (keysym > 0x1011 && keysym < 0x1016) {
1873 Window_t dum1, dum2, wid;
1875 Int_t mx, my, tx, ty;
1876 wid = gVirtualX->GetDefaultRootWindow();
1877 gVirtualX->QueryPointer(wid, dum1, dum2, mx, my, mx, my, mask);
1880 gVirtualX->Warp(--mx, my, wid);
1883 gVirtualX->Warp(mx, --my, wid);
1886 gVirtualX->Warp(++mx, my, wid);
1889 gVirtualX->Warp(mx, ++my, wid);
1894 gVirtualX->TranslateCoordinates(gClient->GetDefaultRoot()->GetId(),
1895 fCanvasContainer->GetId(),
1896 mx, my, tx, ty, dum1);
1897 fCanvas->HandleInput(kArrowKeyRelease, tx, ty);
1898 previous_keysym = keysym;
1902 previous_event =
event->fType;
1909 Bool_t TRootCanvas::HandleContainerMotion(Event_t *event)
1911 Int_t x =
event->fX;
1912 Int_t y =
event->fY;
1915 fCanvas->HandleInput(kMouseMotion, x, y);
1916 if (fButton == kButton1) {
1917 if (event->fState & kKeyShiftMask)
1918 fCanvas->HandleInput(EEventType(8), x, y);
1920 fCanvas->HandleInput(kButton1Motion, x, y);
1922 if (fButton == kButton2)
1923 fCanvas->HandleInput(kButton2Motion, x, y);
1931 Bool_t TRootCanvas::HandleContainerExpose(Event_t *event)
1933 if (event->fCount == 0) {
1943 Bool_t TRootCanvas::HandleContainerCrossing(Event_t *event)
1945 Int_t x =
event->fX;
1946 Int_t y =
event->fY;
1950 if (event->fType == kLeaveNotify && event->fCode == kNotifyNormal)
1951 fCanvas->HandleInput(kMouseLeave, x, y);
1959 Bool_t TRootCanvas::HandleDNDDrop(TDNDData *data)
1961 static Atom_t rootObj = gVirtualX->InternAtom(
"application/root", kFALSE);
1962 static Atom_t uriObj = gVirtualX->InternAtom(
"text/uri-list", kFALSE);
1964 if (data->fDataType == rootObj) {
1965 TBufferFile buf(TBuffer::kRead, data->fDataLength, (
void *)data->fData);
1967 TObject *obj = (TObject *)buf.ReadObjectAny(TObject::Class());
1968 if (!obj)
return kTRUE;
1970 if (obj->InheritsFrom(
"TKey")) {
1971 TObject *
object = (TObject *)gROOT->ProcessLine(Form(
"((TKey *)0x%lx)->ReadObj();", (ULong_t)obj));
1972 if (!
object)
return kTRUE;
1973 if (object->InheritsFrom(
"TGraph"))
1974 object->Draw(
"ALP");
1975 else if (object->InheritsFrom(
"TImage"))
1977 else if (object->IsA()->GetMethodAllAny(
"Draw"))
1980 else if (obj->InheritsFrom(
"TGraph"))
1982 else if (obj->IsA()->GetMethodAllAny(
"Draw"))
1988 else if (data->fDataType == uriObj) {
1989 TString sfname((
char *)data->fData);
1990 if (sfname.Length() > 7) {
1991 sfname.ReplaceAll(
"\r\n",
"");
1992 TUrl uri(sfname.Data());
1993 if (sfname.EndsWith(
".bmp") ||
1994 sfname.EndsWith(
".gif") ||
1995 sfname.EndsWith(
".jpg") ||
1996 sfname.EndsWith(
".png") ||
1997 sfname.EndsWith(
".ps") ||
1998 sfname.EndsWith(
".eps") ||
1999 sfname.EndsWith(
".pdf") ||
2000 sfname.EndsWith(
".tiff") ||
2001 sfname.EndsWith(
".xpm")) {
2002 TImage *img = TImage::Open(uri.GetFile());
2005 img->SetEditable(kTRUE);
2018 Atom_t TRootCanvas::HandleDNDPosition(Int_t x, Int_t y, Atom_t action,
2021 TPad *pad = fCanvas->Pick(x, y, 0);
2024 gROOT->SetSelectedPad(pad);
2034 Atom_t TRootCanvas::HandleDNDEnter(Atom_t *typelist)
2036 static Atom_t rootObj = gVirtualX->InternAtom(
"application/root", kFALSE);
2037 static Atom_t uriObj = gVirtualX->InternAtom(
"text/uri-list", kFALSE);
2039 for (
int i = 0; typelist[i] != kNone; ++i) {
2040 if (typelist[i] == rootObj)
2042 if (typelist[i] == uriObj)
2051 Bool_t TRootCanvas::HandleDNDLeave()
2060 void TRootCanvas::Activated(Int_t
id)
2063 TGTab *sender = (TGTab *)gTQSender;
2065 TGCompositeFrame *cont = sender->GetTabContainer(
id);
2066 if (cont == fParent) {
2068 fEditor = TVirtualPadEditor::GetPadEditor(kFALSE);
2069 if (fEditor && ((TGedEditor *)fEditor)->IsMapped()) {
2070 ((TGedEditor *)fEditor)->SetCanvas(fCanvas);
2071 ((TGedEditor *)fEditor)->SetModel(fCanvas, fCanvas, kButton1Down);
2081 void TRootContainer::SavePrimitive(std::ostream &out, Option_t * )
2083 out << std::endl <<
" // canvas container" << std::endl;
2084 out <<
" Int_t canvasID = gVirtualX->InitWindow((ULong_t)"
2085 << GetParent()->GetParent()->GetName() <<
"->GetId());" << std::endl;
2086 out <<
" Window_t winC = gVirtualX->GetWindowID(canvasID);" << std::endl;
2087 out <<
" TGCompositeFrame *";
2088 out << GetName() <<
" = new TGCompositeFrame(gClient,winC"
2089 <<
"," << GetParent()->GetName() <<
");" << std::endl;