TGuiBldNameFrame.cxx

Go to the documentation of this file.
00001 // @(#)root/guibuilder:$Id: TGuiBldNameFrame.cxx 32184 2010-02-02 14:45:30Z bellenot $
00002 // Author: Valeriy Onuchin   12/09/04
00003 
00004 /*************************************************************************
00005  * Copyright (C) 1995-2004, Rene Brun and Fons Rademakers.               *
00006  * All rights reserved.                                                  *
00007  *                                                                       *
00008  * For the licensing terms see $ROOTSYS/LICENSE.                         *
00009  * For the list of contributors see $ROOTSYS/README/CREDITS.             *
00010  *************************************************************************/
00011 
00012 //////////////////////////////////////////////////////////////////////////
00013 //                                                                      //
00014 // TGuiNameFrame                                                        //
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    // Constructor.
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    //list tree
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    //nameframe
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    // Redraw frame (just a prototype).
00111 
00112    //TColor *col = gROOT->GetColor(29);
00113    //TRootGuiBuilder::SetBgndColor(fTitleFrame, col->GetPixel());
00114    TGCompositeFrame::DoRedraw();
00115 }
00116 
00117 //______________________________________________________________________________
00118 void TGuiBldNameFrame::Reset()
00119 {
00120    // Reset name frame.
00121 
00122    fFrameName->SetText("");
00123    fLabel->SetText("");
00124    DoRedraw();
00125 }
00126 
00127 //______________________________________________________________________________
00128 void TGuiBldNameFrame::ChangeSelected(TGFrame *frame)
00129 {
00130    // Change selected frame.
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          //different MDI
00152          if (fListTree) {
00153             //clear the list tree displayed
00154             while (fListTree->GetFirstItem()) {
00155                fListTree->DeleteItem(fListTree->GetFirstItem());
00156             }
00157             MapItems(main);
00158          }
00159       }
00160       else // check if new items added or old ones reparented -> update tree
00161          CheckItems(main);
00162    }
00163 
00164    //highlight and open
00165    TGListTreeItem *item = 0;
00166    fListTree->OpenItem(fListTree->GetFirstItem()); //mdi
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    // Set new name of frame, if it doesn't already exist in the same MDI frame.
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       // hack against selecting the message box itself
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       //clear the list tree displayed
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    // Find the parent mdi frame
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    // Map all the frames and subframes in mdi frame to the list tree.
00250 
00251    if (!main) {
00252      return;
00253    }
00254 
00255    TList *list = main->GetList(); //list of all elements in the frame
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             // first loop, we're in the main frame -> add items directly
00266             // to main frame folder of the tree list
00267             if (!fListTree->FindChildByData(0, main)) {
00268                // add main frame to root
00269                fListTree->AddItem(0, main->GetName(), main);
00270             }
00271              //add other items to mainframe
00272             fListTree->AddItem(fListTree->FindChildByData(0, main),
00273                                el->fFrame->GetName(), el->fFrame);
00274 
00275          } else { //means we're in recursion loop, browsing in subframe
00276             // result is the name of the tree folder to which we want to
00277             // place the element
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                //recursive call for composite subframes
00288             main = (TGCompositeFrame*)(el->fFrame);
00289             MapItems(main);
00290          }
00291       }
00292    }
00293 }
00294 
00295 //______________________________________________________________________________
00296 Bool_t TGuiBldNameFrame::CheckItems(TGCompositeFrame *main)
00297 {
00298    // Check if items are in the list tree and at the same place.
00299 
00300    TList *list = main->GetList(); //list of all elements in the frame
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                //return kTRUE; //selected item not found = is newly created
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                //return kTRUE; //parent of the item changed
00332             }
00333             if (el->fFrame->InheritsFrom(TGCompositeFrame::Class())) {
00334                CheckItems((TGCompositeFrame*)el->fFrame);
00335             }
00336          }
00337       }
00338    }
00339    return kFALSE; //treelist remains the same
00340 }
00341 
00342 //______________________________________________________________________________
00343 void TGuiBldNameFrame::RemoveFrame(TGFrame *frame)
00344 {
00345    // Remove a frame.
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    // Find item with GetText == name. Search tree downwards starting at item.
00360 
00361    TGListTreeItem *fitem;
00362    if (item && name) {
00363       if (!strcmp(item->GetText(), name)) { //if names are equal
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    // When list tree item is clicked, frame with that name is selected.
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 

Generated on Tue Jul 5 14:22:14 2011 for ROOT_528-00b_version by  doxygen 1.5.1