]>
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 licence
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 Implement to customize matching of value string to an item container
49 String entered, usually by user or from SetValue() call.
52 When item matches an entry, but the entry's string representation
53 is not exactly the same (case mismatch, for example), then the
54 true item string should be written back to here, if it is not
58 Default implementation always return true and does not alter
61 virtual bool FindItem(const wxString
& item
, wxString
* trueItem
=NULL
);
64 The derived class may implement this to return adjusted size for the
65 popup control, according to the variables given.
68 Preferred minimum width.
70 Preferred height. May be -1 to indicate no preference.
72 Max height for window, as limited by screen size.
74 @remarks This function is called each time popup is about to be shown.
76 virtual wxSize
GetAdjustedSize(int minWidth
, int prefHeight
, int maxHeight
);
79 Returns pointer to the associated parent wxComboCtrl.
81 wxComboCtrl
* GetComboCtrl() const;
84 The derived class must implement this to return pointer to the
85 associated control created in Create().
87 virtual wxWindow
* GetControl() = 0;
90 The derived class must implement this to return string representation
93 virtual wxString
GetStringValue() const = 0;
96 The derived class must implement this to initialize its internal
97 variables. This method is called immediately after construction
98 finishes. m_combo member variable has been initialized before the call.
103 Utility method that returns @true if Create has been called.
105 Useful in conjunction with LazyCreate().
107 bool IsCreated() const;
110 The derived class may implement this to return @true if it wants to
111 delay call to Create() until the popup is shown for the first time. It
112 is more efficient, but on the other hand it is often more convenient to
113 have the control created immediately.
115 @remarks Base implementation returns @false.
117 virtual bool LazyCreate();
120 The derived class may implement this to do something when the parent
121 wxComboCtrl gets double-clicked.
123 virtual void OnComboDoubleClick();
126 The derived class may implement this to receive key events from the
129 Events not handled should be skipped, as usual.
131 virtual void OnComboKeyEvent(wxKeyEvent
& event
);
134 The derived class may implement this to do special processing when
137 virtual void OnDismiss();
140 The derived class may implement this to do special processing when
143 virtual void OnPopup();
146 The derived class may implement this to paint the parent wxComboCtrl.
148 Default implementation draws value as string.
150 virtual void PaintComboControl(wxDC
& dc
, const wxRect
& rect
);
153 The derived class must implement this to receive string value changes
156 virtual void SetStringValue(const wxString
& value
);
160 Parent wxComboCtrl. This member variable is prepared automatically
161 before Init() is called.
163 wxComboCtrl
* m_combo
;
169 Features enabled for wxComboCtrl.
171 @see wxComboCtrl::GetFeatures()
173 struct wxComboCtrlFeatures
177 MovableButton
= 0x0001, ///< Button can be on either side of control.
178 BitmapButton
= 0x0002, ///< Button may be replaced with bitmap.
179 ButtonSpacing
= 0x0004, ///< Button can have spacing from the edge
181 TextIndent
= 0x0008, ///< wxComboCtrl::SetMargins() can be used.
182 PaintControl
= 0x0010, ///< Combo control itself can be custom painted.
183 PaintWritable
= 0x0020, ///< A variable-width area in front of writable
184 ///< combo control's textctrl can be custom
186 Borderless
= 0x0040, ///< wxNO_BORDER window style works.
188 All
= MovableButton
| BitmapButton
| ButtonSpacing
|
189 TextIndent
| PaintControl
| PaintWritable
|
190 Borderless
///< All features.
198 A combo control is a generic combobox that allows totally custom popup. In
199 addition it has other customization features. For instance, position and
200 size of the dropdown button can be changed.
202 @section comboctrl_custompopup Setting Custom Popup for wxComboCtrl
204 wxComboCtrl needs to be told somehow which control to use and this is done
205 by SetPopupControl(). However, we need something more than just a wxControl
206 in this method as, for example, we need to call
207 SetStringValue("initial text value") and wxControl doesn't have such
208 method. So we also need a wxComboPopup which is an interface which must be
209 implemented by a control to be usable as a popup.
211 We couldn't derive wxComboPopup from wxControl as this would make it
212 impossible to have a class deriving from a wxWidgets control and from it,
213 so instead it is just a mix-in.
215 Here's a minimal sample of wxListView popup:
218 #include <wx/combo.h>
219 #include <wx/listctrl.h>
221 class wxListViewComboPopup : public wxListView, public wxComboPopup
224 // Initialize member variables
230 // Create popup control
231 virtual bool Create(wxWindow* parent)
233 return wxListView::Create(parent,1,wxPoint(0,0),wxDefaultSize);
236 // Return pointer to the created control
237 virtual wxWindow *GetControl() { return this; }
239 // Translate string into a list selection
240 virtual void SetStringValue(const wxString& s)
242 int n = wxListView::FindItem(-1,s);
243 if ( n >= 0 && n < wxListView::GetItemCount() )
244 wxListView::Select(n);
247 // Get list selection as a string
248 virtual wxString GetStringValue() const
251 return wxListView::GetItemText(m_value);
252 return wxEmptyString;
255 // Do mouse hot-tracking (which is typical in list popups)
256 void OnMouseMove(wxMouseEvent& event)
258 // TODO: Move selection to cursor
261 // On mouse left up, set the value and close the popup
262 void OnMouseClick(wxMouseEvent& WXUNUSED(event))
264 m_value = wxListView::GetFirstSelected();
266 // TODO: Send event as well
273 int m_value; // current item index
276 wxDECLARE_EVENT_TABLE();
279 wxBEGIN_EVENT_TABLE(wxListViewComboPopup, wxListView)
280 EVT_MOTION(wxListViewComboPopup::OnMouseMove)
281 EVT_LEFT_UP(wxListViewComboPopup::OnMouseClick)
285 Here's how you would create and populate it in a dialog constructor:
288 wxComboCtrl* comboCtrl = new wxComboCtrl(this, wxID_ANY, wxEmptyString);
290 wxListViewComboPopup* popupCtrl = new wxListViewComboPopup();
292 // It is important to call SetPopupControl() as soon as possible
293 comboCtrl->SetPopupControl(popupCtrl);
295 // Populate using wxListView methods
296 popupCtrl->InsertItem(popupCtrl->GetItemCount(), "First Item");
297 popupCtrl->InsertItem(popupCtrl->GetItemCount(), "Second Item");
298 popupCtrl->InsertItem(popupCtrl->GetItemCount(), "Third Item");
302 @style{wxCB_READONLY}
303 Text will not be editable.
305 Sorts the entries in the list alphabetically.
306 @style{wxTE_PROCESS_ENTER}
307 The control will generate the event @c wxEVT_COMMAND_TEXT_ENTER
308 (otherwise pressing Enter key is either processed internally by the
309 control or used for navigation between dialog controls). Windows
311 @style{wxCC_SPECIAL_DCLICK}
312 Double-clicking triggers a call to popup's OnComboDoubleClick.
313 Actual behaviour is defined by a derived class. For instance,
314 wxOwnerDrawnComboBox will cycle an item. This style only applies if
315 wxCB_READONLY is used as well.
316 @style{wxCC_STD_BUTTON}
317 Drop button will behave more like a standard push button.
320 @beginEventEmissionTable{wxCommandEvent}
321 @event{EVT_TEXT(id, func)}
322 Process a @c wxEVT_COMMAND_TEXT_UPDATED event, when the text changes.
323 @event{EVT_TEXT_ENTER(id, func)}
324 Process a @c wxEVT_COMMAND_TEXT_ENTER event, when RETURN is pressed in
326 @event{EVT_COMBOBOX_DROPDOWN(id, func)}
327 Process a @c wxEVT_COMMAND_COMBOBOX_DROPDOWN event, which is generated
328 when the popup window is shown (drops down).
329 @event{EVT_COMBOBOX_CLOSEUP(id, func)}
330 Process a @c wxEVT_COMMAND_COMBOBOX_CLOSEUP event, which is generated
331 when the popup window of the combo control disappears (closes up).
332 You should avoid adding or deleting items in this event.
337 @appearance{comboctrl.png}
339 @see wxComboBox, wxChoice, wxOwnerDrawnComboBox, wxComboPopup,
342 class wxComboCtrl
: public wxControl
,
352 Constructor, creating and showing a combo control.
355 Parent window. Must not be @NULL.
357 Window identifier. The value wxID_ANY indicates a default value.
359 Initial selection string. An empty string indicates no selection.
362 If ::wxDefaultPosition is specified then a default position is chosen.
365 If ::wxDefaultSize is specified then the window is sized appropriately.
367 Window style. See wxComboCtrl.
373 @see Create(), wxValidator
375 wxComboCtrl(wxWindow
* parent
, wxWindowID id
= wxID_ANY
,
376 const wxString
& value
= wxEmptyString
,
377 const wxPoint
& pos
= wxDefaultPosition
,
378 const wxSize
& size
= wxDefaultSize
,
380 const wxValidator
& validator
= wxDefaultValidator
,
381 const wxString
& name
= wxComboBoxNameStr
);
384 Destructor, destroying the combo control.
386 virtual ~wxComboCtrl();
389 Copies the selected text to the clipboard.
394 Creates the combo control for two-step construction. Derived classes
395 should call or replace this function. See wxComboCtrl() for further
398 bool Create(wxWindow
* parent
, wxWindowID id
= wxID_ANY
,
399 const wxString
& value
= wxEmptyString
,
400 const wxPoint
& pos
= wxDefaultPosition
,
401 const wxSize
& size
= wxDefaultSize
,
403 const wxValidator
& validator
= wxDefaultValidator
,
404 const wxString
& name
= wxComboBoxNameStr
);
407 Copies the selected text to the clipboard and removes the selection.
412 Dismisses the popup window.
414 Notice that calling this function will generate a
415 @c wxEVT_COMMAND_COMBOBOX_CLOSEUP event.
419 virtual void Dismiss();
423 Enables or disables popup animation, if any, depending on the value of
426 void EnablePopupAnimation(bool enable
= true);
429 Returns disabled button bitmap that has been set with
432 @return A reference to the disabled state bitmap.
434 const wxBitmap
& GetBitmapDisabled() const;
437 Returns button mouse hover bitmap that has been set with
440 @return A reference to the mouse hover state bitmap.
442 const wxBitmap
& GetBitmapHover() const;
445 Returns default button bitmap that has been set with
448 @return A reference to the normal state bitmap.
450 const wxBitmap
& GetBitmapNormal() const;
453 Returns depressed button bitmap that has been set with
456 @return A reference to the depressed state bitmap.
458 const wxBitmap
& GetBitmapPressed() const;
461 Returns current size of the dropdown button.
463 wxSize
GetButtonSize();
466 Returns custom painted area in control.
468 @see SetCustomPaintWidth().
470 int GetCustomPaintWidth() const;
473 Returns features supported by wxComboCtrl. If needed feature is
474 missing, you need to instead use wxGenericComboCtrl, which however may
475 lack a native look and feel (but otherwise sports identical API).
477 @return Value returned is a combination of the flags defined in
480 static int GetFeatures();
483 Returns the current hint string.
485 See SetHint() for more information about hints.
489 virtual wxString
GetHint() const;
492 Returns the insertion point for the combo control's text field.
494 @note Under Windows, this function always returns 0 if the combo
495 control doesn't have the focus.
497 virtual long GetInsertionPoint() const;
500 Returns the last position in the combo control text field.
502 virtual long GetLastPosition() const;
505 Returns the margins used by the control. The @c x field of the returned
506 point is the horizontal margin and the @c y field is the vertical one.
508 @remarks If given margin cannot be accurately determined, its value
515 wxPoint
GetMargins() const;
518 Returns current popup interface that has been set with
521 wxComboPopup
* GetPopupControl();
524 Returns popup window containing the popup control.
526 wxWindow
* GetPopupWindow() const;
529 Get the text control which is part of the combo control.
531 wxTextCtrl
* GetTextCtrl() const;
534 Returns actual indentation in pixels.
536 @deprecated Use GetMargins() instead.
538 wxCoord
GetTextIndent() const;
541 Returns area covered by the text field (includes everything except
542 borders and the dropdown button).
544 const wxRect
& GetTextRect() const;
547 Returns text representation of the current value. For writable combo
548 control it always returns the value in the text field.
550 virtual wxString
GetValue() const;
553 Dismisses the popup window.
556 Set this to @true in order to generate
557 @c wxEVT_COMMAND_COMBOBOX_CLOSEUP event.
559 @deprecated Use Dismiss() instead.
561 virtual void HidePopup(bool generateEvent
=false);
564 Returns @true if the popup is currently shown
566 bool IsPopupShown() const;
569 Returns @true if the popup window is in the given state. Possible
573 @row2col{wxComboCtrl::Hidden, Popup window is hidden.}
574 @row2col{wxComboCtrl::Animating, Popup window is being shown, but the
575 popup animation has not yet finished.}
576 @row2col{wxComboCtrl::Visible, Popup window is fully visible.}
579 bool IsPopupWindowState(int state
) const;
582 Implement in a derived class to define what happens on dropdown button
583 click. Default action is to show the popup.
585 @note If you implement this to do something else than show the popup,
586 you must then also implement DoSetPopupControl() to always return
589 virtual void OnButtonClick();
592 Pastes text from the clipboard to the text field.
594 virtual void Paste();
597 Shows the popup portion of the combo control.
599 Notice that calling this function will generate a
600 @c wxEVT_COMMAND_COMBOBOX_DROPDOWN event.
604 virtual void Popup();
607 Removes the text between the two positions in the combo control text
615 virtual void Remove(long from
, long to
);
618 Replaces the text between two positions with the given text, in the
619 combo control text field.
628 virtual void Replace(long from
, long to
, const wxString
& text
);
631 Sets custom dropdown button graphics.
634 Default button image.
636 If @true, blank push button background is painted below the image.
638 Depressed button image.
640 Button image when mouse hovers above it. This should be ignored on
641 platforms and themes that do not generally draw different kind of
642 button on mouse hover.
644 Disabled button image.
646 void SetButtonBitmaps(const wxBitmap
& bmpNormal
,
647 bool pushButtonBg
= false,
648 const wxBitmap
& bmpPressed
= wxNullBitmap
,
649 const wxBitmap
& bmpHover
= wxNullBitmap
,
650 const wxBitmap
& bmpDisabled
= wxNullBitmap
);
653 Sets size and position of dropdown button.
656 Button width. Value = 0 specifies default.
658 Button height. Value = 0 specifies default.
660 Indicates which side the button will be placed. Value can be wxLEFT
663 Horizontal spacing around the button. Default is 0.
665 void SetButtonPosition(int width
= -1, int height
= -1,
666 int side
= wxRIGHT
, int spacingX
= 0);
669 Set width, in pixels, of custom painted area in control without
670 @c wxCB_READONLY style. In read-only wxOwnerDrawnComboBox, this is used
671 to indicate area that is not covered by the focus rectangle.
673 void SetCustomPaintWidth(int width
);
676 Sets a hint shown in an empty unfocused combo control.
678 Notice that hints are known as <em>cue banners</em> under MSW or
679 <em>placeholder strings</em> under OS X.
681 @see wxTextEntry::SetHint()
685 virtual void SetHint(const wxString
& hint
);
688 Sets the insertion point in the text field.
691 The new insertion point.
693 virtual void SetInsertionPoint(long pos
);
696 Sets the insertion point at the end of the combo control text field.
698 virtual void SetInsertionPointEnd();
702 Attempts to set the control margins. When margins are given as wxPoint,
703 x indicates the left and y the top margin. Use -1 to indicate that
704 an existing value should be used.
707 @true if setting of all requested margins was successful.
711 bool SetMargins(const wxPoint
& pt
);
712 bool SetMargins(wxCoord left
, wxCoord top
= -1);
716 Set side of the control to which the popup will align itself. Valid
717 values are @c wxLEFT, @c wxRIGHT and 0. The default value 0 means that
718 the most appropriate side is used (which, currently, is always
721 void SetPopupAnchor(int anchorSide
);
724 Set popup interface class derived from wxComboPopup. This method should
725 be called as soon as possible after the control has been created,
726 unless OnButtonClick() has been overridden.
728 void SetPopupControl(wxComboPopup
* popup
);
731 Extends popup size horizontally, relative to the edges of the combo
735 How many pixel to extend beyond the left edge of the control.
738 How many pixel to extend beyond the right edge of the control.
741 @remarks Popup minimum width may override arguments. It is up to the
742 popup to fully take this into account.
744 void SetPopupExtents(int extLeft
, int extRight
);
747 Sets preferred maximum height of the popup.
749 @remarks Value -1 indicates the default.
751 void SetPopupMaxHeight(int height
);
754 Sets minimum width of the popup. If wider than combo control, it will
757 @remarks Value -1 indicates the default. Also, popup implementation may
758 choose to ignore this.
760 void SetPopupMinWidth(int width
);
763 Selects the text between the two positions, in the combo control text
771 virtual void SetSelection(long from
, long to
);
774 Sets the text for the text field without affecting the popup. Thus,
775 unlike SetValue(), it works equally well with combo control using
776 @c wxCB_READONLY style.
778 void SetText(const wxString
& value
);
781 Set a custom window style for the embedded wxTextCtrl. Usually you
782 will need to use this during two-step creation, just before Create().
786 wxComboCtrl* comboCtrl = new wxComboCtrl();
788 // Let's make the text right-aligned
789 comboCtrl->SetTextCtrlStyle(wxTE_RIGHT);
791 comboCtrl->Create(parent, wxID_ANY, wxEmptyString);
794 void SetTextCtrlStyle( int style
);
797 This will set the space in pixels between left edge of the control and
798 the text, regardless whether control is read-only or not. Value -1 can
799 be given to indicate platform default.
801 @deprecated Use SetMargins() instead.
803 void SetTextIndent(int indent
);
806 Sets the text for the combo control text field.
808 @note For a combo control with @c wxCB_READONLY style the string must
809 be accepted by the popup (for instance, exist in the dropdown
810 list), otherwise the call to SetValue() is ignored.
812 virtual void SetValue(const wxString
& value
);
815 Same as SetValue(), but also sends wxCommandEvent of type
816 @c wxEVT_COMMAND_TEXT_UPDATED if @a withEvent is @true.
818 void SetValueWithEvent(const wxString
& value
, bool withEvent
= true);
823 @deprecated Use Popup() instead.
825 virtual void ShowPopup();
828 Undoes the last edit in the text field. Windows only.
833 Enable or disable usage of an alternative popup window, which
834 guarantees ability to focus the popup control, and allows common native
835 controls to function normally. This alternative popup window is usually
836 a wxDialog, and as such, when it is shown, its parent top-level window
837 will appear as if the focus has been lost from it.
839 void UseAltPopupWindow(bool enable
= true);
844 This member function is not normally called in application code.
845 Instead, it can be implemented in a derived class to create a custom
848 The parameters are the same as those for DoShowPopup().
850 @return @true if animation finishes before the function returns,
851 @false otherwise. In the latter case you need to manually call
852 DoShowPopup() after the animation ends.
854 virtual bool AnimateShow(const wxRect
& rect
, int flags
);
857 This member function is not normally called in application code.
858 Instead, it can be implemented in a derived class to return default
859 wxComboPopup, incase @a popup is @NULL.
861 @note If you have implemented OnButtonClick() to do something else than
862 show the popup, then DoSetPopupControl() must always set @a popup
865 virtual void DoSetPopupControl(wxComboPopup
* popup
);
868 This member function is not normally called in application code.
869 Instead, it must be called in a derived class to make sure popup is
870 properly shown after a popup animation has finished (but only if
871 AnimateShow() did not finish the animation within its function scope).
874 Position to show the popup window at, in screen coordinates.
876 Combination of any of the following:
878 @row2col{wxComboCtrl::ShowAbove,
879 Popup is shown above the control instead of below.}
880 @row2col{wxComboCtrl::CanDeferShow,
881 Showing the popup can be deferred to happen sometime after
882 ShowPopup() has finished. In this case, AnimateShow() must
886 virtual void DoShowPopup(const wxRect
& rect
, int flags
);