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