X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f6045f99ba2bf267172a11f262fea8dedb0a75ee..926ce9e3ac32e1a33cc43420f76876fac8868436:/src/motif/checklst.cpp?ds=sidebyside diff --git a/src/motif/checklst.cpp b/src/motif/checklst.cpp index 740a1ad14b..b2e28eb366 100644 --- a/src/motif/checklst.cpp +++ b/src/motif/checklst.cpp @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////////// -// Name: checklst.cpp +// Name: src/motif/checklst.cpp // Purpose: implementation of wxCheckListBox class // Author: Julian Smart // Modified by: @@ -13,13 +13,13 @@ // headers & declarations // ============================================================================ -#ifdef __GNUG__ -#pragma implementation "checklst.h" -#endif +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" #include "wx/defs.h" #include "wx/checklst.h" +#include "wx/arrstr.h" // ============================================================================ // implementation @@ -39,8 +39,26 @@ END_EVENT_TABLE() // control creation // ---------------- +static const wxString prefixChecked = "[x] "; +static const wxString prefixUnchecked = "[ ] "; +static const char checkChar = 'x', uncheckChar = ' '; + +static inline const wxString& Prefix(bool checked) + { return checked ? prefixChecked : prefixUnchecked; } +static inline bool IsChecked(const wxString& s) + { wxASSERT(s.length() >=4); return s[1] == checkChar; } + +static void CopyStringsAddingPrefix(const wxArrayString& orig, + wxArrayString& copy) +{ + copy.Clear(); + + for(size_t i = 0; i < orig.GetCount(); ++i ) + copy.Add( Prefix(false) + orig[i] ); +} + // def ctor: use Create() to really create the control -wxCheckListBox::wxCheckListBox() : wxListBox() +wxCheckListBox::wxCheckListBox() : wxCheckListBoxBase() { } @@ -50,25 +68,128 @@ wxCheckListBox::wxCheckListBox(wxWindow *parent, wxWindowID id, int nStrings, const wxString choices[], long style, const wxValidator& val, const wxString& name) - : wxListBox() + : wxCheckListBoxBase() +{ + Create(parent, id, pos, size, nStrings, choices, + style, val, name); +} + +wxCheckListBox::wxCheckListBox(wxWindow *parent, wxWindowID id, + const wxPoint& pos, const wxSize& size, + const wxArrayString& choices, + long style, const wxValidator& val, + const wxString& name) + : wxCheckListBoxBase() +{ + Create(parent, id, pos, size, choices, + style, val, name); +} + +bool wxCheckListBox::Create(wxWindow *parent, wxWindowID id, + const wxPoint& pos, + const wxSize& size, + int n, const wxString choices[], + long style, + const wxValidator& validator, + const wxString& name) +{ + // wxListBox::Create calls set, which adds the prefixes + bool retVal = wxListBox::Create(parent, id, pos, size, n, choices, + style, validator, name); + return retVal; +} + +bool wxCheckListBox::Create(wxWindow *parent, wxWindowID id, + const wxPoint& pos, + const wxSize& size, + const wxArrayString& choices, + long style, + const wxValidator& validator, + const wxString& name) { - // TODO: you'll probably need a separate Create instead of using - // the wxListBox one as here. - Create(parent, id, pos, size, nStrings, choices, style|wxLB_OWNERDRAW, val, name); + // wxListBox::Create calls set, which adds the prefixes + bool retVal = wxListBox::Create(parent, id, pos, size, choices, + style, validator, name); + return retVal; } // check items // ----------- -bool wxCheckListBox::IsChecked(size_t WXUNUSED(uiIndex)) const +bool wxCheckListBox::IsChecked(size_t uiIndex) const { - // TODO - return FALSE; + return ::IsChecked(wxListBox::GetString(uiIndex)); } -void wxCheckListBox::Check(size_t WXUNUSED(uiIndex), bool WXUNUSED(bCheck)) +void wxCheckListBox::Check(size_t uiIndex, bool bCheck) { - // TODO + wxString label = wxListBox::GetString(uiIndex); + if(::IsChecked(label) == bCheck) return; + label[1u] = bCheck ? checkChar : uncheckChar; + wxListBox::SetString(uiIndex, label); } +void wxCheckListBox::DoToggleItem( int n, int x ) +{ + if( x < 23 ) + { + wxString label = wxListBox::GetString(n); + label[1u] = (!::IsChecked(label)) ? checkChar : uncheckChar; + wxListBox::SetString(n, label); + + wxCommandEvent event(wxEVT_COMMAND_CHECKLISTBOX_TOGGLED, GetId()); + if( HasClientObjectData() ) + event.SetClientObject( GetClientObject(n) ); + else if( HasClientUntypedData() ) + event.SetClientData( GetClientData(n) ); + event.SetInt(n); + event.SetExtraLong(true); + event.SetEventObject(this); + event.SetString( GetString( n ) ); + + GetEventHandler()->ProcessEvent(event); + } +} + +int wxCheckListBox::DoAppend(const wxString& item) +{ + return wxListBox::DoAppend( Prefix(false) + item ); +} +int wxCheckListBox::FindString(const wxString& s, bool bCase) const +{ + int n1 = wxListBox::FindString(Prefix(false) + s, bCase); + int n2 = wxListBox::FindString(Prefix(true) + s, bCase); + int min = wxMin(n1, n2), max = wxMax(n1, n2); + + // why this works: + // n1 == -1, n2 == -1 => return -1 OK + // n1 != -1 || n2 != -1 => min == -1 => return the other one + // both != -1 => return the first one. + if( min == -1 ) return max; + return min; +} + +void wxCheckListBox::SetString(int n, const wxString& s) +{ + wxListBox::SetString( n, Prefix(IsChecked(n)) + s ); +} + +wxString wxCheckListBox::GetString(int n) const +{ + return wxListBox::GetString(n).substr(4); +} + +void wxCheckListBox::DoInsertItems(const wxArrayString& items, int pos) +{ + wxArrayString copy; + CopyStringsAddingPrefix(items, copy); + wxListBox::DoInsertItems(copy, pos); +} + +void wxCheckListBox::DoSetItems(const wxArrayString& items, void **clientData) +{ + wxArrayString copy; + CopyStringsAddingPrefix(items, copy); + wxListBox::DoSetItems(copy, clientData); +}