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.
159 lines
3.3 KiB
159 lines
3.3 KiB
//+---------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1994-1998.
|
|
//
|
|
// File: InvCur.cxx
|
|
//
|
|
// Contents: 'Invalid' cursor. Cursor over the pidUnfiltered property
|
|
// based on a given widmap.
|
|
//
|
|
// Classes: CUnfilteredCursor
|
|
//
|
|
// History: 09-Nov-94 KyleP Created.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#include <pch.cxx>
|
|
#pragma hdrstop
|
|
|
|
#include <widtab.hxx>
|
|
|
|
#include "invcur.hxx"
|
|
|
|
static const BYTE abUnfiltered[] = { VT_UI1,
|
|
(BYTE)(pidUnfiltered >> 24),
|
|
(BYTE)(pidUnfiltered >> 16),
|
|
(BYTE)(pidUnfiltered >> 8),
|
|
(BYTE) pidUnfiltered,
|
|
0,
|
|
1 };
|
|
|
|
CKeyBuf CUnfilteredCursor::_TheUnfilteredKey( pidUnfiltered, abUnfiltered, sizeof(abUnfiltered) );
|
|
|
|
int CUnfilteredCursor::CompareAgainstUnfilteredKey( CKey const & key )
|
|
{
|
|
//
|
|
// Compare not available on CKeyBuf
|
|
//
|
|
|
|
return( key.CompareStr( _TheUnfilteredKey ) * -1 );
|
|
}
|
|
|
|
|
|
CUnfilteredCursor::CUnfilteredCursor( INDEXID iid, WORKID widMax, CWidTable const & widtab )
|
|
: CKeyCursor( iid, widMax ),
|
|
_widtab( widtab ),
|
|
_iCurrentFakeWid( 0 ),
|
|
_occ( 1 ),
|
|
_fAtEnd( FALSE ),
|
|
_fKeyMoved( FALSE )
|
|
{
|
|
NextWorkId();
|
|
|
|
UpdateWeight();
|
|
|
|
Win4Assert( WorkId() != widInvalid );
|
|
}
|
|
|
|
ULONG CUnfilteredCursor::WorkIdCount()
|
|
{
|
|
ULONG CUnfiltered = 0;
|
|
|
|
for ( unsigned i = 1; i <= _widtab.Count(); i++ )
|
|
{
|
|
if ( !_widtab.IsFiltered(i) && _widtab.IsValid(i) )
|
|
CUnfiltered++;
|
|
}
|
|
|
|
return( CUnfiltered );
|
|
}
|
|
|
|
WORKID CUnfilteredCursor::WorkId()
|
|
{
|
|
if ( _fAtEnd )
|
|
return( widInvalid );
|
|
else
|
|
return( _widtab.FakeWidToUnfilteredWid( _iCurrentFakeWid ) );
|
|
}
|
|
|
|
void CUnfilteredCursor::RatioFinished (ULONG& denom, ULONG& num)
|
|
{
|
|
denom = _widtab.Count();
|
|
num = min (denom, _iCurrentFakeWid);
|
|
}
|
|
|
|
WORKID CUnfilteredCursor::NextWorkId()
|
|
{
|
|
Win4Assert( !_fKeyMoved);
|
|
|
|
for ( _iCurrentFakeWid++; _iCurrentFakeWid <= _widtab.Count(); _iCurrentFakeWid++ )
|
|
{
|
|
if ( !_widtab.IsFiltered(_iCurrentFakeWid) && _widtab.IsValid( _iCurrentFakeWid ) )
|
|
break;
|
|
}
|
|
|
|
if ( _iCurrentFakeWid > _widtab.Count() )
|
|
{
|
|
_fAtEnd = TRUE;
|
|
_occ = OCC_INVALID;
|
|
}
|
|
else
|
|
{
|
|
Win4Assert( !_fAtEnd );
|
|
_occ = 1;
|
|
}
|
|
|
|
return( WorkId() );
|
|
}
|
|
|
|
ULONG CUnfilteredCursor::HitCount()
|
|
{
|
|
return( 1 );
|
|
}
|
|
|
|
|
|
OCCURRENCE CUnfilteredCursor::Occurrence()
|
|
{
|
|
return( _occ );
|
|
}
|
|
|
|
OCCURRENCE CUnfilteredCursor::NextOccurrence()
|
|
{
|
|
_occ = OCC_INVALID;
|
|
|
|
return( _occ );
|
|
}
|
|
|
|
OCCURRENCE CUnfilteredCursor::MaxOccurrence()
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
|
|
ULONG CUnfilteredCursor::OccurrenceCount()
|
|
{
|
|
Win4Assert( _occ != OCC_INVALID );
|
|
|
|
return( 1 );
|
|
}
|
|
|
|
CKeyBuf const * CUnfilteredCursor::GetKey()
|
|
{
|
|
if ( _fKeyMoved )
|
|
return( 0 );
|
|
else
|
|
return( &_TheUnfilteredKey );
|
|
}
|
|
|
|
CKeyBuf const * CUnfilteredCursor::GetNextKey()
|
|
{
|
|
_fKeyMoved = TRUE;
|
|
_fAtEnd = TRUE;
|
|
_occ = OCC_INVALID;
|
|
|
|
return( 0 );
|
|
}
|
|
|
|
|
|
|