/* -*- 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 #include #include #include "AxisUsage.hxx" namespace chart { /** This class is a container of `SeriesPlotter` objects (such as `PieChart` * instances). It is used for initializing coordinate systems, axes and scales * of all series plotters which belongs to the container. */ class SeriesPlotterContainer { public: explicit SeriesPlotterContainer(std::vector>& rVCooSysList); ~SeriesPlotterContainer(); /** It is used to set coordinate systems (`m_rVCooSysList`), this method * is invoked by `ChartView::createShapes2D` before of * `ChartView::impl_createDiagramAndContent`. * Coordinate systems are retrieved through the `XCoordinateSystemContainer` * interface implemented by a diagram object which is provided by the * `ChartModel` object passed to the method (`rChartModel.getFirstDiagram()`). * * It is used for creating series plotters and appending them * to `m_aSeriesPlotterList`. The created series plotters are initialized * through data (number formats supplier, color scheme, data series), * extracted from the chart model or the diagram objects. An exception is * the explicit category provider that is retrieved through the * `VCoordinateSystem` object used by the series plotter. * * It sets the minimum-maximum supplier for a coordinate system: * this supplier is the series plotter itself which utilizes the given * coordinate system. In fact `VSeriesPlotter` has `MinimumMaximumSupplier` * as one of its base classes. * Hence, for instance, a `PieChart`, which is a series plotter, is * a `MinimumMaximumSupplier`, too. */ void initializeCooSysAndSeriesPlotter(ChartModel& rModel); /** This method is invoked by `ChartView::impl_createDiagramAndContent`. * It iterates on every axis of every coordinate systems, and if the axis * is not yet present in `m_aAxisUsageList` it creates a new `AxisUsage` * object and initialize its `aAutoScaling` member to the `ScaleData` * object of the current axis. */ void initAxisUsageList(const Date& rNullDate); /** * Perform automatic axis scaling and determine the amount and spacing of * increments. It assumes that the caller has determined the size of the * largest axis label text object prior to calling this method. * * The new axis scaling data will be stored in the VCoordinateSystem * objects. The label alignment direction for each axis will also get * determined during this process, and stored in VAxis. * * This method is invoked by `ChartView::impl_createDiagramAndContent` * soon after `initAxisUsageList`. * It initializes explicit scale and increment objects for all coordinate * systems in `m_rVCooSysList`. * This action is achieved by iterating on the `m_aAxisUsageList` container, * and performing 3 steps: * 1- call `VCoordinateSystem::prepareAutomaticAxisScaling` for setting * scaling parameters of the `aAutoScaling` member (a `ScaleAutomatism` * object) for the current `AxisUsage` instance * (see `VCoordinateSystem::prepareAutomaticAxisScaling`); * 2- calculate the explicit scale and increment objects * (see ScaleAutomatism::calculateExplicitScaleAndIncrement); * 3- set the explicit scale and increment objects for each coordinate * system. */ void doAutoScaling(ChartModel& rModel); /** * After auto-scaling is performed, call this method to set the explicit * scaling and increment data to all relevant VAxis objects. */ void updateScalesAndIncrementsOnAxes(); /** * After auto-scaling is performed, call this method to set the explicit * scaling data to all the plotters. */ void setScalesFromCooSysToPlotter(); void setNumberFormatsFromAxes(); css::drawing::Direction3D getPreferredAspectRatio(); std::vector>& getSeriesPlotterList() { return m_aSeriesPlotterList; } std::vector>& getCooSysList() { return m_rVCooSysList; } std::vector getLegendEntryProviderList(); void AdaptScaleOfYAxisWithoutAttachedSeries(ChartModel& rModel); bool isCategoryPositionShifted(const css::chart2::ScaleData& rSourceScale, bool bHasComplexCategories); static VCoordinateSystem* getCooSysForPlotter(const std::vector>& rVCooSysList, MinimumAndMaximumSupplier* pMinimumAndMaximumSupplier); static VCoordinateSystem* addCooSysToList(std::vector>& rVCooSysList, const rtl::Reference& xCooSys, ChartModel& rChartModel); static VCoordinateSystem* findInCooSysList(const std::vector>& rVCooSysList, const rtl::Reference& xCooSys); private: /** A vector of series plotters. */ std::vector> m_aSeriesPlotterList; /** A vector of coordinate systems. */ std::vector>& m_rVCooSysList; /** A map whose key is a `XAxis` interface and the related value is * an object of `AxisUsage` type. */ std::map, AxisUsage> m_aAxisUsageList; /** * Max axis index of all dimensions. Currently this can be either 0 or 1 * since we only support primary and secondary axes per dimension. The * value of 0 means all dimensions have only primary axis, while 1 means * at least one dimension has a secondary axis. */ sal_Int32 m_nMaxAxisIndex; bool m_bChartTypeUsesShiftedCategoryPositionPerDefault; sal_Int32 m_nDefaultDateNumberFormat; }; } //end chart2 namespace /* vim:set shiftwidth=4 softtabstop=4 expandtab: */