]> git.saurik.com Git - wxWidgets.git/blobdiff - src/univ/menu.cpp
made GetColourFromGTKWidget() more general, it is now used for all colours
[wxWidgets.git] / src / univ / menu.cpp
index ed3bd429ff1d8e2025258db6ce3b5f1bcf7b9f48..2bcfe84777a935b6f7d5b97af0c0d569395ad1bb 100644 (file)
@@ -601,10 +601,12 @@ void wxPopupMenuWindow::ClickItem(wxMenuItem *item)
     wxASSERT_MSG( !item->IsSeparator() && !item->IsSubMenu(),
                   _T("can't click this item") );
 
-    m_menu->ClickItem(item);
+    wxMenu* menu = m_menu;
 
     // close all menus
     DismissAndNotify();
+    
+    menu->ClickItem(item);
 }
 
 void wxPopupMenuWindow::OpenSubmenu(wxMenuItem *item, InputMethod how)
@@ -1680,6 +1682,12 @@ wxString wxMenuBar::GetLabelTop(size_t pos) const
 
 void wxMenuBar::RefreshAllItemsAfter(size_t pos)
 {
+    if ( !IsCreated() )
+    {
+        // no need to refresh if nothing is shown yet
+        return;
+    }
+
     wxRect rect = GetItemRect(pos);
     rect.width = GetClientSize().x - rect.x;
     RefreshRect(rect);
@@ -1690,6 +1698,12 @@ void wxMenuBar::RefreshItem(size_t pos)
     wxCHECK_RET( pos != (size_t)-1,
                  _T("invalid item in wxMenuBar::RefreshItem") );
 
+    if ( !IsCreated() )
+    {
+        // no need to refresh if nothing is shown yet
+        return;
+    }
+
     RefreshRect(GetItemRect(pos));
 }
 
@@ -1758,6 +1772,7 @@ void wxMenuBar::DoDraw(wxControlRenderer *renderer)
 wxRect wxMenuBar::GetItemRect(size_t pos) const
 {
     wxASSERT_MSG( pos < GetCount(), _T("invalid menu bar item index") );
+    wxASSERT_MSG( IsCreated(), _T("can't call this method yet") );
 
     wxRect rect;
     rect.x =
@@ -1963,7 +1978,7 @@ bool wxMenuBar::ProcessMouseEvent(const wxPoint& pt)
 
     // show the menu if we know that we should, even if we hadn't been showing
     // it before (this may happen if the previous menu was disabled)
-    if ( m_shouldShowMenu )
+    if ( m_shouldShowMenu && !m_menuShown)
     {
         // open the new menu if the old one we closed had been opened
         PopupCurrentMenu(FALSE /* don't select first item - as Windows does */);
@@ -2036,7 +2051,7 @@ void wxMenuBar::OnKeyDown(wxKeyEvent& event)
                 }
                 else // right
                 {
-                    if ( ++currentNew == (int)count )
+                    if ( ++currentNew == count )
                         currentNew = 0;
                 }
 
@@ -2223,6 +2238,11 @@ void wxMenuBar::PopupCurrentMenu(bool selectFirst)
             // that we pass 0 as width to position the menu exactly below the
             // item, not to the right of it
             wxRect rectItem = GetItemRect(m_current);
+
+           // Release mouse, because the menu will get the capture.
+           if (HasCapture())
+               ReleaseMouse();
+
             m_menuShown->Popup(ClientToScreen(rectItem.GetPosition()),
                                wxSize(0, rectItem.GetHeight()),
                                selectFirst);
@@ -2256,7 +2276,7 @@ void wxMenuBar::OnDismissMenu(bool dismissMenuBar)
 
 void wxMenuBar::OnDismiss()
 {
-    ReleaseCapture();
+    ReleaseMouse();
 
     if ( m_current != -1 )
     {