#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 <AppKit/NSView.h>
#import <AppKit/NSEvent.h>
#import <AppKit/NSClipView.h>
#import <Foundation/NSException.h>
-#include <objc/objc-runtime.h>
-
// Turn this on to paint green over the dummy views for debugging
#undef WXCOCOA_FILL_DUMMY_VIEW
#import <AppKit/NSBezierPath.h>
#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
// ========================================================================
[m_owner->GetNSViewForHiding() setFrame:[m_dummyNSView frame]];
}
+
#ifdef WXCOCOA_FILL_DUMMY_VIEW
bool wxWindowCocoaHider::Cocoa_drawRect(const NSRect& rect)
{
CocoaRemoveFromParent();
delete m_cocoaHider;
delete m_cocoaScroller;
+ if(m_cocoaNSView)
+ SendDestroyEvent();
SetNSView(NULL);
}
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);
const NSRect *rects = ▭ // The bounding box of the region
int countRects = 1;
// Try replacing the larger rectangle with a list of smaller ones:
-NS_DURING
- // This only works on Panther
-// [GetNSView() getRectsBeingDrawn:&rects count:&countRects];
- // This compiles everywhere (and still only works on Panther)
- objc_msgSend(GetNSView(),@selector(getRectsBeingDrawn:count:),&rects,&countRects);
-NS_HANDLER
-NS_ENDHANDLER
+ if ([GetNSView() respondsToSelector:@selector(getRectsBeingDrawn:count:)])
+ [GetNSView() getRectsBeingDrawn:&rects count:&countRects];
m_updateRegion = wxRegion(rects,countRects);
wxPaintEvent event(m_windowId);
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
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;
return m_cocoaNSView;
}
+wxWindow* wxWindow::GetWxWindow() const
+{
+ return (wxWindow*) this;
+}
+
void wxWindow::Refresh(bool eraseBack, const wxRect *rect)
{
[m_cocoaNSView setNeedsDisplay:YES];
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()
}
// 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()