Rebased ref, commits from common ancestor: commit 5a8c4244d33ad257d4cd81b40c612ff294015492 Author: Vasily Melenchuk <vasily.melenc...@cib.de> Date: Fri Nov 10 18:37:25 2017 +0300
tdf#113572: allow switching to data range in copypasted chart - enable data range toolbar button for charts with internal data table and possiblilty to switch to data range - show warning before destoying data table - recreation of data provider Conflicts: chart2/inc/ChartModel.hxx chart2/inc/strings.hrc chart2/source/controller/main/ChartController.cxx chart2/source/controller/main/ControllerCommandDispatch.cxx sc/source/ui/unoobj/docuno.cxx Change-Id: I46c703b579cd32405b02543aa5b9e3a74e4b36b6 Reviewed-on: https://gerrit.libreoffice.org/46981 Reviewed-by: Thorsten Behrens <thorsten.behr...@cib.de> Tested-by: Thorsten Behrens <thorsten.behr...@cib.de> diff --git a/chart2/inc/ChartModel.hxx b/chart2/inc/ChartModel.hxx index b3caaad412c4..f254103e961f 100644 --- a/chart2/inc/ChartModel.hxx +++ b/chart2/inc/ChartModel.hxx @@ -579,6 +579,8 @@ public: void getNextTimePoint(); void setTimeBasedRange(sal_Int32 nStart, sal_Int32 nEnd); + void removeDataProviders(); + OpenGLWindow* getOpenGLWindow() { return mpOpenGLWindow;} private: diff --git a/chart2/source/controller/dialogs/Strings.src b/chart2/source/controller/dialogs/Strings.src index c9d18eb62391..96f7f5598b2a 100644 --- a/chart2/source/controller/dialogs/Strings.src +++ b/chart2/source/controller/dialogs/Strings.src @@ -34,6 +34,11 @@ String STR_DLG_STEPPED_LINE_PROPERTIES Text [ en-US ] = "Stepped Lines" ; }; +String STR_DLG_REMOVE_DATA_TABLE +{ + Text [ en-US ] = "Do you want to delete data table and switch to data ranges?" ; +}; + String STR_PAGE_CHARTTYPE { Text [ en-US ] = "Chart Type" ; diff --git a/chart2/source/controller/main/ChartController.cxx b/chart2/source/controller/main/ChartController.cxx index 8482c16a6513..f87f5c74f798 100644 --- a/chart2/source/controller/main/ChartController.cxx +++ b/chart2/source/controller/main/ChartController.cxx @@ -66,12 +66,14 @@ #include <com/sun/star/ui/XSidebar.hpp> #include <com/sun/star/chart2/XChartTypeContainer.hpp> #include <com/sun/star/chart2/XCoordinateSystemContainer.hpp> +#include <com/sun/star/chart2/XDataProviderCreator.hpp> #include <svx/sidebar/SelectionChangeHandler.hxx> #include <vcl/msgbox.hxx> #include <toolkit/awt/vclxwindow.hxx> #include <toolkit/helper/vclunohelper.hxx> #include <vcl/svapp.hxx> +#include <vcl/layout.hxx> #include <osl/mutex.hxx> #include <sfx2/sidebar/SidebarController.hxx> @@ -1395,21 +1397,56 @@ void ChartController::executeDispatch_SourceData() //convert properties to ItemSet uno::Reference< XChartDocument > xChartDoc( getModel(), uno::UNO_QUERY ); OSL_ENSURE( xChartDoc.is(), "Invalid XChartDocument" ); - if( !xChartDoc.is()) + if( !xChartDoc.is() ) return; - UndoLiveUpdateGuard aUndoGuard = UndoLiveUpdateGuard( - SCH_RESSTR(STR_ACTION_EDIT_DATA_RANGES), m_xUndoManager ); - if( xChartDoc.is()) + // If there is a data table we should ask user if we really want to destroy it + // and switch to data ranges. + ChartModel& rModel = dynamic_cast<ChartModel&>(*xChartDoc.get()); + if ( rModel.hasInternalDataProvider() ) { + // Check if we will able to create data provider later + Reference< lang::XServiceInfo > xParentServiceInfo( rModel.getParent(), uno::UNO_QUERY ); + if ( !xParentServiceInfo.is() || !xParentServiceInfo->supportsService("com.sun.star.chart2.XDataProviderCreator") ) + return; + SolarMutexGuard aSolarGuard; - ScopedVclPtrInstance< ::chart::DataSourceDialog > aDlg( m_pChartWindow, xChartDoc, m_xCC ); - if( aDlg->Execute() == RET_OK ) + + ScopedVclPtrInstance< MessageDialog > aQueryBox( m_pChartWindow, SchResId( STR_DLG_REMOVE_DATA_TABLE ), VCL_MESSAGE_QUESTION, VCL_BUTTONS_YES_NO); + + // If "No" then just return + if (aQueryBox->Execute() == RET_NO) + return; + + // Remove data table + rModel.removeDataProviders(); + + // Ask parent document to create new data provider + css::uno::Reference< com::sun::star::chart2::XDataProviderCreator > xCreatorDoc( + rModel.getParent(), uno::UNO_QUERY ); + OSL_ENSURE( xCreatorDoc.is(), "Invalid XDataProviderCreator" ); + + if ( xCreatorDoc.is() ) { - impl_adaptDataSeriesAutoResize(); - aUndoGuard.commit(); + uno::Reference< data::XDataProvider > xDataProvider = xCreatorDoc->createDataProvider(); + OSL_ENSURE( xCreatorDoc.is(), "Data provider was not created" ); + if ( xDataProvider.is() ) + { + rModel.attachDataProvider(xDataProvider); + } } } + + UndoLiveUpdateGuard aUndoGuard( + SchResId(STR_ACTION_EDIT_DATA_RANGES), m_xUndoManager); + + SolarMutexGuard aSolarGuard; + ScopedVclPtrInstance< ::chart::DataSourceDialog > aDlg( m_pChartWindow, xChartDoc, m_xCC ); + if( aDlg->Execute() == RET_OK ) + { + impl_adaptDataSeriesAutoResize(); + aUndoGuard.commit(); + } } void ChartController::executeDispatch_MoveSeries( bool bForward ) diff --git a/chart2/source/controller/main/ControllerCommandDispatch.cxx b/chart2/source/controller/main/ControllerCommandDispatch.cxx index 3f32b4db1558..63e56bdeb156 100644 --- a/chart2/source/controller/main/ControllerCommandDispatch.cxx +++ b/chart2/source/controller/main/ControllerCommandDispatch.cxx @@ -528,6 +528,8 @@ void ControllerCommandDispatch::updateCommandAvailability() bool bShapeContext = m_pChartController && m_pChartController->isShapeContext(); bool bEnableDataTableDialog = false; + bool bCanCreateDataProvider = false; + if ( m_xController.is() ) { Reference< beans::XPropertySet > xProps( m_xController->getModel(), uno::UNO_QUERY ); @@ -542,6 +544,19 @@ void ControllerCommandDispatch::updateCommandAvailability() ASSERT_EXCEPTION( e ); } } + + Reference< chart2::XChartDocument > xChartDoc(m_xController->getModel(), uno::UNO_QUERY); + OSL_ENSURE(xChartDoc.is(), "Invalid XChartDocument"); + if ( xChartDoc.is() ) + { + ChartModel& rModel = dynamic_cast<ChartModel&>(*xChartDoc.get()); + Reference< lang::XServiceInfo > xParentServiceInfo(rModel.getParent(), uno::UNO_QUERY); + OSL_ENSURE(xParentServiceInfo.is(), "Invalid XServiceInfo"); + if ( xParentServiceInfo.is() ) + { + bCanCreateDataProvider = xParentServiceInfo->supportsService("com.sun.star.chart2.XDataProviderCreator"); + } + } } // edit commands @@ -614,7 +629,7 @@ void ControllerCommandDispatch::updateCommandAvailability() m_aCommandAvailability[ ".uno:FormatLegend" ] = m_aCommandAvailability[ ".uno:Legend" ]; // depending on own data - m_aCommandAvailability[ ".uno:DataRanges" ] = bIsWritable && bModelStateIsValid && (! m_apModelState->bHasOwnData); + m_aCommandAvailability[ ".uno:DataRanges" ] = bIsWritable && bModelStateIsValid && bCanCreateDataProvider; m_aCommandAvailability[ ".uno:DiagramData" ] = bIsWritable && bModelStateIsValid && m_apModelState->bHasOwnData && bEnableDataTableDialog; // titles diff --git a/chart2/source/inc/Strings.hrc b/chart2/source/inc/Strings.hrc index 950050ba228f..f08d88be7860 100644 --- a/chart2/source/inc/Strings.hrc +++ b/chart2/source/inc/Strings.hrc @@ -22,7 +22,7 @@ // this includes no link dependency #include <svl/solar.hrc> -//next free is 305 +//next free is 306 //chart types //see Strings_ChartTypes.src @@ -220,6 +220,8 @@ #define STR_CONTROLTEXT_ERROR_BARS_FROM_DATA (RID_APP_START + 276) #define STR_DLG_CHART_WIZARD (RID_APP_START + 228) +#define STR_DLG_REMOVE_DATA_TABLE (RID_APP_START + 305) + #define STR_PAGE_CHART_ELEMENTS (RID_APP_START + 229) #define STR_PAGE_CHART_LOCATION (RID_APP_START + 230) diff --git a/chart2/source/model/main/ChartModel.cxx b/chart2/source/model/main/ChartModel.cxx index 48ec54304805..93f5f1c76408 100644 --- a/chart2/source/model/main/ChartModel.cxx +++ b/chart2/source/model/main/ChartModel.cxx @@ -813,6 +813,14 @@ void SAL_CALL ChartModel::createInternalDataProvider( sal_Bool bCloneExistingDat setModified( true ); } +void ChartModel::removeDataProviders() +{ + if (m_xInternalDataProvider.is()) + m_xInternalDataProvider.clear(); + if (m_xDataProvider.is()) + m_xDataProvider.clear(); +} + sal_Bool SAL_CALL ChartModel::hasInternalDataProvider() throw (uno::RuntimeException, std::exception) { diff --git a/offapi/UnoApi_offapi.mk b/offapi/UnoApi_offapi.mk index 331de34d25b8..4b040db1d6e1 100644 --- a/offapi/UnoApi_offapi.mk +++ b/offapi/UnoApi_offapi.mk @@ -2030,6 +2030,7 @@ $(eval $(call gb_UnoApi_add_idlfiles,offapi,com/sun/star/chart2,\ XCoordinateSystem \ XCoordinateSystemContainer \ XDataInterpreter \ + XDataProviderCreator \ XDataSeries \ XDataSeriesContainer \ XDefaultSizeTransmitter \ diff --git a/offapi/com/sun/star/chart2/XDataProviderCreator.idl b/offapi/com/sun/star/chart2/XDataProviderCreator.idl new file mode 100644 index 000000000000..c7bac38e4b1d --- /dev/null +++ b/offapi/com/sun/star/chart2/XDataProviderCreator.idl @@ -0,0 +1,50 @@ +/* -*- 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 . + */ + +#ifndef __com_sun_star_chart2_XDataProviderCreator_idl__ +#define __com_sun_star_chart2_XDataProviderCreator_idl__ + +#include <com/sun/star/uno/XInterface.idl> +#include <com/sun/star/uno/chart/data/XDataProvider.idl> + +module com { module sun { module star { module chart2 { + + +/** creates a chart2 data provider for given document + + */ +interface XDataProviderCreator : com::sun::star::uno::XInterface +{ + + /** creates a data provider for chart2 + + @see com::sun::star::chart2::data::XDataProvider + + @since LibreOffice 6.1 + */ + com::sun::star::chart2::data::XDataProvider createDataProvider(); + +}; + + +}; }; }; }; + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/inc/docuno.hxx b/sc/inc/docuno.hxx index b041c0e79487..f9e01f60b323 100644 --- a/sc/inc/docuno.hxx +++ b/sc/inc/docuno.hxx @@ -37,6 +37,8 @@ #include <com/sun/star/sheet/XSpreadsheetDocument.hpp> #include <com/sun/star/sheet/XSpreadsheets2.hpp> #include <com/sun/star/sheet/XDocumentAuditing.hpp> +#include <com/sun/star/chart2/data/XDataProvider.hpp> +#include <com/sun/star/chart2/XDataProviderCreator.hpp> #include <com/sun/star/lang/XServiceInfo.hpp> #include <com/sun/star/util/XProtectable.hpp> #include <com/sun/star/container/XEnumerationAccess.hpp> @@ -85,6 +87,7 @@ class SC_DLLPUBLIC ScModelObj : public SfxBaseModel, public SvxFmMSFactory, ///< derived from XMultiServiceFactory public css::lang::XServiceInfo, public css::util::XChangesNotifier, + public css::chart2::XDataProviderCreator, public css::sheet::opencl::XOpenCLSelection { private: @@ -155,6 +158,10 @@ public: virtual css::uno::Reference< css::sheet::XSpreadsheets > SAL_CALL getSheets() throw(css::uno::RuntimeException, std::exception) override; + /// XDataProviderCreator + virtual ::css::uno::Reference< css::chart2::data::XDataProvider > SAL_CALL + createDataProvider() throw (com::sun::star::uno::RuntimeException, std::exception) override; + /// XStyleFamiliesSupplier virtual css::uno::Reference< css::container::XNameAccess > SAL_CALL getStyleFamilies() throw(css::uno::RuntimeException, std::exception) override; diff --git a/sc/source/ui/unoobj/docuno.cxx b/sc/source/ui/unoobj/docuno.cxx index 8776c6490e49..6837bc43a253 100644 --- a/sc/source/ui/unoobj/docuno.cxx +++ b/sc/source/ui/unoobj/docuno.cxx @@ -218,6 +218,7 @@ using sc::TwipsToHMM; #define SCMODELOBJ_SERVICE "com.sun.star.sheet.SpreadsheetDocument" #define SCDOCSETTINGS_SERVICE "com.sun.star.sheet.SpreadsheetDocumentSettings" #define SCDOC_SERVICE "com.sun.star.document.OfficeDocument" +#define SCDATAPROVIDERCREATOR_SERVICE "com.sun.star.chart2.XDataProviderCreator" SC_SIMPLE_SERVICE_INFO( ScAnnotationsObj, "ScAnnotationsObj", "com.sun.star.sheet.CellAnnotations" ) SC_SIMPLE_SERVICE_INFO( ScDrawPagesObj, "ScDrawPagesObj", "com.sun.star.drawing.DrawPages" ) @@ -980,6 +981,7 @@ uno::Any SAL_CALL ScModelObj::queryInterface( const uno::Type& rType ) SC_QUERYINTERFACE( lang::XServiceInfo ) SC_QUERYINTERFACE( util::XChangesNotifier ) SC_QUERYINTERFACE( sheet::opencl::XOpenCLSelection ) + SC_QUERYINTERFACE( chart2::XDataProviderCreator ) uno::Any aRet(SfxBaseModel::queryInterface( rType )); if ( !aRet.hasValue() @@ -1148,6 +1150,16 @@ uno::Reference<sheet::XSpreadsheets> SAL_CALL ScModelObj::getSheets() throw(uno: return nullptr; } +css::uno::Reference< ::css::chart2::data::XDataProvider > SAL_CALL ScModelObj::createDataProvider() throw (com::sun::star::uno::RuntimeException, std::exception) +{ + if (pDocShell) + { + return css::uno::Reference< ::css::chart2::data::XDataProvider > ( + ScServiceProvider::MakeInstance(ScServiceProvider::Type::CHDATAPROV, pDocShell), uno::UNO_QUERY); + } + return nullptr; +} + // XStyleFamiliesSupplier uno::Reference<container::XNameAccess> SAL_CALL ScModelObj::getStyleFamilies() @@ -2601,10 +2613,11 @@ sal_Bool SAL_CALL ScModelObj::supportsService( const OUString& rServiceName ) uno::Sequence<OUString> SAL_CALL ScModelObj::getSupportedServiceNames() throw(uno::RuntimeException, std::exception) { - uno::Sequence<OUString> aRet(3); + uno::Sequence<OUString> aRet(4); aRet[0] = SCMODELOBJ_SERVICE; aRet[1] = SCDOCSETTINGS_SERVICE; aRet[2] = SCDOC_SERVICE; + aRet[3] = SCDATAPROVIDERCREATOR_SERVICE; return aRet; } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits