00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "TGuiBldNameFrame.h"
00020 #include "TGLabel.h"
00021 #include "TGTextEntry.h"
00022 #include "TGuiBldEditor.h"
00023 #include "TGLayout.h"
00024 #include "TG3DLine.h"
00025 #include "TColor.h"
00026 #include "TROOT.h"
00027 #include "TRootGuiBuilder.h"
00028 #include "TGButton.h"
00029 #include "TGFrame.h"
00030 #include "TGMdiFrame.h"
00031 #include "TGCanvas.h"
00032 #include "TGListTree.h"
00033 #include "TGuiBldDragManager.h"
00034 #include "TGMsgBox.h"
00035 #include "TGSplitter.h"
00036
00037 ClassImp(TGuiBldNameFrame)
00038
00039
00040 TGuiBldNameFrame::TGuiBldNameFrame(const TGWindow *p, TGuiBldEditor *editor) :
00041 TGCompositeFrame(p, 1, 1)
00042 {
00043
00044
00045 fEditor = editor;
00046 fBuilder = (TRootGuiBuilder*)TRootGuiBuilder::Instance();
00047 fManager = fBuilder->GetManager();
00048 fEditDisabled = kEditDisable;
00049 SetCleanup(kDeepCleanup);
00050 TGFrame *frame = 0;
00051 TGFrame *fSelected = fEditor->GetSelected();
00052 if (fSelected) frame = fSelected;
00053
00054 TGVerticalFrame *cf = new TGVerticalFrame(this, 180, 400);
00055
00056
00057 TGHorizontalFrame *f = new TGHorizontalFrame(cf);
00058 f->AddFrame(new TGLabel(f, "MDI Frame content"),
00059 new TGLayoutHints(kLHintsLeft, 0, 1, 0, 0));
00060 f->AddFrame(new TGHorizontal3DLine(f), new TGLayoutHints(kLHintsExpandX,
00061 5, 5, 7, 7));
00062 cf->AddFrame(f, new TGLayoutHints(kLHintsTop | kLHintsExpandX));
00063
00064 fCanvas = new TGCanvas(cf, 180, 110);
00065 fListTree = new TGListTree(fCanvas, 0);
00066 fCanvas->MapSubwindows();
00067 cf->AddFrame(fCanvas, new TGLayoutHints(kLHintsExpandY | kLHintsExpandX));
00068
00069
00070 fTitleFrame = new TGHorizontalFrame(cf, 100, 30);
00071 fTitleFrame->AddFrame(new TGLabel(fTitleFrame, "Variable name"),
00072 new TGLayoutHints(kLHintsLeft | kLHintsCenterY ,
00073 0, 1, 0, 0));
00074 fTitleFrame->AddFrame(new TGHorizontal3DLine(fTitleFrame),
00075 new TGLayoutHints(kLHintsCenterY | kLHintsExpandX,
00076 1, 1, 1, 1));
00077 cf->AddFrame(fTitleFrame, new TGLayoutHints(kLHintsExpandX | kLHintsTop));
00078
00079 TString name = "";
00080 if (frame) {
00081 name = frame->ClassName();
00082 }
00083 fLabel = new TGLabel(cf, name.Data());
00084 cf->AddFrame(fLabel, new TGLayoutHints(kLHintsCenterX, 1, 1, 0, 0));
00085
00086 TGCompositeFrame *sub = new TGHorizontalFrame(cf, 100, 30);
00087 fFrameName = new TGTextEntry(sub, frame ? frame->GetName() : "noname");
00088 fFrameName->SetAlignment(kTextLeft);
00089 fFrameName->Resize(120, fFrameName->GetHeight());
00090 sub->AddFrame(fFrameName, new TGLayoutHints(kLHintsTop | kLHintsCenterX,
00091 2, 2, 0, 0));
00092 fFrameName->SetEnabled(kTRUE);
00093
00094 TGTextButton *btn = new TGTextButton(sub, " Set Name ");
00095 sub->AddFrame(btn, new TGLayoutHints(kLHintsTop));
00096 cf->AddFrame(sub, new TGLayoutHints(kLHintsTop | kLHintsCenterX,
00097 2, 2, 0, 0));
00098
00099 AddFrame(cf, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY));
00100
00101 btn->Connect("Clicked()", "TGuiBldNameFrame", this, "UpdateName()");
00102 btn->SetToolTipText("Set variable name");
00103 fListTree->Connect("Clicked(TGListTreeItem*, Int_t)", "TGuiBldNameFrame",
00104 this, "SelectFrameByItem(TGListTreeItem*, Int_t)");
00105 }
00106
00107
00108 void TGuiBldNameFrame::DoRedraw()
00109 {
00110
00111
00112
00113
00114 TGCompositeFrame::DoRedraw();
00115 }
00116
00117
00118 void TGuiBldNameFrame::Reset()
00119 {
00120
00121
00122 fFrameName->SetText("");
00123 fLabel->SetText("");
00124 DoRedraw();
00125 }
00126
00127
00128 void TGuiBldNameFrame::ChangeSelected(TGFrame *frame)
00129 {
00130
00131
00132 fFrameName->Disconnect();
00133
00134 if (!frame) {
00135 Reset();
00136 return;
00137 }
00138
00139 TString name = frame->ClassName();
00140
00141 fLabel->SetText(name.Data());
00142 fFrameName->SetText(frame->GetName());
00143 Resize();
00144
00145 TGCompositeFrame *main = GetMdi(frame);
00146
00147 if (main) {
00148 if ((!fListTree) || (!fListTree->GetFirstItem()))
00149 MapItems(main);
00150 else if ((fListTree->GetFirstItem()->GetUserData()) != main) {
00151
00152 if (fListTree) {
00153
00154 while (fListTree->GetFirstItem()) {
00155 fListTree->DeleteItem(fListTree->GetFirstItem());
00156 }
00157 MapItems(main);
00158 }
00159 }
00160 else
00161 CheckItems(main);
00162 }
00163
00164
00165 TGListTreeItem *item = 0;
00166 fListTree->OpenItem(fListTree->GetFirstItem());
00167 item = fListTree->FindItemByObj(fListTree->GetFirstItem(), frame);
00168 if (item) {
00169 fListTree->HighlightItem(item);
00170 while (item->GetParent()) {
00171 item = item->GetParent();
00172 item->SetOpen(kTRUE);
00173 }
00174 }
00175 fClient->NeedRedraw(fListTree, kTRUE);
00176 fClient->NeedRedraw(fCanvas, kTRUE);
00177 DoRedraw();
00178
00179 }
00180
00181
00182
00183 void TGuiBldNameFrame::UpdateName()
00184 {
00185
00186
00187 TGFrame *frame = fEditor->GetSelected();
00188 TString ch = fFrameName->GetText();
00189
00190 if (!frame) {
00191 return;
00192 }
00193
00194 if (FindItemByName(fListTree, ch, fListTree->GetFirstItem())) {
00195 fBuilder->UpdateStatusBar("Variable name already exists.");
00196 TGCompositeFrame *cf = (TGCompositeFrame*)frame->GetParent();
00197 int retval;
00198 fBuilder->GetManager()->SetEditable(kFALSE);
00199 new TGMsgBox(fClient->GetDefaultRoot(), fBuilder,
00200 "Name conflict", "Variable name already exists.",
00201 kMBIconExclamation, kMBOk, &retval);
00202 cf->SetEditable(kTRUE);
00203
00204 fBuilder->GetManager()->SelectFrame(frame);
00205 frame->SetEditable(kTRUE);
00206 }
00207 else {
00208 fBuilder->UpdateStatusBar("Variable name changed.");
00209 frame->SetName(ch);
00210 }
00211
00212 if (fListTree) {
00213
00214 while (fListTree->GetFirstItem()) {
00215 fListTree->DeleteItem(fListTree->GetFirstItem());
00216 }
00217 }
00218
00219 TGCompositeFrame *main = GetMdi(frame);
00220 MapItems(main);
00221
00222 if (fListTree) fClient->NeedRedraw(fListTree, kTRUE);
00223 fClient->NeedRedraw(fFrameName);
00224 DoRedraw();
00225 }
00226
00227
00228 TGCompositeFrame *TGuiBldNameFrame::GetMdi(TGFrame *frame)
00229 {
00230
00231
00232 TGFrame *p = frame;
00233
00234 while (p && (p != fClient->GetDefaultRoot()) ) {
00235 if (p->InheritsFrom(TGMdiFrame::Class())) {
00236 return (TGCompositeFrame*)p;
00237 }
00238 else if (p->InheritsFrom(TGMainFrame::Class())) {
00239 return (TGCompositeFrame*)p;
00240 }
00241 p = (TGFrame*)p->GetParent();
00242 }
00243 return 0;
00244 }
00245
00246
00247 void TGuiBldNameFrame::MapItems(TGCompositeFrame *main)
00248 {
00249
00250
00251 if (!main) {
00252 return;
00253 }
00254
00255 TList *list = main->GetList();
00256 TGFrameElement *el = 0;
00257 TIter next(list);
00258
00259 while ((el = (TGFrameElement *) next())) {
00260 if (el->fFrame) {
00261
00262 if (main->InheritsFrom(TGMdiFrame::Class()) ||
00263 main->InheritsFrom(TGMainFrame::Class())) {
00264
00265
00266
00267 if (!fListTree->FindChildByData(0, main)) {
00268
00269 fListTree->AddItem(0, main->GetName(), main);
00270 }
00271
00272 fListTree->AddItem(fListTree->FindChildByData(0, main),
00273 el->fFrame->GetName(), el->fFrame);
00274
00275 } else {
00276
00277
00278 TGListTreeItem *result = 0;
00279 TGFrame *par = (TGFrame*)el->fFrame->GetParent();
00280 result = fListTree->FindItemByObj(fListTree->GetFirstItem(), par);
00281 if (result)
00282 fListTree->AddItem(result, el->fFrame->GetName(), el->fFrame);
00283 }
00284
00285 if ( (el->fFrame->InheritsFrom(TGCompositeFrame::Class())) &&
00286 (!(el->fFrame->InheritsFrom(TGMdiFrame::Class()))) ) {
00287
00288 main = (TGCompositeFrame*)(el->fFrame);
00289 MapItems(main);
00290 }
00291 }
00292 }
00293 }
00294
00295
00296 Bool_t TGuiBldNameFrame::CheckItems(TGCompositeFrame *main)
00297 {
00298
00299
00300 TList *list = main->GetList();
00301
00302 if (fListTree) {
00303
00304 TGFrameElement *el = 0;
00305 TGListTreeItem *item = 0;
00306 TIter next(list);
00307 TGFrame *f = 0;
00308 TGListTreeItem *par = 0;
00309
00310 while ((el = (TGFrameElement *) next())) {
00311 if (el && (el->fFrame)) {
00312 item = fListTree->FindItemByObj(fListTree->GetFirstItem(),
00313 el->fFrame);
00314 if (!item) {
00315 f = (TGFrame*)el->fFrame->GetParent();
00316 if (f) {
00317 par = fListTree->FindItemByObj(fListTree->GetFirstItem(), f);
00318 if (par)
00319 fListTree->AddItem(par, el->fFrame->GetName(), el->fFrame);
00320 }
00321
00322 }
00323 else if (item->GetParent() && item->GetParent()->GetUserData() !=
00324 el->fFrame->GetParent()) {
00325 f = (TGFrame*)el->fFrame->GetParent();
00326 if (f) {
00327 par = fListTree->FindItemByObj(fListTree->GetFirstItem(), f);
00328 if (par)
00329 fListTree->Reparent(item, par);
00330 }
00331
00332 }
00333 if (el->fFrame->InheritsFrom(TGCompositeFrame::Class())) {
00334 CheckItems((TGCompositeFrame*)el->fFrame);
00335 }
00336 }
00337 }
00338 }
00339 return kFALSE;
00340 }
00341
00342
00343 void TGuiBldNameFrame::RemoveFrame(TGFrame *frame)
00344 {
00345
00346
00347 TGListTreeItem *item;
00348 item = fListTree->FindItemByObj(fListTree->GetFirstItem(), frame);
00349 if (item) {
00350 fListTree->DeleteItem(item);
00351 }
00352 }
00353
00354
00355 TGListTreeItem *TGuiBldNameFrame::FindItemByName(TGListTree *tree,
00356 const char* name,
00357 TGListTreeItem *item)
00358 {
00359
00360
00361 TGListTreeItem *fitem;
00362 if (item && name) {
00363 if (!strcmp(item->GetText(), name)) {
00364 return item;
00365 }
00366 else {
00367 if (item->GetFirstChild()) {
00368 fitem = FindItemByName(tree, name, item->GetFirstChild());
00369 if (fitem) return fitem;
00370 }
00371 return FindItemByName(tree, name, item->GetNextSibling());
00372 }
00373 }
00374 return 0;
00375 }
00376
00377
00378 void TGuiBldNameFrame::SelectFrameByItem(TGListTreeItem* item, Int_t)
00379 {
00380
00381
00382 TGFrame *frame = (TGFrame*)item->GetUserData();
00383 ((TGFrame*)frame->GetParent())->SetEditable(kTRUE);
00384 fManager->SelectFrame(frame);
00385 frame->SetEditable(kTRUE);
00386 fClient->NeedRedraw(frame);
00387 }
00388
00389