]> git.saurik.com Git - wxWidgets.git/commitdiff
added EVT_MENU_OPEN and EVT_MENU_CLOSE events
authorVadim Zeitlin <vadim@wxwidgets.org>
Sat, 23 Feb 2002 23:16:32 +0000 (23:16 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sat, 23 Feb 2002 23:16:32 +0000 (23:16 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@14376 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

docs/changes.txt
docs/latex/wx/cmdevent.tex
docs/latex/wx/menuevt.tex
include/wx/event.h
include/wx/msw/frame.h
samples/menu/menu.cpp
src/common/event.cpp
src/msw/frame.cpp

index 9d5f89ae377842bf99beaacf4d446b778f43b925..fc02199bc53086c966a8c0e647b053d965e0a1be 100644 (file)
@@ -97,15 +97,16 @@ Unix (Base/GUI):
 
 All (GUI):
 
+- significantly improved native font support
 - wxImage::ComputeHistogram() now uses wxImageHistogram instead of type-unsafe
   wxHashTable
-- significantly improved native font support
 - added IFF image handler
 - fixed using custom renderers in wxGrid which was broken in 2.3.2
 - support for multiple images in one file added to wxImage (TIFF and ICO formats)
 - support for CUR and ANI files in wxImage added (Chris Elliott)
 - wxTextCtrl::GetRange() added
 - added wxGetFontFromUser() convenience function
+- added EVT_MENU_OPEN and EVT_MENU_CLOSE events
 
 wxMSW:
 
index f129cfc0ce8c7c0d9b93c7073a0d2d81af19bb8f..a208fe97f31b970a9cb785cafb19d3eb1a020ee4 100644 (file)
@@ -47,6 +47,9 @@ characters into it than the limit previosuly set with
 which is generated by a menu item.}
 \twocolitem{{\bf EVT\_MENU\_RANGE(id1, id2, func)}}{Process a wxEVT\_COMMAND\_MENU\_RANGE command,
 which is generated by a range of menu items.}
+\twocolitem{{\bf EVT\_CONTEXT\_MENU(func)}}{Process the event generated
+when the user has requested a popup menu to appear by pressing a special
+keyboard key (under Windows) or by right clicking the mouse.}
 \twocolitem{{\bf EVT\_SLIDER(id, func)}}{Process a wxEVT\_COMMAND\_SLIDER\_UPDATED command,
 which is generated by a wxSlider control.}
 \twocolitem{{\bf EVT\_RADIOBOX(id, func)}}{Process a wxEVT\_COMMAND\_RADIOBOX\_SELECTED command,
index 51cba035cf2fab8287752b7f3a0915cdf5c365c7..aa6f00b5c995c866e49bb8875d6a80ec58382f72 100644 (file)
@@ -19,21 +19,19 @@ functions that take a wxMenuEvent argument.
 
 \twocolwidtha{7cm}
 \begin{twocollist}\itemsep=0pt
-\twocolitem{{\bf EVT\_MENU\_CHAR(func)}}{Process a wxEVT\_MENU\_CHAR event (a keypress
-when a menu is showing). Windows only; not yet implemented.}
-\twocolitem{{\bf EVT\_MENU\_INIT(func)}}{Process a wxEVT\_MENU\_INIT event (the menu
-is about to pop up). Windows only; not yet implemented.}
-\twocolitem{{\bf EVT\_MENU\_HIGHLIGHT(func)}}{Process a wxEVT\_MENU\_HIGHLIGHT event (a menu
-item is being highlighted). Windows only; not yet implemented.}
-\twocolitem{{\bf EVT\_POPUP\_MENU(func)}}{Process a wxEVT\_POPUP\_MENU event (a menu
-item is being highlighted). Windows only; not yet implemented.}
-\twocolitem{{\bf EVT\_CONTEXT\_MENU(func)}}{Process a wxEVT\_CONTEXT\_MENU event (F1 has
-been pressed with a particular menu item highlighted). Windows only; not yet implemented.}
+\twocolitem{{\bf EVT\_MENU\_OPEN(func)}}{A menu is about to be opened.}
+\twocolitem{{\bf EVT\_MENU\_CLOSE(func)}}{A menu has been just closed.}
+\twocolitem{{\bf EVT\_MENU\_HIGHLIGHT(id, func)}}{The menu item with the
+speicifed id has been highlighted: used to show help prompts in the status bar
+by \helpref{wxFrame}{wxframe}}
+\twocolitem{{\bf EVT\_MENU\_HIGHLIGHT\_ALL(func)}}{A menu item has been
+highlighted, i.e. the currently selected menu item has changed.}
 \end{twocollist}%
 
 \wxheading{See also}
 
-\helpref{wxWindow::OnMenuHighlight}{wxwindowonmenuhighlight}, \helpref{Event handling overview}{eventhandlingoverview}
+\helpref{Command events}{wxcommandevent},\\
+\helpref{Event handling overview}{eventhandlingoverview}
 
 \latexignore{\rtfignore{\wxheading{Members}}}
 
@@ -53,5 +51,16 @@ The relevant menu identifier.
 
 \constfunc{int}{GetMenuId}{\void}
 
-Returns the menu identifier associated with the event.
+Returns the menu identifier associated with the event. This method should be
+only used with the {\tt HIGHLIGHT} events.
+
+\membersection{wxMenuEvent::IsPopup}\label{wxmenueventispopup}
+
+\constfunc{bool}{IsPopup}{\void}
+
+Returns {\tt TRUE} if the menu which is being opened or closed is a popup menu, 
+{\tt FALSE} if it is a normal one.
+
+This method should be only used with the {\tt OPEN} and {\tt CLOSE} events.
+
 
index cedaf922eb274300ee738c656cdbf4862cdde054..e4b6b81fd3d25f1e567cfd729a35df2e39005cdb 100644 (file)
@@ -224,10 +224,10 @@ BEGIN_DECLARE_EVENT_TYPES()
     DECLARE_EVENT_TYPE(wxEVT_ERASE_BACKGROUND, 417)
     DECLARE_EVENT_TYPE(wxEVT_NC_PAINT, 418)
     DECLARE_EVENT_TYPE(wxEVT_PAINT_ICON, 419)
-    DECLARE_EVENT_TYPE(wxEVT_MENU_CHAR, 420)
-    DECLARE_EVENT_TYPE(wxEVT_MENU_INIT, 421)
+    DECLARE_EVENT_TYPE(wxEVT_MENU_OPEN, 420)
+    DECLARE_EVENT_TYPE(wxEVT_MENU_CLOSE, 421)
     DECLARE_EVENT_TYPE(wxEVT_MENU_HIGHLIGHT, 422)
-    DECLARE_EVENT_TYPE(wxEVT_POPUP_MENU_INIT, 423)
+    // DECLARE_EVENT_TYPE(wxEVT_POPUP_MENU_INIT, 423) -- free slot
     DECLARE_EVENT_TYPE(wxEVT_CONTEXT_MENU, 424)
     DECLARE_EVENT_TYPE(wxEVT_SYS_COLOUR_CHANGED, 425)
     DECLARE_EVENT_TYPE(wxEVT_DISPLAY_CHANGED, 426)
@@ -1048,26 +1048,29 @@ private:
 
 // Miscellaneous menu event class
 /*
- wxEVT_MENU_CHAR,
- wxEVT_MENU_INIT,
+ wxEVT_MENU_OPEN,
+ wxEVT_MENU_CLOSE,
  wxEVT_MENU_HIGHLIGHT,
- wxEVT_POPUP_MENU_INIT,
 */
 
 class WXDLLEXPORT wxMenuEvent : public wxEvent
 {
 public:
     wxMenuEvent(wxEventType type = wxEVT_NULL, int id = 0)
-      { m_eventType = type; m_menuId = id; m_id = id; }
+        : wxEvent(id, type)
+        { m_menuId = id; }
 
+    // only for wxEVT_MENU_HIGHLIGHT
     int GetMenuId() const { return m_menuId; }
 
+    // only for wxEVT_MENU_OPEN/CLOSE
+    bool IsPopup() const { return m_menuId == -1; }
+
     virtual wxEvent *Clone() const { return new wxMenuEvent(*this); }
 
 private:
     int m_menuId;
 
-private:
     DECLARE_DYNAMIC_CLASS(wxMenuEvent)
 };
 
@@ -1973,6 +1976,8 @@ typedef void (wxEvtHandler::*wxContextMenuEventFunction)(wxContextMenuEvent&);
 #define EVT_KEY_DOWN(func)  DECLARE_EVENT_TABLE_ENTRY( wxEVT_KEY_DOWN, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxCharEventFunction) & func, (wxObject *) NULL ),
 #define EVT_KEY_UP(func)  DECLARE_EVENT_TABLE_ENTRY( wxEVT_KEY_UP, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxCharEventFunction) & func, (wxObject *) NULL ),
 #define EVT_CHAR_HOOK(func)  DECLARE_EVENT_TABLE_ENTRY( wxEVT_CHAR_HOOK, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxCharEventFunction) & func, NULL ),
+#define EVT_MENU_OPEN(func)  DECLARE_EVENT_TABLE_ENTRY( wxEVT_MENU_OPEN, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxMenuEventFunction) & func, (wxObject *) NULL ),
+#define EVT_MENU_CLOSE(func)  DECLARE_EVENT_TABLE_ENTRY( wxEVT_MENU_CLOSE, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxMenuEventFunction) & func, (wxObject *) NULL ),
 #define EVT_MENU_HIGHLIGHT(id, func)  DECLARE_EVENT_TABLE_ENTRY( wxEVT_MENU_HIGHLIGHT, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxMenuEventFunction) & func, (wxObject *) NULL ),
 #define EVT_MENU_HIGHLIGHT_ALL(func)  DECLARE_EVENT_TABLE_ENTRY( wxEVT_MENU_HIGHLIGHT, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxMenuEventFunction) & func, (wxObject *) NULL ),
 #define EVT_SET_FOCUS(func)  DECLARE_EVENT_TABLE_ENTRY( wxEVT_SET_FOCUS, -1, -1, (wxObjectEventFunction) (wxEventFunction) (wxFocusEventFunction) & func, (wxObject *) NULL ),
index 300931980a5020cdb999ea90e00f590f89870e0e..b3f81e6c796b9bd30803d8826fa37bea1a523e59 100644 (file)
@@ -91,6 +91,7 @@ public:
     bool HandleSize(int x, int y, WXUINT flag);
     bool HandleCommand(WXWORD id, WXWORD cmd, WXHWND control);
     bool HandleMenuSelect(WXWORD nItem, WXWORD nFlags, WXHMENU hMenu);
+    bool HandleMenuLoop(const wxEventType& evtType, WXWORD isPopup);
 
     // tooltip management
 #if wxUSE_TOOLTIPS
index b60d0c74c9ccb909aff0be25f56108bdcc7fc1cc..942d2df319fd5bc0a657106acf037f5b4e205332 100644 (file)
@@ -88,13 +88,27 @@ protected:
     void OnGetLabelMenu(wxCommandEvent& event);
     void OnSetLabelMenu(wxCommandEvent& event);
 
-    void OnRightUp(wxMouseEvent& event);
+#ifdef __WXMSW__
+    void OnContextMenu(wxContextMenuEvent& event)
+        { ShowContextMenu(ScreenToClient(event.GetPosition())); }
+#else
+    void OnRightUp(wxMouseEvent& event)
+        { ShowContextMenu(event.GetPosition()); }
+#endif
+
+    void OnMenuOpen(wxMenuEvent& event)
+        { LogMenuOpenOrClose(event, _T("opened")); }
+    void OnMenuClose(wxMenuEvent& event)
+        { LogMenuOpenOrClose(event, _T("closed")); }
 
     void OnUpdateCheckMenuItemUI(wxUpdateUIEvent& event);
 
     void OnSize(wxSizeEvent& event);
 
 private:
+    void LogMenuOpenOrClose(const wxMenuEvent& event, const wxChar *what);
+    void ShowContextMenu(const wxPoint& pos);
+
     wxMenu *CreateDummyMenu(wxString *title);
 
     wxMenuItem *GetLastMenuItem() const;
@@ -208,7 +222,14 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame)
 
     EVT_UPDATE_UI(Menu_Menu_Check, MyFrame::OnUpdateCheckMenuItemUI)
 
+#ifdef __WXMSW__
+    EVT_CONTEXT_MENU(MyFrame::OnContextMenu)
+#else
     EVT_RIGHT_UP(MyFrame::OnRightUp)
+#endif
+
+    EVT_MENU_OPEN(MyFrame::OnMenuOpen)
+    EVT_MENU_CLOSE(MyFrame::OnMenuClose)
 
     EVT_SIZE(MyFrame::OnSize)
 END_EVENT_TABLE()
@@ -703,7 +724,7 @@ void MyFrame::OnGetMenuItemInfo(wxCommandEvent& WXUNUSED(event))
     }
 }
 
-void MyFrame::OnRightUp(wxMouseEvent &event)
+void MyFrame::ShowContextMenu(const wxPoint& pos)
 {
     wxMenu menu("Test popup");
 
@@ -719,7 +740,7 @@ void MyFrame::OnRightUp(wxMouseEvent &event)
     menu.Check(Menu_Popup_ToBeChecked, TRUE);
     menu.Enable(Menu_Popup_ToBeGreyed, FALSE);
 
-    PopupMenu(&menu, event.GetX(), event.GetY());
+    PopupMenu(&menu, pos.x, pos.y);
 
     // test for destroying items in popup menus
 #if 0 // doesn't work in wxGTK!
@@ -729,6 +750,12 @@ void MyFrame::OnRightUp(wxMouseEvent &event)
 #endif // 0
 }
 
+void MyFrame::LogMenuOpenOrClose(const wxMenuEvent& event, const wxChar *what)
+{
+    wxLogStatus(this, _T("A %smenu has been %s."),
+                event.IsPopup() ? _T("popup ") : _T(""), what);
+}
+
 void MyFrame::OnSize(wxSizeEvent& event)
 {
     if ( !m_textctrl )
index c81e168b15543781043b5b90193dcae1519afbb9..df2d8c44770c9246037ed7b86fc0bf7c93aea5b3 100644 (file)
@@ -219,10 +219,9 @@ DEFINE_EVENT_TYPE(wxEVT_PAINT)
 DEFINE_EVENT_TYPE(wxEVT_ERASE_BACKGROUND)
 DEFINE_EVENT_TYPE(wxEVT_NC_PAINT)
 DEFINE_EVENT_TYPE(wxEVT_PAINT_ICON)
-DEFINE_EVENT_TYPE(wxEVT_MENU_CHAR)
-DEFINE_EVENT_TYPE(wxEVT_MENU_INIT)
+DEFINE_EVENT_TYPE(wxEVT_MENU_OPEN)
+DEFINE_EVENT_TYPE(wxEVT_MENU_CLOSE)
 DEFINE_EVENT_TYPE(wxEVT_MENU_HIGHLIGHT)
-DEFINE_EVENT_TYPE(wxEVT_POPUP_MENU_INIT)
 DEFINE_EVENT_TYPE(wxEVT_CONTEXT_MENU)
 DEFINE_EVENT_TYPE(wxEVT_SYS_COLOUR_CHANGED)
 DEFINE_EVENT_TYPE(wxEVT_DISPLAY_CHANGED)
index 920e95879b136dd8ea26c392002e366a230d8288..c4ab391cd81bbc8be94c6ffe94cf9feacc86c5d3 100644 (file)
@@ -763,7 +763,17 @@ bool wxFrame::HandleMenuSelect(WXWORD nItem, WXWORD flags, WXHMENU hMenu)
     }
 
     wxMenuEvent event(wxEVT_MENU_HIGHLIGHT, item);
-    event.SetEventObject( this );
+    event.SetEventObject(this);
+
+    return GetEventHandler()->ProcessEvent(event);
+}
+
+bool wxFrame::HandleMenuLoop(const wxEventType& evtType, WXWORD isPopup)
+{
+    // we don't have the menu id here, so we use the id to specify if the event
+    // was from a popup menu or a normal one
+    wxMenuEvent event(evtType, isPopup ? -1 : 0);
+    event.SetEventObject(this);
 
     return GetEventHandler()->ProcessEvent(event);
 }
@@ -785,6 +795,10 @@ long wxFrame::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
             processed = !Close();
             break;
 
+        case WM_SIZE:
+            processed = HandleSize(LOWORD(lParam), HIWORD(lParam), wParam);
+            break;
+
         case WM_COMMAND:
             {
                 WORD id, cmd;
@@ -796,6 +810,10 @@ long wxFrame::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
             }
             break;
 
+        case WM_PAINT:
+            processed = HandlePaint();
+            break;
+
 #ifndef __WXMICROWIN__
         case WM_MENUSELECT:
             {
@@ -806,13 +824,17 @@ long wxFrame::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
                 processed = HandleMenuSelect(item, flags, hmenu);
             }
             break;
-#endif
 
-        case WM_PAINT:
-            processed = HandlePaint();
+#ifndef __WIN16__
+        case WM_ENTERMENULOOP:
+            processed = HandleMenuLoop(wxEVT_MENU_OPEN, wParam);
             break;
 
-#ifndef __WXMICROWIN__
+        case WM_EXITMENULOOP:
+            processed = HandleMenuLoop(wxEVT_MENU_CLOSE, wParam);
+            break;
+#endif // __WIN16__
+
         case WM_QUERYDRAGICON:
             {
                 HICON hIcon = m_icon.Ok() ? GetHiconOf(m_icon)
@@ -821,11 +843,7 @@ long wxFrame::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
                 processed = rc != 0;
             }
             break;
-#endif
-
-        case WM_SIZE:
-            processed = HandleSize(LOWORD(lParam), HIWORD(lParam), wParam);
-            break;
+#endif // !__WXMICROWIN__
     }
 
     if ( !processed )