]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/window.cpp
document On{Open,Save}Document()
[wxWidgets.git] / src / mac / carbon / window.cpp
index 76ad79347675c154969713a7a567a1ff1b75a8eb..2a583e69e21f7f211424e175bea2d6b88c22800d 100644 (file)
@@ -168,6 +168,8 @@ static const EventTypeSpec eventList[] =
 //    { kEventClassControl , kEventControlBoundsChanged } ,
 } ;
 
+wxWindowMac* targetWindow = NULL;
+
 static pascal OSStatus wxMacWindowControlEventHandler( EventHandlerCallRef handler , EventRef event , void *data )
 {
     OSStatus result = eventNotHandledErr ;
@@ -232,17 +234,21 @@ static pascal OSStatus wxMacWindowControlEventHandler( EventHandlerCallRef handl
                     bool created = false ;
                     CGContextRef cgContext = NULL ;
                     OSStatus err = cEvent.GetParameter<CGContextRef>(kEventParamCGContextRef, &cgContext) ;
-                    wxASSERT_MSG( err == noErr , wxT("Unable to retrieve CGContextRef") ) ;
+                    if ( err != noErr )
+                    {
+                        wxFAIL_MSG("Unable to retrieve CGContextRef");
+                    }
+
                     thisWindow->MacSetCGContextRef( cgContext ) ;
 
                     {
                         wxMacCGContextStateSaver sg( cgContext ) ;
-                        float alpha = 1.0 ;
+                        CGFloat alpha = (CGFloat)1.0 ;
                         {
                             wxWindow* iter = thisWindow ;
                             while ( iter )
                             {
-                                alpha *= (float) iter->GetTransparent()/255.0 ;
+                                alpha *= (CGFloat)( iter->GetTransparent()/255.0 ) ;
                                 if ( iter->IsTopLevel() )
                                     iter = NULL ;
                                 else
@@ -276,7 +282,13 @@ static pascal OSStatus wxMacWindowControlEventHandler( EventHandlerCallRef handl
             break ;
 
         case kEventControlVisibilityChanged :
-            thisWindow->MacVisibilityChanged() ;
+            // we might have two native controls attributed to the same wxWindow instance
+            // eg a scrollview and an embedded textview, make sure we only fire for the 'outer'
+            // control, as otherwise native and wx visibility are different
+            if ( thisWindow->GetPeer() != NULL && thisWindow->GetPeer()->GetControlRef() == controlRef )
+            {
+                thisWindow->MacVisibilityChanged() ;
+            }
             break ;
 
         case kEventControlEnabledStateChanged :
@@ -334,6 +346,7 @@ static pascal OSStatus wxMacWindowControlEventHandler( EventHandlerCallRef handl
                         inKillFocusEvent = true ;
                         wxFocusEvent event( wxEVT_KILL_FOCUS, thisWindow->GetId());
                         event.SetEventObject(thisWindow);
+                        event.SetWindow(targetWindow);
                         thisWindow->HandleWindowEvent(event) ;
                         inKillFocusEvent = false ;
                     }
@@ -367,7 +380,9 @@ static pascal OSStatus wxMacWindowControlEventHandler( EventHandlerCallRef handl
                 }
 #endif
                 ControlPartCode controlPart = cEvent.GetParameter<ControlPartCode>(kEventParamControlPart , typeControlPartCode );
-
+                if ( controlPart != kControlFocusNoPart )
+                    targetWindow = thisWindow;
+                    
                 ControlPartCode previousControlPart = 0;
                 verify_noerr( HIViewGetFocusPart(controlRef, &previousControlPart));
 
@@ -879,9 +894,6 @@ void wxWindowMac::Init()
     m_macIsUserPane = true;
     m_clipChildren = false ;
     m_cachedClippedRectValid = false ;
-
-    // we need a valid font for the encodings
-    wxWindowBase::SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT));
 }
 
 wxWindowMac::~wxWindowMac()
@@ -1399,7 +1411,7 @@ void wxWindowMac::MacWindowToRootWindow( int *x , int *y ) const
 
     if ( !IsTopLevel() )
     {
-        wxTopLevelWindowMac* top = MacGetTopLevelWindow();
+        wxNonOwnedWindow* top = MacGetTopLevelWindow();
         if (top)
         {
             pt.x -= MacGetLeftBorderSize() ;
@@ -1442,7 +1454,7 @@ void wxWindowMac::MacRootWindowToWindow( int *x , int *y ) const
 
     if ( !IsTopLevel() )
     {
-        wxTopLevelWindowMac* top = MacGetTopLevelWindow();
+        wxNonOwnedWindow* top = MacGetTopLevelWindow();
         if (top)
         {
             wxMacControl::Convert( &pt , top->m_peer , m_peer ) ;
@@ -1573,7 +1585,7 @@ bool wxWindowMac::SetCursor(const wxCursor& cursor)
 
     wxWindowMac *mouseWin = 0 ;
     {
-        wxTopLevelWindowMac *tlw = MacGetTopLevelWindow() ;
+        wxNonOwnedWindow *tlw = MacGetTopLevelWindow() ;
         WindowRef window = (WindowRef) ( tlw ? tlw->MacGetWindowRef() : 0 ) ;
 
         ControlPartCode part ;
@@ -2112,6 +2124,12 @@ void wxWindowMac::OnEraseBackground(wxEraseEvent& event)
     {
         event.GetDC()->Clear() ;
     }
+    else if ( GetBackgroundStyle() == wxBG_STYLE_CUSTOM )
+    {
+        // don't skip the event here, custom background means that the app
+        // is drawing it itself in its OnPaint(), so don't draw it at all
+        // now to avoid flicker
+    }
     else
     {
         event.Skip() ;
@@ -2238,7 +2256,7 @@ void  wxWindowMac::MacPaintGrowBox()
         }
         else
         {
-            CGContextSetRGBFillColor( cgContext, 1.0, 1.0 , 1.0 , 1.0 );
+            CGContextSetRGBFillColor( cgContext, (CGFloat) 1.0, (CGFloat)1.0 ,(CGFloat) 1.0 , (CGFloat)1.0 );
         }
         CGContextFillRect( cgContext, cgrect );
         CGContextRestoreGState( cgContext );
@@ -2549,14 +2567,14 @@ void wxWindowMac::ClearBackground()
 
 void wxWindowMac::Update()
 {
-    wxTopLevelWindowMac* top = MacGetTopLevelWindow();
+    wxNonOwnedWindow* top = MacGetTopLevelWindow();
     if (top)
         top->MacPerformUpdates() ;
 }
 
-wxTopLevelWindowMac* wxWindowMac::MacGetTopLevelWindow() const
+wxNonOwnedWindow* wxWindowMac::MacGetTopLevelWindow() const
 {
-    wxTopLevelWindowMac* win = NULL ;
+    wxNonOwnedWindow* win = NULL ;
     WindowRef window = (WindowRef) MacGetTopLevelWindowRef() ;
     if ( window )
         win = wxFindWinFromMacWindow( window ) ;
@@ -2807,7 +2825,7 @@ WXWindow wxWindowMac::MacGetTopLevelWindowRef() const
 #if wxUSE_POPUPWIN
             wxPopupWindow* popupwin = wxDynamicCast(iter,wxPopupWindow);
             if ( popupwin )
-                return popupwin->MacGetPopupWindowRef();
+                return popupwin->MacGetWindowRef();
 #endif
         }
         iter = iter->GetParent() ;
@@ -3199,7 +3217,23 @@ bool wxWindowMac::IsShownOnScreen() const
 {
 #if TARGET_API_MAC_OSX
     if ( m_peer && m_peer->Ok() )
+    {
+        bool peerVis = m_peer->IsVisible();
+        bool wxVis = wxWindowBase::IsShownOnScreen();
+        if( peerVis != wxVis )
+        {
+            // CS : put a breakpoint here to investigate differences
+            // between native an wx visibilities
+            // the only place where I've encountered them until now
+            // are the hiding/showing sequences where the vis-changed event is
+            // first sent to the innermost control, while wx does things
+            // from the outmost control
+            wxVis = wxWindowBase::IsShownOnScreen();
+            return wxVis;
+        }
+
         return m_peer->IsVisible();
+    }
 #endif
 
     return wxWindowBase::IsShownOnScreen();