bool wxGridCellEditor::IsAcceptedKey(wxKeyEvent& event) { bool ctrl = event.ControlDown(); bool alt = event.AltDown(); #ifdef __WXMAC__ // On the Mac the Alt key is more like shift and is used for entry of // valid characters, so check for Ctrl and Meta instead. alt = event.MetaDown(); #endif // Assume it's not a valid char if ctrl or alt is down, but if both are // down then it may be because of an AltGr key combination, so let them // through in that case. if ((ctrl || alt) && !(ctrl && alt)) return false; #if wxUSE_UNICODE // if the unicode key code is not really a unicode character (it may // be a function key or etc., the platforms appear to always give us a // small value in this case) then fallback to the ASCII key code but // don't do anything for function keys or etc. if ( event.GetUnicodeKey() > 127 && event.GetKeyCode() > 127 ) return false; #else if ( event.GetKeyCode() > 255 ) return false; #endif return true; }
bool wxGridCellEditor::IsAcceptedKey(wxKeyEvent& event) { bool ctrl = event.ControlDown(); bool alt; #ifdef __WXMAC__ // On the Mac the Alt key is more like shift and is used for entry of // valid characters, so check for Ctrl and Meta instead. alt = event.MetaDown(); #else // !__WXMAC__ alt = event.AltDown(); #endif // __WXMAC__/!__WXMAC__ // Assume it's not a valid char if ctrl or alt is down, but if both are // down then it may be because of an AltGr key combination, so let them // through in that case. if ((ctrl || alt) && !(ctrl && alt)) return false; #if wxUSE_UNICODE if ( static_cast<int>(event.GetUnicodeKey()) == WXK_NONE ) return false; #else if ( event.GetKeyCode() > WXK_START ) return false; #endif return true; }
PlatformKeyboardEvent::PlatformKeyboardEvent(wxKeyEvent& event) { if (event.GetEventType() == wxEVT_KEY_UP) m_type = KeyUp; else if (event.GetEventType() == wxEVT_KEY_DOWN) m_type = KeyDown; else if (event.GetEventType() == wxEVT_CHAR) m_type = Char; else ASSERT_NOT_REACHED(); if (m_type != Char) m_keyIdentifier = keyIdentifierForWxKeyCode(event.GetKeyCode()); else { //ENTER is an editing command processed as a char (only Enter and Tab are) //unfortunately the unicode key for numpad_enter (370) is NOT what we want here (13) //The unicode values for normal enter and tab are the same as the ASCII values, thus ok //Note that I think this a wx bug, as the Character Code is actually 13 when //numpad_enter is a CHAR event. if (event.GetKeyCode() == 13 && event.GetUnicodeKey() == wxChar(370)) m_text = "\r"; else m_text = wxString(event.GetUnicodeKey()); m_unmodifiedText = m_text; } m_autoRepeat = false; // FIXME: not correct. m_windowsVirtualKeyCode = windowsKeyCodeForKeyEvent(event.GetKeyCode()); m_nativeVirtualKeyCode = event.GetKeyCode(); m_isKeypad = (event.GetKeyCode() >= WXK_NUMPAD_SPACE) && (event.GetKeyCode() <= WXK_NUMPAD_DIVIDE); m_shiftKey = event.ShiftDown(); m_ctrlKey = event.CmdDown(); m_altKey = event.AltDown(); m_metaKey = event.MetaDown(); }
PlatformKeyboardEvent::PlatformKeyboardEvent(wxKeyEvent& event) { m_text = wxString(event.GetUnicodeKey()); m_unmodifiedText = m_text; m_keyIdentifier = keyIdentifierForWxKeyCode(event.GetKeyCode()); m_isKeyUp = event.GetEventType() == wxEVT_KEY_UP; m_autoRepeat = false; // FIXME: not correct. m_WindowsKeyCode = windowsKeyCodeForKeyEvent(event.GetKeyCode()); m_isKeypad = (event.GetKeyCode() >= WXK_NUMPAD_SPACE) && (event.GetKeyCode() <= WXK_NUMPAD_DIVIDE); m_shiftKey = event.ShiftDown(); m_ctrlKey = event.CmdDown(); m_altKey = event.AltDown(); m_metaKey = event.MetaDown(); }
// By default, pressing escape cancels the dialog , on mac command-stop does the same thing void wxDialog::OnCharHook(wxKeyEvent& event) { if (( event.m_keyCode == WXK_ESCAPE || ( event.m_keyCode == '.' && event.MetaDown() ) ) && FindWindow(wxID_CANCEL) ) { // Behaviour changed in 2.0: we'll send a Cancel message // to the dialog instead of Close. wxCommandEvent cancelEvent(wxEVT_COMMAND_BUTTON_CLICKED, wxID_CANCEL); cancelEvent.SetEventObject( this ); GetEventHandler()->ProcessEvent(cancelEvent); return; } // We didn't process this event. event.Skip(); }
void LogKeyEvent(const wxChar *name, const wxKeyEvent& event) { wxString key; long keycode = event.GetKeyCode(); { switch ( keycode ) { case WXK_BACK: key = wxT("BACK"); break; case WXK_TAB: key = wxT("TAB"); break; case WXK_RETURN: key = wxT("RETURN"); break; case WXK_ESCAPE: key = wxT("ESCAPE"); break; case WXK_SPACE: key = wxT("SPACE"); break; case WXK_DELETE: key = wxT("DELETE"); break; case WXK_START: key = wxT("START"); break; case WXK_LBUTTON: key = wxT("LBUTTON"); break; case WXK_RBUTTON: key = wxT("RBUTTON"); break; case WXK_CANCEL: key = wxT("CANCEL"); break; case WXK_MBUTTON: key = wxT("MBUTTON"); break; case WXK_CLEAR: key = wxT("CLEAR"); break; case WXK_SHIFT: key = wxT("SHIFT"); break; case WXK_ALT: key = wxT("ALT"); break; case WXK_CONTROL: key = wxT("CONTROL"); break; case WXK_MENU: key = wxT("MENU"); break; case WXK_PAUSE: key = wxT("PAUSE"); break; case WXK_CAPITAL: key = wxT("CAPITAL"); break; case WXK_END: key = wxT("END"); break; case WXK_HOME: key = wxT("HOME"); break; case WXK_LEFT: key = wxT("LEFT"); break; case WXK_UP: key = wxT("UP"); break; case WXK_RIGHT: key = wxT("RIGHT"); break; case WXK_DOWN: key = wxT("DOWN"); break; case WXK_SELECT: key = wxT("SELECT"); break; case WXK_PRINT: key = wxT("PRINT"); break; case WXK_EXECUTE: key = wxT("EXECUTE"); break; case WXK_SNAPSHOT: key = wxT("SNAPSHOT"); break; case WXK_INSERT: key = wxT("INSERT"); break; case WXK_HELP: key = wxT("HELP"); break; case WXK_NUMPAD0: key = wxT("NUMPAD0"); break; case WXK_NUMPAD1: key = wxT("NUMPAD1"); break; case WXK_NUMPAD2: key = wxT("NUMPAD2"); break; case WXK_NUMPAD3: key = wxT("NUMPAD3"); break; case WXK_NUMPAD4: key = wxT("NUMPAD4"); break; case WXK_NUMPAD5: key = wxT("NUMPAD5"); break; case WXK_NUMPAD6: key = wxT("NUMPAD6"); break; case WXK_NUMPAD7: key = wxT("NUMPAD7"); break; case WXK_NUMPAD8: key = wxT("NUMPAD8"); break; case WXK_NUMPAD9: key = wxT("NUMPAD9"); break; case WXK_MULTIPLY: key = wxT("MULTIPLY"); break; case WXK_ADD: key = wxT("ADD"); break; case WXK_SEPARATOR: key = wxT("SEPARATOR"); break; case WXK_SUBTRACT: key = wxT("SUBTRACT"); break; case WXK_DECIMAL: key = wxT("DECIMAL"); break; case WXK_DIVIDE: key = wxT("DIVIDE"); break; case WXK_F1: key = wxT("F1"); break; case WXK_F2: key = wxT("F2"); break; case WXK_F3: key = wxT("F3"); break; case WXK_F4: key = wxT("F4"); break; case WXK_F5: key = wxT("F5"); break; case WXK_F6: key = wxT("F6"); break; case WXK_F7: key = wxT("F7"); break; case WXK_F8: key = wxT("F8"); break; case WXK_F9: key = wxT("F9"); break; case WXK_F10: key = wxT("F10"); break; case WXK_F11: key = wxT("F11"); break; case WXK_F12: key = wxT("F12"); break; case WXK_F13: key = wxT("F13"); break; case WXK_F14: key = wxT("F14"); break; case WXK_F15: key = wxT("F15"); break; case WXK_F16: key = wxT("F16"); break; case WXK_F17: key = wxT("F17"); break; case WXK_F18: key = wxT("F18"); break; case WXK_F19: key = wxT("F19"); break; case WXK_F20: key = wxT("F20"); break; case WXK_F21: key = wxT("F21"); break; case WXK_F22: key = wxT("F22"); break; case WXK_F23: key = wxT("F23"); break; case WXK_F24: key = wxT("F24"); break; case WXK_NUMLOCK: key = wxT("NUMLOCK"); break; case WXK_SCROLL: key = wxT("SCROLL"); break; case WXK_PAGEUP: key = wxT("PAGEUP"); break; case WXK_PAGEDOWN: key = wxT("PAGEDOWN"); break; case WXK_NUMPAD_SPACE: key = wxT("NUMPAD_SPACE"); break; case WXK_NUMPAD_TAB: key = wxT("NUMPAD_TAB"); break; case WXK_NUMPAD_ENTER: key = wxT("NUMPAD_ENTER"); break; case WXK_NUMPAD_F1: key = wxT("NUMPAD_F1"); break; case WXK_NUMPAD_F2: key = wxT("NUMPAD_F2"); break; case WXK_NUMPAD_F3: key = wxT("NUMPAD_F3"); break; case WXK_NUMPAD_F4: key = wxT("NUMPAD_F4"); break; case WXK_NUMPAD_HOME: key = wxT("NUMPAD_HOME"); break; case WXK_NUMPAD_LEFT: key = wxT("NUMPAD_LEFT"); break; case WXK_NUMPAD_UP: key = wxT("NUMPAD_UP"); break; case WXK_NUMPAD_RIGHT: key = wxT("NUMPAD_RIGHT"); break; case WXK_NUMPAD_DOWN: key = wxT("NUMPAD_DOWN"); break; case WXK_NUMPAD_PAGEUP: key = wxT("NUMPAD_PAGEUP"); break; case WXK_NUMPAD_PAGEDOWN: key = wxT("NUMPAD_PAGEDOWN"); break; case WXK_NUMPAD_END: key = wxT("NUMPAD_END"); break; case WXK_NUMPAD_BEGIN: key = wxT("NUMPAD_BEGIN"); break; case WXK_NUMPAD_INSERT: key = wxT("NUMPAD_INSERT"); break; case WXK_NUMPAD_DELETE: key = wxT("NUMPAD_DELETE"); break; case WXK_NUMPAD_EQUAL: key = wxT("NUMPAD_EQUAL"); break; case WXK_NUMPAD_MULTIPLY: key = wxT("NUMPAD_MULTIPLY"); break; case WXK_NUMPAD_ADD: key = wxT("NUMPAD_ADD"); break; case WXK_NUMPAD_SEPARATOR: key = wxT("NUMPAD_SEPARATOR"); break; case WXK_NUMPAD_SUBTRACT: key = wxT("NUMPAD_SUBTRACT"); break; case WXK_NUMPAD_DECIMAL: key = wxT("NUMPAD_DECIMAL"); break; default: { if ( keycode < 128 && wxIsprint((int)keycode) ) key.Printf(wxT("'%c'"), (char)keycode); else if ( keycode > 0 && keycode < 27 ) key.Printf(_("Ctrl-%c"), wxT('A') + keycode - 1); else key.Printf(wxT("unknown (%ld)"), keycode); } } } wxLogMessage( wxT("%s event: %s (flags = %c%c%c%c)"), name, key.c_str(), event.ControlDown() ? wxT('C') : wxT('-'), event.AltDown() ? wxT('A') : wxT('-'), event.ShiftDown() ? wxT('S') : wxT('-'), event.MetaDown() ? wxT('M') : wxT('-')); }
wxString KeyEventToKeyString(wxKeyEvent &event) { wxString newStr = wxT(""); long key = event.GetKeyCode(); if(event.ControlDown()) newStr += wxT("Ctrl+"); if(event.AltDown()) newStr += wxT("Alt+"); if(event.ShiftDown()) newStr += wxT("Shift+"); if(event.MetaDown()) { #ifdef __WXMAC__ newStr += wxT("Cmd+"); #endif } #if 0 //BG: Don't allow noncombo letters to be bound if(((!event.ControlDown() && !event.AltDown() && !event.ShiftDown()) && (key >= 33 && key <= 126)) || ((!event.ControlDown() && !event.AltDown() && event.ShiftDown()) && (key >= 33 && key <= 126))) return wxT(""); #endif if (event.ControlDown() && key >= 1 && key <= 26) newStr += (wxChar)(64 + key); else if (key >= 33 && key <= 126) newStr += (wxChar)key; else { switch(key) { case WXK_BACK: newStr += wxT("Backspace"); break; case WXK_DELETE: newStr += wxT("Delete"); break; case WXK_SPACE: newStr += wxT("Spacebar"); break; case WXK_TAB: newStr += wxT("Tab"); break; case WXK_PRIOR: newStr += wxT("PageUp"); break; case WXK_NEXT: newStr += wxT("PageDown"); break; case WXK_END: newStr += wxT("End"); break; case WXK_HOME: newStr += wxT("Home"); break; case WXK_LEFT: newStr += wxT("Left"); break; case WXK_UP: newStr += wxT("Up"); break; case WXK_RIGHT: newStr += wxT("Right"); break; case WXK_DOWN: newStr += wxT("Down"); break; case WXK_INSERT: newStr += wxT("Insert"); break; case WXK_NUMPAD0: newStr += wxT("NUMPAD0"); break; case WXK_NUMPAD1: newStr += wxT("NUMPAD1"); break; case WXK_NUMPAD2: newStr += wxT("NUMPAD2"); break; case WXK_NUMPAD3: newStr += wxT("NUMPAD3"); break; case WXK_NUMPAD4: newStr += wxT("NUMPAD4"); break; case WXK_NUMPAD5: newStr += wxT("NUMPAD5"); break; case WXK_NUMPAD6: newStr += wxT("NUMPAD6"); break; case WXK_NUMPAD7: newStr += wxT("NUMPAD7"); break; case WXK_NUMPAD8: newStr += wxT("NUMPAD8"); break; case WXK_NUMPAD9: newStr += wxT("NUMPAD9"); break; case WXK_MULTIPLY: newStr += wxT("*"); break; case WXK_ADD: newStr += wxT("+"); break; case WXK_SUBTRACT: newStr += wxT("-"); break; case WXK_DECIMAL: newStr += wxT("."); break; case WXK_DIVIDE: newStr += wxT("/"); break; case WXK_F1: newStr += wxT("F1"); break; case WXK_F2: newStr += wxT("F2"); break; case WXK_F3: newStr += wxT("F3"); break; case WXK_F4: newStr += wxT("F4"); break; case WXK_F5: newStr += wxT("F5"); break; case WXK_F6: newStr += wxT("F6"); break; case WXK_F7: newStr += wxT("F7"); break; case WXK_F8: newStr += wxT("F8"); break; case WXK_F9: newStr += wxT("F9"); break; case WXK_F10: newStr += wxT("F10"); break; case WXK_F11: newStr += wxT("F11"); break; case WXK_F12: newStr += wxT("F12"); break; case WXK_F13: newStr += wxT("F13"); break; case WXK_F14: newStr += wxT("F14"); break; case WXK_F15: newStr += wxT("F15"); break; case WXK_F16: newStr += wxT("F16"); break; case WXK_F17: newStr += wxT("F17"); break; case WXK_F18: newStr += wxT("F18"); break; case WXK_F19: newStr += wxT("F19"); break; case WXK_F20: newStr += wxT("F20"); break; case WXK_F21: newStr += wxT("F21"); break; case WXK_F22: newStr += wxT("F22"); break; case WXK_F23: newStr += wxT("F23"); break; case WXK_F24: newStr += wxT("F24"); break; case WXK_PAGEUP: newStr += wxT("PageUp"); break; case WXK_PAGEDOWN: newStr += wxT("PageDown"); break; case WXK_NUMPAD_ENTER: newStr += wxT("NUMPAD_ENTER"); break; case WXK_NUMPAD_F1: newStr += wxT("NUMPAD_F1"); break; case WXK_NUMPAD_F2: newStr += wxT("NUMPAD_F2"); break; case WXK_NUMPAD_F3: newStr += wxT("NUMPAD_F3"); break; case WXK_NUMPAD_F4: newStr += wxT("NUMPAD_F4"); break; case WXK_NUMPAD_HOME: newStr += wxT("NUMPAD_HOME"); break; case WXK_NUMPAD_LEFT: newStr += wxT("NUMPAD_LEFT"); break; case WXK_NUMPAD_UP: newStr += wxT("NUMPAD_UP"); break; case WXK_NUMPAD_RIGHT: newStr += wxT("NUMPAD_RIGHT"); break; case WXK_NUMPAD_DOWN: newStr += wxT("NUMPAD_DOWN"); break; case WXK_NUMPAD_PRIOR: newStr += wxT("NUMPAD_PAGEUP"); break; case WXK_NUMPAD_PAGEUP: newStr += wxT("NUMPAD_PAGEUP"); break; case WXK_NUMPAD_NEXT: newStr += wxT("NUMPAD_PAGEDOWN"); break; case WXK_NUMPAD_PAGEDOWN: newStr += wxT("NUMPAD_PAGEDOWN"); break; case WXK_NUMPAD_END: newStr += wxT("NUMPAD_END"); break; case WXK_NUMPAD_BEGIN: newStr += wxT("NUMPAD_HOME"); break; case WXK_NUMPAD_INSERT: newStr += wxT("NUMPAD_INSERT"); break; case WXK_NUMPAD_DELETE: newStr += wxT("NUMPAD_DELETE"); break; case WXK_NUMPAD_EQUAL: newStr += wxT("NUMPAD_EQUAL"); break; case WXK_NUMPAD_MULTIPLY: newStr += wxT("NUMPAD_MULTIPLY"); break; case WXK_NUMPAD_ADD: newStr += wxT("NUMPAD_ADD"); break; case WXK_NUMPAD_SUBTRACT: newStr += wxT("NUMPAD_SUBTRACT"); break; case WXK_NUMPAD_DECIMAL: newStr += wxT("NUMPAD_DECIMAL"); break; case WXK_NUMPAD_DIVIDE: newStr += wxT("NUMPAD_DIVIDE"); break; default: return wxT(""); // Don't do anything if we don't recognize the key } } return newStr; }
void CMuleListCtrl::OnChar(wxKeyEvent& evt) { int key = evt.GetKeyCode(); if (key == 0) { // We prefer GetKeyCode() to GetUnicodeKey(), in order to work // around a bug in the GetUnicodeKey(), that causes values to // be returned untranslated. This means for instance, that if // shift and '1' is pressed, the result is '1' rather than '!' // (as it should be on my keyboard). This has been reported: // http://sourceforge.net/tracker/index.php?func=detail&aid=1864810&group_id=9863&atid=109863 key = evt.GetUnicodeKey(); } else if (key >= WXK_START) { // wxKeycodes are ignored, as they signify events such as the 'home' // button. Unicoded chars are not checked as there is an overlap valid // chars and the wx keycodes. evt.Skip(); return; } // We wish to avoid handling shortcuts, with the exception of 'select-all'. if (evt.AltDown() || evt.ControlDown() || evt.MetaDown()) { if (evt.CmdDown() && (evt.GetKeyCode() == 0x01)) { // Ctrl+a (Command+a on Mac) was pressed, select all items for (int i = 0; i < GetItemCount(); ++i) { SetItemState(i, wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED); } } evt.Skip(); return; } else if (m_tts_time + 1500u < GetTickCount()) { m_tts_text.Clear(); } m_tts_time = GetTickCount(); m_tts_text.Append(wxTolower(key)); // May happen if the subclass does not forward deletion events. // Or rather when single-char-repeated (see below) wraps around, so don't assert. if (m_tts_item >= GetItemCount()) { m_tts_item = -1; } unsigned next = (m_tts_item == -1) ? 0 : m_tts_item; for (unsigned i = 0, count = GetItemCount(); i < count; ++i) { wxString text = GetTTSText((next + i) % count).MakeLower(); if (text.StartsWith(m_tts_text)) { ClearSelection(); m_tts_item = (next + i) % count; SetItemState(m_tts_item, wxLIST_STATE_FOCUSED | wxLIST_STATE_SELECTED, wxLIST_STATE_FOCUSED | wxLIST_STATE_SELECTED); EnsureVisible(m_tts_item); return; } } if (m_tts_item != -1) { // Crop the string so that it matches the old item (avoid typos). wxString text = GetTTSText(m_tts_item).MakeLower(); // If the last key didn't result in a hit, then we skip the event. if (!text.StartsWith(m_tts_text)) { if ((m_tts_text.Length() == 2) && (m_tts_text[0] == m_tts_text[1])) { // Special case, single-char, repeated. This allows toggeling // between items starting with a specific letter. m_tts_text.Clear(); // Increment, so the next will be selected (or wrap around). m_tts_item++; OnChar(evt); } else { m_tts_text.RemoveLast(); evt.Skip(true); } } } else { evt.Skip(true); } }
void wxListBox::OnChar(wxKeyEvent& event) { if ( event.GetKeyCode() == WXK_RETURN || event.GetKeyCode() == WXK_NUMPAD_ENTER) { wxTopLevelWindow *tlw = wxDynamicCast(wxGetTopLevelParent(this), wxTopLevelWindow); if ( tlw && tlw->GetDefaultItem() ) { wxButton *def = wxDynamicCast(tlw->GetDefaultItem(), wxButton); if ( def && def->IsEnabled() ) { wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED, def->GetId() ); event.SetEventObject(def); def->Command(event); return ; } } event.Skip() ; } /* generate wxID_CANCEL if command-. or <esc> has been pressed (typically in dialogs) */ else if (event.GetKeyCode() == WXK_ESCAPE || (event.GetKeyCode() == '.' && event.MetaDown() ) ) { // FIXME: look in ancestors, not just parent. wxWindow* win = GetParent()->FindWindow( wxID_CANCEL ) ; if (win) { wxCommandEvent new_event(wxEVT_COMMAND_BUTTON_CLICKED,wxID_CANCEL); new_event.SetEventObject( win ); win->GetEventHandler()->ProcessEvent( new_event ); } } else if ( event.GetKeyCode() == WXK_TAB ) { wxNavigationKeyEvent new_event; new_event.SetEventObject( this ); new_event.SetDirection( !event.ShiftDown() ); /* CTRL-TAB changes the (parent) window, i.e. switch notebook page */ new_event.SetWindowChange( event.ControlDown() ); new_event.SetCurrentFocus( this ); if ( !GetEventHandler()->ProcessEvent( new_event ) ) event.Skip() ; } else if ( event.GetKeyCode() == WXK_DOWN || event.GetKeyCode() == WXK_UP ) { // perform the default key handling first wxControl::OnKeyDown( event ) ; wxCommandEvent event(wxEVT_COMMAND_LISTBOX_SELECTED, m_windowId); event.SetEventObject( this ); wxArrayInt aSelections; int n, count = GetSelections(aSelections); if ( count > 0 ) { n = aSelections[0]; if ( HasClientObjectData() ) event.SetClientObject( GetClientObject(n) ); else if ( HasClientUntypedData() ) event.SetClientData( GetClientData(n) ); event.SetString(GetString(n)); } else { n = -1; } event.SetInt(n); GetEventHandler()->ProcessEvent(event); } else { if ( event.GetTimestamp() > m_lastTypeIn + 60 ) { m_typeIn = wxEmptyString ; } m_lastTypeIn = event.GetTimestamp() ; m_typeIn += (char) event.GetKeyCode() ; int line = FindString(wxT("*")+m_typeIn+wxT("*")) ; if ( line >= 0 ) { if ( GetSelection() != line ) { SetSelection(line) ; wxCommandEvent event(wxEVT_COMMAND_LISTBOX_SELECTED, m_windowId); event.SetEventObject( this ); if ( HasClientObjectData() ) event.SetClientObject( GetClientObject( line ) ); else if ( HasClientUntypedData() ) event.SetClientData( GetClientData(line) ); event.SetString(GetString(line)); event.SetInt(line); GetEventHandler()->ProcessEvent(event); } } } }