Attempt to fix buggy menus.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@16015 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
David Webster
2002-07-03 15:00:59 +00:00
parent 698052d5f1
commit c9667cda38
2 changed files with 94 additions and 75 deletions

View File

@@ -69,35 +69,40 @@ static USHORT wxMenu::m_nextMenuId = 0;
// static function for translating menu labels // static function for translating menu labels
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
static wxString TextToLabel(const wxString& rTitle) static wxString TextToLabel(
const wxString& rsTitle
)
{ {
wxString Title; wxString sTitle;
const wxChar *pc; const wxChar* zPc;
for (pc = rTitle.c_str(); *pc != wxT('\0'); pc++ )
for (zPc = rsTitle.c_str(); *zPc != wxT('\0'); zPc++ )
{ {
if (*pc == wxT('&') ) if (*zPc == wxT('&') )
{ {
if (*(pc+1) == wxT('&')) if (*(zPc + 1) == wxT('&'))
{ {
pc++; zPc++;
Title << wxT('&'); sTitle << wxT('&');
} }
else else
Title << wxT('~'); sTitle << wxT('~');
} }
else 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 ??? // interpreted as accelerator character prefix by PM ???
Title << *pc; //
sTitle << *zPc;
} }
Title << *pc; sTitle << *zPc;
} }
} }
return Title; return sTitle;
} } // end of TextToLabel
// ============================================================================ // ============================================================================
// implementation // implementation
@@ -149,6 +154,8 @@ void wxMenu::Init()
{ {
Append( idMenuTitle Append( idMenuTitle
,m_title ,m_title
,wxEmptyString
,wxITEM_NORMAL
); );
AppendSeparator(); AppendSeparator();
} }
@@ -288,18 +295,6 @@ bool wxMenu::DoInsertOrAppend(
UpdateAccel(pItem); UpdateAccel(pItem);
#endif // wxUSE_ACCEL #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 // If "Break" has just been called, insert a menu break before this item
// (and don't forget to reset the flag) // (and don't forget to reset the flag)
@@ -326,8 +321,8 @@ bool wxMenu::DoInsertOrAppend(
pSubmenu->SetParent(this); pSubmenu->SetParent(this);
rItem.iPosition = 0; // submenus have a 0 position rItem.iPosition = 0; // submenus have a 0 position
rItem.id = (USHORT)pSubmenu->GetHMenu(); rItem.id = (USHORT)pSubmenu->GetHMenu();
rItem.afStyle |= MIS_SUBMENU | MIS_TEXT; rItem.afStyle |= MIS_SUBMENU | MIS_TEXT;
} }
else else
{ {
@@ -344,11 +339,11 @@ bool wxMenu::DoInsertOrAppend(
// item draws itself, passing pointer to data doesn't work in OS/2 // 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 // Will eventually need to set the image handle somewhere into vItem.hItem
// //
rItem.afStyle |= MIS_OWNERDRAW; rItem.afStyle |= MIS_OWNERDRAW;
pData = (BYTE*)NULL; pData = (BYTE*)NULL;
rItem.hItem = (HBITMAP)pItem->GetBitmap().GetHBITMAP(); rItem.hItem = (HBITMAP)pItem->GetBitmap().GetHBITMAP();
pItem->m_vMenuData.afStyle = rItem.afStyle; pItem->m_vMenuData.afStyle = rItem.afStyle;
pItem->m_vMenuData.hItem = rItem.hItem; pItem->m_vMenuData.hItem = rItem.hItem;
} }
else else
#endif #endif
@@ -937,10 +932,10 @@ wxMenu* wxMenuBar::Replace(
) )
{ {
SHORT nId; SHORT nId;
wxString Title = TextToLabel(rTitle); wxString sTitle = TextToLabel(rTitle);
wxMenu* pMenuOld = wxMenuBarBase::Replace( nPos wxMenu* pMenuOld = wxMenuBarBase::Replace( nPos
,pMenu ,pMenu
,Title ,sTitle
); );
@@ -951,12 +946,12 @@ wxMenu* wxMenuBar::Replace(
return NULL; return NULL;
} }
if (!pMenuOld) if (!pMenuOld)
return FALSE; return NULL;
m_titles[nPos] = Title; m_titles[nPos] = sTitle;
if (IsAttached()) if (IsAttached())
{ {
::WinSendMsg((HWND)m_hMenu, MM_REMOVEITEM, MPFROM2SHORT(nId, TRUE), (MPARAM)0); ::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 wxUSE_ACCEL
if (pMenuOld->HasAccels() || pMenu->HasAccels()) if (pMenuOld->HasAccels() || pMenu->HasAccels())
@@ -978,20 +973,26 @@ bool wxMenuBar::Insert(
, const wxString& rTitle , const wxString& rTitle
) )
{ {
wxString Title = TextToLabel(rTitle); wxString sTitle = TextToLabel(rTitle);
if (!wxMenuBarBase::Insert( nPos if (!wxMenuBarBase::Insert( nPos
,pMenu ,pMenu
,Title ,sTitle
)) ))
return FALSE; return FALSE;
m_titles.Insert( Title m_titles.Insert( sTitle
,nPos ,nPos
); );
if (IsAttached()) 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 wxUSE_ACCEL
if (pMenu->HasAccels()) if (pMenu->HasAccels())
{ {
@@ -1006,23 +1007,24 @@ bool wxMenuBar::Insert(
bool wxMenuBar::Append( bool wxMenuBar::Append(
wxMenu* pMenu wxMenu* pMenu
, const wxString& rTitle , 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 Title = TextToLabel(rTitle); wxString sTitle = TextToLabel(rsTitle);
if (!wxMenuBarBase::Append(pMenu, Title))
if (!wxMenuBarBase::Append(pMenu, sTitle))
return FALSE; return FALSE;
m_titles.Add(Title); m_titles.Add(sTitle);
if ( IsAttached() ) if ( IsAttached() )
{ {
pMenu->m_vMenuData.iPosition = MIT_END; 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 wxUSE_ACCEL
if (pMenu->HasAccels()) if (pMenu->HasAccels())
{ {
@@ -1047,7 +1049,11 @@ wxMenu* wxMenuBar::Remove(
if (!pMenu) if (!pMenu)
return NULL; 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) if (nId == MIT_ERROR)
{ {
wxLogLastError("LogLastError"); wxLogLastError("LogLastError");
@@ -1055,7 +1061,11 @@ wxMenu* wxMenuBar::Remove(
} }
if (IsAttached()) 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 wxUSE_ACCEL
if (pMenu->HasAccels()) if (pMenu->HasAccels())

View File

@@ -58,35 +58,43 @@
// static function for translating menu labels // static function for translating menu labels
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
static wxString TextToLabel(const wxString& rTitle) static wxString TextToLabel(
const wxString& rsTitle
)
{ {
wxString Title; wxString sTitle;
const wxChar *pc; const wxChar* zPc;
for (pc = rTitle.c_str(); *pc != wxT('\0'); pc++ )
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++; zPc++;
Title << wxT('&'); sTitle << wxT('&');
} }
else else
Title << wxT('~'); sTitle << wxT('~');
} }
else 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 ??? // interpreted as accelerator character prefix by PM ???
Title << *pc; //
sTitle << *zPc;
} }
Title << *pc; sTitle << *zPc;
} }
} }
return Title; return(sTitle);
} } // end of TextToLabel
// ============================================================================ // ============================================================================
// implementation // implementation
@@ -173,12 +181,11 @@ void wxMenuItem::Init()
SetTextColour(SYS_COLOR(MENUTEXT)); SetTextColour(SYS_COLOR(MENUTEXT));
SetBackgroundColour(SYS_COLOR(MENU)); SetBackgroundColour(SYS_COLOR(MENU));
#undef SYS_COLOR
// //
// We don't want normal items be owner-drawn // We don't want normal items be owner-drawn
// //
ResetOwnerDrawn(); ResetOwnerDrawn();
#undef SYS_COLOR
// //
// Tell the owner drawing code to to show the accel string as well // Tell the owner drawing code to to show the accel string as well
@@ -218,23 +225,25 @@ bool wxMenuItem::IsChecked() const
} // end of wxMenuItem::IsChecked } // end of wxMenuItem::IsChecked
wxString wxMenuItemBase::GetLabelFromText( wxString wxMenuItemBase::GetLabelFromText(
const wxString& rText const wxString& rsText
) )
{ {
wxString label; wxString sLabel;
for ( const wxChar *pc = rText.c_str(); *pc; pc++ )
for (const char* zPc = rsText.c_str(); *zPc; zPc++)
{ {
if ( *pc == wxT('~') || *pc == wxT('&') ) if (*zPc == wxT('~') || *zPc == wxT('&'))
{ {
// '~' is the escape character for GTK+ and '&' is the one for //
// '~' is the escape character for OS/2PM and '&' is the one for
// wxWindows - skip both of them // wxWindows - skip both of them
//
continue; continue;
} }
sLabel += *zPc;
label += *pc;
} }
return label; return sLabel;
} } // end of wxMenuItemBase::GetLabelFromText
// //
// Radio group stuff // Radio group stuff