Compare commits
1 Commits
CPPUNIT_1_
...
WXDLLEXPOR
Author | SHA1 | Date | |
---|---|---|---|
|
7b858cfd3d |
@@ -1,80 +0,0 @@
|
|||||||
dnl
|
|
||||||
dnl AM_PATH_CPPUNIT(MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]])
|
|
||||||
dnl
|
|
||||||
AC_DEFUN(AM_PATH_CPPUNIT,
|
|
||||||
[
|
|
||||||
|
|
||||||
AC_ARG_WITH(cppunit-prefix,[ --with-cppunit-prefix=PFX Prefix where CppUnit is installed (optional)],
|
|
||||||
cppunit_config_prefix="$withval", cppunit_config_prefix="")
|
|
||||||
AC_ARG_WITH(cppunit-exec-prefix,[ --with-cppunit-exec-prefix=PFX Exec prefix where CppUnit is installed (optional)],
|
|
||||||
cppunit_config_exec_prefix="$withval", cppunit_config_exec_prefix="")
|
|
||||||
|
|
||||||
if test x$cppunit_config_exec_prefix != x ; then
|
|
||||||
cppunit_config_args="$cppunit_config_args --exec-prefix=$cppunit_config_exec_prefix"
|
|
||||||
if test x${CPPUNIT_CONFIG+set} != xset ; then
|
|
||||||
CPPUNIT_CONFIG=$cppunit_config_exec_prefix/bin/cppunit-config
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
if test x$cppunit_config_prefix != x ; then
|
|
||||||
cppunit_config_args="$cppunit_config_args --prefix=$cppunit_config_prefix"
|
|
||||||
if test x${CPPUNIT_CONFIG+set} != xset ; then
|
|
||||||
CPPUNIT_CONFIG=$cppunit_config_prefix/bin/cppunit-config
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_PATH_PROG(CPPUNIT_CONFIG, cppunit-config, no)
|
|
||||||
cppunit_version_min=$1
|
|
||||||
|
|
||||||
AC_MSG_CHECKING(for Cppunit - version >= $cppunit_version_min)
|
|
||||||
no_cppunit=""
|
|
||||||
if test "$CPPUNIT_CONFIG" = "no" ; then
|
|
||||||
no_cppunit=yes
|
|
||||||
else
|
|
||||||
CPPUNIT_CFLAGS=`$CPPUNIT_CONFIG --cflags`
|
|
||||||
CPPUNIT_LIBS=`$CPPUNIT_CONFIG --libs`
|
|
||||||
cppunit_version=`$CPPUNIT_CONFIG --version`
|
|
||||||
|
|
||||||
cppunit_major_version=`echo $cppunit_version | \
|
|
||||||
sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'`
|
|
||||||
cppunit_minor_version=`echo $cppunit_version | \
|
|
||||||
sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'`
|
|
||||||
cppunit_micro_version=`echo $cppunit_version | \
|
|
||||||
sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'`
|
|
||||||
|
|
||||||
cppunit_major_min=`echo $cppunit_version_min | \
|
|
||||||
sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'`
|
|
||||||
cppunit_minor_min=`echo $cppunit_version_min | \
|
|
||||||
sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'`
|
|
||||||
cppunit_micro_min=`echo $cppunit_version_min | \
|
|
||||||
sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'`
|
|
||||||
|
|
||||||
cppunit_version_proper=`expr \
|
|
||||||
$cppunit_major_version \> $cppunit_major_min \| \
|
|
||||||
$cppunit_major_version \= $cppunit_major_min \& \
|
|
||||||
$cppunit_minor_version \> $cppunit_minor_min \| \
|
|
||||||
$cppunit_major_version \= $cppunit_major_min \& \
|
|
||||||
$cppunit_minor_version \= $cppunit_minor_min \& \
|
|
||||||
$cppunit_micro_version \>= $cppunit_micro_min `
|
|
||||||
|
|
||||||
if test "$cppunit_version_proper" = "1" ; then
|
|
||||||
AC_MSG_RESULT([$cppunit_major_version.$cppunit_minor_version.$cppunit_micro_version])
|
|
||||||
else
|
|
||||||
AC_MSG_RESULT(no)
|
|
||||||
no_cppunit=yes
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "x$no_cppunit" = x ; then
|
|
||||||
ifelse([$2], , :, [$2])
|
|
||||||
else
|
|
||||||
CPPUNIT_CFLAGS=""
|
|
||||||
CPPUNIT_LIBS=""
|
|
||||||
ifelse([$3], , :, [$3])
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_SUBST(CPPUNIT_CFLAGS)
|
|
||||||
AC_SUBST(CPPUNIT_LIBS)
|
|
||||||
])
|
|
||||||
|
|
||||||
|
|
||||||
|
|
443
include/wx/dynarray.h
Normal file
443
include/wx/dynarray.h
Normal file
@@ -0,0 +1,443 @@
|
|||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: dynarray.h
|
||||||
|
// Purpose: auto-resizable (i.e. dynamic) array support
|
||||||
|
// Author: Vadim Zeitlin
|
||||||
|
// Modified by:
|
||||||
|
// Created: 12.09.97
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
|
||||||
|
// Licence: wxWindows license
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifndef _DYNARRAY_H
|
||||||
|
#define _DYNARRAY_H
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma interface "dynarray.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/defs.h"
|
||||||
|
#include "wx/debug.h"
|
||||||
|
|
||||||
|
/** @name Dynamic arrays and object arrays (array which own their elements)
|
||||||
|
@memo Arrays which grow on demand and do range checking (only in debug)
|
||||||
|
*/
|
||||||
|
//@{
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// constants
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
the initial size by which an array grows when an element is added
|
||||||
|
default value avoids allocate one or two bytes when the array is created
|
||||||
|
which is rather inefficient
|
||||||
|
*/
|
||||||
|
#define WX_ARRAY_DEFAULT_INITIAL_SIZE (16)
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// types
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
callback compare function for quick sort
|
||||||
|
must return negative value, 0 or positive value if pItem1 <, = or > pItem2
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef __VISUALC__
|
||||||
|
#define CMPFUNC_CONV _cdecl
|
||||||
|
#else // !Visual C++
|
||||||
|
#define CMPFUNC_CONV
|
||||||
|
#endif // compiler
|
||||||
|
typedef int (CMPFUNC_CONV *CMPFUNC)(const void* pItem1, const void* pItem2);
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
/**
|
||||||
|
base class managing data having size of type 'long' (not used directly)
|
||||||
|
|
||||||
|
NB: for efficiency this often used class has no virtual functions (hence no
|
||||||
|
VTBL), even dtor is <B>not</B> virtual. If used as expected it won't
|
||||||
|
create any problems because ARRAYs from DEFINE_ARRAY have no dtor at all,
|
||||||
|
so it's not too important if it's not called (this happens when you cast
|
||||||
|
"SomeArray *" as "BaseArray *" and then delete it)
|
||||||
|
|
||||||
|
@memo Base class for template array classes
|
||||||
|
*/
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
class WXDLLEXPORT wxBaseArray
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/** @name ctors and dtor */
|
||||||
|
//@{
|
||||||
|
/// default ctor
|
||||||
|
wxBaseArray();
|
||||||
|
/// copy ctor
|
||||||
|
wxBaseArray(const wxBaseArray& array);
|
||||||
|
/// assignment operator
|
||||||
|
wxBaseArray& operator=(const wxBaseArray& src);
|
||||||
|
/// not virtual, see above
|
||||||
|
/// EXCEPT for Gnu compiler to reduce warnings...
|
||||||
|
#ifdef __GNUG__
|
||||||
|
virtual
|
||||||
|
#endif
|
||||||
|
~wxBaseArray();
|
||||||
|
//@}
|
||||||
|
|
||||||
|
/** @name memory management */
|
||||||
|
//@{
|
||||||
|
/// empties the array, but doesn't release memory
|
||||||
|
void Empty() { m_nCount = 0; }
|
||||||
|
/// empties the array and releases memory
|
||||||
|
void Clear();
|
||||||
|
/// preallocates memory for given number of items
|
||||||
|
void Alloc(size_t uiSize);
|
||||||
|
/// minimizes the memory used by the array (frees unused memory)
|
||||||
|
void Shrink();
|
||||||
|
//@}
|
||||||
|
|
||||||
|
/** @name simple accessors */
|
||||||
|
//@{
|
||||||
|
/// number of elements in the array
|
||||||
|
size_t Count() const { return m_nCount; }
|
||||||
|
size_t GetCount() const { return m_nCount; }
|
||||||
|
/// is it empty?
|
||||||
|
bool IsEmpty() const { return m_nCount == 0; }
|
||||||
|
//@}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
// these methods are protected because if they were public one could
|
||||||
|
// mistakenly call one of them instead of DEFINE_ARRAY's or OBJARRAY's
|
||||||
|
// type safe methods
|
||||||
|
|
||||||
|
/** @name items access */
|
||||||
|
//@{
|
||||||
|
/// get item at position uiIndex (range checking is done in debug version)
|
||||||
|
long& Item(size_t uiIndex) const
|
||||||
|
{ wxASSERT( uiIndex < m_nCount ); return m_pItems[uiIndex]; }
|
||||||
|
/// same as Item()
|
||||||
|
long& operator[](size_t uiIndex) const { return Item(uiIndex); }
|
||||||
|
//@}
|
||||||
|
|
||||||
|
/** @name item management */
|
||||||
|
//@{
|
||||||
|
/**
|
||||||
|
Search the element in the array, starting from the either side
|
||||||
|
@param bFromEnd if TRUE, start from the end
|
||||||
|
@return index of the first item matched or wxNOT_FOUND
|
||||||
|
@see wxNOT_FOUND
|
||||||
|
*/
|
||||||
|
int Index(long lItem, bool bFromEnd = FALSE) const;
|
||||||
|
/// search for an item using binary search in a sorted array
|
||||||
|
int Index(long lItem, CMPFUNC fnCompare) const;
|
||||||
|
/// add new element at the end
|
||||||
|
void Add(long lItem);
|
||||||
|
/// add item assuming the array is sorted with fnCompare function
|
||||||
|
void Add(long lItem, CMPFUNC fnCompare);
|
||||||
|
/// add new element at given position (it becomes Item[uiIndex])
|
||||||
|
void Insert(long lItem, size_t uiIndex);
|
||||||
|
/// remove first item matching this value
|
||||||
|
void Remove(long lItem);
|
||||||
|
/// remove item by index
|
||||||
|
void Remove(size_t uiIndex);
|
||||||
|
//@}
|
||||||
|
|
||||||
|
/// sort array elements using given compare function
|
||||||
|
void Sort(CMPFUNC fnCompare);
|
||||||
|
|
||||||
|
private:
|
||||||
|
void Grow(); // makes array bigger if needed
|
||||||
|
|
||||||
|
size_t m_nSize, // current size of the array
|
||||||
|
m_nCount; // current number of elements
|
||||||
|
|
||||||
|
long *m_pItems; // pointer to data
|
||||||
|
};
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// template classes
|
||||||
|
// ============================================================================
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// This macro generates a new array class. It is intended for storage of simple
|
||||||
|
// types of sizeof()<=sizeof(long) or pointers if sizeof(pointer)<=sizeof(long)
|
||||||
|
//
|
||||||
|
// NB: it has only inline functions => takes no space at all
|
||||||
|
// Mod by JACS: Salford C++ doesn't like 'var->operator=' syntax, as in:
|
||||||
|
// { ((wxBaseArray *)this)->operator=((const wxBaseArray&)src);
|
||||||
|
// so using a temporary variable instead.
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
#define _WX_DEFINE_ARRAY(T, name) \
|
||||||
|
typedef int (CMPFUNC_CONV *CMPFUNC##T)(T *pItem1, T *pItem2); \
|
||||||
|
class WXDLLEXPORTLOCAL name : public wxBaseArray \
|
||||||
|
{ \
|
||||||
|
public: \
|
||||||
|
name() \
|
||||||
|
{ wxASSERT( sizeof(T) <= sizeof(long) ); } \
|
||||||
|
\
|
||||||
|
name& operator=(const name& src) \
|
||||||
|
{ wxBaseArray* temp = (wxBaseArray*) this; \
|
||||||
|
(*temp) = ((const wxBaseArray&)src); \
|
||||||
|
return *this; } \
|
||||||
|
\
|
||||||
|
T& operator[](size_t uiIndex) const \
|
||||||
|
{ return (T&)(wxBaseArray::Item(uiIndex)); } \
|
||||||
|
T& Item(size_t uiIndex) const \
|
||||||
|
{ return (T&)(wxBaseArray::Item(uiIndex)); } \
|
||||||
|
T& Last() const \
|
||||||
|
{ return (T&)(wxBaseArray::Item(Count() - 1)); } \
|
||||||
|
\
|
||||||
|
int Index(T Item, bool bFromEnd = FALSE) const \
|
||||||
|
{ return wxBaseArray::Index((long)Item, bFromEnd); } \
|
||||||
|
\
|
||||||
|
void Add(T Item) \
|
||||||
|
{ wxBaseArray::Add((long)Item); } \
|
||||||
|
void Insert(T Item, size_t uiIndex) \
|
||||||
|
{ wxBaseArray::Insert((long)Item, uiIndex) ; } \
|
||||||
|
\
|
||||||
|
void Remove(size_t uiIndex) { wxBaseArray::Remove(uiIndex); } \
|
||||||
|
void Remove(T Item) \
|
||||||
|
{ int iIndex = Index(Item); \
|
||||||
|
wxCHECK2_MSG( iIndex != wxNOT_FOUND, return, \
|
||||||
|
_T("removing inexisting element in wxArray::Remove") ); \
|
||||||
|
wxBaseArray::Remove((size_t)iIndex); } \
|
||||||
|
\
|
||||||
|
void Sort(CMPFUNC##T fCmp) { wxBaseArray::Sort((CMPFUNC)fCmp); } \
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// This is the same as the previous macro, but it defines a sorted array.
|
||||||
|
// Differences:
|
||||||
|
// 1) it must be given a COMPARE function in ctor which takes 2 items of type
|
||||||
|
// T* and should return -1, 0 or +1 if the first one is less/greater
|
||||||
|
// than/equal to the second one.
|
||||||
|
// 2) the Add() method inserts the item in such was that the array is always
|
||||||
|
// sorted (it uses the COMPARE function)
|
||||||
|
// 3) it has no Sort() method because it's always sorted
|
||||||
|
// 4) Index() method is much faster (the sorted arrays use binary search
|
||||||
|
// instead of linear one), but Add() is slower.
|
||||||
|
//
|
||||||
|
// Summary: use this class when the speed of Index() function is important, use
|
||||||
|
// the normal arrays otherwise.
|
||||||
|
//
|
||||||
|
// NB: it has only inline functions => takes no space at all
|
||||||
|
// Mod by JACS: Salford C++ doesn't like 'var->operator=' syntax, as in:
|
||||||
|
// { ((wxBaseArray *)this)->operator=((const wxBaseArray&)src);
|
||||||
|
// so using a temporary variable instead.
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
#define _WX_DEFINE_SORTED_ARRAY(T, name) \
|
||||||
|
typedef int (CMPFUNC_CONV *SCMPFUNC##T)(T pItem1, T pItem2); \
|
||||||
|
class WXDLLEXPORTLOCAL name : public wxBaseArray \
|
||||||
|
{ \
|
||||||
|
public: \
|
||||||
|
name(SCMPFUNC##T fn) \
|
||||||
|
{ wxASSERT( sizeof(T) <= sizeof(long) ); m_fnCompare = fn; } \
|
||||||
|
\
|
||||||
|
name& operator=(const name& src) \
|
||||||
|
{ wxBaseArray* temp = (wxBaseArray*) this; \
|
||||||
|
(*temp) = ((const wxBaseArray&)src); \
|
||||||
|
m_fnCompare = src.m_fnCompare; \
|
||||||
|
return *this; } \
|
||||||
|
\
|
||||||
|
T& operator[](size_t uiIndex) const \
|
||||||
|
{ return (T&)(wxBaseArray::Item(uiIndex)); } \
|
||||||
|
T& Item(size_t uiIndex) const \
|
||||||
|
{ return (T&)(wxBaseArray::Item(uiIndex)); } \
|
||||||
|
T& Last() const \
|
||||||
|
{ return (T&)(wxBaseArray::Item(Count() - 1)); } \
|
||||||
|
\
|
||||||
|
int Index(T Item) const \
|
||||||
|
{ return wxBaseArray::Index((long)Item, (CMPFUNC)m_fnCompare); }\
|
||||||
|
\
|
||||||
|
void Add(T Item) \
|
||||||
|
{ wxBaseArray::Add((long)Item, (CMPFUNC)m_fnCompare); } \
|
||||||
|
\
|
||||||
|
void Remove(size_t uiIndex) { wxBaseArray::Remove(uiIndex); } \
|
||||||
|
void Remove(T Item) \
|
||||||
|
{ int iIndex = Index(Item); \
|
||||||
|
wxCHECK2_MSG( iIndex != wxNOT_FOUND, return, \
|
||||||
|
_T("removing inexisting element in wxArray::Remove") ); \
|
||||||
|
wxBaseArray::Remove((size_t)iIndex); } \
|
||||||
|
\
|
||||||
|
private: \
|
||||||
|
SCMPFUNC##T m_fnCompare; \
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// see WX_DECLARE_OBJARRAY and WX_DEFINE_OBJARRAY
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
#define _WX_DECLARE_OBJARRAY(T, name) \
|
||||||
|
typedef int (CMPFUNC_CONV *CMPFUNC##T)(T** pItem1, T** pItem2); \
|
||||||
|
class WXDLLEXPORTLOCAL name : public wxBaseArray \
|
||||||
|
{ \
|
||||||
|
public: \
|
||||||
|
name() { } \
|
||||||
|
name(const name& src); \
|
||||||
|
name& operator=(const name& src); \
|
||||||
|
\
|
||||||
|
~name(); \
|
||||||
|
\
|
||||||
|
T& operator[](size_t uiIndex) const \
|
||||||
|
{ return *(T*)wxBaseArray::Item(uiIndex); } \
|
||||||
|
T& Item(size_t uiIndex) const \
|
||||||
|
{ return *(T*)wxBaseArray::Item(uiIndex); } \
|
||||||
|
T& Last() const \
|
||||||
|
{ return *(T*)(wxBaseArray::Item(Count() - 1)); } \
|
||||||
|
\
|
||||||
|
int Index(const T& Item, bool bFromEnd = FALSE) const; \
|
||||||
|
\
|
||||||
|
void Add(const T& Item); \
|
||||||
|
void Add(const T* pItem) \
|
||||||
|
{ wxBaseArray::Add((long)pItem); } \
|
||||||
|
\
|
||||||
|
void Insert(const T& Item, size_t uiIndex); \
|
||||||
|
void Insert(const T* pItem, size_t uiIndex) \
|
||||||
|
{ wxBaseArray::Insert((long)pItem, uiIndex); } \
|
||||||
|
\
|
||||||
|
void Empty(); \
|
||||||
|
\
|
||||||
|
T* Detach(size_t uiIndex) \
|
||||||
|
{ T* p = (T*)wxBaseArray::Item(uiIndex); \
|
||||||
|
wxBaseArray::Remove(uiIndex); return p; } \
|
||||||
|
void Remove(size_t uiIndex); \
|
||||||
|
\
|
||||||
|
void Sort(CMPFUNC##T fCmp) { wxBaseArray::Sort((CMPFUNC)fCmp); } \
|
||||||
|
\
|
||||||
|
private: \
|
||||||
|
void DoCopy(const name& src); \
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
/** @name Macros for definition of dynamic arrays and objarrays
|
||||||
|
|
||||||
|
These macros are ugly (especially if you look in the sources ;-), but they
|
||||||
|
allow us to define 'template' classes without actually using templates.
|
||||||
|
<BR>
|
||||||
|
<BR>
|
||||||
|
Range checking is performed in debug build for both arrays and objarrays.
|
||||||
|
Type checking is done at compile-time. Warning: arrays <I>never</I> shrink,
|
||||||
|
they only grow, so loading 10 millions in an array only to delete them 2
|
||||||
|
lines below is <I>not</I> recommended. However, it does free memory when
|
||||||
|
it's destroyed, so if you destroy array also, it's ok.
|
||||||
|
*/
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
//@{
|
||||||
|
/**
|
||||||
|
This macro generates a new array class. It is intended for storage of simple
|
||||||
|
types of sizeof()<=sizeof(long) or pointers if sizeof(pointer)<=sizeof(long)
|
||||||
|
<BR>
|
||||||
|
NB: it has only inline functions => takes no space at all
|
||||||
|
<BR>
|
||||||
|
|
||||||
|
@memo declare and define array class 'name' containing elements of type 'T'
|
||||||
|
*/
|
||||||
|
#define WX_DEFINE_ARRAY(T, name) typedef T _A##name; \
|
||||||
|
_WX_DEFINE_ARRAY(_A##name, name)
|
||||||
|
|
||||||
|
/**
|
||||||
|
This macro does the same as WX_DEFINE_ARRAY except that the array will be
|
||||||
|
sorted with the specified compare function.
|
||||||
|
*/
|
||||||
|
#define WX_DEFINE_SORTED_ARRAY(T, name) typedef T _A##name; \
|
||||||
|
_WX_DEFINE_SORTED_ARRAY(_A##name, name)
|
||||||
|
|
||||||
|
/**
|
||||||
|
This macro generates a new objarrays class which owns the objects it
|
||||||
|
contains, i.e. it will delete them when it is destroyed. An element is of
|
||||||
|
type T*, but arguments of type T& are taken (see below!) and T& is
|
||||||
|
returned. <BR>
|
||||||
|
Don't use this for simple types such as "int" or "long"!
|
||||||
|
You _may_ use it for "double" but it's awfully inefficient.
|
||||||
|
<BR>
|
||||||
|
<BR>
|
||||||
|
Note on Add/Insert functions:
|
||||||
|
<BR>
|
||||||
|
1) function(T*) gives the object to the array, i.e. it will delete the
|
||||||
|
object when it's removed or in the array's dtor
|
||||||
|
<BR>
|
||||||
|
2) function(T&) will create a copy of the object and work with it
|
||||||
|
<BR>
|
||||||
|
<BR>
|
||||||
|
Also:
|
||||||
|
<BR>
|
||||||
|
1) Remove() will delete the object after removing it from the array
|
||||||
|
<BR>
|
||||||
|
2) Detach() just removes the object from the array (returning pointer to it)
|
||||||
|
<BR>
|
||||||
|
<BR>
|
||||||
|
NB1: Base type T should have an accessible copy ctor if Add(T&) is used,
|
||||||
|
<BR>
|
||||||
|
NB2: Never ever cast a array to it's base type: as dtor is <B>not</B> virtual
|
||||||
|
it will provoke memory leaks
|
||||||
|
<BR>
|
||||||
|
<BR>
|
||||||
|
some functions of this class are not inline, so it takes some space to
|
||||||
|
define new class from this template.
|
||||||
|
|
||||||
|
@memo declare objarray class 'name' containing elements of type 'T'
|
||||||
|
*/
|
||||||
|
#define WX_DECLARE_OBJARRAY(T, name) typedef T _L##name; \
|
||||||
|
_WX_DECLARE_OBJARRAY(_L##name, name)
|
||||||
|
/**
|
||||||
|
To use an objarray class you must
|
||||||
|
<ll>
|
||||||
|
<li>#include "dynarray.h"
|
||||||
|
<li>WX_DECLARE_OBJARRAY(element_type, list_class_name)
|
||||||
|
<li>#include "arrimpl.cpp"
|
||||||
|
<li>WX_DEFINE_OBJARRAY(list_class_name) // same as above!
|
||||||
|
</ll>
|
||||||
|
<BR><BR>
|
||||||
|
This is necessary because at the moment of DEFINE_OBJARRAY class
|
||||||
|
element_type must be fully defined (i.e. forward declaration is not
|
||||||
|
enough), while WX_DECLARE_OBJARRAY may be done anywhere. The separation of
|
||||||
|
two allows to break cicrcular dependencies with classes which have member
|
||||||
|
variables of objarray type.
|
||||||
|
|
||||||
|
@memo define (must include arrimpl.cpp!) objarray class 'name'
|
||||||
|
*/
|
||||||
|
#define WX_DEFINE_OBJARRAY(name) "don't forget to include arrimpl.cpp!"
|
||||||
|
//@}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
/** @name Some commonly used predefined arrays */
|
||||||
|
// # overhead if not used?
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#define WXDLLEXPORTLOCAL WXDLLEXPORT
|
||||||
|
|
||||||
|
//@{
|
||||||
|
/** @name ArrayInt */
|
||||||
|
WX_DEFINE_ARRAY(int, wxArrayInt);
|
||||||
|
/** @name ArrayLong */
|
||||||
|
WX_DEFINE_ARRAY(long, wxArrayLong);
|
||||||
|
/** @name ArrayPtrVoid */
|
||||||
|
WX_DEFINE_ARRAY(void *, wxArrayPtrVoid);
|
||||||
|
//@}
|
||||||
|
|
||||||
|
//@}
|
||||||
|
|
||||||
|
#undef WXDLLEXPORTLOCAL
|
||||||
|
#define WXDLLEXPORTLOCAL
|
||||||
|
|
||||||
|
// -----------------------------------------------------------------------------
|
||||||
|
// convinience macros
|
||||||
|
// -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// delete all array elements
|
||||||
|
//
|
||||||
|
// NB: the class declaration of the array elements must be visible from the
|
||||||
|
// place where you use this macro, otherwise the proper destructor may not
|
||||||
|
// be called (a decent compiler should give a warning about it, but don't
|
||||||
|
// count on it)!
|
||||||
|
#define WX_CLEAR_ARRAY(array) \
|
||||||
|
{ \
|
||||||
|
size_t count = array.Count(); \
|
||||||
|
for ( size_t n = 0; n < count; n++ ) \
|
||||||
|
{ \
|
||||||
|
delete array[n]; \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
array.Empty(); \
|
||||||
|
}
|
||||||
|
#endif // _DYNARRAY_H
|
||||||
|
|
89
include/wx/msw/dcclient.h
Normal file
89
include/wx/msw/dcclient.h
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: dcclient.h
|
||||||
|
// Purpose: wxClientDC class
|
||||||
|
// Author: Julian Smart
|
||||||
|
// Modified by:
|
||||||
|
// Created: 01/02/97
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) Julian Smart and Markus Holzem
|
||||||
|
// Licence: wxWindows license
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifndef _WX_DCCLIENT_H_
|
||||||
|
#define _WX_DCCLIENT_H_
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// headers
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma interface "dcclient.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/dc.h"
|
||||||
|
#include "wx/dynarray.h"
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// array types
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// this one if used by wxPaintDC only
|
||||||
|
struct WXDLLEXPORT wxPaintDCInfo;
|
||||||
|
|
||||||
|
#undef WXDLLEXPORTLOCAL
|
||||||
|
#define WXDLLEXPORTLOCAL WXDLLEXPORT
|
||||||
|
WX_DECLARE_OBJARRAY(wxPaintDCInfo, wxArrayDCInfo);
|
||||||
|
#undef WXDLLEXPORTLOCAL
|
||||||
|
#define WXDLLEXPORTLOCAL
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// DC classes
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
class WXDLLEXPORT wxWindowDC : public wxDC
|
||||||
|
{
|
||||||
|
DECLARE_DYNAMIC_CLASS(wxWindowDC)
|
||||||
|
|
||||||
|
public:
|
||||||
|
wxWindowDC();
|
||||||
|
|
||||||
|
// Create a DC corresponding to the whole window
|
||||||
|
wxWindowDC(wxWindow *win);
|
||||||
|
|
||||||
|
virtual ~wxWindowDC();
|
||||||
|
};
|
||||||
|
|
||||||
|
class WXDLLEXPORT wxClientDC : public wxWindowDC
|
||||||
|
{
|
||||||
|
DECLARE_DYNAMIC_CLASS(wxClientDC)
|
||||||
|
|
||||||
|
public:
|
||||||
|
wxClientDC();
|
||||||
|
|
||||||
|
// Create a DC corresponding to the client area of the window
|
||||||
|
wxClientDC(wxWindow *win);
|
||||||
|
|
||||||
|
virtual ~wxClientDC();
|
||||||
|
};
|
||||||
|
|
||||||
|
class WXDLLEXPORT wxPaintDC : public wxWindowDC
|
||||||
|
{
|
||||||
|
DECLARE_DYNAMIC_CLASS(wxPaintDC)
|
||||||
|
|
||||||
|
public:
|
||||||
|
wxPaintDC();
|
||||||
|
|
||||||
|
// Create a DC corresponding for painting the window in OnPaint()
|
||||||
|
wxPaintDC(wxWindow *win);
|
||||||
|
|
||||||
|
virtual ~wxPaintDC();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
static wxArrayDCInfo ms_cache;
|
||||||
|
|
||||||
|
// find the entry for this DC in the cache (keyed by the window)
|
||||||
|
wxPaintDCInfo *FindInCache(size_t *index = NULL) const;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
// _WX_DCCLIENT_H_
|
147
include/wx/msw/listbox.h
Normal file
147
include/wx/msw/listbox.h
Normal file
@@ -0,0 +1,147 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: listbox.h
|
||||||
|
// Purpose: wxListBox class
|
||||||
|
// Author: Julian Smart
|
||||||
|
// Modified by:
|
||||||
|
// Created: 01/02/97
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) Julian Smart
|
||||||
|
// Licence: wxWindows licence
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifndef _WX_LISTBOX_H_
|
||||||
|
#define _WX_LISTBOX_H_
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma interface "listbox.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "wx/control.h"
|
||||||
|
|
||||||
|
WXDLLEXPORT_DATA(extern const wxChar*) wxListBoxNameStr;
|
||||||
|
|
||||||
|
#if wxUSE_OWNER_DRAWN
|
||||||
|
class WXDLLEXPORT wxOwnerDrawn;
|
||||||
|
|
||||||
|
// define the array of list box items
|
||||||
|
#include <wx/dynarray.h>
|
||||||
|
|
||||||
|
#undef WXDLLEXPORTLOCAL
|
||||||
|
#define WXDLLEXPORTLOCAL WXDLLEXPORT
|
||||||
|
WX_DEFINE_ARRAY(wxOwnerDrawn *, wxListBoxItemsArray);
|
||||||
|
#undef WXDLLEXPORTLOCAL
|
||||||
|
#define WXDLLEXPORTLOCAL
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// forward decl for GetSelections()
|
||||||
|
class wxArrayInt;
|
||||||
|
|
||||||
|
WXDLLEXPORT_DATA(extern const wxChar*) wxEmptyString;
|
||||||
|
|
||||||
|
// List box item
|
||||||
|
class WXDLLEXPORT wxListBox : public wxControl
|
||||||
|
{
|
||||||
|
DECLARE_DYNAMIC_CLASS(wxListBox)
|
||||||
|
|
||||||
|
public:
|
||||||
|
wxListBox();
|
||||||
|
wxListBox(wxWindow *parent, wxWindowID id,
|
||||||
|
const wxPoint& pos = wxDefaultPosition,
|
||||||
|
const wxSize& size = wxDefaultSize,
|
||||||
|
int n = 0, const wxString choices[] = NULL,
|
||||||
|
long style = 0,
|
||||||
|
const wxValidator& validator = wxDefaultValidator,
|
||||||
|
const wxString& name = wxListBoxNameStr)
|
||||||
|
{
|
||||||
|
Create(parent, id, pos, size, n, choices, style, validator, name);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Create(wxWindow *parent, wxWindowID id,
|
||||||
|
const wxPoint& pos = wxDefaultPosition,
|
||||||
|
const wxSize& size = wxDefaultSize,
|
||||||
|
int n = 0, const wxString choices[] = NULL,
|
||||||
|
long style = 0,
|
||||||
|
const wxValidator& validator = wxDefaultValidator,
|
||||||
|
const wxString& name = wxListBoxNameStr);
|
||||||
|
|
||||||
|
~wxListBox();
|
||||||
|
|
||||||
|
bool MSWCommand(WXUINT param, WXWORD id);
|
||||||
|
|
||||||
|
#if wxUSE_OWNER_DRAWN
|
||||||
|
bool MSWOnMeasure(WXMEASUREITEMSTRUCT *item);
|
||||||
|
bool MSWOnDraw(WXDRAWITEMSTRUCT *item);
|
||||||
|
|
||||||
|
// plug-in for derived classes
|
||||||
|
virtual wxOwnerDrawn *CreateItem(size_t n);
|
||||||
|
|
||||||
|
// allows to get the item and use SetXXX functions to set it's appearance
|
||||||
|
wxOwnerDrawn *GetItem(size_t n) const { return m_aItems[n]; }
|
||||||
|
|
||||||
|
// get the index of the given item
|
||||||
|
int GetItemIndex(wxOwnerDrawn *item) const { return m_aItems.Index(item); }
|
||||||
|
#endif // wxUSE_OWNER_DRAWN
|
||||||
|
|
||||||
|
virtual void Append(const wxString& item);
|
||||||
|
virtual void Append(const wxString& item, void *clientData);
|
||||||
|
virtual void Set(int n, const wxString* choices, void **clientData = NULL);
|
||||||
|
virtual int FindString(const wxString& s) const ;
|
||||||
|
virtual void Clear();
|
||||||
|
virtual void SetSelection(int n, bool select = TRUE);
|
||||||
|
|
||||||
|
virtual void Deselect(int n);
|
||||||
|
|
||||||
|
// For single choice list item only
|
||||||
|
virtual int GetSelection() const ;
|
||||||
|
virtual void Delete(int n);
|
||||||
|
virtual void *GetClientData(int n) const ;
|
||||||
|
virtual void SetClientData(int n, void *clientData);
|
||||||
|
virtual void SetString(int n, const wxString& s);
|
||||||
|
|
||||||
|
// For single or multiple choice list item
|
||||||
|
virtual int GetSelections(wxArrayInt& aSelections) const;
|
||||||
|
virtual bool Selected(int n) const ;
|
||||||
|
virtual wxString GetString(int n) const ;
|
||||||
|
|
||||||
|
// Set the specified item at the first visible item
|
||||||
|
// or scroll to max range.
|
||||||
|
virtual void SetFirstItem(int n) ;
|
||||||
|
virtual void SetFirstItem(const wxString& s) ;
|
||||||
|
|
||||||
|
virtual void InsertItems(int nItems, const wxString items[], int pos);
|
||||||
|
|
||||||
|
virtual wxString GetStringSelection() const ;
|
||||||
|
virtual bool SetStringSelection(const wxString& s, bool flag = TRUE);
|
||||||
|
virtual int Number() const ;
|
||||||
|
|
||||||
|
void Command(wxCommandEvent& event);
|
||||||
|
|
||||||
|
// Windows-specific code to set the horizontal extent of
|
||||||
|
// the listbox, if necessary. If s is non-NULL, it's
|
||||||
|
// used to calculate the horizontal extent.
|
||||||
|
// Otherwise, all strings are used.
|
||||||
|
virtual void SetHorizontalExtent(const wxString& s = wxEmptyString);
|
||||||
|
|
||||||
|
virtual WXHBRUSH OnCtlColor(WXHDC pDC, WXHWND pWnd, WXUINT nCtlColor,
|
||||||
|
WXUINT message, WXWPARAM wParam, WXLPARAM lParam);
|
||||||
|
|
||||||
|
virtual long MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam);
|
||||||
|
virtual void SetupColours();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
int m_noItems;
|
||||||
|
int m_selected;
|
||||||
|
|
||||||
|
#if wxUSE_OWNER_DRAWN
|
||||||
|
// control items
|
||||||
|
wxListBoxItemsArray m_aItems;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
virtual void DoSetSize(int x, int y,
|
||||||
|
int width, int height,
|
||||||
|
int sizeFlags = wxSIZE_AUTO);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
// _WX_LISTBOX_H_
|
173
include/wx/msw/notebook.h
Normal file
173
include/wx/msw/notebook.h
Normal file
@@ -0,0 +1,173 @@
|
|||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Name: msw/notebook.h
|
||||||
|
// Purpose: MSW/GTK compatible notebook (a.k.a. property sheet)
|
||||||
|
// Author: Robert Roebling
|
||||||
|
// Modified by: Vadim Zeitlin for Windows version
|
||||||
|
// RCS-ID: $Id$
|
||||||
|
// Copyright: (c) Julian Smart and Markus Holzem
|
||||||
|
// Licence: wxWindows license
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifndef _NOTEBOOK_H
|
||||||
|
#define _NOTEBOOK_H
|
||||||
|
|
||||||
|
#ifdef __GNUG__
|
||||||
|
#pragma interface "notebook.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// headers
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
#ifndef _DYNARRAY_H
|
||||||
|
#include <wx/dynarray.h>
|
||||||
|
#endif //_DYNARRAY_H
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// types
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// fwd declarations
|
||||||
|
class WXDLLEXPORT wxImageList;
|
||||||
|
class WXDLLEXPORT wxWindow;
|
||||||
|
|
||||||
|
// array of notebook pages
|
||||||
|
typedef wxWindow WXDLLEXPORT wxNotebookPage; // so far, any window can be a page
|
||||||
|
|
||||||
|
#undef WXDLLEXPORTLOCAL
|
||||||
|
#define WXDLLEXPORTLOCAL WXDLLEXPORT
|
||||||
|
|
||||||
|
WX_DEFINE_ARRAY(wxNotebookPage *, wxArrayPages);
|
||||||
|
|
||||||
|
#undef WXDLLEXPORTLOCAL
|
||||||
|
#define WXDLLEXPORTLOCAL
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// wxNotebook
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// FIXME this class should really derive from wxTabCtrl, but the interface is not
|
||||||
|
// exactly the same, so I can't do it right now and instead we reimplement
|
||||||
|
// part of wxTabCtrl here
|
||||||
|
class WXDLLEXPORT wxNotebook : public wxControl
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
// ctors
|
||||||
|
// -----
|
||||||
|
// default for dynamic class
|
||||||
|
wxNotebook();
|
||||||
|
// the same arguments as for wxControl (@@@ any special styles?)
|
||||||
|
wxNotebook(wxWindow *parent,
|
||||||
|
wxWindowID id,
|
||||||
|
const wxPoint& pos = wxDefaultPosition,
|
||||||
|
const wxSize& size = wxDefaultSize,
|
||||||
|
long style = 0,
|
||||||
|
const wxString& name = "notebook");
|
||||||
|
// Create() function
|
||||||
|
bool Create(wxWindow *parent,
|
||||||
|
wxWindowID id,
|
||||||
|
const wxPoint& pos = wxDefaultPosition,
|
||||||
|
const wxSize& size = wxDefaultSize,
|
||||||
|
long style = 0,
|
||||||
|
const wxString& name = "notebook");
|
||||||
|
// dtor
|
||||||
|
~wxNotebook();
|
||||||
|
|
||||||
|
// accessors
|
||||||
|
// ---------
|
||||||
|
// get number of pages in the dialog
|
||||||
|
int GetPageCount() const;
|
||||||
|
|
||||||
|
// set the currently selected page, return the index of the previously
|
||||||
|
// selected one (or -1 on error)
|
||||||
|
// NB: this function will _not_ generate wxEVT_NOTEBOOK_PAGE_xxx events
|
||||||
|
int SetSelection(int nPage);
|
||||||
|
// cycle thru the tabs
|
||||||
|
void AdvanceSelection(bool bForward = TRUE);
|
||||||
|
// get the currently selected page
|
||||||
|
int GetSelection() const { return m_nSelection; }
|
||||||
|
|
||||||
|
// set/get the title of a page
|
||||||
|
bool SetPageText(int nPage, const wxString& strText);
|
||||||
|
wxString GetPageText(int nPage) const;
|
||||||
|
|
||||||
|
// image list stuff: each page may have an image associated with it. All
|
||||||
|
// the images belong to an image list, so you have to
|
||||||
|
// 1) create an image list
|
||||||
|
// 2) associate it with the notebook
|
||||||
|
// 3) set for each page it's image
|
||||||
|
// associate image list with a control
|
||||||
|
void SetImageList(wxImageList* imageList);
|
||||||
|
// get pointer (may be NULL) to the associated image list
|
||||||
|
wxImageList* GetImageList() const { return m_pImageList; }
|
||||||
|
|
||||||
|
// sets/returns item's image index in the current image list
|
||||||
|
int GetPageImage(int nPage) const;
|
||||||
|
bool SetPageImage(int nPage, int nImage);
|
||||||
|
|
||||||
|
// currently it's always 1 because wxGTK doesn't support multi-row
|
||||||
|
// tab controls
|
||||||
|
int GetRowCount() const;
|
||||||
|
|
||||||
|
// control the appearance of the notebook pages
|
||||||
|
// set the size (the same for all pages)
|
||||||
|
void SetPageSize(const wxSize& size);
|
||||||
|
// set the padding between tabs (in pixels)
|
||||||
|
void SetPadding(const wxSize& padding);
|
||||||
|
|
||||||
|
// operations
|
||||||
|
// ----------
|
||||||
|
// remove one page from the notebook
|
||||||
|
bool DeletePage(int nPage);
|
||||||
|
// remove one page from the notebook, without deleting
|
||||||
|
bool RemovePage(int nPage);
|
||||||
|
// remove all pages
|
||||||
|
bool DeleteAllPages();
|
||||||
|
// adds a new page to the notebook (it will be deleted ny the notebook,
|
||||||
|
// don't delete it yourself). If bSelect, this page becomes active.
|
||||||
|
bool AddPage(wxNotebookPage *pPage,
|
||||||
|
const wxString& strText,
|
||||||
|
bool bSelect = FALSE,
|
||||||
|
int imageId = -1);
|
||||||
|
// the same as AddPage(), but adds it at the specified position
|
||||||
|
bool InsertPage(int nPage,
|
||||||
|
wxNotebookPage *pPage,
|
||||||
|
const wxString& strText,
|
||||||
|
bool bSelect = FALSE,
|
||||||
|
int imageId = -1);
|
||||||
|
// get the panel which represents the given page
|
||||||
|
wxNotebookPage *GetPage(int nPage) { return m_aPages[nPage]; }
|
||||||
|
|
||||||
|
// Windows-only at present. Also, you must use the wxNB_FIXEDWIDTH
|
||||||
|
// style.
|
||||||
|
void SetTabSize(const wxSize& sz);
|
||||||
|
|
||||||
|
// callbacks
|
||||||
|
// ---------
|
||||||
|
void OnSize(wxSizeEvent& event);
|
||||||
|
void OnSelChange(wxNotebookEvent& event);
|
||||||
|
void OnSetFocus(wxFocusEvent& event);
|
||||||
|
void OnNavigationKey(wxNavigationKeyEvent& event);
|
||||||
|
|
||||||
|
// base class virtuals
|
||||||
|
// -------------------
|
||||||
|
virtual bool MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result);
|
||||||
|
virtual void SetConstraintSizes(bool recurse = TRUE);
|
||||||
|
virtual bool DoPhase(int nPhase);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
// common part of all ctors
|
||||||
|
void Init();
|
||||||
|
|
||||||
|
// helper functions
|
||||||
|
void ChangePage(int nOldSel, int nSel); // change pages
|
||||||
|
|
||||||
|
wxImageList *m_pImageList; // we can have an associated image list
|
||||||
|
wxArrayPages m_aPages; // array of pages
|
||||||
|
|
||||||
|
int m_nSelection; // the current selection (-1 if none)
|
||||||
|
|
||||||
|
DECLARE_DYNAMIC_CLASS(wxNotebook)
|
||||||
|
DECLARE_EVENT_TABLE()
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // _NOTEBOOK_H
|
Reference in New Issue
Block a user