Logo ROOT   6.30.04
Reference Guide
 All Namespaces Files Pages
TGMdiMainFrame.h
Go to the documentation of this file.
1 // @(#)root/gui:$Id$
2 // Author: Bertrand Bellenot 20/08/2004
3 
4 /*************************************************************************
5  * Copyright (C) 1995-2004, Rene Brun and Fons Rademakers. *
6  * All rights reserved. *
7  * *
8  * For the licensing terms see $ROOTSYS/LICENSE. *
9  * For the list of contributors see $ROOTSYS/README/CREDITS. *
10  *************************************************************************/
11 
12 /**************************************************************************
13 
14  This file is part of TGMdi, an extension to the xclass toolkit.
15  Copyright (C) 1998-2002 by Harald Radke, Hector Peraza.
16 
17  This application is free software; you can redistribute it and/or
18  modify it under the terms of the GNU Library General Public
19  License as published by the Free Software Foundation; either
20  version 2 of the License, or (at your option) any later version.
21 
22  This application is distributed in the hope that it will be useful,
23  but WITHOUT ANY WARRANTY; without even the implied warranty of
24  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
25  Library General Public License for more details.
26 
27  You should have received a copy of the GNU Library General Public
28  License along with this library; if not, write to the Free
29  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
30 
31 **************************************************************************/
32 
33 #ifndef ROOT_TGMdiMainFrame
34 #define ROOT_TGMdiMainFrame
35 
36 //////////////////////////////////////////////////////////////////////////
37 // //
38 // TGMdiMainFrame. //
39 // //
40 // This file contains the TGMdiMainFrame class. //
41 // //
42 //////////////////////////////////////////////////////////////////////////
43 
44 #include "TGCanvas.h"
45 #include "TGMenu.h"
46 #include "TGFont.h"
47 
48 
49 // MDI resizing modes
50 enum EMdiResizingModes {
51  kMdiOpaque = 1,
52  kMdiNonOpaque = 2,
53  kMdiDefaultResizeMode = kMdiOpaque
54 };
55 
56 // MDI hints, also used to identify titlebar buttons
57 enum EMdiHints {
58  kMdiClose = 4,
59  kMdiRestore = 8,
60  kMdiMove = 16,
61  kMdiSize = 32,
62  kMdiMinimize = 64,
63  kMdiMaximize = 128,
64  kMdiHelp = 256,
65  kMdiMenu = 512,
66  kMdiDefaultHints = kMdiMenu | kMdiMinimize | kMdiRestore |
67  kMdiMaximize | kMdiSize | kMdiClose
68 };
69 
70 // window arrangement modes
71 enum EMdiArrangementModes {
72  kMdiTileHorizontal = 1,
73  kMdiTileVertical = 2,
74  kMdiCascade = 3
75 };
76 
77 // geometry value masks for ConfigureWindow() call
78 enum EMdiGeometryMask {
79  kMdiClientGeometry = BIT(0),
80  kMdiDecorGeometry = BIT(1),
81  kMdiIconGeometry = BIT(2)
82 };
83 
84 
85 class TGGC;
86 class TGMdiMenuBar;
87 class TGMdiContainer;
88 class TGMdiDecorFrame;
89 class TGMdiFrame;
90 
91 //----------------------------------------------------------------------
92 
93 class TGMdiFrameList {
94 
95 friend class TGMdiMainFrame;
96 
97 protected:
98  UInt_t fFrameId; // TGMdiFrameList Id
99  TGMdiDecorFrame *fDecor; // MDI decor frame
100  TGMdiFrameList *fPrev, *fNext; // pointers on previous and next TGMdiFrameList
101  TGMdiFrameList *fCyclePrev, *fCycleNext; // pointers on previous and next TGMdiFrameList
102 
103 public:
104  virtual ~TGMdiFrameList() { }
105 
106  UInt_t GetFrameId() const { return fFrameId; }
107  TGMdiDecorFrame *GetDecorFrame() const { return fDecor; }
108  TGMdiFrameList *GetPrev() const { return fPrev; }
109  TGMdiFrameList *GetNext() const { return fNext; }
110  TGMdiFrameList *GetCyclePrev() const { return fCyclePrev; }
111  TGMdiFrameList *GetCycleNext() const { return fCycleNext; }
112 
113  void SetFrameId(UInt_t id) { fFrameId = id; }
114  void SetDecorFrame(TGMdiDecorFrame *decor) { fDecor = decor; }
115  void SetPrev(TGMdiFrameList *prev) { fPrev = prev; }
116  void SetNext(TGMdiFrameList *next) { fNext = next; }
117  void SetCyclePrev(TGMdiFrameList *prev) { fCyclePrev = prev; }
118  void SetCycleNext(TGMdiFrameList *next) { fCycleNext = next; }
119 
120  ClassDef(TGMdiFrameList, 0) // MDI Frame list
121 };
122 
123 
124 class TGMdiGeometry {
125 
126 public:
127  Int_t fValueMask; // MDI hints mask
128  TGRectangle fClient, fDecoration, fIcon; // client, decoration and icon rectangles
129 
130  virtual ~TGMdiGeometry() { }
131 
132  ClassDef(TGMdiGeometry, 0) // MDI Geometry
133 };
134 
135 
136 //----------------------------------------------------------------------
137 
138 class TGMdiMainFrame : public TGCanvas {
139 
140 friend class TGMdiFrame;
141 
142 protected:
143  enum {
144  // the width of minimized windows, in "height" units
145  kMinimizedWidth = 5
146  };
147 
148  Int_t fCurrentX, fCurrentY, fResizeMode; // current MDI child XY position and resize mode
149  Int_t fArrangementMode; // MDI children arrangement mode
150  TGFont *fFontCurrent, *fFontNotCurrent; // fonts for active and inactive MDI children
151  Pixel_t fBackCurrent, fForeCurrent; // back and fore colors for active MDI children
152  Pixel_t fBackNotCurrent, fForeNotCurrent; // back and fore colors for inactive MDI children
153 
154  TGGC *fBoxGC; // GC used to draw resizing box (rectangle)
155 
156  Long_t fNumberOfFrames; // number of MDI child windows
157  TGMdiMenuBar *fMenuBar; // menu bar
158  TGFrame *fContainer; // MDI container
159  TGPopupMenu *fWinListMenu; // popup menu with list of MDI child windows
160  TGMdiFrameList *fChildren; // list of MDI child windows
161  TGMdiFrameList *fCurrent; // current list of MDI child windows
162 
163  void AddMdiFrame(TGMdiFrame *f);
164  Bool_t RemoveMdiFrame(TGMdiFrame *f);
165 
166  Bool_t SetCurrent(TGMdiFrameList *newcurrent);
167  TGMdiDecorFrame *GetDecorFrame(UInt_t id) const;
168  TGMdiDecorFrame *GetDecorFrame(TGMdiFrame *frame) const;
169 
170  void UpdateWinListMenu();
171 
172 public:
173  TGMdiMainFrame(const TGWindow *p, TGMdiMenuBar *menu, Int_t w, Int_t h,
174  UInt_t options = 0,
175  Pixel_t back = GetDefaultFrameBackground());
176  virtual ~TGMdiMainFrame();
177 
178  virtual Bool_t HandleKey(Event_t *event);
179  virtual Bool_t ProcessMessage(Long_t msg, Long_t parm1, Long_t parm2);
180 
181  virtual void Layout();
182 
183  virtual void FreeMove(TGMdiFrame *frame);
184  virtual void FreeSize(TGMdiFrame *frame);
185  virtual void Restore(TGMdiFrame *frame);
186  virtual void Maximize(TGMdiFrame *frame);
187  virtual void Minimize(TGMdiFrame *frame);
188  virtual Int_t Close(TGMdiFrame *frame);
189  virtual Int_t ContextHelp(TGMdiFrame *frame);
190  virtual void CloseAll();
191 
192  virtual void Cascade() { ArrangeFrames(kMdiCascade); }
193  virtual void TileHorizontal() { ArrangeFrames(kMdiTileHorizontal); }
194  virtual void TileVertical() { ArrangeFrames(kMdiTileVertical); }
195 
196  virtual void ArrangeFrames(Int_t mode);
197  virtual void ArrangeMinimized();
198 
199  virtual void CirculateUp();
200  virtual void CirculateDown();
201 
202  TGMdiFrame *GetCurrent() const;
203  TGMdiFrame *GetMdiFrame(UInt_t id) const;
204  TGFrame *GetContainer() const { return fContainer; }
205  Bool_t SetCurrent(UInt_t newcurrent);
206  Bool_t SetCurrent(TGMdiFrame *f); //*SIGNAL*
207 
208  TGPopupMenu *GetWinListMenu() const { return fWinListMenu; }
209  TGMdiMenuBar *GetMenu() const { return fMenuBar; }
210 
211  TGMdiFrameList *GetWindowList(Int_t current = kFALSE) const
212  { return current ? fCurrent : fChildren; }
213  Long_t GetNumberOfFrames() const { return fNumberOfFrames; }
214 
215  void SetResizeMode(Int_t mode = kMdiDefaultResizeMode);
216  void UpdateMdiButtons();
217 
218  TGRectangle GetBBox() const;
219  TGRectangle GetMinimizedBBox() const;
220 
221  TGMdiGeometry GetWindowGeometry(TGMdiFrame *f) const;
222  void ConfigureWindow(TGMdiFrame *f, TGMdiGeometry &geom);
223 
224  Bool_t IsMaximized(TGMdiFrame *f);
225  Bool_t IsMinimized(TGMdiFrame *f);
226 
227  virtual void FrameCreated(Int_t id) { Emit("FrameCreated(Int_t)", id); } //*SIGNAL*
228  virtual void FrameClosed(Int_t id) { Emit("FrameClosed(Int_t)", id); } //*SIGNAL*
229  virtual void FrameMaximized(Int_t id) { Emit("FrameMaximized(Int_t)", id); } //*SIGNAL*
230  virtual void FrameMinimized(Int_t id) { Emit("FrameMinimized(Int_t)", id); } //*SIGNAL*
231  virtual void FrameRestored(Int_t id) { Emit("FrameRestored(Int_t)", id); } //*SIGNAL*
232  virtual void FramesArranged(Int_t mode) { Emit("FramesArranged(Int_t)", mode); } //*SIGNAL*
233 
234  virtual void SavePrimitive(std::ostream &out, Option_t *option = "");
235 
236  ClassDef(TGMdiMainFrame, 0) // MDI main frame
237 };
238 
239 
240 //----------------------------------------------------------------------
241 
242 class TGMdiContainer : public TGFrame {
243 
244 protected:
245  const TGMdiMainFrame *fMain; // pointer to MDI main frame
246 
247 public:
248  TGMdiContainer(const TGMdiMainFrame *p, Int_t w, Int_t h,
249  UInt_t options = 0,
250  ULong_t back = GetDefaultFrameBackground());
251 
252  virtual Bool_t HandleConfigureNotify(Event_t *event);
253  virtual TGDimension GetDefaultSize() const;
254 
255  ClassDef(TGMdiContainer, 0) // MDI container
256 };
257 
258 #endif