]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/menu.cpp
freeze whole window for TLW
[wxWidgets.git] / src / msw / menu.cpp
index a549d8b8204d0e7bf3bfbdb67afa296e6790a08a..444a991ef8a79b749d4b76814c20c49c3b60dff3 100644 (file)
@@ -112,7 +112,8 @@ void SetDefaultMenuItem(HMENU WXUNUSED_IN_WINCE(hmenu),
 // make the given menu item owner-drawn
 void SetOwnerDrawnMenuItem(HMENU WXUNUSED_IN_WINCE(hmenu),
                            UINT WXUNUSED_IN_WINCE(id),
-                           ULONG_PTR WXUNUSED_IN_WINCE(data))
+                           ULONG_PTR WXUNUSED_IN_WINCE(data),
+                           BOOL WXUNUSED_IN_WINCE(byPositon = FALSE))
 {
 #ifndef __WXWINCE__
     MENUITEMINFO mii;
@@ -122,7 +123,10 @@ void SetOwnerDrawnMenuItem(HMENU WXUNUSED_IN_WINCE(hmenu),
     mii.fType = MFT_OWNERDRAW;
     mii.dwItemData = data;
 
-    if ( !::SetMenuItemInfo(hmenu, id, FALSE, &mii) )
+    if ( reinterpret_cast<wxMenuItem*>(data)->IsSeparator() )
+        mii.fType |= MFT_SEPARATOR;
+
+    if ( !::SetMenuItemInfo(hmenu, id, byPositon, &mii) )
     {
         wxLogLastError(wxT("SetMenuItemInfo"));
     }
@@ -267,6 +271,7 @@ void wxMenu::Init()
 #if wxUSE_OWNER_DRAWN
     m_ownerDrawn = false;
     m_maxBitmapWidth = 0;
+    m_maxAccelWidth = -1;
 #endif // wxUSE_OWNER_DRAWN
 
     // create the menu
@@ -385,6 +390,8 @@ void wxMenu::UpdateAccel(wxMenuItem *item)
         {
             GetMenuBar()->RebuildAccelTable();
         }
+
+        ResetMaxAccelWidth();
     }
     //else: it is a separator, they can't have accels, nothing to do
 }
@@ -496,7 +503,7 @@ bool wxMenu::DoInsertOrAppend(wxMenuItem *pItem, size_t pos)
     // Under older systems mixing owner-drawn and non-owner-drawn items results
     // in inconsistent margins, so we force this one to be owner-drawn if any
     // other items already are.
-    if ( m_ownerDrawn && !pItem->IsSeparator() )
+    if ( m_ownerDrawn )
         pItem->SetOwnerDrawn(true);
 #endif // wxUSE_OWNER_DRAWN
 
@@ -506,7 +513,7 @@ bool wxMenu::DoInsertOrAppend(wxMenuItem *pItem, size_t pos)
     {
 #ifndef __DMC__
 
-        if ( !m_ownerDrawn )
+        if ( !m_ownerDrawn && !pItem->IsSeparator() )
         {
             // MIIM_BITMAP only works under WinME/2000+ so we always use owner
             // drawn item under the previous versions and we also have to use
@@ -631,27 +638,31 @@ bool wxMenu::DoInsertOrAppend(wxMenuItem *pItem, size_t pos)
             // make other item ownerdrawn and update margin width for equals alignment
             if ( !m_ownerDrawn || updateAllMargins )
             {
+                // we must use position in SetOwnerDrawnMenuItem because
+                // all separators have the same id
+                int pos = 0;
                 wxMenuItemList::compatibility_iterator node = GetMenuItems().GetFirst();
                 while (node)
                 {
                     wxMenuItem* item = node->GetData();
 
-                    if ( !item->IsSeparator() )
+                    if ( !item->IsOwnerDrawn())
                     {
-                        if ( !item->IsOwnerDrawn() )
-                        {
-                            item->SetOwnerDrawn(true);
-                            SetOwnerDrawnMenuItem(GetHmenu(), item->GetMSWId(),
-                                                  reinterpret_cast<ULONG_PTR>(item));
-                        }
-                        item->SetMarginWidth(m_maxBitmapWidth);
+                        item->SetOwnerDrawn(true);
+                        SetOwnerDrawnMenuItem(GetHmenu(), pos,
+                                              reinterpret_cast<ULONG_PTR>(item), TRUE);
                     }
 
+                    item->SetMarginWidth(m_maxBitmapWidth);
+
                     node = node->GetNext();
+                    pos++;
                 }
 
                 // set menu as ownerdrawn
                 m_ownerDrawn = true;
+
+                ResetMaxAccelWidth();
             }
             // only update our margin for equals alignment to other item
             else if ( !updateAllMargins )
@@ -796,6 +807,8 @@ wxMenuItem *wxMenu::DoRemove(wxMenuItem *item)
         delete m_accels[n];
 
         m_accels.RemoveAt(n);
+
+        ResetMaxAccelWidth();
     }
     //else: this item doesn't have an accel, nothing to do
 #endif // wxUSE_ACCEL
@@ -846,6 +859,34 @@ wxAcceleratorTable *wxMenu::CreateAccelTable() const
 
 #endif // wxUSE_ACCEL
 
+// ---------------------------------------------------------------------------
+// ownerdrawn helpers
+// ---------------------------------------------------------------------------
+
+#if wxUSE_OWNER_DRAWN
+
+void wxMenu::CalculateMaxAccelWidth()
+{
+    wxASSERT_MSG( m_maxAccelWidth == -1, wxT("it's really needed?") );
+
+    wxMenuItemList::compatibility_iterator node = GetMenuItems().GetFirst();
+    while (node)
+    {
+        wxMenuItem* item = node->GetData();
+
+        if ( item->IsOwnerDrawn() )
+        {
+            int width = item->MeasureAccelWidth();
+            if (width > m_maxAccelWidth )
+                m_maxAccelWidth = width;
+        }
+
+        node = node->GetNext();
+    }
+}
+
+#endif // wxUSE_OWNER_DRAWN
+
 // ---------------------------------------------------------------------------
 // set wxMenu title
 // ---------------------------------------------------------------------------