172 lines
4.1 KiB
C++
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;
|
|
}
|
|
|