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_rptui.hxx"
24 #include "DataProviderHandler.hxx"
25 #include <com/sun/star/lang/XInitialization.hpp>
26 #include <comphelper/namedvaluecollection.hxx>
27 #include <comphelper/sequence.hxx>
28 #include <comphelper/property.hxx>
29 #include <comphelper/types.hxx>
30 #include "uistrings.hrc"
31 #include <toolkit/helper/vclunohelper.hxx>
32 #include <unotools/syslocale.hxx>
33 #include <com/sun/star/inspection/PropertyControlType.hpp>
34 #include <com/sun/star/inspection/PropertyLineElement.hpp>
35 #include <com/sun/star/chart/ChartDataRowSource.hpp>
36 #include <com/sun/star/chart2/XDiagram.hpp>
37 #include <com/sun/star/chart2/XCoordinateSystemContainer.hpp>
38 #include <com/sun/star/chart2/XChartTypeContainer.hpp>
39 #include <com/sun/star/chart2/XChartType.hpp>
40 #include <com/sun/star/chart2/XFormattedString.hpp>
41 #include <com/sun/star/chart2/XTitled.hpp>
42 #include <com/sun/star/chart2/XTitle.hpp>
43 #include <com/sun/star/chart2/data/XDataReceiver.hpp>
44 #include <com/sun/star/ui/dialogs/XExecutableDialog.hpp>
45 #include <com/sun/star/report/XReportDefinition.hpp>
46 #include <com/sun/star/report/XSection.hpp>
47 #include <com/sun/star/inspection/XNumericControl.hpp>
48 #include <com/sun/star/container/XNameContainer.hpp>
49 #include <com/sun/star/util/MeasureUnit.hpp>
50 #include <tools/fldunit.hxx>
51 #include "metadata.hxx"
52 #include <vcl/svapp.hxx>
53 #include <vos/mutex.hxx>
54 #include "helpids.hrc"
55 #include "uistrings.hrc"
56 #include "RptResId.hrc"
57 #include "PropertyForward.hxx"
58 //........................................................................
59 namespace rptui
60 {
61 //........................................................................
62 using namespace ::com::sun::star;
63 
DataProviderHandler(uno::Reference<uno::XComponentContext> const & context)64 DataProviderHandler::DataProviderHandler(uno::Reference< uno::XComponentContext > const & context)
65     :DataProviderHandler_Base(m_aMutex)
66     ,m_xContext(context)
67     ,m_pInfoService( new OPropertyInfoService() )
68 {
69     try
70     {
71         m_xFormComponentHandler.set(m_xContext->getServiceManager()->createInstanceWithContext(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.form.inspection.FormComponentPropertyHandler")),m_xContext),uno::UNO_QUERY_THROW);
72         m_xTypeConverter.set(m_xContext->getServiceManager()->createInstanceWithContext( ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.script.Converter" )),m_xContext),uno::UNO_QUERY_THROW);
73 
74     }catch(uno::Exception)
75     {
76     }
77 }
78 
79 //------------------------------------------------------------------------
getImplementationName()80 ::rtl::OUString SAL_CALL DataProviderHandler::getImplementationName(  ) throw(uno::RuntimeException)
81 {
82 	return getImplementationName_Static();
83 }
84 
85 //------------------------------------------------------------------------
supportsService(const::rtl::OUString & ServiceName)86 sal_Bool SAL_CALL DataProviderHandler::supportsService( const ::rtl::OUString& ServiceName ) throw(uno::RuntimeException)
87 {
88 	return ::comphelper::existsValue(ServiceName,getSupportedServiceNames_static());
89 }
90 
91 //------------------------------------------------------------------------
getSupportedServiceNames()92 uno::Sequence< ::rtl::OUString > SAL_CALL DataProviderHandler::getSupportedServiceNames(  ) throw(uno::RuntimeException)
93 {
94 	return getSupportedServiceNames_static();
95 }
96 
97 //------------------------------------------------------------------------
getImplementationName_Static()98 ::rtl::OUString DataProviderHandler::getImplementationName_Static(  ) throw(uno::RuntimeException)
99 {
100     return ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.comp.report.DataProviderHandler"));
101 }
102 
103 //------------------------------------------------------------------------
getSupportedServiceNames_static()104 uno::Sequence< ::rtl::OUString > DataProviderHandler::getSupportedServiceNames_static(  ) throw(uno::RuntimeException)
105 {
106 	uno::Sequence< ::rtl::OUString > aSupported(1);
107     aSupported[0] = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.report.inspection.DataProviderHandler"));
108 	return aSupported;
109 }
110 
111 //------------------------------------------------------------------------
create(const uno::Reference<uno::XComponentContext> & _rxContext)112 uno::Reference< uno::XInterface > SAL_CALL DataProviderHandler::create( const uno::Reference< uno::XComponentContext >& _rxContext )
113 {
114 	return *(new DataProviderHandler( _rxContext ));
115 }
116 // overload WeakComponentImplHelperBase::disposing()
117 // This function is called upon disposing the component,
118 // if your component needs special work when it becomes
119 // disposed, do it here.
disposing()120 void SAL_CALL DataProviderHandler::disposing()
121 {
122     ::comphelper::disposeComponent(m_xFormComponentHandler);
123     ::comphelper::disposeComponent( m_xMasterDetails );
124     ::comphelper::disposeComponent(m_xTypeConverter);
125 }
addEventListener(const uno::Reference<lang::XEventListener> & xListener)126 void SAL_CALL DataProviderHandler::addEventListener(const uno::Reference< lang::XEventListener > & xListener) throw (uno::RuntimeException)
127 {
128     m_xFormComponentHandler->addEventListener(xListener);
129 }
130 
removeEventListener(const uno::Reference<lang::XEventListener> & aListener)131 void SAL_CALL DataProviderHandler::removeEventListener(const uno::Reference< lang::XEventListener > & aListener) throw (uno::RuntimeException)
132 {
133     m_xFormComponentHandler->removeEventListener(aListener);
134 }
135 
136 // inspection::XPropertyHandler:
137 
138 /********************************************************************************/
inspect(const uno::Reference<uno::XInterface> & Component)139 void SAL_CALL DataProviderHandler::inspect(const uno::Reference< uno::XInterface > & Component) throw (uno::RuntimeException, lang::NullPointerException)
140 {
141     try
142     {
143         uno::Reference< container::XNameContainer > xNameCont(Component,uno::UNO_QUERY);
144         const ::rtl::OUString sFormComponent(RTL_CONSTASCII_USTRINGPARAM("FormComponent"));
145         if ( xNameCont->hasByName(sFormComponent) )
146         {
147             uno::Reference<beans::XPropertySet> xProp(xNameCont->getByName(sFormComponent),uno::UNO_QUERY);
148             const ::rtl::OUString sModel(RTL_CONSTASCII_USTRINGPARAM("Model"));
149             if ( xProp.is() && xProp->getPropertySetInfo()->hasPropertyByName(sModel) )
150             {
151                 m_xChartModel.set(xProp->getPropertyValue(sModel),uno::UNO_QUERY);
152                 if ( m_xChartModel.is() )
153                     m_xFormComponent = m_xChartModel->getDataProvider();
154             }
155         }
156         m_xDataProvider.set(m_xFormComponent,uno::UNO_QUERY);
157         m_xReportComponent.set( xNameCont->getByName( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ReportComponent" ) ) ), uno::UNO_QUERY );
158         if ( m_xDataProvider.is() )
159         {
160             ::boost::shared_ptr<AnyConverter> aNoConverter(new AnyConverter());
161             TPropertyNamePair aPropertyMediation;
162             aPropertyMediation.insert( TPropertyNamePair::value_type( PROPERTY_MASTERFIELDS, TPropertyConverter(PROPERTY_MASTERFIELDS,aNoConverter) ) );
163             aPropertyMediation.insert( TPropertyNamePair::value_type( PROPERTY_DETAILFIELDS, TPropertyConverter(PROPERTY_DETAILFIELDS,aNoConverter) ) );
164 
165             m_xMasterDetails = new OPropertyMediator( m_xDataProvider.get(), m_xReportComponent.get(), aPropertyMediation,sal_True );
166         }
167 
168         //const ::rtl::OUString sRowSet(RTL_CONSTASCII_USTRINGPARAM("RowSet"));
169         //if ( xNameCont->hasByName(sRowSet) )
170         //{
171         //    uno::Reference<beans::XPropertySet> xProp(m_xFormComponentHandler,uno::UNO_QUERY);
172         //    xProp->setPropertyValue(sRowSet,xNameCont->getByName(sRowSet));
173         //}
174     }
175     catch(uno::Exception)
176     {
177         throw lang::NullPointerException();
178     }
179     if ( m_xFormComponent.is() )
180     {
181         m_xFormComponentHandler->inspect(m_xFormComponent);
182     }
183 }
184 
getPropertyValue(const::rtl::OUString & PropertyName)185 uno::Any SAL_CALL DataProviderHandler::getPropertyValue(const ::rtl::OUString & PropertyName) throw (uno::RuntimeException, beans::UnknownPropertyException)
186 {
187     ::osl::MutexGuard aGuard( m_aMutex );
188     uno::Any aPropertyValue;
189     const sal_Int32 nId = m_pInfoService->getPropertyId(PropertyName);
190     switch(nId)
191     {
192         case PROPERTY_ID_CHARTTYPE:
193             // TODO: We need a possibility to get the UI of the selected chart type
194             //if( m_xChartModel.is() )
195             //{
196             //    uno::Reference< chart2::XDiagram > xDiagram( m_xChartModel->getFirstDiagram() );
197             //    if( xDiagram.is() )
198             //    {
199             //        ::rtl::OUString sChartTypes;
200             //        uno::Reference< chart2::XCoordinateSystemContainer > xCooSysCnt( xDiagram, uno::UNO_QUERY_THROW );
201             //        const uno::Sequence< uno::Reference< chart2::XCoordinateSystem > > aCooSysSeq( xCooSysCnt->getCoordinateSystems());
202             //        const uno::Reference< chart2::XCoordinateSystem >* pIter = aCooSysSeq.getConstArray();
203             //        const uno::Reference< chart2::XCoordinateSystem >* pEnd	  = pIter + aCooSysSeq.getLength();
204             //        for(;pIter != pEnd;++pIter)
205             //        {
206             //            const uno::Reference< chart2::XChartTypeContainer > xCTCnt( *pIter, uno::UNO_QUERY_THROW );
207             //            const uno::Sequence< uno::Reference< chart2::XChartType > > aCTSeq( xCTCnt->getChartTypes());
208             //            const uno::Reference< chart2::XChartType >* pChartTypeIter = aCTSeq.getConstArray();
209             //            const uno::Reference< chart2::XChartType >* pChartTypeEnd  = pChartTypeIter + aCTSeq.getLength();
210             //            for(;pChartTypeIter != pChartTypeEnd;++pChartTypeIter)
211             //            {
212             //                sChartTypes += (*pChartTypeIter)->getChartType();
213             //                sChartTypes += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(";"));
214             //            }
215             //        }
216             //        aPropertyValue;// <<= sChartTypes;
217             //    }
218             //}
219             break;
220         case PROPERTY_ID_PREVIEW_COUNT:
221             aPropertyValue <<= m_xDataProvider->getRowLimit();
222             break;
223         default:
224             aPropertyValue = m_xFormComponentHandler->getPropertyValue( PropertyName );
225             break;
226     }
227     return aPropertyValue;
228 }
229 
setPropertyValue(const::rtl::OUString & PropertyName,const uno::Any & Value)230 void SAL_CALL DataProviderHandler::setPropertyValue(const ::rtl::OUString & PropertyName, const uno::Any & Value) throw (uno::RuntimeException, beans::UnknownPropertyException)
231 {
232     ::osl::MutexGuard aGuard( m_aMutex );
233     uno::Any aPropertyValue;
234     const sal_Int32 nId = m_pInfoService->getPropertyId(PropertyName);
235     switch(nId)
236     {
237         case PROPERTY_ID_CHARTTYPE:
238             break;
239         case PROPERTY_ID_PREVIEW_COUNT:
240             m_xDataProvider->setPropertyValue(PropertyName,Value);
241             break;
242         default:
243             m_xFormComponentHandler->setPropertyValue(PropertyName, Value);
244             break;
245     }
246 }
247 // -----------------------------------------------------------------------------
impl_updateChartTitle_throw(const uno::Any & _aValue)248 void DataProviderHandler::impl_updateChartTitle_throw(const uno::Any& _aValue)
249 {
250     uno::Reference<chart2::XTitled> xTitled(m_xChartModel,uno::UNO_QUERY);
251     if ( xTitled.is() )
252     {
253         uno::Reference<chart2::XTitle> xTitle = xTitled->getTitleObject();
254         if ( !xTitle.is() )
255         {
256             xTitle.set(m_xContext->getServiceManager()->createInstanceWithContext(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.chart2.Title")),m_xContext),uno::UNO_QUERY);
257             xTitled->setTitleObject(xTitle);
258         }
259         if ( xTitle.is() )
260         {
261             uno::Reference< chart2::XFormattedString> xFormatted(m_xContext->getServiceManager()->createInstanceWithContext(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.chart2.FormattedString")),m_xContext),uno::UNO_QUERY);
262             ::rtl::OUString sStr;
263             _aValue>>= sStr;
264             xFormatted->setString(sStr);
265             uno::Sequence< uno::Reference< chart2::XFormattedString> > aArgs(1);
266             aArgs[0] = xFormatted;
267             xTitle->setText(aArgs);
268         }
269     } // if ( xTitled.is() )
270 }
271 
getPropertyState(const::rtl::OUString & PropertyName)272 beans::PropertyState SAL_CALL DataProviderHandler::getPropertyState(const ::rtl::OUString & PropertyName) throw (uno::RuntimeException, beans::UnknownPropertyException)
273 {
274     return m_xFormComponentHandler->getPropertyState(PropertyName);
275 }
276 
describePropertyLine(const::rtl::OUString & PropertyName,const uno::Reference<inspection::XPropertyControlFactory> & _xControlFactory)277 inspection::LineDescriptor SAL_CALL DataProviderHandler::describePropertyLine(const ::rtl::OUString & PropertyName,  const uno::Reference< inspection::XPropertyControlFactory > & _xControlFactory) throw (beans::UnknownPropertyException, lang::NullPointerException,uno::RuntimeException)
278 {
279     inspection::LineDescriptor aOut;
280     const sal_Int32 nId = m_pInfoService->getPropertyId(PropertyName);
281     switch(nId)
282     {
283         case PROPERTY_ID_CHARTTYPE:
284             aOut.PrimaryButtonId = rtl::OUString::createFromAscii(UID_RPT_PROP_CHARTTYPE_DLG);
285             aOut.Control = _xControlFactory->createPropertyControl(inspection::PropertyControlType::TextField , sal_True);
286             aOut.HasPrimaryButton = sal_True;
287             break;
288         case PROPERTY_ID_PREVIEW_COUNT:
289             aOut.Control = _xControlFactory->createPropertyControl(inspection::PropertyControlType::NumericField , sal_False);
290             break;
291         case PROPERTY_ID_MASTERFIELDS:
292         case PROPERTY_ID_DETAILFIELDS:
293             aOut.Control = _xControlFactory->createPropertyControl(inspection::PropertyControlType::StringListField , sal_False);
294             aOut.PrimaryButtonId = rtl::OUString::createFromAscii(UID_RPT_PROP_DLG_LINKFIELDS);
295             aOut.HasPrimaryButton = sal_True;
296             break;
297         default:
298             aOut = m_xFormComponentHandler->describePropertyLine(PropertyName, _xControlFactory);
299     }
300     if ( nId != -1 )
301     {
302         aOut.Category = ((m_pInfoService->getPropertyUIFlags(nId ) & PROP_FLAG_DATA_PROPERTY) != 0) ?
303                                     ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Data"))
304                                                         :
305                                     ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("General"));
306         aOut.HelpURL = HelpIdUrl::getHelpURL( m_pInfoService->getPropertyHelpId( nId ) );
307         aOut.DisplayName = m_pInfoService->getPropertyTranslation(nId);
308     }
309     return aOut;
310 }
311 
convertToPropertyValue(const::rtl::OUString & _rPropertyValue,const uno::Any & _rControlValue)312 uno::Any SAL_CALL DataProviderHandler::convertToPropertyValue(const ::rtl::OUString & _rPropertyValue, const uno::Any & _rControlValue) throw (uno::RuntimeException, beans::UnknownPropertyException)
313 {
314     ::osl::MutexGuard aGuard( m_aMutex );
315     uno::Any aPropertyValue( _rControlValue );
316     const sal_Int32 nId = m_pInfoService->getPropertyId(_rPropertyValue);
317     switch(nId)
318     {
319         case PROPERTY_ID_CHARTTYPE:
320             break;
321         case PROPERTY_ID_PREVIEW_COUNT:
322             try
323             {
324                 aPropertyValue = m_xTypeConverter->convertTo( _rControlValue, ::getCppuType((const sal_Int32*)0));
325             }
326             catch( const uno::Exception& )
327             {
328                 OSL_ENSURE( sal_False, "DataProviderHandler::convertToPropertyValue: caught an exception while converting via TypeConverter!" );
329             }
330             break;
331         case PROPERTY_ID_MASTERFIELDS:
332         case PROPERTY_ID_DETAILFIELDS:
333             break;
334         default:
335             aPropertyValue = m_xFormComponentHandler->convertToPropertyValue(_rPropertyValue, _rControlValue);
336     }
337     return aPropertyValue;
338 }
339 
convertToControlValue(const::rtl::OUString & _rPropertyName,const uno::Any & _rPropertyValue,const uno::Type & ControlValueType)340 uno::Any SAL_CALL DataProviderHandler::convertToControlValue(const ::rtl::OUString & _rPropertyName, const uno::Any & _rPropertyValue, const uno::Type & ControlValueType) throw (uno::RuntimeException, beans::UnknownPropertyException)
341 {
342     uno::Any aControlValue( _rPropertyValue );
343     if ( !aControlValue.hasValue() )
344         // NULL is converted to NULL
345         return aControlValue;
346 
347     ::osl::MutexGuard aGuard( m_aMutex );
348     const sal_Int32 nId = m_pInfoService->getPropertyId(_rPropertyName);
349     switch(nId)
350     {
351         case PROPERTY_ID_CHARTTYPE:
352             break;
353         case PROPERTY_ID_MASTERFIELDS:
354         case PROPERTY_ID_DETAILFIELDS:
355         case PROPERTY_ID_PREVIEW_COUNT:
356             try
357             {
358                 aControlValue = m_xTypeConverter->convertTo( _rPropertyValue, ControlValueType);
359             }
360             catch( const uno::Exception& )
361             {
362                 OSL_ENSURE( sal_False, "GeometryHandler::convertToPropertyValue: caught an exception while converting via TypeConverter!" );
363             }
364             break;
365         default:
366             aControlValue = m_xFormComponentHandler->convertToControlValue(_rPropertyName, _rPropertyValue, ControlValueType);
367     }
368     return aControlValue;
369 }
370 
addPropertyChangeListener(const uno::Reference<beans::XPropertyChangeListener> & Listener)371 void SAL_CALL DataProviderHandler::addPropertyChangeListener(const uno::Reference< beans::XPropertyChangeListener > & Listener) throw (uno::RuntimeException, lang::NullPointerException)
372 {
373     m_xFormComponentHandler->addPropertyChangeListener(Listener);
374 }
375 
removePropertyChangeListener(const uno::Reference<beans::XPropertyChangeListener> & _rxListener)376 void SAL_CALL DataProviderHandler::removePropertyChangeListener(const uno::Reference< beans::XPropertyChangeListener > & _rxListener) throw (uno::RuntimeException)
377 {
378     m_xFormComponentHandler->removePropertyChangeListener(_rxListener);
379 }
380 
getSupportedProperties()381 uno::Sequence< beans::Property > SAL_CALL DataProviderHandler::getSupportedProperties() throw (uno::RuntimeException)
382 {
383     ::std::vector< beans::Property > aNewProps;
384     if( m_xChartModel.is() )
385     {
386         m_pInfoService->getExcludeProperties( aNewProps, m_xFormComponentHandler );
387         beans::Property aValue;
388         static const ::rtl::OUString s_pProperties[] =
389         {
390              PROPERTY_CHARTTYPE
391             ,PROPERTY_MASTERFIELDS
392             ,PROPERTY_DETAILFIELDS
393             ,PROPERTY_PREVIEW_COUNT
394             //,PROPERTY_TITLE
395         };
396 
397         for (size_t nPos = 0; nPos < sizeof(s_pProperties)/sizeof(s_pProperties[0]) ;++nPos )
398         {
399             aValue.Name = s_pProperties[nPos];
400             aNewProps.push_back(aValue);
401         }
402     }
403     return aNewProps.empty() ? uno::Sequence< beans::Property > () : uno::Sequence< beans::Property > (&(*aNewProps.begin()),aNewProps.size());
404 }
405 
getSupersededProperties()406 uno::Sequence< ::rtl::OUString > SAL_CALL DataProviderHandler::getSupersededProperties() throw (uno::RuntimeException)
407 {
408     uno::Sequence< ::rtl::OUString > aRet(1);
409     aRet[0] = PROPERTY_TITLE; // have a look at OPropertyInfoService::getExcludeProperties
410     return aRet;
411 }
412 
getActuatingProperties()413 uno::Sequence< ::rtl::OUString > SAL_CALL DataProviderHandler::getActuatingProperties() throw (uno::RuntimeException)
414 {
415     ::osl::MutexGuard aGuard( m_aMutex );
416 
417     uno::Sequence< ::rtl::OUString > aSeq(1);
418     aSeq[0] = PROPERTY_TITLE;
419     return ::comphelper::concatSequences(m_xFormComponentHandler->getActuatingProperties(),aSeq);
420 }
421 
isComposable(const::rtl::OUString & _rPropertyName)422 ::sal_Bool SAL_CALL DataProviderHandler::isComposable( const ::rtl::OUString& _rPropertyName ) throw (uno::RuntimeException, beans::UnknownPropertyException)
423 {
424     return m_pInfoService->isComposable( _rPropertyName, m_xFormComponentHandler );
425 }
426 
onInteractivePropertySelection(const::rtl::OUString & PropertyName,::sal_Bool Primary,uno::Any & out_Data,const uno::Reference<inspection::XObjectInspectorUI> & _rxInspectorUI)427 inspection::InteractiveSelectionResult SAL_CALL DataProviderHandler::onInteractivePropertySelection(const ::rtl::OUString & PropertyName, ::sal_Bool Primary, uno::Any & out_Data, const uno::Reference< inspection::XObjectInspectorUI > & _rxInspectorUI) throw (uno::RuntimeException, beans::UnknownPropertyException, lang::NullPointerException)
428 {
429     if ( !_rxInspectorUI.is() )
430         throw lang::NullPointerException();
431 
432     inspection::InteractiveSelectionResult eResult = inspection::InteractiveSelectionResult_Cancelled;
433     ::osl::ClearableMutexGuard aGuard( m_aMutex );
434 
435     const sal_Int32 nId = m_pInfoService->getPropertyId(PropertyName);
436     switch(nId)
437     {
438         case PROPERTY_ID_CHARTTYPE:
439             if ( impl_dialogChartType_nothrow(aGuard) )
440                 eResult = inspection::InteractiveSelectionResult_ObtainedValue;
441             break;
442         case PROPERTY_ID_MASTERFIELDS:
443         case PROPERTY_ID_DETAILFIELDS:
444             if ( impl_dialogLinkedFields_nothrow( aGuard ) )
445                 eResult = inspection::InteractiveSelectionResult_Success;
446             break;
447         default:
448             eResult = m_xFormComponentHandler->onInteractivePropertySelection(PropertyName, Primary, out_Data, _rxInspectorUI);
449     }
450 
451     return eResult;
452 }
453 
actuatingPropertyChanged(const::rtl::OUString & ActuatingPropertyName,const uno::Any & NewValue,const uno::Any & OldValue,const uno::Reference<inspection::XObjectInspectorUI> & InspectorUI,::sal_Bool FirstTimeInit)454 void SAL_CALL DataProviderHandler::actuatingPropertyChanged(const ::rtl::OUString & ActuatingPropertyName, const uno::Any & NewValue, const uno::Any & OldValue, const uno::Reference< inspection::XObjectInspectorUI > & InspectorUI, ::sal_Bool FirstTimeInit) throw (uno::RuntimeException, lang::NullPointerException)
455 {
456     ::osl::ClearableMutexGuard aGuard( m_aMutex );
457 
458     if ( ActuatingPropertyName == PROPERTY_COMMAND )
459     {
460         if ( NewValue != OldValue )
461         {
462             uno::Reference< report::XReportDefinition> xReport = m_xReportComponent->getSection()->getReportDefinition();
463             bool bDoEnableMasterDetailFields = xReport.is() && xReport->getCommand().getLength() && m_xDataProvider->getCommand().getLength();
464             InspectorUI->enablePropertyUIElements( PROPERTY_DETAILFIELDS, inspection::PropertyLineElement::PrimaryButton, bDoEnableMasterDetailFields );
465             InspectorUI->enablePropertyUIElements( PROPERTY_MASTERFIELDS, inspection::PropertyLineElement::PrimaryButton, bDoEnableMasterDetailFields );
466 
467             sal_Bool bModified = xReport->isModified();
468             // this fills the chart again
469             ::comphelper::NamedValueCollection aArgs;
470             aArgs.put( "CellRangeRepresentation", uno::makeAny( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "all" ) ) ) );
471             aArgs.put( "HasCategories", uno::makeAny( sal_True ) );
472             aArgs.put( "FirstCellAsLabel", uno::makeAny( sal_True ) );
473             aArgs.put( "DataRowSource", uno::makeAny( chart::ChartDataRowSource_COLUMNS ) );
474             uno::Reference< chart2::data::XDataReceiver > xReceiver(m_xChartModel,uno::UNO_QUERY_THROW);
475             xReceiver->setArguments( aArgs.getPropertyValues() );
476             if ( !bModified )
477                 xReport->setModified(sal_False);
478         } // if ( NewValue != OldValue )
479         m_xFormComponentHandler->actuatingPropertyChanged(ActuatingPropertyName, NewValue, OldValue, InspectorUI, FirstTimeInit);
480     } // if ( ActuatingPropertyName == PROPERTY_COMMAND )
481     else if ( ActuatingPropertyName == PROPERTY_TITLE )
482     {
483         if ( NewValue != OldValue )
484             impl_updateChartTitle_throw(NewValue);
485     }
486     else
487     {
488         const sal_Int32 nId = m_pInfoService->getPropertyId(ActuatingPropertyName);
489         switch(nId)
490         {
491 
492             case PROPERTY_ID_MASTERFIELDS:
493                 break;
494             case PROPERTY_ID_DETAILFIELDS:
495                 break;
496             default:
497                 m_xFormComponentHandler->actuatingPropertyChanged(ActuatingPropertyName, NewValue, OldValue, InspectorUI, FirstTimeInit);
498         }
499     }
500 }
501 
suspend(::sal_Bool Suspend)502 ::sal_Bool SAL_CALL DataProviderHandler::suspend(::sal_Bool Suspend) throw (uno::RuntimeException)
503 {
504     return m_xFormComponentHandler->suspend(Suspend);
505 }
impl_dialogLinkedFields_nothrow(::osl::ClearableMutexGuard & _rClearBeforeDialog) const506 bool DataProviderHandler::impl_dialogLinkedFields_nothrow( ::osl::ClearableMutexGuard& _rClearBeforeDialog ) const
507 {
508     uno::Sequence<uno::Any> aSeq(6);
509     beans::PropertyValue aParam;
510     aParam.Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ParentWindow"));
511     aParam.Value <<= m_xContext->getValueByName( ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DialogParentWindow")));
512     aSeq[0] <<= aParam;
513     aParam.Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Detail"));
514     aParam.Value <<= m_xDataProvider;
515     aSeq[1] <<= aParam;
516     aParam.Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Master"));
517     aParam.Value <<= m_xReportComponent->getSection()->getReportDefinition();
518     aSeq[2] <<= aParam;
519 
520     aParam.Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Explanation"));
521     aParam.Value <<= ::rtl::OUString(String(ModuleRes(RID_STR_EXPLANATION)));
522     aSeq[3] <<= aParam;
523     aParam.Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DetailLabel"));
524     aParam.Value <<= ::rtl::OUString(String(ModuleRes(RID_STR_DETAILLABEL)));
525     aSeq[4] <<= aParam;
526     aParam.Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("MasterLabel"));
527     aParam.Value <<= ::rtl::OUString(String(ModuleRes(RID_STR_MASTERLABEL)));
528     aSeq[5] <<= aParam;
529 
530     uno::Reference< ui::dialogs::XExecutableDialog > xDialog(
531         m_xContext->getServiceManager()->createInstanceWithArgumentsAndContext(
532         ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("org.openoffice.comp.form.ui.MasterDetailLinkDialog")),aSeq
533             , m_xContext), uno::UNO_QUERY);
534 
535     _rClearBeforeDialog.clear();
536     return ( xDialog->execute() != 0 );
537 }
538 // -----------------------------------------------------------------------------
impl_dialogChartType_nothrow(::osl::ClearableMutexGuard & _rClearBeforeDialog) const539 bool DataProviderHandler::impl_dialogChartType_nothrow( ::osl::ClearableMutexGuard& _rClearBeforeDialog ) const
540 {
541     uno::Sequence<uno::Any> aSeq(2);
542     beans::PropertyValue aParam;
543     aParam.Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ParentWindow"));
544     aParam.Value <<= m_xContext->getValueByName( ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DialogParentWindow")));
545     aSeq[0] <<= aParam;
546     aParam.Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ChartModel"));
547     aParam.Value <<= m_xChartModel;
548     aSeq[1] <<= aParam;
549 
550     uno::Reference< ui::dialogs::XExecutableDialog > xDialog(
551         m_xContext->getServiceManager()->createInstanceWithArgumentsAndContext(
552         ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.comp.chart2.ChartTypeDialog")),aSeq
553             , m_xContext), uno::UNO_QUERY);
554 
555     _rClearBeforeDialog.clear();
556     return ( xDialog->execute() != 0 );
557 }
558 //........................................................................
559 } // namespace rptui
560 //........................................................................
561 
562