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.
104 lines
2.6 KiB
104 lines
2.6 KiB
//
|
|
// anchor.h
|
|
//
|
|
// CAnchor
|
|
//
|
|
|
|
#ifndef ANCHOR_H
|
|
#define ANCHOR_H
|
|
|
|
#include "private.h"
|
|
#include "acp2anch.h"
|
|
|
|
class CAnchorRef;
|
|
class CACPWrap;
|
|
|
|
class CAnchor
|
|
{
|
|
public:
|
|
CAnchor()
|
|
{
|
|
Dbg_MemSetThisNameIDCounter(TEXT("CAnchor"), PERF_ANCHOR_COUNTER);
|
|
Assert(_fNormalized == FALSE);
|
|
}
|
|
|
|
CACPWrap *_GetWrap()
|
|
{
|
|
return _paw;
|
|
}
|
|
|
|
BOOL _InsidePendingRange()
|
|
{
|
|
LONG ichDeltaStart;
|
|
|
|
// if there's no pending delta range, we're not inside one
|
|
if (!_paw->_IsPendingDelta())
|
|
return FALSE;
|
|
|
|
ichDeltaStart = _paw->_GetPendingDeltaAnchor()->_ich;
|
|
|
|
// if the pending delta is negative, all anchor ich's are ascending
|
|
if (_paw->_GetPendingDelta() < 0)
|
|
return (_ich >= ichDeltaStart);
|
|
|
|
// otherwise, there maybe overlapping anchor ichs like
|
|
// 1, 3, 6 (delta start) 1, 3, 6, 10, ..
|
|
//
|
|
// so we can't always just test vs. ichDeltaStart.
|
|
|
|
// we know the delta is positive, so an _ich less then the start ich
|
|
// must not be in the pending range
|
|
if (_ich < ichDeltaStart)
|
|
return FALSE;
|
|
|
|
// similarly, an ich >= ichDeltaStart + delta must be inside the range
|
|
if (_ich >= ichDeltaStart + _paw->_GetPendingDelta())
|
|
return TRUE;
|
|
|
|
// if the ich matches the start of the pending delta, we can test vs.
|
|
// the delta start anchor
|
|
if (_ich == ichDeltaStart)
|
|
return _paw->_GetPendingDeltaAnchor() == this;
|
|
|
|
// if we get here, there's no way to tell just looking at this anchor
|
|
// whether or not it's in the pending range -- its ich is legal
|
|
// either way. We have to bite the bullet and find its index in the
|
|
// anchor array.
|
|
return (_paw->_FindWithinPendingRange(_ich) == this);
|
|
}
|
|
|
|
int GetIch()
|
|
{
|
|
return (_InsidePendingRange() ? _ich + _paw->_GetPendingDelta() : _ich);
|
|
}
|
|
|
|
void SetACP(int ich) // careful, this method is very dangerous
|
|
{
|
|
Assert(ich >= 0);
|
|
if (_InsidePendingRange())
|
|
{
|
|
_ich = ich - _paw->_GetPendingDelta();
|
|
}
|
|
else
|
|
{
|
|
_ich = ich;
|
|
}
|
|
}
|
|
|
|
BOOL IsNormalized()
|
|
{
|
|
return _fNormalized;
|
|
}
|
|
|
|
private:
|
|
friend CACPWrap;
|
|
|
|
CACPWrap *_paw;
|
|
int _ich; // offset of this anchor in the text stream, dangerous to change directly!
|
|
CAnchorRef *_parFirst; // list of ranges referencing this anchor
|
|
BOOL _fNormalized : 1;
|
|
DBG_ID_DECLARE;
|
|
};
|
|
|
|
|
|
#endif // ANCHOR_H
|