]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/menu.cpp
Don't forget wxrc
[wxWidgets.git] / src / msw / menu.cpp
index bcc1febf1d6f8ee186c5c816f3333b764accbd6f..478048e7037bf5a9339b53e49b93bdeb2782ceb9 100644 (file)
@@ -673,8 +673,14 @@ void wxMenuBar::Init()
 {
     m_eventHandler = this;
     m_hMenu = 0;
-#ifdef __WXWINCE__
+#if wxUSE_TOOLBAR && defined(__WXWINCE__) && (_WIN32_WCE < 400 || wxUSE_POCKETPC_UI)
     m_toolBar = NULL;
+#endif
+    // Not using a combined wxToolBar/wxMenuBar? then use
+    // a commandbar in WinCE .NET just to implement the
+    // menubar.
+#if defined(__WXWINCE__) && (_WIN32_WCE >= 400 && !wxUSE_POCKETPC_UI)
+    m_commandBar = NULL;
 #endif
 }
 
@@ -705,9 +711,9 @@ wxMenuBar::wxMenuBar(int count, wxMenu *menus[], const wxString titles[])
 
 wxMenuBar::~wxMenuBar()
 {
-    // In Windows CE, the menubar is always associated
+    // In Windows CE (not .NET), the menubar is always associated
     // with a toolbar, which destroys the menu implicitly.
-#ifdef __WXWINCE__
+#if defined(__WXWINCE__) && (_WIN32_WCE < 400 || wxUSE_POCKETPC_UI)
     if (GetToolBar())
         GetToolBar()->SetMenuBar(NULL);
 #else
@@ -715,7 +721,12 @@ wxMenuBar::~wxMenuBar()
     // which happens if we're attached to a frame
     if (m_hMenu && !IsAttached())
     {
+#if defined(__WXWINCE__) && (_WIN32_WCE >= 400 && !wxUSE_POCKETPC_UI)
+        ::DestroyWindow((HWND) m_commandBar);
+        m_commandBar = (WXHWND) NULL;
+#else
         ::DestroyMenu((HMENU)m_hMenu);
+#endif        
         m_hMenu = (WXHMENU)NULL;
     }
 #endif
@@ -729,11 +740,14 @@ void wxMenuBar::Refresh()
 {
     wxCHECK_RET( IsAttached(), wxT("can't refresh unattached menubar") );
 
-#ifdef __WXWINCE__
+#if defined(__WXWINCE__) && (_WIN32_WCE < 400 || wxUSE_POCKETPC_UI)
     if (GetToolBar())
     {
         CommandBar_DrawMenuBar((HWND) GetToolBar()->GetHWND(), 0);
     }
+#elif defined(__WXWINCE__) && (_WIN32_WCE >= 400 && !wxUSE_POCKETPC_UI)
+    if (m_commandBar)
+        DrawMenuBar((HWND) m_commandBar);
 #else
     DrawMenuBar(GetHwndOf(GetFrame()));
 #endif
@@ -806,21 +820,31 @@ WXHMENU wxMenuBar::Create()
         }
     }
 
-#if _WIN32_WCE >= 400
-    if (GetToolBar())
-    {
-        HWND hCommandBar = (HWND) GetToolBar()->GetHWND();
-        if (!CommandBar_InsertMenubarEx(hCommandBar, NULL, (LPTSTR) m_hMenu, 0))
-        {
-            wxLogLastError(wxT("CommandBar_InsertMenubarEx"));
-        }
-    }
-#endif
-
     return m_hMenu;
 #endif
 }
 
+int wxMenuBar::MSWPositionForWxMenu(wxMenu *menu, int wxpos)
+{
+    wxASSERT(menu);
+    wxASSERT(menu->GetHMenu());
+    wxASSERT(m_hMenu);
+    int totalMSWItems = GetMenuItemCount((HMENU)m_hMenu);
+    int i; // For old C++ compatibility
+    for(i=wxpos; i<totalMSWItems; i++)
+    {
+        if(GetSubMenu((HMENU)m_hMenu,i)==(HMENU)menu->GetHMenu())
+            return i;
+    }
+    for(i=0; i<wxpos; i++)
+    {
+        if(GetSubMenu((HMENU)m_hMenu,i)==(HMENU)menu->GetHMenu())
+            return i;
+    }
+    wxFAIL;
+    return -1;
+}
+
 // ---------------------------------------------------------------------------
 // wxMenuBar functions to work with the top level submenus
 // ---------------------------------------------------------------------------
@@ -831,10 +855,11 @@ WXHMENU wxMenuBar::Create()
 void wxMenuBar::EnableTop(size_t pos, bool enable)
 {
     wxCHECK_RET( IsAttached(), wxT("doesn't work with unattached menubars") );
+    wxCHECK_RET( pos < GetMenuCount(), wxT("invalid menu index") );
 
     int flag = enable ? MF_ENABLED : MF_GRAYED;
 
-    EnableMenuItem((HMENU)m_hMenu, pos, MF_BYPOSITION | flag);
+    EnableMenuItem((HMENU)m_hMenu, MSWPositionForWxMenu(GetMenu(pos),pos), MF_BYPOSITION | flag);
 
     Refresh();
 }
@@ -851,8 +876,10 @@ void wxMenuBar::SetLabelTop(size_t pos, const wxString& label)
     }
     //else: have to modify the existing menu
 
+    int mswpos = MSWPositionForWxMenu(GetMenu(pos),pos);
+
     UINT id;
-    UINT flagsOld = ::GetMenuState((HMENU)m_hMenu, pos, MF_BYPOSITION);
+    UINT flagsOld = ::GetMenuState((HMENU)m_hMenu, mswpos, MF_BYPOSITION);
     if ( flagsOld == 0xFFFFFFFF )
     {
         wxLogLastError(wxT("GetMenuState"));
@@ -864,7 +891,7 @@ void wxMenuBar::SetLabelTop(size_t pos, const wxString& label)
     {
         // HIBYTE contains the number of items in the submenu in this case
         flagsOld &= 0xff;
-        id = (UINT)::GetSubMenu((HMENU)m_hMenu, pos);
+        id = (UINT)::GetSubMenu((HMENU)m_hMenu, mswpos);
     }
     else
     {
@@ -885,7 +912,7 @@ void wxMenuBar::SetLabelTop(size_t pos, const wxString& label)
     }
     
 #else
-    if ( ::ModifyMenu(GetHmenu(), pos, MF_BYPOSITION | MF_STRING | flagsOld,
+    if ( ::ModifyMenu(GetHmenu(), mswpos, MF_BYPOSITION | MF_STRING | flagsOld,
         id, label) == (int)0xFFFFFFFF )
     {
         wxLogLastError(wxT("ModifyMenu"));
@@ -917,13 +944,15 @@ wxMenu *wxMenuBar::Replace(size_t pos, wxMenu *menu, const wxString& title)
 
     if ( IsAttached() )
     {
+        int mswpos = MSWPositionForWxMenu(menuOld,pos);
+
         // can't use ModifyMenu() because it deletes the submenu it replaces
-        if ( !::RemoveMenu(GetHmenu(), (UINT)pos, MF_BYPOSITION) )
+        if ( !::RemoveMenu(GetHmenu(), (UINT)mswpos, MF_BYPOSITION) )
         {
             wxLogLastError(wxT("RemoveMenu"));
         }
 
-        if ( !::InsertMenu(GetHmenu(), (UINT)pos,
+        if ( !::InsertMenu(GetHmenu(), (UINT)mswpos,
                            MF_BYPOSITION | MF_POPUP | MF_STRING,
                            (UINT)GetHmenuOf(menu), title) )
         {
@@ -946,6 +975,13 @@ wxMenu *wxMenuBar::Replace(size_t pos, wxMenu *menu, const wxString& title)
 
 bool wxMenuBar::Insert(size_t pos, wxMenu *menu, const wxString& title)
 {
+    // Find out which MSW item before which we'll be inserting before
+    // wxMenuBarBase::Insert is called and GetMenu(pos) is the new menu.
+    // If IsAttached() is false this won't be used anyway
+    int mswpos = (!IsAttached() || (pos == m_menus.GetCount()))
+        ?   -1 // append the menu
+        :   MSWPositionForWxMenu(GetMenu(pos),pos);
+
     if ( !wxMenuBarBase::Insert(pos, menu, title) )
         return FALSE;
 
@@ -953,7 +989,7 @@ bool wxMenuBar::Insert(size_t pos, wxMenu *menu, const wxString& title)
 
     if ( IsAttached() )
     {
-#ifdef __WXWINCE__
+#if defined(__WXWINCE__) && (_WIN32_WCE < 400 || wxUSE_POCKETPC_UI)
         if (!GetToolBar())
             return FALSE;
         TBBUTTON tbButton; 
@@ -974,7 +1010,7 @@ bool wxMenuBar::Insert(size_t pos, wxMenu *menu, const wxString& title)
             return FALSE;
         }
 #else
-        if ( !::InsertMenu(GetHmenu(), pos,
+        if ( !::InsertMenu(GetHmenu(), mswpos,
                            MF_BYPOSITION | MF_POPUP | MF_STRING,
                            (UINT)GetHmenuOf(menu), title) )
         {
@@ -1007,7 +1043,7 @@ bool wxMenuBar::Append(wxMenu *menu, const wxString& title)
 
     if ( IsAttached() )
     {
-#ifdef __WXWINCE__
+#if defined(__WXWINCE__) && (_WIN32_WCE < 400 || wxUSE_POCKETPC_UI)
         if (!GetToolBar())
             return FALSE;
         TBBUTTON tbButton; 
@@ -1058,7 +1094,7 @@ wxMenu *wxMenuBar::Remove(size_t pos)
 
     if ( IsAttached() )
     {
-#ifdef __WXWINCE__
+#if defined(__WXWINCE__) && (_WIN32_WCE < 400 || wxUSE_POCKETPC_UI)
         if (GetToolBar())
         {
             if (!::SendMessage((HWND) GetToolBar()->GetHWND(), TB_DELETEBUTTON, (UINT) pos, (LPARAM) 0))
@@ -1067,7 +1103,7 @@ wxMenu *wxMenuBar::Remove(size_t pos)
             }
         }
 #else
-        if ( !::RemoveMenu(GetHmenu(), (UINT)pos, MF_BYPOSITION) )
+        if ( !::RemoveMenu(GetHmenu(), (UINT)MSWPositionForWxMenu(menu,pos), MF_BYPOSITION) )
         {
             wxLogLastError(wxT("RemoveMenu"));
         }
@@ -1125,6 +1161,36 @@ void wxMenuBar::Attach(wxFrame *frame)
 {
     wxMenuBarBase::Attach(frame);
 
+#if defined(__WXWINCE__) && _WIN32_WCE >= 400
+    if (!m_hMenu)
+        this->Create();
+#if wxUSE_POCKETPC_UI
+    if (GetToolBar())
+    {
+        HWND hCommandBar = (HWND) GetToolBar()->GetHWND();
+        if (!CommandBar_InsertMenubarEx(hCommandBar, NULL, (LPTSTR) m_hMenu, 0))
+        {
+            wxLogLastError(wxT("CommandBar_InsertMenubarEx"));
+        }
+    }
+#else
+    if (!m_commandBar)
+        m_commandBar = (WXHWND) CommandBar_Create(wxGetInstance(), (HWND) frame->GetHWND(), NewControlId());
+    if (m_commandBar)
+    {
+        if (m_hMenu)
+        {
+            if (!CommandBar_InsertMenubarEx((HWND) m_commandBar, NULL, (LPTSTR) m_hMenu, 0))
+            {
+                wxLogLastError(wxT("CommandBar_InsertMenubarEx"));
+            }
+        }
+    }
+#endif
+    // wxUSE_POCKETPC_UI
+#endif
+    // __WXWINCE__ && _WIN32_WCE >= 400
+
 #if wxUSE_ACCEL
     RebuildAccelTable();
 #endif // wxUSE_ACCEL