X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/938aa9c4618c9ed67fa791063681875106d3ef35..b0abe9eeec1e08f5e236d209428e521debb6544e:/src/os2/menu.cpp?ds=sidebyside diff --git a/src/os2/menu.cpp b/src/os2/menu.cpp index 37898a1e55..8007899907 100644 --- a/src/os2/menu.cpp +++ b/src/os2/menu.cpp @@ -69,35 +69,42 @@ static USHORT wxMenu::m_nextMenuId = 0; // static function for translating menu labels // ---------------------------------------------------------------------------- -static wxString TextToLabel(const wxString& rTitle) +static wxString TextToLabel( + const wxString& rsTitle +) { - wxString Title; - const wxChar *pc; - for (pc = rTitle.c_str(); *pc != wxT('\0'); pc++ ) + wxString sTitle = ""; + const wxChar* zPc; + + if (rsTitle.IsEmpty()) + return sTitle; + for (zPc = rsTitle.c_str(); *zPc != wxT('\0'); zPc++ ) { - if (*pc == wxT('&') ) + if (*zPc == wxT('&') ) { - if (*(pc+1) == wxT('&')) + if (*(zPc + 1) == wxT('&')) { - pc++; - Title << wxT('&'); + zPc++; + sTitle << wxT('&'); } else - Title << wxT('~'); + sTitle << wxT('~'); } else { - if ( *pc == wxT('~') ) + if ( *zPc == wxT('~') ) { - // tildes must be doubled to prevent them from being + // + // Tildes must be doubled to prevent them from being // interpreted as accelerator character prefix by PM ??? - Title << *pc; + // + sTitle << *zPc; } - Title << *pc; + sTitle << *zPc; } } - return Title; -} + return sTitle; +} // end of TextToLabel // ============================================================================ // implementation @@ -113,6 +120,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 +156,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 +184,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 +194,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 +238,7 @@ void wxMenu::UpdateAccel( // Find the (new) accel for this item // wxAcceleratorEntry* pAccel = wxGetAccelFromString(pItem->GetText()); + if (pAccel) pAccel->m_command = pItem->GetId(); @@ -260,17 +253,9 @@ void wxMenu::UpdateAccel( // 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,10 +263,10 @@ 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()) @@ -308,22 +293,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) @@ -350,8 +324,8 @@ bool wxMenu::DoInsertOrAppend( 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,11 +342,11 @@ 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 @@ -437,6 +411,14 @@ bool wxMenu::DoInsertOrAppend( return FALSE; } // end of wxMenu::DoInsertOrAppend +void wxMenu::EndRadioGroup() +{ + // + // We're not inside a radio group any longer + // + m_nStartRadioGroup = -1; +} // end of wxMenu::EndRadioGroup + bool wxMenu::DoAppend( wxMenuItem* pItem ) @@ -473,6 +455,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,16 +472,20 @@ bool wxMenu::DoAppend( { EndRadioGroup(); } + if (!wxMenuBase::DoAppend(pItem) || !DoInsertOrAppend(pItem)) { return FALSE; } if (bCheck) { + // + // Check the item initially + // pItem->Check(TRUE); } return TRUE; -} // end of wxMenu::DoInsert +} // end of wxMenu::DoAppend bool wxMenu::DoInsert( size_t nPos @@ -509,7 +496,8 @@ bool wxMenu::DoInsert( ,pItem) && DoInsertOrAppend( pItem ,nPos - )); + ) + ); } // end of wxMenu::DoInsert wxMenuItem* wxMenu::DoRemove( @@ -543,7 +531,7 @@ wxMenuItem* wxMenu::DoRemove( if (n != wxNOT_FOUND) { delete m_vAccels[n]; - m_vAccels[n] = NULL; + m_vAccels.RemoveAt(n); } #endif // wxUSE_ACCEL @@ -762,6 +750,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 // --------------------------------------------------------------------------- @@ -947,10 +944,10 @@ wxMenu* wxMenuBar::Replace( ) { SHORT nId; - wxString Title = TextToLabel(rTitle); + wxString sTitle = TextToLabel(rTitle); wxMenu* pMenuOld = wxMenuBarBase::Replace( nPos ,pMenu - ,Title + ,sTitle ); @@ -961,12 +958,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 +985,26 @@ bool wxMenuBar::Insert( , const wxString& rTitle ) { - wxString Title = TextToLabel(rTitle); + wxString sTitle = TextToLabel(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 +1019,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 = TextToLabel(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 +1061,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 +1073,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 +1132,7 @@ void wxMenuBar::Attach( wxFrame* pFrame ) { - wxASSERT_MSG( !IsAttached(), wxT("menubar already attached!") ); + wxMenuBarBase::Attach(pFrame); #if wxUSE_ACCEL RebuildAccelTable(); @@ -1128,8 +1140,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