- Added long version field to wxAboutDialogInfo (Jeff Tupper).
- Added wxWindow::CanScroll() behaving like the old HasScrollbar() and made
HasScrollbar() really check for the scrollbar existence.
+- Added wxKeyEvent::IsKeyInCategory() (Jeff Tupper).
GTK:
wxEVT_HOTKEY
*/
+// key categories: the bit flags for IsKeyInCategory() function
+//
+// the enum values used may change in future version of wx
+// use the named constants only, or bitwise combinations thereof
+enum wxKeyCategoryFlags
+{
+ // arrow keys, on and off numeric keypads
+ WXK_CATEGORY_ARROW = 1,
+
+ // page up and page down keys, on and off numeric keypads
+ WXK_CATEGORY_PAGING = 2,
+
+ // home and end keys, on and off numeric keypads
+ WXK_CATEGORY_JUMP = 4,
+
+ // tab key
+ WXK_CATEGORY_TAB = 8,
+
+ // backspace and delete keys, on and off numeric keypads
+ WXK_CATEGORY_CUT = 16,
+
+ // all keys usually used for navigation
+ WXK_CATEGORY_NAVIGATION = WXK_CATEGORY_ARROW |
+ WXK_CATEGORY_PAGING |
+ WXK_CATEGORY_JUMP
+};
+
class WXDLLIMPEXP_CORE wxKeyEvent : public wxEvent,
public wxKeyboardState
{
// get the key code: an ASCII7 char or an element of wxKeyCode enum
int GetKeyCode() const { return (int)m_keyCode; }
+ // returns true iff this event's key code is of a certain type
+ bool IsKeyInCategory(int category) const;
+
#if wxUSE_UNICODE
// get the Unicode character corresponding to this key
wxChar GetUnicodeKey() const { return m_uniChar; }
};
+/**
+ Flags for categories of keys.
+
+ These values are used by wxKeyEvent::IsKeyInCategory(). They may be
+ combined via the bitwise operators |, &, and ~.
+
+ @since 2.9.1
+*/
+enum wxKeyCategoryFlags
+{
+ /// arrow keys, on and off numeric keypads
+ WXK_CATEGORY_ARROW,
+
+ /// page up and page down keys, on and off numeric keypads
+ WXK_CATEGORY_PAGING,
+
+ /// home and end keys, on and off numeric keypads
+ WXK_CATEGORY_JUMP,
+
+ /// tab key
+ WXK_CATEGORY_TAB,
+
+ /// backspace and delete keys, on and off numeric keypads
+ WXK_CATEGORY_CUT,
+
+ /// union of WXK_CATEGORY_ARROW, WXK_CATEGORY_PAGING, and WXK_CATEGORY_JUMP categories
+ WXK_CATEGORY_NAVIGATION
+};
+
+
/**
@class wxKeyEvent
*/
int GetKeyCode() const;
+ /**
+ Returns true if the key is in the given key category.
+
+ @param category
+ A bitwise combination of named ::wxKeyCategoryFlags constants.
+
+ @since 2.9.1
+ */
+ bool IsKeyInCategory(int category) const;
+
//@{
/**
Obtains the position (in client coordinates) at which the key was pressed.
#endif
}
+bool wxKeyEvent::IsKeyInCategory(int category) const
+{
+ switch ( GetKeyCode() )
+ {
+ case WXK_LEFT:
+ case WXK_RIGHT:
+ case WXK_UP:
+ case WXK_DOWN:
+ case WXK_NUMPAD_LEFT:
+ case WXK_NUMPAD_RIGHT:
+ case WXK_NUMPAD_UP:
+ case WXK_NUMPAD_DOWN:
+ return (category & WXK_CATEGORY_ARROW) != 0;
+
+ case WXK_PAGEDOWN:
+ case WXK_END:
+ case WXK_NUMPAD_PAGEUP:
+ case WXK_NUMPAD_PAGEDOWN:
+ return (category & WXK_CATEGORY_PAGING) != 0;
+
+ case WXK_HOME:
+ case WXK_PAGEUP:
+ case WXK_NUMPAD_HOME:
+ case WXK_NUMPAD_END:
+ return (category & WXK_CATEGORY_JUMP) != 0;
+
+ case WXK_TAB:
+ return (category & WXK_CATEGORY_TAB) != 0;
+
+ case WXK_BACK:
+ case WXK_DELETE:
+ case WXK_NUMPAD_DELETE:
+ return (category & WXK_CATEGORY_CUT) != 0;
+
+ default:
+ return false;
+ }
+}
+
// ----------------------------------------------------------------------------
// wxWindowCreateEvent
// ----------------------------------------------------------------------------
return ;
}
- if ( !IsEditable() && key != WXK_LEFT && key != WXK_RIGHT && key != WXK_DOWN && key != WXK_UP && key != WXK_TAB &&
+ if ( !IsEditable() && !event.IsKeyInCategory(WXK_CATEGORY_ARROW | WXK_CATEGORY_TAB) &&
!( key == WXK_RETURN && ( (m_windowStyle & wxTE_PROCESS_ENTER) || (m_windowStyle & wxTE_MULTILINE) ) )
// && key != WXK_PAGEUP && key != WXK_PAGEDOWN && key != WXK_HOME && key != WXK_END
)
// allow navigation and deletion
GetSelection( &from, &to );
if ( !IsMultiLine() && m_maxLength && GetValue().length() >= m_maxLength &&
- key != WXK_LEFT && key != WXK_RIGHT && key != WXK_TAB && key != WXK_UP && key != WXK_DOWN &&
- key != WXK_BACK && key != WXK_DELETE && !( key == WXK_RETURN && (m_windowStyle & wxTE_PROCESS_ENTER) ) &&
+ !event.IsKeyInCategory(WXK_CATEGORY_ARROW | WXK_CATEGORY_TAB | WXK_CATEGORY_CUT) &&
+ !( key == WXK_RETURN && (m_windowStyle & wxTE_PROCESS_ENTER) ) &&
from == to )
{
// eat it, we don't want to add more than allowed # of characters
if (event.GetEventType() == wxEVT_KEY_DOWN)
{
- if (event.GetKeyCode() == WXK_LEFT ||
- event.GetKeyCode() == WXK_RIGHT ||
- event.GetKeyCode() == WXK_UP ||
- event.GetKeyCode() == WXK_DOWN ||
- event.GetKeyCode() == WXK_HOME ||
- event.GetKeyCode() == WXK_PAGEUP ||
- event.GetKeyCode() == WXK_PAGEDOWN ||
- event.GetKeyCode() == WXK_END ||
-
- event.GetKeyCode() == WXK_NUMPAD_LEFT ||
- event.GetKeyCode() == WXK_NUMPAD_RIGHT ||
- event.GetKeyCode() == WXK_NUMPAD_UP ||
- event.GetKeyCode() == WXK_NUMPAD_DOWN ||
- event.GetKeyCode() == WXK_NUMPAD_HOME ||
- event.GetKeyCode() == WXK_NUMPAD_PAGEUP ||
- event.GetKeyCode() == WXK_NUMPAD_PAGEDOWN ||
- event.GetKeyCode() == WXK_NUMPAD_END)
+ if (event.IsKeyInCategory(WXK_CATEGORY_NAVIGATION))
{
KeyboardNavigate(event.GetKeyCode(), flags);
return;