/* _EDIT.H * * Purpose: * Base classes for rich-text manipulation * * Authors: * Christian Fortini * Murray Sargent (and many others) * * Copyright (c) 1995-1998, 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" // 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; // 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 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 CDocInfo() {InitDocInfo();} // constructor ~CDocInfo(); // destructor void InitDocInfo(); }; 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; DWORD GetCharFlags(DWORD ch, BYTE bDefaultCharset = 0); CUniscribe* GetUniscribe(void); #define fBIDI 1 #define fDIGITSHAPE 2 #define fSURROGATE 0x00000010 // (0x10 - 0x80 No fontbind supported) #define fUNIC_CTRL 0x00000020 /* The font signature low DWORD has the bit definitions (note: SDK 98 has Thai - Chinese off by one bit compared to FS_xxx defs in wingdi.h) 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, 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 _dwCharFlags */ #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 fARMENIAN 0x00020000 #define fOEM 0x00040000 #define fCOMBINING 0x00080000 #define fASCIIUPR 0x00100000 // ASCII 0x40-0x7F #define fBELOWX40 0x00200000 // ASCII 0x00-0x3F #define fSYMBOL 0x00400000 #define fOTHER 0x00800000 #define fTHAI 0x01000000 #define fKANA 0x02000000 #define fCHINESE 0x04000000 // Simplified Chinese #define fHANGUL 0x08000000 #define fBIG5 0x10000000 // Traditional Chinese #define fDEVANAGARI 0x20000000 #define fTAMIL 0x40000000 #define fGEORGIAN 0x80000000 #define fASCII (fASCIIUPR | fBELOWX40) #define fLATIN1 (fASCII | fHILATIN1) #define fFE (fKANA | fCHINESE | fBIG5 | fHANGUL) #define fABOVEX7FF (fTHAI | fFE | fDEVANAGARI | fTAMIL | fOTHER) #define fLATIN (fHILATIN1 | fLATIN2 | fTURKISH | fBALTIC | fVIETNAMESE) #define fNEEDWORDBREAK fTHAI #define fNEEDCHARBREAK (fTHAI | fDEVANAGARI | fTAMIL) #define fNEEDCSSEQCHECK (fTHAI | fDEVANAGARI | fTAMIL) #define fCOMPLEX_SCRIPT (fBIDI | fARABIC | fHEBREW | fTHAI | fDEVANAGARI | fTAMIL | fCOMBINING | fDIGITSHAPE | 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 // ================================== 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(DWORD dwLim, USFlags flags); CCallMgr * GetCallMgr() { Assert(_pcallmgr); return _pcallmgr; } CObjectMgr * GetObjectMgr(); // the callback is provided by the client // to help with OLE support BOOL HasObjects() {return !!_pobjmgr;} IRichEditOleCallback *GetRECallback() { return _pobjmgr ? _pobjmgr->GetRECallback() : NULL; } LRESULT HandleSetUndoLimit(LONG Count); LRESULT HandleSetTextMode(DWORD mode); CNotifyMgr * GetNotifyMgr(); CDetectURL * GetDetectURL() {return _pdetecturl;} CUniscribe * Getusp() const {return GetUniscribe();} #if !defined(NOMAGELLAN) CMagellan mouse; LRESULT HandleMouseWheel(WPARAM wparam, LPARAM lparam); #endif // Misc helpers LONG GetAcpFromCp(LONG cp, BOOL fPrecise=0); LONG GetCpFromAcp(LONG acp, BOOL fPrecise=0); BOOL Get10Mode() const {return _f10Mode;} LONG GetCpAccelerator() const {return _cpAccelerator;} short GetFreezeCount() const {return _cFreeze;} BOOL fCpMap() const {return _f10Mode;} BOOL fInOurHost() const {return _fInOurHost;} BOOL fInplaceActive() const {return _fInPlaceActive;} BOOL fHideSelection() const {return _fHideSelection;} BOOL fXltCRCRLFtoCR() const {return _fXltCRCRLFtoCR;} BOOL fUsePassword() const {return _fUsePassword;} BOOL fUseCRLF() const {return _f10Mode;} BOOL fUseLineServices() const {return _bTypography & TO_ADVANCEDTYPOGRAPHY;} BOOL fUseSimpleLineBreak() const {return (_bTypography & TO_SIMPLELINEBREAK) != 0;} BOOL IsAutoFont() const {return _fAutoFont;}; BOOL IsAutoKeyboard() const {return _fAutoKeyboard;}; BOOL IsAutoFontSizeAdjust() const{return _fAutoFontSizeAdjust;}; BOOL IsBiDi() const {return (_dwCharFlags & fBIDI) != 0;} BOOL IsComplexScript() const {return _dwCharFlags & fCOMPLEX_SCRIPT;} BOOL IsFE() const {return (_dwCharFlags & fFE) != 0;} BOOL IsInOutlineView() const {return _fOutlineView;} BOOL IsMouseDown() const {return _fMouseDown;} BOOL IsRich() const {return _fRich;} 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;} DWORD GetCpFirstStrong() {return _cpFirstStrong;} void SetReleaseHost(); DWORD GetCharFlags() const {return _dwCharFlags;} void OrCharFlags(DWORD dwFlags, 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); 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); // Get host interface pointer ITextHost2 *GetHost() {return _phost;} // Helper for getting CDocInfo ptr and creating it if NULL CDocInfo * GetDocInfo(); HRESULT InitDocInfo(); 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 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); HRESULT CloseFile (BOOL bSave); // Helper for determine when to load message filter BOOL LoadMsgFilter (UINT msg, WPARAM wparam, LPARAM lparam); //-------------------------------------------------------------- // 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 {return _phost->TxGetSysColor(COLOR_WINDOW);} TXTBACKSTYLE TxGetBackStyle() const; HRESULT TxGetDefaultCharFormat(CCharFormat *pCF, DWORD &dwMask); 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(LPRECT prc, CDisplay *pdp) const; BOOL TxGetWordWrap() const; BOOL TxClientToScreen (LPPOINT lppt) {return _phost->TxClientToScreen(lppt); } BOOL TxScreenToClient (LPPOINT lppt) {return _phost->TxScreenToClient(lppt); } // ITextServices 2 wrappers BOOL TxIsDoubleClickPending(); HRESULT TxGetWindow(HWND *phwnd); HRESULT TxSetForegroundWindow(); HPALETTE TxGetPalette(); HRESULT TxGetFEFlags(LONG *pFEFlags); // 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, HRGN hrgnUpdate, LPRECT lprcUpdate, UINT fuScroll); void TxSetCapture(BOOL fCapture) {_phost->TxSetCapture(fCapture);} void TxSetFocus() {_phost->TxSetFocus();} // Allowed any-time BOOL TxShowScrollBar(INT fnBar, BOOL fShow) {return _phost->TxShowScrollBar(fnBar, fShow);} BOOL TxEnableScrollBar (INT fuSBFlags, INT fuArrowFlags) {return _phost->TxEnableScrollBar(fuSBFlags, fuArrowFlags);} BOOL TxSetScrollRange(INT fnBar, LONG nMinPos, INT nMaxPos, BOOL fRedraw) {return _phost->TxSetScrollRange(fnBar, nMinPos, nMaxPos, fRedraw);} BOOL TxSetScrollPos (INT fnBar, INT nPos, BOOL fRedraw) {return _phost->TxSetScrollPos(fnBar, nPos, fRedraw);} void TxInvalidateRect(const LPRECT prc, BOOL fMode) {_phost->TxInvalidateRect(prc, fMode);} 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 x, INT y) {return _phost->TxSetCaretPos(x, y);} 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 OnAutoWordSel(BOOL fPropertyFlag); HRESULT OnTxVerticalChange(BOOL fVertical); 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); HRESULT RectChangeHelper( CDrawInfo *pdi, DWORD dwDrawAspect, LONG lindex, void *pvAspect, DVTARGETDEVICE *ptd, HDC hdcDraw, HDC hicTargetDev, const RECT **pprcClient, RECT *prcLocal); // // 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 *pdwWidth, DWORD *pdwHeight); // 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 ); // 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 (WORD 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); HCURSOR TxSetCursor(HCURSOR hcur, BOOL bText) { return (_phost && _fInOurHost) ? (_phost)->TxSetCursor2(hcur, bText) : ::SetCursor(hcur); } // Timer HRESULT OnTxTimer(UINT idTimer); void CheckInstallContinuousScroll (); void CheckRemoveContinuousScroll (); // Scrolling HRESULT TxHScroll(WORD wCode, int xPos); LRESULT TxVScroll(WORD wCode, int yPos); 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 *prc, 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 OnGetWordBreakProc(); 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); LRESULT OnSetFont(HFONT hfont); LRESULT OnSetFontSize(LONG yPoint, IUndoBuilder *publdr); LRESULT OnDropFiles(HANDLE hDropFiles); // 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); // Other miscelleneous #ifdef DEBUG 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); #ifndef MACPORT // Helper for OnDropFiles. Not present on the Macintosh LRESULT CTxtEdit::InsertFromFile ( LPCTSTR lpFile ); #endif // // 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; typedef HRESULT (CTxtEdit::*FNPPROPCHG)(BOOL fPropFlag); static FNPPROPCHG _fnpPropChg[MAX_PROPERTY_BITS]; // 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 #ifdef MACPORT //NOTE: Different BIT ordering on the MAC requires that we flip the following bit fields. // This is because they are unioned with _dwFlags which is bit compared using the // TXTBIT_xxx flags // IMPORTANT: For Mac, all 32 bits must be filled out, else they'll be shifted. DWORD _fUpdateSelection :1; // 31: If true, update sel at level 0 DWORD _fDragged :1; // 30: Was the selection actually dragged? DWORD _fKoreanBlockCaret :1; // 29: Display Korean block caret during Kor IME DWORD _fCheckAIMM :1; // 28: if FALSE check if client has loaded AIMM DWORD _fInOurHost :1; // 27: Whether we are in our host DWORD _fSaved :1; // 26: ITextDocument Saved property DWORD _fHost2 :1; // 25: TRUE iff _phost is a phost2 DWORD _fMButtonCapture :1; // 24: captured mButton down. DWORD _fContinuousScroll :1; // 23: We have a timer running to support scrolling. // Font binding (see also _fAutoFontSizeAdjust) DWORD _fAutoKeyboard :1; // 22: auto switching keyboard DWORD _fAutoFont :1; // 21: auto switching font // Miscellaneous bits DWORD _fUseUndo :1; // 20: Only set to zero if undo limit is 0 DWORD _f10Mode :1; // 19: Use Richedit10 behavior DWORD _fRichPrevAccel :1; // 18: Rich state previous to accelerator DWORD _fWantDrag :1; // 17: Want to initiate drag & drop DWORD _fStreaming :1; // 16: Currently streaming text in or out DWORD _fScrollCaretOnFocus:1; // 15: Scroll caret into view on set focus DWORD _fModified :1; // 14: Control text has been modified DWORD _fIconic :1; // 13: Control/parent window is iconized DWORD _fDisableDrag :1; // 12: Disable Drag DWORD _fAllowBeep :1; // 11: Allow beep at doc boundaries DWORD _fTransparent :1; // 10: Background transparency DWORD _fMouseDown :1; // 9: One mouse button is current down DWORD _fEatLeftDown :1; // 8: Eat the next left down? DWORD _fFocus :1; // 7: Control has keyboard focus DWORD _fOverstrike :1; // 6: Overstrike mode vs insert mode DWORD _fHideSelection :1; // 5: Hide selection when inactive DWORD _fUsePassword :1; // 4: Whether to use password char DWORD _fInPlaceActive :1; // 3: Control is in place active DWORD _fReadOnly :1; // 2: Control is read only DWORD _fCapture :1; // 1: Control has mouse capture DWORD _fRich :1; // 0: Use rich-text formatting #else 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 #endif }; }; #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 // More IME bit WORD _fIMEInProgress :1; // TRUE if IME composition is in progress // Shutdown bit WORD _fReleaseHost :1; // TRUE if edit control needs to release host in // edit control destructor. union { WORD _bEditStyle; struct { WORD _fSystemEditMode :1; // 1: Behave more like sys edit WORD _fSystemEditBeep :1; // 2: Beep when system edit does WORD _fExtendBackColor :1; // 4: Extend BkClr to margin WORD _fUnusedEditStyle1 :1; // 8: SES_MAPCPS not used WORD _fUnusedEditStyle2 :1; // 16: SES_EMULATE10 not used WORD _fUnusedEditStyle3 :1; // 32: SES_USECRLF not used WORD _fUnusedEditStyle4 :1; // 64: SES_USEAIMM handled in cmsgflt WORD _fUnusedEditStyle5 :1; // 128: SES_NOIME handled in cmsgflt WORD _fUnusedEditStyle6 :1; // 256: SES_ALLOWBEEPS not used WORD _fUpperCase :1; // 512: Convert all input to upper case WORD _fLowerCase :1; // 1024: Convert all input to lower case WORD _fNoInputSequenceChk:1; // 2048: Disable ISCheck WORD _fBiDi :1; // 4096: Set Bidi document WORD _fScrollCPOnKillFocus:1;// 8192: Scroll to cp=0 upon Kill focus WORD _fXltCRCRLFtoCR :1; // 16384: Translate CRCRLF to CR instead of ' ' WORD _fUnUsedEditStyle :1; // 32768: Unused }; }; 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 WORD _fUnUsed :9; // Available for use DWORD _dwCharFlags; // Char flags for text in control 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 DWORD _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 ITextMsgFilter * _pMsgFilter; // Pointer to message filter. }; #endif