X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/83ffdd7111106e501556b1f4aa990e410ff52b13..bc5c09a3aa3662137da2d781c0b101a598d2650d:/src/osx/cocoa/window.mm diff --git a/src/osx/cocoa/window.mm b/src/osx/cocoa/window.mm index 5f7336b1f2..195d789478 100644 --- a/src/osx/cocoa/window.mm +++ b/src/osx/cocoa/window.mm @@ -13,8 +13,9 @@ #ifndef WX_PRECOMP #include "wx/dcclient.h" - #include "wx/nonownedwnd.h" + #include "wx/frame.h" #include "wx/log.h" + #include "wx/textctrl.h" #endif #ifdef __WXMAC__ @@ -31,6 +32,10 @@ #include "wx/dnd.h" #endif +#if wxUSE_TOOLTIPS + #include "wx/tooltip.h" +#endif + #include // Get the window with the focus @@ -126,6 +131,8 @@ NSRect wxOSXGetFrameForControl( wxWindowMac* window , const wxPoint& pos , const - (void)setAction:(SEL)aSelector; - (void)setDoubleAction:(SEL)aSelector; - (void)setBackgroundColor:(NSColor*)aColor; +- (void)setOpaque:(BOOL)opaque; +- (void)setTextColor:(NSColor *)color; - (void)setImagePosition:(NSCellImagePosition)aPosition; @end @@ -302,7 +309,7 @@ void wxWidgetCocoaImpl::SetupKeyEvent(wxKeyEvent &wxevent , NSEvent * nsEvent, N wxString chars; if ( eventType != NSFlagsChanged ) { - NSString* nschars = (wxevent.GetEventType() != wxEVT_CHAR) ? [nsEvent charactersIgnoringModifiers] : [nsEvent characters]; + NSString* nschars = [nsEvent charactersIgnoringModifiers]; if ( charString ) { // if charString is set, it did not come from key up / key down @@ -516,19 +523,43 @@ void wxWidgetCocoaImpl::SetupMouseEvent( wxMouseEvent &wxevent , NSEvent * nsEve case NSScrollWheel : { + float deltaX = 0.0; + float deltaY = 0.0; + wxevent.SetEventType( wxEVT_MOUSEWHEEL ) ; + + // see http://developer.apple.com/qa/qa2005/qa1453.html + // for more details on why we have to look for the exact type + + const EventRef cEvent = (EventRef) [nsEvent eventRef]; + bool isMouseScrollEvent = false; + if ( cEvent ) + isMouseScrollEvent = ::GetEventKind(cEvent) == kEventMouseScroll; + + if ( isMouseScrollEvent ) + { + deltaX = [nsEvent deviceDeltaX]; + deltaY = [nsEvent deviceDeltaY]; + } + else + { + deltaX = ([nsEvent deltaX] * 10); + deltaY = ([nsEvent deltaY] * 10); + } + wxevent.m_wheelDelta = 10; wxevent.m_linesPerAction = 1; - - if ( fabs([nsEvent deviceDeltaX]) > fabs([nsEvent deviceDeltaY]) ) + + if ( fabs(deltaX) > fabs(deltaY) ) { wxevent.m_wheelAxis = 1; - wxevent.m_wheelRotation = (int)[nsEvent deviceDeltaX]; + wxevent.m_wheelRotation = (int)deltaX; } else { - wxevent.m_wheelRotation = (int)[nsEvent deviceDeltaY]; + wxevent.m_wheelRotation = (int)deltaY; } + } break ; @@ -659,7 +690,7 @@ void wxOSX_mouseEvent(NSView* self, SEL _cmd, NSEvent *event) impl->mouseEvent(event, self, _cmd); } -BOOL wxOSX_acceptsFirstMouse(NSView* self, SEL _cmd, NSEvent *event) +BOOL wxOSX_acceptsFirstMouse(NSView* WXUNUSED(self), SEL WXUNUSED(_cmd), NSEvent *WXUNUSED(event)) { // This is needed to support click through, otherwise the first click on a window // will not do anything unless it is the active window already. @@ -855,7 +886,7 @@ unsigned int wxWidgetCocoaImpl::draggingUpdated(void* s, WXWidget WXUNUSED(slf), result = wxDragCopy; else if ( sourceDragMask & NSDragOperationMove ) result = wxDragMove; - + PasteboardRef pboardRef; PasteboardCreate((CFStringRef)[pboard name], &pboardRef); target->SetCurrentDragPasteboard(pboardRef); @@ -1062,15 +1093,23 @@ void wxWidgetCocoaImpl::drawRect(void* rect, WXWidget slf, void *WXUNUSED(_cmd)) [slf getRectsBeingDrawn:&rects count:&count]; for ( int i = 0 ; i < count ; ++i ) { - updateRgn.Union(wxFromNSRect(slf, rects[i]) ); + updateRgn.Union(wxFromNSRect(slf, rects[i])); } wxWindow* wxpeer = GetWXPeer(); + if ( wxpeer->MacGetTopLevelWindow()->GetWindowStyle() & wxFRAME_SHAPED ) + { + int xoffset = 0, yoffset = 0; + wxRegion rgn = wxpeer->MacGetTopLevelWindow()->GetShape(); + wxpeer->MacRootWindowToWindow( &xoffset, &yoffset ); + rgn.Offset( xoffset, yoffset ); + updateRgn.Intersect(rgn); + } + wxpeer->GetUpdateRegion() = updateRgn; wxpeer->MacSetCGContextRef( context ); bool handled = wxpeer->MacDoRedraw( 0 ); - CGContextRestoreGState( context ); CGContextSaveGState( context ); @@ -1099,6 +1138,18 @@ void wxWidgetCocoaImpl::controlDoubleAction( WXWidget WXUNUSED(slf), void *WXUNU { } +void wxWidgetCocoaImpl::controlTextDidChange() +{ + wxWindow* wxpeer = (wxWindow*)GetWXPeer(); + if ( wxpeer ) + { + wxCommandEvent event(wxEVT_COMMAND_TEXT_UPDATED, wxpeer->GetId()); + event.SetEventObject( wxpeer ); + event.SetString( static_cast(wxpeer)->GetValue() ); + wxpeer->HandleWindowEvent( event ); + } +} + // #if OBJC_API_VERSION >= 2 @@ -1291,6 +1342,7 @@ void wxWidgetCocoaImpl::SetVisibility( bool visible ) - (void)animationDidEnd:(NSAnimation*)animation { + wxUnusedVar(animation); m_isDone = true; } @@ -1603,11 +1655,11 @@ bool wxWidgetCocoaImpl::HasFocus() const bool wxWidgetCocoaImpl::SetFocus() { - if ( [m_osxView canBecomeKeyView] == NO ) + if ( !CanFocus() ) return false; - [[m_osxView window] makeFirstResponder: m_osxView] ; [[m_osxView window] makeKeyAndOrderFront:nil] ; + [[m_osxView window] makeFirstResponder: m_osxView] ; return true; } @@ -1639,6 +1691,18 @@ void wxWidgetCocoaImpl::SetBackgroundColour( const wxColour &col ) } } +bool wxWidgetCocoaImpl::SetBackgroundStyle( wxBackgroundStyle style ) +{ + BOOL opaque = ( style == wxBG_STYLE_PAINT ); + + if ( [m_osxView respondsToSelector:@selector(setOpaque:) ] ) + { + [m_osxView setOpaque: opaque]; + } + + return true ; +} + void wxWidgetCocoaImpl::SetLabel( const wxString& title, wxFontEncoding encoding ) { if ( [m_osxView respondsToSelector:@selector(setTitle:) ] ) @@ -1847,10 +1911,27 @@ void wxWidgetCocoaImpl::SetControlSize( wxWindowVariant variant ) } } -void wxWidgetCocoaImpl::SetFont(wxFont const& font, wxColour const&, long, bool) +void wxWidgetCocoaImpl::SetFont(wxFont const& font, wxColour const&col, long, bool) { if ([m_osxView respondsToSelector:@selector(setFont:)]) [m_osxView setFont: font.OSXGetNSFont()]; + if ([m_osxView respondsToSelector:@selector(setTextColor:)]) + [m_osxView setTextColor:[NSColor colorWithCalibratedRed:(CGFloat) (col.Red() / 255.0) + green:(CGFloat) (col.Green() / 255.0) + blue:(CGFloat) (col.Blue() / 255.0) + alpha:(CGFloat) (col.Alpha() / 255.0)]]; +} + +void wxWidgetCocoaImpl::SetToolTip(wxToolTip* tooltip) +{ + if (tooltip) + { + wxCFStringRef cf( tooltip->GetTip() , m_wxPeer->GetFont().GetEncoding() ); + [m_osxView setToolTip: cf.AsNSString()]; + } + else + [m_osxView setToolTip: nil]; + } void wxWidgetCocoaImpl::InstallEventHandler( WXWidget control ) @@ -1890,10 +1971,20 @@ bool wxWidgetCocoaImpl::DoHandleKeyEvent(NSEvent *event) { if ( !result ) { - if ( [m_osxView isKindOfClass:[NSScrollView class] ] ) - [[(NSScrollView*)m_osxView documentView] interpretKeyEvents:[NSArray arrayWithObject:event]]; + if ( wxevent.GetKeyCode() < WXK_SPACE || wxevent.GetKeyCode() == WXK_DELETE || wxevent.GetKeyCode() >= WXK_START ) + { + // eventually we could setup a doCommandBySelector catcher and retransform this into the wx key chars + wxKeyEvent wxevent2(wxevent) ; + wxevent2.SetEventType(wxEVT_CHAR); + GetWXPeer()->OSXHandleKeyEvent(wxevent2); + } else - [m_osxView interpretKeyEvents:[NSArray arrayWithObject:event]]; + { + if ( [m_osxView isKindOfClass:[NSScrollView class] ] ) + [[(NSScrollView*)m_osxView documentView] interpretKeyEvents:[NSArray arrayWithObject:event]]; + else + [m_osxView interpretKeyEvents:[NSArray arrayWithObject:event]]; + } result = true; } } @@ -2006,9 +2097,24 @@ wxWidgetImpl* wxWidgetImpl::CreateUserPane( wxWindowMac* wxpeer, wxWindowMac* WX wxWidgetImpl* wxWidgetImpl::CreateContentView( wxNonOwnedWindow* now ) { NSWindow* tlw = now->GetWXWindow(); - wxNSView* v = [[wxNSView alloc] initWithFrame:[[tlw contentView] frame]]; - wxWidgetCocoaImpl* c = new wxWidgetCocoaImpl( now, v, true ); - c->InstallEventHandler(); - [tlw setContentView:v]; + + wxWidgetCocoaImpl* c = NULL; + if ( now->IsNativeWindowWrapper() ) + { + NSView* cv = [tlw contentView]; + c = new wxWidgetCocoaImpl( now, cv, true ); + // increase ref count, because the impl destructor will decrement it again + CFRetain(cv); + if ( !now->IsShown() ) + [cv setHidden:NO]; + + } + else + { + wxNSView* v = [[wxNSView alloc] initWithFrame:[[tlw contentView] frame]]; + c = new wxWidgetCocoaImpl( now, v, true ); + c->InstallEventHandler(); + [tlw setContentView:v]; + } return c; }