]>
git.saurik.com Git - wxWidgets.git/blob - interface/wx/combo.h
   1 ///////////////////////////////////////////////////////////////////////////// 
   3 // Purpose:     interface of wxComboCtrl and wxComboPopup 
   4 // Author:      wxWidgets team 
   6 // Licence:     wxWindows license 
   7 ///////////////////////////////////////////////////////////////////////////// 
  12     In order to use a custom popup with wxComboCtrl, an interface class must be 
  13     derived from wxComboPopup. 
  15     For more information on how to use it, see @ref comboctrl_custompopup. 
  26         Default constructor. It is recommended that internal variables are 
  27         prepared in Init() instead (because m_combo is not valid in 
  33         The derived class must implement this to create the popup control. 
  35         @return @true if the call succeeded, @false otherwise. 
  37     virtual bool Create(wxWindow
* parent
) = 0; 
  40         Utility function that hides the popup. 
  45         The derived class may implement this to return adjusted size for the 
  46         popup control, according to the variables given. 
  49             Preferred minimum width. 
  51             Preferred height. May be -1 to indicate no preference. 
  53             Max height for window, as limited by screen size. 
  55         @remarks This function is called each time popup is about to be shown. 
  57     virtual wxSize 
GetAdjustedSize(int minWidth
, int prefHeight
, int maxHeight
); 
  60         The derived class must implement this to return pointer to the 
  61         associated control created in Create(). 
  63     virtual wxWindow
* GetControl() = 0; 
  66         The derived class must implement this to return string representation 
  69     virtual wxString 
GetStringValue() const = 0; 
  72         The derived class must implement this to initialize its internal 
  73         variables. This method is called immediately after construction 
  74         finishes. m_combo member variable has been initialized before the call. 
  79         Utility method that returns @true if Create has been called. 
  81         Useful in conjunction with LazyCreate(). 
  83     bool IsCreated() const; 
  86         The derived class may implement this to return @true if it wants to 
  87         delay call to Create() until the popup is shown for the first time. It 
  88         is more efficient, but on the other hand it is often more convenient to 
  89         have the control created immediately. 
  91         @remarks Base implementation returns @false. 
  93     virtual bool LazyCreate(); 
  96         The derived class may implement this to do something when the parent 
  97         wxComboCtrl gets double-clicked. 
  99     virtual void OnComboDoubleClick(); 
 102         The derived class may implement this to receive key events from the 
 105         Events not handled should be skipped, as usual. 
 107     virtual void OnComboKeyEvent(wxKeyEvent
& event
); 
 110         The derived class may implement this to do special processing when 
 113     virtual void OnDismiss(); 
 116         The derived class may implement this to do special processing when 
 119     virtual void OnPopup(); 
 122         The derived class may implement this to paint the parent wxComboCtrl. 
 124         Default implementation draws value as string. 
 126     virtual void PaintComboControl(wxDC
& dc
, const wxRect
& rect
); 
 129         The derived class must implement this to receive string value changes 
 132     virtual void SetStringValue(const wxString
& value
); 
 135         Parent wxComboCtrl. This is parameter has been prepared before Init() 
 144     Features enabled for wxComboCtrl. 
 146     @see wxComboCtrl::GetFeatures() 
 148 struct wxComboCtrlFeatures
 
 152         MovableButton   
= 0x0001, ///< Button can be on either side of control. 
 153         BitmapButton    
= 0x0002, ///< Button may be replaced with bitmap. 
 154         ButtonSpacing   
= 0x0004, ///< Button can have spacing from the edge 
 156         TextIndent      
= 0x0008, ///< wxComboCtrl::SetTextIndent() can be used. 
 157         PaintControl    
= 0x0010, ///< Combo control itself can be custom painted. 
 158         PaintWritable   
= 0x0020, ///< A variable-width area in front of writable 
 159                                   ///< combo control's textctrl can be custom 
 161         Borderless      
= 0x0040, ///< wxNO_BORDER window style works. 
 163         All             
= MovableButton 
| BitmapButton 
| ButtonSpacing 
| 
 164                           TextIndent 
| PaintControl 
| PaintWritable 
| 
 165                           Borderless 
///< All features. 
 173     A combo control is a generic combobox that allows totally custom popup. In 
 174     addition it has other customization features. For instance, position and 
 175     size of the dropdown button can be changed. 
 177     @section comboctrl_custompopup Setting Custom Popup for wxComboCtrl 
 179     wxComboCtrl needs to be told somehow which control to use and this is done 
 180     by SetPopupControl(). However, we need something more than just a wxControl 
 181     in this method as, for example, we need to call 
 182     SetStringValue("initial text value") and wxControl doesn't have such 
 183     method. So we also need a wxComboPopup which is an interface which must be 
 184     implemented by a control to be usable as a popup. 
 186     We couldn't derive wxComboPopup from wxControl as this would make it 
 187     impossible to have a class deriving from a wxWidgets control and from it, 
 188     so instead it is just a mix-in. 
 190     Here's a minimal sample of wxListView popup: 
 193     #include <wx/combo.h> 
 194     #include <wx/listctrl.h> 
 196     class wxListViewComboPopup : public wxListView, public wxComboPopup 
 199         // Initialize member variables 
 205         // Create popup control 
 206         virtual bool Create(wxWindow* parent) 
 208             return wxListView::Create(parent,1,wxPoint(0,0),wxDefaultSize); 
 211         // Return pointer to the created control 
 212         virtual wxWindow *GetControl() { return this; } 
 214         // Translate string into a list selection 
 215         virtual void SetStringValue(const wxString& s) 
 217             int n = wxListView::FindItem(-1,s); 
 218             if ( n >= 0 && n < wxListView::GetItemCount() ) 
 219                 wxListView::Select(n); 
 222         // Get list selection as a string 
 223         virtual wxString GetStringValue() const 
 226             return wxListView::GetItemText(m_value); 
 227             return wxEmptyString; 
 230         // Do mouse hot-tracking (which is typical in list popups) 
 231         void OnMouseMove(wxMouseEvent& event) 
 233             // TODO: Move selection to cursor 
 236         // On mouse left up, set the value and close the popup 
 237         void OnMouseClick(wxMouseEvent& WXUNUSED(event)) 
 239             m_value = wxListView::GetFirstSelected(); 
 241             // TODO: Send event as well 
 248         int m_value; // current item index 
 251         DECLARE_EVENT_TABLE() 
 254     BEGIN_EVENT_TABLE(wxListViewComboPopup, wxListView) 
 255         EVT_MOTION(wxListViewComboPopup::OnMouseMove) 
 256         EVT_LEFT_UP(wxListViewComboPopup::OnMouseClick) 
 260     Here's how you would create and populate it in a dialog constructor: 
 263     wxComboCtrl* comboCtrl = new wxComboCtrl(this, wxID_ANY, wxEmptyString); 
 265     wxListViewComboPopup* popupCtrl = new wxListViewComboPopup(); 
 267     comboCtrl->SetPopupControl(popupCtrl); 
 269     // Populate using wxListView methods 
 270     popupCtrl->InsertItem(popupCtrl->GetItemCount(), "First Item"); 
 271     popupCtrl->InsertItem(popupCtrl->GetItemCount(), "Second Item"); 
 272     popupCtrl->InsertItem(popupCtrl->GetItemCount(), "Third Item"); 
 276     @style{wxCB_READONLY} 
 277            Text will not be editable. 
 279            Sorts the entries in the list alphabetically. 
 280     @style{wxTE_PROCESS_ENTER} 
 281            The control will generate the event wxEVT_COMMAND_TEXT_ENTER 
 282            (otherwise pressing Enter key is either processed internally by the 
 283            control or used for navigation between dialog controls). Windows 
 285     @style{wxCC_SPECIAL_DCLICK} 
 286            Double-clicking triggers a call to popup's OnComboDoubleClick. 
 287            Actual behaviour is defined by a derived class. For instance, 
 288            wxOwnerDrawnComboBox will cycle an item. This style only applies if 
 289            wxCB_READONLY is used as well. 
 290     @style{wxCC_STD_BUTTON} 
 291            Drop button will behave more like a standard push button. 
 294     @beginEventTable{wxCommandEvent} 
 295     @event{EVT_TEXT(id, func)} 
 296            Process a wxEVT_COMMAND_TEXT_UPDATED event, when the text changes. 
 297     @event{EVT_TEXT_ENTER(id, func)} 
 298            Process a wxEVT_COMMAND_TEXT_ENTER event, when RETURN is pressed in 
 304     @appearance{comboctrl.png} 
 306     @see wxComboBox, wxChoice, wxOwnerDrawnComboBox, wxComboPopup, 
 309 class wxComboCtrl 
: public wxControl
 
 318         Constructor, creating and showing a combo control. 
 321             Parent window. Must not be @NULL. 
 323             Window identifier. The value wxID_ANY indicates a default value. 
 325             Initial selection string. An empty string indicates no selection. 
 329             Window size. If wxDefaultSize is specified then the window is sized 
 332             Window style. See wxComboCtrl. 
 338         @see Create(), wxValidator 
 340     wxComboCtrl(wxWindow
* parent
, wxWindowID id 
= wxID_ANY
, 
 341                 const wxString
& value 
= wxEmptyString
, 
 342                 const wxPoint
& pos 
= wxDefaultPosition
, 
 343                 const wxSize
& size 
= wxDefaultSize
, 
 345                 const wxValidator
& validator 
= wxDefaultValidator
, 
 346                 const wxString
& name 
= wxComboBoxNameStr
); 
 349         Destructor, destroying the combo control. 
 351     virtual ~wxComboCtrl(); 
 354         Copies the selected text to the clipboard. 
 359         Creates the combo control for two-step construction. Derived classes 
 360         should call or replace this function. See wxComboCtrl() for further 
 363     bool Create(wxWindow
* parent
, wxWindowID id 
= wxID_ANY
, 
 364                 const wxString
& value 
= wxEmptyString
, 
 365                 const wxPoint
& pos 
= wxDefaultPosition
, 
 366                 const wxSize
& size 
= wxDefaultSize
, 
 368                 const wxValidator
& validator 
= wxDefaultValidator
, 
 369                 const wxString
& name 
= wxComboBoxNameStr
); 
 372         Copies the selected text to the clipboard and removes the selection. 
 377         Enables or disables popup animation, if any, depending on the value of 
 380     void EnablePopupAnimation(bool enable 
= true); 
 383         Returns disabled button bitmap that has been set with 
 386         @return A reference to the disabled state bitmap. 
 388     const wxBitmap
& GetBitmapDisabled() const; 
 391         Returns button mouse hover bitmap that has been set with 
 394         @return A reference to the mouse hover state bitmap. 
 396     const wxBitmap
& GetBitmapHover() const; 
 399         Returns default button bitmap that has been set with 
 402         @return A reference to the normal state bitmap. 
 404     const wxBitmap
& GetBitmapNormal() const; 
 407         Returns depressed button bitmap that has been set with 
 410         @return A reference to the depressed state bitmap. 
 412     const wxBitmap
& GetBitmapPressed() const; 
 415         Returns current size of the dropdown button. 
 417     wxSize 
GetButtonSize(); 
 420         Returns custom painted area in control. 
 422         @see SetCustomPaintWidth(). 
 424     int GetCustomPaintWidth() const; 
 427         Returns features supported by wxComboCtrl. If needed feature is 
 428         missing, you need to instead use wxGenericComboCtrl, which however may 
 429         lack a native look and feel (but otherwise sports identical API). 
 431         @return Value returned is a combination of the flags defined in 
 434     static int GetFeatures(); 
 437         Returns the insertion point for the combo control's text field. 
 439         @note Under Windows, this function always returns 0 if the combo 
 440               control doesn't have the focus. 
 442     virtual long GetInsertionPoint() const; 
 445         Returns the last position in the combo control text field. 
 447     virtual long GetLastPosition() const; 
 450         Returns current popup interface that has been set with 
 453     wxComboPopup
* GetPopupControl(); 
 456         Returns popup window containing the popup control. 
 458     wxWindow
* GetPopupWindow() const; 
 461         Get the text control which is part of the combo control. 
 463     wxTextCtrl
* GetTextCtrl() const; 
 466         Returns actual indentation in pixels. 
 468     wxCoord 
GetTextIndent() const; 
 471         Returns area covered by the text field (includes everything except 
 472         borders and the dropdown button). 
 474     const wxRect
& GetTextRect() const; 
 477         Returns text representation of the current value. For writable combo 
 478         control it always returns the value in the text field. 
 480     virtual wxString 
GetValue() const; 
 483         Dismisses the popup window. 
 485     virtual void HidePopup(); 
 488         Returns @true if the popup is currently shown 
 490     bool IsPopupShown() const; 
 493         Returns @true if the popup window is in the given state. Possible 
 497         @row2col{wxComboCtrl::Hidden,    Popup window is hidden.} 
 498         @row2col{wxComboCtrl::Animating, Popup window is being shown, but the 
 499                                          popup animation has not yet finished.} 
 500         @row2col{wxComboCtrl::Visible,   Popup window is fully visible.} 
 503     bool IsPopupWindowState(int state
) const; 
 506         Implement in a derived class to define what happens on dropdown button 
 507         click. Default action is to show the popup. 
 509         @note If you implement this to do something else than show the popup, 
 510               you must then also implement DoSetPopupControl() to always return 
 513     virtual void OnButtonClick(); 
 516         Pastes text from the clipboard to the text field. 
 518     virtual void Paste(); 
 521         Removes the text between the two positions in the combo control text 
 529     virtual void Remove(long from
, long to
); 
 532         Replaces the text between two positions with the given text, in the 
 533         combo control text field. 
 542     virtual void Replace(long from
, long to
, const wxString
& text
); 
 545         Sets custom dropdown button graphics. 
 548             Default button image. 
 550             If @true, blank push button background is painted below the image. 
 552             Depressed button image. 
 554             Button image when mouse hovers above it. This should be ignored on 
 555             platforms and themes that do not generally draw different kind of 
 556             button on mouse hover. 
 558             Disabled button image. 
 560     void SetButtonBitmaps(const wxBitmap
& bmpNormal
, 
 561                           bool pushButtonBg 
= false, 
 562                           const wxBitmap
& bmpPressed 
= wxNullBitmap
, 
 563                           const wxBitmap
& bmpHover 
= wxNullBitmap
, 
 564                           const wxBitmap
& bmpDisabled 
= wxNullBitmap
); 
 567         Sets size and position of dropdown button. 
 570             Button width. Value = 0 specifies default. 
 572             Button height. Value = 0 specifies default. 
 574             Indicates which side the button will be placed. Value can be wxLEFT 
 577             Horizontal spacing around the button. Default is 0. 
 579     void SetButtonPosition(int width 
= -1, int height 
= -1, 
 580                            int side 
= wxRIGHT
, int spacingX 
= 0); 
 583         Set width, in pixels, of custom painted area in control without 
 584         @c wxCB_READONLY style. In read-only wxOwnerDrawnComboBox, this is used 
 585         to indicate area that is not covered by the focus rectangle. 
 587     void SetCustomPaintWidth(int width
); 
 590         Sets the insertion point in the text field. 
 593             The new insertion point. 
 595     virtual void SetInsertionPoint(long pos
); 
 598         Sets the insertion point at the end of the combo control text field. 
 600     virtual void SetInsertionPointEnd(); 
 603         Set side of the control to which the popup will align itself. Valid 
 604         values are @c wxLEFT, @c wxRIGHT and 0. The default value 0 means that 
 605         the most appropriate side is used (which, currently, is always 
 608     void SetPopupAnchor(int anchorSide
); 
 611         Set popup interface class derived from wxComboPopup. This method should 
 612         be called as soon as possible after the control has been created, 
 613         unless OnButtonClick() has been overridden. 
 615     void SetPopupControl(wxComboPopup
* popup
); 
 618         Extends popup size horizontally, relative to the edges of the combo 
 622             How many pixel to extend beyond the left edge of the control. 
 625             How many pixel to extend beyond the right edge of the control. 
 628         @remarks Popup minimum width may override arguments. It is up to the 
 629                  popup to fully take this into account. 
 631     void SetPopupExtents(int extLeft
, int extRight
); 
 634         Sets preferred maximum height of the popup. 
 636         @remarks Value -1 indicates the default. 
 638     void SetPopupMaxHeight(int height
); 
 641         Sets minimum width of the popup. If wider than combo control, it will 
 644         @remarks Value -1 indicates the default. Also, popup implementation may 
 645                  choose to ignore this. 
 647     void SetPopupMinWidth(int width
); 
 650         Selects the text between the two positions, in the combo control text 
 658     virtual void SetSelection(long from
, long to
); 
 661         Sets the text for the text field without affecting the popup. Thus, 
 662         unlike SetValue(), it works equally well with combo control using 
 663         @c wxCB_READONLY style. 
 665     void SetText(const wxString
& value
); 
 668         This will set the space in pixels between left edge of the control and 
 669         the text, regardless whether control is read-only or not. Value -1 can 
 670         be given to indicate platform default. 
 672     void SetTextIndent(int indent
); 
 675         Sets the text for the combo control text field. 
 677         @note For a combo control with @c wxCB_READONLY style the string must 
 678               be accepted by the popup (for instance, exist in the dropdown 
 679               list), otherwise the call to SetValue() is ignored. 
 681     virtual void SetValue(const wxString
& value
); 
 684         Same as SetValue(), but also sends wxCommandEvent of type 
 685         wxEVT_COMMAND_TEXT_UPDATED if @a withEvent is @true. 
 687     void SetValueWithEvent(const wxString
& value
, bool withEvent 
= true); 
 692     virtual void ShowPopup(); 
 695         Undoes the last edit in the text field. Windows only. 
 700         Enable or disable usage of an alternative popup window, which 
 701         guarantees ability to focus the popup control, and allows common native 
 702         controls to function normally. This alternative popup window is usually 
 703         a wxDialog, and as such, when it is shown, its parent top-level window 
 704         will appear as if the focus has been lost from it. 
 706     void UseAltPopupWindow(bool enable 
= true); 
 711         This member function is not normally called in application code. 
 712         Instead, it can be implemented in a derived class to create a custom 
 715         The parameters are the same as those for DoShowPopup(). 
 717         @return @true if animation finishes before the function returns, 
 718                 @false otherwise. In the latter case you need to manually call 
 719                 DoShowPopup() after the animation ends. 
 721     virtual bool AnimateShow(const wxRect
& rect
, int flags
); 
 724         This member function is not normally called in application code. 
 725         Instead, it can be implemented in a derived class to return default 
 726         wxComboPopup, incase @a popup is @NULL. 
 728         @note If you have implemented OnButtonClick() to do something else than 
 729               show the popup, then DoSetPopupControl() must always set @a popup 
 732     virtual void DoSetPopupControl(wxComboPopup
* popup
); 
 735         This member function is not normally called in application code. 
 736         Instead, it must be called in a derived class to make sure popup is 
 737         properly shown after a popup animation has finished (but only if 
 738         AnimateShow() did not finish the animation within its function scope). 
 741             Position to show the popup window at, in screen coordinates. 
 743             Combination of any of the following: 
 745             @row2col{wxComboCtrl::ShowAbove, 
 746                      Popup is shown above the control instead of below.} 
 747             @row2col{wxComboCtrl::CanDeferShow, 
 748                      Showing the popup can be deferred to happen sometime after 
 749                      ShowPopup() has finished. In this case, AnimateShow() must 
 753     virtual void DoShowPopup(const wxRect
& rect
, int flags
);