blob: 8ee0af7f890f13b38f25e5363b623e1c4c87fb02 [file] [log] [blame]
/**************************************************************
*
* 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_sc.hxx"
#include <sal/config.h>
#include <stdio.h>
#include <sfx2/docfile.hxx>
#include "qproform.hxx"
#include "qpro.hxx"
#include "qprostyle.hxx"
#include "global.hxx"
#include "scerrors.hxx"
#include "docpool.hxx"
#include "patattr.hxx"
#include "filter.hxx"
#include "document.hxx"
#include "cell.hxx"
#include "biff.hxx"
#include <tools/stream.hxx>
FltError ScQProReader::readSheet( SCTAB nTab, ScDocument* pDoc, ScQProStyle *pStyle )
{
FltError eRet = eERR_OK;
sal_uInt8 nCol, nDummy;
sal_uInt16 nRow;
sal_uInt16 nStyle;
bool bEndOfSheet = false;
#ifdef DEBUG
fprintf( stderr, "Read sheet (%d)\n", nTab );
#endif
while( eERR_OK == eRet && !bEndOfSheet && nextRecord() )
{
switch( getId() )
{
case 0x000f:{ // Label cell
String aLabel;
*mpStream >> nCol >> nDummy >> nRow >> nStyle >> nDummy;
sal_uInt16 nLen = getLength();
if (nLen >= 7)
{
readString( aLabel, nLen - 7 );
nStyle = nStyle >> 3;
pStyle->SetFormat( pDoc, nCol, nRow, nTab, nStyle );
pDoc->PutCell( nCol, nRow, nTab, ScBaseCell::CreateTextCell( aLabel, pDoc ), (sal_Bool) sal_True );
}
else
eRet = eERR_FORMAT;
}
break;
case 0x00cb: // End of sheet
bEndOfSheet = true;
break;
case 0x000c: // Blank cell
*mpStream >> nCol >> nDummy >> nRow >> nStyle;
nStyle = nStyle >> 3;
pStyle->SetFormat( pDoc, nCol, nRow, nTab, nStyle );
break;
case 0x000d:{ // Integer cell
sal_Int16 nValue;
*mpStream >> nCol >> nDummy >> nRow >> nStyle >> nValue;
ScValueCell* pInteger = new ScValueCell( ( double ) nValue );
nStyle = nStyle >> 3;
pStyle->SetFormat( pDoc, nCol, nRow, nTab, nStyle );
pDoc->PutCell(nCol ,nRow, nTab ,pInteger,(sal_Bool) sal_True);
}
break;
case 0x000e:{ // Floating point cell
double nValue;
*mpStream >> nCol >> nDummy >> nRow >> nStyle >> nValue;
ScValueCell* pFloat = new ScValueCell( nValue );
nStyle = nStyle >> 3;
pStyle->SetFormat( pDoc, nCol, nRow, nTab, nStyle );
pDoc->PutCell( nCol, nRow, nTab, pFloat, (sal_Bool) sal_True );
}
break;
case 0x0010:{ // Formula cell
double nValue;
sal_uInt16 nState, nLen;
*mpStream >> nCol >> nDummy >> nRow >> nStyle >> nValue >> nState >> nLen;
ScAddress aAddr( nCol, nRow, nTab );
const ScTokenArray *pArray;
QProToSc aConv( *mpStream, aAddr );
if (ConvOK != aConv.Convert( pArray, nLen ))
eRet = eERR_FORMAT;
else
{
ScFormulaCell *pFormula = new ScFormulaCell( pDoc, aAddr, pArray );
nStyle = nStyle >> 3;
pFormula->AddRecalcMode( RECALCMODE_ONLOAD_ONCE );
pStyle->SetFormat( pDoc, nCol, nRow, nTab, nStyle );
pDoc->PutCell( nCol, nRow, nTab, pFormula, ( sal_Bool ) sal_True );
}
}
break;
}
}
return eRet;
}
FltError ScFormatFilterPluginImpl::ScImportQuattroPro( SfxMedium &rMedium, ScDocument *pDoc )
{
FltError eRet = eERR_OK;
ScQProReader aReader( rMedium );
eRet = aReader.import( pDoc );
return eRet;
}
ScQProReader::ScQProReader( SfxMedium &rMedium ):
ScBiffReader( rMedium )
{
}
FltError ScQProReader::import( ScDocument *pDoc )
{
FltError eRet = eERR_OK;
sal_uInt16 nVersion;
sal_uInt16 i = 1, j = 1;
SCTAB nTab = 0;
SetEof( sal_False );
if( !recordsLeft() )
return eERR_OPEN;
ScQProStyle *pStyleElement = new ScQProStyle;
while( nextRecord() && eRet == eERR_OK)
{
switch( getId() )
{
case 0x0000: // Begginning of file
*mpStream >> nVersion;
break;
case 0x00ca: // Beginning of sheet
if( nTab <= MAXTAB )
{
if( nTab < 26 )
{
String aName;
aName.Append( sal_Unicode( 'A' + nTab ) );
if (!nTab)
pDoc->RenameTab( nTab, aName, sal_False, sal_False);
else
pDoc->InsertTab( nTab, aName );
}
eRet = readSheet( nTab, pDoc, pStyleElement );
nTab++;
}
break;
case 0x0001: // End of file
SetEof( sal_True );
break;
case 0x00ce:{ // Attribute cell
sal_uInt8 nFormat, nAlign, nFont;
sal_Int16 nColor;
*mpStream >> nFormat >> nAlign >> nColor >> nFont;
pStyleElement->setAlign( i, nAlign );
pStyleElement->setFont( i, nFont );
i++;
}
break;
case 0x00cf:{ // Font description
sal_uInt16 nPtSize, nFontAttr;
String aLabel;
*mpStream >> nPtSize >> nFontAttr;
pStyleElement->setFontRecord( j, nFontAttr, nPtSize );
sal_uInt16 nLen = getLength();
if (nLen >= 4)
readString( aLabel, nLen - 4 );
else
eRet = eERR_FORMAT;
pStyleElement->setFontType( j, aLabel );
j++;
}
break;
}
}
pDoc->CalcAfterLoad();
delete pStyleElement;
return eRet;
}
bool ScQProReader::recordsLeft()
{
bool bValue = ScBiffReader::recordsLeft();
return bValue;
}
bool ScQProReader::nextRecord()
{
bool bValue = ScBiffReader::nextRecord();
return bValue;
}
void ScQProReader::readString( String &rString, sal_uInt16 nLength )
{
sal_Char* pText = new sal_Char[ nLength + 1 ];
mpStream->Read( pText, nLength );
pText[ nLength ] = 0;
rString = String( pText, mpStream->GetStreamCharSet() );
delete [] pText;
}