#include #include #include #include #include #include #include #include #include #include class MyFrame : public TGMainFrame { public: MyFrame(const TGWindow *p, UInt_t w, UInt_t h); ~MyFrame(); void Docked(); void Undocked(); void Resize(Event_t *ev); private: void CreateMenuBar(const TGWindow*); void CreateStatusBar(const TGWindow*); void CreateFrame(TGCompositeFrame*); private: TGDockableFrame *fMenuDock; TGMenuBar *fMenuBar; TGPopupMenu *fMenuFile; TGDockableFrame *fCanvasDock; TRootEmbeddedCanvas *fcanvas; TRootEmbeddedCanvas *fzoom; TGTextView *fstatsViewer; TGDimension fnewSize; TGStatusBar *fStatusBar; ClassDef(MyFrame, 0) }; MyFrame::~MyFrame(){ Cleanup(); } MyFrame::MyFrame(const TGWindow *p, UInt_t w, UInt_t h) : TGMainFrame(p, w, h){ CreateMenuBar(p); TGVerticalFrame *vframe = new TGVerticalFrame(this); fCanvasDock = new TGDockableFrame(vframe); fCanvasDock->SetWindowName("Misc"); fCanvasDock->Connect("Docked()","MyFrame", this, "Docked()"); fCanvasDock->Connect("Undocked()","MyFrame", this, "Undocked()"); fCanvasDock->SetFixedSize(kFALSE); CreateFrame(fCanvasDock); vframe->AddFrame(fCanvasDock, new TGLayoutHints(kLHintsExpandX|kLHintsExpandY,1,1,1,1)); AddFrame(vframe, new TGLayoutHints(kLHintsExpandX|kLHintsExpandY,2,2,2,2)); CreateStatusBar(); SetCleanup(kDeepCleanup); SetMWMHints(kMWMDecorAll,kMWMFuncAll,kMWMInputModeless); MapSubwindows(); Resize(GetDefaultSize()); MapWindow(); Resize(600,500); } void MyFrame::Undocked(){ cout << "UNDOCKED " << endl; Resize(GetDefaultSize()); Layout(); fCanvasDock->GetUndocked()->Connect("ProcessedConfigure(Event_t*)", "MyFrame", this, "Resize(Event_t*)"); } void MyFrame::Docked(){ cout << "DOCKED " << endl; // for some reason, this works only when increasing the size... // fCanvasDock->GetContainer()->Resize(fnewSize); // Resize(GetDefaultSize()); Resize(fnewSize); Layout(); } void MyFrame::Resize(Event_t *ev) { if (ev->fType != kConfigureNotify) return; if (fCanvasDock->IsUndocked() && fCanvasDock->GetUndocked()) { fnewSize = fCanvasDock->GetContainer()->GetSize(); } Resize(GetDefaultSize()); Layout(); } void MyFrame::CreateFrame(TGCompositeFrame *parent){ TGVerticalFrame *vframe = new TGVerticalFrame(parent,10,10); // main canvas TGHorizontalFrame *fH1 = new TGHorizontalFrame(vframe,10,50,kFixedHeight); TGCompositeFrame *fFtop = new TGCompositeFrame(fH1,10,10,kSunkenFrame); fcanvas = new TRootEmbeddedCanvas("mainCanvas", fFtop); fcanvas->GetCanvas()->Connect("ProcessedEvent(Int_t,Int_t,Int_t,TObject*)", "TMainWindow", this, "EventInfo(Int_t,Int_t,Int_t,TObject*)"); fFtop->AddFrame(fcanvas, new TGLayoutHints(kLHintsNormal|kLHintsExpandY|kLHintsExpandX,0,0,0,0)); fH1->AddFrame(fFtop, new TGLayoutHints(kLHintsNormal|kLHintsExpandX|kLHintsExpandY,0,0,0,0)); // horizontal splitter TGHSplitter *hsplitter = new TGHSplitter(vframe,2,2); hsplitter->SetFrame(fH1,kTRUE); // embedded canvas TGHorizontalFrame *fH2 = new TGHorizontalFrame(vframe,10,10); TGCompositeFrame *fFbottom = new TGCompositeFrame(fH2, 10, 10, kSunkenFrame); TGHorizontalFrame *fH3 = new TGHorizontalFrame(fFbottom,10,10); TGVerticalFrame *fV1 = new TGVerticalFrame(fH2,10,10,kFixedWidth); TGCompositeFrame *fFleft = new TGCompositeFrame(fV1,10,10,kSunkenFrame); fstatsViewer = new TGTextView(fFleft); fFleft->AddFrame(fstatsViewer, new TGLayoutHints(kLHintsNormal|kFitWidth|kLHintsExpandY,0,0,0,0)); fV1->AddFrame(fFleft, new TGLayoutHints(kLHintsTop|kLHintsExpandX|kLHintsExpandY,0,0,0,0)); TGVSplitter *vsplitter = new TGVSplitter(fH2,2,2); vsplitter->SetFrame(fV1,kTRUE); TGVerticalFrame *fV2 = new TGVerticalFrame(fH2,10,10); TGCompositeFrame *fFright = new TGCompositeFrame(fV2,10,10); fzoom = new TRootEmbeddedCanvas("zoom", fFright); fFright->AddFrame(fzoom, new TGLayoutHints(kLHintsNormal|kFitWidth|kLHintsExpandY,0,0,0,0)); fV2->AddFrame(fFright, new TGLayoutHints(kLHintsTop|kLHintsExpandX|kLHintsExpandY,0,0,0,0)); const int width = 150; fV1->Resize(fFleft->GetDefaultWidth()+width, fV1->GetDefaultHeight()); fV2->Resize(fFright->GetDefaultWidth(), fV1->GetDefaultHeight()); fH3->AddFrame(fV1, new TGLayoutHints(kLHintsLeft|kLHintsExpandY)); fH3->AddFrame(vsplitter, new TGLayoutHints(kLHintsLeft|kLHintsExpandY)); fH3->AddFrame(fV2, new TGLayoutHints(kLHintsRight|kLHintsExpandX|kLHintsExpandY)); fFbottom->AddFrame(fH3, new TGLayoutHints(kLHintsExpandX|kLHintsExpandY,0,0,0,0)); fH2->AddFrame(fFbottom, new TGLayoutHints(kLHintsNormal|kLHintsExpandX|kLHintsExpandY,0,0,0,0)); fH1->Resize(fFtop->GetDefaultWidth(), fH1->GetDefaultHeight()+250); fH2->Resize(fFbottom->GetDefaultWidth(), fH2->GetDefaultHeight()); vframe->AddFrame(fH1,new TGLayoutHints(kLHintsExpandX)); vframe->AddFrame(hsplitter, new TGLayoutHints(kLHintsTop|kLHintsExpandX)); vframe->AddFrame(fH2, new TGLayoutHints(kLHintsExpandX|kLHintsExpandY)); parent->AddFrame(vframe, new TGLayoutHints(kLHintsExpandX|kLHintsExpandY,2,2,2,2)); } void MyFrame::CreateMenuBar(const TGWindow *p){ fMenuDock = new TGDockableFrame(this); AddFrame(fMenuDock, new TGLayoutHints(kLHintsExpandX,0,0,1,0)); fMenuDock->EnableUndock(kTRUE); fMenuFile = new TGPopupMenu(p); fMenuFile->AddEntry("&Save", 0); fMenuFile->AddSeparator(); fMenuFile->AddEntry("S&ave as...", 1); fMenuBar = new TGMenuBar(fMenuDock, 1, 1, kHorizontalFrame); fMenuBar->AddPopup("&File", fMenuFile, new TGLayoutHints(kLHintsTop|kLHintsLeft,0,4,0,0)); fMenuDock->AddFrame(fMenuBar, new TGLayoutHints(kLHintsTop|kLHintsExpandX)); } void MyFrame::CreateStatusBar(){ Int_t parts[]={50,50}; fStatusBar = new TGStatusBar(this, 10, 10, kHorizontalFrame); fStatusBar->SetParts(parts,2); fStatusBar->SetText("One",0); fStatusBar->SetText("Two",1); fStatusBar->Draw3DCorner(kTRUE); AddFrame(fStatusBar, new TGLayoutHints(kLHintsBottom|kLHintsLeft|kLHintsExpandX,0,0,2,0)); } void dock2(){ new MyFrame(gClient->GetRoot(), 300, 200); }