mditest.C

Go to the documentation of this file.
00001 // GUI MDI features
00002 // Author: Fons Rademakers   2/9/2004
00003 
00004 #include <stdio.h>
00005 #include <stdlib.h>
00006 
00007 #include <TApplication.h>
00008 #include <TGClient.h>
00009 #include <TGFrame.h>
00010 #include <TGButton.h>
00011 #include <TGTextEntry.h>
00012 #include <TGCanvas.h>
00013 #include <TGMenu.h>
00014 #include <TGMdi.h>
00015 #include <TGMsgBox.h>
00016 #include <TGSlider.h>
00017 #include <TGListBox.h>
00018 #include <RQ_OBJECT.h>
00019 
00020 enum EMenuIds {
00021    M_FILE_NEW,
00022    M_FILE_CLOSE,
00023    M_FILE_EXIT,
00024 
00025    M_WINDOW_HOR,
00026    M_WINDOW_VERT,
00027    M_WINDOW_CASCADE,
00028    M_WINDOW_OPAQUE,
00029    M_WINDOW_ARRANGE,
00030 
00031    M_HELP_CONTENTS,
00032    M_HELP_ABOUT
00033 };
00034 
00035 
00036 //----------------------------------------------------------------------
00037 
00038 class TGMdiTestSubclass {
00039 
00040 RQ_OBJECT("TGMdiTestSubclass")
00041 
00042 protected:
00043    TGMdiFrame       *fMdiFrame;
00044    TGCanvas         *fCanvasWindow;
00045    TGCompositeFrame *fContainer;
00046 
00047 public:
00048    TGMdiTestSubclass(TGMdiMainFrame *main, int w, int h);
00049 
00050    TGMdiFrame *GetMdiFrame() const { return fMdiFrame; }
00051    virtual Bool_t CloseWindow();
00052 };
00053 
00054 class TGMdiHintTest {
00055 
00056 RQ_OBJECT("TGMdiHintTest")
00057 
00058 protected:
00059    TGMdiFrame    *fMdiFrame;
00060    TGTextEntry   *fWName;
00061    TGCheckButton *fClose, *fMenu, *fMin, *fMax, *fSize, *fHelp;
00062 
00063 public:
00064    TGMdiHintTest(TGMdiMainFrame *main, int w, int h);
00065 
00066    void HandleButtons();
00067    void HandleText(const char *);
00068 };
00069 
00070 class TGAppMainFrame  {
00071 
00072 RQ_OBJECT("TGAppMainFrame")
00073 
00074 protected:
00075    TGMainFrame     *fMain;
00076    TGMdiMainFrame  *fMainFrame;
00077    TGMdiMenuBar    *fMenuBar;
00078    TGLayoutHints   *fMenuBarItemLayout;
00079    TGPopupMenu     *fMenuFile, *fMenuWindow, *fMenuHelp;
00080 
00081    void InitMenu();
00082    void CloseWindow();
00083 
00084 public:
00085    TGAppMainFrame(const TGWindow *p, int w, int h);
00086 
00087    void HandleMenu(Int_t id);
00088 };
00089 
00090 //----------------------------------------------------------------------
00091 
00092 TGAppMainFrame::TGAppMainFrame(const TGWindow *p, int w, int h)
00093 {
00094    fMain = new TGMainFrame(p, w, h, kVerticalFrame);
00095    fMenuBar = new TGMdiMenuBar(fMain, 10, 10);
00096    fMain->AddFrame(fMenuBar, new TGLayoutHints(kLHintsTop | kLHintsExpandX));
00097 
00098    fMainFrame = new TGMdiMainFrame(fMain, fMenuBar, 300, 300);
00099    fMain->AddFrame(fMainFrame, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY));
00100 
00101    const TGPicture *pbg = gClient->GetPicture("mditestbg.xpm");
00102    if (pbg)
00103       fMainFrame->GetContainer()->SetBackgroundPixmap(pbg->GetPicture());
00104 
00105    TGMdiFrame *mdiFrame;
00106 
00107    //--- 1
00108 
00109    TGMdiTestSubclass *t = new TGMdiTestSubclass(fMainFrame, 320, 240);
00110    mdiFrame = t->GetMdiFrame();
00111    mdiFrame->SetMdiHints(kMdiClose | kMdiMenu);
00112    mdiFrame->SetWindowName("One");
00113    mdiFrame->MapSubwindows();
00114    mdiFrame->Layout();
00115 
00116    //--- 2
00117 
00118    ULong_t ic;
00119    gClient->GetColorByName("red", ic);
00120    mdiFrame = new TGMdiFrame(fMainFrame, 200, 200,
00121                              kOwnBackground, ic);
00122    mdiFrame->AddFrame(new TGTextButton(mdiFrame, new TGHotString("&Press me!"), 1),
00123                       new TGLayoutHints(kLHintsCenterX | kLHintsCenterY));
00124    mdiFrame->SetMdiHints(kMdiDefaultHints | kMdiHelp);
00125    mdiFrame->SetWindowName("Two");
00126    mdiFrame->MapSubwindows();
00127    mdiFrame->Layout();
00128    mdiFrame->Move(150, 200);
00129 
00130    //--- 3
00131 
00132    gClient->GetColorByName("green", ic);
00133    mdiFrame = new TGMdiFrame(fMainFrame, 200, 200, kOwnBackground, ic);
00134    mdiFrame->AddFrame(new TGTextButton(mdiFrame, new TGHotString("Button 1"), 11),
00135                       new TGLayoutHints(kLHintsCenterX | kLHintsCenterY));
00136    mdiFrame->AddFrame(new TGTextButton(mdiFrame, new TGHotString("Button 2"), 12),
00137                       new TGLayoutHints(kLHintsCenterX | kLHintsCenterY));
00138    mdiFrame->SetMdiHints(kMdiDefaultHints | kMdiHelp);
00139    mdiFrame->SetWindowName("Three");
00140    mdiFrame->MapSubwindows();
00141    mdiFrame->Layout();
00142    mdiFrame->Move(180, 220);
00143 
00144    //--- 4
00145 
00146    gClient->GetColorByName("blue", ic);
00147    mdiFrame = new TGMdiFrame(fMainFrame, 200, 400, kOwnBackground, ic);
00148 
00149    TGListBox *fListBox = new TGListBox(mdiFrame,1);
00150    fListBox->AddEntry("Entry   1", 1);
00151    fListBox->AddEntry("Entry   2", 2);
00152    fListBox->AddEntry("Entry   3", 3);
00153    fListBox->AddEntry("Entry   4", 4);
00154    fListBox->AddEntry("Entry   5", 5);
00155    fListBox->AddEntry("Entry   6", 6);
00156    fListBox->AddEntry("Entry   7", 7);
00157    fListBox->AddEntry("Entry   8", 8);
00158    fListBox->AddEntry("Entry   9", 9);
00159    fListBox->Resize(100,70);
00160    fListBox->SetMultipleSelections(kFALSE);
00161    mdiFrame->AddFrame(fListBox,
00162                       new TGLayoutHints(kLHintsCenterX | kLHintsCenterY));
00163    mdiFrame->AddFrame(new TGHSlider(mdiFrame, 50, kSlider1, 1, 
00164                       kHorizontalFrame, ic),
00165                       new TGLayoutHints(kLHintsCenterX | kLHintsCenterY));
00166    mdiFrame->Move(400, 300);
00167    mdiFrame->SetWindowName("Four");
00168    mdiFrame->MapSubwindows();
00169    mdiFrame->Layout();
00170 
00171    //--- 5
00172 
00173    new TGMdiHintTest(fMainFrame, 200, 200);
00174 
00175    InitMenu();
00176 
00177    fMain->SetWindowName("MDI test");
00178    fMain->SetClassHints("mdi test", "mdi test");
00179 
00180    if (pbg && pbg->GetWidth() > 600 && pbg->GetHeight() > 400)
00181       fMain->Resize(pbg->GetWidth(), pbg->GetHeight()+25);
00182    else
00183       fMain->Resize(640, 400);
00184 
00185    fMain->MapSubwindows();
00186    fMain->MapWindow();
00187    fMain->Layout();
00188 }
00189 
00190 void TGAppMainFrame::HandleMenu(Int_t id)
00191 {
00192    // Handle menu items.
00193 
00194    switch (id) {
00195       case M_FILE_NEW:
00196          new TGMdiFrame(fMainFrame, 200, 100);
00197          break;
00198 
00199       case M_FILE_CLOSE:
00200          fMainFrame->Close(fMainFrame->GetCurrent());
00201          break;
00202 
00203       case M_FILE_EXIT:
00204          CloseWindow();
00205          break;
00206 
00207       case M_WINDOW_HOR:
00208          fMainFrame->TileHorizontal();
00209          break;
00210 
00211       case M_WINDOW_VERT:
00212          fMainFrame->TileVertical();
00213          break;
00214 
00215       case M_WINDOW_CASCADE:
00216          fMainFrame->Cascade();
00217          break;
00218 
00219       case M_WINDOW_ARRANGE:
00220          fMainFrame->ArrangeMinimized();
00221          break;
00222 
00223       case M_WINDOW_OPAQUE:
00224          if (fMenuWindow->IsEntryChecked(M_WINDOW_OPAQUE)) {
00225             fMenuWindow->UnCheckEntry(M_WINDOW_OPAQUE);
00226             fMainFrame->SetResizeMode(kMdiNonOpaque);
00227          } else {
00228             fMenuWindow->CheckEntry(M_WINDOW_OPAQUE);
00229             fMainFrame->SetResizeMode(kMdiOpaque);
00230          }
00231          break;
00232 
00233       default:
00234          fMainFrame->SetCurrent(id);
00235          break;
00236    }
00237 }
00238 
00239 void TGAppMainFrame::InitMenu()
00240 {
00241    fMenuBarItemLayout = new TGLayoutHints(kLHintsTop | kLHintsLeft, 0, 4, 0, 0);
00242 
00243    fMenuFile = new TGPopupMenu(gClient->GetRoot());
00244    fMenuFile->AddEntry(new TGHotString("&New Window"), M_FILE_NEW);
00245    fMenuFile->AddEntry(new TGHotString("&Close Window"), M_FILE_CLOSE);
00246    fMenuFile->AddSeparator();
00247    fMenuFile->AddEntry(new TGHotString("E&xit"), M_FILE_EXIT);
00248 
00249    fMenuWindow = new TGPopupMenu(gClient->GetRoot());
00250    fMenuWindow->AddEntry(new TGHotString("Tile &Horizontally"), M_WINDOW_HOR);
00251    fMenuWindow->AddEntry(new TGHotString("Tile &Vertically"), M_WINDOW_VERT);
00252    fMenuWindow->AddEntry(new TGHotString("&Cascade"), M_WINDOW_CASCADE);
00253    fMenuWindow->AddSeparator();
00254    fMenuWindow->AddPopup(new TGHotString("&Windows"), fMainFrame->GetWinListMenu());
00255    fMenuWindow->AddSeparator();
00256    fMenuWindow->AddEntry(new TGHotString("&Arrange icons"), M_WINDOW_ARRANGE);
00257    fMenuWindow->AddSeparator();
00258    fMenuWindow->AddEntry(new TGHotString("&Opaque resize"), M_WINDOW_OPAQUE);
00259 
00260    fMenuWindow->CheckEntry(M_WINDOW_OPAQUE);
00261 
00262    fMenuHelp = new TGPopupMenu(gClient->GetRoot());
00263    fMenuHelp->AddEntry(new TGHotString("&Contents"), M_HELP_CONTENTS);
00264    fMenuHelp->AddSeparator();
00265    fMenuHelp->AddEntry(new TGHotString("&About"), M_HELP_ABOUT);
00266 
00267    fMenuHelp->DisableEntry(M_HELP_CONTENTS);
00268    fMenuHelp->DisableEntry(M_HELP_ABOUT);
00269 
00270    // menu message are handled by the class' HandleMenu() method
00271    fMenuFile->Connect("Activated(Int_t)", "TGAppMainFrame", this,
00272                       "HandleMenu(Int_t)");
00273    fMenuWindow->Connect("Activated(Int_t)", "TGAppMainFrame", this,
00274                         "HandleMenu(Int_t)");
00275    fMenuHelp->Connect("Activated(Int_t)", "TGAppMainFrame", this,
00276                       "HandleMenu(Int_t)");
00277 
00278    fMenuBar->AddPopup(new TGHotString("&File"), fMenuFile, fMenuBarItemLayout);
00279    fMenuBar->AddPopup(new TGHotString("&Windows"),fMenuWindow,fMenuBarItemLayout);
00280    fMenuBar->AddPopup(new TGHotString("&Help"), fMenuHelp, fMenuBarItemLayout);
00281 }
00282 
00283 void TGAppMainFrame::CloseWindow()
00284 {
00285    gApplication->Terminate(0);
00286 }
00287 
00288 //----------------------------------------------------------------------
00289 
00290 TGMdiTestSubclass::TGMdiTestSubclass(TGMdiMainFrame *main, int w, int h)
00291 {
00292    fMdiFrame = new TGMdiFrame(main, w, h);
00293    fMdiFrame->Connect("CloseWindow()", "TGMdiTestSubclass", this, "CloseWindow()");
00294    fMdiFrame->DontCallClose();
00295 
00296    fCanvasWindow = new TGCanvas(fMdiFrame, 400, 240);
00297    fContainer = new TGCompositeFrame(fCanvasWindow->GetViewPort(), 10, 10,
00298                                      kHorizontalFrame | kOwnBackground,
00299                                      fMdiFrame->GetWhitePixel());
00300    fContainer->SetLayoutManager(new TGTileLayout(fContainer, 8));
00301    fCanvasWindow->SetContainer(fContainer);
00302 
00303    for (int i = 0; i < 256; ++i)
00304       fCanvasWindow->AddFrame(new TGFrame(fCanvasWindow->GetContainer(),
00305                               32, 32, kOwnBackground, (i+1) & 255),
00306                               new TGLayoutHints(kLHintsNormal));
00307 
00308    fMdiFrame->AddFrame(fCanvasWindow, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY));
00309 
00310    fMdiFrame->SetWindowIcon(gClient->GetPicture("ofolder_t.xpm"));
00311 }
00312 
00313 Bool_t TGMdiTestSubclass::CloseWindow()
00314 {
00315    int ret = 0;
00316 
00317    new TGMsgBox(gClient->GetRoot(), fMdiFrame,
00318                 fMdiFrame->GetWindowName(), "Really want to close the window?",
00319                 kMBIconExclamation, kMBYes | kMBNo, &ret);
00320 
00321    if (ret == kMBYes) return fMdiFrame->CloseWindow();
00322 
00323    return kFALSE;
00324 }
00325 
00326 
00327 //----------------------------------------------------------------------
00328 
00329 TGMdiHintTest::TGMdiHintTest(TGMdiMainFrame *main, int w, int h)
00330 {
00331    fMdiFrame = new TGMdiFrame(main, w, h);
00332 
00333    fClose = new TGCheckButton(fMdiFrame, new TGHotString("Close"), 11);
00334    fMenu  = new TGCheckButton(fMdiFrame, new TGHotString("Menu (left icon)"), 12);
00335    fMin   = new TGCheckButton(fMdiFrame, new TGHotString("Minimize"), 13);
00336    fMax   = new TGCheckButton(fMdiFrame, new TGHotString("Maximize"), 14);
00337    fSize  = new TGCheckButton(fMdiFrame, new TGHotString("Resize"), 15);
00338    fHelp  = new TGCheckButton(fMdiFrame, new TGHotString("Help"), 16);
00339 
00340    TGLayoutHints *lh = new TGLayoutHints(kLHintsLeft | kLHintsTop, 5, 100, 5, 0);
00341 
00342    fMdiFrame->AddFrame(fClose, lh);
00343    fMdiFrame->AddFrame(fMenu, lh);
00344    fMdiFrame->AddFrame(fMin, lh);
00345    fMdiFrame->AddFrame(fMax, lh);
00346    fMdiFrame->AddFrame(fSize, lh);
00347    fMdiFrame->AddFrame(fHelp, lh);
00348 
00349    fClose->SetState(kButtonDown);
00350    fMin->SetState(kButtonDown);
00351    fMenu->SetState(kButtonDown);
00352    fMax->SetState(kButtonDown);
00353    fSize->SetState(kButtonDown);
00354 
00355    fClose->Connect("Clicked()", "TGMdiHintTest", this, "HandleButtons()");
00356    fMenu->Connect("Clicked()", "TGMdiHintTest", this, "HandleButtons()");
00357    fMin->Connect("Clicked()", "TGMdiHintTest", this, "HandleButtons()");
00358    fMax->Connect("Clicked()", "TGMdiHintTest", this, "HandleButtons()");
00359    fSize->Connect("Clicked()", "TGMdiHintTest", this, "HandleButtons()");
00360    fHelp->Connect("Clicked()", "TGMdiHintTest", this, "HandleButtons()");
00361 
00362    fWName = new TGTextEntry(fMdiFrame, (const char *)"", 20);
00363    fMdiFrame->AddFrame(fWName, new TGLayoutHints(kLHintsTop | kLHintsExpandX,
00364                                                  5, 5, 5, 5));
00365 
00366    fWName->GetBuffer()->AddText(0, "MDI hints test");
00367    fWName->Connect("TextChanged(char*)", "TGMdiHintTest", this, "HandleText(char*)");
00368 
00369    fMdiFrame->SetMdiHints(kMdiDefaultHints);
00370    fMdiFrame->SetWindowName(fWName->GetBuffer()->GetString());
00371 
00372    fMdiFrame->SetWindowIcon(gClient->GetPicture("app_t.xpm"));
00373 
00374    fMdiFrame->MapSubwindows();
00375    fMdiFrame->Layout();
00376 }
00377 
00378 void TGMdiHintTest::HandleButtons()
00379 {
00380    int hints = 0;
00381 
00382    if (fClose->GetState() != kButtonUp) hints |= kMdiClose;
00383    if (fMenu->GetState() != kButtonUp) hints |= kMdiMenu;
00384    if (fMin->GetState() != kButtonUp) hints |= kMdiMinimize;
00385    if (fMax->GetState() != kButtonUp) hints |= kMdiMaximize;
00386    if (fSize->GetState() != kButtonUp) hints |= kMdiSize;
00387    if (fHelp->GetState() != kButtonUp) hints |= kMdiHelp;
00388 
00389    fMdiFrame->SetMdiHints(hints);
00390 }
00391 
00392 void TGMdiHintTest::HandleText(const char *)
00393 {
00394    fMdiFrame->SetWindowName(fWName->GetBuffer()->GetString());
00395 }
00396 
00397 void mditest()
00398 {
00399    new TGAppMainFrame(gClient->GetRoot(), 640, 400);
00400 }
00401 
00402 //----------------------------------------------------------------------
00403 
00404 #ifdef STANDALONE
00405 int main(int argc, char **argv)
00406 {
00407    TApplication theApp("MdiTest", &argc, argv);
00408 
00409    mditest();
00410 
00411    theApp.Run();
00412 
00413    return 0;
00414 }
00415 #endif

Generated on Tue Jul 5 15:44:25 2011 for ROOT_528-00b_version by  doxygen 1.5.1