]> git.saurik.com Git - wxWidgets.git/commitdiff
adding wrapping possibility for native tlws
authorStefan Csomor <csomor@advancedconcepts.ch>
Tue, 13 Apr 2010 20:24:59 +0000 (20:24 +0000)
committerStefan Csomor <csomor@advancedconcepts.ch>
Tue, 13 Apr 2010 20:24:59 +0000 (20:24 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@63969 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/osx/carbon/private.h
include/wx/osx/cocoa/private.h
include/wx/osx/core/private.h
include/wx/osx/nonownedwnd.h
include/wx/osx/window.h
src/osx/carbon/nonownedwnd.cpp
src/osx/carbon/window.cpp
src/osx/cocoa/nonownedwnd.mm
src/osx/cocoa/window.mm
src/osx/nonownedwnd_osx.cpp
src/osx/window_osx.cpp

index c677e8331612a92b9799e6aededd784b1e72463e..ab9ac47ed4ab4239f1010cb33f873694b99da5db 100644 (file)
@@ -1002,12 +1002,14 @@ class wxNonOwnedWindowCarbonImpl : public wxNonOwnedWindowImpl
 {
 public :
     wxNonOwnedWindowCarbonImpl( wxNonOwnedWindow* nonownedwnd) ;
+
     wxNonOwnedWindowCarbonImpl();
     virtual ~wxNonOwnedWindowCarbonImpl();
 
     virtual void WillBeDestroyed() ;
     void Create( wxWindow* parent, const wxPoint& pos, const wxSize& size,
     long style, long extraStyle, const wxString& name ) ;
+    void Create( wxWindow* parent, WXWindow nativeWindow );
 
     WXWindow GetWXWindow() const;
     void Raise();
index b8b0e07d31c92f8882083ea804b4c3be6c070755..893aba3ac21f099d6315a5eef4718a6c5325084c 100644 (file)
@@ -209,6 +209,7 @@ public :
     virtual void WillBeDestroyed() ;
     void Create( wxWindow* parent, const wxPoint& pos, const wxSize& size,
     long style, long extraStyle, const wxString& name ) ;
+    void Create( wxWindow* parent, WXWindow nativeWindow );
 
     WXWindow GetWXWindow() const;
     void Raise();
index 8844689e36cabfb13c012ad65d8b8037d52457a3..b3ff76448dec68022a4f854da88767c9bbd21070 100644 (file)
@@ -796,6 +796,8 @@ public :
 
     // static creation methods, must be implemented by all toolkits
 
+    static wxNonOwnedWindowImpl* CreateNonOwnedWindow( wxNonOwnedWindow* wxpeer, wxWindow* parent, WXWindow native) ;
+    
     static wxNonOwnedWindowImpl* CreateNonOwnedWindow( wxNonOwnedWindow* wxpeer, wxWindow* parent, const wxPoint& pos, const wxSize& size,
     long style, long extraStyle, const wxString& name  ) ;
     
index 57de414d6cdc93e4f21bd372f820dbf6caea83b5..8a82458f8ebba64ff3a127f8dc80cc658f3e3228 100644 (file)
@@ -55,6 +55,8 @@ public:
                 long style = 0,
                 const wxString& name = wxPanelNameStr);
 
+    bool Create(wxWindow *parent, WXWindow nativeWindow);
+    
     virtual ~wxNonOwnedWindow();
 
     virtual wxPoint GetClientAreaOrigin() const;
@@ -106,7 +108,7 @@ public:
     virtual void HandleResizing( double timestampsec, wxRect* rect );
     
     virtual bool Destroy();
-
+    
 protected:
     // common part of all ctors
     void Init();
index 51f34e91d776d732d281162f9e153ce24574afd5..9f5b7ae7bfe7a5a84820f38f00fad5596698320c 100644 (file)
@@ -263,6 +263,8 @@ public:
 
     virtual bool        OSXHandleClicked( double timestampsec );
     virtual bool        OSXHandleKeyEvent( wxKeyEvent& event );
+    
+    bool                IsNativeWindowWrapper() const { return m_isNativeWindowWrapper; }
 protected:
     // For controls like radio buttons which are genuinely composite
     wxList              m_subControls;
@@ -297,6 +299,8 @@ protected:
     bool                m_vScrollBarAlwaysShown;
     wxWindow*           m_growBox ;
     wxString            m_label ;
+    
+    bool                m_isNativeWindowWrapper;
 
     // set to true if we do a sharp clip at the content area of this window
     // must be dynamic as eg a panel normally is not clipping precisely, but if
index f5e87300b6923b00ef63bcc4cd2bb706ed208bab..bdebc836a51e5f55f52898a06c8b315d2bae2f25 100644 (file)
@@ -1134,7 +1134,7 @@ wxNonOwnedWindowCarbonImpl::~wxNonOwnedWindowCarbonImpl()
         m_macEventHandler = NULL ;
     }
 
-    if ( m_macWindow )
+    if ( m_macWindow && !m_wxPeer->IsNativeWindowWrapper())
         DisposeWindow( m_macWindow );
 
     FullScreenData *data = (FullScreenData *) m_macFullScreenData ;
@@ -1192,30 +1192,37 @@ void wxNonOwnedWindowCarbonImpl::MacInstallTopLevelWindowEventHandler()
 
 void wxNonOwnedWindowCarbonImpl::Create(
     wxWindow* parent,
-    const wxPoint& pos,
-    const wxSize& size,
-    long style, long extraStyle,
-    const wxString& WXUNUSED(name) )
+    WXWindow nativeWindow )
 {
+    m_macWindow = nativeWindow;
+}
 
+void wxNonOwnedWindowCarbonImpl::Create(
+                                        wxWindow* parent,
+                                        const wxPoint& pos,
+                                        const wxSize& size,
+                                        long style, long extraStyle,
+                                        const wxString& WXUNUSED(name) )
+{
+    
     OSStatus err = noErr ;
     Rect theBoundsRect;
-
+    
     int x = (int)pos.x;
     int y = (int)pos.y;
-
+    
     int w = size.x;
     int h = size.y;
-
+    
     ::SetRect(&theBoundsRect, x, y , x + w, y + h);
-
+    
     // translate the window attributes in the appropriate window class and attributes
     WindowClass wclass = 0;
     WindowAttributes attr = kWindowNoAttributes ;
     WindowGroupRef group = NULL ;
     bool activationScopeSet = false;
     WindowActivationScope activationScope = kWindowActivationScopeNone;
-
+    
     if ( style & wxFRAME_TOOL_WINDOW )
     {
         if (
@@ -1228,7 +1235,7 @@ void wxNonOwnedWindowCarbonImpl::Create(
                 wclass = kUtilityWindowClass;
             else
                 wclass = kFloatingWindowClass ;
-
+            
             if ( ( style &wxTINY_CAPTION_VERT) )
                 attr |= kWindowSideTitlebarAttribute ;
         }
@@ -1287,81 +1294,81 @@ void wxNonOwnedWindowCarbonImpl::Create(
             wclass = kPlainWindowClass ;
         }
     }
-
+    
     if ( wclass != kPlainWindowClass )
     {
         if ( ( style & wxMINIMIZE_BOX ) )
             attr |= kWindowCollapseBoxAttribute ;
-
+        
         if ( ( style & wxMAXIMIZE_BOX ) )
             attr |= kWindowFullZoomAttribute ;
-
+        
         if ( ( style & wxRESIZE_BORDER ) )
             attr |= kWindowResizableAttribute ;
-
+        
         if ( ( style & wxCLOSE_BOX) )
             attr |= kWindowCloseBoxAttribute ;
     }
     attr |= kWindowLiveResizeAttribute;
-
+    
     if ( ( style &wxSTAY_ON_TOP) )
         group = GetWindowGroupOfClass(kUtilityWindowClass) ;
-
+    
     if ( ( style & wxFRAME_FLOAT_ON_PARENT ) )
         group = GetWindowGroupOfClass(kFloatingWindowClass) ;
-
+    
     if ( group == NULL && parent != NULL )
     {
         WindowRef parenttlw = (WindowRef) parent->MacGetTopLevelWindowRef();
         if( parenttlw )
             group = GetWindowGroupParent( GetWindowGroup( parenttlw ) );
     }
-
+    
     attr |= kWindowCompositingAttribute;
 #if 0 // TODO : decide on overall handling of high dpi screens (pixel vs userscale)
     attr |= kWindowFrameworkScaledAttribute;
 #endif
-
+    
     if ( ( style &wxFRAME_SHAPED) )
     {
         WindowDefSpec customWindowDefSpec;
         customWindowDefSpec.defType = kWindowDefProcPtr;
         customWindowDefSpec.u.defProc =
 #ifdef __LP64__
-            (WindowDefUPP) wxShapedMacWindowDef;
+        (WindowDefUPP) wxShapedMacWindowDef;
 #else
-            NewWindowDefUPP(wxShapedMacWindowDef);
+        NewWindowDefUPP(wxShapedMacWindowDef);
 #endif
         err = ::CreateCustomWindow( &customWindowDefSpec, wclass,
-                              attr, &theBoundsRect,
-                              (WindowRef*) &m_macWindow);
+                                   attr, &theBoundsRect,
+                                   (WindowRef*) &m_macWindow);
     }
     else
     {
         err = ::CreateNewWindow( wclass , attr , &theBoundsRect , (WindowRef*)&m_macWindow ) ;
     }
-
+    
     if ( err == noErr && m_macWindow != NULL && group != NULL )
         SetWindowGroup( (WindowRef) m_macWindow , group ) ;
-
+    
     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 ));
     }
-
+    
     // the create commands are only for content rect,
     // so we have to set the size again as structure bounds
     SetWindowBounds( m_macWindow , kWindowStructureRgn , &theBoundsRect ) ;
-
+    
     // Causes the inner part of the window not to be metal
     // if the style is used before window creation.
 #if 0 // TARGET_API_MAC_OSX
@@ -1371,24 +1378,24 @@ void wxNonOwnedWindowCarbonImpl::Create(
             MacSetMetalAppearance( true ) ;
     }
 #endif
-
+    
     if ( m_macWindow != NULL )
     {
         MacSetUnifiedAppearance( true ) ;
     }
-
+    
     HIViewRef growBoxRef = 0 ;
     err = HIViewFindByID( HIViewGetRoot( m_macWindow ), kHIViewWindowGrowBoxID, &growBoxRef  );
     if ( err == noErr && growBoxRef != 0 )
         HIGrowBoxViewSetTransparent( growBoxRef, true ) ;
-
+    
     // the frame window event handler
     InstallStandardEventHandler( GetWindowEventTarget(m_macWindow) ) ;
     MacInstallTopLevelWindowEventHandler() ;
-
+    
     if ( extraStyle & wxFRAME_EX_METAL)
         MacSetMetalAppearance(true);
-
+    
     if ( ( style &wxFRAME_SHAPED) )
     {
         // default shape matches the window size
@@ -1689,3 +1696,11 @@ wxNonOwnedWindowImpl* wxNonOwnedWindowImpl::CreateNonOwnedWindow( wxNonOwnedWind
     now->Create( parent, pos, size, style , extraStyle, name );
     return now;
 }
+
+wxNonOwnedWindowImpl* wxNonOwnedWindowImpl::CreateNonOwnedWindow( wxNonOwnedWindow* wxpeer, wxWindow* parent, WXWindow nativeWindow )
+{
+    wxNonOwnedWindowCarbonImpl* now = new wxNonOwnedWindowCarbonImpl( wxpeer );
+    now->Create( parent, nativeWindow );
+    return now;
+}
+
index 1e54d5a279a86d0d32bd462fed7c6a88dcbf2484..cab7af9aad2e9a82c2b6095e371713d34c4bb0bf 100644 (file)
@@ -188,7 +188,13 @@ static pascal OSStatus wxMacWindowControlEventHandler( EventHandlerCallRef handl
                     OSStatus err = cEvent.GetParameter<CGContextRef>(kEventParamCGContextRef, &cgContext) ;
                     if ( err != noErr )
                     {
-                        wxFAIL_MSG("Unable to retrieve CGContextRef");
+                        // for non-composite drawing, since we don't support it ourselves, send it through the
+                        // the default handler
+                        // CallNextEventHandler( handler,event ) ;
+                        // result = noErr ;
+                        if ( allocatedRgn )
+                            CFRelease( allocatedRgn ) ;
+                        break;
                     }
 
                     thisWindow->MacSetCGContextRef( cgContext ) ;
@@ -1515,6 +1521,8 @@ wxWidgetImplType* wxWidgetImpl::CreateContentView( wxNonOwnedWindow* now )
     }
 
     // the root control level handler
-    contentview->InstallEventHandler() ;
+    if ( !now->IsNativeWindowWrapper() )
+        contentview->InstallEventHandler() ;
+    
     return contentview;
 }
index 666864b9ad29ce734417562a69f01971b4375ab6..ce605c4161f71de5fb7f09d4e851c16fe6073e24 100644 (file)
@@ -361,14 +361,20 @@ wxNonOwnedWindowCocoaImpl::wxNonOwnedWindowCocoaImpl()
 
 wxNonOwnedWindowCocoaImpl::~wxNonOwnedWindowCocoaImpl()
 {
-    [m_macWindow setImplementation:nil];
-    [m_macWindow setDelegate:nil];
-    [m_macWindow release];
+    if ( !m_wxPeer->IsNativeWindowWrapper() )
+    {
+        [m_macWindow setImplementation:nil];
+        [m_macWindow setDelegate:nil];
+        [m_macWindow release];
+    }
 }
 
 void wxNonOwnedWindowCocoaImpl::WillBeDestroyed()
 {
-    [m_macWindow setDelegate:nil];
+    if ( !m_wxPeer->IsNativeWindowWrapper() )
+    {
+        [m_macWindow setDelegate:nil];
+    }
 }
 
 void wxNonOwnedWindowCocoaImpl::Create( wxWindow* WXUNUSED(parent), const wxPoint& pos, const wxSize& size,
@@ -493,6 +499,10 @@ long style, long extraStyle, const wxString& WXUNUSED(name) )
     }
 }
 
+void wxNonOwnedWindowCocoaImpl::Create( wxWindow* WXUNUSED(parent), WXWindow nativeWindow )
+{
+    m_macWindow = nativeWindow;
+}
 
 WXWindow wxNonOwnedWindowCocoaImpl::GetWXWindow() const
 {
@@ -787,6 +797,13 @@ bool wxNonOwnedWindowCocoaImpl::IsModified() const
     return [m_macWindow isDocumentEdited];
 }
 
+wxNonOwnedWindowImpl* wxNonOwnedWindowImpl::CreateNonOwnedWindow( wxNonOwnedWindow* wxpeer, wxWindow* parent, WXWindow nativeWindow)
+{
+    wxNonOwnedWindowCocoaImpl* now = new wxNonOwnedWindowCocoaImpl( wxpeer );
+    now->Create( parent, nativeWindow );
+    return now;
+}
+
 wxNonOwnedWindowImpl* wxNonOwnedWindowImpl::CreateNonOwnedWindow( wxNonOwnedWindow* wxpeer, wxWindow* parent, const wxPoint& pos, const wxSize& size,
     long style, long extraStyle, const wxString& name )
 {
index f2e96c78d9d467fe2f3696ff717d4578c9c1ce8b..6acdec29ee9746aebaf4863d93a658b9f72a9e0e 100644 (file)
@@ -2084,10 +2084,18 @@ 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() )
+    {
+        c = new wxWidgetCocoaImpl( now, [tlw contentView], true );
+    }
+    else
+    {
+        wxNSView* v = [[wxNSView alloc] initWithFrame:[[tlw contentView] frame]];
+        c = new wxWidgetCocoaImpl( now, v, true );
+        c->InstallEventHandler();
+        [tlw setContentView:v];
+    }
     return c;
 }
index a75e778ba84bc62f3bb3f098ddb6b4c107b40324..741b6468776c7d8ef54faa642f7191d8c93a34c8 100644 (file)
@@ -98,6 +98,7 @@ wxNonOwnedWindow *wxNonOwnedWindow::s_macDeactivateWindow = NULL;
 void wxNonOwnedWindow::Init()
 {
     m_nowpeer = NULL;
+    m_isNativeWindowWrapper = false;
 }
 
 bool wxNonOwnedWindow::Create(wxWindow *parent,
@@ -107,9 +108,6 @@ bool wxNonOwnedWindow::Create(wxWindow *parent,
                                  long style,
                                  const wxString& name)
 {
-    // init our fields
-    Init();
-
     m_windowStyle = style;
 
     SetName( name );
@@ -150,6 +148,19 @@ bool wxNonOwnedWindow::Create(wxWindow *parent,
     return true;
 }
 
+bool wxNonOwnedWindow::Create(wxWindow *parent, WXWindow nativeWindow)
+{
+    m_nowpeer = wxNonOwnedWindowImpl::CreateNonOwnedWindow(this, parent, nativeWindow );
+    m_isNativeWindowWrapper = true;
+    wxAssociateWindowWithWXWindow( m_nowpeer->GetWXWindow() , this ) ;
+    m_peer = wxWidgetImpl::CreateContentView(this);
+
+    if ( parent )
+        parent->AddChild(this);
+    
+    return true;
+}
+
 wxNonOwnedWindow::~wxNonOwnedWindow()
 {
     SendDestroyEvent();
index 89afdc7171e623a5862699ac4010435a387d8234..04e3a9e127f7265c8cd318d3405870d767ef8bc7 100644 (file)
@@ -206,6 +206,7 @@ void wxWindowMac::Init()
     m_macIsUserPane = true;
     m_clipChildren = false ;
     m_cachedClippedRectValid = false ;
+    m_isNativeWindowWrapper = false;
 }
 
 wxWindowMac::~wxWindowMac()