1. small dnd compilation fixes (no attempt to make icon setting work though)

2. wxMenuItemBase appears
3. more key combinations handled by wxGTK for menu accels


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@4184 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
1999-10-25 15:51:37 +00:00
parent 84a3fe2c9b
commit 974e8d946f
17 changed files with 621 additions and 506 deletions

View File

@@ -39,18 +39,25 @@
#include "wx/string.h"
#endif
#include "wx/ownerdrw.h"
#include "wx/menuitem.h"
#include "wx/log.h"
#include "wx/msw/private.h"
// ---------------------------------------------------------------------------
// convenience macro
// macro
// ---------------------------------------------------------------------------
// hide the ugly cast
#define GetHMenuOf(menu) ((HMENU)menu->GetHMenu())
// conditional compilation
#if wxUSE_OWNER_DRAWN
#define OWNER_DRAWN_ONLY( code ) if ( IsOwnerDrawn() ) code
#else // !wxUSE_OWNER_DRAWN
#define OWNER_DRAWN_ONLY( code )
#endif // wxUSE_OWNER_DRAWN/!wxUSE_OWNER_DRAWN
// ============================================================================
// implementation
// ============================================================================
@@ -60,12 +67,11 @@
// ----------------------------------------------------------------------------
#if !defined(USE_SHARED_LIBRARY) || !USE_SHARED_LIBRARY
#if wxUSE_OWNER_DRAWN
IMPLEMENT_DYNAMIC_CLASS2(wxMenuItem, wxObject, wxOwnerDrawn)
#else //!USE_OWNER_DRAWN
IMPLEMENT_DYNAMIC_CLASS(wxMenuItem, wxObject)
#endif //USE_OWNER_DRAWN
#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
// ----------------------------------------------------------------------------
@@ -75,17 +81,15 @@
// ctor & dtor
// -----------
wxMenuItem::wxMenuItem(wxMenu *pParentMenu, int id,
const wxString& strName, const wxString& strHelp,
wxMenuItem::wxMenuItem(wxMenu *pParentMenu,
int id,
const wxString& text,
const wxString& strHelp,
bool bCheckable,
wxMenu *pSubMenu) :
#if wxUSE_OWNER_DRAWN
wxOwnerDrawn(strName, bCheckable),
#else //no owner drawn support
m_bCheckable(bCheckable),
m_strName(strName),
#endif //owner drawn
m_strHelp(strHelp)
wxOwnerDrawn(text, bCheckable)
#endif // owner drawn
{
wxASSERT_MSG( pParentMenu != NULL, wxT("a menu item should have a parent") );
@@ -100,13 +104,16 @@ wxMenuItem::wxMenuItem(wxMenu *pParentMenu, int id,
ResetOwnerDrawn();
#undef SYS_COLOR
#endif
#endif // wxUSE_OWNER_DRAWN
m_pParentMenu = pParentMenu;
m_pSubMenu = pSubMenu;
m_bEnabled = TRUE;
m_bChecked = FALSE;
m_idItem = id;
m_parentMenu = pParentMenu;
m_subMenu = pSubMenu;
m_isEnabled = TRUE;
m_isChecked = FALSE;
m_id = id;
m_text = text;
m_isCheckable = bCheckable;
m_help = strHelp;
}
wxMenuItem::~wxMenuItem()
@@ -119,15 +126,15 @@ wxMenuItem::~wxMenuItem()
// return the id for calling Win32 API functions
int wxMenuItem::GetRealId() const
{
return m_pSubMenu ? (int)m_pSubMenu->GetHMenu() : GetId();
return m_subMenu ? (int)m_subMenu->GetHMenu() : GetId();
}
// delete the sub menu
// -------------------
void wxMenuItem::DeleteSubMenu()
{
delete m_pSubMenu;
m_pSubMenu = NULL;
delete m_subMenu;
m_subMenu = NULL;
}
// change item state
@@ -135,8 +142,8 @@ void wxMenuItem::DeleteSubMenu()
void wxMenuItem::Enable(bool bDoEnable)
{
if ( m_bEnabled != bDoEnable ) {
long rc = EnableMenuItem(GetHMenuOf(m_pParentMenu),
if ( m_isEnabled != bDoEnable ) {
long rc = EnableMenuItem(GetHMenuOf(m_parentMenu),
GetRealId(),
MF_BYCOMMAND |
(bDoEnable ? MF_ENABLED : MF_GRAYED));
@@ -145,16 +152,16 @@ void wxMenuItem::Enable(bool bDoEnable)
wxLogLastError("EnableMenuItem");
}
m_bEnabled = bDoEnable;
wxMenuItemBase::Enable(m_isEnabled);
}
}
void wxMenuItem::Check(bool bDoCheck)
{
wxCHECK_RET( IsCheckable(), wxT("only checkable items may be checked") );
wxCHECK_RET( m_isCheckable, wxT("only checkable items may be checked") );
if ( m_bChecked != bDoCheck ) {
long rc = CheckMenuItem(GetHMenuOf(m_pParentMenu),
if ( m_isChecked != bDoCheck ) {
long rc = CheckMenuItem(GetHMenuOf(m_parentMenu),
GetId(),
MF_BYCOMMAND |
(bDoCheck ? MF_CHECKED : MF_UNCHECKED));
@@ -163,19 +170,20 @@ void wxMenuItem::Check(bool bDoCheck)
wxLogLastError("CheckMenuItem");
}
m_bChecked = bDoCheck;
wxMenuItemBase::Check(m_isChecked);
}
}
void wxMenuItem::SetName(const wxString& strName)
void wxMenuItem::SetText(const wxString& text)
{
// don't do anything if label didn't change
if ( m_strName == strName )
if ( m_text == text )
return;
m_strName = strName;
wxMenuItemBase::SetText(text);
OWNER_DRAWN_ONLY( wxOwnerDrawn::SetName(text) );
HMENU hMenu = GetHMenuOf(m_pParentMenu);
HMENU hMenu = GetHMenuOf(m_parentMenu);
UINT id = GetRealId();
UINT flagsOld = ::GetMenuState(hMenu, id, MF_BYCOMMAND);
@@ -193,6 +201,7 @@ void wxMenuItem::SetName(const wxString& strName)
}
LPCTSTR data;
#if wxUSE_OWNER_DRAWN
if ( IsOwnerDrawn() )
{
@@ -203,13 +212,7 @@ void wxMenuItem::SetName(const wxString& strName)
#endif //owner drawn
{
flagsOld |= MF_STRING;
// Don't know what the correct cast should be, but it doesn't
// compile in BC++/16-bit without this cast.
#if !defined(__WIN32__)
data = (char*) (const char*) strName;
#else
data = strName;
#endif
data = (char*) text.c_str();
}
if ( ::ModifyMenu(hMenu, id,
@@ -221,3 +224,22 @@ void wxMenuItem::SetName(const wxString& strName)
}
}
void wxMenuItem::SetCheckable(bool checkable)
{
wxMenuItemBase::SetCheckable(checkable);
OWNER_DRAWN_ONLY( wxOwnerDrawn::SetCheckable(checkable) );
}
// ----------------------------------------------------------------------------
// wxMenuItemBase
// ----------------------------------------------------------------------------
wxMenuItem *wxMenuItemBase::New(wxMenu *parentMenu,
int id,
const wxString& name,
const wxString& help,
bool isCheckable,
wxMenu *subMenu)
{
return new wxMenuItem(parentMenu, id, name, help, isCheckable, subMenu);
}