/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * This file is part of the LibreOffice project. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * This file incorporates work covered by the following license notice: * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed * with this work for additional information regarding copyright * ownership. The ASF licenses this file to you under the Apache * License, Version 2.0 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.apache.org/licenses/LICENSE-2.0 . */ #include "ChartTypePanel.hxx" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace css; using namespace css::uno; namespace chart { namespace sidebar { ChartTypePanel::ChartTypePanel(vcl::Window* pParent, const css::uno::Reference& rxFrame, ::chart::ChartController* pController) : PanelLayout(pParent, "ChartTypePanel", "modules/schart/ui/sidebartype.ui", rxFrame, true) , maContext() , mxModel(pController->getModel()) , mxListener(new ChartSidebarModifyListener(this)) , mbModelValid(true) , m_pDim3DLookResourceGroup(new Dim3DLookResourceGroup(m_xBuilder.get())) , m_pStackingResourceGroup(new StackingResourceGroup(m_xBuilder.get())) //, m_pSplineResourceGroup( new SplineResourceGroup(m_xBuilder.get(), pController->getDialog()) ) , m_pGeometryResourceGroup(new GeometryResourceGroup(m_xBuilder.get())) , m_pSortByXValuesResourceGroup(new SortByXValuesResourceGroup(m_xBuilder.get())) , m_xChartModel(mxModel, css::uno::UNO_QUERY_THROW) , m_aChartTypeDialogControllerList(0) , m_pCurrentMainType(nullptr) , m_nChangingCalls(0) , m_aTimerTriggeredControllerLock(m_xChartModel) , m_xChartTypeLabel(m_xBuilder->weld_label("lbl_chartType")) , m_xMainTypeList(m_xBuilder->weld_combo_box("cmb_chartType")) , m_xSubTypeList(new SvtValueSet(m_xBuilder->weld_scrolled_window("subtypewin"))) , m_xSubTypeListWin(new weld::CustomWeld(*m_xBuilder, "subtype", *m_xSubTypeList)) { Size aSize(m_xSubTypeList->GetDrawingArea()->get_ref_device().LogicToPixel( Size(120, 40), MapMode(MapUnit::MapAppFont))); m_xSubTypeListWin->set_size_request(aSize.Width(), aSize.Height()); m_xMainTypeList->connect_changed(LINK(this, ChartTypePanel, SelectMainTypeHdl)); m_xSubTypeList->SetSelectHdl(LINK(this, ChartTypePanel, SelectSubTypeHdl)); m_xSubTypeList->SetStyle(m_xSubTypeList->GetStyle() | WB_ITEMBORDER | WB_DOUBLEBORDER | WB_NAMEFIELD | WB_FLATVALUESET | WB_3DLOOK); m_xSubTypeList->SetColCount(4); m_xSubTypeList->SetLineCount(1); bool bEnableComplexChartTypes = true; uno::Reference xProps(m_xChartModel, uno::UNO_QUERY); if (xProps.is()) { try { xProps->getPropertyValue("EnableComplexChartTypes") >>= bEnableComplexChartTypes; } catch (const uno::Exception&) { TOOLS_WARN_EXCEPTION("chart2", ""); } } m_aChartTypeDialogControllerList.push_back(std::make_unique()); m_aChartTypeDialogControllerList.push_back(std::make_unique()); m_aChartTypeDialogControllerList.push_back(std::make_unique()); m_aChartTypeDialogControllerList.push_back(std::make_unique()); m_aChartTypeDialogControllerList.push_back(std::make_unique()); if (bEnableComplexChartTypes) { m_aChartTypeDialogControllerList.push_back(std::make_unique()); m_aChartTypeDialogControllerList.push_back(std::make_unique()); } m_aChartTypeDialogControllerList.push_back(std::make_unique()); if (bEnableComplexChartTypes) { m_aChartTypeDialogControllerList.push_back(std::make_unique()); } m_aChartTypeDialogControllerList.push_back( std::make_unique()); for (auto const& elem : m_aChartTypeDialogControllerList) { m_xMainTypeList->append("", elem->getName(), elem->getImage()); elem->setChangeListener(this); } m_pDim3DLookResourceGroup->setChangeListener(this); m_pStackingResourceGroup->setChangeListener(this); //m_pSplineResourceGroup->setChangeListener( this ); m_pGeometryResourceGroup->setChangeListener(this); m_pSortByXValuesResourceGroup->setChangeListener(this); Initialize(); } ChartTypePanel::~ChartTypePanel() { disposeOnce(); } void ChartTypePanel::dispose() { css::uno::Reference xBroadcaster(mxModel, css::uno::UNO_QUERY_THROW); xBroadcaster->removeModifyListener(mxListener); //delete all dialog controller m_aChartTypeDialogControllerList.clear(); //delete all resource helpers m_pDim3DLookResourceGroup.reset(); m_pStackingResourceGroup.reset(); //m_pSplineResourceGroup.reset(); m_pGeometryResourceGroup.reset(); m_pSortByXValuesResourceGroup.reset(); m_xSubTypeListWin.reset(); m_xSubTypeList.reset(); PanelLayout::dispose(); } IMPL_LINK_NOARG(ChartTypePanel, SelectMainTypeHdl, weld::ComboBox&, void) { selectMainType(); } IMPL_LINK_NOARG(ChartTypePanel, SelectSubTypeHdl, SvtValueSet*, void) { if (m_pCurrentMainType) { ChartTypeParameter aParameter(getCurrentParamter()); m_pCurrentMainType->adjustParameterToSubType(aParameter); fillAllControls(aParameter, false); commitToModel(aParameter); } } void ChartTypePanel::Initialize() { if (!m_xChartModel.is()) return; uno::Reference xTemplateManager( m_xChartModel->getChartTypeManager(), uno::UNO_QUERY); uno::Reference xDiagram(ChartModelHelper::findDiagram(m_xChartModel)); DiagramHelper::tTemplateWithServiceName aTemplate = DiagramHelper::getTemplateForDiagram(xDiagram, xTemplateManager); OUString aServiceName(aTemplate.second); bool bFound = false; sal_uInt16 nM = 0; for (auto const& elem : m_aChartTypeDialogControllerList) { if (elem->isSubType(aServiceName)) { bFound = true; m_xMainTypeList->set_active(nM); showAllControls(*elem); uno::Reference xTemplateProps(aTemplate.first, uno::UNO_QUERY); ChartTypeParameter aParameter = elem->getChartTypeParameterForService(aServiceName, xTemplateProps); m_pCurrentMainType = getSelectedMainType(); //set ThreeDLookScheme aParameter.eThreeDLookScheme = ThreeDHelper::detectScheme(xDiagram); if (!aParameter.b3DLook && aParameter.eThreeDLookScheme != ThreeDLookScheme_Realistic) aParameter.eThreeDLookScheme = ThreeDLookScheme_Realistic; try { uno::Reference xPropSet(xDiagram, uno::UNO_QUERY_THROW); xPropSet->getPropertyValue(CHART_UNONAME_SORT_BY_XVALUES) >>= aParameter.bSortByXValues; } catch (const uno::Exception&) { DBG_UNHANDLED_EXCEPTION("chart2"); } fillAllControls(aParameter); if (m_pCurrentMainType) m_pCurrentMainType->fillExtraControls(m_xChartModel, xTemplateProps); break; } ++nM; } if (!bFound) { m_xSubTypeList->Hide(); m_pDim3DLookResourceGroup->showControls(false); m_pStackingResourceGroup->showControls(false, false); //m_pSplineResourceGroup->showControls( false ); m_pGeometryResourceGroup->showControls(false); m_pSortByXValuesResourceGroup->showControls(false); } } void ChartTypePanel::updateData() { // Chart Type related if (!m_xChartModel.is()) return; uno::Reference xTemplateManager( m_xChartModel->getChartTypeManager(), uno::UNO_QUERY); uno::Reference xModel(m_xChartModel); uno::Reference xDiagram(ChartModelHelper::findDiagram(xModel)); DiagramHelper::tTemplateWithServiceName aTemplate = DiagramHelper::getTemplateForDiagram(xDiagram, xTemplateManager); OUString aServiceName(aTemplate.second); sal_uInt16 nM = 0; for (auto const& elem : m_aChartTypeDialogControllerList) { if (elem->isSubType(aServiceName)) { //m_pMainTypeList->SelectEntryPos(nM); //m_pMainTypeList->select_entry_region(nM, nM); break; } ++nM; } } VclPtr ChartTypePanel::Create(vcl::Window* pParent, const css::uno::Reference& rxFrame, ChartController* pController) { if (pParent == nullptr) throw lang::IllegalArgumentException("no parent Window given to ChartTypePanel::Create", nullptr, 0); if (!rxFrame.is()) throw lang::IllegalArgumentException("no XFrame given to ChartTypePanel::Create", nullptr, 1); return VclPtr::Create(pParent, rxFrame, pController); } void ChartTypePanel::DataChanged(const DataChangedEvent&) { updateData(); } void ChartTypePanel::HandleContextChange(const vcl::EnumContext& rContext) { if (maContext == rContext) { // Nothing to do. return; } maContext = rContext; updateData(); } void ChartTypePanel::modelInvalid() { mbModelValid = false; } void ChartTypePanel::updateModel(css::uno::Reference xModel) { if (mbModelValid) { css::uno::Reference xBroadcaster(mxModel, css::uno::UNO_QUERY_THROW); xBroadcaster->removeModifyListener(mxListener); } mxModel = xModel; mbModelValid = true; css::uno::Reference xBroadcasterNew(mxModel, css::uno::UNO_QUERY_THROW); xBroadcasterNew->addModifyListener(mxListener); } uno::Reference ChartTypePanel::getCurrentTemplate() const { if (m_pCurrentMainType && m_xChartModel.is()) { ChartTypeParameter aParameter(getCurrentParamter()); m_pCurrentMainType->adjustParameterToSubType(aParameter); uno::Reference xTemplateManager( m_xChartModel->getChartTypeManager(), uno::UNO_QUERY); return m_pCurrentMainType->getCurrentTemplate(aParameter, xTemplateManager); } return nullptr; } ChartTypeDialogController* ChartTypePanel::getSelectedMainType() { ChartTypeDialogController* pTypeController = nullptr; auto nM = static_cast::size_type>( m_xMainTypeList->get_active()); if (nM < m_aChartTypeDialogControllerList.size()) pTypeController = m_aChartTypeDialogControllerList[nM].get(); return pTypeController; } void ChartTypePanel::showAllControls(ChartTypeDialogController& rTypeController) { m_xMainTypeList->show(); m_xSubTypeList->Show(); bool bShow = rTypeController.shouldShow_3DLookControl(); m_pDim3DLookResourceGroup->showControls(bShow); bShow = rTypeController.shouldShow_StackingControl(); m_pStackingResourceGroup->showControls(bShow, false); /*bShow = rTypeController.shouldShow_SplineControl(); m_pSplineResourceGroup->showControls( bShow );*/ bShow = rTypeController.shouldShow_GeometryControl(); m_pGeometryResourceGroup->showControls(bShow); bShow = rTypeController.shouldShow_SortByXValuesResourceGroup(); m_pSortByXValuesResourceGroup->showControls(bShow); rTypeController.showExtraControls(m_xBuilder.get()); } void ChartTypePanel::fillAllControls(const ChartTypeParameter& rParameter, bool bAlsoResetSubTypeList) { m_nChangingCalls++; if (m_pCurrentMainType && bAlsoResetSubTypeList) { m_pCurrentMainType->fillSubTypeList(*m_xSubTypeList, rParameter); } m_xSubTypeList->SelectItem(static_cast(rParameter.nSubTypeIndex)); m_pDim3DLookResourceGroup->fillControls(rParameter); m_pStackingResourceGroup->fillControls(rParameter); //m_pSplineResourceGroup->fillControls( rParameter ); m_pGeometryResourceGroup->fillControls(rParameter); m_pSortByXValuesResourceGroup->fillControls(rParameter); m_nChangingCalls--; } ChartTypeParameter ChartTypePanel::getCurrentParamter() const { ChartTypeParameter aParameter; aParameter.nSubTypeIndex = static_cast(m_xSubTypeList->GetSelectedItemId()); m_pDim3DLookResourceGroup->fillParameter(aParameter); m_pStackingResourceGroup->fillParameter(aParameter); //m_pSplineResourceGroup->fillParameter( aParameter ); m_pGeometryResourceGroup->fillParameter(aParameter); m_pSortByXValuesResourceGroup->fillParameter(aParameter); return aParameter; } void ChartTypePanel::stateChanged() { if (m_nChangingCalls) return; m_nChangingCalls++; ChartTypeParameter aParameter(getCurrentParamter()); if (m_pCurrentMainType) { m_pCurrentMainType->adjustParameterToSubType(aParameter); m_pCurrentMainType->adjustSubTypeAndEnableControls(aParameter); } commitToModel(aParameter); //detect the new ThreeDLookScheme uno::Reference xDiagram = ChartModelHelper::findDiagram(m_xChartModel); aParameter.eThreeDLookScheme = ThreeDHelper::detectScheme(xDiagram); try { uno::Reference xPropSet(xDiagram, uno::UNO_QUERY_THROW); xPropSet->getPropertyValue(CHART_UNONAME_SORT_BY_XVALUES) >>= aParameter.bSortByXValues; } catch (const uno::Exception&) { DBG_UNHANDLED_EXCEPTION("chart2"); } //the controls have to be enabled/disabled accordingly fillAllControls(aParameter); m_nChangingCalls--; } void ChartTypePanel::commitToModel(const ChartTypeParameter& rParameter) { if (!m_pCurrentMainType) return; m_aTimerTriggeredControllerLock.startTimer(); m_pCurrentMainType->commitToModel(rParameter, m_xChartModel); } void ChartTypePanel::selectMainType() { ChartTypeParameter aParameter(getCurrentParamter()); if (m_pCurrentMainType) { m_pCurrentMainType->adjustParameterToSubType(aParameter); m_pCurrentMainType->hideExtraControls(); } m_pCurrentMainType = getSelectedMainType(); if (m_pCurrentMainType) { showAllControls(*m_pCurrentMainType); m_pCurrentMainType->adjustParameterToMainType(aParameter); commitToModel(aParameter); //detect the new ThreeDLookScheme aParameter.eThreeDLookScheme = ThreeDHelper::detectScheme(ChartModelHelper::findDiagram(m_xChartModel)); if (!aParameter.b3DLook && aParameter.eThreeDLookScheme != ThreeDLookScheme_Realistic) aParameter.eThreeDLookScheme = ThreeDLookScheme_Realistic; uno::Reference xDiagram = ChartModelHelper::findDiagram(m_xChartModel); try { uno::Reference xPropSet(xDiagram, uno::UNO_QUERY_THROW); xPropSet->getPropertyValue(CHART_UNONAME_SORT_BY_XVALUES) >>= aParameter.bSortByXValues; } catch (const uno::Exception&) { DBG_UNHANDLED_EXCEPTION("chart2"); } fillAllControls(aParameter); uno::Reference xTemplateProps(getCurrentTemplate(), uno::UNO_QUERY); m_pCurrentMainType->fillExtraControls(m_xChartModel, xTemplateProps); } } } } // end of namespace ::chart::sidebar /* vim:set shiftwidth=4 softtabstop=4 expandtab: */