Merge branch 'osx-dataview-native-key'
Implement wxEVT_CHAR generation for wxDataViewCtrl under Mac. Closes https://github.com/wxWidgets/wxWidgets/pull/2324
This commit is contained in:
@@ -573,6 +573,9 @@ public:
|
||||
|
||||
virtual void SetFont(const wxFont& font) wxOVERRIDE;
|
||||
|
||||
virtual void keyEvent(WX_NSEvent event, WXWidget slf, void* _cmd) wxOVERRIDE;
|
||||
virtual bool doCommandBySelector(void* sel, WXWidget slf, void* _cmd) wxOVERRIDE;
|
||||
|
||||
private:
|
||||
void InitOutlineView(long style);
|
||||
int GetDefaultRowHeight() const;
|
||||
|
@@ -199,7 +199,8 @@ public :
|
||||
virtual void cursorUpdate(WX_NSEvent event, WXWidget slf, void* _cmd);
|
||||
virtual void keyEvent(WX_NSEvent event, WXWidget slf, void* _cmd);
|
||||
virtual void insertText(NSString* text, WXWidget slf, void* _cmd);
|
||||
virtual void doCommandBySelector(void* sel, WXWidget slf, void* _cmd);
|
||||
// Returns true if the event was processed by a user-defined event handler.
|
||||
virtual bool doCommandBySelector(void* sel, WXWidget slf, void* _cmd);
|
||||
virtual bool acceptsFirstResponder(WXWidget slf, void* _cmd);
|
||||
virtual bool becomeFirstResponder(WXWidget slf, void* _cmd);
|
||||
virtual bool resignFirstResponder(WXWidget slf, void* _cmd);
|
||||
|
@@ -284,7 +284,6 @@ protected:
|
||||
|
||||
// event handling
|
||||
void OnSize(wxSizeEvent &event);
|
||||
void OnMouse(wxMouseEvent &event);
|
||||
|
||||
private:
|
||||
// initializing of local variables:
|
||||
|
@@ -1632,6 +1632,16 @@ outlineView:(NSOutlineView*)outlineView
|
||||
// ============================================================================
|
||||
@implementation wxCocoaOutlineView
|
||||
|
||||
+ (void)initialize
|
||||
{
|
||||
static BOOL initialized = NO;
|
||||
if (!initialized)
|
||||
{
|
||||
initialized = YES;
|
||||
wxOSXCocoaClassAddWXMethods( self );
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// initializers / destructor
|
||||
//
|
||||
@@ -1723,20 +1733,15 @@ outlineView:(NSOutlineView*)outlineView
|
||||
// Default enter key behaviour is to begin cell editing. Subclass keyDown to
|
||||
// provide a keyboard wxEVT_DATAVIEW_ITEM_ACTIVATED event and allow the NSEvent
|
||||
// to pass if the wxEvent is not processed.
|
||||
- (void)keyDown:(NSEvent *)event
|
||||
|
||||
// catch events routed here and feed them back before things get routed up the responder chain
|
||||
// otherwise we lose functionality like arrow keys etc.
|
||||
- (void)doCommandBySelector:(SEL)aSelector
|
||||
{
|
||||
if( [[event charactersIgnoringModifiers]
|
||||
characterAtIndex: 0] == NSCarriageReturnCharacter )
|
||||
wxWidgetCocoaImpl* impl = (wxWidgetCocoaImpl* ) wxWidgetImpl::FindFromWXWidget( self );
|
||||
if (impl)
|
||||
{
|
||||
wxDataViewCtrl* const dvc = implementation->GetDataViewCtrl();
|
||||
const wxDataViewItem item = wxDataViewItem( [[self itemAtRow:[self selectedRow]] pointer]);
|
||||
wxDataViewEvent eventDV(wxEVT_DATAVIEW_ITEM_ACTIVATED, dvc, item);
|
||||
if ( !dvc->GetEventHandler()->ProcessEvent(eventDV) )
|
||||
[super keyDown:event];
|
||||
}
|
||||
else
|
||||
{
|
||||
[super keyDown:event]; // all other keys
|
||||
impl->doCommandBySelector(aSelector, self, _cmd);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2082,7 +2087,8 @@ wxCocoaDataViewControl::wxCocoaDataViewControl(wxWindow* peer,
|
||||
: wxWidgetCocoaImpl
|
||||
(
|
||||
peer,
|
||||
[[NSScrollView alloc] initWithFrame:wxOSXGetFrameForControl(peer,pos,size)]
|
||||
[[NSScrollView alloc] initWithFrame:wxOSXGetFrameForControl(peer,pos,size)],
|
||||
wxWidgetImpl::Widget_UserKeyEvents
|
||||
),
|
||||
m_DataSource(NULL),
|
||||
m_OutlineView([[wxCocoaOutlineView alloc] init]),
|
||||
@@ -2130,6 +2136,37 @@ wxCocoaDataViewControl::~wxCocoaDataViewControl()
|
||||
[m_OutlineView release];
|
||||
}
|
||||
|
||||
void wxCocoaDataViewControl::keyEvent(WX_NSEvent event, WXWidget slf, void *_cmd)
|
||||
{
|
||||
if( [event type] == NSKeyDown && [[event charactersIgnoringModifiers]
|
||||
characterAtIndex: 0] == NSCarriageReturnCharacter )
|
||||
{
|
||||
wxDataViewCtrl* const dvc = GetDataViewCtrl();
|
||||
const wxDataViewItem item = wxDataViewItem( [[m_OutlineView itemAtRow:[m_OutlineView selectedRow]] pointer]);
|
||||
wxDataViewEvent eventDV(wxEVT_DATAVIEW_ITEM_ACTIVATED, dvc, item);
|
||||
if ( !dvc->GetEventHandler()->ProcessEvent(eventDV) )
|
||||
wxWidgetCocoaImpl::keyEvent(event, slf, _cmd);
|
||||
}
|
||||
else
|
||||
{
|
||||
wxWidgetCocoaImpl::keyEvent(event, slf, _cmd); // all other keys
|
||||
}
|
||||
}
|
||||
|
||||
bool wxCocoaDataViewControl::doCommandBySelector(void* sel, WXWidget slf, void* _cmd)
|
||||
{
|
||||
bool handled = wxWidgetCocoaImpl::doCommandBySelector(sel, slf, _cmd);
|
||||
// if this special key has not been handled
|
||||
if ( !handled && IsInNativeKeyDown() )
|
||||
{
|
||||
// send the original key event back to the native implementation to get proper default handling like eg for arrow keys
|
||||
wxOSX_EventHandlerPtr superimpl = (wxOSX_EventHandlerPtr) [[slf superclass] instanceMethodForSelector:@selector(keyDown:)];
|
||||
superimpl(slf, @selector(keyDown:), GetLastNativeKeyDownEvent());
|
||||
}
|
||||
return handled;
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// column related methods (inherited from wxDataViewWidgetImpl)
|
||||
//
|
||||
|
@@ -2145,7 +2145,7 @@ void wxWidgetCocoaImpl::insertText(NSString* text, WXWidget slf, void *_cmd)
|
||||
}
|
||||
}
|
||||
|
||||
void wxWidgetCocoaImpl::doCommandBySelector(void* sel, WXWidget slf, void* WXUNUSED(_cmd))
|
||||
bool wxWidgetCocoaImpl::doCommandBySelector(void* sel, WXWidget slf, void* WXUNUSED(_cmd))
|
||||
{
|
||||
wxLogTrace(TRACE_KEYS, "Selector %s for %s",
|
||||
wxDumpSelector((SEL)sel), wxDumpNSView(slf));
|
||||
@@ -2156,22 +2156,24 @@ void wxWidgetCocoaImpl::doCommandBySelector(void* sel, WXWidget slf, void* WXUNU
|
||||
// execute and move back in history, since this results in two commands, Ctrl-O was sent twice as a wx key down event.
|
||||
// we now track the sending of the events to avoid duplicates.
|
||||
|
||||
bool handled = false;
|
||||
|
||||
if ( IsInNativeKeyDown() && !WasKeyDownSent())
|
||||
{
|
||||
// If we have a corresponding key event, send wxEVT_KEY_DOWN now.
|
||||
// (see also: wxWidgetCocoaImpl::DoHandleKeyEvent)
|
||||
wxKeyEvent wxevent(wxEVT_KEY_DOWN);
|
||||
SetupKeyEvent( wxevent, GetLastNativeKeyDownEvent() );
|
||||
bool result = GetWXPeer()->OSXHandleKeyEvent(wxevent);
|
||||
handled = GetWXPeer()->OSXHandleKeyEvent(wxevent);
|
||||
|
||||
if (!result)
|
||||
if (!handled)
|
||||
{
|
||||
// Generate wxEVT_CHAR if wxEVT_KEY_DOWN is not handled.
|
||||
|
||||
wxKeyEvent wxevent2(wxevent) ;
|
||||
wxevent2.SetEventType(wxEVT_CHAR);
|
||||
SetupKeyEvent( wxevent2, GetLastNativeKeyDownEvent() );
|
||||
GetWXPeer()->OSXHandleKeyEvent(wxevent2);
|
||||
handled = GetWXPeer()->OSXHandleKeyEvent(wxevent2);
|
||||
}
|
||||
SetKeyDownSent();
|
||||
}
|
||||
@@ -2179,6 +2181,8 @@ void wxWidgetCocoaImpl::doCommandBySelector(void* sel, WXWidget slf, void* WXUNU
|
||||
{
|
||||
wxLogTrace(TRACE_KEYS, "Doing nothing in doCommandBySelector:");
|
||||
}
|
||||
|
||||
return handled;
|
||||
}
|
||||
|
||||
bool wxWidgetCocoaImpl::acceptsFirstResponder(WXWidget slf, void *_cmd)
|
||||
|
@@ -765,16 +765,10 @@ wxSize wxDataViewCtrl::DoGetBestSize() const
|
||||
return best;
|
||||
}
|
||||
|
||||
void wxDataViewCtrl::OnMouse(wxMouseEvent& event)
|
||||
{
|
||||
event.Skip();
|
||||
}
|
||||
|
||||
wxIMPLEMENT_DYNAMIC_CLASS(wxDataViewCtrl,wxDataViewCtrlBase);
|
||||
|
||||
wxBEGIN_EVENT_TABLE(wxDataViewCtrl,wxDataViewCtrlBase)
|
||||
EVT_SIZE(wxDataViewCtrl::OnSize)
|
||||
EVT_MOTION(wxDataViewCtrl::OnMouse)
|
||||
wxEND_EVENT_TABLE()
|
||||
|
||||
#endif // !wxHAS_GENERIC_DATAVIEWCTRL
|
||||
|
Reference in New Issue
Block a user