summaryrefslogtreecommitdiff
path: root/sc/source/filter/dif/difexp.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sc/source/filter/dif/difexp.cxx')
-rw-r--r--sc/source/filter/dif/difexp.cxx320
1 files changed, 320 insertions, 0 deletions
diff --git a/sc/source/filter/dif/difexp.cxx b/sc/source/filter/dif/difexp.cxx
new file mode 100644
index 000000000000..fc891c864a79
--- /dev/null
+++ b/sc/source/filter/dif/difexp.cxx
@@ -0,0 +1,320 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: difexp.cxx,v $
+ * $Revision: 1.11 $
+ *
+ * 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 <rtl/math.hxx>
+
+#include <stdio.h>
+
+#include "dif.hxx"
+#include "filter.hxx"
+#include "document.hxx"
+#include "cell.hxx"
+#include "globstr.hrc"
+#include "global.hxx"
+#include "progress.hxx"
+#include <rtl/tencinfo.h>
+#include "ftools.hxx"
+
+FltError ScFormatFilterPluginImpl::ScExportDif( SvStream& rStream, ScDocument* pDoc,
+ const ScAddress& rOutPos, const CharSet eNach, UINT32 nDifOption )
+{
+ SCCOL nEndCol;
+ SCROW nEndRow;
+ pDoc->GetTableArea( rOutPos.Tab(), nEndCol, nEndRow );
+ ScAddress aEnd( nEndCol, nEndRow, rOutPos.Tab() );
+ ScAddress aStart( rOutPos );
+
+ aStart.PutInOrder( aEnd );
+
+ return ScExportDif( rStream, pDoc, ScRange( aStart, aEnd ), eNach, nDifOption );
+}
+
+
+FltError ScFormatFilterPluginImpl::ScExportDif( SvStream& rOut, ScDocument* pDoc,
+ const ScRange&rRange, const CharSet eCharSet, UINT32 nDifOption )
+{
+ DBG_ASSERT( rRange.aStart <= rRange.aEnd, "*ScExportDif(): Range unsortiert!" );
+ DBG_ASSERTWARNING( rRange.aStart.Tab() == rRange.aEnd.Tab(),
+ "ScExportDif(): nur eine Tabelle bidde!" );
+
+ const CharSet eStreamCharSet = rOut.GetStreamCharSet();
+ if ( eStreamCharSet != eCharSet )
+ rOut.SetStreamCharSet( eCharSet );
+
+ sal_Unicode cStrDelim('"');
+ ByteString aStrDelimEncoded; // only used if not Unicode
+ UniString aStrDelimDecoded; // only used if context encoding
+ BOOL bContextOrNotAsciiEncoding;
+ if ( eCharSet == RTL_TEXTENCODING_UNICODE )
+ {
+ rOut.StartWritingUnicodeText();
+ bContextOrNotAsciiEncoding = FALSE;
+ }
+ else
+ {
+ aStrDelimEncoded = ByteString( cStrDelim, eCharSet );
+ rtl_TextEncodingInfo aInfo;
+ aInfo.StructSize = sizeof(aInfo);
+ if ( rtl_getTextEncodingInfo( eCharSet, &aInfo ) )
+ {
+ bContextOrNotAsciiEncoding =
+ (((aInfo.Flags & RTL_TEXTENCODING_INFO_CONTEXT) != 0) ||
+ ((aInfo.Flags & RTL_TEXTENCODING_INFO_ASCII) == 0));
+ if ( bContextOrNotAsciiEncoding )
+ aStrDelimDecoded = String( aStrDelimEncoded, eCharSet );
+ }
+ else
+ bContextOrNotAsciiEncoding = FALSE;
+ }
+
+ const sal_Char* p2DoubleQuotes_LF = "\"\"\n";
+ const sal_Char* pSpecDataType_LF = "-1,0\n";
+ const sal_Char* pEmptyData = "1,0\n\"\"\n";
+ const sal_Char* pStringData = "1,0\n";
+ const sal_Char* pNumData = "0,";
+ const sal_Char* pNumDataERROR = "0,0\nERROR\n";
+
+ FltError eRet = eERR_OK;
+ String aOS;
+ String aString;
+ SCCOL nEndCol = rRange.aEnd.Col();
+ SCROW nEndRow = rRange.aEnd.Row();
+ SCCOL nNumCols = nEndCol - rRange.aStart.Col() + 1;
+ SCROW nNumRows = nEndRow - rRange.aStart.Row() + 1;
+ SCTAB nTab = rRange.aStart.Tab();
+
+ double fVal;
+
+ const BOOL bPlain = ( nDifOption == SC_DIFOPT_PLAIN );
+
+ ScProgress aPrgrsBar( pDoc->GetDocumentShell(), ScGlobal::GetRscString( STR_LOAD_DOC ), nNumRows );
+
+ aPrgrsBar.SetState( 0 );
+
+ // TABLE
+ DBG_ASSERT( pDoc->HasTable( nTab ), "*ScExportDif(): Tabelle nicht vorhanden!" );
+
+ aOS = pKeyTABLE;
+ aOS.AppendAscii( "\n0,1\n\"" );
+
+ pDoc->GetName( nTab, aString );
+ aOS += aString;
+ aOS.AppendAscii( "\"\n" );
+ rOut.WriteUnicodeOrByteText( aOS );
+
+ // VECTORS
+ aOS = pKeyVECTORS;
+ aOS.AppendAscii( "\n0," );
+ aOS += String::CreateFromInt32( nNumCols );
+ aOS += sal_Unicode('\n');
+ aOS.AppendAscii( p2DoubleQuotes_LF );
+ rOut.WriteUnicodeOrByteText( aOS );
+
+ // TUPLES
+ aOS = pKeyTUPLES;
+ aOS.AppendAscii( "\n0," );
+ aOS += String::CreateFromInt32( nNumRows );
+ aOS += sal_Unicode('\n');
+ aOS.AppendAscii( p2DoubleQuotes_LF );
+ rOut.WriteUnicodeOrByteText( aOS );
+
+ // DATA
+ aOS = pKeyDATA;
+ aOS.AppendAscii( "\n0,0\n" );
+ aOS.AppendAscii( p2DoubleQuotes_LF );
+ rOut.WriteUnicodeOrByteText( aOS );
+
+ SCCOL nColCnt;
+ SCROW nRowCnt;
+ ScBaseCell* pAkt;
+
+ for( nRowCnt = rRange.aStart.Row() ; nRowCnt <= nEndRow ; nRowCnt++ )
+ {
+ aOS.AssignAscii( pSpecDataType_LF );
+ aOS += pKeyBOT;
+ aOS += sal_Unicode('\n');
+ rOut.WriteUnicodeOrByteText( aOS );
+ for( nColCnt = rRange.aStart.Col() ; nColCnt <= nEndCol ; nColCnt++ )
+ {
+ bool bWriteStringData = false;
+ pDoc->GetCell( nColCnt, nRowCnt, nTab, pAkt );
+ if( pAkt )
+ {
+ switch( pAkt->GetCellType() )
+ {
+ case CELLTYPE_NONE:
+ case CELLTYPE_NOTE:
+ aOS.AssignAscii( pEmptyData );
+ break;
+ case CELLTYPE_VALUE:
+ aOS.AssignAscii( pNumData );
+ if( bPlain )
+ {
+ fVal = ( ( ScValueCell * ) pAkt )->GetValue();
+ aOS += String( ::rtl::math::doubleToUString(
+ fVal, rtl_math_StringFormat_G, 14, '.',
+ TRUE));
+ }
+ else
+ {
+ pDoc->GetInputString( nColCnt, nRowCnt, nTab, aString );
+ aOS += aString;
+ }
+ aOS.AppendAscii( "\nV\n" );
+ break;
+ case CELLTYPE_EDIT:
+ ( ( ScEditCell* ) pAkt )->GetString( aString );
+ bWriteStringData = true;
+ break;
+ case CELLTYPE_STRING:
+ ( ( ScStringCell* ) pAkt )->GetString( aString );
+ bWriteStringData = true;
+ break;
+ case CELLTYPE_FORMULA:
+ if ( ((ScFormulaCell*)pAkt)->GetErrCode() )
+ aOS.AssignAscii( pNumDataERROR );
+ else if( pAkt->HasValueData() )
+ {
+ aOS.AssignAscii( pNumData );
+ if( bPlain )
+ {
+ fVal = ( ( ScFormulaCell * ) pAkt )->GetValue();
+ aOS += String( ::rtl::math::doubleToUString(
+ fVal, rtl_math_StringFormat_G, 14,
+ '.', TRUE));
+ }
+ else
+ {
+ pDoc->GetInputString( nColCnt, nRowCnt, nTab, aString );
+ aOS += aString;
+ }
+ aOS.AppendAscii( "\nV\n" );
+ }
+ else if( pAkt->HasStringData() )
+ {
+ ( ( ScFormulaCell * ) pAkt )->GetString( aString );
+ bWriteStringData = true;
+ }
+ else
+ aOS.AssignAscii( pNumDataERROR );
+
+ break;
+ default:;
+ }
+ }
+ else
+ aOS.AssignAscii( pEmptyData );
+
+ if ( !bWriteStringData )
+ rOut.WriteUnicodeOrByteText( aOS );
+ else
+ {
+ // for an explanation why this complicated, see
+ // sc/source/ui/docsh.cxx:ScDocShell::AsciiSave()
+ // In fact we should create a common method if this would be
+ // needed just one more time..
+ aOS.AssignAscii( pStringData );
+ rOut.WriteUnicodeOrByteText( aOS, eCharSet );
+ if ( eCharSet == RTL_TEXTENCODING_UNICODE )
+ {
+ xub_StrLen nPos = aString.Search( cStrDelim );
+ while ( nPos != STRING_NOTFOUND )
+ {
+ aString.Insert( cStrDelim, nPos );
+ nPos = aString.Search( cStrDelim, nPos+2 );
+ }
+ rOut.WriteUniOrByteChar( cStrDelim, eCharSet );
+ rOut.WriteUnicodeText( aString );
+ rOut.WriteUniOrByteChar( cStrDelim, eCharSet );
+ }
+ else if ( bContextOrNotAsciiEncoding )
+ {
+ // to byte encoding
+ ByteString aStrEnc( aString, eCharSet );
+ // back to Unicode
+ UniString aStrDec( aStrEnc, eCharSet );
+ // search on re-decoded string
+ xub_StrLen nPos = aStrDec.Search( aStrDelimDecoded );
+ while ( nPos != STRING_NOTFOUND )
+ {
+ aStrDec.Insert( aStrDelimDecoded, nPos );
+ nPos = aStrDec.Search( aStrDelimDecoded,
+ nPos+1+aStrDelimDecoded.Len() );
+ }
+ // write byte re-encoded
+ rOut.WriteUniOrByteChar( cStrDelim, eCharSet );
+ rOut.WriteUnicodeOrByteText( aStrDec, eCharSet );
+ rOut.WriteUniOrByteChar( cStrDelim, eCharSet );
+ }
+ else
+ {
+ ByteString aStrEnc( aString, eCharSet );
+ // search on encoded string
+ xub_StrLen nPos = aStrEnc.Search( aStrDelimEncoded );
+ while ( nPos != STRING_NOTFOUND )
+ {
+ aStrEnc.Insert( aStrDelimEncoded, nPos );
+ nPos = aStrEnc.Search( aStrDelimEncoded,
+ nPos+1+aStrDelimEncoded.Len() );
+ }
+ // write byte encoded
+ rOut.Write( aStrDelimEncoded.GetBuffer(),
+ aStrDelimEncoded.Len() );
+ rOut.Write( aStrEnc.GetBuffer(), aStrEnc.Len() );
+ rOut.Write( aStrDelimEncoded.GetBuffer(),
+ aStrDelimEncoded.Len() );
+ }
+ rOut.WriteUniOrByteChar( '\n', eCharSet );
+ }
+ }
+ aPrgrsBar.SetState( nRowCnt );
+ }
+
+ aOS.AssignAscii( pSpecDataType_LF );
+ aOS += pKeyEOD;
+ aOS += sal_Unicode('\n');
+ rOut.WriteUnicodeOrByteText( aOS );
+
+ // restore original value
+ rOut.SetStreamCharSet( eStreamCharSet );
+
+ return eRet;
+}
+
+
+
+