diff options
Diffstat (limited to 'sw/source/ui/shells/txtattr.cxx')
-rw-r--r-- | sw/source/ui/shells/txtattr.cxx | 847 |
1 files changed, 847 insertions, 0 deletions
diff --git a/sw/source/ui/shells/txtattr.cxx b/sw/source/ui/shells/txtattr.cxx new file mode 100644 index 000000000000..9e89620bed28 --- /dev/null +++ b/sw/source/ui/shells/txtattr.cxx @@ -0,0 +1,847 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 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/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; + USHORT nWhich = rReq.GetSlot(); + + if(pArgs ) + { + const SfxPoolItem* pItem; + pArgs->GetItemState(nWhich, 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, + FALSE ) ); + else + rBind.SetState( SfxBoolItem( FN_SET_SUB_SCRIPT, + 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.SetAttr( 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.SetAttr( aUnderline ); + rReq.AppendItem( aUnderline ); + rReq.Done(); + } + break; + case FN_REMOVE_DIRECT_CHAR_FORMATS: + if( !rSh.HasReadonlySel() && rSh.IsEndPara()) + rSh.DontExpandFmt(); + break; + default: + ASSERT(FALSE, falscher Dispatcher); + return; + } +} + + +void SwTextShell::ExecCharAttrArgs(SfxRequest &rReq) +{ + USHORT nSlot = rReq.GetSlot(); + const SfxItemSet* pArgs = rReq.GetArgs(); + BOOL bArgs = pArgs != 0 && pArgs->Count() > 0; + int bGrow = 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(); + USHORT 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() ) + { + aINetFmt.SetVisitedFmtId( + SwStyleNameMapper::GetPoolIdFromUIName( aINetFmt.GetVisitedFmt(), nsSwGetPoolIdFromName::GET_POOLID_CHRFMT)); + } + if( USHRT_MAX == aINetFmt.GetINetFmtId() ) + { + aINetFmt.SetINetFmtId( + SwStyleNameMapper::GetPoolIdFromUIName( aINetFmt.GetINetFmt(), nsSwGetPoolIdFromName::GET_POOLID_CHRFMT)); + } + + if ( pColl ) + pColl->SetFmtAttr( aINetFmt ); + else rWrtSh.SetAttr( aINetFmt ); + rReq.Done(); + } + break; + + case FN_GROW_FONT_SIZE: + bGrow = 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 USHORT aScrTypes[] = { + SCRIPTTYPE_LATIN, SCRIPTTYPE_ASIAN, SCRIPTTYPE_COMPLEX, 0 }; + USHORT nScriptType = rWrtSh.GetScriptType(); + for( const USHORT* 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.SetAttr( aAttrSet ); + } + rReq.Done(); + } + break; + + default: + ASSERT(FALSE, falscher Dispatcher); + return; + } +} + + + +#ifdef CFRONT + +void lcl_SetAdjust(SvxAdjust eAdjst, SfxItemSet& rSet) +{ + rSet.Put(SvxAdjustItem(eAdjst,RES_PARATR_ADJUST )); +} + + + +void lcl_SetLineSpace(BYTE 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.SetAttr( aSet ); + rReq.Done( aSet ); + } +} + +#else + + + +void SwTextShell::ExecParaAttr(SfxRequest &rReq) +{ + SvxAdjust eAdjst; + BYTE 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 ); + + USHORT 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), 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 : + { + BOOL bSet = 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); + BOOL bChgAdjust = FALSE; + SfxItemState eAdjustState = aAdjustSet.GetItemState(RES_PARATR_ADJUST, 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 = 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(USHORT 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( 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(FALSE, falscher Dispatcher); + return; + } + SwWrtShell& rWrtSh = GetShell(); + SwTxtFmtColl* pColl = rWrtSh.GetCurTxtFmtColl(); + if(pColl && pColl->IsAutoUpdateFmt()) + { + rWrtSh.AutoUpdatePara(pColl, aSet); + } + else + rWrtSh.SetAttr( aSet ); + rReq.Done(); +} + +#endif + + + +void SwTextShell::ExecParaAttrArgs(SfxRequest &rReq) +{ + SwWrtShell &rSh = GetShell(); + const SfxItemSet *pArgs = rReq.GetArgs(); + const SfxPoolItem *pItem = 0; + + USHORT nSlot = rReq.GetSlot(); + if(pArgs) + pArgs->GetItemState(GetPool().GetWhich(nSlot), 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.SetAttr(aSet); + } + break; + case FN_FORMAT_DROPCAPS: + { + if(pItem) + { + rSh.SetAttr(*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,FALSE,&pItem) ) + { + if ( ((SfxStringItem*)pItem)->GetValue().Len() ) + rSh.ReplaceDropTxt(((SfxStringItem*)pItem)->GetValue()); + } + rSh.SetAttr(*pDlg->GetOutputItemSet()); + rSh.StartUndo( UNDO_END ); + rSh.EndAction(); + rReq.Done(*pDlg->GetOutputItemSet()); + } + delete pDlg; + } + } + break; + case SID_ATTR_PARA_PAGEBREAK: + if(pItem) + { + rSh.SetAttr( *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.SetAttr(aCoreSet); + rReq.Done(); + } + } + break; + + default: + ASSERT(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); + USHORT 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, 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, FALSE, &pItem); + if( SFX_ITEM_DEFAULT == eState ) + pItem = &rPool.GetDefaultItem(RES_CHRATR_ESCAPEMENT); + if( eState >= SFX_ITEM_DEFAULT ) + nEsc = ((SvxEscapementItem* )pItem)->GetEsc(); + + USHORT nLineSpace = 0; + eState = aCoreSet.GetItemState(RES_PARATR_LINESPACING, 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; + USHORT 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, 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_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? + USHORT nHtmlMode = GetHtmlMode(rSh.GetView().GetDocShell()); + if((!(nHtmlMode & HTMLMODE_ON) || (0 != (nHtmlMode & HTMLMODE_SOME_STYLES))) && + aCoreSet.GetItemState( RES_FRAMEDIR, 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), TRUE); + rSet.Put(rItem); +#else + rSet.Put(aCoreSet.Get( GetPool().GetWhich(nSlot), 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, TRUE); + rSet.Put(rItem); +#else + rSet.Put(aSet.Get( RES_TXTATR_INETFMT, 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,FALSE); +} + + + |