+ AssociateNSView(m_cocoaNSView);
+ if(need_debug) wxLogTrace(wxTRACE_COCOA_RetainRelease,wxT("wxWindowCocoa=%p::SetNSView [cocoaNSView=%p retainCount]=%d"),this,cocoaNSView,[cocoaNSView retainCount]);
+}
+
+WX_NSView wxWindowCocoa::GetNSViewForSuperview() const
+{
+ return m_cocoaHider
+ ? m_cocoaHider->GetNSView()
+ : m_cocoaScroller
+ ? m_cocoaScroller->GetNSScrollView()
+ : m_cocoaNSView;
+}
+
+WX_NSView wxWindowCocoa::GetNSViewForHiding() const
+{
+ return m_cocoaScroller
+ ? m_cocoaScroller->GetNSScrollView()
+ : m_cocoaNSView;
+}
+
+bool wxWindowCocoa::Cocoa_drawRect(const NSRect &rect)
+{
+ wxLogTrace(wxTRACE_COCOA,wxT("Cocoa_drawRect"));
+ // Recursion can happen if the event loop runs from within the paint
+ // handler. For instance, if an assertion dialog is shown.
+ // FIXME: This seems less than ideal.
+ if(m_isInPaint)
+ {
+ wxLogDebug(wxT("Paint event recursion!"));
+ return false;
+ }
+ 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:
+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
+ m_updateRegion = wxRegion(rects,countRects);
+
+ wxPaintEvent event(m_windowId);
+ event.SetEventObject(this);
+ bool ret = GetEventHandler()->ProcessEvent(event);
+ m_isInPaint = FALSE;
+ return ret;
+}
+
+void wxWindowCocoa::InitMouseEvent(wxMouseEvent& event, WX_NSEvent cocoaEvent)
+{
+ wxASSERT_MSG([m_cocoaNSView window]==[cocoaEvent window],wxT("Mouse event for different NSWindow"));
+ NSPoint cocoaPoint = [m_cocoaNSView convertPoint:[(NSEvent*)cocoaEvent locationInWindow] fromView:nil];
+ NSRect cocoaRect = [m_cocoaNSView frame];
+ const wxPoint &clientorigin = GetClientAreaOrigin();
+ event.m_x = (wxCoord)cocoaPoint.x - clientorigin.x;
+ event.m_y = (wxCoord)(cocoaRect.size.height - cocoaPoint.y) - clientorigin.y;
+
+ event.m_shiftDown = [cocoaEvent modifierFlags] & NSShiftKeyMask;
+ event.m_controlDown = [cocoaEvent modifierFlags] & NSControlKeyMask;
+ event.m_altDown = [cocoaEvent modifierFlags] & NSAlternateKeyMask;
+ event.m_metaDown = [cocoaEvent modifierFlags] & NSCommandKeyMask;
+
+ // TODO: set timestamp?
+ event.SetEventObject(this);
+ event.SetId(GetId());
+}
+
+bool wxWindowCocoa::Cocoa_mouseMoved(WX_NSEvent theEvent)
+{
+ wxMouseEvent event(wxEVT_MOTION);
+ InitMouseEvent(event,theEvent);
+ wxLogTrace(wxTRACE_COCOA,wxT("Mouse Drag @%d,%d"),event.m_x,event.m_y);
+ return GetEventHandler()->ProcessEvent(event);
+}
+
+bool wxWindowCocoa::Cocoa_mouseEntered(WX_NSEvent theEvent)
+{
+ return false;
+}
+
+bool wxWindowCocoa::Cocoa_mouseExited(WX_NSEvent theEvent)
+{
+ return false;
+}
+
+bool wxWindowCocoa::Cocoa_mouseDown(WX_NSEvent theEvent)
+{
+ wxMouseEvent event([theEvent clickCount]<2?wxEVT_LEFT_DOWN:wxEVT_LEFT_DCLICK);
+ InitMouseEvent(event,theEvent);
+ wxLogTrace(wxTRACE_COCOA,wxT("Mouse Down @%d,%d num clicks=%d"),event.m_x,event.m_y,[theEvent clickCount]);
+ return GetEventHandler()->ProcessEvent(event);
+}
+
+bool wxWindowCocoa::Cocoa_mouseDragged(WX_NSEvent theEvent)
+{
+ wxMouseEvent event(wxEVT_MOTION);
+ InitMouseEvent(event,theEvent);
+ event.m_leftDown = true;
+ wxLogTrace(wxTRACE_COCOA,wxT("Mouse Drag @%d,%d"),event.m_x,event.m_y);
+ return GetEventHandler()->ProcessEvent(event);
+}
+
+bool wxWindowCocoa::Cocoa_mouseUp(WX_NSEvent theEvent)
+{
+ wxMouseEvent event(wxEVT_LEFT_UP);
+ InitMouseEvent(event,theEvent);
+ wxLogTrace(wxTRACE_COCOA,wxT("Mouse Up @%d,%d"),event.m_x,event.m_y);
+ return GetEventHandler()->ProcessEvent(event);
+}
+
+bool wxWindowCocoa::Cocoa_rightMouseDown(WX_NSEvent theEvent)
+{
+ wxMouseEvent event([theEvent clickCount]<2?wxEVT_RIGHT_DOWN:wxEVT_RIGHT_DCLICK);
+ InitMouseEvent(event,theEvent);
+ wxLogDebug(wxT("Mouse Down @%d,%d num clicks=%d"),event.m_x,event.m_y,[theEvent clickCount]);
+ return GetEventHandler()->ProcessEvent(event);
+}
+
+bool wxWindowCocoa::Cocoa_rightMouseDragged(WX_NSEvent theEvent)
+{
+ wxMouseEvent event(wxEVT_MOTION);
+ InitMouseEvent(event,theEvent);
+ event.m_rightDown = true;
+ wxLogDebug(wxT("Mouse Drag @%d,%d"),event.m_x,event.m_y);
+ return GetEventHandler()->ProcessEvent(event);
+}
+
+bool wxWindowCocoa::Cocoa_rightMouseUp(WX_NSEvent theEvent)
+{
+ wxMouseEvent event(wxEVT_RIGHT_UP);
+ InitMouseEvent(event,theEvent);
+ wxLogDebug(wxT("Mouse Up @%d,%d"),event.m_x,event.m_y);
+ return GetEventHandler()->ProcessEvent(event);
+}
+
+bool wxWindowCocoa::Cocoa_otherMouseDown(WX_NSEvent theEvent)
+{
+ return false;
+}
+
+bool wxWindowCocoa::Cocoa_otherMouseDragged(WX_NSEvent theEvent)
+{
+ return false;
+}
+
+bool wxWindowCocoa::Cocoa_otherMouseUp(WX_NSEvent theEvent)
+{
+ return false;