menucmn.cpp
来自「A*算法 A*算法 A*算法 A*算法A*算法A*算法」· C++ 代码 · 共 1,066 行 · 第 1/3 页
CPP
1,066 行
///////////////////////////////////////////////////////////////////////////////
// Name: common/menucmn.cpp
// Purpose: wxMenu and wxMenuBar methods common to all ports
// Author: Vadim Zeitlin
// Modified by:
// Created: 26.10.99
// RCS-ID: $Id: menucmn.cpp,v 1.54.2.1 2005/10/21 19:18:40 ABX Exp $
// Copyright: (c) wxWidgets team
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
// ============================================================================
// declarations
// ============================================================================
// ----------------------------------------------------------------------------
// headers
// ----------------------------------------------------------------------------
#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
#pragma implementation "menubase.h"
#endif
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#if wxUSE_MENUS
#include <ctype.h>
#ifndef WX_PRECOMP
#include "wx/intl.h"
#include "wx/log.h"
#include "wx/menu.h"
#endif
// ----------------------------------------------------------------------------
// template lists
// ----------------------------------------------------------------------------
#include "wx/listimpl.cpp"
WX_DEFINE_LIST(wxMenuList);
WX_DEFINE_LIST(wxMenuItemList);
// ============================================================================
// implementation
// ============================================================================
// ----------------------------------------------------------------------------
// wxMenuItem
// ----------------------------------------------------------------------------
wxMenuItemBase::wxMenuItemBase(wxMenu *parentMenu,
int id,
const wxString& text,
const wxString& help,
wxItemKind kind,
wxMenu *subMenu)
: m_text(text),
m_help(help)
{
wxASSERT_MSG( parentMenu != NULL, wxT("menuitem should have a menu") );
m_parentMenu = parentMenu;
m_subMenu = subMenu;
m_isEnabled = true;
m_isChecked = false;
m_id = id;
m_kind = kind;
if (m_id == wxID_ANY)
m_id = wxNewId();
if (m_id == wxID_SEPARATOR)
m_kind = wxITEM_SEPARATOR;
}
wxMenuItemBase::~wxMenuItemBase()
{
delete m_subMenu;
}
#if wxUSE_ACCEL
static inline bool CompareAccelString(const wxString& str, const wxChar *accel)
{
#if wxUSE_INTL
return str == accel || str == wxGetTranslation(accel);
#else
return str == accel;
#endif
}
// return wxAcceleratorEntry for the given menu string or NULL if none
// specified
wxAcceleratorEntry *wxGetAccelFromString(const wxString& label)
{
// wxPrintf( wxT("label %s\n"), label.c_str() );
// check for accelerators: they are given after '\t'
int posTab = label.Find(wxT('\t'));
if ( posTab != wxNOT_FOUND ) {
// parse the accelerator string
int keyCode = 0;
int accelFlags = wxACCEL_NORMAL;
wxString current;
for ( size_t n = (size_t)posTab + 1; n < label.Len(); n++ ) {
if ( (label[n] == '+') || (label[n] == '-') ) {
if ( CompareAccelString(current, wxTRANSLATE("ctrl")) )
accelFlags |= wxACCEL_CTRL;
else if ( CompareAccelString(current, wxTRANSLATE("alt")) )
accelFlags |= wxACCEL_ALT;
else if ( CompareAccelString(current, wxTRANSLATE("shift")) )
accelFlags |= wxACCEL_SHIFT;
else {
// we may have "Ctrl-+", for example, but we still want to
// catch typos like "Crtl-A" so only give the warning if we
// have something before the current '+' or '-', else take
// it as a literal symbol
if ( current.empty() )
{
current += label[n];
// skip clearing it below
continue;
}
else
{
wxLogDebug(wxT("Unknown accel modifier: '%s'"),
current.c_str());
}
}
current.clear();
}
else {
current += (wxChar) wxTolower(label[n]);
}
}
if ( current.empty() ) {
wxLogDebug(wxT("No accel key found, accel string ignored."));
}
else {
if ( current.Len() == 1 ) {
// it's a letter
keyCode = current[0U];
// Only call wxToupper if control, alt, or shift is held down,
// otherwise lower case accelerators won't work.
if (accelFlags != wxACCEL_NORMAL) {
keyCode = wxToupper(keyCode);
}
}
else {
// is it a function key?
if ( current[0U] == 'f' && wxIsdigit(current[1U]) &&
(current.Len() == 2 ||
(current.Len() == 3 && wxIsdigit(current[2U]))) ) {
keyCode = WXK_F1 + wxAtoi(current.c_str() + 1) - 1;
}
else {
// several special cases
current.MakeUpper();
if ( current == wxT("DEL") )
keyCode = WXK_DELETE;
else if ( current == wxT("DELETE") )
keyCode = WXK_DELETE;
else if ( current == wxT("BACK") )
keyCode = WXK_BACK;
else if ( current == wxT("INS") )
keyCode = WXK_INSERT;
else if ( current == wxT("INSERT") )
keyCode = WXK_INSERT;
else if ( current == wxT("ENTER") || current == wxT("RETURN") )
keyCode = WXK_RETURN;
else if ( current == wxT("PGUP") )
keyCode = WXK_PRIOR;
else if ( current == wxT("PGDN") )
keyCode = WXK_NEXT;
else if ( current == wxT("LEFT") )
keyCode = WXK_LEFT;
else if ( current == wxT("RIGHT") )
keyCode = WXK_RIGHT;
else if ( current == wxT("UP") )
keyCode = WXK_UP;
else if ( current == wxT("DOWN") )
keyCode = WXK_DOWN;
else if ( current == wxT("HOME") )
keyCode = WXK_HOME;
else if ( current == wxT("END") )
keyCode = WXK_END;
else if ( current == wxT("SPACE") || current == _("SPACE") )
keyCode = WXK_SPACE;
else if ( current == wxT("TAB") )
keyCode = WXK_TAB;
else if ( current == wxT("ESC") || current == wxT("ESCAPE") )
keyCode = WXK_ESCAPE;
else if ( current == wxT("CANCEL") )
keyCode = WXK_CANCEL;
else if ( current == wxT("CLEAR") )
keyCode = WXK_CLEAR;
else if ( current == wxT("MENU") )
keyCode = WXK_MENU;
else if ( current == wxT("PAUSE") )
keyCode = WXK_PAUSE;
else if ( current == wxT("CAPITAL") )
keyCode = WXK_CAPITAL;
else if ( current == wxT("SELECT") )
keyCode = WXK_SELECT;
else if ( current == wxT("PRINT") )
keyCode = WXK_PRINT;
else if ( current == wxT("EXECUTE") )
keyCode = WXK_EXECUTE;
else if ( current == wxT("SNAPSHOT") )
keyCode = WXK_SNAPSHOT;
else if ( current == wxT("HELP") )
keyCode = WXK_HELP;
else if ( current == wxT("ADD") )
keyCode = WXK_ADD;
else if ( current == wxT("SEPARATOR") )
keyCode = WXK_SEPARATOR;
else if ( current == wxT("SUBTRACT") )
keyCode = WXK_SUBTRACT;
else if ( current == wxT("DECIMAL") )
keyCode = WXK_DECIMAL;
else if ( current == wxT("DIVIDE") )
keyCode = WXK_DIVIDE;
else if ( current == wxT("NUM_LOCK") )
keyCode = WXK_NUMLOCK;
else if ( current == wxT("SCROLL_LOCK") )
keyCode = WXK_SCROLL;
else if ( current == wxT("PAGEUP") )
keyCode = WXK_PAGEUP;
else if ( current == wxT("PAGEDOWN") )
keyCode = WXK_PAGEDOWN;
else if ( current == wxT("KP_SPACE") )
keyCode = WXK_NUMPAD_SPACE;
else if ( current == wxT("KP_TAB") )
keyCode = WXK_NUMPAD_TAB;
else if ( current == wxT("KP_ENTER") )
keyCode = WXK_NUMPAD_ENTER;
else if ( current == wxT("KP_HOME") )
keyCode = WXK_NUMPAD_HOME;
else if ( current == wxT("KP_LEFT") )
keyCode = WXK_NUMPAD_LEFT;
else if ( current == wxT("KP_UP") )
keyCode = WXK_NUMPAD_UP;
else if ( current == wxT("KP_RIGHT") )
keyCode = WXK_NUMPAD_RIGHT;
else if ( current == wxT("KP_DOWN") )
keyCode = WXK_NUMPAD_DOWN;
else if ( current == wxT("KP_PRIOR") )
keyCode = WXK_NUMPAD_PRIOR;
else if ( current == wxT("KP_PAGEUP") )
keyCode = WXK_NUMPAD_PAGEUP;
else if ( current == wxT("KP_NEXT;") )
keyCode = WXK_NUMPAD_NEXT;
else if ( current == wxT("KP_PAGEDOWN") )
keyCode = WXK_NUMPAD_PAGEDOWN;
else if ( current == wxT("KP_END") )
keyCode = WXK_NUMPAD_END;
else if ( current == wxT("KP_BEGIN") )
keyCode = WXK_NUMPAD_BEGIN;
else if ( current == wxT("KP_INSERT") )
keyCode = WXK_NUMPAD_INSERT;
else if ( current == wxT("KP_DELETE") )
keyCode = WXK_NUMPAD_DELETE;
else if ( current == wxT("KP_EQUAL") )
keyCode = WXK_NUMPAD_EQUAL;
else if ( current == wxT("KP_MULTIPLY") )
keyCode = WXK_NUMPAD_MULTIPLY;
else if ( current == wxT("KP_ADD") )
keyCode = WXK_NUMPAD_ADD;
else if ( current == wxT("KP_SEPARATOR") )
keyCode = WXK_NUMPAD_SEPARATOR;
else if ( current == wxT("KP_SUBTRACT") )
keyCode = WXK_NUMPAD_SUBTRACT;
else if ( current == wxT("KP_DECIMAL") )
keyCode = WXK_NUMPAD_DECIMAL;
else if ( current == wxT("KP_DIVIDE") )
keyCode = WXK_NUMPAD_DIVIDE;
else if ( current == wxT("WINDOWS_LEFT") )
keyCode = WXK_WINDOWS_LEFT;
else if ( current == wxT("WINDOWS_RIGHT") )
keyCode = WXK_WINDOWS_RIGHT;
else if ( current == wxT("WINDOWS_MENU") )
keyCode = WXK_WINDOWS_MENU;
else if ( current == wxT("COMMAND") )
keyCode = WXK_COMMAND;
else if ( current.Left(3) == wxT("KP_") && wxIsdigit(current[3U]) )
keyCode = WXK_NUMPAD0 + wxAtoi(current.c_str() + 3);
else if ( current.Left(7) == wxT("SPECIAL") && wxIsdigit(current[7U]) )
keyCode = WXK_SPECIAL1 + wxAtoi(current.c_str() + 7) - 1;
else
{
wxLogDebug(wxT("Unrecognized accel key '%s', accel string ignored."),
current.c_str());
return NULL;
}
}
}
}
if ( keyCode ) {
// we do have something
return new wxAcceleratorEntry(accelFlags, keyCode);
}
}
return (wxAcceleratorEntry *)NULL;
}
wxAcceleratorEntry *wxMenuItemBase::GetAccel() const
{
return wxGetAccelFromString(GetText());
}
void wxMenuItemBase::SetAccel(wxAcceleratorEntry *accel)
{
wxString text = m_text.BeforeFirst(wxT('\t'));
if ( accel )
{
text += wxT('\t');
int flags = accel->GetFlags();
if ( flags & wxACCEL_ALT )
text += wxT("Alt-");
if ( flags & wxACCEL_CTRL )
text += wxT("Ctrl-");
if ( flags & wxACCEL_SHIFT )
text += wxT("Shift-");
int code = accel->GetKeyCode();
switch ( code )
{
case WXK_F1:
case WXK_F2:
case WXK_F3:
case WXK_F4:
case WXK_F5:
case WXK_F6:
case WXK_F7:
case WXK_F8:
case WXK_F9:
case WXK_F10:
case WXK_F11:
case WXK_F12:
text << wxT('F') << code - WXK_F1 + 1;
break;
// if there are any other keys wxGetAccelFromString() may return,
// we should process them here
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?