1 ///////////////////////////////////////////////////////////////////////////////
2 // Name: src/msw/wince/checklst.cpp
3 // Purpose: implementation of wxCheckListBox class
4 // Author: Wlodzimierz ABX Skiba
8 // Copyright: (c) Wlodzimierz Skiba
9 // Licence: wxWindows licence
10 ///////////////////////////////////////////////////////////////////////////////
12 // ============================================================================
14 // ============================================================================
16 // ----------------------------------------------------------------------------
18 // ----------------------------------------------------------------------------
20 // For compilers that support precompilation, includes "wx.h".
21 #include "wx/wxprec.h"
27 #if wxUSE_CHECKLISTBOX
32 #include "wx/checklst.h"
34 // include <commctrl.h> "properly"
35 #include "wx/msw/wrapcctl.h"
37 // ============================================================================
39 // ============================================================================
41 IMPLEMENT_DYNAMIC_CLASS(wxCheckListBox
, wxControl
)
43 // ----------------------------------------------------------------------------
44 // implementation of wxCheckListBox class
45 // ----------------------------------------------------------------------------
49 BEGIN_EVENT_TABLE(wxCheckListBox
, wxControl
)
50 EVT_SIZE(wxCheckListBox
::OnSize
)
56 // def ctor: use Create() to really create the control
57 wxCheckListBox
::wxCheckListBox()
61 // ctor which creates the associated control
62 wxCheckListBox
::wxCheckListBox(wxWindow
*parent
, wxWindowID id
,
63 const wxPoint
& pos
, const wxSize
& size
,
64 int nStrings
, const wxString choices
[],
65 long style
, const wxValidator
& val
,
68 Create(parent
, id
, pos
, size
, nStrings
, choices
, style
, val
, name
);
71 wxCheckListBox
::wxCheckListBox(wxWindow
*parent
, wxWindowID id
,
72 const wxPoint
& pos
, const wxSize
& size
,
73 const wxArrayString
& choices
,
74 long style
, const wxValidator
& val
,
77 Create(parent
, id
, pos
, size
, choices
, style
, val
, name
);
80 wxCheckListBox
::~wxCheckListBox()
82 m_itemsClientData
.Clear();
85 bool wxCheckListBox
::Create(wxWindow
*parent
, wxWindowID id
,
86 const wxPoint
& pos
, const wxSize
& size
,
87 int n
, const wxString choices
[],
89 const wxValidator
& validator
, const wxString
& name
)
91 // initialize base class fields
92 if ( !CreateControl(parent
, id
, pos
, size
, style
, validator
, name
) )
95 // create the native control
96 if ( !MSWCreateControl(WC_LISTVIEW
, wxEmptyString
, pos
, size
) )
98 // control creation failed
102 ::SendMessage(GetHwnd(), LVM_SETEXTENDEDLISTVIEWSTYLE
, 0,
103 LVS_EX_CHECKBOXES
| LVS_EX_FULLROWSELECT
);
105 // insert single column with checkboxes and labels
108 ListView_InsertColumn(GetHwnd(), 0, &col
);
110 // initialize the contents
111 for ( int i
= 0; i
< n
; i
++ )
116 m_itemsClientData
.SetCount(n
);
118 // now we can compute our best size correctly, so do it if necessary
124 bool wxCheckListBox
::Create(wxWindow
*parent
, wxWindowID id
,
125 const wxPoint
& pos
, const wxSize
& size
,
126 const wxArrayString
& choices
,
128 const wxValidator
& validator
, const wxString
& name
)
130 wxCArrayString
chs(choices
);
131 return Create(parent
, id
, pos
, size
, chs
.GetCount(), chs
.GetStrings(),
132 style
, validator
, name
);
135 WXDWORD wxCheckListBox
::MSWGetStyle(long style
, WXDWORD
*exstyle
) const
137 WXDWORD wstyle
= wxControl
::MSWGetStyle(style
, exstyle
);
139 wstyle
|= LVS_REPORT
| LVS_NOCOLUMNHEADER
| LVS_NOSORTHEADER
;
144 void wxCheckListBox
::OnSize(wxSizeEvent
& event
)
146 // set width of the column we use to the width of list client area
148 int w
= GetClientSize().x
;
149 ListView_SetColumnWidth( GetHwnd(), 0, w
);
152 // misc overloaded methods
153 // -----------------------
155 void wxCheckListBox
::Delete(int n
)
157 wxCHECK_RET( n
>= 0 && n
< GetCount(),
158 _T("invalid index in wxCheckListBox::Delete") );
160 if ( !ListView_DeleteItem(GetHwnd(), n
) )
162 wxLogLastError(_T("ListView_DeleteItem"));
164 m_itemsClientData
.RemoveAt(n
);
170 bool wxCheckListBox
::IsChecked(size_t uiIndex
) const
172 wxCHECK_MSG( uiIndex
< (size_t)GetCount(), false,
173 _T("invalid index in wxCheckListBox::IsChecked") );
175 return (ListView_GetCheckState(((HWND
)GetHWND()), uiIndex
) != 0);
178 void wxCheckListBox
::Check(size_t uiIndex
, bool bCheck
)
180 wxCHECK_RET( uiIndex
< (size_t)GetCount(),
181 _T("invalid index in wxCheckListBox::Check") );
183 ListView_SetCheckState(((HWND
)GetHWND()), uiIndex
, bCheck
)
186 // interface derived from wxListBox and lower classes
187 // --------------------------------------------------
189 void wxCheckListBox
::Clear()
199 m_itemsClientData
.Clear();
201 wxCHECK_RET( n
== GetCount(),
202 _T("broken wxCheckListBox::Clear()") );
205 int wxCheckListBox
::GetCount() const
207 return ListView_GetItemCount( (HWND
)GetHWND() );
210 int wxCheckListBox
::GetSelection() const
215 int wxCheckListBox
::GetSelections(wxArrayInt
& aSelections
) const
221 if(IsChecked(n
)) aSelections
.Insert(n
,0);
224 return aSelections
.GetCount();
227 wxString wxCheckListBox
::GetString(int n
) const
229 const int bufSize
= 513;
231 ListView_GetItemText( (HWND
)GetHWND(), n
, 0, buf
, bufSize
- 1 );
232 buf
[bufSize
-1] = _T('\0');
237 bool wxCheckListBox
::IsSelected(int n
) const
242 void wxCheckListBox
::SetString(int n
, const wxString
& s
)
244 wxCHECK_RET( n
< GetCount(),
245 _T("invalid index in wxCheckListBox::SetString") );
246 wxChar
*buf
= new wxChar
[s
.length()+1];
247 wxStrcpy(buf
, s
.c_str());
248 ListView_SetItemText( (HWND
)GetHWND(), n
, 0, buf
);
252 int wxCheckListBox
::DoAppend(const wxString
& item
)
256 wxZeroMemory(newItem
);
258 int ret
= ListView_InsertItem( (HWND
)GetHWND(), & newItem
);
259 wxCHECK_MSG( n
== ret
, -1, _T("Item not added") );
260 SetString( ret
, item
);
261 m_itemsClientData
.Insert(NULL
, ret
);
265 void* wxCheckListBox
::DoGetItemClientData(int n
) const
267 return m_itemsClientData
.Item(n
);
270 wxClientData
* wxCheckListBox
::DoGetItemClientObject(int n
) const
272 return (wxClientData
*)DoGetItemClientData(n
);
275 void wxCheckListBox
::DoInsertItems(const wxArrayString
& items
, int pos
)
277 for( size_t i
= 0; i
< items
.GetCount(); i
++ )
279 Insert(items
[i
],pos
+i
);
283 void wxCheckListBox
::DoSetFirstItem(int n
)
285 int pos
= ListView_GetTopIndex( (HWND
)GetHWND() );
288 BOOL ret
= ListView_GetItemPosition( (HWND
)GetHWND(), n
, &ppt
);
289 wxCHECK_RET( ret
== TRUE
, _T("Broken DoSetFirstItem") );
290 ListView_Scroll( (HWND
)GetHWND(), 0, 0 );
291 ListView_Scroll( (HWND
)GetHWND(), 0, ppt
.y
);
294 void wxCheckListBox
::DoSetItemClientData(int n
, void* clientData
)
296 m_itemsClientData
.Item(n
) = clientData
;
299 void wxCheckListBox
::DoSetItemClientObject(int n
, wxClientData
* clientData
)
301 DoSetItemClientData(n
, clientData
);
304 void wxCheckListBox
::DoSetItems(const wxArrayString
& items
, void **clientData
)
306 for( size_t i
= 0; i
< items
.GetCount(); i
++ )
308 int pos
= Append(items
[i
]);
309 if( pos
>= 0 && clientData
)
310 DoSetItemClientData(pos
, clientData
[i
]);
314 void wxCheckListBox
::DoSetSelection(int n
, bool select
)