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.
385 lines
13 KiB
385 lines
13 KiB
/****************************************************************************
|
|
IPOINT.CPP
|
|
|
|
Owner: cslim
|
|
Copyright (c) 1997-1999 Microsoft Corporation
|
|
|
|
IImeIPoint1 interface
|
|
|
|
History:
|
|
20-JUL-1999 cslim Created
|
|
*****************************************************************************/
|
|
|
|
#include "precomp.h"
|
|
#include "ipoint.h"
|
|
#include "imepad.h" // IImeIPoint
|
|
#include "debug.h"
|
|
|
|
/*----------------------------------------------------------------------------
|
|
CImeIPoint::CImeIPoint
|
|
|
|
Ctor
|
|
----------------------------------------------------------------------------*/
|
|
CIImeIPoint::CIImeIPoint()
|
|
{
|
|
m_cRef = 0;
|
|
m_pCIMECtx = NULL;
|
|
m_hIMC = (HIMC)0;
|
|
//m_pfnCallback = (IPUIControlCallBack)NULL;
|
|
m_dwCharNo = 1;
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------
|
|
CImeIPoint::~CIImeIPoint
|
|
|
|
Dtor
|
|
----------------------------------------------------------------------------*/
|
|
CIImeIPoint::~CIImeIPoint()
|
|
{
|
|
if (m_pCIMECtx)
|
|
{
|
|
delete m_pCIMECtx;
|
|
m_pCIMECtx = NULL;
|
|
m_hIMC = (HIMC)0;
|
|
}
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------
|
|
CImeIPoint::QueryInterface
|
|
----------------------------------------------------------------------------*/
|
|
STDMETHODIMP CIImeIPoint::QueryInterface(REFIID riid, LPVOID * ppv)
|
|
{
|
|
if(riid == IID_IUnknown)
|
|
{
|
|
Dbg(DBGID_IMEPAD, ("IID_IUnknown\n"));
|
|
*ppv = static_cast<IImeIPoint1 *>(this);
|
|
}
|
|
else
|
|
if(riid == IID_IImeIPoint1)
|
|
{
|
|
Dbg(DBGID_IMEPAD, TEXT("IID_IImeIPoint1\n"));
|
|
*ppv = static_cast<IImeIPoint1 *>(this);
|
|
}
|
|
else
|
|
{
|
|
Dbg(DBGID_IMEPAD, ("Unknown Interface ID\n"));
|
|
*ppv = NULL;
|
|
return E_NOINTERFACE;
|
|
}
|
|
|
|
// Increase ref counter
|
|
reinterpret_cast<IUnknown *>(*ppv)->AddRef();
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------
|
|
CImeIPoint::AddRef
|
|
----------------------------------------------------------------------------*/
|
|
STDMETHODIMP_(ULONG) CIImeIPoint::AddRef(VOID)
|
|
{
|
|
return InterlockedIncrement((LPLONG)&m_cRef);
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------
|
|
CImeIPoint::Release
|
|
----------------------------------------------------------------------------*/
|
|
STDMETHODIMP_(ULONG) CIImeIPoint::Release(VOID)
|
|
{
|
|
ULONG res = InterlockedDecrement((LPLONG)&m_cRef);
|
|
if (res == 0L)
|
|
delete this;
|
|
return res;
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------
|
|
CImeIPoint::Initialize
|
|
----------------------------------------------------------------------------*/
|
|
HRESULT CIImeIPoint::Initialize(HIMC hIMC)
|
|
{
|
|
m_hIMC = hIMC;
|
|
|
|
if (hIMC)
|
|
m_pCIMECtx = new CIMECtx(hIMC);
|
|
|
|
return (S_OK);
|
|
}
|
|
|
|
#ifndef DEBUG
|
|
#define DumpFEInfo /##/
|
|
#else
|
|
/*----------------------------------------------------------------------------
|
|
DumpFEInfo
|
|
|
|
Dump LPIMEFAREASTINFO. Debug only
|
|
----------------------------------------------------------------------------*/
|
|
VOID DumpFEInfo(LPIMEFAREASTINFO lpInfo, INT count)
|
|
{
|
|
Dbg(DBGID_IMEPAD, "DumpFEInfo Start\n");
|
|
Dbg(DBGID_IMEPAD, "lpInfo [0x%08x]\n", lpInfo);
|
|
Dbg(DBGID_IMEPAD, "lpInfo->dwSize [%d]\n", lpInfo->dwSize);
|
|
Dbg(DBGID_IMEPAD, "lpInfo->dwType [0x%08x]\n", lpInfo->dwType);
|
|
|
|
LPWSTR lpwstr;
|
|
|
|
switch(lpInfo->dwType)
|
|
{
|
|
case IMEFAREASTINFO_TYPE_COMMENT:
|
|
Dbg(DBGID_IMEPAD, ("-->dwType is IMEFAREASTINFO_TYPE_COMMENT\n"));
|
|
lpwstr = (LPWSTR)lpInfo->dwData;
|
|
for(int i=0;i < count; i++)
|
|
{
|
|
//DbgW(DBGID_IMEPAD, L"%d [%s]\n", i, lpwstr);
|
|
lpwstr = lpwstr + lstrlenW(lpwstr)+1;
|
|
}
|
|
break;
|
|
}
|
|
|
|
|
|
Dbg(DBGID_IMEPAD, ("DumpFEInfo End\n"));
|
|
}
|
|
#endif // _DEBUG
|
|
|
|
/*----------------------------------------------------------------------------
|
|
CImeIPoint::InsertImeItem
|
|
|
|
Multibox input call this method
|
|
----------------------------------------------------------------------------*/
|
|
STDMETHODIMP CIImeIPoint::InsertImeItem(IPCANDIDATE* pImeItem, INT iPos, DWORD *lpdwCharId)
|
|
{
|
|
DWORD dwCharId;
|
|
|
|
// Check Parameters
|
|
DbgAssert(pImeItem != NULL && pImeItem->dwSize > 0);
|
|
|
|
if (pImeItem == NULL || pImeItem->dwSize <= 0 || m_pCIMECtx == NULL)
|
|
return S_FALSE;
|
|
|
|
Dbg(DBGID_IMEPAD, "CImeIPoint::InsertImeItem\n");
|
|
Dbg(DBGID_IMEPAD, "pImeItem [0x%08x]\n", pImeItem);
|
|
Dbg(DBGID_IMEPAD, "pImeItem->dwSize [%d]\n", pImeItem->dwSize);
|
|
Dbg(DBGID_IMEPAD, "pImeItem->iSelIndex [%d]\n", pImeItem->iSelIndex);
|
|
Dbg(DBGID_IMEPAD, "pImeItem->nCandidate[%d]\n", pImeItem->nCandidate);
|
|
Dbg(DBGID_IMEPAD, "pImeItem->dwPrivateDataOffset[%d]\n", pImeItem->dwPrivateDataOffset);
|
|
Dbg(DBGID_IMEPAD, "pImeItem->dwPrivateDataSize [%d]\n", pImeItem->dwPrivateDataSize);
|
|
DumpFEInfo((LPIMEFAREASTINFO)((LPBYTE)pImeItem + pImeItem->dwPrivateDataOffset), pImeItem->nCandidate);
|
|
|
|
Dbg(DBGID_IMEPAD, "lpdwCharId [0x%08x] [%d]\n", lpdwCharId, lpdwCharId ? *lpdwCharId : 0xFFFFF);
|
|
|
|
|
|
//INT i;
|
|
|
|
//for(i = 0; i < pImeItem->nCandidate; i++)
|
|
// {
|
|
// LPWSTR lpwstr = (LPWSTR)((PBYTE)pImeItem + pImeItem->dwOffset[i]);
|
|
//Dbg(DBGID_IMEPAD, (L"pImeItem->dwOffset[%d]=[%d] String[%s]\n", i, pImeItem->dwOffset[i], lpwstr));
|
|
// }
|
|
|
|
// If interim state, finalize it first
|
|
if (m_pCIMECtx->GetCompBufLen())
|
|
{
|
|
m_pCIMECtx->FinalizeCurCompositionChar();
|
|
m_pCIMECtx->GenerateMessage();
|
|
}
|
|
|
|
// Just out first candidate. Discard all others
|
|
// Access 2000 hangs if send only result string.
|
|
m_pCIMECtx->SetStartComposition(fTrue);
|
|
m_pCIMECtx->GenerateMessage();
|
|
|
|
m_pCIMECtx->SetEndComposition(fTrue);
|
|
m_pCIMECtx->SetResultStr(*(LPWSTR)((PBYTE)pImeItem + pImeItem->dwOffset[0]));
|
|
m_pCIMECtx->StoreComposition();
|
|
m_pCIMECtx->GenerateMessage();
|
|
|
|
// Increase Char serial number
|
|
m_dwCharNo++;
|
|
dwCharId = m_dwCharNo;
|
|
if (lpdwCharId)
|
|
{
|
|
dwCharId |= ((*lpdwCharId) & (~ IPCHARID_CHARNO_MASK));
|
|
*lpdwCharId = dwCharId;
|
|
}
|
|
|
|
return (S_OK);
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------
|
|
CImeIPoint::ReplaceImeItem
|
|
----------------------------------------------------------------------------*/
|
|
STDMETHODIMP CIImeIPoint::ReplaceImeItem(
|
|
INT iPos, // = IPINS_CURRENT:use current IP position and
|
|
// set IP to the end of insert chars.
|
|
// = 0-n: The offset of all composition string to set
|
|
// IP position, before insert chars.
|
|
// and IP back to original position.
|
|
INT iTargetLen,
|
|
IPCANDIDATE* pImeItem,
|
|
DWORD *lpdwCharId)
|
|
{
|
|
return (E_NOTIMPL);
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------
|
|
CImeIPoint::InsertStringEx
|
|
----------------------------------------------------------------------------*/
|
|
STDMETHODIMP CIImeIPoint::InsertStringEx(WCHAR* pwSzInsert, INT cchSzInsert, DWORD *lpdwCharId)
|
|
{
|
|
DWORD dwCharId;
|
|
|
|
Dbg(DBGID_IMEPAD, TEXT("CIImeIPoint::InsertStringEx : *pwSzInsert=0x%04X, cchSzInsert=%d, *lpdwCharId = 0x%04X"), *pwSzInsert, cchSzInsert, *lpdwCharId);
|
|
|
|
// Check Parameters
|
|
DbgAssert(pwSzInsert != NULL && cchSzInsert > 0);
|
|
|
|
if (pwSzInsert == NULL || cchSzInsert <= 0 || m_pCIMECtx == NULL)
|
|
return S_FALSE;
|
|
|
|
// Insert comp string to IME
|
|
|
|
// If interim state, finalize it first
|
|
if (m_pCIMECtx->GetCompBufLen())
|
|
{
|
|
m_pCIMECtx->FinalizeCurCompositionChar();
|
|
m_pCIMECtx->GenerateMessage();
|
|
}
|
|
|
|
// Add all chars in string as finalized string
|
|
for (INT i=0; i<cchSzInsert; i++)
|
|
{
|
|
// Access 2000 hangs if send only result string.
|
|
m_pCIMECtx->SetStartComposition(fTrue);
|
|
m_pCIMECtx->GenerateMessage();
|
|
|
|
m_pCIMECtx->SetEndComposition(fTrue);
|
|
m_pCIMECtx->SetResultStr(*(pwSzInsert + i));
|
|
m_pCIMECtx->StoreComposition();
|
|
m_pCIMECtx->GenerateMessage();
|
|
|
|
// Increase Char serial number
|
|
m_dwCharNo++;
|
|
dwCharId = m_dwCharNo;
|
|
if (lpdwCharId)
|
|
{
|
|
dwCharId |= ((*lpdwCharId) & (~ IPCHARID_CHARNO_MASK));
|
|
*lpdwCharId = dwCharId;
|
|
}
|
|
}
|
|
return (S_OK);
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------
|
|
CImeIPoint::DeleteCompString
|
|
----------------------------------------------------------------------------*/
|
|
STDMETHODIMP CIImeIPoint::DeleteCompString(INT iPos,
|
|
INT cchSzDel)
|
|
{
|
|
Dbg(DBGID_IMEPAD, ("CImeIPoint::DeleteCompString\n"));
|
|
return (E_NOTIMPL);
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------
|
|
CImeIPoint::ReplaceCompString
|
|
----------------------------------------------------------------------------*/
|
|
STDMETHODIMP CIImeIPoint::ReplaceCompString(INT iPos,
|
|
INT iTargetLen,
|
|
WCHAR *pwSzInsert,
|
|
INT cchSzInsert,
|
|
DWORD *lpdwCharId)
|
|
{
|
|
Dbg(DBGID_IMEPAD, ("CImeIPoint::ReplaceCompString\n"));
|
|
return (E_NOTIMPL);
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------
|
|
CImeIPoint::ControlIME
|
|
----------------------------------------------------------------------------*/
|
|
STDMETHODIMP CIImeIPoint::ControlIME(DWORD dwIMEFuncID, LPARAM lpara)
|
|
{
|
|
Dbg(DBGID_IMEPAD, ("CImeIPoint::ControlIME, dwIMEFuncID=0x%04X, lpara=0x%08lX\n"), dwIMEFuncID, lpara);
|
|
|
|
// TODO:
|
|
|
|
return (E_NOTIMPL);
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------
|
|
CImeIPoint::GetAllCompositionInfo
|
|
----------------------------------------------------------------------------*/
|
|
STDMETHODIMP CIImeIPoint::GetAllCompositionInfo(WCHAR** ppwSzCompStr,
|
|
DWORD** ppdwCharID,
|
|
INT *pcchCompStr,
|
|
INT *piIPPos,
|
|
INT *piStartUndetStrPos,
|
|
INT *pcchUndetStr,
|
|
INT *piEditStart,
|
|
INT *piEditLen)
|
|
{
|
|
// TODO:
|
|
Dbg(DBGID_IMEPAD, ("CImeIPoint::GetAllCompositionInfo START\n"));
|
|
|
|
if(ppwSzCompStr)
|
|
{
|
|
*ppwSzCompStr = NULL; //(LPWSTR)CoTaskMemAlloc(sizeof(WCHAR)*10);
|
|
//CopyMemory(*ppwSzCompStr, L"“ú–{Œê�ˆ—�", sizeof(WCHAR)*6);
|
|
}
|
|
|
|
if(ppdwCharID)
|
|
{
|
|
*ppdwCharID = NULL; //(DWORD *)CoTaskMemAlloc(sizeof(DWORD)*10);
|
|
//for(int i = 0; i < 5; i++)
|
|
// {
|
|
// (*ppdwCharID)[i] = i;
|
|
// }
|
|
}
|
|
|
|
if (pcchCompStr)
|
|
*pcchCompStr = 0;
|
|
if (piIPPos)
|
|
*piIPPos = 0;
|
|
if (piStartUndetStrPos)
|
|
*piStartUndetStrPos = 0;
|
|
if (pcchUndetStr)
|
|
*pcchUndetStr = 0;
|
|
if (piEditStart)
|
|
*piEditStart = 0;
|
|
if (piEditLen)
|
|
*piEditLen = 0;
|
|
Dbg(DBGID_IMEPAD, ("CImeIPoint::GetAllCompositionInfo END\n"));
|
|
|
|
return (S_OK);
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------
|
|
CImeIPoint::GetIpCandidate
|
|
----------------------------------------------------------------------------*/
|
|
STDMETHODIMP CIImeIPoint::GetIpCandidate(DWORD dwCharId,
|
|
IPCANDIDATE **ppImeItem,
|
|
INT * piColumn,
|
|
INT * piCount)
|
|
{
|
|
Dbg(DBGID_IMEPAD, ("CImeIPoint::GetIpCandidate\n"));
|
|
return (E_NOTIMPL);
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------
|
|
CImeIPoint::SelectIpCandidate
|
|
----------------------------------------------------------------------------*/
|
|
STDMETHODIMP CIImeIPoint::SelectIpCandidate(DWORD dwCharId, INT iselno)
|
|
{
|
|
Dbg(DBGID_IMEPAD, ("CImeIPoint::SetIpCandidate\n"));
|
|
return (E_NOTIMPL);
|
|
}
|
|
|
|
/*----------------------------------------------------------------------------
|
|
CImeIPoint::UpdateContext
|
|
|
|
Update IME context and send it to the application
|
|
----------------------------------------------------------------------------*/
|
|
STDMETHODIMP CIImeIPoint::UpdateContext(BOOL fGenerateMessage)
|
|
{
|
|
Dbg(DBGID_IMEPAD, ("CImeIPoint::UpdateContext\n"));
|
|
|
|
// TODO:
|
|
return (S_OK);
|
|
}
|