/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_sw.hxx" #include #include #include #include #ifndef _SFX_INIMGR_HXX #endif #include #include #include #include #include #include // Leerstring #include #include #include #include #include #include using namespace ::com::sun::star; #define VERSION_30B ((sal_uInt16)250) #define VERSION_31B ((sal_uInt16)326) #define VERSION_40A ((sal_uInt16)364) #define VERSION_50A ((sal_uInt16)373) #define VERSION_53A ((sal_uInt16)596) #define ACT_NUM_VERSION VERSION_53A #define NUMRULE_FILENAME "numrule.cfg" #define CHAPTER_FILENAME "chapter.cfg" /*------------------------------------------------------------------------ Beschreibung: Ops. zum Laden / Speichern ------------------------------------------------------------------------*/ SV_IMPL_PTRARR( _SwNumFmtsAttrs, SfxPoolItem* ) // SwNumRulesWithName ---------------------------------------------------- // PUBLIC METHODES ------------------------------------------------------- /*------------------------------------------------------------------------ Beschreibung: Speichern einer Regel Parameter: rCopy -- die zu speichernde Regel nIdx -- Position, an der die Regel zu speichern ist. Eine alte Regel an dieser Position wird ueberschrieben. ------------------------------------------------------------------------*/ SwBaseNumRules::SwBaseNumRules( const String& rFileName ) : sFileName( rFileName ), nVersion(0), bModified( sal_False ) { Init(); } /*-----------------26.06.97 08.30------------------- --------------------------------------------------*/ SwBaseNumRules::~SwBaseNumRules() { if( bModified ) { SvtPathOptions aPathOpt; String sNm( aPathOpt.GetUserConfigPath() ); sNm += INET_PATH_TOKEN; sNm += sFileName; INetURLObject aTempObj(sNm); sNm = aTempObj.GetFull(); SfxMedium aStrm( sNm, STREAM_WRITE | STREAM_TRUNC | STREAM_SHARE_DENYALL, sal_True ); Store( *aStrm.GetOutStream() ); } for( sal_uInt16 i = 0; i < nMaxRules; ++i ) delete pNumRules[i]; } /*------------------------------------------------------------------------ Beschreibung: ------------------------------------------------------------------------*/ void SwBaseNumRules::Init() { for(sal_uInt16 i = 0; i < nMaxRules; ++i ) pNumRules[i] = 0; String sNm( sFileName ); SvtPathOptions aOpt; if( aOpt.SearchFile( sNm, SvtPathOptions::PATH_USERCONFIG )) { SfxMedium aStrm( sNm, STREAM_STD_READ, sal_True ); Load( *aStrm.GetInStream() ); } } /*-----------------26.06.97 08.30------------------- --------------------------------------------------*/ void SwBaseNumRules::ApplyNumRules(const SwNumRulesWithName &rCopy, sal_uInt16 nIdx) { ASSERT(nIdx < nMaxRules, Array der NumRules ueberindiziert.); if( !pNumRules[nIdx] ) pNumRules[nIdx] = new SwNumRulesWithName( rCopy ); else *pNumRules[nIdx] = rCopy; } // PROTECTED METHODES ---------------------------------------------------- /*------------------------------------------------------------------------ Beschreibung: Speichern ------------------------------------------------------------------------*/ sal_Bool /**/ SwBaseNumRules::Store(SvStream &rStream) { rStream << ACT_NUM_VERSION; // Schreiben, welche Positionen durch eine Regel belegt sind // Anschliessend Schreiben der einzelnen Rules for(sal_uInt16 i = 0; i < nMaxRules; ++i) { if(pNumRules[i]) { rStream << (unsigned char) sal_True; pNumRules[i]->Store( rStream ); } else rStream << (unsigned char) sal_False; } return sal_True; } /*------------------------------------------------------------------------ Beschreibung: Speichern / Laden ------------------------------------------------------------------------*/ int SwBaseNumRules::Load(SvStream &rStream) { int rc = 0; rStream >> nVersion; // wegen eines kleinen aber schweren Fehlers schreibt die PreFinal die // gleiche VERSION_40A wie das SP2 #55402# if(VERSION_40A == nVersion) { DBG_ERROR("Version 364 ist nicht eindeutig #55402#"); } else if( VERSION_30B == nVersion || VERSION_31B == nVersion || ACT_NUM_VERSION >= nVersion ) { unsigned char bRule = sal_False; for(sal_uInt16 i = 0; i < nMaxRules; ++i) { rStream >> bRule; if(bRule) pNumRules[i] = new SwNumRulesWithName( rStream, nVersion ); } } else { rc = 1; } return rc; } /*-----------------26.06.97 08.34------------------- --------------------------------------------------*/ /*------------------------------------------------------------------------*/ SwChapterNumRules::SwChapterNumRules() : SwBaseNumRules(C2S(CHAPTER_FILENAME)) { } /*------------------------------------------------------------------------*/ SwChapterNumRules::~SwChapterNumRules() { } /*-----------------26.06.97 08.23------------------- --------------------------------------------------*/ void SwChapterNumRules::ApplyNumRules(const SwNumRulesWithName &rCopy, sal_uInt16 nIdx) { bModified = sal_True; SwBaseNumRules::ApplyNumRules(rCopy, nIdx); } /*------------------------------------------------------------------------*/ SwNumRulesWithName::SwNumRulesWithName( const SwNumRule &rCopy, const String &rName ) : aName(rName) { for( sal_uInt16 n = 0; n < MAXLEVEL; ++n ) { const SwNumFmt* pFmt = rCopy.GetNumFmt( n ); if( pFmt ) aFmts[ n ] = new _SwNumFmtGlobal( *pFmt ); else aFmts[ n ] = 0; } } /*------------------------------------------------------------------------ Beschreibung: ------------------------------------------------------------------------*/ SwNumRulesWithName::SwNumRulesWithName( const SwNumRulesWithName& rCopy ) { memset( aFmts, 0, sizeof( aFmts )); *this = rCopy; } /*------------------------------------------------------------------------ Beschreibung: ------------------------------------------------------------------------*/ SwNumRulesWithName::~SwNumRulesWithName() { for( int n = 0; n < MAXLEVEL; ++n ) delete aFmts[ n ]; } /*------------------------------------------------------------------------ Beschreibung: ------------------------------------------------------------------------*/ const SwNumRulesWithName& SwNumRulesWithName::operator=(const SwNumRulesWithName &rCopy) { if( this != &rCopy ) { aName = rCopy.aName; for( int n = 0; n < MAXLEVEL; ++n ) { delete aFmts[ n ]; _SwNumFmtGlobal* pFmt = rCopy.aFmts[ n ]; if( pFmt ) aFmts[ n ] = new _SwNumFmtGlobal( *pFmt ); else aFmts[ n ] = 0; } } return *this; } /*------------------------------------------------------------------------ Beschreibung: ------------------------------------------------------------------------*/ SwNumRulesWithName::SwNumRulesWithName( SvStream &rStream, sal_uInt16 nVersion ) { CharSet eEncoding = gsl_getSystemTextEncoding(); rStream.ReadByteString(aName, eEncoding); char c; for(sal_uInt16 n = 0; n < MAXLEVEL; ++n ) { if( VERSION_30B == nVersion ) c = 1; // wegen eines kleinen aber schweren Fehlers schreibt die PreFinal die // gleiche VERSION_40A wie das SP2 #55402# else if(nVersion < VERSION_40A && n > 5) // else if(nVersion < VERSION_50A && n > 5) c = 0; else rStream >> c; if( c ) aFmts[ n ] = new _SwNumFmtGlobal( rStream, nVersion ); else aFmts[ n ] = 0; } } /*------------------------------------------------------------------------ Beschreibung: ------------------------------------------------------------------------*/ void SwNumRulesWithName::MakeNumRule( SwWrtShell& rSh, SwNumRule& rChg ) const { // --> OD 2008-02-11 #newlistlevelattrs# // --> OD 2008-06-06 #i89178# rChg = SwNumRule( aName, numfunc::GetDefaultPositionAndSpaceMode() ); // <-- rChg.SetAutoRule( sal_False ); _SwNumFmtGlobal* pFmt; for( sal_uInt16 n = 0; n < MAXLEVEL; ++n ) if( 0 != ( pFmt = aFmts[ n ] ) ) { SwNumFmt aNew; pFmt->ChgNumFmt( rSh, aNew ); rChg.Set( n, aNew ); } } /*------------------------------------------------------------------------ Beschreibung: ------------------------------------------------------------------------*/ void SwNumRulesWithName::Store( SvStream &rStream ) { CharSet eEncoding = gsl_getSystemTextEncoding(); rStream.WriteByteString(aName, eEncoding); for( sal_uInt16 n = 0; n < MAXLEVEL; ++n ) { _SwNumFmtGlobal* pFmt = aFmts[ n ]; if( pFmt ) { rStream << (char)1; pFmt->Store( rStream ); } else rStream << (char)0; } } /*------------------------------------------------------------------------ Beschreibung: ------------------------------------------------------------------------*/ SwNumRulesWithName::_SwNumFmtGlobal::_SwNumFmtGlobal( const SwNumFmt& rFmt ) : aFmt( rFmt ), nCharPoolId( USHRT_MAX ) { // relative Abstaende ????? SwCharFmt* pFmt = rFmt.GetCharFmt(); if( pFmt ) { sCharFmtName = pFmt->GetName(); nCharPoolId = pFmt->GetPoolFmtId(); if( pFmt->GetAttrSet().Count() ) { SfxItemIter aIter( pFmt->GetAttrSet() ); const SfxPoolItem *pCurr = aIter.GetCurItem(); while( sal_True ) { aItems.Insert( pCurr->Clone(), aItems.Count() ); if( aIter.IsAtEnd() ) break; pCurr = aIter.NextItem(); } } aFmt.SetCharFmt( 0 ); } } /*------------------------------------------------------------------------ Beschreibung: ------------------------------------------------------------------------*/ SwNumRulesWithName::_SwNumFmtGlobal::_SwNumFmtGlobal( const _SwNumFmtGlobal& rFmt ) : aFmt( rFmt.aFmt ), sCharFmtName( rFmt.sCharFmtName ), nCharPoolId( rFmt.nCharPoolId ) { for( sal_uInt16 n = rFmt.aItems.Count(); n; ) aItems.Insert( rFmt.aItems[ --n ]->Clone(), aItems.Count() ); } /*------------------------------------------------------------------------ Beschreibung: ------------------------------------------------------------------------*/ SwNumRulesWithName::_SwNumFmtGlobal::_SwNumFmtGlobal( SvStream& rStream, sal_uInt16 nVersion ) : nCharPoolId( USHRT_MAX ) { CharSet eEncoding = gsl_getSystemTextEncoding(); { sal_uInt16 nUS; sal_Char cChar; short nShort; sal_Bool bFlag; String sStr; rStream >> nUS; aFmt.SetNumberingType((sal_Int16)nUS ); if( VERSION_53A > nVersion ) { rStream >> cChar; aFmt.SetBulletChar( cChar ); } else { rStream >> nUS; aFmt.SetBulletChar( nUS ); } rStream >> bFlag; aFmt.SetIncludeUpperLevels( bFlag ); if( VERSION_30B == nVersion ) { long nL; rStream >> cChar; aFmt.SetStart( (sal_uInt16)cChar ); rStream.ReadByteString(sStr, eEncoding); aFmt.SetPrefix( sStr ); rStream.ReadByteString(sStr, eEncoding); aFmt.SetSuffix( sStr ); rStream >> nUS; aFmt.SetNumAdjust( SvxAdjust( nUS ) ); rStream >> nL; aFmt.SetLSpace( lNumIndent ); rStream >> nL; aFmt.SetFirstLineOffset( (short)nL ); } else // alter StartWert war ein Byte { rStream >> nUS; aFmt.SetStart( nUS ); rStream.ReadByteString(sStr, eEncoding); aFmt.SetPrefix( sStr ); rStream.ReadByteString(sStr, eEncoding); aFmt.SetSuffix( sStr ); rStream >> nUS; aFmt.SetNumAdjust( SvxAdjust( nUS ) ); rStream >> nUS; aFmt.SetAbsLSpace( nUS ); rStream >> nShort; aFmt.SetFirstLineOffset( nShort ); rStream >> nUS; aFmt.SetCharTextDistance( nUS ); rStream >> nShort; aFmt.SetLSpace( nShort ); rStream >> bFlag; } sal_uInt16 nFamily; sal_uInt16 nCharSet; short nWidth; short nHeight; sal_uInt16 nPitch; String aName; rStream.ReadByteString(aName, eEncoding); rStream >> nFamily >> nCharSet >> nWidth >> nHeight >> nPitch; if( aName.Len() ) { Font aFont( nFamily, Size( nWidth, nHeight ) ); aFont.SetName( aName ); aFont.SetCharSet( (CharSet)nCharSet ); aFont.SetPitch( (FontPitch)nPitch ); aFmt.SetBulletFont( &aFont ); } else nCharSet = RTL_TEXTENCODING_SYMBOL; if( VERSION_53A > nVersion ) aFmt.SetBulletChar( ByteString::ConvertToUnicode( sal_Char(aFmt.GetBulletChar()), nCharSet )); } if( VERSION_30B != nVersion ) { sal_uInt16 nItemCount; rStream >> nCharPoolId; rStream.ReadByteString(sCharFmtName, eEncoding); rStream >> nItemCount; while( nItemCount-- ) { sal_uInt16 nWhich, nVers; rStream >> nWhich >> nVers; aItems.Insert( GetDfltAttr( nWhich )->Create( rStream, nVers ), aItems.Count() ); } } if( VERSION_40A == nVersion && SVX_NUM_BITMAP == aFmt.GetNumberingType() ) { sal_uInt8 cF; Size aSz; rStream >> aSz.Width() >> aSz.Height(); rStream >> cF; if( cF ) { SvxBrushItem* pBrush = 0; SwFmtVertOrient* pVOrient = 0; sal_uInt16 nVer; if( cF & 1 ) { rStream >> nVer; pBrush = (SvxBrushItem*)GetDfltAttr( RES_BACKGROUND ) ->Create( rStream, nVer ); } if( cF & 2 ) { rStream >> nVer; pVOrient = (SwFmtVertOrient*)GetDfltAttr( RES_VERT_ORIENT ) ->Create( rStream, nVer ); } sal_Int16 eOrient = text::VertOrientation::NONE; if(pVOrient) eOrient = (sal_Int16)pVOrient->GetVertOrient(); aFmt.SetGraphicBrush( pBrush, &aSz, pVOrient ? &eOrient : 0 ); } } } /*------------------------------------------------------------------------ Beschreibung: ------------------------------------------------------------------------*/ SwNumRulesWithName::_SwNumFmtGlobal::~_SwNumFmtGlobal() { } /*------------------------------------------------------------------------ Beschreibung: ------------------------------------------------------------------------*/ void SwNumRulesWithName::_SwNumFmtGlobal::Store( SvStream& rStream ) { CharSet eEncoding = gsl_getSystemTextEncoding(); { String aName; sal_uInt16 nFamily = FAMILY_DONTKNOW, nCharSet = 0, nPitch = 0; short nWidth = 0, nHeight = 0; const Font* pFnt = aFmt.GetBulletFont(); if( pFnt ) { aName = pFnt->GetName(); nFamily = (sal_uInt16)pFnt->GetFamily(); nCharSet = (sal_uInt16)pFnt->GetCharSet(); nWidth = (short)pFnt->GetSize().Width(); nHeight = (short)pFnt->GetSize().Height(); nPitch = (sal_uInt16)pFnt->GetPitch(); } rStream << sal_uInt16(aFmt.GetNumberingType()) << aFmt.GetBulletChar() << (aFmt.GetIncludeUpperLevels() > 0) << aFmt.GetStart(); rStream.WriteByteString( aFmt.GetPrefix(), eEncoding ); rStream.WriteByteString( aFmt.GetSuffix(), eEncoding ); rStream << sal_uInt16( aFmt.GetNumAdjust() ) << aFmt.GetAbsLSpace() << aFmt.GetFirstLineOffset() << aFmt.GetCharTextDistance() << aFmt.GetLSpace() << sal_False;//aFmt.IsRelLSpace(); rStream.WriteByteString( aName, eEncoding ); rStream << nFamily << nCharSet << nWidth << nHeight << nPitch; } rStream << nCharPoolId; rStream.WriteByteString( sCharFmtName, eEncoding ); rStream << aItems.Count(); for( sal_uInt16 n = aItems.Count(); n; ) { SfxPoolItem* pItem = aItems[ --n ]; sal_uInt16 nIVers = pItem->GetVersion( SOFFICE_FILEFORMAT_50 ); ASSERT( nIVers != USHRT_MAX, "Was'n das: Item-Version USHRT_MAX in der aktuellen Version" ); rStream << pItem->Which() << nIVers; pItem->Store( rStream, nIVers ); } // Erweiterungen fuer Version 40A if( SVX_NUM_BITMAP == aFmt.GetNumberingType() ) { rStream << (sal_Int32)aFmt.GetGraphicSize().Width() << (sal_Int32)aFmt.GetGraphicSize().Height(); sal_uInt8 cFlg = ( 0 != aFmt.GetBrush() ? 1 : 0 ) + ( 0 != aFmt.GetGraphicOrientation() ? 2 : 0 ); rStream << cFlg; if( aFmt.GetBrush() ) { sal_uInt16 nVersion = aFmt.GetBrush()->GetVersion( SOFFICE_FILEFORMAT_50 ); rStream << nVersion; aFmt.GetBrush()->Store( rStream, nVersion ); } if( aFmt.GetGraphicOrientation() ) { sal_uInt16 nVersion = aFmt.GetGraphicOrientation()->GetVersion( SOFFICE_FILEFORMAT_50 ); rStream << nVersion; aFmt.GetGraphicOrientation()->Store( rStream, nVersion ); } } } /*------------------------------------------------------------------------ Beschreibung: ------------------------------------------------------------------------*/ void SwNumRulesWithName::_SwNumFmtGlobal::ChgNumFmt( SwWrtShell& rSh, SwNumFmt& rNew ) const { SwCharFmt* pFmt = 0; if( sCharFmtName.Len() ) { // suche erstmal ueber den Namen sal_uInt16 nArrLen = rSh.GetCharFmtCount(); for( sal_uInt16 i = 1; i < nArrLen; ++i ) { pFmt = &rSh.GetCharFmt( i ); if( COMPARE_EQUAL == pFmt->GetName().CompareTo( sCharFmtName )) // ist vorhanden, also belasse die Attribute wie sie sind! break; pFmt = 0; } if( !pFmt ) { if( IsPoolUserFmt( nCharPoolId ) ) { pFmt = rSh.MakeCharFmt( sCharFmtName ); pFmt->SetAuto( sal_False ); } else pFmt = rSh.GetCharFmtFromPool( nCharPoolId ); if( !pFmt->GetDepends() ) // Attribute setzen for( sal_uInt16 n = aItems.Count(); n; ) pFmt->SetFmtAttr( *aItems[ --n ] ); } } ((SwNumFmt&)aFmt).SetCharFmt( pFmt ); rNew = aFmt; if( pFmt ) ((SwNumFmt&)aFmt).SetCharFmt( 0 ); }