#ifndef GUIMENUBAR #define GUIMENUBAR 1 //////////////////////////////////////////////// //! file="amma/GUI/GTK/Menu.hh" //! lib=GUI //! author="Charles Galambos" //! docentry="GUI.Widget" //! date="23/03/99" //! example=exMenu.cc //! rcsid="$Id: Menu.hh,v 1.14 2000/08/17 15:24:31 ees1cg Exp $" #include "amma/DP/Signal.hh" #include "amma/DP/Signal2.hh" #include "amma/DP/Signal3.hh" #include "amma/GUI/CWidget.hh" #include "amma/String.hh" //! userlevel=Develop //: Menu item body class GUIMenuItemBodyC : public GUIWidgetBodyC { public: GUIMenuItemBodyC(const StringC &lab); //: Constructor. virtual BooleanT Create(); //: Create the widget. Signal0C &SigSelected() { return selected; } //: Access selected signal. protected: virtual void Destroy(); //: Undo all refrences. StringC name; Signal0C selected; }; //! userlevel=Normal //: Menu item class GUIMenuItemC : public GUIWidgetC { public: GUIMenuItemC() : DPEntityC(TRUE) {} //: Default constructor GUIMenuItemC(const StringC &name) : DPEntityC(*new GUIMenuItemBodyC(name)) {} //: Constructor GUIMenuItemC(GUIMenuItemBodyC &bod) : DPEntityC(bod) {} //: Body constructor protected: GUIMenuItemBodyC &Body() { return dynamic_cast(DPEntityC::Body()); } //: Access body. public: Signal0C &SigSelected() { return Body().SigSelected(); } //: Access selected signal. }; ////////////////////////////////////////////////// //! userlevel=Develop //: Pixmap body class GUIMenuBodyC : public GUIContainerWidgetBodyC { public: GUIMenuBodyC(const StringC &nmenuName,const DListC &widges) : GUIContainerWidgetBodyC(widges), menuName(nmenuName) {} //: Constructor. GUIMenuBodyC(const StringC &nmenuName,const GUIWidgetC &widge) : menuName(nmenuName) { Add(widge); } //: Constructor. GUIMenuBodyC(const StringC &nmenuName) : menuName(nmenuName) {} //: Constructor. virtual BooleanT Create(); //: Create the widget. const StringC &MenuName() const { return menuName; } //: Menu name void Popup(GdkEvent *event = 0); //: Make menu popup in 'parent' at 'where'. protected: StringC menuName; }; //! userlevel=Normal //: Pixmap class GUIMenuC : public GUIContainerWidgetC { public: GUIMenuC() : DPEntityC(true) {} //: Default constructor. // creates an invalid handle. GUIMenuC(const StringC &menuName,const DListC &widges) : DPEntityC(*new GUIMenuBodyC(menuName,widges)) {} //: Constructor GUIMenuC(const StringC &menuName,const GUIWidgetC &widge) : DPEntityC(*new GUIMenuBodyC(menuName,widge)) {} //: Constructor GUIMenuC(const StringC &menuName) : DPEntityC(*new GUIMenuBodyC(menuName)) {} //: Constructor GUIMenuC(const GUIWidgetC &widge); //: Create a handle from a base class. // This will create an invalid refrence if // the given object is not derived from GUIMenuC static BooleanT IsA(const GUIWidgetC &widge) { return dynamic_cast(&(widge.DPEntityC::Body())) != 0; } //: Is widget a menu ? protected: GUIMenuBodyC &Body() { return dynamic_cast(DPEntityC::Body()); } //: Access body. const GUIMenuBodyC &Body() const { return dynamic_cast(DPEntityC::Body()); } //: Access body. public: const StringC &MenuName() const { return Body().MenuName(); } //: Get name of menu. void Popup(GdkEvent *event = 0) { Body().Popup(event); } //: Popup a menu. // If caused by an event you should pass 'event' ptr, // otherwise set to 0. This is used for some heuristics // about how to display the menu. (Setting to 0 is fine // in most cases.) void Popup(GdkEventButton *event) { Body().Popup((GdkEvent *) event); } //: Popup a menu. // This is just a way of avoiding some casts. // See Popup(GdkEvent *) for details. }; ////////////////////////////////////////////////// //! userlevel=Develop //: Pixmap body class GUIMenuBarBodyC : public GUIContainerWidgetBodyC { public: GUIMenuBarBodyC() {} //: Default constuctor. GUIMenuBarBodyC(const DListC &widges) : GUIContainerWidgetBodyC(widges) {} //: Constructor. GUIMenuBarBodyC(const GUIMenuC &menu) { Add(menu); } //: Default constuctor. virtual BooleanT Create(); //: Create the widget. protected: }; //! userlevel=Normal //: Pixmap class GUIMenuBarC : public GUIContainerWidgetC { public: GUIMenuBarC(const DListC &widges) : DPEntityC(*new GUIMenuBarBodyC(widges)) {} //: Constructor GUIMenuBarC(const GUIMenuC &menu) : DPEntityC(*new GUIMenuBarBodyC(menu)) {} //: Constructor GUIMenuBarC() : DPEntityC(*new GUIMenuBarBodyC()) {} //: Default constructor }; namespace StdGUI { template GUIMenuItemC MenuItem(const StringC &label,void (*func)(Data1T &, Data2T &),const Data1T &dat1 = Data1T(),const Data2T &dat2 = Data2T()) { GUIMenuItemC ret(label); StdDP::Connect(ret.SigSelected(),func,dat1,dat2); return ret; } //: Create new menu item, connect to a function. template GUIMenuItemC MenuItem(const StringC &label,void (*func)(GUIMenuItemC &, DataT &ref),const DataT &dat = DataT()) { GUIMenuItemC ret(label); StdDP::Connect(ret.SigSelected(),func,ret,dat); return ret; } //: Create new menu item, connect to a function. template GUIMenuItemC MenuItem(const StringC &label,const DataT &dat,void (DataT::*func)()) { GUIMenuItemC ret(label); StdDP::Connect(ret.SigSelected(),dat,func); return ret; } //: Create new menu item, connect to a function. template GUIMenuItemC MenuItemRef(const StringC &label,DataT &dat,void (DataT::*func)()) { GUIMenuItemC ret(label); StdDP::ConnectRef(ret.SigSelected(),dat,func); return ret; } //: Create new menu item, connect to a function. // This does NOT hold a refrence to item 'dat' // OBSOLETE: Use MenuItemR(...) template GUIMenuItemC MenuItemR(const StringC &label,DataT &dat,void (DataT::*func)()) { GUIMenuItemC ret(label); StdDP::ConnectRef(ret.SigSelected(),dat,func); return ret; } //: Create new menu item, connect to a function. // This does NOT hold a refrence to item 'dat' template GUIMenuItemC MenuItem(const StringC &label,const ObjT &obj,void (ObjT::*func)(DataT &),const DataT &dat = DataT()) { GUIMenuItemC ret(label); StdDP::Connect(ret.SigSelected(),obj,func,dat); return ret; } //: Create new menu item, connect to a function. template GUIMenuItemC MenuItemRef(const StringC &label,ObjT &obj,void (ObjT::*func)(DataT &),const DataT &dat = DataT()) { GUIMenuItemC ret(label); StdDP::ConnectRef(ret.SigSelected(),obj,func,dat); return ret; } //: Create new menu item, connect to a function. // This does NOT hold a refrence to item 'dat' template GUIMenuItemC MenuItem(const StringC &label,const ObjT &obj,void (ObjT::*func)(Data1T &,Data2T &),const Data1T &dat1 = Data1T(),const Data2T &dat2 = Data2T()) { GUIMenuItemC ret(label); StdDP::Connect(ret.SigSelected(),obj,func,dat1,dat2); return ret; } //: Create new menu item, connect to a function. template GUIMenuItemC MenuItemR(const StringC &label,ObjT &obj,void (ObjT::*func)(Data1T &,Data2T &),const Data1T &dat1 = Data1T(),const Data2T &dat2 = Data2T()) { GUIMenuItemC ret(label); StdDP::ConnectRef(ret.SigSelected(),obj,func,dat1,dat2); return ret; } //: Create new menu item, connect to a function. inline GUIMenuItemC MenuItem(const StringC &label) { return GUIMenuItemC(label); } //: Do nothing... inline GUIMenuItemC MenuItemSeparator() { return GUIMenuItemC(StringC()); } //: Do nothing... GUIMenuItemC MenuItem(const StringC &label,void (*func)()); //: Simply call a function. GUIMenuItemC MenuItemShow(const StringC &label,const GUIWidgetC &widge); //: Send 'Show' request to a widget, from a menu item. // Calls 'show' of another widget when menu item is selected. } #endif