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/adjustitem.hxx>
32 : #include <editeng/lspcitem.hxx>
33 : #include <editeng/lrspitem.hxx>
34 : #include <editeng/udlnitem.hxx>
35 : #include <editeng/escapementitem.hxx>
36 : #include <sfx2/htmlmode.hxx>
37 : #include <editeng/scripttypeitem.hxx>
38 : #include <editeng/frmdiritem.hxx>
39 : #include "paratr.hxx"
40 :
41 : #include <fmtinfmt.hxx>
42 : #include <docsh.hxx>
43 : #include <wrtsh.hxx>
44 : #include <view.hxx>
45 : #include <viewopt.hxx>
46 : #include <uitool.hxx>
47 : #include <textsh.hxx>
48 : #include <num.hxx>
49 : #include <swundo.hxx>
50 : #include <fmtcol.hxx>
51 :
52 : #include <cmdid.h>
53 : #include <globals.h>
54 : #include <shells.hrc>
55 : #include <SwStyleNameMapper.hxx>
56 : #include "swabstdlg.hxx"
57 : #include "outline.hxx"
58 : #include "chrdlg.hrc"
59 : #include <boost/scoped_ptr.hpp>
60 :
61 : const sal_uInt32 nFontInc = 40; // 2pt
62 : const sal_uInt32 nFontMaxSz = 19998; // 999.9pt
63 :
64 0 : void SwTextShell::ExecCharAttr(SfxRequest &rReq)
65 : {
66 0 : SwWrtShell &rSh = GetShell();
67 0 : const SfxItemSet *pArgs = rReq.GetArgs();
68 0 : int eState = STATE_TOGGLE;
69 0 : sal_uInt16 nWhich = rReq.GetSlot();
70 :
71 0 : if(pArgs )
72 : {
73 : const SfxPoolItem* pItem;
74 0 : pArgs->GetItemState(nWhich, false, &pItem);
75 : eState = static_cast<const SfxBoolItem &>( pArgs->
76 0 : Get( nWhich )).GetValue() ? STATE_ON : STATE_OFF;
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 = static_cast<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 0 : (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 : false ) );
106 : else
107 : rBind.SetState( SfxBoolItem( FN_SET_SUB_SCRIPT,
108 0 : 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.SetAttrItem( 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 = static_cast<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.SetAttrItem( 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.DontExpandFormat();
163 0 : break;
164 : default:
165 : OSL_FAIL("wrong dispatcher");
166 0 : return;
167 0 : }
168 : }
169 :
170 0 : void SwTextShell::ExecCharAttrArgs(SfxRequest &rReq)
171 : {
172 0 : sal_uInt16 nSlot = rReq.GetSlot();
173 0 : const SfxItemSet* pArgs = rReq.GetArgs();
174 0 : bool bArgs = pArgs != 0 && pArgs->Count() > 0;
175 0 : SwWrtShell& rWrtSh = GetShell();
176 0 : SwTextFormatColl* pColl = 0;
177 :
178 : // Is only set if the whole paragraph is selected and AutoUpdateFormat is set.
179 0 : if (rWrtSh.HasSelection() && rWrtSh.IsSelFullPara())
180 : {
181 0 : pColl = rWrtSh.GetCurTextFormatColl();
182 0 : if ( pColl && !pColl->IsAutoUpdateFormat() )
183 0 : pColl = 0;
184 : }
185 0 : SfxItemPool& rPool = GetPool();
186 0 : sal_uInt16 nWhich = rPool.GetWhich( nSlot );
187 0 : switch (nSlot)
188 : {
189 : case FN_TXTATR_INET:
190 : // Special treatment of the PoolId of the SwFormatInetFormat
191 0 : if(bArgs)
192 : {
193 0 : const SfxPoolItem& rItem = pArgs->Get( nWhich );
194 :
195 0 : SwFormatINetFormat aINetFormat( static_cast<const SwFormatINetFormat&>(rItem) );
196 0 : if ( USHRT_MAX == aINetFormat.GetVisitedFormatId() )
197 : {
198 : OSL_ENSURE( false, "<SwTextShell::ExecCharAttrArgs(..)> - unexpected visited character format ID at hyperlink attribute" );
199 : aINetFormat.SetVisitedFormatAndId(
200 0 : aINetFormat.GetVisitedFormat(),
201 0 : SwStyleNameMapper::GetPoolIdFromUIName( aINetFormat.GetVisitedFormat(), nsSwGetPoolIdFromName::GET_POOLID_CHRFMT ) );
202 : }
203 0 : if ( USHRT_MAX == aINetFormat.GetINetFormatId() )
204 : {
205 : OSL_ENSURE( false, "<SwTextShell::ExecCharAttrArgs(..)> - unexpected unvisited character format ID at hyperlink attribute" );
206 : aINetFormat.SetINetFormatAndId(
207 0 : aINetFormat.GetINetFormat(),
208 0 : SwStyleNameMapper::GetPoolIdFromUIName( aINetFormat.GetINetFormat(), nsSwGetPoolIdFromName::GET_POOLID_CHRFMT ) );
209 : }
210 :
211 0 : if ( pColl )
212 0 : pColl->SetFormatAttr( aINetFormat );
213 : else
214 0 : rWrtSh.SetAttrItem( aINetFormat );
215 0 : rReq.Done();
216 : }
217 0 : break;
218 :
219 : case FN_GROW_FONT_SIZE:
220 : case FN_SHRINK_FONT_SIZE:
221 : {
222 0 : SvxScriptSetItem aSetItem( SID_ATTR_CHAR_FONTHEIGHT, rPool );
223 0 : rWrtSh.GetCurAttr( aSetItem.GetItemSet() );
224 0 : SfxItemSet aAttrSet( rPool, aSetItem.GetItemSet().GetRanges() );
225 :
226 0 : SvtScriptType nScriptTypes = rWrtSh.GetScriptType();
227 : const SvxFontHeightItem* pSize( static_cast<const SvxFontHeightItem*>(
228 0 : aSetItem.GetItemOfScript( nScriptTypes ) ) );
229 0 : std::vector<std::pair< const SfxPoolItem*, std::unique_ptr<SwPaM> >> vItems;
230 0 : if ( pSize ) // selected text has one size
231 : {
232 : // must create new one, otherwise document is without pam
233 0 : SwPaM* pPaM = rWrtSh.GetCrsr();
234 0 : vItems.push_back( std::make_pair( pSize, std::unique_ptr<SwPaM>(new SwPaM( *(pPaM->GetMark()), *(pPaM->GetPoint()))) ) );
235 : }
236 : else
237 0 : vItems = rWrtSh.GetItemWithPaM( RES_CHRATR_FONTSIZE );
238 :
239 0 : rWrtSh.StartUndo( UNDO_INSATTR, NULL);
240 0 : for( std::pair< const SfxPoolItem*, std::unique_ptr<SwPaM> >& iPair : vItems )
241 : {
242 0 : std::unique_ptr<SwPaM> pPaM = std::move(iPair.second);
243 0 : const SfxPoolItem* pItem = iPair.first;
244 0 : rWrtSh.GetPaMAttr( pPaM.get(), aSetItem.GetItemSet() );
245 0 : aAttrSet.SetRanges( aSetItem.GetItemSet().GetRanges() );
246 :
247 0 : pSize = static_cast<const SvxFontHeightItem*>( pItem );
248 0 : if (pSize)
249 : {
250 0 : SvxFontHeightItem aSize(*pSize);
251 :
252 0 : sal_uInt32 nSize = aSize.GetHeight();
253 :
254 0 : if ( nSlot == FN_GROW_FONT_SIZE && ( nSize += nFontInc ) > nFontMaxSz )
255 0 : nSize = nFontMaxSz;
256 0 : else if ( nSlot == FN_SHRINK_FONT_SIZE && ( nSize -= nFontInc ) < nFontInc )
257 0 : nSize = nFontInc;
258 :
259 0 : aSize.SetHeight( nSize );
260 0 : aSetItem.PutItemForScriptType( nScriptTypes, aSize );
261 0 : aAttrSet.Put( aSetItem.GetItemSet() );
262 0 : if( pColl )
263 0 : pColl->SetFormatAttr( aAttrSet );
264 : else
265 0 : rWrtSh.SetAttrSet( aAttrSet, SetAttrMode::DEFAULT, pPaM.get() );
266 : }
267 0 : }
268 0 : rWrtSh.EndUndo( UNDO_INSATTR, NULL);
269 0 : rReq.Done();
270 : }
271 0 : break;
272 :
273 : default:
274 : OSL_FAIL("wrong dispatcher");
275 0 : return;
276 : }
277 : }
278 :
279 0 : void SwTextShell::ExecParaAttr(SfxRequest &rReq)
280 : {
281 : SvxAdjust eAdjst;
282 : sal_uInt8 ePropL;
283 0 : const SfxItemSet* pArgs = rReq.GetArgs();
284 :
285 : // Get both attributes immediately isn't more expensive!!
286 0 : SfxItemSet aSet( GetPool(),
287 : RES_PARATR_LINESPACING, RES_PARATR_ADJUST,
288 : RES_FRAMEDIR, RES_FRAMEDIR,
289 0 : 0 );
290 :
291 0 : sal_uInt16 nSlot = rReq.GetSlot();
292 0 : switch (nSlot)
293 : {
294 : case SID_ATTR_PARA_ADJUST:
295 : {
296 0 : if( pArgs && SfxItemState::SET == pArgs->GetItemState(RES_PARATR_ADJUST) )
297 : {
298 0 : const SvxAdjustItem& rAdj = static_cast<const SvxAdjustItem&>( pArgs->Get(RES_PARATR_ADJUST) );
299 0 : SvxAdjustItem aAdj( rAdj.GetAdjust(), RES_PARATR_ADJUST );
300 0 : if ( rAdj.GetAdjust() == SVX_ADJUST_BLOCK )
301 : {
302 0 : aAdj.SetLastBlock( rAdj.GetLastBlock() );
303 0 : aAdj.SetOneWord( rAdj.GetOneWord() );
304 : }
305 :
306 0 : aSet.Put(aAdj);
307 : }
308 : }
309 0 : break;
310 0 : case SID_ATTR_PARA_ADJUST_LEFT: eAdjst = SVX_ADJUST_LEFT; goto SET_ADJUST;
311 0 : case SID_ATTR_PARA_ADJUST_RIGHT: eAdjst = SVX_ADJUST_RIGHT; goto SET_ADJUST;
312 0 : case SID_ATTR_PARA_ADJUST_CENTER: eAdjst = SVX_ADJUST_CENTER; goto SET_ADJUST;
313 0 : case SID_ATTR_PARA_ADJUST_BLOCK: eAdjst = SVX_ADJUST_BLOCK; goto SET_ADJUST;
314 : SET_ADJUST:
315 : {
316 0 : aSet.Put(SvxAdjustItem(eAdjst,RES_PARATR_ADJUST));
317 0 : rReq.AppendItem( SfxBoolItem( GetPool().GetWhich(nSlot), true ) );
318 : }
319 0 : break;
320 :
321 : case SID_ATTR_PARA_LINESPACE:
322 0 : if(pArgs && SfxItemState::SET == pArgs->GetItemState( GetPool().GetWhich(nSlot) ))
323 : {
324 : SvxLineSpacingItem aLineSpace = static_cast<const SvxLineSpacingItem&>( pArgs->Get(
325 0 : GetPool().GetWhich(nSlot)));
326 0 : aSet.Put( aLineSpace );
327 : }
328 0 : break;
329 0 : case SID_ATTR_PARA_LINESPACE_10: ePropL = 100; goto SET_LINESPACE;
330 0 : case SID_ATTR_PARA_LINESPACE_15: ePropL = 150; goto SET_LINESPACE;
331 0 : case SID_ATTR_PARA_LINESPACE_20: ePropL = 200; goto SET_LINESPACE;
332 :
333 : SET_LINESPACE:
334 : {
335 :
336 0 : SvxLineSpacingItem aLineSpacing(ePropL, RES_PARATR_LINESPACING );
337 0 : aLineSpacing.GetLineSpaceRule() = SVX_LINE_SPACE_AUTO;
338 0 : if( 100 == ePropL )
339 0 : aLineSpacing.GetInterLineSpaceRule() = SVX_INTER_LINE_SPACE_OFF;
340 : else
341 0 : aLineSpacing.SetPropLineSpace(ePropL);
342 0 : aSet.Put( aLineSpacing );
343 : }
344 0 : break;
345 :
346 : case SID_ATTR_PARA_LEFT_TO_RIGHT :
347 : case SID_ATTR_PARA_RIGHT_TO_LEFT :
348 : {
349 0 : SfxItemSet aAdjustSet( GetPool(),
350 0 : RES_PARATR_ADJUST, RES_PARATR_ADJUST );
351 0 : GetShell().GetCurAttr(aAdjustSet);
352 0 : bool bChgAdjust = false;
353 0 : SfxItemState eAdjustState = aAdjustSet.GetItemState(RES_PARATR_ADJUST, false);
354 0 : if(eAdjustState >= SfxItemState::DEFAULT)
355 : {
356 : int eAdjust = (int)static_cast<const SvxAdjustItem& >(
357 0 : aAdjustSet.Get(RES_PARATR_ADJUST)).GetAdjust();
358 0 : bChgAdjust = (SVX_ADJUST_LEFT == eAdjust && SID_ATTR_PARA_RIGHT_TO_LEFT == nSlot) ||
359 0 : (SVX_ADJUST_RIGHT == eAdjust && SID_ATTR_PARA_LEFT_TO_RIGHT == nSlot);
360 : }
361 : else
362 0 : bChgAdjust = true;
363 :
364 : SvxFrameDirection eFrmDirection =
365 : (SID_ATTR_PARA_LEFT_TO_RIGHT == nSlot) ?
366 0 : FRMDIR_HORI_LEFT_TOP : FRMDIR_HORI_RIGHT_TOP;
367 0 : aSet.Put( SvxFrameDirectionItem( eFrmDirection, RES_FRAMEDIR ) );
368 :
369 0 : if (bChgAdjust)
370 : {
371 : SvxAdjust eAdjust = (SID_ATTR_PARA_LEFT_TO_RIGHT == nSlot) ?
372 0 : SVX_ADJUST_LEFT : SVX_ADJUST_RIGHT;
373 0 : SvxAdjustItem aAdjust( eAdjust, RES_PARATR_ADJUST );
374 0 : aSet.Put( aAdjust );
375 0 : aAdjust.SetWhich(SID_ATTR_PARA_ADJUST);
376 0 : GetView().GetViewFrame()->GetBindings().SetState( aAdjust );
377 : // Toggle numbering alignment
378 0 : const SwNumRule* pCurRule = GetShell().GetNumRuleAtCurrCrsrPos();
379 0 : if( pCurRule )
380 : {
381 0 : SvxNumRule aRule = pCurRule->MakeSvxNumRule();
382 :
383 0 : for(sal_uInt16 i = 0; i < aRule.GetLevelCount(); i++)
384 : {
385 0 : SvxNumberFormat aFormat(aRule.GetLevel(i));
386 0 : if(SVX_ADJUST_LEFT == aFormat.GetNumAdjust())
387 0 : aFormat.SetNumAdjust( SVX_ADJUST_RIGHT );
388 :
389 0 : else if(SVX_ADJUST_RIGHT == aFormat.GetNumAdjust())
390 0 : aFormat.SetNumAdjust( SVX_ADJUST_LEFT );
391 :
392 0 : aRule.SetLevel(i, aFormat, aRule.Get(i) != 0);
393 0 : }
394 : SwNumRule aSetRule( pCurRule->GetName(),
395 0 : pCurRule->Get( 0 ).GetPositionAndSpaceMode() );
396 0 : aSetRule.SetSvxRule( aRule, GetShell().GetDoc());
397 0 : aSetRule.SetAutoRule( true );
398 : // no start or continuation of a list - list style is only changed
399 0 : GetShell().SetCurNumRule( aSetRule, false );
400 0 : }
401 0 : }
402 : }
403 0 : break;
404 :
405 : default:
406 : OSL_FAIL("wrong dispatcher");
407 0 : return;
408 : }
409 0 : SwWrtShell& rWrtSh = GetShell();
410 0 : SwTextFormatColl* pColl = rWrtSh.GetCurTextFormatColl();
411 0 : if(pColl && pColl->IsAutoUpdateFormat())
412 : {
413 0 : rWrtSh.AutoUpdatePara(pColl, aSet);
414 : }
415 : else
416 0 : rWrtSh.SetAttrSet( aSet );
417 0 : rReq.Done();
418 : }
419 :
420 0 : void SwTextShell::ExecParaAttrArgs(SfxRequest &rReq)
421 : {
422 0 : SwWrtShell &rSh = GetShell();
423 0 : const SfxItemSet *pArgs = rReq.GetArgs();
424 0 : const SfxPoolItem *pItem = 0;
425 :
426 0 : sal_uInt16 nSlot = rReq.GetSlot();
427 0 : if(pArgs)
428 0 : pArgs->GetItemState(GetPool().GetWhich(nSlot), false, &pItem);
429 0 : switch ( nSlot )
430 : {
431 : case FN_DROP_CHAR_STYLE_NAME:
432 0 : if( pItem )
433 : {
434 0 : OUString sCharStyleName = static_cast<const SfxStringItem*>(pItem)->GetValue();
435 0 : SfxItemSet aSet(GetPool(), RES_PARATR_DROP, RES_PARATR_DROP, 0L);
436 0 : rSh.GetCurAttr(aSet);
437 0 : SwFormatDrop aDropItem(static_cast<const SwFormatDrop&>(aSet.Get(RES_PARATR_DROP)));
438 0 : SwCharFormat* pFormat = 0;
439 0 : if(!sCharStyleName.isEmpty())
440 0 : pFormat = rSh.FindCharFormatByName( sCharStyleName );
441 0 : aDropItem.SetCharFormat( pFormat );
442 0 : aSet.Put(aDropItem);
443 0 : rSh.SetAttrSet(aSet);
444 : }
445 0 : break;
446 : case FN_FORMAT_DROPCAPS:
447 : {
448 0 : if(pItem)
449 : {
450 0 : rSh.SetAttrItem(*pItem);
451 0 : rReq.Done();
452 : }
453 : else
454 : {
455 0 : SfxItemSet aSet(GetPool(), RES_PARATR_DROP, RES_PARATR_DROP,
456 0 : HINT_END, HINT_END, 0);
457 0 : rSh.GetCurAttr(aSet);
458 0 : SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
459 : OSL_ENSURE(pFact, "SwAbstractDialogFactory fail!");
460 :
461 0 : boost::scoped_ptr<SfxAbstractDialog> pDlg(pFact->CreateSfxDialog( GetView().GetWindow(), aSet,
462 0 : rSh.GetView().GetViewFrame()->GetFrame().GetFrameInterface(), DLG_SWDROPCAPS ));
463 : OSL_ENSURE(pDlg, "Dialog creation failed!");
464 0 : if (pDlg->Execute() == RET_OK)
465 : {
466 0 : rSh.StartAction();
467 0 : rSh.StartUndo( UNDO_START );
468 0 : if ( SfxItemState::SET == aSet.GetItemState(HINT_END,false,&pItem) )
469 : {
470 0 : if ( !static_cast<const SfxStringItem*>(pItem)->GetValue().isEmpty() )
471 0 : rSh.ReplaceDropText(static_cast<const SfxStringItem*>(pItem)->GetValue());
472 : }
473 0 : rSh.SetAttrSet(*pDlg->GetOutputItemSet());
474 0 : rSh.StartUndo( UNDO_END );
475 0 : rSh.EndAction();
476 0 : rReq.Done(*pDlg->GetOutputItemSet());
477 0 : }
478 : }
479 : }
480 0 : break;
481 : case SID_ATTR_PARA_PAGEBREAK:
482 0 : if(pItem)
483 : {
484 0 : rSh.SetAttrItem( *pItem );
485 0 : rReq.Done();
486 : }
487 0 : break;
488 : case SID_ATTR_PARA_MODEL:
489 : {
490 0 : if(pItem)
491 : {
492 0 : SfxItemSet aCoreSet( GetPool(),
493 : RES_PAGEDESC, RES_PAGEDESC,
494 0 : SID_ATTR_PARA_MODEL, SID_ATTR_PARA_MODEL, 0);
495 0 : aCoreSet.Put(*pItem);
496 0 : SfxToSwPageDescAttr( rSh, aCoreSet);
497 0 : rSh.SetAttrSet(aCoreSet);
498 0 : rReq.Done();
499 : }
500 : }
501 0 : break;
502 :
503 : default:
504 : OSL_FAIL("wrong dispatcher");
505 0 : return;
506 : }
507 : }
508 :
509 11269 : void SwTextShell::GetAttrState(SfxItemSet &rSet)
510 : {
511 11269 : SwWrtShell &rSh = GetShell();
512 11269 : SfxItemPool& rPool = GetPool();
513 11269 : SfxItemSet aCoreSet(rPool, aTextFormatCollSetRange);
514 : // Request *all* text attributes from the core.
515 : // fdo#78737: this is called from SvxRuler, which requires the list indents!
516 11269 : rSh.GetCurAttr(aCoreSet, /* bMergeIndentValuesOfNumRule = */ true);
517 :
518 22538 : SfxWhichIter aIter(rSet);
519 11269 : sal_uInt16 nSlot = aIter.FirstWhich();
520 11269 : bool bFlag = false;
521 22538 : SfxBoolItem aFlagItem;
522 11269 : const SfxPoolItem* pItem = 0;
523 11269 : int eAdjust = -1; // Illegal value to recognize DONTCARE.
524 11269 : SfxItemState eState = aCoreSet.GetItemState(RES_PARATR_ADJUST, false, &pItem);
525 :
526 11269 : if( SfxItemState::DEFAULT == eState )
527 11266 : pItem = &rPool.GetDefaultItem(RES_PARATR_ADJUST);
528 11269 : if( SfxItemState::DEFAULT <= eState )
529 11267 : eAdjust = (int)static_cast<const SvxAdjustItem* >( pItem)->GetAdjust();
530 :
531 11269 : short nEsc = 0;
532 11269 : eState = aCoreSet.GetItemState(RES_CHRATR_ESCAPEMENT, false, &pItem);
533 11269 : if( SfxItemState::DEFAULT == eState )
534 11268 : pItem = &rPool.GetDefaultItem(RES_CHRATR_ESCAPEMENT);
535 11269 : if( eState >= SfxItemState::DEFAULT )
536 11269 : nEsc = static_cast<const SvxEscapementItem* >(pItem)->GetEsc();
537 :
538 11269 : sal_uInt16 nLineSpace = 0;
539 11269 : eState = aCoreSet.GetItemState(RES_PARATR_LINESPACING, false, &pItem);
540 11269 : if( SfxItemState::DEFAULT == eState )
541 11266 : pItem = &rPool.GetDefaultItem(RES_PARATR_LINESPACING);
542 22538 : if( SfxItemState::DEFAULT <= eState &&
543 11269 : static_cast<const SvxLineSpacingItem* >(pItem)->GetLineSpaceRule() == SVX_LINE_SPACE_AUTO )
544 : {
545 11269 : if(SVX_INTER_LINE_SPACE_OFF ==
546 11269 : static_cast<const SvxLineSpacingItem* >(pItem)->GetInterLineSpaceRule())
547 11266 : nLineSpace = 100;
548 : else
549 3 : nLineSpace = static_cast<const SvxLineSpacingItem* >(pItem)->GetPropLineSpace();
550 : }
551 :
552 39295 : while (nSlot)
553 : {
554 16757 : switch(nSlot)
555 : {
556 : case FN_SET_SUPER_SCRIPT:
557 1065 : bFlag = 0 < nEsc;
558 1065 : break;
559 : case FN_SET_SUB_SCRIPT:
560 1065 : bFlag = 0 > nEsc;
561 1065 : break;
562 : case SID_ATTR_PARA_ADJUST_LEFT:
563 1065 : if (eAdjust == -1)
564 : {
565 2 : rSet.InvalidateItem( nSlot );
566 2 : nSlot = 0;
567 : }
568 : else
569 1063 : bFlag = SVX_ADJUST_LEFT == eAdjust;
570 1065 : break;
571 : case SID_ATTR_PARA_ADJUST_RIGHT:
572 1065 : if (eAdjust == -1)
573 : {
574 2 : rSet.InvalidateItem( nSlot );
575 2 : nSlot = 0;
576 : }
577 : else
578 1063 : bFlag = SVX_ADJUST_RIGHT == eAdjust;
579 1065 : break;
580 : case SID_ATTR_PARA_ADJUST_CENTER:
581 1065 : if (eAdjust == -1)
582 : {
583 2 : rSet.InvalidateItem( nSlot );
584 2 : nSlot = 0;
585 : }
586 : else
587 1063 : bFlag = SVX_ADJUST_CENTER == eAdjust;
588 1065 : break;
589 : case SID_ATTR_PARA_ADJUST_BLOCK:
590 : {
591 1065 : if (eAdjust == -1)
592 : {
593 2 : rSet.InvalidateItem( nSlot );
594 2 : nSlot = 0;
595 : }
596 : else
597 : {
598 1063 : bFlag = SVX_ADJUST_BLOCK == eAdjust;
599 1063 : sal_uInt16 nHtmlMode = GetHtmlMode(rSh.GetView().GetDocShell());
600 1063 : if((nHtmlMode & HTMLMODE_ON) && !(nHtmlMode & HTMLMODE_FULL_STYLES ))
601 : {
602 1 : rSet.DisableItem( nSlot );
603 1 : nSlot = 0;
604 : }
605 : }
606 : }
607 1065 : break;
608 : case SID_ATTR_PARA_LINESPACE_10:
609 1 : bFlag = nLineSpace == 100;
610 1 : break;
611 : case SID_ATTR_PARA_LINESPACE_15:
612 1 : bFlag = nLineSpace == 150;
613 1 : break;
614 : case SID_ATTR_PARA_LINESPACE_20:
615 1 : bFlag = nLineSpace == 200;
616 1 : break;
617 : case FN_GROW_FONT_SIZE:
618 : case FN_SHRINK_FONT_SIZE:
619 : {
620 : SvxScriptSetItem aSetItem( SID_ATTR_CHAR_FONTHEIGHT,
621 2130 : *rSet.GetPool() );
622 2130 : aSetItem.GetItemSet().Put( aCoreSet, false );
623 : const SvxFontHeightItem* pSize( static_cast<const SvxFontHeightItem*>(
624 2130 : aSetItem.GetItemOfScript( rSh.GetScriptType() ) ) );
625 :
626 2130 : if( pSize ) // selection is of one size
627 : {
628 2130 : sal_uInt32 nSize = pSize->GetHeight();
629 2130 : if( nSize == nFontMaxSz )
630 0 : rSet.DisableItem( FN_GROW_FONT_SIZE );
631 2130 : else if( nSize == nFontInc )
632 0 : rSet.DisableItem( FN_SHRINK_FONT_SIZE );
633 : }
634 : else
635 : {
636 : std::vector<std::pair< const SfxPoolItem*, std::unique_ptr<SwPaM> >>
637 0 : vFontHeight = rSh.GetItemWithPaM( RES_CHRATR_FONTSIZE );
638 0 : for ( std::pair< const SfxPoolItem*, std::unique_ptr<SwPaM>>& pIt : vFontHeight )
639 : {
640 0 : pSize = static_cast<const SvxFontHeightItem*>( pIt.first );
641 0 : sal_uInt32 nSize = pSize->GetHeight();
642 0 : if( nSize == nFontMaxSz )
643 0 : rSet.DisableItem( FN_GROW_FONT_SIZE );
644 0 : else if( nSize == nFontInc )
645 0 : rSet.DisableItem( FN_SHRINK_FONT_SIZE );
646 0 : }
647 : }
648 2130 : nSlot = 0;
649 : }
650 2130 : break;
651 : case FN_UNDERLINE_DOUBLE:
652 : {
653 727 : eState = aCoreSet.GetItemState(RES_CHRATR_UNDERLINE);
654 727 : if( eState >= SfxItemState::DEFAULT )
655 : {
656 : FontUnderline eUnderline = static_cast<const SvxUnderlineItem&>(
657 727 : aCoreSet.Get(RES_CHRATR_UNDERLINE)).GetLineStyle();
658 727 : rSet.Put(SfxBoolItem(nSlot, eUnderline == UNDERLINE_DOUBLE));
659 : }
660 : else
661 0 : rSet.InvalidateItem(nSlot);
662 727 : nSlot = 0;
663 : }
664 727 : break;
665 : case SID_ATTR_PARA_ADJUST:
666 0 : if (eAdjust == -1)
667 0 : rSet.InvalidateItem( nSlot );
668 : else
669 0 : rSet.Put(SvxAdjustItem((SvxAdjust)eAdjust, SID_ATTR_PARA_ADJUST ));
670 0 : nSlot = 0;
671 0 : break;
672 : case SID_ATTR_PARA_LRSPACE:
673 : {
674 429 : eState = aCoreSet.GetItemState(RES_LR_SPACE);
675 429 : if( eState >= SfxItemState::DEFAULT )
676 : {
677 429 : SvxLRSpaceItem aLR = static_cast<const SvxLRSpaceItem&>( aCoreSet.Get( RES_LR_SPACE ) );
678 429 : aLR.SetWhich(SID_ATTR_PARA_LRSPACE);
679 429 : rSet.Put(aLR);
680 : }
681 : else
682 0 : rSet.InvalidateItem(nSlot);
683 429 : nSlot = 0;
684 : }
685 429 : break;
686 :
687 : case SID_ATTR_PARA_LEFT_TO_RIGHT :
688 : case SID_ATTR_PARA_RIGHT_TO_LEFT :
689 : {
690 2844 : if ( !SW_MOD()->GetCTLOptions().IsCTLFontEnabled() )
691 : {
692 0 : rSet.DisableItem( nSlot );
693 0 : nSlot = 0;
694 : }
695 : else
696 : {
697 : // is the item set?
698 2844 : sal_uInt16 nHtmlMode = GetHtmlMode(rSh.GetView().GetDocShell());
699 5688 : if((!(nHtmlMode & HTMLMODE_ON) || (0 != (nHtmlMode & HTMLMODE_SOME_STYLES))) &&
700 2844 : aCoreSet.GetItemState( RES_FRAMEDIR, false ) >= SfxItemState::DEFAULT)
701 : {
702 : SvxFrameDirection eFrmDir = (SvxFrameDirection)
703 2844 : static_cast<const SvxFrameDirectionItem& >(aCoreSet.Get(RES_FRAMEDIR)).GetValue();
704 2844 : if (FRMDIR_ENVIRONMENT == eFrmDir)
705 : {
706 2844 : eFrmDir = rSh.IsInRightToLeftText() ?
707 2844 : FRMDIR_HORI_RIGHT_TOP : FRMDIR_HORI_LEFT_TOP;
708 : }
709 1422 : bFlag = (SID_ATTR_PARA_LEFT_TO_RIGHT == nSlot &&
710 5688 : FRMDIR_HORI_LEFT_TOP == eFrmDir) ||
711 1422 : (SID_ATTR_PARA_RIGHT_TO_LEFT == nSlot &&
712 2844 : FRMDIR_HORI_RIGHT_TOP == eFrmDir);
713 : }
714 : else
715 : {
716 0 : rSet.InvalidateItem(nSlot);
717 0 : nSlot = 0;
718 : }
719 : }
720 : }
721 2844 : break;
722 :
723 : case SID_ATTR_CHAR_LANGUAGE:
724 : case SID_ATTR_CHAR_KERNING:
725 : case RES_PARATR_DROP:
726 : {
727 : #if OSL_DEBUG_LEVEL > 1
728 : const SfxPoolItem& rItem = aCoreSet.Get(GetPool().GetWhich(nSlot), true);
729 : rSet.Put(rItem);
730 : #else
731 0 : rSet.Put(aCoreSet.Get( GetPool().GetWhich(nSlot), true));
732 : #endif
733 0 : nSlot = 0;
734 : }
735 0 : break;
736 : case SID_ATTR_PARA_MODEL:
737 : {
738 0 : SfxItemSet aTemp(GetPool(),
739 : RES_PAGEDESC,RES_PAGEDESC,
740 : SID_ATTR_PARA_MODEL,SID_ATTR_PARA_MODEL,
741 0 : 0L);
742 0 : aTemp.Put(aCoreSet);
743 0 : ::SwToSfxPageDescAttr(aTemp);
744 0 : rSet.Put(aTemp.Get(SID_ATTR_PARA_MODEL));
745 0 : nSlot = 0;
746 : }
747 0 : break;
748 : case RES_TXTATR_INETFMT:
749 : {
750 0 : SfxItemSet aSet(GetPool(), RES_TXTATR_INETFMT, RES_TXTATR_INETFMT);
751 0 : rSh.GetCurAttr(aSet);
752 0 : const SfxPoolItem& rItem = aSet.Get(RES_TXTATR_INETFMT, true);
753 0 : rSet.Put(rItem);
754 0 : nSlot = 0;
755 : }
756 0 : break;
757 :
758 : default:
759 : // Do nothing
760 4234 : nSlot = 0;
761 4234 : break;
762 :
763 : }
764 16757 : if( nSlot )
765 : {
766 9228 : aFlagItem.SetWhich( nSlot );
767 9228 : aFlagItem.SetValue( bFlag );
768 9228 : rSet.Put( aFlagItem );
769 : }
770 16757 : nSlot = aIter.NextWhich();
771 : }
772 :
773 22538 : rSet.Put(aCoreSet,false);
774 11446 : }
775 :
776 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|