1 ///////////////////////////////////////////////////////////////////////////// 
   2 // Name:        src/os2/combobox.cpp 
   3 // Purpose:     wxComboBox class 
   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" 
  17 #include "wx/combobox.h" 
  20     #include "wx/settings.h" 
  23 #include "wx/clipbrd.h" 
  24 #include "wx/os2/private.h" 
  26 #define OWNER_DRAWN_LISTBOX_EXTRA_SPACE    (1) 
  28 MRESULT EXPENTRY 
wxComboEditWndProc( HWND   hWnd
 
  34 // The pointer to standard wnd proc 
  36 static WXFARPROC gfnWndprocEdit     
= (WXFARPROC
)NULL
; 
  38 bool wxComboBox::OS2Command( WXUINT uParam
, WXWORD 
WXUNUSED(wId
) ) 
  40     long lSel 
= GetSelection(); 
  48                 wxCommandEvent 
vEvent( wxEVT_COMMAND_COMBOBOX_SELECTED
, GetId() ); 
  51                 vEvent
.SetEventObject(this); 
  52                 vEvent
.SetString(GetStringSelection()); 
  54                 ProcessCommand(vEvent
); 
  60                 wxCommandEvent 
vEvent( wxEVT_COMMAND_TEXT_UPDATED
, GetId() ); 
  65                     sValue 
= GetStringSelection(); 
  66                 vEvent
.SetString(sValue
); 
  67                 vEvent
.SetEventObject(this); 
  68                 ProcessCommand(vEvent
); 
  73     // There is no return value for the CBN_ notifications, so always return 
  74     // false from here to pass the message to DefWindowProc() 
  77 } // end of wxComboBox::OS2Command 
  79 bool wxComboBox::Create( 
  82 , const wxString
&                   rsValue
 
  85 , const wxArrayString
&              asChoices
 
  87 , const wxValidator
&                rValidator
 
  88 , const wxString
&                   rsName
 
  91     wxCArrayString 
chs(asChoices
); 
  93     return Create(pParent
, vId
, rsValue
, rPos
, rSize
, chs
.GetCount(), 
  94                   chs
.GetStrings(), lStyle
, rValidator
, rsName
); 
  97 bool wxComboBox::Create( 
 100 , const wxString
&                   rsValue
 
 101 , const wxPoint
&                    rPos
 
 102 , const wxSize
&                     rSize
 
 104 , const wxString                    asChoices
[] 
 106 , const wxValidator
&                rValidator
 
 107 , const wxString
&                   rsName
 
 112     if (!CreateControl( pParent
 
 123     // Get the right style 
 127     lSstyle 
= WS_TABSTOP   
| 
 130     // clipping siblings does not yet work 
 131     // if (lStyle & wxCLIP_SIBLINGS ) 
 132     //     lSstyle |= WS_CLIPSIBLINGS; 
 133     if (lStyle 
& wxCB_READONLY
) 
 134         lSstyle 
|= CBS_DROPDOWNLIST
; 
 135     else if (lStyle 
& wxCB_SIMPLE
) 
 136         lSstyle 
|= CBS_SIMPLE
; // A list (shown always) and edit control 
 138         lSstyle 
|= CBS_DROPDOWN
; 
 141     if (!OS2CreateControl( wxT("COMBOBOX") 
 147     // A choice/combobox normally has a white background (or other, depending 
 148     // on global settings) rather than inheriting the parent's background colour. 
 150     SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW
)); 
 152     for (int i 
= 0; i 
< n
; i
++) 
 154         Append(asChoices
[i
]); 
 163     // Set height to use with sizers i.e. without the dropdown listbox 
 164     wxFont vFont 
= GetFont(); 
 166     wxGetCharSize( GetHWND(), NULL
, &nEditHeight
, &vFont 
); 
 167     nEditHeight 
= EDIT_HEIGHT_FROM_CHAR_HEIGHT(nEditHeight
); 
 168     SetInitialSize(wxSize(-1,nEditHeight
+4));   // +2x2 for the border 
 170     if (!rsValue
.empty()) 
 174     gfnWndprocEdit 
= (WXFARPROC
)::WinSubclassWindow( (HWND
)GetHwnd() 
 175                                                     ,(PFNWP
)wxComboEditWndProc
 
 177     ::WinSetWindowULong(GetHwnd(), QWL_USER
, (ULONG
)this); 
 180 } // end of wxComboBox::Create 
 182 wxString 
wxComboBox::GetValue() const 
 184     return HasFlag(wxCB_READONLY
) ? GetStringSelection() 
 185                                   : wxTextEntry::GetValue(); 
 188 void wxComboBox::SetValue(const wxString
& value
) 
 190     if ( HasFlag(wxCB_READONLY
) ) 
 191         SetStringSelection(value
); 
 193         wxTextEntry::SetValue(value
); 
 196 void wxComboBox::Clear() 
 199     if ( !HasFlag(wxCB_READONLY
) ) 
 200         wxTextEntry::Clear(); 
 203 bool wxComboBox::IsEditable() const 
 205     return !HasFlag(wxCB_READONLY
) && wxTextEntry::IsEditable(); 
 208 bool wxComboBox::ProcessEditMsg( 
 217             vFlag 
= SHORT1FROMMP(wParam
); 
 221                     return (HandleChar( wParam
 
 227                     return (HandleKeyDown( wParam
 
 232                     return (HandleKeyUp( wParam
 
 239             if (SHORT1FROMMP((MPARAM
)lParam
) == TRUE
) 
 240                 return(HandleSetFocus((WXHWND
)(HWND
)wParam
)); 
 242                 return(HandleKillFocus((WXHWND
)(HWND
)wParam
)); 
 245 } // end of wxComboBox::ProcessEditMsg 
 247 MRESULT EXPENTRY 
wxComboEditWndProc( 
 257         // Forward some messages to the combobox 
 262                 wxComboBox
* pCombo 
= (wxComboBox 
*)::WinQueryWindowULong( hWnd
 
 266                 if (pCombo
->ProcessEditMsg( uMessage
 
 275         // TODO: Deal with tooltips here 
 278     return (gfnWndprocEdit(hWnd
, (ULONG
)uMessage
, (MPARAM
)wParam
, (MPARAM
)lParam
)); 
 279 } // end of wxComboEditWndProc