X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/3ff066a4ecb73476fc67c7a2c8a8823e67add833..1e151594721201f2048aa295dcf35acd28f012b9:/src/msw/checkbox.cpp diff --git a/src/msw/checkbox.cpp b/src/msw/checkbox.cpp index 0b1df142c6..547e418e06 100644 --- a/src/msw/checkbox.cpp +++ b/src/msw/checkbox.cpp @@ -39,10 +39,18 @@ #include "wx/msw/private.h" +#ifndef BST_UNCHECKED + #define BST_UNCHECKED 0x0000 +#endif + #ifndef BST_CHECKED #define BST_CHECKED 0x0001 #endif +#ifndef BST_INDETERMINATE + #define BST_INDETERMINATE 0x0002 +#endif + // ============================================================================ // implementation // ============================================================================ @@ -59,7 +67,7 @@ wxBEGIN_FLAGS( wxCheckBoxStyle ) wxFLAGS_MEMBER(wxBORDER_RAISED) wxFLAGS_MEMBER(wxBORDER_STATIC) wxFLAGS_MEMBER(wxBORDER_NONE) - + // old style border flags wxFLAGS_MEMBER(wxSIMPLE_BORDER) wxFLAGS_MEMBER(wxSUNKEN_BORDER) @@ -83,18 +91,18 @@ wxEND_FLAGS( wxCheckBoxStyle ) IMPLEMENT_DYNAMIC_CLASS_XTI(wxCheckBox, wxControl,"wx/checkbox.h") wxBEGIN_PROPERTIES_TABLE(wxCheckBox) - wxEVENT_PROPERTY( Click , wxEVT_COMMAND_CHECKBOX_CLICKED , wxCommandEvent ) + wxEVENT_PROPERTY( Click , wxEVT_COMMAND_CHECKBOX_CLICKED , wxCommandEvent ) - wxPROPERTY( Font , wxFont , SetFont , GetFont , , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) - wxPROPERTY( Label,wxString, SetLabel, GetLabel, wxString() , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) - wxPROPERTY( Value ,bool, SetValue, GetValue, , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) - wxPROPERTY_FLAGS( WindowStyle , wxCheckBoxStyle , long , SetWindowStyleFlag , GetWindowStyleFlag , , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) // style + wxPROPERTY( Font , wxFont , SetFont , GetFont , EMPTY_MACROVALUE , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) + wxPROPERTY( Label,wxString, SetLabel, GetLabel, wxString() , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) + wxPROPERTY( Value ,bool, SetValue, GetValue, EMPTY_MACROVALUE, 0 /*flags*/ , wxT("Helpstring") , wxT("group")) + wxPROPERTY_FLAGS( WindowStyle , wxCheckBoxStyle , long , SetWindowStyleFlag , GetWindowStyleFlag , EMPTY_MACROVALUE, 0 /*flags*/ , wxT("Helpstring") , wxT("group")) // style wxEND_PROPERTIES_TABLE() wxBEGIN_HANDLERS_TABLE(wxCheckBox) wxEND_HANDLERS_TABLE() -wxCONSTRUCTOR_6( wxCheckBox , wxWindow* , Parent , wxWindowID , Id , wxString , Label , wxPoint , Position , wxSize , Size , long , WindowStyle ) +wxCONSTRUCTOR_6( wxCheckBox , wxWindow* , Parent , wxWindowID , Id , wxString , Label , wxPoint , Position , wxSize , Size , long , WindowStyle ) #else IMPLEMENT_DYNAMIC_CLASS(wxCheckBox, wxControl) #endif @@ -107,10 +115,21 @@ IMPLEMENT_DYNAMIC_CLASS(wxCheckBox, wxControl) bool wxCheckBox::MSWCommand(WXUINT WXUNUSED(param), WXWORD WXUNUSED(id)) { wxCommandEvent event(wxEVT_COMMAND_CHECKBOX_CLICKED, m_windowId); - event.SetInt(GetValue()); + 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); event.SetEventObject(this); ProcessCommand(event); - return TRUE; + + return true; } bool wxCheckBox::Create(wxWindow *parent, @@ -122,19 +141,30 @@ bool wxCheckBox::Create(wxWindow *parent, const wxString& name) { if ( !CreateControl(parent, id, pos, size, style, validator, name) ) - return FALSE; + return false; + + long msStyle = WS_TABSTOP; + + if ( style & wxCHK_3STATE ) + { + msStyle |= BS_AUTO3STATE; + } + else + { + wxASSERT_MSG( !Is3rdStateAllowedForUser(), + wxT("Using wxCH_ALLOW_3RD_STATE_FOR_USER") + wxT(" style flag for a 2-state checkbox is useless") ); + msStyle |= BS_AUTOCHECKBOX; + } - long msStyle = BS_AUTOCHECKBOX | WS_TABSTOP; if ( style & wxALIGN_RIGHT ) - msStyle |= BS_LEFTTEXT; + { + msStyle |= BS_LEFTTEXT | BS_RIGHT; + } return MSWCreateControl(wxT("BUTTON"), msStyle, pos, size, label, 0); } -void wxCheckBox::SetLabel(const wxString& label) -{ - SetWindowText(GetHwnd(), label); -} wxSize wxCheckBox::DoGetBestSize() const { @@ -164,24 +194,59 @@ wxSize wxCheckBox::DoGetBestSize() const wCheckbox = s_checkSize; hCheckbox = s_checkSize; } +#ifdef __WXWINCE__ + hCheckbox += 1; +#endif return wxSize(wCheckbox, hCheckbox); } void wxCheckBox::SetValue(bool val) { - SendMessage(GetHwnd(), BM_SETCHECK, val, 0); + if (val) + { + Set3StateValue(wxCHK_CHECKED); + } + else + { + Set3StateValue(wxCHK_UNCHECKED); + } } bool wxCheckBox::GetValue() const { - return (SendMessage(GetHwnd(), BM_GETCHECK, 0, 0) & BST_CHECKED) != 0; + return (Get3StateValue() != 0); } void wxCheckBox::Command(wxCommandEvent& event) { - SetValue(event.GetInt() != 0); + int state = event.GetInt(); + wxCHECK_RET( (state == wxCHK_UNCHECKED) || (state == wxCHK_CHECKED) + || (state == wxCHK_UNDETERMINED), + wxT("event.GetInt() returned an invalid checkbox state") ); + + Set3StateValue((wxCheckBoxState) state); ProcessCommand(event); } +wxCOMPILE_TIME_ASSERT(wxCHK_UNCHECKED == BST_UNCHECKED + && wxCHK_CHECKED == BST_CHECKED + && wxCHK_UNDETERMINED == BST_INDETERMINATE, EnumValuesIncorrect); + +void wxCheckBox::DoSet3StateValue(wxCheckBoxState state) +{ + ::SendMessage(GetHwnd(), BM_SETCHECK, (WPARAM) state, 0); +} + +wxCheckBoxState wxCheckBox::DoGet3StateValue() const +{ +#ifdef __WIN32__ + return (wxCheckBoxState) ::SendMessage(GetHwnd(), BM_GETCHECK, 0, 0); +#else + return (wxCheckBoxState) ((::SendMessage(GetHwnd(), BM_GETCHECK, 0, 0) + & 0x001) == 0x001); +#endif + +} + #endif // wxUSE_CHECKBOX