X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4db3c8ac631546f9b695e7590eaa4cb2805a1145..fad92e2f367f5c37ba4d80c9b57a4453e86c6ac2:/src/cocoa/dcclient.mm diff --git a/src/cocoa/dcclient.mm b/src/cocoa/dcclient.mm index bcf82d7aab..eabd5cda12 100644 --- a/src/cocoa/dcclient.mm +++ b/src/cocoa/dcclient.mm @@ -1,6 +1,6 @@ ///////////////////////////////////////////////////////////////////////////// // Name: src/cocoa/dcclient.mm -// Purpose: wxWindowDC, wxPaintDC, and wxClientDC classes +// Purpose: wxWindowDCImpl, wxPaintDCImpl, and wxClientDCImpl classes // Author: David Elliott // Modified by: // Created: 2003/04/01 @@ -13,9 +13,10 @@ #ifndef WX_PRECOMP #include "wx/log.h" #include "wx/window.h" - #include "wx/dcclient.h" #endif //WX_PRECOMP +#include "wx/cocoa/dcclient.h" + #import #import #import @@ -24,29 +25,31 @@ #import /* - * wxWindowDC + * wxWindowDCImpl */ -IMPLEMENT_DYNAMIC_CLASS(wxWindowDC, wxDC) +IMPLEMENT_ABSTRACT_CLASS(wxWindowDCImpl, wxCocoaDCImpl) -wxWindowDC::wxWindowDC(void) -: m_window(NULL) +wxWindowDCImpl::wxWindowDCImpl(wxDC *owner) +: wxCocoaDCImpl(owner) +, m_window(NULL) , m_lockedNSView(NULL) { }; -wxWindowDC::wxWindowDC( wxWindow *window ) -: m_window(window) +wxWindowDCImpl::wxWindowDCImpl(wxDC *owner, wxWindow *window) +: wxCocoaDCImpl(owner) +, m_window(window) , m_lockedNSView(NULL) { wxLogDebug(wxT("non-client window DC's are not supported, oh well")); }; -wxWindowDC::~wxWindowDC(void) +wxWindowDCImpl::~wxWindowDCImpl(void) { CocoaUnwindStackAndLoseFocus(); }; -bool wxWindowDC::CocoaLockFocusOnNSView(WX_NSView nsview) +bool wxWindowDCImpl::CocoaLockFocusOnNSView(WX_NSView nsview) { if([nsview lockFocusIfCanDraw]) { @@ -59,7 +62,7 @@ bool wxWindowDC::CocoaLockFocusOnNSView(WX_NSView nsview) return false; } -bool wxWindowDC::CocoaUnlockFocusOnNSView() +bool wxWindowDCImpl::CocoaUnlockFocusOnNSView() { [[m_lockedNSView window] flushWindow]; [m_lockedNSView unlockFocus]; @@ -67,97 +70,108 @@ bool wxWindowDC::CocoaUnlockFocusOnNSView() return true; } -bool wxWindowDC::CocoaLockFocus() +bool wxWindowDCImpl::CocoaLockFocus() { - wxLogTrace(wxTRACE_COCOA,wxT("Locking focus on wxWindowDC=%p, NSView=%p"),this, m_window->GetNonClientNSView()); - m_cocoaWxToBoundsTransform = CocoaGetWxToBoundsTransform([m_window->GetNonClientNSView() isFlipped], [m_window->GetNonClientNSView() bounds].size.height); + wxLogTrace(wxTRACE_COCOA,wxT("Locking focus on wxWindowDCImpl=%p, NSView=%p"),this, m_window->GetNonClientNSView()); + NSAffineTransform *newTransform = CocoaGetWxToBoundsTransform([m_window->GetNonClientNSView() isFlipped], [m_window->GetNonClientNSView() bounds].size.height); + [newTransform retain]; + [m_cocoaWxToBoundsTransform release]; + m_cocoaWxToBoundsTransform = newTransform; return CocoaLockFocusOnNSView(m_window->GetNonClientNSView()); } -bool wxWindowDC::CocoaUnlockFocus() +bool wxWindowDCImpl::CocoaUnlockFocus() { - wxLogTrace(wxTRACE_COCOA,wxT("Unlocking focus on wxWindowDC=%p, NSView=%p"),this, m_window->GetNonClientNSView()); + wxLogTrace(wxTRACE_COCOA,wxT("Unlocking focus on wxWindowDCImpl=%p, NSView=%p"),this, m_window->GetNonClientNSView()); return CocoaUnlockFocusOnNSView(); } -void wxWindowDC::Clear() +bool wxWindowDCImpl::CocoaGetBounds(void *rectData) { - if(!CocoaTakeFocus()) return; - - NSGraphicsContext *context = [NSGraphicsContext currentContext]; - [context saveGraphicsState]; - - [m_backgroundBrush.GetNSColor() set]; - [NSBezierPath fillRect:[m_lockedNSView bounds]]; - - [context restoreGraphicsState]; + if(!rectData) + return false; + if(!m_lockedNSView) + return false; + NSRect *pRect = (NSRect*)rectData; + *pRect = [m_lockedNSView bounds]; + return true; } /* - * wxClientDC + * wxClientDCImpl */ -IMPLEMENT_DYNAMIC_CLASS(wxClientDC, wxWindowDC) +IMPLEMENT_ABSTRACT_CLASS(wxClientDCImpl, wxWindowDCImpl) -wxClientDC::wxClientDC(void) +wxClientDCImpl::wxClientDCImpl(wxDC *owner) +: wxWindowDCImpl(owner) { }; -wxClientDC::wxClientDC( wxWindow *window ) +wxClientDCImpl::wxClientDCImpl(wxDC *owner, wxWindow *window) +: wxWindowDCImpl(owner) { m_window = window; }; -wxClientDC::~wxClientDC(void) +wxClientDCImpl::~wxClientDCImpl(void) { CocoaUnwindStackAndLoseFocus(); }; -bool wxClientDC::CocoaLockFocus() +bool wxClientDCImpl::CocoaLockFocus() { - wxLogTrace(wxTRACE_COCOA,wxT("Locking focus on wxClientDC=%p, NSView=%p"),this, m_window->GetNSView()); - m_cocoaWxToBoundsTransform = m_window->CocoaGetWxToBoundsTransform(); + wxLogTrace(wxTRACE_COCOA,wxT("Locking focus on wxClientDCImpl=%p, NSView=%p"),this, m_window->GetNSView()); + NSAffineTransform *newTransform = m_window->CocoaGetWxToBoundsTransform(); + [newTransform retain]; + [m_cocoaWxToBoundsTransform release]; + m_cocoaWxToBoundsTransform = newTransform; return CocoaLockFocusOnNSView(m_window->GetNSView()); } -bool wxClientDC::CocoaUnlockFocus() +bool wxClientDCImpl::CocoaUnlockFocus() { - wxLogTrace(wxTRACE_COCOA,wxT("Unlocking focus on wxClientDC=%p, NSView=%p"),this, m_window->GetNSView()); + wxLogTrace(wxTRACE_COCOA,wxT("Unlocking focus on wxClientDCImpl=%p, NSView=%p"),this, m_window->GetNSView()); return CocoaUnlockFocusOnNSView(); } /* - * wxPaintDC + * wxPaintDCImpl */ -IMPLEMENT_DYNAMIC_CLASS(wxPaintDC, wxWindowDC) +IMPLEMENT_ABSTRACT_CLASS(wxPaintDCImpl, wxWindowDCImpl) -wxPaintDC::wxPaintDC(void) +wxPaintDCImpl::wxPaintDCImpl(wxDC *owner) +: wxWindowDCImpl(owner) { }; -wxPaintDC::wxPaintDC( wxWindow *window ) +wxPaintDCImpl::wxPaintDCImpl(wxDC *owner, wxWindow *window) +: wxWindowDCImpl(owner) { m_window = window; - wxASSERT_MSG([NSView focusView]==window->GetNSView(), wxT("PaintDC's NSView does not have focus. Please use wxPaintDC only as the first DC created in a paint handler")); + wxASSERT_MSG([NSView focusView]==window->GetNSView(), wxT("PaintDC's NSView does not have focus. Please use wxPaintDCImpl only as the first DC created in a paint handler")); sm_cocoaDCStack.Insert(this); m_lockedNSView = window->GetNSView(); - m_cocoaWxToBoundsTransform = window->CocoaGetWxToBoundsTransform(); + NSAffineTransform *newTransform = window->CocoaGetWxToBoundsTransform(); + [newTransform retain]; + [m_cocoaWxToBoundsTransform release]; + m_cocoaWxToBoundsTransform = newTransform; CocoaApplyTransformations(); }; -wxPaintDC::~wxPaintDC(void) +wxPaintDCImpl::~wxPaintDCImpl(void) { CocoaUnwindStackAndLoseFocus(); }; -bool wxPaintDC::CocoaLockFocus() +bool wxPaintDCImpl::CocoaLockFocus() { - wxFAIL_MSG(wxT("wxPaintDC cannot be asked to lock focus!")); + wxFAIL_MSG(wxT("wxPaintDCImpl cannot be asked to lock focus!")); return false; } -bool wxPaintDC::CocoaUnlockFocus() +bool wxPaintDCImpl::CocoaUnlockFocus() { - // wxPaintDC focus can never be unlocked. + // wxPaintDCImpl focus can never be unlocked. return false; }