X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/def328714d73638645b7f183a306a7a0ee7ead3a..6178debcd342963974dbdce6ac2ddb2fbe89e42a:/src/osx/cocoa/button.mm diff --git a/src/osx/cocoa/button.mm b/src/osx/cocoa/button.mm index 57512e1ccb..5e4d5db404 100644 --- a/src/osx/cocoa/button.mm +++ b/src/osx/cocoa/button.mm @@ -82,12 +82,22 @@ wxSize wxButton::GetDefaultSize() } } +- (void) setTrackingTag: (NSTrackingRectTag)tag +{ + rectTag = tag; +} + +- (NSTrackingRectTag) trackingTag +{ + return rectTag; +} + @end namespace { -class wxButtonCocoaImpl : public wxWidgetCocoaImpl +class wxButtonCocoaImpl : public wxWidgetCocoaImpl, public wxButtonImpl { public: wxButtonCocoaImpl(wxWindowMac *wxpeer, wxNSButton *v) @@ -97,12 +107,20 @@ public: virtual void SetBitmap(const wxBitmap& bitmap) { - [GetNSButton() setBezelStyle:bitmap.IsOk() ? NSRegularSquareBezelStyle - : NSRoundedBezelStyle]; + // switch bezel style for plain pushbuttons + if ( bitmap.IsOk() && [GetNSButton() bezelStyle] == NSRoundedBezelStyle ) + [GetNSButton() setBezelStyle:NSRegularSquareBezelStyle ]; wxWidgetCocoaImpl::SetBitmap(bitmap); } + void SetPressedBitmap( const wxBitmap& bitmap ) + { + NSButton* button = GetNSButton(); + [button setAlternateImage: bitmap.GetNSImage()]; + [button setButtonType:NSMomentaryChangeButton]; + } + private: NSButton *GetNSButton() const { @@ -112,6 +130,28 @@ private: } }; +extern "C" void SetBezelStyleFromBorderFlags(NSButton *v, long style); + +// set bezel style depending on the wxBORDER_XXX flags specified by the style +void SetBezelStyleFromBorderFlags(NSButton *v, long style) +{ + if ( style & wxBORDER_NONE ) + { + [v setBezelStyle:NSShadowlessSquareBezelStyle]; + [v setBordered:NO]; + } + else // we do have a border + { + // see trac #11128 for a thorough discussion + if ( (style & wxBORDER_MASK) == wxBORDER_RAISED ) + [v setBezelStyle:NSRegularSquareBezelStyle]; + else if ( (style & wxBORDER_MASK) == wxBORDER_SUNKEN ) + [v setBezelStyle:NSSmallSquareBezelStyle]; + else + [v setBezelStyle:NSShadowlessSquareBezelStyle]; + } +} + } // anonymous namespace wxWidgetImplType* wxWidgetImpl::CreateButton( wxWindowMac* wxpeer, @@ -149,10 +189,36 @@ void wxWidgetCocoaImpl::SetDefaultButton( bool isDefault ) void wxWidgetCocoaImpl::PerformClick() { - if ([m_osxView isKindOfClass:[NSControl class]]) - [(NSControl*)m_osxView performClick:nil]; + if ([m_osxView isKindOfClass:[NSControl class]]) + [(NSControl*)m_osxView performClick:nil]; } +#if wxUSE_BMPBUTTON + +wxWidgetImplType* wxWidgetImpl::CreateBitmapButton( wxWindowMac* wxpeer, + wxWindowMac* WXUNUSED(parent), + wxWindowID WXUNUSED(id), + const wxBitmap& bitmap, + const wxPoint& pos, + const wxSize& size, + long style, + long WXUNUSED(extraStyle)) +{ + NSRect r = wxOSXGetFrameForControl( wxpeer, pos , size ) ; + wxNSButton* v = [[wxNSButton alloc] initWithFrame:r]; + + SetBezelStyleFromBorderFlags(v, style); + + if (bitmap.Ok()) + [v setImage:bitmap.GetNSImage() ]; + + [v setButtonType:NSMomentaryPushInButton]; + wxWidgetCocoaImpl* c = new wxButtonCocoaImpl( wxpeer, v ); + return c; +} + +#endif // wxUSE_BMPBUTTON + // // wxDisclosureButton implementation // @@ -203,7 +269,6 @@ static const char * disc_triangle_xpm[] = { - (id) initWithFrame:(NSRect) frame { self = [super initWithFrame:frame]; - [self setBezelStyle:NSSmallSquareBezelStyle]; isOpen = NO; [self setImagePosition:NSImageLeft]; [self updateImage]; @@ -289,16 +354,19 @@ public : wxWidgetImplType* wxWidgetImpl::CreateDisclosureTriangle( wxWindowMac* wxpeer, wxWindowMac* WXUNUSED(parent), - wxWindowID WXUNUSED(id), + wxWindowID WXUNUSED(winid), const wxString& label, const wxPoint& pos, const wxSize& size, - long WXUNUSED(style), + long style, long WXUNUSED(extraStyle)) { NSRect r = wxOSXGetFrameForControl( wxpeer, pos , size ) ; wxDisclosureNSButton* v = [[wxDisclosureNSButton alloc] initWithFrame:r]; - [v setTitle:wxCFStringRef( label).AsNSString()]; - wxDisclosureTriangleCocoaImpl* c = new wxDisclosureTriangleCocoaImpl( wxpeer, v ); - return c; + if ( !label.empty() ) + [v setTitle:wxCFStringRef(label).AsNSString()]; + + SetBezelStyleFromBorderFlags(v, style); + + return new wxDisclosureTriangleCocoaImpl( wxpeer, v ); }