1 ///////////////////////////////////////////////////////////////////////////// 
   2 // Name:        msw/combobox.cpp 
   3 // Purpose:     wxComboBox class 
   4 // Author:      Julian Smart 
   8 // Copyright:   (c) Julian Smart 
   9 // Licence:     wxWindows licence 
  10 ///////////////////////////////////////////////////////////////////////////// 
  12 // ============================================================================ 
  14 // ============================================================================ 
  16 // ---------------------------------------------------------------------------- 
  18 // ---------------------------------------------------------------------------- 
  20 #if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) 
  21 #pragma implementation "combobox.h" 
  24 // For compilers that support precompilation, includes "wx.h". 
  25 #include "wx/wxprec.h" 
  34     #include "wx/settings.h" 
  36     // for wxEVT_COMMAND_TEXT_ENTER 
  37     #include "wx/textctrl.h" 
  41 #include "wx/combobox.h" 
  43 #include "wx/clipbrd.h" 
  44 #include "wx/msw/private.h" 
  47     #if !defined(__GNUWIN32_OLD__) || defined(__CYGWIN10__) 
  50     #include "wx/tooltip.h" 
  51 #endif // wxUSE_TOOLTIPS 
  53 // ---------------------------------------------------------------------------- 
  55 // ---------------------------------------------------------------------------- 
  57 #if wxUSE_EXTENDED_RTTI 
  58 WX_DEFINE_FLAGS( wxComboBoxStyle 
) 
  60 wxBEGIN_FLAGS( wxComboBoxStyle 
) 
  61     // new style border flags, we put them first to 
  62     // use them for streaming out 
  63     wxFLAGS_MEMBER(wxBORDER_SIMPLE
) 
  64     wxFLAGS_MEMBER(wxBORDER_SUNKEN
) 
  65     wxFLAGS_MEMBER(wxBORDER_DOUBLE
) 
  66     wxFLAGS_MEMBER(wxBORDER_RAISED
) 
  67     wxFLAGS_MEMBER(wxBORDER_STATIC
) 
  68     wxFLAGS_MEMBER(wxBORDER_NONE
) 
  70     // old style border flags 
  71     wxFLAGS_MEMBER(wxSIMPLE_BORDER
) 
  72     wxFLAGS_MEMBER(wxSUNKEN_BORDER
) 
  73     wxFLAGS_MEMBER(wxDOUBLE_BORDER
) 
  74     wxFLAGS_MEMBER(wxRAISED_BORDER
) 
  75     wxFLAGS_MEMBER(wxSTATIC_BORDER
) 
  76     wxFLAGS_MEMBER(wxBORDER
) 
  78     // standard window styles 
  79     wxFLAGS_MEMBER(wxTAB_TRAVERSAL
) 
  80     wxFLAGS_MEMBER(wxCLIP_CHILDREN
) 
  81     wxFLAGS_MEMBER(wxTRANSPARENT_WINDOW
) 
  82     wxFLAGS_MEMBER(wxWANTS_CHARS
) 
  83     wxFLAGS_MEMBER(wxFULL_REPAINT_ON_RESIZE
) 
  84     wxFLAGS_MEMBER(wxALWAYS_SHOW_SB 
) 
  85     wxFLAGS_MEMBER(wxVSCROLL
) 
  86     wxFLAGS_MEMBER(wxHSCROLL
) 
  88     wxFLAGS_MEMBER(wxCB_SIMPLE
) 
  89     wxFLAGS_MEMBER(wxCB_SORT
) 
  90     wxFLAGS_MEMBER(wxCB_READONLY
) 
  91     wxFLAGS_MEMBER(wxCB_DROPDOWN
) 
  93 wxEND_FLAGS( wxComboBoxStyle 
) 
  95 IMPLEMENT_DYNAMIC_CLASS_XTI(wxComboBox
, wxControl
,"wx/combobox.h") 
  97 wxBEGIN_PROPERTIES_TABLE(wxComboBox
) 
  98     wxEVENT_PROPERTY( Select 
, wxEVT_COMMAND_COMBOBOX_SELECTED 
, wxCommandEvent 
) 
  99     wxEVENT_PROPERTY( TextEnter 
, wxEVT_COMMAND_TEXT_ENTER 
, wxCommandEvent 
) 
 102     wxPROPERTY( Font 
, wxFont 
, SetFont 
, GetFont  
, EMPTY_MACROVALUE 
, 0 /*flags*/ , wxT("Helpstring") , wxT("group")) 
 103     wxPROPERTY_COLLECTION( Choices 
, wxArrayString 
, wxString 
, AppendString 
, GetStrings 
, 0 /*flags*/ , wxT("Helpstring") , wxT("group")) 
 104     wxPROPERTY( Value 
,wxString
, SetValue
, GetValue
, EMPTY_MACROVALUE 
, 0 /*flags*/ , wxT("Helpstring") , wxT("group")) 
 105     wxPROPERTY( Selection 
,int, SetSelection
, GetSelection
, EMPTY_MACROVALUE 
, 0 /*flags*/ , wxT("Helpstring") , wxT("group")) 
 106     wxPROPERTY_FLAGS( WindowStyle 
, wxComboBoxStyle 
, long , SetWindowStyleFlag 
, GetWindowStyleFlag 
, EMPTY_MACROVALUE 
, 0 /*flags*/ , wxT("Helpstring") , wxT("group")) // style 
 107 wxEND_PROPERTIES_TABLE() 
 109 wxBEGIN_HANDLERS_TABLE(wxComboBox
) 
 110 wxEND_HANDLERS_TABLE() 
 112 wxCONSTRUCTOR_5( wxComboBox 
, wxWindow
* , Parent 
, wxWindowID 
, Id 
, wxString 
, Value 
, wxPoint 
, Position 
, wxSize 
, Size 
) 
 116 IMPLEMENT_DYNAMIC_CLASS(wxComboBox
, wxControl
) 
 120 BEGIN_EVENT_TABLE(wxComboBox
, wxControl
) 
 121     EVT_MENU(wxID_CUT
, wxComboBox::OnCut
) 
 122     EVT_MENU(wxID_COPY
, wxComboBox::OnCopy
) 
 123     EVT_MENU(wxID_PASTE
, wxComboBox::OnPaste
) 
 124     EVT_MENU(wxID_UNDO
, wxComboBox::OnUndo
) 
 125     EVT_MENU(wxID_REDO
, wxComboBox::OnRedo
) 
 126     EVT_MENU(wxID_CLEAR
, wxComboBox::OnDelete
) 
 127     EVT_MENU(wxID_SELECTALL
, wxComboBox::OnSelectAll
) 
 129     EVT_UPDATE_UI(wxID_CUT
, wxComboBox::OnUpdateCut
) 
 130     EVT_UPDATE_UI(wxID_COPY
, wxComboBox::OnUpdateCopy
) 
 131     EVT_UPDATE_UI(wxID_PASTE
, wxComboBox::OnUpdatePaste
) 
 132     EVT_UPDATE_UI(wxID_UNDO
, wxComboBox::OnUpdateUndo
) 
 133     EVT_UPDATE_UI(wxID_REDO
, wxComboBox::OnUpdateRedo
) 
 134     EVT_UPDATE_UI(wxID_CLEAR
, wxComboBox::OnUpdateDelete
) 
 135     EVT_UPDATE_UI(wxID_SELECTALL
, wxComboBox::OnUpdateSelectAll
) 
 138 // ---------------------------------------------------------------------------- 
 139 // function prototypes 
 140 // ---------------------------------------------------------------------------- 
 142 LRESULT APIENTRY _EXPORT 
wxComboEditWndProc(HWND hWnd
, 
 147 // --------------------------------------------------------------------------- 
 149 // --------------------------------------------------------------------------- 
 151 // the pointer to standard radio button wnd proc 
 152 static WNDPROC gs_wndprocEdit 
= (WNDPROC
)NULL
; 
 154 // ============================================================================ 
 156 // ============================================================================ 
 158 // ---------------------------------------------------------------------------- 
 159 // wnd proc for subclassed edit control 
 160 // ---------------------------------------------------------------------------- 
 162 LRESULT APIENTRY _EXPORT 
wxComboEditWndProc(HWND hWnd
, 
 167     HWND hwndCombo 
= ::GetParent(hWnd
); 
 168     wxWindow 
*win 
= wxFindWinFromHandle((WXHWND
)hwndCombo
); 
 172         // forward some messages to the combobox to generate the appropriate 
 173         // wxEvents from them 
 183                 wxComboBox 
*combo 
= wxDynamicCast(win
, wxComboBox
); 
 186                     // we can get WM_KILLFOCUS while our parent is already half 
 187                     // destroyed and hence doesn't look like a combobx any 
 188                     // longer, check for it to avoid bogus assert failures 
 189                     if ( !win
->IsBeingDeleted() ) 
 191                         wxFAIL_MSG( _T("should have combo as parent") ); 
 194                 else if ( combo
->MSWProcessEditMsg(message
, wParam
, lParam
) ) 
 204                 wxCHECK_MSG( win
, 0, _T("should have a parent") ); 
 206                 if ( win
->GetWindowStyle() & wxPROCESS_ENTER 
) 
 208                     // need to return a custom dlg code or we'll never get it 
 209                     return DLGC_WANTMESSAGE
; 
 214         // deal with tooltips here 
 215 #if wxUSE_TOOLTIPS && defined(TTN_NEEDTEXT) 
 218                 wxCHECK_MSG( win
, 0, _T("should have a parent") ); 
 220                 NMHDR
* hdr 
= (NMHDR 
*)lParam
; 
 221                 if ( hdr
->code 
== TTN_NEEDTEXT 
) 
 223                     wxToolTip 
*tooltip 
= win
->GetToolTip(); 
 226                         TOOLTIPTEXT 
*ttt 
= (TOOLTIPTEXT 
*)lParam
; 
 227                         ttt
->lpszText 
= (wxChar 
*)tooltip
->GetTip().c_str(); 
 235 #endif // wxUSE_TOOLTIPS 
 238     return ::CallWindowProc(CASTWNDPROC gs_wndprocEdit
, hWnd
, message
, wParam
, lParam
); 
 241 // ---------------------------------------------------------------------------- 
 242 // wxComboBox callbacks 
 243 // ---------------------------------------------------------------------------- 
 245 WXLRESULT 
wxComboBox::MSWWindowProc(WXUINT nMsg
, WXWPARAM wParam
, WXLPARAM lParam
) 
 247     // TODO: handle WM_CTLCOLOR messages from our EDIT control to be able to 
 248     //       set its colour correctly (to be the same as our own one) 
 253             // Selection was set with SetSelection.  Update the value too. 
 254             if ((int)wParam 
> GetCount()) 
 257                 m_value 
= GetString(wParam
); 
 262         // wxStaticBox can generate this message, when modifying the control's style. 
 263         // This causes the content of the combobox to be selected, for some reason. 
 264         case WM_STYLECHANGED
: 
 266                 // combobox selection sometimes spontaneously changes when its 
 267                 // size changes, restore it to the old value if necessary 
 269                 GetSelection(&fromOld
, &toOld
); 
 270                 WXLRESULT result 
= wxChoice::MSWWindowProc(nMsg
, wParam
, lParam
); 
 273                 GetSelection(&fromNew
, &toNew
); 
 275                 if ( fromOld 
!= fromNew 
|| toOld 
!= toNew 
) 
 277                     SetSelection(fromOld
, toOld
); 
 284     return wxChoice::MSWWindowProc(nMsg
, wParam
, lParam
); 
 287 bool wxComboBox::MSWProcessEditMsg(WXUINT msg
, WXWPARAM wParam
, WXLPARAM lParam
) 
 292             // for compatibility with wxTextCtrl, generate a special message 
 293             // when Enter is pressed 
 294             if ( wParam 
== VK_RETURN 
) 
 296                 wxCommandEvent 
event(wxEVT_COMMAND_TEXT_ENTER
, m_windowId
); 
 297                 InitCommandEvent(event
); 
 298                 event
.SetString(GetValue()); 
 299                 event
.SetInt(GetSelection()); 
 300                 if ( ProcessCommand(event
) ) 
 302                     // don't let the event through to the native control 
 303                     // because it doesn't need it and may generate an annoying 
 304                     // beep if it gets it 
 311             return HandleChar(wParam
, lParam
, true /* isASCII */); 
 315             return HandleKeyDown(wParam
, lParam
); 
 319             return HandleKeyUp(wParam
, lParam
); 
 322             return HandleSetFocus((WXHWND
)wParam
); 
 325             return HandleKillFocus((WXHWND
)wParam
); 
 331 bool wxComboBox::MSWCommand(WXUINT param
, WXWORD id
) 
 339             sel 
= GetSelection(); 
 341             // we may sometimes get 2 CBN_SELCHANGE events or a CBN_SELENDOK 
 342             // before CBN_SELCHANGE with the same index when the user selects 
 343             // an item in the combobox -- ignore duplicates 
 344             if ( sel 
> -1 && sel 
!= m_selectionOld 
) 
 346                 m_selectionOld 
= sel
; 
 348                 // GetValue() would still return the old value from here but 
 349                 // according to the docs we should return the new value if the 
 350                 // user calls it in his event handler, so update internal 
 352                 m_value 
= GetString(sel
); 
 354                 wxCommandEvent 
event(wxEVT_COMMAND_COMBOBOX_SELECTED
, GetId()); 
 356                 event
.SetEventObject(this); 
 357                 event
.SetString(m_value
); 
 358                 ProcessCommand(event
); 
 360             else // no valid selection 
 362                 m_selectionOld 
= sel
; 
 364                 // hence no EVT_TEXT neither 
 368             // fall through: for compability with wxGTK, also send the text 
 369             // update event when the selection changes (this also seems more 
 370             // logical as the text does change) 
 374                 wxCommandEvent 
event(wxEVT_COMMAND_TEXT_UPDATED
, GetId()); 
 376                 // if sel != -1, value was initialized above (and we can't use 
 377                 // GetValue() here as it would return the old selection and we 
 381                     m_value 
= wxGetWindowText(GetHwnd()); 
 384                 else // we're synthesizing text updated event from sel change 
 386                     // We need to retrieve the current selection because the 
 387                     // user may have changed it in the previous handler (for 
 388                     // CBN_SELCHANGE above). 
 389                     sel 
= GetSelection(); 
 392                         m_value 
= GetString(sel
); 
 396                 event
.SetString(m_value
); 
 397                 event
.SetEventObject(this); 
 398                 ProcessCommand(event
); 
 403             return wxChoice::MSWCommand(param
, id
); 
 406     // let the def window proc have it by returning false, but do not pass the 
 407     // message we've already handled here (notably CBN_SELCHANGE) to the base 
 408     // class as it would generate another event for them 
 412 WXHWND 
wxComboBox::GetEditHWND() const 
 414     // this function should not be called for wxCB_READONLY controls, it is 
 415     // the callers responsability to check this 
 416     wxASSERT_MSG( !(GetWindowStyle() & wxCB_READONLY
), 
 417                   _T("read-only combobox doesn't have any edit control") ); 
 421     HWND hwndEdit 
= ::ChildWindowFromPoint(GetHwnd(), pt
); 
 422     if ( !hwndEdit 
|| hwndEdit 
== GetHwnd() ) 
 424         wxFAIL_MSG(_T("not read only combobox without edit control?")); 
 427     return (WXHWND
)hwndEdit
; 
 430 // ---------------------------------------------------------------------------- 
 431 // wxComboBox creation 
 432 // ---------------------------------------------------------------------------- 
 434 bool wxComboBox::Create(wxWindow 
*parent
, wxWindowID id
, 
 435                         const wxString
& value
, 
 438                         int n
, const wxString choices
[], 
 440                         const wxValidator
& validator
, 
 441                         const wxString
& name
) 
 443     // pretend that wxComboBox is hidden while it is positioned and resized and 
 444     // show it only right before leaving this method because otherwise there is 
 445     // some noticeable flicker while the control rearranges itself 
 448     if ( !CreateAndInit(parent
, id
, pos
, size
, n
, choices
, style
, 
 452     // we shouldn't call SetValue() for an empty string because this would 
 453     // (correctly) result in an assert with a read only combobox and is useless 
 454     // for the other ones anyhow 
 455     if ( !value
.empty() ) 
 458     // a (not read only) combobox is, in fact, 2 controls: the combobox itself 
 459     // and an edit control inside it and if we want to catch events from this 
 460     // edit control, we must subclass it as well 
 461     if ( !(style 
& wxCB_READONLY
) ) 
 463         gs_wndprocEdit 
= wxSetWindowProc((HWND
)GetEditHWND(), 
 467     // and finally, show the control 
 473 bool wxComboBox::Create(wxWindow 
*parent
, wxWindowID id
, 
 474                         const wxString
& value
, 
 477                         const wxArrayString
& choices
, 
 479                         const wxValidator
& validator
, 
 480                         const wxString
& name
) 
 482     wxCArrayString 
chs(choices
); 
 483     return Create(parent
, id
, value
, pos
, size
, chs
.GetCount(), 
 484                   chs
.GetStrings(), style
, validator
, name
); 
 487 WXDWORD 
wxComboBox::MSWGetStyle(long style
, WXDWORD 
*exstyle
) const 
 489     // we never have an external border 
 490     WXDWORD msStyle 
= wxChoice::MSWGetStyle
 
 492                         (style 
& ~wxBORDER_MASK
) | wxBORDER_NONE
, exstyle
 
 495     // usually WS_TABSTOP is added by wxControl::MSWGetStyle() but as we're 
 496     // created hidden (see Create() above), it is not done for us but we still 
 497     // want to have this style 
 498     msStyle 
|= WS_TABSTOP
; 
 500     // remove the style always added by wxChoice 
 501     msStyle 
&= ~CBS_DROPDOWNLIST
; 
 503     if ( style 
& wxCB_READONLY 
) 
 504         msStyle 
|= CBS_DROPDOWNLIST
; 
 506     else if ( style 
& wxCB_SIMPLE 
) 
 507         msStyle 
|= CBS_SIMPLE
; // A list (shown always) and edit control 
 510         msStyle 
|= CBS_DROPDOWN
; 
 512     // there is no reason to not always use CBS_AUTOHSCROLL, so do use it 
 513     msStyle 
|= CBS_AUTOHSCROLL
; 
 515     // NB: we used to also add CBS_NOINTEGRALHEIGHT here but why? 
 520 // ---------------------------------------------------------------------------- 
 521 // wxComboBox text control-like methods 
 522 // ---------------------------------------------------------------------------- 
 524 void wxComboBox::SetValue(const wxString
& value
) 
 526     if ( HasFlag(wxCB_READONLY
) ) 
 527         SetStringSelection(value
); 
 529         SetWindowText(GetHwnd(), value
.c_str()); 
 532     m_selectionOld 
= GetSelection(); 
 535 // Clipboard operations 
 536 void wxComboBox::Copy() 
 538     SendMessage(GetHwnd(), WM_COPY
, 0, 0L); 
 541 void wxComboBox::Cut() 
 543     SendMessage(GetHwnd(), WM_CUT
, 0, 0L); 
 546 void wxComboBox::Paste() 
 548     SendMessage(GetHwnd(), WM_PASTE
, 0, 0L); 
 551 void wxComboBox::Undo() 
 555         HWND hEditWnd 
= (HWND
) GetEditHWND() ; 
 557             ::SendMessage(hEditWnd
, EM_UNDO
, 0, 0); 
 561 void wxComboBox::Redo() 
 565         // Same as Undo, since Undo undoes the undo, i.e. a redo. 
 566         HWND hEditWnd 
= (HWND
) GetEditHWND() ; 
 568             ::SendMessage(hEditWnd
, EM_UNDO
, 0, 0); 
 572 void wxComboBox::SelectAll() 
 574     SetSelection(0, GetLastPosition()); 
 577 bool wxComboBox::CanUndo() const 
 582     HWND hEditWnd 
= (HWND
) GetEditHWND() ; 
 584         return ::SendMessage(hEditWnd
, EM_CANUNDO
, 0, 0) != 0; 
 589 bool wxComboBox::CanRedo() const 
 594     HWND hEditWnd 
= (HWND
) GetEditHWND() ; 
 596         return ::SendMessage(hEditWnd
, EM_CANUNDO
, 0, 0) != 0; 
 601 bool wxComboBox::HasSelection() const 
 604     GetSelection(&from
, &to
); 
 608 bool wxComboBox::CanCopy() const 
 610     // Can copy if there's a selection 
 611     return HasSelection(); 
 614 bool wxComboBox::CanCut() const 
 616     return IsEditable() && CanCopy() ; 
 619 bool wxComboBox::CanPaste() const 
 624     // Standard edit control: check for straight text on clipboard 
 625     if ( !::OpenClipboard(GetHwndOf(wxTheApp
->GetTopWindow())) ) 
 628     bool isTextAvailable 
= ::IsClipboardFormatAvailable(CF_TEXT
) != 0; 
 631     return isTextAvailable
; 
 634 bool wxComboBox::IsEditable() const 
 636     return !HasFlag(wxCB_READONLY
); 
 639 void wxComboBox::SetEditable(bool WXUNUSED(editable
)) 
 641   // Can't implement in MSW? 
 642 //  HWND hWnd = GetHwnd(); 
 643 //  SendMessage(hWnd, EM_SETREADONLY, (WPARAM)!editable, (LPARAM)0L); 
 646 void wxComboBox::SetInsertionPoint(long pos
) 
 648     if ( GetWindowStyle() & wxCB_READONLY 
) 
 652     HWND hWnd 
= GetHwnd(); 
 653     ::SendMessage(hWnd
, CB_SETEDITSEL
, 0, MAKELPARAM(pos
, pos
)); 
 654     HWND hEditWnd 
= (HWND
) GetEditHWND() ; 
 657         // Scroll insertion point into view 
 658         SendMessage(hEditWnd
, EM_SCROLLCARET
, (WPARAM
)0, (LPARAM
)0); 
 659         // Why is this necessary? (Copied from wxTextCtrl::SetInsertionPoint) 
 660         SendMessage(hEditWnd
, EM_REPLACESEL
, 0, (LPARAM
) wxEmptyString
); 
 665 void wxComboBox::SetInsertionPointEnd() 
 667     // setting insertion point doesn't make sense for read only comboboxes 
 668     if ( !(GetWindowStyle() & wxCB_READONLY
) ) 
 670         wxTextPos pos 
= GetLastPosition(); 
 671         SetInsertionPoint(pos
); 
 675 long wxComboBox::GetInsertionPoint() const 
 677     // CB_GETEDITSEL returns the index of the first character of the selection in 
 678     // its low-order word 
 679     DWORD pos
= (DWORD
)::SendMessage(GetHwnd(), CB_GETEDITSEL
, 0, 0L); 
 683 wxTextPos 
wxComboBox::GetLastPosition() const 
 685     HWND hEditWnd 
= (HWND
) GetEditHWND(); 
 687     // Get number of characters in the last (only) line. We'll add this to the character 
 688     // index for the last line, 1st position. 
 689     wxTextPos lineLength 
= (wxTextPos
)SendMessage(hEditWnd
, EM_LINELENGTH
, (WPARAM
) 0, (LPARAM
)0L); 
 694 void wxComboBox::Replace(long from
, long to
, const wxString
& value
) 
 699     // Now replace with 'value', by pasting. 
 700     wxSetClipboardData(wxDF_TEXT
, (wxObject 
*)(const wxChar 
*)value
, 0, 0); 
 702     // Paste into edit control 
 703     SendMessage(GetHwnd(), WM_PASTE
, (WPARAM
)0, (LPARAM
)0L); 
 711 void wxComboBox::Remove(long from
, long to
) 
 713     // Set selection and remove it 
 714     SetSelection(from
, to
); 
 715     SendMessage(GetHwnd(), WM_CUT
, (WPARAM
)0, (LPARAM
)0); 
 718 void wxComboBox::SetSelection(long from
, long to
) 
 720     // if from and to are both -1, it means (in wxWidgets) that all text should 
 721     // be selected, translate this into Windows convention 
 722     if ( (from 
== -1) && (to 
== -1) ) 
 727     if ( SendMessage(GetHwnd(), CB_SETEDITSEL
, 
 728                      0, (LPARAM
)MAKELONG(from
, to
)) == CB_ERR 
) 
 730         wxLogDebug(_T("CB_SETEDITSEL failed")); 
 734 void wxComboBox::GetSelection(long* from
, long* to
) const 
 736     DWORD dwStart
, dwEnd
; 
 737     if ( ::SendMessage(GetHwnd(), CB_GETEDITSEL
, 
 738                        (WPARAM
)&dwStart
, (LPARAM
)&dwEnd
) == CB_ERR 
) 
 750 int wxComboBox::GetSelection() const 
 752     return wxChoice::GetSelection(); 
 755 // ---------------------------------------------------------------------------- 
 756 // standard event handling 
 757 // ---------------------------------------------------------------------------- 
 759 void wxComboBox::OnCut(wxCommandEvent
& WXUNUSED(event
)) 
 764 void wxComboBox::OnCopy(wxCommandEvent
& WXUNUSED(event
)) 
 769 void wxComboBox::OnPaste(wxCommandEvent
& WXUNUSED(event
)) 
 774 void wxComboBox::OnUndo(wxCommandEvent
& WXUNUSED(event
)) 
 779 void wxComboBox::OnRedo(wxCommandEvent
& WXUNUSED(event
)) 
 784 void wxComboBox::OnDelete(wxCommandEvent
& WXUNUSED(event
)) 
 787     GetSelection(& from
, & to
); 
 788     if (from 
!= -1 && to 
!= -1) 
 792 void wxComboBox::OnSelectAll(wxCommandEvent
& WXUNUSED(event
)) 
 794     SetSelection(-1, -1); 
 797 void wxComboBox::OnUpdateCut(wxUpdateUIEvent
& event
) 
 799     event
.Enable( CanCut() ); 
 802 void wxComboBox::OnUpdateCopy(wxUpdateUIEvent
& event
) 
 804     event
.Enable( CanCopy() ); 
 807 void wxComboBox::OnUpdatePaste(wxUpdateUIEvent
& event
) 
 809     event
.Enable( CanPaste() ); 
 812 void wxComboBox::OnUpdateUndo(wxUpdateUIEvent
& event
) 
 814     event
.Enable( CanUndo() ); 
 817 void wxComboBox::OnUpdateRedo(wxUpdateUIEvent
& event
) 
 819     event
.Enable( CanRedo() ); 
 822 void wxComboBox::OnUpdateDelete(wxUpdateUIEvent
& event
) 
 824     event
.Enable(HasSelection() && IsEditable()) ; 
 827 void wxComboBox::OnUpdateSelectAll(wxUpdateUIEvent
& event
) 
 829     event
.Enable(GetLastPosition() > 0); 
 832 #endif // wxUSE_COMBOBOX