1 ///////////////////////////////////////////////////////////////////////////// 2 // Name: wx/ctrlsub.h (read: "wxConTRoL with SUBitems") 3 // Purpose: wxControlWithItems interface 4 // Author: Vadim Zeitlin 5 // Modified by: 6 // Created: 22.10.99 7 // RCS-ID: $Id: ctrlsub.h 42816 2006-10-31 08:50:17Z RD $ 8 // Copyright: (c) wxWidgets team 9 // Licence: wxWindows licence 10 ///////////////////////////////////////////////////////////////////////////// 11 12 #ifndef _WX_CTRLSUB_H_BASE_ 13 #define _WX_CTRLSUB_H_BASE_ 14 15 #include "wx/defs.h" 16 17 #if wxUSE_CONTROLS 18 19 #include "wx/control.h" // base class 20 21 // ---------------------------------------------------------------------------- 22 // wxItemContainer defines an interface which is implemented by all controls 23 // which have string subitems each of which may be selected. 24 // 25 // It is decomposed in wxItemContainerImmutable which omits all methods 26 // adding/removing items and is used by wxRadioBox and wxItemContainer itself. 27 // 28 // Examples: wxListBox, wxCheckListBox, wxChoice and wxComboBox (which 29 // implements an extended interface deriving from this one) 30 // ---------------------------------------------------------------------------- 31 32 class WXDLLEXPORT wxItemContainerImmutable 33 { 34 public: wxItemContainerImmutable()35 wxItemContainerImmutable() { } 36 virtual ~wxItemContainerImmutable(); 37 38 // accessing strings 39 // ----------------- 40 41 virtual unsigned int GetCount() const = 0; IsEmpty()42 bool IsEmpty() const { return GetCount() == 0; } 43 44 virtual wxString GetString(unsigned int n) const = 0; 45 wxArrayString GetStrings() const; 46 virtual void SetString(unsigned int n, const wxString& s) = 0; 47 48 // finding string natively is either case sensitive or insensitive 49 // but never both so fall back to this base version for not 50 // supported search type 51 virtual int FindString(const wxString& s, bool bCase = false) const 52 { 53 unsigned int count = GetCount(); 54 55 for ( unsigned int i = 0; i < count ; ++i ) 56 { 57 if (GetString(i).IsSameAs( s , bCase )) 58 return (int)i; 59 } 60 61 return wxNOT_FOUND; 62 } 63 64 65 // selection 66 // --------- 67 68 virtual void SetSelection(int n) = 0; 69 virtual int GetSelection() const = 0; 70 71 // set selection to the specified string, return false if not found 72 bool SetStringSelection(const wxString& s); 73 74 // return the selected string or empty string if none 75 wxString GetStringSelection() const; 76 77 // this is the same as SetSelection( for single-selection controls but 78 // reads better for multi-selection ones Select(int n)79 void Select(int n) { SetSelection(n); } 80 81 82 protected: 83 84 // check that the index is valid IsValid(unsigned int n)85 inline bool IsValid(unsigned int n) const { return n < GetCount(); } IsValidInsert(unsigned int n)86 inline bool IsValidInsert(unsigned int n) const { return n <= GetCount(); } 87 }; 88 89 class WXDLLEXPORT wxItemContainer : public wxItemContainerImmutable 90 { 91 public: wxItemContainer()92 wxItemContainer() { m_clientDataItemsType = wxClientData_None; } 93 virtual ~wxItemContainer(); 94 95 // adding items 96 // ------------ 97 Append(const wxString & item)98 int Append(const wxString& item) 99 { return DoAppend(item); } Append(const wxString & item,void * clientData)100 int Append(const wxString& item, void *clientData) 101 { int n = DoAppend(item); SetClientData(n, clientData); return n; } Append(const wxString & item,wxClientData * clientData)102 int Append(const wxString& item, wxClientData *clientData) 103 { int n = DoAppend(item); SetClientObject(n, clientData); return n; } 104 105 // only for rtti needs (separate name) AppendString(const wxString & item)106 void AppendString( const wxString& item) 107 { Append( item ); } 108 109 // append several items at once to the control 110 void Append(const wxArrayString& strings); 111 Insert(const wxString & item,unsigned int pos)112 int Insert(const wxString& item, unsigned int pos) 113 { return DoInsert(item, pos); } 114 int Insert(const wxString& item, unsigned int pos, void *clientData); 115 int Insert(const wxString& item, unsigned int pos, wxClientData *clientData); 116 117 // deleting items 118 // -------------- 119 120 virtual void Clear() = 0; 121 virtual void Delete(unsigned int n) = 0; 122 123 // misc 124 // ---- 125 126 // client data stuff 127 void SetClientData(unsigned int n, void* clientData); 128 void* GetClientData(unsigned int n) const; 129 130 void SetClientObject(unsigned int n, wxClientData* clientData); 131 wxClientData* GetClientObject(unsigned int n) const; 132 HasClientObjectData()133 bool HasClientObjectData() const 134 { return m_clientDataItemsType == wxClientData_Object; } HasClientUntypedData()135 bool HasClientUntypedData() const 136 { return m_clientDataItemsType == wxClientData_Void; } 137 138 protected: 139 virtual int DoAppend(const wxString& item) = 0; 140 virtual int DoInsert(const wxString& item, unsigned int pos) = 0; 141 142 virtual void DoSetItemClientData(unsigned int n, void* clientData) = 0; 143 virtual void* DoGetItemClientData(unsigned int n) const = 0; 144 virtual void DoSetItemClientObject(unsigned int n, wxClientData* clientData) = 0; 145 virtual wxClientData* DoGetItemClientObject(unsigned int n) const = 0; 146 147 148 // the type of the client data for the items 149 wxClientDataType m_clientDataItemsType; 150 }; 151 152 // this macro must (unfortunately) be used in any class deriving from both 153 // wxItemContainer and wxControl because otherwise there is ambiguity when 154 // calling GetClientXXX() functions -- the compiler can't choose between the 155 // two versions 156 #define wxCONTROL_ITEMCONTAINER_CLIENTDATAOBJECT_RECAST \ 157 void SetClientData(void *data) \ 158 { wxEvtHandler::SetClientData(data); } \ 159 void *GetClientData() const \ 160 { return wxEvtHandler::GetClientData(); } \ 161 void SetClientObject(wxClientData *data) \ 162 { wxEvtHandler::SetClientObject(data); } \ 163 wxClientData *GetClientObject() const \ 164 { return wxEvtHandler::GetClientObject(); } \ 165 void SetClientData(unsigned int n, void* clientData) \ 166 { wxItemContainer::SetClientData(n, clientData); } \ 167 void* GetClientData(unsigned int n) const \ 168 { return wxItemContainer::GetClientData(n); } \ 169 void SetClientObject(unsigned int n, wxClientData* clientData) \ 170 { wxItemContainer::SetClientObject(n, clientData); } \ 171 wxClientData* GetClientObject(unsigned int n) const \ 172 { return wxItemContainer::GetClientObject(n); } 173 174 class WXDLLEXPORT wxControlWithItems : public wxControl, public wxItemContainer 175 { 176 public: wxControlWithItems()177 wxControlWithItems() { } 178 virtual ~wxControlWithItems(); 179 180 // we have to redefine these functions here to avoid ambiguities in classes 181 // deriving from us which would arise otherwise because both base classses 182 // have the methods with the same names - hopefully, a smart compiler can 183 // optimize away these simple inline wrappers so we don't suffer much from 184 // this 185 wxCONTROL_ITEMCONTAINER_CLIENTDATAOBJECT_RECAST 186 187 // usually the controls like list/combo boxes have their own background 188 // colour ShouldInheritColours()189 virtual bool ShouldInheritColours() const { return false; } 190 191 protected: 192 // fill in the client object or data field of the event as appropriate 193 // 194 // calls InitCommandEvent() and, if n != wxNOT_FOUND, also sets the per 195 // item client data 196 void InitCommandEventWithItems(wxCommandEvent& event, int n); 197 198 private: 199 DECLARE_ABSTRACT_CLASS(wxControlWithItems) 200 DECLARE_NO_COPY_CLASS(wxControlWithItems) 201 }; 202 203 204 // ---------------------------------------------------------------------------- 205 // inline functions 206 // ---------------------------------------------------------------------------- 207 208 #endif // wxUSE_CONTROLS 209 210 #endif // _WX_CTRLSUB_H_BASE_ 211