Dear Rooters
I would like to use a TGCheckButton to add/delete a Tab
(see the enclosed macro guiAddTab.C).
Sorrowly, this is not possible since activating the CheckBox
results in signal "down" followed immediately by signal "up",
finally giving the following error:
root [9] .x guiAddTab.C
root [10] down
up
Error in <RootX11ErrorHandler>: BadWindow (invalid Window parameter)
(XID: 79692109)
When I test the function in the following way:
void MyClass::FClickCheck1(Bool_t vIsOn)
{
if (vIsOn) {
cout << "down" << endl;
} else {
cout << "up" << endl;
}//if
fTab->MapSubwindows();
fTab->Layout();
}//FClickCheck1
then everything is ok, but in the final function the
signal Toggled(Bool_t) or Clicked() is always emitted twice.
When I use "Pressed()", then I can add the Tab, but I
can no longer uncheck the CheckBox and delete the Tab!
Thus, is not clear to me when I have to use Pressed(),
Clicked(), Released() or Toggled().
Can you tell me what is wrong in my code,
and why the signal is emitted twice?
Thank you very much in advance.
Best regards
Christian
----------------------------------
C.h.r.i.s.t.i.a.n S.t.r.a.t.o.w.a
V.i.e.n.n.a, A.u.s.t.r.i.a
//--------------------------------------//
// macro guiAddTab.C //
//--------------------------------------//
class MyClass {
RQ_OBJECT()
private:
TGMainFrame *fMain;
TGCompositeFrame *fFrameLB;
TGButton *fOkBtn;
TGButton *fCancelBtn;
TGGroupFrame *fF1V1;
TGTab *fTab;
TGCompositeFrame *fT0;
TGTextEntry *fTxt0;
TGTextBuffer *fBuf0;
TGCompositeFrame *fT1;
TGTextEntry *fTxt1;
TGTextBuffer *fBuf1;
TGCheckButton *fCheck1;
TGCompositeFrame *fT2;
TGTextEntry *fTxt2;
TGTextBuffer *fBuf2;
TGCompositeFrame *fT3;
TGTextEntry *fTxt3;
TGTextBuffer *fBuf3;
TGLayoutHints *fLH1, *fLH2;
TList *fTrash;
Bool_t fHasTab2;
public:
MyClass(const TGWindow *vWindow,
UInt_t vWidth, UInt_t vHeight, UInt_t vOptions =
kVerticalFrame);
virtual ~MyClass();
// slots
void FCloseWindow();
void FClickOK();
void FClickCancel();
void FClickCheck1(Bool_t vIsOn);
// void FClickCheck1();
private:
void FCreateTab0();
void FDeleteTab0();
void FCreateTab1();
void FDeleteTab1();
void FCreateTab2();
void FDeleteTab2();
void FCreateTab3();
void FDeleteTab3();
// ClassDef(MyClass,0) //MyClass
};
//ClassImp(MyClass)
//----------------------------------------------------------------------//
MyClass::MyClass(const TGWindow *vWindow,
UInt_t vWidth, UInt_t vHeight, UInt_t vOptions)
{
fTrash = new TList;
TGLayoutHints *vLH;
fMain = new TGMainFrame(vWindow, vWidth, vHeight, vOptions);
fMain->Connect("CloseWindow()", "MyClass", this, "FCloseWindow()");
// FrameLB for OK, Cancel
fFrameLB = new TGHorizontalFrame(fMain, 120, 20, kFixedWidth);
fLH1 = new TGLayoutHints(kLHintsBottom | kLHintsCenterX, 2, 2, 5, 1);
fMain->AddFrame(fFrameLB, fLH1);
fTrash->Add(fLH1);
fOkBtn = new TGTextButton(fFrameLB, "&OK", 1);
fOkBtn->Connect("Clicked()", "MyClass", this, "FClickOK()");
vLH = new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX, 2,
15, 2, 2);
fFrameLB->AddFrame(fOkBtn, vLH);
fTrash->Add(vLH);
fCancelBtn = new TGTextButton(fFrameLB, "&Cancel", 2);
fCancelBtn->Connect("Clicked()", "MyClass", this, "FClickCancel()");
vLH = new TGLayoutHints(kLHintsTop | kLHintsRight, 5, 2, 2, 2);
fFrameLB->AddFrame(fCancelBtn, vLH);
fTrash->Add(vLH);
fF1V1 = new TGGroupFrame(fMain, "Text Info", kHorizontalFrame);
vLH = new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX, 5,
5, 5, 5);
fMain->AddFrame(fF1V1, vLH);
fTrash->Add(vLH);
// Frame for Tab widgets
fTab = new TGTab(fF1V1, 150, 150);
this->FCreateTab0();
this->FCreateTab1();
this->FCreateTab3();
fHasTab2 = kFALSE;
vLH = new TGLayoutHints(kLHintsTop | kLHintsLeft);
fF1V1->AddFrame(fTab, vLH);
fTrash->Add(vLH);
// Main frame settings
fMain->MapSubwindows();
fMain->Resize(fMain->GetDefaultSize());
fMain->SetWMSizeHints(300,200,300,200,0,0); //no grow
fMain->SetWindowName("Test");
fMain->MapWindow();
}//Constructor
MyClass::~MyClass()
{
this->FDeleteTab3();
// this->FDeleteTab2();
this->FDeleteTab1();
this->FDeleteTab0();
delete fTab; delete fF1V1;
delete fOkBtn; delete fCancelBtn; delete fFrameLB;
delete fMain;
if (fTrash) fTrash->Delete();
delete fTrash;
}//Destructor
void MyClass::FCloseWindow()
{
delete this;
}//FCloseWindow
void MyClass::FClickCancel()
{
fMain->SendCloseMessage();
}//FClickCancel
void MyClass::FClickOK()
{
if (fOkBtn->GetState() != kButtonDisabled) {
fMain->SendCloseMessage();
}//if
}//FClickOK
/*
void MyClass::FClickCheck1(Bool_t vIsOn)
{
// if (fCheck1->GetState() == kButtonDown) {
if (vIsOn) {
cout << "down" << endl;
} else {
cout << "up" << endl;
}//if
fTab->MapSubwindows();
fTab->Layout();
}//FClickCheck1
*/
void MyClass::FClickCheck1(Bool_t vIsOn)
{
this->FDeleteTab3();
if (fHasTab2) {
fTab->RemoveTab(3);
} else {
fTab->RemoveTab(2);
}//if
fTab->Layout();
if (fCheck1->GetState() == kButtonDown) {
cout << "down" << endl;
this->FCreateTab2();
this->FCreateTab3();
} else {
cout << "up" << endl;
if (fHasTab2) {
this->FDeleteTab2();
fTab->RemoveTab(2);
}//if
this->FCreateTab3();
}//if
fTab->MapSubwindows();
fTab->Layout();
}//FClickCheck1
void MyClass::FCreateTab0()
{
TGLayoutHints *vLH;
TGCompositeFrame *vTabFrame;
vTabFrame = fTab->AddTab("Tab 0");
fT0 = new TGCompositeFrame(vTabFrame, 60, 20, kVerticalFrame);
vLH = new TGLayoutHints(kLHintsTop | kLHintsLeft, 2, 2, 5, 2);
vTabFrame->AddFrame(fT0, vLH);
fTrash->Add(vLH);
fTxt0 = new TGTextEntry(fT0, fBuf0 = new TGTextBuffer(255), -1);
fTxt0->Resize(200, fTxt0->GetDefaultHeight());
vLH = new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsExpandX, 2,
2, 5, 5);
fT0->AddFrame(fTxt0, vLH);
fTrash->Add(vLH);
}//FCreateTab0
void MyClass::FDeleteTab0()
{
delete fTxt0; delete fT0;
}//FDeleteTab0
void MyClass::FCreateTab1()
{
TGLayoutHints *vLH;
TGCompositeFrame *vTabFrame;
vTabFrame = fTab->AddTab("Tab 1");
fT1 = new TGCompositeFrame(vTabFrame, 60, 20, kVerticalFrame);
vLH = new TGLayoutHints(kLHintsTop | kLHintsLeft, 2, 2, 5, 2);
vTabFrame->AddFrame(fT1, vLH);
fTrash->Add(vLH);
fTxt1 = new TGTextEntry(fT1, fBuf1 = new TGTextBuffer(255), -1);
fTxt1->Resize(200, fTxt1->GetDefaultHeight());
vLH = new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsExpandX, 2,
2, 5, 5);
fT1->AddFrame(fTxt1, vLH);
fTrash->Add(vLH);
fCheck1 = new TGCheckButton(fT1, "Add Tab 2", 10);
fCheck1->Connect("Toggled(Bool_t)", "MyClass", this,
"FClickCheck1(Bool_t)");
// fCheck1->Connect("Pressed()", "MyClass", this, "FClickCheck1()");
// fCheck1->Connect("Clicked()", "MyClass", this, "FClickCheck1()");
fT1->AddFrame(fCheck1, vLH);
}//FCreateTab1
void MyClass::FDeleteTab1()
{
delete fTxt1; delete fT1;
}//FDeleteTab1
void MyClass::FCreateTab2()
{
TGLayoutHints *vLH;
TGCompositeFrame *vTabFrame;
vTabFrame = fTab->AddTab("Tab 2");
fT2 = new TGCompositeFrame(vTabFrame, 60, 20, kVerticalFrame);
vLH = new TGLayoutHints(kLHintsTop | kLHintsLeft, 2, 2, 5, 2);
vTabFrame->AddFrame(fT2, vLH);
fTrash->Add(vLH);
fTxt2 = new TGTextEntry(fT2, fBuf2 = new TGTextBuffer(255), -1);
fTxt2->Resize(200, fTxt2->GetDefaultHeight());
vLH = new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsExpandX, 2,
2, 5, 5);
fT2->AddFrame(fTxt2, vLH);
fTrash->Add(vLH);
fHasTab2 = kTRUE;
}//FCreateTab2
void MyClass::FDeleteTab2()
{
delete fTxt2; delete fT2;
fHasTab2 = kFALSE;
}//FDeleteTab2
void MyClass::FCreateTab3()
{
TGLayoutHints *vLH;
TGCompositeFrame *vTabFrame;
vTabFrame = fTab->AddTab("Tab 3");
fT3 = new TGCompositeFrame(vTabFrame, 60, 20, kVerticalFrame);
vLH = new TGLayoutHints(kLHintsTop | kLHintsLeft, 2, 2, 5, 2);
vTabFrame->AddFrame(fT3, vLH);
fTrash->Add(vLH);
fTxt3 = new TGTextEntry(fT3, fBuf3 = new TGTextBuffer(255), -1);
fTxt3->Resize(200, fTxt3->GetDefaultHeight());
vLH = new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsExpandX, 2,
2, 5, 5);
fT3->AddFrame(fTxt3, vLH);
fTrash->Add(vLH);
}//FCreateTab3
void MyClass::FDeleteTab3()
{
delete fTxt3; delete fT3;
}//FDeleteTab3
//----------------------------------------------------------------------//
void guiAddTab()
{
new MyClass(gClient->GetRoot(), 300, 120);
}
This archive was generated by hypermail 2b29 : Tue Jan 01 2002 - 17:51:12 MET