00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00023
00024
00025
00026
00027
00028
00030
00031
00032 #include "MINF_Classes/MINFDisplayFrame.h"
00033 #include "MINF_Classes/MINFEmbeddedCanvas.h"
00034
00035 #include "TCanvas.h"
00036 #include "TROOT.h"
00037
00039
00040
00041
00042
00043
00044
00045
00046
00047
00049
00050 class MINFEmbeddedContainer : public TGCompositeFrame {
00051 private:
00052 MINFEmbeddedCanvas *fCanvas;
00053 public:
00054 MINFEmbeddedContainer(MINFEmbeddedCanvas *c, Window_t id, const TGWindow *parent);
00055
00056 Bool_t HandleButton(Event_t *ev) {
00057 return fCanvas->HandleContainerButton(ev);
00058 }
00059 Bool_t HandleDoubleClick(Event_t *ev) {
00060 return fCanvas->HandleContainerDoubleClick(ev);
00061 }
00062 Bool_t HandleConfigureNotify(Event_t *ev) {
00063 TGFrame::HandleConfigureNotify(ev);
00064 return fCanvas->HandleContainerConfigure(ev);
00065 }
00066 Bool_t HandleKey(Event_t *ev) {
00067 return fCanvas->HandleContainerKey(ev);
00068 }
00069 Bool_t HandleMotion(Event_t *ev) {
00070 return fCanvas->HandleContainerMotion(ev);
00071 }
00072 Bool_t HandleExpose(Event_t *ev) {
00073 return fCanvas->HandleContainerExpose(ev);
00074 }
00075 Bool_t HandleCrossing(Event_t *ev) {
00076 return fCanvas->HandleContainerCrossing(ev);
00077 }
00078 };
00079
00080
00081 MINFEmbeddedContainer::MINFEmbeddedContainer(MINFEmbeddedCanvas *c, Window_t id,
00082 const TGWindow *p) : TGCompositeFrame(gClient, id, p)
00083 {
00084
00085
00086 fCanvas = c;
00087
00088 gVirtualX->GrabButton(fId, kAnyButton, kAnyModifier,
00089 kButtonPressMask | kButtonReleaseMask,
00090 kNone, kNone);
00091
00092 gVirtualX->SelectInput(fId, kKeyPressMask | kKeyReleaseMask | kExposureMask |
00093 kPointerMotionMask | kStructureNotifyMask | kLeaveWindowMask);
00094 }
00095
00096 ClassImp(MINFEmbeddedCanvas)
00097
00098
00099 MINFEmbeddedCanvas::MINFEmbeddedCanvas(const char *name, const TGWindow *p,
00100 UInt_t w, UInt_t h, UInt_t options, ULong_t back)
00101 : TGCanvas(p, w, h, options, back)
00102 {
00103
00104
00105
00106 fButton = 0;
00107 fAutoFit = kTRUE;
00108 fShowEventStatus = kFALSE;
00109
00110 Int_t wid = gVirtualX->InitWindow((ULong_t)GetViewPort()->GetId());
00111 Window_t win = gVirtualX->GetWindowID(wid);
00112 fCanvasContainer = new MINFEmbeddedContainer(this, win, GetViewPort());
00113 SetContainer(fCanvasContainer);
00114
00115 fCanvas = new TCanvas(name, 10, 10, wid);
00116 }
00117
00118
00119 MINFEmbeddedCanvas::~MINFEmbeddedCanvas()
00120 {
00121
00122
00123 delete fCanvas;
00124 delete fCanvasContainer;
00125 }
00126
00127
00128 void MINFEmbeddedCanvas::DrawEventStatus(Int_t event, Int_t px, Int_t py, TObject *selected)
00129 {
00130
00131
00132
00133
00134
00135
00136
00137
00138 const Int_t kTMAX=256;
00139 static char atext[kTMAX];
00140
00141 if (!selected) return;
00142
00143
00144 #if 0
00145 static Int_t pxt, pyt;
00146 gPad->SetDoubleBuffer(0);
00147 gVirtualX->SetTextColor(1);
00148 gVirtualX->SetTextAlign(11);
00149
00150 pxt = gPad->GetCanvas()->XtoAbsPixel(gPad->GetCanvas()->GetX1()) + 5;
00151 pyt = gPad->GetCanvas()->YtoAbsPixel(gPad->GetCanvas()->GetY1()) - 5;
00152
00153 sprintf(atext,"%s / %s ", selected->GetName()
00154 , selected->GetObjectInfo(px,py));
00155 for (Int_t i=strlen(atext);i<kTMAX-1;i++) atext[i] = ' ';
00156 atext[kTMAX-1] = 0;
00157 gVirtualX->DrawText(pxt, pyt, 0, 1, atext, TGXW::kOpaque);
00158 #else
00159
00160 SetStatusText((Text_t *)(selected->GetTitle()),0);
00161 SetStatusText((Text_t *)(selected->GetName()),1);
00162 if (event == kKeyPress)
00163 sprintf(atext, "%c", (char) px);
00164 else
00165 sprintf(atext, "%d,%d", px, py);
00166 SetStatusText(atext,2);
00167 SetStatusText((Text_t *)(selected->GetObjectInfo(px,py)),3);
00168 #endif
00169 }
00170
00171
00172 Bool_t MINFEmbeddedCanvas::HandleContainerButton(Event_t *event)
00173 {
00174
00175
00176 Int_t button = event->fCode;
00177 Int_t x = event->fX;
00178 Int_t y = event->fY;
00179
00180 if (event->fType == kButtonPress) {
00181 fButton = button;
00182 if (button == kButton1)
00183 fCanvas->HandleInput(kButton1Down, x, y);
00184 if (fShowEventStatus) DrawEventStatus(event->fType, x, y, fCanvas->GetSelected());
00185 if (button == kButton2)
00186 fCanvas->HandleInput(kButton2Down, x, y);
00187 SetUnZoomPad(fCanvas->GetSelectedPad());
00188 if (button == kButton3) {
00189 fCanvas->HandleInput(kButton3Down, x, y);
00190 fButton = 0;
00191 }
00192
00193 } else if (event->fType == kButtonRelease) {
00194 if (button == kButton1)
00195 fCanvas->HandleInput(kButton1Up, x, y);
00196 if (fShowEventStatus) DrawEventStatus(event->fType, x, y, fCanvas->GetSelected());
00197 if (button == kButton2)
00198 fCanvas->HandleInput(kButton2Up, x, y);
00199 if (button == kButton3)
00200 fCanvas->HandleInput(kButton3Up, x, y);
00201
00202 fButton = 0;
00203 }
00204
00205 return kTRUE;
00206 }
00207
00208
00209 Bool_t MINFEmbeddedCanvas::HandleContainerDoubleClick(Event_t *event)
00210 {
00211
00212
00213 Int_t button = event->fCode;
00214 Int_t x = event->fX;
00215 Int_t y = event->fY;
00216
00217 if (button == kButton1)
00218 fCanvas->HandleInput(kButton1Double, x, y);
00219 if (fShowEventStatus) DrawEventStatus(event->fType, x, y, fCanvas->GetSelected());
00220 if (button == kButton2)
00221 fCanvas->HandleInput(kButton2Double, x, y);
00222 if (button == kButton3)
00223 fCanvas->HandleInput(kButton3Double, x, y);
00224
00225 return kTRUE;
00226 }
00227
00228
00229 Bool_t MINFEmbeddedCanvas::HandleContainerConfigure(Event_t *)
00230 {
00231
00232
00233 if (fAutoFit) {
00234 fCanvas->Resize();
00235 fCanvas->Update();
00236 }
00237 return kTRUE;
00238 }
00239
00240
00241 Bool_t MINFEmbeddedCanvas::HandleContainerKey(Event_t *event)
00242 {
00243
00244
00245 Int_t x = event->fX;
00246 Int_t y = event->fY;
00247
00248
00249 if (event->fType == kGKeyPress) {
00250 fButton = event->fCode;
00251 UInt_t keysym;
00252 char str[2];
00253 gVirtualX->LookupString(event, str, sizeof(str), keysym);
00254 if (str[0] == 3)
00255 gROOT->SetInterrupt();
00256 fCanvas->HandleInput(kKeyPress, str[0], 0);
00257 if (fShowEventStatus) DrawEventStatus(event->fType, x, y, fCanvas->GetSelected());
00258 } else if (event->fType == kKeyRelease)
00259 fButton = 0;
00260
00261 return kTRUE;
00262 }
00263
00264
00265 Bool_t MINFEmbeddedCanvas::HandleContainerMotion(Event_t *event)
00266 {
00267
00268
00269 Int_t x = event->fX;
00270 Int_t y = event->fY;
00271
00272 if (fButton == 0)
00273 fCanvas->HandleInput(kMouseMotion, x, y);
00274 if (fShowEventStatus) DrawEventStatus(event->fType, x, y, fCanvas->GetSelected());
00275 if (fButton == kButton1)
00276 fCanvas->HandleInput(kButton1Motion, x, y);
00277 if (fShowEventStatus) DrawEventStatus(event->fType, x, y, fCanvas->GetSelected());
00278
00279 return kTRUE;
00280 }
00281
00282
00283 Bool_t MINFEmbeddedCanvas::HandleContainerExpose(Event_t *event)
00284 {
00285
00286
00287 if (event->fCount == 0)
00288 fCanvas->Flush();
00289
00290 return kTRUE;
00291 }
00292
00293
00294 Bool_t MINFEmbeddedCanvas::HandleContainerCrossing(Event_t *event)
00295 {
00296
00297
00298 if (event->fType == kLeaveNotify)
00299 fCanvas->HandleInput(kMouseLeave, 0, 0);
00300
00301 return kTRUE;
00302 }
00303
00304
00305 void MINFEmbeddedCanvas::SetStatusText(Text_t *txt, Int_t partidx)
00306 {
00307
00308
00309 ((MINFDisplayFrame *) fParent)->SetStatusText(txt, partidx);
00310 }
00311
00312
00313 void MINFEmbeddedCanvas::SetUnZoomPad(TVirtualPad *pad)
00314 {
00315
00316
00317 ((MINFDisplayFrame *) fParent)->SetUnZoomPad(pad);
00318 }