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.
 
 
 
 
 
 

364 lines
9.7 KiB

#include "private.h"
#include "globals.h"
#include "dispattr.h"
#include "proputil.h"
#include "catutil.h"
#include "ctffunc.h"
#include "helpers.h"
#include "ciccs.h"
extern CCicCriticalSectionStatic g_cs;
CDispAttrPropCache *g_pPropCache = NULL;
//+---------------------------------------------------------------------------
//
// GetDAMLib
//
//----------------------------------------------------------------------------
ITfDisplayAttributeMgr *GetDAMLib(LIBTHREAD *plt)
{
return plt->_pDAM;
}
//+---------------------------------------------------------------------------
//
// InitDisplayAttributeLib
//
//----------------------------------------------------------------------------
HRESULT InitDisplayAttrbuteLib(LIBTHREAD *plt)
{
IEnumGUID *pEnumProp = NULL;
if ( plt == NULL )
return E_FAIL;
if (plt->_pDAM)
plt->_pDAM->Release();
plt->_pDAM = NULL;
if (FAILED(g_pfnCoCreate(CLSID_TF_DisplayAttributeMgr,
NULL,
CLSCTX_INPROC_SERVER,
IID_ITfDisplayAttributeMgr,
(void**)&plt->_pDAM)))
{
return E_FAIL;
}
LibEnumItemsInCategory(plt, GUID_TFCAT_DISPLAYATTRIBUTEPROPERTY, &pEnumProp);
HRESULT hr;
EnterCriticalSection(g_cs);
//
// make a database for Display Attribute Properties.
//
if (pEnumProp && !g_pPropCache)
{
GUID guidProp;
g_pPropCache = new CDispAttrPropCache;
if (!g_pPropCache)
{
hr = E_OUTOFMEMORY;
goto Exit;
}
//
// add System Display Attribute first.
// so no other Display Attribute property overwrite it.
//
g_pPropCache->Add(GUID_PROP_ATTRIBUTE);
while(pEnumProp->Next(1, &guidProp, NULL) == S_OK)
{
if (!IsEqualGUID(guidProp, GUID_PROP_ATTRIBUTE))
g_pPropCache->Add(guidProp);
}
}
hr = S_OK;
Exit:
LeaveCriticalSection(g_cs);
SafeRelease(pEnumProp);
return hr;
}
//+---------------------------------------------------------------------------
//
// UninitDisplayAttributeLib
//
//----------------------------------------------------------------------------
HRESULT UninitDisplayAttrbuteLib(LIBTHREAD *plt)
{
Assert(plt);
if ( plt == NULL )
return E_FAIL;
if (plt->_pDAM)
plt->_pDAM->Release();
plt->_pDAM = NULL;
// if (plt->_fDAMCoInit)
// CoUninitialize();
//
// plt->_fDAMCoInit = FALSE;
return S_OK;
}
//+---------------------------------------------------------------------------
//
// GetDisplayAttributeTrackPropertyRange
//
//----------------------------------------------------------------------------
HRESULT GetDisplayAttributeTrackPropertyRange(TfEditCookie ec, ITfContext *pic, ITfRange *pRange, ITfReadOnlyProperty **ppProp, IEnumTfRanges **ppEnum, ULONG *pulNumProp)
{
ITfReadOnlyProperty *pProp = NULL;
HRESULT hr = E_FAIL;
GUID *pguidProp = NULL;
const GUID **ppguidProp;
ULONG ulNumProp = 0;
ULONG i;
EnterCriticalSection(g_cs);
if (!g_pPropCache)
goto Exit;
pguidProp = g_pPropCache->GetPropTable();
if (!pguidProp)
goto Exit;
ulNumProp = g_pPropCache->Count();
if (!ulNumProp)
goto Exit;
// TrackProperties wants an array of GUID *'s
if ((ppguidProp = (const GUID **)cicMemAlloc(sizeof(GUID *)*ulNumProp)) == NULL)
{
hr = E_OUTOFMEMORY;
goto Exit;
}
for (i=0; i<ulNumProp; i++)
{
ppguidProp[i] = pguidProp++;
}
if (SUCCEEDED(hr = pic->TrackProperties(ppguidProp,
ulNumProp,
0,
NULL,
&pProp)))
{
hr = pProp->EnumRanges(ec, ppEnum, pRange);
if (SUCCEEDED(hr))
{
*ppProp = pProp;
pProp->AddRef();
}
pProp->Release();
}
cicMemFree(ppguidProp);
if (SUCCEEDED(hr))
*pulNumProp = ulNumProp;
Exit:
LeaveCriticalSection(g_cs);
return hr;
}
//+---------------------------------------------------------------------------
//
// GetDisplayAttributeData
//
//----------------------------------------------------------------------------
HRESULT GetDisplayAttributeData(LIBTHREAD *plt, TfEditCookie ec, ITfReadOnlyProperty *pProp, ITfRange *pRange, TF_DISPLAYATTRIBUTE *pda, TfGuidAtom *pguid, ULONG ulNumProp)
{
VARIANT var;
IEnumTfPropertyValue *pEnumPropertyVal;
TF_PROPERTYVAL tfPropVal;
GUID guid;
TfGuidAtom gaVal;
ITfDisplayAttributeInfo *pDAI;
HRESULT hr = E_FAIL;
if (SUCCEEDED(pProp->GetValue(ec, pRange, &var)))
{
Assert(var.vt == VT_UNKNOWN);
if (SUCCEEDED(var.punkVal->QueryInterface(IID_IEnumTfPropertyValue,
(void **)&pEnumPropertyVal)))
{
while (pEnumPropertyVal->Next(1, &tfPropVal, NULL) == S_OK)
{
if (tfPropVal.varValue.vt == VT_EMPTY)
continue; // prop has no value over this span
Assert(tfPropVal.varValue.vt == VT_I4); // expecting GUIDATOMs
gaVal = (TfGuidAtom)tfPropVal.varValue.lVal;
GetGUIDFromGUIDATOM(plt, gaVal, &guid);
if ((plt != NULL) && SUCCEEDED(plt->_pDAM->GetDisplayAttributeInfo(guid, &pDAI, NULL)))
{
//
// Issue: for simple apps.
//
// Small apps can not show multi underline. So
// this helper function returns only one
// DISPLAYATTRIBUTE structure.
//
if (pda)
{
pDAI->GetAttributeInfo(pda);
}
if (pguid)
{
*pguid = gaVal;
}
pDAI->Release();
hr = S_OK;
break;
}
}
pEnumPropertyVal->Release();
}
VariantClear(&var);
}
return hr;
}
//+---------------------------------------------------------------------------
//
// GetAttributeColor
//
//----------------------------------------------------------------------------
HRESULT GetAttributeColor(TF_DA_COLOR *pdac, COLORREF *pcr)
{
switch (pdac->type)
{
case TF_CT_NONE:
return S_FALSE;
case TF_CT_SYSCOLOR:
*pcr = GetSysColor(pdac->nIndex);
break;
case TF_CT_COLORREF:
*pcr = pdac->cr;
break;
}
return S_OK;
}
//+---------------------------------------------------------------------------
//
// SetAttributeColor
//
//----------------------------------------------------------------------------
HRESULT SetAttributeColor(TF_DA_COLOR *pdac, COLORREF cr)
{
pdac->type = TF_CT_COLORREF;
pdac->cr = cr;
return S_OK;
}
//+---------------------------------------------------------------------------
//
// SetAttributeSysColor
//
//----------------------------------------------------------------------------
HRESULT SetAttributeSysColor(TF_DA_COLOR *pdac, int nIndex)
{
pdac->type = TF_CT_SYSCOLOR;
pdac->nIndex = nIndex;
return S_OK;
}
//+---------------------------------------------------------------------------
//
// ClearAttributeColor
//
//----------------------------------------------------------------------------
HRESULT ClearAttributeColor(TF_DA_COLOR *pdac)
{
pdac->type = TF_CT_NONE;
pdac->nIndex = 0;
return S_OK;
}
//+---------------------------------------------------------------------------
//
// GetReconversionFromDisplayAttribute
//
//----------------------------------------------------------------------------
HRESULT GetReconversionFromDisplayAttribute(LIBTHREAD *plt, TfEditCookie ec, ITfThreadMgr *ptim, ITfContext *pic, ITfRange *pRange, ITfFnReconversion **ppReconv, ITfDisplayAttributeMgr *pDAM)
{
IEnumTfRanges *epr = NULL;
ITfReadOnlyProperty *pProp;
ITfRange *proprange;
ULONG ulNumProp;
HRESULT hr = E_FAIL;
//
// get an enumorator
//
if (FAILED(GetDisplayAttributeTrackPropertyRange(ec, pic, pRange, &pProp, &epr, &ulNumProp)))
goto Exit;
//
// Get display attribute of the first proprange.
//
if (epr->Next(1, &proprange, NULL) == S_OK)
{
ITfRange *rangeTmp = NULL;
TfGuidAtom guidatom;
if (SUCCEEDED(GetDisplayAttributeData(plt, ec, pProp, proprange, NULL, &guidatom, ulNumProp)))
{
CLSID clsid;
GUID guid;
if (GetGUIDFromGUIDATOM(plt, guidatom, &guid) &&
SUCCEEDED(pDAM->GetDisplayAttributeInfo(guid, NULL, &clsid)))
{
ITfFunctionProvider *pFuncPrv;
if (SUCCEEDED(ptim->GetFunctionProvider(clsid, &pFuncPrv)))
{
hr = pFuncPrv->GetFunction(GUID_NULL, IID_ITfFnReconversion, (IUnknown **)ppReconv);
pFuncPrv->Release();
}
}
}
proprange->Release();
}
epr->Release();
pProp->Release();
Exit:
return hr;
}