|
|
/*
* _SELECT.H * * Purpose: * CTxtSelection class * * Owner: * David R. Fulmer (original code) * Christian Fortini * * Copyright (c) 1995-2000, Microsoft Corporation. All rights reserved. */
#ifndef _SELECT_H
#define _SELECT_H
#include "_range.h"
#include "_m_undo.h"
// amount of time, in milisecs, before pending characters force a display update
#define ticksPendingUpdate 100 // 100 mili secs ~ display at least 10 characters per second.
class CDisplay; class CLinePtr;
typedef enum { smNone, smWord, smLine, smPara } SELMODE;
enum { CARET_NONE = 0, CARET_CUSTOM = 1, CARET_BIDI = 2, CARET_THAI = 4, CARET_INDIC = 8 };
class CTxtSelection : public CTxtRange { #ifdef DEBUG
public: BOOL Invariant( void ) const; // Invariant checking.
#endif // DEBUG
//@access Protected Data
protected: CDisplay *_pdp; // display this selection belong to
LONG _cpSel; // active end of displayed selection
LONG _cchSel; // length of displayed selection
LONG _upCaret; // caret x on screen
LONG _vpCaret; // caret y on screen
LONG _upCaretReally; // real caret x (/r start of line) for vertical moves
INT _dvpCaret; // caret height
union { DWORD _dwFlags; // All together now
struct { DWORD _fCaretNotAtBOL:1; // If at BOL, show caret at prev EOL
DWORD _fDeferUpdate :1; // Defer updating selection/caret on screen
DWORD _fInAutoWordSel:1; // Current selection used auto word sel
DWORD _fShowCaret :1; // Show caret on screen
DWORD _fShowSelection:1; // Show selection on screen
DWORD _fIsChar :1; // Currently adding a single char
DWORD _fObSelected :1; // An embedded object is selected
DWORD _fAutoSelectAborted : 1; // Whether auto word selection is aborted
DWORD _fCaretCreated :1; // Caret has been created
DWORD _fNoKeyboardUpdate :1; // Keyboard is not updated while in UpdateCaret()
DWORD _fEOP :1; // InsertEOP() has been called
DWORD _fHomeOrEnd :1; // Home or End key is being processed
DWORD _fAutoVScroll :1; // 1.0 specific: flag indicating autoscrolling should be applied
DWORD _fForceScrollCaret:1; // 1.0 specific: force caret to scroll
DWORD _fShowCellLine :1; // Show line for CELL following TRED
DWORD _fUpdatedFromCp0:1;// Updated selection from cp = 0
}; }; SELMODE _SelMode; // 0 none, 1 Word, 2 Line, 3 Paragraph
DWORD _ticksPending; // Count of chars inserted without UpdateWindow
LONG _cpAnchor; // Initial anchor for auto word select
LONG _cpAnchorMin; // Initial selection cpMin/cpMost for select
LONG _cpAnchorMost; // modes
LONG _cpWordMin; // Start of anchor word in word select mode
LONG _cpWordMost; // End of anchor word in word select mode
LONG _cpWordPrev; // Previous anchor word end
HBITMAP _hbmpCaret; // Used for funky carets, like BiDi/ital carets
DWORD _dwCaretInfo; // Current caret info used to avoid new create
//@access Public Methods
public: CTxtSelection(CDisplay * const pdp); ~CTxtSelection();
CRchTxtPtr& operator =(const CRchTxtPtr& rtp); CTxtRange& operator =(const CTxtRange &rg);
// Set the display
void SetDisplay(CDisplay *pdp) { _pdp = pdp; }
// Information for Selection Change notification
void SetSelectionInfo(SELCHANGE *pselchg);
// Replacement
LONG DeleteWithTRDCheck(IUndoBuilder *publdr, SELRR selaemode, LONG *pcchMove, DWORD dwflags); LONG ReplaceRange(LONG cchNew, WCHAR const *pch, IUndoBuilder *publdr, SELRR fCreateAE, LONG* pcchMove = NULL, DWORD dwFlags = 0);
// Info for recalc line / UpdateView
void ClearCchPending() {_ticksPending = 0;} LONG GetScrSelMin() const {return min(_cpSel, _cpSel - _cchSel);} LONG GetScrSelMost() const {return max(_cpSel, _cpSel - _cchSel);} BOOL PuttingChar() const {return _fIsChar;}
// General updating
virtual BOOL Update(BOOL fScrollIntoView);
BOOL DeferUpdate() {const BOOL fRet = _fDeferUpdate; _fDeferUpdate = TRUE; return fRet;} BOOL DoDeferedUpdate(BOOL fScrollIntoView) {_fDeferUpdate = FALSE; return Update(fScrollIntoView);}
void SetAutoVScroll(BOOL bAuto) {_fAutoVScroll = bAuto;} BOOL GetAutoVScroll() {return _fAutoVScroll;} BOOL GetShowCellLine() {return _fShowCellLine;}
void SetForceScrollCaret(BOOL bAuto) {_fForceScrollCaret = bAuto;} BOOL GetForceScrollCaret() {return _fForceScrollCaret;}
// method used by selection anti-event for out-of-phase updates
void SetDelayedSelectionRange(LONG cp, LONG cch); void StopGroupTyping();
// Caret management
BOOL CaretNotAtBOL() const; void CheckTableIP(BOOL fOpenLine); void CreateCaret(); void DeleteCaretBitmap(BOOL fReset); BOOL IsCaretHorizontal() const; INT GetCaretHt() {return _dvpCaret;} LONG GetUpCaretReally(); LONG GetUpCaret() const {return _upCaret;} LONG GetVpCaret() const {return _vpCaret;} BOOL IsCaretNotAtBOL() const {return _fCaretNotAtBOL;} BOOL IsCaretInView() const; BOOL IsCaretShown() const {return _fShowCaret && !_cch;} BOOL IsUpdatedFromCp0() const {return _fUpdatedFromCp0;} LONG LineLength(LONG *pcp) const; BOOL SetUpPosition(LONG upCaret, CLinePtr& rp, BOOL fBottomLine, BOOL fExtend); BOOL ShowCaret(BOOL fShow); BOOL UpdateCaret(BOOL fScrollIntoView, BOOL fForceCaret = FALSE); BOOL GetCaretPoint(RECTUV &rcClient, POINTUV &pt, CLinePtr *prp, BOOL fBeforeCp); BOOL MatchKeyboardToPara();
// Selection management
void ClearPrevSel() { _cpSel = 0; _cchSel = 0; } BOOL GetShowSelection() {return _fShowSelection;} BOOL ScrollWindowful(WPARAM wparam, BOOL fExtend); void SetSelection(LONG cpFirst, LONG cpMost); BOOL ShowSelection(BOOL fShow); void Beep() {GetPed()->Beep();}
// Selection with the mouse
void CancelModes (BOOL fAutoWordSel = FALSE); void ExtendSelection(const POINTUV pt); BOOL PointInSel (const POINTUV pt, RECTUV *prcClient = NULL, HITTEST Hit = HT_Undefined) const; void SelectAll (); void SelectUnit (const POINTUV pt, LONG Unit); void SelectWord (const POINTUV pt); void SetCaret (const POINTUV pt, BOOL fUpdate = TRUE);
// Keyboard movements
BOOL Left (BOOL fCtrl, BOOL fExtend); BOOL Right (BOOL fCtrl, BOOL fExtend); BOOL Up (BOOL fCtrl, BOOL fExtend); BOOL Down (BOOL fCtrl, BOOL fExtend); BOOL Home (BOOL fCtrl, BOOL fExtend); BOOL End (BOOL fCtrl, BOOL fExtend); BOOL PageUp (BOOL fCtrl, BOOL fExtend); BOOL PageDown(BOOL fCtrl, BOOL fExtend);
// Editing
BOOL PutChar (DWORD ch, DWORD dwFlags, IUndoBuilder *publdr, LCID lcid = 0); void SetIsChar(BOOL); void CheckUpdateWindow(); BOOL InsertEOP(IUndoBuilder *publdr, WCHAR ch = 0); LONG InsertTableRow (const CParaFormat *pPF, IUndoBuilder *publdr, BOOL fFixCellBorders = FALSE); // Keyboard switching support.
void CheckChangeKeyboardLayout(); bool CheckChangeFont (const HKL hkl, UINT iCharRep, LONG iSelFormat = 0, QWORD qwCharFlags = 0); UINT CheckSynchCharSet(QWORD dwCharFlags = 0);
// from CTxtRange
BOOL Delete (DWORD flags, IUndoBuilder *publdr); BOOL Backspace(BOOL fCtrl, IUndoBuilder *publdr);
const CParaFormat* GetPF();
// note that the parameters are different than CTxtRange::SetCharFormat
// intentionally; the selection has extra options available to it.
HRESULT SetCharFormat(const CCharFormat *pCF, DWORD flags, IUndoBuilder *publdr, DWORD dwMask, DWORD dwMask2); HRESULT SetParaFormat(const CParaFormat *pPF, IUndoBuilder *publdr, DWORD dwMask, DWORD dwMask2);
// Auto word selection helper
void InitClickForAutWordSel(const POINTUV pt);
// dual font helper for CTxtSelection::PutChar
void SetupDualFont();
// IUnknown and IDispatch methods handled by CTxtRange methods
// ITextRange methods can use ITextRange methods directly, since
// they either don't modify the display of the selection (get methods), or
// they have appropriate virtual character to call on selection functions.
// ITextSelection methods
STDMETHODIMP GetFlags (long *pFlags) ; STDMETHODIMP SetFlags (long Flags) ; STDMETHODIMP GetType (long *pType) ; STDMETHODIMP MoveLeft (long pUnit, long Count, long Extend, long *pDelta) ; STDMETHODIMP MoveRight(long pUnit, long Count, long Extend, long *pDelta) ; STDMETHODIMP MoveUp (long pUnit, long Count, long Extend, long *pDelta) ; STDMETHODIMP MoveDown (long pUnit, long Count, long Extend, long *pDelta) ; STDMETHODIMP HomeKey (long pUnit, long Extend, long *pDelta) ; STDMETHODIMP EndKey (long pUnit, long Extend, long *pDelta) ; STDMETHODIMP TypeText (BSTR bstr) ; STDMETHODIMP SetPoint (long x, long y, long Extend) ;
//@access Protected Methods
protected:
// Protected update method
void UpdateSelection();
// Protected caret management method
INT GetCaretHeight(INT *pyDescent) const;
HRESULT GeoMover (long Unit, long Count, long Extend, long *pDelta, LONG iDir); HRESULT Homer (long Unit, long Extend, long *pDelta, BOOL (CTxtSelection::*pfn)(BOOL, BOOL));
// Auto Select Word Helpers
void UpdateForAutoWord(); void AutoSelGoBackWord( LONG *pcpToUpdate, int iDirToPrevWord, int iDirToNextWord);
void ExtendToWordBreak(BOOL fAfterEOP, INT iDir); BOOL CheckPlainTextFinalEOP(); };
/*
* CSelPhaseAdjuster * * @class This class is put on the stack and used to temporarily hold * selection cp values until the control is "stable" (and thus, * we can safely set the selection */ class CSelPhaseAdjuster : public IReEntrantComponent { //@access Public methods
public:
// IReEntrantComponent methods
virtual void OnEnterContext() {;} //@cmember re-entered notify
CSelPhaseAdjuster(CTxtEdit *ped); //@cmember constructor
~CSelPhaseAdjuster(); //@cmember destructor
void CacheRange(LONG cp, LONG cch); //@cmember stores the sel range
//@access Private data
private: CTxtEdit * _ped; //@cmember edit context
LONG _cp; //@cmember sel active end to set
LONG _cch; //@cmember sel extension
};
#endif
|