Branch data Line data Source code
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 "TitleHelper.hxx"
21 : : #include "ChartModelHelper.hxx"
22 : : #include "macros.hxx"
23 : : #include "AxisHelper.hxx"
24 : : #include "DiagramHelper.hxx"
25 : : #include <com/sun/star/chart2/XChartDocument.hpp>
26 : : #include <rtl/ustrbuf.hxx>
27 : :
28 : : //.............................................................................
29 : : namespace chart
30 : : {
31 : : //.............................................................................
32 : :
33 : : using namespace ::com::sun::star;
34 : : using namespace ::com::sun::star::chart2;
35 : : using ::com::sun::star::uno::Reference;
36 : :
37 : 17619 : uno::Reference< XTitled > lcl_getTitleParentFromDiagram(
38 : : TitleHelper::eTitleType nTitleIndex
39 : : , const uno::Reference< XDiagram >& xDiagram )
40 : : {
41 : 17619 : uno::Reference< XTitled > xResult;
42 : :
43 [ + + ][ + + ]: 17619 : if( nTitleIndex == TitleHelper::TITLE_AT_STANDARD_X_AXIS_POSITION ||
44 : : nTitleIndex == TitleHelper::TITLE_AT_STANDARD_Y_AXIS_POSITION )
45 : : {
46 : 1966 : bool bDummy = false;
47 [ + - ]: 1966 : bool bIsVertical = DiagramHelper::getVertical( xDiagram, bDummy, bDummy );
48 : :
49 [ + + ]: 1966 : if( nTitleIndex == TitleHelper::TITLE_AT_STANDARD_Y_AXIS_POSITION )
50 [ + + ]: 983 : nTitleIndex = bIsVertical ? TitleHelper::X_AXIS_TITLE : TitleHelper::Y_AXIS_TITLE;
51 : : else
52 [ + + ]: 1966 : nTitleIndex = bIsVertical ? TitleHelper::Y_AXIS_TITLE : TitleHelper::X_AXIS_TITLE;
53 : : }
54 : :
55 : :
56 [ + + + + : 17619 : switch( nTitleIndex )
+ + - ]
57 : : {
58 : : case TitleHelper::SUB_TITLE:
59 [ + + ]: 5686 : if( xDiagram.is())
60 [ + - ]: 5644 : xResult.set( xDiagram, uno::UNO_QUERY );
61 : 5686 : break;
62 : : case TitleHelper::X_AXIS_TITLE:
63 [ + + ]: 2583 : if( xDiagram.is())
64 [ + - ][ + - ]: 2541 : xResult.set( AxisHelper::getAxis( 0, true, xDiagram ), uno::UNO_QUERY );
65 : 2583 : break;
66 : : case TitleHelper::Y_AXIS_TITLE:
67 [ + + ]: 2583 : if( xDiagram.is())
68 [ + - ][ + - ]: 2541 : xResult.set( AxisHelper::getAxis( 1, true, xDiagram ), uno::UNO_QUERY );
69 : 2583 : break;
70 : : case TitleHelper::Z_AXIS_TITLE:
71 [ + + ]: 1637 : if( xDiagram.is())
72 [ + - ][ + - ]: 1595 : xResult.set( AxisHelper::getAxis( 2, true, xDiagram ), uno::UNO_QUERY );
73 : 1637 : break;
74 : : case TitleHelper::SECONDARY_X_AXIS_TITLE:
75 [ + + ]: 2565 : if( xDiagram.is())
76 [ + - ][ + - ]: 2523 : xResult.set( AxisHelper::getAxis( 0, false, xDiagram ), uno::UNO_QUERY );
77 : 2565 : break;
78 : : case TitleHelper::SECONDARY_Y_AXIS_TITLE:
79 [ + + ]: 2565 : if( xDiagram.is())
80 [ + - ][ + - ]: 2523 : xResult.set( AxisHelper::getAxis( 1, false, xDiagram ), uno::UNO_QUERY );
81 : 2565 : break;
82 : :
83 : : case TitleHelper::MAIN_TITLE:
84 : : default:
85 : : OSL_FAIL( "Unsupported Title-Type requested" );
86 : 0 : break;
87 : : }
88 : :
89 : 17619 : return xResult;
90 : : }
91 : :
92 : 28519 : uno::Reference< XTitled > lcl_getTitleParent( TitleHelper::eTitleType nTitleIndex
93 : : , const uno::Reference< frame::XModel >& xModel )
94 : : {
95 : 28519 : uno::Reference< XTitled > xResult;
96 [ + - ]: 28519 : uno::Reference< XChartDocument > xChartDoc( xModel, uno::UNO_QUERY );
97 : 28519 : uno::Reference< XDiagram > xDiagram;
98 [ + - ]: 28519 : if( xChartDoc.is())
99 [ + - ][ + - ]: 28519 : xDiagram.set( xChartDoc->getFirstDiagram());
[ + - ]
100 : :
101 [ + + - ]: 28519 : switch( nTitleIndex )
102 : : {
103 : : case TitleHelper::MAIN_TITLE:
104 [ + - ]: 10900 : xResult.set( xModel, uno::UNO_QUERY );
105 : 10900 : break;
106 : : case TitleHelper::SUB_TITLE:
107 : : case TitleHelper::X_AXIS_TITLE:
108 : : case TitleHelper::Y_AXIS_TITLE:
109 : : case TitleHelper::Z_AXIS_TITLE:
110 : : case TitleHelper::TITLE_AT_STANDARD_X_AXIS_POSITION:
111 : : case TitleHelper::TITLE_AT_STANDARD_Y_AXIS_POSITION:
112 : : case TitleHelper::SECONDARY_X_AXIS_TITLE:
113 : : case TitleHelper::SECONDARY_Y_AXIS_TITLE:
114 [ + - ][ + - ]: 17619 : xResult.set( lcl_getTitleParentFromDiagram( nTitleIndex, xDiagram ));
115 : 17619 : break;
116 : : default:
117 : : OSL_FAIL( "Unsupported Title-Type requested" );
118 : 0 : break;
119 : : }
120 : :
121 : 28519 : return xResult;
122 : : }
123 : :
124 : 28479 : uno::Reference< XTitle > TitleHelper::getTitle( TitleHelper::eTitleType nTitleIndex
125 : : , const uno::Reference< frame::XModel >& xModel )
126 : : {
127 [ + - ]: 28479 : uno::Reference< XTitled > xTitled( lcl_getTitleParent( nTitleIndex, xModel ) );
128 [ + + ]: 28479 : if( xTitled.is())
129 [ + - ][ + - ]: 21578 : return xTitled->getTitleObject();
130 [ + - ]: 28479 : return NULL;
131 : : }
132 : :
133 : 34 : uno::Reference< XTitle > TitleHelper::createTitle(
134 : : TitleHelper::eTitleType eTitleType
135 : : , const rtl::OUString& rTitleText
136 : : , const uno::Reference< frame::XModel >& xModel
137 : : , const uno::Reference< uno::XComponentContext > & xContext
138 : : , ReferenceSizeProvider * pRefSizeProvider )
139 : : {
140 : 34 : uno::Reference< XTitle > xTitle;
141 [ + - ]: 34 : uno::Reference< XTitled > xTitled( lcl_getTitleParent( eTitleType, xModel ) );
142 : :
143 [ + + ]: 34 : if( !xTitled.is() )
144 : : {
145 [ + - ]: 2 : uno::Reference< XDiagram > xDiagram( ChartModelHelper::findDiagram( xModel ) );
146 : 2 : uno::Reference< chart2::XAxis > xAxis;
147 [ - - + ]: 2 : switch( eTitleType )
148 : : {
149 : : case TitleHelper::SECONDARY_X_AXIS_TITLE:
150 [ # # ][ # # ]: 0 : xAxis = AxisHelper::createAxis( 0, false, xDiagram, xContext );
151 : 0 : break;
152 : : case TitleHelper::SECONDARY_Y_AXIS_TITLE:
153 [ # # ][ # # ]: 0 : xAxis = AxisHelper::createAxis( 1, false, xDiagram, xContext );
154 : 0 : break;
155 : : default:
156 : 2 : break;
157 : : }
158 [ + - ]: 2 : uno::Reference< beans::XPropertySet > xProps( xAxis, uno::UNO_QUERY );
159 [ - + ]: 2 : if( xProps.is() )
160 : : {
161 [ # # ][ # # ]: 0 : xProps->setPropertyValue( C2U( "Show" ), uno::makeAny( sal_False ) );
[ # # ][ # # ]
162 [ # # ][ # # ]: 0 : xTitled = lcl_getTitleParent( eTitleType, xModel );
163 : 2 : }
164 : : }
165 : :
166 [ + + ]: 34 : if(xTitled.is())
167 : : {
168 [ + - ]: 32 : uno::Reference< XDiagram > xDiagram( ChartModelHelper::findDiagram( xModel ) );
169 : :
170 [ + - ][ + - ]: 64 : xTitle.set( xContext->getServiceManager()->createInstanceWithContext(
[ + - ]
171 : : C2U( "com.sun.star.chart2.Title" ),
172 [ + - ][ + - ]: 32 : xContext ), uno::UNO_QUERY );
[ + - ]
173 : :
174 [ + - ]: 32 : if(xTitle.is())
175 : : {
176 : : // default char height (main: 13.0 == default)
177 : 32 : float fDefaultCharHeightSub = 11.0;
178 : 32 : float fDefaultCharHeightAxis = 9.0;
179 [ + + + ]: 32 : switch( eTitleType )
180 : : {
181 : : case TitleHelper::SUB_TITLE:
182 : : TitleHelper::setCompleteString(
183 [ + - ]: 10 : rTitleText, xTitle, xContext, & fDefaultCharHeightSub );
184 : 10 : break;
185 : : case TitleHelper::X_AXIS_TITLE:
186 : : case TitleHelper::Y_AXIS_TITLE:
187 : : case TitleHelper::Z_AXIS_TITLE:
188 : : case TitleHelper::TITLE_AT_STANDARD_X_AXIS_POSITION:
189 : : case TitleHelper::TITLE_AT_STANDARD_Y_AXIS_POSITION:
190 : : case TitleHelper::SECONDARY_X_AXIS_TITLE:
191 : : case TitleHelper::SECONDARY_Y_AXIS_TITLE:
192 : : TitleHelper::setCompleteString(
193 [ + - ]: 4 : rTitleText, xTitle, xContext, & fDefaultCharHeightAxis );
194 : 4 : break;
195 : : default:
196 [ + - ]: 18 : TitleHelper::setCompleteString( rTitleText, xTitle, xContext );
197 : 18 : break;
198 : : }
199 : :
200 : : // set/clear autoscale
201 [ - + ]: 32 : if( pRefSizeProvider )
202 [ # # ]: 0 : pRefSizeProvider->setValuesAtTitle( xTitle );
203 : :
204 [ + - ][ + - ]: 32 : xTitled->setTitleObject( xTitle );
205 : :
206 : : //default rotation 90 degree for y axis title in normal coordinatesystems or for x axis title for swapped coordinatesystems
207 [ + + ][ + + ]: 32 : if( eTitleType == TitleHelper::X_AXIS_TITLE ||
[ + - ][ - + ]
208 : : eTitleType == TitleHelper::Y_AXIS_TITLE ||
209 : : eTitleType == TitleHelper::SECONDARY_X_AXIS_TITLE ||
210 : : eTitleType == TitleHelper::SECONDARY_Y_AXIS_TITLE )
211 : :
212 : : {
213 : : try
214 : : {
215 : 4 : bool bDummy = false;
216 [ + - ]: 4 : bool bIsVertical = DiagramHelper::getVertical( xDiagram, bDummy, bDummy );
217 : :
218 [ + - ]: 4 : Reference< beans::XPropertySet > xTitleProps( xTitle, uno::UNO_QUERY );
219 [ + - ]: 4 : if( xTitleProps.is() )
220 : : {
221 [ + - ][ + + ]: 4 : if( (!bIsVertical && eTitleType == TitleHelper::Y_AXIS_TITLE)
[ - + ][ # # ]
[ + - ][ + - ]
[ - + ][ # # ]
222 : : || (bIsVertical && eTitleType == TitleHelper::X_AXIS_TITLE)
223 : 2 : || (!bIsVertical && eTitleType == TitleHelper::SECONDARY_Y_AXIS_TITLE)
224 : : || (bIsVertical && eTitleType == TitleHelper::SECONDARY_X_AXIS_TITLE) )
225 : : {
226 : 2 : double fNewAngleDegree = 90.0;
227 [ + - ][ + - ]: 2 : xTitleProps->setPropertyValue( C2U( "TextRotation" ), uno::makeAny( fNewAngleDegree ));
[ + - ][ + - ]
228 : : }
229 [ # # ]: 32 : }
230 : : }
231 [ # # ]: 0 : catch( const uno::Exception & ex )
232 : : {
233 : : ASSERT_EXCEPTION( ex );
234 : : }
235 : : }
236 : 32 : }
237 : : }
238 : 34 : return xTitle;
239 : :
240 : : }
241 : :
242 : 6015 : rtl::OUString TitleHelper::getCompleteString( const uno::Reference< XTitle >& xTitle )
243 : : {
244 : 6015 : rtl::OUString aRet;
245 [ + + ]: 6015 : if(!xTitle.is())
246 : : return aRet;
247 [ + - ][ + - ]: 1002 : uno::Sequence< uno::Reference< XFormattedString > > aStringList = xTitle->getText();
248 [ + + ]: 2004 : for( sal_Int32 nN=0; nN<aStringList.getLength();nN++ )
249 [ + - ][ + - ]: 1002 : aRet += aStringList[nN]->getString();
[ + - ]
250 [ + - ]: 6015 : return aRet;
251 : : }
252 : :
253 : 46 : void TitleHelper::setCompleteString( const rtl::OUString& rNewText
254 : : , const uno::Reference< XTitle >& xTitle
255 : : , const uno::Reference< uno::XComponentContext > & xContext
256 : : , float * pDefaultCharHeight /* = 0 */ )
257 : : {
258 : : //the format of the first old text portion will be maintained if there is any
259 [ + - ]: 46 : if(!xTitle.is())
260 : 46 : return;
261 : :
262 : 46 : rtl::OUString aNewText = rNewText;
263 : :
264 : 46 : bool bStacked = false;
265 [ + - ]: 46 : uno::Reference< beans::XPropertySet > xTitleProperties( xTitle, uno::UNO_QUERY );
266 [ + - ]: 46 : if( xTitleProperties.is() )
267 [ + - ][ + - ]: 46 : xTitleProperties->getPropertyValue( C2U( "StackCharacters" ) ) >>= bStacked;
[ + - ]
268 : :
269 [ - + ]: 46 : if( bStacked )
270 : : {
271 : : //#i99841# remove linebreaks that were added for vertical stacking
272 : 0 : rtl::OUStringBuffer aUnstackedStr;
273 [ # # ]: 0 : rtl::OUStringBuffer aSource(rNewText);
274 : :
275 : 0 : bool bBreakIgnored = false;
276 : 0 : sal_Int32 nLen = rNewText.getLength();
277 [ # # ]: 0 : for( sal_Int32 nPos = 0; nPos < nLen; ++nPos )
278 : : {
279 : 0 : sal_Unicode aChar = aSource[nPos];
280 [ # # ]: 0 : if( aChar != '\n' )
281 : : {
282 [ # # ]: 0 : aUnstackedStr.append( aChar );
283 : 0 : bBreakIgnored = false;
284 : : }
285 [ # # ][ # # ]: 0 : else if( aChar == '\n' && bBreakIgnored )
286 [ # # ]: 0 : aUnstackedStr.append( aChar );
287 : : else
288 : 0 : bBreakIgnored = true;
289 : : }
290 [ # # ]: 0 : aNewText = aUnstackedStr.makeStringAndClear();
291 : : }
292 : :
293 [ + - ]: 46 : uno::Sequence< uno::Reference< XFormattedString > > aNewStringList(1);
294 : :
295 [ + - ][ + - ]: 46 : uno::Sequence< uno::Reference< XFormattedString > > aOldStringList = xTitle->getText();
296 [ + + ]: 46 : if( aOldStringList.getLength() )
297 : : {
298 [ + - ][ + - ]: 14 : aNewStringList[0].set( aOldStringList[0] );
[ + - ]
299 [ + - ][ + - ]: 14 : aNewStringList[0]->setString( aNewText );
[ + - ]
300 : : }
301 : : else
302 : : {
303 : : uno::Reference< uno::XInterface > xI(
304 [ + - ][ + - ]: 64 : xContext->getServiceManager()->createInstanceWithContext(
[ + - ]
305 [ + - ][ + - ]: 32 : C2U( "com.sun.star.chart2.FormattedString" ), xContext ) );
306 [ + - ]: 32 : uno::Reference< XFormattedString > xFormattedString( xI, uno::UNO_QUERY );
307 : :
308 [ + - ]: 32 : if(xFormattedString.is())
309 : : {
310 [ + - ][ + - ]: 32 : xFormattedString->setString( aNewText );
311 [ + - ][ + - ]: 32 : aNewStringList[0].set( xFormattedString );
312 [ + + ]: 32 : if( pDefaultCharHeight != 0 )
313 : : {
314 : : try
315 : : {
316 [ + - ]: 14 : uno::Reference< beans::XPropertySet > xProp( xFormattedString, uno::UNO_QUERY_THROW );
317 : :
318 [ + - ]: 14 : uno::Any aFontSize( uno::makeAny( *pDefaultCharHeight ));
319 [ + - ][ + - ]: 14 : xProp->setPropertyValue( C2U("CharHeight"), aFontSize );
[ + - ]
320 [ + - ][ + - ]: 14 : xProp->setPropertyValue( C2U("CharHeightAsian"), aFontSize );
[ + - ]
321 [ + - ][ + - ]: 14 : xProp->setPropertyValue( C2U("CharHeightComplex"), aFontSize );
[ # # ][ + - ]
322 : : }
323 [ # # ]: 0 : catch( const uno::Exception & ex )
324 : : {
325 : : ASSERT_EXCEPTION( ex );
326 : : }
327 : : }
328 : 32 : }
329 : : }
330 [ + - ][ + - ]: 46 : xTitle->setText( aNewStringList );
[ + - ][ + - ]
331 : : }
332 : :
333 : 6 : void TitleHelper::removeTitle( TitleHelper::eTitleType nTitleIndex
334 : : , const ::com::sun::star::uno::Reference<
335 : : ::com::sun::star::frame::XModel >& xModel )
336 : : {
337 [ + - ]: 6 : uno::Reference< XTitled > xTitled( lcl_getTitleParent( nTitleIndex, xModel ) );
338 [ + - ]: 6 : if( xTitled.is())
339 : : {
340 [ + - ][ + - ]: 6 : xTitled->setTitleObject(NULL);
[ + - ]
341 : 6 : }
342 : 6 : }
343 : :
344 : 5339 : bool TitleHelper::getTitleType( eTitleType& rType
345 : : , const ::com::sun::star::uno::Reference<
346 : : ::com::sun::star::chart2::XTitle >& xTitle
347 : : , const ::com::sun::star::uno::Reference<
348 : : ::com::sun::star::frame::XModel >& xModel )
349 : : {
350 [ + - ][ - + ]: 5339 : if( !xTitle.is() || !xModel.is() )
[ - + ]
351 : 0 : return false;
352 : :
353 : 5339 : Reference< chart2::XTitle > xCurrentTitle;
354 [ + - ]: 7410 : for( sal_Int32 nTitleType = TITLE_BEGIN; nTitleType < NORMAL_TITLE_END; nTitleType++ )
355 : : {
356 [ + - ][ + - ]: 7410 : xCurrentTitle = TitleHelper::getTitle( static_cast<eTitleType>(nTitleType), xModel );
357 [ + + ][ + - ]: 7410 : if( xCurrentTitle == xTitle )
358 : : {
359 : 5339 : rType = static_cast<eTitleType>(nTitleType);
360 : 5339 : return true;
361 : : }
362 : : }
363 : :
364 : 5339 : return false;
365 : : }
366 : :
367 : : //.............................................................................
368 : : } //namespace chart
369 : : //.............................................................................
370 : :
371 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|