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 <hintids.hxx>
21 :
22 : #include <vcl/msgbox.hxx>
23 : #include <svl/whiter.hxx>
24 : #include <svl/stritem.hxx>
25 : #include <svl/itemiter.hxx>
26 : #include <svl/ctloptions.hxx>
27 : #include <swmodule.hxx>
28 : #include <sfx2/bindings.hxx>
29 : #include <sfx2/request.hxx>
30 : #include <editeng/fhgtitem.hxx>
31 : #include <editeng/adjitem.hxx>
32 : #include <editeng/lspcitem.hxx>
33 : #include <editeng/udlnitem.hxx>
34 : #include <editeng/escpitem.hxx>
35 : #include <svx/htmlmode.hxx>
36 : #include <editeng/scripttypeitem.hxx>
37 : #include <editeng/frmdiritem.hxx>
38 : #include "paratr.hxx"
39 :
40 : #include <fmtinfmt.hxx>
41 : #include <docsh.hxx>
42 : #include <wrtsh.hxx>
43 : #include <view.hxx>
44 : #include <viewopt.hxx>
45 : #include <uitool.hxx>
46 : #include <textsh.hxx>
47 : #include <num.hxx>
48 : #include <swundo.hxx>
49 : #include <fmtcol.hxx>
50 :
51 : #include <cmdid.h>
52 : #include <globals.h>
53 : #include <shells.hrc>
54 : #include <SwStyleNameMapper.hxx>
55 : #include "swabstdlg.hxx"
56 : #include "chrdlg.hrc"
57 : const SwTwips lFontInc = 2 * 20; // ==> PointToTwips(2)
58 : const SwTwips lFontMaxSz = 72 * 20; // ==> PointToTwips(72)
59 :
60 :
61 :
62 :
63 0 : void SwTextShell::ExecCharAttr(SfxRequest &rReq)
64 : {
65 0 : SwWrtShell &rSh = GetShell();
66 0 : const SfxItemSet *pArgs = rReq.GetArgs();
67 0 : int eState = STATE_TOGGLE;
68 0 : sal_uInt16 nWhich = rReq.GetSlot();
69 :
70 0 : if(pArgs )
71 : {
72 : const SfxPoolItem* pItem;
73 0 : pArgs->GetItemState(nWhich, sal_False, &pItem);
74 : eState = ((const SfxBoolItem &) pArgs->
75 0 : Get( nWhich )).GetValue() ? STATE_ON : STATE_OFF;
76 : }
77 :
78 :
79 0 : SfxItemSet aSet( GetPool(), RES_CHRATR_BEGIN, RES_CHRATR_END-1 );
80 0 : if (STATE_TOGGLE == eState)
81 0 : rSh.GetCurAttr( aSet );
82 :
83 0 : switch ( nWhich )
84 : {
85 : case FN_SET_SUB_SCRIPT:
86 : case FN_SET_SUPER_SCRIPT:
87 : {
88 0 : SvxEscapement eEscape = SVX_ESCAPEMENT_SUBSCRIPT;
89 0 : switch (eState)
90 : {
91 : case STATE_TOGGLE:
92 : {
93 : short nTmpEsc = ((const SvxEscapementItem&)
94 0 : aSet.Get( RES_CHRATR_ESCAPEMENT )).GetEsc();
95 : eEscape = nWhich == FN_SET_SUPER_SCRIPT ?
96 : SVX_ESCAPEMENT_SUPERSCRIPT:
97 0 : SVX_ESCAPEMENT_SUBSCRIPT;
98 0 : if( (nWhich == FN_SET_SUB_SCRIPT && nTmpEsc < 0) ||
99 : (nWhich == FN_SET_SUPER_SCRIPT && nTmpEsc > 0) )
100 0 : eEscape = SVX_ESCAPEMENT_OFF;
101 :
102 0 : SfxBindings& rBind = GetView().GetViewFrame()->GetBindings();
103 0 : if( nWhich == FN_SET_SUB_SCRIPT )
104 : rBind.SetState( SfxBoolItem( FN_SET_SUPER_SCRIPT,
105 0 : sal_False ) );
106 : else
107 : rBind.SetState( SfxBoolItem( FN_SET_SUB_SCRIPT,
108 0 : sal_False ) );
109 :
110 : }
111 0 : break;
112 : case STATE_ON:
113 : eEscape = nWhich == FN_SET_SUPER_SCRIPT ?
114 : SVX_ESCAPEMENT_SUPERSCRIPT:
115 0 : SVX_ESCAPEMENT_SUBSCRIPT;
116 0 : break;
117 : case STATE_OFF:
118 0 : eEscape = SVX_ESCAPEMENT_OFF;
119 0 : break;
120 : }
121 0 : SvxEscapementItem aEscape( eEscape, RES_CHRATR_ESCAPEMENT );
122 0 : if(eEscape == SVX_ESCAPEMENT_SUPERSCRIPT)
123 0 : aEscape.GetEsc() = DFLT_ESC_AUTO_SUPER;
124 0 : else if(eEscape == SVX_ESCAPEMENT_SUBSCRIPT)
125 0 : aEscape.GetEsc() = DFLT_ESC_AUTO_SUB;
126 0 : rSh.SetAttr( aEscape );
127 0 : rReq.AppendItem( aEscape );
128 0 : rReq.Done();
129 : }
130 0 : break;
131 :
132 : case FN_UPDATE_STYLE_BY_EXAMPLE:
133 0 : rSh.QuickUpdateStyle();
134 0 : rReq.Done();
135 0 : break;
136 : case FN_UNDERLINE_DOUBLE:
137 : {
138 : FontUnderline eUnderline = ((const SvxUnderlineItem&)
139 0 : aSet.Get(RES_CHRATR_UNDERLINE)).GetLineStyle();
140 0 : switch( eState )
141 : {
142 : case STATE_TOGGLE:
143 : eUnderline = eUnderline == UNDERLINE_DOUBLE ?
144 : UNDERLINE_NONE :
145 0 : UNDERLINE_DOUBLE;
146 0 : break;
147 : case STATE_ON:
148 0 : eUnderline = UNDERLINE_DOUBLE;
149 0 : break;
150 : case STATE_OFF:
151 0 : eUnderline = UNDERLINE_NONE;
152 0 : break;
153 : }
154 0 : SvxUnderlineItem aUnderline(eUnderline, RES_CHRATR_UNDERLINE );
155 0 : rSh.SetAttr( aUnderline );
156 0 : rReq.AppendItem( aUnderline );
157 0 : rReq.Done();
158 : }
159 0 : break;
160 : case FN_REMOVE_DIRECT_CHAR_FORMATS:
161 0 : if( !rSh.HasReadonlySel() && rSh.IsEndPara())
162 0 : rSh.DontExpandFmt();
163 0 : break;
164 : default:
165 : OSL_FAIL("wrong dispatcher");
166 0 : return;
167 0 : }
168 : }
169 :
170 :
171 0 : void SwTextShell::ExecCharAttrArgs(SfxRequest &rReq)
172 : {
173 0 : sal_uInt16 nSlot = rReq.GetSlot();
174 0 : const SfxItemSet* pArgs = rReq.GetArgs();
175 0 : sal_Bool bArgs = pArgs != 0 && pArgs->Count() > 0;
176 0 : int bGrow = sal_False;
177 0 : SwWrtShell& rWrtSh = GetShell();
178 0 : SwTxtFmtColl* pColl = 0;
179 :
180 : // nur gesetzt, wenn gesamter Absatz selektiert ist und AutoUpdateFmt gesetzt ist
181 0 : if( rWrtSh.HasSelection() && rWrtSh.IsSelFullPara() )
182 : {
183 0 : pColl = rWrtSh.GetCurTxtFmtColl();
184 0 : if(pColl && !pColl->IsAutoUpdateFmt())
185 0 : pColl = 0;
186 : }
187 0 : SfxItemPool& rPool = GetPool();
188 0 : sal_uInt16 nWhich = rPool.GetWhich(nSlot);
189 0 : switch ( nSlot )
190 : {
191 : case FN_TXTATR_INET:
192 : // Sonderbehandlung der PoolId des SwFmtInetFmt
193 0 : if(bArgs)
194 : {
195 0 : const SfxPoolItem& rItem = pArgs->Get(nWhich );
196 :
197 0 : SwFmtINetFmt aINetFmt((const SwFmtINetFmt&)rItem);
198 0 : if( USHRT_MAX == aINetFmt.GetVisitedFmtId() )
199 : {
200 : aINetFmt.SetVisitedFmtId(
201 0 : SwStyleNameMapper::GetPoolIdFromUIName( aINetFmt.GetVisitedFmt(), nsSwGetPoolIdFromName::GET_POOLID_CHRFMT));
202 : }
203 0 : if( USHRT_MAX == aINetFmt.GetINetFmtId() )
204 : {
205 : aINetFmt.SetINetFmtId(
206 0 : SwStyleNameMapper::GetPoolIdFromUIName( aINetFmt.GetINetFmt(), nsSwGetPoolIdFromName::GET_POOLID_CHRFMT));
207 : }
208 :
209 0 : if ( pColl )
210 0 : pColl->SetFmtAttr( aINetFmt );
211 0 : else rWrtSh.SetAttr( aINetFmt );
212 0 : rReq.Done();
213 : }
214 0 : break;
215 :
216 : case FN_GROW_FONT_SIZE:
217 0 : bGrow = sal_True;
218 : // kein break !!
219 : case FN_SHRINK_FONT_SIZE:
220 : {
221 0 : SvxScriptSetItem aSetItem( SID_ATTR_CHAR_FONTHEIGHT, rPool );
222 0 : rWrtSh.GetCurAttr( aSetItem.GetItemSet() );
223 0 : SfxItemSet aAttrSet( rPool, aSetItem.GetItemSet().GetRanges() );
224 :
225 : const SfxPoolItem* pI;
226 : static const sal_uInt16 aScrTypes[] = {
227 : SCRIPTTYPE_LATIN, SCRIPTTYPE_ASIAN, SCRIPTTYPE_COMPLEX, 0 };
228 0 : sal_uInt16 nScriptType = rWrtSh.GetScriptType();
229 0 : for( const sal_uInt16* pScrpTyp = aScrTypes; *pScrpTyp; ++pScrpTyp )
230 0 : if( ( nScriptType & *pScrpTyp ) &&
231 0 : 0 != ( pI = aSetItem.GetItemOfScript( *pScrpTyp )))
232 : {
233 0 : SvxFontHeightItem aSize( *(const SvxFontHeightItem*)pI );
234 0 : SwTwips lSize = (SwTwips) aSize.GetHeight();
235 :
236 0 : if (bGrow)
237 : {
238 0 : if( lSize == lFontMaxSz )
239 : break; // das wars, hoeher gehts nicht
240 0 : if( ( lSize += lFontInc ) > lFontMaxSz )
241 0 : lSize = lFontMaxSz;
242 : }
243 : else
244 : {
245 0 : if( 4 == lSize )
246 : break;
247 0 : if( ( lSize -= lFontInc ) < 4 )
248 0 : lSize = 4;
249 : }
250 0 : aSize.SetHeight( lSize );
251 0 : aAttrSet.Put( aSize );
252 : }
253 0 : if( aAttrSet.Count() )
254 : {
255 0 : if( pColl )
256 0 : pColl->SetFmtAttr( aAttrSet );
257 : else
258 0 : rWrtSh.SetAttr( aAttrSet );
259 : }
260 0 : rReq.Done();
261 : }
262 0 : break;
263 :
264 : default:
265 : OSL_FAIL("wrong dispatcher");
266 0 : return;
267 : }
268 : }
269 :
270 0 : void SwTextShell::ExecParaAttr(SfxRequest &rReq)
271 : {
272 : SvxAdjust eAdjst;
273 : sal_uInt8 ePropL;
274 0 : const SfxItemSet* pArgs = rReq.GetArgs();
275 :
276 : // gleich beide Attribute holen, ist nicht teuerer !!
277 0 : SfxItemSet aSet( GetPool(),
278 : RES_PARATR_LINESPACING, RES_PARATR_ADJUST,
279 : RES_FRAMEDIR, RES_FRAMEDIR,
280 0 : 0 );
281 :
282 0 : sal_uInt16 nSlot = rReq.GetSlot();
283 0 : switch (nSlot)
284 : {
285 : case SID_ATTR_PARA_ADJUST:
286 : {
287 0 : if( pArgs && SFX_ITEM_SET == pArgs->GetItemState(RES_PARATR_ADJUST) )
288 : {
289 0 : const SvxAdjustItem& rAdj = (const SvxAdjustItem&) pArgs->Get(RES_PARATR_ADJUST);
290 0 : SvxAdjustItem aAdj( rAdj.GetAdjust(), RES_PARATR_ADJUST );
291 0 : if ( rAdj.GetAdjust() == SVX_ADJUST_BLOCK )
292 : {
293 0 : aAdj.SetLastBlock( rAdj.GetLastBlock() );
294 0 : aAdj.SetOneWord( rAdj.GetOneWord() );
295 : }
296 :
297 0 : aSet.Put(aAdj);
298 : }
299 : }
300 0 : break;
301 0 : case SID_ATTR_PARA_ADJUST_LEFT: eAdjst = SVX_ADJUST_LEFT; goto SET_ADJUST;
302 0 : case SID_ATTR_PARA_ADJUST_RIGHT: eAdjst = SVX_ADJUST_RIGHT; goto SET_ADJUST;
303 0 : case SID_ATTR_PARA_ADJUST_CENTER: eAdjst = SVX_ADJUST_CENTER; goto SET_ADJUST;
304 0 : case SID_ATTR_PARA_ADJUST_BLOCK: eAdjst = SVX_ADJUST_BLOCK; goto SET_ADJUST;
305 : SET_ADJUST:
306 : {
307 0 : aSet.Put(SvxAdjustItem(eAdjst,RES_PARATR_ADJUST));
308 0 : rReq.AppendItem( SfxBoolItem( GetPool().GetWhich(nSlot), sal_True ) );
309 : }
310 0 : break;
311 :
312 : case SID_ATTR_PARA_LINESPACE:
313 0 : if(pArgs && SFX_ITEM_SET == pArgs->GetItemState( GetPool().GetWhich(nSlot) ))
314 : {
315 : SvxLineSpacingItem aLineSpace = (const SvxLineSpacingItem&)pArgs->Get(
316 0 : GetPool().GetWhich(nSlot));
317 0 : aSet.Put( aLineSpace );
318 : }
319 0 : break;
320 0 : case SID_ATTR_PARA_LINESPACE_10: ePropL = 100; goto SET_LINESPACE;
321 0 : case SID_ATTR_PARA_LINESPACE_15: ePropL = 150; goto SET_LINESPACE;
322 0 : case SID_ATTR_PARA_LINESPACE_20: ePropL = 200; goto SET_LINESPACE;
323 :
324 : SET_LINESPACE:
325 : {
326 :
327 0 : SvxLineSpacingItem aLineSpacing(ePropL, RES_PARATR_LINESPACING );
328 0 : aLineSpacing.GetLineSpaceRule() = SVX_LINE_SPACE_AUTO;
329 0 : if( 100 == ePropL )
330 0 : aLineSpacing.GetInterLineSpaceRule() = SVX_INTER_LINE_SPACE_OFF;
331 : else
332 0 : aLineSpacing.SetPropLineSpace(ePropL);
333 0 : aSet.Put( aLineSpacing );
334 : }
335 0 : break;
336 :
337 : case SID_ATTR_PARA_LEFT_TO_RIGHT :
338 : case SID_ATTR_PARA_RIGHT_TO_LEFT :
339 : {
340 0 : SfxItemSet aAdjustSet( GetPool(),
341 0 : RES_PARATR_ADJUST, RES_PARATR_ADJUST );
342 0 : GetShell().GetCurAttr(aAdjustSet);
343 0 : sal_Bool bChgAdjust = sal_False;
344 0 : SfxItemState eAdjustState = aAdjustSet.GetItemState(RES_PARATR_ADJUST, sal_False);
345 0 : if(eAdjustState >= SFX_ITEM_DEFAULT)
346 : {
347 : int eAdjust = (int)(( const SvxAdjustItem& )
348 0 : aAdjustSet.Get(RES_PARATR_ADJUST)).GetAdjust();
349 : bChgAdjust = (SVX_ADJUST_LEFT == eAdjust && SID_ATTR_PARA_RIGHT_TO_LEFT == nSlot) ||
350 0 : (SVX_ADJUST_RIGHT == eAdjust && SID_ATTR_PARA_LEFT_TO_RIGHT == nSlot);
351 : }
352 : else
353 0 : bChgAdjust = sal_True;
354 :
355 : SvxFrameDirection eFrmDirection =
356 : (SID_ATTR_PARA_LEFT_TO_RIGHT == nSlot) ?
357 0 : FRMDIR_HORI_LEFT_TOP : FRMDIR_HORI_RIGHT_TOP;
358 0 : aSet.Put( SvxFrameDirectionItem( eFrmDirection, RES_FRAMEDIR ) );
359 :
360 0 : if (bChgAdjust)
361 : {
362 : SvxAdjust eAdjust = (SID_ATTR_PARA_LEFT_TO_RIGHT == nSlot) ?
363 0 : SVX_ADJUST_LEFT : SVX_ADJUST_RIGHT;
364 0 : SvxAdjustItem aAdjust( eAdjust, RES_PARATR_ADJUST );
365 0 : aSet.Put( aAdjust );
366 0 : aAdjust.SetWhich(SID_ATTR_PARA_ADJUST);
367 0 : GetView().GetViewFrame()->GetBindings().SetState( aAdjust );
368 : // Toggle numbering alignment
369 0 : const SwNumRule* pCurRule = GetShell().GetCurNumRule();
370 0 : if( pCurRule )
371 : {
372 0 : SvxNumRule aRule = pCurRule->MakeSvxNumRule();
373 :
374 0 : for(sal_uInt16 i = 0; i < aRule.GetLevelCount(); i++)
375 : {
376 0 : SvxNumberFormat aFmt(aRule.GetLevel(i));
377 0 : if(SVX_ADJUST_LEFT == aFmt.GetNumAdjust())
378 0 : aFmt.SetNumAdjust( SVX_ADJUST_RIGHT );
379 :
380 0 : else if(SVX_ADJUST_RIGHT == aFmt.GetNumAdjust())
381 0 : aFmt.SetNumAdjust( SVX_ADJUST_LEFT );
382 :
383 0 : aRule.SetLevel(i, aFmt, aRule.Get(i) != 0);
384 0 : }
385 0 : SwNumRule aSetRule( pCurRule->GetName(),
386 0 : pCurRule->Get( 0 ).GetPositionAndSpaceMode() );
387 0 : aSetRule.SetSvxRule( aRule, GetShell().GetDoc());
388 0 : aSetRule.SetAutoRule( sal_True );
389 : // no start or continuation of a list - list style is only changed
390 0 : GetShell().SetCurNumRule( aSetRule, false );
391 0 : }
392 0 : }
393 : }
394 0 : break;
395 :
396 : default:
397 : OSL_FAIL("wrong dispatcher");
398 0 : return;
399 : }
400 0 : SwWrtShell& rWrtSh = GetShell();
401 0 : SwTxtFmtColl* pColl = rWrtSh.GetCurTxtFmtColl();
402 0 : if(pColl && pColl->IsAutoUpdateFmt())
403 : {
404 0 : rWrtSh.AutoUpdatePara(pColl, aSet);
405 : }
406 : else
407 0 : rWrtSh.SetAttr( aSet );
408 0 : rReq.Done();
409 : }
410 :
411 0 : void SwTextShell::ExecParaAttrArgs(SfxRequest &rReq)
412 : {
413 0 : SwWrtShell &rSh = GetShell();
414 0 : const SfxItemSet *pArgs = rReq.GetArgs();
415 0 : const SfxPoolItem *pItem = 0;
416 :
417 0 : sal_uInt16 nSlot = rReq.GetSlot();
418 0 : if(pArgs)
419 0 : pArgs->GetItemState(GetPool().GetWhich(nSlot), sal_False, &pItem);
420 0 : switch ( nSlot )
421 : {
422 : case FN_DROP_CHAR_STYLE_NAME:
423 0 : if( pItem )
424 : {
425 0 : String sCharStyleName = ((const SfxStringItem*)pItem)->GetValue();
426 0 : SfxItemSet aSet(GetPool(), RES_PARATR_DROP, RES_PARATR_DROP, 0L);
427 0 : rSh.GetCurAttr(aSet);
428 0 : SwFmtDrop aDropItem((const SwFmtDrop&)aSet.Get(RES_PARATR_DROP));
429 0 : SwCharFmt* pFmt = 0;
430 0 : if(sCharStyleName.Len())
431 0 : pFmt = rSh.FindCharFmtByName( sCharStyleName );
432 0 : aDropItem.SetCharFmt( pFmt );
433 0 : aSet.Put(aDropItem);
434 0 : rSh.SetAttr(aSet);
435 : }
436 0 : break;
437 : case FN_FORMAT_DROPCAPS:
438 : {
439 0 : if(pItem)
440 : {
441 0 : rSh.SetAttr(*pItem);
442 0 : rReq.Done();
443 : }
444 : else
445 : {
446 0 : SfxItemSet aSet(GetPool(), RES_PARATR_DROP, RES_PARATR_DROP,
447 0 : HINT_END, HINT_END, 0);
448 0 : rSh.GetCurAttr(aSet);
449 0 : SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
450 : OSL_ENSURE(pFact, "SwAbstractDialogFactory fail!");
451 :
452 0 : SfxAbstractDialog* pDlg = pFact->CreateSfxDialog( GetView().GetWindow(), aSet,
453 0 : rSh.GetView().GetViewFrame()->GetFrame().GetFrameInterface(), DLG_SWDROPCAPS );
454 : OSL_ENSURE(pDlg, "Dialogdiet fail!");
455 0 : if (pDlg->Execute() == RET_OK)
456 : {
457 0 : rSh.StartAction();
458 0 : rSh.StartUndo( UNDO_START );
459 0 : if ( SFX_ITEM_SET == aSet.GetItemState(HINT_END,sal_False,&pItem) )
460 : {
461 0 : if ( ((SfxStringItem*)pItem)->GetValue().Len() )
462 0 : rSh.ReplaceDropTxt(((SfxStringItem*)pItem)->GetValue());
463 : }
464 0 : rSh.SetAttr(*pDlg->GetOutputItemSet());
465 0 : rSh.StartUndo( UNDO_END );
466 0 : rSh.EndAction();
467 0 : rReq.Done(*pDlg->GetOutputItemSet());
468 : }
469 0 : delete pDlg;
470 : }
471 : }
472 0 : break;
473 : case SID_ATTR_PARA_PAGEBREAK:
474 0 : if(pItem)
475 : {
476 0 : rSh.SetAttr( *pItem );
477 0 : rReq.Done();
478 : }
479 0 : break;
480 : case SID_ATTR_PARA_MODEL:
481 : {
482 0 : if(pItem)
483 : {
484 0 : SfxItemSet aCoreSet( GetPool(),
485 : RES_PAGEDESC, RES_PAGEDESC,
486 0 : SID_ATTR_PARA_MODEL, SID_ATTR_PARA_MODEL, 0);
487 0 : aCoreSet.Put(*pItem);
488 0 : SfxToSwPageDescAttr( rSh, aCoreSet);
489 0 : rSh.SetAttr(aCoreSet);
490 0 : rReq.Done();
491 : }
492 : }
493 0 : break;
494 :
495 : default:
496 : OSL_FAIL("wrong dispatcher");
497 0 : return;
498 : }
499 : }
500 :
501 :
502 :
503 0 : void SwTextShell::GetAttrState(SfxItemSet &rSet)
504 : {
505 0 : SwWrtShell &rSh = GetShell();
506 0 : SfxItemPool& rPool = GetPool();
507 0 : SfxItemSet aCoreSet(rPool, aTxtFmtCollSetRange);
508 0 : rSh.GetCurAttr(aCoreSet); // *alle* Textattribute von der Core erfragen
509 :
510 0 : SfxWhichIter aIter(rSet);
511 0 : sal_uInt16 nSlot = aIter.FirstWhich();
512 0 : sal_Bool bFlag = sal_False;
513 0 : SfxBoolItem aFlagItem;
514 0 : const SfxPoolItem* pItem = 0;
515 0 : int eAdjust = -1; // Illegaler Wert, um DONTCARE zu erkennen
516 0 : SfxItemState eState = aCoreSet.GetItemState(RES_PARATR_ADJUST, sal_False, &pItem);
517 :
518 0 : if( SFX_ITEM_DEFAULT == eState )
519 0 : pItem = &rPool.GetDefaultItem(RES_PARATR_ADJUST);
520 0 : if( SFX_ITEM_DEFAULT <= eState )
521 0 : eAdjust = (int)(( SvxAdjustItem* ) pItem)->GetAdjust();
522 :
523 0 : short nEsc = 0;
524 0 : eState = aCoreSet.GetItemState(RES_CHRATR_ESCAPEMENT, sal_False, &pItem);
525 0 : if( SFX_ITEM_DEFAULT == eState )
526 0 : pItem = &rPool.GetDefaultItem(RES_CHRATR_ESCAPEMENT);
527 0 : if( eState >= SFX_ITEM_DEFAULT )
528 0 : nEsc = ((SvxEscapementItem* )pItem)->GetEsc();
529 :
530 0 : sal_uInt16 nLineSpace = 0;
531 0 : eState = aCoreSet.GetItemState(RES_PARATR_LINESPACING, sal_False, &pItem);
532 0 : if( SFX_ITEM_DEFAULT == eState )
533 0 : pItem = &rPool.GetDefaultItem(RES_PARATR_LINESPACING);
534 0 : if( SFX_ITEM_DEFAULT <= eState &&
535 0 : ((SvxLineSpacingItem* )pItem)->GetLineSpaceRule() == SVX_LINE_SPACE_AUTO )
536 : {
537 0 : if(SVX_INTER_LINE_SPACE_OFF ==
538 0 : ((SvxLineSpacingItem* )pItem)->GetInterLineSpaceRule())
539 0 : nLineSpace = 100;
540 : else
541 0 : nLineSpace = ((SvxLineSpacingItem* )pItem)->GetPropLineSpace();
542 : }
543 :
544 0 : while (nSlot)
545 : {
546 0 : switch(nSlot)
547 : {
548 : case FN_SET_SUPER_SCRIPT:
549 0 : bFlag = 0 < nEsc;
550 0 : break;
551 : case FN_SET_SUB_SCRIPT:
552 0 : bFlag = 0 > nEsc;
553 0 : break;
554 : case SID_ATTR_PARA_ADJUST_LEFT:
555 0 : if (eAdjust == -1)
556 : {
557 0 : rSet.InvalidateItem( nSlot );
558 0 : nSlot = 0;
559 : }
560 : else
561 0 : bFlag = SVX_ADJUST_LEFT == eAdjust;
562 0 : break;
563 : case SID_ATTR_PARA_ADJUST_RIGHT:
564 0 : if (eAdjust == -1)
565 : {
566 0 : rSet.InvalidateItem( nSlot );
567 0 : nSlot = 0;
568 : }
569 : else
570 0 : bFlag = SVX_ADJUST_RIGHT == eAdjust;
571 0 : break;
572 : case SID_ATTR_PARA_ADJUST_CENTER:
573 0 : if (eAdjust == -1)
574 : {
575 0 : rSet.InvalidateItem( nSlot );
576 0 : nSlot = 0;
577 : }
578 : else
579 0 : bFlag = SVX_ADJUST_CENTER == eAdjust;
580 0 : break;
581 : case SID_ATTR_PARA_ADJUST_BLOCK:
582 : {
583 0 : if (eAdjust == -1)
584 : {
585 0 : rSet.InvalidateItem( nSlot );
586 0 : nSlot = 0;
587 : }
588 : else
589 : {
590 0 : bFlag = SVX_ADJUST_BLOCK == eAdjust;
591 0 : sal_uInt16 nHtmlMode = GetHtmlMode(rSh.GetView().GetDocShell());
592 0 : if((nHtmlMode & HTMLMODE_ON) && !(nHtmlMode & HTMLMODE_FULL_STYLES ))
593 : {
594 0 : rSet.DisableItem( nSlot );
595 0 : nSlot = 0;
596 : }
597 : }
598 : }
599 0 : break;
600 : case SID_ATTR_PARA_LINESPACE_10:
601 0 : bFlag = nLineSpace == 100;
602 0 : break;
603 : case SID_ATTR_PARA_LINESPACE_15:
604 0 : bFlag = nLineSpace == 150;
605 0 : break;
606 : case SID_ATTR_PARA_LINESPACE_20:
607 0 : bFlag = nLineSpace == 200;
608 0 : break;
609 : case FN_GROW_FONT_SIZE:
610 : case FN_SHRINK_FONT_SIZE:
611 : {
612 : SvxScriptSetItem aSetItem( SID_ATTR_CHAR_FONTHEIGHT,
613 0 : *rSet.GetPool() );
614 0 : aSetItem.GetItemSet().Put( aCoreSet, sal_False );
615 0 : if( !aSetItem.GetItemOfScript( rSh.GetScriptType() ))
616 0 : rSet.DisableItem( nSlot );
617 0 : nSlot = 0;
618 : }
619 0 : break;
620 : case FN_UNDERLINE_DOUBLE:
621 : {
622 0 : eState = aCoreSet.GetItemState(RES_CHRATR_UNDERLINE);
623 0 : if( eState >= SFX_ITEM_DEFAULT )
624 : {
625 : FontUnderline eUnderline = ((const SvxUnderlineItem&)
626 0 : aCoreSet.Get(RES_CHRATR_UNDERLINE)).GetLineStyle();
627 0 : rSet.Put(SfxBoolItem(nSlot, eUnderline == UNDERLINE_DOUBLE));
628 : }
629 : else
630 0 : rSet.InvalidateItem(nSlot);
631 0 : nSlot = 0;
632 : }
633 0 : break;
634 : case SID_ATTR_PARA_ADJUST:
635 0 : if (eAdjust == -1)
636 0 : rSet.InvalidateItem( nSlot );
637 : else
638 0 : rSet.Put(SvxAdjustItem((SvxAdjust)eAdjust, SID_ATTR_PARA_ADJUST ));
639 0 : nSlot = 0;
640 0 : break;
641 :
642 : case SID_ATTR_PARA_LEFT_TO_RIGHT :
643 : case SID_ATTR_PARA_RIGHT_TO_LEFT :
644 : {
645 0 : if ( !SW_MOD()->GetCTLOptions().IsCTLFontEnabled() )
646 : {
647 0 : rSet.DisableItem( nSlot );
648 0 : nSlot = 0;
649 : }
650 : else
651 : {
652 : // is the item set?
653 0 : sal_uInt16 nHtmlMode = GetHtmlMode(rSh.GetView().GetDocShell());
654 0 : if((!(nHtmlMode & HTMLMODE_ON) || (0 != (nHtmlMode & HTMLMODE_SOME_STYLES))) &&
655 0 : aCoreSet.GetItemState( RES_FRAMEDIR, sal_False ) >= SFX_ITEM_DEFAULT)
656 : {
657 : SvxFrameDirection eFrmDir = (SvxFrameDirection)
658 0 : ((const SvxFrameDirectionItem& )aCoreSet.Get(RES_FRAMEDIR)).GetValue();
659 0 : if (FRMDIR_ENVIRONMENT == eFrmDir)
660 : {
661 0 : eFrmDir = rSh.IsInRightToLeftText() ?
662 0 : FRMDIR_HORI_RIGHT_TOP : FRMDIR_HORI_LEFT_TOP;
663 : }
664 : bFlag = (SID_ATTR_PARA_LEFT_TO_RIGHT == nSlot &&
665 : FRMDIR_HORI_LEFT_TOP == eFrmDir) ||
666 : (SID_ATTR_PARA_RIGHT_TO_LEFT == nSlot &&
667 0 : FRMDIR_HORI_RIGHT_TOP == eFrmDir);
668 : }
669 : else
670 : {
671 0 : rSet.InvalidateItem(nSlot);
672 0 : nSlot = 0;
673 : }
674 : }
675 : }
676 0 : break;
677 :
678 : case SID_ATTR_CHAR_LANGUAGE:
679 : case SID_ATTR_CHAR_KERNING:
680 : case RES_PARATR_DROP:
681 : {
682 : #if OSL_DEBUG_LEVEL > 1
683 : const SfxPoolItem& rItem = aCoreSet.Get(GetPool().GetWhich(nSlot), sal_True);
684 : rSet.Put(rItem);
685 : #else
686 0 : rSet.Put(aCoreSet.Get( GetPool().GetWhich(nSlot), sal_True));
687 : #endif
688 0 : nSlot = 0;
689 : }
690 0 : break;
691 : case SID_ATTR_PARA_MODEL:
692 : {
693 0 : SfxItemSet aTemp(GetPool(),
694 : RES_PAGEDESC,RES_PAGEDESC,
695 : SID_ATTR_PARA_MODEL,SID_ATTR_PARA_MODEL,
696 0 : 0L);
697 0 : aTemp.Put(aCoreSet);
698 0 : ::SwToSfxPageDescAttr(aTemp);
699 0 : rSet.Put(aTemp.Get(SID_ATTR_PARA_MODEL));
700 0 : nSlot = 0;
701 : }
702 0 : break;
703 : case RES_TXTATR_INETFMT:
704 : {
705 0 : SfxItemSet aSet(GetPool(), RES_TXTATR_INETFMT, RES_TXTATR_INETFMT);
706 0 : rSh.GetCurAttr(aSet);
707 0 : const SfxPoolItem& rItem = aSet.Get(RES_TXTATR_INETFMT, sal_True);
708 0 : rSet.Put(rItem);
709 0 : nSlot = 0;
710 : }
711 0 : break;
712 :
713 : default:
714 : // Nichts tun
715 0 : nSlot = 0;
716 0 : break;
717 :
718 : }
719 0 : if( nSlot )
720 : {
721 0 : aFlagItem.SetWhich( nSlot );
722 0 : aFlagItem.SetValue( bFlag );
723 0 : rSet.Put( aFlagItem );
724 : }
725 0 : nSlot = aIter.NextWhich();
726 : }
727 :
728 0 : rSet.Put(aCoreSet,sal_False);
729 30 : }
730 :
731 :
732 :
733 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|