1
0
Fork 0
libreoffice/reportdesign/source/ui/inspection/metadata.cxx
Daniel Baumann 8e63e14cf6
Adding upstream version 4:25.2.3.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
2025-06-22 16:20:04 +02:00

297 lines
15 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
#include <metadata.hxx>
#include <com/sun/star/inspection/XPropertyHandler.hpp>
#include <core_resource.hxx>
#include <helpids.h>
#include <strings.hrc>
#include <strings.hxx>
#include <algorithm>
#include <string_view>
#include <utility>
namespace rptui
{
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star;
//= OPropertyInfoImpl
struct OPropertyInfoImpl
{
OUString sName;
OUString sTranslation;
OUString sHelpId;
sal_Int32 nId;
PropUIFlags nUIFlags;
OPropertyInfoImpl(
OUString aName,
sal_Int32 _nId,
OUString aTranslation,
OUString _sHelpId,
PropUIFlags _nUIFlags);
};
OPropertyInfoImpl::OPropertyInfoImpl(OUString _aName, sal_Int32 _nId,
OUString aString, OUString sHid, PropUIFlags _nUIFlags)
:sName(std::move(_aName))
,sTranslation(std::move(aString))
,sHelpId(std::move(sHid))
,nId(_nId)
,nUIFlags(_nUIFlags)
{
}
namespace {
// compare PropertyInfo
struct PropertyInfoLessByName
{
bool operator()( const OPropertyInfoImpl& _lhs, const OPropertyInfoImpl& _rhs )
{
return _lhs.sName < _rhs.sName;
}
};
}
//= OPropertyInfoService
sal_uInt16 OPropertyInfoService::s_nCount = 0;
OPropertyInfoImpl* OPropertyInfoService::s_pPropertyInfos = nullptr;
const OPropertyInfoImpl* OPropertyInfoService::getPropertyInfo()
{
if ( s_pPropertyInfos )
return s_pPropertyInfos;
static OPropertyInfoImpl aPropertyInfos[] =
{
OPropertyInfoImpl(PROPERTY_FORCENEWPAGE, PROPERTY_ID_FORCENEWPAGE, RptResId(RID_STR_FORCENEWPAGE), HID_RPT_PROP_FORCENEWPAGE, PropUIFlags::Composeable),
OPropertyInfoImpl(PROPERTY_NEWROWORCOL, PROPERTY_ID_NEWROWORCOL, RptResId(RID_STR_NEWROWORCOL), HID_RPT_PROP_NEWROWORCOL, PropUIFlags::Composeable),
OPropertyInfoImpl(PROPERTY_KEEPTOGETHER, PROPERTY_ID_KEEPTOGETHER, RptResId(RID_STR_KEEPTOGETHER), HID_RPT_PROP_KEEPTOGETHER, PropUIFlags::Composeable),
OPropertyInfoImpl(PROPERTY_CANGROW, PROPERTY_ID_CANGROW, RptResId(RID_STR_CANGROW), HID_RPT_PROP_CANGROW, PropUIFlags::Composeable),
OPropertyInfoImpl(PROPERTY_CANSHRINK, PROPERTY_ID_CANSHRINK, RptResId(RID_STR_CANSHRINK), HID_RPT_PROP_CANSHRINK, PropUIFlags::Composeable),
OPropertyInfoImpl(PROPERTY_REPEATSECTION, PROPERTY_ID_REPEATSECTION, RptResId(RID_STR_REPEATSECTION), HID_RPT_PROP_REPEATSECTION, PropUIFlags::Composeable),
OPropertyInfoImpl(PROPERTY_PRINTREPEATEDVALUES, PROPERTY_ID_PRINTREPEATEDVALUES, RptResId(RID_STR_PRINTREPEATEDVALUES), HID_RPT_PROP_PRINTREPEATEDVALUES, PropUIFlags::Composeable),
OPropertyInfoImpl(PROPERTY_CONDITIONALPRINTEXPRESSION, PROPERTY_ID_CONDITIONALPRINTEXPRESSION, RptResId(RID_STR_CONDITIONALPRINTEXPRESSION), HID_RPT_PROP_CONDITIONALPRINTEXPRESSION,
PropUIFlags::Composeable ),
OPropertyInfoImpl(PROPERTY_STARTNEWCOLUMN, PROPERTY_ID_STARTNEWCOLUMN, RptResId(RID_STR_STARTNEWCOLUMN), HID_RPT_PROP_STARTNEWCOLUMN, PropUIFlags::Composeable),
OPropertyInfoImpl(PROPERTY_RESETPAGENUMBER, PROPERTY_ID_RESETPAGENUMBER, RptResId(RID_STR_RESETPAGENUMBER), HID_RPT_PROP_RESETPAGENUMBER, PropUIFlags::Composeable),
OPropertyInfoImpl(PROPERTY_PRINTWHENGROUPCHANGE, PROPERTY_ID_PRINTWHENGROUPCHANGE, RptResId(RID_STR_PRINTWHENGROUPCHANGE), HID_RPT_PROP_PRINTWHENGROUPCHANGE, PropUIFlags::Composeable),
OPropertyInfoImpl(PROPERTY_VISIBLE, PROPERTY_ID_VISIBLE, RptResId(RID_STR_VISIBLE), HID_RPT_PROP_VISIBLE, PropUIFlags::Composeable),
OPropertyInfoImpl(PROPERTY_GROUPKEEPTOGETHER, PROPERTY_ID_GROUPKEEPTOGETHER, RptResId(RID_STR_GROUPKEEPTOGETHER), HID_RPT_PROP_GROUPKEEPTOGETHER, PropUIFlags::Composeable),
OPropertyInfoImpl(PROPERTY_PAGEHEADEROPTION, PROPERTY_ID_PAGEHEADEROPTION, RptResId(RID_STR_PAGEHEADEROPTION), HID_RPT_PROP_PAGEHEADEROPTION, PropUIFlags::Composeable),
OPropertyInfoImpl(PROPERTY_PAGEFOOTEROPTION, PROPERTY_ID_PAGEFOOTEROPTION, RptResId(RID_STR_PAGEFOOTEROPTION), HID_RPT_PROP_PAGEFOOTEROPTION, PropUIFlags::Composeable),
OPropertyInfoImpl(PROPERTY_POSITIONX, PROPERTY_ID_POSITIONX, RptResId(RID_STR_POSITIONX), HID_RPT_PROP_RPT_POSITIONX, PropUIFlags::Composeable),
OPropertyInfoImpl(PROPERTY_POSITIONY, PROPERTY_ID_POSITIONY, RptResId(RID_STR_POSITIONY), HID_RPT_PROP_RPT_POSITIONY, PropUIFlags::Composeable),
OPropertyInfoImpl(PROPERTY_WIDTH, PROPERTY_ID_WIDTH, RptResId(RID_STR_WIDTH), HID_RPT_PROP_RPT_WIDTH, PropUIFlags::Composeable),
OPropertyInfoImpl(PROPERTY_HEIGHT, PROPERTY_ID_HEIGHT, RptResId(RID_STR_HEIGHT), HID_RPT_PROP_RPT_HEIGHT, PropUIFlags::Composeable),
OPropertyInfoImpl(PROPERTY_AUTOGROW, PROPERTY_ID_AUTOGROW, RptResId(RID_STR_AUTOGROW), HID_RPT_PROP_RPT_AUTOGROW, PropUIFlags::Composeable),
OPropertyInfoImpl(PROPERTY_FONT, PROPERTY_ID_FONT, RptResId(RID_STR_FONT), HID_RPT_PROP_RPT_FONT, PropUIFlags::Composeable),
OPropertyInfoImpl(PROPERTY_PREEVALUATED, PROPERTY_ID_PREEVALUATED, RptResId(RID_STR_PREEVALUATED), HID_RPT_PROP_PREEVALUATED, PropUIFlags::Composeable),
OPropertyInfoImpl(PROPERTY_DEEPTRAVERSING, PROPERTY_ID_DEEPTRAVERSING, RptResId(RID_STR_DEEPTRAVERSING), HID_RPT_PROP_DEEPTRAVERSING, PropUIFlags::Composeable),
OPropertyInfoImpl(PROPERTY_FORMULA, PROPERTY_ID_FORMULA, RptResId(RID_STR_FORMULA), HID_RPT_PROP_FORMULA, PropUIFlags::Composeable),
OPropertyInfoImpl(PROPERTY_INITIALFORMULA, PROPERTY_ID_INITIALFORMULA, RptResId(RID_STR_INITIALFORMULA), HID_RPT_PROP_INITIALFORMULA, PropUIFlags::Composeable),
OPropertyInfoImpl(PROPERTY_TYPE, PROPERTY_ID_TYPE, RptResId(RID_STR_TYPE), HID_RPT_PROP_TYPE, PropUIFlags::Composeable | PropUIFlags::DataProperty),
OPropertyInfoImpl(PROPERTY_DATAFIELD,PROPERTY_ID_DATAFIELD, RptResId(RID_STR_DATAFIELD), HID_RPT_PROP_DATAFIELD, PropUIFlags::Composeable | PropUIFlags::DataProperty),
OPropertyInfoImpl(PROPERTY_FORMULALIST, PROPERTY_ID_FORMULALIST, RptResId(RID_STR_FORMULALIST), HID_RPT_PROP_FORMULALIST, PropUIFlags::Composeable | PropUIFlags::DataProperty),
OPropertyInfoImpl(PROPERTY_SCOPE, PROPERTY_ID_SCOPE, RptResId(RID_STR_SCOPE), HID_RPT_PROP_SCOPE, PropUIFlags::Composeable | PropUIFlags::DataProperty),
OPropertyInfoImpl(PROPERTY_PRESERVEIRI, PROPERTY_ID_PRESERVEIRI, RptResId(RID_STR_PRESERVEIRI), HID_RPT_PROP_PRESERVEIRI, PropUIFlags::Composeable),
OPropertyInfoImpl(PROPERTY_BACKCOLOR, PROPERTY_ID_BACKCOLOR, RptResId(RID_STR_BACKCOLOR), HID_RPT_PROP_BACKCOLOR, PropUIFlags::Composeable),
OPropertyInfoImpl(PROPERTY_CONTROLBACKGROUND, PROPERTY_ID_CONTROLBACKGROUND, RptResId(RID_STR_BACKCOLOR), HID_RPT_PROP_BACKCOLOR, PropUIFlags::Composeable),
OPropertyInfoImpl(PROPERTY_BACKTRANSPARENT, PROPERTY_ID_BACKTRANSPARENT, RptResId(RID_STR_BACKTRANSPARENT), HID_RPT_PROP_BACKTRANSPARENT, PropUIFlags::Composeable),
OPropertyInfoImpl(PROPERTY_CONTROLBACKGROUNDTRANSPARENT, PROPERTY_ID_CONTROLBACKGROUNDTRANSPARENT, RptResId(RID_STR_CONTROLBACKGROUNDTRANSPARENT), HID_RPT_PROP_CONTROLBACKGROUNDTRANSPARENT,
PropUIFlags::Composeable),
OPropertyInfoImpl(PROPERTY_CHARTTYPE, PROPERTY_ID_CHARTTYPE, RptResId(RID_STR_CHARTTYPE), HID_RPT_PROP_CHARTTYPE, PropUIFlags::Composeable),
OPropertyInfoImpl(PROPERTY_PREVIEW_COUNT, PROPERTY_ID_PREVIEW_COUNT, RptResId(RID_STR_PREVIEW_COUNT), HID_RPT_PROP_PREVIEW_COUNT, PropUIFlags::Composeable),
OPropertyInfoImpl(PROPERTY_MASTERFIELDS, PROPERTY_ID_MASTERFIELDS, RptResId(RID_STR_MASTERFIELDS), HID_RPT_PROP_MASTERFIELDS, PropUIFlags::Composeable | PropUIFlags::DataProperty),
OPropertyInfoImpl(PROPERTY_DETAILFIELDS, PROPERTY_ID_DETAILFIELDS, RptResId(RID_STR_DETAILFIELDS), HID_RPT_PROP_DETAILFIELDS, PropUIFlags::Composeable | PropUIFlags::DataProperty),
OPropertyInfoImpl(PROPERTY_AREA, PROPERTY_ID_AREA, RptResId(RID_STR_AREA), HID_RPT_PROP_AREA, PropUIFlags::Composeable),
OPropertyInfoImpl(PROPERTY_MIMETYPE, PROPERTY_ID_MIMETYPE, RptResId(RID_STR_MIMETYPE), HID_RPT_PROP_MIMETYPE, PropUIFlags::Composeable | PropUIFlags::DataProperty),
OPropertyInfoImpl(PROPERTY_PARAADJUST, PROPERTY_ID_PARAADJUST, RptResId(RID_STR_PARAADJUST), HID_RPT_PROP_PARAADJUST, PropUIFlags::Composeable),
OPropertyInfoImpl(PROPERTY_VERTICALALIGN, PROPERTY_ID_VERTICALALIGN, RptResId(RID_STR_VERTICALALIGN), HID_RPT_PROP_VERTICALALIGN, PropUIFlags::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 OUString& _rName)
{
const OPropertyInfoImpl* pInfo = getPropertyInfo(_rName);
return pInfo ? pInfo->nId : -1;
}
OUString OPropertyInfoService::getPropertyTranslation(sal_Int32 _nId)
{
const OPropertyInfoImpl* pInfo = getPropertyInfo(_nId);
return pInfo ? pInfo->sTranslation : OUString();
}
OUString OPropertyInfoService::getPropertyHelpId(sal_Int32 _nId)
{
const OPropertyInfoImpl* pInfo = getPropertyInfo(_nId);
return pInfo ? pInfo->sHelpId : OUString();
}
PropUIFlags OPropertyInfoService::getPropertyUIFlags(sal_Int32 _nId)
{
const OPropertyInfoImpl* pInfo = getPropertyInfo(_nId);
return pInfo ? pInfo->nUIFlags : PropUIFlags::NONE;
}
const OPropertyInfoImpl* OPropertyInfoService::getPropertyInfo(const OUString& _rName)
{
// initialization
if(!s_pPropertyInfos)
getPropertyInfo();
OPropertyInfoImpl aSearch(_rName, 0, OUString(), u""_ustr, PropUIFlags::NONE);
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 nullptr;
}
const OPropertyInfoImpl* OPropertyInfoService::getPropertyInfo(sal_Int32 _nId)
{
// initialization
if(!s_pPropertyInfos)
{
getPropertyInfo();
assert(s_pPropertyInfos);
}
// 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 nullptr;
}
bool OPropertyInfoService::isComposable( const OUString& _rPropertyName, const css::uno::Reference< css::inspection::XPropertyHandler >& _rxFormComponentHandler )
{
sal_Int32 nId = getPropertyId( _rPropertyName );
if ( nId != -1 )
{
PropUIFlags nFlags = getPropertyUIFlags( nId );
return bool( nFlags & PropUIFlags::Composeable );
}
return _rxFormComponentHandler->isComposable( _rPropertyName );
}
void OPropertyInfoService::getExcludeProperties(::std::vector< beans::Property >& _rExcludeProperties,const css::uno::Reference< css::inspection::XPropertyHandler >& _xFormComponentHandler)
{
const uno::Sequence< beans::Property > aProps = _xFormComponentHandler->getSupportedProperties();
static const std::u16string_view pExcludeProperties[] =
{
u"Enabled",
u"Printable",
u"WordBreak",
u"MultiLine",
u"Tag",
u"HelpText",
u"HelpURL",
u"MaxTextLen",
u"ReadOnly",
u"Tabstop",
u"TabIndex",
u"ValueMin",
u"ValueMax",
u"Spin",
u"SpinValue",
u"SpinValueMin",
u"SpinValueMax",
u"DefaultSpinValue",
u"SpinIncrement",
u"Repeat",
u"RepeatDelay",
u"ControlLabel", /// TODO: has to be checked
u"LabelControl",
u"Title", // comment this out if you want to have title feature for charts
PROPERTY_MAXTEXTLEN,
PROPERTY_EFFECTIVEDEFAULT,
PROPERTY_EFFECTIVEMAX,
PROPERTY_EFFECTIVEMIN,
u"HideInactiveSelection",
u"SubmitAction",
u"InputRequired",
u"VerticalAlign",
PROPERTY_ALIGN,
PROPERTY_EMPTY_IS_NULL,
PROPERTY_FILTERPROPOSAL
,PROPERTY_POSITIONX
,PROPERTY_POSITIONY
,PROPERTY_WIDTH
,PROPERTY_HEIGHT
,PROPERTY_AUTOGROW
,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
};
for (beans::Property const & prop : aProps)
{
size_t nPos = 0;
for (; nPos < SAL_N_ELEMENTS(pExcludeProperties) && pExcludeProperties[nPos] != prop.Name; ++nPos )
;
if ( nPos == SAL_N_ELEMENTS(pExcludeProperties) )
_rExcludeProperties.push_back(prop);
}
}
} // namespace pcr
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */