X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/5df1250b3059721f336a61bbb2770357e86afe42..36e2955a64a41e743fbd151c2466450ef99b323b:/src/msw/menu.cpp diff --git a/src/msw/menu.cpp b/src/msw/menu.cpp index 59fc836e29..8ff9016a50 100644 --- a/src/msw/menu.cpp +++ b/src/msw/menu.cpp @@ -69,10 +69,6 @@ static const int idMenuTitle = -2; IMPLEMENT_DYNAMIC_CLASS(wxMenuBar, wxEvtHandler) #endif -// convenience macros -#define GetHMENU() ((HMENU)GetHMenu()) -#define GetHMenuOf(menu) ((HMENU)menu->GetHMenu()) - // ============================================================================ // implementation // ============================================================================ @@ -82,9 +78,9 @@ static const int idMenuTitle = -2; // --------------------------------------------------------------------------- // Construct a menu with optional title (then use append) -wxMenu::wxMenu(const wxString& title, const wxFunction func) - : m_title(title) +void wxMenu::Init(const wxString& title, const wxFunction func ) { + m_title = title; m_parent = NULL; m_eventHandler = this; m_pInvokingWindow = NULL; @@ -102,9 +98,7 @@ wxMenu::wxMenu(const wxString& title, const wxFunction func) AppendSeparator() ; } -#if WXWIN_COMPATIBILITY Callback(func); -#endif } // The wxWindow destructor will take care of deleting the submenus. @@ -144,11 +138,12 @@ void wxMenu::Break() // function appends a new item or submenu to the menu void wxMenu::Append(wxMenuItem *pItem) { - wxCHECK_RET( pItem != NULL, "can't append NULL item to the menu" ); + wxCHECK_RET( pItem != NULL, _T("can't append NULL item to the menu") ); +#if wxUSE_ACCEL // check for accelerators: they are given after '\t' wxString label = pItem->GetName(); - int posTab = label.Find('\t'); + int posTab = label.Find(_T('\t')); if ( posTab != wxNOT_FOUND ) { // parse the accelerator string int keyCode = 0; @@ -188,7 +183,7 @@ void wxMenu::Append(wxMenuItem *pItem) (current.Len() == 2 || (current.Len() == 3 && isdigit(current[2U]))) ) { int n; - sscanf(current.c_str() + 1, "%d", &n); + wxSscanf(current.c_str() + 1, _T("%d"), &n); keyCode = VK_F1 + n - 1; } @@ -206,6 +201,7 @@ void wxMenu::Append(wxMenuItem *pItem) m_accelIds.Add(pItem->GetId()); } } +#endif // wxUSE_ACCEL UINT flags = 0; @@ -239,13 +235,13 @@ void wxMenu::Append(wxMenuItem *pItem) id = pItem->GetId(); } - LPCSTR pData; + LPCTSTR pData; #if wxUSE_OWNER_DRAWN if ( pItem->IsOwnerDrawn() ) { // want to get {Measure|Draw}Item messages? // item draws itself, pass pointer to it in data parameter flags |= MF_OWNERDRAW; - pData = (LPCSTR)pItem; + pData = (LPCTSTR)pItem; } else #endif @@ -255,7 +251,7 @@ void wxMenu::Append(wxMenuItem *pItem) pData = label; } - if ( !::AppendMenu(GetHMENU(), flags, id, pData) ) + if ( !::AppendMenu(GetHmenu(), flags, id, pData) ) { wxLogLastError("AppendMenu"); } @@ -270,9 +266,9 @@ void wxMenu::Append(wxMenuItem *pItem) mii.fMask = MIIM_STATE; mii.fState = MFS_DEFAULT; - if ( !SetMenuItemInfo(GetHMENU(), (unsigned)id, FALSE, &mii) ) + if ( !SetMenuItemInfo(GetHmenu(), (unsigned)id, FALSE, &mii) ) { - wxLogLastError("SetMenuItemInfo"); + wxLogLastError(_T("SetMenuItemInfo")); } } #endif // __WIN32__ @@ -319,9 +315,9 @@ void wxMenu::Delete(int id) break; } - wxCHECK_RET( node, "wxMenu::Delete(): item doesn't exist" ); + wxCHECK_RET( node, _T("wxMenu::Delete(): item doesn't exist") ); - HMENU menu = GetHMENU(); + HMENU menu = GetHmenu(); wxMenu *pSubMenu = item->GetSubMenu(); if ( pSubMenu != NULL ) { @@ -344,6 +340,8 @@ void wxMenu::Delete(int id) delete item; } +#if wxUSE_ACCEL + // --------------------------------------------------------------------------- // accelerator helpers // --------------------------------------------------------------------------- @@ -361,6 +359,8 @@ size_t wxMenu::CopyAccels(wxAcceleratorEntry *accels) const return count; } +#endif // wxUSE_ACCEL + // --------------------------------------------------------------------------- // wxMenu functions implemented in wxMenuItem // --------------------------------------------------------------------------- @@ -368,7 +368,7 @@ size_t wxMenu::CopyAccels(wxAcceleratorEntry *accels) const void wxMenu::Enable(int id, bool Flag) { wxMenuItem *item = FindItemForId(id); - wxCHECK_RET( item != NULL, "can't enable non-existing menu item" ); + wxCHECK_RET( item != NULL, _T("can't enable non-existing menu item") ); item->Enable(Flag); } @@ -376,7 +376,7 @@ void wxMenu::Enable(int id, bool Flag) bool wxMenu::IsEnabled(int id) const { wxMenuItem *item = FindItemForId(id); - wxCHECK_MSG( item != NULL, FALSE, "invalid item id" ); + wxCHECK_MSG( item != NULL, FALSE, _T("invalid item id") ); return item->IsEnabled(); } @@ -384,7 +384,7 @@ bool wxMenu::IsEnabled(int id) const void wxMenu::Check(int id, bool Flag) { wxMenuItem *item = FindItemForId(id); - wxCHECK_RET( item != NULL, "can't get status of non-existing menu item" ); + wxCHECK_RET( item != NULL, _T("can't get status of non-existing menu item") ); item->Check(Flag); } @@ -392,7 +392,7 @@ void wxMenu::Check(int id, bool Flag) bool wxMenu::IsChecked(int id) const { wxMenuItem *item = FindItemForId(id); - wxCHECK_MSG( item != NULL, FALSE, "invalid item id" ); + wxCHECK_MSG( item != NULL, FALSE, _T("invalid item id") ); return item->IsChecked(); } @@ -400,7 +400,7 @@ bool wxMenu::IsChecked(int id) const void wxMenu::SetLabel(int id, const wxString& label) { wxMenuItem *item = FindItemForId(id) ; - wxCHECK_RET( item, "wxMenu::SetLabel: no such item" ); + wxCHECK_RET( item, _T("wxMenu::SetLabel: no such item") ); item->SetName(label); } @@ -412,7 +412,7 @@ wxString wxMenu::GetLabel(int id) const if (pItem) label = pItem->GetName() ; else - wxFAIL_MSG("wxMenu::GetLabel: item doesn't exist"); + wxFAIL_MSG(_T("wxMenu::GetLabel: item doesn't exist")); return label; } @@ -423,7 +423,7 @@ void wxMenu::SetHelpString(int itemId, const wxString& helpString) if (item) item->SetHelp(helpString); else - wxFAIL_MSG("wxMenu::SetHelpString: item doesn't exist"); + wxFAIL_MSG(_T("wxMenu::SetHelpString: item doesn't exist")); } wxString wxMenu::GetHelpString (int itemId) const @@ -433,7 +433,7 @@ wxString wxMenu::GetHelpString (int itemId) const if (item) help = item->GetHelp(); else - wxFAIL_MSG("wxMenu::GetHelpString: item doesn't exist"); + wxFAIL_MSG(_T("wxMenu::GetHelpString: item doesn't exist")); return help; } @@ -447,7 +447,7 @@ void wxMenu::SetTitle(const wxString& label) bool hasNoTitle = m_title.IsEmpty(); m_title = label; - HMENU hMenu = GetHMENU(); + HMENU hMenu = GetHmenu(); if ( hasNoTitle ) { @@ -457,7 +457,7 @@ void wxMenu::SetTitle(const wxString& label) (unsigned)idMenuTitle, m_title) || !InsertMenu(hMenu, 1u, MF_BYPOSITION, (unsigned)-1, NULL) ) { - wxLogLastError("InsertMenu"); + wxLogLastError(_T("InsertMenu")); } } } @@ -531,14 +531,12 @@ bool wxMenu::ProcessCommand(wxCommandEvent & event) { bool processed = FALSE; -#if WXWIN_COMPATIBILITY // Try a callback if (m_callback) { (void)(*(m_callback))(*this, event); processed = TRUE; } -#endif // WXWIN_COMPATIBILITY // Try the menu's event handler if ( !processed && GetEventHandler()) @@ -616,32 +614,11 @@ wxMenuItem *wxMenu::FindItemForId(int itemId, wxMenu ** itemMenu) const // other // --------------------------------------------------------------------------- -bool wxWindow::PopupMenu(wxMenu *menu, int x, int y) -{ - menu->SetInvokingWindow(this); - menu->UpdateUI(); - - HWND hWnd = (HWND) GetHWND(); - HMENU hMenu = (HMENU)menu->GetHMenu(); - POINT point; - point.x = x; - point.y = y; - ::ClientToScreen(hWnd, &point); - wxCurrentPopupMenu = menu; - ::TrackPopupMenu(hMenu, TPM_RIGHTBUTTON, point.x, point.y, 0, hWnd, NULL); - wxYield(); - wxCurrentPopupMenu = NULL; - - menu->SetInvokingWindow(NULL); - - return TRUE; -} - void wxMenu::Attach(wxMenuBar *menubar) { // menu can be in at most one menubar because otherwise they would both // delete the menu pointer - wxASSERT_MSG( !m_menuBar, "menu belongs to 2 menubars, expect a crash" ); + wxASSERT_MSG( !m_menuBar, _T("menu belongs to 2 menubars, expect a crash") ); m_menuBar = menubar; m_savehMenu = m_hMenu; @@ -650,7 +627,7 @@ void wxMenu::Attach(wxMenuBar *menubar) void wxMenu::Detach() { - wxASSERT_MSG( m_menuBar, "can't detach menu if it's not attached" ); + wxASSERT_MSG( m_menuBar, _T("can't detach menu if it's not attached") ); m_hMenu = m_savehMenu; m_savehMenu = 0; @@ -713,14 +690,17 @@ wxMenuBar::~wxMenuBar() void wxMenuBar::Refresh() { - wxCHECK_RET( m_menuBarFrame, "can't refresh a menubar withotu a frame" ); + wxCHECK_RET( m_menuBarFrame, _T("can't refresh a menubar withotu a frame") ); DrawMenuBar((HWND)m_menuBarFrame->GetHWND()) ; } WXHMENU wxMenuBar::Create() { - wxCHECK_MSG( !m_hMenu, TRUE, "menubar already created" ); + if (m_hMenu != 0 ) + return m_hMenu; + + wxCHECK_MSG( !m_hMenu, TRUE, _T("menubar already created") ); m_hMenu = (WXHMENU)::CreateMenu(); @@ -755,7 +735,7 @@ void wxMenuBar::Enable(int id, bool enable) wxMenu *itemMenu = NULL; wxMenuItem *item = FindItemForId(id, &itemMenu) ; - wxCHECK_RET( item, "attempt to enable an item which doesn't exist" ); + wxCHECK_RET( item, _T("attempt to enable an item which doesn't exist") ); item->Enable(enable); } @@ -774,8 +754,8 @@ void wxMenuBar::Check(int id, bool check) wxMenu *itemMenu = NULL; wxMenuItem *item = FindItemForId(id, &itemMenu) ; - wxCHECK_RET( item, "attempt to check an item which doesn't exist" ); - wxCHECK_RET( item->IsCheckable(), "attempt to check an uncheckable item" ); + wxCHECK_RET( item, _T("attempt to check an item which doesn't exist") ); + wxCHECK_RET( item->IsCheckable(), _T("attempt to check an uncheckable item") ); item->Check(check); } @@ -785,9 +765,9 @@ bool wxMenuBar::IsChecked(int id) const wxMenu *itemMenu = NULL; wxMenuItem *item = FindItemForId(id, &itemMenu) ; - wxCHECK_MSG( item, FALSE, "wxMenuBar::IsChecked(): no such item" ); + wxCHECK_MSG( item, FALSE, _T("wxMenuBar::IsChecked(): no such item") ); - int flag = ::GetMenuState(GetHMenuOf(itemMenu), id, MF_BYCOMMAND); + int flag = ::GetMenuState(GetHmenuOf(itemMenu), id, MF_BYCOMMAND); return (flag & MF_CHECKED) != 0; } @@ -797,11 +777,12 @@ bool wxMenuBar::IsEnabled(int id) const wxMenu *itemMenu = NULL; wxMenuItem *item = FindItemForId(id, &itemMenu) ; - wxCHECK_MSG( item, FALSE, "wxMenuBar::IsEnabled(): no such item" ); + wxCHECK_MSG( item, FALSE, _T("wxMenuBar::IsEnabled(): no such item") ); - int flag = ::GetMenuState(GetHMenuOf(itemMenu), id, MF_BYCOMMAND) ; + int flag = ::GetMenuState(GetHmenuOf(itemMenu), id, MF_BYCOMMAND) ; - return (flag & MF_ENABLED) != 0; + // don't "and" with MF_ENABLED because its value is 0 + return (flag & MF_DISABLED) == 0; } void wxMenuBar::SetLabel(int id, const wxString& label) @@ -809,7 +790,7 @@ void wxMenuBar::SetLabel(int id, const wxString& label) wxMenu *itemMenu = NULL; wxMenuItem *item = FindItemForId(id, &itemMenu) ; - wxCHECK_RET( item, "wxMenuBar::SetLabel(): no such item" ); + wxCHECK_RET( item, _T("wxMenuBar::SetLabel(): no such item") ); item->SetName(label); } @@ -819,7 +800,7 @@ wxString wxMenuBar::GetLabel(int id) const wxMenu *itemMenu = NULL; wxMenuItem *item = FindItemForId(id, &itemMenu) ; - wxCHECK_MSG( item, "", "wxMenuBar::GetLabel(): no such item" ); + wxCHECK_MSG( item, _T(""), _T("wxMenuBar::GetLabel(): no such item") ); return item->GetName(); } @@ -829,7 +810,7 @@ void wxMenuBar::SetHelpString (int id, const wxString& helpString) wxMenu *itemMenu = NULL; wxMenuItem *item = FindItemForId(id, &itemMenu) ; - wxCHECK_RET( item, "wxMenuBar::SetHelpString(): no such item" ); + wxCHECK_RET( item, _T("wxMenuBar::SetHelpString(): no such item") ); item->SetHelp(helpString); } @@ -839,7 +820,7 @@ wxString wxMenuBar::GetHelpString (int id) const wxMenu *itemMenu = NULL; wxMenuItem *item = FindItemForId(id, &itemMenu) ; - wxCHECK_MSG( item, "", "wxMenuBar::GetHelpString(): no such item" ); + wxCHECK_MSG( item, _T(""), _T("wxMenuBar::GetHelpString(): no such item") ); return item->GetHelp(); } @@ -857,7 +838,7 @@ void wxMenuBar::SetLabelTop(int pos, const wxString& label) UINT flagsOld = ::GetMenuState((HMENU)m_hMenu, pos, MF_BYPOSITION); if ( flagsOld == 0xFFFFFFFF ) { - wxLogLastError("GetMenuState"); + wxLogLastError(_T("GetMenuState")); return; } @@ -873,7 +854,7 @@ void wxMenuBar::SetLabelTop(int pos, const wxString& label) id = pos; } - if ( ::ModifyMenu(GetHMENU(), pos, MF_BYPOSITION | MF_STRING | flagsOld, + if ( ::ModifyMenu(GetHmenu(), pos, MF_BYPOSITION | MF_STRING | flagsOld, id, label) == 0xFFFFFFFF ) { wxLogLastError("ModifyMenu"); @@ -886,7 +867,7 @@ wxString wxMenuBar::GetLabelTop(int pos) const len++; // for the NUL character wxString label; - ::GetMenuString(GetHMENU(), pos, label.GetWriteBuf(len), len, MF_BYCOMMAND); + ::GetMenuString(GetHmenu(), pos, label.GetWriteBuf(len), len, MF_BYCOMMAND); label.UngetWriteBuf(); return label; @@ -904,7 +885,7 @@ bool wxMenuBar::OnDelete(wxMenu *a_menu, int pos) if ( ::RemoveMenu((HMENU)m_hMenu, (UINT)pos, MF_BYPOSITION) ) { // VZ: I'm not sure about what's going on here, so I leave an assert - wxASSERT_MSG( m_menus[pos] == a_menu, "what is this parameter for??" ); + wxASSERT_MSG( m_menus[pos] == a_menu, _T("what is this parameter for??") ); a_menu->Detach(); @@ -921,7 +902,7 @@ bool wxMenuBar::OnDelete(wxMenu *a_menu, int pos) return FALSE; } -bool wxMenuBar::OnAppend(wxMenu *a_menu, const char *title) +bool wxMenuBar::OnAppend(wxMenu *a_menu, const wxChar *title) { WXHMENU submenu = a_menu->GetHMenu(); if ( !submenu ) @@ -932,10 +913,10 @@ bool wxMenuBar::OnAppend(wxMenu *a_menu, const char *title) a_menu->Attach(this); - if ( !::AppendMenu(GetHMENU(), MF_POPUP | MF_STRING, + if ( !::AppendMenu(GetHmenu(), MF_POPUP | MF_STRING, (UINT)submenu, title) ) { - wxLogLastError("AppendMenu"); + wxLogLastError(_T("AppendMenu")); } Refresh(); @@ -946,6 +927,75 @@ bool wxMenuBar::OnAppend(wxMenu *a_menu, const char *title) // --------------------------------------------------------------------------- // wxMenuBar construction // --------------------------------------------------------------------------- +int wxMenuBar::FindMenu(const wxString& title) +{ + wxString menuTitle = wxStripMenuCodes(title); + for ( int i = 0; i < m_menuCount; i++ ) + { + wxString title = wxStripMenuCodes(m_titles[i]); + if ( menuTitle == title ) + return i; + } + + return wxNOT_FOUND; + +} + + +void wxMenuBar::ReplaceMenu(int pos, wxMenu * new_menu, const wxString& title) +{ + if (m_menuBarFrame) return; + + if ( pos >= 0 && pos < m_menuCount ) + { + wxMenu *old_menu = m_menus[pos]; + m_menus[pos] = new_menu; + delete old_menu; + } + +} + + +void wxMenuBar::Insert(int pos, wxMenu * menu, const wxString& title) +{ + if (m_menuBarFrame) return; + if ( pos < 0 && pos >= m_menuCount ) return; + + m_menuCount ++; + wxMenu **new_menus = new wxMenu *[m_menuCount]; + wxString *new_titles = new wxString[m_menuCount]; + int i; + + for (i = 0; i < pos; i++) + { + new_menus[i] = m_menus[i]; + m_menus[i] = NULL; + new_titles[i] = m_titles[i]; + m_titles[i] = _T(""); + } + + new_menus[pos] = (wxMenu *)menu; + new_titles[i] = title; + + for (i = pos+1; i < m_menuCount; i++) + { + new_menus[i] = m_menus[i-1]; + m_menus[i-1] = NULL; + new_titles[i] = m_titles[i-1]; + m_titles[i-1] = _T(""); + } + if (m_menus) + { + delete[]m_menus; + delete[]m_titles; + } + m_menus = new_menus; + m_titles = new_titles; + + menu->SetParent(this); + +} + void wxMenuBar::Append (wxMenu * menu, const wxString& title) { @@ -962,7 +1012,7 @@ void wxMenuBar::Append (wxMenu * menu, const wxString& title) new_menus[i] = m_menus[i]; m_menus[i] = NULL; new_titles[i] = m_titles[i]; - m_titles[i] = ""; + m_titles[i] = _T(""); } if (m_menus) { @@ -1014,6 +1064,7 @@ void wxMenuBar::Attach(wxFrame *frame) m_menuBarFrame = frame; +#if wxUSE_ACCEL // create the accel table - we consider that the menubar construction is // finished size_t nAccelCount = 0; @@ -1037,8 +1088,17 @@ void wxMenuBar::Attach(wxFrame *frame) delete [] accelEntries; } +#endif // wxUSE_ACCEL +} + +void wxMenuBar::Detach() +{ +// ::DestroyMenu((HMENU)m_hMenu); + m_hMenu = NULL; + m_menuBarFrame = NULL; } + // --------------------------------------------------------------------------- // wxMenuBar searching for menu items // --------------------------------------------------------------------------- @@ -1094,7 +1154,7 @@ WXHMENU wxMenu::GetHMenu() const else if ( m_savehMenu != 0 ) return m_savehMenu; - wxFAIL_MSG("wxMenu without HMENU"); + wxFAIL_MSG(_T("wxMenu without HMENU")); return 0; }