The old email address is invalid since many years and shouldn't be used any longer. No real changes.
		
			
				
	
	
		
			123 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			123 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| ///////////////////////////////////////////////////////////////////////////////
 | |
| // Name:        wx/generic/ctrlsub.h
 | |
| // Purpose:     common functionality of wxItemContainer-derived controls
 | |
| // Author:      Vadim Zeitlin
 | |
| // Created:     2007-07-25
 | |
| // Copyright:   (c) 2007 Vadim Zeitlin <vadim@wxwidgets.org>
 | |
| // Licence:     wxWindows licence
 | |
| ///////////////////////////////////////////////////////////////////////////////
 | |
| 
 | |
| #ifndef _WX_GENERIC_CTRLSUB_H_
 | |
| #define _WX_GENERIC_CTRLSUB_H_
 | |
| 
 | |
| #include "wx/dynarray.h"
 | |
| 
 | |
| // ----------------------------------------------------------------------------
 | |
| // wxControlWithItemsGeneric: generic implementation of item client data
 | |
| // ----------------------------------------------------------------------------
 | |
| 
 | |
| class wxControlWithItemsGeneric : public wxControlWithItemsBase
 | |
| {
 | |
| public:
 | |
|     wxControlWithItemsGeneric() { }
 | |
| 
 | |
|     virtual void DoInitItemClientData()
 | |
|     {
 | |
|         m_itemsClientData.resize(GetCount(), NULL);
 | |
|     }
 | |
| 
 | |
|     virtual void DoSetItemClientData(unsigned int n, void *clientData)
 | |
|     {
 | |
|         m_itemsClientData[n] = clientData;
 | |
|     }
 | |
| 
 | |
|     virtual void *DoGetItemClientData(unsigned int n) const
 | |
|     {
 | |
|         return m_itemsClientData[n];
 | |
|     }
 | |
| 
 | |
|     virtual void DoClear() { m_itemsClientData.clear(); }
 | |
|     virtual void DoDeleteOneItem(unsigned int pos)
 | |
|     {
 | |
|         if ( HasClientData() )
 | |
|             m_itemsClientData.RemoveAt(pos);
 | |
|     }
 | |
| 
 | |
| protected:
 | |
|     // preallocate memory for numItems new items: this should be called from
 | |
|     // the derived classes DoInsertItems() to speed up appending big numbers of
 | |
|     // items with client data; it is safe to call even if we don't use client
 | |
|     // data at all and does nothing in this case
 | |
|     void AllocClientData(unsigned int numItems)
 | |
|     {
 | |
|         if ( HasClientData() )
 | |
|             m_itemsClientData.reserve(m_itemsClientData.size() + numItems);
 | |
|     }
 | |
| 
 | |
|     // this must be called by derived classes when a new item is added to the
 | |
|     // control to add storage for the corresponding client data pointer (before
 | |
|     // inserting many items, call AllocClientData())
 | |
|     void InsertNewItemClientData(unsigned int pos,
 | |
|                                  void **clientData,
 | |
|                                  unsigned int n,
 | |
|                                  wxClientDataType type)
 | |
|     {
 | |
|         if ( InitClientDataIfNeeded(type) )
 | |
|             m_itemsClientData.Insert(clientData[n], pos);
 | |
|     }
 | |
| 
 | |
|     // the same as InsertNewItemClientData() but for numItems consecutive items
 | |
|     // (this can only be used if the control doesn't support sorting as
 | |
|     // otherwise the items positions wouldn't be consecutive any more)
 | |
|     void InsertNewItemsClientData(unsigned int pos,
 | |
|                                   unsigned int numItems,
 | |
|                                   void **clientData,
 | |
|                                   wxClientDataType type)
 | |
|     {
 | |
|         if ( InitClientDataIfNeeded(type) )
 | |
|         {
 | |
|             // it's more efficient to insert everything at once and then update
 | |
|             // for big number of items to avoid moving the array contents
 | |
|             // around (which would result in O(N^2) algorithm)
 | |
|             m_itemsClientData.Insert(NULL, pos, numItems);
 | |
| 
 | |
|             for ( unsigned int n = 0; n < numItems; ++n, ++pos )
 | |
|                 m_itemsClientData[pos] = clientData[n];
 | |
|         }
 | |
|     }
 | |
| 
 | |
| 
 | |
|     // vector containing the client data pointers: it is either empty (if
 | |
|     // client data is not used) or has the same number of elements as the
 | |
|     // control
 | |
|     wxArrayPtrVoid m_itemsClientData;
 | |
| 
 | |
| private:
 | |
|     // initialize client data if needed, return false if we don't have any
 | |
|     // client data and true otherwise
 | |
|     bool InitClientDataIfNeeded(wxClientDataType type)
 | |
|     {
 | |
|         if ( !HasClientData() )
 | |
|         {
 | |
|             if ( type == wxClientData_None )
 | |
|             {
 | |
|                 // we didn't have the client data before and are not asked to
 | |
|                 // store it now neither
 | |
|                 return false;
 | |
|             }
 | |
| 
 | |
|             // this is the first time client data is used with this control
 | |
|             DoInitItemClientData();
 | |
|             SetClientDataType(type);
 | |
|         }
 | |
|         //else: we already have client data
 | |
| 
 | |
|         return true;
 | |
|     }
 | |
| 
 | |
|     wxDECLARE_NO_COPY_CLASS(wxControlWithItemsGeneric);
 | |
| };
 | |
| 
 | |
| #endif // _WX_GENERIC_CTRLSUB_H_
 | |
| 
 |