1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 #include "precompiled_reportdesign.hxx"
24 #include "metadata.hxx"
25 #include <svtools/localresaccess.hxx>
26 #include "com/sun/star/inspection/XPropertyHandler.hpp"
27 #include <tools/debug.hxx>
28 #include <comphelper/extract.hxx>
29 #ifndef RTPUI_REPORTDESIGN_HELPID_HRC
30 #include "helpids.hrc"
31 #endif
32 #ifndef _RPTUI_DLGRESID_HRC
33 #include "RptResId.hrc"
34 #endif
35 #ifndef REPORTDESIGN_SHARED_UISTRINGS_HRC
36 #include "uistrings.hrc"
37 #endif
38 
39 #include <functional>
40 #include <algorithm>
41 
42 //............................................................................
43 namespace rptui
44 {
45 //............................................................................
46 
47 	using namespace ::com::sun::star::uno;
48     using namespace ::com::sun::star;
49 
50 	//========================================================================
51 	//= OPropertyInfoImpl
52 	//========================================================================
53 	struct OPropertyInfoImpl
54 	{
55 		String			sName;
56 		String			sTranslation;
57 		rtl::OString    sHelpId;
58 		sal_Int32       nId;
59 		sal_uInt16      nPos;
60         sal_uInt32      nUIFlags;
61 
62 		OPropertyInfoImpl(
63 						const ::rtl::OUString&		rName,
64 						sal_Int32					_nId,
65 						const String&				aTranslation,
66 						sal_uInt16					nPosId,
67 						const rtl::OString&			_sHelpId,
68                         sal_uInt32                  _nUIFlags);
69 	};
70 
71 	//------------------------------------------------------------------------
OPropertyInfoImpl(const::rtl::OUString & _rName,sal_Int32 _nId,const String & aString,sal_uInt16 nP,const rtl::OString & sHid,sal_uInt32 _nUIFlags)72 	OPropertyInfoImpl::OPropertyInfoImpl(const ::rtl::OUString& _rName, sal_Int32 _nId,
73 								   const String& aString, sal_uInt16 nP, const rtl::OString& sHid, sal_uInt32 _nUIFlags)
74 	   :sName(_rName)
75 	   ,sTranslation(aString)
76 	   ,sHelpId(sHid)
77 	   ,nId(_nId)
78 	   ,nPos(nP)
79        ,nUIFlags(_nUIFlags)
80 	{
81 	}
82 
83 	//------------------------------------------------------------------------
84 	// Vergleichen von PropertyInfo
85     struct PropertyInfoLessByName : public ::std::binary_function< OPropertyInfoImpl, OPropertyInfoImpl, bool >
86     {
operator ()rptui::PropertyInfoLessByName87         bool operator()( const OPropertyInfoImpl& _lhs, const OPropertyInfoImpl& _rhs )
88         {
89             return _lhs.sName < _rhs.sName;
90         }
91     };
92 
93 	//========================================================================
94 	//= OPropertyInfoService
95 	//========================================================================
96 #define DEF_INFO( ident, uinameres, helpid, flags )   \
97     OPropertyInfoImpl( PROPERTY_##ident, PROPERTY_ID_##ident, \
98             String( ModuleRes( RID_STR_##uinameres ) ), nPos++, HID_RPT_PROP_##helpid, flags )
99 
100 #define DEF_INFO_1( ident, uinameres, helpid, flag1 ) \
101     DEF_INFO( ident, uinameres, helpid, PROP_FLAG_##flag1 )
102 
103 #define DEF_INFO_2( ident, uinameres, helpid, flag1, flag2 ) \
104     DEF_INFO( ident, uinameres, helpid, PROP_FLAG_##flag1 | PROP_FLAG_##flag2 )
105 
106 #define DEF_INFO_3( ident, uinameres, helpid, flag1, flag2, flag3 ) \
107     DEF_INFO( ident, uinameres, helpid, PROP_FLAG_##flag1 | PROP_FLAG_##flag2 | PROP_FLAG_##flag3 )
108 
109 #define DEF_INFO_4( ident, uinameres, helpid, flag1, flag2, flag3, flag4 ) \
110     DEF_INFO( ident, uinameres, helpid, PROP_FLAG_##flag1 | PROP_FLAG_##flag2 | PROP_FLAG_##flag3 | PROP_FLAG_##flag4 )
111 
112 #define DEF_INFO_5( ident, uinameres, helpid, flag1, flag2, flag3, flag4, flag5 ) \
113     DEF_INFO( ident, uinameres, helpid, PROP_FLAG_##flag1 | PROP_FLAG_##flag2 | PROP_FLAG_##flag3 | PROP_FLAG_##flag4 | PROP_FLAG_##flag5 )
114 
115     sal_uInt16				OPropertyInfoService::s_nCount = 0;
116 	OPropertyInfoImpl*		OPropertyInfoService::s_pPropertyInfos = NULL;
117 	//------------------------------------------------------------------------
getPropertyInfo()118 	const OPropertyInfoImpl* OPropertyInfoService::getPropertyInfo()
119 	{
120 		if ( s_pPropertyInfos )
121             return s_pPropertyInfos;
122 
123 		OModuleClient aResourceAccess;
124 		// this ensures that we have our resource file loaded
125 
126 		sal_uInt16 nPos = 1;
127         static OPropertyInfoImpl aPropertyInfos[] =
128 		{
129         /*
130         DEF_INFO_?( propname and id,   resoure id,         help id,           flags ),
131         */
132              DEF_INFO_1( FORCENEWPAGE,                  FORCENEWPAGE,               FORCENEWPAGE,               COMPOSEABLE )
133             ,DEF_INFO_1( NEWROWORCOL,                   NEWROWORCOL,                NEWROWORCOL,                COMPOSEABLE )
134             ,DEF_INFO_1( KEEPTOGETHER,                  KEEPTOGETHER,               KEEPTOGETHER,               COMPOSEABLE )
135             ,DEF_INFO_1( CANGROW,                       CANGROW,                    CANGROW,                    COMPOSEABLE )
136             ,DEF_INFO_1( CANSHRINK,                     CANSHRINK,                  CANSHRINK,                  COMPOSEABLE )
137             ,DEF_INFO_1( REPEATSECTION,                 REPEATSECTION,              REPEATSECTION,              COMPOSEABLE )
138             ,DEF_INFO_1( PRINTREPEATEDVALUES,           PRINTREPEATEDVALUES,        PRINTREPEATEDVALUES,        COMPOSEABLE )
139             ,DEF_INFO_1( CONDITIONALPRINTEXPRESSION,    CONDITIONALPRINTEXPRESSION, CONDITIONALPRINTEXPRESSION, COMPOSEABLE )
140             ,DEF_INFO_1( STARTNEWCOLUMN,                STARTNEWCOLUMN,             STARTNEWCOLUMN,             COMPOSEABLE )
141             ,DEF_INFO_1( RESETPAGENUMBER,               RESETPAGENUMBER,            RESETPAGENUMBER,            COMPOSEABLE )
142             ,DEF_INFO_1( PRINTWHENGROUPCHANGE,          PRINTWHENGROUPCHANGE,       PRINTWHENGROUPCHANGE,       COMPOSEABLE )
143             ,DEF_INFO_1( VISIBLE,                       VISIBLE,                    VISIBLE,                    COMPOSEABLE )
144             ,DEF_INFO_1( GROUPKEEPTOGETHER,             GROUPKEEPTOGETHER,          GROUPKEEPTOGETHER,          COMPOSEABLE )
145             ,DEF_INFO_1( PAGEHEADEROPTION,              PAGEHEADEROPTION,           PAGEHEADEROPTION,           COMPOSEABLE )
146             ,DEF_INFO_1( PAGEFOOTEROPTION,              PAGEFOOTEROPTION,           PAGEFOOTEROPTION,           COMPOSEABLE )
147             ,DEF_INFO_1( POSITIONX,                     POSITIONX,                  RPT_POSITIONX,              COMPOSEABLE )
148             ,DEF_INFO_1( POSITIONY,                     POSITIONY,                  RPT_POSITIONY,              COMPOSEABLE )
149             ,DEF_INFO_1( WIDTH,                         WIDTH,                      RPT_WIDTH,                  COMPOSEABLE )
150             ,DEF_INFO_1( HEIGHT,                        HEIGHT,                     RPT_HEIGHT,                 COMPOSEABLE )
151             ,DEF_INFO_1( FONT,                          FONT,                       RPT_FONT,                   COMPOSEABLE )
152             ,DEF_INFO_1( PREEVALUATED,                  PREEVALUATED,               PREEVALUATED,               COMPOSEABLE )
153             ,DEF_INFO_1( DEEPTRAVERSING,                DEEPTRAVERSING,             DEEPTRAVERSING,             COMPOSEABLE )
154             ,DEF_INFO_1( FORMULA,                       FORMULA,                    FORMULA,                    COMPOSEABLE )
155             ,DEF_INFO_1( INITIALFORMULA,                INITIALFORMULA,             INITIALFORMULA,             COMPOSEABLE )
156             ,DEF_INFO_2( TYPE,                          TYPE,                       TYPE,                       COMPOSEABLE,DATA_PROPERTY )
157             ,DEF_INFO_2( DATAFIELD,                     DATAFIELD,                  DATAFIELD,                  COMPOSEABLE,DATA_PROPERTY )
158             ,DEF_INFO_2( FORMULALIST,                   FORMULALIST,                FORMULALIST,                COMPOSEABLE,DATA_PROPERTY )
159             ,DEF_INFO_2( SCOPE,                         SCOPE,                      SCOPE,                      COMPOSEABLE,DATA_PROPERTY )
160             ,DEF_INFO_1( PRESERVEIRI,                   PRESERVEIRI,                PRESERVEIRI,                COMPOSEABLE )
161             ,DEF_INFO_1( BACKCOLOR,                     BACKCOLOR,                  BACKCOLOR,                  COMPOSEABLE )
162             ,DEF_INFO_1( CONTROLBACKGROUND,             BACKCOLOR,                  BACKCOLOR,                  COMPOSEABLE )
163             ,DEF_INFO_1( BACKTRANSPARENT,               BACKTRANSPARENT,            BACKTRANSPARENT,            COMPOSEABLE )
164             ,DEF_INFO_1( CONTROLBACKGROUNDTRANSPARENT,  CONTROLBACKGROUNDTRANSPARENT
165                                                                     ,CONTROLBACKGROUNDTRANSPARENT, COMPOSEABLE )
166             ,DEF_INFO_1( CHARTTYPE,                     CHARTTYPE,                  CHARTTYPE,                  COMPOSEABLE )
167             ,DEF_INFO_1( PREVIEW_COUNT,                 PREVIEW_COUNT,              PREVIEW_COUNT,              COMPOSEABLE )
168             ,DEF_INFO_2( MASTERFIELDS,                  MASTERFIELDS,               MASTERFIELDS,               COMPOSEABLE,DATA_PROPERTY )
169             ,DEF_INFO_2( DETAILFIELDS,                  DETAILFIELDS,               DETAILFIELDS,               COMPOSEABLE,DATA_PROPERTY)
170             ,DEF_INFO_1( AREA,                          AREA,                       AREA,                       COMPOSEABLE )
171             ,DEF_INFO_2( MIMETYPE,                      MIMETYPE,                   MIMETYPE,                   COMPOSEABLE,DATA_PROPERTY )
172             ,DEF_INFO_1( PARAADJUST,                    PARAADJUST,                 PARAADJUST,                 COMPOSEABLE )
173             ,DEF_INFO_1( VERTICALALIGN,                 VERTICALALIGN,              VERTICALALIGN,              COMPOSEABLE )
174 		};
175 
176 		s_pPropertyInfos = aPropertyInfos;
177 		s_nCount = sizeof(aPropertyInfos) / sizeof(OPropertyInfoImpl);
178 
179         ::std::sort( aPropertyInfos, aPropertyInfos + s_nCount, PropertyInfoLessByName() );
180 
181         return s_pPropertyInfos;
182 	}
183 
184 	//------------------------------------------------------------------------
getPropertyId(const String & _rName) const185 	sal_Int32 OPropertyInfoService::getPropertyId(const String& _rName) const
186 	{
187 		const OPropertyInfoImpl* pInfo = getPropertyInfo(_rName);
188 		return pInfo ? pInfo->nId : -1;
189 	}
190 
191 	//------------------------------------------------------------------------
getPropertyTranslation(sal_Int32 _nId) const192 	String OPropertyInfoService::getPropertyTranslation(sal_Int32 _nId) const
193 	{
194 		const OPropertyInfoImpl* pInfo = getPropertyInfo(_nId);
195 		return (pInfo) ? pInfo->sTranslation : String();
196 	}
197 
198 	//------------------------------------------------------------------------
getPropertyHelpId(sal_Int32 _nId) const199 	rtl::OString OPropertyInfoService::getPropertyHelpId(sal_Int32 _nId) const
200 	{
201 		const OPropertyInfoImpl* pInfo = getPropertyInfo(_nId);
202 		return (pInfo) ? pInfo->sHelpId : rtl::OString();
203 	}
204 
205 	//------------------------------------------------------------------------
getPropertyUIFlags(sal_Int32 _nId) const206 	sal_uInt32 OPropertyInfoService::getPropertyUIFlags(sal_Int32 _nId) const
207 	{
208 		const OPropertyInfoImpl* pInfo = getPropertyInfo(_nId);
209 		return (pInfo) ? pInfo->nUIFlags : 0;
210 	}
211 
212 	//------------------------------------------------------------------------
getPropertyInfo(const String & _rName)213 	const OPropertyInfoImpl* OPropertyInfoService::getPropertyInfo(const String& _rName)
214 	{
215 		// intialisierung
216 		if(!s_pPropertyInfos)
217 			getPropertyInfo();
218 		OPropertyInfoImpl  aSearch(_rName, 0L, String(), 0, "", 0);
219 
220 		const OPropertyInfoImpl* pPropInfo = ::std::lower_bound(
221             s_pPropertyInfos, s_pPropertyInfos + s_nCount, aSearch, PropertyInfoLessByName() );
222 
223         if ( ( pPropInfo < s_pPropertyInfos + s_nCount ) && pPropInfo->sName == _rName )
224             return pPropInfo;
225 
226 		return NULL;
227 	}
228 
229 
230 	//------------------------------------------------------------------------
getPropertyInfo(sal_Int32 _nId)231 	const OPropertyInfoImpl* OPropertyInfoService::getPropertyInfo(sal_Int32 _nId)
232 	{
233 		// intialisierung
234 		if(!s_pPropertyInfos)
235 			getPropertyInfo();
236 
237 		// TODO: a real structure which allows quick access by name as well as by id
238 		for (sal_uInt16 i = 0; i < s_nCount; i++)
239 			if (s_pPropertyInfos[i].nId == _nId)
240 				return &s_pPropertyInfos[i];
241 
242 		return NULL;
243 	}
244 
245     //------------------------------------------------------------------------
isComposable(const::rtl::OUString & _rPropertyName,const::com::sun::star::uno::Reference<::com::sun::star::inspection::XPropertyHandler> & _rxFormComponentHandler)246     bool OPropertyInfoService::isComposable( const ::rtl::OUString& _rPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::inspection::XPropertyHandler >& _rxFormComponentHandler )
247     {
248         sal_Int32 nId = getPropertyId( _rPropertyName );
249         if ( nId != -1 )
250         {
251             sal_uInt32 nFlags = getPropertyUIFlags( nId );
252             return ( nFlags & PROP_FLAG_COMPOSEABLE ) != 0;
253         }
254 
255         return _rxFormComponentHandler->isComposable( _rPropertyName );
256     }
257 
258     //------------------------------------------------------------------------
getExcludeProperties(::std::vector<beans::Property> & _rExcludeProperties,const::com::sun::star::uno::Reference<::com::sun::star::inspection::XPropertyHandler> & _xFormComponentHandler)259     void OPropertyInfoService::getExcludeProperties(::std::vector< beans::Property >& _rExcludeProperties,const ::com::sun::star::uno::Reference< ::com::sun::star::inspection::XPropertyHandler >& _xFormComponentHandler)
260     {
261         uno::Sequence< beans::Property > aProps = _xFormComponentHandler->getSupportedProperties();
262         static const ::rtl::OUString pExcludeProperties[] =
263         {
264                 ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Enabled")),
265                 ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Printable")),
266                 ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("WordBreak")),
267                 ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("MultiLine")),
268                 ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Tag")),
269                 ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("HelpText")),
270                 ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("HelpURL")),
271                 ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("MaxTextLen")),
272                 ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ReadOnly")),
273                 ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Tabstop")),
274                 ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("TabIndex")),
275                 ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ValueMin")),
276                 ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ValueMax")),
277                 ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Spin")),
278                 ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("SpinValue")),
279                 ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("SpinValueMin")),
280                 ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("SpinValueMax")),
281                 ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DefaultSpinValue")),
282                 ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("SpinIncrement")),
283                 ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Repeat")),
284                 ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("RepeatDelay")),
285                 ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ControlLabel")), /// TODO: has to be checked
286                 ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("LabelControl")),
287                 ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Title")), // comment this out if you want to have title feature for charts
288                 PROPERTY_MAXTEXTLEN,
289                 PROPERTY_EFFECTIVEDEFAULT,
290                 PROPERTY_EFFECTIVEMAX,
291                 PROPERTY_EFFECTIVEMIN,
292                 ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("HideInactiveSelection")),
293                 ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("SubmitAction")),
294                 ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("InputRequired")),
295                 ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("VerticalAlign")),
296                 PROPERTY_ALIGN,
297                 PROPERTY_EMPTY_IS_NULL,
298                 PROPERTY_FILTERPROPOSAL
299                 ,PROPERTY_POSITIONX
300                 ,PROPERTY_POSITIONY
301                 ,PROPERTY_WIDTH
302                 ,PROPERTY_HEIGHT
303                 ,PROPERTY_FONT
304                 ,PROPERTY_LABEL
305                 ,PROPERTY_LINECOLOR
306                 ,PROPERTY_BORDER
307                 ,PROPERTY_BORDERCOLOR
308                 ,PROPERTY_BACKTRANSPARENT
309                 ,PROPERTY_CONTROLBACKGROUND
310                 ,PROPERTY_BACKGROUNDCOLOR
311                 ,PROPERTY_CONTROLBACKGROUNDTRANSPARENT
312                 ,PROPERTY_FORMULALIST
313                 ,PROPERTY_SCOPE
314                 ,PROPERTY_TYPE
315                 ,PROPERTY_DATASOURCENAME
316                 ,PROPERTY_VERTICALALIGN
317         };
318 
319         beans::Property* pPropsIter = aProps.getArray();
320         beans::Property* pPropsEnd = pPropsIter + aProps.getLength();
321         for (; pPropsIter != pPropsEnd; ++pPropsIter)
322         {
323             size_t nPos = 0;
324             for (; nPos < sizeof(pExcludeProperties)/sizeof(pExcludeProperties[0]) && pExcludeProperties[nPos] != pPropsIter->Name;++nPos )
325                 ;
326             if ( nPos == sizeof(pExcludeProperties)/sizeof(pExcludeProperties[0]) )
327                 _rExcludeProperties.push_back(*pPropsIter);
328         }
329     }
330 
331 
332 //............................................................................
333 } // namespace pcr
334 //............................................................................
335 
336