diff options
Diffstat (limited to 'bf_sw/source/core/swg/sw_rdnum.cxx')
-rw-r--r-- | bf_sw/source/core/swg/sw_rdnum.cxx | 326 |
1 files changed, 326 insertions, 0 deletions
diff --git a/bf_sw/source/core/swg/sw_rdnum.cxx b/bf_sw/source/core/swg/sw_rdnum.cxx new file mode 100644 index 000000000..c241e19a0 --- /dev/null +++ b/bf_sw/source/core/swg/sw_rdnum.cxx @@ -0,0 +1,326 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + + +#ifdef _MSC_VER +#pragma hdrstop +#endif + +#include <hintids.hxx> + +#include <bf_svx/lrspitem.hxx> +#include <vcl/font.hxx> + +#include <horiornt.hxx> + +#include "doc.hxx" + +#include <osl/diagnose.h> + +#include "pam.hxx" +#include "rdswg.hxx" +#include "ndtxt.hxx" +#include "numrule.hxx" +#include "poolfmt.hxx" +#include <bf_tools/string.hxx> +namespace binfilter { + + + +////////////////////////////////////////////////////////////////////////////// + +// Achtung: Jede Routine nimmt an, dass der Record-Header bereits eingelesen +// ist. Sie arbeitet den Record so weit ab wie moeglich und schliesst den +// Vorgang mit end() ab. + +////////////////////////////////////////////////////////////////////////////// + +// Numerierungs-Format +extern BYTE lcl_sw3io__GetIncludeUpperLevel( BOOL bInclUpperLevel ); + +void SwSwgReader::InNumFmt( SwNumFmt& rFmt ) +{ + // Flags: + // 0x01 - Praefix-String vorhanden + // 0x02 - Postfix-String vorhanden + // 0x04 - Bullet-Font vorhanden + sal_Char bFlags, eType, cBullet, bInclUpperLevel, eNumAdjust; + USHORT nFmt, nStart; + String aFontName; + sal_Char eFamily, ePitch, eCharSet = RTL_TEXTENCODING_SYMBOL; + long nLSpace, nFirstLineOffset; + if( aHdr.nVersion >= SWG_VER_COMPAT ) + { + rFmt.SetPrefix( GetText() ); + rFmt.SetSuffix( GetText() ); + aFontName = GetText(); + BOOL bOk = TRUE; + if( r.next() != SWG_DATA ) bOk = FALSE, Error(); + r >> bFlags + >> nFmt + >> eType + >> cBullet + >> bInclUpperLevel + >> nStart + >> eNumAdjust + >> nLSpace + >> nFirstLineOffset + >> eFamily + >> ePitch + >> eCharSet; + if( bOk ) r.skip(); + } else { + r >> bFlags + >> nFmt + >> eType + >> cBullet + >> bInclUpperLevel + >> nStart + >> eNumAdjust + >> nLSpace + >> nFirstLineOffset; + if( bFlags & 0x01 ) + rFmt.SetPrefix( GetText() ); + if( bFlags & 0x02 ) + rFmt.SetSuffix( GetText() ); + if( bFlags & 0x04 ) + { + aFontName = GetText(); + r >> eFamily >> ePitch >> eCharSet; + } + } + if( RTL_TEXTENCODING_DONTKNOW == eCharSet ) + eCharSet = RTL_TEXTENCODING_SYMBOL; + sal_Unicode cBull = ByteString::ConvertToUnicode( cBullet, eCharSet ); + if( !cBull ) + cBull = cBulletChar; + rFmt.SetNumberingType( eType ); + rFmt.SetBulletChar( cBull ); + rFmt.SetIncludeUpperLevels( lcl_sw3io__GetIncludeUpperLevel(bInclUpperLevel) ); + rFmt.SetStart( nStart ); + rFmt.SetNumAdjust( SvxAdjust( eNumAdjust ) ); + rFmt.SetAbsLSpace( (USHORT)nLSpace ); + rFmt.SetFirstLineOffset( (short)nFirstLineOffset ); + if( bFlags & 0x04 ) + { + Font aFont; + aFont.SetName( aFontName ); + aFont.SetFamily( FontFamily( eFamily ) ); + aFont.SetPitch( FontPitch( ePitch ) ); + aFont.SetCharSet( rtl_TextEncoding( eCharSet ) ); + rFmt.SetBulletFont( &aFont ); + } + r.next(); +} + +// Numerierungs-Regel + +SwNumRule* SwSwgReader::InNumRule() +{ + sal_Char eType, nFmt, cFmt[ MAXLEVEL ]; + r >> eType >> nFmt; + // C 8.0 bug: + SwNumRuleType eTemp = (SwNumRuleType) eType; + SwNumRule* pRule = new SwNumRule( pDoc->GetUniqueNumRuleName(), eTemp ); + int i; + for( i = 0; i < nFmt; i++ ) + r >> cFmt[ i ]; + r.next(); + for( i = 0; r.good() && i < nFmt; i++ ) + { + SwNumFmt aFmt; + if( r.cur() != SWG_NUMFMT ) + { + Error(); + delete pRule; + return NULL; + } + aFmt.SetBulletFont( NULL ); + InNumFmt( aFmt ); + if( !r ) + { + delete pRule; + return NULL; + } + pRule->Set( (USHORT) cFmt[ i ], aFmt ); + } + if( pRule ) + { + if( aHdr.nVersion < SWG_VER_POOLID3 ) + { + static short const aOldFI[ 5 ] = { -227, -397, -567, -737, -936 }; + static short const aOldLft[ 5 ] = { 567, 964, 1474, 567*4, 3204 }; + + // Alte Dokumente: Fehlende Formate nachtragen + for( i = 0; i < MAXLEVEL; i++ ) + if( !pRule->GetNumFmt( i ) ) + { + SwNumFmt aFmt( pRule->Get( i ) ); + aFmt.SetIncludeUpperLevels( MAXLEVEL ); + aFmt.SetAbsLSpace( aOldLft[ (i < 5) ? i : 4 ] ); + aFmt.SetFirstLineOffset( aOldFI[ (i < 5) ? i : 4 ] ); + aFmt.SetNumberingType(SVX_NUM_ARABIC); + if( i ) + aFmt.SetSuffix( aEmptyStr ); + pRule->Set( i, aFmt ); + } + } + } + return pRule; +} + +// Outline-Numerierung + + +void SwSwgReader::InOutlineRule() +{ + SwNumRule* pRule = InNumRule(); + if( pRule ) + { + pRule->SetName( String::CreateFromAscii( + SwNumRule::GetOutlineRuleName() ) ); + if( aHdr.nVersion < SWG_VER_POOLIDS ) + { + // Alte Dokumente: Fehlende Formate nachtragen + for( short i = 0; i < MAXLEVEL; i++ ) + { + if( !pRule->GetNumFmt( i ) ) + { + SwNumFmt aFmt( pRule->Get( i ) ); + aFmt.SetNumberingType(SVX_NUM_ARABIC); + pRule->Set( i, aFmt ); + } + } + } + pDoc->SetOutlineNumRule( *pRule ); + delete pRule; + } +} + + +// Numerierungs-Regelwerk +// Dieses Regelwerk wird nach dem Einlesen der Nodes eingelesen. +// Zu diesem Zeitpunkt sollte das Index-Array pRules bereits mit den +// gueltigen Bereichen fuer die Regeln gefuellt sein + +// (siehe SwSwgReader::UpdateRuleRange()) + +void lcl_sw3io__ConvertNumLRSpace( SwTxtNode& rTxtNd, const SwNumRule& rNumRule, + BYTE nLevel, BOOL bTabStop ); + +void SwSwgReader::InTxtNumRule() +{ + USHORT n; + r >> n; + if( n != nRules ) + { + Error(); return; + } + r.next(); + for( USHORT i = 0; i < n; i++ ) + { + SwTxtNode* pBgn = pRules[ i ].pBgn; + SwTxtNode* pEnd = pRules[ i ].pEnd; + if( r.cur() != SWG_NUMRULE || !pBgn ) + { + Error(); return; + } + // Rules einlesen + SwNumRule* pRule = InNumRule(); + if( !pRule ) break; + + SwPaM aPaM( *pBgn, 0, *pEnd, 0 ); + SwNodeIndex aBgnIdx( *pBgn ); + const SwNodeIndex& rEndIdx = aPaM.GetPoint()->nNode; + // jetzt noch die Nodes mit den Rules verbinden + BYTE nPrevLevel = 0; + do { + SwTxtNode* pNd = aBgnIdx.GetNode().GetTxtNode(); + if( pNd ) + { + if( pNd->GetNum() ) + { + SwNodeNum *pNum = (SwNodeNum*) pNd->GetNum(); + + //JP 19.03.96: NO_NUM gibt es nicht mehr, dafuer gibts + // jetzt NO_NUMLEVEL + if( NO_NUM == pNum->GetLevel() ) + pNum->SetLevel( nPrevLevel | NO_NUMLEVEL ); + else + nPrevLevel = pNum->GetLevel(); +#ifdef NUM_RELSPACE + lcl_sw3io__ConvertNumLRSpace( *pNd, *pRule, + pNum->GetLevel(), TRUE ); +#endif + } + else + { + // Hot fix bei Loechern im Bereich: + pNd->UpdateNum( SwNodeNum( nPrevLevel | NO_NUMLEVEL ) ); + OSL_ENSURE( FALSE, "SW/G-Reader: Luecke im NumRule-Bereich!" ); + } + } + else + { + Error(); break; + } + aBgnIdx += 1; + } while( aBgnIdx.GetIndex() <= rEndIdx.GetIndex() ); + + pDoc->SetNumRule( aPaM, *pRule ); + delete pRule; + } +} + +// Update des Bereichs einer Numerierungsregel + +void SwSwgReader::UpdateRuleRange( USHORT nIdx, SwTxtNode* pNd ) +{ + // Evtl. den Puffer fuer die NumRules-Bereiche einrichten + if( !pRules && aHdr.nNumRules ) + { + nRules = aHdr.nNumRules; + pRules = new NumRuleInfo[ nRules ]; + for( USHORT i = 0; i < nRules; i++ ) + pRules[ i ].pBgn = + pRules[ i ].pEnd = NULL; + } + if( nIdx >= nRules ) return; + // Node-Nummer fuer PaM-SRange updaten: + NumRuleInfo* p = &pRules[ nIdx ]; + if( !p->pBgn ) + p->pBgn = p->pEnd = pNd; + else + p->pEnd = pNd; +} + + + +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |