Leaked source code of windows server 2003
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.
 
 
 
 
 
 

615 lines
20 KiB

//
// KORIMX.H : CKorIMX class declaration
//
// History:
// 15-NOV-1999 CSLim Created
#if !defined (__KORIMX_H__INCLUDED_)
#define __KORIMX_H__INCLUDED_
#include "globals.h"
#include "proputil.h"
#include "computil.h"
#include "dap.h"
#include "tes.h"
#include "kes.h"
#include "hauto.h"
#include "candlstx.h"
#include "mscandui.h"
#include "toolbar.h"
#include "editssn.h"
#include "immxutil.h"
#include "softkbd.h"
#include "skbdkor.h"
#include "pad.h"
#include "resource.h"
///////////////////////////////////////////////////////////////////////////////
// Class forward declarations
class CEditSession;
class CICPriv;
class CThreadMgrEventSink;
class CFunctionProvider;
class CHanja;
class CCompositionInsertHelper;
///////////////////////////////////////////////////////////////////////////////
// Edit callback state values
#define ESCB_FINALIZECONVERSION 1
#define ESCB_COMPLETE 2
#define ESCB_INSERT_PAD_STRING 3
#define ESCB_KEYSTROKE 4
#define ESCB_TEXTEVENT 5
//#define ESCB_RANGEBROKEN 6
#define ESCB_CANDUI_CLOSECANDUI 6
#define ESCB_HANJA_CONV 7
#define ESCB_FINALIZERECONVERSION 8
#define ESCB_ONSELECTRECONVERSION 9
#define ESCB_ONCANCELRECONVERSION 10
#define ESCB_RECONV_QUERYRECONV 11
#define ESCB_RECONV_GETRECONV 12
#define ESCB_RECONV_SHOWCAND 13
#define ESCB_INIT_MODEBIAS 14
// Conversion modes(bit field for bit op)
#define TIP_ALPHANUMERIC_MODE 0
#define TIP_HANGUL_MODE 1
#define TIP_JUNJA_MODE 2
#define TIP_NULL_CONV_MODE 0x8000
//
// Text Direction
//
typedef enum
{
TEXTDIRECTION_TOPTOBOTTOM = 1,
TEXTDIRECTION_RIGHTTOLEFT,
TEXTDIRECTION_BOTTOMTOTOP,
TEXTDIRECTION_LEFTTORIGHT,
} TEXTDIRECTION;
///////////////////////////////////////////////////////////////////////////////
// CKorIMX class
class CKorIMX : public ITfTextInputProcessor,
public ITfFnConfigure,
public ITfThreadFocusSink,
public ITfCompositionSink,
public ITfCleanupContextSink,
public ITfCleanupContextDurationSink,
public ITfActiveLanguageProfileNotifySink,
public ITfTextEditSink,
public ITfEditTransactionSink,
public CDisplayAttributeProvider
{
public:
CKorIMX();
~CKorIMX();
static HRESULT CreateInstance(IUnknown *pUnkOuter, REFIID riid, void **ppvObj);
//
// IUnknown methods
//
virtual STDMETHODIMP QueryInterface(REFIID riid, void **ppvObj);
virtual STDMETHODIMP_(ULONG) AddRef(void);
virtual STDMETHODIMP_(ULONG) Release(void);
private:
long m_cRef;
public:
//
// ITfX methods
//
STDMETHODIMP Activate(ITfThreadMgr *ptim, TfClientId tid);
STDMETHODIMP Deactivate();
// ITfThreadFocusSink
STDMETHODIMP OnSetThreadFocus();
STDMETHODIMP OnKillThreadFocus();
// ITfCompositionSink
STDMETHODIMP OnCompositionTerminated(TfEditCookie ecWrite, ITfComposition *pComposition);
// ITfCleanupContextDurationSink
STDMETHODIMP OnStartCleanupContext();
STDMETHODIMP OnEndCleanupContext();
// ITfCleanupContextSink
STDMETHODIMP OnCleanupContext(TfEditCookie ecWrite, ITfContext *pic);
// ITfActiveLanguageProfileNotifySink
STDMETHODIMP OnActivated(REFCLSID clsid, REFGUID guidProfile, BOOL fActivated);
// ITFFnConfigure
STDMETHODIMP GetDisplayName(BSTR *pbstrCand);
STDMETHODIMP Show(HWND hwnd, LANGID langid, REFGUID rguidProfile);
// ITfTextEditSink
STDMETHODIMP OnEndEdit(ITfContext *pic, TfEditCookie ecReadOnly, ITfEditRecord *pEditRecord);
// ITfEditTransactionSink
STDMETHODIMP OnStartEditTransaction(ITfContext *pic);
STDMETHODIMP OnEndEditTransaction(ITfContext *pic);
// Operations
public:
// Get/Set On off status
BOOL IsOn(ITfContext *pic);
void SetOnOff(ITfContext *pic, BOOL fOn);
static HRESULT _EditSessionCallback2(TfEditCookie ec, CEditSession2 *pes);
HRESULT MakeResultString(TfEditCookie ec, ITfContext *pic, ITfRange *pRange);
// REVIEW: IC related functions
ITfContext* GetRootIC(ITfDocumentMgr* pDim = NULL);
static BOOL IsDisabledIC(ITfContext *pic);
static BOOL IsEmptyIC(ITfContext *pic);
static BOOL IsCandidateIC(ITfContext *pic);
static HWND GetAppWnd(ITfContext *pic);
BOOL IsPendingCleanup();
// Get AIMM or not?
static BOOL GetAIMM(ITfContext *pic);
// Get/Set conversion mode
DWORD GetConvMode(ITfContext *pic);
DWORD SetConvMode(ITfContext *pic, DWORD dwConvMode);
// Retun current Automata object
CHangulAutomata* GetAutomata(ITfContext *pic);
// Cand UI functions
void OpenCandidateUI(TfEditCookie ec, ITfContext *pic, ITfRange *pRange, CCandidateListEx *pCandList);
void CloseCandidateUI(ITfContext *pic);
void CancelCandidate(TfEditCookie ec, ITfContext *pic);
// Soft Kbd functions
HRESULT InitializeSoftKbd();
BOOL IsSoftKbdEnabled() { return m_fSoftKbdEnabled; }
void TerminateSoftKbd();
BOOL GetSoftKBDOnOff();
void SetSoftKBDOnOff(BOOL fOn);
DWORD GetSoftKBDLayout();
void SetSoftKBDLayout(DWORD dwKbdLayout);
HRESULT GetSoftKBDPosition(int *xWnd, int *yWnd);
void SetSoftKBDPosition(int xWnd, int yWnd);
SOFTLAYOUT* GetHangulSKbd() { return &m_KbdHangul; }
// Data access functins
ITfDocumentMgr* GetDIM() { return m_pCurrentDim; }
HRESULT GetFocusDIM(ITfDocumentMgr **ppdim);
ITfThreadMgr* GetTIM() { return m_ptim; }
TfClientId GetTID() { return m_tid; }
ITfContext* GetIC();
CThreadMgrEventSink* GetTIMEventSink() { return m_ptimEventSink; }
static CICPriv* GetInputContextPriv(ITfContext *pic);
void OnFocusChange(ITfContext *pic, BOOL fActivate);
// Window object member access functions
HWND GetOwnerWnd() { return m_hOwnerWnd; }
// Get IImeIPoint
IImeIPoint1* GetIPoint (ITfContext *pic);
// KES_CODE_FOCUS set fForeground?
BOOL IsKeyFocus() { return m_fKeyFocus; }
// Get Pad Core
CPadCore* GetPadCore() { return m_pPadCore; }
// Update Toolbar button
void UpdateToolbar(DWORD dwUpdate) { m_pToolBar->Update(dwUpdate); }
static LRESULT CALLBACK _OwnerWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
CFunctionProvider* GetFunctionProvider() { return m_pFuncPrv; }
// Cand UI helper
BOOL IsCandUIOpen() { return m_fCandUIOpen; }
// Get TLS
LIBTHREAD *_GetLibTLS() { return &m_libTLS; }
// Implementation
protected:
// Helper functions
HRESULT SetInputString(TfEditCookie ec, ITfContext *pic, ITfRange *pRange, WCHAR *psz, LANGID langid);
static LANGID GetLangID();
static WCHAR Banja2Junja(WCHAR bChar);
// Cand UI function
void GetCandidateFontInternal(TfEditCookie ec, ITfContext *pic, ITfRange *pRange, LOGFONTW *plf, LONG lFontPoint, BOOL fCandList);
//////////////////////////////////////////////////////////////////////////////
// Internal functions
private:
// Callbacks
static HRESULT _KeyEventCallback(UINT uCode, ITfContext *pic, WPARAM wParam, LPARAM lParam, BOOL *pfEaten, void *pv);
static HRESULT _PreKeyCallback(ITfContext *pic, REFGUID rguid, BOOL *pfEaten, void *pv);
static HRESULT _DIMCallback(UINT uCode, ITfDocumentMgr *pdimNew, ITfDocumentMgr *pdimPrev, void *pv);
static HRESULT _ICCallback(UINT uCode, ITfContext *pic, void *pv);
static HRESULT _CompEventSinkCallback(void *pv, REFGUID rguid);
static void _CleanupCompositionsCallback(TfEditCookie ecWrite, ITfRange *rangeComposition, void *pvPrivate);
void HAutoMata(TfEditCookie ec, ITfContext *pIIC, ITfRange *pIRange, LPBYTE lpbKeyState, WORD wVKey);
BOOL _IsKeyEaten(ITfContext *pic, CKorIMX *pimx, WPARAM wParam, LPARAM lParam, const BYTE abKeyState[256]);
HRESULT _Keystroke(TfEditCookie ec, ITfContext *pic, WPARAM wParam, LPARAM lParam, const BYTE abKeyState[256]);
// IC helpers
HRESULT _InitICPriv(ITfContext *pic);
HRESULT _DeleteICPriv(ITfContext *pic);
// Hanja conversion
HRESULT DoHanjaConversion(TfEditCookie ec, ITfContext *pic, ITfRange *pRange);
HRESULT Reconvert(ITfRange *pSelection);
// Composition
ITfComposition *GetIPComposition(ITfContext *pic);
ITfComposition *CreateIPComposition(TfEditCookie ec, ITfContext *pic, ITfRange* pRangeComp);
void SetIPComposition(ITfContext *pic, ITfComposition *pComposition);
BOOL EndIPComposition(TfEditCookie ec, ITfContext *pic);
// Candidate list
CCandidateListEx *CreateCandidateList(ITfContext *pic, ITfRange *pRange, LPWSTR wchHangul);
TEXTDIRECTION GetTextDirection(TfEditCookie ec, ITfContext *pic, ITfRange *pRange);
CANDUIUIDIRECTION GetCandUIDirection(TfEditCookie ec, ITfContext *pic, ITfRange *pRange);
void CloseCandidateUIProc();
void SelectCandidate(TfEditCookie ec, ITfContext *pic, INT idxCand, BOOL fFinalize);
HMENU CreateCandidateMenu(ITfContext *pic);
static HRESULT CandidateUICallBack(ITfContext *pic, ITfRange *pRange, CCandidateListEx *pCandList, CCandidateStringEx *pCand, TfCandidateResult imcr);
// Cand key
void SetCandidateKeyTable(ITfContext *pic, CANDUIUIDIRECTION dir);
static BOOL IsCandKey(WPARAM wParam, const BYTE abKeyState[256]);
#if 0
// Range functions
void BackupRange(TfEditCookie ec, ITfContext *pic, ITfRange* pRange );
void RestoreRange(TfEditCookie ec, ITfContext *pic );
ITfRange* CreateIPRange(TfEditCookie ec, ITfContext *pic, ITfRange* pRangeOrg);
void SetIPRange(TfEditCookie ec, ITfContext *pic, ITfRange* pRange);
ITfRange* GetIPRange(TfEditCookie ec, ITfContext *pic);
BOOL FlushIPRange(TfEditCookie ec, ITfContext *pic);
#endif
// Modebias(ImmSetConversionStatus() API AIMM compatebility)
BOOL InitializeModeBias(TfEditCookie ec, ITfContext *pic);
void CheckModeBias(ITfContext* pic);
BOOL CheckModeBias(TfEditCookie ec, ITfContext *pic, ITfRange *pSelection);
// SoftKeyboard
//void OnActivatedSoftKbd(BOOl bActivated);
HRESULT ShowSoftKBDWindow(BOOL fShow);
void SoftKbdOnThreadFocusChange(BOOL fSet);
// Helpers
BOOL MySetText(TfEditCookie ec, ITfContext *pic, ITfRange *pRange, const WCHAR *psz, LONG cchText, LANGID langid, GUID *pattr);
BOOL IsKorIMX_GUID_ATOM(TfGuidAtom attr);
///////////////////////////////////////////////////////////////////////////////
// Internal data
private:
ITfDocumentMgr *m_pCurrentDim;
ITfThreadMgr *m_ptim;
TfClientId m_tid;
CThreadMgrEventSink *m_ptimEventSink;
CKeyEventSink *m_pkes;
HWND m_hOwnerWnd;
BOOL m_fKeyFocus;
CPadCore *m_pPadCore;
CToolBar *m_pToolBar;
DWORD m_dwThreadFocusCookie;
DWORD m_dwProfileNotifyCookie;
BOOL m_fPendingCleanup;
CFunctionProvider* m_pFuncPrv;
// For overtyping
CCompositionInsertHelper *m_pInsertHelper;
// Candidate UI
ITfCandidateUI* m_pCandUI;
BOOL m_fCandUIOpen;
// SoftKbd
BOOL m_fSoftKbdEnabled;
ISoftKbd *m_pSoftKbd;
SOFTLAYOUT m_KbdStandard;
SOFTLAYOUT m_KbdHangul;
CSoftKbdWindowEventSink *m_psftkbdwndes;
DWORD m_dwSftKbdwndesCookie;
BOOL m_fSoftKbdOnOffSave;
// Tls for our helper library, we're apt threaded so tls can live in this object
LIBTHREAD m_libTLS;
BOOL m_fNoKorKbd;
};
/*---------------------------------------------------------------------------
CKorIMX::IsPendingCleanup
---------------------------------------------------------------------------*/
inline
BOOL CKorIMX::IsPendingCleanup()
{
return m_fPendingCleanup;
}
/*---------------------------------------------------------------------------
CKorIMX::GetFocusDIM
---------------------------------------------------------------------------*/
inline
HRESULT CKorIMX::GetFocusDIM(ITfDocumentMgr **ppdim)
{
Assert(ppdim);
*ppdim = NULL;
if (m_ptim != NULL)
m_ptim->GetFocus(ppdim);
return *ppdim ? S_OK : E_FAIL;
}
#include "icpriv.h"
/*---------------------------------------------------------------------------
CKorIMX::GetAutomata
---------------------------------------------------------------------------*/
inline
CHangulAutomata* CKorIMX::GetAutomata(ITfContext *pic)
{
CICPriv* picp = GetInputContextPriv(pic);
return (picp) ? GetInputContextPriv(pic)->GetAutomata() : NULL;
}
/*---------------------------------------------------------------------------
CKorIMX::IsOn
---------------------------------------------------------------------------*/
inline
BOOL CKorIMX::IsOn(ITfContext *pic)
{
DWORD dw = 0;
if (pic == NULL)
return fFalse;
GetCompartmentDWORD(GetTIM(), GUID_COMPARTMENT_KEYBOARD_OPENCLOSE, &dw, fFalse);
return dw ? fTrue : fFalse;
}
/*---------------------------------------------------------------------------
CKorIMX::GetConvMode
---------------------------------------------------------------------------*/
inline
DWORD CKorIMX::GetConvMode(ITfContext *pic)
{
DWORD dw = 0;
if (pic == NULL)
return TIP_ALPHANUMERIC_MODE;
GetCompartmentDWORD(GetTIM(), GUID_COMPARTMENT_KORIMX_CONVMODE, &dw, fFalse);
return dw;
}
/*---------------------------------------------------------------------------
CKorIMX::SetOnOff
---------------------------------------------------------------------------*/
inline
void CKorIMX::SetOnOff(ITfContext *pic, BOOL fOn)
{
if (pic)
SetCompartmentDWORD(m_tid, GetTIM(), GUID_COMPARTMENT_KEYBOARD_OPENCLOSE, fOn ? 0x01 : 0x00, fFalse);
}
/*---------------------------------------------------------------------------
CKorIMX::GetLangID
---------------------------------------------------------------------------*/
inline
LANGID CKorIMX::GetLangID()
{
return MAKELANGID(LANG_KOREAN, SUBLANG_DEFAULT);
}
/*---------------------------------------------------------------------------
CKorIMX::IsKorIMX_GUID_ATOM
---------------------------------------------------------------------------*/
inline
BOOL CKorIMX::IsKorIMX_GUID_ATOM(TfGuidAtom attr)
{
if (IsEqualTFGUIDATOM(&m_libTLS, attr, GUID_ATTR_KORIMX_INPUT))
return fTrue;
return fFalse;
}
/////////////////////////////////////////////////////////////////////////////
// S O F T K E Y B O A R D F U N C T I O N S
/////////////////////////////////////////////////////////////////////////////
/*---------------------------------------------------------------------------
CKorIMX::GetSoftKBDOnOff
---------------------------------------------------------------------------*/
inline
BOOL CKorIMX::GetSoftKBDOnOff()
{
DWORD dw;
if (GetTIM() == NULL)
return fFalse;
GetCompartmentDWORD(GetTIM(), GUID_COMPARTMENT_KOR_SOFTKBD_OPENCLOSE , &dw, fFalse);
return dw ? TRUE : fFalse;
}
/*---------------------------------------------------------------------------
CKorIMX::SetSoftKBDOnOff
---------------------------------------------------------------------------*/
inline
void CKorIMX::SetSoftKBDOnOff(BOOL fOn)
{
// check to see if the m_pSoftKbd and soft keyboard related members are initialized.
if (m_fSoftKbdEnabled == fFalse)
InitializeSoftKbd();
if (m_pSoftKbd == NULL || GetTIM() == NULL)
return;
if (fOn == GetSoftKBDOnOff())
return;
SetCompartmentDWORD(GetTID(), GetTIM(), GUID_COMPARTMENT_KOR_SOFTKBD_OPENCLOSE,
fOn ? 0x01 : 0x00 , fFalse);
}
/*---------------------------------------------------------------------------
CKorIMX::GetSoftKBDLayout
---------------------------------------------------------------------------*/
inline
DWORD CKorIMX::GetSoftKBDLayout( )
{
DWORD dw;
if (m_pSoftKbd == NULL || GetTIM() == NULL)
return NON_LAYOUT;
GetCompartmentDWORD(GetTIM(), GUID_COMPARTMENT_SOFTKBD_KBDLAYOUT, &dw, fFalse);
return dw;
}
/*---------------------------------------------------------------------------
CKorIMX::SetSoftKBDLayout
---------------------------------------------------------------------------*/
inline
void CKorIMX::SetSoftKBDLayout(DWORD dwKbdLayout)
{
// check to see if the _SoftKbd and soft keyboard related members are initialized.
if (m_fSoftKbdEnabled == fFalse )
InitializeSoftKbd();
if ((m_pSoftKbd == NULL) || (GetTIM() == NULL))
return;
SetCompartmentDWORD(GetTID(), GetTIM(), GUID_COMPARTMENT_SOFTKBD_KBDLAYOUT,
dwKbdLayout , fFalse);
}
/*---------------------------------------------------------------------------
CKorIMX::GetSoftKBDPosition
---------------------------------------------------------------------------*/
inline
HRESULT CKorIMX::GetSoftKBDPosition(int *xWnd, int *yWnd)
{
DWORD dwPos;
HRESULT hr = S_OK;
if ((m_pSoftKbd == NULL) || (GetTIM() == NULL))
return E_FAIL;
if (!xWnd || !yWnd)
return E_FAIL;
hr = GetCompartmentDWORD(GetTIM(), GUID_COMPARTMENT_SOFTKBD_WNDPOSITION, &dwPos, TRUE);
if (hr == S_OK)
{
*xWnd = dwPos & 0x0000ffff;
*yWnd = (dwPos >> 16) & 0x0000ffff;
hr = S_OK;
}
else
{
*xWnd = 0;
*yWnd = 0;
hr = E_FAIL;
}
return hr;
}
/*---------------------------------------------------------------------------
CKorIMX::SetSoftKBDPosition
---------------------------------------------------------------------------*/
inline
void CKorIMX::SetSoftKBDPosition(int xWnd, int yWnd )
{
DWORD dwPos;
DWORD left, top;
if ((m_pSoftKbd == NULL) || (GetTIM() == NULL))
return;
if (xWnd < 0)
left = 0;
else
left = (WORD)xWnd;
if (yWnd < 0)
top = 0;
else
top = (WORD)yWnd;
dwPos = ((DWORD)top << 16) + left;
SetCompartmentDWORD(GetTID(), GetTIM(), GUID_COMPARTMENT_SOFTKBD_WNDPOSITION,
dwPos, TRUE);
}
/////////////////////////////////////////////////////////////////////////////
// H E L P E R F U N C T I O N S
/////////////////////////////////////////////////////////////////////////////
/*---------------------------------------------------------------------------
SetSelectionBlock
Wrapper for SetSelection that takes only a single range and sets default style values.
---------------------------------------------------------------------------*/
inline
HRESULT SetSelectionBlock(TfEditCookie ec, ITfContext *pic, ITfRange *range)
{
TF_SELECTION sel;
sel.range = range;
sel.style.ase = TF_AE_NONE;
sel.style.fInterimChar = fTrue;
return pic->SetSelection(ec, 1, &sel);
}
/*---------------------------------------------------------------------------
SetThis
---------------------------------------------------------------------------*/
inline
void SetThis(HWND hWnd, LPARAM lParam)
{
SetWindowLongPtr(hWnd, GWLP_USERDATA,
(LONG_PTR)((CREATESTRUCT *)lParam)->lpCreateParams);
}
/*---------------------------------------------------------------------------
GetThis
---------------------------------------------------------------------------*/
inline
CKorIMX *GetThis(HWND hWnd)
{
CKorIMX *p = (CKorIMX *)GetWindowLongPtr(hWnd, GWLP_USERDATA);
Assert(p != NULL);
return p;
}
#endif // __KORIMX_H__INCLUDED_