X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1169a91932273bc84c23ed9dbd0a2da064d59d66..60104cbafa4502c7592801ccb8507f779c5601cf:/src/univ/checkbox.cpp?ds=sidebyside diff --git a/src/univ/checkbox.cpp b/src/univ/checkbox.cpp index 966e9f580d..1d03c5b61e 100644 --- a/src/univ/checkbox.cpp +++ b/src/univ/checkbox.cpp @@ -17,10 +17,6 @@ // headers // ---------------------------------------------------------------------------- -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) - #pragma implementation "univcheckbox.h" -#endif - #include "wx/wxprec.h" #ifdef __BORLANDC__ @@ -52,32 +48,9 @@ IMPLEMENT_DYNAMIC_CLASS(wxCheckBox, wxControl) // wxCheckBox // ---------------------------------------------------------------------------- -wxCheckBoxBase::wxCheckBoxBase() -{ -} - -wxCheckBox::wxCheckBox() -{ - Init(); -} - -wxCheckBox::wxCheckBox(wxWindow *parent, - wxWindowID id, - const wxString& label, - const wxPoint& pos, - const wxSize& size, - long style, - const wxValidator& validator, - const wxString& name) -{ - Init(); - - Create(parent, id, label, pos, size, style, validator, name); -} - void wxCheckBox::Init() { - m_isPressed = FALSE; + m_isPressed = false; m_status = Status_Unchecked; } @@ -91,14 +64,14 @@ bool wxCheckBox::Create(wxWindow *parent, const wxString &name) { if ( !wxControl::Create(parent, id, pos, size, style, validator, name) ) - return FALSE; + return false; SetLabel(label); SetBestSize(size); CreateInputHandler(wxINP_HANDLER_CHECKBOX); - return TRUE; + return true; } // ---------------------------------------------------------------------------- @@ -107,24 +80,12 @@ bool wxCheckBox::Create(wxWindow *parent, bool wxCheckBox::GetValue() const { - return m_status == Status_Checked; + return (Get3StateValue() != wxCHK_UNCHECKED); } void wxCheckBox::SetValue(bool value) { - Status status = value ? Status_Checked : Status_Unchecked; - if ( status != m_status ) - { - m_status = status; - - if ( m_status == Status_Checked ) - { - // invoke the hook - OnCheck(); - } - - Refresh(); - } + Set3StateValue( value ? wxCHK_CHECKED : wxCHK_UNCHECKED ); } void wxCheckBox::OnCheck() @@ -174,8 +135,12 @@ void wxCheckBox::DoDraw(wxControlRenderer *renderer) dc.SetFont(GetFont()); dc.SetTextForeground(GetForegroundColour()); - if ( m_status == Status_Checked ) - flags |= wxCONTROL_CHECKED; + switch ( Get3StateValue() ) + { + case wxCHK_CHECKED: flags |= wxCONTROL_CHECKED; break; + case wxCHK_UNDETERMINED: flags |= wxCONTROL_UNDETERMINED; break; + default: /* do nothing */ break; + } wxBitmap bitmap(GetBitmap(GetState(flags), m_status)); @@ -226,11 +191,46 @@ wxSize wxCheckBox::DoGetBestClientSize() const // checkbox actions // ---------------------------------------------------------------------------- +void wxCheckBox::DoSet3StateValue(wxCheckBoxState state) +{ + Status status; + switch ( state ) + { + case wxCHK_UNCHECKED: status = Status_Unchecked; break; + case wxCHK_CHECKED: status = Status_Checked; break; + default: wxFAIL_MSG(_T("Unknown checkbox state")); + case wxCHK_UNDETERMINED: status = Status_3rdState; break; + } + if ( status != m_status ) + { + m_status = status; + + if ( m_status == Status_Checked ) + { + // invoke the hook + OnCheck(); + } + + Refresh(); + } +} + +wxCheckBoxState wxCheckBox::DoGet3StateValue() const +{ + switch ( m_status ) + { + case Status_Checked: return wxCHK_CHECKED; + case Status_Unchecked: return wxCHK_UNCHECKED; + default: /* go further */ break; + } + return wxCHK_UNDETERMINED; +} + void wxCheckBox::Press() { if ( !m_isPressed ) { - m_isPressed = TRUE; + m_isPressed = true; Refresh(); } @@ -240,7 +240,7 @@ void wxCheckBox::Release() { if ( m_isPressed ) { - m_isPressed = FALSE; + m_isPressed = false; Refresh(); } @@ -248,9 +248,27 @@ void wxCheckBox::Release() void wxCheckBox::Toggle() { - m_isPressed = FALSE; + m_isPressed = false; + + Status status = m_status; + + switch ( Get3StateValue() ) + { + case wxCHK_CHECKED: + Set3StateValue(Is3rdStateAllowedForUser() ? wxCHK_UNDETERMINED : wxCHK_UNCHECKED); + break; - ChangeValue(!GetValue()); + case wxCHK_UNCHECKED: + Set3StateValue(wxCHK_CHECKED); + break; + + case wxCHK_UNDETERMINED: + Set3StateValue(wxCHK_UNCHECKED); + break; + } + + if( status != m_status ) + SendEvent(); } void wxCheckBox::ChangeValue(bool value) @@ -264,7 +282,17 @@ void wxCheckBox::SendEvent() { wxCommandEvent event(wxEVT_COMMAND_CHECKBOX_CLICKED, GetId()); InitCommandEvent(event); - event.SetInt(IsChecked()); + wxCheckBoxState state = Get3StateValue(); + + // If the style flag to allow the user setting the undetermined state + // is not set, then skip the undetermined state and set it to unchecked. + if ( state == wxCHK_UNDETERMINED && !Is3rdStateAllowedForUser() ) + { + state = wxCHK_UNCHECKED; + Set3StateValue(state); + } + + event.SetInt(state); Command(event); } @@ -281,15 +309,15 @@ bool wxCheckBox::PerformAction(const wxControlAction& action, else if ( action == wxACTION_BUTTON_RELEASE ) Release(); if ( action == wxACTION_CHECKBOX_CHECK ) - ChangeValue(TRUE); + ChangeValue(true); else if ( action == wxACTION_CHECKBOX_CLEAR ) - ChangeValue(FALSE); + ChangeValue(false); else if ( action == wxACTION_CHECKBOX_TOGGLE ) Toggle(); else return wxControl::PerformAction(action, numArg, strArg); - return TRUE; + return true; } // ----------------------------------------------------------------------------