[ROOT] Problem with TGCheckButton (when trying to add Tab)

From: cstrato@EUnet.at
Date: Wed Dec 19 2001 - 16:49:35 MET


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