Windows-classic-samples/Samples/IME/cpp/SampleIME/CompositionProcessorEngine.h
2025-11-28 00:35:46 +09:00

196 lines
7.4 KiB
C++

// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
//
// Copyright (c) Microsoft Corporation. All rights reserved
#pragma once
#include "sal.h"
#include "TableDictionaryEngine.h"
#include "KeyHandlerEditSession.h"
#include "SampleIMEBaseStructure.h"
#include "FileMapping.h"
#include "Compartment.h"
#include "define.h"
class CCompositionProcessorEngine
{
public:
CCompositionProcessorEngine(void);
~CCompositionProcessorEngine(void);
BOOL SetupLanguageProfile(LANGID langid, REFGUID guidLanguageProfile, _In_ ITfThreadMgr *pThreadMgr, TfClientId tfClientId, BOOL isSecureMode, BOOL isComLessMode);
// Get language profile.
GUID GetLanguageProfile(LANGID *plangid)
{
*plangid = _langid;
return _guidProfile;
}
// Get locale
LCID GetLocale()
{
return MAKELCID(_langid, SORT_DEFAULT);
}
BOOL IsVirtualKeyNeed(UINT uCode, _In_reads_(1) WCHAR *pwch, BOOL fComposing, CANDIDATE_MODE candidateMode, BOOL hasCandidateWithWildcard, _Out_opt_ _KEYSTROKE_STATE *pKeyState);
BOOL AddVirtualKey(WCHAR wch);
void RemoveVirtualKey(DWORD_PTR dwIndex);
void PurgeVirtualKey();
DWORD_PTR GetVirtualKeyLength() { return _keystrokeBuffer.GetLength(); }
WCHAR GetVirtualKey(DWORD_PTR dwIndex);
void GetReadingStrings(_Inout_ CSampleImeArray<CStringRange> *pReadingStrings, _Out_ BOOL *pIsWildcardIncluded);
void GetCandidateList(_Inout_ CSampleImeArray<CCandidateListItem> *pCandidateList, BOOL isIncrementalWordSearch, BOOL isWildcardSearch);
void GetCandidateStringInConverted(CStringRange &searchString, _In_ CSampleImeArray<CCandidateListItem> *pCandidateList);
// Preserved key handler
void OnPreservedKey(REFGUID rguid, _Out_ BOOL *pIsEaten, _In_ ITfThreadMgr *pThreadMgr, TfClientId tfClientId);
// Punctuation
BOOL IsPunctuation(WCHAR wch);
WCHAR GetPunctuation(WCHAR wch);
BOOL IsDoubleSingleByte(WCHAR wch);
BOOL IsWildcard() { return _isWildcard; }
BOOL IsDisableWildcardAtFirst() { return _isDisableWildcardAtFirst; }
BOOL IsWildcardChar(WCHAR wch) { return ((IsWildcardOneChar(wch) || IsWildcardAllChar(wch)) ? TRUE : FALSE); }
BOOL IsWildcardOneChar(WCHAR wch) { return (wch==L'?' ? TRUE : FALSE); }
BOOL IsWildcardAllChar(WCHAR wch) { return (wch==L'*' ? TRUE : FALSE); }
BOOL IsMakePhraseFromText() { return _hasMakePhraseFromText; }
BOOL IsKeystrokeSort() { return _isKeystrokeSort; }
// Dictionary engine
BOOL IsDictionaryAvailable() { return (_pTableDictionaryEngine ? TRUE : FALSE); }
// Language bar control
void SetLanguageBarStatus(DWORD status, BOOL isSet);
void ConversionModeCompartmentUpdated(_In_ ITfThreadMgr *pThreadMgr);
void ShowAllLanguageBarIcons();
void HideAllLanguageBarIcons();
inline CCandidateRange *GetCandidateListIndexRange() { return &_candidateListIndexRange; }
inline UINT GetCandidateListPhraseModifier() { return _candidateListPhraseModifier; }
inline UINT GetCandidateWindowWidth() { return _candidateWndWidth; }
private:
void InitKeyStrokeTable();
BOOL InitLanguageBar(_In_ CLangBarItemButton *pLanguageBar, _In_ ITfThreadMgr *pThreadMgr, TfClientId tfClientId, REFGUID guidCompartment);
struct _KEYSTROKE;
BOOL IsVirtualKeyKeystrokeComposition(UINT uCode, _Out_opt_ _KEYSTROKE_STATE *pKeyState, KEYSTROKE_FUNCTION function);
BOOL IsVirtualKeyKeystrokeCandidate(UINT uCode, _In_ _KEYSTROKE_STATE *pKeyState, CANDIDATE_MODE candidateMode, _Out_ BOOL *pfRetCode, _In_ CSampleImeArray<_KEYSTROKE> *pKeystrokeMetric);
BOOL IsKeystrokeRange(UINT uCode, _Out_ _KEYSTROKE_STATE *pKeyState, CANDIDATE_MODE candidateMode);
void SetupKeystroke();
void SetupPreserved(_In_ ITfThreadMgr *pThreadMgr, TfClientId tfClientId);
void SetupConfiguration();
void SetupLanguageBar(_In_ ITfThreadMgr *pThreadMgr, TfClientId tfClientId, BOOL isSecureMode);
void SetKeystrokeTable(_Inout_ CSampleImeArray<_KEYSTROKE> *pKeystroke);
void SetupPunctuationPair();
void CreateLanguageBarButton(DWORD dwEnable, GUID guidLangBar, _In_z_ LPCWSTR pwszDescriptionValue, _In_z_ LPCWSTR pwszTooltipValue, DWORD dwOnIconIndex, DWORD dwOffIconIndex, _Outptr_result_maybenull_ CLangBarItemButton **ppLangBarItemButton, BOOL isSecureMode);
void SetInitialCandidateListRange();
void SetDefaultCandidateTextFont();
void InitializeSampleIMECompartment(_In_ ITfThreadMgr *pThreadMgr, TfClientId tfClientId);
class XPreservedKey;
void SetPreservedKey(const CLSID clsid, TF_PRESERVEDKEY & tfPreservedKey, _In_z_ LPCWSTR pwszDescription, _Out_ XPreservedKey *pXPreservedKey);
BOOL InitPreservedKey(_In_ XPreservedKey *pXPreservedKey, _In_ ITfThreadMgr *pThreadMgr, TfClientId tfClientId);
BOOL CheckShiftKeyOnly(_In_ CSampleImeArray<TF_PRESERVEDKEY> *pTSFPreservedKeyTable);
static HRESULT CompartmentCallback(_In_ void *pv, REFGUID guidCompartment);
void PrivateCompartmentsUpdated(_In_ ITfThreadMgr *pThreadMgr);
void KeyboardOpenCompartmentUpdated(_In_ ITfThreadMgr *pThreadMgr);
BOOL SetupDictionaryFile();
CFile* GetDictionaryFile();
private:
struct _KEYSTROKE
{
UINT VirtualKey;
UINT Modifiers;
KEYSTROKE_FUNCTION Function;
_KEYSTROKE()
{
VirtualKey = 0;
Modifiers = 0;
Function = FUNCTION_NONE;
}
};
_KEYSTROKE _keystrokeTable[26];
CTableDictionaryEngine* _pTableDictionaryEngine;
CStringRange _keystrokeBuffer;
BOOL _hasWildcardIncludedInKeystrokeBuffer;
LANGID _langid;
GUID _guidProfile;
TfClientId _tfClientId;
CSampleImeArray<_KEYSTROKE> _KeystrokeComposition;
CSampleImeArray<_KEYSTROKE> _KeystrokeCandidate;
CSampleImeArray<_KEYSTROKE> _KeystrokeCandidateWildcard;
CSampleImeArray<_KEYSTROKE> _KeystrokeCandidateSymbol;
CSampleImeArray<_KEYSTROKE> _KeystrokeSymbol;
// Preserved key data
class XPreservedKey
{
public:
XPreservedKey();
~XPreservedKey();
BOOL UninitPreservedKey(_In_ ITfThreadMgr *pThreadMgr);
public:
CSampleImeArray<TF_PRESERVEDKEY> TSFPreservedKeyTable;
GUID Guid;
LPCWSTR Description;
};
XPreservedKey _PreservedKey_IMEMode;
XPreservedKey _PreservedKey_DoubleSingleByte;
XPreservedKey _PreservedKey_Punctuation;
// Punctuation data
CSampleImeArray<CPunctuationPair> _PunctuationPair;
CSampleImeArray<CPunctuationNestPair> _PunctuationNestPair;
// Language bar data
CLangBarItemButton* _pLanguageBar_IMEMode;
CLangBarItemButton* _pLanguageBar_DoubleSingleByte;
CLangBarItemButton* _pLanguageBar_Punctuation;
// Compartment
CCompartment* _pCompartmentConversion;
CCompartmentEventSink* _pCompartmentConversionEventSink;
CCompartmentEventSink* _pCompartmentKeyboardOpenEventSink;
CCompartmentEventSink* _pCompartmentDoubleSingleByteEventSink;
CCompartmentEventSink* _pCompartmentPunctuationEventSink;
// Configuration data
BOOL _isWildcard : 1;
BOOL _isDisableWildcardAtFirst : 1;
BOOL _hasMakePhraseFromText : 1;
BOOL _isKeystrokeSort : 1;
BOOL _isComLessMode : 1;
CCandidateRange _candidateListIndexRange;
UINT _candidateListPhraseModifier;
UINT _candidateWndWidth;
CFileMapping* _pDictionaryFile;
static const int OUT_OF_FILE_INDEX = -1;
};