00001
00002
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
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
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
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
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
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
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
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