X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a57d600f1aa4bae88f4c9b8d89a35332c412939e..235a997f9aea9d80774e296d314682e99e0c46f1:/include/wx/odcombo.h diff --git a/include/wx/odcombo.h b/include/wx/odcombo.h index 832778c237..26415e8d24 100644 --- a/include/wx/odcombo.h +++ b/include/wx/odcombo.h @@ -19,6 +19,7 @@ #include "wx/combo.h" #include "wx/ctrlsub.h" #include "wx/vlbox.h" +#include "wx/timer.h" // @@ -37,13 +38,20 @@ enum // -// Callback flags +// Callback flags (see wxOwnerDrawnComboBox::OnDrawItem) // -enum +enum wxOwnerDrawnComboBoxPaintingFlags { // when set, we are painting the selected item in control, // not in the popup - wxCP_PAINTING_CONTROL = 0x0001 + wxODCB_PAINTING_CONTROL = 0x0001, + + + // when set, we are painting an item which should have + // focus rectangle painted in the background. Text colour + // and clipping region are then appropriately set in + // the default OnDrawBackground implementation. + wxODCB_PAINTING_SELECTED = 0x0002 }; @@ -72,6 +80,7 @@ public: // required virtuals virtual void Init(); virtual bool Create(wxWindow* parent); + virtual void SetFocus(); virtual wxWindow *GetControl() { return this; } virtual void SetStringValue( const wxString& value ); virtual wxString GetStringValue() const; @@ -81,19 +90,10 @@ public: virtual wxSize GetAdjustedSize( int minWidth, int prefHeight, int maxHeight ); virtual void PaintComboControl( wxDC& dc, const wxRect& rect ); virtual void OnComboKeyEvent( wxKeyEvent& event ); + virtual void OnComboCharEvent( wxKeyEvent& event ); virtual void OnComboDoubleClick(); virtual bool LazyCreate(); - - // Callbacks for drawing and measuring items. Override in a derived class for - // owner-drawnness. - // item: item index to be drawn, may be wxNOT_FOUND when painting combo control itself - // and there is no valid selection - // flags: wxCP_PAINTING_CONTROL is set if painting to combo control instead of list - virtual void OnDrawItem( wxDC& dc, const wxRect& rect, int item, int flags ) const; - - // Return item width, or -1 for calculating from text extent (default) - virtual wxCoord OnMeasureItemWidth( size_t item ) const; - + virtual bool FindItem(const wxString& item, wxString* trueItem); // Item management void SetSelection( int item ); @@ -106,7 +106,7 @@ public: void SetString( int item, const wxString& str ); wxString GetString( int item ) const; unsigned int GetCount() const; - int FindString(const wxString& s) const; + int FindString(const wxString& s, bool bCase = false) const; int GetSelection() const; //void Populate( int n, const wxString choices[] ); @@ -116,57 +116,112 @@ public: // helpers int GetItemAtPosition( const wxPoint& pos ) { return HitTest(pos); } wxCoord GetTotalHeight() const { return EstimateTotalHeight(); } - wxCoord GetLineHeight(int line) const { return OnGetLineHeight(line); } + wxCoord GetLineHeight(int line) const { return OnGetRowHeight(line); } protected: - // Called by OnComboDoubleClick and OnComboKeyEvent - bool HandleKey( int keycode, bool saturate ); + // Called by OnComboDoubleClick and OnCombo{Key,Char}Event + bool HandleKey( int keycode, bool saturate, wxChar keychar = 0 ); // sends combobox select event from the parent combo control void SendComboBoxEvent( int selection ); - + // gets value, sends event and dismisses void DismissWithEvent(); - // Re-calculates width for given item - void CheckWidth( int pos ); + // OnMeasureItemWidth will be called on next GetAdjustedSize. + void ItemWidthChanged(unsigned int item) + { + m_widths[item] = -1; + m_widthsDirty = true; + } - // wxVListBox implementation - virtual void OnDrawItem(wxDC& dc, const wxRect& rect, size_t n) const; - //virtual wxCoord OnMeasureItem(size_t n) const; - void OnDrawBackground(wxDC& dc, const wxRect& rect, size_t n) const; + // Callbacks for drawing and measuring items. Override in a derived class for + // owner-drawnness. 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 + // + // NOTE: If wxVListBoxComboPopup is used with a wxComboCtrl class not derived from + // wxOwnerDrawnComboBox, this method must be overridden. + virtual void OnDrawItem( wxDC& dc, const wxRect& rect, int item, int flags) const; - // Return item height + // This is same as in wxVListBox virtual wxCoord OnMeasureItem( size_t item ) const; + // Return item width, or -1 for calculating from text extent (default) + virtual wxCoord OnMeasureItemWidth( size_t item ) const; + + // Draw item and combo control background. Flags are same as with OnDrawItem. + // NB: Can't use name OnDrawBackground because of virtual function hiding warnings. + virtual void OnDrawBg(wxDC& dc, const wxRect& rect, int item, int flags) const; + + // Additional wxVListBox implementation (no need to override in derived classes) + virtual void OnDrawItem(wxDC& dc, const wxRect& rect, size_t n) const; + void OnDrawBackground(wxDC& dc, const wxRect& rect, size_t n) const; + // filter mouse move events happening outside the list box // move selection with cursor void OnMouseMove(wxMouseEvent& event); - void OnMouseWheel(wxMouseEvent& event); void OnKey(wxKeyEvent& event); + void OnChar(wxKeyEvent& event); void OnLeftClick(wxMouseEvent& event); + // Return the widest item width (recalculating it if necessary) + int GetWidestItemWidth() { CalcWidths(); return m_widestWidth; } + + // Return the index of the widest item (recalculating it if necessary) + int GetWidestItem() { CalcWidths(); return m_widestItem; } + + // Stop partial completion (when some other event occurs) + void StopPartialCompletion(); + wxArrayString m_strings; wxArrayPtrVoid m_clientDatas; - wxArrayInt m_widths; // cached line widths wxFont m_useFont; //wxString m_stringValue; // displayed text (may be different than m_strings[m_value]) int m_value; // selection int m_itemHover; // on which item the cursor is - int m_widestWidth; // width of widest item thus far - int m_avgCharWidth; - int m_baseImageWidth; // how much per item drawn in addition to text int m_itemHeight; // default item height (calculate from font size // and used in the absence of callback) wxClientDataType m_clientDataItemsType; private: + // Cached item widths (in pixels). + wxArrayInt m_widths; + + // Width of currently widest item. + int m_widestWidth; + + // Index of currently widest item. + int m_widestItem; + + // Measure some items in next GetAdjustedSize? + bool m_widthsDirty; + + // Find widest item in next GetAdjustedSize? + bool m_findWidest; + // has the mouse been released on this control? - bool m_clicked; + bool m_clicked; + + // Recalculate widths if they are dirty + void CalcWidths(); + + // Partial completion string + wxString m_partialCompletionString; + + wxString m_stringValue; + +#if wxUSE_TIMER + // Partial completion timer + wxTimer m_partialCompletionTimer; +#endif // wxUSE_TIMER DECLARE_EVENT_TABLE() }; @@ -178,15 +233,15 @@ private: // the wxComboCtrl. // ---------------------------------------------------------------------------- -class WXDLLIMPEXP_ADV wxOwnerDrawnComboBox : public wxComboCtrl, - public wxItemContainer +class WXDLLIMPEXP_ADV wxOwnerDrawnComboBox : + public wxWindowWithItems { - friend class wxComboPopupWindow; - friend class wxComboCtrlBase; + //friend class wxComboPopupWindow; + friend class wxVListBoxComboPopup; public: // ctors and such - wxOwnerDrawnComboBox() : wxComboCtrl() { Init(); } + wxOwnerDrawnComboBox() { Init(); } wxOwnerDrawnComboBox(wxWindow *parent, wxWindowID id, @@ -198,7 +253,6 @@ public: long style = 0, const wxValidator& validator = wxDefaultValidator, const wxString& name = wxComboBoxNameStr) - : wxComboCtrl() { Init(); @@ -208,7 +262,7 @@ public: bool Create(wxWindow *parent, wxWindowID id, - const wxString& value, + const wxString& value = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = 0, @@ -217,21 +271,21 @@ public: wxOwnerDrawnComboBox(wxWindow *parent, wxWindowID id, - const wxString& value, - const wxPoint& pos, - const wxSize& size, - const wxArrayString& choices, + const wxString& value = wxEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + const wxArrayString& choices = wxArrayString(), long style = 0, const wxValidator& validator = wxDefaultValidator, const wxString& name = wxComboBoxNameStr); bool Create(wxWindow *parent, wxWindowID id, - const wxString& value = wxEmptyString, - const wxPoint& pos = wxDefaultPosition, - const wxSize& size = wxDefaultSize, - int n = 0, - const wxString choices[] = (const wxString *) NULL, + const wxString& value, + const wxPoint& pos, + const wxSize& size, + int n, + const wxString choices[], long style = 0, const wxValidator& validator = wxDefaultValidator, const wxString& name = wxComboBoxNameStr); @@ -248,36 +302,79 @@ public: virtual ~wxOwnerDrawnComboBox(); - // NULL popup can be used to indicate default interface - virtual void SetPopupControl( wxComboPopup* popup ); + // Prevent app from using wxComboPopup + void SetPopupControl(wxVListBoxComboPopup* popup) + { + DoSetPopupControl(popup); + } // wxControlWithItems methods - virtual void Clear(); - virtual void Delete(unsigned int n); virtual unsigned int GetCount() const; virtual wxString GetString(unsigned int n) const; virtual void SetString(unsigned int n, const wxString& s); - virtual int FindString(const wxString& s) const; + virtual int FindString(const wxString& s, bool bCase = false) const; virtual void Select(int n); virtual int GetSelection() const; + + // Override these just to maintain consistency with virtual methods + // between classes. + virtual void Clear(); + virtual void GetSelection(long *from, long *to) const; + virtual void SetSelection(int n) { Select(n); } - wxCONTROL_ITEMCONTAINER_CLIENTDATAOBJECT_RECAST + + // Prevent a method from being hidden + virtual void SetSelection(long from, long to) + { + wxComboCtrl::SetSelection(from,to); + } + + // Return the widest item width (recalculating it if necessary) + virtual int GetWidestItemWidth() { EnsurePopupControl(); return GetVListBoxComboPopup()->GetWidestItemWidth(); } + + // Return the index of the widest item (recalculating it if necessary) + virtual int GetWidestItem() { EnsurePopupControl(); return GetVListBoxComboPopup()->GetWidestItem(); } + + virtual bool IsSorted() const { return HasFlag(wxCB_SORT); } protected: + virtual void DoClear(); + virtual void DoDeleteOneItem(unsigned int n); + + // 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 + virtual void OnDrawItem( wxDC& dc, const wxRect& rect, int item, int flags ) const; + + // Callback for item height, or -1 for default + virtual wxCoord OnMeasureItem( size_t item ) const; + + // Callback for item width, or -1 for default/undetermined + virtual wxCoord OnMeasureItemWidth( size_t item ) const; + + // Callback for background drawing. Flags are same as with + // OnDrawItem. + virtual void OnDrawBackground( wxDC& dc, const wxRect& rect, int item, int flags ) const; + + // NULL popup can be used to indicate default interface + virtual void DoSetPopupControl(wxComboPopup* popup); // clears all allocated client datas void ClearClientDatas(); - virtual int DoAppend(const wxString& item); - virtual int DoInsert(const wxString& item, unsigned int pos); + wxVListBoxComboPopup* GetVListBoxComboPopup() const + { + return (wxVListBoxComboPopup*) m_popupInterface; + } + + virtual int DoInsertItems(const wxArrayStringsAdapter& items, + unsigned int pos, + void **clientData, wxClientDataType type); virtual void DoSetItemClientData(unsigned int n, void* clientData); virtual void* DoGetItemClientData(unsigned int n) const; - virtual void DoSetItemClientObject(unsigned int n, wxClientData* clientData); - virtual wxClientData* DoGetItemClientObject(unsigned int n) const; - - // overload m_popupInterface member so we can access specific popup interface easier - wxVListBoxComboPopup* m_popupInterface; // temporary storage for the initial choices //const wxString* m_baseChoices; @@ -294,5 +391,6 @@ private: #endif // wxUSE_ODCOMBOBOX + #endif // _WX_ODCOMBO_H_