X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ab9a0b84de5207cb26048ed3c237aaffb7a1356c..6178debcd342963974dbdce6ac2ddb2fbe89e42a:/src/osx/nonownedwnd_osx.cpp?ds=sidebyside diff --git a/src/osx/nonownedwnd_osx.cpp b/src/osx/nonownedwnd_osx.cpp index fc50ea4091..638af1d7ac 100644 --- a/src/osx/nonownedwnd_osx.cpp +++ b/src/osx/nonownedwnd_osx.cpp @@ -45,36 +45,30 @@ wxWindow* g_MacLastWindow = NULL ; // wxWindowMac utility functions // --------------------------------------------------------------------------- -// Find an item given the Macintosh Window Reference - -WX_DECLARE_HASH_MAP(WXWindow, wxNonOwnedWindow*, wxPointerHash, wxPointerEqual, MacWindowMap); +WX_DECLARE_HASH_MAP(WXWindow, wxNonOwnedWindowImpl*, wxPointerHash, wxPointerEqual, MacWindowMap); static MacWindowMap wxWinMacWindowList; -wxNonOwnedWindow *wxFindWindowFromWXWindow(WXWindow inWindowRef) +wxNonOwnedWindow* wxNonOwnedWindow::GetFromWXWindow( WXWindow win ) { - MacWindowMap::iterator node = wxWinMacWindowList.find(inWindowRef); - - return (node == wxWinMacWindowList.end()) ? NULL : node->second; + wxNonOwnedWindowImpl* impl = wxNonOwnedWindowImpl::FindFromWXWindow(win); + + return ( impl != NULL ? impl->GetWXPeer() : NULL ) ; } -void wxAssociateWindowWithWXWindow(WXWindow inWindowRef, wxNonOwnedWindow *win) ; -void wxAssociateWindowWithWXWindow(WXWindow inWindowRef, wxNonOwnedWindow *win) +wxNonOwnedWindowImpl* wxNonOwnedWindowImpl::FindFromWXWindow (WXWindow window) { - // adding NULL WindowRef is (first) surely a result of an error and - // nothing else :-) - wxCHECK_RET( inWindowRef != (WXWindow) NULL, wxT("attempt to add a NULL WindowRef to window list") ); - - wxWinMacWindowList[inWindowRef] = win; + MacWindowMap::iterator node = wxWinMacWindowList.find(window); + + return (node == wxWinMacWindowList.end()) ? NULL : node->second; } -void wxRemoveWXWindowAssociation(wxNonOwnedWindow *win) ; -void wxRemoveWXWindowAssociation(wxNonOwnedWindow *win) +void wxNonOwnedWindowImpl::RemoveAssociations( wxNonOwnedWindowImpl* impl) { MacWindowMap::iterator it; for ( it = wxWinMacWindowList.begin(); it != wxWinMacWindowList.end(); ++it ) { - if ( it->second == win ) + if ( it->second == impl ) { wxWinMacWindowList.erase(it); break; @@ -82,9 +76,13 @@ void wxRemoveWXWindowAssociation(wxNonOwnedWindow *win) } } -wxNonOwnedWindow* wxNonOwnedWindow::GetFromWXWindow( WXWindow win ) +void wxNonOwnedWindowImpl::Associate( WXWindow window, wxNonOwnedWindowImpl *impl ) { - return wxFindWindowFromWXWindow( win ); + // adding NULL WindowRef is (first) surely a result of an error and + // nothing else :-) + wxCHECK_RET( window != (WXWindow) NULL, wxT("attempt to add a NULL WindowRef to window list") ); + + wxWinMacWindowList[window] = impl; } // ---------------------------------------------------------------------------- @@ -98,6 +96,7 @@ wxNonOwnedWindow *wxNonOwnedWindow::s_macDeactivateWindow = NULL; void wxNonOwnedWindow::Init() { m_nowpeer = NULL; + m_isNativeWindowWrapper = false; } bool wxNonOwnedWindow::Create(wxWindow *parent, @@ -107,9 +106,6 @@ bool wxNonOwnedWindow::Create(wxWindow *parent, long style, const wxString& name) { - // init our fields - Init(); - m_windowStyle = style; SetName( name ); @@ -134,7 +130,7 @@ bool wxNonOwnedWindow::Create(wxWindow *parent, int h = HeightDefault(size.y); m_nowpeer = wxNonOwnedWindowImpl::CreateNonOwnedWindow(this, parent, wxPoint(x,y) , wxSize(w,h) , style , GetExtraStyle(), name ); - wxAssociateWindowWithWXWindow( m_nowpeer->GetWXWindow() , this ) ; + wxNonOwnedWindowImpl::Associate( m_nowpeer->GetWXWindow() , m_nowpeer ) ; m_peer = wxWidgetImpl::CreateContentView(this); DoSetWindowVariant( m_windowVariant ) ; @@ -150,21 +146,47 @@ bool wxNonOwnedWindow::Create(wxWindow *parent, return true; } +bool wxNonOwnedWindow::Create(wxWindow *parent, WXWindow nativeWindow) +{ + m_nowpeer = wxNonOwnedWindowImpl::CreateNonOwnedWindow(this, parent, nativeWindow ); + m_isNativeWindowWrapper = true; + wxNonOwnedWindowImpl::Associate( m_nowpeer->GetWXWindow() , m_nowpeer ) ; + m_peer = wxWidgetImpl::CreateContentView(this); + + if ( parent ) + parent->AddChild(this); + + return true; +} + wxNonOwnedWindow::~wxNonOwnedWindow() { SendDestroyEvent(); - wxRemoveWXWindowAssociation( this ) ; + wxNonOwnedWindowImpl::RemoveAssociations(m_nowpeer) ; DestroyChildren(); - delete m_nowpeer; + wxDELETE(m_nowpeer); // avoid dangling refs if ( s_macDeactivateWindow == this ) s_macDeactivateWindow = NULL; } +bool wxNonOwnedWindow::Destroy() +{ + WillBeDestroyed(); + + return wxWindow::Destroy(); +} + +void wxNonOwnedWindow::WillBeDestroyed() +{ + if ( m_nowpeer ) + m_nowpeer->WillBeDestroyed(); +} + // ---------------------------------------------------------------------------- // wxNonOwnedWindow misc // ---------------------------------------------------------------------------- @@ -217,6 +239,17 @@ bool wxNonOwnedWindow::SetBackgroundColour(const wxColour& c ) return true; } +void wxNonOwnedWindow::SetWindowStyleFlag(long flags) +{ + if (flags == GetWindowStyleFlag()) + return; + + wxWindow::SetWindowStyleFlag(flags); + + if (m_nowpeer) + m_nowpeer->SetWindowStyleFlag(flags); +} + // Raise the window to the top of the Z order void wxNonOwnedWindow::Raise() { @@ -400,7 +433,7 @@ void wxNonOwnedWindow::DoGetClientSize( int *width, int *height ) const int left, top, w, h; m_nowpeer->GetContentArea(left, top, w, h); - + if (width) *width = w ; if (height) @@ -428,6 +461,8 @@ bool wxNonOwnedWindow::DoSetShape(const wxRegion& region) wxCHECK_MSG( HasFlag(wxFRAME_SHAPED), false, wxT("Shaped windows must be created with the wxFRAME_SHAPED style.")); + m_shape = region; + // The empty region signifies that the shape // should be removed from the window. if ( region.IsEmpty() )