X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/938aa9c4618c9ed67fa791063681875106d3ef35..31ad423e4fb556ec225a63b161154d3bf3445c1b:/src/os2/menu.cpp diff --git a/src/os2/menu.cpp b/src/os2/menu.cpp index 37898a1e55..a834dd5e85 100644 --- a/src/os2/menu.cpp +++ b/src/os2/menu.cpp @@ -52,11 +52,7 @@ static const int idMenuTitle = -2; // // The unique ID for Menus // -#ifdef __VISAGECPP__ USHORT wxMenu::m_nextMenuId = 0; -#else -static USHORT wxMenu::m_nextMenuId = 0; -#endif // ---------------------------------------------------------------------------- // macros @@ -65,40 +61,6 @@ static USHORT wxMenu::m_nextMenuId = 0; IMPLEMENT_DYNAMIC_CLASS(wxMenu, wxEvtHandler) IMPLEMENT_DYNAMIC_CLASS(wxMenuBar, wxEvtHandler) -// ---------------------------------------------------------------------------- -// static function for translating menu labels -// ---------------------------------------------------------------------------- - -static wxString TextToLabel(const wxString& rTitle) -{ - wxString Title; - const wxChar *pc; - for (pc = rTitle.c_str(); *pc != wxT('\0'); pc++ ) - { - if (*pc == wxT('&') ) - { - if (*(pc+1) == wxT('&')) - { - pc++; - Title << wxT('&'); - } - else - Title << wxT('~'); - } - else - { - if ( *pc == wxT('~') ) - { - // tildes must be doubled to prevent them from being - // interpreted as accelerator character prefix by PM ??? - Title << *pc; - } - Title << *pc; - } - } - return Title; -} - // ============================================================================ // implementation // ============================================================================ @@ -113,6 +75,7 @@ static wxString TextToLabel(const wxString& rTitle) void wxMenu::Init() { m_bDoBreak = FALSE; + m_nStartRadioGroup = -1; // // Create the menu (to be used as a submenu or a popup) @@ -148,12 +111,11 @@ void wxMenu::Init() { Append( idMenuTitle ,m_title + ,wxEmptyString + ,wxITEM_NORMAL ); AppendSeparator(); } - for (int i = 0; i < 128; i++) - m_vAccels[i] = NULL; - m_nNextAccel = 0; } // end of wxMenu::Init // @@ -177,17 +139,7 @@ wxMenu::~wxMenu() // // Delete accels // -#if (!(defined(__VISAGECPP__) && (__IBMCPP__ < 400 || __IBMC__ < 400 ))) - for (int i = 0; i < 128; i++) - { - if (m_vAccels[i]) - { - delete m_vAccels[i]; - m_vAccels[i] = NULL; - } - } -// WX_CLEAR_ARRAY(m_vAccels); -#endif + WX_CLEAR_ARRAY(m_vAccels); #endif // wxUSE_ACCEL } // end of wxMenu::~wxMenu @@ -197,31 +149,26 @@ void wxMenu::Break() m_bDoBreak = TRUE; } // end of wxMenu::Break -#if wxUSE_ACCEL - -void wxMenu::EndRadioGroup() +void wxMenu::Attach( + wxMenuBarBase* pMenubar +) { - // - // We're not inside a radio group any longer - // - m_nStartRadioGroup = -1; -} // end of wxMenu::EndRadioGroup + wxMenuBase::Attach(pMenubar); + EndRadioGroup(); +} // end of wxMenu::Break; + +#if wxUSE_ACCEL int wxMenu::FindAccel( int nId ) const { size_t n; -// size_t nCount = m_vAccels.GetCount(); + size_t nCount = m_vAccels.GetCount(); - for (n = 0; n < m_nNextAccel; n++) - { - if (m_vAccels[n] != NULL) - { - if (m_vAccels[n]->m_command == nId) - return n; - } - } + for (n = 0; n < nCount; n++) + if (m_vAccels[n]->m_command == nId) + return n; return wxNOT_FOUND; } // end of wxMenu::FindAccel @@ -246,6 +193,7 @@ void wxMenu::UpdateAccel( // Find the (new) accel for this item // wxAcceleratorEntry* pAccel = wxGetAccelFromString(pItem->GetText()); + if (pAccel) pAccel->m_command = pItem->GetId(); @@ -254,23 +202,15 @@ void wxMenu::UpdateAccel( // size_t n = FindAccel(pItem->GetId()); - if (n == wxNOT_FOUND) + if (n == (size_t)wxNOT_FOUND) { // // No old, add new if any // if (pAccel) - { - if (m_nNextAccel < 128) - { - m_vAccels[m_nNextAccel] = pAccel; - m_nNextAccel++; - } - else - return; // skipping RebuildAccelTable() below - } + m_vAccels.Add(pAccel); else - return; // skipping RebuildAccelTable() below + return; } else { @@ -278,15 +218,15 @@ void wxMenu::UpdateAccel( // Replace old with new or just remove the old one if no new // delete m_vAccels[n]; - m_vAccels[n] = NULL; - if (pAccel) m_vAccels[n] = pAccel; + else + m_vAccels.RemoveAt(n); } if (IsAttached()) { - m_menuBar->RebuildAccelTable(); + GetMenuBar()->RebuildAccelTable(); } } } // wxMenu::UpdateAccel @@ -307,23 +247,11 @@ bool wxMenu::DoInsertOrAppend( ERRORID vError; wxString sError; - char zMsg[128]; + #if wxUSE_ACCEL UpdateAccel(pItem); #endif // wxUSE_ACCEL - // - // rItem is the member MENUITEM for the menu items and the submenu's - // MENUITEM for submenus as required by ::MM_INSERTITEM message API - // - - if(pSubmenu != NULL) - { - wxASSERT_MSG(pSubmenu->GetHMenu(), wxT("invalid submenu")); - pSubmenu->SetParent(this); - rItem.afStyle |= MIS_SUBMENU | MIS_TEXT; - } - // // If "Break" has just been called, insert a menu break before this item // (and don't forget to reset the flag) @@ -334,24 +262,18 @@ bool wxMenu::DoInsertOrAppend( m_bDoBreak = FALSE; } - if (pItem->IsSeparator()) - { - rItem.afStyle |= MIS_SEPARATOR; - } - // // 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")); pSubmenu->SetParent(this); rItem.iPosition = 0; // submenus have a 0 position - rItem.id = (USHORT)pSubmenu->GetHMenu(); - rItem.afStyle |= MIS_SUBMENU | MIS_TEXT; + rItem.id = (USHORT)pSubmenu->GetHMenu(); + rItem.afStyle |= MIS_SUBMENU | MIS_TEXT; } else { @@ -368,14 +290,19 @@ bool wxMenu::DoInsertOrAppend( // item draws itself, passing pointer to data doesn't work in OS/2 // Will eventually need to set the image handle somewhere into vItem.hItem // - rItem.afStyle |= MIS_OWNERDRAW; - pData = (BYTE*)NULL; - rItem.hItem = (HBITMAP)pItem->GetBitmap().GetHBITMAP(); + rItem.afStyle |= MIS_OWNERDRAW; + pData = (BYTE*)NULL; + rItem.hItem = (HBITMAP)pItem->GetBitmap().GetHBITMAP(); pItem->m_vMenuData.afStyle = rItem.afStyle; - pItem->m_vMenuData.hItem = rItem.hItem; + pItem->m_vMenuData.hItem = rItem.hItem; } else #endif + if (pItem->IsSeparator()) + { + rItem.afStyle = MIS_SEPARATOR; + } + else { // // Menu is just a normal string (passed in data parameter) @@ -403,7 +330,6 @@ bool wxMenu::DoInsertOrAppend( #if wxUSE_OWNER_DRAWN if (pItem->IsOwnerDrawn()) { - BOOL rc; MENUITEM vMenuItem; ::WinSendMsg( GetHmenu() @@ -415,11 +341,11 @@ bool wxMenu::DoInsertOrAppend( ); } #endif - if (rc == MIT_MEMERROR || rc == MIT_ERROR) + if (rc == (APIRET)MIT_MEMERROR || rc == (APIRET)MIT_ERROR) { vError = ::WinGetLastError(vHabmain); sError = wxPMErrorToStr(vError); - wxLogError("Error inserting or appending a menuitem. Error: %s\n", sError); + wxLogError("Error inserting or appending a menuitem. Error: %s\n", sError.c_str()); wxLogLastError("Insert or AppendMenu"); return FALSE; } @@ -428,20 +354,28 @@ bool wxMenu::DoInsertOrAppend( // // If we're already attached to the menubar, we must update it // - if (IsAttached() && m_menuBar->IsAttached()) + if (IsAttached() && GetMenuBar()->IsAttached()) { - m_menuBar->Refresh(); + GetMenuBar()->Refresh(); } return TRUE; } return FALSE; } // end of wxMenu::DoInsertOrAppend -bool wxMenu::DoAppend( +void wxMenu::EndRadioGroup() +{ + // + // We're not inside a radio group any longer + // + m_nStartRadioGroup = -1; +} // end of wxMenu::EndRadioGroup + +wxMenuItem* wxMenu::DoAppend( wxMenuItem* pItem ) { - wxCHECK_MSG( pItem, FALSE, _T("NULL item in wxMenu::DoAppend") ); + wxCHECK_MSG( pItem, NULL, _T("NULL item in wxMenu::DoAppend") ); bool bCheck = FALSE; @@ -473,6 +407,7 @@ bool wxMenu::DoAppend( // We need to update its end item // pItem->SetRadioGroupStart(m_nStartRadioGroup); + wxMenuItemList::Node* pNode = GetMenuItems().Item(m_nStartRadioGroup); if (pNode) @@ -489,27 +424,34 @@ bool wxMenu::DoAppend( { EndRadioGroup(); } + if (!wxMenuBase::DoAppend(pItem) || !DoInsertOrAppend(pItem)) { - return FALSE; + return NULL; } if (bCheck) { + // + // Check the item initially + // pItem->Check(TRUE); } - return TRUE; -} // end of wxMenu::DoInsert + return pItem; +} // end of wxMenu::DoAppend -bool wxMenu::DoInsert( +wxMenuItem* wxMenu::DoInsert( size_t nPos , wxMenuItem* pItem ) { - return ( wxMenuBase::DoInsert( nPos - ,pItem) && + if ( wxMenuBase::DoInsert( nPos + ,pItem) && DoInsertOrAppend( pItem ,nPos - )); + )) + return pItem; + else + return NULL; } // end of wxMenu::DoInsert wxMenuItem* wxMenu::DoRemove( @@ -543,7 +485,7 @@ wxMenuItem* wxMenu::DoRemove( if (n != wxNOT_FOUND) { delete m_vAccels[n]; - m_vAccels[n] = NULL; + m_vAccels.RemoveAt(n); } #endif // wxUSE_ACCEL @@ -555,12 +497,12 @@ wxMenuItem* wxMenu::DoRemove( ,MPFROM2SHORT(pItem->GetId(), TRUE) ,(MPARAM)0 ); - if (IsAttached() && m_menuBar->IsAttached()) + if (IsAttached() && GetMenuBar()->IsAttached()) { // // Otherwise, the chane won't be visible // - m_menuBar->Refresh(); + GetMenuBar()->Refresh(); } // @@ -657,7 +599,7 @@ bool wxMenu::OS2Command( SendEvent( vId ,(int)::WinSendMsg( GetHmenu() ,MM_QUERYITEMATTR - ,(MPARAM)vId + ,MPFROMSHORT(vId) ,(MPARAM)MIA_CHECKED ) ); @@ -673,8 +615,8 @@ wxWindow* wxMenu::GetWindow() const { 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 @@ -762,6 +704,15 @@ wxMenuBar::wxMenuBar( wxMenuBar::~wxMenuBar() { + // + // We should free PM's resources only if PM doesn't do it for us + // which happens if we're attached to a frame + // + if (m_hMenu && !IsAttached()) + { + ::WinDestroyWindow((HMENU)m_hMenu); + m_hMenu = (WXHMENU)NULL; + } } // end of wxMenuBar::~wxMenuBar // --------------------------------------------------------------------------- @@ -777,7 +728,6 @@ void wxMenuBar::Refresh() WXHMENU wxMenuBar::Create() { - MENUITEM vItem; HWND hFrame; if (m_hMenu != 0 ) @@ -831,7 +781,7 @@ WXHMENU wxMenuBar::Create() { vError = ::WinGetLastError(vHabmain); sError = wxPMErrorToStr(vError); - wxLogError("Error setting parent for submenu. Error: %s\n", sError); + wxLogError("Error setting parent for submenu. Error: %s\n", sError.c_str()); return NULLHANDLE; } @@ -839,18 +789,18 @@ WXHMENU wxMenuBar::Create() { vError = ::WinGetLastError(vHabmain); sError = wxPMErrorToStr(vError); - wxLogError("Error setting parent for submenu. Error: %s\n", sError); + wxLogError("Error setting parent for submenu. Error: %s\n", sError.c_str()); return NULLHANDLE; } m_menus[i]->m_vMenuData.iPosition = 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) + if (rc == (APIRET)MIT_MEMERROR || rc == (APIRET)MIT_ERROR) { vError = ::WinGetLastError(vHabmain); sError = wxPMErrorToStr(vError); - wxLogError("Error inserting or appending a menuitem. Error: %s\n", sError); + wxLogError("Error inserting or appending a menuitem. Error: %s\n", sError.c_str()); return NULLHANDLE; } } @@ -947,10 +897,10 @@ wxMenu* wxMenuBar::Replace( ) { SHORT nId; - wxString Title = TextToLabel(rTitle); + wxString sTitle = wxPMTextToLabel(rTitle); wxMenu* pMenuOld = wxMenuBarBase::Replace( nPos ,pMenu - ,Title + ,sTitle ); @@ -961,12 +911,12 @@ wxMenu* wxMenuBar::Replace( return NULL; } if (!pMenuOld) - return FALSE; - m_titles[nPos] = Title; + return NULL; + m_titles[nPos] = sTitle; if (IsAttached()) { ::WinSendMsg((HWND)m_hMenu, MM_REMOVEITEM, MPFROM2SHORT(nId, TRUE), (MPARAM)0); - ::WinSendMsg((HWND)m_hMenu, MM_INSERTITEM, (MPARAM)&pMenu->m_vMenuData, (MPARAM)Title.c_str()); + ::WinSendMsg((HWND)m_hMenu, MM_INSERTITEM, (MPARAM)&pMenu->m_vMenuData, (MPARAM)sTitle.c_str()); #if wxUSE_ACCEL if (pMenuOld->HasAccels() || pMenu->HasAccels()) @@ -988,20 +938,26 @@ bool wxMenuBar::Insert( , const wxString& rTitle ) { - wxString Title = TextToLabel(rTitle); + wxString sTitle = wxPMTextToLabel(rTitle); + if (!wxMenuBarBase::Insert( nPos ,pMenu - ,Title + ,sTitle )) return FALSE; - m_titles.Insert( Title + m_titles.Insert( sTitle ,nPos ); if (IsAttached()) { - ::WinSendMsg((HWND)m_hMenu, MM_INSERTITEM, (MPARAM)&pMenu->m_vMenuData, (MPARAM)Title.c_str()); + pMenu->m_vMenuData.iPosition = nPos; + ::WinSendMsg( (HWND)m_hMenu + ,MM_INSERTITEM + ,(MPARAM)&pMenu->m_vMenuData + ,(MPARAM)sTitle.c_str() + ); #if wxUSE_ACCEL if (pMenu->HasAccels()) { @@ -1016,23 +972,24 @@ bool wxMenuBar::Insert( bool wxMenuBar::Append( wxMenu* pMenu -, const wxString& rTitle +, const wxString& rsTitle ) { WXHMENU hSubmenu = pMenu ? pMenu->GetHMenu() : 0; wxCHECK_MSG(hSubmenu, FALSE, wxT("can't append invalid menu to menubar")); - wxString Title = TextToLabel(rTitle); - if (!wxMenuBarBase::Append(pMenu, Title)) + wxString sTitle = wxPMTextToLabel(rsTitle); + + if (!wxMenuBarBase::Append(pMenu, sTitle)) return FALSE; - m_titles.Add(Title); + m_titles.Add(sTitle); if ( IsAttached() ) { pMenu->m_vMenuData.iPosition = MIT_END; - ::WinSendMsg((HWND)m_hMenu, MM_INSERTITEM, (MPARAM)&pMenu->m_vMenuData, (MPARAM)Title.c_str()); + ::WinSendMsg((HWND)m_hMenu, MM_INSERTITEM, (MPARAM)&pMenu->m_vMenuData, (MPARAM)sTitle.c_str()); #if wxUSE_ACCEL if (pMenu->HasAccels()) { @@ -1057,7 +1014,11 @@ wxMenu* wxMenuBar::Remove( if (!pMenu) return NULL; - nId = SHORT1FROMMR(::WinSendMsg((HWND)GetHmenu(), MM_ITEMIDFROMPOSITION, MPFROMSHORT(nPos), (MPARAM)0)); + nId = SHORT1FROMMR(::WinSendMsg( (HWND)GetHmenu() + ,MM_ITEMIDFROMPOSITION + ,MPFROMSHORT(nPos) + ,(MPARAM)0) + ); if (nId == MIT_ERROR) { wxLogLastError("LogLastError"); @@ -1065,7 +1026,11 @@ wxMenu* wxMenuBar::Remove( } if (IsAttached()) { - ::WinSendMsg((HWND)GetHmenu(), MM_REMOVEITEM, MPFROM2SHORT(nId, TRUE), (MPARAM)0); + ::WinSendMsg( (HWND)GetHmenu() + ,MM_REMOVEITEM + ,MPFROM2SHORT(nId, TRUE) + ,(MPARAM)0 + ); #if wxUSE_ACCEL if (pMenu->HasAccels()) @@ -1120,7 +1085,7 @@ void wxMenuBar::Attach( wxFrame* pFrame ) { - wxASSERT_MSG( !IsAttached(), wxT("menubar already attached!") ); + wxMenuBarBase::Attach(pFrame); #if wxUSE_ACCEL RebuildAccelTable(); @@ -1128,8 +1093,8 @@ void wxMenuBar::Attach( // Ensure the accelerator table is set to the frame (not the client!) // if (!::WinSetAccelTable( vHabmain - ,(HWND)pFrame->GetHWND() ,m_vAccelTable.GetHACCEL() + ,(HWND)pFrame->GetFrame() )) wxLogLastError("WinSetAccelTable"); #endif // wxUSE_ACCEL