diff options
Diffstat (limited to 'svx/source/accessibility/DescriptionGenerator.cxx')
-rw-r--r-- | svx/source/accessibility/DescriptionGenerator.cxx | 485 |
1 files changed, 485 insertions, 0 deletions
diff --git a/svx/source/accessibility/DescriptionGenerator.cxx b/svx/source/accessibility/DescriptionGenerator.cxx new file mode 100644 index 000000000000..7fa67d2c500c --- /dev/null +++ b/svx/source/accessibility/DescriptionGenerator.cxx @@ -0,0 +1,485 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_svx.hxx" + +#include "DescriptionGenerator.hxx" +#include <com/sun/star/beans/PropertyState.hpp> +#include <com/sun/star/beans/XPropertySet.hpp> +#include <com/sun/star/beans/XPropertyState.hpp> +#include <com/sun/star/container/XChild.hpp> +#include <com/sun/star/container/XNameContainer.hpp> +#include <com/sun/star/container/XNameAccess.hpp> +#include <com/sun/star/container/XNamed.hpp> +#include <com/sun/star/drawing/FillStyle.hpp> +#include <com/sun/star/drawing/XShapes.hpp> +#include <com/sun/star/drawing/XShapeDescriptor.hpp> +#include <com/sun/star/lang/IndexOutOfBoundsException.hpp> +#include <com/sun/star/lang/XMultiServiceFactory.hpp> +#include <com/sun/star/style/XStyle.hpp> +#include <comphelper/processfactory.hxx> +#include <osl/mutex.hxx> +#include <vcl/svapp.hxx> + +#include <com/sun/star/uno/Exception.hpp> + +// Includes for string resources. +#include "accessibility.hrc" +#include "svdstr.hrc" +#include <svx/dialmgr.hxx> +#include <tools/string.hxx> + +#include <svx/xdef.hxx> +#include "unoapi.hxx" +#include "accessibility.hrc" +#include "DGColorNameLookUp.hxx" + +using namespace ::rtl; +using namespace ::com::sun::star; + + +void SvxUnogetInternalNameForItem( const sal_Int16 nWhich, const rtl::OUString& rApiName, String& rInternalName ) throw(); + +namespace accessibility { + + +DescriptionGenerator::DescriptionGenerator ( + const uno::Reference<drawing::XShape>& xShape) + : mxShape (xShape), + mxSet (mxShape, uno::UNO_QUERY), + mbIsFirstProperty (true) +{ +} + + + + +DescriptionGenerator::~DescriptionGenerator (void) +{ +} + + + + +void DescriptionGenerator::Initialize (sal_Int32 nResourceId) +{ + // Get the string from the resource for the specified id. + OUString sPrefix; + { + SolarMutexGuard aGuard; + sPrefix = OUString (SVX_RESSTR (nResourceId)); + } + + // Forward the call with the resulting string. + Initialize (sPrefix); +} + + + + +void DescriptionGenerator::Initialize (::rtl::OUString sPrefix) +{ + msDescription = sPrefix; + if (mxSet.is()) + { + { + SolarMutexGuard aGuard; + + msDescription.append (sal_Unicode (' ')); + msDescription.append (OUString (SVX_RESSTR(RID_SVXSTR_A11Y_WITH))); + msDescription.append (sal_Unicode (' ')); + + msDescription.append (OUString (SVX_RESSTR (RID_SVXSTR_A11Y_STYLE))); + msDescription.append (sal_Unicode ('=')); + } + + try + { + if (mxSet.is()) + { + uno::Any aValue = mxSet->getPropertyValue (OUString(RTL_CONSTASCII_USTRINGPARAM("Style")) ); + uno::Reference<container::XNamed> xStyle (aValue, uno::UNO_QUERY); + if (xStyle.is()) + msDescription.append (xStyle->getName()); + } + else + msDescription.append ( + OUString(RTL_CONSTASCII_USTRINGPARAM("<no style>")) ); + } + catch (::com::sun::star::beans::UnknownPropertyException) + { + msDescription.append ( + OUString(RTL_CONSTASCII_USTRINGPARAM("<unknown>")) ); + } + } +} + + + + +::rtl::OUString DescriptionGenerator::operator() (void) +{ + msDescription.append (sal_Unicode ('.')); + return msDescription.makeStringAndClear(); +} + + + + +void DescriptionGenerator::AddProperty ( + const OUString& sPropertyName, + PropertyType aType, + const sal_Int32 nLocalizedNameId, + long nWhichId) +{ + OUString sLocalizedName; + { + SolarMutexGuard aGuard; + sLocalizedName = SVX_RESSTR (nLocalizedNameId); + } + AddProperty (sPropertyName, aType, sLocalizedName, nWhichId); +} + + + + +void DescriptionGenerator::AddProperty (const OUString& sPropertyName, + PropertyType aType, const OUString& sLocalizedName, long nWhichId) +{ + uno::Reference<beans::XPropertyState> xState (mxShape, uno::UNO_QUERY); + if (xState.is() + && xState->getPropertyState(sPropertyName)!=beans::PropertyState_DEFAULT_VALUE) + if (mxSet.is()) + { + // Append a seperator from previous Properties. + if ( ! mbIsFirstProperty) + msDescription.append (sal_Unicode (',')); + else + { + SolarMutexGuard aGuard; + + msDescription.append (sal_Unicode (' ')); + msDescription.append (OUString (SVX_RESSTR(RID_SVXSTR_A11Y_AND))); + msDescription.append (sal_Unicode (' ')); + mbIsFirstProperty = false; + } + + // Delegate to type specific property handling. + switch (aType) + { + case COLOR: + AddColor (sPropertyName, sLocalizedName); + break; + case INTEGER: + AddInteger (sPropertyName, sLocalizedName); + break; + case STRING: + AddString (sPropertyName, sLocalizedName, nWhichId); + break; + case FILL_STYLE: + AddFillStyle (sPropertyName, sLocalizedName); + break; + } + } +} + + + + +void DescriptionGenerator::AppendString (const ::rtl::OUString& sString) +{ + msDescription.append (sString); +} + + + + +void DescriptionGenerator::AddLineProperties (void) +{ + AddProperty (OUString(RTL_CONSTASCII_USTRINGPARAM("LineColor")), + DescriptionGenerator::COLOR, + SIP_XA_LINECOLOR); + AddProperty (OUString(RTL_CONSTASCII_USTRINGPARAM("LineDashName")), + DescriptionGenerator::STRING, + SIP_XA_LINEDASH, + XATTR_LINEDASH); + AddProperty (OUString(RTL_CONSTASCII_USTRINGPARAM("LineWidth")), + DescriptionGenerator::INTEGER, + SIP_XA_LINEWIDTH); +} + + + + +/** The fill style is described by the property "FillStyle". Depending on + its value a hatch-, gradient-, or bitmap name is appended. +*/ +void DescriptionGenerator::AddFillProperties (void) +{ + AddProperty (OUString(RTL_CONSTASCII_USTRINGPARAM("FillStyle")), + DescriptionGenerator::FILL_STYLE, + SIP_XA_FILLSTYLE); +} + + + + +void DescriptionGenerator::Add3DProperties (void) +{ + AddProperty (OUString(RTL_CONSTASCII_USTRINGPARAM("D3DMaterialColor")), + DescriptionGenerator::COLOR, + RID_SVXSTR_A11Y_3D_MATERIAL_COLOR); + AddLineProperties (); + AddFillProperties (); +} + + + + +void DescriptionGenerator::AddTextProperties (void) +{ + AddProperty (OUString(RTL_CONSTASCII_USTRINGPARAM("CharColor")), + DescriptionGenerator::COLOR); + AddFillProperties (); +} + + + + +/** Search for the given color in the global color table. If found append + its name to the description. Otherwise append its RGB tuple. +*/ +void DescriptionGenerator::AddColor (const OUString& sPropertyName, + const OUString& sLocalizedName) +{ + msDescription.append (sLocalizedName); + msDescription.append (sal_Unicode('=')); + + try + { + + long nValue(0); + if (mxSet.is()) + { + uno::Any aValue = mxSet->getPropertyValue (sPropertyName); + aValue >>= nValue; + } + + msDescription.append (DGColorNameLookUp::Instance().LookUpColor (nValue)); + } + catch (::com::sun::star::beans::UnknownPropertyException) + { + msDescription.append ( + OUString(RTL_CONSTASCII_USTRINGPARAM("<unknown>")) ); + } +} + + + + +void DescriptionGenerator::AddUnknown (const OUString& /*sPropertyName*/, + const OUString& sLocalizedName) +{ + // uno::Any aValue = mxSet->getPropertyValue (sPropertyName); + msDescription.append (sLocalizedName); +} + + + + +void DescriptionGenerator::AddInteger (const OUString& sPropertyName, + const OUString& sLocalizedName) +{ + msDescription.append (sLocalizedName); + msDescription.append (sal_Unicode('=')); + + try + { + if (mxSet.is()) + { + uno::Any aValue = mxSet->getPropertyValue (sPropertyName); + long nValue = 0; + aValue >>= nValue; + msDescription.append (nValue); + } + } + catch (::com::sun::star::beans::UnknownPropertyException) + { + msDescription.append ( + OUString(RTL_CONSTASCII_USTRINGPARAM("<unknown>")) ); + } +} + + + + +void DescriptionGenerator::AddString (const OUString& sPropertyName, + const OUString& sLocalizedName, long nWhichId) +{ + msDescription.append (sLocalizedName); + msDescription.append (sal_Unicode('=')); + + try + { + if (mxSet.is()) + { + uno::Any aValue = mxSet->getPropertyValue (sPropertyName); + OUString sValue; + aValue >>= sValue; + + if (nWhichId >= 0) + { + SolarMutexGuard aGuard; + String sLocalizedValue; + SvxUnogetInternalNameForItem (sal::static_int_cast<sal_Int16>(nWhichId), + sValue, sLocalizedValue); + msDescription.append (sLocalizedValue); + } + else + msDescription.append (sValue); + } + } + catch (::com::sun::star::beans::UnknownPropertyException) + { + msDescription.append ( + OUString(RTL_CONSTASCII_USTRINGPARAM("<unknown>")) ); + } +} + + + + +void DescriptionGenerator::AddFillStyle (const OUString& sPropertyName, + const OUString& sLocalizedName) +{ + msDescription.append (sLocalizedName); + msDescription.append (sal_Unicode('=')); + + try + { + if (mxSet.is()) + { + uno::Any aValue = mxSet->getPropertyValue (sPropertyName); + drawing::FillStyle aFillStyle; + aValue >>= aFillStyle; + + // Get the fill style name from the resource. + OUString sFillStyleName; + { + SolarMutexGuard aGuard; + switch (aFillStyle) + { + case drawing::FillStyle_NONE: + sFillStyleName = SVX_RESSTR(RID_SVXSTR_A11Y_FILLSTYLE_NONE); + break; + case drawing::FillStyle_SOLID: + sFillStyleName = SVX_RESSTR(RID_SVXSTR_A11Y_FILLSTYLE_SOLID); + break; + case drawing::FillStyle_GRADIENT: + sFillStyleName = SVX_RESSTR(RID_SVXSTR_A11Y_FILLSTYLE_GRADIENT); + break; + case drawing::FillStyle_HATCH: + sFillStyleName = SVX_RESSTR(RID_SVXSTR_A11Y_FILLSTYLE_HATCH); + break; + case drawing::FillStyle_BITMAP: + sFillStyleName = SVX_RESSTR(RID_SVXSTR_A11Y_FILLSTYLE_BITMAP); + break; + case drawing::FillStyle_MAKE_FIXED_SIZE: + break; + } + } + msDescription.append (sFillStyleName); + + // Append the appropriate properties. + switch (aFillStyle) + { + case drawing::FillStyle_NONE: + break; + case drawing::FillStyle_SOLID: + AddProperty (OUString(RTL_CONSTASCII_USTRINGPARAM("FillColor")), + COLOR, + SIP_XA_FILLCOLOR); + break; + case drawing::FillStyle_GRADIENT: + AddProperty (OUString(RTL_CONSTASCII_USTRINGPARAM("FillGradientName")), + STRING, + SIP_XA_FILLGRADIENT, + XATTR_FILLGRADIENT); + break; + case drawing::FillStyle_HATCH: + AddProperty (OUString(RTL_CONSTASCII_USTRINGPARAM("FillColor")), + COLOR, + SIP_XA_FILLCOLOR); + AddProperty (OUString(RTL_CONSTASCII_USTRINGPARAM("FillHatchName")), + STRING, + SIP_XA_FILLHATCH, + XATTR_FILLHATCH); + break; + case drawing::FillStyle_BITMAP: + AddProperty (OUString(RTL_CONSTASCII_USTRINGPARAM("FillBitmapName")), + STRING, + SIP_XA_FILLBITMAP, + XATTR_FILLBITMAP); + break; + case drawing::FillStyle_MAKE_FIXED_SIZE: + break; + } + } + } + catch (::com::sun::star::beans::UnknownPropertyException) + { + msDescription.append ( + OUString(RTL_CONSTASCII_USTRINGPARAM("<unknown>")) ); + } +} + + + + +void DescriptionGenerator::AddPropertyNames (void) +{ + if (mxSet.is()) + { + uno::Reference<beans::XPropertySetInfo> xInfo (mxSet->getPropertySetInfo()); + if (xInfo.is()) + { + uno::Sequence<beans::Property> aPropertyList (xInfo->getProperties ()); + for (int i=0; i<aPropertyList.getLength(); i++) + { + msDescription.append (aPropertyList[i].Name); + msDescription.append (sal_Unicode(',')); + } + } + } +} + + +} // end of namespace accessibility + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |