Tab navigation improvements for wxOSX
Closes https://github.com/wxWidgets/wxWidgets/pull/493
This commit is contained in:
@@ -279,6 +279,45 @@ NSView* wxMacEditHelper::ms_viewCurrentlyEdited = nil;
|
||||
handled = YES;
|
||||
}
|
||||
}
|
||||
else if (wxpeer->GetWindowStyle() & wxTE_PASSWORD)
|
||||
{
|
||||
// Make TAB and ESCAPE work on password fields. The general fix done in wxWidgetCocoaImpl::DoHandleKeyEvent()
|
||||
// does not help for password fields because wxWidgetCocoaImpl::keyEvent() is not executed
|
||||
// when TAB is pressed, only when it is released.
|
||||
wxKeyEvent wxevent(wxEVT_KEY_DOWN);
|
||||
if (commandSelector == @selector(insertTab:))
|
||||
{
|
||||
wxevent.m_keyCode = WXK_TAB;
|
||||
}
|
||||
else if (commandSelector == @selector(insertBacktab:))
|
||||
{
|
||||
wxevent.m_keyCode = WXK_TAB;
|
||||
wxevent.SetShiftDown(true);
|
||||
}
|
||||
else if (commandSelector == @selector(selectNextKeyView:))
|
||||
{
|
||||
wxevent.m_keyCode = WXK_TAB;
|
||||
wxevent.SetRawControlDown(true);
|
||||
}
|
||||
else if (commandSelector == @selector(selectPreviousKeyView:))
|
||||
{
|
||||
wxevent.m_keyCode = WXK_TAB;
|
||||
wxevent.SetShiftDown(true);
|
||||
wxevent.SetRawControlDown(true);
|
||||
}
|
||||
else if (commandSelector == @selector(cancelOperation:))
|
||||
{
|
||||
wxevent.m_keyCode = WXK_ESCAPE;
|
||||
}
|
||||
if (wxevent.GetKeyCode() != WXK_NONE)
|
||||
{
|
||||
wxKeyEvent eventHook(wxEVT_CHAR_HOOK, wxevent);
|
||||
if (wxpeer->OSXHandleKeyEvent(eventHook) && !eventHook.IsNextEventAllowed())
|
||||
handled = YES;
|
||||
else if (impl->DoHandleKeyNavigation(wxevent))
|
||||
handled = YES;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -649,6 +688,15 @@ NSView* wxMacEditHelper::ms_viewCurrentlyEdited = nil;
|
||||
}
|
||||
@end
|
||||
|
||||
|
||||
bool wxNSTextBase::ShouldHandleKeyNavigation(const wxKeyEvent &event) const
|
||||
{
|
||||
// Text controls must be allowed to handle the key even if wxWANTS_CHARS is not set, provided wxTE_PROCESS_TAB
|
||||
// is set. To make Shift+TAB work with text controls we must process it here regardless of wxTE_PROCESS_TAB.
|
||||
// For Ctrl(+Shift)+TAB to work as navigation key consistently in all types of text fields we must process it here as well.
|
||||
return (!m_wxPeer->HasFlag(wxTE_PROCESS_TAB) || event.HasAnyModifiers());
|
||||
}
|
||||
|
||||
// wxNSTextViewControl
|
||||
|
||||
// Official Apple docs suggest to use FLT_MAX when embedding an NSTextView
|
||||
@@ -659,8 +707,7 @@ NSView* wxMacEditHelper::ms_viewCurrentlyEdited = nil;
|
||||
#define MAX_WIDTH 1000000
|
||||
|
||||
wxNSTextViewControl::wxNSTextViewControl( wxTextCtrl *wxPeer, WXWidget w, long style )
|
||||
: wxWidgetCocoaImpl(wxPeer, w),
|
||||
wxTextWidgetImpl(wxPeer)
|
||||
: wxNSTextBase(wxPeer, w)
|
||||
{
|
||||
wxNSTextScrollView* sv = (wxNSTextScrollView*) w;
|
||||
m_scrollView = sv;
|
||||
@@ -966,8 +1013,7 @@ wxSize wxNSTextViewControl::GetBestSize() const
|
||||
// wxNSTextFieldControl
|
||||
|
||||
wxNSTextFieldControl::wxNSTextFieldControl( wxTextCtrl *text, WXWidget w )
|
||||
: wxWidgetCocoaImpl(text, w),
|
||||
wxTextWidgetImpl(text)
|
||||
: wxNSTextBase(text, w)
|
||||
{
|
||||
Init(w);
|
||||
}
|
||||
@@ -975,8 +1021,7 @@ wxNSTextFieldControl::wxNSTextFieldControl( wxTextCtrl *text, WXWidget w )
|
||||
wxNSTextFieldControl::wxNSTextFieldControl(wxWindow *wxPeer,
|
||||
wxTextEntry *entry,
|
||||
WXWidget w)
|
||||
: wxWidgetCocoaImpl(wxPeer, w),
|
||||
wxTextWidgetImpl(entry)
|
||||
: wxNSTextBase(wxPeer, entry, w)
|
||||
{
|
||||
Init(w);
|
||||
}
|
||||
|
Reference in New Issue
Block a user