1 ///////////////////////////////////////////////////////////////////////////// 
   4 // Author:      David Webster 
   8 // Copyright:   (c) David Webster 
   9 // Licence:     wxWindows licence 
  10 ///////////////////////////////////////////////////////////////////////////// 
  12 // For compilers that support precompilation, includes "wx.h". 
  13 #include "wx/wxprec.h" 
  16     #include "wx/choice.h" 
  21 #include "wx/os2/private.h" 
  23 IMPLEMENT_DYNAMIC_CLASS(wxChoice
, wxControl
) 
  25 bool wxChoice::Create(wxWindow 
*parent
, 
  29                       int n
, const wxString choices
[], 
  32                       const wxValidator
& validator
, 
  36     if ( !CreateControl(parent
, id
, pos
, size
, style
, validator
, name
) ) 
  40     long msStyle = WS_CHILD | CBS_DROPDOWNLIST | WS_TABSTOP | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL; 
  41     if ( style & wxCB_SORT ) 
  44     // the experience shows that wxChoice vs. wxComboBox distinction confuses 
  45     // quite a few people - try to help them 
  46     wxASSERT_MSG( !(style & wxCB_DROPDOWN) && 
  47                   !(style & wxCB_READONLY) && 
  48                   !(style & wxCB_SIMPLE), 
  49                   wxT("this style flag is ignored by wxChoice, you " 
  50                      "probably want to use a wxComboBox") ); 
  52     if ( !OS2CreateControl(wxT("COMBOBOX"), msStyle) ) 
  55     for ( int i = 0; i < n; i++ ) 
  60     SetSize(pos
.x
, pos
.y
, size
.x
, size
.y
); 
  65 // ---------------------------------------------------------------------------- 
  66 // adding/deleting items to/from the list 
  67 // ---------------------------------------------------------------------------- 
  69 int wxChoice::DoAppend(const wxString
& item
) 
  73     int n = (int)SendMessage(GetHwnd(), CB_ADDSTRING, 0, (LONG)item.c_str()); 
  76         wxLogLastError("SendMessage(CB_ADDSTRING)"); 
  82 void wxChoice::Delete(int n
) 
  84     wxCHECK_RET( n 
< GetCount(), wxT("invalid item index in wxChoice::Delete") ); 
  86 // TODO:    SendMessage(GetHwnd(), CB_DELETESTRING, n, 0); 
  89 void wxChoice::Clear() 
  91     // TODO: SendMessage(GetHwnd(), CB_RESETCONTENT, 0, 0); 
  94 // ---------------------------------------------------------------------------- 
  96 // ---------------------------------------------------------------------------- 
  98 int wxChoice::GetSelection() const 
 100     // TODO: return (int)SendMessage(GetHwnd(), CB_GETCURSEL, 0, 0); 
 104 void wxChoice::SetSelection(int n
) 
 106     // TODO: SendMessage(GetHwnd(), CB_SETCURSEL, n, 0); 
 109 // ---------------------------------------------------------------------------- 
 110 // string list functions 
 111 // ---------------------------------------------------------------------------- 
 113 int wxChoice::GetCount() const 
 115     // TODO: return (int)SendMessage(GetHwnd(), CB_GETCOUNT, 0, 0); 
 119 int wxChoice::FindString(const wxString
& s
) const 
 123     int pos = (int)SendMessage(GetHwnd(), CB_FINDSTRINGEXACT, 
 124                                (WPARAM)-1, (LPARAM)s.c_str()); 
 126     return pos == LB_ERR ? wxNOT_FOUND : pos; 
 131 void wxChoice::SetString(int n
, const wxString
& s
) 
 133     wxFAIL_MSG(wxT("not implemented")); 
 135 #if 0 // should do this, but no Insert() so far 
 141 wxString 
wxChoice::GetString(int n
) const 
 143     size_t len 
= 0; // TODO: (size_t)::SendMessage(GetHwnd(), CB_GETLBTEXTLEN, n, 0); 
 148         if ( ::SendMessage(GetHwnd(), CB_GETLBTEXT, n, 
 149                            (LPARAM)str.GetWriteBuf(len)) == CB_ERR ) { 
 150             wxLogLastError("SendMessage(CB_GETLBTEXT)"); 
 158 // ---------------------------------------------------------------------------- 
 160 // ---------------------------------------------------------------------------- 
 162 void wxChoice::DoSetItemClientData( int n
, void* clientData 
) 
 166     if ( SendMessage(GetHwnd(), CB_SETITEMDATA, n, (LPARAM)clientData) == CB_ERR ) 
 168         wxLogLastError(wxT("CB_SETITEMDATA")); 
 173 void* wxChoice::DoGetItemClientData( int n 
) const 
 177     LPARAM rc = SendMessage(GetHwnd(), CB_GETITEMDATA, n, 0); 
 180         wxLogLastError(wxT("CB_GETITEMDATA")); 
 182         // unfortunately, there is no way to return an error code to the user 
 191 void wxChoice::DoSetItemClientObject( int n
, wxClientData
* clientData 
) 
 193     DoSetItemClientData(n
, clientData
); 
 196 wxClientData
* wxChoice::DoGetItemClientObject( int n 
) const 
 198     return (wxClientData 
*)DoGetItemClientData(n
); 
 201 // ---------------------------------------------------------------------------- 
 202 // wxOS2 specific helpers 
 203 // ---------------------------------------------------------------------------- 
 205 void wxChoice::DoSetSize(int x
, int y
, 
 206                          int width
, int height
, 
 209     // Ignore height parameter because height doesn't mean 'initially 
 210     // displayed' height, it refers to the drop-down menu as well. The 
 211     // wxWindows interpretation is different; also, getting the size returns 
 212     // the _displayed_ size (NOT the drop down menu size) so 
 213     // setting-getting-setting size would not work. 
 214     wxControl::DoSetSize(x
, y
, width
, -1, sizeFlags
); 
 217 wxSize 
wxChoice::DoGetBestSize() const 
 219     // find the widest string 
 222     int nItems 
= GetCount(); 
 223     for ( int i 
= 0; i 
< nItems
; i
++ ) 
 225         wxString 
str(GetString(i
)); 
 226         GetTextExtent(str
, &wLine
, NULL
); 
 227         if ( wLine 
> wChoice 
) 
 231     // give it some reasonable default value if there are no strings in the 
 236     // the combobox should be larger than the widest string 
 238     wxGetCharSize(GetHWND(), &cx
, &cy
, (wxFont
*)&GetFont()); 
 242     // Choice drop-down list depends on number of items (limited to 10) 
 243     size_t nStrings 
= nItems 
== 0 ? 10 : wxMin(10, nItems
) + 1; 
 244     int hChoice 
= EDIT_HEIGHT_FROM_CHAR_HEIGHT(cy
)*nStrings
; 
 246     return wxSize(wChoice
, hChoice
); 
 249 MRESULT 
wxChoice::OS2WindowProc(HWND hwnd
, WXUINT nMsg
, WXWPARAM wParam
, WXLPARAM lParam
) 
 253     if ( nMsg == WM_LBUTTONUP ) 
 255         int x = (int)LOWORD(lParam); 
 256         int y = (int)HIWORD(lParam); 
 258         // Ok, this is truly weird, but if a panel with a wxChoice loses the 
 259         // focus, then you get a *fake* WM_LBUTTONUP message with x = 65535 and 
 260         // y = 65535. Filter out this nonsense. 
 262         // VZ: I'd like to know how to reproduce this please... 
 263         if ( x == 65535 && y == 65535 ) 
 267     return wxWindow::OS2WindowProc(hwnd
, nMsg
, wParam
, lParam
); 
 270 bool wxChoice::OS2Command(WXUINT param
, WXWORD 
WXUNUSED(id
)) 
 274     if ( param != CBN_SELCHANGE) 
 276         // "selection changed" is the only event we're after 
 280     wxCommandEvent 
event(wxEVT_COMMAND_CHOICE_SELECTED
, m_windowId
); 
 281     event
.SetInt(GetSelection()); 
 282     event
.SetEventObject(this); 
 283 // TODO:    event.SetString(GetStringSelection()); 
 284     ProcessCommand(event
);