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.
 
 
 
 
 
 

407 lines
12 KiB

#include <windows.h>
#include <windowsx.h>
#include <objbase.h>
#include "memmgr.h"
#include "hwxapp.h"
#include "hwxobj.h"
#include "resource.h"
#include "guids.h" //980408:ToshiaK
#include "hwxfe.h" //980803 new: By ToshiaK
#include "dbg.h"
#include "ipoint1.h" //990507:HiroakiK for IPINS_CURRENT
#ifdef UNDER_CE // Windows CE Stub for unsupported APIs
#include "stub_ce.h"
#endif // UNDER_CE
STDMETHODIMP CApplet::QueryInterface(REFIID refiid, VOID **ppv)
{
if(refiid == IID_IUnknown) {
*ppv = static_cast<IImePadApplet *>(this);
}
else if(refiid == IID_IImeSpecifyApplets) {
*ppv = static_cast<IImeSpecifyApplets *>(this);
}
else if(refiid == IID_MultiBox) {
*ppv = static_cast<IImePadApplet *>(this);
}
else {
*ppv = NULL;
return E_NOINTERFACE;
}
reinterpret_cast<IUnknown *>(*ppv)->AddRef();
return S_OK;
}
STDMETHODIMP_(ULONG) CApplet::AddRef(void)
{
return InterlockedIncrement(&m_cRef);
}
STDMETHODIMP_(ULONG) CApplet::Release(void)
{
if(InterlockedDecrement(&m_cRef) == 0) {
delete this;
return 0;
}
return m_cRef;
}
//////////////////////////////////////////////////////////////////
// Function : CApplet::GetAppletIIDList
// Type : STDMETHODIMP
// Purpose : Enhancement for IME98A
// Args :
// : REFIID refiid
// : LPAPPLETIDLIST lpIIDList
// Return :
// DATE : Thu Apr 09 22:46:04 1998
// Author : ToshiaK
//////////////////////////////////////////////////////////////////
STDMETHODIMP CApplet::GetAppletIIDList(REFIID refiid,
LPAPPLETIDLIST lpIIDList)
{
if(refiid == IID_IImePadApplet) {
lpIIDList->pIIDList = (IID *)::CoTaskMemAlloc(sizeof(IID)*1);
if(!lpIIDList->pIIDList) {
return E_OUTOFMEMORY;
}
lpIIDList->pIIDList[0] = IID_MultiBox;
lpIIDList->count = 1;
return S_OK;
}
return E_NOINTERFACE;
}
CApplet::CApplet()
{
m_cRef = 1; //ToshiaK
m_pPad = NULL;
m_bInit = FALSE;
m_hInstance = NULL;
m_pCHwxInkWindow = NULL;
}
CApplet::CApplet(HINSTANCE hInst)
{
m_cRef = 1;
m_pPad = NULL;
m_bInit = FALSE;
m_hInstance = hInst;
m_pCHwxInkWindow = NULL;
}
CApplet::~CApplet()
{
// should call Terminate() before deleting CApplet object
}
// detect if this IME instance is attached to a 16-bit program
DWORD WINAPI Dummy(LPVOID pv)
{
return 0;
UNREFERENCED_PARAMETER(pv);
}
//----------------------------------------------------------------
//ToshiaK: temporary Code
//----------------------------------------------------------------
static INT GetPlatform(VOID)
{
static INT platForm;
static BOOL fFirst = TRUE;
static OSVERSIONINFO verInfo;
if(fFirst) {
verInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
if ( GetVersionEx( &verInfo) ) {
fFirst = FALSE;
}
platForm = verInfo.dwPlatformId;
}
return platForm;
}
BOOL IsWindowsNT(VOID)
{
#ifndef UNDER_CE // Windows CE
if(GetPlatform() == VER_PLATFORM_WIN32_NT) {
return TRUE;
}
return FALSE;
#else // UNDER_CE
return TRUE;
#endif // UNDER_CE
}
STDMETHODIMP CApplet::Initialize(IUnknown *pIImePad)
{
HRESULT hr = S_OK;
if ( !m_bInit )
{
//for IME98A Enhancement: By ToshiaK
pIImePad->QueryInterface(IID_IImePad, (LPVOID *)&m_pPad);
// support both WINDOWS95 and WINDOWS NT
//----------------------------------------------------------------
//ToshiaK: 970715
//opengl32.dll is included in Memphis
//below code recognize platform as WinNT in Memphis environment
//----------------------------------------------------------------
BOOL bNT = IsWindowsNT();
HANDLE hLib;
// see if this IME is attached to a 16 bit program
BOOL b16 = FALSE;
//DWORD dID = 0;
hLib = NULL;
// hLib = CreateThread(NULL,0,Dummy,NULL,CREATE_SUSPENDED,&dID);
#ifdef BUGBUG
hLib = CreateThread(NULL,0,Dummy,NULL,0,&dID);
if ( !hLib )
b16 = TRUE;
else
CloseHandle(hLib);
#endif
b16 = CHwxFE::Is16bitApplication();
Dbg(("b16 %d\n", b16));
// GetModuleFileName(m_hInstance, tchPath, sizeof(tchPath)/sizeof(tchPath[0]));
m_pCHwxInkWindow = (CHwxInkWindow *)new CHwxInkWindow(bNT,b16,this,m_hInstance);
if ( !m_pCHwxInkWindow )
{
m_pPad->Release();
m_pPad = NULL;
hr = S_FALSE;
}
if ( hr == S_OK )
{
if ( !m_pCHwxInkWindow->Initialize(TEXT("CHwxInkWindow")) )
{
m_pPad->Release();
m_pPad = NULL;
delete m_pCHwxInkWindow;
m_pCHwxInkWindow = NULL;
hr = S_FALSE;
}
else
{
m_bInit = TRUE;
}
}
}
return hr;
}
STDMETHODIMP CApplet::Terminate(VOID)
{
Dbg(("CApplet::Terminate START\n"));
if ( m_pPad )
{
m_pPad->Release();
m_pPad = NULL;
}
m_hInstance = NULL;
m_bInit = FALSE;
if ( m_pCHwxInkWindow )
{
m_pCHwxInkWindow->Terminate();
delete m_pCHwxInkWindow;
m_pCHwxInkWindow = NULL;
}
return S_OK;
}
STDMETHODIMP CApplet::GetAppletConfig(LPIMEAPPLETCFG lpAppletCfg)
{
//----------------------------------------------------------------
//980803: by ToshiaKfor FarEast merge.
//----------------------------------------------------------------
CHwxFE::GetTitleStringW(m_hInstance,
lpAppletCfg->wchTitle,
sizeof(lpAppletCfg->wchTitle)/sizeof(lpAppletCfg->wchTitle[0]));
BOOL b16 = FALSE;
//DWORD dID = 0;
//HANDLE hLib = NULL;
#ifdef BUGBUG //981120
hLib = CreateThread(NULL,0,Dummy,NULL,0,&dID);
if ( !hLib )
b16 = TRUE;
else
CloseHandle(hLib);
#endif
//we have to use this one to check this.
b16 = CHwxFE::Is16bitApplication();
#ifdef FE_JAPANESE
lpAppletCfg->hIcon = (HICON)LoadImage(m_hInstance,
MAKEINTRESOURCE(IDI_HWXPAD),
IMAGE_ICON,16,16,LR_DEFAULTCOLOR);
#elif FE_KOREAN
lpAppletCfg->hIcon = (HICON)LoadImage(m_hInstance,
MAKEINTRESOURCE(IDI_HWXPADKO),
IMAGE_ICON,16,16,LR_DEFAULTCOLOR);
#elif FE_CHINESE_SIMPLIFIED
lpAppletCfg->hIcon = (HICON)LoadImage(m_hInstance,
MAKEINTRESOURCE(IDI_HWXPADSC),
IMAGE_ICON,16,16,LR_DEFAULTCOLOR);
#endif
lpAppletCfg->dwConfig = (!b16 ? IPACFG_PROPERTY : 0) | IPACFG_HELP;
lpAppletCfg->iCategory = IPACID_HANDWRITING; //970812:ToshiaK
//----------------------------------------------------------------
//000804: Satori #2286. for Check Applet's main language to invoke help.
//----------------------------------------------------------------
#ifdef FE_JAPANESE
lpAppletCfg->langID = MAKELANGID(LANG_JAPANESE, SUBLANG_DEFAULT);
#elif FE_KOREAN
lpAppletCfg->langID = MAKELANGID(LANG_KOREAN, SUBLANG_DEFAULT);
#elif FE_CHINESE_SIMPLIFIED
lpAppletCfg->langID = MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED);
#endif
return S_OK;
}
STDMETHODIMP CApplet::CreateUI(HWND hwndParent,
LPIMEAPPLETUI lpImeAppletUI)
{
HRESULT hr = S_OK;
if( m_pCHwxInkWindow )
{
if ( !m_pCHwxInkWindow->GetInkWindow() )
{
if ( !m_pCHwxInkWindow->CreateUI(hwndParent) )
{
hr = S_FALSE;
}
}
lpImeAppletUI->dwStyle = IPAWS_SIZINGNOTIFY;
lpImeAppletUI->hwnd = m_pCHwxInkWindow->GetInkWindow();
lpImeAppletUI->width = m_pCHwxInkWindow->GetInkWindowWidth() + 3*Box_Border;
lpImeAppletUI->height = m_pCHwxInkWindow->GetInkWindowHeight();
}
else
{
hr = S_FALSE;
}
return hr;
}
STDMETHODIMP CApplet::Notify(IUnknown *pImePad,
INT notify,
WPARAM wParam,
LPARAM lParam)
{
switch (notify)
{
case IMEPN_ACTIVATE:
if ( m_pCHwxInkWindow )
{
UpdateWindow(GetParent(m_pCHwxInkWindow->GetInkWindow()));
InvalidateRect(m_pCHwxInkWindow->GetInkWindow(),NULL,TRUE);
UpdateWindow(m_pCHwxInkWindow->GetInkWindow());
}
break;
case IMEPN_INACTIVATE:
break;
case IMEPN_SHOW:
if ( m_pCHwxInkWindow )
{
//----------------------------------------------------------------
//for IME98A raid #2027.
//980612: by ToshiaK. Check window is created or not.
//when IMEPN_SHOW come before window has created,
// UpdateWindow(NULL); is called and Desktop flushes.
//----------------------------------------------------------------
if(m_pCHwxInkWindow->GetInkWindow() != NULL && ::IsWindow(m_pCHwxInkWindow->GetInkWindow())) {
UpdateWindow(GetParent(m_pCHwxInkWindow->GetInkWindow()));
InvalidateRect(m_pCHwxInkWindow->GetInkWindow(),NULL,TRUE);
UpdateWindow(m_pCHwxInkWindow->GetInkWindow());
if ( !m_pCHwxInkWindow->Is16BitApp() )
{
m_pCHwxInkWindow->UpdateRegistry(FALSE);
}
}
}
break;
case IMEPN_CONFIG:
if ( m_pCHwxInkWindow && !m_pCHwxInkWindow->Is16BitApp() )
m_pCHwxInkWindow->HandleConfigNotification();
break;
case IMEPN_HELP:
//----------------------------------------------------------------
//980803: for FarEast merge
//----------------------------------------------------------------
if(m_pCHwxInkWindow) {
CHwxFE::ShowHelp(m_pCHwxInkWindow->GetInkWindow());
}
break;
case IMEPN_SIZECHANGING:
if ( m_pCHwxInkWindow )
{
if(m_pCHwxInkWindow->HandleSizeNotify((INT *)wParam, (INT *)lParam)) {
return S_OK;
}
else {
return S_FALSE;
}
}
break;
default:
break;
}
return S_OK;
UNREFERENCED_PARAMETER(pImePad);
}
void CApplet::SendHwxChar(WCHAR wch)
{
WCHAR wstr[2];
wstr[0] = wch;
wstr[1] = 0;
m_pPad->Request(this,IMEPADREQ_INSERTSTRING,(WPARAM)wstr,0);
}
void CApplet::SendHwxStringCandidate(LPIMESTRINGCANDIDATE lpISC)
{
if ( lpISC ) {
if(m_pPad) {
m_pPad->Request(this,IMEPADREQ_INSERTSTRINGCANDIDATE,(WPARAM)lpISC,0);
}
}
}
void CApplet::SendHwxStringCandidateInfo(LPIMESTRINGCANDIDATEINFO lpISC)
{
if ( lpISC ) {
if(m_pPad) {
//----------------------------------------------------------------
//For Satori #2123. Don't use Ipoint1.h's definition,
//instead, use IPR_DEFAULT_INSERTPOS defined in imepad.h
//----------------------------------------------------------------
m_pPad->Request(this,
IMEPADREQ_INSERTSTRINGCANDIDATEINFO,
(WPARAM)lpISC,
IPR_DEFAULT_INSERTPOS); // IPINS_CURRENT);
}
}
}
void *CApplet::operator new(size_t size)
{
return MemAlloc(size);
}
void CApplet::operator delete(void *pv)
{
if(pv)
{
MemFree(pv);
}
}