diff options
Diffstat (limited to 'sc/source/filter/lotus/lotimpop.cxx')
-rw-r--r-- | sc/source/filter/lotus/lotimpop.cxx | 473 |
1 files changed, 473 insertions, 0 deletions
diff --git a/sc/source/filter/lotus/lotimpop.cxx b/sc/source/filter/lotus/lotimpop.cxx new file mode 100644 index 000000000000..33b3c8e30b97 --- /dev/null +++ b/sc/source/filter/lotus/lotimpop.cxx @@ -0,0 +1,473 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_sc.hxx" +#include "lotimpop.hxx" +#include <vos/mutex.hxx> + +#include "attrib.hxx" +#include "document.hxx" +#include "rangenam.hxx" +#include "cell.hxx" +#include "patattr.hxx" +#include "docpool.hxx" +#include "compiler.hxx" +#include "global.hxx" + +#include "root.hxx" +#include "lotfntbf.hxx" +#include "lotform.hxx" +#include "tool.h" +#include "namebuff.hxx" +#include "lotrange.hxx" +#include "lotattr.hxx" + + +static vos:: OMutex aLotImpSemaphore; + + +ImportLotus::ImportLotus( SvStream& aStream, ScDocument* pDoc, CharSet eQ ) : + ImportTyp( pDoc, eQ ), + pIn( &aStream ), + aConv( *pIn, eQ, FALSE ) +{ + // good point to start locking of import lotus + aLotImpSemaphore.acquire(); + + pLotusRoot = new LOTUS_ROOT; + pLotusRoot->pDoc = pDoc; + pLotusRoot->pRangeNames = new LotusRangeList; + pLotusRoot->pScRangeName = pDoc->GetRangeName(); + pLotusRoot->eCharsetQ = eQ; + pLotusRoot->eFirstType = Lotus_X; + pLotusRoot->eActType = Lotus_X; + pLotusRoot->pRngNmBffWK3 = new RangeNameBufferWK3; + pFontBuff = pLotusRoot->pFontBuff = new LotusFontBuffer; + pLotusRoot->pAttrTable = new LotAttrTable; +} + + +ImportLotus::~ImportLotus() +{ + delete pLotusRoot->pRangeNames; + delete pLotusRoot->pRngNmBffWK3; + delete pFontBuff; + delete pLotusRoot->pAttrTable; + delete pLotusRoot; + +#ifdef DBG_UTIL + pLotusRoot = NULL; +#endif + + // no need 4 pLotusRoot anymore + aLotImpSemaphore.release(); +} + + +void ImportLotus::Bof( void ) +{ + UINT16 nFileCode, nFileSub, nSaveCnt; + BYTE nMajorId, nMinorId, nFlags; + + Read( nFileCode ); + Read( nFileSub ); + Read( pLotusRoot->aActRange ); + Read( nSaveCnt ); + Read( nMajorId ); + Read( nMinorId ); + Skip( 1 ); + Read( nFlags ); + + if( nFileSub == 0x0004 ) + { + if( nFileCode == 0x1000 ) + {// <= WK3 + pLotusRoot->eFirstType = pLotusRoot->eActType = Lotus_WK3; + } + else if( nFileCode == 0x1002 ) + {// WK4 + pLotusRoot->eFirstType = pLotusRoot->eActType = Lotus_WK4; + } + } +} + + +BOOL ImportLotus::BofFm3( void ) +{ + UINT16 nFileCode, nFileSub; + + Read( nFileCode ); + Read( nFileSub ); + + return ( nFileCode == 0x8007 && ( nFileSub == 0x0000 || nFileSub == 0x00001 ) ); +} + + +void ImportLotus::Columnwidth( UINT16 nRecLen ) +{ + DBG_ASSERT( nRecLen >= 4, "*ImportLotus::Columnwidth(): Record zu kurz!" ); + + BYTE nLTab, nWindow2; + UINT16 nCnt = ( nRecLen - 4 ) / 2; + + Read( nLTab ); + Read( nWindow2 ); + + if( !pD->HasTable( static_cast<SCTAB> (nLTab) ) ) + pD->MakeTable( static_cast<SCTAB> (nLTab) ); + + if( !nWindow2 ) + { + Skip( 2 ); + + BYTE nCol, nSpaces; + + while( nCnt ) + { + Read( nCol ); + Read( nSpaces ); + // ACHTUNG: Korrekturfaktor nach 'Augenmass' ermittelt! + pD->SetColWidth( static_cast<SCCOL> (nCol), static_cast<SCTAB> (nLTab), ( UINT16 ) ( TWIPS_PER_CHAR * 1.28 * nSpaces ) ); + + nCnt--; + } + } +} + + +void ImportLotus::Hiddencolumn( UINT16 nRecLen ) +{ + DBG_ASSERT( nRecLen >= 4, "*ImportLotus::Hiddencolumn(): Record zu kurz!" ); + + BYTE nLTab, nWindow2; + UINT16 nCnt = ( nRecLen - 4 ) / 2; + + Read( nLTab ); + Read( nWindow2 ); + + if( !nWindow2 ) + { + Skip( 2 ); + + BYTE nCol; + + while( nCnt ) + { + Read( nCol ); + + pD->SetColHidden(static_cast<SCCOL>(nCol), static_cast<SCCOL>(nCol), static_cast<SCTAB>(nLTab), true); + nCnt--; + } + } +} + + +void ImportLotus::Userrange( void ) +{ + UINT16 nRangeType; + ScRange aScRange; + sal_Char* pBuffer = new sal_Char[ 32 ]; + + Read( nRangeType ); + + pIn->Read( pBuffer, 16 ); + pBuffer[ 16 ] = ( sal_Char ) 0x00; // zur Sicherheit... + String aName( pBuffer, eQuellChar ); + + Read( aScRange ); + + pLotusRoot->pRngNmBffWK3->Add( aName, aScRange ); + delete[] pBuffer; +} + + +void ImportLotus::Errcell( void ) +{ + ScAddress aA; + + Read( aA ); + + pD->PutCell( aA.Col(), aA.Row(), aA.Tab(), new ScStringCell( CREATE_STRING( "#ERR!" ) ), (BOOL)TRUE ); +} + + +void ImportLotus::Nacell( void ) +{ + ScAddress aA; + + Read( aA ); + + pD->PutCell( aA.Col(), aA.Row(), aA.Tab(), new ScStringCell( CREATE_STRING( "#NA!" ) ), (BOOL)TRUE ); +} + + +void ImportLotus::Labelcell( void ) +{ + ScAddress aA; + String aLabel; + sal_Char cAlign; + + Read( aA ); + Read( cAlign ); + Read( aLabel ); + +// aLabel.Convert( pLotusRoot->eCharsetQ ); + + pD->PutCell( aA.Col(), aA.Row(), aA.Tab(), new ScStringCell( aLabel ), (BOOL)TRUE ); +} + + +void ImportLotus::Numbercell( void ) + { + ScAddress aAddr; + double fVal; + + Read( aAddr ); + Read( fVal ); + + pD->PutCell( aAddr.Col(), aAddr.Row(), aAddr.Tab(), + new ScValueCell( fVal ), (BOOL)TRUE ); + } + + +void ImportLotus::Smallnumcell( void ) + { + ScAddress aAddr; + INT16 nVal; + + Read( aAddr ); + Read( nVal ); + + pD->PutCell( aAddr.Col(), aAddr.Row(), aAddr.Tab(), + new ScValueCell( SnumToDouble( nVal ) ), ( BOOL ) TRUE ); + } + + +ScFormulaCell *ImportLotus::Formulacell( UINT16 n ) + { + DBG_ASSERT( pIn, "-ImportLotus::Formulacell(): Null-Stream -> Rums!" ); + + ScAddress aAddr; + + Read( aAddr ); + Skip( 10 ); + + n -= 14; + + const ScTokenArray* pErg; + INT32 nRest = n; + + aConv.Reset( aAddr ); + aConv.SetWK3(); + aConv.Convert( pErg, nRest ); + + ScFormulaCell* pZelle = new ScFormulaCell( pD, aAddr, pErg ); + + pZelle->AddRecalcMode( RECALCMODE_ONLOAD_ONCE ); + + pD->PutCell( aAddr.Col(), aAddr.Row(), aAddr.Tab(), pZelle, (BOOL)TRUE ); + + return NULL; + } + + +void ImportLotus::Read( String &r ) +{ + ScfTools::AppendCString( *pIn, r, eQuellChar ); +} + + +void ImportLotus::RowPresentation( UINT16 nRecLen ) +{ + DBG_ASSERT( nRecLen > 4, "*ImportLotus::RowPresentation(): Record zu kurz!" ); + + BYTE nLTab, nFlags; + UINT16 nRow, nHeight; + UINT16 nCnt = ( nRecLen - 4 ) / 8; + + Read( nLTab ); + Skip( 1 ); + + while( nCnt ) + { + Read( nRow ); + Read( nHeight ); + Skip( 2 ); + Read( nFlags ); + Skip( 1 ); + + if( nFlags & 0x02 ) // Fixed / Strech to fit fonts + { // fixed + // Height in Lotus in 1/32 Points + nHeight *= 20; // -> 32 * TWIPS + nHeight /= 32; // -> TWIPS + + pD->SetRowFlags( static_cast<SCROW> (nRow), static_cast<SCTAB> (nLTab), pD->GetRowFlags( static_cast<SCROW> (nRow), static_cast<SCTAB> (nLTab) ) | CR_MANUALSIZE ); + + pD->SetRowHeight( static_cast<SCROW> (nRow), static_cast<SCTAB> (nLTab), nHeight ); + } + + nCnt--; + } +} + + +void ImportLotus::NamedSheet( void ) +{ + UINT16 nLTab; + String aName; + + Read( nLTab ); + Read( aName ); + + if( pD->HasTable( static_cast<SCTAB> (nLTab) ) ) + pD->RenameTab( static_cast<SCTAB> (nLTab), aName ); + else + pD->InsertTab( static_cast<SCTAB> (nLTab), aName ); +} + + +void ImportLotus::Font_Face( void ) +{ + BYTE nNum; + String aName; + + Read( nNum ); + + // ACHTUNG: QUICK-HACK gegen unerklaerliche Loops + if( nNum > 7 ) + return; + // ACHTUNG + + Read( aName ); + + pFontBuff->SetName( nNum, aName ); +} + + +void ImportLotus::Font_Type( void ) +{ + static const UINT16 nAnz = 8; + UINT16 nCnt; + UINT16 nType; + + for( nCnt = 0 ; nCnt < nAnz ; nCnt++ ) + { + Read( nType ); + pFontBuff->SetType( nCnt, nType ); + } +} + + +void ImportLotus::Font_Ysize( void ) +{ + static const UINT16 nAnz = 8; + UINT16 nCnt; + UINT16 nSize; + + for( nCnt = 0 ; nCnt < nAnz ; nCnt++ ) + { + Read( nSize ); + pFontBuff->SetHeight( nCnt, nSize ); + } +} + + +void ImportLotus::_Row( const UINT16 nRecLen ) + { + DBG_ASSERT( nExtTab >= 0, "*ImportLotus::_Row(): Kann hier nicht sein!" ); + + UINT16 nRow; + UINT16 nHeight; + UINT16 nCntDwn = ( nRecLen - 4 ) / 5; + SCCOL nColCnt = 0; + UINT8 nRepeats; + LotAttrWK3 aAttr; + + BOOL bCenter = FALSE; + SCCOL nCenterStart = 0, nCenterEnd = 0; + + Read( nRow ); + Read( nHeight ); + + nHeight &= 0x0FFF; + nHeight *= 22; + + if( nHeight ) + pD->SetRowHeight( static_cast<SCROW> (nRow), static_cast<SCTAB> (nExtTab), nHeight ); + + while( nCntDwn ) + { + Read( aAttr ); + Read( nRepeats ); + + if( aAttr.HasStyles() ) + pLotusRoot->pAttrTable->SetAttr( + nColCnt, static_cast<SCCOL> ( nColCnt + nRepeats ), static_cast<SCROW> (nRow), aAttr ); + + // hier und NICHT in class LotAttrTable, weil nur Attributiert wird, + // wenn die anderen Attribute gesetzt sind + // -> bei Center-Attribute wird generell zentriert gesetzt + if( aAttr.IsCentered() ) + { + if( bCenter ) + { + if( pD->HasData( nColCnt, static_cast<SCROW> (nRow), static_cast<SCTAB> (nExtTab) ) ) + {// neue Center nach vorheriger Center + pD->DoMerge( static_cast<SCTAB> (nExtTab), nCenterStart, static_cast<SCROW> (nRow), nCenterEnd, static_cast<SCROW> (nRow) ); + nCenterStart = nColCnt; + } + } + else + {// ganz neue Center + bCenter = TRUE; + nCenterStart = nColCnt; + } + nCenterEnd = nColCnt + static_cast<SCCOL>(nRepeats); + } + else + { + if( bCenter ) + {// evtl. alte Center bemachen + pD->DoMerge( static_cast<SCTAB> (nExtTab), nCenterStart, static_cast<SCROW> (nRow), nCenterEnd, static_cast<SCROW> (nRow) ); + bCenter = FALSE; + } + } + + nColCnt = nColCnt + static_cast<SCCOL>(nRepeats); + nColCnt++; + + nCntDwn--; + } + + if( bCenter ) + // evtl. alte Center bemachen + pD->DoMerge( static_cast<SCTAB> (nExtTab), nCenterStart, static_cast<SCROW> (nRow), nCenterEnd, static_cast<SCROW> (nRow) ); + } + + |