]> git.saurik.com Git - wxWidgets.git/blobdiff - src/osx/cocoa/window.mm
translating background style BG_PAINT into opaqueness for speed-up of OS redraws...
[wxWidgets.git] / src / osx / cocoa / window.mm
index a5148d5ee30984fef325994a5749bedbb21af338..195d7894780ee6a4d1646ab9b9206bec50c07c8a 100644 (file)
@@ -13,7 +13,7 @@
 
 #ifndef WX_PRECOMP
     #include "wx/dcclient.h"
-    #include "wx/nonownedwnd.h"
+    #include "wx/frame.h"
     #include "wx/log.h"
     #include "wx/textctrl.h"
 #endif
@@ -131,6 +131,8 @@ NSRect wxOSXGetFrameForControl( wxWindowMac* window , const wxPoint& pos , const
 - (void)setAction:(SEL)aSelector;
 - (void)setDoubleAction:(SEL)aSelector;
 - (void)setBackgroundColor:(NSColor*)aColor;
+- (void)setOpaque:(BOOL)opaque;
+- (void)setTextColor:(NSColor *)color;
 - (void)setImagePosition:(NSCellImagePosition)aPosition;
 @end
 
@@ -688,7 +690,7 @@ void wxOSX_mouseEvent(NSView* self, SEL _cmd, NSEvent *event)
     impl->mouseEvent(event, self, _cmd);
 }
 
-BOOL wxOSX_acceptsFirstMouse(NSView* self, SEL _cmd, NSEvent *event)
+BOOL wxOSX_acceptsFirstMouse(NSView* WXUNUSED(self), SEL WXUNUSED(_cmd), NSEvent *WXUNUSED(event))
 {
     // This is needed to support click through, otherwise the first click on a window
     // will not do anything unless it is the active window already.
@@ -1091,15 +1093,23 @@ void wxWidgetCocoaImpl::drawRect(void* rect, WXWidget slf, void *WXUNUSED(_cmd))
     [slf getRectsBeingDrawn:&rects count:&count];
     for ( int i = 0 ; i < count ; ++i )
     {
-        updateRgn.Union(wxFromNSRect(slf, rects[i]) );
+        updateRgn.Union(wxFromNSRect(slf, rects[i]));
     }
 
     wxWindow* wxpeer = GetWXPeer();
+    if ( wxpeer->MacGetTopLevelWindow()->GetWindowStyle() & wxFRAME_SHAPED )
+    {
+        int xoffset = 0, yoffset = 0;
+        wxRegion rgn = wxpeer->MacGetTopLevelWindow()->GetShape();
+        wxpeer->MacRootWindowToWindow( &xoffset, &yoffset );
+        rgn.Offset( xoffset, yoffset );
+        updateRgn.Intersect(rgn);
+    }
+    
     wxpeer->GetUpdateRegion() = updateRgn;
     wxpeer->MacSetCGContextRef( context );
 
     bool handled = wxpeer->MacDoRedraw( 0 );
-
     CGContextRestoreGState( context );
 
     CGContextSaveGState( context );
@@ -1332,6 +1342,7 @@ void wxWidgetCocoaImpl::SetVisibility( bool visible )
 
 - (void)animationDidEnd:(NSAnimation*)animation
 {
+    wxUnusedVar(animation);
     m_isDone = true;
 }
 
@@ -1647,8 +1658,8 @@ bool wxWidgetCocoaImpl::SetFocus()
     if ( !CanFocus() )
         return false;
 
-    [[m_osxView window] makeFirstResponder: m_osxView] ;
     [[m_osxView window] makeKeyAndOrderFront:nil] ;
+    [[m_osxView window] makeFirstResponder: m_osxView] ;
     return true;
 }
 
@@ -1680,6 +1691,18 @@ void wxWidgetCocoaImpl::SetBackgroundColour( const wxColour &col )
     }
 }
 
+bool wxWidgetCocoaImpl::SetBackgroundStyle( wxBackgroundStyle style )
+{
+    BOOL opaque = ( style == wxBG_STYLE_PAINT );
+    
+    if ( [m_osxView respondsToSelector:@selector(setOpaque:) ] )
+    {
+        [m_osxView setOpaque: opaque];
+    }
+    
+    return true ;
+}
+
 void wxWidgetCocoaImpl::SetLabel( const wxString& title, wxFontEncoding encoding )
 {
     if ( [m_osxView respondsToSelector:@selector(setTitle:) ] )
@@ -1888,10 +1911,15 @@ void wxWidgetCocoaImpl::SetControlSize( wxWindowVariant variant )
     }
 }
 
-void wxWidgetCocoaImpl::SetFont(wxFont const& font, wxColour const&, long, bool)
+void wxWidgetCocoaImpl::SetFont(wxFont const& font, wxColour const&col, long, bool)
 {
     if ([m_osxView respondsToSelector:@selector(setFont:)])
         [m_osxView setFont: font.OSXGetNSFont()];
+    if ([m_osxView respondsToSelector:@selector(setTextColor:)])
+        [m_osxView setTextColor:[NSColor colorWithCalibratedRed:(CGFloat) (col.Red() / 255.0)
+                                                                 green:(CGFloat) (col.Green() / 255.0)
+                                                                  blue:(CGFloat) (col.Blue() / 255.0)
+                                                                 alpha:(CGFloat) (col.Alpha() / 255.0)]];
 }
 
 void wxWidgetCocoaImpl::SetToolTip(wxToolTip* tooltip)
@@ -1943,10 +1971,20 @@ bool wxWidgetCocoaImpl::DoHandleKeyEvent(NSEvent *event)
     {
         if ( !result )
         {
-            if ( [m_osxView isKindOfClass:[NSScrollView class] ] )
-                [[(NSScrollView*)m_osxView documentView] interpretKeyEvents:[NSArray arrayWithObject:event]];
+            if ( wxevent.GetKeyCode() < WXK_SPACE || wxevent.GetKeyCode() == WXK_DELETE || wxevent.GetKeyCode() >= WXK_START )
+            {
+                // eventually we could setup a doCommandBySelector catcher and retransform this into the wx key chars
+                wxKeyEvent wxevent2(wxevent) ;
+                wxevent2.SetEventType(wxEVT_CHAR);
+                GetWXPeer()->OSXHandleKeyEvent(wxevent2);
+            }
             else
-                [m_osxView interpretKeyEvents:[NSArray arrayWithObject:event]];
+            {
+                if ( [m_osxView isKindOfClass:[NSScrollView class] ] )
+                    [[(NSScrollView*)m_osxView documentView] interpretKeyEvents:[NSArray arrayWithObject:event]];
+                else
+                    [m_osxView interpretKeyEvents:[NSArray arrayWithObject:event]];
+            }
             result = true;
         }
     }
@@ -2059,9 +2097,24 @@ wxWidgetImpl* wxWidgetImpl::CreateUserPane( wxWindowMac* wxpeer, wxWindowMac* WX
 wxWidgetImpl* wxWidgetImpl::CreateContentView( wxNonOwnedWindow* now )
 {
     NSWindow* tlw = now->GetWXWindow();
-    wxNSView* v = [[wxNSView alloc] initWithFrame:[[tlw contentView] frame]];
-    wxWidgetCocoaImpl* c = new wxWidgetCocoaImpl( now, v, true );
-    c->InstallEventHandler();
-    [tlw setContentView:v];
+    
+    wxWidgetCocoaImpl* c = NULL;
+    if ( now->IsNativeWindowWrapper() )
+    {
+        NSView* cv = [tlw contentView];
+        c = new wxWidgetCocoaImpl( now, cv, true );
+        // increase ref count, because the impl destructor will decrement it again
+        CFRetain(cv);
+        if ( !now->IsShown() )
+            [cv setHidden:NO];
+        
+    }
+    else
+    {
+        wxNSView* v = [[wxNSView alloc] initWithFrame:[[tlw contentView] frame]];
+        c = new wxWidgetCocoaImpl( now, v, true );
+        c->InstallEventHandler();
+        [tlw setContentView:v];
+    }
     return c;
 }