Fixed separator handling for menus.

Extracted common code for handling translation of labels containing
        accelerators from wxWindows representation to native representation.


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@25823 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Stefan Neis
2004-02-15 17:33:26 +00:00
parent eeacbb8c4f
commit 3a7c125370
4 changed files with 57 additions and 98 deletions

View File

@@ -63,5 +63,6 @@ public:
WXDLLEXPORT_DATA(extern wxAcceleratorTable) wxNullAcceleratorTable; WXDLLEXPORT_DATA(extern wxAcceleratorTable) wxNullAcceleratorTable;
WXDLLEXPORT wxString wxPMTextToLabel(const wxString& rsTitle);
#endif #endif
// _WX_ACCEL_H_ // _WX_ACCEL_H_

View File

@@ -210,3 +210,45 @@ bool wxAcceleratorTable::Translate(
return (Ok() && rc); return (Ok() && rc);
} // end of wxAcceleratorTable::Translate } // end of wxAcceleratorTable::Translate
// ---------------------------------------------------------------------------
// function for translating labels
// ---------------------------------------------------------------------------
wxString wxPMTextToLabel(
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 wxPMTextToLabel

View File

@@ -61,47 +61,6 @@ USHORT wxMenu::m_nextMenuId = 0;
IMPLEMENT_DYNAMIC_CLASS(wxMenu, wxEvtHandler) IMPLEMENT_DYNAMIC_CLASS(wxMenu, wxEvtHandler)
IMPLEMENT_DYNAMIC_CLASS(wxMenuBar, 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
// ============================================================================ // ============================================================================
@@ -304,16 +263,10 @@ bool wxMenu::DoInsertOrAppend(
m_bDoBreak = FALSE; m_bDoBreak = FALSE;
} }
if (pItem->IsSeparator())
{
rItem.afStyle |= MIS_SEPARATOR;
}
// //
// Id is the numeric id for normal menu items and HMENU for submenus as // Id is the numeric id for normal menu items and HMENU for submenus as
// required by ::MM_INSERTITEM message API // required by ::MM_INSERTITEM message API
// //
if (pSubmenu != NULL) if (pSubmenu != NULL)
{ {
wxASSERT_MSG(pSubmenu->GetHMenu(), wxT("invalid submenu")); wxASSERT_MSG(pSubmenu->GetHMenu(), wxT("invalid submenu"));
@@ -344,8 +297,13 @@ bool wxMenu::DoInsertOrAppend(
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 if (!pItem->IsSeparator()) else
#endif #endif
if (pItem->IsSeparator())
{
rItem.afStyle = MIS_SEPARATOR;
}
else
{ {
// //
// Menu is just a normal string (passed in data parameter) // Menu is just a normal string (passed in data parameter)
@@ -942,7 +900,7 @@ wxMenu* wxMenuBar::Replace(
) )
{ {
SHORT nId; SHORT nId;
wxString sTitle = TextToLabel(rTitle); wxString sTitle = wxPMTextToLabel(rTitle);
wxMenu* pMenuOld = wxMenuBarBase::Replace( nPos wxMenu* pMenuOld = wxMenuBarBase::Replace( nPos
,pMenu ,pMenu
,sTitle ,sTitle
@@ -983,7 +941,7 @@ bool wxMenuBar::Insert(
, const wxString& rTitle , const wxString& rTitle
) )
{ {
wxString sTitle = TextToLabel(rTitle); wxString sTitle = wxPMTextToLabel(rTitle);
if (!wxMenuBarBase::Insert( nPos if (!wxMenuBarBase::Insert( nPos
,pMenu ,pMenu
@@ -1024,7 +982,7 @@ bool wxMenuBar::Append(
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;

View File

@@ -54,48 +54,6 @@
#define OWNER_DRAWN_ONLY( code ) #define OWNER_DRAWN_ONLY( code )
#endif // wxUSE_OWNER_DRAWN/!wxUSE_OWNER_DRAWN #endif // wxUSE_OWNER_DRAWN/!wxUSE_OWNER_DRAWN
// ----------------------------------------------------------------------------
// 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
// ============================================================================ // ============================================================================
@@ -123,13 +81,13 @@ wxMenuItem::wxMenuItem(
) )
: wxMenuItemBase( pParentMenu : wxMenuItemBase( pParentMenu
,nId ,nId
,TextToLabel(rsText) ,wxPMTextToLabel(rsText)
,rsHelp ,rsHelp
,eKind ,eKind
,pSubMenu ,pSubMenu
) )
#if wxUSE_OWNER_DRAWN #if wxUSE_OWNER_DRAWN
, wxOwnerDrawn( TextToLabel(rsText) , wxOwnerDrawn( wxPMTextToLabel(rsText)
,eKind == wxITEM_CHECK ,eKind == wxITEM_CHECK
) )
#endif // owner drawn #endif // owner drawn
@@ -151,13 +109,13 @@ wxMenuItem::wxMenuItem(
) )
: wxMenuItemBase( pParentMenu : wxMenuItemBase( pParentMenu
,nId ,nId
,TextToLabel(rsText) ,wxPMTextToLabel(rsText)
,rsHelp ,rsHelp
,bIsCheckable ? wxITEM_CHECK : wxITEM_NORMAL ,bIsCheckable ? wxITEM_CHECK : wxITEM_NORMAL
,pSubMenu ,pSubMenu
) )
#if wxUSE_OWNER_DRAWN #if wxUSE_OWNER_DRAWN
, wxOwnerDrawn( TextToLabel(rsText) , wxOwnerDrawn( wxPMTextToLabel(rsText)
,bIsCheckable ,bIsCheckable
) )
#endif // owner drawn #endif // owner drawn
@@ -417,7 +375,7 @@ void wxMenuItem::SetText(
// Don't do anything if label didn't change // Don't do anything if label didn't change
// //
wxString sText = TextToLabel(rText); wxString sText = wxPMTextToLabel(rText);
if (m_text == sText) if (m_text == sText)
return; return;