X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/01495abf8755b0be46b4c65d6c7c48e9460f102b..6fc8ad6d53695012a9b20de2348c960e08b5fd52:/src/osx/cocoa/button.mm diff --git a/src/osx/cocoa/button.mm b/src/osx/cocoa/button.mm index d4560769be..8ed183958e 100644 --- a/src/osx/cocoa/button.mm +++ b/src/osx/cocoa/button.mm @@ -4,45 +4,25 @@ // 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 ///////////////////////////////////////////////////////////////////////////// #include "wx/wxprec.h" -#include "wx/button.h" - #ifndef WX_PRECOMP +#include "wx/object.h" #endif -#include "wx/osx/private.h" - -wxSize wxButton::DoGetBestSize() const -{ - // 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); - - wxSize sz = r.GetSize(); +#include "wx/button.h" - const int wBtnStd = GetDefaultSize().x; +#include "wx/osx/private.h" - if ( (sz.x < wBtnStd) && !HasFlag(wxBU_EXACTFIT) ) - sz.x = wBtnStd; +#if wxUSE_MARKUP + #include "wx/osx/cocoa/private/markuptoattr.h" +#endif // wxUSE_MARKUP - return sz ; -} - -wxSize wxButton::GetDefaultSize() -{ - return wxSize(84, 23); -} @implementation wxNSButton @@ -97,6 +77,10 @@ wxSize wxButton::GetDefaultSize() @end +@interface NSView(PossibleSizeMethods) +- (NSControlSize)controlSize; +@end + namespace { @@ -106,17 +90,44 @@ public: wxButtonCocoaImpl(wxWindowMac *wxpeer, wxNSButton *v) : wxWidgetCocoaImpl(wxpeer, v) { + SetNeedsFrame(false); } virtual void SetBitmap(const wxBitmap& bitmap) { // switch bezel style for plain pushbuttons - if ( bitmap.IsOk() && [GetNSButton() bezelStyle] == NSRoundedBezelStyle ) - [GetNSButton() setBezelStyle:NSRegularSquareBezelStyle ]; - + if ( bitmap.IsOk() ) + { + if ([GetNSButton() bezelStyle] == NSRoundedBezelStyle) + [GetNSButton() setBezelStyle:NSRegularSquareBezelStyle]; + } + else + { + [GetNSButton() setBezelStyle:NSRoundedBezelStyle]; + } + 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(); @@ -124,6 +135,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 { @@ -133,6 +181,8 @@ private: } }; +} // anonymous namespace + extern "C" void SetBezelStyleFromBorderFlags(NSButton *v, long style); // set bezel style depending on the wxBORDER_XXX flags specified by the style @@ -150,12 +200,13 @@ void SetBezelStyleFromBorderFlags(NSButton *v, long style) [v setBezelStyle:NSRegularSquareBezelStyle]; else if ( (style & wxBORDER_MASK) == wxBORDER_SUNKEN ) [v setBezelStyle:NSSmallSquareBezelStyle]; - else + else if ( (style & wxBORDER_MASK) == wxBORDER_SIMPLE ) [v setBezelStyle:NSShadowlessSquareBezelStyle]; + else + [v setBezelStyle:NSRegularSquareBezelStyle]; } } -} // anonymous namespace wxWidgetImplType* wxWidgetImpl::CreateButton( wxWindowMac* wxpeer, wxWindowMac* WXUNUSED(parent), @@ -163,7 +214,7 @@ wxWidgetImplType* wxWidgetImpl::CreateButton( wxWindowMac* wxpeer, const wxString& label, const wxPoint& pos, const wxSize& size, - long WXUNUSED(style), + long style, long WXUNUSED(extraStyle)) { NSRect r = wxOSXGetFrameForControl( wxpeer, pos , size ) ; @@ -179,19 +230,54 @@ wxWidgetImplType* wxWidgetImpl::CreateButton( wxWindowMac* wxpeer, } else { - [v setBezelStyle:NSRoundedBezelStyle]; + if ( style & wxBORDER_NONE ) + { + [v setBezelStyle:NSShadowlessSquareBezelStyle]; + [v setBordered:NO]; + } + else + { + // the following styles only exist for certain sizes, so avoid them for + // multi-line + if ( label.Find('\n' ) == wxNOT_FOUND && label.Find('\r' ) == wxNOT_FOUND) + { + if ( (style & wxBORDER_MASK) == wxBORDER_RAISED ) + [v setBezelStyle:NSRoundedBezelStyle]; + else if ( (style & wxBORDER_MASK) == wxBORDER_SUNKEN ) + [v setBezelStyle:NSTexturedRoundedBezelStyle]; + else if ( (style & wxBORDER_MASK) == wxBORDER_SIMPLE ) + [v setBezelStyle:NSShadowlessSquareBezelStyle]; + else + [v setBezelStyle:NSRoundedBezelStyle]; + } + else + { + if ( (style & wxBORDER_MASK) == wxBORDER_RAISED ) + [v setBezelStyle:NSRegularSquareBezelStyle]; + else if ( (style & wxBORDER_MASK) == wxBORDER_SUNKEN ) + [v setBezelStyle:NSSmallSquareBezelStyle]; + else if ( (style & wxBORDER_MASK) == wxBORDER_SIMPLE ) + [v setBezelStyle:NSShadowlessSquareBezelStyle]; + else + [v setBezelStyle:NSRegularSquareBezelStyle]; + } + + } } - + [v setButtonType:NSMomentaryPushInButton]; return new wxButtonCocoaImpl( wxpeer, v ); } 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() @@ -216,7 +302,7 @@ wxWidgetImplType* wxWidgetImpl::CreateBitmapButton( wxWindowMac* wxpeer, SetBezelStyleFromBorderFlags(v, style); - if (bitmap.Ok()) + if (bitmap.IsOk()) [v setImage:bitmap.GetNSImage() ]; [v setButtonType:NSMomentaryPushInButton]; @@ -306,7 +392,7 @@ wxCFRef downArray ; static wxBitmap trianglebm(disc_triangle_xpm); if ( downArray.get() == NULL ) { - downArray.reset( [wxDisclosureNSButton rotateImage:trianglebm.GetNSImage()] ); + downArray.reset( [[wxDisclosureNSButton rotateImage:trianglebm.GetNSImage()] retain] ); } if ( isOpen ) @@ -334,7 +420,7 @@ wxCFRef downArray ; fromRect:NSZeroRect operation:NSCompositeCopy fraction:1.0]; [newImage unlockFocus]; - return newImage; + return [newImage autorelease]; } @end