// 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 "stdafx.h" #include #include "assert.h" #include using std::cout; using std::endl; //--------------------------------------------------------------------- // defined keyword //--------------------------------------------------------------------- template struct _DEFINED_KEYWORD { LPCWSTR _pwszKeyword; VALUE _value; }; //--------------------------------------------------------------------- // enum //--------------------------------------------------------------------- enum KEYSTROKE_CATEGORY { CATEGORY_NONE = 0, CATEGORY_COMPOSING, CATEGORY_CANDIDATE, CATEGORY_PHRASE, CATEGORY_PHRASEFROMKEYSTROKE, CATEGORY_INVOKE_COMPOSITION_EDIT_SESSION }; enum KEYSTROKE_FUNCTION { FUNCTION_NONE = 0, FUNCTION_INPUT, FUNCTION_CANCEL, FUNCTION_FINALIZE_TEXTSTORE, FUNCTION_FINALIZE_TEXTSTORE_AND_INPUT, FUNCTION_FINALIZE_CANDIDATELIST, FUNCTION_FINALIZE_CANDIDATELIST_AND_INPUT, FUNCTION_CONVERT, FUNCTION_CONVERT_WILDCARD, FUNCTION_SELECT_BY_NUMBER, FUNCTION_BACKSPACE, FUNCTION_MOVE_LEFT, FUNCTION_MOVE_RIGHT, FUNCTION_MOVE_UP, FUNCTION_MOVE_DOWN, FUNCTION_MOVE_PAGE_UP, FUNCTION_MOVE_PAGE_DOWN, FUNCTION_MOVE_PAGE_TOP, FUNCTION_MOVE_PAGE_BOTTOM, // Function Double/Single byte FUNCTION_DOUBLE_SINGLE_BYTE, // Function Punctuation FUNCTION_PUNCTUATION }; //--------------------------------------------------------------------- // candidate list //--------------------------------------------------------------------- enum CANDIDATE_MODE { CANDIDATE_NONE = 0, CANDIDATE_ORIGINAL, CANDIDATE_PHRASE, CANDIDATE_INCREMENTAL, CANDIDATE_WITH_NEXT_COMPOSITION }; //--------------------------------------------------------------------- // structure //--------------------------------------------------------------------- struct _KEYSTROKE_STATE { KEYSTROKE_CATEGORY Category; KEYSTROKE_FUNCTION Function; }; struct _PUNCTUATION { WCHAR _Code; WCHAR _Punctuation; }; BOOL CLSIDToString(REFGUID refGUID, _Out_writes_ (39) WCHAR *pCLSIDString); HRESULT SkipWhiteSpace(LCID locale, _In_ LPCWSTR pwszBuffer, DWORD_PTR dwBufLen, _Out_ DWORD_PTR *pdwIndex); HRESULT FindChar(WCHAR wch, _In_ LPCWSTR pwszBuffer, DWORD_PTR dwBufLen, _Out_ DWORD_PTR *pdwIndex); BOOL IsSpace(LCID locale, WCHAR wch); template class CSampleImeArray { typedef typename std::vector CSampleImeInnerArray; typedef typename std::vector::iterator CSampleImeInnerIter; public: CSampleImeArray(): _innerVect() { } explicit CSampleImeArray(size_t count): _innerVect(count) { } virtual ~CSampleImeArray() { } inline T* GetAt(size_t index) { assert(index >= 0); assert(index < _innerVect.size()); T& curT = _innerVect.at(index); return &(curT); } inline const T* GetAt(size_t index) const { assert(index >= 0); assert(index < _innerVect.size()); T& curT = _innerVect.at(index); return &(curT); } void RemoveAt(size_t index) { assert(index >= 0); assert(index < _innerVect.size()); CSampleImeInnerIter iter = _innerVect.begin(); _innerVect.erase(iter + index); } UINT Count() const { return static_cast(_innerVect.size()); } T* Append() { T newT; _innerVect.push_back(newT); T& backT = _innerVect.back(); return &(backT); } void reserve(size_t Count) { _innerVect.reserve(Count); } void Clear() { _innerVect.clear(); } private: CSampleImeInnerArray _innerVect; }; class CCandidateRange { public: CCandidateRange(void); ~CCandidateRange(void); BOOL IsRange(UINT vKey); int GetIndex(UINT vKey); inline int Count() const { return _CandidateListIndexRange.Count(); } inline DWORD *GetAt(int index) { return _CandidateListIndexRange.GetAt(index); } inline DWORD *Append() { return _CandidateListIndexRange.Append(); } private: CSampleImeArray _CandidateListIndexRange; }; class CStringRange { public: CStringRange(); ~CStringRange(); const WCHAR *Get() const; const DWORD_PTR GetLength() const; void Clear(); void Set(const WCHAR *pwch, DWORD_PTR dwLength); void Set(CStringRange &sr); CStringRange& operator=(const CStringRange& sr); void CharNext(_Inout_ CStringRange* pCharNext); static int Compare(LCID locale, _In_ CStringRange* pString1, _In_ CStringRange* pString2); static BOOL WildcardCompare(LCID locale, _In_ CStringRange* stringWithWildcard, _In_ CStringRange* targetString); protected: DWORD_PTR _stringBufLen; // Length is in character count. const WCHAR *_pStringBuf; // Buffer which is not add zero terminate. }; //--------------------------------------------------------------------- // CCandidateListItem // _ItemString - candidate string // _FindKeyCode - tailing string //--------------------------------------------------------------------- struct CCandidateListItem { CStringRange _ItemString; CStringRange _FindKeyCode; CCandidateListItem& CCandidateListItem::operator =( const CCandidateListItem& rhs) { _ItemString = rhs._ItemString; _FindKeyCode = rhs._FindKeyCode; return *this; } }; class CPunctuationPair { public: CPunctuationPair(); CPunctuationPair(WCHAR code, WCHAR punctuation, WCHAR pair); struct _PUNCTUATION _punctuation; WCHAR _pairPunctuation; BOOL _isPairToggle; }; class CPunctuationNestPair { public: CPunctuationNestPair(); CPunctuationNestPair(WCHAR wchCode_begin, WCHAR wch_begin, WCHAR wchPair_begin, WCHAR wchCode_end, WCHAR wch_end, WCHAR wchPair_end); struct _PUNCTUATION _punctuation_begin; WCHAR _pairPunctuation_begin; struct _PUNCTUATION _punctuation_end; WCHAR _pairPunctuation_end; int _nestCount; };