-// this macro must (unfortunately) be used in any class deriving from both
-// wxItemContainer and wxControl because otherwise there is ambiguity when
-// calling GetClientXXX() functions -- the compiler can't choose between the
-// two versions
-#define wxCONTROL_ITEMCONTAINER_CLIENTDATAOBJECT_RECAST \
- void SetClientData(void *data) \
- { wxEvtHandler::SetClientData(data); } \
- void *GetClientData() const \
- { return wxEvtHandler::GetClientData(); } \
- void SetClientObject(wxClientData *data) \
- { wxEvtHandler::SetClientObject(data); } \
- wxClientData *GetClientObject() const \
- { return wxEvtHandler::GetClientObject(); } \
- void SetClientData(unsigned int n, void* clientData) \
- { wxItemContainer::SetClientData(n, clientData); } \
- void* GetClientData(unsigned int n) const \
- { return wxItemContainer::GetClientData(n); } \
- void SetClientObject(unsigned int n, wxClientData* clientData) \
- { wxItemContainer::SetClientObject(n, clientData); } \
- wxClientData* GetClientObject(unsigned int n) const \
+// Inheriting directly from a wxWindow-derived class and wxItemContainer
+// unfortunately introduces an ambiguity for all GetClientXXX() methods as they
+// are inherited twice: the "global" versions from wxWindow and the per-item
+// versions taking the index from wxItemContainer.
+//
+// So we need to explicitly resolve them and this helper template class is
+// provided to do it. To use it, simply inherit from wxWindowWithItems<Window,
+// Container> instead of Window and Container interface directly.
+template <class W, class C>
+class wxWindowWithItems : public W, public C
+{
+public:
+ typedef W BaseWindowClass;
+ typedef C BaseContainerInterface;
+
+ wxWindowWithItems() { }
+
+ void SetClientData(void *data)
+ { BaseWindowClass::SetClientData(data); }
+ void *GetClientData() const
+ { return BaseWindowClass::GetClientData(); }
+ void SetClientObject(wxClientData *data)
+ { BaseWindowClass::SetClientObject(data); }
+ wxClientData *GetClientObject() const
+ { return BaseWindowClass::GetClientObject(); }
+
+ void SetClientData(unsigned int n, void* clientData)
+ { wxItemContainer::SetClientData(n, clientData); }
+ void* GetClientData(unsigned int n) const
+ { return wxItemContainer::GetClientData(n); }
+ void SetClientObject(unsigned int n, wxClientData* clientData)
+ { wxItemContainer::SetClientObject(n, clientData); }
+ wxClientData* GetClientObject(unsigned int n) const