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 IMPLEMENT_DYNAMIC_CLASS(wxComboBox
, wxControl
) 
  40 bool wxComboBox::OS2Command( WXUINT uParam
, WXWORD 
WXUNUSED(wId
) ) 
  42     long lSel 
= GetSelection(); 
  50                 wxCommandEvent 
vEvent( wxEVT_COMMAND_COMBOBOX_SELECTED
, GetId() ); 
  53                 vEvent
.SetEventObject(this); 
  54                 vEvent
.SetString(GetStringSelection()); 
  56                 ProcessCommand(vEvent
); 
  62                 wxCommandEvent 
vEvent( wxEVT_COMMAND_TEXT_UPDATED
, GetId() ); 
  67                     sValue 
= GetStringSelection(); 
  68                 vEvent
.SetString(sValue
); 
  69                 vEvent
.SetEventObject(this); 
  70                 ProcessCommand(vEvent
); 
  75     // There is no return value for the CBN_ notifications, so always return 
  76     // false from here to pass the message to DefWindowProc() 
  79 } // end of wxComboBox::OS2Command 
  81 bool wxComboBox::Create( 
  84 , const wxString
&                   rsValue
 
  87 , const wxArrayString
&              asChoices
 
  89 , const wxValidator
&                rValidator
 
  90 , const wxString
&                   rsName
 
  93     wxCArrayString 
chs(asChoices
); 
  95     return Create(pParent
, vId
, rsValue
, rPos
, rSize
, chs
.GetCount(), 
  96                   chs
.GetStrings(), lStyle
, rValidator
, rsName
); 
  99 bool wxComboBox::Create( 
 102 , const wxString
&                   rsValue
 
 103 , const wxPoint
&                    rPos
 
 104 , const wxSize
&                     rSize
 
 106 , const wxString                    asChoices
[] 
 108 , const wxValidator
&                rValidator
 
 109 , const wxString
&                   rsName
 
 114     if (!CreateControl( pParent
 
 125     // Get the right style 
 129     lSstyle 
= WS_TABSTOP   
| 
 132     // clipping siblings does not yet work 
 133     // if (lStyle & wxCLIP_SIBLINGS ) 
 134     //     lSstyle |= WS_CLIPSIBLINGS; 
 135     if (lStyle 
& wxCB_READONLY
) 
 136         lSstyle 
|= CBS_DROPDOWNLIST
; 
 137     else if (lStyle 
& wxCB_SIMPLE
) 
 138         lSstyle 
|= CBS_SIMPLE
; // A list (shown always) and edit control 
 140         lSstyle 
|= CBS_DROPDOWN
; 
 143     if (!OS2CreateControl( _T("COMBOBOX") 
 149     // A choice/combobox normally has a white background (or other, depending 
 150     // on global settings) rather than inheriting the parent's background colour. 
 152     SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW
)); 
 154     for (int i 
= 0; i 
< n
; i
++) 
 156         Append(asChoices
[i
]); 
 165     // Set height to use with sizers i.e. without the dropdown listbox 
 166     wxFont vFont 
= GetFont(); 
 168     wxGetCharSize( GetHWND(), NULL
, &nEditHeight
, &vFont 
); 
 169     nEditHeight 
= EDIT_HEIGHT_FROM_CHAR_HEIGHT(nEditHeight
); 
 170     SetInitialSize(wxSize(-1,nEditHeight
+4));   // +2x2 for the border 
 172     if (!rsValue
.empty()) 
 176     gfnWndprocEdit 
= (WXFARPROC
)::WinSubclassWindow( (HWND
)GetHwnd() 
 177                                                     ,(PFNWP
)wxComboEditWndProc
 
 179     ::WinSetWindowULong(GetHwnd(), QWL_USER
, (ULONG
)this); 
 182 } // end of wxComboBox::Create 
 184 wxString 
wxComboBox::GetValue() const 
 186     return wxGetWindowText(GetHwnd()); 
 189 void wxComboBox::SetValue( 
 190   const wxString
&                   rsValue
 
 193     if ( HasFlag(wxCB_READONLY
) ) 
 194         SetStringSelection(rsValue
); 
 196         ::WinSetWindowText(GetHwnd(), rsValue
.c_str()); 
 197 } // end of wxComboBox::SetValue 
 200 // Clipboard operations 
 202 void wxComboBox::Copy() 
 204     HWND                            hWnd 
= GetHwnd(); 
 206     ::WinSendMsg(hWnd
, EM_COPY
, (MPARAM
)0, (MPARAM
)0); 
 207 } // end of wxComboBox::Copy 
 209 void wxComboBox::Cut() 
 211     HWND                            hWnd 
= GetHwnd(); 
 213     ::WinSendMsg(hWnd
, EM_CUT
, (MPARAM
)0, (MPARAM
)0); 
 214 } // end of wxComboBox::Cut 
 216 void wxComboBox::Paste() 
 218     HWND                            hWnd 
= GetHwnd(); 
 220     ::WinSendMsg(hWnd
, EM_PASTE
, (MPARAM
)0, (MPARAM
)0); 
 221 } // end of wxComboBox::Paste 
 223 void wxComboBox::SetEditable( 
 227     HWND                            hWnd 
= GetHwnd(); 
 229     ::WinSendMsg(hWnd
, EM_SETREADONLY
, (MPARAM
)!bEditable
, (MPARAM
)0L); 
 230 } // end of wxComboBox::SetEditable 
 232 void wxComboBox::SetInsertionPoint( 
 236     HWND                            hWnd 
= GetHwnd(); 
 238     ::WinSendMsg(hWnd
, EM_SETFIRSTCHAR
, MPFROMLONG(lPos
), (MPARAM
)0); 
 239 } // end of wxComboBox::SetInsertionPoint 
 241 void wxComboBox::SetInsertionPointEnd() 
 243     wxTextPos                       lPos 
= GetLastPosition(); 
 245     SetInsertionPoint(lPos
); 
 246 } // end of wxComboBox::SetInsertionPointEnd 
 248 long wxComboBox::GetInsertionPoint() const 
 250     long                            lPos 
= LONGFROMMR(::WinSendMsg( GetHwnd() 
 255    if (lPos 
== LIT_NONE
) 
 258 } // end of wxComboBox::GetInsertionPoint 
 260 wxTextPos 
wxComboBox::GetLastPosition() const 
 262     long                            lLineLength 
= 0L; 
 266     // Get number of characters in the last (only) line. We'll add this to the character 
 267     // index for the last line, 1st position. 
 271     vParams
.fsStatus 
= WPM_CCHTEXT
; 
 272     if (::WinSendMsg( GetHwnd() 
 273                      ,WM_QUERYWINDOWPARAMS
 
 278         lLineLength 
= (long)vParams
.cchText
; 
 283 } // end of wxComboBox::GetLastPosition 
 285 void wxComboBox::Replace( long lFrom
, 
 287                           const wxString
& rsValue 
) 
 290     HWND                            hWnd 
= GetHwnd(); 
 293     // Set selection and remove it 
 295     ::WinSendMsg(hWnd
, EM_SETSEL
, MPFROM2SHORT((USHORT
)lFrom
, (USHORT
)lTo
), 0); 
 296     ::WinSendMsg(hWnd
, EM_CUT
, (MPARAM
)0, (MPARAM
)0); 
 299     // Now replace with 'value', by pasting. 
 301     wxSetClipboardData( wxDF_TEXT
 
 308     // Paste into edit control 
 310     ::WinSendMsg(hWnd
, EM_PASTE
, (MPARAM
)0, (MPARAM
)0L); 
 314     wxUnusedVar(rsValue
); 
 316 } // end of wxComboBox::Replace 
 318 void wxComboBox::Remove( long lFrom
, long lTo
) 
 321     HWND                            hWnd 
= GetHwnd(); 
 323     ::WinSendMsg(hWnd
, EM_SETSEL
, MPFROM2SHORT((USHORT
)lFrom
, (USHORT
)lTo
), 0); 
 324     ::WinSendMsg(hWnd
, EM_CUT
, (MPARAM
)0, (MPARAM
)0); 
 329 } // end of wxComboBox::Remove 
 331 void wxComboBox::SetSelection( long lFrom
, long lTo 
) 
 333     HWND hWnd 
= GetHwnd(); 
 338     // If from and to are both -1, it means 
 339     // (in wxWidgets) that all text should be selected. 
 340     // This translates into Windows convention 
 342     if ((lFrom 
== -1L) && (lTo 
== -1L)) 
 350                  ,MPFROM2SHORT((USHORT
)lFromChar
, (USHORT
)lToChar
) 
 353 } // end of wxComboBox::SetSelection 
 355 bool wxComboBox::ProcessEditMsg( 
 364             vFlag 
= SHORT1FROMMP(wParam
); 
 368                     return (HandleChar( wParam
 
 374                     return (HandleKeyDown( wParam
 
 379                     return (HandleKeyUp( wParam
 
 386             if (SHORT1FROMMP((MPARAM
)lParam
) == TRUE
) 
 387                 return(HandleSetFocus((WXHWND
)(HWND
)wParam
)); 
 389                 return(HandleKillFocus((WXHWND
)(HWND
)wParam
)); 
 392 } // end of wxComboBox::ProcessEditMsg 
 394 MRESULT EXPENTRY 
wxComboEditWndProc( 
 404         // Forward some messages to the combobox 
 409                 wxComboBox
* pCombo 
= (wxComboBox 
*)::WinQueryWindowULong( hWnd
 
 413                 if (pCombo
->ProcessEditMsg( uMessage
 
 422         // TODO: Deal with tooltips here 
 425     return (gfnWndprocEdit(hWnd
, (ULONG
)uMessage
, (MPARAM
)wParam
, (MPARAM
)lParam
)); 
 426 } // end of wxComboEditWndProc