X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b38dc31ffa6eb372727a7b0e65001a1c3d107fcb..bbfd45484113ff0bafcd0007a4b6faecc7909561:/src/osx/cocoa/button.mm?ds=inline diff --git a/src/osx/cocoa/button.mm b/src/osx/cocoa/button.mm index 9dbcbee2da..09f1f192dd 100644 --- a/src/osx/cocoa/button.mm +++ b/src/osx/cocoa/button.mm @@ -4,7 +4,7 @@ // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 -// RCS-ID: $Id: button.cpp 54845 2008-07-30 14:52:41Z SC $ +// RCS-ID: $Id$ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -18,16 +18,28 @@ #include "wx/osx/private.h" +#if wxUSE_MARKUP + #include "wx/osx/cocoa/private/markuptoattr.h" +#endif // wxUSE_MARKUP + + wxSize wxButton::DoGetBestSize() const { - if ( GetId() == wxID_HELP ) + // We only use help button bezel if we don't have any (non standard) label + // to display in the button. Otherwise even wxID_HELP buttons look like + // normal push buttons. + if ( GetId() == wxID_HELP && GetLabel().empty() ) return wxSize( 23 , 23 ) ; wxRect r ; - m_peer->GetBestRect(&r); + GetPeer()->GetBestRect(&r); wxSize sz = r.GetSize(); - + sz.x = sz.x + MacGetLeftBorderSize() + + MacGetRightBorderSize(); + sz.y = sz.y + MacGetTopBorderSize() + + MacGetBottomBorderSize(); + const int wBtnStd = GetDefaultSize().x; if ( (sz.x < wBtnStd) && !HasFlag(wxBU_EXACTFIT) ) @@ -38,7 +50,7 @@ wxSize wxButton::DoGetBestSize() const wxSize wxButton::GetDefaultSize() { - return wxSize(84, 23); + return wxSize(84, 20); } @implementation wxNSButton @@ -94,6 +106,10 @@ wxSize wxButton::GetDefaultSize() @end +@interface NSView(PossibleSizeMethods) +- (NSControlSize)controlSize; +@end + namespace { @@ -114,6 +130,25 @@ public: wxWidgetCocoaImpl::SetBitmap(bitmap); } +#if wxUSE_MARKUP + virtual void SetLabelMarkup(const wxString& markup) + { + wxMarkupToAttrString toAttr(GetWXPeer(), markup); + NSMutableAttributedString *attrString = toAttr.GetNSAttributedString(); + + // Button text is always centered. + NSMutableParagraphStyle * + paragraphStyle = [[NSMutableParagraphStyle alloc] init]; + [paragraphStyle setAlignment: NSCenterTextAlignment]; + [attrString addAttribute:NSParagraphStyleAttributeName + value:paragraphStyle + range:NSMakeRange(0, [attrString length])]; + [paragraphStyle release]; + + [GetNSButton() setAttributedTitle:attrString]; + } +#endif // wxUSE_MARKUP + void SetPressedBitmap( const wxBitmap& bitmap ) { NSButton* button = GetNSButton(); @@ -121,6 +156,43 @@ public: [button setButtonType:NSMomentaryChangeButton]; } + void GetLayoutInset(int &left , int &top , int &right, int &bottom) const + { + left = top = right = bottom = 0; + NSControlSize size = NSRegularControlSize; + if ( [m_osxView respondsToSelector:@selector(controlSize)] ) + size = [m_osxView controlSize]; + else if ([m_osxView respondsToSelector:@selector(cell)]) + { + id cell = [(id)m_osxView cell]; + if ([cell respondsToSelector:@selector(controlSize)]) + size = [cell controlSize]; + } + + if ( [GetNSButton() bezelStyle] == NSRoundedBezelStyle ) + { + switch( size ) + { + case NSRegularControlSize: + left = right = 6; + top = 4; + bottom = 8; + break; + case NSSmallControlSize: + left = right = 5; + top = 4; + bottom = 7; + break; + case NSMiniControlSize: + left = right = 1; + top = 0; + bottom = 2; + break; + } + } + } + + private: NSButton *GetNSButton() const { @@ -132,10 +204,33 @@ private: } // anonymous namespace +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]; + } +} + + wxWidgetImplType* wxWidgetImpl::CreateButton( wxWindowMac* wxpeer, wxWindowMac* WXUNUSED(parent), wxWindowID id, - const wxString& WXUNUSED(label), + const wxString& label, const wxPoint& pos, const wxSize& size, long WXUNUSED(style), @@ -144,7 +239,11 @@ wxWidgetImplType* wxWidgetImpl::CreateButton( wxWindowMac* wxpeer, NSRect r = wxOSXGetFrameForControl( wxpeer, pos , size ) ; wxNSButton* v = [[wxNSButton alloc] initWithFrame:r]; - if ( id == wxID_HELP ) + // We can't display a custom label inside a button with help bezel style so + // we only use it if we are using the default label. wxButton itself checks + // if the label is just "Help" in which case it discards it and passes us + // an empty string. + if ( id == wxID_HELP && label.empty() ) { [v setBezelStyle:NSHelpButtonBezelStyle]; } @@ -159,16 +258,19 @@ wxWidgetImplType* wxWidgetImpl::CreateButton( wxWindowMac* wxpeer, void wxWidgetCocoaImpl::SetDefaultButton( bool isDefault ) { - if ( isDefault && [m_osxView isKindOfClass:[NSButton class]] ) - // NOTE: setKeyEquivalent: nil will trigger an assert - // instead do not call in that case. - [(NSButton*)m_osxView setKeyEquivalent: @"\r" ]; + if ( [m_osxView isKindOfClass:[NSButton class]] ) + { + if ( isDefault ) + [(NSButton*)m_osxView setKeyEquivalent: @"\r" ]; + else + [(NSButton*)m_osxView setKeyEquivalent: @"" ]; + } } 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 @@ -184,33 +286,18 @@ wxWidgetImplType* wxWidgetImpl::CreateBitmapButton( wxWindowMac* wxpeer, { NSRect r = wxOSXGetFrameForControl( wxpeer, pos , size ) ; wxNSButton* v = [[wxNSButton alloc] initWithFrame:r]; - - // trying to get as close as possible to flags - if ( style & wxBORDER_NONE ) - { - [v setBezelStyle:NSShadowlessSquareBezelStyle]; - [v setBordered:NO]; - } - else - { - // 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]; - } - - if (bitmap.Ok()) + + SetBezelStyleFromBorderFlags(v, style); + + if (bitmap.IsOk()) [v setImage:bitmap.GetNSImage() ]; - + [v setButtonType:NSMomentaryPushInButton]; wxWidgetCocoaImpl* c = new wxButtonCocoaImpl( wxpeer, v ); return c; } -#endif +#endif // wxUSE_BMPBUTTON // // wxDisclosureButton implementation @@ -262,7 +349,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]; @@ -348,16 +434,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 ); }