X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c2697b8719a354c03b333df1466c9d28d4c8ab51..7f1de2b26e841b21110dadf3b9f2d543703eaf45:/src/mac/carbon/window.cpp diff --git a/src/mac/carbon/window.cpp b/src/mac/carbon/window.cpp index e597c4acdd..7f8c55e784 100644 --- a/src/mac/carbon/window.cpp +++ b/src/mac/carbon/window.cpp @@ -35,6 +35,7 @@ #include "wx/spinctrl.h" #include "wx/log.h" #include "wx/geometry.h" +#include "wx/textctrl.h" #include "wx/toolbar.h" #include "wx/dc.h" @@ -51,6 +52,8 @@ #ifndef __DARWIN__ #include #include +#include +#include #endif #if TARGET_API_MAC_OSX @@ -66,7 +69,6 @@ #include extern wxList wxPendingDelete; -wxWindowMac* gFocusWindow = NULL ; #ifdef __WXUNIVERSAL__ IMPLEMENT_ABSTRACT_CLASS(wxWindowMac, wxWindowBase) @@ -82,7 +84,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 +104,32 @@ END_EVENT_TABLE() extern long wxMacTranslateKey(unsigned char key, unsigned char code) ; pascal OSStatus wxMacSetupControlBackground( ControlRef iControl , SInt16 iMessage , SInt16 iDepth , Boolean iIsColor ) ; -#ifndef 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 , kEventControlInvalidateForSizeChange } , // 10.3 only + { kEventClassControl , kEventControlSetFocusPart } , + + { kEventClassService , kEventServiceGetTypes }, + { kEventClassService , kEventServiceCopy }, + { kEventClassService , kEventServicePaste }, + + // { kEventClassControl , kEventControlInvalidateForSizeChange } , // 10.3 only // { kEventClassControl , kEventControlBoundsChanged } , - - {} -#else - {} #endif } ; @@ -137,6 +146,7 @@ static pascal OSStatus wxMacWindowControlEventHandler( EventHandlerCallRef handl switch( GetEventKind( event ) ) { +#if TARGET_API_MAC_OSX case kEventControlDraw : { RgnHandle updateRgn = NULL ; @@ -146,29 +156,33 @@ static pascal OSStatus wxMacWindowControlEventHandler( EventHandlerCallRef handl { updateRgn = (RgnHandle) visRegion.GetWXHRGN() ; } - else - { - // unfortunately this update region may be incorrect (tree ctrl sample ) - // so we have to reset it - updateRgn = (RgnHandle) visRegion.GetWXHRGN() ; - } // GrafPtr myport = cEvent.GetParameter(kEventParamGrafPort,typeGrafPtr) ; -#if 0 // in case we would need a coregraphics compliant background erase first +#if 0 + // in case we would need a coregraphics compliant background erase first + // now usable to track redraws CGContextRef cgContext = cEvent.GetParameter(kEventParamCGContextRef) ; if ( thisWindow->MacIsUserPane() ) { + static float color = 0.5 ; + static channel = 0 ; HIRect bounds; - err = HIViewGetBounds( controlRef, &bounds ); - CGContextSetRGBFillColor( cgContext, 1 , 1 , 1 , 1 ); -// CGContextSetRGBFillColor( cgContext, .95, .95, .95, 1 ); + HIViewGetBounds( controlRef, &bounds ); + CGContextSetRGBFillColor( cgContext, channel == 0 ? color : 0.5 , + channel == 1 ? color : 0.5 , channel == 2 ? color : 0.5 , 1 ); CGContextFillRect( cgContext, bounds ); + color += 0.1 ; + if ( color > 0.9 ) + { + color = 0.5 ; + channel++ ; + if ( channel == 3 ) + channel = 0 ; + } } #endif if ( thisWindow->MacDoRedraw( updateRgn , cEvent.GetTicks() ) ) result = noErr ; - else - result = eventNotHandledErr; } break ; case kEventControlVisibilityChanged : @@ -180,12 +194,138 @@ static pascal OSStatus wxMacWindowControlEventHandler( EventHandlerCallRef handl case kEventControlHiliteChanged : thisWindow->MacHiliteChanged() ; break ; + case kEventControlSetFocusPart : + { + Boolean focusEverything = false ; + ControlPartCode controlPart = cEvent.GetParameter(kEventParamControlPart , typeControlPartCode ); + if ( cEvent.GetParameter(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) ; + if (thisWindow->MacIsUserPane()) + result = noErr; + } + 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) ; + if (thisWindow->MacIsUserPane()) + result = noErr; + } + } + break ; +#endif + case kEventControlHit : + { + result = thisWindow->MacControlHit( handler , event ) ; + } + break ; default : break ; } return result ; } +static pascal OSStatus wxMacWindowServiceEventHandler( EventHandlerCallRef handler , EventRef event , void *data ) +{ + OSStatus result = eventNotHandledErr ; + + wxMacCarbonEvent cEvent( event ) ; + + ControlRef controlRef ; + wxWindowMac* thisWindow = (wxWindowMac*) data ; + wxTextCtrl* textCtrl = wxDynamicCast( thisWindow , wxTextCtrl ) ; + cEvent.GetParameter( kEventParamDirectObject , &controlRef ) ; + + switch( GetEventKind( event ) ) + { + case kEventServiceGetTypes : + if( textCtrl ) + { + long from, to ; + textCtrl->GetSelection( &from , &to ) ; + + CFMutableArrayRef copyTypes = 0 , pasteTypes = 0; + if( from != to ) + copyTypes = cEvent.GetParameter< CFMutableArrayRef >( kEventParamServiceCopyTypes , typeCFMutableArrayRef ) ; + if ( textCtrl->IsEditable() ) + pasteTypes = cEvent.GetParameter< CFMutableArrayRef >( kEventParamServicePasteTypes , typeCFMutableArrayRef ) ; + + static const OSType textDataTypes[] = { kTXNTextData /* , 'utxt' , 'PICT', 'MooV', 'AIFF' */ }; + for ( size_t i = 0 ; i < WXSIZEOF(textDataTypes) ; ++i ) + { + CFStringRef typestring = CreateTypeStringWithOSType(textDataTypes[i]); + if ( typestring ) + { + if ( copyTypes ) + CFArrayAppendValue (copyTypes, typestring) ; + if ( pasteTypes ) + CFArrayAppendValue (pasteTypes, typestring) ; + CFRelease( typestring ) ; + } + } + result = noErr ; + } + break ; + case kEventServiceCopy : + if ( textCtrl ) + { + long from, to ; + textCtrl->GetSelection( &from , &to ) ; + wxString val = textCtrl->GetValue() ; + val = val.Mid( from , to - from ) ; + ScrapRef scrapRef = cEvent.GetParameter< ScrapRef > ( kEventParamScrapRef , typeScrapRef ) ; + verify_noerr( ClearScrap( &scrapRef ) ) ; + verify_noerr( PutScrapFlavor( scrapRef , kTXNTextData , 0 , val.Length() , val.c_str() ) ) ; + result = noErr ; + } + break ; + case kEventServicePaste : + if ( textCtrl ) + { + ScrapRef scrapRef = cEvent.GetParameter< ScrapRef > ( kEventParamScrapRef , typeScrapRef ) ; + Size textSize, pastedSize ; + verify_noerr( GetScrapFlavorSize (scrapRef, kTXNTextData, &textSize) ) ; + textSize++ ; + char *content = new char[textSize] ; + GetScrapFlavorData (scrapRef, kTXNTextData, &pastedSize, content ); + content[textSize-1] = 0 ; +#if wxUSE_UNICODE + textCtrl->WriteText( wxString( content , wxConvLocal ) ); +#else + textCtrl->WriteText( wxString( content ) ) ; +#endif + delete[] content ; + result = noErr ; + } + break ; + } + + return result ; +} + pascal OSStatus wxMacWindowEventHandler( EventHandlerCallRef handler , EventRef event , void *data ) { OSStatus result = eventNotHandledErr ; @@ -195,6 +335,8 @@ pascal OSStatus wxMacWindowEventHandler( EventHandlerCallRef handler , EventRef case kEventClassControl : result = wxMacWindowControlEventHandler( handler, event, data ) ; break ; + case kEventClassService : + result = wxMacWindowServiceEventHandler( handler, event , data ) ; default : break ; } @@ -265,7 +407,12 @@ static pascal void wxMacControlUserPaneBackgroundProc(ControlRef control, Contro void wxWindowMac::MacControlUserPaneDrawProc(wxInt16 part) { - MacDoRedraw( MacGetVisibleRegion().GetWXHRGN() , 0 ) ; + RgnHandle rgn = NewRgn() ; + GetClip( rgn ) ; + wxMacWindowStateSaver sv( this ) ; + SectRgn( rgn , (RgnHandle) MacGetVisibleRegion().GetWXHRGN() , rgn ) ; + MacDoRedraw( rgn , 0 ) ; + DisposeRgn( rgn ) ; } wxInt16 wxWindowMac::MacControlUserPaneHitTestProc(wxInt16 x, wxInt16 y) @@ -416,7 +563,10 @@ pascal void wxMacLiveScrollbarActionProc( ControlRef control , ControlPartCode p void wxWindowMac::Init() { + m_frozenness = 0 ; +#if WXWIN_COMPATIBILITY_2_4 m_backgroundTransparent = FALSE; +#endif // as all windows are created with WS_VISIBLE style... m_isShown = TRUE; @@ -452,6 +602,8 @@ void wxWindowMac::Init() wxMacSetupControlBackgroundUPP = NewControlColorUPP( wxMacSetupControlBackground ) ; } + // we need a valid font for the encodings + wxWindowBase::SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT)); } // Destructor @@ -507,11 +659,6 @@ wxWindowMac::~wxWindowMac() frame->SetLastFocus( NULL ) ; } - if ( gFocusWindow == this ) - { - gFocusWindow = NULL ; - } - DestroyChildren(); // delete our drop target if we've got one @@ -528,6 +675,7 @@ wxWindowMac::~wxWindowMac() void wxWindowMac::MacInstallEventHandler() { + wxAssociateControlWithMacControl( (ControlRef) m_macControl , this ) ; InstallControlEventHandler( (ControlRef) m_macControl, GetwxMacWindowEventHandlerUPP(), GetEventTypeCount(eventList), eventList, this, (EventHandlerRef *)&m_macControlEventHandler); @@ -554,9 +702,18 @@ bool wxWindowMac::Create(wxWindowMac *parent, wxWindowID id, { Rect bounds = wxMacGetBoundsForControl( this , pos , size ) ; - UInt32 features = kControlSupportsEmbedding | kControlSupportsLiveFeedback /*| kControlHasSpecialBackground */ | kControlSupportsCalcBestRect | kControlHandlesTracking | kControlSupportsFocus | kControlWantsActivate | kControlWantsIdle; - - ::CreateUserPaneControl( MAC_WXHWND(GetParent()->MacGetTopLevelWindowRef()) , &bounds, features, (ControlRef*) &m_macControl); + UInt32 features = 0 + | kControlSupportsEmbedding +// | kControlSupportsLiveFeedback +// | kControlHasSpecialBackground +// | kControlSupportsCalcBestRect +// | kControlHandlesTracking + | kControlSupportsFocus +// | kControlWantsActivate +// | kControlWantsIdle + ; + + ::CreateUserPaneControl( MAC_WXHWND(GetParent()->MacGetTopLevelWindowRef()) , &bounds, features , (ControlRef*) &m_macControl); MacPostControlCreate(pos,size) ; #if !TARGET_API_MAC_OSX @@ -597,7 +754,6 @@ void wxWindowMac::MacPostControlCreate(const wxPoint& pos, const wxSize& size) { wxASSERT_MSG( (ControlRef) m_macControl != NULL , wxT("No valid mac control") ) ; - wxAssociateControlWithMacControl( (ControlRef) m_macControl , this ) ; ::SetControlReference( (ControlRef) m_macControl , (long) this ) ; MacInstallEventHandler(); @@ -619,16 +775,8 @@ void wxWindowMac::MacPostControlCreate(const wxPoint& pos, const wxSize& size) wxSize new_size = size ; if (!m_macIsUserPane) - { - wxSize best_size( DoGetBestSize() ); - - if (size.x == -1) { - new_size.x = best_size.x; - } - if (size.y == -1) { - new_size.y = best_size.y; - } - SetSize( pos.x, pos.y , new_size.x, new_size.y,wxSIZE_USE_EXISTING ); + { + SetInitialBestSize(size); } SetCursor( *wxSTANDARD_CURSOR ) ; @@ -637,9 +785,14 @@ void wxWindowMac::MacPostControlCreate(const wxPoint& pos, const wxSize& size) void wxWindowMac::DoSetWindowVariant( wxWindowVariant variant ) { - wxASSERT( m_macControl != NULL ) ; + // Don't assert, in case we set the window variant before + // the window is created + // wxASSERT( m_macControl != NULL ) ; + + m_windowVariant = variant ; - m_windowVariant = variant ; + if (!m_macControl) + return; ControlSize size ; ThemeFontID themeFont = kThemeSystemFont ; @@ -770,73 +923,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) ; - } + 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 ; + +#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( kEventParamDirectObject , (ControlRef) former->GetHandle() ) ; + cEvent.SetParameter(kEventParamControlPart , typeControlPartCode , kControlFocusNoPart ) ; + + wxMacWindowEventHandler( NULL , evRef , former ) ; + ReleaseEvent(evRef) ; } - gFocusWindow = this ; + // send new focus event { - #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); - - #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) ; + EventRef evRef = NULL ; + verify_noerr( MacCreateEvent( NULL , kEventClassControl , kEventControlSetFocusPart , TicksToEventTime( TickCount() ) , kEventAttributeUserEvent , + &evRef ) ); + + wxMacCarbonEvent cEvent( evRef ) ; + cEvent.SetParameter( kEventParamDirectObject , (ControlRef) GetHandle() ) ; + cEvent.SetParameter(kEventParamControlPart , typeControlPartCode , kControlFocusNextPart ) ; + + wxMacWindowEventHandler( NULL , evRef , this ) ; + ReleaseEvent(evRef) ; } +#endif } } @@ -896,10 +1035,10 @@ void wxWindowMac::MacGetPositionAndSizeFromControl(int& x, int& y, { Point tlworigin = { 0 , 0 } ; GrafPtr port ; - ::GetPort( &port ) ; - ::SetPort( UMAGetWindowPort( (WindowRef) tlw->MacGetWindowRef() ) ) ; + bool swapped = QDSwapPort( UMAGetWindowPort( (WindowRef) tlw->MacGetWindowRef() ) , &port ) ; ::LocalToGlobal( &tlworigin ) ; - ::SetPort( port ) ; + if ( swapped ) + ::SetPort( port ) ; x = tlworigin.h ; y = tlworigin.v ; } @@ -908,7 +1047,7 @@ void wxWindowMac::MacGetPositionAndSizeFromControl(int& x, int& y, bool wxWindowMac::MacGetBoundsForControl(const wxPoint& pos, const wxSize& size, int& x, int& y, - int& w, int& h) const + int& w, int& h , bool adjustOrigin ) const { x = (int)pos.x; y = (int)pos.y; @@ -918,7 +1057,8 @@ bool wxWindowMac::MacGetBoundsForControl(const wxPoint& pos, #if !TARGET_API_MAC_OSX GetParent()->MacWindowToRootWindow( &x , &y ) ; #endif - + if ( adjustOrigin ) + AdjustForParentClientOrigin( x , y ) ; return true ; } @@ -1054,7 +1194,8 @@ void wxWindowMac::MacWindowToRootWindow( int *x , int *y ) const if ( x ) pt.x = *x ; if ( y ) pt.y = *y ; - HIViewConvertPoint( &pt , (ControlRef) m_macControl , (ControlRef) MacGetTopLevelWindow()->GetHandle() ) ; + if ( !IsTopLevel() ) + HIViewConvertPoint( &pt , (ControlRef) m_macControl , (ControlRef) MacGetTopLevelWindow()->GetHandle() ) ; if ( x ) *x = (int) pt.x ; if ( y ) *y = (int) pt.y ; @@ -1086,7 +1227,8 @@ void wxWindowMac::MacRootWindowToWindow( int *x , int *y ) const if ( x ) pt.x = *x ; if ( y ) pt.y = *y ; - HIViewConvertPoint( &pt , (ControlRef) MacGetTopLevelWindow()->GetHandle() , (ControlRef) m_macControl ) ; + if ( !IsTopLevel() ) + HIViewConvertPoint( &pt , (ControlRef) MacGetTopLevelWindow()->GetHandle() , (ControlRef) m_macControl ) ; if ( x ) *x = (int) pt.x ; if ( y ) *y = (int) pt.y ; @@ -1111,6 +1253,30 @@ void wxWindowMac::MacRootWindowToWindow( short *x , short *y ) const if ( y ) *y = y1 ; } +void wxWindowMac::MacGetContentAreaInset( int &left , int &top , int &right , int &bottom ) +{ + RgnHandle rgn = NewRgn() ; + Rect content ; + if ( GetControlRegion( (ControlRef) m_macControl , kControlContentMetaPart , rgn ) == noErr ) + { + GetRegionBounds( rgn , &content ) ; + DisposeRgn( rgn ) ; + } + else + { + GetControlBounds( (ControlRef) m_macControl , &content ) ; + } + Rect structure ; + GetControlBounds( (ControlRef) m_macControl , &structure ) ; +#if !TARGET_API_MAC_OSX + OffsetRect( &content , -structure.left , -structure.top ) ; +#endif + left = content.left - structure.left ; + top = content.top - structure.top ; + right = structure.right - content.right ; + bottom = structure.bottom - content.bottom ; +} + wxSize wxWindowMac::DoGetSizeFromClientSize( const wxSize & size ) const { wxSize sizeTotal = size; @@ -1348,14 +1514,23 @@ void wxWindowMac::DoMoveWindow(int x, int y, int width, int height) if ( doMove || doResize ) { - Rect r = wxMacGetBoundsForControl(this , wxPoint( actualX,actualY), wxSize( actualWidth, actualHeight ) ) ; + // we don't adjust twice for the origin + Rect r = wxMacGetBoundsForControl(this , wxPoint( actualX,actualY), wxSize( actualWidth, actualHeight ) , false ) ; + bool vis = IsControlVisible( (ControlRef) m_macControl ) ; #if TARGET_API_MAC_OSX - SetControlBounds( (ControlRef) m_macControl , &r ) ; + // the HIViewSetFrame call itself should invalidate the areas, but when testing with the UnicodeTextCtrl it does not ! + if ( vis ) + SetControlVisibility( (ControlRef)m_macControl , false , true ) ; + HIRect hir = { r.left , r.top , r.right - r.left , r.bottom - r.top } ; + HIViewSetFrame ( (ControlRef) m_macControl , &hir ) ; + if ( vis ) + SetControlVisibility( (ControlRef)m_macControl , true , true ) ; #else - if ( doMove ) - MoveControl( (ControlRef) m_macControl , r.left , r.top ) ; - if ( doSize ) - SizeControl( (ControlRef) m_macControl , r.right-r.left , r.bottom-r.top ) ; + if ( vis ) + SetControlVisibility( (ControlRef)m_macControl , false , true ) ; + SetControlBounds( (ControlRef) m_macControl , &r ) ; + if ( vis ) + SetControlVisibility( (ControlRef)m_macControl , true , true ) ; #endif MacRepositionScrollBars() ; if ( doMove ) @@ -1496,9 +1671,14 @@ wxPoint wxWindowMac::GetClientAreaOrigin() const GetRegionBounds( rgn , &content ) ; DisposeRgn( rgn ) ; #if !TARGET_API_MAC_OSX - Rect structure ; - GetControlBounds( (ControlRef) m_macControl , &structure ) ; - OffsetRect( &content , -structure.left , -structure.top ) ; + // if the content rgn is empty / not supported + // don't attempt to correct the coordinates to wxWindow relative ones + if (!::EmptyRect( &content ) ) + { + Rect structure ; + GetControlBounds( (ControlRef) m_macControl , &structure ) ; + OffsetRect( &content , -structure.left , -structure.top ) ; + } #endif return wxPoint( content.left + MacGetLeftBorderSize( ) , content.top + MacGetTopBorderSize( ) ); @@ -1556,10 +1736,17 @@ bool wxWindowMac::Enable(bool enable) return FALSE; bool former = MacIsReallyEnabled() ; +#if TARGET_API_MAC_OSX if ( enable ) EnableControl( (ControlRef) m_macControl ) ; else DisableControl( (ControlRef) m_macControl ) ; +#else + if ( enable ) + ActivateControl( (ControlRef) m_macControl ) ; + else + DeactivateControl( (ControlRef) m_macControl ) ; +#endif if ( former != MacIsReallyEnabled() ) MacPropagateEnabledStateChanged() ; @@ -1661,7 +1848,11 @@ bool wxWindowMac::MacIsReallyShown() bool wxWindowMac::MacIsReallyEnabled() { +#if TARGET_API_MAC_OSX return IsControlEnabled( (ControlRef) m_macControl ) ; +#else + return IsControlActive( (ControlRef) m_macControl ) ; +#endif } bool wxWindowMac::MacIsReallyHilited() @@ -1719,10 +1910,26 @@ void wxWindowMac::Refresh(bool eraseBack, const wxRect *rect) { RgnHandle update = NewRgn() ; SetRectRgn( update , rect->x , rect->y , rect->x + rect->width , rect->y + rect->height ) ; - SectRgn( (RgnHandle) MacGetVisibleRegion().GetWXHRGN() , update , update ) ; + SectRgn( (RgnHandle) MacGetVisibleRegion().GetWXHRGN() , update , update ) ; + wxPoint origin = GetClientAreaOrigin() ; + OffsetRgn( update, origin.x , origin.y ) ; HIViewSetNeedsDisplayInRegion( (ControlRef) m_macControl , update , true ) ; } #else +/* + RgnHandle updateRgn = NewRgn() ; + if ( rect == NULL ) + { + CopyRgn( (RgnHandle) MacGetVisibleRegion().GetWXHRGN() , updateRgn ) ; + } + else + { + SetRectRgn( updateRgn , rect->x , rect->y , rect->x + rect->width , rect->y + rect->height ) ; + SectRgn( (RgnHandle) MacGetVisibleRegion().GetWXHRGN() , updateRgn , updateRgn ) ; + } + InvalWindowRgn( (WindowRef) MacGetTopLevelWindowRef() , updateRgn ) ; + DisposeRgn(updateRgn) ; +*/ if ( IsControlVisible( (ControlRef) m_macControl ) ) { SetControlVisibility( (ControlRef) m_macControl , false , false ) ; @@ -1771,6 +1978,51 @@ void wxWindowMac::Refresh(bool eraseBack, const wxRect *rect) #endif } +void wxWindowMac::Freeze() +{ +#if TARGET_API_MAC_OSX + if ( !m_frozenness++ ) + { + HIViewSetDrawingEnabled( (HIViewRef) m_macControl , false ) ; + } +#endif +} + +#if TARGET_API_MAC_OSX +static void InvalidateControlAndChildren( HIViewRef control ) +{ + HIViewSetNeedsDisplay( control , true ) ; + UInt16 childrenCount = 0 ; + OSStatus err = CountSubControls( control , &childrenCount ) ; + if ( err == errControlIsNotEmbedder ) + return ; + wxASSERT_MSG( err == noErr , wxT("Unexpected error when accessing subcontrols") ) ; + + for ( UInt16 i = childrenCount ; i >=1 ; --i ) + { + HIViewRef child ; + err = GetIndexedSubControl( control , i , & child ) ; + if ( err == errControlIsNotEmbedder ) + return ; + InvalidateControlAndChildren( child ) ; + } +} +#endif + +void wxWindowMac::Thaw() +{ +#if TARGET_API_MAC_OSX + wxASSERT_MSG( m_frozenness > 0, _T("Thaw() without matching Freeze()") ); + + if ( !--m_frozenness ) + { + HIViewSetDrawingEnabled( (HIViewRef) m_macControl , true ) ; + InvalidateControlAndChildren( (HIViewRef) m_macControl ) ; + // HIViewSetNeedsDisplay( (HIViewRef) m_macControl , true ) ; + } +#endif +} + void wxWindowMac::MacRedrawControl() { /* @@ -2140,7 +2392,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) @@ -2170,11 +2424,17 @@ void wxWindowMac::OnInternalIdle() // Raise the window to the top of the Z order void wxWindowMac::Raise() { +#if TARGET_API_MAC_OSX + HIViewSetZOrder((ControlRef)m_macControl,kHIViewZOrderAbove, NULL) ; +#endif } // Lower the window to the bottom of the Z order void wxWindowMac::Lower() { +#if TARGET_API_MAC_OSX + HIViewSetZOrder((ControlRef)m_macControl,kHIViewZOrderBelow, NULL) ; +#endif } @@ -2324,10 +2584,6 @@ wxRegion wxWindowMac::MacGetVisibleRegion( bool includeOuterStructures ) */ bool wxWindowMac::MacDoRedraw( WXHRGN updatergnr , long time ) { - // we let the OS handle root control redraws - if ( m_macControl == MacGetTopLevelWindow()->GetHandle() ) - return false ; - RgnHandle updatergn = (RgnHandle) updatergnr ; bool handled = false ; @@ -2648,62 +2904,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() ; @@ -2712,16 +2912,20 @@ 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 ) +Rect wxMacGetBoundsForControl( wxWindow* window , const wxPoint& pos , const wxSize &size , bool adjustForOrigin ) { int x ,y , w ,h ; - window->MacGetBoundsForControl( pos , size , x , y, w, h ) ; + window->MacGetBoundsForControl( pos , size , x , y, w, h , adjustForOrigin) ; Rect bounds = { y , x , y+h , x+w }; return bounds ; } +wxInt32 wxWindowMac::MacControlHit(WXEVENTHANDLERREF WXUNUSED(handler) , WXEVENTREF WXUNUSED(event) ) +{ + return eventNotHandledErr ; +} +