]> git.saurik.com Git - wxWidgets.git/blame - src/os2/choice.cpp
fixed wxMBConv_iconv to work with UTF-16/32
[wxWidgets.git] / src / os2 / choice.cpp
CommitLineData
0e320a79 1/////////////////////////////////////////////////////////////////////////////
11e62fe6 2// Name: src/os2/choice.cpp
0e320a79 3// Purpose: wxChoice
37f214d5 4// Author: David Webster
0e320a79 5// Modified by:
37f214d5 6// Created: 10/13/99
0e320a79 7// RCS-ID: $Id$
37f214d5 8// Copyright: (c) David Webster
65571936 9// Licence: wxWindows licence
0e320a79
DW
10/////////////////////////////////////////////////////////////////////////////
11
37f214d5
DW
12// For compilers that support precompilation, includes "wx.h".
13#include "wx/wxprec.h"
14
312ebad4
WS
15#if wxUSE_CHOICE
16
37f214d5
DW
17#ifndef WX_PRECOMP
18 #include "wx/choice.h"
19 #include "wx/utils.h"
20 #include "wx/log.h"
a4a16252 21 #include "wx/settings.h"
0e320a79
DW
22#endif
23
37f214d5 24#include "wx/os2/private.h"
0e320a79 25
0e320a79 26IMPLEMENT_DYNAMIC_CLASS(wxChoice, wxControl)
0e320a79 27
584ad2a3
MB
28bool wxChoice::Create(
29 wxWindow* pParent
30, wxWindowID vId
31, const wxPoint& rPos
32, const wxSize& rSize
33, const wxArrayString& asChoices
34, long lStyle
35, const wxValidator& rValidator
36, const wxString& rsName
37)
38{
39 wxCArrayString chs(asChoices);
40
41 return Create(pParent, vId, rPos, rSize, chs.GetCount(), chs.GetStrings(),
42 lStyle, rValidator, rsName);
43}
44
0cf6acbf
DW
45bool wxChoice::Create(
46 wxWindow* pParent
47, wxWindowID vId
48, const wxPoint& rPos
49, const wxSize& rSize
50, int n
51, const wxString asChoices[]
52, long lStyle
0cf6acbf 53, const wxValidator& rValidator
0cf6acbf
DW
54, const wxString& rsName
55)
0e320a79 56{
0cf6acbf
DW
57 long lSstyle;
58
b9b1d6c8
DW
59 if (!CreateControl( pParent
60 ,vId
61 ,rPos
62 ,rSize
63 ,lStyle
b9b1d6c8 64 ,rValidator
b9b1d6c8
DW
65 ,rsName
66 ))
312ebad4 67 return false;
0cf6acbf 68 lSstyle = CBS_DROPDOWNLIST |
5d44b24e
DW
69 WS_TABSTOP |
70 WS_VISIBLE;
0cf6acbf
DW
71
72 if (lStyle & wxCLIP_SIBLINGS )
73 lSstyle |= WS_CLIPSIBLINGS;
74
75 wxASSERT_MSG( !(lStyle & wxCB_DROPDOWN) &&
76 !(lStyle & wxCB_READONLY) &&
77 !(lStyle & wxCB_SIMPLE),
37f214d5
DW
78 wxT("this style flag is ignored by wxChoice, you "
79 "probably want to use a wxComboBox") );
0e320a79 80
0cf6acbf
DW
81 if (!OS2CreateControl( wxT("COMBOBOX")
82 ,lSstyle
83 ))
312ebad4 84 return false;
0e320a79 85
0cf6acbf
DW
86 //
87 // A choice/combobox normally has a white background (or other, depending
88 // on global settings) rather than inheriting the parent's background colour.
89 //
a756f210 90 SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW));
0cf6acbf 91 for (int i = 0; i < n; i++)
37f214d5 92 {
0cf6acbf 93 Append(asChoices[i]);
37f214d5 94 }
0cf6acbf
DW
95 SetSize( rPos.x
96 ,rPos.y
97 ,rSize.x
98 ,rSize.y
99 );
312ebad4 100 return true;
0cf6acbf 101} // end of wxChoice::Create
0e320a79 102
37f214d5
DW
103// ----------------------------------------------------------------------------
104// adding/deleting items to/from the list
105// ----------------------------------------------------------------------------
106
0cf6acbf
DW
107int wxChoice::DoAppend(
108 const wxString& rsItem
109)
0e320a79 110{
0cf6acbf 111 int nIndex;
9923c37d 112 LONG nIndexType = 0;
0cf6acbf
DW
113
114 if (m_windowStyle & wxLB_SORT)
115 nIndexType = LIT_SORTASCENDING;
116 else
117 nIndexType = LIT_END;
118 nIndex = (int)::WinSendMsg( GetHwnd()
119 ,LM_INSERTITEM
120 ,(MPARAM)nIndexType
121 ,(MPARAM)rsItem.c_str()
122 );
123 return nIndex;
124} // end of wxChoice::DoAppend
125
aa61d352 126int wxChoice::DoInsert( const wxString& rsItem, unsigned int pos )
243dbf1a
VZ
127{
128 wxCHECK_MSG(!(GetWindowStyle() & wxCB_SORT), -1, wxT("can't insert into sorted list"));
8228b893 129 wxCHECK_MSG(IsValidInsert(pos), -1, wxT("invalid index"));
243dbf1a 130
aa61d352 131 if (pos == GetCount())
33c6ae1d 132 return DoAppend(rsItem);
243dbf1a 133
8228b893
WS
134 int nIndex;
135 LONG nIndexType = 0;
243dbf1a
VZ
136
137 if (m_windowStyle & wxLB_SORT)
138 nIndexType = LIT_SORTASCENDING;
139 else
140 nIndexType = pos;
141 nIndex = (int)::WinSendMsg( GetHwnd()
142 ,LM_INSERTITEM
143 ,(MPARAM)nIndexType
144 ,(MPARAM)rsItem.c_str()
145 );
146 return nIndex;
147} // end of wxChoice::DoInsert
148
aa61d352 149void wxChoice::Delete(unsigned int n)
0e320a79 150{
8228b893 151 wxCHECK_RET( IsValid(n), wxT("invalid item index in wxChoice::Delete") );
0cf6acbf
DW
152 ::WinSendMsg(GetHwnd(), LM_DELETEITEM, (MPARAM)n, (MPARAM)0);
153} // end of wxChoice::Delete
0e320a79
DW
154
155void wxChoice::Clear()
156{
0cf6acbf
DW
157 Free();
158 ::WinSendMsg(GetHwnd(), LM_DELETEALL, (MPARAM)0, (MPARAM)0);
159} // end of wxChoice::Clear
0e320a79 160
37f214d5
DW
161// ----------------------------------------------------------------------------
162// selection
163// ----------------------------------------------------------------------------
164
0e320a79
DW
165int wxChoice::GetSelection() const
166{
0cf6acbf
DW
167 return((int)LONGFROMMR(::WinSendMsg(GetHwnd(), LM_QUERYSELECTION, (MPARAM)LIT_FIRST, (MPARAM)0)));
168} // end of wxChoice::GetSelection
0e320a79 169
0cf6acbf
DW
170void wxChoice::SetSelection(
171 int n
172)
0e320a79 173{
0cf6acbf
DW
174 ::WinSendMsg( GetHwnd()
175 ,LM_SELECTITEM
176 ,(MPARAM)n
177 ,(MPARAM)TRUE
178 );
179} // end of wxChoice::SetSelection
37f214d5
DW
180
181// ----------------------------------------------------------------------------
182// string list functions
183// ----------------------------------------------------------------------------
184
aa61d352 185unsigned int wxChoice::GetCount() const
37f214d5 186{
aa61d352 187 return((unsigned int)LONGFROMMR(::WinSendMsg(GetHwnd(), LM_QUERYITEMCOUNT, (MPARAM)0, (MPARAM)0)));
0cf6acbf 188} // end of wxChoice::GetCount
0e320a79 189
aa61d352 190void wxChoice::SetString(unsigned int n, const wxString& rsStr)
0e320a79 191{
11e62fe6
WS
192 LONG nIndexType = 0;
193 void* pData;
57ff8a87
DW
194
195 if ( m_clientDataItemsType != wxClientData_None )
196 {
197 pData = DoGetItemClientData(n);
198 }
199 else // no client data
200 {
201 pData = NULL;
202 }
dcd307ee 203
e90bc5bf 204 ::WinSendMsg(GetHwnd(), LM_DELETEITEM, (MPARAM)n, 0);
58238121 205
e90bc5bf 206 if (m_windowStyle & wxLB_SORT)
58238121
DW
207 nIndexType = LIT_SORTASCENDING;
208 else
209 nIndexType = LIT_END;
e90bc5bf
DW
210 ::WinSendMsg( GetHwnd()
211 ,LM_INSERTITEM
212 ,(MPARAM)nIndexType
213 ,(MPARAM)rsStr.c_str()
214 );
57ff8a87
DW
215
216 if (pData)
217 {
aa61d352 218 DoSetItemClientData(n, pData);
57ff8a87 219 }
0cf6acbf 220} // end of wxChoice::SetString
dcd307ee 221
aa61d352 222wxString wxChoice::GetString(unsigned int n) const
0e320a79 223{
11e62fe6
WS
224 int nLen = 0;
225 wxString sStr = wxEmptyString;
226 wxChar* zBuf;
0cf6acbf
DW
227
228 nLen = (size_t)LONGFROMMR(::WinSendMsg(GetHwnd(), LM_QUERYITEMTEXTLENGTH, (MPARAM)n, (MPARAM)0));
cfcebdb1 229 if (nLen != LIT_ERROR && nLen > 0)
0cf6acbf 230 {
0fba44b4 231 zBuf = new wxChar[nLen + 1];
0cf6acbf
DW
232 ::WinSendMsg( GetHwnd()
233 ,LM_QUERYITEMTEXT
234 ,MPFROM2SHORT((SHORT)n, (SHORT)nLen)
235 ,(MPARAM)zBuf
236 );
237 sStr = zBuf;
238 delete [] zBuf;
37f214d5 239 }
0cf6acbf
DW
240 return sStr;
241} // end of wxChoice::GetString
0e320a79 242
37f214d5
DW
243// ----------------------------------------------------------------------------
244// client data
245// ----------------------------------------------------------------------------
246
aa61d352 247void wxChoice::DoSetItemClientData(unsigned int n, void* pClientData)
0e320a79 248{
0cf6acbf
DW
249 ::WinSendMsg(GetHwnd(), LM_SETITEMHANDLE, (MPARAM)n, MPFROMP(pClientData));
250} // end of wxChoice::DoSetItemClientData
0e320a79 251
aa61d352 252void* wxChoice::DoGetItemClientData(unsigned int n) const
0e320a79 253{
aa61d352 254 MRESULT rc = ::WinSendMsg(GetHwnd(), LM_QUERYITEMHANDLE, (MPARAM)n, (MPARAM)0);
0cf6acbf 255 return((void*)rc);
aa61d352 256} // end of wxChoice::DoGetItemClientData
0e320a79 257
aa61d352 258void wxChoice::DoSetItemClientObject(unsigned int n, wxClientData* pClientData)
0e320a79 259{
aa61d352 260 DoSetItemClientData(n, pClientData);
0cf6acbf
DW
261} // end of wxChoice::DoSetItemClientObject
262
aa61d352 263wxClientData* wxChoice::DoGetItemClientObject(unsigned int n) const
0e320a79 264{
e6ebb514 265 return (wxClientData *)DoGetItemClientData(n);
0cf6acbf 266} // end of wxChoice::DoGetItemClientObject
37f214d5
DW
267
268// ----------------------------------------------------------------------------
269// wxOS2 specific helpers
270// ----------------------------------------------------------------------------
271
6670f564
WS
272void wxChoice::DoSetSize(int nX,
273 int nY,
274 int nWidth,
275 int WXUNUSED(nHeight),
276 int nSizeFlags)
37f214d5 277{
0cf6acbf 278 //
37f214d5
DW
279 // Ignore height parameter because height doesn't mean 'initially
280 // displayed' height, it refers to the drop-down menu as well. The
77ffb593 281 // wxWidgets interpretation is different; also, getting the size returns
37f214d5
DW
282 // the _displayed_ size (NOT the drop down menu size) so
283 // setting-getting-setting size would not work.
0cf6acbf
DW
284 //
285 wxControl::DoSetSize( nX
286 ,nY
287 ,nWidth
6670f564 288 ,wxDefaultCoord
0cf6acbf
DW
289 ,nSizeFlags
290 );
291} // end of wxChoice::DoSetSize
37f214d5 292
e78c4d50 293wxSize wxChoice::DoGetBestSize() const
37f214d5 294{
0cf6acbf
DW
295 //
296 // Find the widest string
297 //
8228b893
WS
298 int nLineWidth;
299 int nChoiceWidth = 0;
300 int nCx;
301 int nCy;
302 wxFont vFont = (wxFont)GetFont();
303
aa61d352 304 const unsigned int nItems = GetCount();
0cf6acbf 305
aa61d352 306 for (unsigned int i = 0; i < nItems; i++)
8228b893
WS
307 {
308 wxString sStr(GetString(i));
309 GetTextExtent( sStr, &nLineWidth, NULL );
0cf6acbf
DW
310 if (nLineWidth > nChoiceWidth)
311 nChoiceWidth = nLineWidth;
37f214d5
DW
312 }
313
0cf6acbf
DW
314 //
315 // Give it some reasonable default value if there are no strings in the
37f214d5 316 // list
0cf6acbf
DW
317 //
318 if (nChoiceWidth == 0L)
319 nChoiceWidth = 100L;
320
321 //
322 // The combobox should be larger than the widest string
323 //
8228b893 324 wxGetCharSize( GetHWND(), &nCx, &nCy, &vFont );
0cf6acbf
DW
325 nChoiceWidth += 5 * nCx;
326
327 //
37f214d5 328 // Choice drop-down list depends on number of items (limited to 10)
0cf6acbf 329 //
aa61d352
VZ
330 size_t nStrings = nItems == 0 ? 10 : wxMin(10, nItems) + 1;
331 int nChoiceHeight = EDIT_HEIGHT_FROM_CHAR_HEIGHT(nCy) * nStrings;
0cf6acbf 332
aa61d352 333 return wxSize(nChoiceWidth, nChoiceHeight);
0cf6acbf
DW
334} // end of wxChoice::DoGetBestSize
335
336MRESULT wxChoice::OS2WindowProc(
337 WXUINT uMsg
338, WXWPARAM wParam
339, WXLPARAM lParam
340)
37f214d5 341{
0cf6acbf
DW
342 return wxWindow::OS2WindowProc( uMsg
343 ,wParam
344 ,lParam
345 );
346} // end of wxChoice::OS2WindowProc
347
348bool wxChoice::OS2Command(
349 WXUINT uParam
350, WXWORD WXUNUSED(wId)
351)
37f214d5 352{
0cf6acbf 353 if (uParam != LN_SELECT)
37f214d5 354 {
0cf6acbf 355 //
37f214d5 356 // "selection changed" is the only event we're after
0cf6acbf 357 //
312ebad4 358 return false;
37f214d5 359 }
0cf6acbf 360 int n = GetSelection();
37f214d5 361
0cf6acbf
DW
362 if (n > -1)
363 {
364 wxCommandEvent vEvent( wxEVT_COMMAND_CHOICE_SELECTED
365 ,m_windowId
366 );
367
368 vEvent.SetInt(n);
369 vEvent.SetEventObject(this);
0fba44b4 370 vEvent.SetString(GetStringSelection());
0cf6acbf
DW
371 if (HasClientObjectData())
372 vEvent.SetClientObject(GetClientObject(n));
373 else if (HasClientUntypedData())
374 vEvent.SetClientData(GetClientData(n));
375 ProcessCommand(vEvent);
376 }
312ebad4 377 return true;
0cf6acbf 378} // end of wxChoice::OS2Command
0e320a79 379
0cf6acbf
DW
380void wxChoice::Free()
381{
382 if (HasClientObjectData())
383 {
aa61d352 384 const unsigned int nCount = GetCount();
0cf6acbf 385
aa61d352 386 for (unsigned int n = 0; n < nCount; n++)
0cf6acbf
DW
387 {
388 delete GetClientObject(n);
389 }
390 }
312ebad4
WS
391} // end of wxChoice::Free
392
393#endif // wxUSE_CHOICE