| /************************************************************** |
| * |
| * 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" |
| |
| #define _SVSTDARR_USHORTS |
| |
| #include <svl/smplhint.hxx> |
| #include <hintids.hxx> |
| #include <svl/itemiter.hxx> |
| #include <svl/eitem.hxx> |
| #include <unotools/syslocale.hxx> |
| #include <editeng/boxitem.hxx> |
| #include <editeng/numitem.hxx> |
| // --> OD 2008-02-13 #newlistlevelattrs# |
| #include <editeng/lrspitem.hxx> |
| // <-- |
| #include <fmtcol.hxx> |
| #include <uitool.hxx> |
| #include <swmodule.hxx> |
| #include <wrtsh.hxx> |
| #include <docsh.hxx> |
| #include <errhdl.hxx> |
| #include <frmfmt.hxx> |
| #include <charfmt.hxx> |
| #include <poolfmt.hxx> |
| #include <pagedesc.hxx> |
| #include <docstyle.hxx> |
| #include <docary.hxx> |
| #include <ccoll.hxx> |
| #include <doc.hxx> |
| #include <IDocumentUndoRedo.hxx> |
| #include <cmdid.h> |
| #include <swstyle.h> |
| #include <app.hrc> |
| #include <paratr.hxx> |
| #include <SwStyleNameMapper.hxx> |
| #include <svl/cjkoptions.hxx> |
| #include <comphelper/processfactory.hxx> |
| #include <unotools/localedatawrapper.hxx> |
| #include <unotools/intlwrapper.hxx> |
| #include <numrule.hxx> |
| #include <fmthdft.hxx> |
| #include <svx/svxids.hrc> |
| // --> OD 2008-02-12 #newlistlevelattrs# |
| #include <SwRewriter.hxx> |
| // <-- |
| |
| // MD 06.02.95: Die Formatnamen in der Liste aller Namen haben als |
| // erstes Zeichen die Familie: |
| |
| #define cCHAR (sal_Unicode)'c' |
| #define cPARA (sal_Unicode)'p' |
| #define cFRAME (sal_Unicode)'f' |
| #define cPAGE (sal_Unicode)'g' |
| #define cNUMRULE (sal_Unicode)'n' |
| |
| // Dieses Zeichen wird bei der Herausgabe der Namen wieder entfernt und |
| // die Familie wird neu generiert. |
| |
| // Ausserdem gibt es jetzt zusaetzlich das Bit bPhysical. Ist dieses Bit |
| // sal_True, werden die Pool-Formatnamen NICHT mit eingetragen. |
| |
| class SwImplShellAction |
| { |
| SwWrtShell* pSh; |
| CurrShell* pCurrSh; |
| public: |
| SwImplShellAction( SwDoc& rDoc ); |
| ~SwImplShellAction(); |
| |
| SwWrtShell* GetSh() { return pSh; } |
| }; |
| |
| SwImplShellAction::SwImplShellAction( SwDoc& rDoc ) |
| : pCurrSh( 0 ) |
| { |
| if( rDoc.GetDocShell() ) |
| pSh = rDoc.GetDocShell()->GetWrtShell(); |
| else |
| pSh = 0; |
| |
| if( pSh ) |
| { |
| pCurrSh = new CurrShell( pSh ); |
| pSh->StartAllAction(); |
| } |
| } |
| |
| SwImplShellAction::~SwImplShellAction() |
| { |
| if( pCurrSh ) |
| { |
| pSh->EndAllAction(); |
| delete pCurrSh; |
| } |
| } |
| |
| /*-------------------------------------------------------------------- |
| Beschreibung: SwCharFormate finden/anlegen |
| evtl. Style fuellen |
| --------------------------------------------------------------------*/ |
| |
| SwCharFmt* lcl_FindCharFmt( SwDoc& rDoc, |
| const String& rName, |
| SwDocStyleSheet* pStyle = 0, |
| sal_Bool bCreate = sal_True ) |
| { |
| SwCharFmt* pFmt = 0; |
| if( rName.Len() ) |
| { |
| pFmt = rDoc.FindCharFmtByName( rName ); |
| if( !pFmt && rName == *SwStyleNameMapper::GetTextUINameArray()[ RES_POOLCOLL_STANDARD - |
| RES_POOLCOLL_TEXT_BEGIN ] ) |
| { |
| // Standard-Zeichenvorlage |
| pFmt = (SwCharFmt*)rDoc.GetDfltCharFmt(); |
| } |
| |
| if( !pFmt && bCreate ) |
| { // Pool abklappern |
| const sal_uInt16 nId = SwStyleNameMapper::GetPoolIdFromUIName(rName, nsSwGetPoolIdFromName::GET_POOLID_CHRFMT); |
| if(nId != USHRT_MAX) |
| pFmt = rDoc.GetCharFmtFromPool(nId); |
| } |
| } |
| if(pStyle) |
| { |
| if(pFmt) |
| { |
| pStyle->SetPhysical(sal_True); |
| SwFmt* p = pFmt->DerivedFrom(); |
| if( p && !p->IsDefault() ) |
| pStyle->PresetParent( p->GetName() ); |
| else |
| pStyle->PresetParent( aEmptyStr ); |
| } |
| else |
| pStyle->SetPhysical(sal_False); |
| } |
| return pFmt; |
| } |
| |
| |
| /*-------------------------------------------------------------------- |
| Beschreibung: ParaFormate finden/erzeugen |
| Style fuellen |
| --------------------------------------------------------------------*/ |
| |
| SwTxtFmtColl* lcl_FindParaFmt( SwDoc& rDoc, |
| const String& rName, |
| SwDocStyleSheet* pStyle = 0, |
| sal_Bool bCreate = sal_True ) |
| { |
| SwTxtFmtColl* pColl = 0; |
| |
| if( rName.Len() ) |
| { |
| pColl = rDoc.FindTxtFmtCollByName( rName ); |
| if( !pColl && bCreate ) |
| { // Pool abklappern |
| const sal_uInt16 nId = SwStyleNameMapper::GetPoolIdFromUIName(rName, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL); |
| if(nId != USHRT_MAX) |
| pColl = rDoc.GetTxtCollFromPool(nId); |
| } |
| } |
| |
| if(pStyle) |
| { |
| if(pColl) |
| { |
| pStyle->SetPhysical(sal_True); |
| if( pColl->DerivedFrom() && !pColl->DerivedFrom()->IsDefault() ) |
| pStyle->PresetParent( pColl->DerivedFrom()->GetName() ); |
| else |
| pStyle->PresetParent( aEmptyStr ); |
| |
| SwTxtFmtColl& rNext = pColl->GetNextTxtFmtColl(); |
| pStyle->PresetFollow(rNext.GetName()); |
| } |
| else |
| pStyle->SetPhysical(sal_False); |
| } |
| return pColl; |
| } |
| |
| |
| /*-------------------------------------------------------------------- |
| Beschreibung: Rahmenformate |
| --------------------------------------------------------------------*/ |
| |
| |
| SwFrmFmt* lcl_FindFrmFmt( SwDoc& rDoc, |
| const String& rName, |
| SwDocStyleSheet* pStyle = 0, |
| sal_Bool bCreate = sal_True ) |
| { |
| SwFrmFmt* pFmt = 0; |
| if( rName.Len() ) |
| { |
| pFmt = rDoc.FindFrmFmtByName( rName ); |
| if( !pFmt && bCreate ) |
| { // Pool abklappern |
| const sal_uInt16 nId = SwStyleNameMapper::GetPoolIdFromUIName(rName, nsSwGetPoolIdFromName::GET_POOLID_FRMFMT); |
| if(nId != USHRT_MAX) |
| pFmt = rDoc.GetFrmFmtFromPool(nId); |
| } |
| } |
| |
| if(pStyle) |
| { |
| if(pFmt) |
| { |
| pStyle->SetPhysical(sal_True); |
| if( pFmt->DerivedFrom() && !pFmt->DerivedFrom()->IsDefault() ) |
| pStyle->PresetParent( pFmt->DerivedFrom()->GetName() ); |
| else |
| pStyle->PresetParent( aEmptyStr ); |
| } |
| else |
| pStyle->SetPhysical(sal_False); |
| } |
| return pFmt; |
| } |
| |
| /*-------------------------------------------------------------------- |
| Beschreibung: Seitendescriptoren |
| --------------------------------------------------------------------*/ |
| |
| |
| const SwPageDesc* lcl_FindPageDesc( SwDoc& rDoc, |
| const String& rName, |
| SwDocStyleSheet* pStyle = 0, |
| sal_Bool bCreate = sal_True ) |
| { |
| const SwPageDesc* pDesc = 0; |
| |
| if( rName.Len() ) |
| { |
| pDesc = rDoc.FindPageDescByName( rName ); |
| if( !pDesc && bCreate ) |
| { |
| sal_uInt16 nId = SwStyleNameMapper::GetPoolIdFromUIName(rName, nsSwGetPoolIdFromName::GET_POOLID_PAGEDESC); |
| if(nId != USHRT_MAX) |
| pDesc = rDoc.GetPageDescFromPool(nId); |
| } |
| } |
| |
| if(pStyle) |
| { |
| if(pDesc) |
| { |
| pStyle->SetPhysical(sal_True); |
| if(pDesc->GetFollow()) |
| pStyle->PresetFollow(pDesc->GetFollow()->GetName()); |
| else |
| pStyle->PresetParent( aEmptyStr ); |
| } |
| else |
| pStyle->SetPhysical(sal_False); |
| } |
| return pDesc; |
| } |
| |
| const SwNumRule* lcl_FindNumRule( SwDoc& rDoc, |
| const String& rName, |
| SwDocStyleSheet* pStyle = 0, |
| sal_Bool bCreate = sal_True ) |
| { |
| const SwNumRule* pRule = 0; |
| |
| if( rName.Len() ) |
| { |
| pRule = rDoc.FindNumRulePtr( rName ); |
| if( !pRule && bCreate ) |
| { |
| sal_uInt16 nId = SwStyleNameMapper::GetPoolIdFromUIName(rName, nsSwGetPoolIdFromName::GET_POOLID_NUMRULE); |
| if(nId != USHRT_MAX) |
| pRule = rDoc.GetNumRuleFromPool(nId); |
| } |
| } |
| |
| if(pStyle) |
| { |
| if(pRule) |
| { |
| pStyle->SetPhysical(sal_True); |
| pStyle->PresetParent( aEmptyStr ); |
| } |
| else |
| pStyle->SetPhysical(sal_False); |
| } |
| return pRule; |
| } |
| |
| |
| sal_uInt16 lcl_FindName( const SwPoolFmtList& rLst, SfxStyleFamily eFam, |
| const String& rName ) |
| { |
| if( rLst.Count() ) |
| { |
| // suchen |
| String sSrch( ' ' ); |
| switch( eFam ) |
| { |
| case SFX_STYLE_FAMILY_CHAR: sSrch = cCHAR; break; |
| case SFX_STYLE_FAMILY_PARA: sSrch = cPARA; break; |
| case SFX_STYLE_FAMILY_FRAME: sSrch = cFRAME; break; |
| case SFX_STYLE_FAMILY_PAGE: sSrch = cPAGE; break; |
| case SFX_STYLE_FAMILY_PSEUDO: sSrch = cNUMRULE; break; |
| default:; //prevent warning |
| } |
| sSrch += rName; |
| for( sal_uInt16 i=0; i < rLst.Count(); ++i ) |
| if( *rLst[i] == sSrch ) |
| return i; |
| } |
| return USHRT_MAX; |
| } |
| |
| sal_Bool FindPhyStyle( SwDoc& rDoc, const String& rName, SfxStyleFamily eFam ) |
| { |
| switch( eFam ) |
| { |
| case SFX_STYLE_FAMILY_CHAR : |
| return 0 != lcl_FindCharFmt( rDoc, rName, 0, sal_False ); |
| case SFX_STYLE_FAMILY_PARA : |
| return 0 != lcl_FindParaFmt( rDoc, rName, 0, sal_False ); |
| case SFX_STYLE_FAMILY_FRAME: |
| return 0 != lcl_FindFrmFmt( rDoc, rName, 0, sal_False ); |
| case SFX_STYLE_FAMILY_PAGE : |
| return 0 != lcl_FindPageDesc( rDoc, rName, 0, sal_False ); |
| case SFX_STYLE_FAMILY_PSEUDO: |
| return 0 != lcl_FindNumRule( rDoc, rName, 0, sal_False ); |
| default:; //prevent warning |
| } |
| return sal_False; |
| } |
| |
| |
| /*-------------------------------------------------------------------- |
| Beschreibung: Einfuegen von Strings in die Liste der Vorlagen |
| --------------------------------------------------------------------*/ |
| |
| |
| void SwPoolFmtList::Append( char cChar, const String& rStr ) |
| { |
| String* pStr = new String( cChar ); |
| *pStr += rStr; |
| for ( sal_uInt16 i=0; i < Count(); ++i ) |
| { |
| if( *operator[](i) == *pStr ) |
| { |
| delete pStr; |
| return; |
| } |
| } |
| Insert( pStr, Count() ); |
| } |
| |
| /*-------------------------------------------------------------------- |
| Beschreibung: Liste kompletti loeschen |
| --------------------------------------------------------------------*/ |
| |
| |
| void SwPoolFmtList::Erase() |
| { |
| DeleteAndDestroy( 0, Count() ); |
| } |
| |
| /* */ |
| |
| /*-------------------------------------------------------------------- |
| Beschreibung: UI-seitige implementierung von StyleSheets |
| greift auf die Core-Engine zu |
| --------------------------------------------------------------------*/ |
| |
| SwDocStyleSheet::SwDocStyleSheet( SwDoc& rDocument, |
| const String& rName, |
| SwDocStyleSheetPool& _rPool, |
| SfxStyleFamily eFam, |
| sal_uInt16 _nMask) : |
| |
| SfxStyleSheetBase( rName, _rPool, eFam, _nMask ), |
| pCharFmt(0), |
| pColl(0), |
| pFrmFmt(0), |
| pDesc(0), |
| pNumRule(0), |
| |
| rDoc(rDocument), |
| aCoreSet(GetPool().GetPool(), |
| RES_CHRATR_BEGIN, RES_CHRATR_END - 1, |
| RES_PARATR_BEGIN, RES_PARATR_END - 1, |
| // --> OD 2008-02-25 #refactorlists# |
| RES_PARATR_LIST_BEGIN, RES_PARATR_LIST_END - 1, |
| // <-- |
| RES_FRMATR_BEGIN, RES_FRMATR_END - 1, |
| RES_UNKNOWNATR_BEGIN, RES_UNKNOWNATR_END-1, |
| SID_ATTR_PAGE, SID_ATTR_PAGE_EXT1, |
| SID_ATTR_PAGE_HEADERSET,SID_ATTR_PAGE_FOOTERSET, |
| SID_ATTR_BORDER_INNER, SID_ATTR_BORDER_INNER, |
| FN_PARAM_FTN_INFO, FN_PARAM_FTN_INFO, |
| SID_ATTR_PARA_MODEL, SID_ATTR_PARA_MODEL, |
| SID_ATTR_PARA_PAGENUM, SID_ATTR_PARA_PAGENUM, |
| SID_SWREGISTER_MODE, SID_SWREGISTER_MODE, |
| SID_SWREGISTER_COLLECTION, SID_SWREGISTER_COLLECTION, |
| FN_COND_COLL, FN_COND_COLL, |
| SID_ATTR_AUTO_STYLE_UPDATE, SID_ATTR_AUTO_STYLE_UPDATE, |
| SID_ATTR_NUMBERING_RULE, SID_ATTR_NUMBERING_RULE, |
| SID_PARA_BACKGRND_DESTINATION, SID_ATTR_BRUSH_CHAR, |
| SID_ATTR_NUMBERING_RULE, SID_ATTR_NUMBERING_RULE, |
| 0), |
| bPhysical(sal_False) |
| { |
| nHelpId = UCHAR_MAX; |
| } |
| |
| |
| SwDocStyleSheet::SwDocStyleSheet( const SwDocStyleSheet& rOrg) : |
| SfxStyleSheetBase(rOrg), |
| pCharFmt(rOrg.pCharFmt), |
| pColl(rOrg.pColl), |
| pFrmFmt(rOrg.pFrmFmt), |
| pDesc(rOrg.pDesc), |
| pNumRule(rOrg.pNumRule), |
| rDoc(rOrg.rDoc), |
| aCoreSet(rOrg.aCoreSet), |
| bPhysical(rOrg.bPhysical) |
| { |
| } |
| |
| |
| SwDocStyleSheet::~SwDocStyleSheet() |
| { |
| } |
| |
| /*-------------------------------------------------------------------- |
| Beschreibung: Zuruecksetzen |
| --------------------------------------------------------------------*/ |
| |
| |
| void SwDocStyleSheet::Reset() |
| { |
| aName.Erase(); |
| aFollow.Erase(); |
| aParent.Erase(); |
| SetPhysical(sal_False); |
| } |
| |
| /*-------------------------------------------------------------------- |
| Beschreibung: virtuelle Methoden |
| --------------------------------------------------------------------*/ |
| |
| |
| const String& SwDocStyleSheet::GetParent() const |
| { |
| if( !bPhysical ) |
| { |
| // dann pruefe, ob schon im Doc vorhanden |
| SwFmt* pFmt = 0; |
| SwGetPoolIdFromName eGetType; |
| switch(nFamily) |
| { |
| case SFX_STYLE_FAMILY_CHAR: |
| pFmt = rDoc.FindCharFmtByName( aName ); |
| eGetType = nsSwGetPoolIdFromName::GET_POOLID_CHRFMT; |
| break; |
| |
| case SFX_STYLE_FAMILY_PARA: |
| pFmt = rDoc.FindTxtFmtCollByName( aName ); |
| eGetType = nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL; |
| break; |
| |
| case SFX_STYLE_FAMILY_FRAME: |
| pFmt = rDoc.FindFrmFmtByName( aName ); |
| eGetType = nsSwGetPoolIdFromName::GET_POOLID_FRMFMT; |
| break; |
| |
| case SFX_STYLE_FAMILY_PAGE: |
| case SFX_STYLE_FAMILY_PSEUDO: |
| default: |
| return aEmptyStr; // es gibt keinen Parent |
| } |
| |
| String sTmp; |
| if( !pFmt ) // noch nicht vorhanden, also dflt. Parent |
| { |
| sal_uInt16 i = SwStyleNameMapper::GetPoolIdFromUIName( aName, eGetType ); |
| i = ::GetPoolParent( i ); |
| if( i && USHRT_MAX != i ) |
| SwStyleNameMapper::FillUIName( i, sTmp ); |
| } |
| else |
| { |
| SwFmt* p = pFmt->DerivedFrom(); |
| if( p && !p->IsDefault() ) |
| sTmp = p->GetName(); |
| } |
| SwDocStyleSheet* pThis = (SwDocStyleSheet*)this; |
| pThis->aParent = sTmp; |
| } |
| return aParent; |
| } |
| |
| /*-------------------------------------------------------------------- |
| Beschreibung: Nachfolger |
| --------------------------------------------------------------------*/ |
| |
| |
| const String& SwDocStyleSheet::GetFollow() const |
| { |
| if( !bPhysical ) |
| { |
| SwDocStyleSheet* pThis = (SwDocStyleSheet*)this; |
| pThis->FillStyleSheet( FillAllInfo ); |
| } |
| return aFollow; |
| } |
| |
| /*-------------------------------------------------------------------- |
| Beschreibung: Welche Verkettung ist moeglich |
| --------------------------------------------------------------------*/ |
| |
| |
| sal_Bool SwDocStyleSheet::HasFollowSupport() const |
| { |
| switch(nFamily) |
| { |
| case SFX_STYLE_FAMILY_PARA : |
| case SFX_STYLE_FAMILY_PAGE : return sal_True; |
| case SFX_STYLE_FAMILY_FRAME: |
| case SFX_STYLE_FAMILY_CHAR : |
| case SFX_STYLE_FAMILY_PSEUDO: return sal_False; |
| default: |
| ASSERT(!this, "unbekannte Style-Familie"); |
| } |
| return sal_False; |
| } |
| |
| /*-------------------------------------------------------------------- |
| Beschreibung: Parent ? |
| --------------------------------------------------------------------*/ |
| |
| |
| sal_Bool SwDocStyleSheet::HasParentSupport() const |
| { |
| sal_Bool bRet = sal_False; |
| switch(nFamily) |
| { |
| case SFX_STYLE_FAMILY_CHAR : |
| case SFX_STYLE_FAMILY_PARA : |
| case SFX_STYLE_FAMILY_FRAME: bRet = sal_True; |
| default:; //prevent warning |
| } |
| return bRet; |
| } |
| |
| |
| sal_Bool SwDocStyleSheet::HasClearParentSupport() const |
| { |
| sal_Bool bRet = sal_False; |
| switch(nFamily) |
| { |
| case SFX_STYLE_FAMILY_PARA : |
| case SFX_STYLE_FAMILY_CHAR : |
| case SFX_STYLE_FAMILY_FRAME: bRet = sal_True; |
| default:; //prevent warning |
| } |
| return bRet; |
| } |
| |
| /*-------------------------------------------------------------------- |
| Beschreibung: textuelle Beschreibung ermitteln |
| --------------------------------------------------------------------*/ |
| String SwDocStyleSheet::GetDescription(SfxMapUnit eUnit) |
| { |
| IntlWrapper aIntlWrapper( |
| ::comphelper::getProcessServiceFactory(), |
| SvtSysLocale().GetLocaleData().getLocale()); |
| |
| String sPlus(String::CreateFromAscii(" + ")); |
| if ( SFX_STYLE_FAMILY_PAGE == nFamily ) |
| { |
| if( !pSet ) |
| GetItemSet(); |
| |
| SfxItemIter aIter( *pSet ); |
| String aDesc; |
| const SfxPoolItem* pItem = aIter.FirstItem(); |
| |
| while ( pItem ) |
| { |
| if(!IsInvalidItem(pItem)) |
| switch ( pItem->Which() ) |
| { |
| case RES_LR_SPACE: |
| case SID_ATTR_PAGE_SIZE: |
| case SID_ATTR_PAGE_MAXSIZE: |
| case SID_ATTR_PAGE_PAPERBIN: |
| case SID_ATTR_PAGE_APP: |
| case SID_ATTR_BORDER_INNER: |
| break; |
| default: |
| { |
| String aItemPresentation; |
| if ( !IsInvalidItem( pItem ) && |
| rPool.GetPool().GetPresentation( |
| *pItem, SFX_ITEM_PRESENTATION_COMPLETE, |
| eUnit, aItemPresentation, &aIntlWrapper ) ) |
| { |
| if ( aDesc.Len() && aItemPresentation.Len() ) |
| aDesc += sPlus; |
| aDesc += aItemPresentation; |
| } |
| } |
| } |
| pItem = aIter.NextItem(); |
| } |
| return aDesc; |
| } |
| else if ( SFX_STYLE_FAMILY_FRAME == nFamily || |
| SFX_STYLE_FAMILY_PARA == nFamily) |
| { |
| if( !pSet ) |
| GetItemSet(); |
| |
| SfxItemIter aIter( *pSet ); |
| String aDesc; |
| const SfxPoolItem* pItem = aIter.FirstItem(); |
| |
| String sPageNum, sModel, sBreak; |
| sal_Bool bHasWesternFontPrefix = sal_False; |
| sal_Bool bHasCJKFontPrefix = sal_False; |
| SvtCJKOptions aCJKOptions; |
| |
| while ( pItem ) |
| { |
| if(!IsInvalidItem(pItem)) |
| switch ( pItem->Which() ) |
| { |
| case SID_ATTR_AUTO_STYLE_UPDATE: |
| case SID_PARA_BACKGRND_DESTINATION: |
| case RES_PAGEDESC: |
| //CTL no yet supported |
| case RES_CHRATR_CTL_FONT: |
| case RES_CHRATR_CTL_FONTSIZE: |
| case RES_CHRATR_CTL_LANGUAGE: |
| case RES_CHRATR_CTL_POSTURE: |
| case RES_CHRATR_CTL_WEIGHT: |
| break; |
| default: |
| { |
| String aItemPresentation; |
| if ( !IsInvalidItem( pItem ) && |
| rPool.GetPool().GetPresentation( |
| *pItem, SFX_ITEM_PRESENTATION_COMPLETE, |
| eUnit, aItemPresentation, &aIntlWrapper ) ) |
| { |
| sal_Bool bIsDefault = sal_False; |
| switch ( pItem->Which() ) |
| { |
| case SID_ATTR_PARA_PAGENUM: |
| sPageNum = aItemPresentation; |
| break; |
| case SID_ATTR_PARA_MODEL: |
| sModel = aItemPresentation; |
| break; |
| case RES_BREAK: |
| sBreak = aItemPresentation; |
| break; |
| case RES_CHRATR_CJK_FONT: |
| case RES_CHRATR_CJK_FONTSIZE: |
| case RES_CHRATR_CJK_LANGUAGE: |
| case RES_CHRATR_CJK_POSTURE: |
| case RES_CHRATR_CJK_WEIGHT: |
| if(aCJKOptions.IsCJKFontEnabled()) |
| bIsDefault = sal_True; |
| if(!bHasCJKFontPrefix) |
| { |
| aItemPresentation.Insert(SW_RESSTR(STR_CJK_FONT), 0); |
| bHasCJKFontPrefix = sal_True; |
| } |
| break; |
| case RES_CHRATR_FONT: |
| case RES_CHRATR_FONTSIZE: |
| case RES_CHRATR_LANGUAGE: |
| case RES_CHRATR_POSTURE: |
| case RES_CHRATR_WEIGHT: |
| if(!bHasWesternFontPrefix) |
| { |
| aItemPresentation.Insert(SW_RESSTR(STR_WESTERN_FONT), 0); |
| bHasWesternFontPrefix = sal_True; |
| bIsDefault = sal_True; |
| } |
| // no break; |
| default: |
| bIsDefault = sal_True; |
| } |
| if(bIsDefault) |
| { |
| if ( aDesc.Len() && aItemPresentation.Len() ) |
| aDesc += sPlus; |
| aDesc += aItemPresentation; |
| } |
| } |
| } |
| } |
| pItem = aIter.NextItem(); |
| } |
| //Sonderbehandlung fuer Umburch, Seitenvorlage und Seitenoffset |
| if(sBreak.Len() && !sModel.Len()) // wemm Model. dann ist Break ungueltig |
| { |
| if(aDesc.Len()) |
| aDesc += sPlus; |
| aDesc += sBreak; |
| } |
| if(sModel.Len()) |
| { |
| if(aDesc.Len()) |
| aDesc += sPlus; |
| aDesc += SW_RESSTR(STR_PAGEBREAK); |
| aDesc += sPlus; |
| aDesc += sModel; |
| if(sPageNum != String(UniString::CreateFromInt32(0))) |
| { |
| aDesc += sPlus; |
| aDesc += SW_RESSTR(STR_PAGEOFFSET); |
| aDesc += sPageNum; |
| } |
| } |
| return aDesc; |
| } |
| else if( SFX_STYLE_FAMILY_PSEUDO == nFamily ) |
| { |
| // if( pNumRule ) |
| // return pNumRule->GetName(); |
| //os: was sollte man bei Numerierungen schon anzeigen? |
| return aEmptyStr; |
| } |
| |
| return SfxStyleSheetBase::GetDescription(eUnit); |
| } |
| |
| |
| String SwDocStyleSheet::GetDescription() |
| { |
| return GetDescription(SFX_MAPUNIT_CM); |
| } |
| |
| /*-------------------------------------------------------------------- |
| Beschreibung: Namen setzen |
| --------------------------------------------------------------------*/ |
| |
| |
| sal_Bool SwDocStyleSheet::SetName( const String& rStr) |
| { |
| if( !rStr.Len() ) |
| return sal_False; |
| |
| if( aName != rStr ) |
| { |
| if( !SfxStyleSheetBase::SetName( rStr )) |
| return sal_False; |
| } |
| else if(!bPhysical) |
| FillStyleSheet( FillPhysical ); |
| |
| int bChg = sal_False; |
| switch(nFamily) |
| { |
| case SFX_STYLE_FAMILY_CHAR : |
| { |
| ASSERT(pCharFmt, "SwCharFormat fehlt!"); |
| if( pCharFmt && pCharFmt->GetName() != rStr ) |
| { |
| pCharFmt->SetName( rStr ); |
| bChg = sal_True; |
| } |
| break; |
| } |
| case SFX_STYLE_FAMILY_PARA : |
| { |
| ASSERT(pColl, "Collektion fehlt!"); |
| if( pColl && pColl->GetName() != rStr ) |
| { |
| if (pColl->GetName().Len() > 0) |
| rDoc.RenameFmt(*pColl, rStr); |
| else |
| pColl->SetName(rStr); |
| |
| bChg = sal_True; |
| } |
| break; |
| } |
| case SFX_STYLE_FAMILY_FRAME: |
| { |
| ASSERT(pFrmFmt, "FrmFmt fehlt!"); |
| if( pFrmFmt && pFrmFmt->GetName() != rStr ) |
| { |
| if (pFrmFmt->GetName().Len() > 0) |
| rDoc.RenameFmt(*pFrmFmt, rStr); |
| else |
| pFrmFmt->SetName( rStr ); |
| |
| bChg = sal_True; |
| } |
| break; |
| } |
| case SFX_STYLE_FAMILY_PAGE : |
| ASSERT(pDesc, "PageDesc fehlt!"); |
| if( pDesc && pDesc->GetName() != rStr ) |
| { |
| //PageDesc setzen - mit vorherigem kopieren - ist fuer das |
| //setzen des Namens wohl nicht notwendig. Deshalb erlauben |
| //wir hier mal einen cast. |
| // -> #116530# |
| SwPageDesc aPageDesc(*((SwPageDesc*)pDesc)); |
| String aOldName(aPageDesc.GetName()); |
| |
| aPageDesc.SetName( rStr ); |
| bool const bDoesUndo = rDoc.GetIDocumentUndoRedo().DoesUndo(); |
| |
| rDoc.GetIDocumentUndoRedo().DoUndo(aOldName.Len() > 0); |
| rDoc.ChgPageDesc(aOldName, aPageDesc); |
| rDoc.GetIDocumentUndoRedo().DoUndo(bDoesUndo); |
| // <- #116530# |
| |
| rDoc.SetModified(); |
| bChg = sal_True; |
| } |
| break; |
| case SFX_STYLE_FAMILY_PSEUDO: |
| ASSERT(pNumRule, "NumRule fehlt!"); |
| |
| // -> #106897# |
| if (pNumRule) |
| { |
| String aOldName = pNumRule->GetName(); |
| |
| if (aOldName.Len() > 0) |
| { |
| if ( aOldName != rStr && |
| rDoc.RenameNumRule(aOldName, rStr)) |
| { |
| pNumRule = rDoc.FindNumRulePtr(rStr); |
| rDoc.SetModified(); |
| |
| bChg = sal_True; |
| } |
| } |
| else |
| { |
| // --> OD 2008-07-08 #i91400# |
| ((SwNumRule*)pNumRule)->SetName( rStr, rDoc ); |
| // <-- |
| rDoc.SetModified(); |
| |
| bChg = sal_True; |
| } |
| } |
| // <- #106897# |
| |
| break; |
| |
| default: |
| ASSERT(!this, "unbekannte Style-Familie"); |
| } |
| |
| if( bChg ) |
| { |
| rPool.First(); // interne Liste muss geupdatet werden |
| rPool.Broadcast( SfxStyleSheetHint( SFX_STYLESHEET_MODIFIED, *this ) ); |
| SwEditShell* pSh = rDoc.GetEditShell(); |
| if( pSh ) |
| pSh->CallChgLnk(); |
| } |
| return sal_True; |
| } |
| |
| /*-------------------------------------------------------------------- |
| Beschreibung: Ableitungshirachie |
| --------------------------------------------------------------------*/ |
| |
| |
| sal_Bool SwDocStyleSheet::SetParent( const String& rStr) |
| { |
| SwFmt* pFmt = 0, *pParent = 0; |
| switch(nFamily) |
| { |
| case SFX_STYLE_FAMILY_CHAR : |
| ASSERT( pCharFmt, "SwCharFormat fehlt!" ) |
| if( 0 != ( pFmt = pCharFmt ) && rStr.Len() ) |
| pParent = lcl_FindCharFmt(rDoc, rStr); |
| break; |
| |
| case SFX_STYLE_FAMILY_PARA : |
| ASSERT( pColl, "Collektion fehlt!") |
| if( 0 != ( pFmt = pColl ) && rStr.Len() ) |
| pParent = lcl_FindParaFmt( rDoc, rStr ); |
| break; |
| |
| case SFX_STYLE_FAMILY_FRAME: |
| ASSERT(pFrmFmt, "FrameFormat fehlt!"); |
| if( 0 != ( pFmt = pFrmFmt ) && rStr.Len() ) |
| pParent = lcl_FindFrmFmt( rDoc, rStr ); |
| break; |
| |
| case SFX_STYLE_FAMILY_PAGE: |
| case SFX_STYLE_FAMILY_PSEUDO: |
| break; |
| default: |
| ASSERT(!this, "unbekannte Style-Familie"); |
| } |
| |
| sal_Bool bRet = sal_False; |
| if( pFmt && pFmt->DerivedFrom() && |
| pFmt->DerivedFrom()->GetName() != rStr ) |
| { |
| { |
| SwImplShellAction aTmp( rDoc ); |
| bRet = pFmt->SetDerivedFrom( pParent ); |
| } |
| |
| if( bRet ) |
| { |
| aParent = rStr; |
| rPool.Broadcast( SfxStyleSheetHint( SFX_STYLESHEET_MODIFIED, |
| *this ) ); |
| } |
| } |
| |
| return bRet; |
| } |
| |
| /*-------------------------------------------------------------------- |
| Beschreibung: Nachfolger detzen |
| --------------------------------------------------------------------*/ |
| |
| |
| sal_Bool SwDocStyleSheet::SetFollow( const String& rStr) |
| { |
| if( rStr.Len() && !SfxStyleSheetBase::SetFollow( rStr )) |
| return sal_False; |
| |
| SwImplShellAction aTmpSh( rDoc ); |
| switch(nFamily) |
| { |
| case SFX_STYLE_FAMILY_PARA : |
| { |
| ASSERT(pColl, "Collection fehlt!"); |
| if( pColl ) |
| { |
| SwTxtFmtColl* pFollow = pColl; |
| if( rStr.Len() && 0 == (pFollow = lcl_FindParaFmt(rDoc, rStr) )) |
| pFollow = pColl; |
| |
| pColl->SetNextTxtFmtColl(*pFollow); |
| } |
| break; |
| } |
| case SFX_STYLE_FAMILY_PAGE : |
| { |
| ASSERT(pDesc, "PageDesc fehlt!"); |
| if( pDesc ) |
| { |
| const SwPageDesc* pFollowDesc = rStr.Len() |
| ? lcl_FindPageDesc(rDoc, rStr) |
| : 0; |
| sal_uInt16 nId; |
| if( pFollowDesc != pDesc->GetFollow() && |
| rDoc.FindPageDescByName( pDesc->GetName(), &nId ) ) |
| { |
| SwPageDesc aDesc( *pDesc ); |
| aDesc.SetFollow( pFollowDesc ); |
| rDoc.ChgPageDesc( nId, aDesc ); |
| pDesc = &const_cast<const SwDoc &>(rDoc).GetPageDesc( nId ); |
| } |
| } |
| break; |
| } |
| case SFX_STYLE_FAMILY_CHAR: |
| case SFX_STYLE_FAMILY_FRAME: |
| case SFX_STYLE_FAMILY_PSEUDO: |
| break; |
| default: |
| ASSERT(!this, "unbekannte Style-Familie"); |
| } |
| |
| return sal_True; |
| } |
| |
| /*-------------------------------------------------------------------- |
| Beschreibung: ueber Name und Family, Mask den ItemSet rausholen |
| --------------------------------------------------------------------*/ |
| |
| SfxItemSet& SwDocStyleSheet::GetItemSet() |
| { |
| if(!bPhysical) |
| FillStyleSheet( FillPhysical ); |
| |
| switch(nFamily) |
| { |
| case SFX_STYLE_FAMILY_CHAR: |
| { |
| ASSERT(pCharFmt, "Wo ist das SwCharFmt"); |
| aCoreSet.Put(pCharFmt->GetAttrSet()); |
| if(pCharFmt->DerivedFrom()) |
| aCoreSet.SetParent(&pCharFmt->DerivedFrom()->GetAttrSet()); |
| } |
| break; |
| case SFX_STYLE_FAMILY_PARA : |
| case SFX_STYLE_FAMILY_FRAME: |
| { |
| SvxBoxInfoItem aBoxInfo( SID_ATTR_BORDER_INNER ); |
| aBoxInfo.SetTable( sal_False ); |
| aBoxInfo.SetDist( sal_True); // Abstandsfeld immer anzeigen |
| aBoxInfo.SetMinDist( sal_True );// Minimalgroesse in Tabellen und Absaetzen setzen |
| aBoxInfo.SetDefDist( MIN_BORDER_DIST );// Default-Abstand immer setzen |
| // Einzelne Linien koennen nur in Tabellen DontCare-Status haben |
| aBoxInfo.SetValid( VALID_DISABLE, sal_True ); |
| if ( nFamily == SFX_STYLE_FAMILY_PARA ) |
| { |
| ASSERT(pColl, "Wo ist die Collektion"); |
| aCoreSet.Put(pColl->GetAttrSet()); |
| aCoreSet.Put( aBoxInfo ); |
| aCoreSet.Put(SfxBoolItem(SID_ATTR_AUTO_STYLE_UPDATE, pColl->IsAutoUpdateFmt())); |
| if(pColl->DerivedFrom()) |
| aCoreSet.SetParent(&pColl->DerivedFrom()->GetAttrSet()); |
| } |
| else |
| { |
| ASSERT(pFrmFmt, "Wo ist das FrmFmt"); |
| aCoreSet.Put(pFrmFmt->GetAttrSet()); |
| aCoreSet.Put( aBoxInfo ); |
| aCoreSet.Put(SfxBoolItem(SID_ATTR_AUTO_STYLE_UPDATE, pFrmFmt->IsAutoUpdateFmt())); |
| if(pFrmFmt->DerivedFrom()) |
| aCoreSet.SetParent(&pFrmFmt->DerivedFrom()->GetAttrSet()); |
| } |
| } |
| break; |
| |
| case SFX_STYLE_FAMILY_PAGE : |
| { |
| ASSERT(pDesc, "Kein PageDescriptor"); |
| ::PageDescToItemSet(*((SwPageDesc*)pDesc), aCoreSet); |
| } |
| break; |
| |
| case SFX_STYLE_FAMILY_PSEUDO: |
| { |
| ASSERT(pNumRule, "Keine NumRule"); |
| SvxNumRule aRule = pNumRule->MakeSvxNumRule(); |
| aCoreSet.Put(SvxNumBulletItem(aRule)); |
| } |
| break; |
| |
| default: |
| ASSERT(!this, "unbekannte Style-Familie"); |
| } |
| // Member der Basisklasse |
| pSet = &aCoreSet; |
| |
| return aCoreSet; |
| } |
| |
| // --> OD 2008-02-13 #newlistlevelattrs# |
| void SwDocStyleSheet::MergeIndentAttrsOfListStyle( SfxItemSet& rSet ) |
| { |
| if ( nFamily != SFX_STYLE_FAMILY_PARA ) |
| { |
| return; |
| } |
| |
| ASSERT( pColl, "<SwDocStyleSheet::MergeIndentAttrsOfListStyle(..)> - missing paragraph style"); |
| if ( pColl->AreListLevelIndentsApplicable() ) |
| { |
| ASSERT( pColl->GetItemState( RES_PARATR_NUMRULE ) == SFX_ITEM_SET, |
| "<SwDocStyleSheet::MergeIndentAttrsOfListStyle(..)> - list level indents are applicable at paragraph style, but no list style found. Serious defect -> please inform OD." ); |
| const String sNumRule = pColl->GetNumRule().GetValue(); |
| if( sNumRule.Len() ) |
| { |
| const SwNumRule* pRule = rDoc.FindNumRulePtr( sNumRule ); |
| if( pRule ) |
| { |
| const SwNumFmt& rFmt = pRule->Get( 0 ); |
| if ( rFmt.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_ALIGNMENT ) |
| { |
| SvxLRSpaceItem aLR( RES_LR_SPACE ); |
| aLR.SetTxtLeft( rFmt.GetIndentAt() ); |
| aLR.SetTxtFirstLineOfst( static_cast<short>(rFmt.GetFirstLineIndent()) ); |
| rSet.Put( aLR ); |
| } |
| } |
| } |
| } |
| } |
| // <-- |
| |
| /*-------------------------------------------------------------------- |
| Beschreibung: ItemSet setzen |
| --------------------------------------------------------------------*/ |
| |
| // --> OD 2008-02-12 #newlistlevelattrs# |
| // handling of parameter <bResetIndentAttrsAtParagraphStyle> |
| void SwDocStyleSheet::SetItemSet( const SfxItemSet& rSet, |
| const bool bResetIndentAttrsAtParagraphStyle ) |
| { |
| // gegebenenfalls Format erst ermitteln |
| if(!bPhysical) |
| FillStyleSheet( FillPhysical ); |
| |
| SwImplShellAction aTmpSh( rDoc ); |
| |
| ASSERT( &rSet != &aCoreSet, "SetItemSet mit eigenem Set ist nicht erlaubt" ); |
| |
| // --> OD 2008-02-12 #newlistlevelattrs# |
| if (rDoc.GetIDocumentUndoRedo().DoesUndo()) |
| { |
| SwRewriter aRewriter; |
| aRewriter.AddRule( UNDO_ARG1, GetName() ); |
| rDoc.GetIDocumentUndoRedo().StartUndo( UNDO_INSFMTATTR, &aRewriter ); |
| } |
| // <-- |
| |
| SwFmt* pFmt = 0; |
| SwPageDesc* pNewDsc = 0; |
| sal_uInt16 nPgDscPos = 0; |
| |
| switch(nFamily) |
| { |
| case SFX_STYLE_FAMILY_CHAR : |
| { |
| ASSERT(pCharFmt, "Wo ist das CharFormat"); |
| pFmt = pCharFmt; |
| } |
| break; |
| |
| case SFX_STYLE_FAMILY_PARA : |
| { |
| ASSERT(pColl, "Wo ist die Collection"); |
| const SfxPoolItem* pAutoUpdate; |
| if(SFX_ITEM_SET == rSet.GetItemState(SID_ATTR_AUTO_STYLE_UPDATE,sal_False, &pAutoUpdate )) |
| { |
| pColl->SetAutoUpdateFmt(((const SfxBoolItem*)pAutoUpdate)->GetValue()); |
| } |
| |
| const SwCondCollItem* pCondItem; |
| if( SFX_ITEM_SET != rSet.GetItemState( FN_COND_COLL, sal_False, |
| (const SfxPoolItem**)&pCondItem )) |
| pCondItem = 0; |
| |
| if( RES_CONDTXTFMTCOLL == pColl->Which() && pCondItem ) |
| { |
| SwFmt* pFindFmt; |
| const CommandStruct* pCmds = SwCondCollItem::GetCmds(); |
| for(sal_uInt16 i = 0; i < COND_COMMAND_COUNT; i++) |
| { |
| SwCollCondition aCond( 0, pCmds[ i ].nCnd, pCmds[ i ].nSubCond ); |
| ((SwConditionTxtFmtColl*)pColl)->RemoveCondition( aCond ); |
| const String& rStyle = pCondItem->GetStyle( i ); |
| if( rStyle.Len() && |
| 0 != ( pFindFmt = lcl_FindParaFmt( rDoc, rStyle, 0, sal_True ))) |
| { |
| aCond.RegisterToFormat( *pFindFmt ); |
| ((SwConditionTxtFmtColl*)pColl)->InsertCondition( aCond ); |
| } |
| } |
| |
| // Document auf die neue Bedingungen updaten |
| SwCondCollCondChg aMsg( pColl ); |
| pColl->ModifyNotification( &aMsg, &aMsg ); |
| } |
| else if( pCondItem && !pColl->GetDepends() ) |
| { |
| // keine bedingte Vorlage, dann erstmal erzeugen und |
| // alle wichtigen Werte uebernehmen |
| SwConditionTxtFmtColl* pCColl = rDoc.MakeCondTxtFmtColl( |
| pColl->GetName(), (SwTxtFmtColl*)pColl->DerivedFrom() ); |
| if( pColl != &pColl->GetNextTxtFmtColl() ) |
| pCColl->SetNextTxtFmtColl( pColl->GetNextTxtFmtColl() ); |
| |
| if( pColl->IsAssignedToListLevelOfOutlineStyle()) |
| pCColl->AssignToListLevelOfOutlineStyle(pColl->GetAssignedOutlineStyleLevel()); |
| else |
| pCColl->DeleteAssignmentToListLevelOfOutlineStyle(); |
| |
| |
| |
| SwTxtFmtColl* pFindFmt; |
| const CommandStruct* pCmds = SwCondCollItem::GetCmds(); |
| for( sal_uInt16 i = 0; i < COND_COMMAND_COUNT; ++i ) |
| { |
| const String& rStyle = pCondItem->GetStyle( i ); |
| if( rStyle.Len() && |
| 0 != ( pFindFmt = lcl_FindParaFmt( rDoc, rStyle, 0, sal_True ))) |
| { |
| pCColl->InsertCondition( SwCollCondition( pFindFmt, |
| pCmds[ i ].nCnd, pCmds[ i ].nSubCond ) ); |
| } |
| } |
| |
| rDoc.DelTxtFmtColl( pColl ); |
| pColl = pCColl; |
| } |
| // --> OD 2008-02-12 #newlistlevelattrs# |
| if ( bResetIndentAttrsAtParagraphStyle && |
| rSet.GetItemState( RES_PARATR_NUMRULE, sal_False, 0 ) == SFX_ITEM_SET && |
| rSet.GetItemState( RES_LR_SPACE, sal_False, 0 ) != SFX_ITEM_SET && |
| pColl->GetItemState( RES_LR_SPACE, sal_False, 0 ) == SFX_ITEM_SET ) |
| { |
| rDoc.ResetAttrAtFormat( RES_LR_SPACE, *pColl ); |
| } |
| // <-- |
| |
| // #i56252: If a standard numbering style is assigned to a standard paragraph style |
| // we have to create a physical instance of the numbering style. If we do not and |
| // neither the paragraph style nor the numbering style is used in the document |
| // the numbering style will not be saved with the document and the assignment got lost. |
| const SfxPoolItem* pNumRuleItem = 0; |
| if( SFX_ITEM_SET == rSet.GetItemState( RES_PARATR_NUMRULE, sal_False, &pNumRuleItem ) ) |
| { // Setting a numbering rule? |
| String sNumRule = ((SwNumRuleItem*)pNumRuleItem)->GetValue(); |
| if( sNumRule.Len() ) |
| { |
| SwNumRule* pRule = rDoc.FindNumRulePtr( sNumRule ); |
| if( !pRule ) |
| { // Numbering rule not in use yet. |
| sal_uInt16 nPoolId = SwStyleNameMapper::GetPoolIdFromUIName( sNumRule, nsSwGetPoolIdFromName::GET_POOLID_NUMRULE ); |
| if( USHRT_MAX != nPoolId ) // It's a standard numbering rule |
| { |
| pRule = rDoc.GetNumRuleFromPool( nPoolId ); // Create numbering rule (physical) |
| } |
| } |
| } |
| } |
| |
| pFmt = pColl; |
| |
| sal_uInt16 nId = pColl->GetPoolFmtId() & |
| ~ ( COLL_GET_RANGE_BITS | POOLGRP_NOCOLLID ); |
| switch( GetMask() & ( 0x0fff & ~SWSTYLEBIT_CONDCOLL ) ) |
| { |
| case SWSTYLEBIT_TEXT: |
| nId |= COLL_TEXT_BITS; |
| break; |
| case SWSTYLEBIT_CHAPTER: |
| nId |= COLL_DOC_BITS; |
| break; |
| case SWSTYLEBIT_LIST: |
| nId |= COLL_LISTS_BITS; |
| break; |
| case SWSTYLEBIT_IDX: |
| nId |= COLL_REGISTER_BITS; |
| break; |
| case SWSTYLEBIT_EXTRA: |
| nId |= COLL_EXTRA_BITS; |
| break; |
| case SWSTYLEBIT_HTML: |
| nId |= COLL_HTML_BITS; |
| break; |
| } |
| pColl->SetPoolFmtId( nId ); |
| break; |
| } |
| case SFX_STYLE_FAMILY_FRAME: |
| { |
| ASSERT(pFrmFmt, "Wo ist das FrmFmt"); |
| const SfxPoolItem* pAutoUpdate; |
| if(SFX_ITEM_SET == rSet.GetItemState(SID_ATTR_AUTO_STYLE_UPDATE,sal_False, &pAutoUpdate )) |
| { |
| pFrmFmt->SetAutoUpdateFmt(((const SfxBoolItem*)pAutoUpdate)->GetValue()); |
| } |
| pFmt = pFrmFmt; |
| } |
| break; |
| |
| case SFX_STYLE_FAMILY_PAGE : |
| { |
| ASSERT(pDesc, "Wo ist der PageDescriptor"); |
| |
| if( rDoc.FindPageDescByName( pDesc->GetName(), &nPgDscPos )) |
| { |
| pNewDsc = new SwPageDesc( *pDesc ); |
| // --> OD 2005-05-09 #i48949# - no undo actions for the |
| // copy of the page style |
| ::sw::UndoGuard const ug(rDoc.GetIDocumentUndoRedo()); |
| rDoc.CopyPageDesc(*pDesc, *pNewDsc); // #i7983# |
| // <-- |
| |
| pFmt = &pNewDsc->GetMaster(); |
| } |
| } |
| break; |
| |
| case SFX_STYLE_FAMILY_PSEUDO: |
| { |
| ASSERT(pNumRule, "Wo ist die NumRule"); |
| |
| if (!pNumRule) |
| break; |
| |
| const SfxPoolItem* pItem; |
| switch( rSet.GetItemState( SID_ATTR_NUMBERING_RULE, sal_False, &pItem )) |
| { |
| case SFX_ITEM_SET: |
| { |
| SvxNumRule* pSetRule = ((SvxNumBulletItem*)pItem)->GetNumRule(); |
| pSetRule->UnLinkGraphics(); |
| //SwNumRule aSetRule(rDoc.GetUniqueNumRuleName()); |
| SwNumRule aSetRule(*pNumRule); |
| aSetRule.SetSvxRule(*pSetRule, &rDoc); |
| rDoc.ChgNumRuleFmts( aSetRule ); |
| } |
| break; |
| case SFX_ITEM_DONTCARE: |
| // NumRule auf default Werte |
| // was sind die default Werte? |
| { |
| // --> OD 2008-02-11 #newlistlevelattrs# |
| SwNumRule aRule( pNumRule->GetName(), |
| // --> OD 2008-06-06 #i89178# |
| numfunc::GetDefaultPositionAndSpaceMode() ); |
| // <-- |
| // <-- |
| rDoc.ChgNumRuleFmts( aRule ); |
| } |
| break; |
| } |
| } |
| break; |
| |
| default: |
| ASSERT(!this, "unbekannte Style-Familie"); |
| } |
| |
| if( pFmt && rSet.Count()) |
| { |
| SfxItemIter aIter( rSet ); |
| const SfxPoolItem* pItem = aIter.GetCurItem(); |
| while( sal_True ) |
| { |
| if( IsInvalidItem( pItem ) ) // Clearen |
| { |
| // --> OD 2008-02-12 #newlistlevelattrs# |
| // use method <SwDoc::ResetAttrAtFormat(..)> in order to |
| // create an Undo object for the attribute reset. |
| // pFmt->ResetAttr( rSet.GetWhichByPos(aIter.GetCurPos())); |
| rDoc.ResetAttrAtFormat( rSet.GetWhichByPos(aIter.GetCurPos()), |
| *pFmt ); |
| } |
| |
| if( aIter.IsAtEnd() ) |
| break; |
| pItem = aIter.NextItem(); |
| } |
| SfxItemSet aSet(rSet); |
| aSet.ClearInvalidItems(); |
| |
| aCoreSet.ClearItem(); |
| |
| if( pNewDsc ) |
| { |
| ::ItemSetToPageDesc( aSet, *pNewDsc ); |
| rDoc.ChgPageDesc( nPgDscPos, *pNewDsc ); |
| pDesc = &const_cast<const SwDoc &>(rDoc).GetPageDesc( nPgDscPos ); |
| rDoc.PreDelPageDesc(pNewDsc); // #i7983# |
| delete pNewDsc; |
| } |
| else |
| rDoc.ChgFmt(*pFmt, aSet); // alles gesetzten Putten |
| } |
| else |
| { |
| aCoreSet.ClearItem(); |
| if( pNewDsc ) // den muessen wir noch vernichten!! |
| { |
| rDoc.PreDelPageDesc(pNewDsc); // #i7983# |
| delete pNewDsc; |
| } |
| } |
| |
| // --> OD 2008-02-12 #newlistlevelattrs# |
| if (rDoc.GetIDocumentUndoRedo().DoesUndo()) |
| { |
| rDoc.GetIDocumentUndoRedo().EndUndo(UNDO_END, 0); |
| } |
| // <-- |
| } |
| |
| void lcl_SaveStyles( sal_uInt16 nFamily, SvPtrarr& rArr, SwDoc& rDoc ) |
| { |
| switch( nFamily ) |
| { |
| case SFX_STYLE_FAMILY_CHAR: |
| { |
| const SwCharFmts& rTbl = *rDoc.GetCharFmts(); |
| for( sal_uInt16 n = 0, nCnt = rTbl.Count(); n < nCnt; ++n ) |
| { |
| void* p = (void*)rTbl[ n ]; |
| rArr.Insert( p, n ); |
| } |
| } |
| break; |
| case SFX_STYLE_FAMILY_PARA: |
| { |
| const SwTxtFmtColls& rTbl = *rDoc.GetTxtFmtColls(); |
| for( sal_uInt16 n = 0, nCnt = rTbl.Count(); n < nCnt; ++n ) |
| { |
| void* p = (void*)rTbl[ n ]; |
| rArr.Insert( p, n ); |
| } |
| } |
| break; |
| case SFX_STYLE_FAMILY_FRAME: |
| { |
| const SwFrmFmts& rTbl = *rDoc.GetFrmFmts(); |
| for( sal_uInt16 n = 0, nCnt = rTbl.Count(); n < nCnt; ++n ) |
| { |
| void* p = (void*)rTbl[ n ]; |
| rArr.Insert( p, n ); |
| } |
| } |
| break; |
| |
| case SFX_STYLE_FAMILY_PAGE: |
| { |
| for( sal_uInt16 n = 0, nCnt = rDoc.GetPageDescCnt(); n < nCnt; ++n ) |
| { |
| void* p = |
| (void*)&const_cast<const SwDoc &>(rDoc).GetPageDesc( n ); |
| rArr.Insert( p, n ); |
| } |
| } |
| break; |
| |
| case SFX_STYLE_FAMILY_PSEUDO: |
| { |
| const SwNumRuleTbl& rTbl = rDoc.GetNumRuleTbl(); |
| for( sal_uInt16 n = 0, nCnt = rTbl.Count(); n < nCnt; ++n ) |
| { |
| void* p = (void*)rTbl[ n ]; |
| rArr.Insert( p, n ); |
| } |
| } |
| break; |
| } |
| } |
| |
| void lcl_DeleteInfoStyles( sal_uInt16 nFamily, SvPtrarr& rArr, SwDoc& rDoc ) |
| { |
| sal_uInt16 n, nCnt; |
| switch( nFamily ) |
| { |
| case SFX_STYLE_FAMILY_CHAR: |
| { |
| SvUShorts aDelArr; |
| const SwCharFmts& rTbl = *rDoc.GetCharFmts(); |
| for( n = 0, nCnt = rTbl.Count(); n < nCnt; ++n ) |
| { |
| void* p = (void*)rTbl[ n ]; |
| if( USHRT_MAX == rArr.GetPos( p )) |
| aDelArr.Insert( n, 0 ); |
| } |
| for( n = 0, nCnt = aDelArr.Count(); n < nCnt; ++n ) |
| rDoc.DelCharFmt( aDelArr[ n ] ); |
| } |
| break; |
| |
| case SFX_STYLE_FAMILY_PARA : |
| { |
| SvUShorts aDelArr; |
| const SwTxtFmtColls& rTbl = *rDoc.GetTxtFmtColls(); |
| for( n = 0, nCnt = rTbl.Count(); n < nCnt; ++n ) |
| { |
| void* p = (void*)rTbl[ n ]; |
| if( USHRT_MAX == rArr.GetPos( p )) |
| aDelArr.Insert( n, 0 ); |
| } |
| for( n = 0, nCnt = aDelArr.Count(); n < nCnt; ++n ) |
| rDoc.DelTxtFmtColl( aDelArr[ n ] ); |
| } |
| break; |
| |
| case SFX_STYLE_FAMILY_FRAME: |
| { |
| SvPtrarr aDelArr; |
| const SwFrmFmts& rTbl = *rDoc.GetFrmFmts(); |
| for( n = 0, nCnt = rTbl.Count(); n < nCnt; ++n ) |
| { |
| void* p = (void*)rTbl[ n ]; |
| if( USHRT_MAX == rArr.GetPos( p )) |
| aDelArr.Insert( p, 0 ); |
| } |
| for( n = 0, nCnt = aDelArr.Count(); n < nCnt; ++n ) |
| rDoc.DelFrmFmt( (SwFrmFmt*)aDelArr[ n ] ); |
| } |
| break; |
| |
| case SFX_STYLE_FAMILY_PAGE: |
| { |
| SvUShorts aDelArr; |
| for( n = 0, nCnt = rDoc.GetPageDescCnt(); n < nCnt; ++n ) |
| { |
| void* p = |
| (void*)&const_cast<const SwDoc &>(rDoc).GetPageDesc( n ); |
| if( USHRT_MAX == rArr.GetPos( p )) |
| aDelArr.Insert( n, 0 ); |
| } |
| for( n = 0, nCnt = aDelArr.Count(); n < nCnt; ++n ) |
| rDoc.DelPageDesc( aDelArr[ n ] ); |
| } |
| break; |
| |
| |
| case SFX_STYLE_FAMILY_PSEUDO: |
| { |
| SvPtrarr aDelArr; |
| const SwNumRuleTbl& rTbl = rDoc.GetNumRuleTbl(); |
| for( n = 0, nCnt = rTbl.Count(); n < nCnt; ++n ) |
| { |
| void* p = (void*)rTbl[ n ]; |
| if( USHRT_MAX == rArr.GetPos( p )) |
| aDelArr.Insert( p, 0 ); |
| } |
| for( n = 0, nCnt = aDelArr.Count(); n < nCnt; ++n ) |
| rDoc.DelNumRule( ((SwNumRule*)aDelArr[ n ])->GetName() ); |
| } |
| break; |
| } |
| } |
| |
| /*-------------------------------------------------------------------- |
| Beschreibung: Das Format ermitteln |
| --------------------------------------------------------------------*/ |
| |
| sal_Bool SwDocStyleSheet::FillStyleSheet( FillStyleType eFType ) |
| { |
| sal_Bool bRet = sal_False; |
| sal_uInt16 nPoolId = USHRT_MAX; |
| SwFmt* pFmt = 0; |
| |
| sal_Bool bCreate = FillPhysical == eFType; |
| sal_Bool bDeleteInfo = sal_False; |
| sal_Bool bFillOnlyInfo = FillAllInfo == eFType; |
| SvPtrarr aDelArr; |
| |
| switch(nFamily) |
| { |
| case SFX_STYLE_FAMILY_CHAR: |
| pCharFmt = lcl_FindCharFmt(rDoc, aName, this, bCreate ); |
| bPhysical = 0 != pCharFmt; |
| if( bFillOnlyInfo && !bPhysical ) |
| { |
| bDeleteInfo = sal_True; |
| ::lcl_SaveStyles( static_cast< sal_uInt16 >(nFamily), aDelArr, rDoc ); |
| pCharFmt = lcl_FindCharFmt(rDoc, aName, this, sal_True ); |
| } |
| |
| pFmt = pCharFmt; |
| if( !bCreate && !pFmt ) |
| { |
| if( aName == *SwStyleNameMapper::GetTextUINameArray()[ RES_POOLCOLL_STANDARD - |
| RES_POOLCOLL_TEXT_BEGIN ] ) |
| nPoolId = 0; |
| else |
| nPoolId = SwStyleNameMapper::GetPoolIdFromUIName( aName, nsSwGetPoolIdFromName::GET_POOLID_CHRFMT ); |
| } |
| |
| bRet = 0 != pCharFmt || USHRT_MAX != nPoolId; |
| |
| if( bDeleteInfo ) |
| pCharFmt = 0; |
| break; |
| |
| case SFX_STYLE_FAMILY_PARA: |
| { |
| pColl = lcl_FindParaFmt(rDoc, aName, this, bCreate); |
| bPhysical = 0 != pColl; |
| if( bFillOnlyInfo && !bPhysical ) |
| { |
| bDeleteInfo = sal_True; |
| ::lcl_SaveStyles( static_cast< sal_uInt16 >(nFamily), aDelArr, rDoc ); |
| pColl = lcl_FindParaFmt(rDoc, aName, this, sal_True ); |
| } |
| |
| pFmt = pColl; |
| if( pColl ) |
| PresetFollow( pColl->GetNextTxtFmtColl().GetName() ); |
| else if( !bCreate ) |
| nPoolId = SwStyleNameMapper::GetPoolIdFromUIName( aName, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL ); |
| |
| bRet = 0 != pColl || USHRT_MAX != nPoolId; |
| |
| if( bDeleteInfo ) |
| pColl = 0; |
| } |
| break; |
| |
| case SFX_STYLE_FAMILY_FRAME: |
| pFrmFmt = lcl_FindFrmFmt(rDoc, aName, this, bCreate); |
| bPhysical = 0 != pFrmFmt; |
| if( bFillOnlyInfo && bPhysical ) |
| { |
| bDeleteInfo = sal_True; |
| ::lcl_SaveStyles( static_cast< sal_uInt16 >(nFamily), aDelArr, rDoc ); |
| pFrmFmt = lcl_FindFrmFmt(rDoc, aName, this, sal_True ); |
| } |
| pFmt = pFrmFmt; |
| if( !bCreate && !pFmt ) |
| nPoolId = SwStyleNameMapper::GetPoolIdFromUIName( aName, nsSwGetPoolIdFromName::GET_POOLID_FRMFMT ); |
| |
| bRet = 0 != pFrmFmt || USHRT_MAX != nPoolId; |
| |
| if( bDeleteInfo ) |
| pFrmFmt = 0; |
| break; |
| |
| case SFX_STYLE_FAMILY_PAGE: |
| pDesc = lcl_FindPageDesc(rDoc, aName, this, bCreate); |
| bPhysical = 0 != pDesc; |
| if( bFillOnlyInfo && !pDesc ) |
| { |
| bDeleteInfo = sal_True; |
| ::lcl_SaveStyles( static_cast< sal_uInt16 >(nFamily), aDelArr, rDoc ); |
| pDesc = lcl_FindPageDesc( rDoc, aName, this, sal_True ); |
| } |
| |
| if( pDesc ) |
| { |
| nPoolId = pDesc->GetPoolFmtId(); |
| nHelpId = pDesc->GetPoolHelpId(); |
| if( pDesc->GetPoolHlpFileId() != UCHAR_MAX ) |
| aHelpFile = *rDoc.GetDocPattern( pDesc->GetPoolHlpFileId() ); |
| else |
| aHelpFile.Erase(); |
| } |
| else if( !bCreate ) |
| nPoolId = SwStyleNameMapper::GetPoolIdFromUIName( aName, nsSwGetPoolIdFromName::GET_POOLID_PAGEDESC ); |
| SetMask( USER_FMT & nPoolId ? SFXSTYLEBIT_USERDEF : 0 ); |
| |
| bRet = 0 != pDesc || USHRT_MAX != nPoolId; |
| if( bDeleteInfo ) |
| pDesc = 0; |
| break; |
| |
| case SFX_STYLE_FAMILY_PSEUDO: |
| pNumRule = lcl_FindNumRule(rDoc, aName, this, bCreate); |
| bPhysical = 0 != pNumRule; |
| if( bFillOnlyInfo && !pNumRule ) |
| { |
| bDeleteInfo = sal_True; |
| ::lcl_SaveStyles( static_cast< sal_uInt16 >(nFamily), aDelArr, rDoc ); |
| pNumRule = lcl_FindNumRule( rDoc, aName, this, sal_True ); |
| } |
| |
| if( pNumRule ) |
| { |
| nPoolId = pNumRule->GetPoolFmtId(); |
| nHelpId = pNumRule->GetPoolHelpId(); |
| if( pNumRule->GetPoolHlpFileId() != UCHAR_MAX ) |
| aHelpFile = *rDoc.GetDocPattern( pNumRule->GetPoolHlpFileId() ); |
| else |
| aHelpFile.Erase(); |
| } |
| else if( !bCreate ) |
| nPoolId = SwStyleNameMapper::GetPoolIdFromUIName( aName, nsSwGetPoolIdFromName::GET_POOLID_NUMRULE ); |
| SetMask( USER_FMT & nPoolId ? SFXSTYLEBIT_USERDEF : 0 ); |
| |
| bRet = 0 != pNumRule || USHRT_MAX != nPoolId; |
| |
| if( bDeleteInfo ) |
| pNumRule = 0; |
| break; |
| default:; //prevent warning |
| } |
| |
| if( SFX_STYLE_FAMILY_CHAR == nFamily || |
| SFX_STYLE_FAMILY_PARA == nFamily || |
| SFX_STYLE_FAMILY_FRAME == nFamily ) |
| { |
| if( pFmt ) |
| nPoolId = pFmt->GetPoolFmtId(); |
| |
| sal_uInt16 _nMask = 0; |
| if( pFmt == rDoc.GetDfltCharFmt() ) |
| _nMask |= SFXSTYLEBIT_READONLY; |
| else if( USER_FMT & nPoolId ) |
| _nMask |= SFXSTYLEBIT_USERDEF; |
| |
| switch ( COLL_GET_RANGE_BITS & nPoolId ) |
| { |
| case COLL_TEXT_BITS: _nMask |= SWSTYLEBIT_TEXT; break; |
| case COLL_DOC_BITS : _nMask |= SWSTYLEBIT_CHAPTER; break; |
| case COLL_LISTS_BITS: _nMask |= SWSTYLEBIT_LIST; break; |
| case COLL_REGISTER_BITS: _nMask |= SWSTYLEBIT_IDX; break; |
| case COLL_EXTRA_BITS: _nMask |= SWSTYLEBIT_EXTRA; break; |
| case COLL_HTML_BITS: _nMask |= SWSTYLEBIT_HTML; break; |
| } |
| |
| if( pFmt ) |
| { |
| ASSERT( bPhysical, "Format nicht gefunden" ); |
| |
| nHelpId = pFmt->GetPoolHelpId(); |
| if( pFmt->GetPoolHlpFileId() != UCHAR_MAX ) |
| aHelpFile = *rDoc.GetDocPattern( pFmt->GetPoolHlpFileId() ); |
| else |
| aHelpFile.Erase(); |
| |
| if( RES_CONDTXTFMTCOLL == pFmt->Which() ) |
| _nMask |= SWSTYLEBIT_CONDCOLL; |
| } |
| |
| SetMask( _nMask ); |
| } |
| if( bDeleteInfo && bFillOnlyInfo ) |
| ::lcl_DeleteInfoStyles( static_cast< sal_uInt16 >(nFamily), aDelArr, rDoc ); |
| return bRet; |
| } |
| |
| /*-------------------------------------------------------------------- |
| Beschreibung: Neues Format in der Core anlegen |
| --------------------------------------------------------------------*/ |
| |
| |
| void SwDocStyleSheet::Create() |
| { |
| switch(nFamily) |
| { |
| case SFX_STYLE_FAMILY_CHAR : |
| pCharFmt = lcl_FindCharFmt( rDoc, aName ); |
| if( !pCharFmt ) |
| pCharFmt = rDoc.MakeCharFmt(aName, |
| rDoc.GetDfltCharFmt()); |
| pCharFmt->SetAuto( sal_False ); |
| break; |
| |
| case SFX_STYLE_FAMILY_PARA : |
| pColl = lcl_FindParaFmt( rDoc, aName ); |
| if( !pColl ) |
| { |
| SwTxtFmtColl *pPar = (*rDoc.GetTxtFmtColls())[0]; |
| if( nMask & SWSTYLEBIT_CONDCOLL ) |
| pColl = rDoc.MakeCondTxtFmtColl( aName, pPar ); |
| else |
| pColl = rDoc.MakeTxtFmtColl( aName, pPar ); |
| } |
| break; |
| |
| case SFX_STYLE_FAMILY_FRAME: |
| pFrmFmt = lcl_FindFrmFmt( rDoc, aName ); |
| if( !pFrmFmt ) |
| pFrmFmt = rDoc.MakeFrmFmt(aName, rDoc.GetDfltFrmFmt(), sal_False, sal_False); |
| |
| break; |
| |
| case SFX_STYLE_FAMILY_PAGE : |
| pDesc = lcl_FindPageDesc( rDoc, aName ); |
| if( !pDesc ) |
| { |
| sal_uInt16 nId = rDoc.MakePageDesc(aName); |
| pDesc = &const_cast<const SwDoc &>(rDoc).GetPageDesc(nId); |
| } |
| break; |
| |
| case SFX_STYLE_FAMILY_PSEUDO: |
| pNumRule = lcl_FindNumRule( rDoc, aName ); |
| if( !pNumRule ) |
| { |
| //JP 05.02.99: temp Namen erzeugen, damit kein ASSERT kommt |
| String sTmpNm( aName ); |
| if( !aName.Len() ) |
| sTmpNm = rDoc.GetUniqueNumRuleName(); |
| |
| // --> OD 2008-02-11 #newlistlevelattrs# |
| SwNumRule* pRule = rDoc.GetNumRuleTbl()[ |
| rDoc.MakeNumRule( sTmpNm, 0, sal_False, |
| // --> OD 2008-06-06 #i89178# |
| numfunc::GetDefaultPositionAndSpaceMode() ) ]; |
| // <-- |
| // <-- |
| pRule->SetAutoRule( sal_False ); |
| if( !aName.Len() ) |
| { |
| // --> OD 2008-07-08 #i91400# |
| pRule->SetName( aName, rDoc ); |
| // <-- |
| } |
| pNumRule = pRule; |
| } |
| break; |
| default:; //prevent warning |
| } |
| bPhysical = sal_True; |
| aCoreSet.ClearItem(); |
| } |
| |
| /*-------------------------------------------------------------------- |
| Beschreibung: Konkrete Formate rausholen |
| --------------------------------------------------------------------*/ |
| |
| |
| |
| SwCharFmt* SwDocStyleSheet::GetCharFmt() |
| { |
| if(!bPhysical) |
| FillStyleSheet( FillPhysical ); |
| return pCharFmt; |
| } |
| |
| |
| SwTxtFmtColl* SwDocStyleSheet::GetCollection() |
| { |
| if(!bPhysical) |
| FillStyleSheet( FillPhysical ); |
| return pColl; |
| } |
| |
| |
| const SwPageDesc* SwDocStyleSheet::GetPageDesc() |
| { |
| if(!bPhysical) |
| FillStyleSheet( FillPhysical ); |
| return pDesc; |
| } |
| |
| const SwNumRule * SwDocStyleSheet::GetNumRule() |
| { |
| if(!bPhysical) |
| FillStyleSheet( FillPhysical ); |
| return pNumRule; |
| } |
| |
| void SwDocStyleSheet::SetNumRule(const SwNumRule& rRule) |
| { |
| DBG_ASSERT(pNumRule, "Wo ist die NumRule"); |
| rDoc.ChgNumRuleFmts( rRule ); |
| } |
| |
| // Namen UND Familie aus String re-generieren |
| // First() und Next() (s.u.) fuegen einen Kennbuchstaben an Pos.1 ein |
| |
| void SwDocStyleSheet::PresetNameAndFamily(const String& rName) |
| { |
| switch( rName.GetChar(0) ) |
| { |
| case cPARA: nFamily = SFX_STYLE_FAMILY_PARA; break; |
| case cFRAME: nFamily = SFX_STYLE_FAMILY_FRAME; break; |
| case cPAGE: nFamily = SFX_STYLE_FAMILY_PAGE; break; |
| case cNUMRULE: nFamily = SFX_STYLE_FAMILY_PSEUDO; break; |
| default: nFamily = SFX_STYLE_FAMILY_CHAR; break; |
| } |
| aName = rName; |
| aName.Erase( 0, 1 ); |
| } |
| |
| /*-------------------------------------------------------------------- |
| Beschreibung: Ist das Format physikalisch schon vorhanden |
| --------------------------------------------------------------------*/ |
| |
| |
| void SwDocStyleSheet::SetPhysical(sal_Bool bPhys) |
| { |
| bPhysical = bPhys; |
| |
| if(!bPhys) |
| { |
| pCharFmt = 0; |
| pColl = 0; |
| pFrmFmt = 0; |
| pDesc = 0; |
| } |
| } |
| |
| SwFrmFmt* SwDocStyleSheet::GetFrmFmt() |
| { |
| if(!bPhysical) |
| FillStyleSheet( FillPhysical ); |
| return pFrmFmt; |
| } |
| |
| |
| sal_Bool SwDocStyleSheet::IsUsed() const |
| { |
| if( !bPhysical ) |
| { |
| SwDocStyleSheet* pThis = (SwDocStyleSheet*)this; |
| pThis->FillStyleSheet( FillOnlyName ); |
| } |
| |
| // immer noch nicht ? |
| if( !bPhysical ) |
| return sal_False; |
| |
| const SwModify* pMod; |
| switch( nFamily ) |
| { |
| case SFX_STYLE_FAMILY_CHAR : pMod = pCharFmt; break; |
| case SFX_STYLE_FAMILY_PARA : pMod = pColl; break; |
| case SFX_STYLE_FAMILY_FRAME: pMod = pFrmFmt; break; |
| case SFX_STYLE_FAMILY_PAGE : pMod = pDesc; break; |
| |
| case SFX_STYLE_FAMILY_PSEUDO: |
| return pNumRule ? rDoc.IsUsed( *pNumRule ) : sal_False; |
| |
| default: |
| ASSERT(!this, "unbekannte Style-Familie"); |
| return sal_False; |
| } |
| return rDoc.IsUsed( *pMod ); |
| } |
| |
| |
| sal_uLong SwDocStyleSheet::GetHelpId( String& rFile ) |
| { |
| static String sTemplateHelpFile = String::CreateFromAscii("swrhlppi.hlp"); |
| |
| sal_uInt16 nId = 0; |
| sal_uInt16 nPoolId = 0; |
| unsigned char nFileId = UCHAR_MAX; |
| |
| rFile = sTemplateHelpFile; |
| |
| const SwFmt* pTmpFmt = 0; |
| switch( nFamily ) |
| { |
| case SFX_STYLE_FAMILY_CHAR : |
| if( !pCharFmt && |
| 0 == (pCharFmt = lcl_FindCharFmt( rDoc, aName, 0, sal_False )) ) |
| { |
| nId = SwStyleNameMapper::GetPoolIdFromUIName( aName, nsSwGetPoolIdFromName::GET_POOLID_CHRFMT ); |
| return USHRT_MAX == nId ? 0 : nId; |
| } |
| pTmpFmt = pCharFmt; |
| break; |
| |
| case SFX_STYLE_FAMILY_PARA: |
| if( !pColl && |
| 0 == ( pColl = lcl_FindParaFmt( rDoc, aName, 0, sal_False )) ) |
| { |
| nId = SwStyleNameMapper::GetPoolIdFromUIName( aName, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL ); |
| return USHRT_MAX == nId ? 0 : nId; |
| } |
| pTmpFmt = pColl; |
| break; |
| |
| case SFX_STYLE_FAMILY_FRAME: |
| if( !pFrmFmt && |
| 0 == ( pFrmFmt = lcl_FindFrmFmt( rDoc, aName, 0, sal_False ) ) ) |
| { |
| nId = SwStyleNameMapper::GetPoolIdFromUIName( aName, nsSwGetPoolIdFromName::GET_POOLID_FRMFMT ); |
| return USHRT_MAX == nId ? 0 : nId; |
| } |
| pTmpFmt = pFrmFmt; |
| break; |
| |
| case SFX_STYLE_FAMILY_PAGE: |
| if( !pDesc && |
| 0 == ( pDesc = lcl_FindPageDesc( rDoc, aName, 0, sal_False ) ) ) |
| { |
| nId = SwStyleNameMapper::GetPoolIdFromUIName( aName, nsSwGetPoolIdFromName::GET_POOLID_PAGEDESC ); |
| return USHRT_MAX == nId ? 0 : nId; |
| } |
| |
| nId = pDesc->GetPoolHelpId(); |
| nFileId = pDesc->GetPoolHlpFileId(); |
| nPoolId = pDesc->GetPoolFmtId(); |
| break; |
| |
| case SFX_STYLE_FAMILY_PSEUDO: |
| if( !pNumRule && |
| 0 == ( pNumRule = lcl_FindNumRule( rDoc, aName, 0, sal_False ) ) ) |
| { |
| nId = SwStyleNameMapper::GetPoolIdFromUIName( aName, nsSwGetPoolIdFromName::GET_POOLID_NUMRULE ); |
| return USHRT_MAX == nId ? 0 : nId; |
| } |
| |
| nId = pNumRule->GetPoolHelpId(); |
| nFileId = pNumRule->GetPoolHlpFileId(); |
| nPoolId = pNumRule->GetPoolFmtId(); |
| break; |
| |
| default: |
| ASSERT(!this, "unbekannte Style-Familie"); |
| return 0; |
| } |
| |
| if( pTmpFmt ) |
| { |
| nId = pTmpFmt->GetPoolHelpId(); |
| nFileId = pTmpFmt->GetPoolHlpFileId(); |
| nPoolId = pTmpFmt->GetPoolFmtId(); |
| } |
| |
| if( UCHAR_MAX != nFileId ) |
| { |
| const String *pTemplate = rDoc.GetDocPattern( nFileId ); |
| if( pTemplate ) |
| { |
| // const String aHelpPath(MakeHelpPath(*pTemplate)); |
| rFile = *pTemplate; |
| } |
| } |
| else if( !IsPoolUserFmt( nPoolId ) ) |
| { |
| nId = nPoolId; |
| } |
| |
| // weil sich der SFX so anstellt mit der HilfeId: |
| if( USHRT_MAX == nId ) |
| nId = 0; // entsp. keine Hilfe anzeigen |
| |
| return nId; |
| } |
| |
| |
| void SwDocStyleSheet::SetHelpId( const String& r, sal_uLong nId ) |
| { |
| sal_uInt8 nFileId = static_cast< sal_uInt8 >(rDoc.SetDocPattern( r )); |
| sal_uInt16 nHId = static_cast< sal_uInt16 >(nId); //!! SFX hat eigenmaechtig auf sal_uLong umgestellt! |
| |
| SwFmt* pTmpFmt = 0; |
| switch( nFamily ) |
| { |
| case SFX_STYLE_FAMILY_CHAR : pTmpFmt = pCharFmt; break; |
| case SFX_STYLE_FAMILY_PARA : pTmpFmt = pColl; break; |
| case SFX_STYLE_FAMILY_FRAME: pTmpFmt = pFrmFmt; break; |
| case SFX_STYLE_FAMILY_PAGE : |
| ((SwPageDesc*)pDesc)->SetPoolHelpId( nHId ); |
| ((SwPageDesc*)pDesc)->SetPoolHlpFileId( nFileId ); |
| break; |
| |
| case SFX_STYLE_FAMILY_PSEUDO: |
| ((SwNumRule*)pNumRule)->SetPoolHelpId( nHId ); |
| ((SwNumRule*)pNumRule)->SetPoolHlpFileId( nFileId ); |
| break; |
| |
| default: |
| ASSERT(!this, "unbekannte Style-Familie"); |
| return ; |
| } |
| if( pTmpFmt ) |
| { |
| pTmpFmt->SetPoolHelpId( nHId ); |
| pTmpFmt->SetPoolHlpFileId( nFileId ); |
| } |
| } |
| |
| |
| /* */ |
| |
| /*-------------------------------------------------------------------- |
| Beschreibung: Methoden fuer den DocStyleSheetPool |
| --------------------------------------------------------------------*/ |
| |
| SwDocStyleSheetPool::SwDocStyleSheetPool( SwDoc& rDocument, sal_Bool bOrg ) |
| : SfxStyleSheetBasePool( rDocument.GetAttrPool() ) |
| , mxStyleSheet( new SwDocStyleSheet( rDocument, aEmptyStr, *this, SFX_STYLE_FAMILY_CHAR, 0 ) ) |
| , rDoc( rDocument ) |
| { |
| bOrganizer = bOrg; |
| } |
| |
| SwDocStyleSheetPool::~SwDocStyleSheetPool() |
| { |
| } |
| |
| void SAL_CALL SwDocStyleSheetPool::acquire( ) throw () |
| { |
| comphelper::OWeakTypeObject::acquire(); |
| } |
| |
| void SAL_CALL SwDocStyleSheetPool::release( ) throw () |
| { |
| comphelper::OWeakTypeObject::release(); |
| } |
| |
| SfxStyleSheetBase& SwDocStyleSheetPool::Make( |
| const String& rName, |
| SfxStyleFamily eFam, |
| sal_uInt16 _nMask, |
| sal_uInt16 /*nPos*/ ) |
| { |
| mxStyleSheet->PresetName(rName); |
| mxStyleSheet->PresetParent(aEmptyStr); |
| mxStyleSheet->PresetFollow(aEmptyStr); |
| mxStyleSheet->SetMask(_nMask) ; |
| mxStyleSheet->SetFamily(eFam); |
| mxStyleSheet->SetPhysical(sal_True); |
| mxStyleSheet->Create(); |
| |
| return *mxStyleSheet.get(); |
| } |
| |
| |
| SfxStyleSheetBase* SwDocStyleSheetPool::Create( const SfxStyleSheetBase& /*rOrg*/) |
| { |
| ASSERT(!this , "Create im SW-Stylesheet-Pool geht nicht" ); |
| return NULL; |
| } |
| |
| |
| SfxStyleSheetBase* SwDocStyleSheetPool::Create( const String &, |
| SfxStyleFamily, sal_uInt16 ) |
| { |
| ASSERT( !this, "Create im SW-Stylesheet-Pool geht nicht" ); |
| return NULL; |
| } |
| |
| void SwDocStyleSheetPool::Replace( SfxStyleSheetBase& rSource, |
| SfxStyleSheetBase& rTarget ) |
| { |
| SfxStyleFamily eFamily( rSource.GetFamily() ); |
| if( rSource.HasParentSupport()) |
| { |
| const String& rParentName = rSource.GetParent(); |
| if( 0 != rParentName.Len() ) |
| { |
| SfxStyleSheetBase* pParentOfNew = Find( rParentName, eFamily ); |
| if( pParentOfNew ) |
| rTarget.SetParent( rParentName ); |
| } |
| } |
| if( rSource.HasFollowSupport()) |
| { |
| const String& rFollowName = rSource.GetFollow(); |
| if( 0 != rFollowName.Len() ) |
| { |
| SfxStyleSheetBase* pFollowOfNew = Find( rFollowName, eFamily ); |
| if( pFollowOfNew ) |
| rTarget.SetFollow( rFollowName ); |
| } |
| } |
| |
| SwImplShellAction aTmpSh( rDoc ); |
| |
| sal_Bool bSwSrcPool = GetAppName() == rSource.GetPool().GetAppName(); |
| if( SFX_STYLE_FAMILY_PAGE == eFamily && bSwSrcPool ) |
| { |
| // gesondert behandeln!! |
| SwPageDesc* pDestDsc = |
| (SwPageDesc*)((SwDocStyleSheet&)rTarget).GetPageDesc(); |
| SwPageDesc* pCpyDsc = |
| (SwPageDesc*)((SwDocStyleSheet&)rSource).GetPageDesc(); |
| rDoc.CopyPageDesc( *pCpyDsc, *pDestDsc ); |
| } |
| else |
| { |
| const SwFmt *pSourceFmt = 0; |
| SwFmt *pTargetFmt = 0; |
| sal_uInt16 nPgDscPos = USHRT_MAX; |
| switch( eFamily ) |
| { |
| case SFX_STYLE_FAMILY_CHAR : |
| if( bSwSrcPool ) |
| pSourceFmt = ((SwDocStyleSheet&)rSource).GetCharFmt(); |
| pTargetFmt = ((SwDocStyleSheet&)rTarget).GetCharFmt(); |
| break; |
| case SFX_STYLE_FAMILY_PARA : |
| if( bSwSrcPool ) |
| pSourceFmt = ((SwDocStyleSheet&)rSource).GetCollection(); |
| pTargetFmt = ((SwDocStyleSheet&)rTarget).GetCollection(); |
| break; |
| case SFX_STYLE_FAMILY_FRAME: |
| if( bSwSrcPool ) |
| pSourceFmt = ((SwDocStyleSheet&)rSource).GetFrmFmt(); |
| pTargetFmt = ((SwDocStyleSheet&)rTarget).GetFrmFmt(); |
| break; |
| case SFX_STYLE_FAMILY_PAGE: |
| if( bSwSrcPool ) |
| pSourceFmt = &((SwDocStyleSheet&)rSource).GetPageDesc() |
| ->GetMaster(); |
| { |
| SwPageDesc *pDesc = rDoc.FindPageDescByName( |
| ((SwDocStyleSheet&)rTarget).GetPageDesc()->GetName(), |
| &nPgDscPos ); |
| |
| if( pDesc ) |
| pTargetFmt = &pDesc->GetMaster(); |
| } |
| break; |
| case SFX_STYLE_FAMILY_PSEUDO: |
| // Eine NumRule besteht nur aus einem Item, also muss man |
| // hier nichts loeschen. |
| break; |
| default:; //prevent warning |
| } |
| if( pTargetFmt ) |
| { |
| if( pSourceFmt ) |
| pTargetFmt->DelDiffs( *pSourceFmt ); |
| else if( USHRT_MAX != nPgDscPos ) |
| pTargetFmt->ResetFmtAttr( RES_PAGEDESC, RES_FRMATR_END-1 ); |
| else |
| { |
| // --> OD 2007-01-25 #i73790# - method renamed |
| pTargetFmt->ResetAllFmtAttr(); |
| // <-- |
| } |
| |
| if( USHRT_MAX != nPgDscPos ) |
| rDoc.ChgPageDesc( nPgDscPos, |
| const_cast<const SwDoc &>(rDoc). |
| GetPageDesc(nPgDscPos) ); |
| } |
| ((SwDocStyleSheet&)rTarget).SetItemSet( rSource.GetItemSet() ); |
| } |
| } |
| |
| SfxStyleSheetIteratorPtr SwDocStyleSheetPool::CreateIterator( SfxStyleFamily eFam, sal_uInt16 _nMask ) |
| { |
| return SfxStyleSheetIteratorPtr(new SwStyleSheetIterator( this, eFam, _nMask )); |
| } |
| |
| void SwDocStyleSheetPool::dispose() |
| { |
| mxStyleSheet.clear(); |
| } |
| |
| void SwDocStyleSheetPool::Remove( SfxStyleSheetBase* pStyle) |
| { |
| if( !pStyle ) |
| return; |
| |
| sal_Bool bBroadcast = sal_True; |
| SwImplShellAction aTmpSh( rDoc ); |
| const String& rName = pStyle->GetName(); |
| switch( pStyle->GetFamily() ) |
| { |
| case SFX_STYLE_FAMILY_CHAR: |
| { |
| SwCharFmt* pFmt = lcl_FindCharFmt(rDoc, rName, 0, sal_False ); |
| if(pFmt) |
| rDoc.DelCharFmt(pFmt); |
| } |
| break; |
| case SFX_STYLE_FAMILY_PARA: |
| { |
| SwTxtFmtColl* pColl = lcl_FindParaFmt(rDoc, rName, 0, sal_False ); |
| if(pColl) |
| rDoc.DelTxtFmtColl(pColl); |
| } |
| break; |
| case SFX_STYLE_FAMILY_FRAME: |
| { |
| SwFrmFmt* pFmt = lcl_FindFrmFmt(rDoc, rName, 0, sal_False ); |
| if(pFmt) |
| rDoc.DelFrmFmt(pFmt); |
| } |
| break; |
| case SFX_STYLE_FAMILY_PAGE : |
| { |
| sal_uInt16 nPos; |
| if( rDoc.FindPageDescByName( rName, &nPos )) |
| rDoc.DelPageDesc( nPos ); |
| } |
| break; |
| |
| case SFX_STYLE_FAMILY_PSEUDO: |
| { |
| if( !rDoc.DelNumRule( rName ) ) |
| // Broadcast nur versenden, wenn etwas geloescht wurde |
| bBroadcast = sal_False; |
| } |
| break; |
| |
| default: |
| ASSERT(!this, "unbekannte Style-Familie"); |
| bBroadcast = sal_False; |
| } |
| |
| if( bBroadcast ) |
| Broadcast( SfxStyleSheetHint( SFX_STYLESHEET_ERASED, *pStyle ) ); |
| } |
| |
| |
| |
| sal_Bool SwDocStyleSheetPool::SetParent( SfxStyleFamily eFam, |
| const String &rStyle, const String &rParent ) |
| { |
| SwFmt* pFmt = 0, *pParent = 0; |
| switch( eFam ) |
| { |
| case SFX_STYLE_FAMILY_CHAR : |
| if( 0 != ( pFmt = lcl_FindCharFmt( rDoc, rStyle ) ) && rParent.Len() ) |
| pParent = lcl_FindCharFmt(rDoc, rParent ); |
| break; |
| |
| case SFX_STYLE_FAMILY_PARA : |
| if( 0 != ( pFmt = lcl_FindParaFmt( rDoc, rStyle ) ) && rParent.Len() ) |
| pParent = lcl_FindParaFmt( rDoc, rParent ); |
| break; |
| |
| case SFX_STYLE_FAMILY_FRAME: |
| if( 0 != ( pFmt = lcl_FindFrmFmt( rDoc, rStyle ) ) && rParent.Len() ) |
| pParent = lcl_FindFrmFmt( rDoc, rParent ); |
| break; |
| |
| case SFX_STYLE_FAMILY_PAGE: |
| case SFX_STYLE_FAMILY_PSEUDO: |
| break; |
| |
| default: |
| ASSERT(!this, "unbekannte Style-Familie"); |
| } |
| |
| sal_Bool bRet = sal_False; |
| if( pFmt && pFmt->DerivedFrom() && |
| pFmt->DerivedFrom()->GetName() != rParent ) |
| { |
| { |
| SwImplShellAction aTmpSh( rDoc ); |
| bRet = pFmt->SetDerivedFrom( pParent ); |
| } |
| |
| if( bRet ) |
| { |
| // nur fuer das Broadcasting |
| mxStyleSheet->PresetName( rStyle ); |
| mxStyleSheet->PresetParent( rParent ); |
| if( SFX_STYLE_FAMILY_PARA == eFam ) |
| mxStyleSheet->PresetFollow( ((SwTxtFmtColl*)pFmt)-> |
| GetNextTxtFmtColl().GetName() ); |
| else |
| mxStyleSheet->PresetFollow( aEmptyStr ); |
| |
| Broadcast( SfxStyleSheetHint( SFX_STYLESHEET_MODIFIED, |
| *(mxStyleSheet.get()) ) ); |
| } |
| } |
| |
| return bRet; |
| } |
| |
| SfxStyleSheetBase* SwDocStyleSheetPool::Find( const String& rName, |
| SfxStyleFamily eFam, sal_uInt16 n ) |
| { |
| sal_uInt16 nSMask = n; |
| if( SFX_STYLE_FAMILY_PARA == eFam && rDoc.get(IDocumentSettingAccess::HTML_MODE) ) |
| { |
| // dann sind nur HTML-Vorlagen von Interesse |
| if( USHRT_MAX == nSMask ) |
| nSMask = SWSTYLEBIT_HTML | SFXSTYLEBIT_USERDEF | SFXSTYLEBIT_USED; |
| else |
| nSMask &= SFXSTYLEBIT_USED | SFXSTYLEBIT_USERDEF | |
| SWSTYLEBIT_CONDCOLL | SWSTYLEBIT_HTML; |
| if( !nSMask ) |
| nSMask = SWSTYLEBIT_HTML; |
| } |
| |
| const sal_Bool bSearchUsed = ( n != SFXSTYLEBIT_ALL && |
| n & SFXSTYLEBIT_USED ) ? sal_True : sal_False; |
| const SwModify* pMod = 0; |
| |
| mxStyleSheet->SetPhysical( sal_False ); |
| mxStyleSheet->PresetName( rName ); |
| mxStyleSheet->SetFamily( eFam ); |
| sal_Bool bFnd = mxStyleSheet->FillStyleSheet( SwDocStyleSheet::FillOnlyName ); |
| |
| if( mxStyleSheet->IsPhysical() ) |
| { |
| switch( eFam ) |
| { |
| case SFX_STYLE_FAMILY_CHAR: |
| pMod = mxStyleSheet->GetCharFmt(); |
| break; |
| |
| case SFX_STYLE_FAMILY_PARA: |
| pMod = mxStyleSheet->GetCollection(); |
| break; |
| |
| case SFX_STYLE_FAMILY_FRAME: |
| pMod = mxStyleSheet->GetFrmFmt(); |
| break; |
| |
| case SFX_STYLE_FAMILY_PAGE: |
| pMod = mxStyleSheet->GetPageDesc(); |
| break; |
| |
| case SFX_STYLE_FAMILY_PSEUDO: |
| { |
| const SwNumRule* pRule = mxStyleSheet->GetNumRule(); |
| if( pRule && |
| !(bSearchUsed && (bOrganizer || rDoc.IsUsed(*pRule)) ) && |
| (( nSMask & ~SFXSTYLEBIT_USED) == SFXSTYLEBIT_USERDEF |
| ? !(pRule->GetPoolFmtId() & USER_FMT) |
| // benutzte gesucht und keine gefunden |
| : bSearchUsed )) |
| bFnd = sal_False; |
| } |
| break; |
| |
| default: |
| ASSERT(!this, "unbekannte Style-Familie"); |
| } |
| } |
| |
| // dann noch die Maske auswerten: |
| if( pMod && !(bSearchUsed && (bOrganizer || rDoc.IsUsed(*pMod)) ) ) |
| { |
| const sal_uInt16 nId = SFX_STYLE_FAMILY_PAGE == eFam |
| ? ((SwPageDesc*)pMod)->GetPoolFmtId() |
| : ((SwFmt*)pMod)->GetPoolFmtId(); |
| |
| if( ( nSMask & ~SFXSTYLEBIT_USED) == SFXSTYLEBIT_USERDEF |
| ? !(nId & USER_FMT) |
| // benutzte gesucht und keine gefunden |
| : bSearchUsed ) |
| bFnd = sal_False; |
| } |
| return bFnd ? mxStyleSheet.get() : 0; |
| } |
| |
| /* */ |
| |
| SwStyleSheetIterator::SwStyleSheetIterator( SwDocStyleSheetPool* pBase, |
| SfxStyleFamily eFam, sal_uInt16 n ) |
| : SfxStyleSheetIterator( pBase, eFam, n ), |
| mxIterSheet( new SwDocStyleSheet( pBase->GetDoc(), aEmptyStr, *pBase, SFX_STYLE_FAMILY_CHAR, 0 ) ), |
| mxStyleSheet( new SwDocStyleSheet( pBase->GetDoc(), aEmptyStr, *pBase, SFX_STYLE_FAMILY_CHAR, 0 ) ) |
| { |
| bFirstCalled = sal_False; |
| nLastPos = 0; |
| StartListening( *pBase ); |
| } |
| |
| SwStyleSheetIterator::~SwStyleSheetIterator() |
| { |
| EndListening( mxIterSheet->GetPool() ); |
| } |
| |
| sal_uInt16 SwStyleSheetIterator::Count() |
| { |
| // Liste richtig fuellen lassen !! |
| if( !bFirstCalled ) |
| First(); |
| return aLst.Count(); |
| } |
| |
| SfxStyleSheetBase* SwStyleSheetIterator::operator[]( sal_uInt16 nIdx ) |
| { |
| // gefunden |
| if( !bFirstCalled ) |
| First(); |
| mxStyleSheet->PresetNameAndFamily( *aLst[ nIdx ] ); |
| mxStyleSheet->SetPhysical( sal_False ); |
| mxStyleSheet->FillStyleSheet( SwDocStyleSheet::FillOnlyName ); |
| |
| return mxStyleSheet.get(); |
| } |
| |
| SfxStyleSheetBase* SwStyleSheetIterator::First() |
| { |
| // Alte Liste loeschen |
| bFirstCalled = sal_True; |
| nLastPos = 0; |
| aLst.Erase(); |
| |
| // aktuellen loeschen |
| mxIterSheet->Reset(); |
| |
| SwDoc& rDoc = ((SwDocStyleSheetPool*)pBasePool)->GetDoc(); |
| const sal_uInt16 nSrchMask = nMask; |
| const sal_Bool bIsSearchUsed = SearchUsed(); |
| |
| const sal_Bool bOrganizer = ((SwDocStyleSheetPool*)pBasePool)->IsOrganizerMode(); |
| |
| if( nSearchFamily == SFX_STYLE_FAMILY_CHAR |
| || nSearchFamily == SFX_STYLE_FAMILY_ALL ) |
| { |
| const sal_uInt16 nArrLen = rDoc.GetCharFmts()->Count(); |
| for( sal_uInt16 i = 0; i < nArrLen; i++ ) |
| { |
| SwCharFmt* pFmt = (*rDoc.GetCharFmts())[ i ]; |
| if( pFmt->IsDefault() && pFmt != rDoc.GetDfltCharFmt() ) |
| continue; |
| |
| const sal_Bool bUsed = bIsSearchUsed && (bOrganizer || rDoc.IsUsed(*pFmt)); |
| if( !bUsed ) |
| { |
| // Standard ist keine Benutzervorlage #46181# |
| const sal_uInt16 nId = rDoc.GetDfltCharFmt() == pFmt ? |
| sal_uInt16( RES_POOLCHR_INET_NORMAL ): |
| pFmt->GetPoolFmtId(); |
| if( (nSrchMask & ~SFXSTYLEBIT_USED) == SFXSTYLEBIT_USERDEF |
| ? !(nId & USER_FMT) |
| // benutzte gesucht und keine gefunden |
| : bIsSearchUsed ) |
| continue; |
| |
| if( rDoc.get(IDocumentSettingAccess::HTML_MODE) && !(nId & USER_FMT) && |
| !( RES_POOLCHR_HTML_BEGIN <= nId && |
| nId < RES_POOLCHR_HTML_END ) && |
| RES_POOLCHR_INET_NORMAL != nId && |
| RES_POOLCHR_INET_VISIT != nId && |
| RES_POOLCHR_FOOTNOTE != nId && |
| RES_POOLCHR_ENDNOTE != nId ) |
| continue; |
| } |
| |
| aLst.Append( cCHAR, pFmt == rDoc.GetDfltCharFmt() |
| ? (const String&) *SwStyleNameMapper::GetTextUINameArray()[ RES_POOLCOLL_STANDARD - |
| RES_POOLCOLL_TEXT_BEGIN ] |
| : pFmt->GetName() ); |
| } |
| |
| // PoolFormate |
| // |
| if( nSrchMask == SFXSTYLEBIT_ALL ) |
| { |
| if( !rDoc.get(IDocumentSettingAccess::HTML_MODE) ) |
| AppendStyleList(SwStyleNameMapper::GetChrFmtUINameArray(), |
| bIsSearchUsed, nsSwGetPoolIdFromName::GET_POOLID_CHRFMT, cCHAR); |
| else |
| { |
| aLst.Append( cCHAR, *SwStyleNameMapper::GetChrFmtUINameArray()[ |
| RES_POOLCHR_INET_NORMAL - RES_POOLCHR_BEGIN ] ); |
| aLst.Append( cCHAR, *SwStyleNameMapper::GetChrFmtUINameArray()[ |
| RES_POOLCHR_INET_VISIT - RES_POOLCHR_BEGIN ] ); |
| aLst.Append( cCHAR, *SwStyleNameMapper::GetChrFmtUINameArray()[ |
| RES_POOLCHR_ENDNOTE - RES_POOLCHR_BEGIN ] ); |
| aLst.Append( cCHAR, *SwStyleNameMapper::GetChrFmtUINameArray()[ |
| RES_POOLCHR_FOOTNOTE - RES_POOLCHR_BEGIN ] ); |
| } |
| AppendStyleList(SwStyleNameMapper::GetHTMLChrFmtUINameArray(), |
| bIsSearchUsed, nsSwGetPoolIdFromName::GET_POOLID_CHRFMT, cCHAR); |
| } |
| } |
| |
| if( nSearchFamily == SFX_STYLE_FAMILY_PARA || |
| nSearchFamily == SFX_STYLE_FAMILY_ALL ) |
| { |
| sal_uInt16 nSMask = nSrchMask; |
| if( rDoc.get(IDocumentSettingAccess::HTML_MODE) ) |
| { |
| // dann sind nur HTML-Vorlagen von Interesse |
| if( USHRT_MAX == nSMask ) |
| nSMask = SWSTYLEBIT_HTML | SFXSTYLEBIT_USERDEF | |
| SFXSTYLEBIT_USED; |
| else |
| nSMask &= SFXSTYLEBIT_USED | SFXSTYLEBIT_USERDEF | |
| SWSTYLEBIT_CONDCOLL | SWSTYLEBIT_HTML; |
| if( !nSMask ) |
| nSMask = SWSTYLEBIT_HTML; |
| } |
| |
| const sal_uInt16 nArrLen = rDoc.GetTxtFmtColls()->Count(); |
| for( sal_uInt16 i = 0; i < nArrLen; i++ ) |
| { |
| SwTxtFmtColl* pColl = (*rDoc.GetTxtFmtColls())[ i ]; |
| |
| if(pColl->IsDefault()) |
| continue; |
| |
| const sal_Bool bUsed = bOrganizer || rDoc.IsUsed(*pColl); |
| if( !(bIsSearchUsed && bUsed )) |
| { |
| const sal_uInt16 nId = pColl->GetPoolFmtId(); |
| switch ( (nSMask & ~SFXSTYLEBIT_USED) ) |
| { |
| case SFXSTYLEBIT_USERDEF: |
| if(!IsPoolUserFmt(nId)) continue; |
| break; |
| case SWSTYLEBIT_TEXT: |
| if((nId & COLL_GET_RANGE_BITS) != COLL_TEXT_BITS) continue; |
| break; |
| case SWSTYLEBIT_CHAPTER: |
| if((nId & COLL_GET_RANGE_BITS) != COLL_DOC_BITS) continue; |
| break; |
| case SWSTYLEBIT_LIST: |
| if((nId & COLL_GET_RANGE_BITS) != COLL_LISTS_BITS) continue; |
| break; |
| case SWSTYLEBIT_IDX: |
| if((nId & COLL_GET_RANGE_BITS) != COLL_REGISTER_BITS) continue; |
| break; |
| case SWSTYLEBIT_EXTRA: |
| if((nId & COLL_GET_RANGE_BITS) != COLL_EXTRA_BITS) continue; |
| break; |
| |
| case SWSTYLEBIT_HTML | SFXSTYLEBIT_USERDEF: |
| if(IsPoolUserFmt(nId)) |
| break; |
| // ansonten weiter |
| case SWSTYLEBIT_HTML: |
| if( (nId & COLL_GET_RANGE_BITS) != COLL_HTML_BITS) |
| { |
| // einige wollen wir aber auch in dieser Section sehen |
| sal_Bool bWeiter = sal_True; |
| switch( nId ) |
| { |
| case RES_POOLCOLL_SENDADRESS: // --> ADDRESS |
| case RES_POOLCOLL_TABLE_HDLN: // --> TH |
| case RES_POOLCOLL_TABLE: // --> TD |
| case RES_POOLCOLL_TEXT: // --> P |
| case RES_POOLCOLL_HEADLINE_BASE:// --> H |
| case RES_POOLCOLL_HEADLINE1: // --> H1 |
| case RES_POOLCOLL_HEADLINE2: // --> H2 |
| case RES_POOLCOLL_HEADLINE3: // --> H3 |
| case RES_POOLCOLL_HEADLINE4: // --> H4 |
| case RES_POOLCOLL_HEADLINE5: // --> H5 |
| case RES_POOLCOLL_HEADLINE6: // --> H6 |
| case RES_POOLCOLL_STANDARD: // --> P |
| case RES_POOLCOLL_FOOTNOTE: |
| case RES_POOLCOLL_ENDNOTE: |
| bWeiter = sal_False; |
| break; |
| } |
| if( bWeiter ) |
| continue; |
| } |
| break; |
| case SWSTYLEBIT_CONDCOLL: |
| if( RES_CONDTXTFMTCOLL != pColl->Which() ) continue; |
| break; |
| default: |
| // benutzte gesucht und keine gefunden |
| if( bIsSearchUsed ) |
| continue; |
| } |
| } |
| aLst.Append( cPARA, pColl->GetName() ); |
| } |
| |
| const sal_Bool bAll = nSMask == SFXSTYLEBIT_ALL; |
| if ( bAll || (nSMask & ~SFXSTYLEBIT_USED) == SWSTYLEBIT_TEXT ) |
| AppendStyleList(SwStyleNameMapper::GetTextUINameArray(), |
| bIsSearchUsed, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL, cPARA ); |
| if ( bAll || (nSMask & ~SFXSTYLEBIT_USED) == SWSTYLEBIT_CHAPTER ) |
| AppendStyleList(SwStyleNameMapper::GetDocUINameArray(), |
| bIsSearchUsed, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL, cPARA ) ; |
| if ( bAll || (nSMask & ~SFXSTYLEBIT_USED) == SWSTYLEBIT_LIST ) |
| AppendStyleList(SwStyleNameMapper::GetListsUINameArray(), |
| bIsSearchUsed, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL, cPARA ) ; |
| if ( bAll || (nSMask & ~SFXSTYLEBIT_USED) == SWSTYLEBIT_IDX ) |
| AppendStyleList(SwStyleNameMapper::GetRegisterUINameArray(), |
| bIsSearchUsed, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL, cPARA ) ; |
| if ( bAll || (nSMask & ~SFXSTYLEBIT_USED) == SWSTYLEBIT_EXTRA ) |
| AppendStyleList(SwStyleNameMapper::GetExtraUINameArray(), |
| bIsSearchUsed, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL, cPARA ) ; |
| if ( bAll || (nSMask & ~SFXSTYLEBIT_USED) == SWSTYLEBIT_CONDCOLL ) |
| { |
| if( !bIsSearchUsed || |
| rDoc.IsPoolTxtCollUsed( RES_POOLCOLL_TEXT )) |
| aLst.Append( cPARA, *SwStyleNameMapper::GetTextUINameArray()[ |
| RES_POOLCOLL_TEXT - RES_POOLCOLL_TEXT_BEGIN ] ); |
| } |
| if ( bAll || |
| (nSMask & ~SFXSTYLEBIT_USED) == SWSTYLEBIT_HTML || |
| (nSMask & ~SFXSTYLEBIT_USED) == |
| (SWSTYLEBIT_HTML | SFXSTYLEBIT_USERDEF) ) |
| { |
| AppendStyleList(SwStyleNameMapper::GetHTMLUINameArray(), |
| bIsSearchUsed, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL, cPARA ) ; |
| if( !bAll ) |
| { |
| // dann auch die, die wir mappen: |
| static sal_uInt16 aPoolIds[] = { |
| RES_POOLCOLL_SENDADRESS, // --> ADDRESS |
| RES_POOLCOLL_TABLE_HDLN, // --> TH |
| RES_POOLCOLL_TABLE, // --> TD |
| RES_POOLCOLL_STANDARD, // --> P |
| RES_POOLCOLL_TEXT, // --> P |
| RES_POOLCOLL_HEADLINE_BASE, // --> H |
| RES_POOLCOLL_HEADLINE1, // --> H1 |
| RES_POOLCOLL_HEADLINE2, // --> H2 |
| RES_POOLCOLL_HEADLINE3, // --> H3 |
| RES_POOLCOLL_HEADLINE4, // --> H4 |
| RES_POOLCOLL_HEADLINE5, // --> H5 |
| RES_POOLCOLL_HEADLINE6, // --> H6 |
| RES_POOLCOLL_FOOTNOTE, |
| RES_POOLCOLL_ENDNOTE, |
| 0 |
| }; |
| |
| sal_uInt16* pPoolIds = aPoolIds; |
| String s; |
| while( *pPoolIds ) |
| { |
| if( !bIsSearchUsed || rDoc.IsPoolTxtCollUsed( *pPoolIds ) ) |
| aLst.Append( cPARA, |
| s = SwStyleNameMapper::GetUIName( *pPoolIds, s )); |
| ++pPoolIds; |
| } |
| } |
| } |
| } |
| |
| if( nSearchFamily == SFX_STYLE_FAMILY_FRAME || |
| nSearchFamily == SFX_STYLE_FAMILY_ALL ) |
| { |
| const sal_uInt16 nArrLen = rDoc.GetFrmFmts()->Count(); |
| for( sal_uInt16 i = 0; i < nArrLen; i++ ) |
| { |
| SwFrmFmt* pFmt = (*rDoc.GetFrmFmts())[ i ]; |
| |
| if(pFmt->IsDefault() || pFmt->IsAuto()) |
| { |
| continue; |
| } |
| |
| const sal_uInt16 nId = pFmt->GetPoolFmtId(); |
| sal_Bool bUsed = bIsSearchUsed && ( bOrganizer || rDoc.IsUsed(*pFmt)); |
| if( !bUsed ) |
| { |
| if( (nSrchMask & ~SFXSTYLEBIT_USED) == SFXSTYLEBIT_USERDEF |
| ? !(nId & USER_FMT) |
| // benutzte gesucht und keine gefunden |
| : bIsSearchUsed ) |
| { |
| continue; |
| } |
| } |
| |
| aLst.Append( cFRAME, pFmt->GetName() ); |
| } |
| |
| // PoolFormate |
| // |
| if ( nSrchMask == SFXSTYLEBIT_ALL ) |
| AppendStyleList(SwStyleNameMapper::GetFrmFmtUINameArray(), |
| bIsSearchUsed, nsSwGetPoolIdFromName::GET_POOLID_FRMFMT, cFRAME); |
| } |
| |
| if( nSearchFamily == SFX_STYLE_FAMILY_PAGE || |
| nSearchFamily == SFX_STYLE_FAMILY_ALL ) |
| { |
| const sal_uInt16 nCount = rDoc.GetPageDescCnt(); |
| for(sal_uInt16 i = 0; i < nCount; ++i) |
| { |
| const SwPageDesc& rDesc = |
| const_cast<const SwDoc &>(rDoc).GetPageDesc(i); |
| const sal_uInt16 nId = rDesc.GetPoolFmtId(); |
| sal_Bool bUsed = bIsSearchUsed && ( bOrganizer || rDoc.IsUsed(rDesc)); |
| if( !bUsed ) |
| { |
| if( (nSrchMask & ~SFXSTYLEBIT_USED) == SFXSTYLEBIT_USERDEF |
| ? !(nId & USER_FMT) |
| // benutzte gesucht und keine gefunden |
| : bIsSearchUsed ) |
| continue; |
| } |
| |
| aLst.Append( cPAGE, rDesc.GetName() ); |
| } |
| if ( nSrchMask == SFXSTYLEBIT_ALL ) |
| AppendStyleList(SwStyleNameMapper::GetPageDescUINameArray(), |
| bIsSearchUsed, nsSwGetPoolIdFromName::GET_POOLID_PAGEDESC, cPAGE); |
| } |
| |
| if( nSearchFamily == SFX_STYLE_FAMILY_PSEUDO || |
| nSearchFamily == SFX_STYLE_FAMILY_ALL ) |
| { |
| const SwNumRuleTbl& rNumTbl = rDoc.GetNumRuleTbl(); |
| for(sal_uInt16 i = 0; i < rNumTbl.Count(); ++i) |
| { |
| const SwNumRule& rRule = *rNumTbl[ i ]; |
| if( !rRule.IsAutoRule() ) |
| { |
| sal_Bool bUsed = bIsSearchUsed && ( bOrganizer || rDoc.IsUsed(rRule) ); |
| if( !bUsed ) |
| { |
| if( (nSrchMask & ~SFXSTYLEBIT_USED) == SFXSTYLEBIT_USERDEF |
| ? !(rRule.GetPoolFmtId() & USER_FMT) |
| // benutzte gesucht und keine gefunden |
| : bIsSearchUsed ) |
| continue; |
| } |
| |
| aLst.Append( cNUMRULE, rRule.GetName() ); |
| } |
| } |
| if ( nSrchMask == SFXSTYLEBIT_ALL ) |
| AppendStyleList(SwStyleNameMapper::GetNumRuleUINameArray(), |
| bIsSearchUsed, nsSwGetPoolIdFromName::GET_POOLID_NUMRULE, cNUMRULE); |
| } |
| |
| if(aLst.Count() > 0) |
| { |
| nLastPos = USHRT_MAX; |
| return Next(); |
| } |
| return 0; |
| } |
| |
| SfxStyleSheetBase* SwStyleSheetIterator::Next() |
| { |
| nLastPos++; |
| if(aLst.Count() > 0 && nLastPos < aLst.Count()) |
| { |
| mxIterSheet->PresetNameAndFamily(*aLst[nLastPos]); |
| mxIterSheet->SetPhysical( sal_False ); |
| mxIterSheet->SetMask( nMask ); |
| if(mxIterSheet->pSet) |
| { |
| mxIterSheet->pSet->ClearItem(0); |
| mxIterSheet->pSet= 0; |
| } |
| return mxIterSheet.get(); |
| } |
| return 0; |
| } |
| |
| SfxStyleSheetBase* SwStyleSheetIterator::Find( const UniString& rName ) |
| { |
| // suchen |
| if( !bFirstCalled ) |
| First(); |
| |
| nLastPos = lcl_FindName( aLst, nSearchFamily, rName ); |
| if( USHRT_MAX != nLastPos ) |
| { |
| // gefunden |
| mxStyleSheet->PresetNameAndFamily(*aLst[nLastPos]); |
| // neuer Name gesetzt, also bestimme seine Daten |
| mxStyleSheet->FillStyleSheet( SwDocStyleSheet::FillOnlyName ); |
| if( !mxStyleSheet->IsPhysical() ) |
| mxStyleSheet->SetPhysical( sal_False ); |
| |
| return mxStyleSheet.get(); |
| } |
| return 0; |
| } |
| |
| void SwStyleSheetIterator::AppendStyleList(const SvStringsDtor& rList, |
| sal_Bool bTestUsed, |
| sal_uInt16 nSection, char cType ) |
| { |
| if( bTestUsed ) |
| { |
| SwDoc& rDoc = ((SwDocStyleSheetPool*)pBasePool)->GetDoc(); |
| for ( sal_uInt16 i=0; i < rList.Count(); ++i ) |
| { |
| sal_Bool bUsed = sal_False; |
| sal_uInt16 nId = SwStyleNameMapper::GetPoolIdFromUIName(*rList[i], (SwGetPoolIdFromName)nSection); |
| switch ( nSection ) |
| { |
| case nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL: |
| bUsed = rDoc.IsPoolTxtCollUsed( nId ); |
| break; |
| case nsSwGetPoolIdFromName::GET_POOLID_CHRFMT: |
| bUsed = rDoc.IsPoolFmtUsed( nId ); |
| break; |
| case nsSwGetPoolIdFromName::GET_POOLID_FRMFMT: |
| bUsed = rDoc.IsPoolFmtUsed( nId ); |
| case nsSwGetPoolIdFromName::GET_POOLID_PAGEDESC: |
| bUsed = rDoc.IsPoolPageDescUsed( nId ); |
| break; |
| default: |
| ASSERT( !this, "unknown PoolFmt-Id" ); |
| } |
| if ( bUsed ) |
| aLst.Append( cType, *rList[i] ); |
| } |
| } |
| else |
| for ( sal_uInt16 i=0; i < rList.Count(); ++i ) |
| aLst.Append( cType, *rList[i] ); |
| } |
| |
| void SwStyleSheetIterator::Notify( SfxBroadcaster&, const SfxHint& rHint ) |
| { |
| // suchen und aus der Anzeige-Liste entfernen !! |
| if( rHint.ISA( SfxStyleSheetHint ) && |
| SFX_STYLESHEET_ERASED == ((SfxStyleSheetHint&) rHint).GetHint() ) |
| { |
| SfxStyleSheetBase* pStyle = ((SfxStyleSheetHint&)rHint).GetStyleSheet(); |
| |
| if (pStyle) |
| { |
| sal_uInt16 nTmpPos = lcl_FindName( aLst, pStyle->GetFamily(), |
| pStyle->GetName() ); |
| if( nTmpPos < aLst.Count() ) |
| aLst.DeleteAndDestroy( nTmpPos ); |
| } |
| } |
| } |
| |
| |