1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3  * This file is part of the LibreOffice project.
4  *
5  * This Source Code Form is subject to the terms of the Mozilla Public
6  * License, v. 2.0. If a copy of the MPL was not distributed with this
7  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8  *
9  * This file incorporates work covered by the following license notice:
10  *
11  *   Licensed to the Apache Software Foundation (ASF) under one or more
12  *   contributor license agreements. See the NOTICE file distributed
13  *   with this work for additional information regarding copyright
14  *   ownership. The ASF licenses this file to you under the Apache
15  *   License, Version 2.0 (the "License"); you may not use this file
16  *   except in compliance with the License. You may obtain a copy of
17  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
18  */
19 
20 #include "tp_ChartType.hxx"
21 #include <ChartResourceGroups.hxx>
22 #include <strings.hrc>
23 #include <ResId.hxx>
24 #include <ChartModelHelper.hxx>
25 #include <DiagramHelper.hxx>
26 #include <res_BarGeometry.hxx>
27 #include <unonames.hxx>
28 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
29 #include <com/sun/star/chart2/XChartDocument.hpp>
30 
31 #include <svtools/valueset.hxx>
32 
33 #include <vcl/weld.hxx>
34 #include <tools/diagnose_ex.h>
35 #include <sal/log.hxx>
36 
37 namespace chart
38 {
39 using namespace ::com::sun::star;
40 using namespace ::com::sun::star::chart2;
41 
ChartTypeTabPage(weld::Container * pPage,weld::DialogController * pController,const uno::Reference<XChartDocument> & xChartModel,bool bShowDescription)42 ChartTypeTabPage::ChartTypeTabPage(weld::Container* pPage, weld::DialogController* pController, const uno::Reference< XChartDocument >& xChartModel,
43                                    bool bShowDescription)
44     : OWizardPage(pPage, pController, "modules/schart/ui/tp_ChartType.ui", "tp_ChartType")
45     , m_pDim3DLookResourceGroup( new Dim3DLookResourceGroup(m_xBuilder.get()) )
46     , m_pStackingResourceGroup( new StackingResourceGroup(m_xBuilder.get()) )
47     , m_pSplineResourceGroup( new SplineResourceGroup(m_xBuilder.get(), pController->getDialog()) )
48     , m_pGeometryResourceGroup( new GeometryResourceGroup(m_xBuilder.get()) )
49     , m_pSortByXValuesResourceGroup( new SortByXValuesResourceGroup(m_xBuilder.get()) )
50     , m_xChartModel( xChartModel )
51     , m_aChartTypeDialogControllerList(0)
52     , m_pCurrentMainType(nullptr)
53     , m_nChangingCalls(0)
54     , m_aTimerTriggeredControllerLock( m_xChartModel )
55     , m_xFT_ChooseType(m_xBuilder->weld_label("FT_CAPTION_FOR_WIZARD"))
56     , m_xMainTypeList(m_xBuilder->weld_tree_view("charttype"))
57     , m_xSubTypeList(new SvtValueSet(m_xBuilder->weld_scrolled_window("subtypewin")))
58     , m_xSubTypeListWin(new weld::CustomWeld(*m_xBuilder, "subtype", *m_xSubTypeList))
59 {
60     Size aSize(m_xSubTypeList->GetDrawingArea()->get_ref_device().LogicToPixel(Size(150, 50), MapMode(MapUnit::MapAppFont)));
61     m_xSubTypeListWin->set_size_request(aSize.Width(), aSize.Height());
62 
63     if (bShowDescription)
64     {
65         m_xFT_ChooseType->show();
66     }
67     else
68     {
69         m_xFT_ChooseType->hide();
70     }
71 
72     SetPageTitle(SchResId(STR_PAGE_CHARTTYPE));
73 
74     m_xMainTypeList->connect_changed(LINK(this, ChartTypeTabPage, SelectMainTypeHdl));
75     m_xSubTypeList->SetSelectHdl( LINK( this, ChartTypeTabPage, SelectSubTypeHdl ) );
76 
77     m_xSubTypeList->SetStyle(m_xSubTypeList->GetStyle() |
78         WB_ITEMBORDER | WB_DOUBLEBORDER | WB_NAMEFIELD | WB_FLATVALUESET | WB_3DLOOK );
79     m_xSubTypeList->SetColCount(4);
80     m_xSubTypeList->SetLineCount(1);
81 
82     bool bEnableComplexChartTypes = true;
83     uno::Reference< beans::XPropertySet > xProps( m_xChartModel, uno::UNO_QUERY );
84     if ( xProps.is() )
85     {
86         try
87         {
88             xProps->getPropertyValue("EnableComplexChartTypes") >>= bEnableComplexChartTypes;
89         }
90         catch( const uno::Exception& )
91         {
92             TOOLS_WARN_EXCEPTION("chart2", "" );
93         }
94     }
95 
96     m_aChartTypeDialogControllerList.push_back(std::make_unique<ColumnChartDialogController>());
97     m_aChartTypeDialogControllerList.push_back(std::make_unique<BarChartDialogController>());
98     m_aChartTypeDialogControllerList.push_back(std::make_unique<PieChartDialogController>());
99     m_aChartTypeDialogControllerList.push_back(std::make_unique<AreaChartDialogController>());
100     m_aChartTypeDialogControllerList.push_back(std::make_unique<LineChartDialogController>());
101     if (bEnableComplexChartTypes)
102     {
103         m_aChartTypeDialogControllerList.push_back(std::make_unique<XYChartDialogController>());
104         m_aChartTypeDialogControllerList.push_back(
105             std::make_unique<BubbleChartDialogController>());
106     }
107     m_aChartTypeDialogControllerList.push_back(std::make_unique<NetChartDialogController>());
108     if (bEnableComplexChartTypes)
109     {
110         m_aChartTypeDialogControllerList.push_back(std::make_unique<StockChartDialogController>());
111     }
112     m_aChartTypeDialogControllerList.push_back(
113         std::make_unique<CombiColumnLineChartDialogController>());
114 
115     for (auto const& elem : m_aChartTypeDialogControllerList)
116     {
117         m_xMainTypeList->append("", elem->getName(), elem->getImage());
118         elem->setChangeListener( this );
119     }
120 
121     m_xMainTypeList->set_size_request(m_xMainTypeList->get_preferred_size().Width(), -1);
122 
123     m_pDim3DLookResourceGroup->setChangeListener( this );
124     m_pStackingResourceGroup->setChangeListener( this );
125     m_pSplineResourceGroup->setChangeListener( this );
126     m_pGeometryResourceGroup->setChangeListener( this );
127     m_pSortByXValuesResourceGroup->setChangeListener( this );
128 }
129 
~ChartTypeTabPage()130 ChartTypeTabPage::~ChartTypeTabPage()
131 {
132     //delete all dialog controller
133     m_aChartTypeDialogControllerList.clear();
134 
135     //delete all resource helper
136     m_pDim3DLookResourceGroup.reset();
137     m_pStackingResourceGroup.reset();
138     m_pSplineResourceGroup.reset();
139     m_pGeometryResourceGroup.reset();
140     m_pSortByXValuesResourceGroup.reset();
141     m_xSubTypeListWin.reset();
142     m_xSubTypeList.reset();
143 }
144 
getCurrentParamter() const145 ChartTypeParameter ChartTypeTabPage::getCurrentParamter() const
146 {
147     ChartTypeParameter aParameter;
148     aParameter.nSubTypeIndex = static_cast<sal_Int32>(m_xSubTypeList->GetSelectedItemId());
149     m_pDim3DLookResourceGroup->fillParameter( aParameter );
150     m_pStackingResourceGroup->fillParameter( aParameter );
151     m_pSplineResourceGroup->fillParameter( aParameter );
152     m_pGeometryResourceGroup->fillParameter( aParameter );
153     m_pSortByXValuesResourceGroup->fillParameter( aParameter );
154     return aParameter;
155 }
156 
commitToModel(const ChartTypeParameter & rParameter)157 void ChartTypeTabPage::commitToModel( const ChartTypeParameter& rParameter )
158 {
159     if( !m_pCurrentMainType )
160         return;
161 
162     m_aTimerTriggeredControllerLock.startTimer();
163     m_pCurrentMainType->commitToModel( rParameter, m_xChartModel );
164 }
165 
stateChanged()166 void ChartTypeTabPage::stateChanged()
167 {
168     if(m_nChangingCalls)
169         return;
170     m_nChangingCalls++;
171 
172     ChartTypeParameter aParameter( getCurrentParamter() );
173     if( m_pCurrentMainType )
174     {
175         m_pCurrentMainType->adjustParameterToSubType( aParameter );
176         m_pCurrentMainType->adjustSubTypeAndEnableControls( aParameter );
177     }
178     commitToModel( aParameter );
179 
180     //detect the new ThreeDLookScheme
181     uno::Reference<XDiagram> xDiagram = ChartModelHelper::findDiagram(m_xChartModel);
182     aParameter.eThreeDLookScheme = ThreeDHelper::detectScheme(xDiagram);
183     try
184     {
185         uno::Reference<beans::XPropertySet> xPropSet(xDiagram, uno::UNO_QUERY_THROW);
186         xPropSet->getPropertyValue(CHART_UNONAME_SORT_BY_XVALUES) >>= aParameter.bSortByXValues;
187     }
188     catch ( const uno::Exception& )
189     {
190         DBG_UNHANDLED_EXCEPTION("chart2");
191     }
192     //the controls have to be enabled/disabled accordingly
193     fillAllControls( aParameter );
194 
195     m_nChangingCalls--;
196 }
197 
getSelectedMainType()198 ChartTypeDialogController* ChartTypeTabPage::getSelectedMainType()
199 {
200     ChartTypeDialogController* pTypeController = nullptr;
201     auto nM = static_cast< std::vector< ChartTypeDialogController* >::size_type >(
202         m_xMainTypeList->get_selected_index() );
203     if( nM<m_aChartTypeDialogControllerList.size() )
204         pTypeController = m_aChartTypeDialogControllerList[nM].get();
205     return pTypeController;
206 }
207 
IMPL_LINK_NOARG(ChartTypeTabPage,SelectSubTypeHdl,SvtValueSet *,void)208 IMPL_LINK_NOARG(ChartTypeTabPage, SelectSubTypeHdl, SvtValueSet*, void)
209 {
210     if( m_pCurrentMainType )
211     {
212         ChartTypeParameter aParameter( getCurrentParamter() );
213         m_pCurrentMainType->adjustParameterToSubType( aParameter );
214         fillAllControls( aParameter, false );
215         commitToModel( aParameter );
216     }
217 }
218 
IMPL_LINK_NOARG(ChartTypeTabPage,SelectMainTypeHdl,weld::TreeView &,void)219 IMPL_LINK_NOARG(ChartTypeTabPage, SelectMainTypeHdl, weld::TreeView&, void)
220 {
221     selectMainType();
222 }
223 
selectMainType()224 void ChartTypeTabPage::selectMainType()
225 {
226     ChartTypeParameter aParameter( getCurrentParamter() );
227 
228     if( m_pCurrentMainType )
229     {
230         m_pCurrentMainType->adjustParameterToSubType( aParameter );
231         m_pCurrentMainType->hideExtraControls();
232     }
233 
234     m_pCurrentMainType = getSelectedMainType();
235     if( m_pCurrentMainType )
236     {
237         showAllControls(*m_pCurrentMainType);
238 
239         m_pCurrentMainType->adjustParameterToMainType( aParameter );
240         commitToModel( aParameter );
241         //detect the new ThreeDLookScheme
242         aParameter.eThreeDLookScheme = ThreeDHelper::detectScheme( ChartModelHelper::findDiagram( m_xChartModel ) );
243         if(!aParameter.b3DLook && aParameter.eThreeDLookScheme!=ThreeDLookScheme_Realistic )
244             aParameter.eThreeDLookScheme=ThreeDLookScheme_Realistic;
245 
246         uno::Reference<XDiagram> xDiagram = ChartModelHelper::findDiagram(m_xChartModel);
247         try
248         {
249             uno::Reference<beans::XPropertySet> xPropSet(xDiagram, uno::UNO_QUERY_THROW);
250             xPropSet->getPropertyValue(CHART_UNONAME_SORT_BY_XVALUES) >>= aParameter.bSortByXValues;
251         }
252         catch ( const uno::Exception& )
253         {
254             DBG_UNHANDLED_EXCEPTION("chart2");
255         }
256 
257         fillAllControls( aParameter );
258         uno::Reference< beans::XPropertySet > xTemplateProps( getCurrentTemplate(), uno::UNO_QUERY );
259         m_pCurrentMainType->fillExtraControls(m_xChartModel,xTemplateProps);
260     }
261 }
262 
showAllControls(ChartTypeDialogController & rTypeController)263 void ChartTypeTabPage::showAllControls( ChartTypeDialogController& rTypeController )
264 {
265     m_xMainTypeList->show();
266     m_xSubTypeList->Show();
267 
268     bool bShow = rTypeController.shouldShow_3DLookControl();
269     m_pDim3DLookResourceGroup->showControls( bShow );
270     bShow = rTypeController.shouldShow_StackingControl();
271     m_pStackingResourceGroup->showControls( bShow, false );
272     bShow = rTypeController.shouldShow_SplineControl();
273     m_pSplineResourceGroup->showControls( bShow );
274     bShow = rTypeController.shouldShow_GeometryControl();
275     m_pGeometryResourceGroup->showControls( bShow );
276     bShow = rTypeController.shouldShow_SortByXValuesResourceGroup();
277     m_pSortByXValuesResourceGroup->showControls( bShow );
278     rTypeController.showExtraControls(m_xBuilder.get());
279 }
280 
fillAllControls(const ChartTypeParameter & rParameter,bool bAlsoResetSubTypeList)281 void ChartTypeTabPage::fillAllControls( const ChartTypeParameter& rParameter, bool bAlsoResetSubTypeList )
282 {
283     m_nChangingCalls++;
284     if( m_pCurrentMainType && bAlsoResetSubTypeList )
285     {
286         m_pCurrentMainType->fillSubTypeList(*m_xSubTypeList, rParameter);
287     }
288     m_xSubTypeList->SelectItem( static_cast<sal_uInt16>( rParameter.nSubTypeIndex) );
289     m_pDim3DLookResourceGroup->fillControls( rParameter );
290     m_pStackingResourceGroup->fillControls( rParameter );
291     m_pSplineResourceGroup->fillControls( rParameter );
292     m_pGeometryResourceGroup->fillControls( rParameter );
293     m_pSortByXValuesResourceGroup->fillControls( rParameter );
294     m_nChangingCalls--;
295 }
296 
initializePage()297 void ChartTypeTabPage::initializePage()
298 {
299     if( !m_xChartModel.is() )
300         return;
301     uno::Reference< lang::XMultiServiceFactory > xTemplateManager( m_xChartModel->getChartTypeManager(), uno::UNO_QUERY );
302     uno::Reference< XDiagram > xDiagram( ChartModelHelper::findDiagram( m_xChartModel ) );
303     DiagramHelper::tTemplateWithServiceName aTemplate =
304         DiagramHelper::getTemplateForDiagram( xDiagram, xTemplateManager );
305     OUString aServiceName( aTemplate.second );
306 
307     bool bFound = false;
308 
309     sal_uInt16 nM=0;
310     for (auto const& elem : m_aChartTypeDialogControllerList)
311     {
312         if( elem->isSubType(aServiceName) )
313         {
314             bFound = true;
315 
316             m_xMainTypeList->select(nM);
317             showAllControls(*elem);
318             uno::Reference< beans::XPropertySet > xTemplateProps( aTemplate.first, uno::UNO_QUERY );
319             ChartTypeParameter aParameter = elem->getChartTypeParameterForService( aServiceName, xTemplateProps );
320             m_pCurrentMainType = getSelectedMainType();
321 
322             //set ThreeDLookScheme
323             aParameter.eThreeDLookScheme = ThreeDHelper::detectScheme( xDiagram );
324             if(!aParameter.b3DLook && aParameter.eThreeDLookScheme!=ThreeDLookScheme_Realistic )
325                 aParameter.eThreeDLookScheme=ThreeDLookScheme_Realistic;
326 
327             try
328             {
329                 uno::Reference<beans::XPropertySet> xPropSet(xDiagram, uno::UNO_QUERY_THROW);
330                 xPropSet->getPropertyValue(CHART_UNONAME_SORT_BY_XVALUES) >>= aParameter.bSortByXValues;
331             }
332             catch (const uno::Exception&)
333             {
334                 DBG_UNHANDLED_EXCEPTION("chart2");
335             }
336 
337             fillAllControls( aParameter );
338             if( m_pCurrentMainType )
339                 m_pCurrentMainType->fillExtraControls(m_xChartModel,xTemplateProps);
340             break;
341         }
342         ++nM;
343     }
344 
345     if( !bFound )
346     {
347         m_xSubTypeList->Hide();
348         m_pDim3DLookResourceGroup->showControls( false );
349         m_pStackingResourceGroup->showControls( false, false );
350         m_pSplineResourceGroup->showControls( false );
351         m_pGeometryResourceGroup->showControls( false );
352         m_pSortByXValuesResourceGroup->showControls( false );
353     }
354 }
355 
commitPage(::vcl::WizardTypes::CommitPageReason)356 bool ChartTypeTabPage::commitPage( ::vcl::WizardTypes::CommitPageReason /*eReason*/ )
357 {
358     return true; // return false if this page should not be left
359 }
360 
getCurrentTemplate() const361 uno::Reference< XChartTypeTemplate > ChartTypeTabPage::getCurrentTemplate() const
362 {
363     if( m_pCurrentMainType && m_xChartModel.is() )
364     {
365         ChartTypeParameter aParameter( getCurrentParamter() );
366         m_pCurrentMainType->adjustParameterToSubType( aParameter );
367         uno::Reference< lang::XMultiServiceFactory > xTemplateManager( m_xChartModel->getChartTypeManager(), uno::UNO_QUERY );
368         return m_pCurrentMainType->getCurrentTemplate( aParameter, xTemplateManager );
369     }
370     return nullptr;
371 }
372 
373 } //namespace chart
374 
375 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
376