1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
29*cdf0e10cSrcweir #include "precompiled_extensions.hxx"
30*cdf0e10cSrcweir #include "handlerhelper.hxx"
31*cdf0e10cSrcweir #ifndef EXTENSIONS_PROPRESID_HRC
32*cdf0e10cSrcweir #include "propresid.hrc"
33*cdf0e10cSrcweir #endif
34*cdf0e10cSrcweir #include "formresid.hrc"
35*cdf0e10cSrcweir #include <comphelper/extract.hxx>
36*cdf0e10cSrcweir #ifndef _EXTENSIONS_PROPCTRLR_MODULEPRC_HXX_
37*cdf0e10cSrcweir #include "modulepcr.hxx"
38*cdf0e10cSrcweir #endif
39*cdf0e10cSrcweir #include "enumrepresentation.hxx"
40*cdf0e10cSrcweir #include "formmetadata.hxx"
41*cdf0e10cSrcweir #include "pcrcomponentcontext.hxx"
42*cdf0e10cSrcweir 
43*cdf0e10cSrcweir /** === begin UNO includes === **/
44*cdf0e10cSrcweir #include "com/sun/star/inspection/StringRepresentation.hpp"
45*cdf0e10cSrcweir #include <com/sun/star/beans/PropertyAttribute.hpp>
46*cdf0e10cSrcweir #include <com/sun/star/uno/XComponentContext.hpp>
47*cdf0e10cSrcweir #include <com/sun/star/util/XModifiable.hpp>
48*cdf0e10cSrcweir #include <com/sun/star/awt/XWindow.hpp>
49*cdf0e10cSrcweir #include <com/sun/star/inspection/LineDescriptor.hpp>
50*cdf0e10cSrcweir #include <com/sun/star/inspection/PropertyControlType.hpp>
51*cdf0e10cSrcweir #include <com/sun/star/inspection/XStringListControl.hpp>
52*cdf0e10cSrcweir #include <com/sun/star/inspection/XNumericControl.hpp>
53*cdf0e10cSrcweir /** === end UNO includes === **/
54*cdf0e10cSrcweir #include <tools/debug.hxx>
55*cdf0e10cSrcweir #include <tools/diagnose_ex.h>
56*cdf0e10cSrcweir #include <tools/StringListResource.hxx>
57*cdf0e10cSrcweir #include <toolkit/helper/vclunohelper.hxx>
58*cdf0e10cSrcweir 
59*cdf0e10cSrcweir #include <algorithm>
60*cdf0e10cSrcweir 
61*cdf0e10cSrcweir //........................................................................
62*cdf0e10cSrcweir namespace pcr
63*cdf0e10cSrcweir {
64*cdf0e10cSrcweir //........................................................................
65*cdf0e10cSrcweir 
66*cdf0e10cSrcweir     using namespace ::com::sun::star::uno;
67*cdf0e10cSrcweir     using namespace ::com::sun::star::lang;
68*cdf0e10cSrcweir     using namespace ::com::sun::star::awt;
69*cdf0e10cSrcweir     using namespace ::com::sun::star::util;
70*cdf0e10cSrcweir     using namespace ::com::sun::star::beans;
71*cdf0e10cSrcweir     using namespace ::com::sun::star::script;
72*cdf0e10cSrcweir     using namespace ::com::sun::star::inspection;
73*cdf0e10cSrcweir 
74*cdf0e10cSrcweir 	//====================================================================
75*cdf0e10cSrcweir 	//= PropertyHandlerHelper
76*cdf0e10cSrcweir 	//====================================================================
77*cdf0e10cSrcweir 	//--------------------------------------------------------------------
78*cdf0e10cSrcweir     void PropertyHandlerHelper::describePropertyLine( const Property& _rProperty,
79*cdf0e10cSrcweir         LineDescriptor& /* [out] */ _out_rDescriptor, const Reference< XPropertyControlFactory >& _rxControlFactory )
80*cdf0e10cSrcweir     {
81*cdf0e10cSrcweir         // display the pure property name - no L10N
82*cdf0e10cSrcweir         _out_rDescriptor.DisplayName = _rProperty.Name;
83*cdf0e10cSrcweir 
84*cdf0e10cSrcweir         OSL_PRECOND( _rxControlFactory.is(), "PropertyHandlerHelper::describePropertyLine: no factory -> no control!" );
85*cdf0e10cSrcweir         if ( !_rxControlFactory.is() )
86*cdf0e10cSrcweir             return;
87*cdf0e10cSrcweir 
88*cdf0e10cSrcweir         sal_Bool bReadOnlyControl = requiresReadOnlyControl( _rProperty.Attributes );
89*cdf0e10cSrcweir 
90*cdf0e10cSrcweir         // special handling for booleans (this will become a list)
91*cdf0e10cSrcweir         if ( _rProperty.Type.getTypeClass() == TypeClass_BOOLEAN )
92*cdf0e10cSrcweir         {
93*cdf0e10cSrcweir             ::std::vector< ::rtl::OUString > aListEntries;
94*cdf0e10cSrcweir             tools::StringListResource aRes(PcrRes(RID_RSC_ENUM_YESNO),aListEntries);
95*cdf0e10cSrcweir             _out_rDescriptor.Control = createListBoxControl( _rxControlFactory, aListEntries, bReadOnlyControl, sal_False );
96*cdf0e10cSrcweir             return;
97*cdf0e10cSrcweir         }
98*cdf0e10cSrcweir 
99*cdf0e10cSrcweir         sal_Int16 nControlType = PropertyControlType::TextField;
100*cdf0e10cSrcweir         switch ( _rProperty.Type.getTypeClass() )
101*cdf0e10cSrcweir         {
102*cdf0e10cSrcweir         case TypeClass_BYTE:
103*cdf0e10cSrcweir         case TypeClass_SHORT:
104*cdf0e10cSrcweir         case TypeClass_UNSIGNED_SHORT:
105*cdf0e10cSrcweir         case TypeClass_LONG:
106*cdf0e10cSrcweir         case TypeClass_UNSIGNED_LONG:
107*cdf0e10cSrcweir         case TypeClass_HYPER:
108*cdf0e10cSrcweir         case TypeClass_UNSIGNED_HYPER:
109*cdf0e10cSrcweir         case TypeClass_FLOAT:
110*cdf0e10cSrcweir         case TypeClass_DOUBLE:
111*cdf0e10cSrcweir             nControlType = PropertyControlType::NumericField;
112*cdf0e10cSrcweir             break;
113*cdf0e10cSrcweir 
114*cdf0e10cSrcweir         case TypeClass_SEQUENCE:
115*cdf0e10cSrcweir             nControlType = PropertyControlType::StringListField;
116*cdf0e10cSrcweir 			break;
117*cdf0e10cSrcweir 
118*cdf0e10cSrcweir         default:
119*cdf0e10cSrcweir             DBG_ERROR( "PropertyHandlerHelper::describePropertyLine: don't know how to represent this at the UI!" );
120*cdf0e10cSrcweir             // NO break!
121*cdf0e10cSrcweir 
122*cdf0e10cSrcweir         case TypeClass_STRING:
123*cdf0e10cSrcweir             nControlType = PropertyControlType::TextField;
124*cdf0e10cSrcweir             break;
125*cdf0e10cSrcweir         }
126*cdf0e10cSrcweir 
127*cdf0e10cSrcweir         // create a control
128*cdf0e10cSrcweir         _out_rDescriptor.Control = _rxControlFactory->createPropertyControl( nControlType, bReadOnlyControl );
129*cdf0e10cSrcweir     }
130*cdf0e10cSrcweir 
131*cdf0e10cSrcweir 	//--------------------------------------------------------------------
132*cdf0e10cSrcweir     namespace
133*cdf0e10cSrcweir     {
134*cdf0e10cSrcweir         Reference< XPropertyControl > lcl_implCreateListLikeControl(
135*cdf0e10cSrcweir                 const Reference< XPropertyControlFactory >& _rxControlFactory,
136*cdf0e10cSrcweir                 const ::std::vector< ::rtl::OUString >& _rInitialListEntries,
137*cdf0e10cSrcweir                 sal_Bool _bReadOnlyControl,
138*cdf0e10cSrcweir                 sal_Bool _bSorted,
139*cdf0e10cSrcweir                 sal_Bool _bTrueIfListBoxFalseIfComboBox
140*cdf0e10cSrcweir             )
141*cdf0e10cSrcweir         {
142*cdf0e10cSrcweir             Reference< XStringListControl > xListControl(
143*cdf0e10cSrcweir                 _rxControlFactory->createPropertyControl(
144*cdf0e10cSrcweir                     _bTrueIfListBoxFalseIfComboBox ? PropertyControlType::ListBox : PropertyControlType::ComboBox, _bReadOnlyControl
145*cdf0e10cSrcweir                 ),
146*cdf0e10cSrcweir                 UNO_QUERY_THROW
147*cdf0e10cSrcweir             );
148*cdf0e10cSrcweir 
149*cdf0e10cSrcweir             ::std::vector< ::rtl::OUString > aInitialEntries( _rInitialListEntries );
150*cdf0e10cSrcweir             if ( _bSorted )
151*cdf0e10cSrcweir                 ::std::sort( aInitialEntries.begin(), aInitialEntries.end() );
152*cdf0e10cSrcweir 
153*cdf0e10cSrcweir             for (   ::std::vector< ::rtl::OUString >::const_iterator loop = aInitialEntries.begin();
154*cdf0e10cSrcweir                     loop != aInitialEntries.end();
155*cdf0e10cSrcweir                     ++loop
156*cdf0e10cSrcweir                 )
157*cdf0e10cSrcweir                 xListControl->appendListEntry( *loop );
158*cdf0e10cSrcweir             return xListControl.get();
159*cdf0e10cSrcweir         }
160*cdf0e10cSrcweir     }
161*cdf0e10cSrcweir 
162*cdf0e10cSrcweir 	//--------------------------------------------------------------------
163*cdf0e10cSrcweir     Reference< XPropertyControl > PropertyHandlerHelper::createListBoxControl( const Reference< XPropertyControlFactory >& _rxControlFactory,
164*cdf0e10cSrcweir                 const ::std::vector< ::rtl::OUString >& _rInitialListEntries, sal_Bool _bReadOnlyControl, sal_Bool _bSorted )
165*cdf0e10cSrcweir     {
166*cdf0e10cSrcweir         return lcl_implCreateListLikeControl( _rxControlFactory, _rInitialListEntries, _bReadOnlyControl, _bSorted, sal_True );
167*cdf0e10cSrcweir     }
168*cdf0e10cSrcweir 
169*cdf0e10cSrcweir 	//--------------------------------------------------------------------
170*cdf0e10cSrcweir     Reference< XPropertyControl > PropertyHandlerHelper::createComboBoxControl( const Reference< XPropertyControlFactory >& _rxControlFactory,
171*cdf0e10cSrcweir                 const ::std::vector< ::rtl::OUString >& _rInitialListEntries, sal_Bool _bReadOnlyControl, sal_Bool _bSorted )
172*cdf0e10cSrcweir     {
173*cdf0e10cSrcweir         return lcl_implCreateListLikeControl( _rxControlFactory, _rInitialListEntries, _bReadOnlyControl, _bSorted, sal_False );
174*cdf0e10cSrcweir     }
175*cdf0e10cSrcweir 
176*cdf0e10cSrcweir 	//--------------------------------------------------------------------
177*cdf0e10cSrcweir     Reference< XPropertyControl > PropertyHandlerHelper::createNumericControl( const Reference< XPropertyControlFactory >& _rxControlFactory,
178*cdf0e10cSrcweir             sal_Int16 _nDigits, const Optional< double >& _rMinValue, const Optional< double >& _rMaxValue, sal_Bool _bReadOnlyControl )
179*cdf0e10cSrcweir     {
180*cdf0e10cSrcweir         Reference< XNumericControl > xNumericControl(
181*cdf0e10cSrcweir             _rxControlFactory->createPropertyControl( PropertyControlType::NumericField, _bReadOnlyControl ),
182*cdf0e10cSrcweir             UNO_QUERY_THROW
183*cdf0e10cSrcweir         );
184*cdf0e10cSrcweir 
185*cdf0e10cSrcweir         xNumericControl->setDecimalDigits( _nDigits );
186*cdf0e10cSrcweir         xNumericControl->setMinValue( _rMinValue );
187*cdf0e10cSrcweir         xNumericControl->setMaxValue( _rMaxValue );
188*cdf0e10cSrcweir 
189*cdf0e10cSrcweir         return xNumericControl.get();
190*cdf0e10cSrcweir     }
191*cdf0e10cSrcweir 
192*cdf0e10cSrcweir 	//--------------------------------------------------------------------
193*cdf0e10cSrcweir     Any PropertyHandlerHelper::convertToPropertyValue( const Reference< XComponentContext >& _rxContext,const Reference< XTypeConverter >& _rxTypeConverter,
194*cdf0e10cSrcweir         const Property& _rProperty, const Any& _rControlValue )
195*cdf0e10cSrcweir     {
196*cdf0e10cSrcweir         Any aPropertyValue( _rControlValue );
197*cdf0e10cSrcweir         if ( !aPropertyValue.hasValue() )
198*cdf0e10cSrcweir             // NULL is converted to NULL
199*cdf0e10cSrcweir             return aPropertyValue;
200*cdf0e10cSrcweir 
201*cdf0e10cSrcweir         if ( aPropertyValue.getValueType().equals( _rProperty.Type ) )
202*cdf0e10cSrcweir             // nothing to do, type is already as desired
203*cdf0e10cSrcweir             return aPropertyValue;
204*cdf0e10cSrcweir 
205*cdf0e10cSrcweir         if ( _rControlValue.getValueType().getTypeClass() == TypeClass_STRING )
206*cdf0e10cSrcweir         {
207*cdf0e10cSrcweir             ::rtl::OUString sControlValue;
208*cdf0e10cSrcweir             _rControlValue >>= sControlValue;
209*cdf0e10cSrcweir 
210*cdf0e10cSrcweir             Reference< XStringRepresentation > xConversionHelper = StringRepresentation::create( _rxContext,_rxTypeConverter );
211*cdf0e10cSrcweir             aPropertyValue = xConversionHelper->convertToPropertyValue( sControlValue, _rProperty.Type );
212*cdf0e10cSrcweir         }
213*cdf0e10cSrcweir         else
214*cdf0e10cSrcweir         {
215*cdf0e10cSrcweir             try
216*cdf0e10cSrcweir             {
217*cdf0e10cSrcweir                 if ( _rxTypeConverter.is() )
218*cdf0e10cSrcweir                     aPropertyValue = _rxTypeConverter->convertTo( _rControlValue, _rProperty.Type );
219*cdf0e10cSrcweir             }
220*cdf0e10cSrcweir             catch( const Exception& )
221*cdf0e10cSrcweir             {
222*cdf0e10cSrcweir                 OSL_ENSURE( sal_False, "PropertyHandlerHelper::convertToPropertyValue: caught an exception while converting via TypeConverter!" );
223*cdf0e10cSrcweir             }
224*cdf0e10cSrcweir         }
225*cdf0e10cSrcweir 
226*cdf0e10cSrcweir         return aPropertyValue;
227*cdf0e10cSrcweir     }
228*cdf0e10cSrcweir 
229*cdf0e10cSrcweir 	//--------------------------------------------------------------------
230*cdf0e10cSrcweir     Any PropertyHandlerHelper::convertToControlValue( const Reference< XComponentContext >& _rxContext,const Reference< XTypeConverter >& _rxTypeConverter,
231*cdf0e10cSrcweir         const Any& _rPropertyValue, const Type& _rControlValueType )
232*cdf0e10cSrcweir     {
233*cdf0e10cSrcweir         Any aControlValue( _rPropertyValue );
234*cdf0e10cSrcweir         if ( !aControlValue.hasValue() )
235*cdf0e10cSrcweir             // NULL is converted to NULL
236*cdf0e10cSrcweir             return aControlValue;
237*cdf0e10cSrcweir 
238*cdf0e10cSrcweir         if ( _rControlValueType.getTypeClass() == TypeClass_STRING )
239*cdf0e10cSrcweir         {
240*cdf0e10cSrcweir             Reference< XStringRepresentation > xConversionHelper = StringRepresentation::create( _rxContext,_rxTypeConverter );
241*cdf0e10cSrcweir             aControlValue <<= xConversionHelper->convertToControlValue( _rPropertyValue );
242*cdf0e10cSrcweir         }
243*cdf0e10cSrcweir         else
244*cdf0e10cSrcweir         {
245*cdf0e10cSrcweir             try
246*cdf0e10cSrcweir             {
247*cdf0e10cSrcweir                 if ( _rxTypeConverter.is() )
248*cdf0e10cSrcweir                     aControlValue = _rxTypeConverter->convertTo( _rPropertyValue, _rControlValueType );
249*cdf0e10cSrcweir             }
250*cdf0e10cSrcweir             catch( const Exception& )
251*cdf0e10cSrcweir             {
252*cdf0e10cSrcweir                 OSL_ENSURE( sal_False, "PropertyHandlerHelper::convertToControlValue: caught an exception while converting via TypeConverter!" );
253*cdf0e10cSrcweir             }
254*cdf0e10cSrcweir         }
255*cdf0e10cSrcweir 
256*cdf0e10cSrcweir         return aControlValue;
257*cdf0e10cSrcweir     }
258*cdf0e10cSrcweir 
259*cdf0e10cSrcweir 	//--------------------------------------------------------------------
260*cdf0e10cSrcweir     void PropertyHandlerHelper::setContextDocumentModified( const ComponentContext& _rContext )
261*cdf0e10cSrcweir     {
262*cdf0e10cSrcweir         try
263*cdf0e10cSrcweir         {
264*cdf0e10cSrcweir             Reference< XModifiable > xDocumentModifiable( _rContext.getContextValueByAsciiName( "ContextDocument" ), UNO_QUERY_THROW );
265*cdf0e10cSrcweir 			xDocumentModifiable->setModified( sal_True );
266*cdf0e10cSrcweir         }
267*cdf0e10cSrcweir         catch( const Exception& )
268*cdf0e10cSrcweir         {
269*cdf0e10cSrcweir             DBG_UNHANDLED_EXCEPTION();
270*cdf0e10cSrcweir         }
271*cdf0e10cSrcweir     }
272*cdf0e10cSrcweir 
273*cdf0e10cSrcweir 	//--------------------------------------------------------------------
274*cdf0e10cSrcweir     Window* PropertyHandlerHelper::getDialogParentWindow( const ComponentContext& _rContext )
275*cdf0e10cSrcweir     {
276*cdf0e10cSrcweir         Window* pInspectorWindow = NULL;
277*cdf0e10cSrcweir         try
278*cdf0e10cSrcweir         {
279*cdf0e10cSrcweir             Reference< XWindow > xInspectorWindow( _rContext.getContextValueByAsciiName( "DialogParentWindow" ), UNO_QUERY_THROW );
280*cdf0e10cSrcweir             pInspectorWindow = VCLUnoHelper::GetWindow( xInspectorWindow );
281*cdf0e10cSrcweir         }
282*cdf0e10cSrcweir         catch( const Exception& )
283*cdf0e10cSrcweir         {
284*cdf0e10cSrcweir             DBG_UNHANDLED_EXCEPTION();
285*cdf0e10cSrcweir         }
286*cdf0e10cSrcweir         return pInspectorWindow;
287*cdf0e10cSrcweir     }
288*cdf0e10cSrcweir 
289*cdf0e10cSrcweir //........................................................................
290*cdf0e10cSrcweir } // namespace pcr
291*cdf0e10cSrcweir //........................................................................
292