Logo ROOT   6.30.04
Reference Guide
 All Namespaces Files Pages
TGMenu.h
Go to the documentation of this file.
1 // @(#)root/gui:$Id$
2 // Author: Fons Rademakers 09/01/98
3 
4 /*************************************************************************
5  * Copyright (C) 1995-2000, 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 #ifndef ROOT_TGMenu
13 #define ROOT_TGMenu
14 
15 
16 //////////////////////////////////////////////////////////////////////////
17 // //
18 // TGMenuBar, TGPopupMenu, TGMenuTitle and TGMenuEntry //
19 // //
20 // This header contains all different menu classes. //
21 // //
22 // Selecting a menu item will generate the event: //
23 // kC_COMMAND, kCM_MENU, menu id, user data. //
24 // //
25 //////////////////////////////////////////////////////////////////////////
26 
27 #include "TGFrame.h"
28 #include "TGString.h"
29 #include "TGPicture.h"
30 #include "TGWidget.h"
31 
32 //--- Menu entry status mask
33 
34 enum EMenuEntryState {
35  kMenuActiveMask = BIT(0),
36  kMenuEnableMask = BIT(1),
37  kMenuDefaultMask = BIT(2),
38  kMenuCheckedMask = BIT(3),
39  kMenuRadioMask = BIT(4),
40  kMenuHideMask = BIT(5),
41  kMenuRadioEntryMask = BIT(6)
42 };
43 
44 //--- Menu entry types
45 
46 enum EMenuEntryType {
47  kMenuSeparator,
48  kMenuLabel,
49  kMenuEntry,
50  kMenuPopup
51 };
52 
53 
54 class TGPopupMenu;
55 class TGMenuBar;
56 class TGMenuTitle;
57 class TTimer;
58 class TGSplitButton;
59 
60 //////////////////////////////////////////////////////////////////////////
61 // //
62 // TGMenuEntry //
63 // //
64 // This class contains all information about a menu entry. //
65 // It is a fully protected class used internally by TGPopupMenu. //
66 // //
67 //////////////////////////////////////////////////////////////////////////
68 
69 class TGMenuEntry : public TObject {
70 
71 friend class TGPopupMenu;
72 friend class TGMenuBar;
73 
74 protected:
75  Int_t fEntryId; // the entry id (used for event processing)
76  void *fUserData; // pointer to user data structure
77  EMenuEntryType fType; // type of entry
78  Int_t fStatus; // entry status (OR of EMenuEntryState)
79  Int_t fEx, fEy; // position of entry
80  UInt_t fEw, fEh; // width and height of entry
81  TGHotString *fLabel; // menu entry label
82  TGString *fShortcut; // menu entry shortcut
83  const TGPicture *fPic; // menu entry icon
84  TGPopupMenu *fPopup; // pointer to popup menu (in case of cascading menus)
85 
86 private:
87  TGMenuEntry(const TGMenuEntry&); // not implemented
88  TGMenuEntry& operator=(const TGMenuEntry&); // not implemented
89 
90 public:
91  TGMenuEntry(): fEntryId(0), fUserData(0), fType(), fStatus(0),
92  fEx(0), fEy(0), fEw(0), fEh(0), fLabel(0), fShortcut(0), fPic(0), fPopup(0) { }
93  virtual ~TGMenuEntry() { if (fLabel) delete fLabel; if (fShortcut) delete fShortcut; }
94 
95  Int_t GetEntryId() const { return fEntryId; }
96  const char *GetName() const { return fLabel ? fLabel->GetString() : 0; }
97  const char *GetShortcutText() const { return fShortcut ? fShortcut->GetString() : 0; }
98  virtual Int_t GetStatus() const { return fStatus; }
99  EMenuEntryType GetType() const { return fType; }
100  TGPopupMenu *GetPopup() const { return fPopup; }
101  TGHotString *GetLabel() const { return fLabel; }
102  TGString *GetShortcut() const { return fShortcut; }
103  Int_t GetEx() const { return fEx; }
104  Int_t GetEy() const { return fEy; }
105  UInt_t GetEw() const { return fEw; }
106  UInt_t GetEh() const { return fEh; }
107  const TGPicture *GetPic() const { return fPic; }
108  void *GetUserData() const { return fUserData; }
109 
110  ClassDef(TGMenuEntry,0); // Menu entry class
111 };
112 
113 
114 //////////////////////////////////////////////////////////////////////////
115 // //
116 // TGPopupMenu //
117 // //
118 // This class creates a popup menu object. Popup menu's are attached //
119 // to TGMenuBar objects. //
120 // //
121 //////////////////////////////////////////////////////////////////////////
122 
123 class TGPopupMenu : public TGFrame {
124 
125 friend class TGMenuTitle;
126 friend class TGMenuBar;
127 friend class TGSplitButton;
128 
129 protected:
130  TList *fEntryList; // list of menu entries
131  TGMenuEntry *fCurrent; // currently selected menu entry
132  Bool_t fStick; // stick mode (popup menu stays sticked on screen)
133  Bool_t fHasGrab; // true if menu has grabbed pointer
134  Bool_t fPoppedUp; // true if menu is currently popped up
135  UInt_t fXl; // Max width of all menu entries
136  UInt_t fMenuWidth; // width of popup menu
137  UInt_t fMenuHeight; // height of popup menu
138  TTimer *fDelay; // delay before poping up cascading menu
139  GContext_t fNormGC; // normal drawing graphics context
140  GContext_t fSelGC; // graphics context for drawing selections
141  GContext_t fSelbackGC; // graphics context for drawing selection background
142  FontStruct_t fFontStruct; // font to draw menu entries
143  FontStruct_t fHifontStruct; // font to draw highlighted entries
144  Cursor_t fDefaultCursor; // right pointing cursor
145  const TGWindow *fMsgWindow; // window which handles menu events
146  TGMenuBar *fMenuBar; // menu bar (if any)
147  TGSplitButton *fSplitButton; // split button (if any)
148  UInt_t fEntrySep; // separation distance between ebtris
149 
150  static const TGFont *fgDefaultFont;
151  static const TGFont *fgHilightFont;
152  static const TGGC *fgDefaultGC;
153  static const TGGC *fgDefaultSelectedGC;
154  static const TGGC *fgDefaultSelectedBackgroundGC;
155 
156  void DrawTrianglePattern(GContext_t gc, Int_t l, Int_t t, Int_t r, Int_t b);
157  void DrawCheckMark(GContext_t gc, Int_t l, Int_t t, Int_t r, Int_t b);
158  void DrawRCheckMark(GContext_t gc, Int_t l, Int_t t, Int_t r, Int_t b);
159  virtual void DoRedraw();
160  virtual void DrawEntry(TGMenuEntry *entry);
161  virtual void Reposition();
162 
163  static FontStruct_t GetDefaultFontStruct();
164  static FontStruct_t GetHilightFontStruct();
165  static const TGGC &GetDefaultGC();
166  static const TGGC &GetDefaultSelectedGC();
167  static const TGGC &GetDefaultSelectedBackgroundGC();
168 
169 private:
170  TGPopupMenu(const TGPopupMenu&); // not implemented
171  TGPopupMenu& operator=(const TGPopupMenu&); // not implemented
172 
173 public:
174  TGPopupMenu(const TGWindow *p = 0, UInt_t w = 10, UInt_t h = 10,
175  UInt_t options = 0);
176  virtual ~TGPopupMenu();
177 
178  virtual void AddEntry(TGHotString *s, Int_t id, void *ud = 0,
179  const TGPicture *p = 0, TGMenuEntry *before = 0);
180  virtual void AddEntry(const char *s, Int_t id, void *ud = 0,
181  const TGPicture *p = 0, TGMenuEntry *before = 0);
182  virtual void AddSeparator(TGMenuEntry *before = 0);
183  virtual void AddLabel(TGHotString *s, const TGPicture *p = 0,
184  TGMenuEntry *before = 0);
185  virtual void AddLabel(const char *s, const TGPicture *p = 0,
186  TGMenuEntry *before = 0);
187  virtual void AddPopup(TGHotString *s, TGPopupMenu *popup,
188  TGMenuEntry *before = 0, const TGPicture *p = 0);
189  virtual void AddPopup(const char *s, TGPopupMenu *popup,
190  TGMenuEntry *before = 0, const TGPicture *p = 0);
191  virtual void EnableEntry(Int_t id);
192  virtual void DisableEntry(Int_t id);
193  virtual Bool_t IsEntryEnabled(Int_t id);
194  virtual void HideEntry(Int_t id);
195  virtual Bool_t IsEntryHidden(Int_t id);
196  virtual void DefaultEntry(Int_t id);
197  virtual void CheckEntry(Int_t id);
198  virtual void CheckEntryByData(void *user_data);
199  virtual void UnCheckEntry(Int_t id);
200  virtual void UnCheckEntryByData(void *user_data);
201  virtual void UnCheckEntries();
202  virtual Bool_t IsEntryChecked(Int_t id);
203  virtual void RCheckEntry(Int_t id, Int_t IDfirst, Int_t IDlast);
204  virtual Bool_t IsEntryRChecked(Int_t id);
205  virtual void PlaceMenu(Int_t x, Int_t y, Bool_t stick_mode,
206  Bool_t grab_pointer);
207  virtual Int_t EndMenu(void *&userData);
208  virtual void DeleteEntry(Int_t id);
209  virtual void DeleteEntry(TGMenuEntry *entry);
210  virtual TGMenuEntry *GetEntry(Int_t id);
211  virtual TGMenuEntry *GetCurrent() const { return fCurrent; }
212  virtual TGMenuEntry *GetEntry(const char *s);
213  const TList *GetListOfEntries() const { return fEntryList; }
214  virtual void DrawBorder();
215  virtual Bool_t HandleButton(Event_t *event);
216  virtual Bool_t HandleMotion(Event_t *event);
217  virtual Bool_t HandleCrossing(Event_t *event);
218  virtual Bool_t HandleTimer(TTimer *t);
219  virtual void Associate(const TGWindow *w) { fMsgWindow = w; }
220  virtual void SetMenuBar(TGMenuBar *bar) { fMenuBar = bar; }
221  TGMenuBar *GetMenuBar() const { return fMenuBar; }
222  virtual void Activate(Bool_t) { }
223  virtual void Activate(TGMenuEntry *entry);
224  virtual void SavePrimitive(std::ostream &out, Option_t *option = "");
225 
226  UInt_t GetEntrySep() const { return fEntrySep; }
227  virtual void SetEntrySep(UInt_t sep) { fEntrySep = sep; }
228 
229  virtual void PoppedUp() { Emit("PoppedUp()"); } // *SIGNAL*
230  virtual void PoppedDown() { Emit("PoppedDown()"); } // *SIGNAL*
231  virtual void Highlighted(Int_t id) { Emit("Highlighted(Int_t)", id); } // *SIGNAL*
232  virtual void Activated(Int_t id) { Emit("Activated(Int_t)", id); } // *SIGNAL*
233 
234  ClassDef(TGPopupMenu,0) // Popup menu
235 };
236 
237 
238 //////////////////////////////////////////////////////////////////////////
239 // //
240 // TGMenuTitle //
241 // //
242 // This class creates a menu title. A menu title is a frame //
243 // to which a popup menu can be attached. Menu titles are automatically //
244 // created when adding a popup menu to a menubar. //
245 // //
246 //////////////////////////////////////////////////////////////////////////
247 
248 class TGMenuTitle : public TGFrame {
249 
250 protected:
251  TGPopupMenu *fMenu; // attached popup menu
252  TGHotString *fLabel; // menu title
253  Int_t fTitleId; // id of selected menu item
254  void *fTitleData; // user data associated with selected item
255  Bool_t fState; // menu title state (active/not active)
256  Int_t fHkeycode; // hot key code
257  FontStruct_t fFontStruct; // font
258  Pixel_t fTextColor; // text color
259  GContext_t fNormGC, fSelGC; // normal and selection graphics contexts
260 
261  virtual void DoRedraw();
262 
263  static const TGFont *fgDefaultFont;
264  static const TGGC *fgDefaultSelectedGC;
265  static const TGGC *fgDefaultGC;
266 
267 private:
268  TGMenuTitle(const TGMenuTitle&); // not implemented
269  TGMenuTitle& operator=(const TGMenuTitle&); // not implemented
270 
271 public:
272  static FontStruct_t GetDefaultFontStruct();
273  static const TGGC &GetDefaultSelectedGC();
274  static const TGGC &GetDefaultGC();
275 
276  TGMenuTitle(const TGWindow *p = 0, TGHotString *s = 0, TGPopupMenu *menu = 0,
277  GContext_t norm = GetDefaultGC()(),
278  FontStruct_t font = GetDefaultFontStruct(),
279  UInt_t options = 0);
280  virtual ~TGMenuTitle() { if (fLabel) delete fLabel; }
281 
282  Pixel_t GetTextColor() const { return fTextColor; }
283  void SetTextColor(Pixel_t col) { fTextColor = col; }
284  virtual void SetState(Bool_t state);
285  Bool_t GetState() const { return fState; }
286  Int_t GetHotKeyCode() const { return fHkeycode; }
287  TGPopupMenu *GetMenu() const { return fMenu; }
288  const char *GetName() const { return fLabel ? fLabel->GetString() : 0; }
289  virtual void DoSendMessage();
290  virtual void SavePrimitive(std::ostream &out, Option_t *option = "");
291 
292  ClassDef(TGMenuTitle,0) // Menu title class
293 };
294 
295 
296 //////////////////////////////////////////////////////////////////////////
297 // //
298 // TGMenuBar //
299 // //
300 // This class creates a menu bar. //
301 // //
302 //////////////////////////////////////////////////////////////////////////
303 
304 class TGMenuBar : public TGHorizontalFrame {
305 
306 friend class TGPopupMenu;
307 
308 protected:
309  TGMenuTitle *fCurrent; // current menu title
310  TList *fTitles; // list of menu titles
311  Cursor_t fDefaultCursor; // right pointing cursor
312  Bool_t fStick; // stick mode (popup menu stays sticked on screen)
313  TList *fTrash; // garbage
314  Bool_t fKeyNavigate; // kTRUE if arrow key navigation is on
315  TGPopupMenu *fMenuMore; // extra >> menu
316  TGLayoutHints *fMenuBarMoreLayout; // layout of the extra menu
317  Bool_t fWithExt; // indicates whether the >> menu is shown or not
318  TList *fOutLayouts; // keeps trace of layouts of hidden menus
319  TList *fNeededSpace; // keeps trace of space needed for hidden menus
320 
321  virtual void AddFrameBefore(TGFrame *f, TGLayoutHints *l = 0,
322  TGPopupMenu *before = 0);
323 
324  virtual void BindHotKey(Int_t keycode, Bool_t on = kTRUE);
325  virtual void BindKeys(Bool_t on = kTRUE);
326  void BindMenu(TGPopupMenu* subMenu, Bool_t on);
327 
328 private:
329  TGMenuBar(const TGMenuBar&); // not implemented
330  TGMenuBar& operator=(const TGMenuBar&); // not implemented
331 
332 public:
333  TGMenuBar(const TGWindow *p = 0, UInt_t w = 60, UInt_t h = 20,
334  UInt_t options = kHorizontalFrame | kRaisedFrame);
335  virtual ~TGMenuBar();
336 
337  virtual void AddPopup(TGHotString *s, TGPopupMenu *menu, TGLayoutHints *l,
338  TGPopupMenu *before = 0);
339  virtual void AddPopup(const char *s, TGPopupMenu *menu, TGLayoutHints *l,
340  TGPopupMenu *before = 0);
341  virtual TGPopupMenu *AddPopup(const TString &s, Int_t padleft = 4, Int_t padright = 0,
342  Int_t padtop = 0, Int_t padbottom = 0);
343  virtual void AddTitle(TGMenuTitle *title, TGLayoutHints *l, TGPopupMenu *before = 0);
344 
345  virtual TGPopupMenu *GetPopup(const char *s);
346  virtual TGPopupMenu *RemovePopup(const char *s);
347 
348  virtual TGMenuTitle *GetCurrent() const { return fCurrent; }
349  virtual TList *GetTitles() const { return fTitles; }
350  virtual Bool_t HandleButton(Event_t *event);
351  virtual Bool_t HandleMotion(Event_t *event);
352  virtual Bool_t HandleKey(Event_t *event);
353  virtual void SavePrimitive(std::ostream &out, Option_t *option = "");
354  virtual void Layout();
355  void PopupConnection();
356  TGFrameElement* GetLastOnLeft();
357 
358  ClassDef(TGMenuBar,0) // Menu bar class
359 };
360 
361 #endif