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:
@@ -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_
|
||||||
|
@@ -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
|
||||||
|
|
||||||
|
@@ -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;
|
||||||
|
@@ -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;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user