X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/223d09f6b523aac674ef9b72a883dfa8d37c5d4e..3f2965162ce86e5b669cd85d1bce98b6a232d020:/src/os2/menuitem.cpp diff --git a/src/os2/menuitem.cpp b/src/os2/menuitem.cpp index 38d31737e7..1c1353c558 100644 --- a/src/os2/menuitem.cpp +++ b/src/os2/menuitem.cpp @@ -1,11 +1,11 @@ /////////////////////////////////////////////////////////////////////////////// // Name: menuitem.cpp // Purpose: wxMenuItem implementation -// Author: AUTHOR -// Modified by: -// Created: ??/??/98 +// Author: David Webster +// Modified by: +// Created: 10/10/98 // RCS-ID: $Id$ -// Copyright: (c) AUTHOR +// Copyright: (c) David Webster // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -13,8 +13,31 @@ // headers & declarations // ============================================================================ -#include "wx/menu.h" +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifndef WX_PRECOMP + #include "wx/font.h" + #include "wx/bitmap.h" + #include "wx/settings.h" + #include "wx/font.h" + #include "wx/window.h" + #include "wx/accel.h" + #include "wx/menu.h" + #include "wx/string.h" +#endif + +#include "wx/ownerdrw.h" #include "wx/menuitem.h" +#include "wx/log.h" + +#include "wx/os2/private.h" + +// --------------------------------------------------------------------------- +// convenience macro +// --------------------------------------------------------------------------- + +#define GetHMenuOf(menu) ((HMENU)menu->GetHMenu()) // ============================================================================ // implementation @@ -24,8 +47,13 @@ // dynamic classes implementation // ---------------------------------------------------------------------------- -#if !USE_SHARED_LIBRARY +#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 + #endif //USE_SHARED_LIBRARY // ---------------------------------------------------------------------------- @@ -39,32 +67,55 @@ wxMenuItem::wxMenuItem(wxMenu *pParentMenu, int id, const wxString& strName, 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) { - wxASSERT( pParentMenu != NULL ); + wxASSERT_MSG( pParentMenu != NULL, wxT("a menu item should have a parent") ); + +#if wxUSE_OWNER_DRAWN + // set default menu colors + #define SYS_COLOR(c) (wxSystemSettings::GetSystemColour(wxSYS_COLOUR_##c)) + + SetTextColour(SYS_COLOR(MENUTEXT)); + SetBackgroundColour(SYS_COLOR(MENU)); + + // we don't want normal items be owner-drawn + ResetOwnerDrawn(); + + #undef SYS_COLOR +#endif - m_pParentMenu = pParentMenu; - m_pSubMenu = pSubMenu; - m_idItem = id; - m_bEnabled = TRUE; + m_pParentMenu = pParentMenu; + m_pSubMenu = pSubMenu; + m_bEnabled = TRUE; + m_bChecked = FALSE; + m_idItem = id; } -wxMenuItem::~wxMenuItem() +wxMenuItem::~wxMenuItem() { } // misc // ---- +// return the id for calling Win32 API functions +int wxMenuItem::GetRealId() const +{ + return m_pSubMenu ? (int)m_pSubMenu->GetHMenu() : GetId(); +} + // delete the sub menu +// ------------------- void wxMenuItem::DeleteSubMenu() { - wxASSERT( m_pSubMenu != NULL ); - - delete m_pSubMenu; - m_pSubMenu = NULL; + delete m_pSubMenu; + m_pSubMenu = NULL; } // change item state @@ -72,24 +123,93 @@ void wxMenuItem::DeleteSubMenu() void wxMenuItem::Enable(bool bDoEnable) { - if ( m_bEnabled != bDoEnable ) { - if ( m_pSubMenu == NULL ) { // normal menu item - // TODO + // TODO: +/* + if ( m_bEnabled != bDoEnable ) { + long rc = EnableMenuItem(GetHMenuOf(m_pParentMenu), + GetRealId(), + MF_BYCOMMAND | + (bDoEnable ? MF_ENABLED : MF_GRAYED)); + + if ( rc == -1 ) { + wxLogLastError("EnableMenuItem"); + } + + m_bEnabled = bDoEnable; } - else // submenu - { - // TODO - } - - m_bEnabled = bDoEnable; - } +*/ } void wxMenuItem::Check(bool bDoCheck) { - wxCHECK_RET( IsCheckable(), "only checkable items may be checked" ); + wxCHECK_RET( IsCheckable(), wxT("only checkable items may be checked") ); + + // TODO: +/* + if ( m_bChecked != bDoCheck ) { + long rc = CheckMenuItem(GetHMenuOf(m_pParentMenu), + GetId(), + MF_BYCOMMAND | + (bDoCheck ? MF_CHECKED : MF_UNCHECKED)); + + if ( rc == -1 ) { + wxLogLastError("CheckMenuItem"); + } + + m_bChecked = bDoCheck; + } +*/ +} + +void wxMenuItem::SetName(const wxString& strName) +{ + // don't do anything if label didn't change + if ( m_strName == strName ) + return; + + m_strName = strName; + + HMENU hMenu = GetHMenuOf(m_pParentMenu); + + UINT id = GetRealId(); + + // TODO: +/* + UINT flagsOld = ::GetMenuState(hMenu, id, MF_BYCOMMAND); + if ( flagsOld == 0xFFFFFFFF ) + { + wxLogLastError("GetMenuState"); + } + else + { + if ( IsSubMenu() ) + { + // high byte contains the number of items in a submenu for submenus + flagsOld &= 0xFF; + flagsOld |= MF_POPUP; + } + + LPCTSTR data; +#if wxUSE_OWNER_DRAWN + if ( IsOwnerDrawn() ) + { + flagsOld |= MF_OWNERDRAW; + data = (LPCTSTR)this; + } + else +#endif //owner drawn + { + flagsOld |= MF_STRING; + data = strName; + } + + if ( ::ModifyMenu(hMenu, id, + MF_BYCOMMAND | flagsOld, + id, data) == 0xFFFFFFFF ) + { + wxLogLastError(wxT("ModifyMenu")); + } + } +*/ +} - if ( m_bChecked != bDoCheck ) { - // TODO - m_bChecked = bDoCheck; - }