Geant4 Cross Reference |
1 // 2 // ******************************************************************** 3 // * License and Disclaimer * 4 // * * 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. * 10 // * * 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitation of liability. * 17 // * * 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************************************** 25 // 26 #include "CanvasInTab.hh" 27 28 #include "TGFileDialog.h" 29 #include "TGTab.h" 30 31 #include <TApplication.h> 32 #include <TCanvas.h> 33 #include <TF1.h> 34 #include <TGButton.h> 35 #include <TGClient.h> 36 #include <TRandom.h> 37 #include <TRootEmbeddedCanvas.h> 38 #include <iostream> 39 #include <map> 40 #include <vector> 41 42 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 43 44 const char* SaveFileDialog() 45 { 46 // Prompt for file to be saved. Depending on navigation in 47 // dialog the current working directory can be changed. 48 // The returned file name is always with respect to the 49 // current directory. 50 51 const char* gSaveAsTypes[] = {"Macro files", 52 "*.C", 53 "ROOT files", 54 "*.root", 55 "PostScript", 56 "*.ps", 57 "Encapsulated PostScript", 58 "*.eps", 59 "PDF files", 60 "*.pdf", 61 "Gif files", 62 "*.gif", 63 "PNG files", 64 "*.png", 65 "All files", 66 "*", 67 0, 68 0}; 69 70 static TGFileInfo fi; 71 fi.fFileTypes = gSaveAsTypes; 72 73 new TGFileDialog(gClient->GetRoot(), gClient->GetRoot(), kFDSave, &fi); 74 75 return fi.fFilename; 76 } 77 78 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 79 80 CanvasInTab::CanvasInTab(const TGWindow* p, UInt_t w, UInt_t h) : TGMainFrame(p, w, h) 81 { 82 fpTab = new TGTab(this, 200, 200); 83 84 fHintPlots = new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 10, 10, 10, 2); 85 86 AddFrame(fpTab, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 10, 10, 10, 1)); 87 88 fpTab->Resize(); 89 90 //----- 91 TGHorizontalFrame* hframe = new TGHorizontalFrame(this, 200, 40); 92 93 TGTextButton* save = new TGTextButton(hframe, "&Save as ..."); 94 save->Connect("Clicked()", "CanvasInTab", this, "SaveCanvas()"); 95 hframe->AddFrame(save, new TGLayoutHints(kLHintsCenterX, 5, 5, 3, 4)); 96 97 TGTextButton* exit = new TGTextButton(hframe, "&Exit ", "gApplication->Terminate()"); 98 hframe->AddFrame(exit, new TGLayoutHints(kLHintsCenterX, 5, 5, 3, 4)); 99 100 AddFrame(hframe, new TGLayoutHints(kLHintsCenterX, 2, 2, 2, 2)); 101 102 //----- 103 // Sets window name and shows the main frame 104 105 SetWindowName("PlotG"); 106 MapSubwindows(); 107 Resize(GetDefaultSize()); 108 MapWindow(); 109 } 110 111 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 112 113 CanvasInTab::~CanvasInTab() 114 { 115 Cleanup(); 116 // if(fpTab) 117 // { 118 //// fpTab->Cleanup(); 119 // delete fpTab; 120 // } 121 122 // if(fHintPlots) 123 // delete fHintPlots; 124 } 125 126 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 127 128 size_t CanvasInTab::AddCanvas(const char* name) 129 { 130 size_t output = fEcanvas.size(); 131 auto compositeFrame = fpTab->AddTab(name); 132 TRootEmbeddedCanvas* embeddedCanvas = new TRootEmbeddedCanvas(name, compositeFrame, 500, 300); 133 embeddedCanvas->SetAutoFit(); 134 fEcanvas.push_back(embeddedCanvas); 135 compositeFrame->AddFrame(embeddedCanvas, fHintPlots); 136 embeddedCanvas->SetContainer(compositeFrame); 137 fpTab->Resize(); 138 fpTab->MapSubwindows(); 139 // fpTab->MapWindow(); 140 Resize(); 141 return output; 142 } 143 144 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 145 146 TCanvas* CanvasInTab::GetCanvas(int i) 147 { 148 return fEcanvas[i]->GetCanvas(); 149 } 150 151 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 152 153 void CanvasInTab::SaveCanvas() 154 { 155 if (fpTab->GetNumberOfTabs() == 0) return; 156 157 const char* name = SaveFileDialog(); 158 159 if (name == 0 || strlen(name) == 0) return; 160 161 int current = fpTab->GetCurrent(); 162 TCanvas* canvas = fEcanvas[current]->GetCanvas(); 163 canvas->SaveAs(name); 164 } 165