diff options
Diffstat (limited to 'sc/source/filter/lotus/op.cxx')
-rw-r--r-- | sc/source/filter/lotus/op.cxx | 668 |
1 files changed, 0 insertions, 668 deletions
diff --git a/sc/source/filter/lotus/op.cxx b/sc/source/filter/lotus/op.cxx deleted file mode 100644 index 2316f072b..000000000 --- a/sc/source/filter/lotus/op.cxx +++ /dev/null @@ -1,668 +0,0 @@ -/* -*- 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. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sc.hxx" - -//------------------------------------------------------------------------ - -#include <tools/solar.h> -#include <rtl/math.hxx> - -#include <stdio.h> -#include <string.h> -#include <math.h> -#include <ctype.h> -#if defined( ICC ) -#include <stdlib.h> -#endif - -#include "scitems.hxx" -#include "patattr.hxx" -#include "docpool.hxx" -#include <svx/algitem.hxx> -#include <editeng/postitem.hxx> -#include <editeng/udlnitem.hxx> -#include <editeng/wghtitem.hxx> -#include <editeng/justifyitem.hxx> - -#include "cell.hxx" -#include "rangenam.hxx" -#include "document.hxx" -#include "postit.hxx" - -#include "op.h" -#include "optab.h" -#include "tool.h" -#include "decl.h" -#include "lotform.hxx" -#include "lotrange.hxx" - -#include "root.hxx" - -#include "ftools.hxx" - -#include <vector> -#include <map> - -#include <stdio.h> -#include <string.h> -#include <math.h> -#include <ctype.h> -#if defined( ICC ) -#include <stdlib.h> -#endif - -extern sal_Char* pAnsi; // -> memory.cxx, Puffer zum Umwandeln von OEM->ANSI -extern sal_Char* pErgebnis; // -> memory.cxx, Ergebnispuffer -extern WKTYP eTyp; // -> filter.cxx, aktueller Dateityp -extern sal_Bool bEOF; // -> filter.cxx, zeigt Dateiende an -extern sal_Char* pPuffer0; // -> memory.cxx -extern sal_Char* pPuffer1; -extern sal_uInt8 nDefaultFormat; // -> tool.cxx, Default-Zellenformat -extern ScDocument* pDoc; // -> filter.cxx, Aufhaenger zum Dokumentzugriff -extern sal_uInt8* pFormelBuffer; // -> memory.cxx, fuer -extern CharSet eCharVon; // -> filter.cxx, character set specified - -static sal_uInt16 nDefWidth = ( sal_uInt16 ) ( TWIPS_PER_CHAR * 10 ); - -extern std::map<sal_uInt16, ScPatternAttr> aLotusPatternPool; - -void NI( SvStream& r, sal_uInt16 n ) -{ - r.SeekRel( n ); -} - - -void OP_BOF( SvStream& r, sal_uInt16 /*n*/ ) -{ - r.SeekRel( 2 ); // Versionsnummer ueberlesen -} - - -void OP_EOF( SvStream& /*r*/, sal_uInt16 /*n*/ ) -{ - bEOF = sal_True; -} - - -void OP_Integer( SvStream& r, sal_uInt16 /*n*/ ) -{ - sal_uInt8 nFormat; - sal_uInt16 nCol, nRow; - SCTAB nTab = 0; - sal_Int16 nValue; - - r >> nFormat >> nCol >> nRow >> nValue; - - ScValueCell* pZelle = new ScValueCell( ( double ) nValue ); - pDoc->PutCell( static_cast<SCCOL> (nCol), static_cast<SCROW> (nRow), nTab, pZelle, ( sal_Bool ) sal_True ); - - // 0 Stellen nach'm Komma! - SetFormat( static_cast<SCCOL> (nCol), static_cast<SCROW> (nRow), nTab, nFormat, 0 ); -} - - -void OP_Number( SvStream& r, sal_uInt16 /*n*/ ) -{ - sal_uInt8 nFormat; - sal_uInt16 nCol, nRow; - SCTAB nTab = 0; - double fValue; - - r >> nFormat >> nCol >> nRow >> fValue; - - fValue = ::rtl::math::round( fValue, 15 ); - ScValueCell* pZelle = new ScValueCell( fValue ); - pDoc->PutCell( static_cast<SCCOL> (nCol), static_cast<SCROW> (nRow), nTab, pZelle, ( sal_Bool ) sal_True ); - - SetFormat( static_cast<SCCOL> (nCol), static_cast<SCROW> (nRow), nTab, nFormat, nDezFloat ); -} - - -void OP_Label( SvStream& r, sal_uInt16 n ) -{ - sal_uInt8 nFormat; - sal_uInt16 nCol, nRow; - SCTAB nTab = 0; - - r >> nFormat >> nCol >> nRow; - n -= 5; - - sal_Char* pText = new sal_Char[n + 1]; - r.Read( pText, n ); - pText[n] = 0; - - nFormat &= 0x80; // Bit 7 belassen - nFormat |= 0x75; // protected egal, special-text gesetzt - - PutFormString( static_cast<SCCOL> (nCol), static_cast<SCROW> (nRow), nTab, pText ); - - SetFormat( static_cast<SCCOL> (nCol), static_cast<SCROW> (nRow), nTab, nFormat, nDezStd ); - - delete [] pText; -} - -void OP_Formula( SvStream& r, sal_uInt16 /*n*/ ) -{ - sal_uInt8 nFormat; - sal_uInt16 nCol, nRow, nFormulaSize; - SCTAB nTab = 0; - - r >> nFormat >> nCol >> nRow; - r.SeekRel( 8 ); // Ergebnis ueberspringen - r >> nFormulaSize; - - const ScTokenArray* pErg; - sal_Int32 nBytesLeft = nFormulaSize; - ScAddress aAddress( static_cast<SCCOL> (nCol), static_cast<SCROW> (nRow), nTab ); - - LotusToSc aConv( r, pLotusRoot->eCharsetQ, false ); - aConv.Reset( aAddress ); - aConv.Convert( pErg, nBytesLeft ); - - ScFormulaCell* pZelle = new ScFormulaCell( pLotusRoot->pDoc, aAddress, pErg ); - - pZelle->AddRecalcMode( RECALCMODE_ONLOAD_ONCE ); - - pDoc->PutCell( static_cast<SCCOL> (nCol), static_cast<SCROW> (nRow), nTab, pZelle, ( sal_Bool ) sal_True ); - - // nFormat = Standard -> Nachkommastellen wie Float - SetFormat( static_cast<SCCOL> (nCol), static_cast<SCROW> (nRow), nTab, nFormat, nDezFloat ); -} - - -void OP_ColumnWidth( SvStream& r, sal_uInt16 /*n*/ ) -{ - sal_uInt16 nCol, nBreite; - sal_uInt8 nWidthSpaces; - SCTAB nTab = 0; - - r >> nCol >> nWidthSpaces; - - if( nWidthSpaces ) - // Annahme: 10cpi-Zeichensatz - nBreite = ( sal_uInt16 ) ( TWIPS_PER_CHAR * nWidthSpaces ); - else - { - pDoc->SetColHidden(static_cast<SCCOL>(nCol), static_cast<SCCOL>(nCol), 0, true); - nBreite = nDefWidth; - } - - pDoc->SetColWidth( static_cast<SCCOL> (nCol), nTab, nBreite ); -} - - -void OP_NamedRange( SvStream& r, sal_uInt16 /*n*/ ) - { - // POST: waren Koordinaten ungueltig, wird nicht gespeichert - sal_uInt16 nColSt, nRowSt, nColEnd, nRowEnd; - sal_Char cPuffer[ 32 ]; - - r.Read( cPuffer, 16 ); - - r >> nColSt >> nRowSt >> nColEnd >> nRowEnd; - - LotusRange* pRange; - - if( nColSt == nColEnd && nRowSt == nRowEnd ) - pRange = new LotusRange( static_cast<SCCOL> (nColSt), static_cast<SCROW> (nRowSt) ); - else - pRange = new LotusRange( static_cast<SCCOL> (nColSt), static_cast<SCROW> (nRowSt), static_cast<SCCOL> (nColEnd), static_cast<SCROW> (nRowEnd) ); - - if( isdigit( *cPuffer ) ) - { // erstes Zeichen im Namen eine Zahl -> 'A' vor Namen setzen - *pAnsi = 'A'; - strcpy( pAnsi + 1, cPuffer ); - } - else - strcpy( pAnsi, cPuffer ); - - String aTmp( pAnsi, pLotusRoot->eCharsetQ ); - - ScfTools::ConvertToScDefinedName( aTmp ); - - pLotusRoot->pRangeNames->Append( pRange, aTmp ); -} - - -void OP_SymphNamedRange( SvStream& r, sal_uInt16 /*n*/ ) -{ - // POST: waren Koordinaten ungueltig, wird nicht gespeichert - sal_uInt16 nColSt, nRowSt, nColEnd, nRowEnd; - sal_uInt8 nType; - sal_Char cPuffer[ 32 ]; - - r.Read( cPuffer, 16 ); - cPuffer[ 16 ] = 0; - - r >> nColSt >> nRowSt >> nColEnd >> nRowEnd >> nType; - - LotusRange* pRange; - - if( nType ) - pRange = new LotusRange( static_cast<SCCOL> (nColSt), static_cast<SCROW> (nRowSt) ); - else - pRange = new LotusRange( static_cast<SCCOL> (nColSt), static_cast<SCROW> (nRowSt), static_cast<SCCOL> (nColEnd), static_cast<SCROW> (nRowEnd) ); - - if( isdigit( *cPuffer ) ) - { // erstes Zeichen im Namen eine Zahl -> 'A' vor Namen setzen - *pAnsi = 'A'; - strcpy( pAnsi + 1, cPuffer ); - } - else - strcpy( pAnsi, cPuffer ); - - String aTmp( pAnsi, pLotusRoot->eCharsetQ ); - ScfTools::ConvertToScDefinedName( aTmp ); - - pLotusRoot->pRangeNames->Append( pRange, aTmp ); -} - - -void OP_Footer( SvStream& r, sal_uInt16 n ) -{ - r.SeekRel( n ); -} - - -void OP_Header( SvStream& r, sal_uInt16 n ) -{ - r.SeekRel( n ); -} - - -void OP_Margins( SvStream& r, sal_uInt16 n ) -{ - r.SeekRel( n ); -} - - -void OP_HiddenCols( SvStream& r, sal_uInt16 /*n*/ ) -{ - sal_uInt16 nByte, nBit; - SCCOL nCount; - sal_uInt8 nAkt; - nCount = 0; - - for( nByte = 0 ; nByte < 32 ; nByte++ ) // 32 Bytes mit ... - { - r >> nAkt; - for( nBit = 0 ; nBit < 8 ; nBit++ ) // ...jeweils 8 Bits = 256 Bits - { - if( nAkt & 0x01 ) // unterstes Bit gesetzt? - // -> Hidden Col - pDoc->SetColHidden(nCount, nCount, 0, true); - - nCount++; - nAkt = nAkt / 2; // der Naechste bitte... - } - } -} - - -void OP_Window1( SvStream& r, sal_uInt16 n ) -{ - r.SeekRel( 4 ); // Cursor Pos ueberspringen - - r >> nDefaultFormat; - - r.SeekRel( 1 ); // 'unused' ueberspringen - - r >> nDefWidth; - - r.SeekRel( n - 8 ); // und den Rest ueberspringen - - nDefWidth = ( sal_uInt16 ) ( TWIPS_PER_CHAR * nDefWidth ); - - // statt Defaulteinstellung in SC alle Cols zu Fuss setzen - for( SCCOL nCol = 0 ; nCol <= MAXCOL ; nCol++ ) - pDoc->SetColWidth( nCol, 0, nDefWidth ); -} - - -void OP_Blank( SvStream& r, sal_uInt16 /*n*/ ) -{ - sal_uInt16 nCol, nRow; - sal_uInt8 nFormat; - r >> nFormat >> nCol >> nRow; - - SetFormat( static_cast<SCCOL> (nCol), static_cast<SCROW> (nRow), 0, nFormat, nDezFloat ); -} - -void OP_BOF123( SvStream& r, sal_uInt16 /*n*/ ) -{ - r.SeekRel( 26 ); -} - - -void OP_EOF123( SvStream& /*r*/, sal_uInt16 /*n*/ ) -{ - bEOF = sal_True; -} - -void OP_Label123( SvStream& r, sal_uInt16 n ) -{ - sal_uInt8 nTab, nCol; - sal_uInt16 nRow; - r >> nRow >> nTab >> nCol; - n -= 4; - - sal_Char* pText = new sal_Char[n + 1]; - r.Read( pText, n ); - pText[ n ] = 0; - - PutFormString( static_cast<SCCOL>(nCol), static_cast<SCROW>(nRow), static_cast<SCTAB>(nTab), pText ); - - delete []pText; -} - -void OP_Number123( SvStream& r, sal_uInt16 /*n*/ ) -{ - sal_uInt8 nCol,nTab; - sal_uInt16 nRow; - sal_uInt32 nValue; - - r >> nRow >> nTab >> nCol >> nValue; - double fValue = Snum32ToDouble( nValue ); - - ScValueCell *pCell = new ScValueCell( fValue ); - pDoc->PutCell( static_cast<SCCOL>(nCol), static_cast<SCROW>(nRow), static_cast<SCTAB>(nTab), pCell, (sal_Bool) sal_True ); -} - -void OP_Formula123( SvStream& r, sal_uInt16 n ) -{ - sal_uInt8 nCol,nTab; - sal_uInt16 nRow; - - r >> nRow >> nTab >> nCol; - r.SeekRel( 8 ); // Result- jump over - - const ScTokenArray* pErg; - sal_Int32 nBytesLeft = n - 12; - ScAddress aAddress( nCol, nRow, nTab ); - - LotusToSc aConv( r, pLotusRoot->eCharsetQ, sal_True ); - aConv.Reset( aAddress ); - aConv.Convert( pErg, nBytesLeft ); - - ScFormulaCell* pCell = new ScFormulaCell( pLotusRoot->pDoc, aAddress, pErg ); - - pCell->AddRecalcMode( RECALCMODE_ONLOAD_ONCE ); - - pDoc->PutCell( static_cast<SCCOL>(nCol), static_cast<SCROW>(nRow), static_cast<SCTAB>(nTab), pCell, (sal_Bool) sal_True ); -} - -void OP_IEEENumber123( SvStream& r, sal_uInt16 /*n*/ ) -{ - sal_uInt8 nCol,nTab; - sal_uInt16 nRow; - double dValue; - - r >> nRow >> nTab >> nCol >> dValue; - - ScValueCell *pCell = new ScValueCell(dValue); - pDoc->PutCell( static_cast<SCCOL>(nCol), static_cast<SCROW>(nRow), static_cast<SCTAB>(nTab), pCell, (sal_Bool) sal_True ); -} - -void OP_Note123( SvStream& r, sal_uInt16 n) -{ - sal_uInt8 nTab, nCol; - sal_uInt16 nRow; - r >> nRow >> nTab >> nCol; - n -= 4; - - sal_Char* pText = new sal_Char[n + 1]; - r.Read( pText, n ); - pText[ n ] = 0; - - String aNoteText(pText,pLotusRoot->eCharsetQ); - delete [] pText; - - ScAddress aPos( static_cast<SCCOL>(nCol), static_cast<SCROW>(nRow), static_cast<SCTAB>(nTab) ); - ScNoteUtil::CreateNoteFromString( *pDoc, aPos, aNoteText, false, false ); -} - -void OP_HorAlign123( sal_uInt8 nAlignPattern, SfxItemSet& rPatternItemSet ) -{ -// pre: Pattern is stored in the last 3 bites of the 21st byte -// post: Appropriate Horizontal Alignement is set in rPattern according to the bit pattern. -// -// LEFT:001, RIGHT:010, CENTER:011, JUSTIFY:110, -// LEFT-Text/RIGHT-NUMBER:100, DEFAULT:000 - - nAlignPattern = ( nAlignPattern & 0x07); - - switch (nAlignPattern) - { - case 1: - rPatternItemSet.Put( SvxHorJustifyItem( SVX_HOR_JUSTIFY_LEFT, ATTR_HOR_JUSTIFY ) ); - break; - case 2: - rPatternItemSet.Put( SvxHorJustifyItem( SVX_HOR_JUSTIFY_RIGHT, ATTR_HOR_JUSTIFY ) ); - break; - case 3: - rPatternItemSet.Put( SvxHorJustifyItem( SVX_HOR_JUSTIFY_CENTER, ATTR_HOR_JUSTIFY) ); - break; - case 4: - rPatternItemSet.Put( SvxHorJustifyItem( SVX_HOR_JUSTIFY_STANDARD, ATTR_HOR_JUSTIFY ) ); - break; - case 6: - rPatternItemSet.Put( SvxHorJustifyItem( SVX_HOR_JUSTIFY_BLOCK, ATTR_HOR_JUSTIFY ) ); - break; - default: - rPatternItemSet.Put( SvxHorJustifyItem( SVX_HOR_JUSTIFY_STANDARD, ATTR_HOR_JUSTIFY ) ); - break; - } -} - -void OP_VerAlign123( sal_uInt8 nAlignPattern,SfxItemSet& rPatternItemSet ) -{ -// pre: Pattern is stored in the last 3 bites of the 22nd byte -// post: Appropriate Verticle Alignement is set in rPattern according to the bit pattern. -// -// TOP:001, MIDDLE:010, DOWN:100, DEFAULT:000 - - nAlignPattern = ( nAlignPattern & 0x07); - - switch (nAlignPattern) - { - case 0: - rPatternItemSet.Put( SvxVerJustifyItem(SVX_VER_JUSTIFY_STANDARD, ATTR_VER_JUSTIFY) ); - break; - case 1: - rPatternItemSet.Put( SvxVerJustifyItem(SVX_VER_JUSTIFY_TOP, ATTR_VER_JUSTIFY) ); - break; - case 2: - rPatternItemSet.Put( SvxVerJustifyItem(SVX_VER_JUSTIFY_CENTER, ATTR_VER_JUSTIFY) ); - break; - case 4: - rPatternItemSet.Put( SvxVerJustifyItem(SVX_VER_JUSTIFY_BOTTOM, ATTR_VER_JUSTIFY) ); - break; - default: - rPatternItemSet.Put( SvxVerJustifyItem(SVX_VER_JUSTIFY_STANDARD, ATTR_VER_JUSTIFY) ); - break; - } -} - -void OP_CreatePattern123( SvStream& r, sal_uInt16 n) -{ - sal_uInt16 nCode,nPatternId; - - ScPatternAttr aPattern(pDoc->GetPool()); - SfxItemSet& rItemSet = aPattern.GetItemSet(); - - r >> nCode; - n = n - 2; - - if ( nCode == 0x0fd2 ) - { - r >> nPatternId; - - sal_uInt8 Hor_Align, Ver_Align, temp; - sal_Bool bIsBold,bIsUnderLine,bIsItalics; - - r.SeekRel(12); - - // Read 17th Byte - r >> temp; - - bIsBold = (temp & 0x01); - bIsItalics = (temp & 0x02); - bIsUnderLine = (temp & 0x04); - - if ( bIsBold ) - rItemSet.Put( SvxWeightItem(WEIGHT_BOLD,ATTR_FONT_WEIGHT) ); - if ( bIsItalics ) - rItemSet.Put( SvxPostureItem(ITALIC_NORMAL, ATTR_FONT_POSTURE ) ); - if ( bIsUnderLine ) - rItemSet.Put( SvxUnderlineItem( UNDERLINE_SINGLE, ATTR_FONT_UNDERLINE ) ); - - r.SeekRel(3); - - // Read 21st Byte - r >> Hor_Align; - OP_HorAlign123( Hor_Align, rItemSet ); - - r >> Ver_Align; - OP_VerAlign123( Ver_Align, rItemSet ); - - aLotusPatternPool.insert( std::map<sal_uInt16, ScPatternAttr>::value_type( nPatternId, aPattern ) ); - n = n - 20; - } - r.SeekRel(n); -} - -void OP_SheetName123( SvStream& rStream, sal_uInt16 nLength ) -{ - if (nLength <= 4) - { - rStream.SeekRel(nLength); - return; - } - - // B0 36 [sheet number (2 bytes?)] [sheet name (null terminated char array)] - - sal_uInt16 nDummy; - rStream >> nDummy; // ignore the first 2 bytes (B0 36). - rStream >> nDummy; - SCTAB nSheetNum = static_cast<SCTAB>(nDummy); - pDoc->MakeTable(nSheetNum); - - ::std::vector<sal_Char> sSheetName; - sSheetName.reserve(nLength-4); - for (sal_uInt16 i = 4; i < nLength; ++i) - { - sal_Char c; - rStream >> c; - sSheetName.push_back(c); - } - - if (!sSheetName.empty()) - { - String aName(&sSheetName[0], eCharVon); - pDoc->RenameTab(nSheetNum, aName); - } -} - -void OP_ApplyPatternArea123( SvStream& rStream ) -{ - sal_uInt16 nOpcode, nLength; - sal_uInt16 nCol = 0, nColCount = 0, nRow = 0, nRowCount = 0, nTab = 0, nData, nTabCount = 0, nLevel = 0; - - do - { - rStream >> nOpcode >> nLength; - switch ( nOpcode ) - { - case ROW_FORMAT_MARKER: - nLevel++; - break; - case COL_FORMAT_MARKER: - nLevel--; - if( nLevel == 1 ) - { - nTab = nTab + nTabCount; - nCol = 0; nColCount = 0; - nRow = 0; nRowCount = 0; - } - break; - case LOTUS_FORMAT_INDEX: - if( nLength >= 2 ) - { - rStream >> nData; - rStream.SeekRel( nLength - 2 ); - if( nLevel == 1 ) - nTabCount = nData; - else if( nLevel == 2 ) - { - nCol = nCol + nColCount; - nColCount = nData; - if ( nCol > 0xff ) // 256 is the max col size supported by 123 - nCol = 0; - } - else if( nLevel == 3 ) - { - nRow = nRow + nRowCount; - nRowCount = nData; - if ( nRow > 0x1fff ) // 8192 is the max row size supported by 123 - nRow = 0; - } - } - else - rStream.SeekRel( nLength ); - break; - case LOTUS_FORMAT_INFO: - if( nLength >= 2 ) - { - rStream >> nData; - rStream.SeekRel( nLength - 2 ); - for( int i = 0; i < nTabCount; i++) - { - std::map<sal_uInt16, ScPatternAttr>::iterator loc = aLotusPatternPool.find( nData ); - - // apparently, files with invalid index occur in the wild -> don't crash then - OSL_ENSURE( loc != aLotusPatternPool.end(), "invalid format index" ); - if ( loc != aLotusPatternPool.end() ) - pDoc->ApplyPatternAreaTab( nCol, nRow, nCol + nColCount - 1, nRow + nRowCount - 1, static_cast< SCTAB >( nTab + i ), loc->second ); - } - } - else - rStream.SeekRel( nLength ); - break; - default: - rStream.SeekRel( nLength ); - break; - } - } - while( nLevel && !rStream.IsEof() ); - - aLotusPatternPool.clear(); -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |