windows-nt/Source/XPSP1/NT/inetsrv/query/apps/srch/brmodel.hxx
2020-09-26 16:20:57 +08:00

172 lines
4.1 KiB
C++

//+-------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1996 - 2000.
//
// File: brmodel.hxx
//
// Contents:
//
// History: 15 Aug 1996 DLee Created
//
//--------------------------------------------------------------------------
#pragma once
const unsigned MAX_FORCE = 16;
const unsigned MAX_INIT_DOCS = 4;
class CQueryResults;
//
// The multifile browser is structured as follows:
//
// Model
// |
// +-> array of Documents
// |
// +-> array of Hits
// |
// +-> array of Positions
//
// Therefore, next/prev file correspond to movement within
// the array of Documents in the Model.
//
// Next/prev hit correspond to movement within the current
// Document's array of Hits.
//
// The viewer extracts its Position data from the array
// of Positions in the current Hit in the current Docuement.
//
class Model
{
public:
Model ();
~Model ();
SCODE CollectFiles ( CQueryResult *pResult );
void Force ( char* pStr );
//
// Initialization methods
//
SCODE InitDocument();
//
// Next/Prev document selection routines
//
SCODE NextDoc();
BOOL PrevDoc();
BOOL isLastDoc() {
return(_cDoc == 0 || _iDoc == _cDoc - 1);
}
BOOL isFirstDoc() {
return(_iDoc == 0);
}
BOOL isLastHit() {
return(_cDoc == 0 || _hitIter.isLastHit());
}
BOOL isFirstHit() {
return(_cDoc == 0 || _hitIter.isFirstHit());
}
BOOL isSavedCurrent() { return _hitIter.isSavedCurrent(); }
int HitCount() { return _hitIter.HitCount(); }
int CurrentHit() { return _hitIter.CurrentHit(); }
int ParaCount() { return _hitIter.ParaCount(); }
//
// The rest of the routines are relative to the current document
//
inline void HiliteAll( BOOL f );
void RestoreHilite() { _hitIter.RestoreHit(); }
BOOL IsHiliteAll() { return _fHiliteAll; }
const WCHAR* Filename() { return _aDoc[_iDoc]->Filename(); }
int Paras() const { return _aDoc[_iDoc]->Paras(); }
int MaxParaLen() const{ return _aDoc[_iDoc]->MaxParaLen(); }
BOOL GetLine (int nPara, int off, int& cwc, WCHAR* buf) const
{ return _aDoc[_iDoc]->GetLine(nPara, off, cwc, buf); }
void GetWord(int nPara, int offSrc, int cwcSrc, WCHAR* buf)
{ _aDoc[_iDoc]->GetWord(nPara, offSrc, cwcSrc, buf ); }
WCHAR * GetBuffer()
{ return _aDoc[_iDoc]->Buffer(); }
WCHAR * GetBufferEnd()
{ return _aDoc[_iDoc]->BufEnd(); }
int GetPositionCount() const { return _hitIter.GetPositionCount(); }
Position GetPosition ( int i ) const { return _hitIter.GetPosition(i); }
//
// Search methods
//
WCHAR * Buffer() { return _aDoc[_iDoc]->Buffer(); }
const WCHAR * BufEnd() const { return _aDoc[_iDoc]->BufEnd(); }
ChunkOffset OffsetToChunkOffset ( ULONG offset ) const
{
return _aDoc[_iDoc]->OffsetToChunkOffset (offset);
}
ULONG FirstHit() { return _hitIter.FirstHit(); }
ULONG PrevHit() { return _hitIter.PrevHit(); }
ULONG NextHit() { return _hitIter.NextHit(); }
ParaLine const * GetParaLine () const { return _aDoc[_iDoc]->GetParaLine(); }
private:
BOOL isForced(unsigned idx);
unsigned _cForce;
unsigned _aForce[MAX_FORCE];
Document ** _aDoc;
unsigned _cDoc;
unsigned _iDoc;
HitIter _hitIter;
CQueryResult * _pResult;
BOOL _fHiliteAll;
ISearchQueryHits* _pSearch;
};
inline SCODE Model::NextDoc()
{
if (_cDoc != 0 && _iDoc + 1 < _cDoc )
{
_iDoc++;
if (_iDoc >= MAX_INIT_DOCS)
_aDoc[_iDoc - MAX_INIT_DOCS]->Free();
return InitDocument();
}
return E_FAIL;
}
inline BOOL Model::PrevDoc()
{
if (_cDoc != 0 && _iDoc > 0 )
{
_iDoc--;
return InitDocument();
}
return(FALSE);
}
inline void Model::HiliteAll( BOOL f )
{
if ( !IsHiliteAll() )
_hitIter.SaveHit();
_fHiliteAll = f;
}