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