1 /*********************************************************************** 2 created: 5/4/2005 3 author: Tomas Lindquist Olsen (based on code by Paul D Turner) 4 5 purpose: Interface to base class for MenuBase widget 6 *************************************************************************/ 7 /*************************************************************************** 8 * Copyright (C) 2004 - 2006 Paul D Turner & The CEGUI Development Team 9 * 10 * Permission is hereby granted, free of charge, to any person obtaining 11 * a copy of this software and associated documentation files (the 12 * "Software"), to deal in the Software without restriction, including 13 * without limitation the rights to use, copy, modify, merge, publish, 14 * distribute, sublicense, and/or sell copies of the Software, and to 15 * permit persons to whom the Software is furnished to do so, subject to 16 * the following conditions: 17 * 18 * The above copyright notice and this permission notice shall be 19 * included in all copies or substantial portions of the Software. 20 * 21 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 22 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 23 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 24 * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR 25 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 26 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 27 * OTHER DEALINGS IN THE SOFTWARE. 28 ***************************************************************************/ 29 #ifndef _CEGUIMenuBase_h_ 30 #define _CEGUIMenuBase_h_ 31 32 #include "../Base.h" 33 #include "../Window.h" 34 #include "./ItemListBase.h" 35 36 37 #if defined(_MSC_VER) 38 # pragma warning(push) 39 # pragma warning(disable : 4251) 40 #endif 41 42 43 // Start of CEGUI namespace section 44 namespace CEGUI 45 { 46 47 /*! 48 \brief 49 Abstract base class for menus. 50 */ 51 class CEGUIEXPORT MenuBase : public ItemListBase 52 { 53 public: 54 static const String EventNamespace; //!< Namespace for global events 55 56 57 /************************************************************************* 58 Event name constants 59 *************************************************************************/ 60 // generated internally by Window 61 /** Event fired when a MenuItem attached to this menu opened a PopupMenu. 62 * Handlers are passed a const WindowEventArgs reference with 63 * WindowEventArgs::window set to the PopupMenu that was opened. 64 */ 65 static const String EventPopupOpened; 66 /** Event fired when a MenuItem attached to this menu closed a PopupMenu. 67 * Handlers are passed a const WindowEventArgs reference with 68 * WindowEventArgs::window set to the PopupMenu that was closed. 69 */ 70 static const String EventPopupClosed; 71 72 73 /************************************************************************* 74 Accessor type functions 75 *************************************************************************/ 76 /*! 77 \brief 78 Get the item spacing for this menu. 79 80 \return 81 A float value with the current item spacing for this menu 82 */ getItemSpacing(void)83 float getItemSpacing(void) const 84 { 85 return d_itemSpacing; 86 } 87 88 89 /*! 90 \brief 91 Return whether this menu allows multiple popup menus to open at the same time. 92 93 \return 94 true if this menu allows multiple popup menus to be opened simultaneously. false if not 95 */ isMultiplePopupsAllowed(void)96 bool isMultiplePopupsAllowed(void) const 97 { 98 return d_allowMultiplePopups; 99 } 100 101 /*! 102 \brief 103 Return whether this menu should close all its open child popups, when it gets hidden 104 105 \return 106 true if the menu should close all its open child popups, when it gets hidden 107 */ getAutoCloseNestedPopups(void)108 bool getAutoCloseNestedPopups(void) const 109 { 110 return d_autoCloseNestedPopups; 111 } 112 113 /*! 114 \brief 115 Get currently opened MenuItem in this menu. Returns NULL if no menu item is open. 116 117 \return 118 Pointer to the MenuItem currently open. 119 */ getPopupMenuItem(void)120 MenuItem* getPopupMenuItem(void) const 121 { 122 return d_popupItem; 123 } 124 125 126 /************************************************************************* 127 Manipulators 128 *************************************************************************/ 129 /*! 130 \brief 131 Set the item spacing for this menu. 132 */ setItemSpacing(float spacing)133 void setItemSpacing(float spacing) 134 { 135 d_itemSpacing = spacing; 136 handleUpdatedItemData(); 137 } 138 139 140 /*! 141 \brief 142 Change the currently open MenuItem in this menu. 143 144 \param item 145 Pointer to a MenuItem to open or NULL to close any opened. 146 */ 147 void changePopupMenuItem(MenuItem* item); 148 149 150 /*! 151 \brief 152 Set whether this menu allows multiple popup menus to be opened simultaneously. 153 */ 154 void setAllowMultiplePopups(bool setting); 155 156 /*! 157 \brief 158 Set whether the menu should close all its open child popups, when it gets hidden 159 */ setAutoCloseNestedPopups(bool setting)160 void setAutoCloseNestedPopups(bool setting) 161 { 162 d_autoCloseNestedPopups = setting; 163 } 164 /*! 165 \brief 166 tells the current popup that it should start its closing timer. 167 */ 168 void setPopupMenuItemClosing(); 169 170 171 /************************************************************************* 172 Construction and Destruction 173 *************************************************************************/ 174 /*! 175 \brief 176 Constructor for MenuBase objects 177 */ 178 MenuBase(const String& type, const String& name); 179 180 181 /*! 182 \brief 183 Destructor for MenuBase objects 184 */ 185 virtual ~MenuBase(void); 186 187 188 protected: 189 /************************************************************************* 190 New Event Handlers 191 *************************************************************************/ 192 /*! 193 \brief 194 handler invoked internally when the a MenuItem attached to this menu opens its popup. 195 */ 196 virtual void onPopupOpened(WindowEventArgs& e); 197 198 199 /*! 200 \brief 201 handler invoked internally when the a MenuItem attached to this menu closes its popup. 202 */ 203 virtual void onPopupClosed(WindowEventArgs& e); 204 205 // overridden from base 206 virtual void onChildRemoved(ElementEventArgs& e); 207 virtual void onHidden(WindowEventArgs& e); 208 209 /************************************************************************* 210 Implementation Data 211 *************************************************************************/ 212 float d_itemSpacing; //!< The spacing in pixels between items. 213 214 MenuItem* d_popupItem; //!< The currently open MenuItem. NULL if no item is open. If multiple popups are allowed, this means nothing. 215 bool d_allowMultiplePopups; //!< true if multiple popup menus are allowed simultaneously. false if not. 216 bool d_autoCloseNestedPopups; //!< true if the menu should close all its open child popups, when it gets hidden 217 218 219 private: 220 /************************************************************************* 221 Private methods 222 *************************************************************************/ 223 void addMenuBaseProperties(void); 224 }; 225 226 } // End of CEGUI namespace section 227 228 229 #if defined(_MSC_VER) 230 # pragma warning(pop) 231 #endif 232 233 #endif // end of guard _CEGUIMenuBase_h_ 234