2025-11-28 00:35:46 +09:00

278 lines
7.5 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) 2003 Microsoft Corporation. All rights reserved.
//
// DisplayAttribureInfo.cpp
//
// ITfDisplayAttributeProvider implementation.
//
//////////////////////////////////////////////////////////////////////
#include "globals.h"
#include "DisplayAttributeInfo.h"
//+---------------------------------------------------------------------------
//
// The registry key and values
//
//----------------------------------------------------------------------------
// the registry key of this text service to save the custmized display attribute
const TCHAR c_szAttributeInfoKey[] = TEXT("Software\\Sample Text Service");
// the registry values of the custmized display attributes
const TCHAR CDisplayAttributeInfoInput::_s_szValueName[] = TEXT("DisplayAttributeInput");
const TCHAR CDisplayAttributeInfoConverted::_s_szValueName[] = TEXT("DisplayAttributeConverted");
//+---------------------------------------------------------------------------
//
// The criptions
//
//----------------------------------------------------------------------------
const WCHAR CDisplayAttributeInfoInput::_s_szDescription[] = L"TextService Display Attribute Input";
const WCHAR CDisplayAttributeInfoConverted::_s_szDescription[] = L"TextService Display Attribute Converted";
//+---------------------------------------------------------------------------
//
// DisplayAttribute
//
//----------------------------------------------------------------------------
const TF_DISPLAYATTRIBUTE CDisplayAttributeInfoInput::_s_DisplayAttribute =
{
{ TF_CT_COLORREF, RGB(255, 0, 0) }, // text color
{ TF_CT_NONE, 0 }, // background color (TF_CT_NONE => app default)
TF_LS_SOLID, // underline style
FALSE, // underline boldness
{ TF_CT_COLORREF, RGB(255, 0, 0) }, // underline color
TF_ATTR_INPUT // attribute info
};
const TF_DISPLAYATTRIBUTE CDisplayAttributeInfoConverted::_s_DisplayAttribute =
{
{ TF_CT_COLORREF, RGB(255, 255, 255) }, // text color
{ TF_CT_COLORREF, RGB( 0, 255, 255) }, // background color (TF_CT_NONE => app default)
TF_LS_NONE, // underline style
FALSE, // underline boldness
{ TF_CT_NONE, 0 }, // underline color
TF_ATTR_TARGET_CONVERTED // attribute info
};
//+---------------------------------------------------------------------------
//
// ctor
//
//----------------------------------------------------------------------------
CDisplayAttributeInfo::CDisplayAttributeInfo()
{
DllAddRef();
_pguid = NULL;
_pDisplayAttribute = NULL;
_pszValueName = NULL;
_cRef = 1;
}
//+---------------------------------------------------------------------------
//
// dtor
//
//----------------------------------------------------------------------------
CDisplayAttributeInfo::~CDisplayAttributeInfo()
{
DllRelease();
}
//+---------------------------------------------------------------------------
//
// QueryInterface
//
//----------------------------------------------------------------------------
STDAPI CDisplayAttributeInfo::QueryInterface(REFIID riid, void **ppvObj)
{
if (ppvObj == NULL)
return E_INVALIDARG;
*ppvObj = NULL;
if (IsEqualIID(riid, IID_IUnknown) ||
IsEqualIID(riid, IID_ITfDisplayAttributeInfo))
{
*ppvObj = (ITfDisplayAttributeInfo *)this;
}
if (*ppvObj)
{
AddRef();
return S_OK;
}
return E_NOINTERFACE;
}
//+---------------------------------------------------------------------------
//
// AddRef
//
//----------------------------------------------------------------------------
ULONG CDisplayAttributeInfo::AddRef(void)
{
return ++_cRef;
}
//+---------------------------------------------------------------------------
//
// Release
//
//----------------------------------------------------------------------------
ULONG CDisplayAttributeInfo::Release(void)
{
LONG cr = --_cRef;
assert(_cRef >= 0);
if (_cRef == 0)
{
delete this;
}
return cr;
}
//+---------------------------------------------------------------------------
//
// GetGUID
//
//----------------------------------------------------------------------------
STDAPI CDisplayAttributeInfo::GetGUID(GUID *pguid)
{
if (pguid == NULL)
return E_INVALIDARG;
if (_pguid == NULL)
return E_FAIL;
*pguid = *_pguid;
return S_OK;
}
//+---------------------------------------------------------------------------
//
// GetDescription
//
//----------------------------------------------------------------------------
STDAPI CDisplayAttributeInfo::GetDescription(BSTR *pbstrDesc)
{
BSTR bstrDesc;
if (pbstrDesc == NULL)
return E_INVALIDARG;
*pbstrDesc = NULL;
if ((bstrDesc = SysAllocString(_pszDescription)) == NULL)
return E_OUTOFMEMORY;
*pbstrDesc = bstrDesc;
return S_OK;
}
//+---------------------------------------------------------------------------
//
// GetAttributeInfo
//
//----------------------------------------------------------------------------
STDAPI CDisplayAttributeInfo::GetAttributeInfo(TF_DISPLAYATTRIBUTE *ptfDisplayAttr)
{
HKEY hKeyAttributeInfo;
LONG lResult;
DWORD cbData;
if (ptfDisplayAttr == NULL)
return E_INVALIDARG;
if (_pszValueName == NULL)
return E_FAIL;
lResult = E_FAIL;
if (RegOpenKeyEx(HKEY_CURRENT_USER, c_szAttributeInfoKey, 0, KEY_READ, &hKeyAttributeInfo) == ERROR_SUCCESS)
{
cbData = sizeof(*ptfDisplayAttr);
lResult = RegQueryValueEx(hKeyAttributeInfo, _pszValueName,
NULL, NULL,
(LPBYTE)ptfDisplayAttr, &cbData);
RegCloseKey(hKeyAttributeInfo);
}
if (lResult != ERROR_SUCCESS || cbData != sizeof(*ptfDisplayAttr))
{
// return the default display attribute.
*ptfDisplayAttr = *_pDisplayAttribute;
}
return S_OK;
}
//+---------------------------------------------------------------------------
//
// SetAttributeInfo
//
//----------------------------------------------------------------------------
STDAPI CDisplayAttributeInfo::SetAttributeInfo(const TF_DISPLAYATTRIBUTE *ptfDisplayAttr)
{
HKEY hKeyAttributeInfo;
LONG lResult;
if (_pszValueName == NULL)
return E_FAIL;
lResult = RegCreateKeyEx(HKEY_CURRENT_USER, c_szAttributeInfoKey, 0, TEXT(""),
REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL,
&hKeyAttributeInfo, NULL);
if (lResult != ERROR_SUCCESS)
return E_FAIL;
lResult = RegSetValueEx(hKeyAttributeInfo, _pszValueName,
0, REG_BINARY, (const BYTE *)ptfDisplayAttr,
sizeof(*ptfDisplayAttr));
RegCloseKey(hKeyAttributeInfo);
return (lResult == ERROR_SUCCESS) ? S_OK : E_FAIL;
}
//+---------------------------------------------------------------------------
//
// Reset
//
//----------------------------------------------------------------------------
STDAPI CDisplayAttributeInfo::Reset()
{
return SetAttributeInfo(_pDisplayAttribute);
}