X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b108581c99f60bb8b513f98a4b9b4080d574af4c..ab67e8874db324fab5223cc8d5dff8a8de3e2b77:/src/osx/cocoa/button.mm diff --git a/src/osx/cocoa/button.mm b/src/osx/cocoa/button.mm index 3b7c601be6..df1e092402 100644 --- a/src/osx/cocoa/button.mm +++ b/src/osx/cocoa/button.mm @@ -198,9 +198,84 @@ NSButton *wxButtonCocoaImpl::GetNSButton() const return static_cast(m_osxView); } +// Set bezel style depending on the wxBORDER_XXX flags specified by the style +// and also accounting for the label (bezels are different for multiline +// buttons and normal ones) and the ID (special bezel is used for help button). +// +// This is extern because it's also used in src/osx/cocoa/tglbtn.mm. +extern "C" +void +SetBezelStyleFromBorderFlags(NSButton *v, + long style, + wxWindowID winid, + const wxString& label = wxString(), + const wxBitmap& bitmap = wxBitmap()) +{ + // 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 ( winid == wxID_HELP && label.empty() ) + { + [v setBezelStyle:NSHelpButtonBezelStyle]; + } + else + { + // We can't use rounded bezel styles neither for multiline buttons nor + // for buttons containing (big) icons as they are only meant to be used + // at certain sizes, so the style used depends on whether the label is + // single or multi line. + const bool + isSimpleText = (label.find_first_of("\n\r") == wxString::npos) + && (!bitmap.IsOk() || bitmap.GetHeight() < 20); + + NSBezelStyle bezel; + switch ( style & wxBORDER_MASK ) + { + case wxBORDER_NONE: + bezel = NSShadowlessSquareBezelStyle; + [v setBordered:NO]; + break; + + case wxBORDER_SIMPLE: + bezel = NSShadowlessSquareBezelStyle; + break; + + case wxBORDER_SUNKEN: + bezel = isSimpleText ? NSTexturedRoundedBezelStyle + : NSSmallSquareBezelStyle; + break; + + default: + wxFAIL_MSG( "Unknown border style" ); + // fall through + + case 0: + case wxBORDER_STATIC: + case wxBORDER_RAISED: + case wxBORDER_THEME: + bezel = isSimpleText ? NSRoundedBezelStyle + : NSRegularSquareBezelStyle; + break; + } + + [v setBezelStyle:bezel]; + } +} + // Set the keyboard accelerator key from the label (e.g. "Click &Me") -void wxButton::OSXSetAcceleratorFromLabel(const wxString& label) +void wxButton::OSXUpdateAfterLabelChange(const wxString& label) { + wxButtonCocoaImpl *impl = static_cast(GetPeer()); + + // Update the bezel style as may be necessary if our new label is multi + // line while the old one wasn't (or vice versa). + SetBezelStyleFromBorderFlags(impl->GetNSButton(), + GetWindowStyle(), + GetId(), + label); + + // Skip setting the accelerator for the default buttons as this would // overwrite the default "Enter" which should be preserved. wxTopLevelWindow * const @@ -211,38 +286,13 @@ void wxButton::OSXSetAcceleratorFromLabel(const wxString& label) return; } - wxButtonCocoaImpl *impl = static_cast(GetPeer()); impl->SetAcceleratorFromLabel(label); } -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 if ( (style & wxBORDER_MASK) == wxBORDER_SIMPLE ) - [v setBezelStyle:NSShadowlessSquareBezelStyle]; - else - [v setBezelStyle:NSRegularSquareBezelStyle]; - } -} - wxWidgetImplType* wxWidgetImpl::CreateButton( wxWindowMac* wxpeer, wxWindowMac* WXUNUSED(parent), - wxWindowID id, + wxWindowID winid, const wxString& label, const wxPoint& pos, const wxSize& size, @@ -252,50 +302,7 @@ wxWidgetImplType* wxWidgetImpl::CreateButton( wxWindowMac* wxpeer, NSRect r = wxOSXGetFrameForControl( wxpeer, pos , size ) ; wxNSButton* v = [[wxNSButton alloc] initWithFrame:r]; - // 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]; - } - else - { - 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]; - } - - } - } + SetBezelStyleFromBorderFlags(v, style, winid, label); [v setButtonType:NSMomentaryPushInButton]; wxButtonCocoaImpl* const impl = new wxButtonCocoaImpl( wxpeer, v ); @@ -327,7 +334,7 @@ void wxWidgetCocoaImpl::PerformClick() wxWidgetImplType* wxWidgetImpl::CreateBitmapButton( wxWindowMac* wxpeer, wxWindowMac* WXUNUSED(parent), - wxWindowID WXUNUSED(id), + wxWindowID winid, const wxBitmap& bitmap, const wxPoint& pos, const wxSize& size, @@ -337,7 +344,7 @@ wxWidgetImplType* wxWidgetImpl::CreateBitmapButton( wxWindowMac* wxpeer, NSRect r = wxOSXGetFrameForControl( wxpeer, pos , size ) ; wxNSButton* v = [[wxNSButton alloc] initWithFrame:r]; - SetBezelStyleFromBorderFlags(v, style); + SetBezelStyleFromBorderFlags(v, style, winid, wxString(), bitmap); if (bitmap.IsOk()) [v setImage:bitmap.GetNSImage() ]; @@ -484,7 +491,7 @@ public : wxWidgetImplType* wxWidgetImpl::CreateDisclosureTriangle( wxWindowMac* wxpeer, wxWindowMac* WXUNUSED(parent), - wxWindowID WXUNUSED(winid), + wxWindowID winid, const wxString& label, const wxPoint& pos, const wxSize& size, @@ -496,7 +503,7 @@ wxWidgetImplType* wxWidgetImpl::CreateDisclosureTriangle( wxWindowMac* wxpeer, if ( !label.empty() ) [v setTitle:wxCFStringRef(label).AsNSString()]; - SetBezelStyleFromBorderFlags(v, style); + SetBezelStyleFromBorderFlags(v, style, winid, label); return new wxDisclosureTriangleCocoaImpl( wxpeer, v ); }