]> git.saurik.com Git - wxWidgets.git/blobdiff - wxPython/src/combo.i
wxStaticLineNameStr
[wxWidgets.git] / wxPython / src / combo.i
index 2cfd494ed52279afb66a342b6c286c06b84b9220..d14a2487cebe8602f6222a6e15ea0659d9f673d6 100644 (file)
@@ -61,7 +61,9 @@ enum
 };
 
 
-// Namespace for wxComboCtrl feature flags
+DocStr( wxComboCtrlFeatures,
+        "Namespace for `wx.combo.ComboCtrl` feature flags.  See
+`wx.combo.ComboCtrl.GetFeatures`.", "");
 struct wxComboCtrlFeatures
 {
     enum
@@ -122,6 +124,29 @@ public:
             wxComboCtrl::DoSetPopupControl(popup);
     }
 
+    virtual bool IsKeyPopupToggle( const wxKeyEvent& event ) const
+    {
+        bool found;
+        bool rval = false;
+        wxPyBlock_t blocked = wxPyBeginBlockThreads();
+        if ((found = wxPyCBH_findCallback(m_myInst, "OnComboKeyEvent"))) {
+            PyObject* oevt = wxPyConstructObject((void*)&event, wxT("wxKeyEvent"), 0);
+            rval = wxPyCBH_callCallback(m_myInst, Py_BuildValue("(O)", oevt));
+            Py_DECREF(oevt);
+        }
+        wxPyEndBlockThreads(blocked);
+        if (! found)
+            rval = wxComboCtrl::IsKeyPopupToggle(event);
+        return rval;
+    }
+
+
+    virtual wxWindow *GetMainWindowOfCompositeControl()
+    {
+        return wxComboCtrl::GetMainWindowOfCompositeControl();
+    }
+
+    
     enum
     {
         ShowBelow       = 0x0000,  // Showing popup below the control
@@ -130,6 +155,8 @@ public:
     };
 
 
+    DEC_PYCALLBACK_VOID_(ShowPopup);
+    DEC_PYCALLBACK_VOID_(HidePopup);
     DEC_PYCALLBACK_VOID_(OnButtonClick);
     DEC_PYCALLBACK__RECTINT(DoShowPopup);
     DEC_PYCALLBACK_BOOL_RECTINT(AnimateShow);
@@ -139,6 +166,8 @@ public:
 
 IMPLEMENT_ABSTRACT_CLASS(wxPyComboCtrl, wxComboCtrl);
 
+IMP_PYCALLBACK_VOID_(wxPyComboCtrl, wxComboCtrl, ShowPopup);
+IMP_PYCALLBACK_VOID_(wxPyComboCtrl, wxComboCtrl, HidePopup);
 IMP_PYCALLBACK_VOID_(wxPyComboCtrl, wxComboCtrl, OnButtonClick);
 IMP_PYCALLBACK__RECTINT(wxPyComboCtrl, wxComboCtrl, DoShowPopup);
 IMP_PYCALLBACK_BOOL_RECTINT(wxPyComboCtrl, wxComboCtrl, AnimateShow);
@@ -148,6 +177,40 @@ IMP_PYCALLBACK_BOOL_RECTINT(wxPyComboCtrl, wxComboCtrl, AnimateShow);
 
 
 // Now declare wxPyComboCtrl for Python
+
+DocStr(wxPyComboCtrl,
+"A combo control is a generic combobox that allows for a totally custom
+popup. In addition it has other customization features. For instance,
+position and size of the dropdown button can be changed.
+
+To specify what to use for the popup control you need to derive a
+class from `wx.combo.ComboPopup` and pass it to the ComboCtrl with
+`SetPopupControl`.  It doesn't derive from any widget class so it can
+be used either as a mixin class combined with some standard or custom
+widget, or you can use the derived ComboPopup to create and hold an
+independent reference to the widget to be used for the popup.
+", "
+
+Window Styles
+-------------
+    ====================   ============================================
+    wx.CB_READONLY         Text will not be editable.
+    wx.CB_SORT             Sorts the entries in the list alphabetically.
+    wx.TE_PROCESS_ENTER    The control will generate the event
+                           EVT_TEXT_ENTER (otherwise pressing Enter key
+                           is either processed internally by the control
+                           or used for navigation between dialog controls).
+    wx.CC_SPECIAL_DCLICK   Double-clicking triggers a call to popup's
+                           OnComboDoubleClick. Actual behaviour is defined
+                           by a derived class. For instance,
+                           OwnerDrawnComboBox will cycle an item. This
+                           style only applies if wx.CB_READONLY is used
+                           as well.
+    wx.CC_STD_BUTTON       Drop button will behave more like a standard
+                           push button.
+    ====================   ============================================
+");
+
 MustHaveApp(wxPyComboCtrl);
 %rename(ComboCtrl) wxPyComboCtrl;
 
@@ -157,59 +220,103 @@ public:
     %pythonAppend wxPyComboCtrl      "self._setOORInfo(self);" setCallbackInfo(ComboCtrl)
     %pythonAppend wxPyComboCtrl()    "";
 
-    wxPyComboCtrl(wxWindow *parent,
-                  wxWindowID id = wxID_ANY,
-                  const wxString& value = wxEmptyString,
-                  const wxPoint& pos = wxDefaultPosition,
-                  const wxSize& size = wxDefaultSize,
-                  long style = 0,
-                  const wxValidator& validator = wxDefaultValidator,
-                  const wxString& name = wxPyComboBoxNameStr);
+    DocCtorStr(
+        wxPyComboCtrl(wxWindow *parent,
+                      wxWindowID id = wxID_ANY,
+                      const wxString& value = wxEmptyString,
+                      const wxPoint& pos = wxDefaultPosition,
+                      const wxSize& size = wxDefaultSize,
+                      long style = 0,
+                      const wxValidator& validator = wxDefaultValidator,
+                      const wxString& name = wxPyComboBoxNameStr),
+        "", "");
+
+    DocCtorStrName(
+        wxPyComboCtrl(),
+        "", "",
+        PreComboCtrl);
 
-    %RenameCtor(PreComboCtrl, wxPyComboCtrl());
 
     void _setCallbackInfo(PyObject* self, PyObject* _class);
 
-    // show/hide popup window
-    virtual void ShowPopup();
-    virtual void HidePopup();
+    DocDeclStr(
+        virtual void , ShowPopup(),
+        "Show the popup window.", "");
+
+    DocDeclStr(
+        virtual void , HidePopup(),
+        "Dismisses the popup window.", "");
+
 
     // Override for totally custom combo action
-    virtual void OnButtonClick();
+    DocDeclStr(
+        virtual void , OnButtonClick(),
+        "Implement in a derived class to define what happens on dropdown button
+click.  Default action is to show the popup. ", "");
+
 
     // return true if the popup is currently shown
-    bool IsPopupShown() const;
+    DocDeclStr(
+        bool , IsPopupShown() const,
+        "Returns true if the popup is currently shown.", "");
 
 
-    // set interface class instance derived from wxComboPopup
-    // NULL popup can be used to indicate default in a derived class
     %disownarg(wxPyComboPopup* popup);
-    void SetPopupControl( wxPyComboPopup* popup );
+    DocDeclStr(
+        void , SetPopupControl( wxPyComboPopup* popup ),
+        "Set popup interface class derived from `wx.combo.ComboPopup`. This
+method should be called as soon as possible after the control has been
+created, unless `OnButtonClick` has been overridden.", "");
     %cleardisown(wxPyComboPopup* popup);
 
 
-    // get interface class instance derived from wxComboPopup
-    wxPyComboPopup* GetPopupControl();
+    DocDeclStr(
+        wxPyComboPopup* , GetPopupControl(),
+        "Returns the current popup interface that has been set with
+`SetPopupControl`.", "");
+
+
+    DocDeclStr(
+        wxWindow *, GetPopupWindow() const,
+        "Returns the popup window containing the popup control.", "");
 
-    // get the popup window containing the popup control
-    wxWindow *GetPopupWindow() const;
 
-    // Get the text control which is part of the combobox.
-    wxTextCtrl *GetTextCtrl() const;
+    DocDeclStr(
+        wxTextCtrl *, GetTextCtrl() const,
+        "Get the text control which is part of the combo control.", "");
 
-    // get the dropdown button which is part of the combobox
-    // note: its not necessarily a wxButton or wxBitmapButton
-    wxWindow *GetButton() const;
 
-    // forward these methods to all subcontrols
-    virtual bool Enable(bool enable = true);
-    virtual bool Show(bool show = true);
-    virtual bool SetFont(const wxFont& font);
+   DocDeclStr(
+        wxWindow *, GetButton() const,
+        "Get the dropdown button which is part of the combobox.  Note: it's not
+necessarily a wx.Button or wx.BitmapButton.", "");
 
+    
+// NOTE: These are virtuals defined in a base class, so there
+// shouldn't be any reason to provide SWIG wrappers for them...    
+//     // forward these methods to all subcontrols
+//     virtual bool Enable(bool enable = true);
+//     virtual bool Show(bool show = true);
+//     virtual bool SetFont(const wxFont& font);
+//     virtual void SetValidator(const wxValidator &validator);
+//     virtual wxValidator *GetValidator();
+
+    
     // wxTextCtrl methods - for readonly combo they should return
     // without errors.
-    virtual wxString GetValue() const;
-    virtual void SetValue(const wxString& value);
+
+    DocDeclStr(
+        virtual wxString , GetValue() const,
+        "Returns text representation of the current value. For writable combo
+control it always returns the value in the text field.", "");
+
+    DocDeclStr(
+        virtual void , SetValue(const wxString& value),
+        "Sets the text for the combo control text field.  For a combo control
+with wx.CB_READONLY style the string must be accepted by the popup (for
+instance, exist in the dropdown list), otherwise the call to
+SetValue is ignored.", "");
+
     virtual void Copy();
     virtual void Cut();
     virtual void Paste();
@@ -223,146 +330,172 @@ public:
 
     %Rename(SetMark, void , SetSelection(long from, long to));
 
-    // This method sets the text without affecting list selection
-    // (ie. wxComboPopup::SetStringValue doesn't get called).
-    void SetText(const wxString& value);
 
-    // This method sets value and also optionally sends EVT_TEXT
-    // (needed by combo popups)
-    void SetValueWithEvent(const wxString& value, bool withEvent = true);
+    DocDeclStr(
+        void , SetText(const wxString& value),
+        "Sets the text for the text field without affecting the popup. Thus,
+unlike `SetValue`, it works equally well with combo control using
+wx.CB_READONLY style.", "");
+
+
+    DocDeclStr(
+        void , SetValueWithEvent(const wxString& value, bool withEvent = true),
+        "Same as `SetValue`, but also sends a EVT_TEXT event if withEvent is true.", "");
+
 
     //
     // Popup customization methods
     //
 
-    // Sets minimum width of the popup. If wider than combo control, it will
-    // extend to the left.
-    // Remarks:
-    // * Value -1 indicates the default.
-    // * Custom popup may choose to ignore this (wxOwnerDrawnComboBox does not).
-    void SetPopupMinWidth( int width );
-
-    // Sets preferred maximum height of the popup.
-    // Remarks:
-    // * Value -1 indicates the default.
-    // * Custom popup may choose to ignore this (wxOwnerDrawnComboBox does not).
-    void SetPopupMaxHeight( int height );
-
-    // Extends popup size horizontally, relative to the edges of the combo control.
-    // Remarks:
-    // * Popup minimum width may override extLeft (ie. it has higher precedence).
-    // * Values 0 indicate default.
-    // * Custom popup may not take this fully into account (wxOwnerDrawnComboBox takes).
-    void SetPopupExtents( int extLeft, int extRight );
-
-    // Set width, in pixels, of custom paint area in writable combo.
-    // In read-only, used to indicate area that is not covered by the
-    // focus rectangle (which may or may not be drawn, depending on the
-    // popup type).
-    void SetCustomPaintWidth( int width );
+    DocDeclStr(
+        void , SetPopupMinWidth( int width ),
+        "Sets minimum width of the popup. If wider than combo control, it will
+extend to the left.  A value of -1 indicates to use the default.  The
+popup implementation may choose to ignore this.", "");
+
+
+    DocDeclStr(
+        void , SetPopupMaxHeight( int height ),
+        "Sets preferred maximum height of the popup. A value of -1 indicates to
+use the default.  The popup implementation may choose to ignore this.", "");
+
+
+    DocDeclStr(
+        void , SetPopupExtents( int extLeft, int extRight ),
+        "Extends popup size horizontally, relative to the edges of the combo
+control.  Values are given in pixels, and the defaults are zero.  It
+is up to the popup to fully take these values into account.", "");
+
+
+    DocDeclStr(
+        void , SetCustomPaintWidth( int width ),
+        "Set width, in pixels, of custom painted area in control without
+wx.CB_READONLY style. In read-only OwnerDrawnComboBox, this is used
+to indicate the area that is not covered by the focus rectangle.", "");
+
     int GetCustomPaintWidth() const;
 
-    // Set side of the control to which the popup will align itself.
-    // Valid values are wxLEFT, wxRIGHT and 0. The default value 0 means
-    // that the side of the button will be used.
-    void SetPopupAnchor( int anchorSide );
-
-    // Set position of dropdown button.
-    //   width: button width. <= 0 for default.
-    //   height: button height. <= 0 for default.
-    //   side: wxLEFT or wxRIGHT, indicates on which side the button will be placed.
-    //   spacingX: empty space on sides of the button. Default is 0.
-    // Remarks:
-    //   There is no spacingY - the button will be centered vertically.
-    void SetButtonPosition( int width = -1,
-                            int height = -1,
-                            int side = wxRIGHT,
-                            int spacingX = 0 );
-
-    // Returns current size of the dropdown button.
-    wxSize GetButtonSize();
 
-    //
-    // Sets dropbutton to be drawn with custom bitmaps.
-    //
-    //  bmpNormal: drawn when cursor is not on button
-    //  pushButtonBg: Draw push button background below the image.
-    //                NOTE! This is usually only properly supported on platforms with appropriate
-    //                      method in wxRendererNative.
-    //  bmpPressed: drawn when button is depressed
-    //  bmpHover: drawn when cursor hovers on button. This is ignored on platforms
-    //            that do not generally display hover differently.
-    //  bmpDisabled: drawn when combobox is disabled.
-    void SetButtonBitmaps( const wxBitmap& bmpNormal,
-                           bool pushButtonBg = false,
-                           const wxBitmap& bmpPressed = wxNullBitmap,
-                           const wxBitmap& bmpHover = wxNullBitmap,
-                           const wxBitmap& bmpDisabled = wxNullBitmap );
+    DocDeclStr(
+        void , SetPopupAnchor( int anchorSide ),
+        "Set side of the control to which the popup will align itself. Valid
+values are wx.LEFT, wx.RIGHT and 0. The default value 0 means that the
+most appropriate side is used (which, currently, is always wx.LEFT).", "");
+
+
+    DocDeclStr(
+        void , SetButtonPosition( int width = -1,
+                                  int height = -1,
+                                  int side = wxRIGHT,
+                                  int spacingX = 0 ),
+        "Set the position of the dropdown button.", "");
+
+
+    DocDeclStr(
+        wxSize , GetButtonSize(),
+        "Returns current size of the dropdown button.", "");
+
+
+    DocDeclStr(
+        void , SetButtonBitmaps( const wxBitmap& bmpNormal,
+                                 bool pushButtonBg = false,
+                                 const wxBitmap& bmpPressed = wxNullBitmap,
+                                 const wxBitmap& bmpHover = wxNullBitmap,
+                                 const wxBitmap& bmpDisabled = wxNullBitmap ),
+        "Sets custom dropdown button graphics.
+
+    :param bmpNormal:  Default button image
+    :param pushButtonBg: If ``True``, blank push button background is painted below the image.
+    :param bmpPressed:  Depressed butotn image.
+    :param bmpHover:  Button imate to use when the mouse hovers over it.
+    :param bmpDisabled: Disabled button image.
+", "");
 
-    //
-    // This will set the space in pixels between left edge of the control and the
-    // text, regardless whether control is read-only (ie. no wxTextCtrl) or not.
-    // Platform-specific default can be set with value-1.
-    // Remarks
-    // * This method may do nothing on some native implementations.
-    void SetTextIndent( int indent );
 
-    // Returns actual indentation in pixels.
-    wxCoord GetTextIndent() const;
+    DocDeclStr(
+        void , SetTextIndent( int indent ),
+        "This will set the space in pixels between left edge of the control and
+the text, regardless whether control is read-only or not. A value of -1 can
+be given to indicate platform default.", "");
 
-    // Returns area covered by the text field.
-    const wxRect& GetTextRect() const;
 
-    // Call with enable as true to use a type of popup window that guarantees ability
-    // to focus the popup control, and normal function of common native controls.
-    // This alternative popup window is usually a wxDialog, and as such it's parent
-    // frame will appear as if the focus has been lost from it.
-    void UseAltPopupWindow( bool enable = true );
+    DocDeclStr(
+        wxCoord , GetTextIndent() const,
+        "Returns actual indentation in pixels.", "");
+
+
+    DocDeclStr(
+        const wxRect& , GetTextRect() const,
+        "Returns area covered by the text field (includes everything except
+borders and the dropdown button).", "");
+
+
+    DocDeclStr(
+        void , UseAltPopupWindow( bool enable = true ),
+        "Enable or disable usage of an alternative popup window, which
+guarantees ability to focus the popup control, and allows common
+native controls to function normally. This alternative popup window is
+usually a wxDialog, and as such, when it is shown, its parent
+top-level window will appear as if the focus has been lost from it.", "");
+
+
+    DocDeclStr(
+        void , EnablePopupAnimation( bool enable = true ),
+        "Enables or disables popup animation, if any, depending on the value of
+the argument.", "");
 
-    // Call with false to disable popup animation, if any.
-    void EnablePopupAnimation( bool enable = true );
 
     //
     // Utilies needed by the popups or native implementations
     //
 
-    // Returns true if given key combination should toggle the popup.
-    // NB: This is a separate from other keyboard handling because:
-    //     1) Replaceability.
-    //     2) Centralized code (otherwise it'd be split up between
-    //        wxComboCtrl key handler and wxVListBoxComboPopup's
-    //        key handler).
-    virtual bool IsKeyPopupToggle(const wxKeyEvent& event) const;
-
-    // Prepare background of combo control or an item in a dropdown list
-    // in a way typical on platform. This includes painting the focus/disabled
-    // background and setting the clipping region.
-    // Unless you plan to paint your own focus indicator, you should always call this
-    // in your wxComboPopup::PaintComboControl implementation.
-    // In addition, it sets pen and text colour to what looks good and proper
-    // against the background.
-    // flags: wxRendererNative flags: wxCONTROL_ISSUBMENU: is drawing a list item instead of combo control
-    //                                wxCONTROL_SELECTED: list item is selected
-    //                                wxCONTROL_DISABLED: control/item is disabled
-    virtual void PrepareBackground( wxDC& dc, const wxRect& rect, int flags ) const;
-
-    // Returns true if focus indicator should be drawn in the control.
-    bool ShouldDrawFocus() const;
-
-    // These methods return references to appropriate dropbutton bitmaps
+    DocDeclStr(
+        virtual bool , IsKeyPopupToggle(const wxKeyEvent& event) const,
+        "Returns true if given key combination should toggle the popup.", "");
+
+
+    DocDeclStr(
+        virtual void , PrepareBackground( wxDC& dc, const wxRect& rect, int flags ) const,
+        "Prepare background of combo control or an item in a dropdown list in a
+way typical on platform. This includes painting the focus/disabled
+background and setting the clipping region.  Unless you plan to paint
+your own focus indicator, you should always call this in your
+wxComboPopup::PaintComboControl implementation.  In addition, it sets
+pen and text colour to what looks good and proper against the
+background.
+
+flags are the same as wx.RendererNative flags:
+
+    ======================   ============================================
+    wx.CONTROL_ISSUBMENU     drawing a list item instead of combo control
+    wx.CONTROL_SELECTED      list item is selected
+    wx.CONTROL_DISABLED       control/item is disabled
+    ======================   ============================================
+", "");
+
+
+
+    DocDeclStr(
+        bool , ShouldDrawFocus() const,
+        "Returns true if focus indicator should be drawn in the control.", "");
+
+
     const wxBitmap& GetBitmapNormal() const;
     const wxBitmap& GetBitmapPressed() const;
     const wxBitmap& GetBitmapHover() const;
     const wxBitmap& GetBitmapDisabled() const;
 
-    // Return internal flags
     wxUint32 GetInternalFlags() const;
 
-    // Return true if Create has finished
-    bool IsCreated() const;
+    DocDeclStr(
+        bool , IsCreated() const,
+        "Return true if Create has finished", "");
+
+
+    DocDeclStr(
+        void , OnPopupDismiss(),
+        "Common code to be called on popup hide/dismiss", "");
 
-    // common code to be called on popup hide/dismiss
-    void OnPopupDismiss();
 
     // PopupShown states
     enum
@@ -379,8 +512,14 @@ public:
 
     // Set value returned by GetMainWindowOfCompositeControl
     void SetCtrlMainWnd( wxWindow* wnd );
+    virtual wxWindow *GetMainWindowOfCompositeControl();
+
+    DocDeclStr(
+        static int , GetFeatures(),
+        "Returns a bit-list of flags indicating which features of the ComboCtrl
+functionality are implemented by this implemetation.  See
+`wx.combo.ComboCtrlFeatures`.", "");
 
-    static int GetFeatures();
 
 
     // Flags for DoShowPopup and AnimateShow
@@ -392,13 +531,43 @@ public:
     };
 
     // Shows and positions the popup.
-    virtual void DoShowPopup( const wxRect& rect, int flags );
-
-    // Implement in derived class to create a drop-down animation.
-    // Return true if finished immediately. Otherwise popup is only
-    // shown when the derived class call DoShowPopup.
-    // Flags are same as for DoShowPopup.
-    virtual bool AnimateShow( const wxRect& rect, int flags );
+    DocDeclStr(
+        virtual void , DoShowPopup( const wxRect& rect, int flags ),
+        "Shows and positions the popup.
+
+Flags:
+    ============  =====================================================
+    ShowBelow     Showing popup below the control
+    ShowAbove     Showing popup above the control
+    CanDeferShow  Can only return true from AnimateShow if this is set
+    ============  =====================================================
+", "");
+
+
+
+    DocDeclStr(
+        virtual bool , AnimateShow( const wxRect& rect, int flags ),
+        "Implement in derived class to create a drop-down animation.  Return
+``True`` if finished immediately. Otherwise the popup is only shown when the
+derived class calls `DoShowPopup`.  Flags are same as for `DoShowPopup`.
+", "");
+
+
+    %property(PopupControl, GetPopupControl, SetPopupControl);
+    %property(PopupWindow, GetPopupWindow);
+    %property(TextCtrl, GetTextCtrl);
+    %property(Button, GetButton);
+    %property(Value, GetValue, SetValue);
+    %property(InsertionPoint, GetInsertionPoint);
+    %property(CustomPaintWidth, GetCustomPaintWidth, SetCustomPaintWidth);
+    %property(ButtonSize, GetButtonSize);
+    %property(TextIndent, GetTextIndent, SetTextIndent);
+    %property(TextRect, GetTextRect);
+    %property(BitmapNormal, GetBitmapNormal);
+    %property(BitmapPressed, GetBitmapPressed);
+    %property(BitmapHover, GetBitmapHover);
+    %property(BitmapDisabled, GetBitmapDisabled);
+    %property(PopupWindowState, GetPopupWindowState);
 
 };
 
@@ -521,7 +690,19 @@ IMP_PYCALLBACK_BOOL_(wxPyComboPopup, wxComboPopup, LazyCreate);
 
 
 
-// Now declare wxPyComboCtrl for Python
+// Now declare wxPyComboPopup for Python
+DocStr(wxPyComboPopup,
+"In order to use a custom popup with `wx.combo.ComboCtrl` an interface
+class derived from wx.combo.ComboPopup is used to manage the interface
+between the popup control and the popup.  You can either derive a new
+class from both the widget class and this ComboPopup class, or the
+derived class can have a reference to the widget used for the popup.
+In either case you simply need to return the widget from the
+`GetControl` method to allow the ComboCtrl to interact with it.
+
+Nearly all of the methods of this class are overridable in Python.", "");
+
+
 MustHaveApp(wxPyComboPopup);
 %rename(ComboPopup) wxPyComboPopup;
 
@@ -530,78 +711,135 @@ class wxPyComboPopup
 public:
     %pythonAppend wxPyComboPopup  setCallbackInfo(ComboPopup);
 
-    wxPyComboPopup();
-    ~wxPyComboPopup();
+    DocCtorStr(
+        wxPyComboPopup(),
+        "Constructor", "");
+
+    DocCtorStr(
+        ~wxPyComboPopup(),
+        "Destructor", "");
+
 
     void _setCallbackInfo(PyObject* self, PyObject* _class);
 
-    // This is called immediately after construction finishes. m_combo member
-    // variable has been initialized before the call.
-    // NOTE: It is not in constructor so the derived class doesn't need to redefine
-    //       a default constructor of its own.
-    virtual void Init();
+    DocDeclStr(
+        virtual void , Init(),
+        "This method is called after the popup is contructed and has been
+assigned to the ComboCtrl.  Derived classes can override this to do
+extra inialization or whatever.", "");
+
 
     // Create the popup child control.
     // Return true for success.
-    virtual bool Create(wxWindow* parent);
+    DocDeclStr(
+        virtual bool , Create(wxWindow* parent),
+        "The derived class must implement this method to create the popup
+control.  It should be a child of the ``parent`` passed in, but other
+than that there is much flexibility in what the widget can be, its
+style, etc.  Return ``True`` for success, ``False`` otherwise.  (NOTE:
+this return value is not currently checked...)", "");
+
+
+    DocDeclStr(
+        virtual wxWindow *, GetControl(),
+        "The derived class must implement this method and it should return a
+reference to the widget created in the `Create` method.  If the
+derived class inherits from both the widget class and ComboPopup then
+the return value is probably just ``self``.", "");
+
+
+    DocDeclStr(
+        virtual void , OnPopup(),
+        "The derived class may implement this to do special processing when
+popup is shown.", "");
+
+
+    DocDeclStr(
+        virtual void , OnDismiss(),
+        "The derived class may implement this to do special processing when
+popup is hidden.", "");
+
+
+    DocDeclStr(
+        virtual void , SetStringValue( const wxString& value ),
+        "Called just prior to displaying the popup.  The derived class can
+implement this to \"select\" the item in the popup that coresponds to
+the passed in string value, if appropriate.  The default
+implementation does nothing.", "");
+
+
+    DocDeclStr(
+        virtual wxString , GetStringValue() const,
+        "Gets the string representation of the currently selected value to be
+used to display in the combo widget.", "");
+
+
+    DocDeclStr(
+        virtual void , PaintComboControl( wxDC& dc, const wxRect& rect ),
+        "This is called to custom paint in the combo control itself (ie. not
+the popup).  Default implementation draws the current value as string.", "");
 
-    // We must have an associated control which is subclassed by the combobox.
-    virtual wxWindow *GetControl();
 
-    // Called immediately after the popup is shown
-    virtual void OnPopup();
+    DocDeclStr(
+        virtual void , OnComboKeyEvent( wxKeyEvent& event ),
+        "Receives key events from the parent ComboCtrl.  Events not handled
+should be skipped, as usual.", "");
 
-    // Called when popup is dismissed
-    virtual void OnDismiss();
 
-    // Called just prior to displaying popup.
-    // Default implementation does nothing.
-    virtual void SetStringValue( const wxString& value );
+    DocDeclStr(
+        virtual void , OnComboDoubleClick(),
+        "Implement this method in the derived class if you need to support
+special actions when the user double-clicks on the parent ComboCtrl.", "");
 
-    // Gets displayed string representation of the value.
-    virtual wxString GetStringValue() const;
 
-    // This is called to custom paint in the combo control itself (ie. not the popup).
-    // Default implementation draws value as string.
-    virtual void PaintComboControl( wxDC& dc, const wxRect& rect );
+    DocDeclStr(
+        virtual wxSize , GetAdjustedSize( int minWidth, int prefHeight, int maxHeight ),
+        "The derived class may implement this method to return adjusted size
+for the popup control, according to the variables given.  It is called
+on every popup, just prior to `OnPopup`.
 
-    // Receives key events from the parent wxComboCtrl.
-    // Events not handled should be skipped, as usual.
-    virtual void OnComboKeyEvent( wxKeyEvent& event );
+    :param minWidth:    Preferred minimum width.
+    :param prefHeight:  Preferred height. May be -1 to indicate no preference.
+    :maxWidth:          Max height for window, as limited by screen size, and
+                        should only be rounded down, if necessary.
+", "");
 
-    // Implement if you need to support special action when user
-    // double-clicks on the parent wxComboCtrl.
-    virtual void OnComboDoubleClick();
 
-    // Return final size of popup. Called on every popup, just prior to OnPopup.
-    // minWidth = preferred minimum width for window
-    // prefHeight = preferred height. Only applies if > 0,
-    // maxHeight = max height for window, as limited by screen size
-    //   and should only be rounded down, if necessary.
-    virtual wxSize GetAdjustedSize( int minWidth, int prefHeight, int maxHeight );
+    DocDeclStr(
+        virtual bool , LazyCreate(),
+        "The derived class may implement this to return ``True`` if it wants to
+delay the call to `Create` until the popup is shown for the first
+time. It is more efficient, but on the other hand it is often more
+convenient to have the control created immediately.  The default
+implementation returns ``False``.", "");
 
-    // Return true if you want delay call to Create until the popup is shown
-    // for the first time. It is more efficient, but note that it is often
-    // more convenient to have the control created immediately.
-    // Default returns false.
-    virtual bool LazyCreate();
 
     //
     // Utilies
     //
 
-    // Hides the popup
-    void Dismiss();
 
-    // Returns true if Create has been called.
-    bool IsCreated() const;
+    DocDeclStr(
+        void , Dismiss(),
+        "Hides the popup", "");
 
-    // Default PaintComboControl behaviour
-    static void DefaultPaintComboControl( wxComboCtrlBase* combo,
-                                          wxDC& dc,
-                                          const wxRect& rect );
 
-    wxPyComboCtrl* GetCombo();
+    DocDeclStr(
+        bool , IsCreated() const,
+        "Returns true if `Create` has been called.", "");
+
+
+    DocDeclStr(
+        static void , DefaultPaintComboControl( wxComboCtrlBase* combo,
+                                                wxDC& dc,
+                                                const wxRect& rect ),
+        "Default PaintComboControl behaviour", "");
+
+
+    DocDeclStr(
+        wxPyComboCtrl* , GetCombo(),
+        "Returns a reference to the `wx.combo.ComboCtrl` this ComboPopup object
+is associated with.", "");
 
 };
 
@@ -657,7 +895,18 @@ IMP_PYCALLBACK__DCRECTINTINT_const(wxPyOwnerDrawnComboBox, wxOwnerDrawnComboBox,
 
 
 
-// Now declare wxPyComboCtrl for Python
+// Now declare wxPyOwnerDrawnComboBox for Python
+
+DocStr(wxPyOwnerDrawnComboBox,
+"wx.combo.OwnerDrawnComboBox is a combobox with owner-drawn list
+items. In essence, it is a `wx.combo.ComboCtrl` with a `wx.VListBox`
+popup and a `wx.ControlWithItems` API.
+
+Implementing item drawing and measuring is similar to wx.VListBox.
+The application needs to subclass wx.combo.OwnerDrawnComboBox and
+implement the `OnDrawItem`, `OnMeasureItem` and `OnMeasureItemWidth`
+methods.", "");
+
 MustHaveApp(wxPyOwnerDrawnComboBox);
 %rename(OwnerDrawnComboBox) wxPyOwnerDrawnComboBox;
 
@@ -668,39 +917,216 @@ public:
     %pythonAppend wxPyOwnerDrawnComboBox      "self._setOORInfo(self);" setCallbackInfo(OwnerDrawnComboBox)
     %pythonAppend wxPyOwnerDrawnComboBox()    "";
 
-    wxPyOwnerDrawnComboBox(wxWindow *parent,
-                           wxWindowID id = -1,
-                           const wxString& value = wxPyEmptyString,
-                           const wxPoint& pos = wxDefaultPosition,
-                           const wxSize& size = wxDefaultSize,
-                           const wxArrayString& choices = wxPyEmptyStringArray,
-                           long style = 0,
-                           const wxValidator& validator = wxDefaultValidator,
-                           const wxString& name = wxPyComboBoxNameStr);
+    DocCtorStr(
+        wxPyOwnerDrawnComboBox(wxWindow *parent,
+                               wxWindowID id = -1,
+                               const wxString& value = wxPyEmptyString,
+                               const wxPoint& pos = wxDefaultPosition,
+                               const wxSize& size = wxDefaultSize,
+                               const wxArrayString& choices = wxPyEmptyStringArray,
+                               long style = 0,
+                               const wxValidator& validator = wxDefaultValidator,
+                               const wxString& name = wxPyComboBoxNameStr),
+        "Standard constructor.", "");
+
+    DocCtorStrName(wxPyOwnerDrawnComboBox(),
+                   "2-phase create constructor.", "",
+                   PreOwnerDrawnComboBox);
 
-    %RenameCtor(PreOwnerDrawnComboBox, wxPyOwnerDrawnComboBox());
+    void _setCallbackInfo(PyObject* self, PyObject* _class);
 
+    
+    DocDeclStr(        
+        bool , Create(wxWindow *parent,
+                      wxWindowID id = -1,
+                      const wxString& value = wxPyEmptyString,
+                      const wxPoint& pos = wxDefaultPosition,
+                      const wxSize& size = wxDefaultSize,
+                      const wxArrayString& choices = wxPyEmptyStringArray,
+                      long style = 0,
+                      const wxValidator& validator = wxDefaultValidator,
+                      const wxString& name = wxPyComboBoxNameStr),
+        "Create the UI object, and other initialization.", "");
+    
+
+    DocDeclStr(
+        virtual int , GetWidestItemWidth(),
+        "Return the widest item width (recalculating it if necessary.)", "");
+    
+
+    DocDeclStr(
+        virtual int , GetWidestItem(),
+        "Return the index of the widest item (recalculating it if necessary.)", "");
+    
 
-    bool Create(wxWindow *parent,
-                wxWindowID id = -1,
-                const wxString& value = wxPyEmptyString,
-                const wxPoint& pos = wxDefaultPosition,
-                const wxSize& size = wxDefaultSize,
-                const wxArrayString& choices = wxPyEmptyStringArray,
-                long style = 0,
-                const wxValidator& validator = wxDefaultValidator,
-                const wxString& name = wxPyComboBoxNameStr);
+    void SetSelection(int n);
+    %Rename(SetMark, void , SetSelection(long from, long to));
 
-    // Return the widest item width (recalculating it if necessary)
-    virtual int GetWidestItemWidth();
 
-    // Return the index of the widest item (recalculating it if necessary)
-    virtual int GetWidestItem();
+    // Callback for drawing. Font, background and text colour have been
+    // prepared according to selection, focus and such.
+    // item: item index to be drawn, may be wxNOT_FOUND when painting combo control itself
+    //       and there is no valid selection
+    // flags: wxODCB_PAINTING_CONTROL is set if painting to combo control instead of list
+    DocDeclStr(
+        virtual void , OnDrawItem( wxDC& dc, const wxRect& rect, int item, int flags ) const,
+        "The derived class may implement this function to actually draw the
+item with the given index on the provided DC. If this method is not
+overridden, the item text is simply drawn as if the control was a
+normal combobox.
+
+   :param dc:    The device context to use for drawing.
+   :param rect:  The bounding rectangle for the item being drawn, the
+                 DC's clipping region is set to this rectangle before
+                 calling this method.
+   :param item:  The index of the item to be drawn.
+
+   :param flags: ``wx.combo.ODCB_PAINTING_CONTROL`` (The Combo control itself
+                  is being painted, instead of a list item.  The ``item``
+                  parameter may be ``wx.NOT_FOUND`` in this case.
+                  ``wx.combo.ODCB_PAINTING_SELECTED``  (An item with
+                  selection background is being painted. The DC's text colour
+                  should already be correct.
+", "");
+    
+
+    DocDeclStr(
+        virtual wxCoord , OnMeasureItem( size_t item ) const,
+        "The derived class may implement this method to return the height of
+the specified item (in pixels).  The default implementation returns
+text height, as if this control was a normal combobox.", "");
+    
+
+    DocDeclStr(
+        virtual wxCoord , OnMeasureItemWidth( size_t item ) const,
+        "The derived class may implement this method to return the width of the
+specified item (in pixels). If -1 is returned, then the item text
+width is used.  The default implementation returns -1.", "");
+    
+
+    DocDeclStr(
+        virtual void , OnDrawBackground( wxDC& dc, const wxRect& rect, int item, int flags ) const,
+        "This method is used to draw the items background and, maybe, a border
+around it.
+
+The base class version implements a reasonable default behaviour which
+consists in drawing the selected item with the standard background
+colour and drawing a border around the item if it is either selected
+or current.  ``flags`` has the sam meaning as with `OnDrawItem`.", "");
+    
 
-    void SetSelection(int n);
-    %Rename(SetMark, void , SetSelection(long from, long to));
 };
 
+//---------------------------------------------------------------------------
+
+%{
+#include <wx/bmpcbox.h>
+%}
+
+DocStr(wxBitmapComboBox,
+       "A combobox that displays a bitmap in front of the list items. It
+currently only allows using bitmaps of one size, and resizes itself so
+that a bitmap can be shown next to the text field.",
+"
+
+Window Styles
+-------------
+    ===================    ============================================
+    wx.CB_READONLY         Creates a combobox without a text editor. On
+                           some platforms the control may appear very
+                           different when this style is used. 
+    wx.CB_SORT             Sorts the entries in the list alphabetically. 
+    wx.TE_PROCESS_ENTER    The control will generate the event
+                           wx.EVT__TEXT_ENTER (otherwise pressing Enter
+                           key is either processed internally by the
+                           control or used for navigation between dialog
+                           controls).
+    ===================    ============================================
+");
+
+MustHaveApp(wxBitmapComboBox);
+
+class wxBitmapComboBox : public wxPyOwnerDrawnComboBox
+{
+public:
+    %pythonAppend wxBitmapComboBox      "self._setOORInfo(self);";
+    %pythonAppend wxBitmapComboBox()    "";
+
+    DocCtorStr(
+        wxBitmapComboBox(wxWindow *parent,
+                         wxWindowID id = -1,
+                         const wxString& value = wxPyEmptyString,
+                         const wxPoint& pos = wxDefaultPosition,
+                         const wxSize& size = wxDefaultSize,
+                         const wxArrayString& choices = wxPyEmptyStringArray,
+                         long style = 0,
+                         const wxValidator& validator = wxDefaultValidator,
+                         const wxString& name = wxBitmapComboBoxNameStr),
+        "Standard constructor", "");
+
+    DocCtorStrName(wxBitmapComboBox(),
+                   "2-phase create constructor.", "",
+                   PreBitmapComboBox);
+
+    DocDeclStr(
+        bool , Create(wxWindow *parent,
+                      wxWindowID id = -1,
+                      const wxString& value = wxPyEmptyString,
+                      const wxPoint& pos = wxDefaultPosition,
+                      const wxSize& size = wxDefaultSize,
+                      const wxArrayString& choices = wxPyEmptyStringArray,
+                      long style = 0,
+                      const wxValidator& validator = wxDefaultValidator,
+                      const wxString& name = wxBitmapComboBoxNameStr),
+        "Create the UI object, and other initialization.", "");
+    
+
+
+    %extend {
+        DocStr(Append,
+               "Adds the item to the control, associating the given data with the item
+if not None.  The return value is the index of the newly added item.", "");
+        int Append(const wxString& item, const wxBitmap& bitmap = wxNullBitmap, PyObject* clientData=NULL) {
+            if (clientData) {
+                wxPyClientData* data = new wxPyClientData(clientData);
+                return self->Append(item, bitmap, data);
+            } else
+                return self->Append(item, bitmap);
+        }
+    }
+    
+    
+    DocDeclStr(
+        virtual wxBitmap , GetItemBitmap(/*unsigned*/ int n) const,
+        "Returns the image of the item with the given index.", "");
+
+    
+    %extend {
+        DocStr(Insert,
+               "Insert an item into the control before the item at the ``pos`` index,
+optionally associating some data object with the item.", "");
+        int Insert(const wxString& item, const wxBitmap& bitmap,
+                   /*unsigned*/ int pos, PyObject* clientData=NULL) {
+            if (clientData) {
+                wxPyClientData* data = new wxPyClientData(clientData);
+                return self->Insert(item, bitmap, pos, data);
+            } else
+                return self->Insert(item, bitmap, pos);
+        }
+    }
+
+    
+    DocDeclStr(
+        virtual void , SetItemBitmap(/*unsigned*/ int n, const wxBitmap& bitmap),
+        "Sets the image for the given item.", "");
+    
+
+    DocDeclStr(
+        virtual wxSize , GetBitmapSize() const,
+        "Returns size of the image used in list.", "");
+    
+
+};
 
 //---------------------------------------------------------------------------
 
@@ -708,6 +1134,7 @@ public:
     // Map renamed classes back to their common name for OOR
     wxPyPtrTypeMap_Add("wxComboCtrl", "wxPyComboCtrl");
     wxPyPtrTypeMap_Add("wxComboPopup", "wxPyComboPopup");
+    wxPyPtrTypeMap_Add("wxOwnerDrawnComboBox", "wxPyOwnerDrawnComboBox");
 %}
 //---------------------------------------------------------------------------