00001
00002
00003
00004
00005
00006
00007
00008 #include "guiviewer.h"
00009
00010 #include "TROOT.h"
00011 #include "TApplication.h"
00012 #include "TGTableLayout.h"
00013 #include "TGFrame.h"
00014 #include "TList.h"
00015 #include "TGWindow.h"
00016 #include "TRootEmbeddedCanvas.h"
00017 #include "TEllipse.h"
00018 #include "TBox.h"
00019 #include "TArrow.h"
00020 #include "TPolyLine.h"
00021 #include "TGButton.h"
00022 #include "TCanvas.h"
00023 #include "TRandom.h"
00024 #include "TGDoubleSlider.h"
00025 #include "TGaxis.h"
00026 #include "Riostream.h"
00027
00028
00029 Viewer::Viewer(const TGWindow *win) : TGMainFrame(win,500,500)
00030 {
00031 const UInt_t max_size = 300;
00032
00033
00034
00035 fCleanup = new TList;
00036
00037 TGCompositeFrame *table = new TGCompositeFrame(this,400,400,kSunkenFrame);
00038 fCleanup->Add(table);
00039
00040 TGTableLayout* tlo = new TGTableLayout(table, 9, 6);
00041 table->SetLayoutManager(tlo);
00042 TGLayoutHints* loh = new TGLayoutHints(kLHintsTop|kLHintsLeft|
00043 kLHintsExpandX|kLHintsExpandY);
00044 AddFrame(table,loh);
00045
00046 TGTableLayoutHints* tloh;
00047
00048
00049 TRootEmbeddedCanvas* recanvas =
00050 new TRootEmbeddedCanvas("Shapes",table,max_size,max_size);
00051 tloh = new TGTableLayoutHints(2,5,2,6,
00052 kLHintsExpandX|kLHintsExpandY |
00053 kLHintsShrinkX|kLHintsShrinkY |
00054 kLHintsFillX|kLHintsFillY);
00055 table->AddFrame(recanvas,tloh);
00056
00057 fCanvas = recanvas->GetCanvas();
00058
00059
00060 fHSlider = new TGDoubleHSlider(table,max_size,kDoubleScaleBoth,100,
00061 kHorizontalFrame,GetDefaultFrameBackground(),
00062 kFALSE, kTRUE);
00063 tloh = new TGTableLayoutHints(2,5,0,1,
00064 kLHintsExpandX|kLHintsShrinkX|kLHintsFillX);
00065 table->AddFrame(fHSlider,tloh);
00066 fHSlider->Connect("PositionChanged()","Viewer",this,"DoSlider()");
00067
00068 fVSlider = new TGDoubleVSlider(table,max_size,kDoubleScaleBoth,200,
00069 kVerticalFrame,GetDefaultFrameBackground(),
00070 kTRUE,kTRUE);
00071 tloh = new TGTableLayoutHints(0,1,2,6,
00072 kLHintsExpandY|kLHintsShrinkY|kLHintsFillY);
00073 table->AddFrame(fVSlider,tloh);
00074 fVSlider->Connect("PositionChanged()","Viewer",this,"DoSlider()");
00075
00076
00077 fHScaleCanvas =
00078 new TRootEmbeddedCanvas("H Scale",table,max_size,50);
00079 tloh = new TGTableLayoutHints(2,5,1,2,
00080 kLHintsExpandX|kLHintsShrinkX|kLHintsFillX);
00081 table->AddFrame(fHScaleCanvas,tloh);
00082 fHScaleCanvas->GetCanvas()->cd();
00083
00084 fHScaleCanvas->GetCanvas()->Range(0,0,1,1);
00085 fHScale = new TGaxis(0.0,0.5, 1.0,0.5, 0.0,100.0, 510, "-");
00086 fHScale->SetLabelSize(0.4);
00087 fHScale->SetName("X Scale");
00088 fHScale->Draw();
00089 fHScaleCanvas->GetCanvas()->SetEditable(kFALSE);
00090
00091 fVScaleCanvas =
00092 new TRootEmbeddedCanvas("V Scale",table,50,max_size);
00093 tloh = new TGTableLayoutHints(1,2,2,6,
00094 kLHintsExpandY|kLHintsShrinkY|kLHintsFillY);
00095 table->AddFrame(fVScaleCanvas,tloh);
00096 fVScaleCanvas->GetCanvas()->cd();
00097
00098 fVScaleCanvas->GetCanvas()->Range(0,0,1,1);
00099 fVScale = new TGaxis(0.5,0.0, 0.50001,1.0, 0.0,100.0, 510, "-");
00100 fVScale->SetLabelSize(0.4);
00101 fVScale->SetName("Y Scale");
00102 fVScale->Draw();
00103 fVScaleCanvas->GetCanvas()->SetEditable(kFALSE);
00104
00105
00106 SetRange(0,0,100,100);
00107
00108
00109 const char* shape_button_name[] = {
00110 "Ellipse", "Box", "Triangle", "Arrow", "Zoom Out", "Zoom In", "Close"
00111 };
00112 UInt_t ind;
00113 for (ind = 0; ind < 7; ++ind) {
00114 TGTextButton* button =
00115 new TGTextButton(table,shape_button_name[ind],ind);
00116 tloh = new TGTableLayoutHints(5,6,ind+2,ind+1+2,
00117 kLHintsExpandX|kLHintsExpandY |
00118 kLHintsShrinkX|kLHintsShrinkY |
00119 kLHintsFillX|kLHintsFillY);
00120 table->AddFrame(button,tloh);
00121 button->Resize(100,button->GetDefaultHeight());
00122 button->Connect("Clicked()","Viewer",this,"DoButton()");
00123 }
00124
00125 const char* ctrl_button_name[3][3] = {
00126 { "NW", "N", "NE" },
00127 { "W" , "C", "E" },
00128 { "SW", "S", "SE" }
00129 };
00130 UInt_t indx, indy;
00131 for (indx = 0; indx < 3; ++indx) for (indy = 0; indy < 3; ++indy) {
00132 TGTextButton* button = new TGTextButton(table,
00133 ctrl_button_name[indy][indx],
00134 (indx+1)*10 + indy +1);
00135 tloh = new TGTableLayoutHints(indx+2,indx+1+2, 6+indy,6+indy+1,
00136 kLHintsExpandX|kLHintsExpandY |
00137 kLHintsShrinkX|kLHintsShrinkY |
00138 kLHintsFillX|kLHintsFillY);
00139 table->AddFrame(button,tloh);
00140 button->Resize(100,button->GetDefaultHeight());
00141 button->Connect("Clicked()","Viewer",this,"DoButton()");
00142 }
00143
00144 table->Layout();
00145
00146
00147 Connect("CloseWindow()","TApplication",gApplication,"Terminate(=0)");
00148
00149 MapSubwindows();
00150 Layout();
00151 MapWindow();
00152 }
00153
00154 Viewer::~Viewer()
00155 {
00156 fCanvas->Clear();
00157 delete fCanvas;
00158 fCleanup->Delete();
00159 delete fCleanup;
00160 }
00161
00162 void Viewer::DoButton()
00163 {
00164 TGButton* button = (TGButton*)gTQSender;
00165 UInt_t id = button->WidgetId();
00166
00167 double xmin, ymin, xmax, ymax;
00168 double xdiff, ydiff;
00169 fCanvas->GetRange(xmin,ymin,xmax,ymax);
00170 xdiff = xmax - xmin; ydiff = ymax - ymin;
00171
00172 fCanvas->cd();
00173
00174 switch (id) {
00175 case 0: {
00176 TEllipse* ellipse = new TEllipse(gRandom->Uniform(.8*xdiff)+.1*xdiff,
00177 gRandom->Uniform(.8*ydiff)+.1*ydiff,
00178 gRandom->Uniform(.1*xdiff),
00179 gRandom->Uniform(.1*ydiff));
00180 ellipse->SetFillColor(Color_t(gRandom->Uniform(10)));
00181 ellipse->Draw();
00182 fCanvas->Modified();
00183 fCanvas->Update();
00184 break;
00185 }
00186 case 1: {
00187 TBox* box = new TBox(gRandom->Uniform(xdiff)+xmin,
00188 gRandom->Uniform(ydiff)+ymin,
00189 gRandom->Uniform(xdiff)+xmin,
00190 gRandom->Uniform(ydiff)+ymin);
00191 box->SetFillColor(Color_t(gRandom->Uniform(10)));
00192 box->Draw();
00193 fCanvas->Modified();
00194 fCanvas->Update();
00195 break;
00196 }
00197 case 2: {
00198 double x[4], y[4];
00199 x[0] = x[3] = gRandom->Uniform(xdiff)+xmin;
00200 y[0] = y[3] = gRandom->Uniform(ydiff)+ymin;
00201 x[1] = gRandom->Uniform(xdiff)+xmin;
00202 y[1] = gRandom->Uniform(ydiff)+ymin;
00203 x[2] = gRandom->Uniform(xdiff)+xmin;
00204 y[2] = gRandom->Uniform(ydiff)+ymin;
00205 TPolyLine* pl = new TPolyLine(4, x, y);
00206 pl->SetLineColor(Color_t(gRandom->Uniform(10)));
00207 pl->Draw();
00208 fCanvas->Modified();
00209 fCanvas->Update();
00210 break;
00211 }
00212 case 3: {
00213 TArrow* arrow = new TArrow(gRandom->Uniform(xdiff)+xmin,
00214 gRandom->Uniform(ydiff)+ymin,
00215 gRandom->Uniform(xdiff)+xmin,
00216 gRandom->Uniform(ydiff)+ymin);
00217 arrow->SetLineColor(Color_t(gRandom->Uniform(10)));
00218 arrow->Draw();
00219 fCanvas->Modified();
00220 fCanvas->Update();
00221 break;
00222 }
00223 case 4:
00224 SetRange(xmin-xdiff*.1, ymin-ydiff*.1, xmax+xdiff*.1, ymax+ydiff*.1);
00225 break;
00226 case 5:
00227 SetRange(xmin+xdiff*.1, ymin+ydiff*.1, xmax-xdiff*.1, ymax-ydiff*.1);
00228 break;
00229 case 6:
00230 gApplication->Terminate(0);
00231 break;
00232 case 11:
00233 SetRange(xmin-xdiff*.1, ymin+ydiff*.1, xmax-xdiff*.1, ymax+ydiff*.1);
00234 break;
00235 case 12:
00236 SetRange(xmin-xdiff*.1, ymin, xmax-xdiff*.1, ymax);
00237 break;
00238 case 13:
00239 SetRange(xmin-xdiff*.1, ymin-ydiff*.1, xmax-xdiff*.1, ymax-ydiff*.1);
00240 break;
00241 case 23:
00242 SetRange(xmin, ymin-ydiff*.1, xmax, ymax-ydiff*.1);
00243 break;
00244 case 33:
00245 SetRange(xmin+xdiff*.1, ymin-ydiff*.1, xmax+xdiff*.1, ymax-ydiff*.1);
00246 break;
00247 case 32:
00248 SetRange(xmin+xdiff*.1, ymin, xmax+xdiff*.1, ymax);
00249 break;
00250 case 31:
00251 SetRange(xmin+xdiff*.1, ymin+ydiff*.1, xmax+xdiff*.1, ymax+ydiff*.1);
00252 break;
00253 case 21:
00254 SetRange(xmin, ymin+ydiff*.1, xmax, ymax+ydiff*.1);
00255 break;
00256 case 22:
00257 SetRange(50.0-xdiff/2,50-ydiff/2,50+xdiff/2,50+ydiff/2);
00258 break;
00259 }
00260 }
00261
00262 void Viewer::DoSlider()
00263 {
00264 float xmin, ymin, xmax, ymax;
00265 fHSlider->GetPosition(xmin,xmax);
00266 fVSlider->GetPosition(ymin,ymax);
00267
00268 SetRange(xmin,ymin,xmax,ymax, kFALSE);
00269 }
00270
00271 void Viewer::SetRange(Float_t xmin, Float_t ymin, Float_t xmax, Float_t ymax,
00272 Bool_t move_slider)
00273 {
00274 fCanvas->Range(xmin,ymin,xmax,ymax);
00275
00276
00277
00278
00279 fHScale->SetWmin(xmin);
00280 fHScale->SetWmax(xmax);
00281 fVScale->SetWmin(ymin);
00282 fVScale->SetWmax(ymax);
00283
00284
00285 if (move_slider) {
00286 fHSlider->SetPosition(xmin,xmax);
00287 fVSlider->SetPosition(ymin,ymax);
00288 }
00289
00290 fCanvas->Modified();
00291 fHScaleCanvas->GetCanvas()->Modified();
00292 fVScaleCanvas->GetCanvas()->Modified();
00293 fCanvas->Update();
00294 fHScaleCanvas->GetCanvas()->Update();
00295 fVScaleCanvas->GetCanvas()->Update();
00296 fClient->ForceRedraw();
00297
00298 }
00299
00300
00301
00302
00303 int main(int argc, char **argv)
00304 {
00305 TApplication theApp("App", &argc, argv);
00306
00307 if (gROOT->IsBatch()) {
00308 fprintf(stderr, "%s: cannot run in batch mode\n", argv[0]);
00309 return 1;
00310 }
00311
00312 Viewer viewer(gClient->GetRoot());
00313
00314 theApp.Run();
00315
00316 return 0;
00317 }