You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
190 lines
6.8 KiB
190 lines
6.8 KiB
//
|
|
// mark.h
|
|
//
|
|
// CMarkTextService declaration.
|
|
//
|
|
|
|
#ifndef MARK_H
|
|
#define MARK_H
|
|
|
|
class CLangBarItemButton;
|
|
|
|
class CMarkTextService : public ITfTextInputProcessor,
|
|
public ITfDisplayAttributeProvider,
|
|
public ITfCreatePropertyStore,
|
|
public ITfThreadMgrEventSink,
|
|
public ITfTextEditSink,
|
|
public ITfCompositionSink,
|
|
public ITfCleanupContextDurationSink,
|
|
public ITfCleanupContextSink,
|
|
public ITfCompartmentEventSink,
|
|
public ITfKeyEventSink
|
|
{
|
|
public:
|
|
CMarkTextService();
|
|
~CMarkTextService();
|
|
|
|
// IUnknown
|
|
STDMETHODIMP QueryInterface(REFIID riid, void **ppvObj);
|
|
STDMETHODIMP_(ULONG) AddRef(void);
|
|
STDMETHODIMP_(ULONG) Release(void);
|
|
|
|
// ITfTextInputProcessor
|
|
STDMETHODIMP Activate(ITfThreadMgr *pThreadMgr, TfClientId tfClientId);
|
|
STDMETHODIMP Deactivate();
|
|
|
|
// ITfDisplayAttributeProvider
|
|
STDMETHODIMP EnumDisplayAttributeInfo(IEnumTfDisplayAttributeInfo **ppEnum);
|
|
STDMETHODIMP GetDisplayAttributeInfo(REFGUID guidInfo, ITfDisplayAttributeInfo **ppInfo);
|
|
|
|
// ITfCreatePropertyStore
|
|
STDMETHODIMP IsStoreSerializable(REFGUID guidProperty, ITfRange *pRange, ITfPropertyStore *pPropertyStore, BOOL *pfSerializable);
|
|
STDMETHODIMP CreatePropertyStore(REFGUID guidProperty, ITfRange *pRange, ULONG cb, IStream *pStream, ITfPropertyStore **ppStore);
|
|
|
|
// ITfThreadMgrEventSink
|
|
STDMETHODIMP OnInitDocumentMgr(ITfDocumentMgr *pDocMgr);
|
|
STDMETHODIMP OnUninitDocumentMgr(ITfDocumentMgr *pDocMgr);
|
|
STDMETHODIMP OnSetFocus(ITfDocumentMgr *pDocMgrFocus, ITfDocumentMgr *pDocMgrPrevFocus);
|
|
STDMETHODIMP OnPushContext(ITfContext *pContext);
|
|
STDMETHODIMP OnPopContext(ITfContext *pContext);
|
|
|
|
// ITfTextEditSink
|
|
STDMETHODIMP OnEndEdit(ITfContext *pContext, TfEditCookie ecReadOnly, ITfEditRecord *pEditRecord);
|
|
|
|
// ITfCompositionSink
|
|
STDMETHODIMP OnCompositionTerminated(TfEditCookie ecWrite, ITfComposition *pComposition);
|
|
|
|
// ITfCleanupContextDurationSink
|
|
STDMETHODIMP OnStartCleanupContext();
|
|
STDMETHODIMP OnEndCleanupContext();
|
|
|
|
// ITfCleanupContextSink
|
|
STDMETHODIMP OnCleanupContext(TfEditCookie ecWrite, ITfContext *pContext);
|
|
|
|
// ITfCompartmentEventSink
|
|
STDMETHODIMP OnChange(REFGUID rguidCompartment);
|
|
|
|
// ITfKeyEventSink
|
|
STDMETHODIMP OnSetFocus(BOOL fForeground);
|
|
STDMETHODIMP OnTestKeyDown(ITfContext *pContext, WPARAM wParam, LPARAM lParam, BOOL *pfEaten);
|
|
STDMETHODIMP OnKeyDown(ITfContext *pContext, WPARAM wParam, LPARAM lParam, BOOL *pfEaten);
|
|
STDMETHODIMP OnTestKeyUp(ITfContext *pContext, WPARAM wParam, LPARAM lParam, BOOL *pfEaten);
|
|
STDMETHODIMP OnKeyUp(ITfContext *pContext, WPARAM wParam, LPARAM lParam, BOOL *pfEaten);
|
|
STDMETHODIMP OnPreservedKey(ITfContext *pContext, REFGUID rguid, BOOL *pfEaten);
|
|
|
|
// CClassFactory factory callback
|
|
static HRESULT CreateInstance(IUnknown *pUnkOuter, REFIID riid, void **ppvObj);
|
|
|
|
// server registration
|
|
static BOOL RegisterProfiles();
|
|
static void UnregisterProfiles();
|
|
static BOOL RegisterCategories(BOOL fRegister);
|
|
static BOOL RegisterServer();
|
|
static void UnregisterServer();
|
|
|
|
// language bar menu handlers
|
|
static void _Menu_OnComposition(CMarkTextService *_this);
|
|
static void _Menu_OnSetGlobalCompartment(CMarkTextService *_this);
|
|
static void _Menu_OnSetCaseProperty(CMarkTextService *_this);
|
|
static void _Menu_OnViewCaseProperty(CMarkTextService *_this);
|
|
static void _Menu_OnViewCustomProperty(CMarkTextService *_this);
|
|
static void _Menu_OnSetCustomProperty(CMarkTextService *_this);
|
|
|
|
// keystroke handlers
|
|
HRESULT _HandleKeyDown(TfEditCookie ec, ITfContext *pContext, WPARAM wParam);
|
|
HRESULT _HandleArrowKey(TfEditCookie ec, ITfContext *pContext, WPARAM wParam);
|
|
HRESULT _HandleReturn(TfEditCookie ec, ITfContext *pContext);
|
|
|
|
// callbacks for CCompositionEditSession
|
|
BOOL _IsComposing()
|
|
{
|
|
return _pComposition != NULL;
|
|
}
|
|
ITfComposition *_GetComposition()
|
|
{
|
|
return _pComposition;
|
|
}
|
|
void _SetComposition(ITfComposition *pComposition)
|
|
{
|
|
_pComposition = pComposition;
|
|
}
|
|
void _TerminateComposition(TfEditCookie ec)
|
|
{
|
|
if (_pComposition != NULL)
|
|
{
|
|
_ClearCompositionDisplayAttributes(ec);
|
|
_pComposition->EndComposition(ec);
|
|
SafeReleaseClear(_pComposition);
|
|
}
|
|
}
|
|
void _TerminateCompositionInContext(ITfContext *pContext);
|
|
void _ClearCompositionDisplayAttributes(TfEditCookie ec);
|
|
BOOL _SetCompositionDisplayAttributes(TfEditCookie ec);
|
|
|
|
// messages for the worker wnd
|
|
enum { WM_DISPLAY_PROPERTY = WM_USER + 1 };
|
|
// property methods
|
|
void _ViewCaseProperty(TfEditCookie ec, ITfContext *pContext);
|
|
void _SetCaseProperty(TfEditCookie ec, ITfContext *pContext);
|
|
void _ViewCustomProperty(TfEditCookie ec, ITfContext *pContext);
|
|
void _SetCustomProperty(TfEditCookie ec, ITfContext *pContext);
|
|
|
|
private:
|
|
// init methods
|
|
BOOL _InitLanguageBar();
|
|
BOOL _InitThreadMgrSink();
|
|
BOOL _InitTextEditSink(ITfDocumentMgr *pDocMgr);
|
|
BOOL _InitDisplayAttributeGuidAtom();
|
|
BOOL _InitCleanupContextDurationSink();
|
|
BOOL _InitCleanupContextSink(ITfContext *pContext);
|
|
BOOL _InitContextCompartment(ITfContext *pContext);
|
|
BOOL _InitGlobalCompartment();
|
|
BOOL _InitWorkerWnd();
|
|
BOOL _InitKeystrokeSink();
|
|
|
|
// uninit methods
|
|
void _UninitLanguageBar();
|
|
void _UninitThreadMgrSink();
|
|
void _UninitCleanupContextDurationSink();
|
|
void _UninitCleanupContextSink(ITfContext *pContext);
|
|
void _UninitCompartment(ITfContext *pContext);
|
|
void _UninitGlobalCompartment();
|
|
void _UninitWorkerWnd();
|
|
void _UninitKeystrokeSink();
|
|
|
|
// property methods
|
|
void _RequestPropertyEditSession(ULONG ulCallback);
|
|
static LRESULT CALLBACK _WorkerWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
|
|
|
//
|
|
// state
|
|
//
|
|
|
|
ITfThreadMgr *_pThreadMgr;
|
|
TfClientId _tfClientId;
|
|
|
|
ITfComposition *_pComposition; // pointer to an ongoing composition, or NULL if there is none
|
|
|
|
BOOL _fCleaningUp;
|
|
|
|
TfGuidAtom _gaDisplayAttribute;
|
|
|
|
CLangBarItemButton *_pLangBarItem;
|
|
|
|
DWORD _dwThreadMgrEventSinkCookie;
|
|
DWORD _dwThreadFocusSinkCookie;
|
|
DWORD _dwTextEditSinkCookie;
|
|
DWORD _dwGlobalCompartmentEventSinkCookie;
|
|
|
|
ITfContext *_pTextEditSinkContext;
|
|
|
|
HWND _hWorkerWnd;
|
|
// buffers for the popup property displays
|
|
WCHAR _achDisplayText[64];
|
|
WCHAR _achDisplayPropertyText[64];
|
|
|
|
LONG _cRef; // COM ref count
|
|
};
|
|
|
|
|
|
#endif // MARK_H
|