1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sc.hxx"
26
27
28 // INCLUDE ---------------------------------------------------------------
29
30 #include "scitems.hxx"
31 #include <editeng/adjitem.hxx>
32 #include <svx/algitem.hxx>
33 #include <editeng/boxitem.hxx>
34 #include <editeng/bolnitem.hxx>
35 #include <editeng/brshitem.hxx>
36 #include <editeng/charreliefitem.hxx>
37 #include <editeng/cntritem.hxx>
38 #include <svtools/colorcfg.hxx>
39 #include <editeng/colritem.hxx>
40 #include <editeng/crsditem.hxx>
41 #include <editeng/emphitem.hxx>
42 #include <editeng/fhgtitem.hxx>
43 #include <editeng/fontitem.hxx>
44 #include <editeng/forbiddenruleitem.hxx>
45 #include <editeng/frmdiritem.hxx>
46 #include <editeng/langitem.hxx>
47 #include <editeng/postitem.hxx>
48 #include <svx/rotmodit.hxx>
49 #include <editeng/scriptspaceitem.hxx>
50 #include <editeng/scripttypeitem.hxx>
51 #include <editeng/shaditem.hxx>
52 #include <editeng/shdditem.hxx>
53 #include <editeng/udlnitem.hxx>
54 #include <editeng/wghtitem.hxx>
55 #include <editeng/wrlmitem.hxx>
56 #include <svl/intitem.hxx>
57 #include <svl/zforlist.hxx>
58 #include <vcl/outdev.hxx>
59 #include <vcl/svapp.hxx>
60
61 #include "patattr.hxx"
62 #include "docpool.hxx"
63 #include "stlsheet.hxx"
64 #include "stlpool.hxx"
65 #include "document.hxx"
66 #include "global.hxx"
67 #include "globstr.hrc"
68 #include "conditio.hxx"
69 #include "validat.hxx"
70 #include "scmod.hxx"
71 #include "fillinfo.hxx"
72
73 // STATIC DATA -----------------------------------------------------------
74
75 ScDocument* ScPatternAttr::pDoc = NULL;
76
77 // -----------------------------------------------------------------------
78
79 //! move to some header file
TwipsToHMM(long nTwips)80 inline long TwipsToHMM(long nTwips) { return (nTwips * 127 + 36) / 72; }
HMMToTwips(long nHMM)81 inline long HMMToTwips(long nHMM) { return (nHMM * 72 + 63) / 127; }
82
83 // -----------------------------------------------------------------------
84
ScPatternAttr(SfxItemSet * pItemSet,const String & rStyleName)85 ScPatternAttr::ScPatternAttr( SfxItemSet* pItemSet, const String& rStyleName )
86 : SfxSetItem ( ATTR_PATTERN, pItemSet ),
87 pName ( new String( rStyleName ) ),
88 pStyle ( NULL )
89 {
90 }
91
ScPatternAttr(SfxItemSet * pItemSet,ScStyleSheet * pStyleSheet)92 ScPatternAttr::ScPatternAttr( SfxItemSet* pItemSet, ScStyleSheet* pStyleSheet )
93 : SfxSetItem ( ATTR_PATTERN, pItemSet ),
94 pName ( NULL ),
95 pStyle ( pStyleSheet )
96 {
97 if ( pStyleSheet )
98 GetItemSet().SetParent( &pStyleSheet->GetItemSet() );
99 }
100
ScPatternAttr(SfxItemPool * pItemPool)101 ScPatternAttr::ScPatternAttr( SfxItemPool* pItemPool )
102 : SfxSetItem ( ATTR_PATTERN, new SfxItemSet( *pItemPool, ATTR_PATTERN_START, ATTR_PATTERN_END ) ),
103 pName ( NULL ),
104 pStyle ( NULL )
105 {
106 }
107
ScPatternAttr(const ScPatternAttr & rPatternAttr)108 ScPatternAttr::ScPatternAttr( const ScPatternAttr& rPatternAttr )
109 : SfxSetItem ( rPatternAttr ),
110 pStyle ( rPatternAttr.pStyle )
111 {
112 if (rPatternAttr.pName)
113 pName = new String(*rPatternAttr.pName);
114 else
115 pName = NULL;
116 }
117
~ScPatternAttr()118 __EXPORT ScPatternAttr::~ScPatternAttr()
119 {
120 delete pName;
121 Broadcast(SfxHint());
122 }
123
Clone(SfxItemPool * pPool) const124 SfxPoolItem* __EXPORT ScPatternAttr::Clone( SfxItemPool *pPool ) const
125 {
126 ScPatternAttr* pPattern = new ScPatternAttr( GetItemSet().Clone(sal_True, pPool) );
127
128 pPattern->pStyle = pStyle;
129 pPattern->pName = pName ? new String(*pName) : NULL;
130
131 return pPattern;
132 }
133
StrCmp(const String * pStr1,const String * pStr2)134 inline int StrCmp( const String* pStr1, const String* pStr2 )
135 {
136 return ( pStr1 ? ( pStr2 ? ( *pStr1 == *pStr2 ) : sal_False ) : ( pStr2 ? sal_False : sal_True ) );
137 }
138
139
140
operator ==(const SfxPoolItem & rCmp) const141 int __EXPORT ScPatternAttr::operator==( const SfxPoolItem& rCmp ) const
142 {
143 // #i62090# Use quick comparison between ScPatternAttr's ItemSets
144
145 //optimize a comparing operation from 'memcmp' to 'hash compare' to improve xls loading performance, i120575
146 //More quickly comparing method using hashkey.
147 //the const_cast here will then only change the HashKey of that SfxItemSet, so it's safe.
148 return ((const_cast<ScPatternAttr&>(*this)).GetItemSet().QuickCompare( (const_cast<ScPatternAttr&>(static_cast<const ScPatternAttr&>(rCmp))).GetItemSet())&&
149 StrCmp( GetStyleName(), static_cast<const ScPatternAttr&>(rCmp).GetStyleName() ) );
150 }
151
Create(SvStream & rStream,sal_uInt16) const152 SfxPoolItem* __EXPORT ScPatternAttr::Create( SvStream& rStream, sal_uInt16 /* nVersion */ ) const
153 {
154 String* pStr;
155 sal_Bool bHasStyle;
156 short eFamDummy;
157
158 rStream >> bHasStyle;
159
160 if ( bHasStyle )
161 {
162 pStr = new String;
163 rStream.ReadByteString( *pStr, rStream.GetStreamCharSet() );
164 rStream >> eFamDummy; // wg. altem Dateiformat
165 }
166 else
167 pStr = new String( ScGlobal::GetRscString(STR_STYLENAME_STANDARD) );
168
169 SfxItemSet *pNewSet = new SfxItemSet( *GetItemSet().GetPool(),
170 ATTR_PATTERN_START, ATTR_PATTERN_END );
171 pNewSet->Load( rStream );
172
173 ScPatternAttr* pPattern = new ScPatternAttr( pNewSet );
174
175 pPattern->pName = pStr;
176
177 return pPattern;
178 }
179
Store(SvStream & rStream,sal_uInt16) const180 SvStream& __EXPORT ScPatternAttr::Store(SvStream& rStream, sal_uInt16 /* nItemVersion */) const
181 {
182 rStream << (sal_Bool)sal_True;
183
184 if ( pStyle )
185 rStream.WriteByteString( pStyle->GetName(), rStream.GetStreamCharSet() );
186 else if ( pName ) // wenn Style geloescht ist/war
187 rStream.WriteByteString( *pName, rStream.GetStreamCharSet() );
188 else
189 rStream.WriteByteString( ScGlobal::GetRscString(STR_STYLENAME_STANDARD),
190 rStream.GetStreamCharSet() );
191
192 rStream << (short)SFX_STYLE_FAMILY_PARA; // wg. altem Dateiformat
193
194 GetItemSet().Store( rStream );
195
196 return rStream;
197 }
198
GetCellOrientation(const SfxItemSet & rItemSet,const SfxItemSet * pCondSet)199 SvxCellOrientation ScPatternAttr::GetCellOrientation( const SfxItemSet& rItemSet, const SfxItemSet* pCondSet )
200 {
201 SvxCellOrientation eOrient = SVX_ORIENTATION_STANDARD;
202
203 if( ((const SfxBoolItem&)GetItem( ATTR_STACKED, rItemSet, pCondSet )).GetValue() )
204 {
205 eOrient = SVX_ORIENTATION_STACKED;
206 }
207 else
208 {
209 sal_Int32 nAngle = ((const SfxInt32Item&)GetItem( ATTR_ROTATE_VALUE, rItemSet, pCondSet )).GetValue();
210 if( nAngle == 9000 )
211 eOrient = SVX_ORIENTATION_BOTTOMTOP;
212 else if( nAngle == 27000 )
213 eOrient = SVX_ORIENTATION_TOPBOTTOM;
214 }
215
216 return eOrient;
217 }
218
GetCellOrientation(const SfxItemSet * pCondSet) const219 SvxCellOrientation ScPatternAttr::GetCellOrientation( const SfxItemSet* pCondSet ) const
220 {
221 return GetCellOrientation( GetItemSet(), pCondSet );
222 }
223
GetFont(Font & rFont,const SfxItemSet & rItemSet,ScAutoFontColorMode eAutoMode,OutputDevice * pOutDev,const Fraction * pScale,const SfxItemSet * pCondSet,sal_uInt8 nScript,const Color * pBackConfigColor,const Color * pTextConfigColor)224 void ScPatternAttr::GetFont(
225 Font& rFont, const SfxItemSet& rItemSet, ScAutoFontColorMode eAutoMode,
226 OutputDevice* pOutDev, const Fraction* pScale,
227 const SfxItemSet* pCondSet, sal_uInt8 nScript,
228 const Color* pBackConfigColor, const Color* pTextConfigColor )
229 {
230 // Items auslesen
231
232 const SvxFontItem* pFontAttr;
233 sal_uInt32 nFontHeight;
234 FontWeight eWeight;
235 FontItalic eItalic;
236 FontUnderline eUnder;
237 FontUnderline eOver;
238 sal_Bool bWordLine;
239 FontStrikeout eStrike;
240 sal_Bool bOutline;
241 sal_Bool bShadow;
242 FontEmphasisMark eEmphasis;
243 FontRelief eRelief;
244 Color aColor;
245 LanguageType eLang;
246
247 sal_uInt16 nFontId, nHeightId, nWeightId, nPostureId, nLangId;
248 if ( nScript == SCRIPTTYPE_ASIAN )
249 {
250 nFontId = ATTR_CJK_FONT;
251 nHeightId = ATTR_CJK_FONT_HEIGHT;
252 nWeightId = ATTR_CJK_FONT_WEIGHT;
253 nPostureId = ATTR_CJK_FONT_POSTURE;
254 nLangId = ATTR_CJK_FONT_LANGUAGE;
255 }
256 else if ( nScript == SCRIPTTYPE_COMPLEX )
257 {
258 nFontId = ATTR_CTL_FONT;
259 nHeightId = ATTR_CTL_FONT_HEIGHT;
260 nWeightId = ATTR_CTL_FONT_WEIGHT;
261 nPostureId = ATTR_CTL_FONT_POSTURE;
262 nLangId = ATTR_CTL_FONT_LANGUAGE;
263 }
264 else
265 {
266 nFontId = ATTR_FONT;
267 nHeightId = ATTR_FONT_HEIGHT;
268 nWeightId = ATTR_FONT_WEIGHT;
269 nPostureId = ATTR_FONT_POSTURE;
270 nLangId = ATTR_FONT_LANGUAGE;
271 }
272
273 if ( pCondSet )
274 {
275 const SfxPoolItem* pItem;
276
277 if ( pCondSet->GetItemState( nFontId, sal_True, &pItem ) != SFX_ITEM_SET )
278 pItem = &rItemSet.Get( nFontId );
279 pFontAttr = (const SvxFontItem*) pItem;
280
281 if ( pCondSet->GetItemState( nHeightId, sal_True, &pItem ) != SFX_ITEM_SET )
282 pItem = &rItemSet.Get( nHeightId );
283 nFontHeight = ((const SvxFontHeightItem*)pItem)->GetHeight();
284
285 if ( pCondSet->GetItemState( nWeightId, sal_True, &pItem ) != SFX_ITEM_SET )
286 pItem = &rItemSet.Get( nWeightId );
287 eWeight = (FontWeight)((const SvxWeightItem*)pItem)->GetValue();
288
289 if ( pCondSet->GetItemState( nPostureId, sal_True, &pItem ) != SFX_ITEM_SET )
290 pItem = &rItemSet.Get( nPostureId );
291 eItalic = (FontItalic)((const SvxPostureItem*)pItem)->GetValue();
292
293 if ( pCondSet->GetItemState( ATTR_FONT_UNDERLINE, sal_True, &pItem ) != SFX_ITEM_SET )
294 pItem = &rItemSet.Get( ATTR_FONT_UNDERLINE );
295 eUnder = (FontUnderline)((const SvxUnderlineItem*)pItem)->GetValue();
296
297 if ( pCondSet->GetItemState( ATTR_FONT_OVERLINE, sal_True, &pItem ) != SFX_ITEM_SET )
298 pItem = &rItemSet.Get( ATTR_FONT_OVERLINE );
299 eOver = (FontUnderline)((const SvxOverlineItem*)pItem)->GetValue();
300
301 if ( pCondSet->GetItemState( ATTR_FONT_WORDLINE, sal_True, &pItem ) != SFX_ITEM_SET )
302 pItem = &rItemSet.Get( ATTR_FONT_WORDLINE );
303 bWordLine = ((const SvxWordLineModeItem*)pItem)->GetValue();
304
305 if ( pCondSet->GetItemState( ATTR_FONT_CROSSEDOUT, sal_True, &pItem ) != SFX_ITEM_SET )
306 pItem = &rItemSet.Get( ATTR_FONT_CROSSEDOUT );
307 eStrike = (FontStrikeout)((const SvxCrossedOutItem*)pItem)->GetValue();
308
309 if ( pCondSet->GetItemState( ATTR_FONT_CONTOUR, sal_True, &pItem ) != SFX_ITEM_SET )
310 pItem = &rItemSet.Get( ATTR_FONT_CONTOUR );
311 bOutline = ((const SvxContourItem*)pItem)->GetValue();
312
313 if ( pCondSet->GetItemState( ATTR_FONT_SHADOWED, sal_True, &pItem ) != SFX_ITEM_SET )
314 pItem = &rItemSet.Get( ATTR_FONT_SHADOWED );
315 bShadow = ((const SvxShadowedItem*)pItem)->GetValue();
316
317 if ( pCondSet->GetItemState( ATTR_FONT_EMPHASISMARK, sal_True, &pItem ) != SFX_ITEM_SET )
318 pItem = &rItemSet.Get( ATTR_FONT_EMPHASISMARK );
319 eEmphasis = ((const SvxEmphasisMarkItem*)pItem)->GetEmphasisMark();
320
321 if ( pCondSet->GetItemState( ATTR_FONT_RELIEF, sal_True, &pItem ) != SFX_ITEM_SET )
322 pItem = &rItemSet.Get( ATTR_FONT_RELIEF );
323 eRelief = (FontRelief)((const SvxCharReliefItem*)pItem)->GetValue();
324
325 if ( pCondSet->GetItemState( ATTR_FONT_COLOR, sal_True, &pItem ) != SFX_ITEM_SET )
326 pItem = &rItemSet.Get( ATTR_FONT_COLOR );
327 aColor = ((const SvxColorItem*)pItem)->GetValue();
328
329 if ( pCondSet->GetItemState( nLangId, sal_True, &pItem ) != SFX_ITEM_SET )
330 pItem = &rItemSet.Get( nLangId );
331 eLang = ((const SvxLanguageItem*)pItem)->GetLanguage();
332 }
333 else // alles aus rItemSet
334 {
335 pFontAttr = &(const SvxFontItem&)rItemSet.Get( nFontId );
336 nFontHeight = ((const SvxFontHeightItem&)
337 rItemSet.Get( nHeightId )).GetHeight();
338 eWeight = (FontWeight)((const SvxWeightItem&)
339 rItemSet.Get( nWeightId )).GetValue();
340 eItalic = (FontItalic)((const SvxPostureItem&)
341 rItemSet.Get( nPostureId )).GetValue();
342 eUnder = (FontUnderline)((const SvxUnderlineItem&)
343 rItemSet.Get( ATTR_FONT_UNDERLINE )).GetValue();
344 eOver = (FontUnderline)((const SvxOverlineItem&)
345 rItemSet.Get( ATTR_FONT_OVERLINE )).GetValue();
346 bWordLine = ((const SvxWordLineModeItem&)
347 rItemSet.Get( ATTR_FONT_WORDLINE )).GetValue();
348 eStrike = (FontStrikeout)((const SvxCrossedOutItem&)
349 rItemSet.Get( ATTR_FONT_CROSSEDOUT )).GetValue();
350 bOutline = ((const SvxContourItem&)
351 rItemSet.Get( ATTR_FONT_CONTOUR )).GetValue();
352 bShadow = ((const SvxShadowedItem&)
353 rItemSet.Get( ATTR_FONT_SHADOWED )).GetValue();
354 eEmphasis = ((const SvxEmphasisMarkItem&)
355 rItemSet.Get( ATTR_FONT_EMPHASISMARK )).GetEmphasisMark();
356 eRelief = (FontRelief)((const SvxCharReliefItem&)
357 rItemSet.Get( ATTR_FONT_RELIEF )).GetValue();
358 aColor = ((const SvxColorItem&)
359 rItemSet.Get( ATTR_FONT_COLOR )).GetValue();
360 // for graphite language features
361 eLang =
362 ((const SvxLanguageItem&)rItemSet.Get( nLangId )).GetLanguage();
363 }
364 DBG_ASSERT(pFontAttr,"nanu?");
365
366 // auswerten
367
368 // FontItem:
369
370 if (rFont.GetName() != pFontAttr->GetFamilyName())
371 rFont.SetName( pFontAttr->GetFamilyName() );
372 if (rFont.GetStyleName() != pFontAttr->GetStyleName())
373 rFont.SetStyleName( pFontAttr->GetStyleName() );
374
375 rFont.SetFamily( pFontAttr->GetFamily() );
376 rFont.SetCharSet( pFontAttr->GetCharSet() );
377 rFont.SetPitch( pFontAttr->GetPitch() );
378
379 rFont.SetLanguage(eLang);
380
381 // Groesse
382
383 if ( pOutDev != NULL )
384 {
385 Size aEffSize;
386 Fraction aFraction( 1,1 );
387 if (pScale)
388 aFraction = *pScale;
389 Size aSize( 0, (long) nFontHeight );
390 MapMode aDestMode = pOutDev->GetMapMode();
391 MapMode aSrcMode( MAP_TWIP, Point(), aFraction, aFraction );
392 if (aDestMode.GetMapUnit() == MAP_PIXEL)
393 aEffSize = pOutDev->LogicToPixel( aSize, aSrcMode );
394 else
395 {
396 Fraction aFractOne(1,1);
397 aDestMode.SetScaleX( aFractOne );
398 aDestMode.SetScaleY( aFractOne );
399 aEffSize = OutputDevice::LogicToLogic( aSize, aSrcMode, aDestMode );
400 }
401 rFont.SetSize( aEffSize );
402 }
403 else /* if pOutDev != NULL */
404 {
405 rFont.SetSize( Size( 0, (long) nFontHeight ) );
406 }
407
408 // determine effective font color
409
410 if ( ( aColor.GetColor() == COL_AUTO && eAutoMode != SC_AUTOCOL_RAW ) ||
411 eAutoMode == SC_AUTOCOL_IGNOREFONT || eAutoMode == SC_AUTOCOL_IGNOREALL )
412 {
413 if ( eAutoMode == SC_AUTOCOL_BLACK )
414 aColor.SetColor( COL_BLACK );
415 else
416 {
417 // get background color from conditional or own set
418 Color aBackColor;
419 if ( pCondSet )
420 {
421 const SfxPoolItem* pItem;
422 if ( pCondSet->GetItemState( ATTR_BACKGROUND, sal_True, &pItem ) != SFX_ITEM_SET )
423 pItem = &rItemSet.Get( ATTR_BACKGROUND );
424 aBackColor = ((const SvxBrushItem*)pItem)->GetColor();
425 }
426 else
427 aBackColor = ((const SvxBrushItem&)rItemSet.Get( ATTR_BACKGROUND )).GetColor();
428
429 // if background color attribute is transparent, use window color for brightness comparisons
430 if ( aBackColor == COL_TRANSPARENT ||
431 eAutoMode == SC_AUTOCOL_IGNOREBACK || eAutoMode == SC_AUTOCOL_IGNOREALL )
432 {
433 if ( eAutoMode == SC_AUTOCOL_PRINT )
434 aBackColor.SetColor( COL_WHITE );
435 else if ( pBackConfigColor )
436 {
437 // pBackConfigColor can be used to avoid repeated lookup of the configured color
438 aBackColor = *pBackConfigColor;
439 }
440 else
441 aBackColor.SetColor( SC_MOD()->GetColorConfig().GetColorValue(svtools::DOCCOLOR).nColor );
442 }
443
444 // get system text color for comparison
445 Color aSysTextColor;
446 if ( eAutoMode == SC_AUTOCOL_PRINT )
447 aSysTextColor.SetColor( COL_BLACK );
448 else if ( pTextConfigColor )
449 {
450 // pTextConfigColor can be used to avoid repeated lookup of the configured color
451 aSysTextColor = *pTextConfigColor;
452 }
453 else
454 aSysTextColor.SetColor( SC_MOD()->GetColorConfig().GetColorValue(svtools::FONTCOLOR).nColor );
455
456 // select the resulting color
457 if ( aBackColor.IsDark() && aSysTextColor.IsDark() )
458 {
459 // use white instead of dark on dark
460 aColor.SetColor( COL_WHITE );
461 }
462 else if ( aBackColor.IsBright() && aSysTextColor.IsBright() )
463 {
464 // use black instead of bright on bright
465 aColor.SetColor( COL_BLACK );
466 }
467 else
468 {
469 // use aSysTextColor (black for SC_AUTOCOL_PRINT, from style settings otherwise)
470 aColor = aSysTextColor;
471 }
472 }
473 }
474
475 // set font effects
476 rFont.SetWeight( eWeight );
477 rFont.SetItalic( eItalic );
478 rFont.SetUnderline( eUnder );
479 rFont.SetOverline( eOver );
480 rFont.SetWordLineMode( bWordLine );
481 rFont.SetStrikeout( eStrike );
482 rFont.SetOutline( bOutline );
483 rFont.SetShadow( bShadow );
484 rFont.SetEmphasisMark( eEmphasis );
485 rFont.SetRelief( eRelief );
486 rFont.SetColor( aColor );
487 rFont.SetTransparent( sal_True );
488 }
489
GetFont(Font & rFont,ScAutoFontColorMode eAutoMode,OutputDevice * pOutDev,const Fraction * pScale,const SfxItemSet * pCondSet,sal_uInt8 nScript,const Color * pBackConfigColor,const Color * pTextConfigColor) const490 void ScPatternAttr::GetFont(
491 Font& rFont, ScAutoFontColorMode eAutoMode,
492 OutputDevice* pOutDev, const Fraction* pScale,
493 const SfxItemSet* pCondSet, sal_uInt8 nScript,
494 const Color* pBackConfigColor, const Color* pTextConfigColor ) const
495 {
496 GetFont( rFont, GetItemSet(), eAutoMode, pOutDev, pScale, pCondSet, nScript, pBackConfigColor, pTextConfigColor );
497 }
498
499
FillToEditItemSet(SfxItemSet & rEditSet,const SfxItemSet & rSrcSet,const SfxItemSet * pCondSet)500 void ScPatternAttr::FillToEditItemSet( SfxItemSet& rEditSet, const SfxItemSet& rSrcSet, const SfxItemSet* pCondSet )
501 {
502 // Items auslesen
503
504 SvxColorItem aColorItem(EE_CHAR_COLOR); // use item as-is
505 SvxFontItem aFontItem(EE_CHAR_FONTINFO); // use item as-is
506 SvxFontItem aCjkFontItem(EE_CHAR_FONTINFO_CJK);
507 SvxFontItem aCtlFontItem(EE_CHAR_FONTINFO_CTL);
508 long nTHeight, nCjkTHeight, nCtlTHeight; // Twips
509 FontWeight eWeight, eCjkWeight, eCtlWeight;
510 SvxUnderlineItem aUnderlineItem(UNDERLINE_NONE, EE_CHAR_UNDERLINE);
511 SvxOverlineItem aOverlineItem(UNDERLINE_NONE, EE_CHAR_OVERLINE);
512 sal_Bool bWordLine;
513 FontStrikeout eStrike;
514 FontItalic eItalic, eCjkItalic, eCtlItalic;
515 sal_Bool bOutline;
516 sal_Bool bShadow;
517 sal_Bool bForbidden;
518 FontEmphasisMark eEmphasis;
519 FontRelief eRelief;
520 LanguageType eLang, eCjkLang, eCtlLang;
521 sal_Bool bHyphenate;
522 SvxFrameDirection eDirection;
523
524 //! additional parameter to control if language is needed?
525
526 if ( pCondSet )
527 {
528 const SfxPoolItem* pItem;
529
530 if ( pCondSet->GetItemState( ATTR_FONT_COLOR, sal_True, &pItem ) != SFX_ITEM_SET )
531 pItem = &rSrcSet.Get( ATTR_FONT_COLOR );
532 aColorItem = *(const SvxColorItem*)pItem;
533
534 if ( pCondSet->GetItemState( ATTR_FONT, sal_True, &pItem ) != SFX_ITEM_SET )
535 pItem = &rSrcSet.Get( ATTR_FONT );
536 aFontItem = *(const SvxFontItem*)pItem;
537 if ( pCondSet->GetItemState( ATTR_CJK_FONT, sal_True, &pItem ) != SFX_ITEM_SET )
538 pItem = &rSrcSet.Get( ATTR_CJK_FONT );
539 aCjkFontItem = *(const SvxFontItem*)pItem;
540 if ( pCondSet->GetItemState( ATTR_CTL_FONT, sal_True, &pItem ) != SFX_ITEM_SET )
541 pItem = &rSrcSet.Get( ATTR_CTL_FONT );
542 aCtlFontItem = *(const SvxFontItem*)pItem;
543
544 if ( pCondSet->GetItemState( ATTR_FONT_HEIGHT, sal_True, &pItem ) != SFX_ITEM_SET )
545 pItem = &rSrcSet.Get( ATTR_FONT_HEIGHT );
546 nTHeight = ((const SvxFontHeightItem*)pItem)->GetHeight();
547 if ( pCondSet->GetItemState( ATTR_CJK_FONT_HEIGHT, sal_True, &pItem ) != SFX_ITEM_SET )
548 pItem = &rSrcSet.Get( ATTR_CJK_FONT_HEIGHT );
549 nCjkTHeight = ((const SvxFontHeightItem*)pItem)->GetHeight();
550 if ( pCondSet->GetItemState( ATTR_CTL_FONT_HEIGHT, sal_True, &pItem ) != SFX_ITEM_SET )
551 pItem = &rSrcSet.Get( ATTR_CTL_FONT_HEIGHT );
552 nCtlTHeight = ((const SvxFontHeightItem*)pItem)->GetHeight();
553
554 if ( pCondSet->GetItemState( ATTR_FONT_WEIGHT, sal_True, &pItem ) != SFX_ITEM_SET )
555 pItem = &rSrcSet.Get( ATTR_FONT_WEIGHT );
556 eWeight = (FontWeight)((const SvxWeightItem*)pItem)->GetValue();
557 if ( pCondSet->GetItemState( ATTR_CJK_FONT_WEIGHT, sal_True, &pItem ) != SFX_ITEM_SET )
558 pItem = &rSrcSet.Get( ATTR_CJK_FONT_WEIGHT );
559 eCjkWeight = (FontWeight)((const SvxWeightItem*)pItem)->GetValue();
560 if ( pCondSet->GetItemState( ATTR_CTL_FONT_WEIGHT, sal_True, &pItem ) != SFX_ITEM_SET )
561 pItem = &rSrcSet.Get( ATTR_CTL_FONT_WEIGHT );
562 eCtlWeight = (FontWeight)((const SvxWeightItem*)pItem)->GetValue();
563
564 if ( pCondSet->GetItemState( ATTR_FONT_POSTURE, sal_True, &pItem ) != SFX_ITEM_SET )
565 pItem = &rSrcSet.Get( ATTR_FONT_POSTURE );
566 eItalic = (FontItalic)((const SvxPostureItem*)pItem)->GetValue();
567 if ( pCondSet->GetItemState( ATTR_CJK_FONT_POSTURE, sal_True, &pItem ) != SFX_ITEM_SET )
568 pItem = &rSrcSet.Get( ATTR_CJK_FONT_POSTURE );
569 eCjkItalic = (FontItalic)((const SvxPostureItem*)pItem)->GetValue();
570 if ( pCondSet->GetItemState( ATTR_CTL_FONT_POSTURE, sal_True, &pItem ) != SFX_ITEM_SET )
571 pItem = &rSrcSet.Get( ATTR_CTL_FONT_POSTURE );
572 eCtlItalic = (FontItalic)((const SvxPostureItem*)pItem)->GetValue();
573
574 if ( pCondSet->GetItemState( ATTR_FONT_UNDERLINE, sal_True, &pItem ) != SFX_ITEM_SET )
575 pItem = &rSrcSet.Get( ATTR_FONT_UNDERLINE );
576 aUnderlineItem = *(const SvxUnderlineItem*)pItem;
577
578 if ( pCondSet->GetItemState( ATTR_FONT_OVERLINE, sal_True, &pItem ) != SFX_ITEM_SET )
579 pItem = &rSrcSet.Get( ATTR_FONT_OVERLINE );
580 aOverlineItem = *(const SvxOverlineItem*)pItem;
581
582 if ( pCondSet->GetItemState( ATTR_FONT_WORDLINE, sal_True, &pItem ) != SFX_ITEM_SET )
583 pItem = &rSrcSet.Get( ATTR_FONT_WORDLINE );
584 bWordLine = ((const SvxWordLineModeItem*)pItem)->GetValue();
585
586 if ( pCondSet->GetItemState( ATTR_FONT_CROSSEDOUT, sal_True, &pItem ) != SFX_ITEM_SET )
587 pItem = &rSrcSet.Get( ATTR_FONT_CROSSEDOUT );
588 eStrike = (FontStrikeout)((const SvxCrossedOutItem*)pItem)->GetValue();
589
590 if ( pCondSet->GetItemState( ATTR_FONT_CONTOUR, sal_True, &pItem ) != SFX_ITEM_SET )
591 pItem = &rSrcSet.Get( ATTR_FONT_CONTOUR );
592 bOutline = ((const SvxContourItem*)pItem)->GetValue();
593
594 if ( pCondSet->GetItemState( ATTR_FONT_SHADOWED, sal_True, &pItem ) != SFX_ITEM_SET )
595 pItem = &rSrcSet.Get( ATTR_FONT_SHADOWED );
596 bShadow = ((const SvxShadowedItem*)pItem)->GetValue();
597
598 if ( pCondSet->GetItemState( ATTR_FORBIDDEN_RULES, sal_True, &pItem ) != SFX_ITEM_SET )
599 pItem = &rSrcSet.Get( ATTR_FORBIDDEN_RULES );
600 bForbidden = ((const SvxForbiddenRuleItem*)pItem)->GetValue();
601
602 if ( pCondSet->GetItemState( ATTR_FONT_EMPHASISMARK, sal_True, &pItem ) != SFX_ITEM_SET )
603 pItem = &rSrcSet.Get( ATTR_FONT_EMPHASISMARK );
604 eEmphasis = ((const SvxEmphasisMarkItem*)pItem)->GetEmphasisMark();
605 if ( pCondSet->GetItemState( ATTR_FONT_RELIEF, sal_True, &pItem ) != SFX_ITEM_SET )
606 pItem = &rSrcSet.Get( ATTR_FONT_RELIEF );
607 eRelief = (FontRelief)((const SvxCharReliefItem*)pItem)->GetValue();
608
609 if ( pCondSet->GetItemState( ATTR_FONT_LANGUAGE, sal_True, &pItem ) != SFX_ITEM_SET )
610 pItem = &rSrcSet.Get( ATTR_FONT_LANGUAGE );
611 eLang = ((const SvxLanguageItem*)pItem)->GetLanguage();
612 if ( pCondSet->GetItemState( ATTR_CJK_FONT_LANGUAGE, sal_True, &pItem ) != SFX_ITEM_SET )
613 pItem = &rSrcSet.Get( ATTR_CJK_FONT_LANGUAGE );
614 eCjkLang = ((const SvxLanguageItem*)pItem)->GetLanguage();
615 if ( pCondSet->GetItemState( ATTR_CTL_FONT_LANGUAGE, sal_True, &pItem ) != SFX_ITEM_SET )
616 pItem = &rSrcSet.Get( ATTR_CTL_FONT_LANGUAGE );
617 eCtlLang = ((const SvxLanguageItem*)pItem)->GetLanguage();
618
619 if ( pCondSet->GetItemState( ATTR_HYPHENATE, sal_True, &pItem ) != SFX_ITEM_SET )
620 pItem = &rSrcSet.Get( ATTR_HYPHENATE );
621 bHyphenate = ((const SfxBoolItem*)pItem)->GetValue();
622
623 if ( pCondSet->GetItemState( ATTR_WRITINGDIR, sal_True, &pItem ) != SFX_ITEM_SET )
624 pItem = &rSrcSet.Get( ATTR_WRITINGDIR );
625 eDirection = (SvxFrameDirection)((const SvxFrameDirectionItem*)pItem)->GetValue();
626 }
627 else // alles direkt aus Pattern
628 {
629 aColorItem = (const SvxColorItem&) rSrcSet.Get( ATTR_FONT_COLOR );
630 aFontItem = (const SvxFontItem&) rSrcSet.Get( ATTR_FONT );
631 aCjkFontItem = (const SvxFontItem&) rSrcSet.Get( ATTR_CJK_FONT );
632 aCtlFontItem = (const SvxFontItem&) rSrcSet.Get( ATTR_CTL_FONT );
633 nTHeight = ((const SvxFontHeightItem&)
634 rSrcSet.Get( ATTR_FONT_HEIGHT )).GetHeight();
635 nCjkTHeight = ((const SvxFontHeightItem&)
636 rSrcSet.Get( ATTR_CJK_FONT_HEIGHT )).GetHeight();
637 nCtlTHeight = ((const SvxFontHeightItem&)
638 rSrcSet.Get( ATTR_CTL_FONT_HEIGHT )).GetHeight();
639 eWeight = (FontWeight)((const SvxWeightItem&)
640 rSrcSet.Get( ATTR_FONT_WEIGHT )).GetValue();
641 eCjkWeight = (FontWeight)((const SvxWeightItem&)
642 rSrcSet.Get( ATTR_CJK_FONT_WEIGHT )).GetValue();
643 eCtlWeight = (FontWeight)((const SvxWeightItem&)
644 rSrcSet.Get( ATTR_CTL_FONT_WEIGHT )).GetValue();
645 eItalic = (FontItalic)((const SvxPostureItem&)
646 rSrcSet.Get( ATTR_FONT_POSTURE )).GetValue();
647 eCjkItalic = (FontItalic)((const SvxPostureItem&)
648 rSrcSet.Get( ATTR_CJK_FONT_POSTURE )).GetValue();
649 eCtlItalic = (FontItalic)((const SvxPostureItem&)
650 rSrcSet.Get( ATTR_CTL_FONT_POSTURE )).GetValue();
651 aUnderlineItem = (const SvxUnderlineItem&) rSrcSet.Get( ATTR_FONT_UNDERLINE );
652 aOverlineItem = (const SvxOverlineItem&) rSrcSet.Get( ATTR_FONT_OVERLINE );
653 bWordLine = ((const SvxWordLineModeItem&)
654 rSrcSet.Get( ATTR_FONT_WORDLINE )).GetValue();
655 eStrike = (FontStrikeout)((const SvxCrossedOutItem&)
656 rSrcSet.Get( ATTR_FONT_CROSSEDOUT )).GetValue();
657 bOutline = ((const SvxContourItem&)
658 rSrcSet.Get( ATTR_FONT_CONTOUR )).GetValue();
659 bShadow = ((const SvxShadowedItem&)
660 rSrcSet.Get( ATTR_FONT_SHADOWED )).GetValue();
661 bForbidden = ((const SvxForbiddenRuleItem&)
662 rSrcSet.Get( ATTR_FORBIDDEN_RULES )).GetValue();
663 eEmphasis = ((const SvxEmphasisMarkItem&)
664 rSrcSet.Get( ATTR_FONT_EMPHASISMARK )).GetEmphasisMark();
665 eRelief = (FontRelief)((const SvxCharReliefItem&)
666 rSrcSet.Get( ATTR_FONT_RELIEF )).GetValue();
667 eLang = ((const SvxLanguageItem&)
668 rSrcSet.Get( ATTR_FONT_LANGUAGE )).GetLanguage();
669 eCjkLang = ((const SvxLanguageItem&)
670 rSrcSet.Get( ATTR_CJK_FONT_LANGUAGE )).GetLanguage();
671 eCtlLang = ((const SvxLanguageItem&)
672 rSrcSet.Get( ATTR_CTL_FONT_LANGUAGE )).GetLanguage();
673 bHyphenate = ((const SfxBoolItem&)
674 rSrcSet.Get( ATTR_HYPHENATE )).GetValue();
675 eDirection = (SvxFrameDirection)((const SvxFrameDirectionItem&)
676 rSrcSet.Get( ATTR_WRITINGDIR )).GetValue();
677 }
678
679 // kompatibel zu LogicToLogic rechnen, also 2540/1440 = 127/72, und runden
680
681 long nHeight = TwipsToHMM(nTHeight);
682 long nCjkHeight = TwipsToHMM(nCjkTHeight);
683 long nCtlHeight = TwipsToHMM(nCtlTHeight);
684
685 // put items into EditEngine ItemSet
686
687 if ( aColorItem.GetValue().GetColor() == COL_AUTO )
688 {
689 // #108979# When cell attributes are converted to EditEngine paragraph attributes,
690 // don't create a hard item for automatic color, because that would be converted
691 // to black when the item's Store method is used in CreateTransferable/WriteBin.
692 // COL_AUTO is the EditEngine's pool default, so ClearItem will result in automatic
693 // color, too, without having to store the item.
694 rEditSet.ClearItem( EE_CHAR_COLOR );
695 }
696 else
697 rEditSet.Put( aColorItem );
698 rEditSet.Put( aFontItem );
699 rEditSet.Put( aCjkFontItem );
700 rEditSet.Put( aCtlFontItem );
701 rEditSet.Put( SvxFontHeightItem( nHeight, 100, EE_CHAR_FONTHEIGHT ) );
702 rEditSet.Put( SvxFontHeightItem( nCjkHeight, 100, EE_CHAR_FONTHEIGHT_CJK ) );
703 rEditSet.Put( SvxFontHeightItem( nCtlHeight, 100, EE_CHAR_FONTHEIGHT_CTL ) );
704 rEditSet.Put( SvxWeightItem ( eWeight, EE_CHAR_WEIGHT ) );
705 rEditSet.Put( SvxWeightItem ( eCjkWeight, EE_CHAR_WEIGHT_CJK ) );
706 rEditSet.Put( SvxWeightItem ( eCtlWeight, EE_CHAR_WEIGHT_CTL ) );
707 rEditSet.Put( aUnderlineItem );
708 rEditSet.Put( aOverlineItem );
709 rEditSet.Put( SvxWordLineModeItem( bWordLine, EE_CHAR_WLM ) );
710 rEditSet.Put( SvxCrossedOutItem( eStrike, EE_CHAR_STRIKEOUT ) );
711 rEditSet.Put( SvxPostureItem ( eItalic, EE_CHAR_ITALIC ) );
712 rEditSet.Put( SvxPostureItem ( eCjkItalic, EE_CHAR_ITALIC_CJK ) );
713 rEditSet.Put( SvxPostureItem ( eCtlItalic, EE_CHAR_ITALIC_CTL ) );
714 rEditSet.Put( SvxContourItem ( bOutline, EE_CHAR_OUTLINE ) );
715 rEditSet.Put( SvxShadowedItem ( bShadow, EE_CHAR_SHADOW ) );
716 rEditSet.Put( SfxBoolItem ( EE_PARA_FORBIDDENRULES, bForbidden ) );
717 rEditSet.Put( SvxEmphasisMarkItem( eEmphasis, EE_CHAR_EMPHASISMARK ) );
718 rEditSet.Put( SvxCharReliefItem( eRelief, EE_CHAR_RELIEF ) );
719 rEditSet.Put( SvxLanguageItem ( eLang, EE_CHAR_LANGUAGE ) );
720 rEditSet.Put( SvxLanguageItem ( eCjkLang, EE_CHAR_LANGUAGE_CJK ) );
721 rEditSet.Put( SvxLanguageItem ( eCtlLang, EE_CHAR_LANGUAGE_CTL ) );
722 rEditSet.Put( SfxBoolItem ( EE_PARA_HYPHENATE, bHyphenate ) );
723 rEditSet.Put( SvxFrameDirectionItem( eDirection, EE_PARA_WRITINGDIR ) );
724
725 // #111216# Script spacing is always off.
726 // The cell attribute isn't used here as long as there is no UI to set it
727 // (don't evaluate attributes that can't be changed).
728 // If a locale-dependent default is needed, it has to go into the cell
729 // style, like the fonts.
730 rEditSet.Put( SvxScriptSpaceItem( sal_False, EE_PARA_ASIANCJKSPACING ) );
731 }
732
FillEditItemSet(SfxItemSet * pEditSet,const SfxItemSet * pCondSet) const733 void ScPatternAttr::FillEditItemSet( SfxItemSet* pEditSet, const SfxItemSet* pCondSet ) const
734 {
735 if( pEditSet )
736 FillToEditItemSet( *pEditSet, GetItemSet(), pCondSet );
737 }
738
739
GetFromEditItemSet(SfxItemSet & rDestSet,const SfxItemSet & rEditSet)740 void ScPatternAttr::GetFromEditItemSet( SfxItemSet& rDestSet, const SfxItemSet& rEditSet )
741 {
742 const SfxPoolItem* pItem;
743
744 if (rEditSet.GetItemState(EE_CHAR_COLOR,sal_True,&pItem) == SFX_ITEM_SET)
745 rDestSet.Put( SvxColorItem(ATTR_FONT_COLOR) = *(const SvxColorItem*)pItem );
746
747 if (rEditSet.GetItemState(EE_CHAR_FONTINFO,sal_True,&pItem) == SFX_ITEM_SET)
748 rDestSet.Put( SvxFontItem(ATTR_FONT) = *(const SvxFontItem*)pItem );
749 if (rEditSet.GetItemState(EE_CHAR_FONTINFO_CJK,sal_True,&pItem) == SFX_ITEM_SET)
750 rDestSet.Put( SvxFontItem(ATTR_CJK_FONT) = *(const SvxFontItem*)pItem );
751 if (rEditSet.GetItemState(EE_CHAR_FONTINFO_CTL,sal_True,&pItem) == SFX_ITEM_SET)
752 rDestSet.Put( SvxFontItem(ATTR_CTL_FONT) = *(const SvxFontItem*)pItem );
753
754 if (rEditSet.GetItemState(EE_CHAR_FONTHEIGHT,sal_True,&pItem) == SFX_ITEM_SET)
755 rDestSet.Put( SvxFontHeightItem( HMMToTwips( ((const SvxFontHeightItem*)pItem)->GetHeight() ),
756 100, ATTR_FONT_HEIGHT ) );
757 if (rEditSet.GetItemState(EE_CHAR_FONTHEIGHT_CJK,sal_True,&pItem) == SFX_ITEM_SET)
758 rDestSet.Put( SvxFontHeightItem( HMMToTwips( ((const SvxFontHeightItem*)pItem)->GetHeight() ),
759 100, ATTR_CJK_FONT_HEIGHT ) );
760 if (rEditSet.GetItemState(EE_CHAR_FONTHEIGHT_CTL,sal_True,&pItem) == SFX_ITEM_SET)
761 rDestSet.Put( SvxFontHeightItem( HMMToTwips( ((const SvxFontHeightItem*)pItem)->GetHeight() ),
762 100, ATTR_CTL_FONT_HEIGHT ) );
763
764 if (rEditSet.GetItemState(EE_CHAR_WEIGHT,sal_True,&pItem) == SFX_ITEM_SET)
765 rDestSet.Put( SvxWeightItem( (FontWeight)((const SvxWeightItem*)pItem)->GetValue(),
766 ATTR_FONT_WEIGHT) );
767 if (rEditSet.GetItemState(EE_CHAR_WEIGHT_CJK,sal_True,&pItem) == SFX_ITEM_SET)
768 rDestSet.Put( SvxWeightItem( (FontWeight)((const SvxWeightItem*)pItem)->GetValue(),
769 ATTR_CJK_FONT_WEIGHT) );
770 if (rEditSet.GetItemState(EE_CHAR_WEIGHT_CTL,sal_True,&pItem) == SFX_ITEM_SET)
771 rDestSet.Put( SvxWeightItem( (FontWeight)((const SvxWeightItem*)pItem)->GetValue(),
772 ATTR_CTL_FONT_WEIGHT) );
773
774 // SvxTextLineItem contains enum and color
775 if (rEditSet.GetItemState(EE_CHAR_UNDERLINE,sal_True,&pItem) == SFX_ITEM_SET)
776 rDestSet.Put( SvxUnderlineItem(UNDERLINE_NONE,ATTR_FONT_UNDERLINE) = *(const SvxUnderlineItem*)pItem );
777 if (rEditSet.GetItemState(EE_CHAR_OVERLINE,sal_True,&pItem) == SFX_ITEM_SET)
778 rDestSet.Put( SvxOverlineItem(UNDERLINE_NONE,ATTR_FONT_OVERLINE) = *(const SvxOverlineItem*)pItem );
779 if (rEditSet.GetItemState(EE_CHAR_WLM,sal_True,&pItem) == SFX_ITEM_SET)
780 rDestSet.Put( SvxWordLineModeItem( ((const SvxWordLineModeItem*)pItem)->GetValue(),
781 ATTR_FONT_WORDLINE) );
782
783 if (rEditSet.GetItemState(EE_CHAR_STRIKEOUT,sal_True,&pItem) == SFX_ITEM_SET)
784 rDestSet.Put( SvxCrossedOutItem( (FontStrikeout)((const SvxCrossedOutItem*)pItem)->GetValue(),
785 ATTR_FONT_CROSSEDOUT) );
786
787 if (rEditSet.GetItemState(EE_CHAR_ITALIC,sal_True,&pItem) == SFX_ITEM_SET)
788 rDestSet.Put( SvxPostureItem( (FontItalic)((const SvxPostureItem*)pItem)->GetValue(),
789 ATTR_FONT_POSTURE) );
790 if (rEditSet.GetItemState(EE_CHAR_ITALIC_CJK,sal_True,&pItem) == SFX_ITEM_SET)
791 rDestSet.Put( SvxPostureItem( (FontItalic)((const SvxPostureItem*)pItem)->GetValue(),
792 ATTR_CJK_FONT_POSTURE) );
793 if (rEditSet.GetItemState(EE_CHAR_ITALIC_CTL,sal_True,&pItem) == SFX_ITEM_SET)
794 rDestSet.Put( SvxPostureItem( (FontItalic)((const SvxPostureItem*)pItem)->GetValue(),
795 ATTR_CTL_FONT_POSTURE) );
796
797 if (rEditSet.GetItemState(EE_CHAR_OUTLINE,sal_True,&pItem) == SFX_ITEM_SET)
798 rDestSet.Put( SvxContourItem( ((const SvxContourItem*)pItem)->GetValue(),
799 ATTR_FONT_CONTOUR) );
800 if (rEditSet.GetItemState(EE_CHAR_SHADOW,sal_True,&pItem) == SFX_ITEM_SET)
801 rDestSet.Put( SvxShadowedItem( ((const SvxShadowedItem*)pItem)->GetValue(),
802 ATTR_FONT_SHADOWED) );
803 if (rEditSet.GetItemState(EE_CHAR_EMPHASISMARK,sal_True,&pItem) == SFX_ITEM_SET)
804 rDestSet.Put( SvxEmphasisMarkItem( ((const SvxEmphasisMarkItem*)pItem)->GetEmphasisMark(),
805 ATTR_FONT_EMPHASISMARK) );
806 if (rEditSet.GetItemState(EE_CHAR_RELIEF,sal_True,&pItem) == SFX_ITEM_SET)
807 rDestSet.Put( SvxCharReliefItem( (FontRelief)((const SvxCharReliefItem*)pItem)->GetValue(),
808 ATTR_FONT_RELIEF) );
809
810 if (rEditSet.GetItemState(EE_CHAR_LANGUAGE,sal_True,&pItem) == SFX_ITEM_SET)
811 rDestSet.Put( SvxLanguageItem(static_cast<const SvxLanguageItem*>(pItem)->GetValue(), ATTR_FONT_LANGUAGE) );
812 if (rEditSet.GetItemState(EE_CHAR_LANGUAGE_CJK,sal_True,&pItem) == SFX_ITEM_SET)
813 rDestSet.Put( SvxLanguageItem(static_cast<const SvxLanguageItem*>(pItem)->GetValue(), ATTR_CJK_FONT_LANGUAGE) );
814 if (rEditSet.GetItemState(EE_CHAR_LANGUAGE_CTL,sal_True,&pItem) == SFX_ITEM_SET)
815 rDestSet.Put( SvxLanguageItem(static_cast<const SvxLanguageItem*>(pItem)->GetValue(), ATTR_CTL_FONT_LANGUAGE) );
816
817 if (rEditSet.GetItemState(EE_PARA_JUST,sal_True,&pItem) == SFX_ITEM_SET)
818 {
819 SvxCellHorJustify eVal;
820 switch ( ((const SvxAdjustItem*)pItem)->GetAdjust() )
821 {
822 case SVX_ADJUST_LEFT:
823 // #30154# EditEngine Default ist bei dem GetAttribs() ItemSet
824 // immer gesetzt!
825 // ob links oder rechts entscheiden wir selbst bei Text/Zahl
826 eVal = SVX_HOR_JUSTIFY_STANDARD;
827 break;
828 case SVX_ADJUST_RIGHT:
829 eVal = SVX_HOR_JUSTIFY_RIGHT;
830 break;
831 case SVX_ADJUST_BLOCK:
832 eVal = SVX_HOR_JUSTIFY_BLOCK;
833 break;
834 case SVX_ADJUST_CENTER:
835 eVal = SVX_HOR_JUSTIFY_CENTER;
836 break;
837 case SVX_ADJUST_BLOCKLINE:
838 eVal = SVX_HOR_JUSTIFY_BLOCK;
839 break;
840 case SVX_ADJUST_END:
841 eVal = SVX_HOR_JUSTIFY_RIGHT;
842 break;
843 default:
844 eVal = SVX_HOR_JUSTIFY_STANDARD;
845 }
846 if ( eVal != SVX_HOR_JUSTIFY_STANDARD )
847 rDestSet.Put( SvxHorJustifyItem( eVal, ATTR_HOR_JUSTIFY) );
848 }
849 }
850
GetFromEditItemSet(const SfxItemSet * pEditSet)851 void ScPatternAttr::GetFromEditItemSet( const SfxItemSet* pEditSet )
852 {
853 if( pEditSet )
854 GetFromEditItemSet( GetItemSet(), *pEditSet );
855 }
856
FillEditParaItems(SfxItemSet * pEditSet) const857 void ScPatternAttr::FillEditParaItems( SfxItemSet* pEditSet ) const
858 {
859 // in GetFromEditItemSet schon dabei, in FillEditItemSet aber nicht
860 // Hor. Ausrichtung Standard wird immer als "links" umgesetzt
861
862 const SfxItemSet& rMySet = GetItemSet();
863
864 SvxCellHorJustify eHorJust = (SvxCellHorJustify)
865 ((const SvxHorJustifyItem&)rMySet.Get(ATTR_HOR_JUSTIFY)).GetValue();
866
867 SvxAdjust eSvxAdjust;
868 switch (eHorJust)
869 {
870 case SVX_HOR_JUSTIFY_RIGHT: eSvxAdjust = SVX_ADJUST_RIGHT; break;
871 case SVX_HOR_JUSTIFY_CENTER: eSvxAdjust = SVX_ADJUST_CENTER; break;
872 case SVX_HOR_JUSTIFY_BLOCK: eSvxAdjust = SVX_ADJUST_BLOCK; break;
873 default: eSvxAdjust = SVX_ADJUST_LEFT; break;
874 }
875 pEditSet->Put( SvxAdjustItem( eSvxAdjust, EE_PARA_JUST ) );
876 }
877
DeleteUnchanged(const ScPatternAttr * pOldAttrs)878 void ScPatternAttr::DeleteUnchanged( const ScPatternAttr* pOldAttrs )
879 {
880 SfxItemSet& rThisSet = GetItemSet();
881 const SfxItemSet& rOldSet = pOldAttrs->GetItemSet();
882
883 const SfxPoolItem* pThisItem;
884 const SfxPoolItem* pOldItem;
885
886 for ( sal_uInt16 nSubWhich=ATTR_PATTERN_START; nSubWhich<=ATTR_PATTERN_END; nSubWhich++ )
887 {
888 // only items that are set are interesting
889 if ( rThisSet.GetItemState( nSubWhich, sal_False, &pThisItem ) == SFX_ITEM_SET )
890 {
891 SfxItemState eOldState = rOldSet.GetItemState( nSubWhich, sal_True, &pOldItem );
892 if ( eOldState == SFX_ITEM_SET )
893 {
894 // item is set in OldAttrs (or its parent) -> compare pointers
895 if ( pThisItem == pOldItem )
896 rThisSet.ClearItem( nSubWhich );
897 }
898 else if ( eOldState != SFX_ITEM_DONTCARE )
899 {
900 // not set in OldAttrs -> compare item value to default item
901 if ( *pThisItem == rThisSet.GetPool()->GetDefaultItem( nSubWhich ) )
902 rThisSet.ClearItem( nSubWhich );
903 }
904 }
905 }
906 }
907
HasItemsSet(const sal_uInt16 * pWhich) const908 sal_Bool ScPatternAttr::HasItemsSet( const sal_uInt16* pWhich ) const
909 {
910 const SfxItemSet& rSet = GetItemSet();
911 for (sal_uInt16 i=0; pWhich[i]; i++)
912 if ( rSet.GetItemState( pWhich[i], sal_False ) == SFX_ITEM_SET )
913 return sal_True;
914 return sal_False;
915 }
916
ClearItems(const sal_uInt16 * pWhich)917 void ScPatternAttr::ClearItems( const sal_uInt16* pWhich )
918 {
919 SfxItemSet& rSet = GetItemSet();
920 for (sal_uInt16 i=0; pWhich[i]; i++)
921 rSet.ClearItem(pWhich[i]);
922 }
923
lcl_CopyStyleToPool(SfxStyleSheetBase * pSrcStyle,SfxStyleSheetBasePool * pSrcPool,SfxStyleSheetBasePool * pDestPool,const SvNumberFormatterIndexTable * pFormatExchangeList)924 SfxStyleSheetBase* lcl_CopyStyleToPool
925 (
926 SfxStyleSheetBase* pSrcStyle,
927 SfxStyleSheetBasePool* pSrcPool,
928 SfxStyleSheetBasePool* pDestPool,
929 const SvNumberFormatterIndexTable* pFormatExchangeList
930 )
931 {
932 if ( !pSrcStyle || !pDestPool || !pSrcPool )
933 {
934 DBG_ERROR( "CopyStyleToPool: Invalid Arguments :-/" );
935 return NULL;
936 }
937
938 //--------------------------------------------------------
939
940 const String aStrSrcStyle = pSrcStyle->GetName();
941 const SfxStyleFamily eFamily = pSrcStyle->GetFamily();
942 SfxStyleSheetBase* pDestStyle = pDestPool->Find( aStrSrcStyle, eFamily );
943
944 if ( !pDestStyle )
945 {
946 const String aStrParent = pSrcStyle->GetParent();
947 const SfxItemSet& rSrcSet = pSrcStyle->GetItemSet();
948
949 pDestStyle = &pDestPool->Make( aStrSrcStyle, eFamily, SFXSTYLEBIT_USERDEF );
950 SfxItemSet& rDestSet = pDestStyle->GetItemSet();
951 rDestSet.Put( rSrcSet );
952
953 // #b5017505# number format exchange list has to be handled here, too
954 // (only called for cell styles)
955
956 const SfxPoolItem* pSrcItem;
957 if ( pFormatExchangeList &&
958 rSrcSet.GetItemState( ATTR_VALUE_FORMAT, sal_False, &pSrcItem ) == SFX_ITEM_SET )
959 {
960 sal_uLong nOldFormat = static_cast<const SfxUInt32Item*>(pSrcItem)->GetValue();
961 sal_uInt32* pNewFormat = static_cast<sal_uInt32*>(pFormatExchangeList->Get( nOldFormat ));
962 if (pNewFormat)
963 rDestSet.Put( SfxUInt32Item( ATTR_VALUE_FORMAT, *pNewFormat ) );
964 }
965
966 // ggF. abgeleitete Styles erzeugen, wenn nicht vorhanden:
967
968 if ( ScGlobal::GetRscString(STR_STYLENAME_STANDARD) != aStrParent &&
969 aStrSrcStyle != aStrParent &&
970 !pDestPool->Find( aStrParent, eFamily ) )
971 {
972 lcl_CopyStyleToPool( pSrcPool->Find( aStrParent, eFamily ),
973 pSrcPool, pDestPool, pFormatExchangeList );
974 }
975
976 pDestStyle->SetParent( aStrParent );
977 }
978
979 return pDestStyle;
980 }
981
PutInPool(ScDocument * pDestDoc,ScDocument * pSrcDoc) const982 ScPatternAttr* ScPatternAttr::PutInPool( ScDocument* pDestDoc, ScDocument* pSrcDoc ) const
983 {
984 const SfxItemSet* pSrcSet = &GetItemSet();
985
986 ScPatternAttr* pDestPattern = new ScPatternAttr(pDestDoc->GetPool());
987 SfxItemSet* pDestSet = &pDestPattern->GetItemSet();
988
989 // Zellformatvorlage in anderes Dokument kopieren:
990
991 if ( pDestDoc != pSrcDoc )
992 {
993 DBG_ASSERT( pStyle, "Missing Pattern-Style! :-/" );
994
995 // wenn Vorlage im DestDoc vorhanden, dieses benutzen, sonst Style
996 // mit Parent-Vorlagen kopieren/ggF. erzeugen und dem DestDoc hinzufuegen
997
998 SfxStyleSheetBase* pStyleCpy = lcl_CopyStyleToPool( pStyle,
999 pSrcDoc->GetStyleSheetPool(),
1000 pDestDoc->GetStyleSheetPool(),
1001 pDestDoc->GetFormatExchangeList() );
1002
1003 pDestPattern->SetStyleSheet( (ScStyleSheet*)pStyleCpy );
1004 }
1005
1006 for ( sal_uInt16 nAttrId = ATTR_PATTERN_START; nAttrId <= ATTR_PATTERN_END; nAttrId++ )
1007 {
1008 const SfxPoolItem* pSrcItem;
1009 SfxItemState eItemState = pSrcSet->GetItemState( nAttrId, sal_False, &pSrcItem );
1010 if (eItemState==SFX_ITEM_ON)
1011 {
1012 SfxPoolItem* pNewItem = NULL;
1013
1014 if ( nAttrId == ATTR_CONDITIONAL )
1015 {
1016 // Bedingte Formate ins neue Dokument kopieren
1017
1018 sal_uLong nNewIndex = 0;
1019 ScConditionalFormatList* pSrcList = pSrcDoc->GetCondFormList();
1020 if ( pSrcList )
1021 {
1022 sal_uLong nOldIndex = ((const SfxUInt32Item*)pSrcItem)->GetValue();
1023 const ScConditionalFormat* pOldData = pSrcList->GetFormat( nOldIndex );
1024 if ( pOldData )
1025 {
1026 nNewIndex = pDestDoc->AddCondFormat( *pOldData );
1027
1028 // zugehoerige Styles auch mitkopieren
1029 //! nur wenn Format bei Add neu angelegt
1030
1031 ScStyleSheetPool* pSrcSPool = pSrcDoc->GetStyleSheetPool();
1032 ScStyleSheetPool* pDestSPool = pDestDoc->GetStyleSheetPool();
1033 const SvNumberFormatterIndexTable* pFormatExchangeList = pDestDoc->GetFormatExchangeList();
1034 sal_uInt16 nStlCnt = pOldData->Count();
1035 for (sal_uInt16 i=0; i<nStlCnt; i++)
1036 {
1037 String aName = pOldData->GetEntry(i)->GetStyle();
1038 SfxStyleSheetBase* pSrcStl =
1039 pSrcDoc->GetStyleSheetPool()->Find(aName, SFX_STYLE_FAMILY_PARA);
1040 lcl_CopyStyleToPool( pSrcStl, pSrcSPool, pDestSPool, pFormatExchangeList );
1041 }
1042 }
1043 }
1044 pNewItem = new SfxUInt32Item( ATTR_CONDITIONAL, nNewIndex );
1045 }
1046 else if ( nAttrId == ATTR_VALIDDATA )
1047 {
1048 // Gueltigkeit ins neue Dokument kopieren
1049
1050 sal_uLong nNewIndex = 0;
1051 ScValidationDataList* pSrcList = pSrcDoc->GetValidationList();
1052 if ( pSrcList )
1053 {
1054 sal_uLong nOldIndex = ((const SfxUInt32Item*)pSrcItem)->GetValue();
1055 const ScValidationData* pOldData = pSrcList->GetData( nOldIndex );
1056 if ( pOldData )
1057 nNewIndex = pDestDoc->AddValidationEntry( *pOldData );
1058 }
1059 pNewItem = new SfxUInt32Item( ATTR_VALIDDATA, nNewIndex );
1060 }
1061 else if ( nAttrId == ATTR_VALUE_FORMAT && pDestDoc->GetFormatExchangeList() )
1062 {
1063 // Zahlformate nach Exchange-Liste
1064
1065 sal_uLong nOldFormat = ((const SfxUInt32Item*)pSrcItem)->GetValue();
1066 sal_uInt32* pNewFormat = static_cast<sal_uInt32*>(pDestDoc->GetFormatExchangeList()->Get(nOldFormat));
1067 if (pNewFormat)
1068 pNewItem = new SfxUInt32Item( ATTR_VALUE_FORMAT, (sal_uInt32) (*pNewFormat) );
1069 }
1070
1071 if ( pNewItem )
1072 {
1073 pDestSet->Put(*pNewItem);
1074 delete pNewItem;
1075 }
1076 else
1077 pDestSet->Put(*pSrcItem);
1078 }
1079 }
1080
1081 ScPatternAttr* pPatternAttr =
1082 (ScPatternAttr*) &pDestDoc->GetPool()->Put(*pDestPattern);
1083 delete pDestPattern;
1084 return pPatternAttr;
1085 }
1086
IsVisible() const1087 sal_Bool ScPatternAttr::IsVisible() const
1088 {
1089 const SfxItemSet& rSet = GetItemSet();
1090
1091 const SfxPoolItem* pItem;
1092 SfxItemState eState;
1093
1094 eState = rSet.GetItemState( ATTR_BACKGROUND, sal_True, &pItem );
1095 if ( eState == SFX_ITEM_SET )
1096 if ( ((const SvxBrushItem*)pItem)->GetColor().GetColor() != COL_TRANSPARENT )
1097 return sal_True;
1098
1099 eState = rSet.GetItemState( ATTR_BORDER, sal_True, &pItem );
1100 if ( eState == SFX_ITEM_SET )
1101 {
1102 const SvxBoxItem* pBoxItem = (SvxBoxItem*) pItem;
1103 if ( pBoxItem->GetTop() || pBoxItem->GetBottom() ||
1104 pBoxItem->GetLeft() || pBoxItem->GetRight() )
1105 return sal_True;
1106 }
1107
1108 eState = rSet.GetItemState( ATTR_BORDER_TLBR, sal_True, &pItem );
1109 if ( eState == SFX_ITEM_SET )
1110 if( static_cast< const SvxLineItem* >( pItem )->GetLine() )
1111 return sal_True;
1112
1113 eState = rSet.GetItemState( ATTR_BORDER_BLTR, sal_True, &pItem );
1114 if ( eState == SFX_ITEM_SET )
1115 if( static_cast< const SvxLineItem* >( pItem )->GetLine() )
1116 return sal_True;
1117
1118 eState = rSet.GetItemState( ATTR_SHADOW, sal_True, &pItem );
1119 if ( eState == SFX_ITEM_SET )
1120 if ( ((const SvxShadowItem*)pItem)->GetLocation() != SVX_SHADOW_NONE )
1121 return sal_True;
1122
1123 return sal_False;
1124 }
1125
OneEqual(const SfxItemSet & rSet1,const SfxItemSet & rSet2,sal_uInt16 nId)1126 inline sal_Bool OneEqual( const SfxItemSet& rSet1, const SfxItemSet& rSet2, sal_uInt16 nId )
1127 {
1128 const SfxPoolItem* pItem1 = &rSet1.Get(nId);
1129 const SfxPoolItem* pItem2 = &rSet2.Get(nId);
1130 return ( pItem1 == pItem2 || *pItem1 == *pItem2 );
1131 }
1132
IsVisibleEqual(const ScPatternAttr & rOther) const1133 sal_Bool ScPatternAttr::IsVisibleEqual( const ScPatternAttr& rOther ) const
1134 {
1135 const SfxItemSet& rThisSet = GetItemSet();
1136 const SfxItemSet& rOtherSet = rOther.GetItemSet();
1137
1138 return OneEqual( rThisSet, rOtherSet, ATTR_BACKGROUND ) &&
1139 OneEqual( rThisSet, rOtherSet, ATTR_BORDER ) &&
1140 OneEqual( rThisSet, rOtherSet, ATTR_BORDER_TLBR ) &&
1141 OneEqual( rThisSet, rOtherSet, ATTR_BORDER_BLTR ) &&
1142 OneEqual( rThisSet, rOtherSet, ATTR_SHADOW );
1143
1144 //! auch hier nur wirklich sichtbare Werte testen !!!
1145 }
1146
IsEqual(const ScPatternAttr & rOther) const1147 sal_Bool ScPatternAttr::IsEqual( const ScPatternAttr& rOther ) const
1148 {
1149 const SfxItemSet& rThisSet = GetItemSet();
1150 const SfxItemSet& rOtherSet = rOther.GetItemSet();
1151
1152 return OneEqual( rThisSet, rOtherSet, ATTR_BACKGROUND ) &&
1153 OneEqual( rThisSet, rOtherSet, ATTR_BORDER ) &&
1154 OneEqual( rThisSet, rOtherSet, ATTR_BORDER_TLBR ) &&
1155 OneEqual( rThisSet, rOtherSet, ATTR_BORDER_BLTR ) &&
1156 OneEqual( rThisSet, rOtherSet, ATTR_VALUE_FORMAT ) &&
1157 OneEqual( rThisSet, rOtherSet, ATTR_SHADOW );
1158 }
1159
GetStyleName() const1160 const String* ScPatternAttr::GetStyleName() const
1161 {
1162 return pName ? pName : ( pStyle ? &pStyle->GetName() : NULL );
1163 }
1164
1165
SetStyleSheet(ScStyleSheet * pNewStyle)1166 void ScPatternAttr::SetStyleSheet( ScStyleSheet* pNewStyle )
1167 {
1168 if (pNewStyle)
1169 {
1170 SfxItemSet& rPatternSet = GetItemSet();
1171 const SfxItemSet& rStyleSet = pNewStyle->GetItemSet();
1172
1173 for (sal_uInt16 i=ATTR_PATTERN_START; i<=ATTR_PATTERN_END; i++)
1174 {
1175 if (rStyleSet.GetItemState(i, sal_True) == SFX_ITEM_SET)
1176 rPatternSet.ClearItem(i);
1177 }
1178 rPatternSet.SetParent(&pNewStyle->GetItemSet());
1179 pStyle = pNewStyle;
1180 DELETEZ( pName );
1181 }
1182 else
1183 {
1184 DBG_ERROR( "ScPatternAttr::SetStyleSheet( NULL ) :-|" );
1185 GetItemSet().SetParent(NULL);
1186 pStyle = NULL;
1187 }
1188 }
1189
UpdateStyleSheet()1190 void ScPatternAttr::UpdateStyleSheet()
1191 {
1192 if (pName)
1193 {
1194 pStyle = (ScStyleSheet*)pDoc->GetStyleSheetPool()->Find(*pName, SFX_STYLE_FAMILY_PARA);
1195
1196 // wenn Style nicht gefunden, Standard nehmen,
1197 // damit keine leere Anzeige im Toolbox-Controller
1198 //! es wird vorausgesetzt, dass "Standard" immer der erste Eintrag ist!
1199 if (!pStyle)
1200 {
1201 SfxStyleSheetIteratorPtr pIter = pDoc->GetStyleSheetPool()->CreateIterator( SFX_STYLE_FAMILY_PARA, SFXSTYLEBIT_ALL );
1202 pStyle = dynamic_cast< ScStyleSheet* >(pIter->First());
1203 }
1204
1205 if (pStyle)
1206 {
1207 GetItemSet().SetParent(&pStyle->GetItemSet());
1208 DELETEZ( pName );
1209 }
1210 }
1211 else
1212 pStyle = NULL;
1213 }
1214
StyleToName()1215 void ScPatternAttr::StyleToName()
1216 {
1217 // Style wurde geloescht, Namen merken:
1218
1219 if ( pStyle )
1220 {
1221 if ( pName )
1222 *pName = pStyle->GetName();
1223 else
1224 pName = new String( pStyle->GetName() );
1225
1226 pStyle = NULL;
1227 GetItemSet().SetParent( NULL );
1228 }
1229 }
1230
IsSymbolFont() const1231 sal_Bool ScPatternAttr::IsSymbolFont() const
1232 {
1233 const SfxPoolItem* pItem;
1234 if( GetItemSet().GetItemState( ATTR_FONT, sal_True, &pItem ) == SFX_ITEM_SET )
1235 return sal_Bool( ((const SvxFontItem*) pItem)->GetCharSet()
1236 == RTL_TEXTENCODING_SYMBOL );
1237 else
1238 return sal_False;
1239 }
1240
1241 //UNUSED2008-05 FontToSubsFontConverter ScPatternAttr::GetSubsFontConverter( sal_uLong nFlags ) const
1242 //UNUSED2008-05 {
1243 //UNUSED2008-05 const SfxPoolItem* pItem;
1244 //UNUSED2008-05 if( GetItemSet().GetItemState( ATTR_FONT, sal_True, &pItem ) == SFX_ITEM_SET )
1245 //UNUSED2008-05 return CreateFontToSubsFontConverter(
1246 //UNUSED2008-05 ((const SvxFontItem*) pItem)->GetFamilyName(), nFlags );
1247 //UNUSED2008-05 else
1248 //UNUSED2008-05 return 0;
1249 //UNUSED2008-05 }
1250
1251
GetNumberFormat(SvNumberFormatter * pFormatter) const1252 sal_uLong ScPatternAttr::GetNumberFormat( SvNumberFormatter* pFormatter ) const
1253 {
1254 sal_uLong nFormat =
1255 ((SfxUInt32Item*)&GetItemSet().Get( ATTR_VALUE_FORMAT ))->GetValue();
1256 LanguageType eLang =
1257 ((SvxLanguageItem*)&GetItemSet().Get( ATTR_LANGUAGE_FORMAT ))->GetLanguage();
1258 if ( nFormat < SV_COUNTRY_LANGUAGE_OFFSET && eLang == LANGUAGE_SYSTEM )
1259 ; // es bleibt wie es ist
1260 else if ( pFormatter )
1261 nFormat = pFormatter->GetFormatForLanguageIfBuiltIn( nFormat, eLang );
1262 return nFormat;
1263 }
1264
1265 // dasselbe, wenn bedingte Formatierung im Spiel ist:
1266
GetNumberFormat(SvNumberFormatter * pFormatter,const SfxItemSet * pCondSet) const1267 sal_uLong ScPatternAttr::GetNumberFormat( SvNumberFormatter* pFormatter,
1268 const SfxItemSet* pCondSet ) const
1269 {
1270 DBG_ASSERT(pFormatter,"GetNumberFormat ohne Formatter");
1271
1272 const SfxPoolItem* pFormItem;
1273 if ( !pCondSet || pCondSet->GetItemState(ATTR_VALUE_FORMAT,sal_True,&pFormItem) != SFX_ITEM_SET )
1274 pFormItem = &GetItemSet().Get(ATTR_VALUE_FORMAT);
1275
1276 const SfxPoolItem* pLangItem;
1277 if ( !pCondSet || pCondSet->GetItemState(ATTR_LANGUAGE_FORMAT,sal_True,&pLangItem) != SFX_ITEM_SET )
1278 pLangItem = &GetItemSet().Get(ATTR_LANGUAGE_FORMAT);
1279
1280 return pFormatter->GetFormatForLanguageIfBuiltIn(
1281 ((SfxUInt32Item*)pFormItem)->GetValue(),
1282 ((SvxLanguageItem*)pLangItem)->GetLanguage() );
1283 }
1284
GetItem(sal_uInt16 nWhich,const SfxItemSet & rItemSet,const SfxItemSet * pCondSet)1285 const SfxPoolItem& ScPatternAttr::GetItem( sal_uInt16 nWhich, const SfxItemSet& rItemSet, const SfxItemSet* pCondSet )
1286 {
1287 const SfxPoolItem* pCondItem;
1288 if ( pCondSet && pCondSet->GetItemState( nWhich, sal_True, &pCondItem ) == SFX_ITEM_SET )
1289 return *pCondItem;
1290 return rItemSet.Get(nWhich);
1291 }
1292
GetItem(sal_uInt16 nSubWhich,const SfxItemSet * pCondSet) const1293 const SfxPoolItem& ScPatternAttr::GetItem( sal_uInt16 nSubWhich, const SfxItemSet* pCondSet ) const
1294 {
1295 return GetItem( nSubWhich, GetItemSet(), pCondSet );
1296 }
1297
1298 // GetRotateVal testet vorher ATTR_ORIENTATION
1299
GetRotateVal(const SfxItemSet * pCondSet) const1300 long ScPatternAttr::GetRotateVal( const SfxItemSet* pCondSet ) const
1301 {
1302 long nAttrRotate = 0;
1303 if ( GetCellOrientation() == SVX_ORIENTATION_STANDARD )
1304 {
1305 sal_Bool bRepeat = ( static_cast<const SvxHorJustifyItem&>(GetItem(ATTR_HOR_JUSTIFY, pCondSet)).
1306 GetValue() == SVX_HOR_JUSTIFY_REPEAT );
1307 // ignore orientation/rotation if "repeat" is active
1308 if ( !bRepeat )
1309 nAttrRotate = ((const SfxInt32Item&)GetItem( ATTR_ROTATE_VALUE, pCondSet )).GetValue();
1310 }
1311 return nAttrRotate;
1312 }
1313
GetRotateDir(const SfxItemSet * pCondSet) const1314 sal_uInt8 ScPatternAttr::GetRotateDir( const SfxItemSet* pCondSet ) const
1315 {
1316 sal_uInt8 nRet = SC_ROTDIR_NONE;
1317
1318 long nAttrRotate = GetRotateVal( pCondSet );
1319 if ( nAttrRotate )
1320 {
1321 SvxRotateMode eRotMode = (SvxRotateMode)((const SvxRotateModeItem&)
1322 GetItem(ATTR_ROTATE_MODE, pCondSet)).GetValue();
1323
1324 if ( eRotMode == SVX_ROTATE_MODE_STANDARD || nAttrRotate == 18000 )
1325 nRet = SC_ROTDIR_STANDARD;
1326 else if ( eRotMode == SVX_ROTATE_MODE_CENTER )
1327 nRet = SC_ROTDIR_CENTER;
1328 else if ( eRotMode == SVX_ROTATE_MODE_TOP || eRotMode == SVX_ROTATE_MODE_BOTTOM )
1329 {
1330 long nRot180 = nAttrRotate % 18000; // 1/100 Grad
1331 if ( nRot180 == 9000 )
1332 nRet = SC_ROTDIR_CENTER;
1333 else if ( ( eRotMode == SVX_ROTATE_MODE_TOP && nRot180 < 9000 ) ||
1334 ( eRotMode == SVX_ROTATE_MODE_BOTTOM && nRot180 > 9000 ) )
1335 nRet = SC_ROTDIR_LEFT;
1336 else
1337 nRet = SC_ROTDIR_RIGHT;
1338 }
1339 }
1340
1341 return nRet;
1342 }
1343
1344
1345
1346
1347