]> git.saurik.com Git - wxWidgets.git/commitdiff
moving bitmapbutton functionality up to button for OSX
authorStefan Csomor <csomor@advancedconcepts.ch>
Fri, 9 Oct 2009 12:24:35 +0000 (12:24 +0000)
committerStefan Csomor <csomor@advancedconcepts.ch>
Fri, 9 Oct 2009 12:24:35 +0000 (12:24 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@62347 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/bmpbuttn.h
include/wx/osx/bmpbuttn.h
include/wx/osx/button.h
include/wx/osx/core/private.h
src/osx/bmpbuttn_osx.cpp
src/osx/button_osx.cpp
src/osx/carbon/bmpbuttn.cpp
src/osx/cocoa/bmpbuttn.mm
src/osx/cocoa/button.mm

index 73ebf694a04ec2378b25487d57c6784e04d9e957..f34ae509359e147354387391f9289bc56188c350 100644 (file)
 
 #include "wx/button.h"
 
-// FIXME: right now only wxMSW and wxGTK implement bitmap support in wxButton
+// FIXME: right now only wxMSW, wxGTK and wxOSX implement bitmap support in wxButton
 //        itself, this shouldn't be used for the other platforms neither
 //        when all of them do it
-#if (defined(__WXMSW__) || defined(__WXGTK20__)) && !defined(__WXUNIVERSAL__)
+#if (defined(__WXMSW__) || defined(__WXGTK20__) || defined(__WXOSX__)) && !defined(__WXUNIVERSAL__)
     #define wxHAS_BUTTON_BITMAP
 #endif
 
index 94c97608b5b546f549da2a2de2595cfec1057b13..c6edbf4e6be1670abfd17205df68f924f213f047 100644 (file)
@@ -40,15 +40,10 @@ public:
                 const wxString& name = wxButtonNameStr);
 
 protected:
-    void OnEnterWindow( wxMouseEvent& event);
-    void OnLeaveWindow( wxMouseEvent& event);
     
     virtual wxSize DoGetBestSize() const;
 
-    virtual void DoSetBitmap(const wxBitmap& bitmap, State which);
-
     DECLARE_DYNAMIC_CLASS(wxBitmapButton)
-    DECLARE_EVENT_TABLE()
 };
 
 #endif // _WX_OSX_BMPBUTTN_H_
index 48a82144500bb2de19703bc7d0928bdf635ffdb3..8959d9b14200c3a1d3de8c7363bbf035b6b7c78c 100644 (file)
@@ -54,13 +54,30 @@ public:
 protected:
     virtual wxSize DoGetBestSize() const ;
 
-#if wxOSX_USE_COCOA
+    void OnEnterWindow( wxMouseEvent& event);
+    void OnLeaveWindow( wxMouseEvent& event);
+    
     virtual wxBitmap DoGetBitmap(State which) const;
     virtual void DoSetBitmap(const wxBitmap& bitmap, State which);
     virtual void DoSetBitmapPosition(wxDirection dir);
-#endif // wxOSX_USE_COCOA
 
+    virtual void DoSetBitmapMargins(int x, int y)
+    {
+        m_marginX = x;
+        m_marginY = y;
+    }
+    
+    // the margins around the bitmap
+    int m_marginX;
+    int m_marginY;
+
+    // the bitmaps for the different state of the buttons, all of them may be
+    // invalid and the button only shows a bitmap at all if State_Normal bitmap
+    // is valid
+    wxBitmap m_bitmaps[State_Max];    
+    
     DECLARE_DYNAMIC_CLASS(wxButton)
+    DECLARE_EVENT_TABLE()
 };
 
 // OS X specific class, not part of public wx API
@@ -97,7 +114,6 @@ public:
 
 protected:
     virtual wxSize DoGetBestSize() const ;
-
 };
 
 #endif // _WX_OSX_BUTTON_H_
index a011a3d5a9fe66a8e91a52a65c49c55ba939de8d..2ea1bd40a7f9961d25ea880ded30b758f632dd4b 100644 (file)
@@ -588,14 +588,14 @@ public :
 };
 
 //
-// common interface bitmapbuttons
+// common interface for buttons
 //
 
-class wxBitmapButtonImpl
+class wxButtonImpl
 {
     public :
-    wxBitmapButtonImpl(){}
-    virtual ~wxBitmapButtonImpl(){}
+    wxButtonImpl(){}
+    virtual ~wxButtonImpl(){}
     
     virtual void SetPressedBitmap( const wxBitmap& bitmap ) = 0;
 } ;
index 6264a9baa8c0b95c9eabff8c0ff1cd979dff97c2..9a1cb174ca5baece3f52794d81c237058335a737 100644 (file)
 
 IMPLEMENT_DYNAMIC_CLASS(wxBitmapButton, wxButton)
 
-BEGIN_EVENT_TABLE(wxBitmapButton, wxButton)
-    EVT_ENTER_WINDOW(wxBitmapButton::OnEnterWindow)
-    EVT_LEAVE_WINDOW(wxBitmapButton::OnLeaveWindow)
-END_EVENT_TABLE()
 
 #include "wx/osx/private.h"
 
@@ -66,23 +62,6 @@ bool wxBitmapButton::Create( wxWindow *parent,
     return true;
 }
 
-void wxBitmapButton::DoSetBitmap(const wxBitmap& bitmap, State which)
-{
-    wxBitmapButtonBase::DoSetBitmap(bitmap, which);
-
-    // we don't support any other states currently
-    if ( which == State_Normal )
-    {
-        m_peer->SetBitmap( bitmap );
-    }
-    else if ( which == State_Pressed )
-    {
-        wxBitmapButtonImpl* bi = dynamic_cast<wxBitmapButtonImpl*> (m_peer);
-        if ( bi )
-            bi->SetPressedBitmap(bitmap);
-    }
-}
-
 wxSize wxBitmapButton::DoGetBestSize() const
 {
     wxSize best(m_marginX, m_marginY);
@@ -97,16 +76,4 @@ wxSize wxBitmapButton::DoGetBestSize() const
     return best;
 }
 
-void wxBitmapButton::OnEnterWindow( wxMouseEvent& WXUNUSED(event))
-{
-    if ( DoGetBitmap( State_Current ).IsOk() )
-        m_peer->SetBitmap( DoGetBitmap( State_Current ) );       
-}
-
-void wxBitmapButton::OnLeaveWindow( wxMouseEvent& WXUNUSED(event))
-{
-    if ( DoGetBitmap( State_Current ).IsOk() )
-        m_peer->SetBitmap( DoGetBitmap( State_Normal ) );       
-}
-
 #endif // wxUSE_BMPBUTTON
index 52208f4ed29bc86cf12b42172f618f188b27a2e6..b61d2963842926c0824a1cfad00888ebfb7614a8 100644 (file)
 
 IMPLEMENT_DYNAMIC_CLASS(wxButton, wxControl)
 
+BEGIN_EVENT_TABLE(wxButton, wxControl)
+    EVT_ENTER_WINDOW(wxButton::OnEnterWindow)
+    EVT_LEAVE_WINDOW(wxButton::OnLeaveWindow)
+END_EVENT_TABLE()
+
 bool wxButton::Create(wxWindow *parent,
     wxWindowID id,
     const wxString& lbl,
@@ -34,6 +39,9 @@ bool wxButton::Create(wxWindow *parent,
     const wxValidator& validator,
     const wxString& name)
 {
+    m_marginX =
+    m_marginY = 0;
+
     // FIXME: this hack is needed because we're called from
     //        wxBitmapButton::Create() with this style and we currently use a
     //        different wxWidgetImpl method (CreateBitmapButton() rather than
@@ -79,19 +87,23 @@ void wxButton::SetLabel(const wxString& label)
     wxButtonBase::SetLabel(label);
 }
 
-// there is no support for button bitmaps in wxOSX/Carbon so there is no need
-// for these methods there
-#if wxOSX_USE_COCOA
-
 wxBitmap wxButton::DoGetBitmap(State which) const
 {
-    return which == State_Normal ? m_peer->GetBitmap() : wxBitmap();
+    return m_bitmaps[which];
 }
 
 void wxButton::DoSetBitmap(const wxBitmap& bitmap, State which)
 {
+    m_bitmaps[which] = bitmap;
+    
     if ( which == State_Normal )
         m_peer->SetBitmap(bitmap);
+    else if ( which == State_Pressed )
+    {
+        wxButtonImpl* bi = dynamic_cast<wxButtonImpl*> (m_peer);
+        if ( bi )
+            bi->SetPressedBitmap(bitmap);
+    }
 }
 
 void wxButton::DoSetBitmapPosition(wxDirection dir)
@@ -99,8 +111,6 @@ void wxButton::DoSetBitmapPosition(wxDirection dir)
     m_peer->SetBitmapPosition(dir);
 }
 
-#endif // wxOSX_USE_COCOA
-
 wxWindow *wxButton::SetDefault()
 {
     wxWindow *btnOldDefault = wxButtonBase::SetDefault();
@@ -121,6 +131,18 @@ void wxButton::Command (wxCommandEvent & WXUNUSED(event))
     // ProcessCommand(event);
 }
 
+void wxButton::OnEnterWindow( wxMouseEvent& WXUNUSED(event))
+{
+    if ( DoGetBitmap( State_Current ).IsOk() )
+        m_peer->SetBitmap( DoGetBitmap( State_Current ) );       
+}
+
+void wxButton::OnLeaveWindow( wxMouseEvent& WXUNUSED(event))
+{
+    if ( DoGetBitmap( State_Current ).IsOk() )
+        m_peer->SetBitmap( DoGetBitmap( State_Normal ) );       
+}
+
 bool wxButton::OSXHandleClicked( double WXUNUSED(timestampsec) )
 {
     wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED, m_windowId);
index 55147f94e469b51986e74d1ef054b034968b8827..5862d0b1b141a016847654363ad51d433b3d0b1f 100644 (file)
@@ -27,7 +27,7 @@ namespace
 
 // define a derived class to override SetBitmap() and also to provide
 // InitButtonContentInfo() helper used by CreateBitmapButton()
-class wxMacBitmapButton : public wxMacControl, public wxBitmapButtonImpl
+class wxMacBitmapButton : public wxMacControl, public wxButtonImpl
 {
 public:
     wxMacBitmapButton(wxWindowMac* peer, const wxBitmap& bitmap, int style)
index ccfc8c98819a0031979b04bea38a157a493b84eb..bc9a26325d1e6ef3a80317695d066601220dfcf8 100644 (file)
@@ -9,69 +9,4 @@
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
-#include "wx/wxprec.h"
-
-#if wxUSE_BMPBUTTON
-
-#include "wx/bmpbuttn.h"
-#include "wx/image.h"
-
-#ifndef WX_PRECOMP
-    #include "wx/dcmemory.h"
-#endif
-
-#include "wx/osx/private.h"
-
-class wxBitmapButtonCocoaImpl : public wxWidgetCocoaImpl, public wxBitmapButtonImpl
-{
-    public :
-    wxBitmapButtonCocoaImpl( wxWindowMac* peer , WXWidget w) : wxWidgetCocoaImpl(peer,w)
-    {
-    }
-    
-    void SetPressedBitmap( const wxBitmap& bitmap )
-    {
-        wxNSButton* button = (wxNSButton*) m_osxView;
-        [button setAlternateImage: bitmap.GetNSImage()];
-        [button setButtonType:NSMomentaryChangeButton];
-    }
-} ;
-
-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];
-
-    // 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())
-        [v setImage:bitmap.GetNSImage() ];
-
-    [v setButtonType:NSMomentaryPushInButton];
-    wxWidgetCocoaImpl* c = new wxBitmapButtonCocoaImpl( wxpeer, v );
-    return c;
-}
-
-#endif
+// everything is done in button.mm now
\ No newline at end of file
index f83027bf6b79840f7e10c0ab2367916680283f3a..9dbcbee2da4549c9cb257031c700c0305a572002 100644 (file)
@@ -97,7 +97,7 @@ wxSize wxButton::GetDefaultSize()
 namespace
 {
 
-class wxButtonCocoaImpl : public wxWidgetCocoaImpl
+class wxButtonCocoaImpl : public wxWidgetCocoaImpl, public wxButtonImpl
 {
 public:
     wxButtonCocoaImpl(wxWindowMac *wxpeer, wxNSButton *v)
@@ -107,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
     {
@@ -163,6 +171,47 @@ void wxWidgetCocoaImpl::PerformClick()
         [(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];
+    
+    // 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())
+        [v setImage:bitmap.GetNSImage() ];
+    
+    [v setButtonType:NSMomentaryPushInButton];
+    wxWidgetCocoaImpl* c = new wxButtonCocoaImpl( wxpeer, v );
+    return c;
+}
+
+#endif
+
 //
 // wxDisclosureButton implementation
 //