switching to native focus handling

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@26732 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Stefan Csomor 2004-04-13 05:25:54 +00:00
parent 92a7272fdb
commit f1d527c1ad

View File

@ -66,7 +66,6 @@
#include <string.h>
extern wxList wxPendingDelete;
wxWindowMac* gFocusWindow = NULL ;
#ifdef __WXUNIVERSAL__
IMPLEMENT_ABSTRACT_CLASS(wxWindowMac, wxWindowBase)
@ -82,7 +81,7 @@ BEGIN_EVENT_TABLE(wxWindowMac, wxWindowBase)
// TODO EVT_PAINT(wxWindowMac::OnPaint)
EVT_SYS_COLOUR_CHANGED(wxWindowMac::OnSysColourChanged)
EVT_INIT_DIALOG(wxWindowMac::OnInitDialog)
EVT_SET_FOCUS(wxWindowMac::OnSetFocus)
// EVT_SET_FOCUS(wxWindowMac::OnSetFocus)
EVT_MOUSE_EVENTS(wxWindowMac::OnMouseEvent)
END_EVENT_TABLE()
@ -102,25 +101,27 @@ END_EVENT_TABLE()
extern long wxMacTranslateKey(unsigned char key, unsigned char code) ;
pascal OSStatus wxMacSetupControlBackground( ControlRef iControl , SInt16 iMessage , SInt16 iDepth , Boolean iIsColor ) ;
#if MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_3
#if TARGET_API_MAC_OSX
#if MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_3
enum {
kEventControlVisibilityChanged = 157
};
#endif
#endif
static const EventTypeSpec eventList[] =
{
{ kEventClassControl , kEventControlHit } ,
#if TARGET_API_MAC_OSX
{ kEventClassControl , kEventControlDraw } ,
{ kEventClassControl , kEventControlVisibilityChanged } ,
{ kEventClassControl , kEventControlEnabledStateChanged } ,
{ kEventClassControl , kEventControlHiliteChanged } ,
{ kEventClassControl , kEventControlSetFocusPart } ,
// { kEventClassControl , kEventControlInvalidateForSizeChange } , // 10.3 only
// { kEventClassControl , kEventControlBoundsChanged } ,
{}
#else
{}
#endif
} ;
@ -137,6 +138,7 @@ static pascal OSStatus wxMacWindowControlEventHandler( EventHandlerCallRef handl
switch( GetEventKind( event ) )
{
#if TARGET_API_MAC_OSX
case kEventControlDraw :
{
RgnHandle updateRgn = NULL ;
@ -184,6 +186,50 @@ static pascal OSStatus wxMacWindowControlEventHandler( EventHandlerCallRef handl
case kEventControlHiliteChanged :
thisWindow->MacHiliteChanged() ;
break ;
case kEventControlSetFocusPart :
{
Boolean focusEverything = false ;
ControlPartCode controlPart = cEvent.GetParameter<ControlPartCode>(kEventParamControlPart , typeControlPartCode );
if ( cEvent.GetParameter<Boolean>(kEventParamControlFocusEverything , &focusEverything ) == noErr )
{
}
if ( controlPart == kControlFocusNoPart )
{
#if wxUSE_CARET
if ( thisWindow->GetCaret() )
{
thisWindow->GetCaret()->OnKillFocus();
}
#endif // wxUSE_CARET
wxFocusEvent event(wxEVT_KILL_FOCUS, thisWindow->GetId());
event.SetEventObject(thisWindow);
thisWindow->GetEventHandler()->ProcessEvent(event) ;
}
else
{
// panel wants to track the window which was the last to have focus in it
wxChildFocusEvent eventFocus(thisWindow);
thisWindow->GetEventHandler()->ProcessEvent(eventFocus);
#if wxUSE_CARET
if ( thisWindow->GetCaret() )
{
thisWindow->GetCaret()->OnSetFocus();
}
#endif // wxUSE_CARET
wxFocusEvent event(wxEVT_SET_FOCUS, thisWindow->GetId());
event.SetEventObject(thisWindow);
thisWindow->GetEventHandler()->ProcessEvent(event) ;
}
}
break ;
#endif
case kEventControlHit :
{
result = thisWindow->MacControlHit( handler , event ) ;
}
break ;
default :
break ;
}
@ -521,11 +567,6 @@ wxWindowMac::~wxWindowMac()
frame->SetLastFocus( NULL ) ;
}
if ( gFocusWindow == this )
{
gFocusWindow = NULL ;
}
DestroyChildren();
// delete our drop target if we've got one
@ -790,73 +831,59 @@ bool wxWindowMac::SetBackgroundColour(const wxColour& col )
bool wxWindowMac::MacCanFocus() const
{
wxASSERT( m_macControl != NULL ) ;
return true ;
#if 0
// there is currently no way to determinate whether the window is running in full keyboard
// access mode, therefore we cannot rely on these features yet
UInt32 features = 0 ;
GetControlFeatures( (ControlRef) m_macControl , &features ) ;
return features & ( kControlSupportsFocus | kControlGetsFocusOnClick ) ;
#endif
return true ;
}
void wxWindowMac::SetFocus()
{
if ( gFocusWindow == this )
return ;
if ( AcceptsFocus() )
{
if (gFocusWindow )
{
#if wxUSE_CARET
// Deal with caret
if ( gFocusWindow->m_caret )
{
gFocusWindow->m_caret->OnKillFocus();
}
#endif // wxUSE_CARET
#ifndef __WXUNIVERSAL__
wxWindow* control = wxDynamicCast( gFocusWindow , wxWindow ) ;
// TODO we must use the built-in focusing
if ( control && control->GetHandle() /* && control->MacIsReallyShown() */ )
{
UMASetKeyboardFocus( (WindowRef) gFocusWindow->MacGetTopLevelWindowRef() , (ControlRef) control->GetHandle() , kControlFocusNoPart ) ;
control->MacRedrawControl() ;
}
#if !TARGET_API_MAC_OSX
wxWindow* former = FindFocus() ;
#endif
// Without testing the window id, for some reason
// a kill focus event can still be sent to
// the control just being focussed.
int thisId = this->m_windowId;
int gFocusWindowId = gFocusWindow->m_windowId;
if (gFocusWindowId != thisId)
{
wxFocusEvent event(wxEVT_KILL_FOCUS, gFocusWindow->m_windowId);
event.SetEventObject(gFocusWindow);
gFocusWindow->GetEventHandler()->ProcessEvent(event) ;
}
}
gFocusWindow = this ;
{
#if wxUSE_CARET
// Deal with caret
if ( m_caret )
{
m_caret->OnSetFocus();
}
#endif // wxUSE_CARET
// panel wants to track the window which was the last to have focus in it
wxChildFocusEvent eventFocus(this);
GetEventHandler()->ProcessEvent(eventFocus);
OSStatus err = SetKeyboardFocus( (WindowRef) MacGetTopLevelWindowRef() , (ControlRef) GetHandle() , kControlFocusNextPart ) ;
// as we cannot rely on the control features to find out whether we are in full keyboard mode, we can only
// leave in case of an error
if ( err == errCouldntSetFocus )
return ;
#ifndef __WXUNIVERSAL__
wxControl* control = wxDynamicCast( gFocusWindow , wxControl ) ;
if ( control && control->GetHandle() )
{
UMASetKeyboardFocus( (WindowRef) gFocusWindow->MacGetTopLevelWindowRef() , (ControlRef) control->GetHandle() , kControlFocusNextPart ) ;
}
#endif
wxFocusEvent event(wxEVT_SET_FOCUS, m_windowId);
event.SetEventObject(this);
GetEventHandler()->ProcessEvent(event) ;
#if !TARGET_API_MAC_OSX
// emulate carbon events when running under carbonlib where they are not natively available
if ( former )
{
EventRef evRef = NULL ;
verify_noerr( MacCreateEvent( NULL , kEventClassControl , kEventControlSetFocusPart , TicksToEventTime( TickCount() ) , kEventAttributeUserEvent ,
&evRef ) );
wxMacCarbonEvent cEvent( evRef ) ;
cEvent.SetParameter<ControlRef>( kEventParamDirectObject , (ControlRef) former->GetHandle() ) ;
cEvent.SetParameter<ControlPartCode>(kEventParamControlPart , typeControlPartCode , kControlFocusNoPart ) ;
wxMacWindowEventHandler( NULL , evRef , former ) ;
ReleaseEvent(evRef) ;
}
// send new focus event
{
EventRef evRef = NULL ;
verify_noerr( MacCreateEvent( NULL , kEventClassControl , kEventControlSetFocusPart , TicksToEventTime( TickCount() ) , kEventAttributeUserEvent ,
&evRef ) );
wxMacCarbonEvent cEvent( evRef ) ;
cEvent.SetParameter<ControlRef>( kEventParamDirectObject , (ControlRef) GetHandle() ) ;
cEvent.SetParameter<ControlPartCode>(kEventParamControlPart , typeControlPartCode , kControlFocusNextPart ) ;
wxMacWindowEventHandler( NULL , evRef , this ) ;
ReleaseEvent(evRef) ;
}
#endif
}
}
@ -2261,7 +2288,9 @@ void wxWindowMac::MacOnScroll(wxScrollEvent &event )
// Get the window with the focus
wxWindowMac *wxWindowBase::FindFocus()
{
return gFocusWindow ;
ControlRef control ;
GetKeyboardFocus( GetUserFocusWindow() , &control ) ;
return wxFindControlFromMacControl( control ) ;
}
void wxWindowMac::OnSetFocus(wxFocusEvent& event)
@ -2765,62 +2794,6 @@ void wxWindowMac::OnMouseEvent( wxMouseEvent &event )
if ( ! GetEventHandler()->ProcessEvent(evtCtx) )
event.Skip() ;
}
else if (event.GetEventType() == wxEVT_LEFT_DOWN || event.GetEventType() == wxEVT_LEFT_DCLICK )
{
int x = event.m_x ;
int y = event.m_y ;
if ( MacGetTopLevelWindow()->MacUsesCompositing() == false )
{
// OS Needs it in tlw content area coordinates
MacClientToRootWindow( &x , &y ) ;
}
else
{
// OS Needs it in window not client coordinates
wxPoint origin = GetClientAreaOrigin() ;
x += origin.x ;
y += origin.y ;
}
Point localwhere ;
SInt16 controlpart ;
localwhere.h = x ;
localwhere.v = y ;
short modifiers = 0;
if ( !event.m_leftDown && !event.m_rightDown )
modifiers |= btnState ;
if ( event.m_shiftDown )
modifiers |= shiftKey ;
if ( event.m_controlDown )
modifiers |= controlKey ;
if ( event.m_altDown )
modifiers |= optionKey ;
if ( event.m_metaDown )
modifiers |= cmdKey ;
bool handled = false ;
if ( ::IsControlActive( (ControlRef) m_macControl ) )
{
controlpart = ::HandleControlClick( (ControlRef) m_macControl , localwhere , modifiers , (ControlActionUPP) -1 ) ;
wxTheApp->s_lastMouseDown = 0 ;
if ( controlpart != kControlNoPart )
{
MacHandleControlClick((WXWidget) (ControlRef) m_macControl , controlpart , false /* mouse not down anymore */ ) ;
handled = true ;
}
}
if ( !handled )
event.Skip() ;
}
else
{
event.Skip() ;
@ -2829,7 +2802,6 @@ void wxWindowMac::OnMouseEvent( wxMouseEvent &event )
void wxWindowMac::MacHandleControlClick( WXWidget control , wxInt16 controlpart , bool WXUNUSED( mouseStillDown ) )
{
wxASSERT_MSG( (ControlRef) m_macControl != NULL , wxT("No valid mac control") ) ;
}
Rect wxMacGetBoundsForControl( wxWindow* window , const wxPoint& pos , const wxSize &size , bool adjustForOrigin )
@ -2841,4 +2813,9 @@ Rect wxMacGetBoundsForControl( wxWindow* window , const wxPoint& pos , const wxS
return bounds ;
}
wxInt32 wxWindowMac::MacControlHit(WXEVENTHANDLERREF WXUNUSED(handler) , WXEVENTREF WXUNUSED(event) )
{
return eventNotHandledErr ;
}