46 class TRootEmbeddedContainer :
public TGCompositeFrame {
48 TRootEmbeddedCanvas *fCanvas;
50 TRootEmbeddedContainer(TRootEmbeddedCanvas *c, Window_t
id,
const TGWindow *parent);
52 Bool_t HandleButton(Event_t *ev)
53 {
return fCanvas->HandleContainerButton(ev); }
54 Bool_t HandleDoubleClick(Event_t *ev)
55 {
return fCanvas->HandleContainerDoubleClick(ev); }
56 Bool_t HandleConfigureNotify(Event_t *ev)
57 { TGFrame::HandleConfigureNotify(ev);
58 return fCanvas->HandleContainerConfigure(ev); }
59 Bool_t HandleKey(Event_t *ev)
60 {
return fCanvas->HandleContainerKey(ev); }
61 Bool_t HandleMotion(Event_t *ev)
62 {
return fCanvas->HandleContainerMotion(ev); }
63 Bool_t HandleExpose(Event_t *ev)
64 {
return fCanvas->HandleContainerExpose(ev); }
65 Bool_t HandleCrossing(Event_t *ev)
66 {
return fCanvas->HandleContainerCrossing(ev); }
67 void SetEditable(Bool_t) { }
73 TRootEmbeddedContainer::TRootEmbeddedContainer(TRootEmbeddedCanvas *c, Window_t
id,
74 const TGWindow *p) : TGCompositeFrame(gClient, id, p)
78 gVirtualX->GrabButton(fId, kAnyButton, kAnyModifier,
79 kButtonPressMask | kButtonReleaseMask |
80 kPointerMotionMask, kNone, kNone);
82 AddInput(kKeyPressMask | kKeyReleaseMask | kPointerMotionMask |
83 kExposureMask | kStructureNotifyMask | kLeaveWindowMask);
85 fEditDisabled = kEditDisableGrab;
91 ClassImp(TRootEmbeddedCanvas);
105 TRootEmbeddedCanvas::TRootEmbeddedCanvas(
const char *name,
const TGWindow *p,
106 UInt_t w, UInt_t h, UInt_t options, ULong_t back)
107 : TGCanvas(p, w, h, options, back)
112 fEditDisabled = kEditDisableLayout;
116 if (gStyle->GetCanvasPreferGL()) {
120 if (gVirtualX->InheritsFrom(
"TGX11"))
122 else if (gVirtualX->InheritsFrom(
"TGCocoa"))
125 TPluginHandler *ph = gROOT->GetPluginManager()->FindHandler(
"TGLManager", x);
127 if (ph && ph->LoadPlugin() != -1) {
128 if (!ph->ExecPlugin(0)) {
129 Warning(
"CreateCanvas",
130 "Cannot load GL, will use default canvas imp instead\n");
136 fCWinId = gGLManager->InitGLWindow((ULong_t)GetViewPort()->GetId());
139 if (!gGLManager || fCWinId == -1)
140 gStyle->SetCanvasPreferGL(kFALSE);
143 fCWinId = gVirtualX->InitWindow((ULong_t)GetViewPort()->GetId());
145 Window_t win = gVirtualX->GetWindowID(fCWinId);
146 fCanvasContainer =
new TRootEmbeddedContainer(
this, win, GetViewPort());
147 SetContainer(fCanvasContainer);
150 if (name) cname = name;
151 else cname = TString::Format(
"%s_canvas", GetName());
152 fCanvas =
new TCanvas(cname.Data(), w, h, fCWinId);
155 fDNDTypeList =
new Atom_t[3];
156 fDNDTypeList[0] = gVirtualX->InternAtom(
"application/root", kFALSE);
157 fDNDTypeList[1] = gVirtualX->InternAtom(
"text/uri-list", kFALSE);
159 gVirtualX->SetDNDAware(fId, fDNDTypeList);
163 fCanvas->SetBorderMode(0);
172 TRootEmbeddedCanvas::~TRootEmbeddedCanvas()
174 if (!MustCleanup()) {
176 delete fCanvasContainer;
178 delete [] fDNDTypeList;
184 void TRootEmbeddedCanvas::AdoptCanvas(TCanvas *c)
187 c->EmbedInto(fCWinId, fWidth, fHeight);
194 Bool_t TRootEmbeddedCanvas::HandleContainerButton(Event_t *event)
196 if (!fCanvas)
return kTRUE;
198 Int_t button =
event->fCode;
202 if (event->fType == kButtonPress) {
204 if (button == kButton1) {
205 if (event->fState & kKeyShiftMask)
206 fCanvas->HandleInput(EEventType(7), x, y);
208 fCanvas->HandleInput(kButton1Down, x, y);
210 if (button == kButton2)
211 fCanvas->HandleInput(kButton2Down, x, y);
212 if (button == kButton3) {
213 fCanvas->HandleInput(kButton3Down, x, y);
217 }
else if (event->fType == kButtonRelease) {
218 if (button == kButton1)
219 fCanvas->HandleInput(kButton1Up, x, y);
220 if (button == kButton2)
221 fCanvas->HandleInput(kButton2Up, x, y);
222 if (button == kButton3)
223 fCanvas->HandleInput(kButton3Up, x, y);
224 if (button == kButton4)
225 fCanvas->HandleInput(EEventType(5), x, y);
226 if (button == kButton5)
227 fCanvas->HandleInput(EEventType(6), x, y);
238 Bool_t TRootEmbeddedCanvas::HandleContainerDoubleClick(Event_t *event)
240 if (!fCanvas)
return kTRUE;
242 Int_t button =
event->fCode;
246 if (button == kButton1)
247 fCanvas->HandleInput(kButton1Double, x, y);
248 if (button == kButton2)
249 fCanvas->HandleInput(kButton2Double, x, y);
250 if (button == kButton3)
251 fCanvas->HandleInput(kButton3Double, x, y);
259 Bool_t TRootEmbeddedCanvas::HandleContainerConfigure(Event_t *)
261 if (fAutoFit && fCanvas) {
271 Bool_t TRootEmbeddedCanvas::HandleContainerKey(Event_t *event)
273 static EGEventType previous_event = kOtherEvent;
274 static UInt_t previous_keysym = 0;
276 if (!fCanvas)
return kTRUE;
278 if (event->fType == kGKeyPress) {
279 fButton =
event->fCode;
282 gVirtualX->LookupString(event, str,
sizeof(str), keysym);
286 fCanvas->HandleInput(kButton1Up, 0, 0);
287 fCanvas->HandleInput(kMouseMotion, 0, 0);
292 gROOT->SetInterrupt();
295 if (keysym > 0x1011 && keysym < 0x1016) {
296 Window_t dum1, dum2, wid;
298 Int_t mx, my, tx, ty;
299 wid = gVirtualX->GetDefaultRootWindow();
300 gVirtualX->QueryPointer(wid, dum1, dum2, mx, my, mx, my, mask);
301 gVirtualX->TranslateCoordinates(gClient->GetDefaultRoot()->GetId(),
302 fCanvasContainer->GetId(),
303 mx, my, tx, ty, dum1);
304 fCanvas->HandleInput(kArrowKeyPress, tx, ty);
307 if ((previous_keysym == keysym) && (previous_event == kGKeyPress)) {
310 gVirtualX->Warp(--mx, my, wid); --tx;
313 gVirtualX->Warp(mx, --my, wid); --ty;
316 gVirtualX->Warp(++mx, my, wid); ++tx;
319 gVirtualX->Warp(mx, ++my, wid); ++ty;
324 fCanvas->HandleInput(kArrowKeyRelease, tx, ty);
326 previous_keysym = keysym;
329 fCanvas->HandleInput(kKeyPress, str[0], keysym);
331 }
else if (event->fType == kKeyRelease) {
334 gVirtualX->LookupString(event, str,
sizeof(str), keysym);
336 if (keysym > 0x1011 && keysym < 0x1016) {
337 Window_t dum1, dum2, wid;
339 Int_t mx, my, tx, ty;
340 wid = gVirtualX->GetDefaultRootWindow();
341 gVirtualX->QueryPointer(wid, dum1, dum2, mx, my, mx, my, mask);
344 gVirtualX->Warp(--mx, my, wid);
347 gVirtualX->Warp(mx, --my, wid);
350 gVirtualX->Warp(++mx, my, wid);
353 gVirtualX->Warp(mx, ++my, wid);
358 gVirtualX->TranslateCoordinates(gClient->GetDefaultRoot()->GetId(),
359 fCanvasContainer->GetId(),
360 mx, my, tx, ty, dum1);
361 fCanvas->HandleInput(kArrowKeyRelease, tx, ty);
362 previous_keysym = keysym;
366 previous_event =
event->fType;
373 Bool_t TRootEmbeddedCanvas::HandleContainerMotion(Event_t *event)
375 if (!fCanvas)
return kTRUE;
381 fCanvas->HandleInput(kMouseMotion, x, y);
382 if (fButton == kButton1) {
383 if (event->fState & kKeyShiftMask)
384 fCanvas->HandleInput(EEventType(8), x, y);
386 fCanvas->HandleInput(kButton1Motion, x, y);
388 if (fButton == kButton2)
389 fCanvas->HandleInput(kButton2Motion, x, y);
397 Bool_t TRootEmbeddedCanvas::HandleContainerExpose(Event_t *event)
399 if (!fCanvas)
return kTRUE;
401 if (event->fCount == 0)
410 Bool_t TRootEmbeddedCanvas::HandleContainerCrossing(Event_t *event)
412 if (!fCanvas)
return kTRUE;
419 if (event->fType == kLeaveNotify && event->fCode == kNotifyNormal)
420 fCanvas->HandleInput(kMouseLeave, x, y);
428 Bool_t TRootEmbeddedCanvas::HandleDNDDrop(TDNDData *data)
430 static Atom_t rootObj = gVirtualX->InternAtom(
"application/root", kFALSE);
431 static Atom_t uriObj = gVirtualX->InternAtom(
"text/uri-list", kFALSE);
433 if (data->fDataType == rootObj) {
434 TBufferFile buf(TBuffer::kRead, data->fDataLength, (
void *)data->fData);
436 TObject *obj = (TObject *)buf.ReadObjectAny(TObject::Class());
437 if (!obj)
return kTRUE;
439 if (obj->InheritsFrom(
"TKey")) {
440 TObject *
object = (TObject *)gROOT->ProcessLine(Form(
"((TKey *)0x%lx)->ReadObj();", (ULong_t)obj));
441 if (!
object)
return kTRUE;
442 if (object->InheritsFrom(
"TGraph"))
444 else if (object->InheritsFrom(
"TImage"))
446 else if (object->IsA()->GetMethodAllAny(
"Draw"))
449 else if (obj->InheritsFrom(
"TGraph"))
451 else if (obj->IsA()->GetMethodAllAny(
"Draw"))
457 else if (data->fDataType == uriObj) {
458 TString sfname((
char *)data->fData);
459 if (sfname.Length() > 7) {
460 sfname.ReplaceAll(
"\r\n",
"");
461 TUrl uri(sfname.Data());
462 if (sfname.EndsWith(
".bmp") ||
463 sfname.EndsWith(
".gif") ||
464 sfname.EndsWith(
".jpg") ||
465 sfname.EndsWith(
".png") ||
466 sfname.EndsWith(
".ps") ||
467 sfname.EndsWith(
".eps") ||
468 sfname.EndsWith(
".pdf") ||
469 sfname.EndsWith(
".tiff") ||
470 sfname.EndsWith(
".xpm")) {
471 TImage *img = TImage::Open(uri.GetFile());
474 img->SetEditable(kTRUE);
487 Atom_t TRootEmbeddedCanvas::HandleDNDPosition(Int_t , Int_t , Atom_t action,
488 Int_t xroot, Int_t yroot)
490 Int_t px = 0, py = 0;
493 gVirtualX->TranslateCoordinates(gClient->GetDefaultRoot()->GetId(),
494 gVirtualX->GetWindowID(fCanvas->GetCanvasID()),
495 xroot, yroot, px, py, wtarget);
497 TPad *pad = fCanvas->Pick(px, py, 0);
500 gROOT->SetSelectedPad(pad);
510 Atom_t TRootEmbeddedCanvas::HandleDNDEnter(Atom_t *typelist)
512 static Atom_t rootObj = gVirtualX->InternAtom(
"application/root", kFALSE);
513 static Atom_t uriObj = gVirtualX->InternAtom(
"text/uri-list", kFALSE);
515 for (
int i = 0; typelist[i] != kNone; ++i) {
516 if (typelist[i] == rootObj)
518 if (typelist[i] == uriObj)
527 Bool_t TRootEmbeddedCanvas::HandleDNDLeave()
535 void TRootEmbeddedCanvas::SavePrimitive(std::ostream &out, Option_t *option )
537 if (!GetCanvas())
return;
539 if (fBackground != GetDefaultFrameBackground()) SaveUserColor(out, option);
543 out << std::endl <<
" // embedded canvas" << std::endl;
544 out <<
" TRootEmbeddedCanvas *";
545 out << GetName() <<
" = new TRootEmbeddedCanvas(0" <<
"," << fParent->GetName()
546 <<
"," << GetWidth() <<
"," << GetHeight();
548 if (fBackground == GetDefaultFrameBackground()) {
549 if (GetOptions() == (kSunkenFrame | kDoubleBorder)) {
550 out <<
");" << std::endl;
552 out <<
"," << GetOptionString() <<
");" << std::endl;
555 out <<
"," << GetOptionString() <<
",ucolor);" << std::endl;
557 if (option && strstr(option,
"keep_names"))
558 out <<
" " << GetName() <<
"->SetName(\"" << GetName() <<
"\");" << std::endl;
560 out <<
" Int_t w" << GetName() <<
" = " << GetName()
561 <<
"->GetCanvasWindowId();" << std::endl;
564 TString cname = TString::Format(
"c%d", n);
567 out << cname <<
" = new TCanvas(";
568 out << quote << cname.Data() << quote <<
", 10, 10, w"
569 << GetName() <<
");" << std::endl;
570 out <<
" " << GetName() <<
"->AdoptCanvas(" << cname
571 <<
");" << std::endl;