mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
257 lines
6.0 KiB
257 lines
6.0 KiB
//+-------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1993 - 1998.
|
|
//
|
|
// File: ColDesc.hxx
|
|
//
|
|
// Contents: Column, sort, and categorization set descriptors
|
|
//
|
|
// Classes: SSortKey
|
|
// CSortSetBase
|
|
// CSortSet
|
|
//
|
|
// CColumnSetBase
|
|
// CColumnSet
|
|
//
|
|
// CCategorizationSet
|
|
// CCategorizationSetBase
|
|
//
|
|
// History: 18-Jun-93 KyleP Created
|
|
// 14 Jun 94 AlanW Added classes for large tables.
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
#pragma once
|
|
|
|
#include <sstream.hxx> // PSerStream
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Class: SSortKey
|
|
//
|
|
// Purpose: A sort key, with ColumnID translated to PropID
|
|
//
|
|
// Notes:
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
class SSortKey
|
|
{
|
|
public:
|
|
SSortKey( ) :
|
|
pidColumn(0),
|
|
dwOrder(0),
|
|
locale(0)
|
|
{ }
|
|
|
|
SSortKey(PROPID pid, ULONG dwOrd, LCID loc = 0) :
|
|
pidColumn(pid),
|
|
dwOrder(dwOrd),
|
|
locale(loc)
|
|
{ }
|
|
|
|
PROPID pidColumn; // Property ID
|
|
ULONG dwOrder; // ascending or descending, Nulls first or last
|
|
LCID locale; // locale for collation order
|
|
};
|
|
|
|
DECL_DYNARRAY_INPLACE( CColumnSetBase, PROPID );
|
|
|
|
class CColumnSet : public CColumnSetBase
|
|
{
|
|
public:
|
|
|
|
CColumnSet(unsigned size = arraySize);
|
|
|
|
//
|
|
// Serialization
|
|
//
|
|
|
|
void Marshall( PSerStream & stm ) const;
|
|
CColumnSet( PDeSerStream & stm, BOOL fNewFormat = FALSE );
|
|
};
|
|
|
|
DECLARE_SMARTP( ColumnSet );
|
|
|
|
DECL_DYNARRAY_INPLACE( CSortSetBase, SSortKey );
|
|
|
|
class CSortSet : public CSortSetBase
|
|
{
|
|
public:
|
|
|
|
CSortSet(unsigned size = arraySize);
|
|
|
|
//
|
|
// Serialization
|
|
//
|
|
|
|
void Marshall( PSerStream & stm ) const;
|
|
CSortSet( PDeSerStream & stm );
|
|
|
|
//
|
|
// Checks if the propId exists in the sortset
|
|
//
|
|
inline BOOL Exists( const PROPID propId ) const
|
|
{
|
|
for( unsigned ii = 0; ii < Count(); ii++)
|
|
{
|
|
if ( propId == Get(ii).pidColumn )
|
|
{
|
|
return TRUE;
|
|
}
|
|
}
|
|
return FALSE;
|
|
}
|
|
};
|
|
|
|
DECLARE_SMARTP( SortSet );
|
|
|
|
|
|
class CCategSpec
|
|
{
|
|
public:
|
|
|
|
unsigned Type() const
|
|
{ return _ulCategType; }
|
|
|
|
virtual void Marshall(PSerStream & stm ) const
|
|
{ stm.PutULong( _ulCategType ); }
|
|
|
|
protected:
|
|
CCategSpec( unsigned CategType ) : _ulCategType( CategType ) {}
|
|
|
|
ULONG _ulCategType;
|
|
};
|
|
|
|
class CUniqueCategSpec : public CCategSpec
|
|
{
|
|
public:
|
|
CUniqueCategSpec(CCategSpec const &CatSpec) :
|
|
CCategSpec( CATEGORIZE_UNIQUE ) {}
|
|
CUniqueCategSpec() :
|
|
CCategSpec( CATEGORIZE_UNIQUE ) {}
|
|
CUniqueCategSpec( PDeSerStream &stm ) :
|
|
CCategSpec( CATEGORIZE_UNIQUE ) {}
|
|
|
|
void Marshall( PSerStream &stm ) const { CCategSpec::Marshall( stm ); }
|
|
};
|
|
|
|
class CBucketCategSpec : public CCategSpec
|
|
{
|
|
public:
|
|
CBucketCategSpec(CCategSpec const & CatSpec) :
|
|
CCategSpec( CATEGORIZE_BUCKETS ) {}
|
|
CBucketCategSpec( BUCKETCATEGORIZE const & range ) :
|
|
CCategSpec( CATEGORIZE_BUCKETS ) {}
|
|
CBucketCategSpec( PDeSerStream &stm ) :
|
|
CCategSpec( CATEGORIZE_BUCKETS ) {}
|
|
|
|
void Marshall( PSerStream &stm ) const { CCategSpec::Marshall( stm ); }
|
|
|
|
private:
|
|
BUCKETCATEGORIZE _bucket;
|
|
};
|
|
|
|
class CRangeCategSpec : public CCategSpec
|
|
{
|
|
public:
|
|
CRangeCategSpec(CCategSpec const &CatSpec) :
|
|
CCategSpec( CATEGORIZE_RANGE ) {}
|
|
CRangeCategSpec( RANGECATEGORIZE const & range ) :
|
|
CCategSpec( CATEGORIZE_RANGE ) {}
|
|
CRangeCategSpec( PDeSerStream &stm ) :
|
|
CCategSpec( CATEGORIZE_RANGE ) {}
|
|
|
|
void Marshall( PSerStream &stm ) const { CCategSpec::Marshall( stm ); }
|
|
|
|
private:
|
|
RANGECATEGORIZE _range;
|
|
};
|
|
|
|
class CCategorizationSpec
|
|
{
|
|
public:
|
|
CCategorizationSpec( CCategorizationSpec const & rCatSpec );
|
|
|
|
CCategorizationSpec( CCategSpec * pCateg, unsigned cCol ) :
|
|
_xSpec( pCateg ), _csColumns( cCol )
|
|
{
|
|
}
|
|
|
|
CCategorizationSpec( CATEGORIZATION &Categ ) :
|
|
_xSpec( 0 ), _csColumns( Categ.csColumns.cCol )
|
|
{
|
|
if (CATEGORIZE_UNIQUE == Categ.ulCatType)
|
|
_xSpec.Set( new CUniqueCategSpec() );
|
|
else if (CATEGORIZE_BUCKETS == Categ.ulCatType)
|
|
_xSpec.Set( new CBucketCategSpec( Categ.bucket ) );
|
|
else if (CATEGORIZE_RANGE == Categ.ulCatType)
|
|
_xSpec.Set( new CRangeCategSpec( Categ.range ) );
|
|
else
|
|
Win4Assert(!"Unsupported categorization type!");
|
|
}
|
|
|
|
CCategorizationSpec( PDeSerStream &stm );
|
|
|
|
~CCategorizationSpec() {}
|
|
|
|
unsigned Type() const { return _xSpec->Type(); }
|
|
|
|
const CCategSpec & GetCategSpec( ) const
|
|
{ return _xSpec.GetReference(); }
|
|
|
|
const CColumnSet & GetColumnSet( ) const
|
|
{ return _csColumns; }
|
|
|
|
void SetColumn( PROPID pid, unsigned iPosition )
|
|
{ _csColumns.Add( pid, iPosition ); }
|
|
|
|
void Marshall( PSerStream & stm ) const;
|
|
|
|
private:
|
|
|
|
XPtr<CCategSpec> _xSpec;
|
|
CColumnSet _csColumns; // columns that can be bound to
|
|
};
|
|
|
|
DECL_DYNARRAY( CCategorizationSetBase, CCategorizationSpec );
|
|
|
|
class CPidMapper;
|
|
|
|
class CCategorizationSet : public CCategorizationSetBase
|
|
{
|
|
public:
|
|
|
|
CCategorizationSet( CCategorizationSet const & rCateg );
|
|
|
|
CCategorizationSet(unsigned size = arraySize);
|
|
CCategorizationSet( unsigned size,
|
|
CATEGORIZATIONSET *pSet,
|
|
SORTSET *pSort,
|
|
CPidMapper &pidMap );
|
|
|
|
//
|
|
// Serialization
|
|
//
|
|
|
|
void Marshall( PSerStream & stm ) const;
|
|
CCategorizationSet( PDeSerStream & stm );
|
|
|
|
void Add( CCategorizationSpec * pSpec, unsigned i )
|
|
{
|
|
CCategorizationSetBase::Add( pSpec, i );
|
|
if (i >= _cCat)
|
|
_cCat = i+1;
|
|
}
|
|
|
|
ULONG Count() const
|
|
{ return _cCat; }
|
|
|
|
private:
|
|
|
|
ULONG _cCat;
|
|
};
|
|
|
|
DECLARE_SMARTP( CategorizationSet );
|
|
|