#include "wx/menuitem.h"
#include "wx/log.h"
+#if wxUSE_ACCEL
+ #include "wx/accel.h"
+#endif // wxUSE_ACCEL
+
#include "wx/msw/private.h"
// ---------------------------------------------------------------------------
// dynamic classes implementation
// ----------------------------------------------------------------------------
-#if !defined(USE_SHARED_LIBRARY) || !USE_SHARED_LIBRARY
- #if wxUSE_OWNER_DRAWN
- IMPLEMENT_DYNAMIC_CLASS2(wxMenuItem, wxMenuItemBase, wxOwnerDrawn)
- #else //!USE_OWNER_DRAWN
- IMPLEMENT_DYNAMIC_CLASS(wxMenuItem, wxMenuItemBase)
- #endif //USE_OWNER_DRAWN
-#endif //USE_SHARED_LIBRARY
+#if wxUSE_OWNER_DRAWN
+ IMPLEMENT_DYNAMIC_CLASS2(wxMenuItem, wxMenuItemBase, wxOwnerDrawn)
+#else //!USE_OWNER_DRAWN
+ IMPLEMENT_DYNAMIC_CLASS(wxMenuItem, wxMenuItemBase)
+#endif //USE_OWNER_DRAWN
// ----------------------------------------------------------------------------
// wxMenuItem
const wxString& text,
const wxString& strHelp,
bool bCheckable,
- wxMenu *pSubMenu) :
+ wxMenu *pSubMenu)
#if wxUSE_OWNER_DRAWN
- wxOwnerDrawn(text, bCheckable)
+ : wxOwnerDrawn(GetLabelFromText(text), bCheckable)
#endif // owner drawn
{
wxASSERT_MSG( pParentMenu != NULL, wxT("a menu item should have a parent") );
SetTextColour(SYS_COLOR(MENUTEXT));
SetBackgroundColour(SYS_COLOR(MENU));
+ #undef SYS_COLOR
+
// we don't want normal items be owner-drawn
ResetOwnerDrawn();
- #undef SYS_COLOR
+ // tell the owner drawing code to to show the accel string as well
+ SetAccelString(text.AfterFirst(_T('\t')));
#endif // wxUSE_OWNER_DRAWN
m_parentMenu = pParentMenu;
return m_subMenu ? (int)m_subMenu->GetHMenu() : GetId();
}
-// delete the sub menu
-// -------------------
-void wxMenuItem::DeleteSubMenu()
-{
- delete m_subMenu;
- m_subMenu = NULL;
-}
-
// get item state
// --------------
-void wxMenuItem::IsChecked() const
+bool wxMenuItem::IsChecked() const
+{
+ int flag = ::GetMenuState(GetHMenuOf(m_parentMenu), GetId(), MF_BYCOMMAND);
+
+ return (flag & MF_CHECKED) != 0;
+}
+
+/* static */
+wxString wxMenuItemBase::GetLabelFromText(const wxString& text)
{
- int flag = ::GetMenuState(GetHMenuOf(m_parentMenu), id, MF_BYCOMMAND);
+ return wxStripMenuCodes(text);
+}
+
+// accelerators
+// ------------
- // don't "and" with MF_ENABLED because its value is 0
- return (flag & MF_DISABLED) == 0;
+#if wxUSE_ACCEL
+
+wxAcceleratorEntry *wxMenuItem::GetAccel() const
+{
+ return wxGetAccelFromString(GetText());
}
+#endif // wxUSE_ACCEL
+
// change item state
// -----------------
-void wxMenuItem::Enable(bool bDoEnable)
+void wxMenuItem::Enable(bool enable)
{
- if ( m_isEnabled != bDoEnable ) {
- long rc = EnableMenuItem(GetHMenuOf(m_parentMenu),
- GetRealId(),
- MF_BYCOMMAND |
- (bDoEnable ? MF_ENABLED : MF_GRAYED));
-
- if ( rc == -1 ) {
- wxLogLastError("EnableMenuItem");
- }
+ if ( m_isEnabled == enable )
+ return;
- wxMenuItemBase::Enable(m_isEnabled);
+ long rc = EnableMenuItem(GetHMenuOf(m_parentMenu),
+ GetRealId(),
+ MF_BYCOMMAND |
+ (enable ? MF_ENABLED : MF_GRAYED));
+
+ if ( rc == -1 ) {
+ wxLogLastError(wxT("EnableMenuItem"));
}
+
+ wxMenuItemBase::Enable(enable);
}
-void wxMenuItem::Check(bool bDoCheck)
+void wxMenuItem::Check(bool check)
{
wxCHECK_RET( m_isCheckable, wxT("only checkable items may be checked") );
- if ( m_isChecked != bDoCheck ) {
- long rc = CheckMenuItem(GetHMenuOf(m_parentMenu),
- GetId(),
- MF_BYCOMMAND |
- (bDoCheck ? MF_CHECKED : MF_UNCHECKED));
+ if ( m_isChecked == check )
+ return;
- if ( rc == -1 ) {
- wxLogLastError("CheckMenuItem");
- }
+ long rc = CheckMenuItem(GetHMenuOf(m_parentMenu),
+ GetRealId(),
+ MF_BYCOMMAND |
+ (check ? MF_CHECKED : MF_UNCHECKED));
- wxMenuItemBase::Check(m_isChecked);
+ if ( rc == -1 ) {
+ wxLogLastError(wxT("CheckMenuItem"));
}
+
+ wxMenuItemBase::Check(check);
}
void wxMenuItem::SetText(const wxString& text)
OWNER_DRAWN_ONLY( wxOwnerDrawn::SetName(text) );
HMENU hMenu = GetHMenuOf(m_parentMenu);
+ wxCHECK_RET( hMenu, wxT("menuitem without menu") );
+
+#if wxUSE_ACCEL
+ m_parentMenu->UpdateAccel(this);
+#endif // wxUSE_ACCEL
UINT id = GetRealId();
UINT flagsOld = ::GetMenuState(hMenu, id, MF_BYCOMMAND);
if ( flagsOld == 0xFFFFFFFF )
{
- wxLogLastError("GetMenuState");
+ wxLogLastError(wxT("GetMenuState"));
}
else
{
#endif //owner drawn
{
flagsOld |= MF_STRING;
- data = (char*) text.c_str();
+ data = (wxChar*) text.c_str();
}
if ( ::ModifyMenu(hMenu, id,