]> git.saurik.com Git - wxWidgets.git/blobdiff - src/os2/menu.cpp
Fix horizontal mouse wheel scrolling in wxGTK.
[wxWidgets.git] / src / os2 / menu.cpp
index dff498d244d9357afdd7d14cc6c08617aa30dfd3..1360bf6430492a80819e3182ccc25b75541a87e8 100644 (file)
@@ -1,25 +1,21 @@
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
-// Name:        menu.cpp
+// Name:        src/os2/menu.cpp
 // Purpose:     wxMenu, wxMenuBar, wxMenuItem
 // Author:      David Webster
 // Modified by:
 // Created:     10/10/99
 // Purpose:     wxMenu, wxMenuBar, wxMenuItem
 // Author:      David Webster
 // Modified by:
 // Created:     10/10/99
-// RCS-ID:      $Id$
 // Copyright:   (c) David Webster
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 // Copyright:   (c) David Webster
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
-#ifdef __GNUG__
-    #pragma implementation "menu.h"
-#endif
-
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
+#include "wx/menu.h"
+
 #ifndef WX_PRECOMP
     #include "wx/app.h"
     #include "wx/frame.h"
 #ifndef WX_PRECOMP
     #include "wx/app.h"
     #include "wx/frame.h"
-    #include "wx/menu.h"
     #include "wx/utils.h"
     #include "wx/intl.h"
     #include "wx/log.h"
     #include "wx/utils.h"
     #include "wx/intl.h"
     #include "wx/log.h"
@@ -47,7 +43,7 @@ extern wxMenu*                      wxCurrentPopupMenu;
 //
 // The (popup) menu title has this special id
 //
 //
 // The (popup) menu title has this special id
 //
-static const int                    idMenuTitle = -2;
+static const int                    idMenuTitle = -3;
 
 //
 // The unique ID for Menus
 
 //
 // The unique ID for Menus
@@ -58,50 +54,6 @@ USHORT                              wxMenu::m_nextMenuId = 0;
 // macros
 // ----------------------------------------------------------------------------
 
 // macros
 // ----------------------------------------------------------------------------
 
-    IMPLEMENT_DYNAMIC_CLASS(wxMenu, wxEvtHandler)
-    IMPLEMENT_DYNAMIC_CLASS(wxMenuBar, wxEvtHandler)
-
-// ----------------------------------------------------------------------------
-// static function for translating menu labels
-// ----------------------------------------------------------------------------
-
-static wxString TextToLabel(
-  const wxString&                   rsTitle
-)
-{
-    wxString                        sTitle = "";
-    const wxChar*                   zPc;
-
-    if (rsTitle.IsEmpty())
-        return sTitle;
-    for (zPc = rsTitle.c_str(); *zPc != wxT('\0'); zPc++ )
-    {
-        if (*zPc == wxT('&') )
-        {
-            if (*(zPc + 1) == wxT('&'))
-            {
-                zPc++;
-                sTitle << wxT('&');
-            }
-            else
-                sTitle << wxT('~');
-        }
-        else
-        {
-            if ( *zPc == wxT('~') )
-            {
-                //
-                // Tildes must be doubled to prevent them from being
-                // interpreted as accelerator character prefix by PM ???
-                //
-                sTitle << *zPc;
-            }
-            sTitle << *zPc;
-        }
-    }
-    return sTitle;
-} // end of TextToLabel
-
 // ============================================================================
 // implementation
 // ============================================================================
 // ============================================================================
 // implementation
 // ============================================================================
@@ -115,7 +67,7 @@ static wxString TextToLabel(
 //
 void wxMenu::Init()
 {
 //
 void wxMenu::Init()
 {
-    m_bDoBreak = FALSE;
+    m_bDoBreak = false;
     m_nStartRadioGroup = -1;
 
     //
     m_nStartRadioGroup = -1;
 
     //
@@ -136,7 +88,7 @@ void wxMenu::Init()
                                       ,NULL
                                      )) == 0)
     {
                                       ,NULL
                                      )) == 0)
     {
-        wxLogLastError("WinLoadMenu");
+        wxLogLastError(wxT("WinLoadMenu"));
     }
     m_vMenuData.iPosition   = 0;
     m_vMenuData.afStyle     = MIS_SUBMENU | MIS_TEXT;
     }
     m_vMenuData.iPosition   = 0;
     m_vMenuData.afStyle     = MIS_SUBMENU | MIS_TEXT;
@@ -148,7 +100,7 @@ void wxMenu::Init()
     //
     // If we have a title, insert it in the beginning of the menu
     //
     //
     // If we have a title, insert it in the beginning of the menu
     //
-    if (!m_title.IsEmpty())
+    if (!m_title.empty())
     {
         Append( idMenuTitle
                ,m_title
     {
         Append( idMenuTitle
                ,m_title
@@ -172,7 +124,7 @@ wxMenu::~wxMenu()
     {
         if (!::WinDestroyWindow((HWND)GetHmenu()) )
         {
     {
         if (!::WinDestroyWindow((HWND)GetHmenu()) )
         {
-            wxLogLastError("WinDestroyWindow");
+            wxLogLastError(wxT("WinDestroyWindow"));
         }
     }
 
         }
     }
 
@@ -187,7 +139,7 @@ wxMenu::~wxMenu()
 void wxMenu::Break()
 {
     // this will take effect during the next call to Append()
 void wxMenu::Break()
 {
     // this will take effect during the next call to Append()
-    m_bDoBreak = TRUE;
+    m_bDoBreak = true;
 } // end of wxMenu::Break
 
 void wxMenu::Attach(
 } // end of wxMenu::Break
 
 void wxMenu::Attach(
@@ -220,20 +172,32 @@ void wxMenu::UpdateAccel(
     if (pItem->IsSubMenu())
     {
         wxMenu*                     pSubmenu = pItem->GetSubMenu();
     if (pItem->IsSubMenu())
     {
         wxMenu*                     pSubmenu = pItem->GetSubMenu();
-        wxMenuItemList::Node*       pNode = pSubmenu->GetMenuItems().GetFirst();
+        wxMenuItemList::compatibility_iterator node = pSubmenu->GetMenuItems().GetFirst();
 
 
-        while (pNode)
+        while (node)
         {
         {
-            UpdateAccel(pNode->GetData());
-            pNode = pNode->GetNext();
+            UpdateAccel(node->GetData());
+            node = node->GetNext();
         }
     }
     else if (!pItem->IsSeparator())
     {
         }
     }
     else if (!pItem->IsSeparator())
     {
+        //
+        // Recurse upwards: we should only modify m_accels of the top level
+        // menus, not of the submenus as wxMenuBar doesn't look at them
+        // (alternative and arguable cleaner solution would be to recurse
+        // downwards in GetAccelCount() and CopyAccels())
+        //
+        if (GetParent())
+        {
+            GetParent()->UpdateAccel(pItem);
+            return;
+        }
+
         //
         // Find the (new) accel for this item
         //
         //
         // Find the (new) accel for this item
         //
-        wxAcceleratorEntry*         pAccel = wxGetAccelFromString(pItem->GetText());
+        wxAcceleratorEntry*         pAccel = wxAcceleratorEntry::Create(pItem->GetItemLabel());
 
         if (pAccel)
             pAccel->m_command = pItem->GetId();
 
         if (pAccel)
             pAccel->m_command = pItem->GetId();
@@ -243,7 +207,7 @@ void wxMenu::UpdateAccel(
         //
         size_t                      n = FindAccel(pItem->GetId());
 
         //
         size_t                      n = FindAccel(pItem->GetId());
 
-        if (n == wxNOT_FOUND)
+        if (n == (size_t)wxNOT_FOUND)
         {
             //
             // No old, add new if any
         {
             //
             // No old, add new if any
@@ -267,7 +231,7 @@ void wxMenu::UpdateAccel(
 
         if (IsAttached())
         {
 
         if (IsAttached())
         {
-            m_menuBar->RebuildAccelTable();
+            GetMenuBar()->RebuildAccelTable();
         }
     }
 } // wxMenu::UpdateAccel
         }
     }
 } // wxMenu::UpdateAccel
@@ -277,18 +241,15 @@ void wxMenu::UpdateAccel(
 //
 // Append a new item or submenu to the menu
 //
 //
 // Append a new item or submenu to the menu
 //
-bool wxMenu::DoInsertOrAppend(
-  wxMenuItem*                       pItem
-, size_t                            nPos
-)
+bool wxMenu::DoInsertOrAppend( wxMenuItem* pItem,
+                               size_t      nPos )
 {
 {
-    wxMenu*                         pSubmenu = pItem->GetSubMenu();
-    MENUITEM&                       rItem = (pSubmenu != NULL)?pSubmenu->m_vMenuData:
-                                            pItem->m_vMenuData;
+    wxMenu*    pSubmenu = pItem->GetSubMenu();
+    MENUITEM&  rItem = (pSubmenu != NULL)?pSubmenu->m_vMenuData:
+                       pItem->m_vMenuData;
 
 
-    ERRORID                         vError;
-    wxString                        sError;
-    char                            zMsg[128];
+    ERRORID    vError;
+    wxString   sError;
 
 #if wxUSE_ACCEL
     UpdateAccel(pItem);
 
 #if wxUSE_ACCEL
     UpdateAccel(pItem);
@@ -301,19 +262,13 @@ bool wxMenu::DoInsertOrAppend(
     if (m_bDoBreak)
     {
         rItem.afStyle |= MIS_BREAK;
     if (m_bDoBreak)
     {
         rItem.afStyle |= MIS_BREAK;
-        m_bDoBreak = FALSE;
-    }
-
-    if (pItem->IsSeparator())
-    {
-        rItem.afStyle |= MIS_SEPARATOR;
+        m_bDoBreak = false;
     }
 
     //
     // Id is the numeric id for normal menu items and HMENU for submenus as
     // required by ::MM_INSERTITEM message API
     //
     }
 
     //
     // Id is the numeric id for normal menu items and HMENU for submenus as
     // required by ::MM_INSERTITEM message API
     //
-
     if (pSubmenu != NULL)
     {
         wxASSERT_MSG(pSubmenu->GetHMenu(), wxT("invalid submenu"));
     if (pSubmenu != NULL)
     {
         wxASSERT_MSG(pSubmenu->GetHMenu(), wxT("invalid submenu"));
@@ -325,10 +280,10 @@ bool wxMenu::DoInsertOrAppend(
     }
     else
     {
     }
     else
     {
-        rItem.id = pItem->GetId();
+        rItem.id = (USHORT)pItem->GetId();
     }
 
     }
 
-    BYTE*                           pData;
+    char *pData = NULL;
 
 #if wxUSE_OWNER_DRAWN
     if (pItem->IsOwnerDrawn())
 
 #if wxUSE_OWNER_DRAWN
     if (pItem->IsOwnerDrawn())
@@ -339,19 +294,32 @@ bool wxMenu::DoInsertOrAppend(
         // Will eventually need to set the image handle somewhere into vItem.hItem
         //
         rItem.afStyle             |= MIS_OWNERDRAW;
         // Will eventually need to set the image handle somewhere into vItem.hItem
         //
         rItem.afStyle             |= MIS_OWNERDRAW;
-        pData                      = (BYTE*)NULL;
+        pData                      = NULL;
         rItem.hItem                = (HBITMAP)pItem->GetBitmap().GetHBITMAP();
         pItem->m_vMenuData.afStyle = rItem.afStyle;
         pItem->m_vMenuData.hItem   = rItem.hItem;
     }
         rItem.hItem                = (HBITMAP)pItem->GetBitmap().GetHBITMAP();
         pItem->m_vMenuData.afStyle = rItem.afStyle;
         pItem->m_vMenuData.hItem   = rItem.hItem;
     }
-    else if (!pItem->IsSeparator())
+    else
 #endif
 #endif
+    if (pItem->IsSeparator())
     {
     {
-        //
-        // Menu is just a normal string (passed in data parameter)
-        //
-        rItem.afStyle |= MIS_TEXT;
-        pData = (char*)pItem->GetText().c_str();
+        rItem.afStyle = MIS_SEPARATOR;
+    }
+    else
+    {
+        if (pItem->GetId() == idMenuTitle)
+        {
+            // Item is an unselectable title to be passed via pData
+            rItem.afStyle = MIS_STATIC;
+        }
+        else
+        {
+            //
+            // Menu is just a normal string (passed in data parameter)
+            //
+            rItem.afStyle |= MIS_TEXT;
+        }
+        pData = (char*) pItem->GetItemLabel().wx_str();
     }
 
     if (nPos == (size_t)-1)
     }
 
     if (nPos == (size_t)-1)
@@ -360,7 +328,7 @@ bool wxMenu::DoInsertOrAppend(
     }
     else
     {
     }
     else
     {
-        rItem.iPosition = nPos;
+        rItem.iPosition = (SHORT)nPos;
     }
 
     APIRET                          rc;
     }
 
     APIRET                          rc;
@@ -373,7 +341,6 @@ bool wxMenu::DoInsertOrAppend(
 #if wxUSE_OWNER_DRAWN
     if (pItem->IsOwnerDrawn())
     {
 #if wxUSE_OWNER_DRAWN
     if (pItem->IsOwnerDrawn())
     {
-        BOOL                       rc;
         MENUITEM                   vMenuItem;
 
         ::WinSendMsg( GetHmenu()
         MENUITEM                   vMenuItem;
 
         ::WinSendMsg( GetHmenu()
@@ -385,26 +352,25 @@ bool wxMenu::DoInsertOrAppend(
                     );
     }
 #endif
                     );
     }
 #endif
-    if (rc == MIT_MEMERROR || rc == MIT_ERROR)
+
+    if (rc == (APIRET)MIT_MEMERROR || rc == (APIRET)MIT_ERROR)
     {
         vError = ::WinGetLastError(vHabmain);
         sError = wxPMErrorToStr(vError);
     {
         vError = ::WinGetLastError(vHabmain);
         sError = wxPMErrorToStr(vError);
-        wxLogError("Error inserting or appending a menuitem. Error: %s\n", sError.c_str());
-        wxLogLastError("Insert or AppendMenu");
-        return FALSE;
+        wxLogError(wxT("Error inserting or appending a menuitem. Error: %s\n"), sError.c_str());
+        wxLogLastError(wxT("Insert or AppendMenu"));
+        return false;
     }
     }
-    else
+
+    //
+    // If we're already attached to the menubar, we must update it
+    //
+    if (IsAttached() && GetMenuBar()->IsAttached())
     {
     {
-        //
-        // If we're already attached to the menubar, we must update it
-        //
-        if (IsAttached() && m_menuBar->IsAttached())
-        {
-            m_menuBar->Refresh();
-        }
-        return TRUE;
+        GetMenuBar()->Refresh();
     }
     }
-    return FALSE;
+
+    return true;
 } // end of wxMenu::DoInsertOrAppend
 
 void wxMenu::EndRadioGroup()
 } // end of wxMenu::DoInsertOrAppend
 
 void wxMenu::EndRadioGroup()
@@ -415,13 +381,11 @@ void wxMenu::EndRadioGroup()
     m_nStartRadioGroup = -1;
 } // end of wxMenu::EndRadioGroup
 
     m_nStartRadioGroup = -1;
 } // end of wxMenu::EndRadioGroup
 
-wxMenuItem* wxMenu::DoAppend(
-  wxMenuItem*                       pItem
-)
+wxMenuItem* wxMenu::DoAppend( wxMenuItem* pItem )
 {
 {
-    wxCHECK_MSG( pItem, NULL, _T("NULL item in wxMenu::DoAppend") );
+    wxCHECK_MSG( pItem, NULL, wxT("NULL item in wxMenu::DoAppend") );
 
 
-    bool                            bCheck = FALSE;
+    bool bCheck = false;
 
     if (pItem->GetKind() == wxITEM_RADIO)
     {
 
     if (pItem->GetKind() == wxITEM_RADIO)
     {
@@ -443,7 +407,7 @@ wxMenuItem* wxMenu::DoAppend(
             //
             // Ensure that we have a checked item in the radio group
             //
             //
             // Ensure that we have a checked item in the radio group
             //
-            bCheck = TRUE;
+            bCheck = true;
         }
         else // extend the current radio group
         {
         }
         else // extend the current radio group
         {
@@ -452,15 +416,15 @@ wxMenuItem* wxMenu::DoAppend(
             //
             pItem->SetRadioGroupStart(m_nStartRadioGroup);
 
             //
             pItem->SetRadioGroupStart(m_nStartRadioGroup);
 
-            wxMenuItemList::Node*   pNode = GetMenuItems().Item(m_nStartRadioGroup);
+            wxMenuItemList::compatibility_iterator node = GetMenuItems().Item(m_nStartRadioGroup);
 
 
-            if (pNode)
+            if (node)
             {
             {
-                pNode->GetData()->SetRadioGroupEnd(nCount);
+                node->GetData()->SetRadioGroupEnd(nCount);
             }
             else
             {
             }
             else
             {
-                wxFAIL_MSG( _T("where is the radio group start item?") );
+                wxFAIL_MSG( wxT("where is the radio group start item?") );
             }
         }
     }
             }
         }
     }
@@ -478,7 +442,7 @@ wxMenuItem* wxMenu::DoAppend(
         //
         // Check the item initially
         //
         //
         // Check the item initially
         //
-        pItem->Check(TRUE);
+        pItem->Check(true);
     }
     return pItem;
 } // end of wxMenu::DoAppend
     }
     return pItem;
 } // end of wxMenu::DoAppend
@@ -506,19 +470,19 @@ wxMenuItem* wxMenu::DoRemove(
     // We need to find the items position in the child list
     //
     size_t                          nPos;
     // We need to find the items position in the child list
     //
     size_t                          nPos;
-    wxMenuItemList::Node*           pNode = GetMenuItems().GetFirst();
+    wxMenuItemList::compatibility_iterator node = GetMenuItems().GetFirst();
 
 
-    for (nPos = 0; pNode; nPos++)
+    for (nPos = 0; node; nPos++)
     {
     {
-        if (pNode->GetData() == pItem)
+        if (node->GetData() == pItem)
             break;
             break;
-        pNode = pNode->GetNext();
+        node = node->GetNext();
     }
 
     //
     // DoRemove() (unlike Remove) can only be called for existing item!
     //
     }
 
     //
     // DoRemove() (unlike Remove) can only be called for existing item!
     //
-    wxCHECK_MSG(pNode, NULL, wxT("bug in wxMenu::Remove logic"));
+    wxCHECK_MSG(node, NULL, wxT("bug in wxMenu::Remove logic"));
 
 #if wxUSE_ACCEL
     //
 
 #if wxUSE_ACCEL
     //
@@ -541,12 +505,12 @@ wxMenuItem* wxMenu::DoRemove(
                  ,MPFROM2SHORT(pItem->GetId(), TRUE)
                  ,(MPARAM)0
                 );
                  ,MPFROM2SHORT(pItem->GetId(), TRUE)
                  ,(MPARAM)0
                 );
-    if (IsAttached() && m_menuBar->IsAttached())
+    if (IsAttached() && GetMenuBar()->IsAttached())
     {
         //
         // Otherwise, the chane won't be visible
         //
     {
         //
         // Otherwise, the chane won't be visible
         //
-        m_menuBar->Refresh();
+        GetMenuBar()->Refresh();
     }
 
     //
     }
 
     //
@@ -584,27 +548,25 @@ size_t wxMenu::CopyAccels(
 // set wxMenu title
 // ---------------------------------------------------------------------------
 
 // set wxMenu title
 // ---------------------------------------------------------------------------
 
-void wxMenu::SetTitle(
-  const wxString&                   rLabel
-)
+void wxMenu::SetTitle( const wxString& rLabel )
 {
 {
-    bool                            bHasNoTitle = m_title.IsEmpty();
-    HWND                            hMenu = GetHmenu();
+    bool bHasNoTitle = m_title.empty();
+    HWND hMenu = GetHmenu();
 
     m_title = rLabel;
     if (bHasNoTitle)
     {
 
     m_title = rLabel;
     if (bHasNoTitle)
     {
-        if (!rLabel.IsEmpty())
+        if (!rLabel.empty())
         {
             if (!::WinSetWindowText(hMenu, rLabel.c_str()))
             {
         {
             if (!::WinSetWindowText(hMenu, rLabel.c_str()))
             {
-                wxLogLastError("SetMenuTitle");
+                wxLogLastError(wxT("SetMenuTitle"));
             }
         }
     }
     else
     {
             }
         }
     }
     else
     {
-        if (rLabel.IsEmpty() )
+        if (rLabel.empty() )
         {
             ::WinSendMsg( GetHmenu()
                          ,MM_REMOVEITEM
         {
             ::WinSendMsg( GetHmenu()
                          ,MM_REMOVEITEM
@@ -619,7 +581,7 @@ void wxMenu::SetTitle(
             //
             if (!::WinSetWindowText(hMenu, rLabel.c_str()))
             {
             //
             if (!::WinSetWindowText(hMenu, rLabel.c_str()))
             {
-                wxLogLastError("SetMenuTitle");
+                wxLogLastError(wxT("SetMenuTitle"));
             }
         }
     }
             }
         }
     }
@@ -629,10 +591,8 @@ void wxMenu::SetTitle(
 // event processing
 // ---------------------------------------------------------------------------
 
 // event processing
 // ---------------------------------------------------------------------------
 
-bool wxMenu::OS2Command(
-  WXUINT                            WXUNUSED(uParam)
-, WXWORD                            vId
-)
+bool wxMenu::OS2Command( WXUINT WXUNUSED(uParam),
+                         WXWORD vId )
 {
     //
     // Ignore commands from the menu title
 {
     //
     // Ignore commands from the menu title
@@ -643,12 +603,12 @@ bool wxMenu::OS2Command(
         SendEvent( vId
                   ,(int)::WinSendMsg( GetHmenu()
                                      ,MM_QUERYITEMATTR
         SendEvent( vId
                   ,(int)::WinSendMsg( GetHmenu()
                                      ,MM_QUERYITEMATTR
-                                     ,(MPARAM)vId
+                                     ,MPFROMSHORT(vId)
                                      ,(MPARAM)MIA_CHECKED
                                     )
                  );
     }
                                      ,(MPARAM)MIA_CHECKED
                                     )
                  );
     }
-    return TRUE;
+    return true;
 } // end of wxMenu::OS2Command
 
 // ---------------------------------------------------------------------------
 } // end of wxMenu::OS2Command
 
 // ---------------------------------------------------------------------------
@@ -659,8 +619,8 @@ wxWindow* wxMenu::GetWindow() const
 {
     if (m_invokingWindow != NULL)
         return m_invokingWindow;
 {
     if (m_invokingWindow != NULL)
         return m_invokingWindow;
-    else if ( m_menuBar != NULL)
-        return m_menuBar->GetFrame();
+    else if ( GetMenuBar() != NULL)
+        return GetMenuBar()->GetFrame();
 
     return NULL;
 } // end of wxMenu::GetWindow
 
     return NULL;
 } // end of wxMenu::GetWindow
@@ -677,7 +637,7 @@ wxMenuItem* wxMenu::FindItem(
 
     wxMenuItem*                     pItem = NULL;
 
 
     wxMenuItem*                     pItem = NULL;
 
-    for ( wxMenuItemList::Node *node = m_items.GetFirst();
+    for ( wxMenuItemList::compatibility_iterator node = m_items.GetFirst();
           node && !pItem;
           node = node->GetNext() )
     {
           node && !pItem;
           node = node->GetNext() )
     {
@@ -733,6 +693,7 @@ wxMenuBar::wxMenuBar(
   int                               nCount
 , wxMenu*                           vMenus[]
 , const wxString                    sTitles[]
   int                               nCount
 , wxMenu*                           vMenus[]
 , const wxString                    sTitles[]
+, long                              WXUNUSED(lStyle)
 )
 {
     Init();
 )
 {
     Init();
@@ -772,8 +733,7 @@ void wxMenuBar::Refresh()
 
 WXHMENU wxMenuBar::Create()
 {
 
 WXHMENU wxMenuBar::Create()
 {
-    MENUITEM                        vItem;
-    HWND                            hFrame;
+    HWND hFrame;
 
     if (m_hMenu != 0 )
         return m_hMenu;
 
     if (m_hMenu != 0 )
         return m_hMenu;
@@ -792,7 +752,7 @@ WXHMENU wxMenuBar::Create()
     //
     if ((m_hMenu =  ::WinCreateWindow( hFrame
                                       ,WC_MENU
     //
     if ((m_hMenu =  ::WinCreateWindow( hFrame
                                       ,WC_MENU
-                                      ,(PSZ)NULL
+                                      ,NULL
                                       ,MS_ACTIONBAR | WS_SYNCPAINT | WS_VISIBLE
                                       ,0L
                                       ,0L
                                       ,MS_ACTIONBAR | WS_SYNCPAINT | WS_VISIBLE
                                       ,0L
                                       ,0L
@@ -805,47 +765,47 @@ WXHMENU wxMenuBar::Create()
                                       ,NULL
                                      )) == 0)
     {
                                       ,NULL
                                      )) == 0)
     {
-        wxLogLastError("WinLoadMenu");
+        wxLogLastError(wxT("WinLoadMenu"));
     }
     else
     {
     }
     else
     {
-        size_t                      nCount = GetMenuCount();
-
-        for (size_t i = 0; i < nCount; i++)
+        size_t nCount = GetMenuCount(), i;
+        wxMenuList::iterator it;
+        for (i = 0, it = m_menus.begin(); i < nCount; i++, it++)
         {
         {
-            APIRET                  rc;
-            ERRORID                 vError;
-            wxString                sError;
-            HWND                    hSubMenu;
+            APIRET   rc;
+            ERRORID  vError;
+            wxString sError;
+            HWND     hSubMenu;
 
             //
             // Set the parent and owner of the submenues to be the menubar, not the desktop
             //
 
             //
             // Set the parent and owner of the submenues to be the menubar, not the desktop
             //
-            hSubMenu = m_menus[i]->m_vMenuData.hwndSubMenu;
-            if (!::WinSetParent(m_menus[i]->m_vMenuData.hwndSubMenu, m_hMenu, FALSE))
+            hSubMenu = (*it)->m_vMenuData.hwndSubMenu;
+            if (!::WinSetParent((*it)->m_vMenuData.hwndSubMenu, m_hMenu, FALSE))
             {
                 vError = ::WinGetLastError(vHabmain);
                 sError = wxPMErrorToStr(vError);
             {
                 vError = ::WinGetLastError(vHabmain);
                 sError = wxPMErrorToStr(vError);
-                wxLogError("Error setting parent for submenu. Error: %s\n", sError.c_str());
+                wxLogError(wxT("Error setting parent for submenu. Error: %s\n"), sError.c_str());
                 return NULLHANDLE;
             }
 
                 return NULLHANDLE;
             }
 
-            if (!::WinSetOwner(m_menus[i]->m_vMenuData.hwndSubMenu, m_hMenu))
+            if (!::WinSetOwner((*it)->m_vMenuData.hwndSubMenu, m_hMenu))
             {
                 vError = ::WinGetLastError(vHabmain);
                 sError = wxPMErrorToStr(vError);
             {
                 vError = ::WinGetLastError(vHabmain);
                 sError = wxPMErrorToStr(vError);
-                wxLogError("Error setting parent for submenu. Error: %s\n", sError.c_str());
+                wxLogError(wxT("Error setting parent for submenu. Error: %s\n"), sError.c_str());
                 return NULLHANDLE;
             }
 
                 return NULLHANDLE;
             }
 
-            m_menus[i]->m_vMenuData.iPosition = i;
+            (*it)->m_vMenuData.iPosition = (SHORT)i;
 
 
-            rc = (APIRET)::WinSendMsg(m_hMenu, MM_INSERTITEM, (MPARAM)&m_menus[i]->m_vMenuData, (MPARAM)m_titles[i].c_str());
-            if (rc == MIT_MEMERROR || rc == MIT_ERROR)
+            rc = (APIRET)::WinSendMsg(m_hMenu, MM_INSERTITEM, (MPARAM)&(*it)->m_vMenuData, (MPARAM)m_titles[i].wx_str());
+            if (rc == (APIRET)MIT_MEMERROR || rc == (APIRET)MIT_ERROR)
             {
                 vError = ::WinGetLastError(vHabmain);
                 sError = wxPMErrorToStr(vError);
             {
                 vError = ::WinGetLastError(vHabmain);
                 sError = wxPMErrorToStr(vError);
-                wxLogError("Error inserting or appending a menuitem. Error: %s\n", sError.c_str());
+                wxLogError(wxT("Error inserting or appending a menuitem. Error: %s\n"), sError.c_str());
                 return NULLHANDLE;
             }
         }
                 return NULLHANDLE;
             }
         }
@@ -876,14 +836,14 @@ void wxMenuBar::EnableTop(
     nId = SHORT1FROMMR(::WinSendMsg((HWND)m_hMenu, MM_ITEMIDFROMPOSITION, MPFROMSHORT(nPos), (MPARAM)0));
     if (nId == MIT_ERROR)
     {
     nId = SHORT1FROMMR(::WinSendMsg((HWND)m_hMenu, MM_ITEMIDFROMPOSITION, MPFROMSHORT(nPos), (MPARAM)0));
     if (nId == MIT_ERROR)
     {
-        wxLogLastError("LogLastError");
+        wxLogLastError(wxT("LogLastError"));
         return;
     }
     ::WinSendMsg((HWND)m_hMenu, MM_SETITEMATTR, MPFROM2SHORT(nId, TRUE), MPFROM2SHORT(MIA_DISABLED, uFlag));
     Refresh();
 } // end of wxMenuBar::EnableTop
 
         return;
     }
     ::WinSendMsg((HWND)m_hMenu, MM_SETITEMATTR, MPFROM2SHORT(nId, TRUE), MPFROM2SHORT(MIA_DISABLED, uFlag));
     Refresh();
 } // end of wxMenuBar::EnableTop
 
-void wxMenuBar::SetLabelTop(
+void wxMenuBar::SetMenuLabel(
   size_t                            nPos
 , const wxString&                   rLabel
 )
   size_t                            nPos
 , const wxString&                   rLabel
 )
@@ -902,7 +862,7 @@ void wxMenuBar::SetLabelTop(
     nId = SHORT1FROMMR(::WinSendMsg((HWND)m_hMenu, MM_ITEMIDFROMPOSITION, MPFROMSHORT(nPos), (MPARAM)0));
     if (nId == MIT_ERROR)
     {
     nId = SHORT1FROMMR(::WinSendMsg((HWND)m_hMenu, MM_ITEMIDFROMPOSITION, MPFROMSHORT(nPos), (MPARAM)0));
     if (nId == MIT_ERROR)
     {
-        wxLogLastError("LogLastError");
+        wxLogLastError(wxT("LogLastError"));
         return;
     }
     if(!::WinSendMsg( (HWND)m_hMenu
         return;
     }
     if(!::WinSendMsg( (HWND)m_hMenu
@@ -911,25 +871,25 @@ void wxMenuBar::SetLabelTop(
                      ,MPARAM(&vItem)
                     ))
     {
                      ,MPARAM(&vItem)
                     ))
     {
-        wxLogLastError("QueryItem");
+        wxLogLastError(wxT("QueryItem"));
     }
     nId = vItem.id;
 
     }
     nId = vItem.id;
 
-    if (::WinSendMsg(GetHmenu(), MM_SETITEMTEXT, MPFROMSHORT(nId), (MPARAM)rLabel.c_str()));
+    if (::WinSendMsg(GetHmenu(), MM_SETITEMTEXT, MPFROMSHORT(nId), (MPARAM)rLabel.wx_str()));
     {
     {
-        wxLogLastError("ModifyMenu");
+        wxLogLastError(wxT("ModifyMenu"));
     }
     Refresh();
     }
     Refresh();
-} // end of wxMenuBar::SetLabelTop
+} // end of wxMenuBar::SetMenuLabel
 
 
-wxString wxMenuBar::GetLabelTop(
+wxString wxMenuBar::GetMenuLabel(
   size_t                            nPos
 ) const
 {
     wxCHECK_MSG( nPos < GetMenuCount(), wxEmptyString,
   size_t                            nPos
 ) const
 {
     wxCHECK_MSG( nPos < GetMenuCount(), wxEmptyString,
-                 wxT("invalid menu index in wxMenuBar::GetLabelTop") );
+                 wxT("invalid menu index in wxMenuBar::GetMenuLabel") );
     return m_titles[nPos];
     return m_titles[nPos];
-} // end of wxMenuBar::GetLabelTop
+} // end of wxMenuBar::GetMenuLabel
 
 // ---------------------------------------------------------------------------
 // wxMenuBar construction
 
 // ---------------------------------------------------------------------------
 // wxMenuBar construction
@@ -942,7 +902,7 @@ wxMenu* wxMenuBar::Replace(
 )
 {
     SHORT                            nId;
 )
 {
     SHORT                            nId;
-    wxString                         sTitle = TextToLabel(rTitle);
+    wxString                         sTitle = wxPMTextToLabel(rTitle);
     wxMenu*                          pMenuOld = wxMenuBarBase::Replace( nPos
                                                                        ,pMenu
                                                                        ,sTitle
     wxMenu*                          pMenuOld = wxMenuBarBase::Replace( nPos
                                                                        ,pMenu
                                                                        ,sTitle
@@ -952,7 +912,7 @@ wxMenu* wxMenuBar::Replace(
     nId = SHORT1FROMMR(::WinSendMsg((HWND)m_hMenu, MM_ITEMIDFROMPOSITION, MPFROMSHORT(nPos), (MPARAM)0));
     if (nId == MIT_ERROR)
     {
     nId = SHORT1FROMMR(::WinSendMsg((HWND)m_hMenu, MM_ITEMIDFROMPOSITION, MPFROMSHORT(nPos), (MPARAM)0));
     if (nId == MIT_ERROR)
     {
-        wxLogLastError("LogLastError");
+        wxLogLastError(wxT("LogLastError"));
         return NULL;
     }
     if (!pMenuOld)
         return NULL;
     }
     if (!pMenuOld)
@@ -961,7 +921,7 @@ wxMenu* wxMenuBar::Replace(
     if (IsAttached())
     {
         ::WinSendMsg((HWND)m_hMenu, MM_REMOVEITEM, MPFROM2SHORT(nId, TRUE), (MPARAM)0);
     if (IsAttached())
     {
         ::WinSendMsg((HWND)m_hMenu, MM_REMOVEITEM, MPFROM2SHORT(nId, TRUE), (MPARAM)0);
-        ::WinSendMsg((HWND)m_hMenu, MM_INSERTITEM, (MPARAM)&pMenu->m_vMenuData, (MPARAM)sTitle.c_str());
+        ::WinSendMsg((HWND)m_hMenu, MM_INSERTITEM, (MPARAM)&pMenu->m_vMenuData, (MPARAM)sTitle.wx_str());
 
 #if wxUSE_ACCEL
         if (pMenuOld->HasAccels() || pMenu->HasAccels())
 
 #if wxUSE_ACCEL
         if (pMenuOld->HasAccels() || pMenu->HasAccels())
@@ -977,31 +937,24 @@ wxMenu* wxMenuBar::Replace(
     return pMenuOld;
 } // end of wxMenuBar::Replace
 
     return pMenuOld;
 } // end of wxMenuBar::Replace
 
-bool wxMenuBar::Insert(
-  size_t                            nPos
-, wxMenu*                           pMenu
-, const wxString&                   rTitle
-)
+bool wxMenuBar::Insert( size_t          nPos,
+                        wxMenu*         pMenu,
+                        const wxString& rTitle )
 {
 {
-    wxString                        sTitle = TextToLabel(rTitle);
+    wxString sTitle = wxPMTextToLabel(rTitle);
 
 
-    if (!wxMenuBarBase::Insert( nPos
-                               ,pMenu
-                               ,sTitle
-                              ))
-        return FALSE;
+    if (!wxMenuBarBase::Insert( nPos, pMenu, sTitle ))
+        return false;
 
 
-    m_titles.Insert( sTitle
-                    ,nPos
-                   );
+    m_titles.Insert( sTitle, nPos );
 
     if (IsAttached())
     {
 
     if (IsAttached())
     {
-        pMenu->m_vMenuData.iPosition = nPos;
+        pMenu->m_vMenuData.iPosition = (SHORT)nPos;
         ::WinSendMsg( (HWND)m_hMenu
                      ,MM_INSERTITEM
                      ,(MPARAM)&pMenu->m_vMenuData
         ::WinSendMsg( (HWND)m_hMenu
                      ,MM_INSERTITEM
                      ,(MPARAM)&pMenu->m_vMenuData
-                     ,(MPARAM)sTitle.c_str()
+                     ,(MPARAM)sTitle.wx_str()
                     );
 #if wxUSE_ACCEL
         if (pMenu->HasAccels())
                     );
 #if wxUSE_ACCEL
         if (pMenu->HasAccels())
@@ -1012,29 +965,28 @@ bool wxMenuBar::Insert(
 #endif // wxUSE_ACCEL
         Refresh();
     }
 #endif // wxUSE_ACCEL
         Refresh();
     }
-    return TRUE;
+
+    return true;
 } // end of wxMenuBar::Insert
 
 } // end of wxMenuBar::Insert
 
-bool wxMenuBar::Append(
-  wxMenu*                           pMenu
-, const wxString&                   rsTitle
-)
+bool wxMenuBar::Append( wxMenu* pMenu,
+                        const wxString& rsTitle )
 {
 {
-    WXHMENU                         hSubmenu = pMenu ? pMenu->GetHMenu() : 0;
+    WXHMENU hSubmenu = pMenu ? pMenu->GetHMenu() : 0;
 
 
-    wxCHECK_MSG(hSubmenu, FALSE, wxT("can't append invalid menu to menubar"));
+    wxCHECK_MSG(hSubmenu, false, wxT("can't append invalid menu to menubar"));
 
 
-    wxString                        sTitle = TextToLabel(rsTitle);
+    wxString sTitle = wxPMTextToLabel(rsTitle);
 
     if (!wxMenuBarBase::Append(pMenu, sTitle))
 
     if (!wxMenuBarBase::Append(pMenu, sTitle))
-        return FALSE;
+        return false;
 
     m_titles.Add(sTitle);
 
     if ( IsAttached() )
     {
         pMenu->m_vMenuData.iPosition = MIT_END;
 
     m_titles.Add(sTitle);
 
     if ( IsAttached() )
     {
         pMenu->m_vMenuData.iPosition = MIT_END;
-        ::WinSendMsg((HWND)m_hMenu, MM_INSERTITEM, (MPARAM)&pMenu->m_vMenuData, (MPARAM)sTitle.c_str());
+        ::WinSendMsg((HWND)m_hMenu, MM_INSERTITEM, (MPARAM)&pMenu->m_vMenuData, (MPARAM)sTitle.wx_str());
 #if wxUSE_ACCEL
         if (pMenu->HasAccels())
         {
 #if wxUSE_ACCEL
         if (pMenu->HasAccels())
         {
@@ -1046,7 +998,7 @@ bool wxMenuBar::Append(
 #endif // wxUSE_ACCEL
         Refresh();
     }
 #endif // wxUSE_ACCEL
         Refresh();
     }
-    return TRUE;
+    return true;
 } // end of wxMenuBar::Append
 
 wxMenu* wxMenuBar::Remove(
 } // end of wxMenuBar::Append
 
 wxMenu* wxMenuBar::Remove(
@@ -1066,7 +1018,7 @@ wxMenu* wxMenuBar::Remove(
                                    );
     if (nId == MIT_ERROR)
     {
                                    );
     if (nId == MIT_ERROR)
     {
-        wxLogLastError("LogLastError");
+        wxLogLastError(wxT("LogLastError"));
         return NULL;
     }
     if (IsAttached())
         return NULL;
     }
     if (IsAttached())
@@ -1088,7 +1040,7 @@ wxMenu* wxMenuBar::Remove(
 #endif // wxUSE_ACCEL
         Refresh();
     }
 #endif // wxUSE_ACCEL
         Refresh();
     }
-    m_titles.Remove(nPos);
+    m_titles.RemoveAt(nPos);
     return pMenu;
 } // end of wxMenuBar::Remove
 
     return pMenu;
 } // end of wxMenuBar::Remove
 
@@ -1102,10 +1054,10 @@ void wxMenuBar::RebuildAccelTable()
     size_t                          nAccelCount = 0;
     size_t                          i;
     size_t                          nCount = GetMenuCount();
     size_t                          nAccelCount = 0;
     size_t                          i;
     size_t                          nCount = GetMenuCount();
-
-    for (i = 0; i < nCount; i++)
+    wxMenuList::iterator it;
+    for (i = 0, it = m_menus.begin(); i < nCount; i++, it++)
     {
     {
-        nAccelCount += m_menus[i]->GetAccelCount();
+        nAccelCount += (*it)->GetAccelCount();
     }
 
     if (nAccelCount)
     }
 
     if (nAccelCount)
@@ -1113,9 +1065,9 @@ void wxMenuBar::RebuildAccelTable()
         wxAcceleratorEntry*         pAccelEntries = new wxAcceleratorEntry[nAccelCount];
 
         nAccelCount = 0;
         wxAcceleratorEntry*         pAccelEntries = new wxAcceleratorEntry[nAccelCount];
 
         nAccelCount = 0;
-        for (i = 0; i < nCount; i++)
+        for (i = 0, it = m_menus.begin(); i < nCount; i++, it++)
         {
         {
-            nAccelCount += m_menus[i]->CopyAccels(&pAccelEntries[nAccelCount]);
+            nAccelCount += (*it)->CopyAccels(&pAccelEntries[nAccelCount]);
         }
         m_vAccelTable = wxAcceleratorTable( nAccelCount
                                            ,pAccelEntries
         }
         m_vAccelTable = wxAcceleratorTable( nAccelCount
                                            ,pAccelEntries
@@ -1141,7 +1093,9 @@ void wxMenuBar::Attach(
                             ,m_vAccelTable.GetHACCEL()
                             ,(HWND)pFrame->GetFrame()
                            ))
                             ,m_vAccelTable.GetHACCEL()
                             ,(HWND)pFrame->GetFrame()
                            ))
-        wxLogLastError("WinSetAccelTable");
+    {
+        wxLogLastError(wxT("WinSetAccelTable"));
+    }
 #endif // wxUSE_ACCEL
 } // end of wxMenuBar::Attach
 
 #endif // wxUSE_ACCEL
 } // end of wxMenuBar::Attach
 
@@ -1165,14 +1119,14 @@ int wxMenuBar::FindMenuItem(
 ) const
 {
     wxString                        sMenuLabel = wxStripMenuCodes(rMenuString);
 ) const
 {
     wxString                        sMenuLabel = wxStripMenuCodes(rMenuString);
-    size_t                          nCount = GetMenuCount();
-
-    for (size_t i = 0; i < nCount; i++)
+    size_t                          nCount = GetMenuCount(), i;
+    wxMenuList::const_iterator it;
+    for (i = 0, it = m_menus.begin(); i < nCount; i++, it++)
     {
         wxString                    sTitle = wxStripMenuCodes(m_titles[i]);
 
         if (rMenuString == sTitle)
     {
         wxString                    sTitle = wxStripMenuCodes(m_titles[i]);
 
         if (rMenuString == sTitle)
-            return m_menus[i]->FindItem(rItemString);
+            return (*it)->FindItem(rItemString);
     }
     return wxNOT_FOUND;
 } // end of wxMenuBar::FindMenuItem
     }
     return wxNOT_FOUND;
 } // end of wxMenuBar::FindMenuItem
@@ -1186,13 +1140,13 @@ wxMenuItem* wxMenuBar::FindItem(
         *ppItemMenu = NULL;
 
     wxMenuItem*                     pItem = NULL;
         *ppItemMenu = NULL;
 
     wxMenuItem*                     pItem = NULL;
-    size_t                          nCount = GetMenuCount();
-
-    for (size_t i = 0; !pItem && (i < nCount); i++)
+    size_t                          nCount = GetMenuCount(), i;
+    wxMenuList::const_iterator it;
+    for (i = 0, it = m_menus.begin(); !pItem && (i < nCount); i++, it++)
     {
     {
-        pItem = m_menus[i]->FindItem( nId
-                                     ,ppItemMenu
-                                    );
+        pItem = (*it)->FindItem( nId
+                                ,ppItemMenu
+                               );
     }
     return pItem;
 } // end of wxMenuBar::FindItem
     }
     return pItem;
 } // end of wxMenuBar::FindItem
@@ -1207,15 +1161,14 @@ wxMenuItem* wxMenuBar::FindItem(
         *ppItemMenu = NULL;
 
     wxMenuItem*                     pItem = NULL;
         *ppItemMenu = NULL;
 
     wxMenuItem*                     pItem = NULL;
-    size_t                          nCount = GetMenuCount();
-
-    for (size_t i = 0; !pItem && (i < nCount); i++)
+    size_t                          nCount = GetMenuCount(), i;
+    wxMenuList::const_iterator it;
+    for (i = 0, it = m_menus.begin(); !pItem && (i < nCount); i++, it++)
     {
     {
-        pItem = m_menus[i]->FindItem( nId
-                                     ,hItem
-                                     ,ppItemMenu
-                                    );
+        pItem = (*it)->FindItem( nId
+                                ,hItem
+                                ,ppItemMenu
+                               );
     }
     return pItem;
 } // end of wxMenuBar::FindItem
     }
     return pItem;
 } // end of wxMenuBar::FindItem
-