diff options
Diffstat (limited to 'sw/source/uibase/config/uinums.cxx')
-rw-r--r-- | sw/source/uibase/config/uinums.cxx | 562 |
1 files changed, 562 insertions, 0 deletions
diff --git a/sw/source/uibase/config/uinums.cxx b/sw/source/uibase/config/uinums.cxx new file mode 100644 index 000000000000..f6ea5cfecf44 --- /dev/null +++ b/sw/source/uibase/config/uinums.cxx @@ -0,0 +1,562 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * 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 . + */ + +#include <hintids.hxx> +#include <svl/urihelper.hxx> +#include <osl/thread.h> +#include <unotools/pathoptions.hxx> +#include <tools/stream.hxx> +#include <sfx2/docfile.hxx> +#include <svl/itemiter.hxx> +#include <editeng/brushitem.hxx> + +#include <tools/resid.hxx> +#include <fmtornt.hxx> +#include <swtypes.hxx> +#include <wrtsh.hxx> +#include <uinums.hxx> +#include <poolfmt.hxx> +#include <charfmt.hxx> +#include <frmatr.hxx> + +#include <unomid.h> + +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_53A ((sal_uInt16)596) +#define ACT_NUM_VERSION VERSION_53A + +#define CHAPTER_FILENAME "chapter.cfg" + +/* + Description: Saving a rule + Parameter: rCopy -- the rule to save + nIdx -- position, where the rule is to be saved. + An old rule at that position will be overwritten. +*/ + +SwBaseNumRules::SwBaseNumRules( const OUString& rFileName ) + : + sFileName( rFileName ), + nVersion(0), + bModified( false ) +{ + Init(); +} + +SwBaseNumRules::~SwBaseNumRules() +{ + if( bModified ) + { + SvtPathOptions aPathOpt; + OUString sNm( aPathOpt.GetUserConfigPath() + "/" + sFileName ); + INetURLObject aTempObj(sNm); + sNm = aTempObj.GetFull(); + SfxMedium aStrm( sNm, STREAM_WRITE | STREAM_TRUNC | + STREAM_SHARE_DENYALL ); + Store( *aStrm.GetOutStream() ); + } + + for( sal_uInt16 i = 0; i < nMaxRules; ++i ) + delete pNumRules[i]; +} + +void SwBaseNumRules::Init() +{ + for(sal_uInt16 i = 0; i < nMaxRules; ++i ) + pNumRules[i] = 0; + + OUString sNm( sFileName ); + SvtPathOptions aOpt; + if( aOpt.SearchFile( sNm, SvtPathOptions::PATH_USERCONFIG )) + { + SfxMedium aStrm( sNm, STREAM_STD_READ ); + Load( *aStrm.GetInStream() ); + } +} + +void SwBaseNumRules::ApplyNumRules(const SwNumRulesWithName &rCopy, sal_uInt16 nIdx) +{ + OSL_ENSURE(nIdx < nMaxRules, "Array der NumRules ueberindiziert."); + if( !pNumRules[nIdx] ) + pNumRules[nIdx] = new SwNumRulesWithName( rCopy ); + else + *pNumRules[nIdx] = rCopy; +} + +bool SwBaseNumRules::Store(SvStream &rStream) +{ + rStream.WriteUInt16( ACT_NUM_VERSION ); + // Write, what positions are occupied by a rule + // Then write each of the rules + for(sal_uInt16 i = 0; i < nMaxRules; ++i) + { + if(pNumRules[i]) + { + rStream.WriteUChar( (unsigned char) sal_True ); + pNumRules[i]->Store( rStream ); + } + else + rStream.WriteUChar( (unsigned char) sal_False ); + } + return true; +} + +int SwBaseNumRules::Load(SvStream &rStream) +{ + int rc = 0; + + rStream.ReadUInt16( nVersion ); + + // due to a small but serious mistake, PreFinal writes the same VERION_40A as SP2 + // #55402# + if(VERSION_40A == nVersion) + { + OSL_FAIL("Version 364 is not clear #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.ReadUChar( bRule ); + if(bRule) + pNumRules[i] = new SwNumRulesWithName( rStream, nVersion ); + } + } + else + { + rc = 1; + } + + return rc; +} + +SwChapterNumRules::SwChapterNumRules() : + SwBaseNumRules(OUString(CHAPTER_FILENAME)) +{ +} + + SwChapterNumRules::~SwChapterNumRules() +{ +} + +void SwChapterNumRules::ApplyNumRules(const SwNumRulesWithName &rCopy, sal_uInt16 nIdx) +{ + bModified = true; + SwBaseNumRules::ApplyNumRules(rCopy, nIdx); +} + +SwNumRulesWithName::SwNumRulesWithName( const SwNumRule &rCopy, + const OUString &rName ) + : maName(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; + } +} + +SwNumRulesWithName::SwNumRulesWithName( const SwNumRulesWithName& rCopy ) +{ + memset( aFmts, 0, sizeof( aFmts )); + *this = rCopy; +} + +SwNumRulesWithName::~SwNumRulesWithName() +{ + for( int n = 0; n < MAXLEVEL; ++n ) + delete aFmts[ n ]; +} + +const SwNumRulesWithName& SwNumRulesWithName::operator=(const SwNumRulesWithName &rCopy) +{ + if( this != &rCopy ) + { + maName = rCopy.maName; + 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; +} + +SwNumRulesWithName::SwNumRulesWithName( SvStream &rStream, sal_uInt16 nVersion ) +{ + rtl_TextEncoding eEncoding = osl_getThreadTextEncoding(); + maName = rStream.ReadUniOrByteString(eEncoding); + + char c; + for(sal_uInt16 n = 0; n < MAXLEVEL; ++n ) + { + if( VERSION_30B == nVersion ) + c = 1; + // due to a small but serious mistake, PreFinal writes the same VERION_40A as SP2 + // #55402# + else if(nVersion < VERSION_40A && n > 5) + c = 0; + else + rStream.ReadChar( c ); + + if( c ) + aFmts[ n ] = new _SwNumFmtGlobal( rStream, nVersion ); + else + aFmts[ n ] = 0; + } +} + +void SwNumRulesWithName::MakeNumRule( SwWrtShell& rSh, SwNumRule& rChg ) const +{ + // #i89178# + rChg = SwNumRule( maName, numfunc::GetDefaultPositionAndSpaceMode() ); + rChg.SetAutoRule( 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 ); + } +} + +void SwNumRulesWithName::Store( SvStream &rStream ) +{ + rtl_TextEncoding eEncoding = osl_getThreadTextEncoding(); + rStream.WriteUniOrByteString(maName, eEncoding); + + for( sal_uInt16 n = 0; n < MAXLEVEL; ++n ) + { + _SwNumFmtGlobal* pFmt = aFmts[ n ]; + if( pFmt ) + { + rStream.WriteChar( (char)1 ); + pFmt->Store( rStream ); + } + else + rStream.WriteChar( (char)0 ); + } +} + +SwNumRulesWithName::_SwNumFmtGlobal::_SwNumFmtGlobal( const SwNumFmt& rFmt ) + : aFmt( rFmt ), nCharPoolId( USHRT_MAX ) +{ + // relative gaps????? + + 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( true ) + { + aItems.push_back( pCurr->Clone() ); + if( aIter.IsAtEnd() ) + break; + pCurr = aIter.NextItem(); + } + } + + aFmt.SetCharFmt( 0 ); + } +} + +SwNumRulesWithName::_SwNumFmtGlobal::_SwNumFmtGlobal( const _SwNumFmtGlobal& rFmt ) + : + aFmt( rFmt.aFmt ), + sCharFmtName( rFmt.sCharFmtName ), + nCharPoolId( rFmt.nCharPoolId ) +{ + for( sal_uInt16 n = rFmt.aItems.size(); n; ) + aItems.push_back( rFmt.aItems[ --n ].Clone() ); +} + +SwNumRulesWithName::_SwNumFmtGlobal::_SwNumFmtGlobal( SvStream& rStream, + sal_uInt16 nVersion ) + : nCharPoolId( USHRT_MAX ) +{ + rtl_TextEncoding eEncoding = osl_getThreadTextEncoding(); + { + sal_uInt16 nUS; + short nShort; + sal_Char cChar; + bool bFlag; + OUString sStr; + + rStream.ReadUInt16( nUS ); aFmt.SetNumberingType((sal_Int16)nUS ); + if( VERSION_53A > nVersion ) + { + rStream.ReadChar( cChar ); aFmt.SetBulletChar( cChar ); + } + else + { + rStream.ReadUInt16( nUS ); aFmt.SetBulletChar( nUS ); + } + + rStream.ReadCharAsBool( bFlag ); aFmt.SetIncludeUpperLevels( bFlag ); + + if( VERSION_30B == nVersion ) + { + sal_Int32 nL; + rStream.ReadChar( cChar ); aFmt.SetStart( (sal_uInt16)cChar ); + + sStr = rStream.ReadUniOrByteString(eEncoding); + aFmt.SetPrefix( sStr ); + sStr = rStream.ReadUniOrByteString(eEncoding); + aFmt.SetSuffix( sStr ); + rStream.ReadUInt16( nUS ); aFmt.SetNumAdjust( SvxAdjust( nUS ) ); + rStream.ReadInt32( nL ); aFmt.SetLSpace( lNumIndent ); + rStream.ReadInt32( nL ); aFmt.SetFirstLineOffset( (short)nL ); + } + else // old start-value was a Byte + { + rStream.ReadUInt16( nUS ); aFmt.SetStart( nUS ); + sStr = rStream.ReadUniOrByteString(eEncoding); + aFmt.SetPrefix( sStr ); + sStr = rStream.ReadUniOrByteString(eEncoding); + aFmt.SetSuffix( sStr ); + rStream.ReadUInt16( nUS ); aFmt.SetNumAdjust( SvxAdjust( nUS ) ); + rStream.ReadUInt16( nUS ); aFmt.SetAbsLSpace( nUS ); + rStream.ReadInt16( nShort ); aFmt.SetFirstLineOffset( nShort ); + rStream.ReadUInt16( nUS ); aFmt.SetCharTextDistance( nUS ); + rStream.ReadInt16( nShort ); aFmt.SetLSpace( nShort ); + rStream.ReadCharAsBool( bFlag ); + } + + sal_uInt16 nFamily; + sal_uInt16 nCharSet; + short nWidth; + short nHeight; + sal_uInt16 nPitch; + OUString aName; + + aName = rStream.ReadUniOrByteString(eEncoding); + rStream.ReadUInt16( nFamily ).ReadUInt16( nCharSet ).ReadInt16( nWidth ).ReadInt16( nHeight ).ReadUInt16( nPitch ); + + if( !aName.isEmpty() ) + { + Font aFont( static_cast<FontFamily>(nFamily), Size( nWidth, nHeight ) ); + aFont.SetName( aName ); + aFont.SetCharSet( (rtl_TextEncoding)nCharSet ); + aFont.SetPitch( (FontPitch)nPitch ); + + aFmt.SetBulletFont( &aFont ); + } + else + nCharSet = RTL_TEXTENCODING_SYMBOL; + + if( VERSION_53A > nVersion ) + { + sal_Char cEncoded(aFmt.GetBulletChar()); + aFmt.SetBulletChar(OUString(&cEncoded, 1, nCharSet).toChar()); + } + } + + if( VERSION_30B != nVersion ) + { + sal_uInt16 nItemCount; + rStream.ReadUInt16( nCharPoolId ); + sCharFmtName = rStream.ReadUniOrByteString(eEncoding); + rStream.ReadUInt16( nItemCount ); + + while( nItemCount-- ) + { + sal_uInt16 nWhich, nVers; + rStream.ReadUInt16( nWhich ).ReadUInt16( nVers ); + aItems.push_back( GetDfltAttr( nWhich )->Create( rStream, nVers ) ); + } + } + + if( VERSION_40A == nVersion && SVX_NUM_BITMAP == aFmt.GetNumberingType() ) + { + sal_uInt8 cF; + sal_Int32 nWidth(0), nHeight(0); + + rStream.ReadInt32( nWidth ).ReadInt32( nHeight ); + + Size aSz(nWidth, nHeight); + + rStream.ReadUChar( cF ); + if( cF ) + { + SvxBrushItem* pBrush = 0; + SwFmtVertOrient* pVOrient = 0; + sal_uInt16 nVer; + + if( cF & 1 ) + { + rStream.ReadUInt16( nVer ); + pBrush = (SvxBrushItem*)GetDfltAttr( RES_BACKGROUND ) + ->Create( rStream, nVer ); + } + + if( cF & 2 ) + { + rStream.ReadUInt16( 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 ); + } + } +} + +SwNumRulesWithName::_SwNumFmtGlobal::~_SwNumFmtGlobal() +{ +} + +void SwNumRulesWithName::_SwNumFmtGlobal::Store( SvStream& rStream ) +{ + rtl_TextEncoding eEncoding = osl_getThreadTextEncoding(); + { + OUString 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.WriteUInt16( sal_uInt16(aFmt.GetNumberingType()) ) + .WriteUInt16( aFmt.GetBulletChar() ) + .WriteUChar( aFmt.GetIncludeUpperLevels() > 0 ) + .WriteUInt16( aFmt.GetStart() ); + rStream.WriteUniOrByteString( aFmt.GetPrefix(), eEncoding ); + rStream.WriteUniOrByteString( aFmt.GetSuffix(), eEncoding ); + rStream.WriteUInt16( sal_uInt16( aFmt.GetNumAdjust() ) ) + .WriteInt16( aFmt.GetAbsLSpace() ) + .WriteInt16( aFmt.GetFirstLineOffset() ) + .WriteInt16( aFmt.GetCharTextDistance() ) + .WriteInt16( aFmt.GetLSpace() ) + .WriteUChar( sal_False );//aFmt.IsRelLSpace(); + rStream.WriteUniOrByteString( aName, eEncoding ); + rStream.WriteUInt16( nFamily ) + .WriteUInt16( nCharSet ) + .WriteInt16( nWidth ) + .WriteInt16( nHeight ) + .WriteUInt16( nPitch ); + } + rStream.WriteUInt16( nCharPoolId ); + rStream.WriteUniOrByteString( sCharFmtName, eEncoding ); + rStream.WriteUInt16( static_cast<sal_uInt16>(aItems.size()) ); + + for( sal_uInt16 n = aItems.size(); n; ) + { + SfxPoolItem* pItem = &aItems[ --n ]; + sal_uInt16 nIVers = pItem->GetVersion( SOFFICE_FILEFORMAT_50 ); + OSL_ENSURE( nIVers != USHRT_MAX, + "Was'n das: Item-Version USHRT_MAX in der aktuellen Version" ); + rStream.WriteUInt16( pItem->Which() ) + .WriteUInt16( nIVers ); + pItem->Store( rStream, nIVers ); + } + + // Extensions for 40A + + if( SVX_NUM_BITMAP == aFmt.GetNumberingType() ) + { + rStream.WriteInt32( (sal_Int32)aFmt.GetGraphicSize().Width() ) + .WriteInt32( (sal_Int32)aFmt.GetGraphicSize().Height() ); + sal_uInt8 cFlg = ( 0 != aFmt.GetBrush() ? 1 : 0 ) + + ( 0 != aFmt.GetGraphicOrientation() ? 2 : 0 ); + rStream.WriteUChar( cFlg ); + + if( aFmt.GetBrush() ) + { + sal_uInt16 nVersion = aFmt.GetBrush()->GetVersion( SOFFICE_FILEFORMAT_50 ); + rStream.WriteUInt16( nVersion ); + aFmt.GetBrush()->Store( rStream, nVersion ); + } + if( aFmt.GetGraphicOrientation() ) + { + sal_uInt16 nVersion = aFmt.GetGraphicOrientation()->GetVersion( SOFFICE_FILEFORMAT_50 ); + rStream.WriteUInt16( nVersion ); + aFmt.GetGraphicOrientation()->Store( rStream, nVersion ); + } + } +} + +void SwNumRulesWithName::_SwNumFmtGlobal::ChgNumFmt( SwWrtShell& rSh, + SwNumFmt& rNew ) const +{ + SwCharFmt* pFmt = 0; + if( !sCharFmtName.isEmpty() ) + { + // at first, look for the name + sal_uInt16 nArrLen = rSh.GetCharFmtCount(); + for( sal_uInt16 i = 1; i < nArrLen; ++i ) + { + pFmt = &rSh.GetCharFmt( i ); + if (pFmt->GetName()==sCharFmtName) + // exists, so leave attributes as they are! + break; + pFmt = 0; + } + + if( !pFmt ) + { + if( IsPoolUserFmt( nCharPoolId ) ) + { + pFmt = rSh.MakeCharFmt( sCharFmtName ); + pFmt->SetAuto( false ); + } + else + pFmt = rSh.GetCharFmtFromPool( nCharPoolId ); + + if( !pFmt->GetDepends() ) // set attributes + for( sal_uInt16 n = aItems.size(); n; ) + pFmt->SetFmtAttr( aItems[ --n ] ); + } + } + ((SwNumFmt&)aFmt).SetCharFmt( pFmt ); + rNew = aFmt; + if( pFmt ) + ((SwNumFmt&)aFmt).SetCharFmt( 0 ); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |