blob: cdb36f68f3d8101692eb03dea9adc87327c42421 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_sw.hxx"
#include <hintids.hxx>
#ifndef _MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif
#include <svl/whiter.hxx>
#include <svl/stritem.hxx>
#include <svl/itemiter.hxx>
#include <svl/ctloptions.hxx>
#include <swmodule.hxx>
#include <sfx2/bindings.hxx>
#include <sfx2/request.hxx>
#include <editeng/fhgtitem.hxx>
#include <editeng/adjitem.hxx>
#include <editeng/lspcitem.hxx>
#include <editeng/lrspitem.hxx>
#include <editeng/udlnitem.hxx>
#include <editeng/escpitem.hxx>
#include <svx/htmlmode.hxx>
#include <editeng/scripttypeitem.hxx>
#include <editeng/frmdiritem.hxx>
#include "paratr.hxx"
#include <fmtinfmt.hxx>
#ifndef _DOCSH_HXX
#include <docsh.hxx>
#endif
#include <wrtsh.hxx>
#ifndef _VIEW_HXX
#include <view.hxx>
#endif
#include <viewopt.hxx>
#include <uitool.hxx>
#ifndef _TEXTSH_HXX
#include <textsh.hxx>
#endif
#include <num.hxx>
#include <swundo.hxx>
#include <fmtcol.hxx>
#ifndef _CMDID_H
#include <cmdid.h>
#endif
#include <globals.h>
#ifndef _SHELLS_HRC
#include <shells.hrc>
#endif
#include <SwStyleNameMapper.hxx>
#include "swabstdlg.hxx"
#include "chrdlg.hrc"
const SwTwips lFontInc = 2 * 20; // ==> PointToTwips(2)
const SwTwips lFontMaxSz = 72 * 20; // ==> PointToTwips(72)
void SwTextShell::ExecCharAttr(SfxRequest &rReq)
{
SwWrtShell &rSh = GetShell();
const SfxItemSet *pArgs = rReq.GetArgs();
int eState = STATE_TOGGLE;
sal_uInt16 nWhich = rReq.GetSlot();
if(pArgs )
{
const SfxPoolItem* pItem;
pArgs->GetItemState(nWhich, sal_False, &pItem);
eState = ((const SfxBoolItem &) pArgs->
Get( nWhich )).GetValue() ? STATE_ON : STATE_OFF;
}
SfxItemSet aSet( GetPool(), RES_CHRATR_BEGIN, RES_CHRATR_END-1 );
if (STATE_TOGGLE == eState)
rSh.GetCurAttr( aSet );
switch ( nWhich )
{
case FN_SET_SUB_SCRIPT:
case FN_SET_SUPER_SCRIPT:
{
SvxEscapement eEscape = SVX_ESCAPEMENT_SUBSCRIPT;
switch (eState)
{
case STATE_TOGGLE:
{
short nTmpEsc = ((const SvxEscapementItem&)
aSet.Get( RES_CHRATR_ESCAPEMENT )).GetEsc();
eEscape = nWhich == FN_SET_SUPER_SCRIPT ?
SVX_ESCAPEMENT_SUPERSCRIPT:
SVX_ESCAPEMENT_SUBSCRIPT;
if( (nWhich == FN_SET_SUB_SCRIPT && nTmpEsc < 0) ||
(nWhich == FN_SET_SUPER_SCRIPT && nTmpEsc > 0) )
eEscape = SVX_ESCAPEMENT_OFF;
SfxBindings& rBind = GetView().GetViewFrame()->GetBindings();
if( nWhich == FN_SET_SUB_SCRIPT )
rBind.SetState( SfxBoolItem( FN_SET_SUPER_SCRIPT,
sal_False ) );
else
rBind.SetState( SfxBoolItem( FN_SET_SUB_SCRIPT,
sal_False ) );
}
break;
case STATE_ON:
eEscape = nWhich == FN_SET_SUPER_SCRIPT ?
SVX_ESCAPEMENT_SUPERSCRIPT:
SVX_ESCAPEMENT_SUBSCRIPT;
break;
case STATE_OFF:
eEscape = SVX_ESCAPEMENT_OFF;
break;
}
SvxEscapementItem aEscape( eEscape, RES_CHRATR_ESCAPEMENT );
if(eEscape == SVX_ESCAPEMENT_SUPERSCRIPT)
aEscape.GetEsc() = DFLT_ESC_AUTO_SUPER;
else if(eEscape == SVX_ESCAPEMENT_SUBSCRIPT)
aEscape.GetEsc() = DFLT_ESC_AUTO_SUB;
if(eState != STATE_OFF )
{
if(eEscape == FN_SET_SUPER_SCRIPT)
aEscape.GetEsc() *= -1;
}
rSh.SetAttrItem( aEscape );
rReq.AppendItem( aEscape );
rReq.Done();
}
break;
case FN_UPDATE_STYLE_BY_EXAMPLE:
rSh.QuickUpdateStyle();
rReq.Done();
break;
case FN_UNDERLINE_DOUBLE:
{
FontUnderline eUnderline = ((const SvxUnderlineItem&)
aSet.Get(RES_CHRATR_UNDERLINE)).GetLineStyle();
switch( eState )
{
case STATE_TOGGLE:
eUnderline = eUnderline == UNDERLINE_DOUBLE ?
UNDERLINE_NONE :
UNDERLINE_DOUBLE;
break;
case STATE_ON:
eUnderline = UNDERLINE_DOUBLE;
break;
case STATE_OFF:
eUnderline = UNDERLINE_NONE;
break;
}
SvxUnderlineItem aUnderline(eUnderline, RES_CHRATR_UNDERLINE );
rSh.SetAttrItem( aUnderline );
rReq.AppendItem( aUnderline );
rReq.Done();
}
break;
case FN_REMOVE_DIRECT_CHAR_FORMATS:
if( !rSh.HasReadonlySel() && rSh.IsEndPara())
rSh.DontExpandFmt();
break;
default:
ASSERT(sal_False, falscher Dispatcher);
return;
}
}
void SwTextShell::ExecCharAttrArgs(SfxRequest &rReq)
{
sal_uInt16 nSlot = rReq.GetSlot();
const SfxItemSet* pArgs = rReq.GetArgs();
sal_Bool bArgs = pArgs != 0 && pArgs->Count() > 0;
int bGrow = sal_False;
SwWrtShell& rWrtSh = GetShell();
SwTxtFmtColl* pColl = 0;
// nur gesetzt, wenn gesamter Absatz selektiert ist und AutoUpdateFmt gesetzt ist
if ( rWrtSh.HasSelection() && rWrtSh.IsSelFullPara() )
{
pColl = rWrtSh.GetCurTxtFmtColl();
if ( pColl && !pColl->IsAutoUpdateFmt() )
pColl = 0;
}
SfxItemPool& rPool = GetPool();
sal_uInt16 nWhich = rPool.GetWhich( nSlot );
switch (nSlot)
{
case FN_TXTATR_INET:
// Sonderbehandlung der PoolId des SwFmtInetFmt
if ( bArgs )
{
const SfxPoolItem& rItem = pArgs->Get( nWhich );
SwFmtINetFmt aINetFmt( (const SwFmtINetFmt&) rItem );
if ( USHRT_MAX == aINetFmt.GetVisitedFmtId() )
{
ASSERT( false, "<SwTextShell::ExecCharAttrArgs(..)> - unexpected visited character format ID at hyperlink attribute" );
aINetFmt.SetVisitedFmtAndId(
aINetFmt.GetVisitedFmt(),
SwStyleNameMapper::GetPoolIdFromUIName( aINetFmt.GetVisitedFmt(), nsSwGetPoolIdFromName::GET_POOLID_CHRFMT ) );
}
if ( USHRT_MAX == aINetFmt.GetINetFmtId() )
{
ASSERT( false, "<SwTextShell::ExecCharAttrArgs(..)> - unexpected unvisited character format ID at hyperlink attribute" );
aINetFmt.SetINetFmtAndId(
aINetFmt.GetINetFmt(),
SwStyleNameMapper::GetPoolIdFromUIName( aINetFmt.GetINetFmt(), nsSwGetPoolIdFromName::GET_POOLID_CHRFMT ) );
}
if ( pColl )
pColl->SetFmtAttr( aINetFmt );
else
rWrtSh.SetAttrItem( aINetFmt );
rReq.Done();
}
break;
case FN_GROW_FONT_SIZE:
bGrow = sal_True;
// kein break !!
case FN_SHRINK_FONT_SIZE:
{
SvxScriptSetItem aSetItem( SID_ATTR_CHAR_FONTHEIGHT, rPool );
rWrtSh.GetCurAttr( aSetItem.GetItemSet() );
SfxItemSet aAttrSet( rPool, aSetItem.GetItemSet().GetRanges() );
const SfxPoolItem* pI;
static const sal_uInt16 aScrTypes[] = {
SCRIPTTYPE_LATIN, SCRIPTTYPE_ASIAN, SCRIPTTYPE_COMPLEX, 0 };
sal_uInt16 nScriptType = rWrtSh.GetScriptType();
for( const sal_uInt16* pScrpTyp = aScrTypes; *pScrpTyp; ++pScrpTyp )
if( ( nScriptType & *pScrpTyp ) &&
0 != ( pI = aSetItem.GetItemOfScript( *pScrpTyp )))
{
SvxFontHeightItem aSize( *(const SvxFontHeightItem*)pI );
SwTwips lSize = (SwTwips) aSize.GetHeight();
if (bGrow)
{
if( lSize == lFontMaxSz )
break; // das wars, hoeher gehts nicht
if( ( lSize += lFontInc ) > lFontMaxSz )
lSize = lFontMaxSz;
}
else
{
if( 4 == lSize )
break;
if( ( lSize -= lFontInc ) < 4 )
lSize = 4;
}
aSize.SetHeight( lSize );
aAttrSet.Put( aSize );
}
if( aAttrSet.Count() )
{
if( pColl )
pColl->SetFmtAttr( aAttrSet );
else
rWrtSh.SetAttrSet( aAttrSet );
}
rReq.Done();
}
break;
default:
ASSERT(sal_False, falscher Dispatcher);
return;
}
}
#ifdef CFRONT
void lcl_SetAdjust(SvxAdjust eAdjst, SfxItemSet& rSet)
{
rSet.Put(SvxAdjustItem(eAdjst,RES_PARATR_ADJUST ));
}
void lcl_SetLineSpace(sal_uInt8 ePropL,SfxItemSet& rSet)
{
SvxLineSpacingItem aLineSpacing(ePropL, RES_PARATR_LINESPACING );
aLineSpacing.GetLineSpaceRule() = SVX_LINE_SPACE_AUTO;
if( 100 == ePropL )
aLineSpacing.GetInterLineSpaceRule() = SVX_INTER_LINE_SPACE_OFF;
else
aLineSpacing.SetPropLineSpace(ePropL);
rSet.Put( aLineSpacing );
}
void SwTextShell::ExecParaAttr(SfxRequest &rReq)
{
// gleiche beide Attribute holen, ist nicht teuerer !!
SfxItemSet aSet( GetPool(), RES_PARATR_LINESPACING, RES_PARATR_ADJUST );
switch (rReq.GetSlot())
{
case FN_SET_LEFT_PARA: lcl_SetAdjust(ADJLEFT,aSet); break;
case FN_SET_RIGHT_PARA: lcl_SetAdjust(ADJRIGHT,aSet); break;
case FN_SET_CENTER_PARA: lcl_SetAdjust(ADJCENTER,aSet); break;
case SID_ATTR_PARA_ADJUST_BLOCK:lcl_SetAdjust(ADJBLOCK,aSet); break;
case FN_SET_LINE_SPACE_1: lcl_SetLineSpace(100,aSet); break;
case FN_SET_LINE_SPACE_15: lcl_SetLineSpace(150,aSet); break;
case FN_SET_LINE_SPACE_2: lcl_SetLineSpace(200,aSet); break;
default:
DBG_ERROR("SwTextShell::ExecParaAttr falscher Dispatcher");
return;
}
SwWrtShell& rWrtSh = GetShell();
SwTxtFmtColl* pColl = rWrtSh.GetCurTxtFmtColl();
if(pColl && pColl->IsAutoUpdateFmt())
{
rWrtSh.AutoUpdatePara(pColl, *pSet);
}
else
{
rWrtSh.SetAttrSet( aSet );
rReq.Done( aSet );
}
}
#else
void SwTextShell::ExecParaAttr(SfxRequest &rReq)
{
SvxAdjust eAdjst;
sal_uInt8 ePropL;
const SfxItemSet* pArgs = rReq.GetArgs();
// gleich beide Attribute holen, ist nicht teuerer !!
SfxItemSet aSet( GetPool(),
RES_PARATR_LINESPACING, RES_PARATR_ADJUST,
RES_FRAMEDIR, RES_FRAMEDIR,
0 );
sal_uInt16 nSlot = rReq.GetSlot();
switch (nSlot)
{
case SID_ATTR_PARA_ADJUST:
{
if( pArgs && SFX_ITEM_SET == pArgs->GetItemState(RES_PARATR_ADJUST) )
{
const SvxAdjustItem& rAdj = (const SvxAdjustItem&) pArgs->Get(RES_PARATR_ADJUST);
SvxAdjustItem aAdj( rAdj.GetAdjust(), RES_PARATR_ADJUST );
if ( rAdj.GetAdjust() == SVX_ADJUST_BLOCK )
{
aAdj.SetLastBlock( rAdj.GetLastBlock() );
aAdj.SetOneWord( rAdj.GetOneWord() );
}
aSet.Put(aAdj);
}
}
break;
case SID_ATTR_PARA_ADJUST_LEFT: eAdjst = SVX_ADJUST_LEFT; goto SET_ADJUST;
case SID_ATTR_PARA_ADJUST_RIGHT: eAdjst = SVX_ADJUST_RIGHT; goto SET_ADJUST;
case SID_ATTR_PARA_ADJUST_CENTER: eAdjst = SVX_ADJUST_CENTER; goto SET_ADJUST;
case SID_ATTR_PARA_ADJUST_BLOCK: eAdjst = SVX_ADJUST_BLOCK; goto SET_ADJUST;
SET_ADJUST:
{
aSet.Put(SvxAdjustItem(eAdjst,RES_PARATR_ADJUST));
rReq.AppendItem( SfxBoolItem( GetPool().GetWhich(nSlot), sal_True ) );
}
break;
case SID_ATTR_PARA_LINESPACE:
if(pArgs && SFX_ITEM_SET == pArgs->GetItemState( GetPool().GetWhich(nSlot) ))
{
SvxLineSpacingItem aLineSpace = (const SvxLineSpacingItem&)pArgs->Get(
GetPool().GetWhich(nSlot));
aSet.Put( aLineSpace );
}
break;
case SID_ATTR_PARA_LINESPACE_10: ePropL = 100; goto SET_LINESPACE;
case SID_ATTR_PARA_LINESPACE_15: ePropL = 150; goto SET_LINESPACE;
case SID_ATTR_PARA_LINESPACE_20: ePropL = 200; goto SET_LINESPACE;
SET_LINESPACE:
{
SvxLineSpacingItem aLineSpacing(ePropL, RES_PARATR_LINESPACING );
aLineSpacing.GetLineSpaceRule() = SVX_LINE_SPACE_AUTO;
if( 100 == ePropL )
aLineSpacing.GetInterLineSpaceRule() = SVX_INTER_LINE_SPACE_OFF;
else
aLineSpacing.SetPropLineSpace(ePropL);
aSet.Put( aLineSpacing );
}
break;
case SID_ATTR_PARA_LEFT_TO_RIGHT :
case SID_ATTR_PARA_RIGHT_TO_LEFT :
{
sal_Bool bSet = sal_True;
int eState = pArgs ? pArgs->GetItemState(nSlot) : SFX_ITEM_DISABLED;
if (pArgs && SFX_ITEM_SET == eState)
bSet = ((const SfxBoolItem&)pArgs->Get(nSlot)).GetValue();
/*
// toggling of the slots not used anymore
if(!bSet)
nSlot = SID_ATTR_PARA_LEFT_TO_RIGHT == nSlot ?
SID_ATTR_PARA_RIGHT_TO_LEFT :
SID_ATTR_PARA_LEFT_TO_RIGHT;
*/
SfxItemSet aAdjustSet( GetPool(),
RES_PARATR_ADJUST, RES_PARATR_ADJUST );
GetShell().GetCurAttr(aAdjustSet);
sal_Bool bChgAdjust = sal_False;
SfxItemState eAdjustState = aAdjustSet.GetItemState(RES_PARATR_ADJUST, sal_False);
if(eAdjustState >= SFX_ITEM_DEFAULT)
{
int eAdjust = (int)(( const SvxAdjustItem& )
aAdjustSet.Get(RES_PARATR_ADJUST)).GetAdjust();
// bChgAdjust = SVX_ADJUST_CENTER != eAdjust && SVX_ADJUST_BLOCK != eAdjust;
bChgAdjust = (SVX_ADJUST_LEFT == eAdjust && SID_ATTR_PARA_RIGHT_TO_LEFT == nSlot) ||
(SVX_ADJUST_RIGHT == eAdjust && SID_ATTR_PARA_LEFT_TO_RIGHT == nSlot);
}
else
bChgAdjust = sal_True;
SvxFrameDirection eFrmDirection =
(SID_ATTR_PARA_LEFT_TO_RIGHT == nSlot) ?
FRMDIR_HORI_LEFT_TOP : FRMDIR_HORI_RIGHT_TOP;
aSet.Put( SvxFrameDirectionItem( eFrmDirection, RES_FRAMEDIR ) );
if (bChgAdjust)
{
SvxAdjust eAdjust = (SID_ATTR_PARA_LEFT_TO_RIGHT == nSlot) ?
SVX_ADJUST_LEFT : SVX_ADJUST_RIGHT;
SvxAdjustItem aAdjust( eAdjust, RES_PARATR_ADJUST );
aSet.Put( aAdjust );
aAdjust.SetWhich(SID_ATTR_PARA_ADJUST);
GetView().GetViewFrame()->GetBindings().SetState( aAdjust );
// Toggle numbering alignment
const SwNumRule* pCurRule = GetShell().GetCurNumRule();
if( pCurRule )
{
SvxNumRule aRule = pCurRule->MakeSvxNumRule();
for(sal_uInt16 i = 0; i < aRule.GetLevelCount(); i++)
{
SvxNumberFormat aFmt(aRule.GetLevel(i));
if(SVX_ADJUST_LEFT == aFmt.GetNumAdjust())
aFmt.SetNumAdjust( SVX_ADJUST_RIGHT );
else if(SVX_ADJUST_RIGHT == aFmt.GetNumAdjust())
aFmt.SetNumAdjust( SVX_ADJUST_LEFT );
aRule.SetLevel(i, aFmt, aRule.Get(i) != 0);
}
// --> OD 2008-02-11 #newlistlevelattrs#
SwNumRule aSetRule( pCurRule->GetName(),
pCurRule->Get( 0 ).GetPositionAndSpaceMode() );
// <--
aSetRule.SetSvxRule( aRule, GetShell().GetDoc());
aSetRule.SetAutoRule( sal_True );
// --> OD 2008-03-17 #refactorlists#
// no start or continuation of a list - list style is only changed
GetShell().SetCurNumRule( aSetRule, false );
// <--
}
}
}
break;
default:
ASSERT(sal_False, falscher Dispatcher);
return;
}
SwWrtShell& rWrtSh = GetShell();
SwTxtFmtColl* pColl = rWrtSh.GetCurTxtFmtColl();
if(pColl && pColl->IsAutoUpdateFmt())
{
rWrtSh.AutoUpdatePara(pColl, aSet);
}
else
rWrtSh.SetAttrSet( aSet );
rReq.Done();
}
#endif
void SwTextShell::ExecParaAttrArgs(SfxRequest &rReq)
{
SwWrtShell &rSh = GetShell();
const SfxItemSet *pArgs = rReq.GetArgs();
const SfxPoolItem *pItem = 0;
sal_uInt16 nSlot = rReq.GetSlot();
if(pArgs)
pArgs->GetItemState(GetPool().GetWhich(nSlot), sal_False, &pItem);
switch ( nSlot )
{
case FN_DROP_CHAR_STYLE_NAME:
if( pItem )
{
String sCharStyleName = ((const SfxStringItem*)pItem)->GetValue();
SfxItemSet aSet(GetPool(), RES_PARATR_DROP, RES_PARATR_DROP, 0L);
rSh.GetCurAttr(aSet);
SwFmtDrop aDropItem((const SwFmtDrop&)aSet.Get(RES_PARATR_DROP));
SwCharFmt* pFmt = 0;
if(sCharStyleName.Len())
pFmt = rSh.FindCharFmtByName( sCharStyleName );
aDropItem.SetCharFmt( pFmt );
aSet.Put(aDropItem);
rSh.SetAttrSet(aSet);
}
break;
case FN_FORMAT_DROPCAPS:
{
if(pItem)
{
rSh.SetAttrItem(*pItem);
rReq.Done();
}
else
{
SfxItemSet aSet(GetPool(), RES_PARATR_DROP, RES_PARATR_DROP,
HINT_END, HINT_END, 0);
rSh.GetCurAttr(aSet);
SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
DBG_ASSERT(pFact, "SwAbstractDialogFactory fail!");
SfxAbstractDialog* pDlg = pFact->CreateSfxDialog( GetView().GetWindow(), aSet,
rSh.GetView().GetViewFrame()->GetFrame().GetFrameInterface(), DLG_SWDROPCAPS );
DBG_ASSERT(pDlg, "Dialogdiet fail!");
if (pDlg->Execute() == RET_OK)
{
rSh.StartAction();
rSh.StartUndo( UNDO_START );
if ( SFX_ITEM_SET == aSet.GetItemState(HINT_END,sal_False,&pItem) )
{
if ( ((SfxStringItem*)pItem)->GetValue().Len() )
rSh.ReplaceDropTxt(((SfxStringItem*)pItem)->GetValue());
}
rSh.SetAttrSet(*pDlg->GetOutputItemSet());
rSh.StartUndo( UNDO_END );
rSh.EndAction();
rReq.Done(*pDlg->GetOutputItemSet());
}
delete pDlg;
}
}
break;
case SID_ATTR_PARA_PAGEBREAK:
if(pItem)
{
rSh.SetAttrItem( *pItem );
rReq.Done();
}
break;
case SID_ATTR_PARA_MODEL:
{
if(pItem)
{
SfxItemSet aCoreSet( GetPool(),
RES_PAGEDESC, RES_PAGEDESC,
SID_ATTR_PARA_MODEL, SID_ATTR_PARA_MODEL, 0);
aCoreSet.Put(*pItem);
SfxToSwPageDescAttr( rSh, aCoreSet);
rSh.SetAttrSet(aCoreSet);
rReq.Done();
}
}
break;
default:
ASSERT(sal_False, falscher Dispatcher);
return;
}
}
void SwTextShell::GetAttrState(SfxItemSet &rSet)
{
SwWrtShell &rSh = GetShell();
SfxItemPool& rPool = GetPool();
SfxItemSet aCoreSet(rPool, aTxtFmtCollSetRange);
rSh.GetCurAttr(aCoreSet); // *alle* Textattribute von der Core erfragen
SfxWhichIter aIter(rSet);
sal_uInt16 nSlot = aIter.FirstWhich();
sal_Bool bFlag = sal_False;
SfxBoolItem aFlagItem;
const SfxPoolItem* pItem = 0;
int eAdjust = -1; // Illegaler Wert, um DONTCARE zu erkennen
SfxItemState eState = aCoreSet.GetItemState(RES_PARATR_ADJUST, sal_False, &pItem);
if( SFX_ITEM_DEFAULT == eState )
pItem = &rPool.GetDefaultItem(RES_PARATR_ADJUST);
if( SFX_ITEM_DEFAULT <= eState )
eAdjust = (int)(( SvxAdjustItem* ) pItem)->GetAdjust();
short nEsc = 0;
eState = aCoreSet.GetItemState(RES_CHRATR_ESCAPEMENT, sal_False, &pItem);
if( SFX_ITEM_DEFAULT == eState )
pItem = &rPool.GetDefaultItem(RES_CHRATR_ESCAPEMENT);
if( eState >= SFX_ITEM_DEFAULT )
nEsc = ((SvxEscapementItem* )pItem)->GetEsc();
sal_uInt16 nLineSpace = 0;
eState = aCoreSet.GetItemState(RES_PARATR_LINESPACING, sal_False, &pItem);
if( SFX_ITEM_DEFAULT == eState )
pItem = &rPool.GetDefaultItem(RES_PARATR_LINESPACING);
if( SFX_ITEM_DEFAULT <= eState &&
((SvxLineSpacingItem* )pItem)->GetLineSpaceRule() == SVX_LINE_SPACE_AUTO )
{
if(SVX_INTER_LINE_SPACE_OFF ==
((SvxLineSpacingItem* )pItem)->GetInterLineSpaceRule())
nLineSpace = 100;
else
nLineSpace = ((SvxLineSpacingItem* )pItem)->GetPropLineSpace();
}
while (nSlot)
{
switch(nSlot)
{
case FN_SET_SUPER_SCRIPT:
bFlag = 0 < nEsc;
break;
case FN_SET_SUB_SCRIPT:
bFlag = 0 > nEsc;
break;
case SID_ATTR_PARA_ADJUST_LEFT:
if (eAdjust == -1)
{
rSet.InvalidateItem( nSlot );
nSlot = 0;
}
else
bFlag = SVX_ADJUST_LEFT == eAdjust;
break;
case SID_ATTR_PARA_ADJUST_RIGHT:
if (eAdjust == -1)
{
rSet.InvalidateItem( nSlot );
nSlot = 0;
}
else
bFlag = SVX_ADJUST_RIGHT == eAdjust;
break;
case SID_ATTR_PARA_ADJUST_CENTER:
if (eAdjust == -1)
{
rSet.InvalidateItem( nSlot );
nSlot = 0;
}
else
bFlag = SVX_ADJUST_CENTER == eAdjust;
break;
case SID_ATTR_PARA_ADJUST_BLOCK:
{
if (eAdjust == -1)
{
rSet.InvalidateItem( nSlot );
nSlot = 0;
}
else
{
bFlag = SVX_ADJUST_BLOCK == eAdjust;
sal_uInt16 nHtmlMode = GetHtmlMode(rSh.GetView().GetDocShell());
if((nHtmlMode & HTMLMODE_ON) && !(nHtmlMode & (HTMLMODE_FULL_STYLES|HTMLMODE_FIRSTLINE) ))
{
rSet.DisableItem( nSlot );
nSlot = 0;
}
}
}
break;
case SID_ATTR_PARA_LINESPACE_10:
bFlag = nLineSpace == 100;
break;
case SID_ATTR_PARA_LINESPACE_15:
bFlag = nLineSpace == 150;
break;
case SID_ATTR_PARA_LINESPACE_20:
bFlag = nLineSpace == 200;
break;
case FN_GROW_FONT_SIZE:
case FN_SHRINK_FONT_SIZE:
{
SvxScriptSetItem aSetItem( SID_ATTR_CHAR_FONTHEIGHT,
*rSet.GetPool() );
aSetItem.GetItemSet().Put( aCoreSet, sal_False );
if( !aSetItem.GetItemOfScript( rSh.GetScriptType() ))
rSet.DisableItem( nSlot );
nSlot = 0;
}
break;
case FN_UNDERLINE_DOUBLE:
{
eState = aCoreSet.GetItemState(RES_CHRATR_UNDERLINE);
if( eState >= SFX_ITEM_DEFAULT )
{
FontUnderline eUnderline = ((const SvxUnderlineItem&)
aCoreSet.Get(RES_CHRATR_UNDERLINE)).GetLineStyle();
rSet.Put(SfxBoolItem(nSlot, eUnderline == UNDERLINE_DOUBLE));
}
else
rSet.InvalidateItem(nSlot);
nSlot = 0;
}
break;
case SID_ATTR_PARA_ADJUST:
if (eAdjust == -1)
rSet.InvalidateItem( nSlot );
else
rSet.Put(SvxAdjustItem((SvxAdjust)eAdjust, SID_ATTR_PARA_ADJUST ));
nSlot = 0;
break;
case SID_ATTR_PARA_LRSPACE:
{
eState = aCoreSet.GetItemState(RES_LR_SPACE);
if( eState >= SFX_ITEM_DEFAULT )
{
SvxLRSpaceItem aLR = ( (const SvxLRSpaceItem&) aCoreSet.Get( RES_LR_SPACE ) );
aLR.SetWhich(SID_ATTR_PARA_LRSPACE);
rSet.Put(aLR);
}
else
rSet.InvalidateItem(nSlot);
nSlot = 0;
}
case SID_ATTR_PARA_LEFT_TO_RIGHT :
case SID_ATTR_PARA_RIGHT_TO_LEFT :
{
if ( !SW_MOD()->GetCTLOptions().IsCTLFontEnabled() )
{
rSet.DisableItem( nSlot );
nSlot = 0;
}
else
{
// is the item set?
sal_uInt16 nHtmlMode = GetHtmlMode(rSh.GetView().GetDocShell());
if((!(nHtmlMode & HTMLMODE_ON) || (0 != (nHtmlMode & HTMLMODE_SOME_STYLES))) &&
aCoreSet.GetItemState( RES_FRAMEDIR, sal_False ) >= SFX_ITEM_DEFAULT)
{
SvxFrameDirection eFrmDir = (SvxFrameDirection)
((const SvxFrameDirectionItem& )aCoreSet.Get(RES_FRAMEDIR)).GetValue();
if (FRMDIR_ENVIRONMENT == eFrmDir)
{
eFrmDir = rSh.IsInRightToLeftText() ?
FRMDIR_HORI_RIGHT_TOP : FRMDIR_HORI_LEFT_TOP;
}
bFlag = (SID_ATTR_PARA_LEFT_TO_RIGHT == nSlot &&
FRMDIR_HORI_LEFT_TOP == eFrmDir) ||
(SID_ATTR_PARA_RIGHT_TO_LEFT == nSlot &&
FRMDIR_HORI_RIGHT_TOP == eFrmDir);
}
else
{
rSet.InvalidateItem(nSlot);
nSlot = 0;
}
}
}
break;
case SID_ATTR_CHAR_LANGUAGE:
case SID_ATTR_CHAR_KERNING:
case RES_PARATR_DROP:
{
#if OSL_DEBUG_LEVEL > 1
const SfxPoolItem& rItem = aCoreSet.Get(GetPool().GetWhich(nSlot), sal_True);
rSet.Put(rItem);
#else
rSet.Put(aCoreSet.Get( GetPool().GetWhich(nSlot), sal_True));
#endif
nSlot = 0;
}
break;
case SID_ATTR_PARA_MODEL:
{
SfxItemSet aTemp(GetPool(),
RES_PAGEDESC,RES_PAGEDESC,
SID_ATTR_PARA_MODEL,SID_ATTR_PARA_MODEL,
0L);
aTemp.Put(aCoreSet);
::SwToSfxPageDescAttr(aTemp);
rSet.Put(aTemp.Get(SID_ATTR_PARA_MODEL));
nSlot = 0;
}
break;
case RES_TXTATR_INETFMT:
{
SfxItemSet aSet(GetPool(), RES_TXTATR_INETFMT, RES_TXTATR_INETFMT);
rSh.GetCurAttr(aSet);
#if OSL_DEBUG_LEVEL > 1
const SfxPoolItem& rItem = aSet.Get(RES_TXTATR_INETFMT, sal_True);
rSet.Put(rItem);
#else
rSet.Put(aSet.Get( RES_TXTATR_INETFMT, sal_True));
#endif
nSlot = 0;
}
break;
default:
// Nichts tun
nSlot = 0;
break;
}
if( nSlot )
{
aFlagItem.SetWhich( nSlot );
aFlagItem.SetValue( bFlag );
rSet.Put( aFlagItem );
}
nSlot = aIter.NextWhich();
}
rSet.Put(aCoreSet,sal_False);
}