271 lines
6.2 KiB
C++
271 lines
6.2 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 "stdafx.h"
|
|
#include <vector>
|
|
#include "assert.h"
|
|
#include <iostream>
|
|
|
|
using std::cout;
|
|
using std::endl;
|
|
|
|
//---------------------------------------------------------------------
|
|
// defined keyword
|
|
//---------------------------------------------------------------------
|
|
template<class VALUE>
|
|
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 T>
|
|
class CSampleImeArray
|
|
{
|
|
typedef typename std::vector<T> CSampleImeInnerArray;
|
|
typedef typename std::vector<T>::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<UINT>(_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<DWORD> _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;
|
|
}; |