/* _EDIT.H * * Purpose: * Base classes for rich-text manipulation * * Authors: * Christian Fortini * Murray Sargent (and many others) * * Copyright (c) 1995-2000, Microsoft Corporation. All rights reserved. */ #ifndef _EDIT_H #define _EDIT_H #include "textserv.h" #include "textsrv2.h" #include "_ldte.h" #include "_m_undo.h" #include "_notmgr.h" #include "_doc.h" #include "_objmgr.h" #include "_cfpf.h" #include "_callmgr.h" #include "_magelln.h" #ifndef NOPRIVATEMESSAGE #include "_MSREMSG.H" #include "_textnot.h" #endif #ifndef NOINKOBJECT #include "HWXInk.h" #endif // Forward declarations class CRchTxtPtr; class CTxtSelection; class CTxtStory; class CTxtUndo; class CMeasurer; class CRenderer; class CDisplay; class CDisplayPrinter; class CDrawInfo; class CDetectURL; class CUniscribe; class CTxtBreaker; class CHyphCache; // Macro for finding parent "this" of embedded class. If this turns out to be // globally useful we should move it to _common.h. #define GETPPARENT(pmemb, struc, membname) (\ (struc FAR *)(((char FAR *)(pmemb))-offsetof(struc, membname))) // These wonderful constants are for backward compatibility. They are the // sizes used for initialization and reset in RichEdit 1.0 const LONG cInitTextMax = (32 * 1024) - 1; const LONG cResetTextMax = (64 * 1024); extern DWORD CALLBACK ReadHGlobal (DWORD_PTR dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb); extern DWORD GetKbdFlags(WORD vkey, DWORD dwFlags); extern BYTE szUTF8BOM[]; extern WORD g_wFlags; // Toggled by Ctrl-" #define KF_SMARTQUOTES 0x0001 // Enable smart quotes #define SmartQuotesEnabled() (g_wFlags & KF_SMARTQUOTES) struct SPrintControl { union { DWORD _dwAllFlags; // Make it easy to set all flags at once. struct { ULONG _fDoPrint:1; // Whether actual print is required ULONG _fPrintFromDraw:1; // Whether draw is being used to print }; }; SPrintControl(void) { _dwAllFlags = 0; } }; enum DOCUMENTTYPE { DT_LTRDOC = 1, // DT_LTRDOC and DT_RTLDOC are mutually DT_RTLDOC = 2, // exclusive }; // Context rule settings. // Optimally, these would be an enum, but we run into sign extension glitchs // sticking an enum into a 2-bit field. #define CTX_NONE 0 // No context direction/alignment. #define CTX_NEUTRAL 1 // No strong characters in the control, direction/alignment follows keyboard. #define CTX_LTR 2 // LTR direction/alignment (first strong character is LTR) #define CTX_RTL 3 // RTL direction/alignment (first strong character is RTL) #define IsStrongContext(x) (x >= CTX_LTR) class CDocInfo // Contains ITextDocument info { public: BSTR _pName; // Document filename HANDLE _hFile; // Handle used unless full file sharing WORD _wFlags; // Open, share, create, and save flags WORD _wCpg; // Code page LONG _dwDefaultTabStop; // TOM settable default tab stop LCID _lcid; // Document lcid (for RTF \deflang) LCID _lcidfe; // Document FE lcid (for RTF \deflangfe) LPSTR _lpstrLeadingPunct; // Leading kinsoku characters LPSTR _lpstrFollowingPunct; // Following kinsoku characters COLORREF *_prgColor; // Special color array COLORREF _crColor; // Background color COLORREF _crBackColor; // Background color HGLOBAL _hdata; // Background data HBITMAP _hBitmapBack; // Background bitmap char _cColor; // Allocated count of colors in pColor BYTE _bDocType; // 0-1-2: export none-\ltrdoc-\rtldoc // If 0x80 or'd in, PWD instead of RTF BYTE _bCaretType; // Caret type char _nFillType; // Background fill type SHORT _sFillAngle; // Fill angle BYTE _bFillFocus; // Background fill focus BYTE _bPicFormat; // Background Picture format BYTE _bPicFormatParm; // Background Picture format parameter RECT _rcCrop; // Background cropping RECT SHORT _xExt, _yExt; // Dimensions in pixels for pictures, twips for // for objects SHORT _xScale, _yScale; // Scaling percentage along axes SHORT _xExtGoal, _yExtGoal; // Desired dimensions in twips for pictures SHORT _xExtPict, _yExtPict; // Metafile dimensions AutoCorrectProc _pfnAutoCorrect; CDocInfo() {Init();} // Constructor ~CDocInfo(); // Destructor void Init(); void InitBackground(); }; const DWORD tomInvalidCpg = 0xFFFF; const DWORD tomInvalidLCID = 0xFFFE; // This depends on the number of property bits defined in textserv.h. However, // this is for private use by the text services so it is defined here. #define MAX_PROPERTY_BITS 21 #define SPF_SETDEFAULT 4 // IDispatch global declarations extern ITypeInfo * g_pTypeInfoDoc; extern ITypeInfo * g_pTypeInfoSel; extern ITypeInfo * g_pTypeInfoFont; extern ITypeInfo * g_pTypeInfoPara; HRESULT GetTypeInfoPtrs(); HRESULT GetTypeInfo(UINT iTypeInfo, ITypeInfo *&pTypeInfo, ITypeInfo **ppTypeInfo); BOOL IsSameVtables(IUnknown *punk1, IUnknown *punk2); // Map from keyboard to font. (converse is handled in font.cpp) typedef struct _kbdFont { WORD iKbd; SHORT iCF; } KBDFONT; LONG CheckTwips(LONG x); QWORD GetCharFlags(const WCHAR *pch, LONG cchPch = 1, BYTE iCharRepDefault = 0); LONG TwipsToHalfPoints(LONG x); LONG TwipsToQuarterPoints(LONG x); // Convert between Twips and Himetric // Ratio is 1440 twips/in, 2540 him/in, therefore 1440/2540 = 72/127 him/twips // Use muldiv() to include rounding and 64-bit intermediate result #define TwipsFromHimetric(hm) MulDiv(hm, 72, 127) #define HimetricFromTwips(tw) MulDiv(tw, 127, 72) CUniscribe* GetUniscribe(void); #define FRTL 0x00000001 #define FDIGITSHAPE 0x00000002 #define FCOMBINING 0x00000008 #define FSURROGATE 0x00000010 #define FUNIC_CTRL 0x00000020 #define FBELOWX40 0x00000040 // ASCII 0x00-0x3F #define FASCIIUPR 0x00000080 // ASCII 0x40-0x7F /* The font signature fsCsb[0] has the bit definitions 0 1252 Latin 1 1 1250 Latin 2: Eastern Europe 2 1251 Cyrillic 3 1253 Greek 4 1254 Turkish 5 1255 Hebrew 6 1256 Arabic 7 1257 Baltic 8 1258 Vietnamese 9 - 15 Reserved for ANSI 16 874 Thai 17 932 JIS/Japan 18 936 Chinese: Simplified chars--PRC, Hong Kong SAR, Singapore 19 949 Korean Unified Hangul Code (Hangul TongHabHyung Code) 20 950 Chinese: Traditional chars--Taiwan We define bit masks which are similar to the values above shifted over one byte (add 8) to make room for a low byte of special flags like FRTL in _qwCharFlags. In addition, we define some Unicode-only repertoires using info in the Unicode subset fields fsUsb[]. This approach uses a 64-bit _qwCharFlags and currently can add 6 more character repertoires (actually writing systems). If more are needed, an approach with an array of three (or more as needed) DWORDs could be used as in the Win32 FONTSIGNATURE. */ #define FHILATIN1 0x00000100 #define FLATIN2 0x00000200 #define FCYRILLIC 0x00000400 #define FGREEK 0x00000800 #define FTURKISH 0x00001000 #define FHEBREW 0x00002000 #define FARABIC 0x00004000 #define FBALTIC 0x00008000 #define FVIETNAMESE 0x00010000 #define FOTHER 0x00020000 #define FSYMBOL 0x00040000 #define FTHAI 0x00080000 #define FKANA 0x00100000 #define FCHINESE 0x00200000 // Simplified Chinese #define FHANGUL 0x00400000 #define FBIG5 0x00800000 // Traditional Chinese #define FMATHGENR 0x01000000 // Generic math #define FMATHITAL 0x02000000 // Math alphanumerics #define FMATHBOLD 0x04000000 #define FMATHSCRP 0x08000000 #define FMATHFRAK 0x10000000 #define FMATHOPEN 0x20000000 #define FMATHSANS 0x40000000 #define FMATHMONO 0x80000000 // Unicode-only character repertoires. If you add new repertoire flags, add // corresponding xxx_INDEX values in _w32sys.h and change CW32System:: // CharRepFontSig() and CW32System::FontSigFromCharRep(). #define FARMENIAN 0x0000000100000000 // 0x0530 - 0x058F #define FSYRIAC 0x0000000200000000 // 0x0700 - 0x074F #define FTHAANA 0x0000000400000000 // 0x0780 - 0x07BF #define FDEVANAGARI 0x0000000800000000 // 0x0900 - 0x097F #define FBENGALI 0x0000001000000000 // 0x0980 - 0x09FF #define FGURMUKHI 0x0000002000000000 // 0x0A00 - 0x0A7F #define FGUJARATI 0x0000004000000000 // 0x0A80 - 0x0AFF #define FORYIA 0x0000008000000000 // 0x0B00 - 0x0B7F #define FTAMIL 0x0000010000000000 // 0x0B80 - 0x0BFF #define FTELEGU 0x0000020000000000 // 0x0C00 - 0x0C7F #define FKANNADA 0x0000040000000000 // 0x0C80 - 0x0CFF #define FMALAYALAM 0x0000080000000000 // 0x0D00 - 0x0D7F #define FSINHALA 0x0000100000000000 // 0x0D80 - 0x0DFF #define FLAO 0x0000200000000000 // 0x0E80 - 0x0EFF #define FTIBETAN 0x0000400000000000 // 0x0F00 - 0x0FBF #define FMYANMAR 0x0000800000000000 // 0x1000 - 0x109F #define FGEORGIAN 0x0001000000000000 // 0x10A0 - 0x10FF #define FJAMO 0x0002000000000000 // 0x1100 - 0x11FF #define FETHIOPIC 0x0004000000000000 // 0x1200 - 0x137F #define FCHEROKEE 0x0008000000000000 // 0x13A0 - 0x13FF #define FABORIGINAL 0x0010000000000000 // 0x1400 - 0x167F #define FOGHAM 0x0020000000000000 // 0x1680 - 0x169F #define FRUNIC 0x0040000000000000 // 0x16A0 - 0x16F0 #define FKHMER 0x0080000000000000 // 0x1780 - 0x17FF #define FMONGOLIAN 0x0100000000000000 // 0x1800 - 0x18AF #define FBRAILLE 0x0200000000000000 // 0x2800 - 0x28FF #define FYI 0x0400000000000000 // 0xA000 - 0xA4CF // Keep next 4 in same order as FKANA - FBIG5 #define FJPN2 0x0800000000000000 // 0x20000 - 2FFFFF Japanese #define FCHS2 0x1000000000000000 // 0x20000 - 2FFFFF Simplified Chinese #define FKOR2 0x2000000000000000 // 0x20000 - 2FFFFF Korean #define FCHT2 0x4000000000000000 // 0x20000 - 2FFFFF Traditional Chinese #define FASCII (FASCIIUPR | FBELOWX40) #define FLATIN1 (FASCII | FHILATIN1) #define FLATIN (FHILATIN1 | FLATIN2 | FTURKISH | FBALTIC | FVIETNAMESE) #define FBIDI (FRTL | FARABIC | FHEBREW | FSYRIAC | FTHAANA | FDIGITSHAPE) #define FFE (FKANA | FCHINESE | FBIG5 | FHANGUL) #define FFE2 (FJPN2 | FCHS2 | FCHT2 | FKOR2) #define FMATH (FMATHGENR | FMATHITAL | FMATHBOLD | FMATHSCRP | FMATHFRAK | \ FMATHOPEN | FMATHSANS | FMATHMONO) #define FINDIC (FDEVANAGARI | FBENGALI | FGURMUKHI | FGUJARATI | FORYIA | \ FTAMIL | FTELEGU | FKANNADA | FMALAYALAM | FSINHALA) #define FABOVEX7FF (FTHAI | FFE | FOTHER | FINDIC | FLAO | FTIBETAN | FMYANMAR | \ FGEORGIAN | FJAMO | FETHIOPIC | FCHEROKEE | FABORIGINAL | \ FOGHAM | FRUNIC | FKHMER | FMONGOLIAN | FBRAILLE | FYI) #define FNEEDWORDBREAK FTHAI #define FNEEDCHARBREAK (FTHAI | FINDIC) #define FCOMPLEX_SCRIPT (FBIDI | FTHAI | FINDIC | FJAMO | FCOMBINING | FSURROGATE) #define RB_DEFAULT 0x00000000 // Perform default behavior #define RB_NOSELCHECK 0x00000001 // For OnTxRButtonUp, bypass pt in selection check #define RB_FORCEINSEL 0x00000002 // Force point into selection (used by keyboard // to get context menus) // Flags for OnTxLButtonUp #define LB_RELEASECAPTURE 0x00000001 // Force release mouse capture #define LB_FLUSHNOTIFY 0x00000002 // 1.0 mode force selection change notification // if selChange is cached enum AccentIndices { ACCENT_GRAVE = 1, ACCENT_ACUTE, ACCENT_CARET, ACCENT_TILDE, ACCENT_UMLAUT, ACCENT_CEDILLA }; #define KBD_CHAR 2 // Must be a bit value > 1 #define KBD_CTRL 4 // Must be a bit value > 2 #define KBD_NOAUTOCORRECT 8 // Must be a bit value > 4 // ================================== CTxtEdit ============================================ // Outer most class for a Text Control. class CTxtEdit : public ITextServices, public IRichEditOle, public ITextDocument2 { public: friend class CCallMgr; friend class CMagellanBMPStateWrap; CTxtEdit(ITextHost2 *phost, IUnknown *punkOuter); ~CTxtEdit (); // Initialization BOOL Init(const RECT *prcClient); // A helper function LONG GetTextLength() const {return _story.GetTextLength();} LONG GetAdjustedTextLength(); // Access to ActiveObject members IUnknown * GetPrivateIUnknown() { return &_unk; } CLightDTEngine *GetDTE() { return &_ldte; } IUndoMgr * GetUndoMgr() { return _pundo; } IUndoMgr * GetRedoMgr() { return _predo; } IUndoMgr * CreateUndoMgr(LONG cUndoLim, USFlags flags); CCallMgr * GetCallMgr() {Assert(_pcallmgr); return _pcallmgr;} static CHyphCache * GetHyphCache(void); CObjectMgr * GetObjectMgr(); // the callback is provided by the client // to help with OLE support BOOL HasObjects() {return _pobjmgr && _pobjmgr->GetObjectCount();} IRichEditOleCallback *GetRECallback() { return _pobjmgr ? _pobjmgr->GetRECallback() : NULL; } LRESULT HandleSetUndoLimit(LONG Count); LRESULT HandleSetTextMode(DWORD mode); LRESULT HandleSetTextFlow(DWORD mode); CCcs* GetCcs(const CCharFormat *const pCF, const LONG dvpInch, DWORD dwFlags = -1, HDC hdc = 0); CNotifyMgr * GetNotifyMgr(); CDetectURL * GetDetectURL() {return _pdetecturl;} CUniscribe * Getusp() const {return GetUniscribe();} #ifndef NOMAGELLAN CMagellan mouse; LRESULT HandleMouseWheel(WPARAM wparam, LPARAM lparam); #endif void AutoCorrect(CTxtSelection *psel, WCHAR ch, IUndoBuilder *publdr); // Misc helpers LONG GetAcpFromCp(LONG cp, BOOL fPrecise=0); LONG GetCpFromAcp(LONG acp, BOOL fPrecise=0); #ifndef NOANSIWINDOWS BOOL Get10Mode() const {return _f10Mode;} BOOL fUseCRLF() const {return _f10Mode;} BOOL fCpMap() const {return _f10Mode;} #else BOOL Get10Mode() const {return FALSE;} BOOL fUseCRLF() const {return FALSE;} BOOL fCpMap() const {return FALSE;} #endif LONG GetCpAccelerator() const {return _cpAccelerator;} short GetFreezeCount() const {return _cFreeze;} #ifndef NOWINDOWHOSTS BOOL fInOurHost() const {return _fInOurHost;} #else BOOL fInOurHost() const {return FALSE;} #endif BOOL fInHost2() const {return _fHost2;} BOOL fInplaceActive() const {return _fInPlaceActive;} BOOL fHideGridlines() const {return _fHideGridlines;} BOOL fHideSelection() const {return _fHideSelection;} BOOL fXltCRCRLFtoCR() const {return _fXltCRCRLFtoCR;} BOOL fUsePassword() const {return _fUsePassword;} BOOL FUseCustomTextOut() const {return !(_bTypography & TO_DISABLECUSTOMTEXTOUT);} BOOL fUseLineServices() const {return _bTypography & TO_ADVANCEDTYPOGRAPHY;} BOOL fUseSimpleLineBreak() const {return (_bTypography & TO_SIMPLELINEBREAK) != 0;} BOOL fUseObjectWrapping() const {return (_bTypography & TO_ADVANCEDLAYOUT) != 0;} #ifndef NOAUTOFONT BOOL IsAutoFont() const {return _fAutoFont;}; BOOL IsAutoKeyboard() const {return _fAutoKeyboard;}; BOOL IsAutoFontSizeAdjust() const{return _fAutoFontSizeAdjust;}; #else BOOL IsAutoFont() const {return FALSE;}; BOOL IsAutoKeyboard() const {return FALSE;}; BOOL IsAutoFontSizeAdjust() const{return FALSE;}; #endif BOOL IsBiDi() const {return (_qwCharFlags & FBIDI) != 0;} BOOL IsComplexScript() const {return (_qwCharFlags & FCOMPLEX_SCRIPT) != 0;} #ifndef NOFEPROCESSING BOOL IsFE() const {return (_qwCharFlags & FFE) != 0;} #else BOOL IsFE() const {return FALSE;} #endif BOOL IsInOutlineView() const {return _fOutlineView;} BOOL IsInPageView() const {return _fPageView;} BOOL IsMouseDown() const {return _fMouseDown;} #ifndef NOPLAINTEXT BOOL IsRich() const {return _fRich;} #else BOOL IsRich() const {return TRUE;} #endif BOOL IsLeftScrollbar() const; BOOL IsSelectionBarRight() const {return IsLeftScrollbar(); } void SetfSelChangeCharFormat() {_fSelChangeCharFormat = TRUE; } BOOL DelayChangeNotification() {return _f10DeferChangeNotify;} BOOL GetOOMNotified() {return _fOOMNotified;} void SetOOMNotified(BOOL ff) { Assert(ff == 1 || ff == 0); _fOOMNotified = ff; } //plain-text controls always use the UIFont bool fUseUIFont() const {return !_fRich || _fUIFont;} BOOL IsTransparent() {return _fTransparent;} LONG GetZoomNumerator() const {return _wZoomNumerator;} LONG GetZoomDenominator() const {return _wZoomDenominator;} void SetZoomNumerator(LONG x) {_wZoomNumerator = (WORD)x;} void SetZoomDenominator(LONG x) {_wZoomDenominator = (WORD)x;} LONG GetCpFirstStrong() {return _cpFirstStrong;} void SetReleaseHost(); QWORD GetCharFlags() const {return _qwCharFlags;} BOOL IsDocMoreThanLatin1Symbol() {return (GetCharFlags() & ~(FLATIN1 | FSYMBOL)) != 0;} void OrCharFlags(QWORD qwFlags, IUndoBuilder* publdr = NULL); void Beep(); void HandleKbdContextMenu(); void Set10Mode(); void SetContextDirection(BOOL fUseKbd = FALSE); void ItemizeDoc(IUndoBuilder* publdr = NULL, LONG cchRange = -1); HRESULT UpdateAccelerator(); HRESULT UpdateOutline(); HRESULT MoveSelection(LPARAM lparam, IUndoBuilder *publdr); HRESULT PopAndExecuteAntiEvent(IUndoMgr *pundomgr, void *pAE); BOOL InsertEOP(DWORD dwFlags, BOOL fShift, IUndoBuilder* publdr); HRESULT CutOrCopySelection(UINT msg, WPARAM wparam, LPARAM lparam, IUndoBuilder *publdr); HRESULT PasteDataObjectToRange( IDataObject *pdo, CTxtRange *prg, CLIPFORMAT cf, REPASTESPECIAL *rps, IUndoBuilder *publdr, DWORD dwFlags ); // Story access CTxtStory * GetTxtStory () {return &_story;} // Get access to cached CCharFormat and CParaFormat structures const CCharFormat* GetCharFormat(LONG iCF) {return _story.GetCharFormat(iCF);} const CParaFormat* GetParaFormat(LONG iPF) {return _story.GetParaFormat(iPF);} LONG Get_iCF() {return _story.Get_iCF();} LONG Get_iPF() {return _story.Get_iPF();} void Set_iCF(LONG iCF) {_story.Set_iCF(iCF);} void Set_iPF(LONG iPF) {_story.Set_iPF(iPF);} HRESULT HandleStyle(CCharFormat *pCFTarget, const CCharFormat *pCF, DWORD dwMask, DWORD dwMask2); HRESULT HandleStyle(CParaFormat *pPFTarget, const CParaFormat *pPF, DWORD dwMask, DWORD dwMask2); // Get host interface pointer ITextHost2 *GetHost() {return _phost;} // Helper for getting CDocInfo ptr and creating it if NULL CDocInfo * GetDocInfo(); CDocInfo * GetDocInfoNC() {return _pDocInfo;} HRESULT InitDocInfo(); LONG GetBackgroundType(); LONG GetDefaultTab() {return _pDocInfo ? _pDocInfo->_dwDefaultTabStop : lDefaultTab;}; HRESULT SetDefaultLCID (LCID lcid); HRESULT GetDefaultLCID (LCID *pLCID); HRESULT SetDefaultLCIDFE (LCID lcid); HRESULT GetDefaultLCIDFE (LCID *pLCID); HRESULT SetDocumentType (LONG DocType); HRESULT GetDocumentType (LONG *pDocType); HRESULT GetFollowingPunct(LPSTR *plpstrFollowingPunct); HRESULT SetFollowingPunct(LPSTR lpstrFollowingPunct); HRESULT GetLeadingPunct (LPSTR *plpstrLeadingPunct); HRESULT SetLeadingPunct (LPSTR lpstrLeadingPunct); HRESULT GetViewKind (LRESULT *plres); HRESULT SetViewKind (long Value); HRESULT GetViewScale (long *pValue); HRESULT SetViewScale (long Value); // Notification Management Methods. In principle, these methods // could form a separate class, but for space savings, they are part // of the CTxtEdit class HRESULT TxNotify(DWORD iNotify, void *pv); //@cmember General-purpose // notification void SendScrollEvent(DWORD iNotify); //@cmember Send scroll // event void SendUpdateEvent(); //@cmember Send EN_UPDATE // event //@cmember Use EN_PROTECTED BOOL QueryUseProtection( CTxtRange *prg, // to query protection UINT msg,WPARAM wparam, LPARAM lparam);// usage //@cmember Indicates whether // protection checking enabled BOOL IsProtectionCheckingEnabled() {return !!(_dwEventMask & ENM_PROTECTED);} // FUTURE (alexgo): maybe we can use just one method :-) BOOL IsntProtectedOrReadOnly(UINT msg, WPARAM wparam, LPARAM lparam, BOOL fBeep = TRUE); BOOL IsProtected(UINT msg, WPARAM wparam, LPARAM lparam); BOOL IsProtectedRange(UINT msg, WPARAM wparam, LPARAM lparam, CTxtRange *prg); void SetStreaming(BOOL flag) {_fStreaming = flag;} BOOL IsStreaming() {return _fStreaming;} DWORD GetEventMask(){return _dwEventMask;}//@cmember Get event mask //@cmember Handles EN_LINK BOOL HandleLinkNotification(UINT msg, WPARAM wparam, LPARAM lparam, BOOL *pfInLink = NULL); BOOL HandleLowFiRTF(char *szControl); //@cmember Handles EN_LOWFIRTF HRESULT CloseFile (BOOL bSave); // Helper for determine when to load message filter BOOL LoadMsgFilter (UINT msg, WPARAM wparam, LPARAM lparam); #ifndef NOINKOBJECT // Helper function to setup ink object properties HRESULT SetInkProps( LONG cp, ILineInfo *pILineInfo, UINT *piInkWidth ); #endif LONG GetCaretWidth(); //-------------------------------------------------------------- // Inline proxies to ITextHost methods //-------------------------------------------------------------- // Persisted properties (persisted by the host) // Get methods: called by the Text Services component to get // the value of a given persisted property // FUTURE (alexgo) !! some of these need to get cleaned up BOOL TxGetAutoSize() const; BOOL TxGetAutoWordSel() const; COLORREF TxGetBackColor() const; TXTBACKSTYLE TxGetBackStyle() const; HRESULT TxGetDefaultCharFormat(CCharFormat *pCF, DWORD &dwMask); void TxGetClientRect(RECTUV *prc) const; void TxGetClientRect(LPRECT prc) const {_phost->TxGetClientRect(prc);} HRESULT TxGetExtent(SIZEL *psizelExtents) {return _phost->TxGetExtent(psizelExtents);} COLORREF TxGetForeColor() const {return _phost->TxGetSysColor(COLOR_WINDOWTEXT);} DWORD TxGetMaxLength() const; void TxSetMaxToMaxText(LONG cExtra = 0); BOOL TxGetModified() const {return _fModified;} HRESULT TxGetDefaultParaFormat(CParaFormat *pPF); TCHAR TxGetPasswordChar() const; BOOL TxGetReadOnly() const {return _fReadOnly;} BOOL TxGetSaveSelection() const; DWORD TxGetScrollBars() const ; LONG TxGetSelectionBarWidth() const; void TxGetViewInset(RECTUV *prc, CDisplay const *pdp) const; BOOL TxGetWordWrap() const; BOOL TxClientToScreen (LPPOINT lppt) {return _phost->TxClientToScreen(lppt); } BOOL TxScreenToClient (LPPOINT lppt) {return _phost->TxScreenToClient(lppt); } // ITextHost 2 wrappers BOOL TxIsDoubleClickPending(); HRESULT TxGetWindow(HWND *phwnd); HRESULT TxSetForegroundWindow(); HPALETTE TxGetPalette(); HRESULT TxGetFEFlags(LONG *pFEFlags); HCURSOR TxSetCursor(HCURSOR hcur, BOOL fText = FALSE); // Allowed only when in in-place // The host will fail if not in-place HDC TxGetDC() {return _phost->TxGetDC();} INT TxReleaseDC(HDC hdc) {return _phost->TxReleaseDC(hdc);} // Helper functions for metafile support INT TxReleaseMeasureDC( HDC hMeasureDC ); void TxUpdateWindow() { _phost->TxViewChange(_fInPlaceActive ? TRUE : FALSE); } void TxScrollWindowEx (INT dx, INT dy, LPCRECT lprcScroll, LPCRECT lprcClip); void TxSetCapture(BOOL fCapture) {_phost->TxSetCapture(fCapture);} void TxSetFocus() {_phost->TxSetFocus();} // Allowed any-time BOOL TxShowScrollBar(INT fnBar, BOOL fShow); BOOL TxEnableScrollBar (INT fuSBFlags, INT fuArrowFlags); BOOL TxSetScrollRange(INT fnBar, LONG nMinPos, INT nMaxPos, BOOL fRedraw); BOOL TxSetScrollPos (INT fnBar, INT nPos, BOOL fRedraw); void TxInvalidate() {TxInvalidateRect((RECT*)NULL);} void TxInvalidateRect(const RECT* prc); void TxInvalidateRect(const RECTUV* prc); BOOL TxCreateCaret(HBITMAP hbmp, INT xWidth, INT yHeight) {return _phost->TxCreateCaret(hbmp, xWidth, yHeight);} BOOL TxShowCaret(BOOL fShow) {return _phost->TxShowCaret(fShow);} BOOL TxSetCaretPos(INT u, INT v); BOOL TxSetTimer(UINT idTimer, UINT uTimeout) {return _phost->TxSetTimer(idTimer, uTimeout);} void TxKillTimer(UINT idTimer) {_phost->TxKillTimer(idTimer);} COLORREF TxGetSysColor(int nIndex){ return _phost->TxGetSysColor(nIndex);} int TxWordBreakProc(TCHAR* pch, INT ich, INT cb, INT action, LONG cpStart, LONG cp = -1); // IME HIMC TxImmGetContext() {return _phost->TxImmGetContext();} void TxImmReleaseContext(HIMC himc) {_phost->TxImmReleaseContext( himc );} // Selection access CTxtSelection *GetSel(); CTxtSelection *GetSelNC() { return _psel; } LONG GetSelMin() const; LONG GetSelMost() const; void GetSelRangeForRender(LONG *pcpSelMin, LONG *pcpSelMost); void DiscardSelection(); // Property Change Helpers HRESULT OnRichEditChange(BOOL fFlag); HRESULT OnTxMultiLineChange(BOOL fMultiLine); HRESULT OnTxReadOnlyChange(BOOL fReadOnly); HRESULT OnShowAccelerator(BOOL fPropertyFlag); HRESULT OnUsePassword(BOOL fPropertyFlag); HRESULT OnTxHideSelectionChange(BOOL fHideSelection); HRESULT OnSaveSelection(BOOL fPropertyFlag); HRESULT OnTxVerticalChange(BOOL fVertical); HRESULT OnAutoWordSel(BOOL fPropertyFlag); HRESULT NeedViewUpdate(BOOL fPropertyFlag); HRESULT OnWordWrapChange(BOOL fPropertyFlag); HRESULT OnAllowBeep(BOOL fPropertyFlag); HRESULT OnDisableDrag(BOOL fPropertyFlag); HRESULT OnTxBackStyleChange(BOOL fPropertyFlag); HRESULT OnMaxLengthChange(BOOL fPropertyFlag); HRESULT OnCharFormatChange(BOOL fPropertyFlag); HRESULT OnParaFormatChange(BOOL fPropertyFlag); HRESULT OnClientRectChange(BOOL fPropertyFlag); HRESULT OnScrollChange(BOOL fProperyFlag); HRESULT OnSetTypographyOptions(WPARAM wparam, LPARAM lparam); HRESULT OnHideSelectionChange(BOOL fHideSelection); // Helpers HRESULT TxCharFromPos(LPPOINT ppt, LRESULT *pacp); HRESULT OnTxUsePasswordChange(BOOL fUsePassword); HRESULT FormatAndPrint( HDC hdcDraw, HDC hicTargetDev, DVTARGETDEVICE *ptd, RECT *lprcBounds, RECT *lprcWBounds); // // PUBLIC INTERFACE METHODS // // ----------------------------- // IUnknown interface // ----------------------------- virtual HRESULT WINAPI QueryInterface(REFIID riid, void **ppvObject); virtual ULONG WINAPI AddRef(void); virtual ULONG WINAPI Release(void); //-------------------------------------------------------------- // ITextServices methods //-------------------------------------------------------------- //@cmember Generic Send Message interface virtual HRESULT TxSendMessage( UINT msg, WPARAM wparam, LPARAM lparam, LRESULT *plresult); //@cmember Rendering virtual HRESULT TxDraw( DWORD dwDrawAspect, // draw aspect LONG lindex, // currently unused void * pvAspect, // info for drawing // optimizations (OCX 96) DVTARGETDEVICE * ptd, // information on target // device ' HDC hdcDraw, // rendering device context HDC hicTargetDev, // target information // context LPCRECTL lprcBounds, // bounding (client) // rectangle LPCRECTL lprcWBounds, // clipping rect for // metafiles LPRECT lprcUpdate, // dirty rectange insde // lprcBounds BOOL (CALLBACK * pfnContinue) (DWORD), // for // interupting DWORD dwContinue, // long displays (currently // unused) LONG lViewID); // Specifies view to redraw //@cmember Horizontal scrollbar support virtual HRESULT TxGetHScroll( LONG *plMin, LONG *plMax, LONG *plPos, LONG *plPage, BOOL * pfEnabled ); //@cmember Horizontal scrollbar support virtual HRESULT TxGetVScroll( LONG *plMin, LONG *plMax, LONG *plPos, LONG *plPage, BOOL * pfEnabled ); //@cmember Setcursor virtual HRESULT OnTxSetCursor( DWORD dwDrawAspect, // draw aspect LONG lindex, // currently unused void * pvAspect, // info for drawing // optimizations (OCX 96) DVTARGETDEVICE * ptd, // information on target // device ' HDC hdcDraw, // rendering device context HDC hicTargetDev, // target information // context LPCRECT lprcClient, INT x, INT y); //@cmember Hit-test virtual HRESULT TxQueryHitPoint( DWORD dwDrawAspect, // draw aspect LONG lindex, // currently unused void * pvAspect, // info for drawing // optimizations (OCX 96) DVTARGETDEVICE * ptd, // information on target // device ' HDC hdcDraw, // rendering device context HDC hicTargetDev, // target information // context LPCRECT lprcClient, INT x, INT y, DWORD * pHitResult); //@member Inplace activate notification virtual HRESULT OnTxInPlaceActivate(const RECT *prcClient); //@member Inplace deactivate notification virtual HRESULT OnTxInPlaceDeactivate(); //@member UI activate notification virtual HRESULT OnTxUIActivate(); //@member UI deactivate notification virtual HRESULT OnTxUIDeactivate(); //@member Get text in control virtual HRESULT TxGetText(BSTR *pbstrText); //@member Set text in control virtual HRESULT TxSetText(LPCTSTR pszText); //@member Get x position of virtual HRESULT TxGetCurTargetX(LONG *); //@member Get baseline position virtual HRESULT TxGetBaseLinePos(LONG *); //@member Get Size to fit / Natural size virtual HRESULT TxGetNaturalSize( DWORD dwAspect, HDC hdcDraw, HDC hicTargetDev, DVTARGETDEVICE *ptd, DWORD dwMode, const SIZEL *psizelExtent, LONG *pwidth, LONG *pheight); //@member Drag & drop virtual HRESULT TxGetDropTarget( IDropTarget **ppDropTarget ); //@member Bulk bit property change notifications virtual HRESULT OnTxPropertyBitsChange(DWORD dwMask, DWORD dwBits); //@cmember Fetch the cached drawing size virtual HRESULT TxGetCachedSize(DWORD *pdupClient, DWORD *pdvpClient); // IDispatch methods STDMETHOD(GetTypeInfoCount)( UINT * pctinfo); STDMETHOD(GetTypeInfo)( UINT itinfo, LCID lcid, ITypeInfo **pptinfo); STDMETHOD(GetIDsOfNames)( REFIID riid, OLECHAR **rgszNames, UINT cNames, LCID lcid, DISPID * rgdispid); STDMETHOD(Invoke)( DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS * pdispparams, VARIANT * pvarResult, EXCEPINFO * pexcepinfo, UINT * puArgErr); // ITextDocument2 methods STDMETHOD(GetName)(BSTR *pName); STDMETHOD(GetSelection)(ITextSelection **ppSel); STDMETHOD(GetStoryCount)(long *pCount); STDMETHOD(GetStoryRanges)(ITextStoryRanges **ppStories); STDMETHOD(GetSaved)(long *pValue); STDMETHOD(SetSaved)(long Value); STDMETHOD(GetDefaultTabStop)(float *pValue); STDMETHOD(SetDefaultTabStop)(float Value); STDMETHOD(New)(); STDMETHOD(Open)(VARIANT *pVar, long Flags, long CodePage); STDMETHOD(Save)(VARIANT *pVar, long Flags, long CodePage); STDMETHOD(Freeze)(long *pCount); STDMETHOD(Unfreeze)(long *pCount); STDMETHOD(BeginEditCollection)(); STDMETHOD(EndEditCollection)(); STDMETHOD(Undo)(long Count, long *prop); STDMETHOD(Redo)(long Count, long *prop); STDMETHOD(Range)(long cpFirst, long cpLim, ITextRange ** ppRange); STDMETHOD(RangeFromPoint)(long x, long y, ITextRange **ppRange); STDMETHOD(AttachMsgFilter)(IUnknown *pFilter); STDMETHOD(GetEffectColor)( long Index, COLORREF *pcr); STDMETHOD(SetEffectColor)( long Index, COLORREF cr); STDMETHOD(GetCaretType)( long *pCaretType); STDMETHOD(SetCaretType)( long CaretType); STDMETHOD(GetImmContext)( long *pContext); STDMETHOD(ReleaseImmContext)( long Context); STDMETHOD(GetPreferredFont)( long cp, long CodePage, long lOption, long curCodepage, long curFontSize, BSTR *pFontName, long *pPitchAndFamily, long *pNewFontSize); STDMETHOD(GetNotificationMode)( long *plMode); STDMETHOD(SetNotificationMode)( long lMode); STDMETHOD(GetClientRect)( long Type, long *pLeft, long *pTop, long *pRight, long *pBottom); STDMETHOD(GetSelectionEx)(ITextSelection **ppSel); STDMETHOD(GetWindow)( long *phWnd ); STDMETHOD(GetFEFlags)( long *pFlags ); STDMETHOD(UpdateWindow)( void ); STDMETHOD(CheckTextLimit)( long cch, long *pcch ); STDMETHOD(IMEInProgress)( long lMode ); STDMETHOD(SysBeep)( void ); STDMETHOD(Update)( long lMode ); STDMETHOD(Notify)( long lNotify ); STDMETHOD(GetDocumentFont)( ITextFont **ppITextFont ); STDMETHOD(GetDocumentPara)( ITextPara **ppITextPara ); STDMETHOD(GetCallManager)( IUnknown **ppVoid ); STDMETHOD(ReleaseCallManager)( IUnknown *pVoid ); // IRichEditOle methods STDMETHOD(GetClientSite) ( LPOLECLIENTSITE *lplpolesite); STDMETHOD_(LONG,GetObjectCount) (THIS); STDMETHOD_(LONG,GetLinkCount) (THIS); STDMETHOD(GetObject) ( LONG iob, REOBJECT *lpreobject, DWORD dwFlags); STDMETHOD(InsertObject) ( REOBJECT *lpreobject); STDMETHOD(ConvertObject) ( LONG iob, REFCLSID rclsidNew, LPCSTR lpstrUserTypeNew); STDMETHOD(ActivateAs) ( REFCLSID rclsid, REFCLSID rclsidAs); STDMETHOD(SetHostNames) ( LPCSTR lpstrContainerApp, LPCSTR lpstrContainerObj); STDMETHOD(SetLinkAvailable) ( LONG iob, BOOL fAvailable); STDMETHOD(SetDvaspect) ( LONG iob, DWORD dvaspect); STDMETHOD(HandsOffStorage) ( LONG iob); STDMETHOD(SaveCompleted) ( LONG iob, LPSTORAGE lpstg); STDMETHOD(InPlaceDeactivate) (THIS); STDMETHOD(ContextSensitiveHelp) ( BOOL fEnterMode); STDMETHOD(GetClipboardData) ( CHARRANGE *lpchrg, DWORD reco, LPDATAOBJECT *lplpdataobj); STDMETHOD(ImportDataObject) ( LPDATAOBJECT lpdataobj, CLIPFORMAT cf, HGLOBAL hMetaPict); private: // Get/Set text helpers LONG GetTextRange(LONG cpFirst, LONG cch, TCHAR *pch); LONG GetTextEx(GETTEXTEX *pgt, TCHAR *pch); LONG GetTextLengthEx(GETTEXTLENGTHEX *pgtl); //-------------------------------------------------------------- // WinProc dispatch methods // Internally called by the WinProc //-------------------------------------------------------------- // Keyboard HRESULT OnTxKeyDown (WORD vkey, DWORD dwFlags, IUndoBuilder *publdr); HRESULT OnTxChar (DWORD vkey, DWORD dwFlags, IUndoBuilder *publdr); HRESULT OnTxSysChar (WORD vkey, DWORD dwFlags, IUndoBuilder *publdr); HRESULT OnTxSysKeyDown (WORD vkey, DWORD dwFlags, IUndoBuilder *publdr); HRESULT OnTxSpecialKeyDown(WORD vkey, DWORD dwFlags, IUndoBuilder *publdr); // Mouse HRESULT OnTxLButtonDblClk(INT x, INT y, DWORD dwFlags); HRESULT OnTxLButtonDown (INT x, INT y, DWORD dwFlags); HRESULT OnTxLButtonUp (INT x, INT y, DWORD dwFlags, int ffOptions); HRESULT OnTxRButtonDown (INT x, INT y, DWORD dwFlags); HRESULT OnTxRButtonUp (INT x, INT y, DWORD dwFlags, int ffOptions); HRESULT OnTxMouseMove (INT x, INT y, DWORD dwFlags, IUndoBuilder *publdr); HRESULT OnTxMButtonDown (INT x, INT y, DWORD dwFlags); HRESULT OnTxMButtonUp (INT x, INT y, DWORD dwFlags); // Timer HRESULT OnTxTimer(UINT idTimer); void CheckInstallContinuousScroll (); void CheckRemoveContinuousScroll (); // Scrolling HRESULT TxLineScroll(LONG cli, LONG cach); // Magellan mouse scrolling BOOL StopMagellanScroll(); // Paint, size message LRESULT OnSize(HWND hwnd, WORD fwSizeType, int nWidth, int nHeight); // Selection commands LRESULT OnGetSelText(TCHAR *psz); LRESULT OnGetSel(LONG *pacpMin, LONG *pacpMost); LRESULT OnSetSel(LONG acpMin, LONG acpMost); void OnExGetSel(CHARRANGE *pcr); // Editing commands void OnClear(IUndoBuilder *publdr); // Format range related commands LRESULT OnFormatRange(FORMATRANGE *pfr, SPrintControl prtcon, BOOL fSetupDC = FALSE); BOOL OnDisplayBand(const RECT *prcView, BOOL fPrintFromDraw); // Scrolling commands void OnScrollCaret(); // Focus messages LRESULT OnSetFocus(); LRESULT OnKillFocus(); // System notifications HRESULT OnContextMenu(LPARAM lparam); // Get/Set other properties commands LRESULT OnFindText(UINT msg, DWORD flags, FINDTEXTEX *pftex); LRESULT OnSetWordBreakProc(); // Richedit stuff LRESULT OnGetCharFormat(CHARFORMAT2 *pCF2, DWORD dwFlags); LRESULT OnGetParaFormat(PARAFORMAT2 *pPF2, DWORD dwFlags); LRESULT OnSetCharFormat(WPARAM wparam, CCharFormat *pCF, IUndoBuilder *publdr, DWORD dwMask, DWORD dwMask2); LRESULT OnSetParaFormat(WPARAM wparam, CParaFormat *pPF, IUndoBuilder *publdr, DWORD dwMask, DWORD dwMask2); LRESULT OnSetFont(HFONT hfont); LRESULT OnSetFontSize(LONG yPoint, DWORD dwFlags, IUndoBuilder *publdr); LRESULT OnDropFiles(HANDLE hDropFiles); LRESULT OnGetAssociateFont(CHARFORMAT2 *pCF, DWORD dwFlags); LRESULT OnSetAssociateFont(CHARFORMAT2 *pCF, DWORD dwFlags); // Other services HRESULT TxPosFromChar(LONG acp, LPPOINT ppt); HRESULT TxGetLineCount(LRESULT *plres); HRESULT TxLineFromCp(LONG acp, LRESULT *plres); HRESULT TxLineLength(LONG acp, LRESULT *plres); HRESULT TxLineIndex (LONG ili, LRESULT *plres); HRESULT TxFindText(DWORD flags, LONG acpMin, LONG acpMost, const WCHAR *pch, LONG *pacpMin, LONG *pacpMost); HRESULT TxFindWordBreak(INT nFunction, LONG acp, LRESULT *plres); HRESULT SetText(LPCWSTR pwszText, DWORD flags, LONG CodePage, IUndoBuilder *publdr = NULL, LRESULT *plres = NULL); LONG GetDefaultCodePage(UINT msg); HRESULT OnInsertTable(TABLEROWPARMS *ptrp, TABLECELLPARMS *pclp, IUndoBuilder *publdr); // Other miscelleneous #if defined(DEBUG) && !defined(NOFULLDEBUG) void OnDumpPed(); #endif COleObject * ObjectFromIOB(LONG iob); // Only when the selection is going away should this value be NULLed. We // use SelectionNull function rather than CTxtSelection::~CTxtSelection // to avoid circular dependencies. friend void SelectionNull(CTxtEdit *ped); void SetSelectionToNull() {if(_fFocus) DestroyCaret(); _psel = NULL; } // Helper for converting a rich text object to plain text. void HandleRichToPlainConversion(); // Helper for clearing the undo buffers. void ClearUndo(IUndoBuilder *publdr); // Helper for setting the automatic EOP void SetRichDocEndEOP(LONG cchToReplace); LRESULT CTxtEdit::InsertFromFile ( LPCTSTR lpFile ); // // Data Members // public: static DWORD _dwTickDblClick; // time of last double-click static POINT _ptDblClick; // position of last double-click static HCURSOR _hcurArrow; // static HCURSOR _hcurCross; // OutlineSymbol drag not impl static HCURSOR _hcurHand; static HCURSOR _hcurIBeam; static HCURSOR _hcurItalic; static HCURSOR _hcurSelBar; static HCURSOR _hcurVIBeam; static HCURSOR _hcurVItalic; typedef HRESULT (CTxtEdit::*FNPPROPCHG)(BOOL fPropFlag); static FNPPROPCHG _fnpPropChg[MAX_PROPERTY_BITS]; QWORD _qwCharFlags;// Char flags for text in control // Only wrapper functions should use this member... ITextHost2* _phost; // host // word break procedure EDITWORDBREAKPROC _pfnWB; // word break procedure // display subsystem CDisplay * _pdp; // display CDisplayPrinter * _pdpPrinter;// display for printer // undo IUndoMgr * _pundo; // the undo stack IUndoMgr * _predo; // the redo stack // data transfer CLightDTEngine _ldte; // the data transfer engine CNotifyMgr _nm; // the notification manager (for floating // OLE support CObjectMgr * _pobjmgr; // handles most high-level OLE stuff // Re-entrancy && Notification Management CCallMgr * _pcallmgr; // URL detection CDetectURL * _pdetecturl;// manages auto-detection of URL strings CDocInfo * _pDocInfo; // Document info (name, flags, code page) CTxtBreaker * _pbrk; // text-breaker object DWORD _dwEventMask; // Event mask union { DWORD _dwFlags; // All together now struct { #define TXTBITS (TXTBIT_RICHTEXT | \ TXTBIT_READONLY | \ TXTBIT_USEPASSWORD | \ TXTBIT_HIDESELECTION | \ TXTBIT_VERTICAL | \ TXTBIT_ALLOWBEEP | \ TXTBIT_DISABLEDRAG ) // State information. Flags in TXTBITS must appear in same bit // positions as the following (saves code in Init()) // TXTBIT_RICHTEXT 0 _fRich // TXTBIT_MULTILINE 1 // TXTBIT_READONLY 2 _fReadOnly // TXTBIT_SHOWACCELERATOR 3 // TXTBIT_USEPASSWORD 4 _fUsePassword // TXTBIT_HIDESELECTION 5 _fHideSelection // TXTBIT_SAVESELECTION 6 // TXTBIT_AUTOWORDSEL 7 // TXTBIT_VERTICAL 8 // TXTBIT_SELECTIONBAR 9 // TXTBIT_WORDWRAP 10 // TXTBIT_ALLOWBEEP 11 _fAllowBeep // TXTBIT_DISABLEDRAG 12 _fDisableDrag // TXTBIT_VIEWINSETCHANGE 13 // TXTBIT_BACKSTYLECHANGE 14 // TXTBIT_MAXLENGTHCHANGE 15 // TXTBIT_SCROLLBARCHANGE 16 // TXTBIT_CHARFORMATCHANGE 17 // TXTBIT_PARAFORMATCHANGE 18 // TXTBIT_EXTENTCHANGE 19 // TXTBIT_CLIENTRECTCHANGE 20 DWORD _fRich :1; // 0: Use rich-text formatting DWORD _fCapture :1; // 1: Control has mouse capture DWORD _fReadOnly :1; // 2: Control is read only DWORD _fInPlaceActive :1; // 3: Control is in place active DWORD _fUsePassword :1; // 4: Whether to use password char DWORD _fHideSelection :1; // 5: Hide selection when inactive DWORD _fOverstrike :1; // 6: Overstrike mode vs insert mode DWORD _fFocus :1; // 7: Control has keyboard focus DWORD _fEatLeftDown :1; // 8: Eat the next left down? DWORD _fMouseDown :1; // 9: One mouse button is current down DWORD _fTransparent :1; // 10: Background transparency DWORD _fAllowBeep :1; // 11: Allow beep at doc boundaries DWORD _fDisableDrag :1; // 12: Disable Drag DWORD _fIconic :1; // 13: Control/parent window is iconized DWORD _fModified :1; // 14: Control text has been modified DWORD _fScrollCaretOnFocus:1; // 15: Scroll caret into view on set focus DWORD _fStreaming :1; // 16: Currently streaming text in or out DWORD _fWantDrag :1; // 17: Want to initiate drag & drop DWORD _fRichPrevAccel :1; // 18: Rich state previous to accelerator // Miscellaneous bits DWORD _f10Mode :1; // 19: Use Richedit10 behavior DWORD _fUseUndo :1; // 20: Only set to zero if undo limit is 0 // Font binding (see also _fAutoFontSizeAdjust) DWORD _fAutoFont :1; // 21: auto switching font DWORD _fAutoKeyboard :1; // 22: auto switching keyboard DWORD _fContinuousScroll :1; // 23: Timer runs to support scrolling DWORD _fMButtonCapture :1; // 24: captured mButton down DWORD _fHost2 :1; // 25: TRUE iff _phost is a phost2 DWORD _fSaved :1; // 26: ITextDocument Saved property DWORD _fInOurHost :1; // 27: Whether we are in our host DWORD _fCheckAIMM :1; // 28: if FALSE check if client has loaded AIMM DWORD _fKoreanBlockCaret :1; // 29: Display Korean block caret during Kor IME // Drag/Drop UI refinement. DWORD _fDragged :1; // 30: Was the selection actually dragged? DWORD _fUpdateSelection :1; // 31: If true, update sel at level 0 }; }; #define CD_LTR 2 #define CD_RTL 3 WORD _nContextDir :2; // 0: no context; else CD_LTR or CD_RTL WORD _nContextAlign :2; // Current context alignment; default CTX_NONE WORD _fNeutralOverride :1; // Override direction of neutrals for layout WORD _fSuppressNotify :1; // Don't send SelChange Notification if True WORD _cActiveObjPosTries :2; // Counter protecting against infinite repaint // loop when trying to put dragged-away // in-place active object where it belongs WORD _fSingleCodePage :1; // If TRUE, only allow single code page // (currently doesn't check streaming...) WORD _fSelfDestruct :1; // This CTxtEdit is selfdestructing WORD _fAutoFontSizeAdjust:1; // Auto switching font size adjust // Miscellaneous bits used for BiDi input WORD _fHbrCaps :1; // Initialization of state of hebrew and caps lock status WORD _fActivateKbdOnFocus:1; // Activate new kbd layout on WM_SETFOCUS WORD _fOutlineView :1; // Outline view is active WORD _fPageView :1; // Page view is active // More IME bit WORD _fIMEInProgress :1; // TRUE if IME composition is in progress WORD _ClipboardFormat :5; // Last clipboard format used (see EN_CLIPFORMAT) // Shutdown bit WORD _fReleaseHost :1; // TRUE if edit control needs to release host in // edit control destructor. WORD _fOOMNotified :1; // flag determining if a OOM notification was already sent WORD _fDualFont :1; // Dual font support for FE typing // Default = TRUE WORD _fUIFont :1; // If TRUE, use UI font WORD _fItemizePending :1; // Updated range hasn't been itemized WORD _fSelChangeCharFormat :1; // TRUE if the selection has been used to change // the character format of a specific set of // characters. The purpose of this has to do with // maintaining the illusion of having a default // charformat on machines whose default language // is a complex script i.e. Arabic. The idea is // that all EM_SETCHARFORMAT messages that would // just update the default format, are converted // to SCF_ALL so that all the text has the change // applied to it. Bug 5462 caused this change. // (a-rsail). WORD _fExWordBreakProc :1; // detemines which WordbreakProc Callback to use // Extended or regular WORD _f10DeferChangeNotify :1; // 1.0 mode immulation, defer selection change // notification until the mouse is up union { DWORD _dwEditStyle; struct { DWORD _fSystemEditMode :1; // 1: Behave more like sys edit DWORD _fSystemEditBeep :1; // 2: Beep when system edit does DWORD _fExtendBackColor :1; // 4: Extend BkClr to margin DWORD _fUnusedEditStyle1 :1; // 8: SES_MAPCPS not used DWORD _fUnusedEditStyle2 :1; // 16: SES_EMULATE10 not used DWORD _fUnusedEditStyle3 :1; // 32: SES_USECRLF not used DWORD _fUnusedEditStyle4 :1; // 64: SES_USEAIMM handled in cmsgflt DWORD _fUnusedEditStyle5 :1; // 128: SES_NOIME handled in cmsgflt DWORD _fUnusedEditStyle6 :1; // 256: SES_ALLOWBEEPS not used DWORD _fUpperCase :1; // 512: Convert all input to upper case DWORD _fLowerCase :1; // 1024: Convert all input to lower case DWORD _fNoInputSequenceChk:1; // 2048: Disable ISCheck DWORD _fBiDi :1; // 4096: Set Bidi document DWORD _fScrollCPOnKillFocus:1;// 8192: Scroll to cp=0 upon Kill focus DWORD _fXltCRCRLFtoCR :1; // 16384: Translate CRCRLF to CR instead of ' ' DWORD _fDraftMode :1; // 32768: Use draftmode fonts DWORD _fUseCTF :1; // 0x010000: SES_USECTF handled in cmsgflt DWORD _fHideGridlines :1; // 0x020000: if 0-width gridlines not displayed DWORD _fUseAtFont :1; // 0x040000: use @ font DWORD _fCustomLook :1; // 0x080000: use new look DWORD _fLBScrollNotify :1; // 0x100000: REListbox - notify before/after scroll window }; }; void (WINAPI* _pfnHyphenate)(WCHAR*, LANGID, long, HYPHRESULT*); SHORT _dulHyphenateZone; // Hyphenation zone ITextMsgFilter * _pMsgFilter; // Pointer to message filter. #ifndef NOPRIVATEMESSAGE CMsgCallBack * _pMsgCallBack; CTextNotify * _pMsgNotify; #endif private: SHORT _cpAccelerator; // Range for accelerator BYTE _bTypography; // Typography options BYTE _bMouseFlags; // CTRL, Mouse buttons, SHIFT SHORT _cFreeze; // Freeze count WORD _wZoomNumerator; WORD _wZoomDenominator; // Have to have mouse point on a per-instance basis to handle // simultaneous scrolling of two or more controls. // TODO: convert this back to DWORD from whence it came (lparam) POINT _mousePt; // Last known mouse position. // NOTE: the int's can be switched to SHORTs, since pixels are used and // 32768 pixels is a mighty big screen! DWORD _cchTextMost; // Maximum allowed text LONG _cpFirstStrong; // cp of first strong directional character. // used for plain text controls whose direcitonality // depends on text input into the control. friend class CRchTxtPtr; IUnknown * _punk; // IUnknown to use class CUnknown : public IUnknown { friend class CCallMgr; private: DWORD _cRefs; // Reference count public: void Init() {_cRefs = 1; } HRESULT WINAPI QueryInterface(REFIID riid, void **ppvObj); ULONG WINAPI AddRef(); ULONG WINAPI Release(); }; friend class CUnknown; CUnknown _unk; // Object that implements IUnknown CTxtStory _story; CTxtSelection * _psel; // Selection object }; extern const COLORREF g_Colors[]; class CCellColor { public: COLORREF _crCellCustom1; // Custom color 1 COLORREF _crCellCustom2; // Custom color 2 CCellColor() {_crCellCustom1 = _crCellCustom2 = 0;} LONG GetColorIndex(COLORREF cr); }; #endif