LCOV - code coverage report
Current view: top level - sw/source/uibase/shells - txtattr.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 112 402 27.9 %
Date: 2015-06-13 12:38:46 Functions: 3 7 42.9 %
Legend: Lines: hit not hit

          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: */

Generated by: LCOV version 1.11