// 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/panel.h"
#include "wx/toplevel.h"
#include "wx/dcclient.h"
+ #include "wx/stattext.h"
#endif
#include "wx/stockitem.h"
#include "wx/osx/private.h"
-IMPLEMENT_DYNAMIC_CLASS(wxButton, wxControl)
+namespace
+{
+
+// Returns true only if the id is wxID_HELP and the label is "Help" or empty.
+bool IsHelpButtonWithStandardLabel(wxWindowID id, const wxString& label)
+{
+ if ( id != wxID_HELP )
+ return false;
+
+ if ( label.empty() )
+ return true;
-BEGIN_EVENT_TABLE(wxButton, wxControl)
- EVT_ENTER_WINDOW(wxButton::OnEnterWindow)
- EVT_LEAVE_WINDOW(wxButton::OnLeaveWindow)
-END_EVENT_TABLE()
+ const wxString labelText = wxStaticText::GetLabelText(label);
+ return labelText == "Help" || labelText == _("Help");
+}
+
+} // anonymous namespace
bool wxButton::Create(wxWindow *parent,
wxWindowID id,
- const wxString& lbl,
+ const wxString& labelOrig,
const wxPoint& pos,
const wxSize& size,
long style,
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
// CreateButton()) for creating bitmap buttons, but we really ought
// to unify the creation of buttons of all kinds and then remove
// this check
- if ( style & wxBU_NOTEXT )
+ if ( style & wxBU_NOTEXT && !ShouldCreatePeer() )
{
return wxControl::Create(parent, id, pos, size, style,
validator, name);
}
- wxString label(lbl);
- if (label.empty() && wxIsStockID(id) && !(id == wxID_HELP))
- label = wxGetStockLabel(id);
+ DontCreatePeer();
+
+ m_marginX =
+ m_marginY = 0;
+
+ wxString label;
+
+ // Ignore the standard label for help buttons if possible, they use "?"
+ // label under Mac which looks better.
+ if ( !IsHelpButtonWithStandardLabel(id, labelOrig) )
+ {
+ label = labelOrig.empty() && wxIsStockID(id) ? wxGetStockLabel(id)
+ : labelOrig;
+ }
- m_macIsUserPane = false ;
if ( !wxButtonBase::Create(parent, id, pos, size, style, validator, name) )
return false;
m_labelOrig =
m_label = label ;
- m_peer = wxWidgetImpl::CreateButton( this, parent, id, label, pos, size, style, GetExtraStyle() );
+ SetPeer(wxWidgetImpl::CreateButton( this, parent, id, label, pos, size, style, GetExtraStyle() ));
MacPostControlCreate( pos, size );
void wxButton::SetLabel(const wxString& label)
{
- if ( GetId() == wxID_HELP || HasFlag(wxBU_NOTEXT) )
+ if ( IsHelpButtonWithStandardLabel(GetId(), label) )
{
- // just store the label internally but don't really use it for the
- // button
- m_labelOrig =
- m_label = label;
+ // ignore the standard label for the help buttons, it's not used
return;
}
- wxButtonBase::SetLabel(label);
-}
-
-wxBitmap wxButton::DoGetBitmap(State which) const
-{
- 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);
- }
- InvalidateBestSize();
-}
-
-void wxButton::DoSetBitmapPosition(wxDirection dir)
-{
- m_peer->SetBitmapPosition(dir);
- InvalidateBestSize();
+ wxAnyButton::SetLabel(label);
+#if wxOSX_USE_COCOA
+ OSXUpdateAfterLabelChange(label);
+#endif
}
wxWindow *wxButton::SetDefault()
btnOldDefault->GetPeer()->SetDefaultButton( false );
}
- m_peer->SetDefaultButton( true );
+ GetPeer()->SetDefaultButton( true );
return btnOldDefault;
}
void wxButton::Command (wxCommandEvent & WXUNUSED(event))
{
- m_peer->PerformClick() ;
+ GetPeer()->PerformClick() ;
// 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);
+ wxCommandEvent event(wxEVT_BUTTON, m_windowId);
event.SetEventObject(this);
ProcessCommand(event);
return true;
}
+/* static */
+wxSize wxButtonBase::GetDefaultSize()
+{
+ return wxAnyButton::GetDefaultSize();
+}
+
//-------------------------------------------------------
// wxDisclosureTriangle
//-------------------------------------------------------
bool wxDisclosureTriangle::Create(wxWindow *parent, wxWindowID id, const wxString& label,
const wxPoint& pos, const wxSize& size, long style,const wxValidator& validator, const wxString& name )
-{
- m_macIsUserPane = false ;
-
+{
+ DontCreatePeer();
if ( !wxControl::Create(parent, id, pos, size, style, validator, name) )
return false;
- m_peer = wxWidgetImpl::CreateDisclosureTriangle(this, parent, id, label, pos, size, style, GetExtraStyle() );
+ SetPeer(wxWidgetImpl::CreateDisclosureTriangle(this, parent, id, label, pos, size, style, GetExtraStyle() ));
MacPostControlCreate( pos, size );
- // passing the text in the param doesn't seem to work, so lets do it again
+ // passing the text in the param doesn't seem to work, so let's do it again
SetLabel( label );
return true;
void wxDisclosureTriangle::SetOpen( bool open )
{
- m_peer->SetValue( open ? 1 : 0 );
+ GetPeer()->SetValue( open ? 1 : 0 );
}
bool wxDisclosureTriangle::IsOpen() const
{
- return m_peer->GetValue() == 1;
+ return GetPeer()->GetValue() == 1;
}
bool wxDisclosureTriangle::OSXHandleClicked( double WXUNUSED(timestampsec) )
{
// Just emit button event for now
- wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED, m_windowId);
+ wxCommandEvent event(wxEVT_BUTTON, m_windowId);
event.SetEventObject(this);
ProcessCommand(event);