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