/* -*- 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 * * for a copy of the LGPLv3 License. * ************************************************************************/ #include "precompiled_reportdesign.hxx" #include "metadata.hxx" #include #include "com/sun/star/inspection/XPropertyHandler.hpp" #include #include #include "helpids.hrc" #include "RptResId.hrc" #include "uistrings.hrc" #include #include //............................................................................ namespace rptui { //............................................................................ using namespace ::com::sun::star::uno; using namespace ::com::sun::star; //======================================================================== //= OPropertyInfoImpl //======================================================================== struct OPropertyInfoImpl { String sName; String sTranslation; sal_uInt32 nHelpId; sal_Int32 nId; sal_uInt16 nPos; sal_uInt32 nUIFlags; OPropertyInfoImpl( const ::rtl::OUString& rName, sal_Int32 _nId, const String& aTranslation, sal_uInt16 nPosId, sal_uInt32 nHelpId, sal_uInt32 _nUIFlags); }; //------------------------------------------------------------------------ OPropertyInfoImpl::OPropertyInfoImpl(const ::rtl::OUString& _rName, sal_Int32 _nId, const String& aString, sal_uInt16 nP, sal_uInt32 nHid, sal_uInt32 _nUIFlags) :sName(_rName) ,sTranslation(aString) ,nHelpId(nHid) ,nId(_nId) ,nPos(nP) ,nUIFlags(_nUIFlags) { } //------------------------------------------------------------------------ // Vergleichen von PropertyInfo struct PropertyInfoLessByName : public ::std::binary_function< OPropertyInfoImpl, OPropertyInfoImpl, bool > { bool operator()( const OPropertyInfoImpl& _lhs, const OPropertyInfoImpl& _rhs ) { return _lhs.sName < _rhs.sName; } }; //======================================================================== //= OPropertyInfoService //======================================================================== #define DEF_INFO( ident, uinameres, helpid, flags ) \ OPropertyInfoImpl( PROPERTY_##ident, PROPERTY_ID_##ident, \ String( ModuleRes( RID_STR_##uinameres ) ), nPos++, HID_RPT_PROP_##helpid, flags ) #define DEF_INFO_1( ident, uinameres, helpid, flag1 ) \ DEF_INFO( ident, uinameres, helpid, PROP_FLAG_##flag1 ) #define DEF_INFO_2( ident, uinameres, helpid, flag1, flag2 ) \ DEF_INFO( ident, uinameres, helpid, PROP_FLAG_##flag1 | PROP_FLAG_##flag2 ) #define DEF_INFO_3( ident, uinameres, helpid, flag1, flag2, flag3 ) \ DEF_INFO( ident, uinameres, helpid, PROP_FLAG_##flag1 | PROP_FLAG_##flag2 | PROP_FLAG_##flag3 ) #define DEF_INFO_4( ident, uinameres, helpid, flag1, flag2, flag3, flag4 ) \ DEF_INFO( ident, uinameres, helpid, PROP_FLAG_##flag1 | PROP_FLAG_##flag2 | PROP_FLAG_##flag3 | PROP_FLAG_##flag4 ) #define DEF_INFO_5( ident, uinameres, helpid, flag1, flag2, flag3, flag4, flag5 ) \ DEF_INFO( ident, uinameres, helpid, PROP_FLAG_##flag1 | PROP_FLAG_##flag2 | PROP_FLAG_##flag3 | PROP_FLAG_##flag4 | PROP_FLAG_##flag5 ) sal_uInt16 OPropertyInfoService::s_nCount = 0; OPropertyInfoImpl* OPropertyInfoService::s_pPropertyInfos = NULL; //------------------------------------------------------------------------ const OPropertyInfoImpl* OPropertyInfoService::getPropertyInfo() { if ( s_pPropertyInfos ) return s_pPropertyInfos; OModuleClient aResourceAccess; // this ensures that we have our resource file loaded sal_uInt16 nPos = 1; static OPropertyInfoImpl aPropertyInfos[] = { /* DEF_INFO_?( propname and id, resoure id, help id, flags ), */ DEF_INFO_1( FORCENEWPAGE, FORCENEWPAGE, FORCENEWPAGE, COMPOSEABLE ) ,DEF_INFO_1( NEWROWORCOL, NEWROWORCOL, NEWROWORCOL, COMPOSEABLE ) ,DEF_INFO_1( KEEPTOGETHER, KEEPTOGETHER, KEEPTOGETHER, COMPOSEABLE ) ,DEF_INFO_1( CANGROW, CANGROW, CANGROW, COMPOSEABLE ) ,DEF_INFO_1( CANSHRINK, CANSHRINK, CANSHRINK, COMPOSEABLE ) ,DEF_INFO_1( REPEATSECTION, REPEATSECTION, REPEATSECTION, COMPOSEABLE ) ,DEF_INFO_1( PRINTREPEATEDVALUES, PRINTREPEATEDVALUES, PRINTREPEATEDVALUES, COMPOSEABLE ) ,DEF_INFO_1( CONDITIONALPRINTEXPRESSION, CONDITIONALPRINTEXPRESSION, CONDITIONALPRINTEXPRESSION, COMPOSEABLE ) ,DEF_INFO_1( STARTNEWCOLUMN, STARTNEWCOLUMN, STARTNEWCOLUMN, COMPOSEABLE ) ,DEF_INFO_1( RESETPAGENUMBER, RESETPAGENUMBER, RESETPAGENUMBER, COMPOSEABLE ) ,DEF_INFO_1( PRINTWHENGROUPCHANGE, PRINTWHENGROUPCHANGE, PRINTWHENGROUPCHANGE, COMPOSEABLE ) ,DEF_INFO_1( VISIBLE, VISIBLE, VISIBLE, COMPOSEABLE ) ,DEF_INFO_1( GROUPKEEPTOGETHER, GROUPKEEPTOGETHER, GROUPKEEPTOGETHER, COMPOSEABLE ) ,DEF_INFO_1( PAGEHEADEROPTION, PAGEHEADEROPTION, PAGEHEADEROPTION, COMPOSEABLE ) ,DEF_INFO_1( PAGEFOOTEROPTION, PAGEFOOTEROPTION, PAGEFOOTEROPTION, COMPOSEABLE ) ,DEF_INFO_1( POSITIONX, POSITIONX, RPT_POSITIONX, COMPOSEABLE ) ,DEF_INFO_1( POSITIONY, POSITIONY, RPT_POSITIONY, COMPOSEABLE ) ,DEF_INFO_1( WIDTH, WIDTH, RPT_WIDTH, COMPOSEABLE ) ,DEF_INFO_1( HEIGHT, HEIGHT, RPT_HEIGHT, COMPOSEABLE ) ,DEF_INFO_1( FONT, FONT, RPT_FONT, COMPOSEABLE ) ,DEF_INFO_1( PREEVALUATED, PREEVALUATED, PREEVALUATED, COMPOSEABLE ) ,DEF_INFO_1( DEEPTRAVERSING, DEEPTRAVERSING, DEEPTRAVERSING, COMPOSEABLE ) ,DEF_INFO_1( FORMULA, FORMULA, FORMULA, COMPOSEABLE ) ,DEF_INFO_1( INITIALFORMULA, INITIALFORMULA, INITIALFORMULA, COMPOSEABLE ) ,DEF_INFO_2( TYPE, TYPE, TYPE, COMPOSEABLE,DATA_PROPERTY ) ,DEF_INFO_2( DATAFIELD, DATAFIELD, DATAFIELD, COMPOSEABLE,DATA_PROPERTY ) ,DEF_INFO_2( FORMULALIST, FORMULALIST, FORMULALIST, COMPOSEABLE,DATA_PROPERTY ) ,DEF_INFO_2( SCOPE, SCOPE, SCOPE, COMPOSEABLE,DATA_PROPERTY ) ,DEF_INFO_1( PRESERVEIRI, PRESERVEIRI, PRESERVEIRI, COMPOSEABLE ) ,DEF_INFO_1( BACKCOLOR, BACKCOLOR, BACKCOLOR, COMPOSEABLE ) ,DEF_INFO_1( CONTROLBACKGROUND, BACKCOLOR, BACKCOLOR, COMPOSEABLE ) ,DEF_INFO_1( BACKTRANSPARENT, BACKTRANSPARENT, BACKTRANSPARENT, COMPOSEABLE ) ,DEF_INFO_1( CONTROLBACKGROUNDTRANSPARENT, CONTROLBACKGROUNDTRANSPARENT ,CONTROLBACKGROUNDTRANSPARENT, COMPOSEABLE ) ,DEF_INFO_1( CHARTTYPE, CHARTTYPE, CHARTTYPE, COMPOSEABLE ) ,DEF_INFO_1( PREVIEW_COUNT, PREVIEW_COUNT, PREVIEW_COUNT, COMPOSEABLE ) ,DEF_INFO_2( MASTERFIELDS, MASTERFIELDS, MASTERFIELDS, COMPOSEABLE,DATA_PROPERTY ) ,DEF_INFO_2( DETAILFIELDS, DETAILFIELDS, DETAILFIELDS, COMPOSEABLE,DATA_PROPERTY) ,DEF_INFO_1( AREA, AREA, AREA, COMPOSEABLE ) ,DEF_INFO_2( MIMETYPE, MIMETYPE, MIMETYPE, COMPOSEABLE,DATA_PROPERTY ) ,DEF_INFO_1( PARAADJUST, PARAADJUST, PARAADJUST, COMPOSEABLE ) ,DEF_INFO_1( VERTICALALIGN, VERTICALALIGN, VERTICALALIGN, COMPOSEABLE ) }; s_pPropertyInfos = aPropertyInfos; s_nCount = SAL_N_ELEMENTS(aPropertyInfos); ::std::sort( aPropertyInfos, aPropertyInfos + SAL_N_ELEMENTS(aPropertyInfos), PropertyInfoLessByName() ); return s_pPropertyInfos; } //------------------------------------------------------------------------ sal_Int32 OPropertyInfoService::getPropertyId(const String& _rName) const { const OPropertyInfoImpl* pInfo = getPropertyInfo(_rName); return pInfo ? pInfo->nId : -1; } //------------------------------------------------------------------------ String OPropertyInfoService::getPropertyTranslation(sal_Int32 _nId) const { const OPropertyInfoImpl* pInfo = getPropertyInfo(_nId); return (pInfo) ? pInfo->sTranslation : String(); } //------------------------------------------------------------------------ sal_Int32 OPropertyInfoService::getPropertyHelpId(sal_Int32 _nId) const { const OPropertyInfoImpl* pInfo = getPropertyInfo(_nId); return (pInfo) ? pInfo->nHelpId : 0; } //------------------------------------------------------------------------ sal_uInt32 OPropertyInfoService::getPropertyUIFlags(sal_Int32 _nId) const { const OPropertyInfoImpl* pInfo = getPropertyInfo(_nId); return (pInfo) ? pInfo->nUIFlags : 0; } //------------------------------------------------------------------------ const OPropertyInfoImpl* OPropertyInfoService::getPropertyInfo(const String& _rName) { // intialisierung if(!s_pPropertyInfos) getPropertyInfo(); OPropertyInfoImpl aSearch(_rName, 0L, String(), 0, 0, 0); const OPropertyInfoImpl* pPropInfo = ::std::lower_bound( s_pPropertyInfos, s_pPropertyInfos + s_nCount, aSearch, PropertyInfoLessByName() ); if ( ( pPropInfo < s_pPropertyInfos + s_nCount ) && pPropInfo->sName == _rName ) return pPropInfo; return NULL; } //------------------------------------------------------------------------ const OPropertyInfoImpl* OPropertyInfoService::getPropertyInfo(sal_Int32 _nId) { // intialisierung if(!s_pPropertyInfos) getPropertyInfo(); // TODO: a real structure which allows quick access by name as well as by id for (sal_uInt16 i = 0; i < s_nCount; i++) if (s_pPropertyInfos[i].nId == _nId) return &s_pPropertyInfos[i]; return NULL; } //------------------------------------------------------------------------ bool OPropertyInfoService::isComposable( const ::rtl::OUString& _rPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::inspection::XPropertyHandler >& _rxFormComponentHandler ) { sal_Int32 nId = getPropertyId( _rPropertyName ); if ( nId != -1 ) { sal_uInt32 nFlags = getPropertyUIFlags( nId ); return ( nFlags & PROP_FLAG_COMPOSEABLE ) != 0; } return _rxFormComponentHandler->isComposable( _rPropertyName ); } //------------------------------------------------------------------------ void OPropertyInfoService::getExcludeProperties(::std::vector< beans::Property >& _rExcludeProperties,const ::com::sun::star::uno::Reference< ::com::sun::star::inspection::XPropertyHandler >& _xFormComponentHandler) { uno::Sequence< beans::Property > aProps = _xFormComponentHandler->getSupportedProperties(); static const ::rtl::OUString pExcludeProperties[] = { ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Enabled")), ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Printable")), ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("WordBreak")), ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("MultiLine")), ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Tag")), ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("HelpText")), ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("HelpURL")), ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("MaxTextLen")), ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ReadOnly")), ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Tabstop")), ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("TabIndex")), ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ValueMin")), ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ValueMax")), ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Spin")), ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("SpinValue")), ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("SpinValueMin")), ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("SpinValueMax")), ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DefaultSpinValue")), ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("SpinIncrement")), ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Repeat")), ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("RepeatDelay")), ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ControlLabel")), /// TODO: has to be checked ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("LabelControl")), ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Title")), // comment this out if you want to have title feature for charts PROPERTY_MAXTEXTLEN, PROPERTY_EFFECTIVEDEFAULT, PROPERTY_EFFECTIVEMAX, PROPERTY_EFFECTIVEMIN, ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("HideInactiveSelection")), ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("SubmitAction")), ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("InputRequired")), ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("VerticalAlign")), PROPERTY_ALIGN, PROPERTY_EMPTY_IS_NULL, PROPERTY_FILTERPROPOSAL ,PROPERTY_POSITIONX ,PROPERTY_POSITIONY ,PROPERTY_WIDTH ,PROPERTY_HEIGHT ,PROPERTY_FONT ,PROPERTY_LABEL ,PROPERTY_LINECOLOR ,PROPERTY_BORDER ,PROPERTY_BORDERCOLOR ,PROPERTY_BACKTRANSPARENT ,PROPERTY_CONTROLBACKGROUND ,PROPERTY_BACKGROUNDCOLOR ,PROPERTY_CONTROLBACKGROUNDTRANSPARENT ,PROPERTY_FORMULALIST ,PROPERTY_SCOPE ,PROPERTY_TYPE ,PROPERTY_DATASOURCENAME ,PROPERTY_VERTICALALIGN }; beans::Property* pPropsIter = aProps.getArray(); beans::Property* pPropsEnd = pPropsIter + aProps.getLength(); for (; pPropsIter != pPropsEnd; ++pPropsIter) { size_t nPos = 0; for (; nPos < SAL_N_ELEMENTS(pExcludeProperties) && pExcludeProperties[nPos] != pPropsIter->Name;++nPos ) ; if ( nPos == SAL_N_ELEMENTS(pExcludeProperties) ) _rExcludeProperties.push_back(*pPropsIter); } } //............................................................................ } // namespace pcr //............................................................................ /* vim:set shiftwidth=4 softtabstop=4 expandtab: */