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 "CharacterPropertyItemConverter.hxx"
21 : #include "SchWhichPairs.hxx"
22 : #include "macros.hxx"
23 : #include "ItemPropertyMap.hxx"
24 : #include "RelativeSizeHelper.hxx"
25 : #include <editeng/memberids.hrc>
26 : #include <editeng/eeitem.hxx>
27 : #include <editeng/udlnitem.hxx>
28 : #include <editeng/fontitem.hxx>
29 : #include <editeng/crossedoutitem.hxx>
30 : #include <editeng/postitem.hxx>
31 : #include <editeng/wghtitem.hxx>
32 : #include <editeng/fhgtitem.hxx>
33 : #include <svl/stritem.hxx>
34 :
35 : #include <com/sun/star/beans/XPropertyState.hpp>
36 : #include <com/sun/star/chart2/XFormattedString.hpp>
37 :
38 : using namespace ::com::sun::star;
39 :
40 : namespace
41 : {
42 0 : ::comphelper::ItemPropertyMapType & lcl_GetCharacterPropertyPropertyMap()
43 : {
44 : static ::comphelper::ItemPropertyMapType aCharacterPropertyMap(
45 : ::comphelper::MakeItemPropertyMap
46 : IPM_MAP_ENTRY( EE_CHAR_COLOR, "CharColor", 0 )
47 0 : IPM_MAP_ENTRY( EE_CHAR_LANGUAGE, "CharLocale", MID_LANG_LOCALE )
48 0 : IPM_MAP_ENTRY( EE_CHAR_LANGUAGE_CJK, "CharLocaleAsian", MID_LANG_LOCALE )
49 0 : IPM_MAP_ENTRY( EE_CHAR_LANGUAGE_CTL, "CharLocaleComplex", MID_LANG_LOCALE )
50 :
51 0 : IPM_MAP_ENTRY( EE_CHAR_STRIKEOUT, "CharStrikeout", MID_CROSS_OUT )
52 0 : IPM_MAP_ENTRY( EE_CHAR_WLM, "CharWordMode", 0 )
53 0 : IPM_MAP_ENTRY( EE_CHAR_SHADOW, "CharShadowed", 0 )
54 0 : IPM_MAP_ENTRY( EE_CHAR_RELIEF, "CharRelief", 0 )
55 0 : IPM_MAP_ENTRY( EE_CHAR_OUTLINE, "CharContoured", 0 )
56 0 : IPM_MAP_ENTRY( EE_CHAR_EMPHASISMARK, "CharEmphasis", 0 )
57 :
58 0 : IPM_MAP_ENTRY( EE_PARA_WRITINGDIR, "WritingMode", 0 )
59 :
60 0 : IPM_MAP_ENTRY( EE_PARA_ASIANCJKSPACING, "ParaIsCharacterDistance", 0 )
61 0 : );
62 :
63 0 : return aCharacterPropertyMap;
64 : }
65 : } // anonymous namespace
66 :
67 : namespace chart
68 : {
69 : namespace wrapper
70 : {
71 :
72 0 : CharacterPropertyItemConverter::CharacterPropertyItemConverter(
73 : const uno::Reference< beans::XPropertySet > & rPropertySet,
74 : SfxItemPool& rItemPool ) :
75 0 : ItemConverter( rPropertySet, rItemPool )
76 0 : {}
77 :
78 : SAL_WNODEPRECATED_DECLARATIONS_PUSH
79 0 : CharacterPropertyItemConverter::CharacterPropertyItemConverter(
80 : const uno::Reference< beans::XPropertySet > & rPropertySet,
81 : SfxItemPool& rItemPool,
82 : ::std::auto_ptr< awt::Size > pRefSize,
83 : const OUString & rRefSizePropertyName,
84 : const uno::Reference< beans::XPropertySet > & rRefSizePropSet ) :
85 : ItemConverter( rPropertySet, rItemPool ),
86 : m_pRefSize( pRefSize ),
87 : m_aRefSizePropertyName( rRefSizePropertyName ),
88 0 : m_xRefSizePropSet( rRefSizePropSet.is() ? rRefSizePropSet : rPropertySet )
89 0 : {}
90 : SAL_WNODEPRECATED_DECLARATIONS_POP
91 :
92 0 : CharacterPropertyItemConverter::~CharacterPropertyItemConverter()
93 0 : {}
94 :
95 0 : const sal_uInt16 * CharacterPropertyItemConverter::GetWhichPairs() const
96 : {
97 0 : return nCharacterPropertyWhichPairs;
98 : }
99 :
100 0 : bool CharacterPropertyItemConverter::GetItemProperty( tWhichIdType nWhichId, tPropertyNameWithMemberId & rOutProperty ) const
101 : {
102 0 : ::comphelper::ItemPropertyMapType & rMap( lcl_GetCharacterPropertyPropertyMap());
103 0 : ::comphelper::ItemPropertyMapType::const_iterator aIt( rMap.find( nWhichId ));
104 :
105 0 : if( aIt == rMap.end())
106 0 : return false;
107 :
108 0 : rOutProperty =(*aIt).second;
109 0 : return true;
110 : }
111 :
112 0 : void CharacterPropertyItemConverter::FillSpecialItem(
113 : sal_uInt16 nWhichId, SfxItemSet & rOutItemSet ) const
114 : throw( uno::Exception )
115 : {
116 0 : switch( nWhichId )
117 : {
118 : case EE_CHAR_FONTINFO:
119 : case EE_CHAR_FONTINFO_CJK:
120 : case EE_CHAR_FONTINFO_CTL:
121 : {
122 0 : OUString aPostfix;
123 0 : if( nWhichId == EE_CHAR_FONTINFO_CJK )
124 0 : aPostfix = "Asian";
125 0 : else if( nWhichId == EE_CHAR_FONTINFO_CTL )
126 0 : aPostfix = "Complex";
127 :
128 0 : SvxFontItem aItem( nWhichId );
129 :
130 0 : aItem.PutValue( GetPropertySet()->getPropertyValue( "CharFontName" + aPostfix),
131 0 : MID_FONT_FAMILY_NAME );
132 0 : aItem.PutValue( GetPropertySet()->getPropertyValue( "CharFontFamily" + aPostfix),
133 0 : MID_FONT_FAMILY );
134 0 : aItem.PutValue( GetPropertySet()->getPropertyValue( "CharFontStyleName" + aPostfix),
135 0 : MID_FONT_STYLE_NAME );
136 0 : aItem.PutValue( GetPropertySet()->getPropertyValue( "CharFontCharSet" + aPostfix),
137 0 : MID_FONT_CHAR_SET );
138 0 : aItem.PutValue( GetPropertySet()->getPropertyValue( "CharFontPitch" + aPostfix),
139 0 : MID_FONT_PITCH );
140 :
141 0 : rOutItemSet.Put( aItem );
142 : }
143 0 : break;
144 :
145 : case EE_CHAR_UNDERLINE:
146 : {
147 0 : SvxUnderlineItem aItem(UNDERLINE_NONE, EE_CHAR_UNDERLINE);
148 0 : bool bModified = false;
149 :
150 0 : uno::Any aValue( GetPropertySet()->getPropertyValue( "CharUnderline" ));
151 0 : if( aValue.hasValue())
152 : {
153 0 : aItem.PutValue( aValue, MID_TL_STYLE );
154 0 : bModified = true;
155 : }
156 :
157 0 : aValue = GetPropertySet()->getPropertyValue( "CharUnderlineHasColor" );
158 0 : if( aValue.hasValue() &&
159 0 : ( *reinterpret_cast< const sal_Bool * >( aValue.getValue()) != sal_False ))
160 : {
161 0 : aItem.PutValue( aValue, MID_TL_HASCOLOR );
162 0 : bModified = true;
163 : }
164 :
165 0 : aValue = GetPropertySet()->getPropertyValue( "CharUnderlineColor" );
166 0 : if( aValue.hasValue())
167 : {
168 0 : aItem.PutValue( aValue, MID_TL_COLOR );
169 0 : bModified = true;
170 : }
171 :
172 0 : if( bModified )
173 0 : rOutItemSet.Put( aItem );
174 : }
175 0 : break;
176 :
177 : case EE_CHAR_OVERLINE:
178 : {
179 0 : SvxOverlineItem aItem( UNDERLINE_NONE, EE_CHAR_OVERLINE );
180 0 : bool bModified = false;
181 :
182 0 : uno::Any aValue( GetPropertySet()->getPropertyValue( "CharOverline" ) );
183 0 : if ( aValue.hasValue() )
184 : {
185 0 : aItem.PutValue( aValue, MID_TL_STYLE );
186 0 : bModified = true;
187 : }
188 :
189 0 : aValue = GetPropertySet()->getPropertyValue( "CharOverlineHasColor" );
190 0 : if ( aValue.hasValue() &&
191 0 : ( *reinterpret_cast< const sal_Bool* >( aValue.getValue() ) != sal_False ) )
192 : {
193 0 : aItem.PutValue( aValue, MID_TL_HASCOLOR );
194 0 : bModified = true;
195 : }
196 :
197 0 : aValue = GetPropertySet()->getPropertyValue( "CharOverlineColor" );
198 0 : if ( aValue.hasValue() )
199 : {
200 0 : aItem.PutValue( aValue, MID_TL_COLOR );
201 0 : bModified = true;
202 : }
203 :
204 0 : if ( bModified )
205 : {
206 0 : rOutItemSet.Put( aItem );
207 0 : }
208 : }
209 0 : break;
210 :
211 : case EE_CHAR_ITALIC:
212 : case EE_CHAR_ITALIC_CJK:
213 : case EE_CHAR_ITALIC_CTL:
214 : {
215 0 : OUString aPostfix;
216 0 : if( nWhichId == EE_CHAR_ITALIC_CJK )
217 0 : aPostfix = "Asian";
218 0 : else if( nWhichId == EE_CHAR_ITALIC_CTL )
219 0 : aPostfix = "Complex";
220 :
221 0 : SvxPostureItem aItem( ITALIC_NONE, nWhichId );
222 :
223 0 : uno::Any aValue( GetPropertySet()->getPropertyValue( "CharPosture" + aPostfix));
224 0 : if( aValue.hasValue())
225 : {
226 0 : aItem.PutValue( aValue, MID_POSTURE );
227 0 : rOutItemSet.Put( aItem );
228 0 : }
229 : }
230 0 : break;
231 :
232 : case EE_CHAR_WEIGHT:
233 : case EE_CHAR_WEIGHT_CJK:
234 : case EE_CHAR_WEIGHT_CTL:
235 : {
236 0 : OUString aPostfix;
237 0 : if( nWhichId == EE_CHAR_WEIGHT_CJK )
238 0 : aPostfix = "Asian";
239 0 : else if( nWhichId == EE_CHAR_WEIGHT_CTL )
240 0 : aPostfix = "Complex";
241 :
242 0 : SvxWeightItem aItem( WEIGHT_NORMAL, nWhichId );
243 :
244 0 : uno::Any aValue( GetPropertySet()->getPropertyValue( "CharWeight" + aPostfix));
245 0 : if( aValue.hasValue())
246 : {
247 0 : aItem.PutValue( aValue, MID_WEIGHT );
248 0 : rOutItemSet.Put( aItem );
249 0 : }
250 : }
251 0 : break;
252 :
253 : case EE_CHAR_FONTHEIGHT:
254 : case EE_CHAR_FONTHEIGHT_CJK:
255 : case EE_CHAR_FONTHEIGHT_CTL:
256 : {
257 0 : OUString aPostfix;
258 0 : if( nWhichId == EE_CHAR_FONTHEIGHT_CJK )
259 0 : aPostfix = "Asian";
260 0 : else if( nWhichId == EE_CHAR_FONTHEIGHT_CTL )
261 0 : aPostfix = "Complex";
262 :
263 0 : SvxFontHeightItem aItem( 240, 100, nWhichId );
264 :
265 : try
266 : {
267 0 : uno::Any aValue( GetPropertySet()->getPropertyValue( "CharHeight" + aPostfix ));
268 : float fHeight;
269 0 : if( aValue >>= fHeight )
270 : {
271 0 : if( m_pRefSize.get())
272 : {
273 0 : awt::Size aOldRefSize;
274 0 : if( GetRefSizePropertySet()->getPropertyValue( m_aRefSizePropertyName ) >>= aOldRefSize )
275 : {
276 : // calculate font height in view
277 : fHeight = static_cast< float >(
278 0 : RelativeSizeHelper::calculate( fHeight, aOldRefSize, *m_pRefSize ));
279 0 : aValue <<= fHeight;
280 : }
281 : }
282 :
283 0 : aItem.PutValue( aValue, MID_FONTHEIGHT );
284 0 : rOutItemSet.Put( aItem );
285 0 : }
286 : }
287 0 : catch( const uno::Exception & ex )
288 : {
289 : ASSERT_EXCEPTION( ex );
290 0 : }
291 : }
292 0 : break;
293 :
294 : case SID_CHAR_DLG_PREVIEW_STRING:
295 : {
296 0 : uno::Reference< chart2::XFormattedString > xFormattedString( GetPropertySet(), uno::UNO_QUERY );
297 0 : if( xFormattedString.is() )
298 : {
299 0 : OUString aString = xFormattedString->getString();
300 0 : rOutItemSet.Put( SfxStringItem( nWhichId, aString ) );
301 : }
302 : else
303 0 : rOutItemSet.Put( SfxStringItem( nWhichId, OUString("") ) );
304 : }
305 0 : break;
306 :
307 : case EE_PARA_FORBIDDENRULES:
308 : case EE_PARA_HANGINGPUNCTUATION:
309 0 : rOutItemSet.DisableItem( nWhichId );
310 0 : break;
311 : }
312 0 : }
313 :
314 0 : bool CharacterPropertyItemConverter::ApplySpecialItem(
315 : sal_uInt16 nWhichId, const SfxItemSet & rItemSet )
316 : throw( uno::Exception )
317 : {
318 0 : bool bChanged = false;
319 0 : uno::Any aValue;
320 :
321 0 : switch( nWhichId )
322 : {
323 : case EE_CHAR_FONTINFO:
324 : case EE_CHAR_FONTINFO_CJK:
325 : case EE_CHAR_FONTINFO_CTL:
326 : {
327 0 : OUString aPostfix;
328 0 : if( nWhichId == EE_CHAR_FONTINFO_CJK )
329 0 : aPostfix = "Asian";
330 0 : else if( nWhichId == EE_CHAR_FONTINFO_CTL )
331 0 : aPostfix = "Complex";
332 :
333 : const SvxFontItem & rItem =
334 : static_cast< const SvxFontItem & >(
335 0 : rItemSet.Get( nWhichId ));
336 :
337 0 : if( rItem.QueryValue( aValue, MID_FONT_FAMILY_NAME ))
338 : {
339 0 : if( aValue != GetPropertySet()->getPropertyValue( "CharFontName" + aPostfix ))
340 : {
341 0 : GetPropertySet()->setPropertyValue( "CharFontName" + aPostfix, aValue );
342 0 : bChanged = true;
343 : }
344 : }
345 0 : if( rItem.QueryValue( aValue, MID_FONT_FAMILY ))
346 : {
347 0 : if( aValue != GetPropertySet()->getPropertyValue( "CharFontFamily" + aPostfix ))
348 : {
349 0 : GetPropertySet()->setPropertyValue( "CharFontFamily" + aPostfix, aValue );
350 0 : bChanged = true;
351 : }
352 : }
353 0 : if( rItem.QueryValue( aValue, MID_FONT_STYLE_NAME ))
354 : {
355 0 : if( aValue != GetPropertySet()->getPropertyValue( "CharFontStyleName" + aPostfix ))
356 : {
357 0 : GetPropertySet()->setPropertyValue( "CharFontStyleName" + aPostfix, aValue );
358 0 : bChanged = true;
359 : }
360 : }
361 0 : if( rItem.QueryValue( aValue, MID_FONT_CHAR_SET ))
362 : {
363 0 : if( aValue != GetPropertySet()->getPropertyValue( "CharFontCharSet" + aPostfix ))
364 : {
365 0 : GetPropertySet()->setPropertyValue( "CharFontCharSet" + aPostfix, aValue );
366 0 : bChanged = true;
367 : }
368 : }
369 0 : if( rItem.QueryValue( aValue, MID_FONT_PITCH ))
370 : {
371 0 : if( aValue != GetPropertySet()->getPropertyValue( "CharFontPitch" + aPostfix ))
372 : {
373 0 : GetPropertySet()->setPropertyValue( "CharFontPitch" + aPostfix, aValue );
374 0 : bChanged = true;
375 : }
376 0 : }
377 : }
378 0 : break;
379 :
380 : case EE_CHAR_UNDERLINE:
381 : {
382 : const SvxUnderlineItem & rItem =
383 : static_cast< const SvxUnderlineItem & >(
384 0 : rItemSet.Get( nWhichId ));
385 :
386 0 : if( rItem.QueryValue( aValue, MID_TL_STYLE ))
387 : {
388 0 : if( aValue != GetPropertySet()->getPropertyValue( "CharUnderline" ))
389 : {
390 0 : GetPropertySet()->setPropertyValue( "CharUnderline" , aValue );
391 0 : bChanged = true;
392 : }
393 : }
394 :
395 0 : if( rItem.QueryValue( aValue, MID_TL_COLOR ))
396 : {
397 0 : if( aValue != GetPropertySet()->getPropertyValue( "CharUnderlineColor" ))
398 : {
399 0 : GetPropertySet()->setPropertyValue( "CharUnderlineColor" , aValue );
400 0 : bChanged = true;
401 : }
402 : }
403 :
404 0 : if( rItem.QueryValue( aValue, MID_TL_HASCOLOR ))
405 : {
406 0 : if( aValue != GetPropertySet()->getPropertyValue( "CharUnderlineHasColor" ))
407 : {
408 0 : GetPropertySet()->setPropertyValue( "CharUnderlineHasColor" , aValue );
409 0 : bChanged = true;
410 : }
411 : }
412 : }
413 0 : break;
414 :
415 : case EE_CHAR_OVERLINE:
416 : {
417 0 : const SvxOverlineItem& rItem = static_cast< const SvxOverlineItem & >( rItemSet.Get( nWhichId ) );
418 :
419 0 : if ( rItem.QueryValue( aValue, MID_TL_STYLE ) )
420 : {
421 0 : if ( aValue != GetPropertySet()->getPropertyValue( "CharOverline" ) )
422 : {
423 0 : GetPropertySet()->setPropertyValue( "CharOverline" , aValue );
424 0 : bChanged = true;
425 : }
426 : }
427 :
428 0 : if ( rItem.QueryValue( aValue, MID_TL_COLOR ) )
429 : {
430 0 : if ( aValue != GetPropertySet()->getPropertyValue( "CharOverlineColor" ) )
431 : {
432 0 : GetPropertySet()->setPropertyValue( "CharOverlineColor" , aValue );
433 0 : bChanged = true;
434 : }
435 : }
436 :
437 0 : if ( rItem.QueryValue( aValue, MID_TL_HASCOLOR ) )
438 : {
439 0 : if ( aValue != GetPropertySet()->getPropertyValue( "CharOverlineHasColor" ) )
440 : {
441 0 : GetPropertySet()->setPropertyValue( "CharOverlineHasColor" , aValue );
442 0 : bChanged = true;
443 : }
444 : }
445 : }
446 0 : break;
447 :
448 : case EE_CHAR_ITALIC:
449 : case EE_CHAR_ITALIC_CJK:
450 : case EE_CHAR_ITALIC_CTL:
451 : {
452 0 : OUString aPostfix;
453 0 : if( nWhichId == EE_CHAR_ITALIC_CJK )
454 0 : aPostfix = "Asian";
455 0 : else if( nWhichId == EE_CHAR_ITALIC_CTL )
456 0 : aPostfix = "Complex";
457 :
458 : const SvxPostureItem & rItem =
459 : static_cast< const SvxPostureItem & >(
460 0 : rItemSet.Get( nWhichId ));
461 :
462 0 : if( rItem.QueryValue( aValue, MID_POSTURE ))
463 : {
464 0 : if( aValue != GetPropertySet()->getPropertyValue( "CharPosture" + aPostfix))
465 : {
466 0 : GetPropertySet()->setPropertyValue( "CharPosture" + aPostfix, aValue );
467 0 : bChanged = true;
468 : }
469 0 : }
470 : }
471 0 : break;
472 :
473 : case EE_CHAR_WEIGHT:
474 : case EE_CHAR_WEIGHT_CJK:
475 : case EE_CHAR_WEIGHT_CTL:
476 : {
477 0 : OUString aPostfix;
478 0 : if( nWhichId == EE_CHAR_WEIGHT_CJK )
479 0 : aPostfix = "Asian" ;
480 0 : else if( nWhichId == EE_CHAR_WEIGHT_CTL )
481 0 : aPostfix = "Complex";
482 :
483 : const SvxWeightItem & rItem =
484 : static_cast< const SvxWeightItem & >(
485 0 : rItemSet.Get( nWhichId ));
486 :
487 0 : if( rItem.QueryValue( aValue, MID_WEIGHT ))
488 : {
489 0 : if( aValue != GetPropertySet()->getPropertyValue( "CharWeight" + aPostfix))
490 : {
491 0 : GetPropertySet()->setPropertyValue( "CharWeight" + aPostfix, aValue );
492 0 : bChanged = true;
493 : }
494 0 : }
495 : }
496 0 : break;
497 :
498 : case EE_CHAR_FONTHEIGHT:
499 : case EE_CHAR_FONTHEIGHT_CJK:
500 : case EE_CHAR_FONTHEIGHT_CTL:
501 : {
502 0 : OUString aPostfix;
503 0 : if( nWhichId == EE_CHAR_FONTHEIGHT_CJK )
504 0 : aPostfix = "Asian";
505 0 : else if( nWhichId == EE_CHAR_FONTHEIGHT_CTL )
506 0 : aPostfix = "Complex";
507 :
508 : const SvxFontHeightItem & rItem =
509 : static_cast< const SvxFontHeightItem & >(
510 0 : rItemSet.Get( nWhichId ));
511 :
512 : try
513 : {
514 0 : if( rItem.QueryValue( aValue, MID_FONTHEIGHT ) )
515 : {
516 0 : bool bSetValue = false;
517 0 : if( aValue != GetPropertySet()->getPropertyValue( "CharHeight" + aPostfix ))
518 0 : bSetValue = true;
519 : else
520 : {
521 0 : if( m_pRefSize.get() )
522 : {
523 0 : awt::Size aNewRefSize = *m_pRefSize;
524 0 : awt::Size aOldRefSize;
525 0 : if( GetRefSizePropertySet()->getPropertyValue( m_aRefSizePropertyName ) >>= aOldRefSize )
526 : {
527 0 : if( aNewRefSize.Width != aOldRefSize.Width
528 0 : || aNewRefSize.Height != aOldRefSize.Height )
529 0 : bSetValue = true;
530 : }
531 : }
532 : }
533 0 : if( bSetValue )
534 : {
535 : // set new reference size only if there was a reference size before (auto-scaling on)
536 0 : if( m_pRefSize.get() &&
537 0 : GetRefSizePropertySet()->getPropertyValue( m_aRefSizePropertyName ).hasValue())
538 : {
539 0 : GetRefSizePropertySet()->setPropertyValue( m_aRefSizePropertyName,
540 0 : uno::makeAny( *m_pRefSize ));
541 : }
542 :
543 0 : GetPropertySet()->setPropertyValue( "CharHeight" + aPostfix, aValue );
544 0 : bChanged = true;
545 : }
546 : }
547 : }
548 0 : catch( const uno::Exception & ex )
549 : {
550 : ASSERT_EXCEPTION( ex );
551 0 : }
552 : }
553 0 : break;
554 : }
555 :
556 0 : return bChanged;
557 : }
558 :
559 : uno::Reference< beans::XPropertySet >
560 0 : CharacterPropertyItemConverter::GetRefSizePropertySet() const
561 : {
562 0 : return m_xRefSizePropSet;
563 : }
564 :
565 : } // namespace wrapper
566 : } // namespace chart
567 :
568 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|