]> git.saurik.com Git - wxWidgets.git/commitdiff
supporting PopUp on osx cocoa as well, see #10361
authorStefan Csomor <csomor@advancedconcepts.ch>
Sat, 10 Jan 2009 14:43:22 +0000 (14:43 +0000)
committerStefan Csomor <csomor@advancedconcepts.ch>
Sat, 10 Jan 2009 14:43:22 +0000 (14:43 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@57970 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/osx/core/private.h
src/osx/carbon/menu.cpp
src/osx/cocoa/menu.mm
src/osx/window_osx.cpp

index dec77345e54cce44486a94e8cb39ca0d56558098..d16cbfa3fc91b087723e507f130bf9d0081e9849 100644 (file)
@@ -152,6 +152,8 @@ public :
     
     wxMenu* GetWXPeer() { return m_peer ; }
 
     
     wxMenu* GetWXPeer() { return m_peer ; }
 
+    virtual void PopUp( wxWindow *win, int x, int y ) = 0;
+
     static wxMenuImpl* Create( wxMenu* peer, const wxString& title );
     static wxMenuImpl* CreateRootMenu( wxMenu* peer );
 protected :
     static wxMenuImpl* Create( wxMenu* peer, const wxString& title );
     static wxMenuImpl* CreateRootMenu( wxMenu* peer );
 protected :
index bb6b08ea2e5a94137cc4af6ebe42b05388f08e72..5db7b7bc502731ec93f21999be7ef7faa477c14b 100644 (file)
@@ -189,7 +189,6 @@ public :
 
     virtual ~wxMenuCarbonImpl();
         
 
     virtual ~wxMenuCarbonImpl();
         
-
     virtual void InsertOrAppend(wxMenuItem *pItem, size_t pos) 
     {
         // MacOS counts menu items from 1 and inserts after, therefore having the
     virtual void InsertOrAppend(wxMenuItem *pItem, size_t pos) 
     {
         // MacOS counts menu items from 1 and inserts after, therefore having the
@@ -259,6 +258,24 @@ public :
 
     WXHMENU GetHMenu() { return m_osxMenu; }
 
 
     WXHMENU GetHMenu() { return m_osxMenu; }
 
+    virtual void PopUp( wxWindow *WXUNUSED(win), int x, int y )
+    {
+        long menuResult = ::PopUpMenuSelect(m_osxMenu, y, x, 0) ;
+        if ( HiWord(menuResult) != 0 )
+        {
+            MenuCommand macid;
+            GetMenuItemCommandID( GetMenuHandle(HiWord(menuResult)) , LoWord(menuResult) , &macid );
+            int id = wxMacCommandToId( macid );
+            wxMenuItem* item = NULL ;
+            wxMenu* realmenu ;
+            item = m_peer->FindItem( id, &realmenu ) ;
+            if ( item )
+            {
+                m_peer->HandleCommandProcess(item, NULL );
+            }
+        }
+    }
+
     static wxMenuImpl* Create( wxMenu* peer, const wxString& title );
     static wxMenuImpl* CreateRootMenu( wxMenu* peer );
 protected :
     static wxMenuImpl* Create( wxMenu* peer, const wxString& title );
     static wxMenuImpl* CreateRootMenu( wxMenu* peer );
 protected :
index 3bac02bfadebe7365963e5d6883493d675160b3d..22227936763e9abce033eb198a0305edb73c4373 100644 (file)
@@ -164,6 +164,24 @@ public :
         [m_osxMenu setTitle:cfText.AsNSString()];
     }
 
         [m_osxMenu setTitle:cfText.AsNSString()];
     }
 
+    virtual void PopUp( wxWindow *win, int x, int y )
+    {
+        win->ScreenToClient( &x , &y ) ;
+        NSView *view = win->GetPeer()->GetWXWidget();
+        NSRect frame = [view frame];
+        frame.origin.x = x;
+        frame.origin.y = y;
+        frame.size.width = 1;
+        frame.size.height = 1;
+        NSPopUpButtonCell *popUpButtonCell = [[NSPopUpButtonCell alloc] initTextCell:@"" pullsDown:NO];
+        [popUpButtonCell setAutoenablesItems:NO];
+        [popUpButtonCell setAltersStateOfSelectedItem:NO];
+        [popUpButtonCell setMenu:m_osxMenu];
+        [popUpButtonCell selectItem:nil];
+        [popUpButtonCell performClickWithFrame:frame inView:view];
+        [popUpButtonCell release];
+    }
+
     WXHMENU GetHMenu() { return m_osxMenu; }
 
     static wxMenuImpl* Create( wxMenu* peer, const wxString& title );
     WXHMENU GetHMenu() { return m_osxMenu; }
 
     static wxMenuImpl* Create( wxMenu* peer, const wxString& title );
index ebec85144e22944b258701de7a433a3cf11b0437..e482f1d0a03d13375a81c33d8ab49071aee172f2 100644 (file)
@@ -748,30 +748,8 @@ bool wxWindowMac::DoPopupMenu(wxMenu *menu, int x, int y)
     {
         ClientToScreen( &x , &y ) ;
     }
     {
         ClientToScreen( &x , &y ) ;
     }
-#ifdef __WXOSX_CARBON__
-    long menuResult = ::PopUpMenuSelect((MenuHandle) menu->GetHMenu() , y, x, 0) ;
-    if ( HiWord(menuResult) != 0 )
-    {
-        MenuCommand macid;
-        GetMenuItemCommandID( GetMenuHandle(HiWord(menuResult)) , LoWord(menuResult) , &macid );
-        int id = wxMacCommandToId( macid );
-        wxMenuItem* item = NULL ;
-        wxMenu* realmenu ;
-        item = menu->FindItem( id, &realmenu ) ;
-        if ( item )
-        {
-            if (item->IsCheckable())
-                item->Check( !item->IsChecked() ) ;
-
-            menu->SendEvent( id , item->IsCheckable() ? item->IsChecked() : -1 ) ;
-        }
-    }
-
-#else
+    menu->GetPeer()->PopUp(this, x, y);
     menu->SetInvokingWindow( NULL );
     menu->SetInvokingWindow( NULL );
-    return false;
-#endif
-
     return true;
 #else
     // actually this shouldn't be called, because universal is having its own implementation
     return true;
 #else
     // actually this shouldn't be called, because universal is having its own implementation