summaryrefslogtreecommitdiff
path: root/sc/source/filter/ftools/ftools.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sc/source/filter/ftools/ftools.cxx')
-rw-r--r--sc/source/filter/ftools/ftools.cxx406
1 files changed, 406 insertions, 0 deletions
diff --git a/sc/source/filter/ftools/ftools.cxx b/sc/source/filter/ftools/ftools.cxx
new file mode 100644
index 000000000000..72e5f115fed0
--- /dev/null
+++ b/sc/source/filter/ftools/ftools.cxx
@@ -0,0 +1,406 @@
+/*************************************************************************
+ *
+ * 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 "ftools.hxx"
+#include <tools/color.hxx>
+#include <unotools/charclass.hxx>
+#include <svl/itempool.hxx>
+#include <svl/itemset.hxx>
+#include <svl/poolitem.hxx>
+#include <sot/storage.hxx>
+
+#include <math.h>
+#include "global.hxx"
+#include "document.hxx"
+#include "stlpool.hxx"
+#include "stlsheet.hxx"
+#include "compiler.hxx"
+
+#include <stdio.h>
+
+// ============================================================================
+// ScFilterTools::ReadLongDouble()
+
+#ifdef _MSC_VER
+#if _MSC_VER <= 800
+#undef __SIMPLE_FUNC
+#define __SIMPLE_FUNC
+#endif
+#endif
+
+double ScfTools::ReadLongDouble( SvStream& rStrm )
+
+#ifdef __SIMPLE_FUNC // for <=VC 1.5
+{
+ long double fRet;
+ rStrm.Read( &fRet, 10 );
+ return static_cast< double >( fRet );
+}
+#undef __SIMPLE_FUNC
+
+#else // detailed for all others
+{
+
+/*
+" M a p p i n g - G u i d e " 10-Byte Intel
+
+77777777 77666666 66665555 55555544 44444444 33333333 33222222 22221111 11111100 00000000 x10
+98765432 10987654 32109876 54321098 76543210 98765432 10987654 32109876 54321098 76543210 Bit-# total
+9 9 8 8 7 7 6 6 5 5 4 4 3 3 2 2 1 1 0 0 Byte-#
+76543210 76543210 76543210 76543210 76543210 76543210 76543210 76543210 76543210 76543210 Bit-# in Byte
+SEEEEEEE EEEEEEEE IMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM Group
+01111110 00000000 06665555 55555544 44444444 33333333 33222222 22221111 11111100 00000000 x10
+14321098 76543210 02109876 54321098 76543210 98765432 10987654 32109876 54321098 76543210 Bit in Group
+*/
+
+ register long double lfDouble = 0.0;
+ register long double lfFakt = 256.0;
+ sal_uInt8 pDouble10[ 10 ];
+
+ rStrm.Read( pDouble10, 10 ); // Intel-10 in pDouble10
+
+ lfDouble = static_cast< long double >( pDouble10[ 7 ] ); // Byte 7
+ lfDouble *= lfFakt;
+ lfDouble += static_cast< long double >( pDouble10[ 6 ] ); // Byte 6
+ lfDouble *= lfFakt;
+ lfDouble += static_cast< long double >( pDouble10[ 5 ] ); // Byte 5
+ lfDouble *= lfFakt;
+ lfDouble += static_cast< long double >( pDouble10[ 4 ] ); // Byte 4
+ lfDouble *= lfFakt;
+ lfDouble += static_cast< long double >( pDouble10[ 3 ] ); // Byte 3
+ lfDouble *= lfFakt;
+ lfDouble += static_cast< long double >( pDouble10[ 2 ] ); // Byte 2
+ lfDouble *= lfFakt;
+ lfDouble += static_cast< long double >( pDouble10[ 1 ] ); // Byte 1
+ lfDouble *= lfFakt;
+ lfDouble += static_cast< long double >( pDouble10[ 0 ] ); // Byte 0
+
+ // For value 0.0 all bits are zero; pow(2.0,-16446) does not work with CSet compilers
+ if( lfDouble != 0.0 )
+ {
+ // exponent
+ register sal_Int32 nExp;
+ nExp = pDouble10[ 9 ] & 0x7F;
+ nExp <<= 8;
+ nExp += pDouble10[ 8 ];
+ nExp -= 16446;
+
+ lfDouble *= pow( 2.0, static_cast< double >( nExp ) );
+ }
+
+ // sign
+ if( pDouble10[ 9 ] & 0x80 )
+ lfDouble *= static_cast< long double >( -1.0 );
+
+ return static_cast< double >( lfDouble );
+}
+#endif
+
+// *** common methods *** -----------------------------------------------------
+
+rtl_TextEncoding ScfTools::GetSystemTextEncoding()
+{
+ return gsl_getSystemTextEncoding();
+}
+
+String ScfTools::GetHexStr( sal_uInt16 nValue )
+{
+ const sal_Char pHex[] = "0123456789ABCDEF";
+ String aStr;
+
+ aStr += pHex[ nValue >> 12 ];
+ aStr += pHex[ (nValue >> 8) & 0x000F ];
+ aStr += pHex[ (nValue >> 4) & 0x000F ];
+ aStr += pHex[ nValue & 0x000F ];
+ return aStr;
+}
+
+sal_uInt8 ScfTools::GetMixedColorComp( sal_uInt8 nFore, sal_uInt8 nBack, sal_uInt8 nTrans )
+{
+ sal_Int32 nTemp = ((static_cast< sal_Int32 >( nBack ) - nFore) * nTrans) / 0x80 + nFore;
+ return static_cast< sal_uInt8 >( nTemp );
+}
+
+Color ScfTools::GetMixedColor( const Color& rFore, const Color& rBack, sal_uInt8 nTrans )
+{
+ return Color(
+ GetMixedColorComp( rFore.GetRed(), rBack.GetRed(), nTrans ),
+ GetMixedColorComp( rFore.GetGreen(), rBack.GetGreen(), nTrans ),
+ GetMixedColorComp( rFore.GetBlue(), rBack.GetBlue(), nTrans ) );
+}
+
+// *** conversion of names *** ------------------------------------------------
+
+/* XXX As in sc/source/core/tool/rangenam.cxx ScRangeData::IsValidName() */
+
+void ScfTools::ConvertToScDefinedName( String& rName )
+{
+ xub_StrLen nLen = rName.Len();
+ if( nLen && !ScCompiler::IsCharFlagAllConventions( rName, 0, SC_COMPILER_C_CHAR_NAME ) )
+ rName.SetChar( 0, '_' );
+ for( xub_StrLen nPos = 1; nPos < nLen; ++nPos )
+ if( !ScCompiler::IsCharFlagAllConventions( rName, nPos, SC_COMPILER_C_NAME ) )
+ rName.SetChar( nPos, '_' );
+}
+
+// *** streams and storages *** -----------------------------------------------
+
+SotStorageRef ScfTools::OpenStorageRead( SotStorageRef xStrg, const String& rStrgName )
+{
+ SotStorageRef xSubStrg;
+ if( xStrg.Is() && xStrg->IsContained( rStrgName ) )
+ xSubStrg = xStrg->OpenSotStorage( rStrgName, STREAM_STD_READ );
+ return xSubStrg;
+}
+
+SotStorageRef ScfTools::OpenStorageWrite( SotStorageRef xStrg, const String& rStrgName )
+{
+ SotStorageRef xSubStrg;
+ if( xStrg.Is() )
+ xSubStrg = xStrg->OpenSotStorage( rStrgName, STREAM_STD_WRITE );
+ return xSubStrg;
+}
+
+SotStorageStreamRef ScfTools::OpenStorageStreamRead( SotStorageRef xStrg, const String& rStrmName )
+{
+ SotStorageStreamRef xStrm;
+ if( xStrg.Is() && xStrg->IsContained( rStrmName ) && xStrg->IsStream( rStrmName ) )
+ xStrm = xStrg->OpenSotStream( rStrmName, STREAM_STD_READ );
+ return xStrm;
+}
+
+SotStorageStreamRef ScfTools::OpenStorageStreamWrite( SotStorageRef xStrg, const String& rStrmName )
+{
+ DBG_ASSERT( !xStrg || !xStrg->IsContained( rStrmName ), "ScfTools::OpenStorageStreamWrite - stream exists already" );
+ SotStorageStreamRef xStrm;
+ if( xStrg.Is() )
+ xStrm = xStrg->OpenSotStream( rStrmName, STREAM_STD_WRITE | STREAM_TRUNC );
+ return xStrm;
+}
+
+// *** item handling *** ------------------------------------------------------
+
+bool ScfTools::CheckItem( const SfxItemSet& rItemSet, USHORT nWhichId, bool bDeep )
+{
+ return rItemSet.GetItemState( nWhichId, bDeep ) == SFX_ITEM_SET;
+}
+
+bool ScfTools::CheckItems( const SfxItemSet& rItemSet, const USHORT* pnWhichIds, bool bDeep )
+{
+ DBG_ASSERT( pnWhichIds, "ScfTools::CheckItems - no which id list" );
+ for( const USHORT* pnWhichId = pnWhichIds; *pnWhichId != 0; ++pnWhichId )
+ if( CheckItem( rItemSet, *pnWhichId, bDeep ) )
+ return true;
+ return false;
+}
+
+void ScfTools::PutItem( SfxItemSet& rItemSet, const SfxPoolItem& rItem, sal_uInt16 nWhichId, bool bSkipPoolDef )
+{
+ if( !bSkipPoolDef || (rItem != rItemSet.GetPool()->GetDefaultItem( nWhichId )) )
+ rItemSet.Put( rItem, nWhichId );
+}
+
+void ScfTools::PutItem( SfxItemSet& rItemSet, const SfxPoolItem& rItem, bool bSkipPoolDef )
+{
+ PutItem( rItemSet, rItem, rItem.Which(), bSkipPoolDef );
+}
+
+// *** style sheet handling *** -----------------------------------------------
+
+namespace {
+
+ScStyleSheet& lclMakeStyleSheet( ScStyleSheetPool& rPool, const String& rStyleName, SfxStyleFamily eFamily, bool bForceName )
+{
+ // find an unused name
+ String aNewName( rStyleName );
+ sal_Int32 nIndex = 0;
+ SfxStyleSheetBase* pOldStyleSheet = 0;
+ while( SfxStyleSheetBase* pStyleSheet = rPool.Find( aNewName, eFamily ) )
+ {
+ if( !pOldStyleSheet )
+ pOldStyleSheet = pStyleSheet;
+ aNewName.Assign( rStyleName ).Append( ' ' ).Append( String::CreateFromInt32( ++nIndex ) );
+ }
+
+ // rename existing style
+ if( pOldStyleSheet && bForceName )
+ {
+ pOldStyleSheet->SetName( aNewName );
+ aNewName = rStyleName;
+ }
+
+ // create new style sheet
+ return static_cast< ScStyleSheet& >( rPool.Make( aNewName, eFamily, SFXSTYLEBIT_USERDEF ) );
+}
+
+} // namespace
+
+ScStyleSheet& ScfTools::MakeCellStyleSheet( ScStyleSheetPool& rPool, const String& rStyleName, bool bForceName )
+{
+ return lclMakeStyleSheet( rPool, rStyleName, SFX_STYLE_FAMILY_PARA, bForceName );
+}
+
+ScStyleSheet& ScfTools::MakePageStyleSheet( ScStyleSheetPool& rPool, const String& rStyleName, bool bForceName )
+{
+ return lclMakeStyleSheet( rPool, rStyleName, SFX_STYLE_FAMILY_PAGE, bForceName );
+}
+
+// *** byte string import operations *** --------------------------------------
+
+ByteString ScfTools::ReadCString( SvStream& rStrm )
+{
+ ByteString aRet;
+ sal_Char cChar;
+
+ rStrm >> cChar;
+ while( cChar )
+ {
+ aRet += cChar;
+ rStrm >> cChar;
+ }
+ return aRet;
+}
+
+ByteString ScfTools::ReadCString( SvStream& rStrm, sal_Int32& rnBytesLeft )
+{
+ ByteString aRet;
+ sal_Char cChar;
+
+ rStrm >> cChar;
+ rnBytesLeft--;
+ while( cChar )
+ {
+ aRet += cChar;
+ rStrm >> cChar;
+ rnBytesLeft--;
+ }
+
+ return aRet;
+}
+
+void ScfTools::AppendCString( SvStream& rStrm, ByteString& rString )
+{
+ sal_Char cChar;
+
+ rStrm >> cChar;
+ while( cChar )
+ {
+ rString += cChar;
+ rStrm >> cChar;
+ }
+}
+
+void ScfTools::AppendCString( SvStream& rStrm, String& rString, rtl_TextEncoding eTextEnc )
+{
+ ByteString aByteString;
+ AppendCString( rStrm, aByteString );
+ rString += String( aByteString, eTextEnc );
+}
+
+// *** HTML table names <-> named range names *** -----------------------------
+
+const String& ScfTools::GetHTMLDocName()
+{
+ static const String saHTMLDoc( RTL_CONSTASCII_USTRINGPARAM( "HTML_all" ) );
+ return saHTMLDoc;
+}
+
+const String& ScfTools::GetHTMLTablesName()
+{
+ static const String saHTMLTables( RTL_CONSTASCII_USTRINGPARAM( "HTML_tables" ) );
+ return saHTMLTables;
+}
+
+const String& ScfTools::GetHTMLIndexPrefix()
+{
+ static const String saHTMLIndexPrefix( RTL_CONSTASCII_USTRINGPARAM( "HTML_" ) );
+ return saHTMLIndexPrefix;
+
+}
+
+const String& ScfTools::GetHTMLNamePrefix()
+{
+ static const String saHTMLNamePrefix( RTL_CONSTASCII_USTRINGPARAM( "HTML__" ) );
+ return saHTMLNamePrefix;
+}
+
+String ScfTools::GetNameFromHTMLIndex( sal_uInt32 nIndex )
+{
+ String aName( GetHTMLIndexPrefix() );
+ aName += String::CreateFromInt32( static_cast< sal_Int32 >( nIndex ) );
+ return aName;
+}
+
+String ScfTools::GetNameFromHTMLName( const String& rTabName )
+{
+ String aName( GetHTMLNamePrefix() );
+ aName += rTabName;
+ return aName;
+}
+
+bool ScfTools::IsHTMLDocName( const String& rSource )
+{
+ return rSource.EqualsIgnoreCaseAscii( GetHTMLDocName() );
+}
+
+bool ScfTools::IsHTMLTablesName( const String& rSource )
+{
+ return rSource.EqualsIgnoreCaseAscii( GetHTMLTablesName() );
+}
+
+bool ScfTools::GetHTMLNameFromName( const String& rSource, String& rName )
+{
+ rName.Erase();
+ if( rSource.EqualsIgnoreCaseAscii( GetHTMLNamePrefix(), 0, GetHTMLNamePrefix().Len() ) )
+ {
+ rName = rSource.Copy( GetHTMLNamePrefix().Len() );
+ ScGlobal::AddQuotes( rName, '"', false );
+ }
+ else if( rSource.EqualsIgnoreCaseAscii( GetHTMLIndexPrefix(), 0, GetHTMLIndexPrefix().Len() ) )
+ {
+ String aIndex( rSource.Copy( GetHTMLIndexPrefix().Len() ) );
+ if( CharClass::isAsciiNumeric( aIndex ) && (aIndex.ToInt32() > 0) )
+ rName = aIndex;
+ }
+ return rName.Len() > 0;
+}
+
+// ============================================================================
+
+ScFormatFilterPluginImpl::ScFormatFilterPluginImpl()
+{
+}
+
+ScFormatFilterPlugin * SAL_CALL ScFilterCreate(void)
+{
+ return new ScFormatFilterPluginImpl();
+}
+
+// implementation class inside the filters
+