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 <com/sun/star/uno/Any.hxx>
21 : #include <com/sun/star/drawing/LineStyle.hpp>
22 : #include <com/sun/star/script/Converter.hpp>
23 : #include <com/sun/star/lang/XMultiServiceFactory.hpp>
24 : #include <com/sun/star/table/ShadowLocation.hpp>
25 : #include <com/sun/star/table/TableBorder.hpp>
26 : #include <com/sun/star/table/ShadowFormat.hpp>
27 : #include <com/sun/star/table/CellRangeAddress.hpp>
28 : #include <com/sun/star/table/CellContentType.hpp>
29 : #include <com/sun/star/table/TableOrientation.hpp>
30 : #include <com/sun/star/util/SortField.hpp>
31 : #include <com/sun/star/util/SortFieldType.hpp>
32 : #include <com/sun/star/table/BorderLine2.hpp>
33 : #include <com/sun/star/table/BorderLineStyle.hpp>
34 : #include <com/sun/star/table/CellOrientation.hpp>
35 : #include <com/sun/star/table/CellAddress.hpp>
36 : #include <com/sun/star/style/PageStyleLayout.hpp>
37 : #include <com/sun/star/style/BreakType.hpp>
38 : #include <com/sun/star/style/GraphicLocation.hpp>
39 : #include <com/sun/star/awt/Rectangle.hpp>
40 : #include <com/sun/star/awt/Selection.hpp>
41 : #include <com/sun/star/awt/Size.hpp>
42 : #include <com/sun/star/text/WritingMode2.hpp>
43 : #include <com/sun/star/frame/status/UpperLowerMarginScale.hpp>
44 : #include <com/sun/star/drawing/ShadingPattern.hpp>
45 :
46 : #include <i18nutil/unicode.hxx>
47 : #include <unotools/securityoptions.hxx>
48 : #include <unotools/ucbstreamhelper.hxx>
49 : #include <limits.h>
50 : #include <comphelper/processfactory.hxx>
51 : #include <svtools/grfmgr.hxx>
52 : #include <tools/urlobj.hxx>
53 : #include <comphelper/types.hxx>
54 : #include <svl/memberid.hrc>
55 : #include <svl/cntwall.hxx>
56 : #include <svtools/borderhelper.hxx>
57 : #include <rtl/ustring.hxx>
58 : #include <rtl/ustrbuf.hxx>
59 : #include <tools/mapunit.hxx>
60 : #include <vcl/graphicfilter.hxx>
61 : #include <vcl/settings.hxx>
62 : #include <vcl/svapp.hxx>
63 : #include <editeng/editids.hrc>
64 : #include <editeng/editrids.hrc>
65 : #include <editeng/pbinitem.hxx>
66 : #include <editeng/sizeitem.hxx>
67 : #include <editeng/lrspitem.hxx>
68 : #include <editeng/ulspitem.hxx>
69 : #include <editeng/prntitem.hxx>
70 : #include <editeng/opaqitem.hxx>
71 : #include <editeng/protitem.hxx>
72 : #include <editeng/shaditem.hxx>
73 : #include <editeng/boxitem.hxx>
74 : #include <editeng/formatbreakitem.hxx>
75 : #include <editeng/keepitem.hxx>
76 : #include <editeng/lineitem.hxx>
77 : #include <editeng/brushitem.hxx>
78 : #include <editeng/frmdiritem.hxx>
79 : #include <editeng/itemtype.hxx>
80 : #include <editeng/eerdll.hxx>
81 : #include <editeng/unoprnms.hxx>
82 : #include <editeng/memberids.hrc>
83 : #include <editeng/editerr.hxx>
84 :
85 : using namespace ::editeng;
86 : using namespace ::rtl;
87 : using namespace ::com::sun::star;
88 : using namespace ::com::sun::star::drawing;
89 : using namespace ::com::sun::star::table::BorderLineStyle;
90 :
91 : /*
92 : SvxBorderLine is not an SfxPoolItem, and has no Store/Create serialization/deserialization methods.
93 : Since border line information needs to be serialized by the table autoformat code, these file-local
94 : methods are defined to encapsulate the necessary serialization logic.
95 : */
96 : namespace
97 : {
98 : /// Item version for saved border lines. The old version saves the line without style information.
99 : const int BORDER_LINE_OLD_VERSION = 0;
100 : /// Item version for saved border lies. The new version includes line style.
101 : const int BORDER_LINE_WITH_STYLE_VERSION = 1;
102 :
103 : /// Store a border line to a stream.
104 0 : SvStream& StoreBorderLine(SvStream &stream, const SvxBorderLine &l, sal_uInt16 version)
105 : {
106 0 : WriteColor( stream, l.GetColor() );
107 0 : stream.WriteUInt16( l.GetOutWidth() )
108 0 : .WriteUInt16( l.GetInWidth() )
109 0 : .WriteUInt16( l.GetDistance() );
110 :
111 0 : if (version >= BORDER_LINE_WITH_STYLE_VERSION)
112 0 : stream.WriteUInt16( static_cast<sal_uInt16>(l.GetBorderLineStyle()) );
113 :
114 0 : return stream;
115 : }
116 :
117 : /// Creates a border line from a stream.
118 0 : SvxBorderLine CreateBorderLine(SvStream &stream, sal_uInt16 version)
119 : {
120 : sal_uInt16 nOutline, nInline, nDistance;
121 0 : sal_uInt16 nStyle = NONE;
122 0 : Color aColor;
123 0 : ReadColor( stream, aColor ).ReadUInt16( nOutline ).ReadUInt16( nInline ).ReadUInt16( nDistance );
124 :
125 0 : if (version >= BORDER_LINE_WITH_STYLE_VERSION)
126 0 : stream.ReadUInt16( nStyle );
127 :
128 0 : SvxBorderLine border(&aColor);
129 0 : border.GuessLinesWidths(nStyle, nOutline, nInline, nDistance);
130 0 : return border;
131 : }
132 :
133 : /// Retrieves a BORDER_LINE_* version from a BOX_BORDER_* version.
134 0 : sal_uInt16 BorderLineVersionFromBoxVersion(sal_uInt16 boxVersion)
135 : {
136 0 : return (boxVersion >= BOX_BORDER_STYLE_VERSION)? BORDER_LINE_WITH_STYLE_VERSION : BORDER_LINE_OLD_VERSION;
137 : }
138 : }
139 :
140 0 : TYPEINIT1_FACTORY(SvxPaperBinItem, SfxByteItem, new SvxPaperBinItem(0));
141 0 : TYPEINIT1_FACTORY(SvxSizeItem, SfxPoolItem, new SvxSizeItem(0));
142 0 : TYPEINIT1_FACTORY(SvxLRSpaceItem, SfxPoolItem, new SvxLRSpaceItem(0));
143 0 : TYPEINIT1_FACTORY(SvxULSpaceItem, SfxPoolItem, new SvxULSpaceItem(0));
144 0 : TYPEINIT1_FACTORY(SvxPrintItem, SfxBoolItem, new SvxPrintItem(0));
145 0 : TYPEINIT1_FACTORY(SvxOpaqueItem, SfxBoolItem, new SvxOpaqueItem(0));
146 0 : TYPEINIT1_FACTORY(SvxProtectItem, SfxPoolItem, new SvxProtectItem(0));
147 0 : TYPEINIT1_FACTORY(SvxBrushItem, SfxPoolItem, new SvxBrushItem(0));
148 0 : TYPEINIT1_FACTORY(SvxShadowItem, SfxPoolItem, new SvxShadowItem(0));
149 0 : TYPEINIT1_FACTORY(SvxBoxItem, SfxPoolItem, new SvxBoxItem(0));
150 0 : TYPEINIT1_FACTORY(SvxBoxInfoItem, SfxPoolItem, new SvxBoxInfoItem(0));
151 0 : TYPEINIT1_FACTORY(SvxFmtBreakItem, SfxEnumItem, new SvxFmtBreakItem(SVX_BREAK_NONE, 0));
152 0 : TYPEINIT1_FACTORY(SvxFmtKeepItem, SfxBoolItem, new SvxFmtKeepItem(false, 0));
153 0 : TYPEINIT1_FACTORY(SvxLineItem, SfxPoolItem, new SvxLineItem(0));
154 0 : TYPEINIT1_FACTORY(SvxFrameDirectionItem, SfxUInt16Item, new SvxFrameDirectionItem(FRMDIR_HORI_LEFT_TOP, 0));
155 :
156 : // class SvxPaperBinItem ------------------------------------------------
157 :
158 0 : SfxPoolItem* SvxPaperBinItem::Clone( SfxItemPool* ) const
159 : {
160 0 : return new SvxPaperBinItem( *this );
161 : }
162 :
163 :
164 :
165 0 : SvStream& SvxPaperBinItem::Store( SvStream& rStrm , sal_uInt16 /*nItemVersion*/ ) const
166 : {
167 0 : rStrm.WriteUChar( GetValue() );
168 0 : return rStrm;
169 : }
170 :
171 :
172 :
173 0 : SfxPoolItem* SvxPaperBinItem::Create( SvStream& rStrm, sal_uInt16 ) const
174 : {
175 : sal_Int8 nBin;
176 0 : rStrm.ReadSChar( nBin );
177 0 : return new SvxPaperBinItem( Which(), nBin );
178 : }
179 :
180 :
181 :
182 0 : SfxItemPresentation SvxPaperBinItem::GetPresentation
183 : (
184 : SfxItemPresentation ePres,
185 : SfxMapUnit /*eCoreUnit*/,
186 : SfxMapUnit /*ePresUnit*/,
187 : OUString& rText, const IntlWrapper *
188 : ) const
189 : {
190 0 : switch ( ePres )
191 : {
192 : case SFX_ITEM_PRESENTATION_NONE:
193 0 : rText = OUString();
194 0 : return SFX_ITEM_PRESENTATION_NONE;
195 :
196 : case SFX_ITEM_PRESENTATION_NAMELESS:
197 0 : rText = OUString::number( GetValue() );
198 0 : return SFX_ITEM_PRESENTATION_NAMELESS;
199 :
200 : case SFX_ITEM_PRESENTATION_COMPLETE:
201 : {
202 0 : sal_uInt8 nValue = GetValue();
203 :
204 0 : if ( PAPERBIN_PRINTER_SETTINGS == nValue )
205 0 : rText = EE_RESSTR(RID_SVXSTR_PAPERBIN_SETTINGS);
206 : else
207 : {
208 0 : rText = EE_RESSTR(RID_SVXSTR_PAPERBIN) + " " + OUString::number( nValue );
209 : }
210 0 : return SFX_ITEM_PRESENTATION_COMPLETE;
211 : }
212 : //no break necessary
213 : default: ;//prevent warning
214 : }
215 :
216 0 : return SFX_ITEM_PRESENTATION_NONE;
217 : }
218 :
219 : // class SvxSizeItem -----------------------------------------------------
220 :
221 0 : SvxSizeItem::SvxSizeItem( const sal_uInt16 nId, const Size& rSize ) :
222 :
223 : SfxPoolItem( nId ),
224 :
225 0 : aSize( rSize )
226 : {
227 0 : }
228 :
229 :
230 0 : bool SvxSizeItem::QueryValue( uno::Any& rVal, sal_uInt8 nMemberId ) const
231 : {
232 0 : sal_Bool bConvert = 0!=(nMemberId&CONVERT_TWIPS);
233 0 : nMemberId &= ~CONVERT_TWIPS;
234 :
235 0 : awt::Size aTmp(aSize.Width(), aSize.Height());
236 0 : if( bConvert )
237 : {
238 0 : aTmp.Height = convertTwipToMm100(aTmp.Height);
239 0 : aTmp.Width = convertTwipToMm100(aTmp.Width);
240 : }
241 :
242 0 : switch( nMemberId )
243 : {
244 0 : case MID_SIZE_SIZE: rVal <<= aTmp; break;
245 0 : case MID_SIZE_WIDTH: rVal <<= aTmp.Width; break;
246 0 : case MID_SIZE_HEIGHT: rVal <<= aTmp.Height; break;
247 0 : default: OSL_FAIL("Wrong MemberId!"); return false;
248 : }
249 :
250 0 : return true;
251 : }
252 :
253 0 : bool SvxSizeItem::PutValue( const uno::Any& rVal, sal_uInt8 nMemberId )
254 : {
255 0 : sal_Bool bConvert = 0!=(nMemberId&CONVERT_TWIPS);
256 0 : nMemberId &= ~CONVERT_TWIPS;
257 :
258 0 : switch( nMemberId )
259 : {
260 : case MID_SIZE_SIZE:
261 : {
262 0 : awt::Size aTmp;
263 0 : if( rVal >>= aTmp )
264 : {
265 0 : if(bConvert)
266 : {
267 0 : aTmp.Height = convertMm100ToTwip(aTmp.Height);
268 0 : aTmp.Width = convertMm100ToTwip(aTmp.Width);
269 : }
270 0 : aSize = Size( aTmp.Width, aTmp.Height );
271 : }
272 : else
273 : {
274 0 : return false;
275 : }
276 : }
277 0 : break;
278 : case MID_SIZE_WIDTH:
279 : {
280 0 : sal_Int32 nVal = 0;
281 0 : if(!(rVal >>= nVal ))
282 0 : return false;
283 :
284 0 : aSize.Width() = bConvert ? convertMm100ToTwip(nVal) : nVal;
285 : }
286 0 : break;
287 : case MID_SIZE_HEIGHT:
288 : {
289 0 : sal_Int32 nVal = 0;
290 0 : if(!(rVal >>= nVal))
291 0 : return true;
292 :
293 0 : aSize.Height() = bConvert ? convertMm100ToTwip(nVal) : nVal;
294 : }
295 0 : break;
296 : default: OSL_FAIL("Wrong MemberId!");
297 0 : return false;
298 : }
299 0 : return true;
300 : }
301 :
302 :
303 :
304 0 : SvxSizeItem::SvxSizeItem( const sal_uInt16 nId ) :
305 :
306 0 : SfxPoolItem( nId )
307 : {
308 0 : }
309 :
310 :
311 :
312 0 : bool SvxSizeItem::operator==( const SfxPoolItem& rAttr ) const
313 : {
314 : DBG_ASSERT( SfxPoolItem::operator==(rAttr), "unequal types" );
315 :
316 0 : return ( aSize == ( (SvxSizeItem&)rAttr ).GetSize() );
317 : }
318 :
319 :
320 :
321 0 : SfxPoolItem* SvxSizeItem::Clone( SfxItemPool* ) const
322 : {
323 0 : return new SvxSizeItem( *this );
324 : }
325 :
326 :
327 :
328 0 : SfxItemPresentation SvxSizeItem::GetPresentation
329 : (
330 : SfxItemPresentation ePres,
331 : SfxMapUnit eCoreUnit,
332 : SfxMapUnit ePresUnit,
333 : OUString& rText, const IntlWrapper *pIntl
334 : ) const
335 : {
336 0 : OUString cpDelimTmp(cpDelim);
337 0 : switch ( ePres )
338 : {
339 : case SFX_ITEM_PRESENTATION_NONE:
340 0 : rText = OUString();
341 0 : return SFX_ITEM_PRESENTATION_NONE;
342 :
343 : case SFX_ITEM_PRESENTATION_NAMELESS:
344 0 : rText = GetMetricText( aSize.Width(), eCoreUnit, ePresUnit, pIntl ) +
345 0 : cpDelimTmp +
346 0 : GetMetricText( aSize.Height(), eCoreUnit, ePresUnit, pIntl );
347 0 : return SFX_ITEM_PRESENTATION_NAMELESS;
348 :
349 : case SFX_ITEM_PRESENTATION_COMPLETE:
350 0 : rText = EE_RESSTR(RID_SVXITEMS_SIZE_WIDTH) +
351 0 : GetMetricText( aSize.Width(), eCoreUnit, ePresUnit, pIntl ) +
352 0 : " " + EE_RESSTR(GetMetricId(ePresUnit)) +
353 0 : cpDelimTmp +
354 0 : EE_RESSTR(RID_SVXITEMS_SIZE_HEIGHT) +
355 0 : GetMetricText( aSize.Height(), eCoreUnit, ePresUnit, pIntl ) +
356 0 : " " + EE_RESSTR(GetMetricId(ePresUnit));
357 0 : return SFX_ITEM_PRESENTATION_COMPLETE;
358 : //no break necessary
359 : default: ;//prevent warning
360 :
361 : }
362 0 : return SFX_ITEM_PRESENTATION_NONE;
363 : }
364 :
365 :
366 :
367 0 : SvStream& SvxSizeItem::Store( SvStream& rStrm , sal_uInt16 /*nItemVersion*/ ) const
368 : {
369 : //#fdo39428 SvStream no longer supports operator<<(long)
370 0 : rStrm.WriteInt32( sal::static_int_cast<sal_Int32>(aSize.Width()) );
371 0 : rStrm.WriteInt32( sal::static_int_cast<sal_Int32>(aSize.Height()) );
372 0 : return rStrm;
373 : }
374 :
375 :
376 :
377 0 : bool SvxSizeItem::ScaleMetrics( long nMult, long nDiv )
378 : {
379 0 : aSize.Width() = Scale( aSize.Width(), nMult, nDiv );
380 0 : aSize.Height() = Scale( aSize.Height(), nMult, nDiv );
381 0 : return true;
382 : }
383 :
384 :
385 :
386 0 : bool SvxSizeItem::HasMetrics() const
387 : {
388 0 : return true;
389 : }
390 :
391 :
392 :
393 0 : SfxPoolItem* SvxSizeItem::Create( SvStream& rStrm, sal_uInt16 ) const
394 : {
395 : //#fdo39428 SvStream no longer supports operator>>(long&)
396 0 : sal_Int32 nWidth(0), nHeight(0);
397 0 : rStrm.ReadInt32( nWidth ).ReadInt32( nHeight );
398 :
399 0 : SvxSizeItem* pAttr = new SvxSizeItem( Which() );
400 0 : pAttr->SetSize(Size(nWidth, nHeight));
401 :
402 0 : return pAttr;
403 : }
404 :
405 : // class SvxLRSpaceItem --------------------------------------------------
406 :
407 0 : SvxLRSpaceItem::SvxLRSpaceItem( const sal_uInt16 nId ) :
408 :
409 : SfxPoolItem( nId ),
410 :
411 : nFirstLineOfst ( 0 ),
412 : nTxtLeft ( 0 ),
413 : nLeftMargin ( 0 ),
414 : nRightMargin ( 0 ),
415 : nPropFirstLineOfst( 100 ),
416 : nPropLeftMargin( 100 ),
417 : nPropRightMargin( 100 ),
418 : bAutoFirst ( false ),
419 : bExplicitZeroMarginValRight(false),
420 0 : bExplicitZeroMarginValLeft(false)
421 : {
422 0 : }
423 :
424 :
425 :
426 0 : SvxLRSpaceItem::SvxLRSpaceItem( const long nLeft, const long nRight,
427 : const long nTLeft, const short nOfset,
428 : const sal_uInt16 nId ) :
429 :
430 : SfxPoolItem( nId ),
431 :
432 : nFirstLineOfst ( nOfset ),
433 : nTxtLeft ( nTLeft ),
434 : nLeftMargin ( nLeft ),
435 : nRightMargin ( nRight ),
436 : nPropFirstLineOfst( 100 ),
437 : nPropLeftMargin( 100 ),
438 : nPropRightMargin( 100 ),
439 : bAutoFirst ( false ),
440 : bExplicitZeroMarginValRight(false),
441 0 : bExplicitZeroMarginValLeft(false)
442 : {
443 0 : }
444 :
445 :
446 0 : bool SvxLRSpaceItem::QueryValue( uno::Any& rVal, sal_uInt8 nMemberId ) const
447 : {
448 0 : bool bRet = true;
449 0 : sal_Bool bConvert = 0!=(nMemberId&CONVERT_TWIPS);
450 0 : nMemberId &= ~CONVERT_TWIPS;
451 0 : switch( nMemberId )
452 : {
453 : // now all signed
454 : case MID_L_MARGIN:
455 0 : rVal <<= (sal_Int32)(bConvert ? convertTwipToMm100(nLeftMargin) : nLeftMargin);
456 0 : break;
457 :
458 : case MID_TXT_LMARGIN :
459 0 : rVal <<= (sal_Int32)(bConvert ? convertTwipToMm100(nTxtLeft) : nTxtLeft);
460 0 : break;
461 : case MID_R_MARGIN:
462 0 : rVal <<= (sal_Int32)(bConvert ? convertTwipToMm100(nRightMargin) : nRightMargin);
463 0 : break;
464 : case MID_L_REL_MARGIN:
465 0 : rVal <<= (sal_Int16)nPropLeftMargin;
466 0 : break;
467 : case MID_R_REL_MARGIN:
468 0 : rVal <<= (sal_Int16)nPropRightMargin;
469 0 : break;
470 :
471 : case MID_FIRST_LINE_INDENT:
472 0 : rVal <<= (sal_Int32)(bConvert ? convertTwipToMm100(nFirstLineOfst) : nFirstLineOfst);
473 0 : break;
474 :
475 : case MID_FIRST_LINE_REL_INDENT:
476 0 : rVal <<= (sal_Int16)(nPropFirstLineOfst);
477 0 : break;
478 :
479 : case MID_FIRST_AUTO:
480 0 : rVal = Bool2Any(IsAutoFirst());
481 0 : break;
482 :
483 : default:
484 0 : bRet = false;
485 : OSL_FAIL("unknown MemberId");
486 : }
487 0 : return bRet;
488 : }
489 :
490 :
491 0 : bool SvxLRSpaceItem::PutValue( const uno::Any& rVal, sal_uInt8 nMemberId )
492 : {
493 0 : sal_Bool bConvert = 0!=(nMemberId&CONVERT_TWIPS);
494 0 : nMemberId &= ~CONVERT_TWIPS;
495 0 : sal_Int32 nVal = 0;
496 0 : if( nMemberId != MID_FIRST_AUTO &&
497 0 : nMemberId != MID_L_REL_MARGIN && nMemberId != MID_R_REL_MARGIN)
498 0 : if(!(rVal >>= nVal))
499 0 : return false;
500 :
501 0 : switch( nMemberId )
502 : {
503 : case MID_L_MARGIN:
504 0 : SetLeft((sal_Int32)bConvert ? convertMm100ToTwip(nVal) : nVal);
505 0 : break;
506 :
507 : case MID_TXT_LMARGIN :
508 0 : SetTxtLeft((sal_Int32)bConvert ? convertMm100ToTwip(nVal) : nVal);
509 0 : break;
510 :
511 : case MID_R_MARGIN:
512 0 : SetRight((sal_Int32) bConvert ? convertMm100ToTwip(nVal) : nVal);
513 0 : break;
514 : case MID_L_REL_MARGIN:
515 : case MID_R_REL_MARGIN:
516 : {
517 0 : sal_Int32 nRel = 0;
518 0 : if((rVal >>= nRel) && nRel >= 0 && nRel < USHRT_MAX)
519 : {
520 0 : if(MID_L_REL_MARGIN== nMemberId)
521 0 : nPropLeftMargin = (sal_uInt16)nRel;
522 : else
523 0 : nPropRightMargin = (sal_uInt16)nRel;
524 : }
525 : else
526 0 : return false;
527 : }
528 0 : break;
529 : case MID_FIRST_LINE_INDENT :
530 0 : SetTxtFirstLineOfst((short)(bConvert ? convertMm100ToTwip(nVal) : nVal));
531 0 : break;
532 :
533 : case MID_FIRST_LINE_REL_INDENT:
534 0 : SetPropTxtFirstLineOfst ( (sal_uInt16)nVal );
535 0 : break;
536 :
537 : case MID_FIRST_AUTO:
538 0 : SetAutoFirst( Any2Bool(rVal) );
539 0 : break;
540 :
541 : default:
542 : OSL_FAIL("unknown MemberId");
543 0 : return false;
544 : }
545 0 : return true;
546 : }
547 :
548 :
549 :
550 : // Adapt nLeftMargin and nTxtLeft.
551 :
552 0 : void SvxLRSpaceItem::AdjustLeft()
553 : {
554 0 : if ( 0 > nFirstLineOfst )
555 0 : nLeftMargin = nTxtLeft + nFirstLineOfst;
556 : else
557 0 : nLeftMargin = nTxtLeft;
558 0 : }
559 :
560 :
561 :
562 0 : bool SvxLRSpaceItem::operator==( const SfxPoolItem& rAttr ) const
563 : {
564 : DBG_ASSERT( SfxPoolItem::operator==(rAttr), "unequal types" );
565 :
566 0 : const SvxLRSpaceItem& rOther = (const SvxLRSpaceItem&)rAttr;
567 :
568 : return (
569 0 : nFirstLineOfst == rOther.GetTxtFirstLineOfst() &&
570 0 : nTxtLeft == rOther.GetTxtLeft() &&
571 0 : nLeftMargin == rOther.GetLeft() &&
572 0 : nRightMargin == rOther.GetRight() &&
573 0 : nPropFirstLineOfst == rOther.GetPropTxtFirstLineOfst() &&
574 0 : nPropLeftMargin == rOther.GetPropLeft() &&
575 0 : nPropRightMargin == rOther.GetPropRight() &&
576 0 : bAutoFirst == rOther.IsAutoFirst() &&
577 0 : bExplicitZeroMarginValRight == rOther.IsExplicitZeroMarginValRight() &&
578 0 : bExplicitZeroMarginValLeft == rOther.IsExplicitZeroMarginValLeft() );
579 : }
580 :
581 :
582 :
583 0 : SfxPoolItem* SvxLRSpaceItem::Clone( SfxItemPool* ) const
584 : {
585 0 : return new SvxLRSpaceItem( *this );
586 : }
587 :
588 :
589 :
590 0 : SfxItemPresentation SvxLRSpaceItem::GetPresentation
591 : (
592 : SfxItemPresentation ePres,
593 : SfxMapUnit eCoreUnit,
594 : SfxMapUnit ePresUnit,
595 : OUString& rText, const IntlWrapper* pIntl
596 : ) const
597 : {
598 0 : switch ( ePres )
599 : {
600 : case SFX_ITEM_PRESENTATION_NONE:
601 0 : rText = OUString();
602 0 : return SFX_ITEM_PRESENTATION_NONE;
603 : case SFX_ITEM_PRESENTATION_NAMELESS:
604 : {
605 0 : if ( 100 != nPropLeftMargin )
606 : {
607 0 : rText = unicode::formatPercent(nPropLeftMargin,
608 0 : Application::GetSettings().GetUILanguageTag());
609 : }
610 : else
611 0 : rText = GetMetricText( (long)nLeftMargin,
612 0 : eCoreUnit, ePresUnit, pIntl );
613 0 : rText += OUString(cpDelim);
614 0 : if ( 100 != nPropFirstLineOfst )
615 : {
616 0 : rText += unicode::formatPercent(nPropFirstLineOfst,
617 0 : Application::GetSettings().GetUILanguageTag());
618 : }
619 : else
620 0 : rText += GetMetricText( (long)nFirstLineOfst,
621 0 : eCoreUnit, ePresUnit, pIntl );
622 0 : rText += OUString(cpDelim);
623 0 : if ( 100 != nRightMargin )
624 : {
625 0 : rText += unicode::formatPercent(nRightMargin,
626 0 : Application::GetSettings().GetUILanguageTag());
627 : }
628 : else
629 0 : rText += GetMetricText( (long)nRightMargin,
630 0 : eCoreUnit, ePresUnit, pIntl );
631 0 : return SFX_ITEM_PRESENTATION_NAMELESS;
632 : }
633 : case SFX_ITEM_PRESENTATION_COMPLETE:
634 : {
635 0 : rText = EE_RESSTR(RID_SVXITEMS_LRSPACE_LEFT);
636 0 : if ( 100 != nPropLeftMargin )
637 0 : rText += unicode::formatPercent(nPropLeftMargin,
638 0 : Application::GetSettings().GetUILanguageTag());
639 : else
640 : {
641 0 : rText = rText +
642 0 : GetMetricText( (long)nLeftMargin, eCoreUnit, ePresUnit, pIntl ) +
643 0 : " " + EE_RESSTR(GetMetricId(ePresUnit));
644 : }
645 0 : rText += OUString(cpDelim);
646 0 : if ( 100 != nPropFirstLineOfst || nFirstLineOfst )
647 : {
648 0 : rText += EE_RESSTR(RID_SVXITEMS_LRSPACE_FLINE);
649 0 : if ( 100 != nPropFirstLineOfst )
650 0 : rText = rText + unicode::formatPercent(nPropFirstLineOfst,
651 0 : Application::GetSettings().GetUILanguageTag());
652 : else
653 : {
654 0 : rText = rText +
655 : GetMetricText( (long)nFirstLineOfst,
656 0 : eCoreUnit, ePresUnit, pIntl ) +
657 0 : " " + EE_RESSTR(GetMetricId(ePresUnit));
658 : }
659 0 : rText += OUString(cpDelim);
660 : }
661 0 : rText += EE_RESSTR(RID_SVXITEMS_LRSPACE_RIGHT);
662 0 : if ( 100 != nPropRightMargin )
663 0 : rText = rText + unicode::formatPercent(nPropRightMargin,
664 0 : Application::GetSettings().GetUILanguageTag());
665 : else
666 : {
667 0 : rText = rText +
668 : GetMetricText( (long)nRightMargin,
669 0 : eCoreUnit, ePresUnit, pIntl ) +
670 0 : " " + EE_RESSTR(GetMetricId(ePresUnit));
671 : }
672 0 : return SFX_ITEM_PRESENTATION_COMPLETE;
673 : }
674 : default: ;//prevent warning
675 : }
676 0 : return SFX_ITEM_PRESENTATION_NONE;
677 : }
678 :
679 :
680 :
681 : // BulletFI: Before 501 in the Outliner the bullet was not on the position of
682 : // the FI, so in older documents one must set FI to 0.
683 : #define BULLETLR_MARKER 0x599401FE
684 :
685 0 : SvStream& SvxLRSpaceItem::Store( SvStream& rStrm , sal_uInt16 nItemVersion ) const
686 : {
687 0 : short nSaveFI = nFirstLineOfst;
688 0 : ((SvxLRSpaceItem*)this)->SetTxtFirstLineOfst( 0 ); // nLeftMargin is manipulated together with this, see Create()
689 :
690 0 : sal_uInt16 nMargin = 0;
691 0 : if( nLeftMargin > 0 )
692 0 : nMargin = sal_uInt16( nLeftMargin );
693 0 : rStrm.WriteUInt16( nMargin );
694 0 : rStrm.WriteUInt16( nPropLeftMargin );
695 0 : if( nRightMargin > 0 )
696 0 : nMargin = sal_uInt16( nRightMargin );
697 : else
698 0 : nMargin = 0;
699 0 : rStrm.WriteUInt16( nMargin );
700 0 : rStrm.WriteUInt16( nPropRightMargin );
701 0 : rStrm.WriteInt16( nFirstLineOfst );
702 0 : rStrm.WriteUInt16( nPropFirstLineOfst );
703 0 : if( nTxtLeft > 0 )
704 0 : nMargin = sal_uInt16( nTxtLeft );
705 : else
706 0 : nMargin = 0;
707 0 : rStrm.WriteUInt16( nMargin );
708 0 : if( nItemVersion >= LRSPACE_AUTOFIRST_VERSION )
709 : {
710 0 : sal_Int8 nAutoFirst = bAutoFirst ? 1 : 0;
711 0 : if( nItemVersion >= LRSPACE_NEGATIVE_VERSION &&
712 0 : ( nLeftMargin < 0 || nRightMargin < 0 || nTxtLeft < 0 ) )
713 0 : nAutoFirst |= 0x80;
714 0 : rStrm.WriteSChar( nAutoFirst );
715 :
716 : // From 6.0 onwards, do not write Magic numbers...
717 : DBG_ASSERT( rStrm.GetVersion() <= SOFFICE_FILEFORMAT_50, "Change File format SvxLRSpaceItem!" );
718 0 : rStrm.WriteUInt32( (sal_uInt32) BULLETLR_MARKER );
719 0 : rStrm.WriteInt16( nSaveFI );
720 :
721 0 : if( 0x80 & nAutoFirst )
722 : {
723 0 : rStrm.WriteInt32( static_cast<sal_Int32>(nLeftMargin) );
724 0 : rStrm.WriteInt32( static_cast<sal_Int32>(nRightMargin) );
725 : }
726 : }
727 :
728 0 : ((SvxLRSpaceItem*)this)->SetTxtFirstLineOfst( nSaveFI );
729 :
730 0 : return rStrm;
731 : }
732 :
733 :
734 :
735 0 : SfxPoolItem* SvxLRSpaceItem::Create( SvStream& rStrm, sal_uInt16 nVersion ) const
736 : {
737 : sal_uInt16 left, prpleft, right, prpright, prpfirstline, txtleft;
738 : short firstline;
739 0 : sal_Int8 autofirst = 0;
740 :
741 0 : if ( nVersion >= LRSPACE_AUTOFIRST_VERSION )
742 : {
743 0 : rStrm.ReadUInt16( left ).ReadUInt16( prpleft ).ReadUInt16( right ).ReadUInt16( prpright ).ReadInt16( firstline ). ReadUInt16( prpfirstline ).ReadUInt16( txtleft ).ReadSChar( autofirst );
744 :
745 0 : sal_Size nPos = rStrm.Tell();
746 : sal_uInt32 nMarker;
747 0 : rStrm.ReadUInt32( nMarker );
748 0 : if ( nMarker == BULLETLR_MARKER )
749 : {
750 0 : rStrm.ReadInt16( firstline );
751 0 : if ( firstline < 0 )
752 0 : left = left + static_cast<sal_uInt16>(firstline); // see below: txtleft = ...
753 : }
754 : else
755 0 : rStrm.Seek( nPos );
756 : }
757 0 : else if ( nVersion == LRSPACE_TXTLEFT_VERSION )
758 : {
759 0 : rStrm.ReadUInt16( left ).ReadUInt16( prpleft ).ReadUInt16( right ).ReadUInt16( prpright ).ReadInt16( firstline ). ReadUInt16( prpfirstline ).ReadUInt16( txtleft );
760 : }
761 0 : else if ( nVersion == LRSPACE_16_VERSION )
762 : {
763 0 : rStrm.ReadUInt16( left ).ReadUInt16( prpleft ).ReadUInt16( right ).ReadUInt16( prpright ).ReadInt16( firstline ). ReadUInt16( prpfirstline );
764 : }
765 : else
766 : {
767 : sal_Int8 nL, nR, nFL;
768 0 : rStrm.ReadUInt16( left ).ReadSChar( nL ).ReadUInt16( right ).ReadSChar( nR ).ReadInt16( firstline ).ReadSChar( nFL );
769 0 : prpleft = (sal_uInt16)nL;
770 0 : prpright = (sal_uInt16)nR;
771 0 : prpfirstline = (sal_uInt16)nFL;
772 : }
773 :
774 0 : txtleft = firstline >= 0 ? left : left - firstline;
775 0 : SvxLRSpaceItem* pAttr = new SvxLRSpaceItem( Which() );
776 :
777 0 : pAttr->nLeftMargin = left;
778 0 : pAttr->nPropLeftMargin = prpleft;
779 0 : pAttr->nRightMargin = right;
780 0 : pAttr->nPropRightMargin = prpright;
781 0 : pAttr->nFirstLineOfst = firstline;
782 0 : pAttr->nPropFirstLineOfst = prpfirstline;
783 0 : pAttr->nTxtLeft = txtleft;
784 0 : pAttr->bAutoFirst = autofirst & 0x01;
785 0 : if( nVersion >= LRSPACE_NEGATIVE_VERSION && ( autofirst & 0x80 ) )
786 : {
787 : sal_Int32 nMargin;
788 0 : rStrm.ReadInt32( nMargin );
789 0 : pAttr->nLeftMargin = nMargin;
790 0 : pAttr->nTxtLeft = firstline >= 0 ? nMargin : nMargin - firstline;
791 0 : rStrm.ReadInt32( nMargin );
792 0 : pAttr->nRightMargin = nMargin;
793 : }
794 0 : return pAttr;
795 : }
796 :
797 :
798 :
799 0 : sal_uInt16 SvxLRSpaceItem::GetVersion( sal_uInt16 nFileVersion ) const
800 : {
801 : return (nFileVersion == SOFFICE_FILEFORMAT_31)
802 : ? LRSPACE_TXTLEFT_VERSION
803 0 : : LRSPACE_NEGATIVE_VERSION;
804 : }
805 :
806 :
807 :
808 0 : bool SvxLRSpaceItem::ScaleMetrics( long nMult, long nDiv )
809 : {
810 0 : nFirstLineOfst = (short)Scale( nFirstLineOfst, nMult, nDiv );
811 0 : nTxtLeft = Scale( nTxtLeft, nMult, nDiv );
812 0 : nLeftMargin = Scale( nLeftMargin, nMult, nDiv );
813 0 : nRightMargin = Scale( nRightMargin, nMult, nDiv );
814 0 : return true;
815 : }
816 :
817 :
818 :
819 0 : bool SvxLRSpaceItem::HasMetrics() const
820 : {
821 0 : return true;
822 : }
823 :
824 : // class SvxULSpaceItem --------------------------------------------------
825 :
826 0 : SvxULSpaceItem::SvxULSpaceItem( const sal_uInt16 nId )
827 : : SfxPoolItem(nId)
828 : , nUpper(0)
829 : , nLower(0)
830 : , bContext(false)
831 : , nPropUpper(100)
832 0 : , nPropLower(100)
833 : {
834 0 : }
835 :
836 :
837 :
838 0 : SvxULSpaceItem::SvxULSpaceItem( const sal_uInt16 nUp, const sal_uInt16 nLow,
839 : const sal_uInt16 nId )
840 : : SfxPoolItem(nId)
841 : , nUpper(nUp)
842 : , nLower(nLow)
843 : , bContext(false)
844 : , nPropUpper(100)
845 0 : , nPropLower(100)
846 : {
847 0 : }
848 :
849 :
850 0 : bool SvxULSpaceItem::QueryValue( uno::Any& rVal, sal_uInt8 nMemberId ) const
851 : {
852 0 : bool bConvert = 0!=(nMemberId&CONVERT_TWIPS);
853 0 : nMemberId &= ~CONVERT_TWIPS;
854 0 : switch( nMemberId )
855 : {
856 : // now all signed
857 : case 0:
858 : {
859 0 : ::com::sun::star::frame::status::UpperLowerMarginScale aUpperLowerMarginScale;
860 0 : aUpperLowerMarginScale.Upper = (sal_Int32)(bConvert ? convertTwipToMm100(nUpper) : nUpper);
861 0 : aUpperLowerMarginScale.Lower = (sal_Int32)(bConvert ? convertTwipToMm100(nLower) : nPropUpper);
862 0 : aUpperLowerMarginScale.ScaleUpper = (sal_Int16)nPropUpper;
863 0 : aUpperLowerMarginScale.ScaleLower = (sal_Int16)nPropLower;
864 0 : rVal <<= aUpperLowerMarginScale;
865 0 : break;
866 : }
867 0 : case MID_UP_MARGIN: rVal <<= (sal_Int32)(bConvert ? convertTwipToMm100(nUpper) : nUpper); break;
868 0 : case MID_LO_MARGIN: rVal <<= (sal_Int32)(bConvert ? convertTwipToMm100(nLower) : nLower); break;
869 0 : case MID_CTX_MARGIN: rVal <<= bContext; break;
870 0 : case MID_UP_REL_MARGIN: rVal <<= (sal_Int16) nPropUpper; break;
871 0 : case MID_LO_REL_MARGIN: rVal <<= (sal_Int16) nPropLower; break;
872 : }
873 0 : return true;
874 : }
875 :
876 :
877 0 : bool SvxULSpaceItem::PutValue( const uno::Any& rVal, sal_uInt8 nMemberId )
878 : {
879 0 : sal_Bool bConvert = 0!=(nMemberId&CONVERT_TWIPS);
880 0 : nMemberId &= ~CONVERT_TWIPS;
881 0 : sal_Int32 nVal = 0;
882 0 : sal_Bool bVal = 0;
883 0 : switch( nMemberId )
884 : {
885 : case 0:
886 : {
887 0 : ::com::sun::star::frame::status::UpperLowerMarginScale aUpperLowerMarginScale;
888 0 : if ( !(rVal >>= aUpperLowerMarginScale ))
889 0 : return false;
890 : {
891 0 : SetUpper((sal_uInt16)(bConvert ? convertMm100ToTwip( aUpperLowerMarginScale.Upper ) : aUpperLowerMarginScale.Upper));
892 0 : SetLower((sal_uInt16)(bConvert ? convertMm100ToTwip( aUpperLowerMarginScale.Lower ) : aUpperLowerMarginScale.Lower));
893 0 : if( aUpperLowerMarginScale.ScaleUpper > 1 )
894 0 : nPropUpper = aUpperLowerMarginScale.ScaleUpper;
895 0 : if( aUpperLowerMarginScale.ScaleLower > 1 )
896 0 : nPropUpper = aUpperLowerMarginScale.ScaleLower;
897 : }
898 : }
899 :
900 : case MID_UP_MARGIN :
901 0 : if(!(rVal >>= nVal) || nVal < 0)
902 0 : return false;
903 0 : SetUpper((sal_uInt16)(bConvert ? convertMm100ToTwip(nVal) : nVal));
904 0 : break;
905 : case MID_LO_MARGIN :
906 0 : if(!(rVal >>= nVal) || nVal < 0)
907 0 : return false;
908 0 : SetLower((sal_uInt16)(bConvert ? convertMm100ToTwip(nVal) : nVal));
909 0 : break;
910 : case MID_CTX_MARGIN :
911 0 : if (!(rVal >>= bVal))
912 0 : return false;
913 0 : SetContextValue(bVal);
914 0 : break;
915 : case MID_UP_REL_MARGIN:
916 : case MID_LO_REL_MARGIN:
917 : {
918 0 : sal_Int32 nRel = 0;
919 0 : if((rVal >>= nRel) && nRel > 1 )
920 : {
921 0 : if(MID_UP_REL_MARGIN == nMemberId)
922 0 : nPropUpper = (sal_uInt16)nRel;
923 : else
924 0 : nPropLower = (sal_uInt16)nRel;
925 : }
926 : else
927 0 : return false;
928 : }
929 0 : break;
930 :
931 : default:
932 : OSL_FAIL("unknown MemberId");
933 0 : return false;
934 : }
935 0 : return true;
936 : }
937 :
938 :
939 :
940 0 : bool SvxULSpaceItem::operator==( const SfxPoolItem& rAttr ) const
941 : {
942 : DBG_ASSERT( SfxPoolItem::operator==(rAttr), "unequal types" );
943 :
944 0 : return ( nUpper == ( (SvxULSpaceItem&)rAttr ).nUpper &&
945 0 : nLower == ( (SvxULSpaceItem&)rAttr ).nLower &&
946 0 : bContext == ( (SvxULSpaceItem&)rAttr ).bContext &&
947 0 : nPropUpper == ( (SvxULSpaceItem&)rAttr ).nPropUpper &&
948 0 : nPropLower == ( (SvxULSpaceItem&)rAttr ).nPropLower );
949 : }
950 :
951 :
952 :
953 0 : SfxPoolItem* SvxULSpaceItem::Clone( SfxItemPool* ) const
954 : {
955 0 : return new SvxULSpaceItem( *this );
956 : }
957 :
958 :
959 :
960 0 : SfxItemPresentation SvxULSpaceItem::GetPresentation
961 : (
962 : SfxItemPresentation ePres,
963 : SfxMapUnit eCoreUnit,
964 : SfxMapUnit ePresUnit,
965 : OUString& rText, const IntlWrapper *pIntl
966 : ) const
967 : {
968 0 : switch ( ePres )
969 : {
970 : case SFX_ITEM_PRESENTATION_NONE:
971 0 : rText = OUString();
972 0 : return SFX_ITEM_PRESENTATION_NONE;
973 : case SFX_ITEM_PRESENTATION_NAMELESS:
974 : {
975 0 : if ( 100 != nPropUpper )
976 : {
977 0 : rText = unicode::formatPercent(nPropUpper,
978 0 : Application::GetSettings().GetUILanguageTag());
979 : }
980 : else
981 0 : rText = GetMetricText( (long)nUpper, eCoreUnit, ePresUnit, pIntl );
982 0 : rText += OUString(cpDelim);
983 0 : if ( 100 != nPropLower )
984 : {
985 0 : rText += unicode::formatPercent(nPropLower,
986 0 : Application::GetSettings().GetUILanguageTag());
987 : }
988 : else
989 0 : rText += GetMetricText( (long)nLower, eCoreUnit, ePresUnit, pIntl );
990 0 : return SFX_ITEM_PRESENTATION_NAMELESS;
991 : }
992 : case SFX_ITEM_PRESENTATION_COMPLETE:
993 : {
994 0 : rText = EE_RESSTR(RID_SVXITEMS_ULSPACE_UPPER);
995 0 : if ( 100 != nPropUpper )
996 : {
997 0 : rText += unicode::formatPercent(nPropUpper,
998 0 : Application::GetSettings().GetUILanguageTag());
999 : }
1000 : else
1001 : {
1002 0 : rText = rText +
1003 0 : GetMetricText( (long)nUpper, eCoreUnit, ePresUnit, pIntl ) +
1004 0 : " " + EE_RESSTR(GetMetricId(ePresUnit));
1005 : }
1006 0 : rText = rText + OUString(cpDelim) + EE_RESSTR(RID_SVXITEMS_ULSPACE_LOWER);
1007 0 : if ( 100 != nPropLower )
1008 : {
1009 0 : rText += unicode::formatPercent(nPropLower,
1010 0 : Application::GetSettings().GetUILanguageTag());
1011 : }
1012 : else
1013 : {
1014 0 : rText = rText +
1015 0 : GetMetricText( (long)nLower, eCoreUnit, ePresUnit, pIntl ) +
1016 0 : " " + EE_RESSTR(GetMetricId(ePresUnit));
1017 : }
1018 0 : return SFX_ITEM_PRESENTATION_COMPLETE;
1019 : }
1020 : default: ;//prevent warning
1021 : }
1022 0 : return SFX_ITEM_PRESENTATION_NONE;
1023 : }
1024 :
1025 :
1026 :
1027 0 : SvStream& SvxULSpaceItem::Store( SvStream& rStrm , sal_uInt16 /*nItemVersion*/ ) const
1028 : {
1029 0 : rStrm.WriteUInt16( GetUpper() )
1030 0 : .WriteUInt16( GetPropUpper() )
1031 0 : .WriteUInt16( GetLower() )
1032 0 : .WriteUInt16( GetPropLower() );
1033 0 : return rStrm;
1034 : }
1035 :
1036 :
1037 :
1038 0 : SfxPoolItem* SvxULSpaceItem::Create( SvStream& rStrm, sal_uInt16 nVersion ) const
1039 : {
1040 0 : sal_uInt16 upper, lower, nPL = 0, nPU = 0;
1041 :
1042 0 : if ( nVersion == ULSPACE_16_VERSION )
1043 0 : rStrm.ReadUInt16( upper ).ReadUInt16( nPU ).ReadUInt16( lower ).ReadUInt16( nPL );
1044 : else
1045 : {
1046 : sal_Int8 nU, nL;
1047 0 : rStrm.ReadUInt16( upper ).ReadSChar( nU ).ReadUInt16( lower ).ReadSChar( nL );
1048 0 : nPL = (sal_uInt16)nL;
1049 0 : nPU = (sal_uInt16)nU;
1050 : }
1051 :
1052 0 : SvxULSpaceItem* pAttr = new SvxULSpaceItem( Which() );
1053 0 : pAttr->SetUpperValue( upper );
1054 0 : pAttr->SetLowerValue( lower );
1055 0 : pAttr->SetPropUpper( nPU );
1056 0 : pAttr->SetPropLower( nPL );
1057 0 : return pAttr;
1058 : }
1059 :
1060 :
1061 :
1062 0 : sal_uInt16 SvxULSpaceItem::GetVersion( sal_uInt16 /*nFileVersion*/ ) const
1063 : {
1064 0 : return ULSPACE_16_VERSION;
1065 : }
1066 :
1067 :
1068 :
1069 0 : bool SvxULSpaceItem::ScaleMetrics( long nMult, long nDiv )
1070 : {
1071 0 : nUpper = (sal_uInt16)Scale( nUpper, nMult, nDiv );
1072 0 : nLower = (sal_uInt16)Scale( nLower, nMult, nDiv );
1073 0 : return true;
1074 : }
1075 :
1076 :
1077 :
1078 0 : bool SvxULSpaceItem::HasMetrics() const
1079 : {
1080 0 : return true;
1081 : }
1082 :
1083 : // class SvxPrintItem ----------------------------------------------------
1084 :
1085 0 : SfxPoolItem* SvxPrintItem::Clone( SfxItemPool* ) const
1086 : {
1087 0 : return new SvxPrintItem( *this );
1088 : }
1089 :
1090 :
1091 :
1092 0 : SvStream& SvxPrintItem::Store( SvStream& rStrm , sal_uInt16 /*nItemVersion*/ ) const
1093 : {
1094 0 : rStrm.WriteSChar( (sal_Int8)GetValue() );
1095 0 : return rStrm;
1096 : }
1097 :
1098 :
1099 :
1100 0 : SfxPoolItem* SvxPrintItem::Create( SvStream& rStrm, sal_uInt16 ) const
1101 : {
1102 : sal_Int8 bIsPrint;
1103 0 : rStrm.ReadSChar( bIsPrint );
1104 0 : return new SvxPrintItem( Which(), bIsPrint != 0 );
1105 : }
1106 :
1107 :
1108 :
1109 0 : SfxItemPresentation SvxPrintItem::GetPresentation
1110 : (
1111 : SfxItemPresentation ePres,
1112 : SfxMapUnit /*eCoreUnit*/,
1113 : SfxMapUnit /*ePresUnit*/,
1114 : OUString& rText, const IntlWrapper *
1115 : ) const
1116 : {
1117 0 : switch ( ePres )
1118 : {
1119 : case SFX_ITEM_PRESENTATION_NONE:
1120 0 : rText = OUString();
1121 0 : return ePres;
1122 :
1123 : case SFX_ITEM_PRESENTATION_NAMELESS:
1124 : case SFX_ITEM_PRESENTATION_COMPLETE:
1125 : {
1126 0 : sal_uInt16 nId = RID_SVXITEMS_PRINT_FALSE;
1127 :
1128 0 : if ( GetValue() )
1129 0 : nId = RID_SVXITEMS_PRINT_TRUE;
1130 0 : rText = EE_RESSTR(nId);
1131 0 : return ePres;
1132 : }
1133 : default: ;//prevent warning
1134 : }
1135 0 : return SFX_ITEM_PRESENTATION_NONE;
1136 : }
1137 :
1138 : // class SvxOpaqueItem ---------------------------------------------------
1139 :
1140 0 : SfxPoolItem* SvxOpaqueItem::Clone( SfxItemPool* ) const
1141 : {
1142 0 : return new SvxOpaqueItem( *this );
1143 : }
1144 :
1145 :
1146 :
1147 0 : SvStream& SvxOpaqueItem::Store( SvStream& rStrm , sal_uInt16 /*nItemVersion*/ ) const
1148 : {
1149 0 : rStrm.WriteSChar( (sal_Int8)GetValue() );
1150 0 : return rStrm;
1151 : }
1152 :
1153 :
1154 :
1155 0 : SfxPoolItem* SvxOpaqueItem::Create( SvStream& rStrm, sal_uInt16 ) const
1156 : {
1157 : sal_Int8 bIsOpaque;
1158 0 : rStrm.ReadSChar( bIsOpaque );
1159 0 : return new SvxOpaqueItem( Which(), bIsOpaque != 0 );
1160 : }
1161 :
1162 :
1163 :
1164 0 : SfxItemPresentation SvxOpaqueItem::GetPresentation
1165 : (
1166 : SfxItemPresentation ePres,
1167 : SfxMapUnit /*eCoreUnit*/,
1168 : SfxMapUnit /*ePresUnit*/,
1169 : OUString& rText, const IntlWrapper *
1170 : ) const
1171 : {
1172 0 : switch ( ePres )
1173 : {
1174 : case SFX_ITEM_PRESENTATION_NONE:
1175 0 : rText = OUString();
1176 0 : return ePres;
1177 :
1178 : case SFX_ITEM_PRESENTATION_NAMELESS:
1179 : case SFX_ITEM_PRESENTATION_COMPLETE:
1180 : {
1181 0 : sal_uInt16 nId = RID_SVXITEMS_OPAQUE_FALSE;
1182 :
1183 0 : if ( GetValue() )
1184 0 : nId = RID_SVXITEMS_OPAQUE_TRUE;
1185 0 : rText = EE_RESSTR(nId);
1186 0 : return ePres;
1187 : }
1188 : default: ;//prevent warning
1189 : }
1190 0 : return SFX_ITEM_PRESENTATION_NONE;
1191 : }
1192 :
1193 : // class SvxProtectItem --------------------------------------------------
1194 :
1195 0 : bool SvxProtectItem::operator==( const SfxPoolItem& rAttr ) const
1196 : {
1197 : DBG_ASSERT( SfxPoolItem::operator==(rAttr), "unequal types" );
1198 :
1199 0 : return ( bCntnt == ( (SvxProtectItem&)rAttr ).bCntnt &&
1200 0 : bSize == ( (SvxProtectItem&)rAttr ).bSize &&
1201 0 : bPos == ( (SvxProtectItem&)rAttr ).bPos );
1202 : }
1203 :
1204 0 : bool SvxProtectItem::QueryValue( uno::Any& rVal, sal_uInt8 nMemberId ) const
1205 : {
1206 0 : nMemberId &= ~CONVERT_TWIPS;
1207 : sal_Bool bValue;
1208 0 : switch(nMemberId)
1209 : {
1210 0 : case MID_PROTECT_CONTENT : bValue = bCntnt; break;
1211 0 : case MID_PROTECT_SIZE : bValue = bSize; break;
1212 0 : case MID_PROTECT_POSITION: bValue = bPos; break;
1213 : default:
1214 : OSL_FAIL("Wrong MemberId");
1215 0 : return false;
1216 : }
1217 :
1218 0 : rVal = Bool2Any( bValue );
1219 0 : return true;
1220 : }
1221 :
1222 0 : bool SvxProtectItem::PutValue( const uno::Any& rVal, sal_uInt8 nMemberId )
1223 : {
1224 0 : nMemberId &= ~CONVERT_TWIPS;
1225 0 : sal_Bool bVal( Any2Bool(rVal) );
1226 0 : switch(nMemberId)
1227 : {
1228 0 : case MID_PROTECT_CONTENT : bCntnt = bVal; break;
1229 0 : case MID_PROTECT_SIZE : bSize = bVal; break;
1230 0 : case MID_PROTECT_POSITION: bPos = bVal; break;
1231 : default:
1232 : OSL_FAIL("Wrong MemberId");
1233 0 : return false;
1234 : }
1235 0 : return true;
1236 : }
1237 :
1238 :
1239 :
1240 0 : SfxPoolItem* SvxProtectItem::Clone( SfxItemPool* ) const
1241 : {
1242 0 : return new SvxProtectItem( *this );
1243 : }
1244 :
1245 :
1246 :
1247 0 : SfxItemPresentation SvxProtectItem::GetPresentation
1248 : (
1249 : SfxItemPresentation ePres,
1250 : SfxMapUnit /*eCoreUnit*/,
1251 : SfxMapUnit /*ePresUnit*/,
1252 : OUString& rText, const IntlWrapper *
1253 : ) const
1254 : {
1255 0 : switch ( ePres )
1256 : {
1257 : case SFX_ITEM_PRESENTATION_NONE:
1258 0 : rText = OUString();
1259 0 : return ePres;
1260 :
1261 : case SFX_ITEM_PRESENTATION_NAMELESS:
1262 : case SFX_ITEM_PRESENTATION_COMPLETE:
1263 : {
1264 0 : sal_uInt16 nId = RID_SVXITEMS_PROT_CONTENT_FALSE;
1265 :
1266 0 : if ( bCntnt )
1267 0 : nId = RID_SVXITEMS_PROT_CONTENT_TRUE;
1268 0 : rText = EE_RESSTR(nId) + OUString(cpDelim);
1269 0 : nId = RID_SVXITEMS_PROT_SIZE_FALSE;
1270 :
1271 0 : if ( bSize )
1272 0 : nId = RID_SVXITEMS_PROT_SIZE_TRUE;
1273 0 : rText = rText + EE_RESSTR(nId) + OUString(cpDelim);
1274 0 : nId = RID_SVXITEMS_PROT_POS_FALSE;
1275 :
1276 0 : if ( bPos )
1277 0 : nId = RID_SVXITEMS_PROT_POS_TRUE;
1278 0 : rText += EE_RESSTR(nId);
1279 0 : return ePres;
1280 : }
1281 : default: ;//prevent warning
1282 : }
1283 0 : return SFX_ITEM_PRESENTATION_NONE;
1284 : }
1285 :
1286 :
1287 :
1288 0 : SvStream& SvxProtectItem::Store( SvStream& rStrm , sal_uInt16 /*nItemVersion*/ ) const
1289 : {
1290 0 : sal_Int8 cProt = 0;
1291 0 : if( IsPosProtected() ) cProt |= 0x01;
1292 0 : if( IsSizeProtected() ) cProt |= 0x02;
1293 0 : if( IsCntntProtected() ) cProt |= 0x04;
1294 0 : rStrm.WriteSChar( (sal_Int8) cProt );
1295 0 : return rStrm;
1296 : }
1297 :
1298 :
1299 :
1300 0 : SfxPoolItem* SvxProtectItem::Create( SvStream& rStrm, sal_uInt16 ) const
1301 : {
1302 : sal_Int8 cFlags;
1303 0 : rStrm.ReadSChar( cFlags );
1304 0 : SvxProtectItem* pAttr = new SvxProtectItem( Which() );
1305 0 : pAttr->SetPosProtect( ( cFlags & 0x01 ) != 0 );
1306 0 : pAttr->SetSizeProtect( ( cFlags & 0x02 ) != 0 );
1307 0 : pAttr->SetCntntProtect( ( cFlags & 0x04 ) != 0 );
1308 0 : return pAttr;
1309 : }
1310 :
1311 : // class SvxShadowItem ---------------------------------------------------
1312 :
1313 0 : SvxShadowItem::SvxShadowItem( const sal_uInt16 nId,
1314 : const Color *pColor, const sal_uInt16 nW,
1315 : const SvxShadowLocation eLoc ) :
1316 : SfxEnumItemInterface( nId ),
1317 : aShadowColor(COL_GRAY),
1318 : nWidth ( nW ),
1319 0 : eLocation ( eLoc )
1320 : {
1321 0 : if ( pColor )
1322 0 : aShadowColor = *pColor;
1323 0 : }
1324 :
1325 :
1326 0 : bool SvxShadowItem::QueryValue( uno::Any& rVal, sal_uInt8 nMemberId ) const
1327 : {
1328 0 : sal_Bool bConvert = 0!=(nMemberId&CONVERT_TWIPS);
1329 0 : nMemberId &= ~CONVERT_TWIPS;
1330 :
1331 0 : table::ShadowFormat aShadow;
1332 0 : table::ShadowLocation eSet = table::ShadowLocation_NONE;
1333 0 : switch( eLocation )
1334 : {
1335 0 : case SVX_SHADOW_TOPLEFT : eSet = table::ShadowLocation_TOP_LEFT ; break;
1336 0 : case SVX_SHADOW_TOPRIGHT : eSet = table::ShadowLocation_TOP_RIGHT ; break;
1337 0 : case SVX_SHADOW_BOTTOMLEFT : eSet = table::ShadowLocation_BOTTOM_LEFT ; break;
1338 0 : case SVX_SHADOW_BOTTOMRIGHT: eSet = table::ShadowLocation_BOTTOM_RIGHT; break;
1339 : default: ;//prevent warning
1340 : }
1341 0 : aShadow.Location = eSet;
1342 0 : aShadow.ShadowWidth = bConvert ? convertTwipToMm100(nWidth) : nWidth;
1343 0 : aShadow.IsTransparent = aShadowColor.GetTransparency() > 0;
1344 0 : aShadow.Color = aShadowColor.GetColor();
1345 :
1346 0 : sal_Int8 nTransparence = rtl::math::round(float(aShadowColor.GetTransparency() * 100) / 255);
1347 :
1348 0 : switch ( nMemberId )
1349 : {
1350 0 : case MID_LOCATION: rVal <<= aShadow.Location; break;
1351 0 : case MID_WIDTH: rVal <<= aShadow.ShadowWidth; break;
1352 0 : case MID_TRANSPARENT: rVal <<= aShadow.IsTransparent; break;
1353 0 : case MID_BG_COLOR: rVal <<= aShadow.Color; break;
1354 0 : case 0: rVal <<= aShadow; break;
1355 0 : case MID_SHADOW_TRANSPARENCE: rVal <<= nTransparence; break;
1356 0 : default: OSL_FAIL("Wrong MemberId!"); return false;
1357 : }
1358 :
1359 0 : return true;
1360 : }
1361 :
1362 0 : bool SvxShadowItem::PutValue( const uno::Any& rVal, sal_uInt8 nMemberId )
1363 : {
1364 0 : sal_Bool bConvert = 0!=(nMemberId&CONVERT_TWIPS);
1365 0 : nMemberId &= ~CONVERT_TWIPS;
1366 :
1367 0 : table::ShadowFormat aShadow;
1368 0 : uno::Any aAny;
1369 0 : bool bRet = QueryValue( aAny, bConvert ? CONVERT_TWIPS : 0 ) && ( aAny >>= aShadow );
1370 0 : switch ( nMemberId )
1371 : {
1372 : case MID_LOCATION:
1373 : {
1374 0 : bRet = (rVal >>= aShadow.Location);
1375 0 : if ( !bRet )
1376 : {
1377 0 : sal_Int16 nVal = 0;
1378 0 : bRet = (rVal >>= nVal);
1379 0 : aShadow.Location = (table::ShadowLocation) nVal;
1380 : }
1381 :
1382 0 : break;
1383 : }
1384 :
1385 0 : case MID_WIDTH: rVal >>= aShadow.ShadowWidth; break;
1386 0 : case MID_TRANSPARENT: rVal >>= aShadow.IsTransparent; break;
1387 0 : case MID_BG_COLOR: rVal >>= aShadow.Color; break;
1388 0 : case 0: rVal >>= aShadow; break;
1389 : case MID_SHADOW_TRANSPARENCE:
1390 : {
1391 0 : sal_Int32 nTransparence = 0;
1392 0 : if (rVal >>= nTransparence)
1393 : {
1394 0 : Color aColor(aShadow.Color);
1395 0 : aColor.SetTransparency(rtl::math::round(float(nTransparence * 255) / 100));
1396 0 : aShadow.Color = aColor.GetColor();
1397 : }
1398 0 : break;
1399 : }
1400 0 : default: OSL_FAIL("Wrong MemberId!"); return false;
1401 : }
1402 :
1403 0 : if ( bRet )
1404 : {
1405 : // SvxShadowLocation eSet = SVX_SHADOW_NONE;
1406 0 : switch( aShadow.Location )
1407 : {
1408 0 : case table::ShadowLocation_TOP_LEFT : eLocation = SVX_SHADOW_TOPLEFT; break;
1409 0 : case table::ShadowLocation_TOP_RIGHT : eLocation = SVX_SHADOW_TOPRIGHT; break;
1410 0 : case table::ShadowLocation_BOTTOM_LEFT : eLocation = SVX_SHADOW_BOTTOMLEFT ; break;
1411 0 : case table::ShadowLocation_BOTTOM_RIGHT: eLocation = SVX_SHADOW_BOTTOMRIGHT; break;
1412 : default: ;//prevent warning
1413 : }
1414 :
1415 0 : nWidth = bConvert ? convertMm100ToTwip(aShadow.ShadowWidth) : aShadow.ShadowWidth;
1416 0 : Color aSet(aShadow.Color);
1417 0 : aShadowColor = aSet;
1418 : }
1419 :
1420 0 : return bRet;
1421 : }
1422 :
1423 :
1424 :
1425 0 : bool SvxShadowItem::operator==( const SfxPoolItem& rAttr ) const
1426 : {
1427 : DBG_ASSERT( SfxPoolItem::operator==(rAttr), "unequal types" );
1428 :
1429 0 : return ( ( aShadowColor == ( (SvxShadowItem&)rAttr ).aShadowColor ) &&
1430 0 : ( nWidth == ( (SvxShadowItem&)rAttr ).GetWidth() ) &&
1431 0 : ( eLocation == ( (SvxShadowItem&)rAttr ).GetLocation() ) );
1432 : }
1433 :
1434 :
1435 :
1436 0 : SfxPoolItem* SvxShadowItem::Clone( SfxItemPool* ) const
1437 : {
1438 0 : return new SvxShadowItem( *this );
1439 : }
1440 :
1441 :
1442 :
1443 0 : sal_uInt16 SvxShadowItem::CalcShadowSpace( sal_uInt16 nShadow ) const
1444 : {
1445 0 : sal_uInt16 nSpace = 0;
1446 :
1447 0 : switch ( nShadow )
1448 : {
1449 : case SHADOW_TOP:
1450 0 : if ( eLocation == SVX_SHADOW_TOPLEFT ||
1451 0 : eLocation == SVX_SHADOW_TOPRIGHT )
1452 0 : nSpace = nWidth;
1453 0 : break;
1454 :
1455 : case SHADOW_BOTTOM:
1456 0 : if ( eLocation == SVX_SHADOW_BOTTOMLEFT ||
1457 0 : eLocation == SVX_SHADOW_BOTTOMRIGHT )
1458 0 : nSpace = nWidth;
1459 0 : break;
1460 :
1461 : case SHADOW_LEFT:
1462 0 : if ( eLocation == SVX_SHADOW_TOPLEFT ||
1463 0 : eLocation == SVX_SHADOW_BOTTOMLEFT )
1464 0 : nSpace = nWidth;
1465 0 : break;
1466 :
1467 : case SHADOW_RIGHT:
1468 0 : if ( eLocation == SVX_SHADOW_TOPRIGHT ||
1469 0 : eLocation == SVX_SHADOW_BOTTOMRIGHT )
1470 0 : nSpace = nWidth;
1471 0 : break;
1472 :
1473 : default:
1474 : OSL_FAIL( "wrong shadow" );
1475 : }
1476 0 : return nSpace;
1477 : }
1478 :
1479 :
1480 :
1481 0 : SfxItemPresentation SvxShadowItem::GetPresentation
1482 : (
1483 : SfxItemPresentation ePres,
1484 : SfxMapUnit eCoreUnit,
1485 : SfxMapUnit ePresUnit,
1486 : OUString& rText, const IntlWrapper *pIntl
1487 : ) const
1488 : {
1489 0 : switch ( ePres )
1490 : {
1491 : case SFX_ITEM_PRESENTATION_NONE:
1492 0 : rText = OUString();
1493 0 : return ePres;
1494 :
1495 : case SFX_ITEM_PRESENTATION_NAMELESS:
1496 : {
1497 0 : rText = ::GetColorString( aShadowColor ) + OUString(cpDelim);
1498 0 : sal_uInt16 nId = RID_SVXITEMS_TRANSPARENT_FALSE;
1499 :
1500 0 : if ( aShadowColor.GetTransparency() )
1501 0 : nId = RID_SVXITEMS_TRANSPARENT_TRUE;
1502 0 : rText = rText +
1503 0 : EE_RESSTR(nId) +
1504 0 : OUString(cpDelim) +
1505 0 : GetMetricText( (long)nWidth, eCoreUnit, ePresUnit, pIntl ) +
1506 0 : OUString(cpDelim) +
1507 0 : EE_RESSTR(RID_SVXITEMS_SHADOW_BEGIN + eLocation);
1508 0 : return ePres;
1509 : }
1510 : case SFX_ITEM_PRESENTATION_COMPLETE:
1511 : {
1512 0 : rText = EE_RESSTR(RID_SVXITEMS_SHADOW_COMPLETE) +
1513 0 : ::GetColorString( aShadowColor ) +
1514 0 : OUString(cpDelim);
1515 :
1516 0 : sal_uInt16 nId = RID_SVXITEMS_TRANSPARENT_FALSE;
1517 0 : if ( aShadowColor.GetTransparency() )
1518 0 : nId = RID_SVXITEMS_TRANSPARENT_TRUE;
1519 0 : rText = rText +
1520 0 : EE_RESSTR(nId) +
1521 0 : OUString(cpDelim) +
1522 0 : GetMetricText( (long)nWidth, eCoreUnit, ePresUnit, pIntl ) +
1523 0 : " " + EE_RESSTR(GetMetricId(ePresUnit)) +
1524 0 : OUString(cpDelim) +
1525 0 : EE_RESSTR(RID_SVXITEMS_SHADOW_BEGIN + eLocation);
1526 0 : return ePres;
1527 : }
1528 : default: ;//prevent warning
1529 : }
1530 0 : return SFX_ITEM_PRESENTATION_NONE;
1531 : }
1532 :
1533 :
1534 :
1535 0 : SvStream& SvxShadowItem::Store( SvStream& rStrm , sal_uInt16 /*nItemVersion*/ ) const
1536 : {
1537 0 : rStrm.WriteSChar( (sal_Int8) GetLocation() )
1538 0 : .WriteUInt16( (sal_uInt16) GetWidth() )
1539 0 : .WriteUChar( (sal_Bool)(aShadowColor.GetTransparency() > 0) );
1540 0 : WriteColor( rStrm, GetColor() );
1541 0 : WriteColor( rStrm, GetColor() );
1542 0 : rStrm.WriteSChar( (sal_Int8)(aShadowColor.GetTransparency() > 0 ? 0 : 1) ); //BRUSH_NULL : BRUSH_SOLID
1543 0 : return rStrm;
1544 : }
1545 :
1546 :
1547 :
1548 0 : bool SvxShadowItem::ScaleMetrics( long nMult, long nDiv )
1549 : {
1550 0 : nWidth = (sal_uInt16)Scale( nWidth, nMult, nDiv );
1551 0 : return true;
1552 : }
1553 :
1554 :
1555 :
1556 0 : bool SvxShadowItem::HasMetrics() const
1557 : {
1558 0 : return true;
1559 : }
1560 :
1561 :
1562 :
1563 0 : SfxPoolItem* SvxShadowItem::Create( SvStream& rStrm, sal_uInt16 ) const
1564 : {
1565 : sal_Int8 cLoc;
1566 : sal_uInt16 _nWidth;
1567 : sal_Bool bTrans;
1568 0 : Color aColor;
1569 0 : Color aFillColor;
1570 : sal_Int8 nStyle;
1571 0 : rStrm.ReadSChar( cLoc ).ReadUInt16( _nWidth )
1572 0 : .ReadUChar( bTrans );
1573 0 : ReadColor( rStrm, aColor );
1574 0 : ReadColor( rStrm, aFillColor ).ReadSChar( nStyle );
1575 0 : aColor.SetTransparency(bTrans ? 0xff : 0);
1576 0 : return new SvxShadowItem( Which(), &aColor, _nWidth, (SvxShadowLocation)cLoc );
1577 : }
1578 :
1579 :
1580 :
1581 0 : sal_uInt16 SvxShadowItem::GetValueCount() const
1582 : {
1583 0 : return SVX_SHADOW_END; // SVX_SHADOW_BOTTOMRIGHT + 1
1584 : }
1585 :
1586 :
1587 :
1588 0 : OUString SvxShadowItem::GetValueTextByPos( sal_uInt16 nPos ) const
1589 : {
1590 : DBG_ASSERT( nPos < SVX_SHADOW_END, "enum overflow!" );
1591 0 : return EE_RESSTR(RID_SVXITEMS_SHADOW_BEGIN + nPos );
1592 : }
1593 :
1594 :
1595 :
1596 0 : sal_uInt16 SvxShadowItem::GetEnumValue() const
1597 : {
1598 0 : return (sal_uInt16)GetLocation();
1599 : }
1600 :
1601 :
1602 :
1603 0 : void SvxShadowItem::SetEnumValue( sal_uInt16 nVal )
1604 : {
1605 0 : SetLocation( (const SvxShadowLocation)nVal );
1606 0 : }
1607 :
1608 : // class SvxBoxItem ------------------------------------------------------
1609 :
1610 0 : SvxBoxItem::SvxBoxItem( const SvxBoxItem& rCpy ) :
1611 :
1612 : SfxPoolItem ( rCpy ),
1613 : nTopDist ( rCpy.nTopDist ),
1614 : nBottomDist ( rCpy.nBottomDist ),
1615 : nLeftDist ( rCpy.nLeftDist ),
1616 0 : nRightDist ( rCpy.nRightDist )
1617 :
1618 : {
1619 0 : pTop = rCpy.GetTop() ? new SvxBorderLine( *rCpy.GetTop() ) : 0;
1620 0 : pBottom = rCpy.GetBottom() ? new SvxBorderLine( *rCpy.GetBottom() ) : 0;
1621 0 : pLeft = rCpy.GetLeft() ? new SvxBorderLine( *rCpy.GetLeft() ) : 0;
1622 0 : pRight = rCpy.GetRight() ? new SvxBorderLine( *rCpy.GetRight() ) : 0;
1623 0 : }
1624 :
1625 :
1626 :
1627 0 : SvxBoxItem::SvxBoxItem( const sal_uInt16 nId ) :
1628 : SfxPoolItem( nId ),
1629 :
1630 : pTop ( 0 ),
1631 : pBottom ( 0 ),
1632 : pLeft ( 0 ),
1633 : pRight ( 0 ),
1634 : nTopDist ( 0 ),
1635 : nBottomDist ( 0 ),
1636 : nLeftDist ( 0 ),
1637 0 : nRightDist ( 0 )
1638 :
1639 : {
1640 0 : }
1641 :
1642 :
1643 :
1644 0 : SvxBoxItem::~SvxBoxItem()
1645 : {
1646 0 : delete pTop;
1647 0 : delete pBottom;
1648 0 : delete pLeft;
1649 0 : delete pRight;
1650 0 : }
1651 :
1652 :
1653 :
1654 0 : SvxBoxItem& SvxBoxItem::operator=( const SvxBoxItem& rBox )
1655 : {
1656 0 : nTopDist = rBox.nTopDist;
1657 0 : nBottomDist = rBox.nBottomDist;
1658 0 : nLeftDist = rBox.nLeftDist;
1659 0 : nRightDist = rBox.nRightDist;
1660 0 : SetLine( rBox.GetTop(), BOX_LINE_TOP );
1661 0 : SetLine( rBox.GetBottom(), BOX_LINE_BOTTOM );
1662 0 : SetLine( rBox.GetLeft(), BOX_LINE_LEFT );
1663 0 : SetLine( rBox.GetRight(), BOX_LINE_RIGHT );
1664 0 : return *this;
1665 : }
1666 :
1667 :
1668 :
1669 0 : inline sal_Bool CmpBrdLn( const SvxBorderLine* pBrd1, const SvxBorderLine* pBrd2 )
1670 : {
1671 : sal_Bool bRet;
1672 0 : if( 0 != pBrd1 ? 0 == pBrd2 : 0 != pBrd2 )
1673 0 : bRet = sal_False;
1674 : else
1675 0 : if( !pBrd1 )
1676 0 : bRet = sal_True;
1677 : else
1678 0 : bRet = (*pBrd1 == *pBrd2);
1679 0 : return bRet;
1680 : }
1681 :
1682 :
1683 :
1684 0 : bool SvxBoxItem::operator==( const SfxPoolItem& rAttr ) const
1685 : {
1686 : DBG_ASSERT( SfxPoolItem::operator==(rAttr), "unequal types" );
1687 :
1688 : return (
1689 0 : ( nTopDist == ( (SvxBoxItem&)rAttr ).nTopDist ) &&
1690 0 : ( nBottomDist == ( (SvxBoxItem&)rAttr ).nBottomDist ) &&
1691 0 : ( nLeftDist == ( (SvxBoxItem&)rAttr ).nLeftDist ) &&
1692 0 : ( nRightDist == ( (SvxBoxItem&)rAttr ).nRightDist ) &&
1693 0 : CmpBrdLn( pTop, ( (SvxBoxItem&)rAttr ).GetTop() ) &&
1694 0 : CmpBrdLn( pBottom, ( (SvxBoxItem&)rAttr ).GetBottom() ) &&
1695 0 : CmpBrdLn( pLeft, ( (SvxBoxItem&)rAttr ).GetLeft() ) &&
1696 0 : CmpBrdLn( pRight, ( (SvxBoxItem&)rAttr ).GetRight() ) );
1697 : }
1698 :
1699 :
1700 0 : table::BorderLine2 SvxBoxItem::SvxLineToLine(const SvxBorderLine* pLine, bool bConvert)
1701 : {
1702 0 : table::BorderLine2 aLine;
1703 0 : if(pLine)
1704 : {
1705 0 : aLine.Color = pLine->GetColor().GetColor() ;
1706 0 : aLine.InnerLineWidth = sal_uInt16( bConvert ? convertTwipToMm100(pLine->GetInWidth() ): pLine->GetInWidth() );
1707 0 : aLine.OuterLineWidth = sal_uInt16( bConvert ? convertTwipToMm100(pLine->GetOutWidth()): pLine->GetOutWidth() );
1708 0 : aLine.LineDistance = sal_uInt16( bConvert ? convertTwipToMm100(pLine->GetDistance()): pLine->GetDistance() );
1709 0 : aLine.LineStyle = pLine->GetBorderLineStyle();
1710 0 : aLine.LineWidth = sal_uInt32( bConvert ? convertTwipToMm100( pLine->GetWidth( ) ) : pLine->GetWidth( ) );
1711 : }
1712 : else
1713 0 : aLine.Color = aLine.InnerLineWidth = aLine.OuterLineWidth = aLine.LineDistance = 0;
1714 0 : return aLine;
1715 : }
1716 :
1717 0 : bool SvxBoxItem::QueryValue( uno::Any& rVal, sal_uInt8 nMemberId ) const
1718 : {
1719 0 : sal_Bool bConvert = 0!=(nMemberId&CONVERT_TWIPS);
1720 0 : table::BorderLine2 aRetLine;
1721 0 : sal_uInt16 nDist = 0;
1722 0 : sal_Bool bDistMember = sal_False;
1723 0 : nMemberId &= ~CONVERT_TWIPS;
1724 0 : switch(nMemberId)
1725 : {
1726 : case 0:
1727 : {
1728 : // 4 Borders and 5 distances
1729 0 : uno::Sequence< uno::Any > aSeq( 9 );
1730 0 : aSeq[0] = uno::makeAny( SvxBoxItem::SvxLineToLine(GetLeft(), bConvert) );
1731 0 : aSeq[1] = uno::makeAny( SvxBoxItem::SvxLineToLine(GetRight(), bConvert) );
1732 0 : aSeq[2] = uno::makeAny( SvxBoxItem::SvxLineToLine(GetBottom(), bConvert) );
1733 0 : aSeq[3] = uno::makeAny( SvxBoxItem::SvxLineToLine(GetTop(), bConvert) );
1734 0 : aSeq[4] <<= uno::makeAny( (sal_Int32)(bConvert ? convertTwipToMm100( GetDistance()) : GetDistance()));
1735 0 : aSeq[5] <<= uno::makeAny( (sal_Int32)(bConvert ? convertTwipToMm100( nTopDist ) : nTopDist ));
1736 0 : aSeq[6] <<= uno::makeAny( (sal_Int32)(bConvert ? convertTwipToMm100( nBottomDist ) : nBottomDist ));
1737 0 : aSeq[7] <<= uno::makeAny( (sal_Int32)(bConvert ? convertTwipToMm100( nLeftDist ) : nLeftDist ));
1738 0 : aSeq[8] <<= uno::makeAny( (sal_Int32)(bConvert ? convertTwipToMm100( nRightDist ) : nRightDist ));
1739 0 : rVal = uno::makeAny( aSeq );
1740 0 : return true;
1741 : }
1742 : case MID_LEFT_BORDER:
1743 : case LEFT_BORDER:
1744 0 : aRetLine = SvxBoxItem::SvxLineToLine(GetLeft(), bConvert);
1745 0 : break;
1746 : case MID_RIGHT_BORDER:
1747 : case RIGHT_BORDER:
1748 0 : aRetLine = SvxBoxItem::SvxLineToLine(GetRight(), bConvert);
1749 0 : break;
1750 : case MID_BOTTOM_BORDER:
1751 : case BOTTOM_BORDER:
1752 0 : aRetLine = SvxBoxItem::SvxLineToLine(GetBottom(), bConvert);
1753 0 : break;
1754 : case MID_TOP_BORDER:
1755 : case TOP_BORDER:
1756 0 : aRetLine = SvxBoxItem::SvxLineToLine(GetTop(), bConvert);
1757 0 : break;
1758 : case BORDER_DISTANCE:
1759 0 : nDist = GetDistance();
1760 0 : bDistMember = sal_True;
1761 0 : break;
1762 : case TOP_BORDER_DISTANCE:
1763 0 : nDist = nTopDist;
1764 0 : bDistMember = sal_True;
1765 0 : break;
1766 : case BOTTOM_BORDER_DISTANCE:
1767 0 : nDist = nBottomDist;
1768 0 : bDistMember = sal_True;
1769 0 : break;
1770 : case LEFT_BORDER_DISTANCE:
1771 0 : nDist = nLeftDist;
1772 0 : bDistMember = sal_True;
1773 0 : break;
1774 : case RIGHT_BORDER_DISTANCE:
1775 0 : nDist = nRightDist;
1776 0 : bDistMember = sal_True;
1777 0 : break;
1778 : }
1779 :
1780 0 : if( bDistMember )
1781 0 : rVal <<= (sal_Int32)(bConvert ? convertTwipToMm100(nDist) : nDist);
1782 : else
1783 0 : rVal <<= aRetLine;
1784 :
1785 0 : return true;
1786 : }
1787 :
1788 : namespace
1789 : {
1790 :
1791 : sal_Bool
1792 0 : lcl_lineToSvxLine(const table::BorderLine& rLine, SvxBorderLine& rSvxLine, sal_Bool bConvert, sal_Bool bGuessWidth)
1793 : {
1794 0 : rSvxLine.SetColor( Color(rLine.Color));
1795 0 : if ( bGuessWidth )
1796 : {
1797 0 : rSvxLine.GuessLinesWidths( rSvxLine.GetBorderLineStyle(),
1798 0 : sal_uInt16( bConvert ? convertMm100ToTwip(rLine.OuterLineWidth) : rLine.OuterLineWidth ),
1799 0 : sal_uInt16( bConvert ? convertMm100ToTwip(rLine.InnerLineWidth) : rLine.InnerLineWidth ),
1800 0 : sal_uInt16( bConvert ? convertMm100ToTwip(rLine.LineDistance ) : rLine.LineDistance ));
1801 : }
1802 :
1803 0 : sal_Bool bRet = !rSvxLine.isEmpty();
1804 0 : return bRet;
1805 : }
1806 :
1807 : }
1808 :
1809 :
1810 0 : bool SvxBoxItem::LineToSvxLine(const ::com::sun::star::table::BorderLine& rLine, SvxBorderLine& rSvxLine, bool bConvert)
1811 : {
1812 0 : return lcl_lineToSvxLine(rLine, rSvxLine, bConvert, sal_True);
1813 : }
1814 :
1815 : bool
1816 0 : SvxBoxItem::LineToSvxLine(const ::com::sun::star::table::BorderLine2& rLine, SvxBorderLine& rSvxLine, bool bConvert)
1817 : {
1818 : SvxBorderStyle const nStyle =
1819 0 : (rLine.LineStyle < 0 || BORDER_LINE_STYLE_MAX < rLine.LineStyle)
1820 : ? SOLID // default
1821 0 : : rLine.LineStyle;
1822 :
1823 0 : rSvxLine.SetBorderLineStyle( nStyle );
1824 :
1825 0 : sal_Bool bGuessWidth = sal_True;
1826 0 : if ( rLine.LineWidth )
1827 : {
1828 0 : rSvxLine.SetWidth( bConvert? convertMm100ToTwip( rLine.LineWidth ) : rLine.LineWidth );
1829 : // fdo#46112: double does not necessarily mean symmetric
1830 : // for backwards compatibility
1831 0 : bGuessWidth = ((DOUBLE == nStyle || DOUBLE_THIN == nStyle)) &&
1832 0 : (rLine.InnerLineWidth > 0) && (rLine.OuterLineWidth > 0);
1833 : }
1834 :
1835 0 : return lcl_lineToSvxLine(rLine, rSvxLine, bConvert, bGuessWidth);
1836 : }
1837 :
1838 :
1839 :
1840 : namespace
1841 : {
1842 :
1843 : bool
1844 0 : lcl_extractBorderLine(const uno::Any& rAny, table::BorderLine2& rLine)
1845 : {
1846 0 : if (rAny >>= rLine)
1847 0 : return true;
1848 :
1849 0 : table::BorderLine aBorderLine;
1850 0 : if (rAny >>= aBorderLine)
1851 : {
1852 0 : rLine.Color = aBorderLine.Color;
1853 0 : rLine.InnerLineWidth = aBorderLine.InnerLineWidth;
1854 0 : rLine.OuterLineWidth = aBorderLine.OuterLineWidth;
1855 0 : rLine.LineDistance = aBorderLine.LineDistance;
1856 0 : rLine.LineStyle = table::BorderLineStyle::SOLID;
1857 0 : return true;
1858 : }
1859 :
1860 0 : return false;
1861 : }
1862 :
1863 : template<typename Item>
1864 : bool
1865 0 : lcl_setLine(const uno::Any& rAny, Item& rItem, sal_uInt16 nLine, const bool bConvert)
1866 : {
1867 0 : bool bDone = false;
1868 0 : table::BorderLine2 aBorderLine;
1869 0 : if (lcl_extractBorderLine(rAny, aBorderLine))
1870 : {
1871 0 : SvxBorderLine aLine;
1872 0 : bool bSet = SvxBoxItem::LineToSvxLine(aBorderLine, aLine, bConvert);
1873 0 : rItem.SetLine( bSet ? &aLine : NULL, nLine);
1874 0 : bDone = true;
1875 : }
1876 0 : return bDone;
1877 : }
1878 :
1879 : }
1880 :
1881 0 : bool SvxBoxItem::PutValue( const uno::Any& rVal, sal_uInt8 nMemberId )
1882 : {
1883 0 : bool bConvert = 0!=(nMemberId&CONVERT_TWIPS);
1884 0 : sal_uInt16 nLine = BOX_LINE_TOP;
1885 0 : sal_Bool bDistMember = sal_False;
1886 0 : nMemberId &= ~CONVERT_TWIPS;
1887 0 : switch(nMemberId)
1888 : {
1889 : case 0:
1890 : {
1891 0 : uno::Sequence< uno::Any > aSeq;
1892 0 : if (( rVal >>= aSeq ) && ( aSeq.getLength() == 9 ))
1893 : {
1894 : // 4 Borders and 5 distances
1895 0 : const sal_uInt16 aBorders[] = { BOX_LINE_LEFT, BOX_LINE_RIGHT, BOX_LINE_BOTTOM, BOX_LINE_TOP };
1896 0 : for (int n(0); n != SAL_N_ELEMENTS(aBorders); ++n)
1897 : {
1898 0 : if (!lcl_setLine(aSeq[n], *this, aBorders[n], bConvert))
1899 0 : return false;
1900 : }
1901 :
1902 : // WTH are the borders and the distances saved in different order?
1903 0 : sal_uInt16 nLines[4] = { BOX_LINE_TOP, BOX_LINE_BOTTOM, BOX_LINE_LEFT, BOX_LINE_RIGHT };
1904 0 : for ( sal_Int32 n = 4; n < 9; n++ )
1905 : {
1906 0 : sal_Int32 nDist = 0;
1907 0 : if ( aSeq[n] >>= nDist )
1908 : {
1909 0 : if( bConvert )
1910 0 : nDist = convertMm100ToTwip(nDist);
1911 0 : if ( n == 4 )
1912 0 : SetDistance( sal_uInt16( nDist ));
1913 : else
1914 0 : SetDistance( sal_uInt16( nDist ), nLines[n-5] );
1915 : }
1916 : else
1917 0 : return false;
1918 : }
1919 :
1920 0 : return true;
1921 : }
1922 : else
1923 0 : return false;
1924 : }
1925 : case LEFT_BORDER_DISTANCE:
1926 0 : bDistMember = sal_True;
1927 : case LEFT_BORDER:
1928 : case MID_LEFT_BORDER:
1929 0 : nLine = BOX_LINE_LEFT;
1930 0 : break;
1931 : case RIGHT_BORDER_DISTANCE:
1932 0 : bDistMember = sal_True;
1933 : case RIGHT_BORDER:
1934 : case MID_RIGHT_BORDER:
1935 0 : nLine = BOX_LINE_RIGHT;
1936 0 : break;
1937 : case BOTTOM_BORDER_DISTANCE:
1938 0 : bDistMember = sal_True;
1939 : case BOTTOM_BORDER:
1940 : case MID_BOTTOM_BORDER:
1941 0 : nLine = BOX_LINE_BOTTOM;
1942 0 : break;
1943 : case TOP_BORDER_DISTANCE:
1944 0 : bDistMember = sal_True;
1945 : case TOP_BORDER:
1946 : case MID_TOP_BORDER:
1947 0 : nLine = BOX_LINE_TOP;
1948 0 : break;
1949 : case LINE_STYLE:
1950 : {
1951 : drawing::LineStyle eDrawingStyle;
1952 0 : rVal >>= eDrawingStyle;
1953 0 : editeng::SvxBorderStyle eBorderStyle = NONE;
1954 0 : switch ( eDrawingStyle )
1955 : {
1956 : default:
1957 : case drawing::LineStyle_NONE:
1958 0 : break;
1959 : case drawing::LineStyle_SOLID:
1960 0 : eBorderStyle = SOLID;
1961 0 : break;
1962 : case drawing::LineStyle_DASH:
1963 0 : eBorderStyle = DASHED;
1964 0 : break;
1965 : }
1966 :
1967 : // Set the line style on all borders
1968 0 : const sal_uInt16 aBorders[] = { BOX_LINE_LEFT, BOX_LINE_RIGHT, BOX_LINE_BOTTOM, BOX_LINE_TOP };
1969 0 : for (int n(0); n != SAL_N_ELEMENTS(aBorders); ++n)
1970 : {
1971 0 : editeng::SvxBorderLine* pLine = const_cast< editeng::SvxBorderLine* >( GetLine( aBorders[n] ) );
1972 0 : if( pLine )
1973 0 : pLine->SetBorderLineStyle( eBorderStyle );
1974 : }
1975 0 : return true;
1976 : }
1977 : break;
1978 : case LINE_WIDTH:
1979 : {
1980 : // Set the line width on all borders
1981 0 : long nWidth(0);
1982 0 : rVal >>= nWidth;
1983 0 : if( bConvert )
1984 0 : nWidth = convertMm100ToTwip( nWidth );
1985 :
1986 : // Set the line Width on all borders
1987 0 : const sal_uInt16 aBorders[] = { BOX_LINE_LEFT, BOX_LINE_RIGHT, BOX_LINE_BOTTOM, BOX_LINE_TOP };
1988 0 : for (int n(0); n != SAL_N_ELEMENTS(aBorders); ++n)
1989 : {
1990 0 : editeng::SvxBorderLine* pLine = const_cast< editeng::SvxBorderLine* >( GetLine( aBorders[n] ) );
1991 0 : if( pLine )
1992 0 : pLine->SetWidth( nWidth );
1993 : }
1994 : }
1995 0 : return true;
1996 : }
1997 :
1998 0 : if( bDistMember || nMemberId == BORDER_DISTANCE )
1999 : {
2000 0 : sal_Int32 nDist = 0;
2001 0 : if(!(rVal >>= nDist))
2002 0 : return false;
2003 :
2004 0 : if(nDist >= 0)
2005 : {
2006 0 : if( bConvert )
2007 0 : nDist = convertMm100ToTwip(nDist);
2008 0 : if( nMemberId == BORDER_DISTANCE )
2009 0 : SetDistance( sal_uInt16( nDist ));
2010 : else
2011 0 : SetDistance( sal_uInt16( nDist ), nLine );
2012 0 : }
2013 : }
2014 : else
2015 : {
2016 0 : SvxBorderLine aLine;
2017 0 : if( !rVal.hasValue() )
2018 0 : return false;
2019 :
2020 0 : table::BorderLine2 aBorderLine;
2021 0 : if( lcl_extractBorderLine(rVal, aBorderLine) )
2022 : {
2023 : // usual struct
2024 : }
2025 0 : else if (rVal.getValueTypeClass() == uno::TypeClass_SEQUENCE )
2026 : {
2027 : // serialization for basic macro recording
2028 : uno::Reference < script::XTypeConverter > xConverter
2029 0 : ( script::Converter::create(::comphelper::getProcessComponentContext()) );
2030 0 : uno::Sequence < uno::Any > aSeq;
2031 0 : uno::Any aNew;
2032 0 : try { aNew = xConverter->convertTo( rVal, ::getCppuType((const uno::Sequence < uno::Any >*)0) ); }
2033 0 : catch (const uno::Exception&) {}
2034 :
2035 0 : aNew >>= aSeq;
2036 0 : if (aSeq.getLength() >= 4 && aSeq.getLength() <= 6)
2037 : {
2038 0 : sal_Int32 nVal = 0;
2039 0 : if ( aSeq[0] >>= nVal )
2040 0 : aBorderLine.Color = nVal;
2041 0 : if ( aSeq[1] >>= nVal )
2042 0 : aBorderLine.InnerLineWidth = (sal_Int16) nVal;
2043 0 : if ( aSeq[2] >>= nVal )
2044 0 : aBorderLine.OuterLineWidth = (sal_Int16) nVal;
2045 0 : if ( aSeq[3] >>= nVal )
2046 0 : aBorderLine.LineDistance = (sal_Int16) nVal;
2047 0 : if (aSeq.getLength() >= 5) // fdo#40874 added fields
2048 : {
2049 0 : if (aSeq[4] >>= nVal)
2050 : {
2051 0 : aBorderLine.LineStyle = nVal;
2052 : }
2053 0 : if (aSeq.getLength() >= 6)
2054 : {
2055 0 : if (aSeq[5] >>= nVal)
2056 : {
2057 0 : aBorderLine.LineWidth = nVal;
2058 : }
2059 : }
2060 : }
2061 : }
2062 : else
2063 0 : return false;
2064 : }
2065 : else
2066 0 : return false;
2067 :
2068 0 : sal_Bool bSet = SvxBoxItem::LineToSvxLine(aBorderLine, aLine, bConvert);
2069 0 : SetLine(bSet ? &aLine : 0, nLine);
2070 : }
2071 :
2072 0 : return true;
2073 : }
2074 :
2075 :
2076 :
2077 0 : SfxPoolItem* SvxBoxItem::Clone( SfxItemPool* ) const
2078 : {
2079 0 : return new SvxBoxItem( *this );
2080 : }
2081 :
2082 :
2083 :
2084 0 : SfxItemPresentation SvxBoxItem::GetPresentation
2085 : (
2086 : SfxItemPresentation ePres,
2087 : SfxMapUnit eCoreUnit,
2088 : SfxMapUnit ePresUnit,
2089 : OUString& rText, const IntlWrapper *pIntl
2090 : ) const
2091 : {
2092 0 : OUString cpDelimTmp = OUString(cpDelim);
2093 0 : switch ( ePres )
2094 : {
2095 : case SFX_ITEM_PRESENTATION_NONE:
2096 0 : rText = OUString();
2097 0 : return SFX_ITEM_PRESENTATION_NONE;
2098 :
2099 : case SFX_ITEM_PRESENTATION_NAMELESS:
2100 : {
2101 0 : rText = OUString();
2102 :
2103 0 : if ( pTop )
2104 : {
2105 0 : rText = pTop->GetValueString( eCoreUnit, ePresUnit, pIntl ) + cpDelimTmp;
2106 : }
2107 0 : if( !(pTop && pBottom && pLeft && pRight &&
2108 0 : *pTop == *pBottom && *pTop == *pLeft && *pTop == *pRight) )
2109 : {
2110 0 : if ( pBottom )
2111 : {
2112 0 : rText = rText + pBottom->GetValueString( eCoreUnit, ePresUnit, pIntl ) + cpDelimTmp;
2113 : }
2114 0 : if ( pLeft )
2115 : {
2116 0 : rText = rText + pLeft->GetValueString( eCoreUnit, ePresUnit, pIntl ) + cpDelimTmp;
2117 : }
2118 0 : if ( pRight )
2119 : {
2120 0 : rText = rText + pRight->GetValueString( eCoreUnit, ePresUnit, pIntl ) + cpDelimTmp;
2121 : }
2122 : }
2123 0 : rText += GetMetricText( (long)nTopDist, eCoreUnit, ePresUnit, pIntl );
2124 0 : if( nTopDist != nBottomDist || nTopDist != nLeftDist ||
2125 0 : nTopDist != nRightDist )
2126 : {
2127 0 : rText = rText +
2128 0 : cpDelimTmp +
2129 : GetMetricText( (long)nBottomDist, eCoreUnit,
2130 0 : ePresUnit, pIntl ) +
2131 0 : cpDelimTmp +
2132 0 : GetMetricText( (long)nLeftDist, eCoreUnit, ePresUnit, pIntl ) +
2133 0 : cpDelimTmp +
2134 : GetMetricText( (long)nRightDist, eCoreUnit,
2135 0 : ePresUnit, pIntl );
2136 : }
2137 0 : return SFX_ITEM_PRESENTATION_NAMELESS;
2138 : }
2139 : case SFX_ITEM_PRESENTATION_COMPLETE:
2140 : {
2141 0 : if( !(pTop || pBottom || pLeft || pRight) )
2142 : {
2143 0 : rText = EE_RESSTR(RID_SVXITEMS_BORDER_NONE) + cpDelimTmp;
2144 : }
2145 : else
2146 : {
2147 0 : rText = EE_RESSTR(RID_SVXITEMS_BORDER_COMPLETE);
2148 0 : if( pTop && pBottom && pLeft && pRight &&
2149 0 : *pTop == *pBottom && *pTop == *pLeft && *pTop == *pRight )
2150 : {
2151 0 : rText += pTop->GetValueString( eCoreUnit, ePresUnit, pIntl, true ) + cpDelimTmp;
2152 : }
2153 : else
2154 : {
2155 0 : if ( pTop )
2156 : {
2157 0 : rText = rText +
2158 0 : EE_RESSTR(RID_SVXITEMS_BORDER_TOP) +
2159 0 : pTop->GetValueString( eCoreUnit, ePresUnit, pIntl, true ) +
2160 0 : cpDelimTmp;
2161 : }
2162 0 : if ( pBottom )
2163 : {
2164 0 : rText = rText +
2165 0 : EE_RESSTR(RID_SVXITEMS_BORDER_BOTTOM) +
2166 0 : pBottom->GetValueString( eCoreUnit, ePresUnit, pIntl, true ) +
2167 0 : cpDelimTmp;
2168 : }
2169 0 : if ( pLeft )
2170 : {
2171 0 : rText = rText +
2172 0 : EE_RESSTR(RID_SVXITEMS_BORDER_LEFT) +
2173 0 : pLeft->GetValueString( eCoreUnit, ePresUnit, pIntl, true ) +
2174 0 : cpDelimTmp;
2175 : }
2176 0 : if ( pRight )
2177 : {
2178 0 : rText = rText +
2179 0 : EE_RESSTR(RID_SVXITEMS_BORDER_RIGHT) +
2180 0 : pRight->GetValueString( eCoreUnit, ePresUnit, pIntl, true ) +
2181 0 : cpDelimTmp;
2182 : }
2183 : }
2184 : }
2185 :
2186 0 : rText += EE_RESSTR(RID_SVXITEMS_BORDER_DISTANCE);
2187 0 : if( nTopDist == nBottomDist && nTopDist == nLeftDist &&
2188 0 : nTopDist == nRightDist )
2189 : {
2190 0 : rText = rText +
2191 : GetMetricText( (long)nTopDist, eCoreUnit,
2192 0 : ePresUnit, pIntl ) +
2193 0 : " " + EE_RESSTR(GetMetricId(ePresUnit));
2194 : }
2195 : else
2196 : {
2197 0 : rText = rText +
2198 0 : EE_RESSTR(RID_SVXITEMS_BORDER_TOP) +
2199 : GetMetricText( (long)nTopDist, eCoreUnit,
2200 0 : ePresUnit, pIntl ) +
2201 0 : " " + EE_RESSTR(GetMetricId(ePresUnit)) +
2202 0 : cpDelimTmp +
2203 0 : EE_RESSTR(RID_SVXITEMS_BORDER_BOTTOM) +
2204 : GetMetricText( (long)nBottomDist, eCoreUnit,
2205 0 : ePresUnit, pIntl ) +
2206 0 : " " + EE_RESSTR(GetMetricId(ePresUnit)) +
2207 0 : cpDelimTmp +
2208 0 : EE_RESSTR(RID_SVXITEMS_BORDER_LEFT) +
2209 : GetMetricText( (long)nLeftDist, eCoreUnit,
2210 0 : ePresUnit, pIntl ) +
2211 0 : " " + EE_RESSTR(GetMetricId(ePresUnit)) +
2212 0 : cpDelimTmp +
2213 0 : EE_RESSTR(RID_SVXITEMS_BORDER_RIGHT) +
2214 : GetMetricText( (long)nRightDist, eCoreUnit,
2215 0 : ePresUnit, pIntl ) +
2216 0 : " " + EE_RESSTR(GetMetricId(ePresUnit));
2217 : }
2218 0 : return SFX_ITEM_PRESENTATION_COMPLETE;
2219 : }
2220 : default: ;//prevent warning
2221 : }
2222 0 : return SFX_ITEM_PRESENTATION_NONE;
2223 : }
2224 :
2225 :
2226 :
2227 0 : SvStream& SvxBoxItem::Store( SvStream& rStrm , sal_uInt16 nItemVersion ) const
2228 : {
2229 0 : rStrm.WriteUInt16( (sal_uInt16) GetDistance() );
2230 : const SvxBorderLine* pLine[ 4 ]; // top, left, right, bottom
2231 0 : pLine[ 0 ] = GetTop();
2232 0 : pLine[ 1 ] = GetLeft();
2233 0 : pLine[ 2 ] = GetRight();
2234 0 : pLine[ 3 ] = GetBottom();
2235 :
2236 0 : for( int i = 0; i < 4; i++ )
2237 : {
2238 0 : const SvxBorderLine* l = pLine[ i ];
2239 0 : if( l )
2240 : {
2241 0 : rStrm.WriteSChar( static_cast<sal_Int8>(i) );
2242 0 : StoreBorderLine(rStrm, *l, BorderLineVersionFromBoxVersion(nItemVersion));
2243 : }
2244 : }
2245 0 : sal_Int8 cLine = 4;
2246 0 : if( nItemVersion >= BOX_4DISTS_VERSION &&
2247 0 : !(nTopDist == nLeftDist &&
2248 0 : nTopDist == nRightDist &&
2249 0 : nTopDist == nBottomDist) )
2250 : {
2251 0 : cLine |= 0x10;
2252 : }
2253 :
2254 0 : rStrm.WriteSChar( cLine );
2255 :
2256 0 : if( nItemVersion >= BOX_4DISTS_VERSION && (cLine & 0x10) != 0 )
2257 : {
2258 0 : rStrm.WriteUInt16( (sal_uInt16)nTopDist )
2259 0 : .WriteUInt16( (sal_uInt16)nLeftDist )
2260 0 : .WriteUInt16( (sal_uInt16)nRightDist )
2261 0 : .WriteUInt16( (sal_uInt16)nBottomDist );
2262 : }
2263 :
2264 0 : return rStrm;
2265 : }
2266 :
2267 :
2268 :
2269 0 : sal_uInt16 SvxBoxItem::GetVersion( sal_uInt16 nFFVer ) const
2270 : {
2271 : DBG_ASSERT( SOFFICE_FILEFORMAT_31==nFFVer ||
2272 : SOFFICE_FILEFORMAT_40==nFFVer ||
2273 : SOFFICE_FILEFORMAT_50==nFFVer,
2274 : "SvxBoxItem: Gibt es ein neues Fileformat?" );
2275 0 : return SOFFICE_FILEFORMAT_31==nFFVer ||
2276 0 : SOFFICE_FILEFORMAT_40==nFFVer ? 0 : BOX_BORDER_STYLE_VERSION;
2277 : }
2278 :
2279 :
2280 :
2281 0 : bool SvxBoxItem::ScaleMetrics( long nMult, long nDiv )
2282 : {
2283 0 : if ( pTop ) pTop->ScaleMetrics( nMult, nDiv );
2284 0 : if ( pBottom ) pBottom->ScaleMetrics( nMult, nDiv );
2285 0 : if ( pLeft ) pLeft->ScaleMetrics( nMult, nDiv );
2286 0 : if ( pRight ) pRight->ScaleMetrics( nMult, nDiv );
2287 0 : nTopDist = (sal_uInt16)Scale( nTopDist, nMult, nDiv );
2288 0 : nBottomDist = (sal_uInt16)Scale( nBottomDist, nMult, nDiv );
2289 0 : nLeftDist = (sal_uInt16)Scale( nLeftDist, nMult, nDiv );
2290 0 : nRightDist = (sal_uInt16)Scale( nRightDist, nMult, nDiv );
2291 0 : return true;
2292 : }
2293 :
2294 :
2295 :
2296 0 : bool SvxBoxItem::HasMetrics() const
2297 : {
2298 0 : return true;
2299 : }
2300 :
2301 :
2302 :
2303 0 : SfxPoolItem* SvxBoxItem::Create( SvStream& rStrm, sal_uInt16 nIVersion ) const
2304 : {
2305 : sal_uInt16 nDistance;
2306 0 : rStrm.ReadUInt16( nDistance );
2307 0 : SvxBoxItem* pAttr = new SvxBoxItem( Which() );
2308 :
2309 : sal_uInt16 aLineMap[4] = { BOX_LINE_TOP, BOX_LINE_LEFT,
2310 0 : BOX_LINE_RIGHT, BOX_LINE_BOTTOM };
2311 :
2312 : sal_Int8 cLine;
2313 : while( true )
2314 : {
2315 0 : rStrm.ReadSChar( cLine );
2316 :
2317 0 : if( cLine > 3 )
2318 0 : break;
2319 :
2320 0 : SvxBorderLine aBorder = CreateBorderLine(rStrm, BorderLineVersionFromBoxVersion(nIVersion));
2321 0 : pAttr->SetLine( &aBorder, aLineMap[cLine] );
2322 : }
2323 :
2324 0 : if( nIVersion >= BOX_4DISTS_VERSION && (cLine&0x10) != 0 )
2325 : {
2326 0 : for( sal_uInt16 i=0; i < 4; i++ )
2327 : {
2328 : sal_uInt16 nDist;
2329 0 : rStrm.ReadUInt16( nDist );
2330 0 : pAttr->SetDistance( nDist, aLineMap[i] );
2331 0 : }
2332 : }
2333 : else
2334 : {
2335 0 : pAttr->SetDistance( nDistance );
2336 : }
2337 :
2338 0 : return pAttr;
2339 : }
2340 :
2341 :
2342 :
2343 0 : const SvxBorderLine *SvxBoxItem::GetLine( sal_uInt16 nLine ) const
2344 : {
2345 0 : const SvxBorderLine *pRet = 0;
2346 :
2347 0 : switch ( nLine )
2348 : {
2349 : case BOX_LINE_TOP:
2350 0 : pRet = pTop;
2351 0 : break;
2352 : case BOX_LINE_BOTTOM:
2353 0 : pRet = pBottom;
2354 0 : break;
2355 : case BOX_LINE_LEFT:
2356 0 : pRet = pLeft;
2357 0 : break;
2358 : case BOX_LINE_RIGHT:
2359 0 : pRet = pRight;
2360 0 : break;
2361 : default:
2362 : OSL_FAIL( "wrong line" );
2363 0 : break;
2364 : }
2365 :
2366 0 : return pRet;
2367 : }
2368 :
2369 :
2370 :
2371 0 : void SvxBoxItem::SetLine( const SvxBorderLine* pNew, sal_uInt16 nLine )
2372 : {
2373 0 : SvxBorderLine* pTmp = pNew ? new SvxBorderLine( *pNew ) : 0;
2374 :
2375 0 : switch ( nLine )
2376 : {
2377 : case BOX_LINE_TOP:
2378 0 : delete pTop;
2379 0 : pTop = pTmp;
2380 0 : break;
2381 : case BOX_LINE_BOTTOM:
2382 0 : delete pBottom;
2383 0 : pBottom = pTmp;
2384 0 : break;
2385 : case BOX_LINE_LEFT:
2386 0 : delete pLeft;
2387 0 : pLeft = pTmp;
2388 0 : break;
2389 : case BOX_LINE_RIGHT:
2390 0 : delete pRight;
2391 0 : pRight = pTmp;
2392 0 : break;
2393 : default:
2394 0 : delete pTmp;
2395 : OSL_FAIL( "wrong line" );
2396 : }
2397 0 : }
2398 :
2399 :
2400 :
2401 0 : sal_uInt16 SvxBoxItem::GetDistance() const
2402 : {
2403 : // The smallest distance that is not 0 will be returned.
2404 0 : sal_uInt16 nDist = nTopDist;
2405 0 : if( nBottomDist && (!nDist || nBottomDist < nDist) )
2406 0 : nDist = nBottomDist;
2407 0 : if( nLeftDist && (!nDist || nLeftDist < nDist) )
2408 0 : nDist = nLeftDist;
2409 0 : if( nRightDist && (!nDist || nRightDist < nDist) )
2410 0 : nDist = nRightDist;
2411 :
2412 0 : return nDist;
2413 : }
2414 :
2415 :
2416 :
2417 0 : sal_uInt16 SvxBoxItem::GetDistance( sal_uInt16 nLine ) const
2418 : {
2419 0 : sal_uInt16 nDist = 0;
2420 0 : switch ( nLine )
2421 : {
2422 : case BOX_LINE_TOP:
2423 0 : nDist = nTopDist;
2424 0 : break;
2425 : case BOX_LINE_BOTTOM:
2426 0 : nDist = nBottomDist;
2427 0 : break;
2428 : case BOX_LINE_LEFT:
2429 0 : nDist = nLeftDist;
2430 0 : break;
2431 : case BOX_LINE_RIGHT:
2432 0 : nDist = nRightDist;
2433 0 : break;
2434 : default:
2435 : OSL_FAIL( "wrong line" );
2436 : }
2437 :
2438 0 : return nDist;
2439 : }
2440 :
2441 :
2442 :
2443 0 : void SvxBoxItem::SetDistance( sal_uInt16 nNew, sal_uInt16 nLine )
2444 : {
2445 0 : switch ( nLine )
2446 : {
2447 : case BOX_LINE_TOP:
2448 0 : nTopDist = nNew;
2449 0 : break;
2450 : case BOX_LINE_BOTTOM:
2451 0 : nBottomDist = nNew;
2452 0 : break;
2453 : case BOX_LINE_LEFT:
2454 0 : nLeftDist = nNew;
2455 0 : break;
2456 : case BOX_LINE_RIGHT:
2457 0 : nRightDist = nNew;
2458 0 : break;
2459 : default:
2460 : OSL_FAIL( "wrong line" );
2461 : }
2462 0 : }
2463 :
2464 :
2465 :
2466 0 : sal_uInt16 SvxBoxItem::CalcLineSpace( sal_uInt16 nLine, bool bIgnoreLine ) const
2467 : {
2468 0 : SvxBorderLine* pTmp = 0;
2469 0 : sal_uInt16 nDist = 0;
2470 0 : switch ( nLine )
2471 : {
2472 : case BOX_LINE_TOP:
2473 0 : pTmp = pTop;
2474 0 : nDist = nTopDist;
2475 0 : break;
2476 : case BOX_LINE_BOTTOM:
2477 0 : pTmp = pBottom;
2478 0 : nDist = nBottomDist;
2479 0 : break;
2480 : case BOX_LINE_LEFT:
2481 0 : pTmp = pLeft;
2482 0 : nDist = nLeftDist;
2483 0 : break;
2484 : case BOX_LINE_RIGHT:
2485 0 : pTmp = pRight;
2486 0 : nDist = nRightDist;
2487 0 : break;
2488 : default:
2489 : OSL_FAIL( "wrong line" );
2490 : }
2491 :
2492 0 : if( pTmp )
2493 : {
2494 0 : nDist = nDist + pTmp->GetScaledWidth();
2495 : }
2496 0 : else if( !bIgnoreLine )
2497 0 : nDist = 0;
2498 0 : return nDist;
2499 : }
2500 :
2501 : // class SvxBoxInfoItem --------------------------------------------------
2502 :
2503 0 : SvxBoxInfoItem::SvxBoxInfoItem( const sal_uInt16 nId ) :
2504 : SfxPoolItem( nId ),
2505 : pHori ( 0 ),
2506 : pVert ( 0 ),
2507 : mbEnableHor( false ),
2508 : mbEnableVer( false ),
2509 0 : nDefDist( 0 )
2510 : {
2511 0 : bDist = bMinDist = false;
2512 0 : ResetFlags();
2513 0 : }
2514 :
2515 :
2516 :
2517 0 : SvxBoxInfoItem::SvxBoxInfoItem( const SvxBoxInfoItem& rCpy ) :
2518 : SfxPoolItem( rCpy ),
2519 : mbEnableHor( rCpy.mbEnableHor ),
2520 0 : mbEnableVer( rCpy.mbEnableVer )
2521 : {
2522 0 : pHori = rCpy.GetHori() ? new SvxBorderLine( *rCpy.GetHori() ) : 0;
2523 0 : pVert = rCpy.GetVert() ? new SvxBorderLine( *rCpy.GetVert() ) : 0;
2524 0 : bDist = rCpy.IsDist();
2525 0 : bMinDist = rCpy.IsMinDist();
2526 0 : nValidFlags = rCpy.nValidFlags;
2527 0 : nDefDist = rCpy.GetDefDist();
2528 0 : }
2529 :
2530 :
2531 :
2532 0 : SvxBoxInfoItem::~SvxBoxInfoItem()
2533 : {
2534 0 : delete pHori;
2535 0 : delete pVert;
2536 0 : }
2537 :
2538 :
2539 :
2540 0 : SvxBoxInfoItem &SvxBoxInfoItem::operator=( const SvxBoxInfoItem& rCpy )
2541 : {
2542 0 : delete pHori;
2543 0 : delete pVert;
2544 0 : pHori = rCpy.GetHori() ? new SvxBorderLine( *rCpy.GetHori() ) : 0;
2545 0 : pVert = rCpy.GetVert() ? new SvxBorderLine( *rCpy.GetVert() ) : 0;
2546 0 : mbEnableHor = rCpy.mbEnableHor;
2547 0 : mbEnableVer = rCpy.mbEnableVer;
2548 0 : bDist = rCpy.IsDist();
2549 0 : bMinDist = rCpy.IsMinDist();
2550 0 : nValidFlags = rCpy.nValidFlags;
2551 0 : nDefDist = rCpy.GetDefDist();
2552 0 : return *this;
2553 : }
2554 :
2555 :
2556 :
2557 0 : bool SvxBoxInfoItem::operator==( const SfxPoolItem& rAttr ) const
2558 : {
2559 0 : SvxBoxInfoItem& rBoxInfo = (SvxBoxInfoItem&)rAttr;
2560 :
2561 : DBG_ASSERT( SfxPoolItem::operator==(rAttr), "unequal types" );
2562 :
2563 0 : return ( mbEnableHor == rBoxInfo.mbEnableHor
2564 0 : && mbEnableVer == rBoxInfo.mbEnableVer
2565 0 : && bDist == rBoxInfo.IsDist()
2566 0 : && bMinDist == rBoxInfo.IsMinDist()
2567 0 : && nValidFlags == rBoxInfo.nValidFlags
2568 0 : && nDefDist == rBoxInfo.GetDefDist()
2569 0 : && CmpBrdLn( pHori, rBoxInfo.GetHori() )
2570 0 : && CmpBrdLn( pVert, rBoxInfo.GetVert() )
2571 0 : );
2572 : }
2573 :
2574 :
2575 :
2576 0 : void SvxBoxInfoItem::SetLine( const SvxBorderLine* pNew, sal_uInt16 nLine )
2577 : {
2578 0 : SvxBorderLine* pTmp = pNew ? new SvxBorderLine( *pNew ) : 0;
2579 :
2580 0 : if ( BOXINFO_LINE_HORI == nLine )
2581 : {
2582 0 : delete pHori;
2583 0 : pHori = pTmp;
2584 : }
2585 0 : else if ( BOXINFO_LINE_VERT == nLine )
2586 : {
2587 0 : delete pVert;
2588 0 : pVert = pTmp;
2589 : }
2590 : else
2591 : {
2592 0 : delete pTmp;
2593 : OSL_FAIL( "wrong line" );
2594 : }
2595 0 : }
2596 :
2597 :
2598 :
2599 0 : SfxPoolItem* SvxBoxInfoItem::Clone( SfxItemPool* ) const
2600 : {
2601 0 : return new SvxBoxInfoItem( *this );
2602 : }
2603 :
2604 :
2605 :
2606 0 : SfxItemPresentation SvxBoxInfoItem::GetPresentation
2607 : (
2608 : SfxItemPresentation /*ePres*/,
2609 : SfxMapUnit /*eCoreUnit*/,
2610 : SfxMapUnit /*ePresUnit*/,
2611 : OUString& rText, const IntlWrapper *
2612 : ) const
2613 : {
2614 0 : rText = OUString();
2615 0 : return SFX_ITEM_PRESENTATION_NONE;
2616 : }
2617 :
2618 :
2619 :
2620 0 : SvStream& SvxBoxInfoItem::Store( SvStream& rStrm , sal_uInt16 /*nItemVersion*/ ) const
2621 : {
2622 0 : sal_Int8 cFlags = 0;
2623 :
2624 0 : if ( IsTable() )
2625 0 : cFlags |= 0x01;
2626 0 : if ( IsDist() )
2627 0 : cFlags |= 0x02;
2628 0 : if ( IsMinDist() )
2629 0 : cFlags |= 0x04;
2630 0 : rStrm.WriteSChar( (sal_Int8) cFlags )
2631 0 : .WriteUInt16( (sal_uInt16) GetDefDist() );
2632 : const SvxBorderLine* pLine[ 2 ];
2633 0 : pLine[ 0 ] = GetHori();
2634 0 : pLine[ 1 ] = GetVert();
2635 :
2636 0 : for( int i = 0; i < 2; i++ )
2637 : {
2638 0 : const SvxBorderLine* l = pLine[ i ];
2639 0 : if( l )
2640 : {
2641 0 : rStrm.WriteChar( (char) i );
2642 0 : WriteColor( rStrm, l->GetColor() );
2643 0 : rStrm.WriteInt16( (short) l->GetOutWidth() )
2644 0 : .WriteInt16( (short) l->GetInWidth() )
2645 0 : .WriteInt16( (short) l->GetDistance() );
2646 : }
2647 : }
2648 0 : rStrm.WriteChar( (char) 2 );
2649 0 : return rStrm;
2650 : }
2651 :
2652 :
2653 :
2654 0 : bool SvxBoxInfoItem::ScaleMetrics( long nMult, long nDiv )
2655 : {
2656 0 : if ( pHori ) pHori->ScaleMetrics( nMult, nDiv );
2657 0 : if ( pVert ) pVert->ScaleMetrics( nMult, nDiv );
2658 0 : nDefDist = (sal_uInt16)Scale( nDefDist, nMult, nDiv );
2659 0 : return true;
2660 : }
2661 :
2662 :
2663 :
2664 0 : bool SvxBoxInfoItem::HasMetrics() const
2665 : {
2666 0 : return true;
2667 : }
2668 :
2669 :
2670 :
2671 0 : SfxPoolItem* SvxBoxInfoItem::Create( SvStream& rStrm, sal_uInt16 ) const
2672 : {
2673 : sal_Int8 cFlags;
2674 : sal_uInt16 _nDefDist;
2675 0 : rStrm.ReadSChar( cFlags ).ReadUInt16( _nDefDist );
2676 :
2677 0 : SvxBoxInfoItem* pAttr = new SvxBoxInfoItem( Which() );
2678 :
2679 0 : pAttr->SetTable ( ( cFlags & 0x01 ) != 0 );
2680 0 : pAttr->SetDist ( ( cFlags & 0x02 ) != 0 );
2681 0 : pAttr->SetMinDist( ( cFlags & 0x04 ) != 0 );
2682 0 : pAttr->SetDefDist( _nDefDist );
2683 :
2684 : while( true )
2685 : {
2686 : sal_Int8 cLine;
2687 0 : rStrm.ReadSChar( cLine );
2688 :
2689 0 : if( cLine > 1 )
2690 0 : break;
2691 : short nOutline, nInline, nDistance;
2692 0 : Color aColor;
2693 0 : ReadColor( rStrm, aColor ).ReadInt16( nOutline ).ReadInt16( nInline ).ReadInt16( nDistance );
2694 0 : SvxBorderLine aBorder( &aColor );
2695 0 : aBorder.GuessLinesWidths(NONE, nOutline, nInline, nDistance);
2696 :
2697 0 : switch( cLine )
2698 : {
2699 0 : case 0: pAttr->SetLine( &aBorder, BOXINFO_LINE_HORI ); break;
2700 0 : case 1: pAttr->SetLine( &aBorder, BOXINFO_LINE_VERT ); break;
2701 : }
2702 : }
2703 0 : return pAttr;
2704 : }
2705 :
2706 :
2707 :
2708 0 : void SvxBoxInfoItem::ResetFlags()
2709 : {
2710 0 : nValidFlags = 0x7F; // all valid except Disable
2711 0 : }
2712 :
2713 0 : bool SvxBoxInfoItem::QueryValue( uno::Any& rVal, sal_uInt8 nMemberId ) const
2714 : {
2715 0 : sal_Bool bConvert = 0!=(nMemberId&CONVERT_TWIPS);
2716 0 : table::BorderLine2 aRetLine;
2717 0 : sal_Int16 nVal=0;
2718 0 : sal_Bool bIntMember = sal_False;
2719 0 : nMemberId &= ~CONVERT_TWIPS;
2720 0 : switch(nMemberId)
2721 : {
2722 : case 0:
2723 : {
2724 : // 2 BorderLines, flags, valid flags and distance
2725 0 : ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any > aSeq( 5 );
2726 0 : aSeq[0] = ::com::sun::star::uno::makeAny( SvxBoxItem::SvxLineToLine( pHori, bConvert) );
2727 0 : aSeq[1] = ::com::sun::star::uno::makeAny( SvxBoxItem::SvxLineToLine( pVert, bConvert) );
2728 0 : if ( IsTable() )
2729 0 : nVal |= 0x01;
2730 0 : if ( IsDist() )
2731 0 : nVal |= 0x02;
2732 0 : if ( IsMinDist() )
2733 0 : nVal |= 0x04;
2734 0 : aSeq[2] = ::com::sun::star::uno::makeAny( nVal );
2735 0 : nVal = nValidFlags;
2736 0 : aSeq[3] = ::com::sun::star::uno::makeAny( nVal );
2737 0 : aSeq[4] = ::com::sun::star::uno::makeAny( (sal_Int32)(bConvert ? convertTwipToMm100(GetDefDist()) : GetDefDist()) );
2738 0 : rVal = ::com::sun::star::uno::makeAny( aSeq );
2739 0 : return true;
2740 : }
2741 :
2742 : case MID_HORIZONTAL:
2743 0 : aRetLine = SvxBoxItem::SvxLineToLine( pHori, bConvert);
2744 0 : break;
2745 : case MID_VERTICAL:
2746 0 : aRetLine = SvxBoxItem::SvxLineToLine( pVert, bConvert);
2747 0 : break;
2748 : case MID_FLAGS:
2749 0 : bIntMember = sal_True;
2750 0 : if ( IsTable() )
2751 0 : nVal |= 0x01;
2752 0 : if ( IsDist() )
2753 0 : nVal |= 0x02;
2754 0 : if ( IsMinDist() )
2755 0 : nVal |= 0x04;
2756 0 : rVal <<= nVal;
2757 0 : break;
2758 : case MID_VALIDFLAGS:
2759 0 : bIntMember = sal_True;
2760 0 : nVal = nValidFlags;
2761 0 : rVal <<= nVal;
2762 0 : break;
2763 : case MID_DISTANCE:
2764 0 : bIntMember = sal_True;
2765 0 : rVal <<= (sal_Int32)(bConvert ? convertTwipToMm100(GetDefDist()) : GetDefDist());
2766 0 : break;
2767 0 : default: OSL_FAIL("Wrong MemberId!"); return false;
2768 : }
2769 :
2770 0 : if( !bIntMember )
2771 0 : rVal <<= aRetLine;
2772 :
2773 0 : return true;
2774 : }
2775 :
2776 :
2777 :
2778 0 : bool SvxBoxInfoItem::PutValue( const uno::Any& rVal, sal_uInt8 nMemberId )
2779 : {
2780 0 : sal_Bool bConvert = 0!=(nMemberId&CONVERT_TWIPS);
2781 0 : nMemberId &= ~CONVERT_TWIPS;
2782 : sal_Bool bRet;
2783 0 : switch(nMemberId)
2784 : {
2785 : case 0:
2786 : {
2787 0 : ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any > aSeq;
2788 0 : if (( rVal >>= aSeq ) && ( aSeq.getLength() == 5 ))
2789 : {
2790 : // 2 BorderLines, flags, valid flags and distance
2791 0 : if (!lcl_setLine(aSeq[0], *this, BOXINFO_LINE_HORI, bConvert))
2792 0 : return false;
2793 0 : if (!lcl_setLine(aSeq[1], *this, BOXINFO_LINE_VERT, bConvert))
2794 0 : return false;
2795 :
2796 0 : sal_Int16 nFlags( 0 );
2797 0 : sal_Int32 nVal( 0 );
2798 0 : if ( aSeq[2] >>= nFlags )
2799 : {
2800 0 : SetTable ( ( nFlags & 0x01 ) != 0 );
2801 0 : SetDist ( ( nFlags & 0x02 ) != 0 );
2802 0 : SetMinDist( ( nFlags & 0x04 ) != 0 );
2803 : }
2804 : else
2805 0 : return false;
2806 0 : if ( aSeq[3] >>= nFlags )
2807 0 : nValidFlags = (sal_uInt8)nFlags;
2808 : else
2809 0 : return false;
2810 0 : if (( aSeq[4] >>= nVal ) && ( nVal >= 0 ))
2811 : {
2812 0 : if( bConvert )
2813 0 : nVal = convertMm100ToTwip(nVal);
2814 0 : SetDefDist( (sal_uInt16)nVal );
2815 : }
2816 : }
2817 0 : return true;
2818 : }
2819 :
2820 : case MID_HORIZONTAL:
2821 : case MID_VERTICAL:
2822 : {
2823 0 : if( !rVal.hasValue() )
2824 0 : return false;
2825 :
2826 0 : table::BorderLine2 aBorderLine;
2827 0 : if( lcl_extractBorderLine(rVal, aBorderLine) )
2828 : {
2829 : // usual struct
2830 : }
2831 0 : else if (rVal.getValueTypeClass() == uno::TypeClass_SEQUENCE )
2832 : {
2833 : // serialization for basic macro recording
2834 0 : uno::Reference < script::XTypeConverter > xConverter( script::Converter::create(::comphelper::getProcessComponentContext()) );
2835 0 : uno::Any aNew;
2836 0 : uno::Sequence < uno::Any > aSeq;
2837 0 : try { aNew = xConverter->convertTo( rVal, ::getCppuType((const uno::Sequence < uno::Any >*)0) ); }
2838 0 : catch (const uno::Exception&) {}
2839 :
2840 0 : if ((aNew >>= aSeq) &&
2841 0 : aSeq.getLength() >= 4 && aSeq.getLength() <= 6)
2842 : {
2843 0 : sal_Int32 nVal = 0;
2844 0 : if ( aSeq[0] >>= nVal )
2845 0 : aBorderLine.Color = nVal;
2846 0 : if ( aSeq[1] >>= nVal )
2847 0 : aBorderLine.InnerLineWidth = (sal_Int16) nVal;
2848 0 : if ( aSeq[2] >>= nVal )
2849 0 : aBorderLine.OuterLineWidth = (sal_Int16) nVal;
2850 0 : if ( aSeq[3] >>= nVal )
2851 0 : aBorderLine.LineDistance = (sal_Int16) nVal;
2852 0 : if (aSeq.getLength() >= 5) // fdo#40874 added fields
2853 : {
2854 0 : if (aSeq[4] >>= nVal)
2855 : {
2856 0 : aBorderLine.LineStyle = nVal;
2857 : }
2858 0 : if (aSeq.getLength() >= 6)
2859 : {
2860 0 : if (aSeq[5] >>= nVal)
2861 : {
2862 0 : aBorderLine.LineWidth = nVal;
2863 : }
2864 : }
2865 : }
2866 : }
2867 : else
2868 0 : return false;
2869 : }
2870 0 : else if (rVal.getValueType() == ::getCppuType((const ::com::sun::star::uno::Sequence < sal_Int16 >*)0) )
2871 : {
2872 : // serialization for basic macro recording
2873 0 : ::com::sun::star::uno::Sequence < sal_Int16 > aSeq;
2874 0 : rVal >>= aSeq;
2875 0 : if (aSeq.getLength() >= 4 && aSeq.getLength() <= 6)
2876 : {
2877 0 : aBorderLine.Color = aSeq[0];
2878 0 : aBorderLine.InnerLineWidth = aSeq[1];
2879 0 : aBorderLine.OuterLineWidth = aSeq[2];
2880 0 : aBorderLine.LineDistance = aSeq[3];
2881 0 : if (aSeq.getLength() >= 5) // fdo#40874 added fields
2882 : {
2883 0 : aBorderLine.LineStyle = aSeq[4];
2884 0 : if (aSeq.getLength() >= 6)
2885 : {
2886 0 : aBorderLine.LineWidth = aSeq[5];
2887 : }
2888 : }
2889 : }
2890 : else
2891 0 : return false;
2892 : }
2893 : else
2894 0 : return false;
2895 :
2896 0 : SvxBorderLine aLine;
2897 0 : sal_Bool bSet = SvxBoxItem::LineToSvxLine(aBorderLine, aLine, bConvert);
2898 0 : if ( bSet )
2899 0 : SetLine( &aLine, nMemberId == MID_HORIZONTAL ? BOXINFO_LINE_HORI : BOXINFO_LINE_VERT );
2900 0 : break;
2901 : }
2902 : case MID_FLAGS:
2903 : {
2904 0 : sal_Int16 nFlags = sal_Int16();
2905 0 : bRet = (rVal >>= nFlags);
2906 0 : if ( bRet )
2907 : {
2908 0 : SetTable ( ( nFlags & 0x01 ) != 0 );
2909 0 : SetDist ( ( nFlags & 0x02 ) != 0 );
2910 0 : SetMinDist( ( nFlags & 0x04 ) != 0 );
2911 : }
2912 :
2913 0 : break;
2914 : }
2915 : case MID_VALIDFLAGS:
2916 : {
2917 0 : sal_Int16 nFlags = sal_Int16();
2918 0 : bRet = (rVal >>= nFlags);
2919 0 : if ( bRet )
2920 0 : nValidFlags = (sal_uInt8)nFlags;
2921 0 : break;
2922 : }
2923 : case MID_DISTANCE:
2924 : {
2925 0 : sal_Int32 nVal = 0;
2926 0 : bRet = (rVal >>= nVal);
2927 0 : if ( bRet && nVal>=0 )
2928 : {
2929 0 : if( bConvert )
2930 0 : nVal = convertMm100ToTwip(nVal);
2931 0 : SetDefDist( (sal_uInt16)nVal );
2932 : }
2933 0 : break;
2934 : }
2935 0 : default: OSL_FAIL("Wrong MemberId!"); return false;
2936 : }
2937 :
2938 0 : return true;
2939 : }
2940 :
2941 : // class SvxFmtBreakItem -------------------------------------------------
2942 :
2943 0 : bool SvxFmtBreakItem::operator==( const SfxPoolItem& rAttr ) const
2944 : {
2945 : DBG_ASSERT( SfxPoolItem::operator==( rAttr ), "unequal types" );
2946 :
2947 0 : return GetValue() == ( (SvxFmtBreakItem&)rAttr ).GetValue();
2948 : }
2949 :
2950 :
2951 :
2952 0 : SfxItemPresentation SvxFmtBreakItem::GetPresentation
2953 : (
2954 : SfxItemPresentation ePres,
2955 : SfxMapUnit /*eCoreUnit*/,
2956 : SfxMapUnit /*ePresUnit*/,
2957 : OUString& rText, const IntlWrapper *
2958 : ) const
2959 : {
2960 0 : switch ( ePres )
2961 : {
2962 : case SFX_ITEM_PRESENTATION_NONE:
2963 0 : rText = OUString();
2964 0 : return SFX_ITEM_PRESENTATION_NONE;
2965 :
2966 : case SFX_ITEM_PRESENTATION_NAMELESS:
2967 : case SFX_ITEM_PRESENTATION_COMPLETE:
2968 0 : rText = GetValueTextByPos( GetValue() );
2969 0 : return ePres;
2970 : default: ;//prevent warning
2971 : }
2972 0 : return SFX_ITEM_PRESENTATION_NONE;
2973 : }
2974 :
2975 :
2976 :
2977 0 : OUString SvxFmtBreakItem::GetValueTextByPos( sal_uInt16 nPos ) const
2978 : {
2979 : DBG_ASSERT( nPos < SVX_BREAK_END, "enum overflow!" );
2980 0 : return EE_RESSTR(RID_SVXITEMS_BREAK_BEGIN + nPos);
2981 : }
2982 :
2983 :
2984 0 : bool SvxFmtBreakItem::QueryValue( uno::Any& rVal, sal_uInt8 /*nMemberId*/ ) const
2985 : {
2986 0 : style::BreakType eBreak = style::BreakType_NONE;
2987 0 : switch ( (SvxBreak)GetValue() )
2988 : {
2989 0 : case SVX_BREAK_COLUMN_BEFORE: eBreak = style::BreakType_COLUMN_BEFORE; break;
2990 0 : case SVX_BREAK_COLUMN_AFTER: eBreak = style::BreakType_COLUMN_AFTER ; break;
2991 0 : case SVX_BREAK_COLUMN_BOTH: eBreak = style::BreakType_COLUMN_BOTH ; break;
2992 0 : case SVX_BREAK_PAGE_BEFORE: eBreak = style::BreakType_PAGE_BEFORE ; break;
2993 0 : case SVX_BREAK_PAGE_AFTER: eBreak = style::BreakType_PAGE_AFTER ; break;
2994 0 : case SVX_BREAK_PAGE_BOTH: eBreak = style::BreakType_PAGE_BOTH ; break;
2995 : default: ;//prevent warning
2996 : }
2997 0 : rVal <<= eBreak;
2998 0 : return true;
2999 : }
3000 :
3001 0 : bool SvxFmtBreakItem::PutValue( const uno::Any& rVal, sal_uInt8 /*nMemberId*/ )
3002 : {
3003 : style::BreakType nBreak;
3004 :
3005 0 : if(!(rVal >>= nBreak))
3006 : {
3007 0 : sal_Int32 nValue = 0;
3008 0 : if(!(rVal >>= nValue))
3009 0 : return false;
3010 :
3011 0 : nBreak = (style::BreakType) nValue;
3012 : }
3013 :
3014 0 : SvxBreak eBreak = SVX_BREAK_NONE;
3015 0 : switch( nBreak )
3016 : {
3017 0 : case style::BreakType_COLUMN_BEFORE: eBreak = SVX_BREAK_COLUMN_BEFORE; break;
3018 0 : case style::BreakType_COLUMN_AFTER: eBreak = SVX_BREAK_COLUMN_AFTER; break;
3019 0 : case style::BreakType_COLUMN_BOTH: eBreak = SVX_BREAK_COLUMN_BOTH; break;
3020 0 : case style::BreakType_PAGE_BEFORE: eBreak = SVX_BREAK_PAGE_BEFORE; break;
3021 0 : case style::BreakType_PAGE_AFTER: eBreak = SVX_BREAK_PAGE_AFTER; break;
3022 0 : case style::BreakType_PAGE_BOTH: eBreak = SVX_BREAK_PAGE_BOTH; break;
3023 : default: ;//prevent warning
3024 : }
3025 0 : SetValue((sal_uInt16) eBreak);
3026 :
3027 0 : return true;
3028 : }
3029 :
3030 :
3031 :
3032 0 : SfxPoolItem* SvxFmtBreakItem::Clone( SfxItemPool* ) const
3033 : {
3034 0 : return new SvxFmtBreakItem( *this );
3035 : }
3036 :
3037 :
3038 :
3039 0 : SvStream& SvxFmtBreakItem::Store( SvStream& rStrm , sal_uInt16 nItemVersion ) const
3040 : {
3041 0 : rStrm.WriteSChar( (sal_Int8)GetValue() );
3042 0 : if( FMTBREAK_NOAUTO > nItemVersion )
3043 0 : rStrm.WriteSChar( (sal_Int8)0x01 );
3044 0 : return rStrm;
3045 : }
3046 :
3047 :
3048 :
3049 0 : sal_uInt16 SvxFmtBreakItem::GetVersion( sal_uInt16 nFFVer ) const
3050 : {
3051 : DBG_ASSERT( SOFFICE_FILEFORMAT_31==nFFVer ||
3052 : SOFFICE_FILEFORMAT_40==nFFVer ||
3053 : SOFFICE_FILEFORMAT_50==nFFVer,
3054 : "SvxFmtBreakItem: Is there a new file format? ");
3055 : return SOFFICE_FILEFORMAT_31==nFFVer ||
3056 0 : SOFFICE_FILEFORMAT_40==nFFVer ? 0 : FMTBREAK_NOAUTO;
3057 : }
3058 :
3059 :
3060 :
3061 0 : SfxPoolItem* SvxFmtBreakItem::Create( SvStream& rStrm, sal_uInt16 nVersion ) const
3062 : {
3063 : sal_Int8 eBreak, bDummy;
3064 0 : rStrm.ReadSChar( eBreak );
3065 0 : if( FMTBREAK_NOAUTO > nVersion )
3066 0 : rStrm.ReadSChar( bDummy );
3067 0 : return new SvxFmtBreakItem( (const SvxBreak)eBreak, Which() );
3068 : }
3069 :
3070 :
3071 :
3072 0 : sal_uInt16 SvxFmtBreakItem::GetValueCount() const
3073 : {
3074 0 : return SVX_BREAK_END; // SVX_BREAK_PAGE_BOTH + 1
3075 : }
3076 :
3077 : // class SvxFmtKeepItem -------------------------------------------------
3078 :
3079 0 : SfxPoolItem* SvxFmtKeepItem::Clone( SfxItemPool* ) const
3080 : {
3081 0 : return new SvxFmtKeepItem( *this );
3082 : }
3083 :
3084 :
3085 :
3086 0 : SvStream& SvxFmtKeepItem::Store( SvStream& rStrm , sal_uInt16 /*nItemVersion*/ ) const
3087 : {
3088 0 : rStrm.WriteSChar( (sal_Int8)GetValue() );
3089 0 : return rStrm;
3090 : }
3091 :
3092 :
3093 :
3094 0 : SfxPoolItem* SvxFmtKeepItem::Create( SvStream& rStrm, sal_uInt16 ) const
3095 : {
3096 : sal_Int8 bIsKeep;
3097 0 : rStrm.ReadSChar( bIsKeep );
3098 0 : return new SvxFmtKeepItem( bIsKeep != 0, Which() );
3099 : }
3100 :
3101 :
3102 :
3103 0 : SfxItemPresentation SvxFmtKeepItem::GetPresentation
3104 : (
3105 : SfxItemPresentation ePres,
3106 : SfxMapUnit /*eCoreUnit*/,
3107 : SfxMapUnit /*ePresUnit*/,
3108 : OUString& rText, const IntlWrapper *
3109 : ) const
3110 : {
3111 0 : switch ( ePres )
3112 : {
3113 : case SFX_ITEM_PRESENTATION_NONE:
3114 0 : rText = OUString();
3115 0 : return ePres;
3116 :
3117 : case SFX_ITEM_PRESENTATION_NAMELESS:
3118 : case SFX_ITEM_PRESENTATION_COMPLETE:
3119 : {
3120 0 : sal_uInt16 nId = RID_SVXITEMS_FMTKEEP_FALSE;
3121 :
3122 0 : if ( GetValue() )
3123 0 : nId = RID_SVXITEMS_FMTKEEP_TRUE;
3124 0 : rText = EE_RESSTR(nId);
3125 0 : return ePres;
3126 : }
3127 : default: ;//prevent warning
3128 : }
3129 0 : return SFX_ITEM_PRESENTATION_NONE;
3130 : }
3131 :
3132 : // class SvxLineItem ------------------------------------------------------
3133 :
3134 0 : SvxLineItem::SvxLineItem( const sal_uInt16 nId ) :
3135 :
3136 : SfxPoolItem ( nId ),
3137 :
3138 0 : pLine( NULL )
3139 : {
3140 0 : }
3141 :
3142 :
3143 :
3144 0 : SvxLineItem::SvxLineItem( const SvxLineItem& rCpy ) :
3145 :
3146 0 : SfxPoolItem ( rCpy )
3147 : {
3148 0 : pLine = rCpy.GetLine() ? new SvxBorderLine( *rCpy.GetLine() ) : 0;
3149 0 : }
3150 :
3151 :
3152 :
3153 0 : SvxLineItem::~SvxLineItem()
3154 : {
3155 0 : delete pLine;
3156 0 : }
3157 :
3158 :
3159 :
3160 0 : SvxLineItem& SvxLineItem::operator=( const SvxLineItem& rLine )
3161 : {
3162 0 : SetLine( rLine.GetLine() );
3163 :
3164 0 : return *this;
3165 : }
3166 :
3167 :
3168 :
3169 0 : bool SvxLineItem::operator==( const SfxPoolItem& rAttr ) const
3170 : {
3171 : DBG_ASSERT( SfxPoolItem::operator==(rAttr), "unequal types" );
3172 :
3173 0 : return CmpBrdLn( pLine, ((SvxLineItem&)rAttr).GetLine() );
3174 : }
3175 :
3176 :
3177 :
3178 0 : SfxPoolItem* SvxLineItem::Clone( SfxItemPool* ) const
3179 : {
3180 0 : return new SvxLineItem( *this );
3181 : }
3182 :
3183 0 : bool SvxLineItem::QueryValue( uno::Any& rVal, sal_uInt8 nMemId ) const
3184 : {
3185 0 : sal_Bool bConvert = 0!=(nMemId&CONVERT_TWIPS);
3186 0 : nMemId &= ~CONVERT_TWIPS;
3187 0 : if ( nMemId == 0 )
3188 : {
3189 0 : rVal <<= uno::makeAny( SvxBoxItem::SvxLineToLine(pLine, bConvert) );
3190 0 : return true;
3191 : }
3192 0 : else if ( pLine )
3193 : {
3194 0 : switch ( nMemId )
3195 : {
3196 0 : case MID_FG_COLOR: rVal <<= sal_Int32(pLine->GetColor().GetColor()); break;
3197 0 : case MID_OUTER_WIDTH: rVal <<= sal_Int32(pLine->GetOutWidth()); break;
3198 0 : case MID_INNER_WIDTH: rVal <<= sal_Int32(pLine->GetInWidth( )); break;
3199 0 : case MID_DISTANCE: rVal <<= sal_Int32(pLine->GetDistance()); break;
3200 : default:
3201 : OSL_FAIL( "Wrong MemberId" );
3202 0 : return false;
3203 : }
3204 : }
3205 :
3206 0 : return true;
3207 : }
3208 :
3209 :
3210 :
3211 0 : bool SvxLineItem::PutValue( const uno::Any& rVal, sal_uInt8 nMemId )
3212 : {
3213 0 : sal_Bool bConvert = 0!=(nMemId&CONVERT_TWIPS);
3214 0 : nMemId &= ~CONVERT_TWIPS;
3215 0 : sal_Int32 nVal = 0;
3216 0 : if ( nMemId == 0 )
3217 : {
3218 0 : table::BorderLine2 aLine;
3219 0 : if ( lcl_extractBorderLine(rVal, aLine) )
3220 : {
3221 0 : if ( !pLine )
3222 0 : pLine = new SvxBorderLine;
3223 0 : if( !SvxBoxItem::LineToSvxLine(aLine, *pLine, bConvert) )
3224 0 : DELETEZ( pLine );
3225 0 : return true;
3226 : }
3227 0 : return false;
3228 : }
3229 0 : else if ( rVal >>= nVal )
3230 : {
3231 0 : if ( !pLine )
3232 0 : pLine = new SvxBorderLine;
3233 :
3234 0 : switch ( nMemId )
3235 : {
3236 0 : case MID_FG_COLOR: pLine->SetColor( Color(nVal) ); break;
3237 : case MID_LINE_STYLE:
3238 0 : pLine->SetBorderLineStyle(static_cast<SvxBorderStyle>(nVal));
3239 0 : break;
3240 : default:
3241 : OSL_FAIL( "Wrong MemberId" );
3242 0 : return false;
3243 : }
3244 :
3245 0 : return true;
3246 : }
3247 :
3248 0 : return false;
3249 : }
3250 :
3251 :
3252 :
3253 0 : SfxItemPresentation SvxLineItem::GetPresentation
3254 : (
3255 : SfxItemPresentation ePres,
3256 : SfxMapUnit eCoreUnit,
3257 : SfxMapUnit ePresUnit,
3258 : OUString& rText, const IntlWrapper *pIntl
3259 : ) const
3260 : {
3261 0 : rText = OUString();
3262 :
3263 0 : switch ( ePres )
3264 : {
3265 : case SFX_ITEM_PRESENTATION_NONE:
3266 0 : return SFX_ITEM_PRESENTATION_NONE;
3267 : case SFX_ITEM_PRESENTATION_NAMELESS:
3268 : case SFX_ITEM_PRESENTATION_COMPLETE:
3269 : {
3270 0 : if ( pLine )
3271 0 : rText = pLine->GetValueString( eCoreUnit, ePresUnit, pIntl,
3272 0 : (SFX_ITEM_PRESENTATION_COMPLETE == ePres) );
3273 0 : return ePres;
3274 : }
3275 : default: ;//prevent warning
3276 : }
3277 0 : return SFX_ITEM_PRESENTATION_NONE;
3278 : }
3279 :
3280 :
3281 :
3282 0 : SvStream& SvxLineItem::Store( SvStream& rStrm , sal_uInt16 /*nItemVersion*/ ) const
3283 : {
3284 0 : if( pLine )
3285 : {
3286 0 : WriteColor( rStrm, pLine->GetColor() );
3287 0 : rStrm.WriteInt16( (short)pLine->GetOutWidth() )
3288 0 : .WriteInt16( (short)pLine->GetInWidth() )
3289 0 : .WriteInt16( (short)pLine->GetDistance() );
3290 : }
3291 : else
3292 : {
3293 0 : WriteColor( rStrm, Color() );
3294 0 : rStrm.WriteInt16( (short)0 ).WriteInt16( (short)0 ).WriteInt16( (short)0 );
3295 : }
3296 0 : return rStrm;
3297 : }
3298 :
3299 :
3300 :
3301 0 : bool SvxLineItem::ScaleMetrics( long nMult, long nDiv )
3302 : {
3303 0 : if ( pLine ) pLine->ScaleMetrics( nMult, nDiv );
3304 0 : return true;
3305 : }
3306 :
3307 :
3308 :
3309 0 : bool SvxLineItem::HasMetrics() const
3310 : {
3311 0 : return true;
3312 : }
3313 :
3314 :
3315 :
3316 0 : SfxPoolItem* SvxLineItem::Create( SvStream& rStrm, sal_uInt16 ) const
3317 : {
3318 0 : SvxLineItem* _pLine = new SvxLineItem( Which() );
3319 : short nOutline, nInline, nDistance;
3320 0 : Color aColor;
3321 :
3322 0 : ReadColor( rStrm, aColor ).ReadInt16( nOutline ).ReadInt16( nInline ).ReadInt16( nDistance );
3323 0 : if( nOutline )
3324 : {
3325 0 : SvxBorderLine aLine( &aColor );
3326 0 : aLine.GuessLinesWidths(NONE, nOutline, nInline, nDistance);
3327 0 : _pLine->SetLine( &aLine );
3328 : }
3329 0 : return _pLine;
3330 : }
3331 :
3332 :
3333 :
3334 0 : void SvxLineItem::SetLine( const SvxBorderLine* pNew )
3335 : {
3336 0 : delete pLine;
3337 0 : pLine = pNew ? new SvxBorderLine( *pNew ) : 0;
3338 0 : }
3339 :
3340 : // class SvxBrushItem ----------------------------------------------------
3341 :
3342 : #define LOAD_GRAPHIC ((sal_uInt16)0x0001)
3343 : #define LOAD_LINK ((sal_uInt16)0x0002)
3344 : #define LOAD_FILTER ((sal_uInt16)0x0004)
3345 :
3346 : // class SvxBrushItem_Impl -----------------------------------------------
3347 :
3348 : class SvxBrushItem_Impl
3349 : {
3350 : public:
3351 : GraphicObject* pGraphicObject;
3352 : sal_Int8 nGraphicTransparency; //contains a percentage value which is
3353 : //copied to the GraphicObject when necessary
3354 : Link aDoneLink;
3355 : SvStream* pStream;
3356 :
3357 0 : SvxBrushItem_Impl( GraphicObject* p ) : pGraphicObject( p ), nGraphicTransparency(0), pStream(0) {}
3358 : };
3359 :
3360 :
3361 :
3362 0 : void SvxBrushItem::SetDoneLink( const Link& rLink )
3363 : {
3364 0 : pImpl->aDoneLink = rLink;
3365 0 : }
3366 :
3367 :
3368 :
3369 0 : SvxBrushItem::SvxBrushItem( sal_uInt16 _nWhich ) :
3370 :
3371 : SfxPoolItem( _nWhich ),
3372 :
3373 : aColor ( COL_TRANSPARENT ),
3374 : nShadingValue ( ShadingPattern::CLEAR ),
3375 0 : pImpl ( new SvxBrushItem_Impl( 0 ) ),
3376 : maStrLink (),
3377 : maStrFilter (),
3378 : eGraphicPos ( GPOS_NONE ),
3379 0 : bLoadAgain ( true )
3380 :
3381 : {
3382 0 : }
3383 :
3384 :
3385 :
3386 0 : SvxBrushItem::SvxBrushItem( const Color& rColor, sal_uInt16 _nWhich) :
3387 :
3388 : SfxPoolItem( _nWhich ),
3389 :
3390 : aColor ( rColor ),
3391 : nShadingValue ( ShadingPattern::CLEAR ),
3392 0 : pImpl ( new SvxBrushItem_Impl( 0 ) ),
3393 : maStrLink (),
3394 : maStrFilter (),
3395 : eGraphicPos ( GPOS_NONE ),
3396 0 : bLoadAgain ( true )
3397 :
3398 : {
3399 0 : }
3400 :
3401 :
3402 :
3403 0 : SvxBrushItem::SvxBrushItem( const Graphic& rGraphic, SvxGraphicPosition ePos,
3404 : sal_uInt16 _nWhich ) :
3405 :
3406 : SfxPoolItem( _nWhich ),
3407 :
3408 : aColor ( COL_TRANSPARENT ),
3409 : nShadingValue ( ShadingPattern::CLEAR ),
3410 0 : pImpl ( new SvxBrushItem_Impl( new GraphicObject( rGraphic ) ) ),
3411 : maStrLink (),
3412 : maStrFilter (),
3413 : eGraphicPos ( ( GPOS_NONE != ePos ) ? ePos : GPOS_MM ),
3414 0 : bLoadAgain ( true )
3415 :
3416 : {
3417 : DBG_ASSERT( GPOS_NONE != ePos, "SvxBrushItem-Ctor with GPOS_NONE == ePos" );
3418 0 : }
3419 :
3420 :
3421 :
3422 0 : SvxBrushItem::SvxBrushItem( const GraphicObject& rGraphicObj,
3423 : SvxGraphicPosition ePos, sal_uInt16 _nWhich ) :
3424 :
3425 : SfxPoolItem( _nWhich ),
3426 :
3427 : aColor ( COL_TRANSPARENT ),
3428 : nShadingValue ( ShadingPattern::CLEAR ),
3429 0 : pImpl ( new SvxBrushItem_Impl( new GraphicObject( rGraphicObj ) ) ),
3430 : maStrLink (),
3431 : maStrFilter (),
3432 : eGraphicPos ( ( GPOS_NONE != ePos ) ? ePos : GPOS_MM ),
3433 0 : bLoadAgain ( true )
3434 :
3435 : {
3436 : DBG_ASSERT( GPOS_NONE != ePos, "SvxBrushItem-Ctor with GPOS_NONE == ePos" );
3437 0 : }
3438 :
3439 :
3440 :
3441 0 : SvxBrushItem::SvxBrushItem(
3442 : const OUString& rLink, const OUString& rFilter,
3443 : SvxGraphicPosition ePos, sal_uInt16 _nWhich ) :
3444 :
3445 : SfxPoolItem( _nWhich ),
3446 :
3447 : aColor ( COL_TRANSPARENT ),
3448 : nShadingValue ( ShadingPattern::CLEAR ),
3449 0 : pImpl ( new SvxBrushItem_Impl( NULL ) ),
3450 : maStrLink ( rLink ),
3451 : maStrFilter ( rFilter ),
3452 : eGraphicPos ( ( GPOS_NONE != ePos ) ? ePos : GPOS_MM ),
3453 0 : bLoadAgain ( true )
3454 :
3455 : {
3456 : DBG_ASSERT( GPOS_NONE != ePos, "SvxBrushItem-Ctor with GPOS_NONE == ePos" );
3457 0 : }
3458 :
3459 :
3460 :
3461 0 : SvxBrushItem::SvxBrushItem( SvStream& rStream, sal_uInt16 nVersion,
3462 : sal_uInt16 _nWhich )
3463 : : SfxPoolItem( _nWhich )
3464 : , aColor ( COL_TRANSPARENT )
3465 : , nShadingValue ( ShadingPattern::CLEAR )
3466 0 : , pImpl ( new SvxBrushItem_Impl( NULL ) )
3467 : , maStrLink ()
3468 : , maStrFilter ()
3469 : , eGraphicPos ( GPOS_NONE )
3470 0 : , bLoadAgain (false)
3471 : {
3472 : sal_Bool bTrans;
3473 0 : Color aTempColor;
3474 0 : Color aTempFillColor;
3475 : sal_Int8 nStyle;
3476 :
3477 0 : rStream.ReadUChar( bTrans );
3478 0 : ReadColor( rStream, aTempColor );
3479 0 : ReadColor( rStream, aTempFillColor );
3480 0 : rStream.ReadSChar( nStyle );
3481 :
3482 0 : switch ( nStyle )
3483 : {
3484 : case 8://BRUSH_25:
3485 : {
3486 0 : sal_uInt32 nRed = aTempColor.GetRed();
3487 0 : sal_uInt32 nGreen = aTempColor.GetGreen();
3488 0 : sal_uInt32 nBlue = aTempColor.GetBlue();
3489 0 : nRed += (sal_uInt32)(aTempFillColor.GetRed())*2;
3490 0 : nGreen += (sal_uInt32)(aTempFillColor.GetGreen())*2;
3491 0 : nBlue += (sal_uInt32)(aTempFillColor.GetBlue())*2;
3492 0 : aColor = Color( (sal_Int8)(nRed/3), (sal_Int8)(nGreen/3), (sal_Int8)(nBlue/3) );
3493 : }
3494 0 : break;
3495 :
3496 : case 9://BRUSH_50:
3497 : {
3498 0 : sal_uInt32 nRed = aTempColor.GetRed();
3499 0 : sal_uInt32 nGreen = aTempColor.GetGreen();
3500 0 : sal_uInt32 nBlue = aTempColor.GetBlue();
3501 0 : nRed += (sal_uInt32)(aTempFillColor.GetRed());
3502 0 : nGreen += (sal_uInt32)(aTempFillColor.GetGreen());
3503 0 : nBlue += (sal_uInt32)(aTempFillColor.GetBlue());
3504 0 : aColor = Color( (sal_Int8)(nRed/2), (sal_Int8)(nGreen/2), (sal_Int8)(nBlue/2) );
3505 : }
3506 0 : break;
3507 :
3508 : case 10://BRUSH_75:
3509 : {
3510 0 : sal_uInt32 nRed = aTempColor.GetRed()*2;
3511 0 : sal_uInt32 nGreen = aTempColor.GetGreen()*2;
3512 0 : sal_uInt32 nBlue = aTempColor.GetBlue()*2;
3513 0 : nRed += (sal_uInt32)(aTempFillColor.GetRed());
3514 0 : nGreen += (sal_uInt32)(aTempFillColor.GetGreen());
3515 0 : nBlue += (sal_uInt32)(aTempFillColor.GetBlue());
3516 0 : aColor = Color( (sal_Int8)(nRed/3), (sal_Int8)(nGreen/3), (sal_Int8)(nBlue/3) );
3517 : }
3518 0 : break;
3519 :
3520 : case 0://BRUSH_NULL:
3521 0 : aColor = Color( COL_TRANSPARENT );
3522 0 : break;
3523 :
3524 : default:
3525 0 : aColor = aTempColor;
3526 : }
3527 :
3528 0 : if ( nVersion >= BRUSH_GRAPHIC_VERSION )
3529 : {
3530 0 : sal_uInt16 nDoLoad = 0;
3531 : sal_Int8 nPos;
3532 :
3533 0 : rStream.ReadUInt16( nDoLoad );
3534 :
3535 0 : if ( nDoLoad & LOAD_GRAPHIC )
3536 : {
3537 0 : Graphic aGraphic;
3538 :
3539 0 : ReadGraphic( rStream, aGraphic );
3540 0 : pImpl->pGraphicObject = new GraphicObject( aGraphic );
3541 :
3542 0 : if( SVSTREAM_FILEFORMAT_ERROR == rStream.GetError() )
3543 : {
3544 0 : rStream.ResetError();
3545 : rStream.SetError( ERRCODE_SVX_GRAPHIC_WRONG_FILEFORMAT|
3546 0 : ERRCODE_WARNING_MASK );
3547 0 : }
3548 : }
3549 :
3550 0 : if ( nDoLoad & LOAD_LINK )
3551 : {
3552 : // UNICODE: rStream >> aRel;
3553 0 : OUString aRel = rStream.ReadUniOrByteString(rStream.GetStreamCharSet());
3554 :
3555 : // TODO/MBA: how can we get a BaseURL here?!
3556 : OSL_FAIL("No BaseURL!");
3557 0 : OUString aAbs = INetURLObject::GetAbsURL( "", aRel );
3558 : DBG_ASSERT( !aAbs.isEmpty(), "Invalid URL!" );
3559 0 : maStrLink = aAbs;
3560 : }
3561 :
3562 0 : if ( nDoLoad & LOAD_FILTER )
3563 : {
3564 : // UNICODE: rStream >> maStrFilter;
3565 0 : maStrFilter = rStream.ReadUniOrByteString(rStream.GetStreamCharSet());
3566 : }
3567 :
3568 0 : rStream.ReadSChar( nPos );
3569 :
3570 0 : eGraphicPos = (SvxGraphicPosition)nPos;
3571 : }
3572 0 : }
3573 :
3574 :
3575 :
3576 0 : SvxBrushItem::SvxBrushItem( const SvxBrushItem& rItem ) :
3577 :
3578 0 : SfxPoolItem( rItem.Which() ),
3579 : nShadingValue ( ShadingPattern::CLEAR ),
3580 0 : pImpl ( new SvxBrushItem_Impl( NULL ) ),
3581 : maStrLink (),
3582 : maStrFilter (),
3583 : eGraphicPos ( GPOS_NONE ),
3584 0 : bLoadAgain ( true )
3585 :
3586 : {
3587 0 : *this = rItem;
3588 0 : }
3589 :
3590 :
3591 :
3592 0 : SvxBrushItem::~SvxBrushItem()
3593 : {
3594 0 : delete pImpl->pGraphicObject;
3595 0 : delete pImpl;
3596 0 : }
3597 :
3598 :
3599 :
3600 0 : sal_uInt16 SvxBrushItem::GetVersion( sal_uInt16 /*nFileVersion*/ ) const
3601 : {
3602 0 : return BRUSH_GRAPHIC_VERSION;
3603 : }
3604 :
3605 :
3606 0 : static inline sal_Int8 lcl_PercentToTransparency(long nPercent)
3607 : {
3608 : //0xff must not be returned!
3609 0 : return sal_Int8(nPercent ? (50 + 0xfe * nPercent) / 100 : 0);
3610 : }
3611 0 : sal_Int8 SvxBrushItem::TransparencyToPercent(sal_Int32 nTrans)
3612 : {
3613 0 : return (sal_Int8)((nTrans * 100 + 127) / 254);
3614 : }
3615 :
3616 0 : bool SvxBrushItem::QueryValue( uno::Any& rVal, sal_uInt8 nMemberId ) const
3617 : {
3618 0 : nMemberId &= ~CONVERT_TWIPS;
3619 0 : switch( nMemberId)
3620 : {
3621 : case MID_BACK_COLOR:
3622 0 : rVal <<= (sal_Int32)( aColor.GetColor() );
3623 0 : break;
3624 : case MID_BACK_COLOR_R_G_B:
3625 0 : rVal <<= (sal_Int32)( aColor.GetRGBColor() );
3626 0 : break;
3627 : case MID_BACK_COLOR_TRANSPARENCY:
3628 0 : rVal <<= SvxBrushItem::TransparencyToPercent(aColor.GetTransparency());
3629 0 : break;
3630 : case MID_GRAPHIC_POSITION:
3631 0 : rVal <<= (style::GraphicLocation)(sal_Int16)eGraphicPos;
3632 0 : break;
3633 :
3634 : case MID_GRAPHIC:
3635 : SAL_WARN( "editeng.items", "not implemented" );
3636 0 : break;
3637 :
3638 : case MID_GRAPHIC_TRANSPARENT:
3639 0 : rVal = Bool2Any( aColor.GetTransparency() == 0xff );
3640 0 : break;
3641 :
3642 : case MID_GRAPHIC_URL:
3643 : {
3644 0 : OUString sLink;
3645 0 : if ( !maStrLink.isEmpty() )
3646 0 : sLink = maStrLink;
3647 0 : else if( pImpl->pGraphicObject )
3648 : {
3649 : OUString sPrefix(
3650 0 : UNO_NAME_GRAPHOBJ_URLPREFIX);
3651 : OUString sId(OStringToOUString(
3652 : pImpl->pGraphicObject->GetUniqueID(),
3653 0 : RTL_TEXTENCODING_ASCII_US));
3654 0 : sLink = sPrefix + sId;
3655 : }
3656 0 : rVal <<= sLink;
3657 : }
3658 0 : break;
3659 :
3660 : case MID_GRAPHIC_FILTER:
3661 : {
3662 0 : rVal <<= maStrFilter;
3663 : }
3664 0 : break;
3665 :
3666 : case MID_GRAPHIC_TRANSPARENCY:
3667 0 : rVal <<= pImpl->nGraphicTransparency;
3668 0 : break;
3669 :
3670 : case MID_SHADING_VALUE:
3671 : {
3672 0 : rVal <<= (sal_Int32)(nShadingValue);
3673 : }
3674 0 : break;
3675 : }
3676 :
3677 0 : return true;
3678 : }
3679 :
3680 :
3681 :
3682 0 : bool SvxBrushItem::PutValue( const uno::Any& rVal, sal_uInt8 nMemberId )
3683 : {
3684 0 : nMemberId &= ~CONVERT_TWIPS;
3685 0 : switch( nMemberId)
3686 : {
3687 : case MID_BACK_COLOR:
3688 : case MID_BACK_COLOR_R_G_B:
3689 : {
3690 0 : sal_Int32 nCol = 0;
3691 0 : if ( !( rVal >>= nCol ) )
3692 0 : return false;
3693 0 : if(MID_BACK_COLOR_R_G_B == nMemberId)
3694 : {
3695 0 : nCol = COLORDATA_RGB( nCol );
3696 0 : nCol += aColor.GetColor() & 0xff000000;
3697 : }
3698 0 : aColor = Color( nCol );
3699 : }
3700 0 : break;
3701 : case MID_BACK_COLOR_TRANSPARENCY:
3702 : {
3703 0 : sal_Int32 nTrans = 0;
3704 0 : if ( !( rVal >>= nTrans ) || nTrans < 0 || nTrans > 100 )
3705 0 : return false;
3706 0 : aColor.SetTransparency(lcl_PercentToTransparency(nTrans));
3707 : }
3708 0 : break;
3709 :
3710 : case MID_GRAPHIC_POSITION:
3711 : {
3712 : style::GraphicLocation eLocation;
3713 0 : if ( !( rVal>>=eLocation ) )
3714 : {
3715 0 : sal_Int32 nValue = 0;
3716 0 : if ( !( rVal >>= nValue ) )
3717 0 : return false;
3718 0 : eLocation = (style::GraphicLocation)nValue;
3719 : }
3720 0 : SetGraphicPos( (SvxGraphicPosition)(sal_uInt16)eLocation );
3721 : }
3722 0 : break;
3723 :
3724 : case MID_GRAPHIC:
3725 : SAL_WARN( "editeng.items", "not implemented" );
3726 0 : break;
3727 :
3728 : case MID_GRAPHIC_TRANSPARENT:
3729 0 : aColor.SetTransparency( Any2Bool( rVal ) ? 0xff : 0 );
3730 0 : break;
3731 :
3732 : case MID_GRAPHIC_URL:
3733 : {
3734 0 : if ( rVal.getValueType() == ::getCppuType( (OUString*)0 ) )
3735 : {
3736 0 : OUString sLink;
3737 0 : rVal >>= sLink;
3738 0 : if( sLink.startsWith( UNO_NAME_GRAPHOBJ_URLPKGPREFIX ) )
3739 : {
3740 : OSL_FAIL( "package urls aren't implemented" );
3741 : }
3742 0 : else if( sLink.startsWith( UNO_NAME_GRAPHOBJ_URLPREFIX ) )
3743 : {
3744 0 : maStrLink = "";
3745 0 : OString sId(OUStringToOString(sLink.copy( sizeof(UNO_NAME_GRAPHOBJ_URLPREFIX)-1 ),
3746 0 : RTL_TEXTENCODING_ASCII_US));
3747 0 : GraphicObject *pOldGrfObj = pImpl->pGraphicObject;
3748 0 : pImpl->pGraphicObject = new GraphicObject( sId );
3749 0 : ApplyGraphicTransparency_Impl();
3750 0 : delete pOldGrfObj;
3751 : }
3752 : else
3753 : {
3754 0 : SetGraphicLink(sLink);
3755 : }
3756 0 : if ( !sLink.isEmpty() && eGraphicPos == GPOS_NONE )
3757 0 : eGraphicPos = GPOS_MM;
3758 0 : else if( sLink.isEmpty() )
3759 0 : eGraphicPos = GPOS_NONE;
3760 : }
3761 : }
3762 0 : break;
3763 :
3764 : case MID_GRAPHIC_FILTER:
3765 : {
3766 0 : if( rVal.getValueType() == ::getCppuType( (OUString*)0 ) )
3767 : {
3768 0 : OUString sLink;
3769 0 : rVal >>= sLink;
3770 0 : SetGraphicFilter( sLink );
3771 : }
3772 : }
3773 0 : break;
3774 : case MID_GRAPHIC_TRANSPARENCY :
3775 : {
3776 0 : sal_Int32 nTmp = 0;
3777 0 : rVal >>= nTmp;
3778 0 : if(nTmp >= 0 && nTmp <= 100)
3779 : {
3780 0 : pImpl->nGraphicTransparency = sal_Int8(nTmp);
3781 0 : if(pImpl->pGraphicObject)
3782 0 : ApplyGraphicTransparency_Impl();
3783 : }
3784 : }
3785 0 : break;
3786 :
3787 : case MID_SHADING_VALUE:
3788 : {
3789 0 : sal_uInt32 nVal = 0;
3790 0 : if (!(rVal >>= nVal))
3791 0 : return false;
3792 :
3793 0 : SetShadingValue( nVal );
3794 : }
3795 0 : break;
3796 : }
3797 :
3798 0 : return true;
3799 : }
3800 :
3801 :
3802 :
3803 0 : SfxItemPresentation SvxBrushItem::GetPresentation
3804 : (
3805 : SfxItemPresentation ePres,
3806 : SfxMapUnit /*eCoreUnit*/,
3807 : SfxMapUnit /*ePresUnit*/,
3808 : OUString& rText, const IntlWrapper *
3809 : ) const
3810 : {
3811 0 : switch ( ePres )
3812 : {
3813 : case SFX_ITEM_PRESENTATION_NONE:
3814 0 : rText = OUString();
3815 0 : return ePres;
3816 :
3817 : case SFX_ITEM_PRESENTATION_NAMELESS:
3818 : case SFX_ITEM_PRESENTATION_COMPLETE:
3819 : {
3820 0 : if ( GPOS_NONE == eGraphicPos )
3821 : {
3822 0 : rText = ::GetColorString( aColor ) + OUString(cpDelim);
3823 0 : sal_uInt16 nId = RID_SVXITEMS_TRANSPARENT_FALSE;
3824 :
3825 0 : if ( aColor.GetTransparency() )
3826 0 : nId = RID_SVXITEMS_TRANSPARENT_TRUE;
3827 0 : rText += EE_RESSTR(nId);
3828 : }
3829 : else
3830 : {
3831 0 : rText = EE_RESSTR(RID_SVXITEMS_GRAPHIC);
3832 : }
3833 :
3834 0 : return ePres;
3835 : }
3836 : default: ;//prevent warning
3837 : }
3838 :
3839 0 : return SFX_ITEM_PRESENTATION_NONE;
3840 : }
3841 :
3842 :
3843 :
3844 0 : SvxBrushItem& SvxBrushItem::operator=( const SvxBrushItem& rItem )
3845 : {
3846 0 : aColor = rItem.aColor;
3847 0 : eGraphicPos = rItem.eGraphicPos;
3848 :
3849 0 : DELETEZ( pImpl->pGraphicObject );
3850 0 : maStrLink = "";
3851 0 : maStrFilter = "";
3852 :
3853 0 : if ( GPOS_NONE != eGraphicPos )
3854 : {
3855 0 : maStrLink = rItem.maStrLink;
3856 0 : maStrFilter = rItem.maStrFilter;
3857 0 : if ( rItem.pImpl->pGraphicObject )
3858 : {
3859 0 : pImpl->pGraphicObject = new GraphicObject( *rItem.pImpl->pGraphicObject );
3860 : }
3861 : }
3862 :
3863 0 : nShadingValue = rItem.nShadingValue;
3864 :
3865 0 : pImpl->nGraphicTransparency = rItem.pImpl->nGraphicTransparency;
3866 0 : return *this;
3867 : }
3868 :
3869 :
3870 :
3871 0 : bool SvxBrushItem::operator==( const SfxPoolItem& rAttr ) const
3872 : {
3873 : DBG_ASSERT( SfxPoolItem::operator==(rAttr), "unequal types" );
3874 :
3875 0 : SvxBrushItem& rCmp = (SvxBrushItem&)rAttr;
3876 0 : sal_Bool bEqual = ( aColor == rCmp.aColor && eGraphicPos == rCmp.eGraphicPos &&
3877 0 : pImpl->nGraphicTransparency == rCmp.pImpl->nGraphicTransparency);
3878 :
3879 0 : if ( bEqual )
3880 : {
3881 0 : if ( GPOS_NONE != eGraphicPos )
3882 : {
3883 0 : bEqual = maStrLink == rCmp.maStrLink;
3884 :
3885 0 : if ( bEqual )
3886 : {
3887 0 : bEqual = maStrFilter == rCmp.maStrFilter;
3888 : }
3889 :
3890 0 : if ( bEqual )
3891 : {
3892 0 : if ( !rCmp.pImpl->pGraphicObject )
3893 0 : bEqual = !pImpl->pGraphicObject;
3894 : else
3895 0 : bEqual = pImpl->pGraphicObject &&
3896 0 : ( *pImpl->pGraphicObject == *rCmp.pImpl->pGraphicObject );
3897 : }
3898 : }
3899 :
3900 0 : if (bEqual)
3901 : {
3902 0 : bEqual = nShadingValue == rCmp.nShadingValue;
3903 : }
3904 : }
3905 :
3906 0 : return bEqual;
3907 : }
3908 :
3909 :
3910 :
3911 0 : SfxPoolItem* SvxBrushItem::Clone( SfxItemPool* ) const
3912 : {
3913 0 : return new SvxBrushItem( *this );
3914 : }
3915 :
3916 :
3917 :
3918 0 : SfxPoolItem* SvxBrushItem::Create( SvStream& rStream, sal_uInt16 nVersion ) const
3919 : {
3920 0 : return new SvxBrushItem( rStream, nVersion, Which() );
3921 : }
3922 :
3923 :
3924 :
3925 0 : SvStream& SvxBrushItem::Store( SvStream& rStream , sal_uInt16 /*nItemVersion*/ ) const
3926 : {
3927 0 : rStream.WriteUChar( (sal_Bool)sal_False );
3928 0 : WriteColor( rStream, aColor );
3929 0 : WriteColor( rStream, aColor );
3930 0 : rStream.WriteSChar( (sal_Int8)(aColor.GetTransparency() > 0 ? 0 : 1) ); //BRUSH_NULL : BRUSH_SOLID
3931 :
3932 0 : sal_uInt16 nDoLoad = 0;
3933 :
3934 0 : if ( pImpl->pGraphicObject && maStrLink.isEmpty() )
3935 0 : nDoLoad |= LOAD_GRAPHIC;
3936 0 : if ( !maStrLink.isEmpty() )
3937 0 : nDoLoad |= LOAD_LINK;
3938 0 : if ( !maStrFilter.isEmpty() )
3939 0 : nDoLoad |= LOAD_FILTER;
3940 0 : rStream.WriteUInt16( nDoLoad );
3941 :
3942 0 : if ( pImpl->pGraphicObject && maStrLink.isEmpty() )
3943 0 : WriteGraphic( rStream, pImpl->pGraphicObject->GetGraphic() );
3944 0 : if ( !maStrLink.isEmpty() )
3945 : {
3946 : OSL_FAIL("No BaseURL!");
3947 : // TODO/MBA: how to get a BaseURL?!
3948 0 : OUString aRel = INetURLObject::GetRelURL( "", maStrLink );
3949 : // UNICODE: rStream << aRel;
3950 0 : rStream.WriteUniOrByteString(aRel, rStream.GetStreamCharSet());
3951 : }
3952 0 : if ( !maStrFilter.isEmpty() )
3953 : {
3954 : // UNICODE: rStream << maStrFilter;
3955 0 : rStream.WriteUniOrByteString(maStrFilter, rStream.GetStreamCharSet());
3956 : }
3957 0 : rStream.WriteSChar( (sal_Int8)eGraphicPos );
3958 0 : return rStream;
3959 : }
3960 :
3961 :
3962 :
3963 0 : void SvxBrushItem::PurgeMedium() const
3964 : {
3965 0 : DELETEZ( pImpl->pStream );
3966 0 : }
3967 :
3968 :
3969 0 : const GraphicObject* SvxBrushItem::GetGraphicObject(OUString const & referer) const
3970 : {
3971 0 : if ( bLoadAgain && !maStrLink.isEmpty() && !pImpl->pGraphicObject )
3972 : // when graphics already loaded, use as a cache
3973 : {
3974 0 : if (SvtSecurityOptions().isUntrustedReferer(referer)) {
3975 0 : return 0;
3976 : }
3977 0 : pImpl->pStream = utl::UcbStreamHelper::CreateStream( maStrLink, STREAM_STD_READ );
3978 0 : if( pImpl->pStream && !pImpl->pStream->GetError() )
3979 : {
3980 0 : Graphic aGraphic;
3981 : int nRes;
3982 0 : pImpl->pStream->Seek( STREAM_SEEK_TO_BEGIN );
3983 0 : nRes = GraphicFilter::GetGraphicFilter().
3984 : ImportGraphic( aGraphic, maStrLink, *pImpl->pStream,
3985 0 : GRFILTER_FORMAT_DONTKNOW, NULL, GRFILTER_I_FLAGS_DONT_SET_LOGSIZE_FOR_JPEG );
3986 :
3987 0 : if( nRes != GRFILTER_OK )
3988 : {
3989 0 : const_cast < SvxBrushItem*> (this)->bLoadAgain = false;
3990 : }
3991 : else
3992 : {
3993 0 : pImpl->pGraphicObject = new GraphicObject;
3994 0 : pImpl->pGraphicObject->SetGraphic( aGraphic );
3995 0 : const_cast < SvxBrushItem*> (this)->ApplyGraphicTransparency_Impl();
3996 0 : }
3997 : }
3998 : else
3999 : {
4000 0 : const_cast < SvxBrushItem*> (this)->bLoadAgain = false;
4001 : }
4002 : }
4003 :
4004 0 : return pImpl->pGraphicObject;
4005 : }
4006 :
4007 : //UUUU
4008 0 : sal_Int8 SvxBrushItem::getGraphicTransparency() const
4009 : {
4010 0 : return pImpl->nGraphicTransparency;
4011 : }
4012 :
4013 : // -----------------------------------------------------------------------
4014 : //UUUU
4015 0 : void SvxBrushItem::setGraphicTransparency(sal_Int8 nNew)
4016 : {
4017 0 : if(nNew != pImpl->nGraphicTransparency)
4018 : {
4019 0 : pImpl->nGraphicTransparency = nNew;
4020 0 : ApplyGraphicTransparency_Impl();
4021 : }
4022 0 : }
4023 :
4024 : // -----------------------------------------------------------------------
4025 :
4026 :
4027 0 : const Graphic* SvxBrushItem::GetGraphic(OUString const & referer) const
4028 : {
4029 0 : const GraphicObject* pGrafObj = GetGraphicObject(referer);
4030 0 : return( pGrafObj ? &( pGrafObj->GetGraphic() ) : NULL );
4031 : }
4032 :
4033 :
4034 :
4035 0 : void SvxBrushItem::SetGraphicPos( SvxGraphicPosition eNew )
4036 : {
4037 0 : eGraphicPos = eNew;
4038 :
4039 0 : if ( GPOS_NONE == eGraphicPos )
4040 : {
4041 0 : DELETEZ( pImpl->pGraphicObject );
4042 0 : maStrLink = "";
4043 0 : maStrFilter = "";
4044 : }
4045 : else
4046 : {
4047 0 : if ( !pImpl->pGraphicObject && maStrLink.isEmpty() )
4048 : {
4049 0 : pImpl->pGraphicObject = new GraphicObject; // Creating a dummy
4050 : }
4051 : }
4052 0 : }
4053 :
4054 :
4055 :
4056 0 : void SvxBrushItem::SetGraphic( const Graphic& rNew )
4057 : {
4058 0 : if ( maStrLink.isEmpty() )
4059 : {
4060 0 : if ( pImpl->pGraphicObject )
4061 0 : pImpl->pGraphicObject->SetGraphic( rNew );
4062 : else
4063 0 : pImpl->pGraphicObject = new GraphicObject( rNew );
4064 :
4065 0 : ApplyGraphicTransparency_Impl();
4066 :
4067 0 : if ( GPOS_NONE == eGraphicPos )
4068 0 : eGraphicPos = GPOS_MM; // None would be brush, then Default: middle
4069 : }
4070 : else
4071 : {
4072 : OSL_FAIL( "SetGraphic() on linked graphic! :-/" );
4073 : }
4074 0 : }
4075 :
4076 :
4077 :
4078 0 : void SvxBrushItem::SetGraphicObject( const GraphicObject& rNewObj )
4079 : {
4080 0 : if ( maStrLink.isEmpty() )
4081 : {
4082 0 : if ( pImpl->pGraphicObject )
4083 0 : *pImpl->pGraphicObject = rNewObj;
4084 : else
4085 0 : pImpl->pGraphicObject = new GraphicObject( rNewObj );
4086 :
4087 0 : ApplyGraphicTransparency_Impl();
4088 :
4089 0 : if ( GPOS_NONE == eGraphicPos )
4090 0 : eGraphicPos = GPOS_MM; // None would be brush, then Default: middle
4091 : }
4092 : else
4093 : {
4094 : OSL_FAIL( "SetGraphic() on linked graphic! :-/" );
4095 : }
4096 0 : }
4097 :
4098 :
4099 :
4100 0 : void SvxBrushItem::SetGraphicLink( const OUString& rNew )
4101 : {
4102 0 : if ( rNew.isEmpty() )
4103 0 : maStrLink = "";
4104 : else
4105 : {
4106 0 : maStrLink = rNew;
4107 0 : DELETEZ( pImpl->pGraphicObject );
4108 : }
4109 0 : }
4110 :
4111 :
4112 :
4113 0 : void SvxBrushItem::SetGraphicFilter( const OUString& rNew )
4114 : {
4115 0 : maStrFilter = rNew;
4116 0 : }
4117 :
4118 0 : void SvxBrushItem::SetShadingValue( const sal_uInt32 nNew )
4119 : {
4120 0 : nShadingValue = nNew;
4121 0 : }
4122 :
4123 : //static
4124 0 : SvxGraphicPosition SvxBrushItem::WallpaperStyle2GraphicPos( WallpaperStyle eStyle )
4125 : {
4126 : SvxGraphicPosition eResult;
4127 : // The switch is not the fastest, but the safest
4128 0 : switch( eStyle )
4129 : {
4130 0 : case WALLPAPER_NULL: eResult = GPOS_NONE; break;
4131 0 : case WALLPAPER_TILE: eResult = GPOS_TILED; break;
4132 0 : case WALLPAPER_CENTER: eResult = GPOS_MM; break;
4133 0 : case WALLPAPER_SCALE: eResult = GPOS_AREA; break;
4134 0 : case WALLPAPER_TOPLEFT: eResult = GPOS_LT; break;
4135 0 : case WALLPAPER_TOP: eResult = GPOS_MT; break;
4136 0 : case WALLPAPER_TOPRIGHT: eResult = GPOS_RT; break;
4137 0 : case WALLPAPER_LEFT: eResult = GPOS_LM; break;
4138 0 : case WALLPAPER_RIGHT: eResult = GPOS_RM; break;
4139 0 : case WALLPAPER_BOTTOMLEFT: eResult = GPOS_LB; break;
4140 0 : case WALLPAPER_BOTTOM: eResult = GPOS_MB; break;
4141 0 : case WALLPAPER_BOTTOMRIGHT: eResult = GPOS_RB; break;
4142 0 : default: eResult = GPOS_NONE;
4143 : }
4144 0 : return eResult;
4145 : };
4146 :
4147 : //static
4148 0 : WallpaperStyle SvxBrushItem::GraphicPos2WallpaperStyle( SvxGraphicPosition ePos )
4149 : {
4150 : WallpaperStyle eResult;
4151 0 : switch( ePos )
4152 : {
4153 0 : case GPOS_NONE: eResult = WALLPAPER_NULL; break;
4154 0 : case GPOS_TILED: eResult = WALLPAPER_TILE; break;
4155 0 : case GPOS_MM: eResult = WALLPAPER_CENTER; break;
4156 0 : case GPOS_AREA: eResult = WALLPAPER_SCALE; break;
4157 0 : case GPOS_LT: eResult = WALLPAPER_TOPLEFT; break;
4158 0 : case GPOS_MT: eResult = WALLPAPER_TOP; break;
4159 0 : case GPOS_RT: eResult = WALLPAPER_TOPRIGHT; break;
4160 0 : case GPOS_LM: eResult = WALLPAPER_LEFT; break;
4161 0 : case GPOS_RM: eResult = WALLPAPER_RIGHT; break;
4162 0 : case GPOS_LB: eResult = WALLPAPER_BOTTOMLEFT; break;
4163 0 : case GPOS_MB: eResult = WALLPAPER_BOTTOM; break;
4164 0 : case GPOS_RB: eResult = WALLPAPER_BOTTOMRIGHT; break;
4165 0 : default: eResult = WALLPAPER_NULL;
4166 : }
4167 0 : return eResult;
4168 : }
4169 :
4170 0 : SvxBrushItem::SvxBrushItem( const CntWallpaperItem& rItem, sal_uInt16 _nWhich ) :
4171 : SfxPoolItem ( _nWhich ),
4172 : nShadingValue ( ShadingPattern::CLEAR ),
4173 0 : pImpl ( new SvxBrushItem_Impl( 0 ) ),
4174 : maStrLink (),
4175 : maStrFilter (),
4176 0 : bLoadAgain ( true )
4177 : {
4178 0 : aColor = rItem.GetColor();
4179 :
4180 0 : if (!rItem.GetBitmapURL().isEmpty())
4181 : {
4182 0 : maStrLink = rItem.GetBitmapURL();
4183 0 : SetGraphicPos( WallpaperStyle2GraphicPos((WallpaperStyle)rItem.GetStyle() ) );
4184 : }
4185 : else
4186 : {
4187 0 : SetGraphicPos( GPOS_NONE );
4188 : }
4189 0 : }
4190 :
4191 0 : void SvxBrushItem::ApplyGraphicTransparency_Impl()
4192 : {
4193 : DBG_ASSERT(pImpl->pGraphicObject, "no GraphicObject available" );
4194 0 : if(pImpl->pGraphicObject)
4195 : {
4196 0 : GraphicAttr aAttr(pImpl->pGraphicObject->GetAttr());
4197 : aAttr.SetTransparency(lcl_PercentToTransparency(
4198 0 : pImpl->nGraphicTransparency));
4199 0 : pImpl->pGraphicObject->SetAttr(aAttr);
4200 : }
4201 0 : }
4202 :
4203 : // class SvxFrameDirectionItem ----------------------------------------------
4204 :
4205 0 : SvxFrameDirectionItem::SvxFrameDirectionItem( SvxFrameDirection nValue ,
4206 : sal_uInt16 _nWhich )
4207 0 : : SfxUInt16Item( _nWhich, (sal_uInt16)nValue )
4208 : {
4209 0 : }
4210 :
4211 0 : SvxFrameDirectionItem::~SvxFrameDirectionItem()
4212 : {
4213 0 : }
4214 :
4215 0 : bool SvxFrameDirectionItem::operator==( const SfxPoolItem& rCmp ) const
4216 : {
4217 : DBG_ASSERT( SfxPoolItem::operator==(rCmp), "unequal types" );
4218 :
4219 0 : return GetValue() == ((SvxFrameDirectionItem&)rCmp).GetValue();
4220 : }
4221 :
4222 0 : SfxPoolItem* SvxFrameDirectionItem::Clone( SfxItemPool * ) const
4223 : {
4224 0 : return new SvxFrameDirectionItem( *this );
4225 : }
4226 :
4227 0 : SfxPoolItem* SvxFrameDirectionItem::Create( SvStream & rStrm, sal_uInt16 /*nVer*/ ) const
4228 : {
4229 : sal_uInt16 nValue;
4230 0 : rStrm.ReadUInt16( nValue );
4231 0 : return new SvxFrameDirectionItem( (SvxFrameDirection)nValue, Which() );
4232 : }
4233 :
4234 0 : SvStream& SvxFrameDirectionItem::Store( SvStream & rStrm, sal_uInt16 /*nIVer*/ ) const
4235 : {
4236 0 : sal_uInt16 nValue = GetValue();
4237 0 : rStrm.WriteUInt16( nValue );
4238 0 : return rStrm;
4239 : }
4240 :
4241 0 : sal_uInt16 SvxFrameDirectionItem::GetVersion( sal_uInt16 nFVer ) const
4242 : {
4243 0 : return SOFFICE_FILEFORMAT_50 > nFVer ? USHRT_MAX : 0;
4244 : }
4245 :
4246 0 : SfxItemPresentation SvxFrameDirectionItem::GetPresentation(
4247 : SfxItemPresentation ePres,
4248 : SfxMapUnit /*eCoreUnit*/,
4249 : SfxMapUnit /*ePresUnit*/,
4250 : OUString& rText, const IntlWrapper *) const
4251 : {
4252 0 : SfxItemPresentation eRet = ePres;
4253 0 : switch( ePres )
4254 : {
4255 : case SFX_ITEM_PRESENTATION_NONE:
4256 0 : rText = OUString();
4257 0 : break;
4258 :
4259 : case SFX_ITEM_PRESENTATION_NAMELESS:
4260 : case SFX_ITEM_PRESENTATION_COMPLETE:
4261 0 : rText = EE_RESSTR( RID_SVXITEMS_FRMDIR_BEGIN + GetValue() );
4262 0 : break;
4263 :
4264 : default:
4265 0 : eRet = SFX_ITEM_PRESENTATION_NONE;
4266 : }
4267 0 : return eRet;
4268 : }
4269 :
4270 0 : bool SvxFrameDirectionItem::PutValue( const com::sun::star::uno::Any& rVal,
4271 : sal_uInt8 )
4272 : {
4273 0 : sal_Int16 nVal = sal_Int16();
4274 0 : sal_Bool bRet = ( rVal >>= nVal );
4275 0 : if( bRet )
4276 : {
4277 : // translate WritingDirection2 constants into SvxFrameDirection
4278 0 : switch( nVal )
4279 : {
4280 : case text::WritingMode2::LR_TB:
4281 0 : SetValue( FRMDIR_HORI_LEFT_TOP );
4282 0 : break;
4283 : case text::WritingMode2::RL_TB:
4284 0 : SetValue( FRMDIR_HORI_RIGHT_TOP );
4285 0 : break;
4286 : case text::WritingMode2::TB_RL:
4287 0 : SetValue( FRMDIR_VERT_TOP_RIGHT );
4288 0 : break;
4289 : case text::WritingMode2::TB_LR:
4290 0 : SetValue( FRMDIR_VERT_TOP_LEFT );
4291 0 : break;
4292 : case text::WritingMode2::PAGE:
4293 0 : SetValue( FRMDIR_ENVIRONMENT );
4294 0 : break;
4295 : default:
4296 0 : bRet = false;
4297 0 : break;
4298 : }
4299 : }
4300 :
4301 0 : return bRet;
4302 : }
4303 :
4304 0 : bool SvxFrameDirectionItem::QueryValue( com::sun::star::uno::Any& rVal,
4305 : sal_uInt8 ) const
4306 : {
4307 : // translate SvxFrameDirection into WritingDirection2
4308 : sal_Int16 nVal;
4309 0 : bool bRet = true;
4310 0 : switch( GetValue() )
4311 : {
4312 : case FRMDIR_HORI_LEFT_TOP:
4313 0 : nVal = text::WritingMode2::LR_TB;
4314 0 : break;
4315 : case FRMDIR_HORI_RIGHT_TOP:
4316 0 : nVal = text::WritingMode2::RL_TB;
4317 0 : break;
4318 : case FRMDIR_VERT_TOP_RIGHT:
4319 0 : nVal = text::WritingMode2::TB_RL;
4320 0 : break;
4321 : case FRMDIR_VERT_TOP_LEFT:
4322 0 : nVal = text::WritingMode2::TB_LR;
4323 0 : break;
4324 : case FRMDIR_ENVIRONMENT:
4325 0 : nVal = text::WritingMode2::PAGE;
4326 0 : break;
4327 : default:
4328 : OSL_FAIL("Unknown SvxFrameDirection value!");
4329 0 : bRet = false;
4330 0 : break;
4331 : }
4332 :
4333 : // return value + error state
4334 0 : if( bRet )
4335 : {
4336 0 : rVal <<= nVal;
4337 : }
4338 0 : return bRet;
4339 : }
4340 :
4341 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|