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

342 lines
16 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) Microsoft Corporation. All rights reserved
#include "PropertyStore.h"
#include <UIRibbonPropertyHelpers.h>
#include <strsafe.h>
// Convert from IPropertyStore to CHARFORMAT2 so it can be used formatting text.
void GetCharFormat2FromIPropertyStore(__in IPropertyStore* pPropStore, __out CHARFORMAT2 *pCharFormat)
{
// Initialize the output parameter.
ZeroMemory(pCharFormat, sizeof(*pCharFormat));
pCharFormat->cbSize = sizeof(CHARFORMAT2);
PROPVARIANT propvar;
PropVariantInit(&propvar);
UINT uValue;
// Get the bold value from the property store.
if (SUCCEEDED(pPropStore->GetValue(UI_PKEY_FontProperties_Bold, &propvar)))
{
UIPropertyToUInt32(UI_PKEY_FontProperties_Bold, propvar, &uValue);
if ((UI_FONTPROPERTIES) uValue != UI_FONTPROPERTIES_NOTAVAILABLE)
{
// There is a value assigned, so set the corresponding members in CharFormat2 variable.
pCharFormat->dwMask |= CFM_BOLD;
pCharFormat->dwEffects |= ((UI_FONTPROPERTIES) uValue == UI_FONTPROPERTIES_SET) ? CFE_BOLD : 0;
}
}
PropVariantClear(&propvar);
// Get the italic value from the property store.
if (SUCCEEDED(pPropStore->GetValue(UI_PKEY_FontProperties_Italic, &propvar)))
{
UIPropertyToUInt32(UI_PKEY_FontProperties_Italic, propvar, &uValue);
if ((UI_FONTPROPERTIES) uValue != UI_FONTPROPERTIES_NOTAVAILABLE)
{
// There is a value assigned, so set the corresponding members in CharFormat2 variable.
pCharFormat->dwMask |= CFM_ITALIC;
pCharFormat->dwEffects |= ((UI_FONTPROPERTIES) uValue == UI_FONTPROPERTIES_SET) ? CFE_ITALIC : 0;
}
}
PropVariantClear(&propvar);
// Get the underline value from the property store.
if (SUCCEEDED(pPropStore->GetValue(UI_PKEY_FontProperties_Underline, &propvar)))
{
UIPropertyToUInt32(UI_PKEY_FontProperties_Underline, propvar, &uValue);
if ((UI_FONTUNDERLINE) uValue != UI_FONTUNDERLINE_NOTAVAILABLE)
{
// There is a value assigned, so set the corresponding members in CharFormat2 variable.
pCharFormat->dwMask |= CFM_UNDERLINE;
pCharFormat->dwEffects |= ((UI_FONTUNDERLINE) uValue == UI_FONTUNDERLINE_SET) ? CFE_UNDERLINE : 0;
}
}
PropVariantClear(&propvar);
// Get the strikethrough value from the property store.
if (SUCCEEDED(pPropStore->GetValue(UI_PKEY_FontProperties_Strikethrough, &propvar)))
{
UIPropertyToUInt32(UI_PKEY_FontProperties_Strikethrough, propvar, &uValue);
if ((UI_FONTPROPERTIES) uValue != UI_FONTPROPERTIES_NOTAVAILABLE)
{
// There is a value assigned, so set the corresponding members in CharFormat2 variable.
pCharFormat->dwMask |= CFM_STRIKEOUT;
pCharFormat->dwEffects |= ((UI_FONTPROPERTIES) uValue == UI_FONTPROPERTIES_SET) ? CFE_STRIKEOUT : 0;
}
}
PropVariantClear(&propvar);
// Get the vertical positioning value from the property store.
if (SUCCEEDED(pPropStore->GetValue(UI_PKEY_FontProperties_VerticalPositioning, &propvar)))
{
UIPropertyToUInt32(UI_PKEY_FontProperties_VerticalPositioning, propvar, &uValue);
UI_FONTVERTICALPOSITION uVerticalPosition = (UI_FONTVERTICALPOSITION) uValue;
if ((uVerticalPosition != UI_FONTVERTICALPOSITION_NOTAVAILABLE))
{
// There is a value assigned, so set the corresponding members in CharFormat2 variable.
pCharFormat->dwMask |= (CFM_SUPERSCRIPT | CFM_SUBSCRIPT);
if (uVerticalPosition != UI_FONTVERTICALPOSITION_NOTSET)
{
pCharFormat->dwEffects |= (uVerticalPosition == UI_FONTVERTICALPOSITION_SUPERSCRIPT) ? CFE_SUPERSCRIPT : CFE_SUBSCRIPT;
}
}
}
PropVariantClear(&propvar);
// Get the font family value from the property store.
if (SUCCEEDED(pPropStore->GetValue(UI_PKEY_FontProperties_Family, &propvar)))
{
// Get the string for the font family.
PWSTR pszFamily;
UIPropertyToStringAlloc(UI_PKEY_FontProperties_Family, propvar, &pszFamily);
// Blank string is used as "Not Available" value.
if (lstrcmp(pszFamily, L""))
{
// There is a value assigned, so set the corresponding members in CharFormat2 variable.
// Copy the string for font family.
StringCchCopyW(pCharFormat->szFaceName, ARRAYSIZE(pCharFormat->szFaceName), pszFamily);
pCharFormat->dwMask |= CFM_FACE;
}
// Free the allocated string.
CoTaskMemFree(pszFamily);
}
PropVariantClear(&propvar);
// Get the font size value from the property store.
if (SUCCEEDED(pPropStore->GetValue(UI_PKEY_FontProperties_Size, &propvar)))
{
// Get the decimal font size value.
DECIMAL decSize;
UIPropertyToDecimal(UI_PKEY_FontProperties_Size, propvar, &decSize);
DOUBLE dSize;
VarR8FromDec(&decSize, &dSize);
// Zero is used as "Not Available" value.
if (dSize > 0)
{
// There is a value assigned, so set the corresponding members in CharFormat2 variable.
pCharFormat->dwMask |= CFM_SIZE;
// Set the height as twips.
pCharFormat->yHeight = (LONG)(dSize * TWIPS_PER_POINT);
}
}
PropVariantClear(&propvar);
// Get the foreground color type value from the property store.
if (SUCCEEDED(pPropStore->GetValue(UI_PKEY_FontProperties_ForegroundColorType, &propvar)))
{
UIPropertyToUInt32(UI_PKEY_FontProperties_ForegroundColorType, propvar, &uValue);
if (UI_SWATCHCOLORTYPE_AUTOMATIC == (UI_SWATCHCOLORTYPE)uValue)
{
// The color type is automatic, so set the corresponding members in CharFormat2 variable.
pCharFormat->dwMask |= CFM_COLOR;
pCharFormat->dwEffects |= CFE_AUTOCOLOR;
}
}
PropVariantClear(&propvar);
// Get the foreground color value from the property store.
if (SUCCEEDED(pPropStore->GetValue(UI_PKEY_FontProperties_ForegroundColor, &propvar)))
{
// A font color is specified so set the corresponding members in CharFormat2 variable.
UIPropertyToUInt32(UI_PKEY_FontProperties_ForegroundColor, propvar, &uValue);
pCharFormat->dwMask |= CFM_COLOR;
pCharFormat->crTextColor = (COLORREF)uValue;
}
PropVariantClear(&propvar);
// Get the background color type value from the property store.
if (SUCCEEDED(pPropStore->GetValue(UI_PKEY_FontProperties_BackgroundColorType, &propvar)))
{
UIPropertyToUInt32(UI_PKEY_FontProperties_BackgroundColorType, propvar, &uValue);
if (UI_SWATCHCOLORTYPE_NOCOLOR == (UI_SWATCHCOLORTYPE)uValue)
{
// The color type is no color, so set the corresponding members in CharFormat2 variable.
pCharFormat->dwMask |= CFM_BACKCOLOR;
pCharFormat->dwEffects |= CFE_AUTOBACKCOLOR;
}
}
PropVariantClear(&propvar);
// Get the background color value from the property store.
if (SUCCEEDED(pPropStore->GetValue(UI_PKEY_FontProperties_BackgroundColor, &propvar)))
{
// A color is specified so set the corresponding members in CharFormat2 variable.
UIPropertyToUInt32(UI_PKEY_FontProperties_BackgroundColor, propvar, &uValue);
pCharFormat->dwMask |= CFM_BACKCOLOR;
pCharFormat->crBackColor = (COLORREF)uValue;
}
PropVariantClear(&propvar);
}
// Convert from CHARFORMAT2 to IPropertyStore so it can be passed to the font control.
void GetIPropStoreFromCharFormat2(const __in CHARFORMAT2* pCharFormat, __in IPropertyStore *pPropStore)
{
PROPVARIANT propvar;
PropVariantInit(&propvar);
if (pCharFormat->dwMask & CFM_BOLD)
{
// Set the bold value to UI_FONTPROPERTIES_SET or UI_FONTPROPERTIES_NOTSET.
UIInitPropertyFromUInt32(UI_PKEY_FontProperties_Bold, (pCharFormat->dwEffects & CFE_BOLD) ? UI_FONTPROPERTIES_SET : UI_FONTPROPERTIES_NOTSET, &propvar);
}
else
{
// The bold value is not available so set it to UI_FONTPROPERTIES_NOTAVAILABLE.
UIInitPropertyFromUInt32(UI_PKEY_FontProperties_Bold, UI_FONTPROPERTIES_NOTAVAILABLE, &propvar);
}
// Set UI_PKEY_FontProperties_Bold value in property store.
pPropStore->SetValue(UI_PKEY_FontProperties_Bold, propvar);
PropVariantClear(&propvar);
if (pCharFormat->dwMask & CFM_ITALIC)
{
// Set the italic value to UI_FONTPROPERTIES_SET or UI_FONTPROPERTIES_NOTSET.
UIInitPropertyFromUInt32(UI_PKEY_FontProperties_Italic, (pCharFormat->dwEffects & CFE_ITALIC)?UI_FONTPROPERTIES_SET:UI_FONTPROPERTIES_NOTSET, &propvar);
}
else
{
// The italic value is not available so set it to UI_FONTPROPERTIES_NOTAVAILABLE.
UIInitPropertyFromUInt32(UI_PKEY_FontProperties_Italic, UI_FONTPROPERTIES_NOTAVAILABLE, &propvar);
}
// Set UI_PKEY_FontProperties_Italic value in property store.
pPropStore->SetValue(UI_PKEY_FontProperties_Italic, propvar);
PropVariantClear(&propvar);
if (pCharFormat->dwMask & CFM_UNDERLINE)
{
// Set the underline value to UI_FONTUNDERLINE_SET or UI_FONTUNDERLINE_NOTSET.
UIInitPropertyFromUInt32(UI_PKEY_FontProperties_Underline, (pCharFormat->dwEffects & CFE_UNDERLINE) ? UI_FONTUNDERLINE_SET : UI_FONTUNDERLINE_NOTSET, &propvar);
}
else
{
// The underline value is not available so set it to UI_FONTUNDERLINE_NOTAVAILABLE.
UIInitPropertyFromUInt32(UI_PKEY_FontProperties_Underline, UI_FONTUNDERLINE_NOTAVAILABLE, &propvar);
}
// Set UI_PKEY_FontProperties_Underline value in property store.
pPropStore->SetValue(UI_PKEY_FontProperties_Underline, propvar);
PropVariantClear(&propvar);
if (pCharFormat->dwMask & CFM_STRIKEOUT)
{
// Set the strikethrough value to UI_FONTPROPERTIES_SET or UI_FONTPROPERTIES_NOTSET.
UIInitPropertyFromUInt32(UI_PKEY_FontProperties_Strikethrough, (pCharFormat->dwEffects & CFE_STRIKEOUT) ? UI_FONTPROPERTIES_SET : UI_FONTPROPERTIES_NOTSET, &propvar);
}
else
{
// The strikethrough value is not available so set it to UI_FONTPROPERTIES_NOTAVAILABLE.
UIInitPropertyFromUInt32(UI_PKEY_FontProperties_Strikethrough, UI_FONTPROPERTIES_NOTAVAILABLE, &propvar);
}
// Set UI_PKEY_FontProperties_Strikethrough value in property store.
pPropStore->SetValue(UI_PKEY_FontProperties_Strikethrough, propvar);
PropVariantClear(&propvar);
if (pCharFormat->dwMask & CFE_SUBSCRIPT)
{
if ((pCharFormat->dwMask & CFM_SUBSCRIPT) && (pCharFormat->dwEffects & CFE_SUBSCRIPT))
{
// Set the vertical positioning value to UI_FONTVERTICALPOSITION_SUBSCRIPT.
UIInitPropertyFromUInt32(UI_PKEY_FontProperties_VerticalPositioning, UI_FONTVERTICALPOSITION_SUBSCRIPT, &propvar);
}
else if (pCharFormat->dwEffects & CFE_SUPERSCRIPT)
{
// Set the vertical positioning value to UI_FONTVERTICALPOSITION_SUPERSCRIPT.
UIInitPropertyFromUInt32(UI_PKEY_FontProperties_VerticalPositioning, UI_FONTVERTICALPOSITION_SUPERSCRIPT, &propvar);
}
}
else if (pCharFormat->dwMask & CFM_OFFSET)
{
if (pCharFormat->yOffset > 0)
{
// Set the vertical positioning value to UI_FONTVERTICALPOSITION_SUPERSCRIPT.
UIInitPropertyFromUInt32(UI_PKEY_FontProperties_VerticalPositioning, UI_FONTVERTICALPOSITION_SUPERSCRIPT, &propvar);
}
else if (pCharFormat->yOffset < 0)
{
// Set the vertical positioning value to UI_FONTVERTICALPOSITION_SUBSCRIPT.
UIInitPropertyFromUInt32(UI_PKEY_FontProperties_VerticalPositioning, UI_FONTVERTICALPOSITION_SUBSCRIPT, &propvar);
}
else
{
// The value is not available so set the vertical positioning value to UI_FONTVERTICALPOSITION_NOTAVAILABLE.
UIInitPropertyFromUInt32(UI_PKEY_FontProperties_VerticalPositioning, UI_FONTVERTICALPOSITION_NOTAVAILABLE, &propvar);
}
}
// Set UI_PKEY_FontProperties_VerticalPositioning value in property store.
pPropStore->SetValue(UI_PKEY_FontProperties_VerticalPositioning, propvar);
PropVariantClear(&propvar);
if (pCharFormat->dwMask & CFM_FACE)
{
// Set the font family value to the font name.
UIInitPropertyFromString(UI_PKEY_FontProperties_Family, pCharFormat->szFaceName, &propvar);
}
else
{
// Font family name is not available so set it to blank string.
UIInitPropertyFromString(UI_PKEY_FontProperties_Family, L"", &propvar);
}
// Set UI_PKEY_FontProperties_Family value in property store.
pPropStore->SetValue(UI_PKEY_FontProperties_Family, propvar);
PropVariantClear(&propvar);
DECIMAL decSize;
if (pCharFormat->dwMask & CFM_SIZE)
{
// Font size value is available so get the font size.
VarDecFromR8((DOUBLE)pCharFormat->yHeight / TWIPS_PER_POINT, &decSize);
}
else
{
// The font size is not available so set it to zero.
VarDecFromI4(0, &decSize);
}
// Set UI_PKEY_FontProperties_Size value in property store.
UIInitPropertyFromDecimal(UI_PKEY_FontProperties_Size, decSize, &propvar);
pPropStore->SetValue(UI_PKEY_FontProperties_Size, propvar);
PropVariantClear(&propvar);
if ((pCharFormat->dwMask & CFM_COLOR) && !(pCharFormat->dwEffects & CFE_AUTOCOLOR))
{
// There is a color value so set the type to UI_SWATCHCOLORTYPE_RGB in property store.
UIInitPropertyFromUInt32(UI_PKEY_FontProperties_ForegroundColorType, UI_SWATCHCOLORTYPE_RGB, &propvar);
pPropStore->SetValue(UI_PKEY_FontProperties_ForegroundColorType, propvar);
PropVariantClear(&propvar);
// Set the color value in property store.
UIInitPropertyFromUInt32(UI_PKEY_FontProperties_ForegroundColor, pCharFormat->crTextColor, &propvar);
pPropStore->SetValue(UI_PKEY_FontProperties_ForegroundColor, propvar);
}
else if ((pCharFormat->dwMask & CFM_COLOR) && (pCharFormat->dwEffects & CFE_AUTOCOLOR))
{
// The color is automatic color so set the type to UI_SWATCHCOLORTYPE_AUTOMATIC in property store.
UIInitPropertyFromUInt32(UI_PKEY_FontProperties_ForegroundColorType, UI_SWATCHCOLORTYPE_AUTOMATIC, &propvar);
pPropStore->SetValue(UI_PKEY_FontProperties_ForegroundColorType, propvar);
}
PropVariantClear(&propvar);
if ((pCharFormat->dwMask & CFM_BACKCOLOR) && !(pCharFormat->dwEffects & CFE_AUTOBACKCOLOR))
{
// There is a color value so set the type to UI_SWATCHCOLORTYPE_RGB in property store.
UIInitPropertyFromUInt32(UI_PKEY_FontProperties_BackgroundColorType, UI_SWATCHCOLORTYPE_RGB, &propvar);
pPropStore->SetValue(UI_PKEY_FontProperties_BackgroundColorType, propvar);
PropVariantClear(&propvar);
// Set the color value in property store.
UIInitPropertyFromUInt32(UI_PKEY_FontProperties_BackgroundColor, pCharFormat->crBackColor, &propvar);
pPropStore->SetValue(UI_PKEY_FontProperties_BackgroundColor, propvar);
}
else
{
// There is no color so set the type to UI_SWATCHCOLORTYPE_NOCOLOR in property store.
UIInitPropertyFromUInt32(UI_PKEY_FontProperties_BackgroundColorType, UI_SWATCHCOLORTYPE_NOCOLOR, &propvar);
pPropStore->SetValue(UI_PKEY_FontProperties_BackgroundColorType, propvar);
}
}