#ifndef ROOT_TGMenu
#define ROOT_TGMenu
#ifndef ROOT_TGFrame
#include "TGFrame.h"
#endif
#ifndef ROOT_TGString
#include "TGString.h"
#endif
#ifndef ROOT_TGPicture
#include "TGPicture.h"
#endif
#ifndef ROOT_TGWidget
#include "TGWidget.h"
#endif
enum EMenuEntryState {
kMenuActiveMask = BIT(0),
kMenuEnableMask = BIT(1),
kMenuDefaultMask = BIT(2),
kMenuCheckedMask = BIT(3),
kMenuRadioMask = BIT(4),
kMenuHideMask = BIT(5),
kMenuRadioEntryMask = BIT(6)
};
enum EMenuEntryType {
kMenuSeparator,
kMenuLabel,
kMenuEntry,
kMenuPopup
};
class TGPopupMenu;
class TGMenuBar;
class TGMenuTitle;
class TTimer;
class TGSplitButton;
class TGMenuEntry : public TObject {
friend class TGPopupMenu;
friend class TGMenuBar;
protected:
Int_t fEntryId;
void *fUserData;
EMenuEntryType fType;
Int_t fStatus;
Int_t fEx, fEy;
UInt_t fEw, fEh;
TGHotString *fLabel;
TGString *fShortcut;
const TGPicture *fPic;
TGPopupMenu *fPopup;
private:
TGMenuEntry(const TGMenuEntry&);
TGMenuEntry& operator=(const TGMenuEntry&);
public:
TGMenuEntry(): fEntryId(0), fUserData(0), fType(), fStatus(0),
fEx(0), fEy(0), fEw(0), fEh(0), fLabel(0), fShortcut(0), fPic(0), fPopup(0) { }
virtual ~TGMenuEntry() { if (fLabel) delete fLabel; if (fShortcut) delete fShortcut; }
Int_t GetEntryId() const { return fEntryId; }
const char *GetName() const { return fLabel ? fLabel->GetString() : 0; }
const char *GetShortcutText() const { return fShortcut ? fShortcut->GetString() : 0; }
virtual Int_t GetStatus() const { return fStatus; }
EMenuEntryType GetType() const { return fType; }
TGPopupMenu *GetPopup() const { return fPopup; }
TGHotString *GetLabel() const { return fLabel; }
TGString *GetShortcut() const { return fShortcut; }
Int_t GetEx() const { return fEx; }
Int_t GetEy() const { return fEy; }
UInt_t GetEw() const { return fEw; }
UInt_t GetEh() const { return fEh; }
const TGPicture *GetPic() const { return fPic; }
void *GetUserData() const { return fUserData; }
ClassDef(TGMenuEntry,0);
};
class TGPopupMenu : public TGFrame {
friend class TGMenuTitle;
friend class TGMenuBar;
friend class TGSplitButton;
protected:
TList *fEntryList;
TGMenuEntry *fCurrent;
Bool_t fStick;
Bool_t fHasGrab;
Bool_t fPoppedUp;
UInt_t fXl;
UInt_t fMenuWidth;
UInt_t fMenuHeight;
TTimer *fDelay;
GContext_t fNormGC;
GContext_t fSelGC;
GContext_t fSelbackGC;
FontStruct_t fFontStruct;
FontStruct_t fHifontStruct;
Cursor_t fDefaultCursor;
const TGWindow *fMsgWindow;
TGMenuBar *fMenuBar;
TGSplitButton *fSplitButton;
UInt_t fEntrySep;
static const TGFont *fgDefaultFont;
static const TGFont *fgHilightFont;
static const TGGC *fgDefaultGC;
static const TGGC *fgDefaultSelectedGC;
static const TGGC *fgDefaultSelectedBackgroundGC;
void DrawTrianglePattern(GContext_t gc, Int_t l, Int_t t, Int_t r, Int_t b);
void DrawCheckMark(GContext_t gc, Int_t l, Int_t t, Int_t r, Int_t b);
void DrawRCheckMark(GContext_t gc, Int_t l, Int_t t, Int_t r, Int_t b);
virtual void DoRedraw();
virtual void DrawEntry(TGMenuEntry *entry);
virtual void Reposition();
static FontStruct_t GetDefaultFontStruct();
static FontStruct_t GetHilightFontStruct();
static const TGGC &GetDefaultGC();
static const TGGC &GetDefaultSelectedGC();
static const TGGC &GetDefaultSelectedBackgroundGC();
private:
TGPopupMenu(const TGPopupMenu&);
TGPopupMenu& operator=(const TGPopupMenu&);
public:
TGPopupMenu(const TGWindow *p = 0, UInt_t w = 10, UInt_t h = 10,
UInt_t options = 0);
virtual ~TGPopupMenu();
virtual void AddEntry(TGHotString *s, Int_t id, void *ud = 0,
const TGPicture *p = 0, TGMenuEntry *before = 0);
virtual void AddEntry(const char *s, Int_t id, void *ud = 0,
const TGPicture *p = 0, TGMenuEntry *before = 0);
virtual void AddSeparator(TGMenuEntry *before = 0);
virtual void AddLabel(TGHotString *s, const TGPicture *p = 0,
TGMenuEntry *before = 0);
virtual void AddLabel(const char *s, const TGPicture *p = 0,
TGMenuEntry *before = 0);
virtual void AddPopup(TGHotString *s, TGPopupMenu *popup,
TGMenuEntry *before = 0, const TGPicture *p = 0);
virtual void AddPopup(const char *s, TGPopupMenu *popup,
TGMenuEntry *before = 0, const TGPicture *p = 0);
virtual void EnableEntry(Int_t id);
virtual void DisableEntry(Int_t id);
virtual Bool_t IsEntryEnabled(Int_t id);
virtual void HideEntry(Int_t id);
virtual Bool_t IsEntryHidden(Int_t id);
virtual void DefaultEntry(Int_t id);
virtual void CheckEntry(Int_t id);
virtual void CheckEntryByData(void *user_data);
virtual void UnCheckEntry(Int_t id);
virtual void UnCheckEntryByData(void *user_data);
virtual void UnCheckEntries();
virtual Bool_t IsEntryChecked(Int_t id);
virtual void RCheckEntry(Int_t id, Int_t IDfirst, Int_t IDlast);
virtual Bool_t IsEntryRChecked(Int_t id);
virtual void PlaceMenu(Int_t x, Int_t y, Bool_t stick_mode,
Bool_t grab_pointer);
virtual Int_t EndMenu(void *&userData);
virtual void DeleteEntry(Int_t id);
virtual void DeleteEntry(TGMenuEntry *entry);
virtual TGMenuEntry *GetEntry(Int_t id);
virtual TGMenuEntry *GetCurrent() const { return fCurrent; }
virtual TGMenuEntry *GetEntry(const char *s);
const TList *GetListOfEntries() const { return fEntryList; }
virtual void DrawBorder();
virtual Bool_t HandleButton(Event_t *event);
virtual Bool_t HandleMotion(Event_t *event);
virtual Bool_t HandleCrossing(Event_t *event);
virtual Bool_t HandleTimer(TTimer *t);
virtual void Associate(const TGWindow *w) { fMsgWindow = w; }
virtual void SetMenuBar(TGMenuBar *bar) { fMenuBar = bar; }
TGMenuBar *GetMenuBar() const { return fMenuBar; }
virtual void Activate(Bool_t) { }
virtual void Activate(TGMenuEntry *entry);
virtual void SavePrimitive(std::ostream &out, Option_t *option = "");
UInt_t GetEntrySep() const { return fEntrySep; }
virtual void SetEntrySep(UInt_t sep) { fEntrySep = sep; }
virtual void PoppedUp() { Emit("PoppedUp()"); }
virtual void PoppedDown() { Emit("PoppedDown()"); }
virtual void Highlighted(Int_t id) { Emit("Highlighted(Int_t)", id); }
virtual void Activated(Int_t id) { Emit("Activated(Int_t)", id); }
ClassDef(TGPopupMenu,0)
};
class TGMenuTitle : public TGFrame {
protected:
TGPopupMenu *fMenu;
TGHotString *fLabel;
Int_t fTitleId;
void *fTitleData;
Bool_t fState;
Int_t fHkeycode;
FontStruct_t fFontStruct;
Pixel_t fTextColor;
GContext_t fNormGC, fSelGC;
virtual void DoRedraw();
static const TGFont *fgDefaultFont;
static const TGGC *fgDefaultSelectedGC;
static const TGGC *fgDefaultGC;
private:
TGMenuTitle(const TGMenuTitle&);
TGMenuTitle& operator=(const TGMenuTitle&);
public:
static FontStruct_t GetDefaultFontStruct();
static const TGGC &GetDefaultSelectedGC();
static const TGGC &GetDefaultGC();
TGMenuTitle(const TGWindow *p = 0, TGHotString *s = 0, TGPopupMenu *menu = 0,
GContext_t norm = GetDefaultGC()(),
FontStruct_t font = GetDefaultFontStruct(),
UInt_t options = 0);
virtual ~TGMenuTitle() { if (fLabel) delete fLabel; }
Pixel_t GetTextColor() const { return fTextColor; }
void SetTextColor(Pixel_t col) { fTextColor = col; }
virtual void SetState(Bool_t state);
Bool_t GetState() const { return fState; }
Int_t GetHotKeyCode() const { return fHkeycode; }
TGPopupMenu *GetMenu() const { return fMenu; }
const char *GetName() const { return fLabel ? fLabel->GetString() : 0; }
virtual void DoSendMessage();
virtual void SavePrimitive(std::ostream &out, Option_t *option = "");
ClassDef(TGMenuTitle,0)
};
class TGMenuBar : public TGHorizontalFrame {
friend class TGPopupMenu;
protected:
TGMenuTitle *fCurrent;
TList *fTitles;
Cursor_t fDefaultCursor;
Bool_t fStick;
TList *fTrash;
Bool_t fKeyNavigate;
TGPopupMenu *fMenuMore;
TGLayoutHints *fMenuBarMoreLayout;
Bool_t fWithExt;
TList *fOutLayouts;
TList *fNeededSpace;
virtual void AddFrameBefore(TGFrame *f, TGLayoutHints *l = 0,
TGPopupMenu *before = 0);
virtual void BindHotKey(Int_t keycode, Bool_t on = kTRUE);
virtual void BindKeys(Bool_t on = kTRUE);
void BindMenu(TGPopupMenu* subMenu, Bool_t on);
private:
TGMenuBar(const TGMenuBar&);
TGMenuBar& operator=(const TGMenuBar&);
public:
TGMenuBar(const TGWindow *p = 0, UInt_t w = 60, UInt_t h = 20,
UInt_t options = kHorizontalFrame | kRaisedFrame);
virtual ~TGMenuBar();
virtual void AddPopup(TGHotString *s, TGPopupMenu *menu, TGLayoutHints *l,
TGPopupMenu *before = 0);
virtual void AddPopup(const char *s, TGPopupMenu *menu, TGLayoutHints *l,
TGPopupMenu *before = 0);
virtual TGPopupMenu *AddPopup(const TString &s, Int_t padleft = 4, Int_t padright = 0,
Int_t padtop = 0, Int_t padbottom = 0);
virtual void AddTitle(TGMenuTitle *title, TGLayoutHints *l, TGPopupMenu *before = 0);
virtual TGPopupMenu *GetPopup(const char *s);
virtual TGPopupMenu *RemovePopup(const char *s);
virtual TGMenuTitle *GetCurrent() const { return fCurrent; }
virtual TList *GetTitles() const { return fTitles; }
virtual Bool_t HandleButton(Event_t *event);
virtual Bool_t HandleMotion(Event_t *event);
virtual Bool_t HandleKey(Event_t *event);
virtual void SavePrimitive(std::ostream &out, Option_t *option = "");
virtual void Layout();
void PopupConnection();
TGFrameElement* GetLastOnLeft();
ClassDef(TGMenuBar,0)
};
#endif