1 ///////////////////////////////////////////////////////////////////////////////
3 // Purpose: implementation of wxCheckListBox class
4 // Author: Julian Smart
8 // Copyright: (c) Julian Smart
9 // Licence: wxWindows licence
10 ///////////////////////////////////////////////////////////////////////////////
12 // ============================================================================
13 // headers & declarations
14 // ============================================================================
16 #if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
17 #pragma implementation "checklst.h"
22 #include "wx/checklst.h"
23 #include "wx/arrstr.h"
25 // ============================================================================
27 // ============================================================================
29 IMPLEMENT_DYNAMIC_CLASS(wxCheckListBox
, wxListBox
)
31 // ----------------------------------------------------------------------------
32 // implementation of wxCheckListBox class
33 // ----------------------------------------------------------------------------
37 BEGIN_EVENT_TABLE(wxCheckListBox
, wxListBox
)
43 static const wxString prefixChecked
= "[x] ";
44 static const wxString prefixUnchecked
= "[ ] ";
45 static const char checkChar
= 'x', uncheckChar
= ' ';
47 static inline const wxString
& Prefix(bool checked
)
48 { return checked
? prefixChecked
: prefixUnchecked
; }
49 static inline bool IsChecked(const wxString
& s
)
50 { wxASSERT(s
.length() >=4); return s
[1] == checkChar
; }
52 static void CopyStringsAddingPrefix(const wxArrayString
& orig
,
57 for(size_t i
= 0; i
< orig
.GetCount(); ++i
)
58 copy
.Add( Prefix(FALSE
) + orig
[i
] );
61 // def ctor: use Create() to really create the control
62 wxCheckListBox::wxCheckListBox() : wxCheckListBoxBase()
66 // ctor which creates the associated control
67 wxCheckListBox::wxCheckListBox(wxWindow
*parent
, wxWindowID id
,
68 const wxPoint
& pos
, const wxSize
& size
,
69 int nStrings
, const wxString choices
[],
70 long style
, const wxValidator
& val
,
72 : wxCheckListBoxBase()
74 Create(parent
, id
, pos
, size
, nStrings
, choices
,
78 wxCheckListBox::wxCheckListBox(wxWindow
*parent
, wxWindowID id
,
79 const wxPoint
& pos
, const wxSize
& size
,
80 const wxArrayString
& choices
,
81 long style
, const wxValidator
& val
,
83 : wxCheckListBoxBase()
85 Create(parent
, id
, pos
, size
, choices
,
89 bool wxCheckListBox::Create(wxWindow
*parent
, wxWindowID id
,
92 int n
, const wxString choices
[],
94 const wxValidator
& validator
,
97 // wxListBox::Create calls set, which adds the prefixes
98 bool retVal
= wxListBox::Create(parent
, id
, pos
, size
, n
, choices
,
99 style
, validator
, name
);
103 bool wxCheckListBox::Create(wxWindow
*parent
, wxWindowID id
,
106 const wxArrayString
& choices
,
108 const wxValidator
& validator
,
109 const wxString
& name
)
111 // wxListBox::Create calls set, which adds the prefixes
112 bool retVal
= wxListBox::Create(parent
, id
, pos
, size
, choices
,
113 style
, validator
, name
);
120 bool wxCheckListBox::IsChecked(size_t uiIndex
) const
122 return ::IsChecked(wxListBox::GetString(uiIndex
));
125 void wxCheckListBox::Check(size_t uiIndex
, bool bCheck
)
127 wxString label
= wxListBox::GetString(uiIndex
);
128 if(::IsChecked(label
) == bCheck
) return;
129 label
[1u] = bCheck
? checkChar
: uncheckChar
;
130 wxListBox::SetString(uiIndex
, label
);
133 void wxCheckListBox::DoToggleItem( int n
, int x
)
137 wxString label
= wxListBox::GetString(n
);
138 label
[1u] = (!::IsChecked(label
)) ? checkChar
: uncheckChar
;
139 wxListBox::SetString(n
, label
);
141 wxCommandEvent
event(wxEVT_COMMAND_CHECKLISTBOX_TOGGLED
, GetId());
142 if( HasClientObjectData() )
143 event
.SetClientObject( GetClientObject(n
) );
144 else if( HasClientUntypedData() )
145 event
.SetClientData( GetClientData(n
) );
146 event
.m_commandInt
= n
;
147 event
.m_extraLong
= TRUE
;
148 event
.SetEventObject(this);
149 event
.SetString( GetString( n
) );
151 GetEventHandler()->ProcessEvent(event
);
155 int wxCheckListBox::DoAppend(const wxString
& item
)
157 return wxListBox::DoAppend( Prefix(FALSE
) + item
);
160 int wxCheckListBox::FindString(const wxString
& s
) const
162 int n1
= wxListBox::FindString(Prefix(FALSE
) + s
);
163 int n2
= wxListBox::FindString(Prefix(TRUE
) + s
);
164 int min
= wxMin(n1
, n2
), max
= wxMax(n1
, n2
);
167 // n1 == -1, n2 == -1 => return -1 OK
168 // n1 != -1 || n2 != -1 => min == -1 => return the other one
169 // both != -1 => return the first one.
170 if( min
== -1 ) return max
;
174 void wxCheckListBox::SetString(int n
, const wxString
& s
)
176 wxListBox::SetString( n
, Prefix(IsChecked(n
)) + s
);
179 wxString
wxCheckListBox::GetString(int n
) const
181 return wxListBox::GetString(n
).substr(4);
184 void wxCheckListBox::DoInsertItems(const wxArrayString
& items
, int pos
)
187 CopyStringsAddingPrefix(items
, copy
);
188 wxListBox::DoInsertItems(copy
, pos
);
191 void wxCheckListBox::DoSetItems(const wxArrayString
& items
, void **clientData
)
194 CopyStringsAddingPrefix(items
, copy
);
195 wxListBox::DoSetItems(copy
, clientData
);