]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/toplevel.cpp
guard code for mac / quickdraw
[wxWidgets.git] / src / mac / carbon / toplevel.cpp
index 3bb2a084e8eca463fa4df98848de310d84b319d8..6f7d25249998a6f080cb8412780cdd237befed34 100644 (file)
@@ -314,11 +314,11 @@ void SetupMouseEvent( wxMouseEvent &wxevent , wxMacCarbonEvent &cEvent )
     if( thisButtonIsFakeRight && ( mouseChord & 1U ) )
         mouseChord = ((mouseChord & ~1U) | 2U);
 
-    if(mouseChord & 1U) 
+    if(mouseChord & 1U)
                 wxevent.m_leftDown = true ;
-    if(mouseChord & 2U) 
+    if(mouseChord & 2U)
                 wxevent.m_rightDown = true ;
-    if(mouseChord & 4U) 
+    if(mouseChord & 4U)
                 wxevent.m_middleDown = true ;
 
     // translate into wx types
@@ -442,18 +442,6 @@ ControlRef wxMacFindSubControl( wxTopLevelWindowMac* toplevelWindow, const Point
     return NULL ;
 }
 
-ControlRef wxMacFindControlUnderMouse( wxTopLevelWindowMac* toplevelWindow , const Point& location , WindowRef window , ControlPartCode *outPart )
-{
-#if TARGET_API_MAC_OSX
-    if ( UMAGetSystemVersion() >= 0x1030 )
-        return FindControlUnderMouse( location , window , outPart ) ;
-#endif
-
-    ControlRef rootControl = NULL ;
-    verify_noerr( GetRootControl( window , &rootControl ) ) ;
-
-    return wxMacFindSubControl( toplevelWindow , location , rootControl , outPart ) ;
-}
 
 #define NEW_CAPTURE_HANDLING 1
 
@@ -616,17 +604,10 @@ wxMacTopLevelMouseEventHandler(EventHandlerCallRef WXUNUSED(handler),
                     currentMouseWindow->SetFocus();
             }
 
-            ControlPartCode dummyPart ;
             // if built-in find control is finding the wrong control (ie static box instead of overlaid
             // button, we cannot let the standard handler do its job, but must handle manually
 
-            if ( ( cEvent.GetKind() == kEventMouseDown )
-#ifdef __WXMAC_OSX__
-                &&
-                (FindControlUnderMouse(windowMouseLocation , window , &dummyPart) !=
-                wxMacFindControlUnderMouse( toplevelWindow , windowMouseLocation , window , &dummyPart ) )
-#endif
-                )
+            if ( cEvent.GetKind() == kEventMouseDown )
             {
                 if ( currentMouseWindow->MacIsReallyEnabled() )
                 {
@@ -677,14 +658,13 @@ wxMacTopLevelMouseEventHandler(EventHandlerCallRef WXUNUSED(handler),
         {
             EventModifiers modifiers = cEvent.GetParameter<EventModifiers>(kEventParamKeyModifiers, typeUInt32) ;
             Point clickLocation = windowMouseLocation ;
-#if TARGET_API_MAC_OSX
+
             HIPoint hiPoint ;
             hiPoint.x = clickLocation.h ;
             hiPoint.y = clickLocation.v ;
             HIViewConvertPoint( &hiPoint , (ControlRef) toplevelWindow->GetHandle() , control  ) ;
             clickLocation.h = (int)hiPoint.x ;
             clickLocation.v = (int)hiPoint.y ;
-#endif // TARGET_API_MAC_OSX
 
             HandleControlClick( control , clickLocation , modifiers , (ControlActionUPP ) -1 ) ;
             result = noErr ;
@@ -981,7 +961,7 @@ bool wxTopLevelWindowMac::Create(wxWindow *parent,
 
     DoMacCreateRealWindow( parent, title, pos , size , style , name ) ;
 
-    SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE));
+    SetBackgroundColour(wxColour(wxMacCreateCGColorFromHITheme(kThemeBrushDialogBackgroundActive)));
 
     if (GetExtraStyle() & wxFRAME_EX_METAL)
         MacSetMetalAppearance(true);
@@ -1083,22 +1063,18 @@ wxPoint wxTopLevelWindowMac::GetClientAreaOrigin() const
     return wxPoint(0, 0) ;
 }
 
-#ifndef __WXUNIVERSAL__
-void wxTopLevelWindowMac::SetIcons( const wxIconBundle& icons )
-{
-// { SetIcon( icons.GetIcon( -1 ) ); }
-}
-#endif
-
-void  wxTopLevelWindowMac::MacSetBackgroundBrush( const wxBrush &brush )
+bool wxTopLevelWindowMac::SetBackgroundColour(const wxColour& col )
 {
-    wxTopLevelWindowBase::MacSetBackgroundBrush( brush ) ;
-
-    if ( m_macBackgroundBrush.Ok() && m_macBackgroundBrush.GetStyle() != wxTRANSPARENT && m_macBackgroundBrush.MacGetBrushKind() == kwxMacBrushTheme )
-    {
-        SetThemeWindowBackground( (WindowRef) m_macWindow , m_macBackgroundBrush.MacGetTheme() , false ) ;
-    }
-}
+    if ( !wxTopLevelWindowBase::SetBackgroundColour(col) && m_hasBgCol )
+        return false ;
+    
+    if ( col == wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) )
+        SetThemeWindowBackground( (WindowRef) m_macWindow,  kThemeBrushDocumentWindowBackground, false ) ;
+    else if ( col == wxSystemSettings::GetColour( wxSYS_COLOUR_3DFACE ) )
+        SetThemeWindowBackground( (WindowRef) m_macWindow,  kThemeBrushDialogBackgroundActive, false ) ;
+    // TODO BETTER THEME SUPPORT
+    return true;
+}    
 
 void wxTopLevelWindowMacInstallTopLevelWindowEventHandler(WindowRef window, EventHandlerRef* handler, void *ref)
 {
@@ -1126,7 +1102,7 @@ void  wxTopLevelWindowMac::MacCreateRealWindow(
 }
 
 void  wxTopLevelWindowMac::DoMacCreateRealWindow(
-    wxWindow* parent, 
+    wxWindow* parent,
     const wxString& title,
     const wxPoint& pos,
     const wxSize& size,
@@ -1160,8 +1136,8 @@ void  wxTopLevelWindowMac::DoMacCreateRealWindow(
     WindowClass wclass = 0;
     WindowAttributes attr = kWindowNoAttributes ;
     WindowGroupRef group = NULL ;
-       bool activationScopeSet = false;
-       WindowActivationScope activationScope = kWindowActivationScopeNone;
+    bool activationScopeSet = false;
+    WindowActivationScope activationScope = kWindowActivationScopeNone;
 
     if ( HasFlag( wxFRAME_TOOL_WINDOW) )
     {
@@ -1182,8 +1158,8 @@ void  wxTopLevelWindowMac::DoMacCreateRealWindow(
         else
         {
             wclass = kPlainWindowClass ;
-                       activationScopeSet = true;
-                       activationScope = kWindowActivationScopeNone;
+            activationScopeSet = true;
+            activationScope = kWindowActivationScopeNone;
         }
     }
     else if ( HasFlag( wxPOPUP_WINDOW ) )
@@ -1240,10 +1216,7 @@ void  wxTopLevelWindowMac::DoMacCreateRealWindow(
         if ( HasFlag( wxCLOSE_BOX) )
             attr |= kWindowCloseBoxAttribute ;
     }
-
-    // turn on live resizing (OS X only)
-    if (UMAGetSystemVersion() >= 0x1000)
-        attr |= kWindowLiveResizeAttribute;
+    attr |= kWindowLiveResizeAttribute;
 
     if ( HasFlag(wxSTAY_ON_TOP) )
         group = GetWindowGroupOfClass(kUtilityWindowClass) ;
@@ -1257,7 +1230,7 @@ void  wxTopLevelWindowMac::DoMacCreateRealWindow(
         if( parenttlw )
             group = GetWindowGroupParent( GetWindowGroup( parenttlw ) );
     }
-        
+
     attr |= kWindowCompositingAttribute;
 #if 0 // wxMAC_USE_CORE_GRAPHICS ; TODO : decide on overall handling of high dpi screens (pixel vs userscale)
     attr |= kWindowFrameworkScaledAttribute;
@@ -1288,16 +1261,16 @@ void  wxTopLevelWindowMac::DoMacCreateRealWindow(
     wxCHECK_RET( err == noErr, wxT("Mac OS error when trying to create new window") );
 
     // setup a separate group for each window, so that overlays can be handled easily
-    
+
     WindowGroupRef overlaygroup = NULL;
     verify_noerr( CreateWindowGroup( kWindowGroupAttrMoveTogether | kWindowGroupAttrLayerTogether | kWindowGroupAttrHideOnCollapse, &overlaygroup ));
     verify_noerr( SetWindowGroupParent( overlaygroup, GetWindowGroup( (WindowRef) m_macWindow )));
     verify_noerr( SetWindowGroup( (WindowRef) m_macWindow , overlaygroup ));
-  
-       if ( activationScopeSet )
-       {
-               verify_noerr( SetWindowActivationScope( (WindowRef) m_macWindow , activationScope ));
-       }
+
+    if ( activationScopeSet )
+    {
+        verify_noerr( SetWindowActivationScope( (WindowRef) m_macWindow , activationScope ));
+    }
 
     // the create commands are only for content rect,
     // so we have to set the size again as structure bounds
@@ -1330,12 +1303,10 @@ void  wxTopLevelWindowMac::DoMacCreateRealWindow(
     }
 #endif
 
-#if TARGET_API_MAC_OSX
     if ( m_macWindow != NULL )
     {
         MacSetUnifiedAppearance( true ) ;
     }
-#endif
 
     HIViewRef growBoxRef = 0 ;
     err = HIViewFindByID( HIViewGetRoot( (WindowRef)m_macWindow ), kHIViewWindowGrowBoxID, &growBoxRef  );
@@ -1398,7 +1369,6 @@ void wxTopLevelWindowMac::MacActivate( long timestamp , bool WXUNUSED(inIsActiva
         s_macDeactivateWindow = NULL;
 
     MacDelayedDeactivation(timestamp);
-    MacPropagateHiliteChanged() ;
 }
 
 void wxTopLevelWindowMac::SetTitle(const wxString& title)
@@ -1417,11 +1387,9 @@ bool wxTopLevelWindowMac::Show(bool show)
     if ( !wxTopLevelWindowBase::Show(show) )
         return false;
 
-    bool plainTransition = false;
+    bool plainTransition = true;
 
 #if wxUSE_SYSTEM_OPTIONS
-    // code contributed by Ryan Wilcox December 18, 2003
-    plainTransition = UMAGetSystemVersion() >= 0x1000 ;
     if ( wxSystemOptions::HasOption(wxMAC_WINDOW_PLAIN_TRANSITION) )
         plainTransition = ( wxSystemOptions::GetOptionInt( wxMAC_WINDOW_PLAIN_TRANSITION ) == 1 ) ;
 #endif
@@ -1448,11 +1416,148 @@ bool wxTopLevelWindowMac::Show(bool show)
            ::TransitionWindow( (WindowRef)m_macWindow, kWindowZoomTransitionEffect, kWindowHideTransitionAction, NULL );
     }
 
-    MacPropagateVisibilityChanged() ;
-
     return true ;
 }
 
+bool wxTopLevelWindowMac::ShowWithEffect(wxShowEffect effect,
+                            unsigned timeout,
+                            wxDirection dir)
+{
+    // TODO factor common code
+    if ( !wxTopLevelWindowBase::Show(true) )
+        return false;
+    WindowTransitionEffect transition = 0 ;
+    switch( effect )
+    {
+        case wxSHOW_EFFECT_ROLL :
+        case wxSHOW_EFFECT_SLIDE :
+            transition = kWindowGenieTransitionEffect;
+            break;
+        case wxSHOW_EFFECT_BLEND :
+            transition = kWindowFadeTransitionEffect;
+            break;
+        case wxSHOW_EFFECT_EXPAND :
+        default :
+            // having sheets would be fine, but this might lead to a repositioning
+#if 0
+            if ( GetParent() )
+                transition = kWindowSheetTransitionEffect;
+            else
+#endif
+                transition = kWindowZoomTransitionEffect;
+            break;
+    }
+    
+    TransitionWindowOptions options;
+    options.version = 0;
+    options.duration = timeout / 1000.0;
+    options.window = transition == kWindowSheetTransitionEffect ? (WindowRef) GetParent()->MacGetTopLevelWindowRef() :0;
+    options.userData = 0;
+    
+    wxSize size = wxGetDisplaySize();
+    Rect bounds;
+    GetWindowBounds( (WindowRef)m_macWindow, kWindowStructureRgn, &bounds );
+    CGRect hiBounds = CGRectMake( bounds.left, bounds.top, bounds.right - bounds.left, bounds.bottom - bounds.top );
+
+    if ( dir & wxRIGHT )
+    {
+        hiBounds.origin.x = size.x;
+        hiBounds.size.width = 0;
+    }
+    if ( dir & wxUP )
+    {
+        hiBounds.origin.y = 0;
+        hiBounds.size.height = 0;
+    }
+    if ( dir & wxDOWN )
+    {
+        hiBounds.origin.y = size.y;
+        hiBounds.size.height = 0;
+    }
+    if ( dir & wxLEFT )
+    {
+        hiBounds.origin.x = 0;
+        hiBounds.size.width = 0;
+    }
+    
+    ::TransitionWindowWithOptions( (WindowRef)m_macWindow, transition, kWindowShowTransitionAction, transition == kWindowGenieTransitionEffect ? &hiBounds : NULL  ,  
+                                  false, &options );
+
+    ::SelectWindow( (WindowRef)m_macWindow ) ;
+    
+    // because apps expect a size event to occur at this moment
+    wxSizeEvent event(GetSize() , m_windowId);
+    event.SetEventObject(this);
+    GetEventHandler()->ProcessEvent(event);
+    
+    return true;
+}
+
+bool wxTopLevelWindowMac::HideWithEffect(wxShowEffect effect,
+                            unsigned timeout ,
+                            wxDirection dir )
+{
+    if ( !wxTopLevelWindowBase::Show(false) )
+        return false;
+    
+    WindowTransitionEffect transition = 0 ;
+    switch( effect )
+    {
+        case wxSHOW_EFFECT_ROLL :
+        case wxSHOW_EFFECT_SLIDE :
+            transition = kWindowGenieTransitionEffect;
+            break;
+        case wxSHOW_EFFECT_BLEND :
+            transition = kWindowFadeTransitionEffect;
+            break;
+        case wxSHOW_EFFECT_EXPAND :
+        default:
+#if 0
+            if ( GetParent() )
+                transition = kWindowSheetTransitionEffect;
+            else
+#endif
+                transition = kWindowZoomTransitionEffect;
+            break;
+    }
+    TransitionWindowOptions options;
+    options.version = 0;
+    options.duration = timeout / 1000.0;
+    options.window = transition == kWindowSheetTransitionEffect ? (WindowRef) GetParent()->MacGetTopLevelWindowRef() :0;
+    options.userData = 0;
+    
+    wxSize size = wxGetDisplaySize();
+    Rect bounds;
+    GetWindowBounds( (WindowRef)m_macWindow, kWindowStructureRgn, &bounds );
+    CGRect hiBounds = CGRectMake( bounds.left, bounds.top, bounds.right - bounds.left, bounds.bottom - bounds.top );
+    
+    if ( dir & wxRIGHT )
+    {
+        hiBounds.origin.x = size.x;
+        hiBounds.size.width = 0;
+    }
+    if ( dir & wxUP )
+    {
+        hiBounds.origin.y = 0;
+        hiBounds.size.height = 0;
+    }
+    if ( dir & wxDOWN )
+    {
+        hiBounds.origin.y = size.y;
+        hiBounds.size.height = 0;
+    }
+    if ( dir & wxLEFT )
+    {
+        hiBounds.origin.x = 0;
+        hiBounds.size.width = 0;
+    }
+    ::TransitionWindowWithOptions( (WindowRef)m_macWindow, transition, kWindowHideTransitionAction, transition == kWindowGenieTransitionEffect ? &hiBounds : NULL  ,  
+                                  false, &options );
+
+    return true;
+}
+
 bool wxTopLevelWindowMac::ShowFullScreen(bool show, long style)
 {
     if ( show )
@@ -1550,7 +1655,6 @@ void wxTopLevelWindowMac::SetExtraStyle(long exStyle)
 
     wxTopLevelWindowBase::SetExtraStyle( exStyle ) ;
 
-#if TARGET_API_MAC_OSX
     if ( m_macWindow != NULL )
     {
         bool metal = GetExtraStyle() & wxFRAME_EX_METAL ;
@@ -1563,7 +1667,6 @@ void wxTopLevelWindowMac::SetExtraStyle(long exStyle)
             MacSetMetalAppearance( metal ) ;
         }
     }
-#endif
 }
 
 bool wxTopLevelWindowMac::SetBackgroundStyle(wxBackgroundStyle style)
@@ -1652,53 +1755,37 @@ void wxTopLevelWindowMac::DoCentre(int dir)
 
 void wxTopLevelWindowMac::MacSetMetalAppearance( bool set )
 {
-#if TARGET_API_MAC_OSX
     if ( MacGetUnifiedAppearance() )
         MacSetUnifiedAppearance( false ) ;
 
     MacChangeWindowAttributes( set ? kWindowMetalAttribute : kWindowNoAttributes ,
         set ? kWindowNoAttributes : kWindowMetalAttribute ) ;
-#endif
 }
 
 bool wxTopLevelWindowMac::MacGetMetalAppearance() const
 {
-#if TARGET_API_MAC_OSX
     return MacGetWindowAttributes() & kWindowMetalAttribute ;
-#else
-    return false;
-#endif
 }
 
 void wxTopLevelWindowMac::MacSetUnifiedAppearance( bool set )
 {
-#if TARGET_API_MAC_OSX
-    if ( UMAGetSystemVersion() >= 0x1040 )
-    {
-        if ( MacGetMetalAppearance() )
-            MacSetMetalAppearance( false ) ;
-
-        MacChangeWindowAttributes( set ? kWindowUnifiedTitleAndToolbarAttribute : kWindowNoAttributes ,
-            set ? kWindowNoAttributes : kWindowUnifiedTitleAndToolbarAttribute) ;
-
-        // For some reason, Tiger uses white as the background color for this appearance,
-        // while most apps using it use the typical striped background. Restore that behavior
-        // for wx.
-        // TODO: Determine if we need this on Leopard as well. (should be harmless either way,
-        // though)
-        SetBackgroundColour( wxSYS_COLOUR_WINDOW ) ;
-    }
-#endif
+    if ( MacGetMetalAppearance() )
+        MacSetMetalAppearance( false ) ;
+
+    MacChangeWindowAttributes( set ? kWindowUnifiedTitleAndToolbarAttribute : kWindowNoAttributes ,
+        set ? kWindowNoAttributes : kWindowUnifiedTitleAndToolbarAttribute) ;
+
+    // For some reason, Tiger uses white as the background color for this appearance,
+    // while most apps using it use the typical striped background. Restore that behavior
+    // for wx.
+    // TODO: Determine if we need this on Leopard as well. (should be harmless either way,
+    // though)
+    SetBackgroundColour( wxSYS_COLOUR_WINDOW ) ;
 }
 
 bool wxTopLevelWindowMac::MacGetUnifiedAppearance() const
 {
-#if TARGET_API_MAC_OSX
-    if ( UMAGetSystemVersion() >= 0x1040 )
-        return MacGetWindowAttributes() & kWindowUnifiedTitleAndToolbarAttribute ;
-    else
-#endif
-        return false;
+    return MacGetWindowAttributes() & kWindowUnifiedTitleAndToolbarAttribute ;
 }
 
 void wxTopLevelWindowMac::MacChangeWindowAttributes( wxUint32 attributesToSet , wxUint32 attributesToClear )