67 class TGedTabInfo :
public TObject {
70 TGTabElement *fElement;
71 TGCompositeFrame *fContainer;
73 TGedTabInfo(TGTabElement* el, TGCompositeFrame* f) :
74 fElement(el), fContainer(f) {}
80 TGedEditor* TGedEditor::fgFrameCreator = 0;
85 TGedEditor* TGedEditor::GetFrameCreator()
87 return fgFrameCreator;
93 void TGedEditor::SetFrameCreator(TGedEditor* e)
101 TGedEditor::TGedEditor(TCanvas* canvas, UInt_t width, UInt_t height) :
102 TGMainFrame(gClient->GetRoot(), width, height),
112 fCan =
new TGCanvas(
this, 170, 10, kFixedWidth);
113 AddFrame(fCan,
new TGLayoutHints(kLHintsExpandY | kLHintsExpandX));
115 fTab =
new TGTab(fCan->GetViewPort(), 10, 10);
116 fTab->Associate(fCan);
117 fTab->SetCleanup(kDeepCleanup);
118 fCan->SetContainer(fTab);
120 fTabContainer = GetEditorTab(
"Style");
122 gROOT->GetListOfCleanups()->Add(
this);
126 UInt_t ch = fCanvas->GetWindowHeight();
128 Resize(GetWidth(), ch > 700 ? 700 : ch);
130 Resize(GetWidth(), fCanvas->GetWh()<450 ? 450 : fCanvas->GetWh() + 4);
132 Resize(width, height);
142 TGedEditor::~TGedEditor()
147 TQObject::Disconnect(
"TCanvas",
"Selected(TVirtualPad *, TObject *, Int_t)");
148 TQObject::Disconnect(
"TCanvas",
"Closed()");
152 TIter next(fFrameMap.GetTable());
154 while ((pair = (TPair*) next())) {
155 if (pair->Value() != 0) {
156 TGedFrame* frame = (TGedFrame*) pair->Value();
162 TIter it1(&fCreatedTabs);
163 while ((ti = (TGedTabInfo*) it1())) {
164 fTab->AddFrame(ti->fElement,0);
165 fTab->AddFrame(ti->fContainer,0);
169 delete ((TGFrameElement*)fList->First())->fLayout;
177 void TGedEditor::Update(TGedFrame* )
188 TGCompositeFrame* TGedEditor::GetEditorTab(
const char* name)
190 return GetEditorTabInfo(name)->fContainer;
196 TGedTabInfo* TGedEditor::GetEditorTabInfo(
const char* name)
199 if ( ! fCreatedTabs.IsEmpty()) {
200 TIter next(&fCreatedTabs);
202 while ((ti = (TGedTabInfo *) next())) {
203 if (*ti->fElement->GetText() == name)
209 TGCompositeFrame* tc = fTab->AddTab(
new TGString(name));
212 TGTabElement *te = fTab->GetTabTab(fTab->GetNumberOfTabs() - 1);
213 fTab->RemoveFrame(tc);
214 fTab->RemoveFrame(te);
217 TGedFrame* nf = CreateNameFrame(tc, name);
219 nf->SetGedEditor(
this);
220 nf->SetModelClass(0);
221 tc->AddFrame(nf,
new TGLayoutHints(kLHintsTop | kLHintsExpandX, 2, 2, 2, 2));
224 TGedTabInfo* ti =
new TGedTabInfo(te, tc);
225 fCreatedTabs.Add(ti);
233 void TGedEditor::CloseWindow()
243 void TGedEditor::ReinitWorkspace()
245 TIter next(&fVisibleTabs);
247 while ((ti = (TGedTabInfo*)next())) {
248 TGTabElement *te = ti->fElement;
249 TGCompositeFrame *tc = ti->fContainer;
251 fTab->RemoveFrame(te);
252 fTab->RemoveFrame(tc);
254 TIter frames(tc->GetList());
257 while ((fr = (TGFrameElement *) frames()) != 0) {
258 TGFrame *f = fr->fFrame;
264 fVisibleTabs.Remove(ti);
271 void TGedEditor::SetGlobal(Bool_t global)
275 TQObject::Connect(
"TCanvas",
"Selected(TVirtualPad *, TObject *, Int_t)",
276 "TGedEditor",
this,
"GlobalSetModel(TVirtualPad *, TObject *, Int_t)");
278 TQObject::Connect(
"TCanvas",
"Closed()",
279 "TGedEditor",
this,
"GlobalClosed()");
286 void TGedEditor::GlobalClosed()
288 if (gROOT->GetListOfCanvases()->IsEmpty())
289 TVirtualPadEditor::Terminate();
295 void TGedEditor::GlobalSetModel(TVirtualPad *pad, TObject * obj, Int_t ev)
297 if ((ev != kButton1Down) || !IsMapped() ||
298 (obj && obj->InheritsFrom(
"TColorWheel")))
301 TCanvas* can = pad->GetCanvas();
304 if (!can || (can == fCanvas || can->GetShowEditor()))
313 void TGedEditor::ConnectToCanvas(TCanvas *c)
315 c->Connect(
"Selected(TVirtualPad*,TObject*,Int_t)",
"TGedEditor",
316 this,
"SetModel(TVirtualPad*,TObject*,Int_t)");
322 void TGedEditor::DisconnectFromCanvas()
325 Disconnect(fCanvas,
"Selected(TVirtualPad*,TObject*,Int_t)",
this,
"SetModel(TVirtualPad*,TObject*,Int_t)");
331 void TGedEditor::SetCanvas(TCanvas *newcan)
333 if (fCanvas == newcan)
return;
335 DisconnectFromCanvas();
340 SetWindowName(Form(
"%s_Editor", fCanvas->GetName()));
341 fPad = fCanvas->GetSelectedPad();
342 if (fPad == 0) fPad = fCanvas;
343 ConnectToCanvas(fCanvas);
349 void TGedEditor::SetModel(TVirtualPad* pad, TObject* obj, Int_t event, Bool_t force)
351 if ((event != kButton1Down) || (obj && obj->InheritsFrom(
"TColorWheel")))
354 if (gPad && gPad->GetVirtCanvas()) gPad->GetVirtCanvas()->SetCursor(kWatch);
355 gVirtualX->SetCursor(GetId(), gVirtualX->CreateCursor(kWatch));
358 if (obj == 0) obj = fPad;
361 TGTabElement* seltab = fTab->GetCurrentTab();
363 Bool_t mapTabs = kFALSE;
364 if (fModel != obj || force) {
366 if (fModel == 0 || fModel->IsA() != fClass) {
370 fVisibleTabs.Add(fCreatedTabs.First());
372 fClass = fModel->IsA();
374 ActivateEditor(fClass, kTRUE);
381 TIter ngf(&fGedFrames);
382 while ((gfr = (TGedFrame*) ngf()))
383 fTabContainer->AddFrame(gfr,
new TGLayoutHints(kLHintsTop | kLHintsExpandX, 2, 2, 2, 2));
389 TIter next(&fVisibleTabs);
391 while ((ti = (TGedTabInfo *) next())) {
392 fTab->AddFrame(ti->fElement,0);
393 fTab->AddFrame(ti->fContainer,0);
396 ConfigureGedFrames(kTRUE);
398 ConfigureGedFrames(kFALSE);
403 TIter next(&fVisibleTabs);
404 while ((ti = (TGedTabInfo *) next())) {
405 ti->fElement->MapWindow();
406 ti->fContainer->MapWindow();
408 if (seltab == 0 || fTab->SetTab(seltab->GetString(), kFALSE) == kFALSE)
409 fTab->SetTab(0, kFALSE);
415 ((TGMainFrame*)GetMainFrame())->Layout();
417 if (gPad && gPad->GetVirtCanvas()) gPad->GetVirtCanvas()->SetCursor(kPointer);
418 gVirtualX->SetCursor(GetId(), gVirtualX->CreateCursor(kPointer));
424 void TGedEditor::Show()
427 if (gPad) SetCanvas(gPad->GetCanvas());
429 if (fCanvas && fGlobal) {
430 SetModel(fCanvas->GetClickSelectedPad(), fCanvas->GetClickSelected(), kButton1Down);
432 if (fCanvas->GetShowEditor())
433 fCanvas->ToggleEditor();
435 UInt_t dw = fClient->GetDisplayWidth();
436 UInt_t cw = fCanvas->GetWindowWidth();
437 UInt_t ch = fCanvas->GetWindowHeight();
438 UInt_t cx = (UInt_t)fCanvas->GetWindowTopX();
439 UInt_t cy = (UInt_t)fCanvas->GetWindowTopY();
443 Int_t gedx = 0, gedy = 0;
445 if (cw + GetWidth() > dw) {
446 gedx = cx + cw - GetWidth();
447 gedy = ch - GetHeight();
450 gedx = cx - GetWidth() - 20;
455 MoveResize(gedx, gedy, GetWidth(), ch > 700 ? 700 : ch);
456 SetWMPosition(gedx, gedy);
457 }
else if (fCanvas) {
458 SetModel(fCanvas, fCanvas, kButton1Down);
461 gVirtualX->RaiseWindow(GetId());
463 if (!gROOT->GetListOfCleanups()->FindObject(
this))
464 gROOT->GetListOfCleanups()->Add(
this);
470 void TGedEditor::Hide()
474 fModel = 0; fClass = 0;
475 DisconnectFromCanvas();
476 fCanvas = 0; fPad = 0;
477 gROOT->GetListOfCleanups()->Remove(
this);
484 void TGedEditor::RecursiveRemove(TObject* obj)
488 SetModel(fCanvas, fCanvas, kButton1Down);
494 SetModel(fPad, fPad, kButton1Down);
503 void TGedEditor::ActivateEditor(TClass* cl, Bool_t recurse)
505 TPair *pair = (TPair*) fFrameMap.FindObject(cl);
507 TGedFrame *frame = 0;
510 edClass = TClass::GetClass(Form(
"%sEditor", cl->GetName()));
512 if (edClass && edClass->InheritsFrom(TGedFrame::Class())) {
513 TGWindow *exroot = (TGWindow*) fClient->GetRoot();
514 fClient->SetRoot(fTabContainer);
515 fgFrameCreator =
this;
516 frame =
reinterpret_cast<TGedFrame*
>(edClass->New());
517 frame->SetModelClass(cl);
519 fClient->SetRoot(exroot);
521 fFrameMap.Add(cl, frame);
523 frame = (TGedFrame*)pair->Value();
526 Bool_t exclfr = kFALSE;
527 Bool_t exclbases = kFALSE;
530 TPair* exclpair = (TPair*) fExclMap.FindObject(cl);
533 exclbases = (exclpair->Value() != 0);
536 if (!exclfr && frame->AcceptModel(fModel)){
538 if (frame->GetExtraTabs()) {
539 TIter next(frame->GetExtraTabs());
540 TGedFrame::TGedSubFrame* subf;
541 while ((subf = (TGedFrame::TGedSubFrame*)next())) {
543 TGedTabInfo* ti = GetEditorTabInfo(subf->fName);
544 ti->fContainer->AddFrame(subf->fFrame,
new TGLayoutHints(kLHintsNormal | kLHintsExpandX));
545 if (fVisibleTabs.FindObject(ti) == 0)
546 fVisibleTabs.Add(ti);
549 InsertGedFrame(frame);
553 if (recurse && !exclbases) {
555 frame->ActivateBaseClassEditors(cl);
557 ActivateEditors(cl->GetListOfBases(), recurse);
564 void TGedEditor::ActivateEditors(TList* bcl, Bool_t recurse)
569 while ((base = (TBaseClass*) next())) {
570 ActivateEditor(base->GetClassPointer(), recurse);
578 void TGedEditor::ExcludeClassEditor(TClass* cl, Bool_t recurse)
580 TPair* pair = (TPair*) fExclMap.FindObject(cl);
582 if (recurse && pair->Value() == 0)
583 pair->SetValue((TObject*)(Long_t)1);
585 fExclMap.Add(cl, (TObject*)(Long_t)(recurse ? 1 : 0));
592 void TGedEditor::InsertGedFrame(TGedFrame* f)
595 TObjLink* lnk = fGedFrames.FirstLink();
602 cf = (TGedFrame*) lnk->GetObject();
603 if (f->GetPriority() < cf->GetPriority()) {
604 fGedFrames.AddBefore(lnk, f);
615 void TGedEditor::ConfigureGedFrames(Bool_t objChanged)
621 TIter vistabs(&fVisibleTabs);
624 while ((ti = (TGedTabInfo *) vistabs())) {
625 TIter fr(ti->fContainer->GetList());
626 el = (TGFrameElement*) fr();
628 ((TGedFrame*) el->fFrame)->SetModel(fModel);
631 el->fFrame->MapSubwindows();
632 el->fFrame->Layout();
633 el->fFrame->MapWindow();
634 }
while((el = (TGFrameElement *) fr()));
637 ti->fContainer->Layout();
640 TIter next(fTabContainer->GetList());
641 while ((el = (TGFrameElement *) next())) {
642 if ((el->fFrame)->InheritsFrom(TGedFrame::Class())) {
644 el->fFrame->MapSubwindows();
645 ((TGedFrame *)(el->fFrame))->SetModel(fModel);
646 el->fFrame->Layout();
647 el->fFrame->MapWindow();
649 ((TGedFrame *)(el->fFrame))->SetModel(fModel);
653 fTabContainer->Layout();
659 TGedFrame* TGedEditor::CreateNameFrame(
const TGWindow* parent,
const char* )
661 return new TGedNameFrame(parent);
667 void TGedEditor::PrintFrameStat()
669 printf(
"TGedEditor::PrintFrameStat()\n");
671 TIter next(fFrameMap.GetTable());
673 while ((pair = (TPair*) next())) {
674 if (pair->Value() != 0) {
675 TClass* cl = (TClass*) pair->Key();
676 printf(
"TGedFrame created for %s \n", cl->GetName());
680 printf(
"SUMMARY: %d editors stored in the local map.\n", sum);