1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 #ifndef CHART2_DIAGRAMHELPER_HXX
24 #define CHART2_DIAGRAMHELPER_HXX
25 
26 #include "StackMode.hxx"
27 #include "charttoolsdllapi.hxx"
28 #include <com/sun/star/chart2/XAxis.hpp>
29 #include <com/sun/star/chart2/XDiagram.hpp>
30 #include <com/sun/star/chart2/XChartTypeTemplate.hpp>
31 #include <com/sun/star/chart2/XCoordinateSystem.hpp>
32 #include <com/sun/star/chart2/InterpretedData.hpp>
33 #include <com/sun/star/chart2/StackingDirection.hpp>
34 #include <com/sun/star/chart2/XChartDocument.hpp>
35 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
36 #include <com/sun/star/uno/XComponentContext.hpp>
37 #include <com/sun/star/util/XNumberFormats.hpp>
38 #include <com/sun/star/util/XNumberFormatsSupplier.hpp>
39 
40 #include <utility>
41 #include <vector>
42 
43 
44 namespace chart
45 {
46 
47 enum DiagramPositioningMode
48 {
49     DiagramPositioningMode_AUTO,
50     DiagramPositioningMode_EXCLUDING,
51     DiagramPositioningMode_INCLUDING
52 };
53 
54 class OOO_DLLPUBLIC_CHARTTOOLS DiagramHelper
55 {
56 public:
57     typedef ::std::pair<
58             ::com::sun::star::uno::Reference<
59                 ::com::sun::star::chart2::XChartTypeTemplate >,
60             ::rtl::OUString >
61         tTemplateWithServiceName;
62 
63     /** tries to find a template in the chart-type manager that matches the
64         given diagram.
65 
66         @param rPreferredTemplateName
67             Check this template first.  This may speed up searching, if the
68             caller assumes a certain template as most likely to be the one that
69             matches.
70 
71         @return
72             A pair containing a template with the correct properties set as
73             first entry and the service name of the templateas second entry.  If
74             no template was found both elements are empty.
75      */
76     static tTemplateWithServiceName
77         getTemplateForDiagram(
78             const ::com::sun::star::uno::Reference<
79                 ::com::sun::star::chart2::XDiagram > & xDiagram,
80             const ::com::sun::star::uno::Reference<
81                 ::com::sun::star::lang::XMultiServiceFactory > & xChartTypeManager,
82             const ::rtl::OUString & rPreferredTemplateName = ::rtl::OUString());
83 
84     /** Sets the "SwapXAndYAxis" property at all coordinate systems found in the
85         given diagram.
86 
87         "vertical==true" for bar charts, "vertical==false" for column charts
88      */
89     static void setVertical( const ::com::sun::star::uno::Reference<
90                                  ::com::sun::star::chart2::XDiagram > & xDiagram,
91                              bool bVertical = true );
92 
93     /** Gets the "SwapXAndYAxis" property at all coordinate systems found in the
94         given diagram.
95 
96         "vertical==true" for bar charts, "vertical==false" for column charts
97     */
98     static bool getVertical( const ::com::sun::star::uno::Reference<
99                                  ::com::sun::star::chart2::XDiagram > & xDiagram,
100                              bool& rbOutFoundResult, bool& rbOutAmbiguousResult );
101 
102     static StackMode getStackMode(
103         const ::com::sun::star::uno::Reference<
104             ::com::sun::star::chart2::XDiagram > & xDiagram,
105         bool& rbFound, bool& rbAmbiguous
106         );
107 
108     /** @param bOnlyAtFirstChartType
109             If </sal_True>, the stacking mode is only set at the series found inside
110             the first chart type.  This is the standard for all current
111             templates (the only template that has more than one chart-type and
112             allows stacking is bar/line combi, and for this the stacking only
113             applies to the first chart type/the bars)
114      */
115     static void setStackMode(
116         const ::com::sun::star::uno::Reference<
117             ::com::sun::star::chart2::XDiagram > & xDiagram,
118         StackMode eStackMode,
119         bool bOnlyAtFirstChartType = true
120         );
121 
122     /** Retrieves the stackmode of the first DataSeries or none. If the series have differing stack
123         modes, rbAmbiguous is set to true. If no series is there rbFound is set to false.
124 
125         @param xCorrespondingCoordinateSystem
126             The coordinate system in which the given chart type xChartType is
127             located.  (This is needed for determining percent stacking.  If
128             omitted, the result will just indicate "not stacked", "stacked" or
129             "ambiguous")
130      */
131     static StackMode getStackModeFromChartType(
132         const ::com::sun::star::uno::Reference<
133             ::com::sun::star::chart2::XChartType > & xChartType,
134         bool& rbFound, bool& rbAmbiguous,
135         const ::com::sun::star::uno::Reference<
136             ::com::sun::star::chart2::XCoordinateSystem > & xCorrespondingCoordinateSystem =
137                 ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XCoordinateSystem >()
138         );
139 
140     /** Returns the dimension found for all chart types in the tree.  If the
141         dimension is not unique, 0 is returned.
142      */
143     static sal_Int32 getDimension(
144         const ::com::sun::star::uno::Reference<
145             ::com::sun::star::chart2::XDiagram > & xDiagram );
146 
147     /** Sets the dimension of the diagram given.
148 
149         1. Sets the dimension of all used ChartTypes
150         2. Adapts the DataSeriesTree to reflect the new dimension
151         3. If new coordinate-systems have to be created, adapts the
152            XCoordinateSystemContainer of the diagram.
153      */
154     static void setDimension(
155         const ::com::sun::star::uno::Reference<
156             ::com::sun::star::chart2::XDiagram > & xDiagram,
157         sal_Int32 nNewDimensionCount );
158 
159     /** Replaces all occurrences of xCooSysToReplace in the tree with
160         xReplacement in the diagram's tree
161      */
162     SAL_DLLPRIVATE static void replaceCoordinateSystem(
163         const ::com::sun::star::uno::Reference<
164             ::com::sun::star::chart2::XDiagram > & xDiagram,
165         const ::com::sun::star::uno::Reference<
166             ::com::sun::star::chart2::XCoordinateSystem > & xCooSysToReplace,
167         const ::com::sun::star::uno::Reference<
168             ::com::sun::star::chart2::XCoordinateSystem > & xReplacement );
169 
170     static bool isSeriesAttachedToMainAxis(
171 		const ::com::sun::star::uno::Reference<
172             ::com::sun::star::chart2::XDataSeries >& xDataSeries );
173 
174     static bool attachSeriesToAxis( bool bMainAxis,
175         const ::com::sun::star::uno::Reference<
176 	        ::com::sun::star::chart2::XDataSeries >& xSeries,
177         const ::com::sun::star::uno::Reference<
178             ::com::sun::star::chart2::XDiagram >& xDiagram,
179         const ::com::sun::star::uno::Reference<
180             ::com::sun::star::uno::XComponentContext > & xContext,
181         bool bAdaptAxes=true );
182 
183     static ::com::sun::star::uno::Reference<
184 	        ::com::sun::star::chart2::XAxis > getAttachedAxis(
185         const ::com::sun::star::uno::Reference<
186 	        ::com::sun::star::chart2::XDataSeries >& xSeries,
187         const ::com::sun::star::uno::Reference<
188             ::com::sun::star::chart2::XDiagram >& xDiagram );
189 
190     static ::com::sun::star::uno::Reference<
191 	        ::com::sun::star::chart2::XChartType >
192 		getChartTypeOfSeries(
193 			const ::com::sun::star::uno::Reference<
194                 ::com::sun::star::chart2::XDiagram >& xDiagram,
195 			const ::com::sun::star::uno::Reference<
196 	            ::com::sun::star::chart2::XDataSeries >& xSeries );
197 
198     static ::std::vector<
199             ::com::sun::star::uno::Reference<
200             ::com::sun::star::chart2::XDataSeries > >
201         getDataSeriesFromDiagram(
202             const ::com::sun::star::uno::Reference<
203             ::com::sun::star::chart2::XDiagram > & xDiagram );
204 
205     /** return all data series in this diagram grouped by chart-types
206      */
207     static ::com::sun::star::uno::Sequence<
208                ::com::sun::star::uno::Sequence<
209                    ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XDataSeries > > >
210         getDataSeriesGroups(
211             const ::com::sun::star::uno::Reference<
212             ::com::sun::star::chart2::XDiagram > & xDiagram );
213 
214     static bool isCategoryDiagram(
215             const ::com::sun::star::uno::Reference<
216                 ::com::sun::star::chart2::XDiagram >& xDiagram );
217 
218     static void setCategoriesToDiagram(
219             const ::com::sun::star::uno::Reference<
220                 ::com::sun::star::chart2::data::XLabeledDataSequence >& xCategories,
221             const ::com::sun::star::uno::Reference<
222                 ::com::sun::star::chart2::XDiagram >& xDiagram,
223             bool bSetAxisType = false, // when this flag is true ...
224             bool bCategoryAxis = true);// set the AxisType to CATEGORY or back to REALNUMBER
225 
226     static ::com::sun::star::uno::Reference< ::com::sun::star::chart2::data::XLabeledDataSequence >
227         getCategoriesFromDiagram(
228             const ::com::sun::star::uno::Reference<
229                 ::com::sun::star::chart2::XDiagram > & xDiagram );
230 
231     static ::com::sun::star::uno::Sequence< rtl::OUString >
232         getExplicitSimpleCategories(
233             const ::com::sun::star::uno::Reference<
234                 ::com::sun::star::chart2::XChartDocument > & xChartDoc );
235 
236     SAL_DLLPRIVATE static ::com::sun::star::uno::Sequence< rtl::OUString >
237         generateAutomaticCategoriesFromCooSys(
238             const ::com::sun::star::uno::Reference<
239                 ::com::sun::star::chart2::XCoordinateSystem > & xCooSys );
240 
241     static void switchToDateCategories(
242         const ::com::sun::star::uno::Reference<
243                 ::com::sun::star::chart2::XChartDocument > & xChartDoc );
244 
245     static void switchToTextCategories(
246         const ::com::sun::star::uno::Reference<
247                 ::com::sun::star::chart2::XChartDocument > & xChartDoc );
248 
249     static bool isSupportingDateAxis( const ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XDiagram >& xDiagram );
250     static bool isDateNumberFormat( sal_Int32 nNumberFormat, const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormats >& xNumberFormats );
251     static sal_Int32 getDateNumberFormat( const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatsSupplier >& xNumberFormatsSupplier );
252 
253     static sal_Int32 getPercentNumberFormat( const ::com::sun::star::uno::Reference<
254                 ::com::sun::star::util::XNumberFormatsSupplier >& xNumberFormatsSupplier );
255 
256     static ::com::sun::star::uno::Reference<
257             ::com::sun::star::chart2::XChartType >
258         getChartTypeByIndex( const ::com::sun::star::uno::Reference<
259             ::com::sun::star::chart2::XDiagram >& xDiagram, sal_Int32 nIndex );
260 
261     static ::com::sun::star::uno::Sequence<
262             ::com::sun::star::uno::Reference<
263                 ::com::sun::star::chart2::XChartType > >
264         getChartTypesFromDiagram(
265             const ::com::sun::star::uno::Reference<
266                 ::com::sun::star::chart2::XDiagram > & xDiagram );
267 
268     SAL_DLLPRIVATE static bool areChartTypesCompatible( const ::com::sun::star::uno::Reference<
269                 ::com::sun::star::chart2::XChartType >& xFirstType,
270                 const ::com::sun::star::uno::Reference<
271                 ::com::sun::star::chart2::XChartType >& xSecondType );
272 
273 
274     /**
275         * Test if a series can be moved.
276         *
277         * @param xDiagram
278         *  Reference to the diagram that contains the series.
279         *
280         * @param xGivenDataSeries
281         *  Reference to the series that should be tested for moving.
282         *
283         * @param bForward
284         *  Direction of the move to be checked.
285         *
286         * @returns </sal_True> if the series can be moved.
287         *
288         */
289     static bool isSeriesMoveable(
290             const ::com::sun::star::uno::Reference<
291                 ::com::sun::star::chart2::XDiagram >& xDiagram,
292             const ::com::sun::star::uno::Reference<
293         ::com::sun::star::chart2::XDataSeries >& xGivenDataSeries,
294             bool bForward );
295 
296     /**
297         * Move a series forward or backward.
298         *
299         * @param xDiagram
300         *  Reference to the diagram that contains the series.
301         *
302         * @param xGivenDataSeries
303         *  Reference to the series that should be moved.
304         *
305         * @param bForward
306         *  Direction in which the series should be moved.
307         *
308         * @returns </sal_True> if the series was moved successfully.
309         *
310         */
311     static bool moveSeries(
312                 const ::com::sun::star::uno::Reference<
313                   ::com::sun::star::chart2::XDiagram >& xDiagram,
314                 const ::com::sun::star::uno::Reference<
315           ::com::sun::star::chart2::XDataSeries >& xGivenDataSeries,
316                 bool bForward );
317 
318     static bool isSupportingFloorAndWall( const ::com::sun::star::uno::Reference<
319                 ::com::sun::star::chart2::XDiagram > & xDiagram );
320 
321     static bool isPieOrDonutChart( const ::com::sun::star::uno::Reference<
322                 ::com::sun::star::chart2::XDiagram >& xDiagram );
323 
324     static sal_Int32 getGeometry3D(
325         const ::com::sun::star::uno::Reference<
326             ::com::sun::star::chart2::XDiagram > & xDiagram,
327         bool& rbFound, bool& rbAmbiguous );
328 
329     static void setGeometry3D(
330         const ::com::sun::star::uno::Reference<
331             ::com::sun::star::chart2::XDiagram > & xDiagram,
332         sal_Int32 nNewGeometry );
333 
334     //returns integer from constant group ::com::sun::star::chart::MissingValueTreatment
335     static sal_Int32 getCorrectedMissingValueTreatment(
336             const ::com::sun::star::uno::Reference<
337                 ::com::sun::star::chart2::XDiagram > & xDiagram,
338             const ::com::sun::star::uno::Reference<
339                 ::com::sun::star::chart2::XChartType >& xChartType );
340 
341     static DiagramPositioningMode getDiagramPositioningMode( const ::com::sun::star::uno::Reference<
342                 ::com::sun::star::chart2::XDiagram > & xDiagram );
343 
344     static bool setDiagramPositioning( const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel >& xChartModel,
345         const ::com::sun::star::awt::Rectangle& rPosRect /*100th mm*/ );
346 
347     static ::com::sun::star::awt::Rectangle getDiagramRectangleFromModel( const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel >& xChartModel );
348 
349     static bool switchDiagramPositioningToExcludingPositioning( const ::com::sun::star::uno::Reference<
350         ::com::sun::star::frame::XModel >& xChartModel
351         , bool bResetModifiedState //set model back to unchanged if it was unchanged before
352         , bool bConvertAlsoFromAutoPositioning );
353 
354 private:
355     // not implemented
356     DiagramHelper();
357 
358 };
359 
360 } //  namespace chart
361 
362 // CHART2_DIAGRAMHELPER_HXX
363 #endif
364