#include "TGFrame.h"
#include "TGLayout.h"
#include "TGSplitter.h"
#include "TGSplitFrame.h"
#include "TString.h"
#include "Riostream.h"
ClassImp(TGSplitFrame)
TGSplitFrame::TGSplitFrame(const TGWindow *p, UInt_t w, UInt_t h,
UInt_t options) : TGCompositeFrame(p, w, h, options),
fFrame(0), fSplitter(0), fFirst(0), fSecond(0)
{
fHRatio = fWRatio = 0.0;
AddInput(kStructureNotifyMask);
}
TGSplitFrame::~TGSplitFrame()
{
Cleanup();
}
void TGSplitFrame::AddFrame(TGFrame *f, TGLayoutHints *l)
{
TGCompositeFrame::AddFrame(f, l);
fFrame = f;
}
void TGSplitFrame::Cleanup()
{
if (fFirst) {
fFirst->Cleanup();
delete fFirst;
fFirst = 0;
}
if (fSecond) {
fSecond->Cleanup();
delete fSecond;
fSecond = 0;
}
if (fSplitter) {
delete fSplitter;
fSplitter = 0;
}
}
Bool_t TGSplitFrame::HandleConfigureNotify(Event_t *)
{
if (!fFirst) {
TGWindow *w = (TGWindow *)GetParent();
TGSplitFrame *p = dynamic_cast<TGSplitFrame *>(w);
if (p) {
if (p->GetFirst()) {
Float_t hratio = (Float_t)p->GetFirst()->GetHeight() / (Float_t)p->GetHeight();
Float_t wratio = (Float_t)p->GetFirst()->GetWidth() / (Float_t)p->GetWidth();
p->SetHRatio(hratio);
p->SetWRatio(wratio);
}
}
return kTRUE;
}
if ((fHRatio > 0.0) && (fWRatio > 0.0)) {
Float_t h = fHRatio * (Float_t)GetHeight();
fFirst->SetHeight((UInt_t)h);
Float_t w = fWRatio * (Float_t)GetWidth();
fFirst->SetWidth((UInt_t)w);
}
fHRatio = (Float_t)fFirst->GetHeight() / (Float_t)GetHeight();
fWRatio = (Float_t)fFirst->GetWidth() / (Float_t)GetWidth();
fClient->NeedRedraw(this);
if (!gVirtualX->InheritsFrom("TGX11"))
Layout();
return kTRUE;
}
void TGSplitFrame::HSplit(UInt_t h)
{
if ((fSplitter != 0) || (fFirst != 0) || (fSecond != 0) || (fFrame != 0))
return;
UInt_t height = (h > 0) ? h : fHeight/2;
ChangeOptions((GetOptions() & ~kHorizontalFrame) | kVerticalFrame);
fFirst = new TGSplitFrame(this, fWidth, height, kSunkenFrame | kFixedHeight);
fSecond = new TGSplitFrame(this, fWidth, height, kSunkenFrame);
fSplitter = new TGHSplitter(this, 4, 4);
fSplitter->SetFrame(fFirst, kTRUE);
AddFrame(fFirst, new TGLayoutHints(kLHintsExpandX));
AddFrame(fSplitter, new TGLayoutHints(kLHintsLeft | kLHintsTop |
kLHintsExpandX));
AddFrame(fSecond, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY));
}
void TGSplitFrame::VSplit(UInt_t w)
{
if ((fSplitter != 0) || (fFirst != 0) || (fSecond != 0) || (fFrame != 0))
return;
UInt_t width = (w > 0) ? w : fWidth/2;
ChangeOptions((GetOptions() & ~kVerticalFrame) | kHorizontalFrame);
fFirst = new TGSplitFrame(this, width, fHeight, kSunkenFrame | kFixedWidth);
fSecond = new TGSplitFrame(this, width, fHeight, kSunkenFrame);
fSplitter = new TGVSplitter(this, 4, 4);
fSplitter->SetFrame(fFirst, kTRUE);
AddFrame(fFirst, new TGLayoutHints(kLHintsExpandY));
AddFrame(fSplitter, new TGLayoutHints(kLHintsLeft | kLHintsTop |
kLHintsExpandY));
AddFrame(fSecond, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY));
}
void TGSplitFrame::SwitchFrames(TGFrame *frame, TGCompositeFrame *dest,
TGFrame *prev)
{
TGCompositeFrame *parent = (TGCompositeFrame *)frame->GetParent();
prev->UnmapWindow();
dest->RemoveFrame(prev);
prev->ReparentWindow(gClient->GetDefaultRoot());
frame->UnmapWindow();
parent->RemoveFrame(frame);
frame->ReparentWindow(dest);
dest->AddFrame(frame, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY));
frame->Resize(dest->GetDefaultSize());
dest->MapSubwindows();
dest->Layout();
prev->ReparentWindow(parent);
parent->AddFrame(prev, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY));
prev->Resize(parent->GetDefaultSize());
parent->MapSubwindows();
parent->Layout();
}
void TGSplitFrame::SavePrimitive(ostream &out, Option_t *option )
{
if (fBackground != GetDefaultFrameBackground()) SaveUserColor(out, option);
out << endl << " // splittable frame" << endl;
out << " TGSplitFrame *";
out << GetName() << " = new TGSplitFrame(" << fParent->GetName()
<< "," << GetWidth() << "," << GetHeight();
if (fBackground == GetDefaultFrameBackground()) {
if (!GetOptions()) {
out << ");" << endl;
} else {
out << "," << GetOptionString() <<");" << endl;
}
} else {
out << "," << GetOptionString() << ",ucolor);" << endl;
}
TGLayoutManager * lm = GetLayoutManager();
if ((GetOptions() & kHorizontalFrame) &&
(lm->InheritsFrom(TGHorizontalLayout::Class()))) {
;
} else if ((GetOptions() & kVerticalFrame) &&
(lm->InheritsFrom(TGVerticalLayout::Class()))) {
;
} else {
out << " " << GetName() <<"->SetLayoutManager(";
lm->SavePrimitive(out, option);
out << ");"<< endl;
}
SavePrimitiveSubframes(out, option);
}
Last change: Tue May 13 17:14:40 2008
Last generated: 2008-05-13 17:14
This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.