#include "TGuiBldNameFrame.h"
#include "TGLabel.h"
#include "TGTextEntry.h"
#include "TGuiBldEditor.h"
#include "TGLayout.h"
#include "TG3DLine.h"
#include "TColor.h"
#include "TROOT.h"
#include "TRootGuiBuilder.h"
#include "TGButton.h"
#include "TGFrame.h"
#include "TGMdiFrame.h"
#include "TGCanvas.h"
#include "TGListTree.h"
#include "TGuiBldDragManager.h"
#include "TGMsgBox.h"
#include "TGSplitter.h"
ClassImp(TGuiBldNameFrame)
TGuiBldNameFrame::TGuiBldNameFrame(const TGWindow *p, TGuiBldEditor *editor) :
TGCompositeFrame(p, 1, 1)
{
fEditor = editor;
fBuilder = (TRootGuiBuilder*)TRootGuiBuilder::Instance();
fManager = fBuilder->GetManager();
fEditDisabled = kEditDisable;
SetCleanup(kDeepCleanup);
TGFrame *frame = 0;
TGFrame *fSelected = fEditor->GetSelected();
if (fSelected) frame = fSelected;
TGVerticalFrame *cf = new TGVerticalFrame(this, 180, 400);
TGHorizontalFrame *f = new TGHorizontalFrame(cf);
f->AddFrame(new TGLabel(f, "MDI Frame content"),
new TGLayoutHints(kLHintsLeft, 0, 1, 0, 0));
f->AddFrame(new TGHorizontal3DLine(f), new TGLayoutHints(kLHintsExpandX,
5, 5, 7, 7));
cf->AddFrame(f, new TGLayoutHints(kLHintsTop | kLHintsExpandX));
fCanvas = new TGCanvas(cf, 180, 110);
fListTree = new TGListTree(fCanvas, 0);
fCanvas->MapSubwindows();
cf->AddFrame(fCanvas, new TGLayoutHints(kLHintsExpandY | kLHintsExpandX));
fTitleFrame = new TGHorizontalFrame(cf, 100, 30);
fTitleFrame->AddFrame(new TGLabel(fTitleFrame, "Variable name"),
new TGLayoutHints(kLHintsLeft | kLHintsCenterY ,
0, 1, 0, 0));
fTitleFrame->AddFrame(new TGHorizontal3DLine(fTitleFrame),
new TGLayoutHints(kLHintsCenterY | kLHintsExpandX,
1, 1, 1, 1));
cf->AddFrame(fTitleFrame, new TGLayoutHints(kLHintsExpandX | kLHintsTop));
TString name = "";
if (frame) {
name = frame->ClassName();
}
fLabel = new TGLabel(cf, name.Data());
cf->AddFrame(fLabel, new TGLayoutHints(kLHintsCenterX, 1, 1, 0, 0));
TGCompositeFrame *sub = new TGHorizontalFrame(cf, 100, 30);
fFrameName = new TGTextEntry(sub, frame ? frame->GetName() : "noname");
fFrameName->SetAlignment(kTextLeft);
fFrameName->Resize(120, fFrameName->GetHeight());
sub->AddFrame(fFrameName, new TGLayoutHints(kLHintsTop | kLHintsCenterX,
2, 2, 0, 0));
fFrameName->SetEnabled(kTRUE);
TGTextButton *btn = new TGTextButton(sub, " Set Name ");
sub->AddFrame(btn, new TGLayoutHints(kLHintsTop));
cf->AddFrame(sub, new TGLayoutHints(kLHintsTop | kLHintsCenterX,
2, 2, 0, 0));
AddFrame(cf, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY));
btn->Connect("Clicked()", "TGuiBldNameFrame", this, "UpdateName()");
btn->SetToolTipText("Set variable name");
fListTree->Connect("Clicked(TGListTreeItem*, Int_t)", "TGuiBldNameFrame",
this, "SelectFrameByItem(TGListTreeItem*, Int_t)");
}
void TGuiBldNameFrame::DoRedraw()
{
TGCompositeFrame::DoRedraw();
}
void TGuiBldNameFrame::Reset()
{
fFrameName->SetText("");
fLabel->SetText("");
DoRedraw();
}
void TGuiBldNameFrame::ChangeSelected(TGFrame *frame)
{
fFrameName->Disconnect();
if (!frame) {
Reset();
return;
}
TString name = frame->ClassName();
fLabel->SetText(name.Data());
fFrameName->SetText(frame->GetName());
Resize();
TGCompositeFrame *main = GetMdi(frame);
if (main) {
if ((!fListTree) || (!fListTree->GetFirstItem()))
MapItems(main);
else if ((fListTree->GetFirstItem()->GetUserData()) != main) {
if (fListTree) {
while (fListTree->GetFirstItem()) {
fListTree->DeleteItem(fListTree->GetFirstItem());
}
MapItems(main);
}
}
else
CheckItems(main);
}
TGListTreeItem *item = 0;
fListTree->OpenItem(fListTree->GetFirstItem());
item = fListTree->FindItemByObj(fListTree->GetFirstItem(), frame);
if (item) {
fListTree->HighlightItem(item);
while (item->GetParent()) {
item = item->GetParent();
item->SetOpen(kTRUE);
}
}
fClient->NeedRedraw(fListTree, kTRUE);
fClient->NeedRedraw(fCanvas, kTRUE);
DoRedraw();
}
void TGuiBldNameFrame::UpdateName()
{
TGFrame *frame = fEditor->GetSelected();
TString ch = fFrameName->GetText();
if (!frame) {
return;
}
if (FindItemByName(fListTree, ch, fListTree->GetFirstItem())) {
fBuilder->UpdateStatusBar("Variable name already exists.");
TGCompositeFrame *cf = (TGCompositeFrame*)frame->GetParent();
int retval;
fBuilder->GetManager()->SetEditable(kFALSE);
new TGMsgBox(fClient->GetDefaultRoot(), fBuilder,
"Name conflict", "Variable name already exists.",
kMBIconExclamation, kMBOk, &retval);
cf->SetEditable(kTRUE);
fBuilder->GetManager()->SelectFrame(frame);
frame->SetEditable(kTRUE);
}
else {
fBuilder->UpdateStatusBar("Variable name changed.");
frame->SetName(ch);
}
if (fListTree) {
while (fListTree->GetFirstItem()) {
fListTree->DeleteItem(fListTree->GetFirstItem());
}
}
TGCompositeFrame *main = GetMdi(frame);
MapItems(main);
if (fListTree) fClient->NeedRedraw(fListTree, kTRUE);
fClient->NeedRedraw(fFrameName);
DoRedraw();
}
TGCompositeFrame *TGuiBldNameFrame::GetMdi(TGFrame *frame)
{
TGFrame *p = frame;
while (p && (p != fClient->GetDefaultRoot()) ) {
if (p->InheritsFrom(TGMdiFrame::Class())) {
return (TGCompositeFrame*)p;
}
else if (p->InheritsFrom(TGMainFrame::Class())) {
return (TGCompositeFrame*)p;
}
p = (TGFrame*)p->GetParent();
}
return 0;
}
void TGuiBldNameFrame::MapItems(TGCompositeFrame *main)
{
if (!main) {
return;
}
TList *list = main->GetList();
TGFrameElement *el = 0;
TIter next(list);
while ((el = (TGFrameElement *) next())) {
if (el->fFrame) {
if (main->InheritsFrom(TGMdiFrame::Class()) ||
main->InheritsFrom(TGMainFrame::Class())) {
if (!fListTree->FindChildByData(0, main)) {
fListTree->AddItem(0, main->GetName(), main);
}
fListTree->AddItem(fListTree->FindChildByData(0, main),
el->fFrame->GetName(), el->fFrame);
} else {
TGListTreeItem *result = 0;
TGFrame *par = (TGFrame*)el->fFrame->GetParent();
result = fListTree->FindItemByObj(fListTree->GetFirstItem(), par);
if (result)
fListTree->AddItem(result, el->fFrame->GetName(), el->fFrame);
}
if ( (el->fFrame->InheritsFrom(TGCompositeFrame::Class())) &&
(!(el->fFrame->InheritsFrom(TGMdiFrame::Class()))) ) {
main = (TGCompositeFrame*)(el->fFrame);
MapItems(main);
}
}
}
}
Bool_t TGuiBldNameFrame::CheckItems(TGCompositeFrame *main)
{
TList *list = main->GetList();
if (fListTree) {
TGFrameElement *el = 0;
TGListTreeItem *item = 0;
TIter next(list);
TGFrame *f = 0;
TGListTreeItem *par = 0;
while ((el = (TGFrameElement *) next())) {
if (el && (el->fFrame)) {
item = fListTree->FindItemByObj(fListTree->GetFirstItem(),
el->fFrame);
if (!item) {
f = (TGFrame*)el->fFrame->GetParent();
if (f) {
par = fListTree->FindItemByObj(fListTree->GetFirstItem(), f);
if (par)
fListTree->AddItem(par, el->fFrame->GetName(), el->fFrame);
}
}
else if (item->GetParent() && item->GetParent()->GetUserData() !=
el->fFrame->GetParent()) {
f = (TGFrame*)el->fFrame->GetParent();
if (f) {
par = fListTree->FindItemByObj(fListTree->GetFirstItem(), f);
if (par)
fListTree->Reparent(item, par);
}
}
if (el->fFrame->InheritsFrom(TGCompositeFrame::Class())) {
CheckItems((TGCompositeFrame*)el->fFrame);
}
}
}
}
return kFALSE;
}
void TGuiBldNameFrame::RemoveFrame(TGFrame *frame)
{
TGListTreeItem *item;
item = fListTree->FindItemByObj(fListTree->GetFirstItem(), frame);
if (item) {
fListTree->DeleteItem(item);
}
}
TGListTreeItem *TGuiBldNameFrame::FindItemByName(TGListTree *tree,
const char* name,
TGListTreeItem *item)
{
TGListTreeItem *fitem;
if (item && name) {
if (!strcmp(item->GetText(), name)) {
return item;
}
else {
if (item->GetFirstChild()) {
fitem = FindItemByName(tree, name, item->GetFirstChild());
if (fitem) return fitem;
}
return FindItemByName(tree, name, item->GetNextSibling());
}
}
return 0;
}
void TGuiBldNameFrame::SelectFrameByItem(TGListTreeItem* item, Int_t)
{
TGFrame *frame = (TGFrame*)item->GetUserData();
((TGFrame*)frame->GetParent())->SetEditable(kTRUE);
fManager->SelectFrame(frame);
frame->SetEditable(kTRUE);
fClient->NeedRedraw(frame);
}