X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/522e2aa861080349ebc24d1d4f1553cb505b60db..2461cfa0d9b786a26a783237bca38c920efecb51:/src/cocoa/window.mm diff --git a/src/cocoa/window.mm b/src/cocoa/window.mm index 91e48b8579..1e4fd289db 100644 --- a/src/cocoa/window.mm +++ b/src/cocoa/window.mm @@ -6,7 +6,7 @@ // Created: 2002/12/26 // RCS-ID: $Id: // Copyright: (c) 2002 David Elliott -// Licence: wxWindows license +// Licence: wxWidgets licence ///////////////////////////////////////////////////////////////////////////// #include "wx/wxprec.h" @@ -14,14 +14,17 @@ #include "wx/log.h" #include "wx/window.h" #endif //WX_PRECOMP +#include "wx/tooltip.h" #include "wx/cocoa/autorelease.h" +#include "wx/cocoa/string.h" #import #import #import #import #import +#import // Turn this on to paint green over the dummy views for debugging #undef WXCOCOA_FILL_DUMMY_VIEW @@ -30,6 +33,11 @@ #import #endif //def WXCOCOA_FILL_DUMMY_VIEW +// A category for methods that are only present in Panther's SDK +@interface NSView(wxNSViewPrePantherCompatibility) +- (void)getRectsBeingDrawn:(const NSRect **)rects count:(int *)count; +@end + // ======================================================================== // wxWindowCocoaHider // ======================================================================== @@ -115,6 +123,7 @@ void wxWindowCocoaHider::Cocoa_FrameChanged(void) [m_owner->GetNSViewForHiding() setFrame:[m_dummyNSView frame]]; } + #ifdef WXCOCOA_FILL_DUMMY_VIEW bool wxWindowCocoaHider::Cocoa_drawRect(const NSRect& rect) { @@ -147,6 +156,7 @@ bool wxWindowCocoaHider::Cocoa_drawRect(const NSRect& rect) wxWindowCocoaScroller::wxWindowCocoaScroller(wxWindow *owner) : m_owner(owner) { + wxAutoNSAutoreleasePool pool; wxASSERT(owner); wxASSERT(owner->GetNSView()); m_cocoaNSScrollView = [[NSScrollView alloc] @@ -279,12 +289,14 @@ wxWindow::~wxWindow() wxAutoNSAutoreleasePool pool; DestroyChildren(); - // Make sure our parent (in the wxWindows sense) is our superview + // Make sure our parent (in the wxWidgets sense) is our superview // before we go removing from it. if(m_parent && m_parent->GetNSView()==[GetNSViewForSuperview() superview]) CocoaRemoveFromParent(); delete m_cocoaHider; delete m_cocoaScroller; + if(m_cocoaNSView) + SendDestroyEvent(); SetNSView(NULL); } @@ -304,10 +316,6 @@ void wxWindowCocoa::CocoaRemoveFromParent(void) void wxWindowCocoa::SetNSView(WX_NSView cocoaNSView) { - // Assume setting the NSView to NULL means this wxWindow is being destroyed - if(m_cocoaNSView && !cocoaNSView) - SendDestroyEvent(); - bool need_debug = cocoaNSView || m_cocoaNSView; if(need_debug) wxLogTrace(wxTRACE_COCOA_RetainRelease,wxT("wxWindowCocoa=%p::SetNSView [m_cocoaNSView=%p retainCount]=%d"),this,m_cocoaNSView,[m_cocoaNSView retainCount]); DisassociateNSView(m_cocoaNSView); @@ -345,8 +353,16 @@ bool wxWindowCocoa::Cocoa_drawRect(const NSRect &rect) wxLogDebug(wxT("Paint event recursion!")); return false; } - //FIXME: should probably turn that rect into the update region m_isInPaint = TRUE; + + // Set m_updateRegion + const NSRect *rects = ▭ // The bounding box of the region + int countRects = 1; + // Try replacing the larger rectangle with a list of smaller ones: + if ([GetNSView() respondsToSelector:@selector(getRectsBeingDrawn:count:)]) + [GetNSView() getRectsBeingDrawn:&rects count:&countRects]; + m_updateRegion = wxRegion(rects,countRects); + wxPaintEvent event(m_windowId); event.SetEventObject(this); bool ret = GetEventHandler()->ProcessEvent(event); @@ -464,6 +480,16 @@ void wxWindowCocoa::Cocoa_FrameChanged(void) GetEventHandler()->ProcessEvent(event); } +bool wxWindowCocoa::Cocoa_resetCursorRects() +{ + if(!m_cursor.GetNSCursor()) + return false; + + [GetNSView() addCursorRect: [GetNSView() visibleRect] cursor: m_cursor.GetNSCursor()]; + + return true; +} + bool wxWindow::Close(bool force) { // The only reason this function exists is that it is virtual and @@ -545,7 +571,7 @@ bool wxWindow::Show(bool show) void wxWindowCocoa::DoSetSize(int x, int y, int width, int height, int sizeFlags) { - wxLogTrace(wxTRACE_COCOA_Window_Size,"wxWindow=%p::DoSetSizeWindow(%d,%d,%d,%d,Auto: %s%s)",this,x,y,width,height,(sizeFlags&wxSIZE_AUTO_WIDTH)?"W":".",sizeFlags&wxSIZE_AUTO_HEIGHT?"H":"."); + wxLogTrace(wxTRACE_COCOA_Window_Size,wxT("wxWindow=%p::DoSetSizeWindow(%d,%d,%d,%d,Auto: %s%s)"),this,x,y,width,height,(sizeFlags&wxSIZE_AUTO_WIDTH)?"W":".",sizeFlags&wxSIZE_AUTO_HEIGHT?"H":"."); int currentX, currentY; int currentW, currentH; DoGetPosition(¤tX, ¤tY); @@ -583,10 +609,24 @@ void wxWindowCocoa::DoSetSize(int x, int y, int width, int height, int sizeFlags DoMoveWindow(x,y,width,height); } +#if wxUSE_TOOLTIPS + +void wxWindowCocoa::DoSetToolTip( wxToolTip *tip ) +{ + wxWindowBase::DoSetToolTip(tip); + + if ( m_tooltip ) + { + m_tooltip->SetWindow((wxWindow *)this); + } +} + +#endif + void wxWindowCocoa::DoMoveWindow(int x, int y, int width, int height) { wxAutoNSAutoreleasePool pool; - wxLogTrace(wxTRACE_COCOA_Window_Size,"wxWindow=%p::DoMoveWindow(%d,%d,%d,%d)",this,x,y,width,height); + wxLogTrace(wxTRACE_COCOA_Window_Size,wxT("wxWindow=%p::DoMoveWindow(%d,%d,%d,%d)"),this,x,y,width,height); NSView *nsview = GetNSViewForSuperview(); NSView *superview = [nsview superview]; @@ -614,7 +654,7 @@ void wxWindowCocoa::SetInitialFrameRect(const wxPoint& pos, const wxSize& size) frameRect.origin.y = parentRect.size.height-(pos.y+frameRect.size.height); // Tell Cocoa to change the margin between the bottom of the superview // and the bottom of the control. Keeps the control pinned to the top - // of its superview so that its position in the wxWindows coordinate + // of its superview so that its position in the wxWidgets coordinate // system doesn't change. if(![superview isFlipped]) [nsview setAutoresizingMask: NSViewMinYMargin]; @@ -631,7 +671,7 @@ void wxWindow::DoGetSize(int *w, int *h) const *w=(int)cocoaRect.size.width; if(h) *h=(int)cocoaRect.size.height; - wxLogTrace(wxTRACE_COCOA_Window_Size,"wxWindow=%p::DoGetSize = (%d,%d)",this,(int)cocoaRect.size.width,(int)cocoaRect.size.height); + wxLogTrace(wxTRACE_COCOA_Window_Size,wxT("wxWindow=%p::DoGetSize = (%d,%d)"),this,(int)cocoaRect.size.width,(int)cocoaRect.size.height); } void wxWindow::DoGetPosition(int *x, int *y) const @@ -646,7 +686,7 @@ void wxWindow::DoGetPosition(int *x, int *y) const *x=(int)cocoaRect.origin.x; if(y) *y=(int)(parentRect.size.height-(cocoaRect.origin.y+cocoaRect.size.height)); - wxLogTrace(wxTRACE_COCOA_Window_Size,"wxWindow=%p::DoGetPosition = (%d,%d)",this,(int)cocoaRect.origin.x,(int)cocoaRect.origin.y); + wxLogTrace(wxTRACE_COCOA_Window_Size,wxT("wxWindow=%p::DoGetPosition = (%d,%d)"),this,(int)cocoaRect.origin.x,(int)cocoaRect.origin.y); } WXWidget wxWindow::GetHandle() const @@ -654,6 +694,11 @@ WXWidget wxWindow::GetHandle() const return m_cocoaNSView; } +wxWindow* wxWindow::GetWxWindow() const +{ + return (wxWindow*) this; +} + void wxWindow::Refresh(bool eraseBack, const wxRect *rect) { [m_cocoaNSView setNeedsDisplay:YES]; @@ -661,7 +706,14 @@ void wxWindow::Refresh(bool eraseBack, const wxRect *rect) void wxWindow::SetFocus() { - // TODO +#ifdef __WXDEBUG__ + bool bOK = +#endif + [GetNSView() lockFocusIfCanDraw]; + + //Note that the normal lockFocus works on hidden and minimized windows + //and has no return value - which probably isn't what we want + wxASSERT(bOK); } void wxWindow::DoCaptureMouse() @@ -840,10 +892,14 @@ bool wxWindow::DoPopupMenu(wxMenu *menu, int x, int y) } // Get the window with the focus -wxWindow *wxWindowBase::FindFocus() -{ - // TODO - return NULL; +wxWindow *wxWindowBase::DoFindFocus() +{ + wxCocoaNSView *win = wxCocoaNSView::GetFromCocoa([NSView focusView]); + + if (!win) + return NULL; + + return win->GetWxWindow(); } /* static */ wxWindow *wxWindowBase::GetCapture()