summaryrefslogtreecommitdiffstats
path: root/sc/source/ui/inc/impex.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'sc/source/ui/inc/impex.hxx')
-rw-r--r--sc/source/ui/inc/impex.hxx241
1 files changed, 241 insertions, 0 deletions
diff --git a/sc/source/ui/inc/impex.hxx b/sc/source/ui/inc/impex.hxx
new file mode 100644
index 000000000..aafeb00c9
--- /dev/null
+++ b/sc/source/ui/inc/impex.hxx
@@ -0,0 +1,241 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include <o3tl/deleter.hxx>
+#include <sot/formats.hxx>
+#include <address.hxx>
+#include <tools/stream.hxx>
+
+#include <com/sun/star/uno/Any.hxx>
+
+class ScDocShell;
+class ScDocument;
+class ScAsciiOptions;
+
+/**
+ * These options control how multi-line cells are converted during export in
+ * certain lossy formats (such as csv).
+ */
+struct ScExportTextOptions
+{
+ enum NewlineConversion { ToSystem, ToSpace, None };
+ ScExportTextOptions( NewlineConversion eNewlineConversion = ToSystem, sal_Unicode cSeparatorConvertTo = 0, bool bAddQuotes = false ) :
+ meNewlineConversion( eNewlineConversion ), mcSeparatorConvertTo( cSeparatorConvertTo ), mbAddQuotes( bAddQuotes ) {}
+
+ NewlineConversion meNewlineConversion;
+ sal_Unicode mcSeparatorConvertTo; // Convert separator to this character
+ bool mbAddQuotes;
+};
+
+class SC_DLLPUBLIC ScImportExport
+{
+ ScDocShell* pDocSh;
+ ScDocument& rDoc;
+ std::unique_ptr<ScDocument, o3tl::default_delete<ScDocument>> pUndoDoc;
+ ScRange aRange;
+ OUString aStreamPath;
+ OUString aNonConvertibleChars;
+ OUString maFilterOptions;
+ sal_uInt32 nSizeLimit;
+ SCROW nMaxImportRow;
+ sal_Unicode cSep; // Separator
+ sal_Unicode cStr; // String Delimiter
+ bool bFormulas; // Formula in Text?
+ bool bIncludeFiltered; // include filtered rows? (default true)
+ bool bAll; // no selection
+ bool bSingle; // Single selection
+ bool bUndo; // with Undo?
+ bool bOverflowRow; // too many rows
+ bool bOverflowCol; // too many columns
+ bool bOverflowCell; // too much data for a cell
+ bool mbApi;
+ bool mbImportBroadcast; // whether or not to broadcast after data import.
+ bool mbOverwriting; // Whether we could be overwriting existing values (paste).
+ // In this case we cannot use the insert optimization, but we
+ // do not need to broadcast after the import.
+ ScExportTextOptions mExportTextOptions;
+
+ std::unique_ptr<ScAsciiOptions> pExtOptions; // extended options
+
+ bool StartPaste(); // Protect check, set up Undo
+ void EndPaste(bool bAutoRowHeight = true); // Undo/Redo actions, Repaint
+ bool Doc2Text( SvStream& );
+ bool Text2Doc( SvStream& );
+ bool Doc2Sylk( SvStream& );
+ bool Sylk2Doc( SvStream& );
+ bool Doc2HTML( SvStream&, const OUString& );
+ bool Doc2RTF( SvStream& );
+ bool Doc2Dif( SvStream& );
+ bool Dif2Doc( SvStream& );
+ bool ExtText2Doc( SvStream& ); // with pExtOptions
+ bool RTF2Doc( SvStream&, const OUString& rBaseURL );
+ bool HTML2Doc( SvStream&, const OUString& rBaseURL );
+
+public:
+ ScImportExport( ScDocument& ); // the whole document
+ ScImportExport( ScDocument&, const OUString& ); // Range/cell input
+ ScImportExport( ScDocument&, const ScAddress& );
+ ScImportExport( ScDocument&, const ScRange& );
+ ~ScImportExport() COVERITY_NOEXCEPT_FALSE;
+
+ void SetExtOptions( const ScAsciiOptions& rOpt );
+ void SetFilterOptions( const OUString& rFilterOptions );
+ bool IsRef() const { return !bAll; }
+
+ const ScRange& GetRange() const { return aRange; }
+
+ static void EmbeddedNullTreatment( OUString & rStr );
+
+ static bool IsFormatSupported( SotClipboardFormatId nFormat );
+ static const sal_Unicode* ScanNextFieldFromString( const sal_Unicode* p,
+ OUString& rField, sal_Unicode cStr, const sal_Unicode* pSeps,
+ bool bMergeSeps, bool& rbIsQuoted, bool& rbOverflowCell, bool bRemoveSpace );
+ static void WriteUnicodeOrByteString( SvStream& rStrm, const OUString& rString, bool bZero = false );
+ static void WriteUnicodeOrByteEndl( SvStream& rStrm );
+
+ /** ScImportExport::CountVisualWidth
+ Count the width of string visually ( in multiple of western characters), considering CJK
+ ideographs and CJK symbols (U+3000-U+303F) as twice the width of western characters.
+ @param rStr the string.
+ @param nIdx the starting index, index is incremented for each counted character.
+ @param nMaxWidth the maximum width to count.
+ @return the sum of the width of counted characters.
+ **/
+ static sal_Int32 CountVisualWidth(const OUString& rStr, sal_Int32& nIdx, sal_Int32 nMaxWidth);
+
+ /** ScImportExport::CountVisualWidth
+ @return the sum of the visual width of the whole string.
+ **/
+ static sal_Int32 CountVisualWidth(const OUString& rStr);
+
+ //! only if stream is only used in own (!) memory
+ static void SetNoEndianSwap( SvStream& rStrm );
+
+ void SetSeparator( sal_Unicode c ) { cSep = c; }
+ void SetDelimiter( sal_Unicode c ) { cStr = c; }
+ void SetFormulas( bool b ) { bFormulas = b; }
+ void SetIncludeFiltered( bool b ) { bIncludeFiltered = b; }
+
+ void SetStreamPath( const OUString& rPath ) { aStreamPath = rPath; }
+
+ bool ImportString( const OUString&, SotClipboardFormatId );
+ bool ExportString( OUString&, SotClipboardFormatId );
+ bool ExportByteString( OString&, rtl_TextEncoding, SotClipboardFormatId );
+
+ bool ImportStream( SvStream&, const OUString& rBaseURL, SotClipboardFormatId );
+ bool ExportStream( SvStream&, const OUString& rBaseURL, SotClipboardFormatId );
+
+ bool ExportData( const OUString& rMimeType,
+ css::uno::Any & rValue );
+
+ // after import
+ bool IsOverflowRow() const { return bOverflowRow; }
+ bool IsOverflowCol() const { return bOverflowCol; }
+ bool IsOverflowCell() const { return bOverflowCell; }
+ bool IsOverflow() const { return bOverflowRow || bOverflowCol || bOverflowCell; }
+
+ const OUString& GetNonConvertibleChars() const { return aNonConvertibleChars; }
+
+ void SetApi( bool bApi ) { mbApi = bApi; }
+ void SetImportBroadcast( bool b ) { mbImportBroadcast = b; }
+ void SetOverwriting( const bool bOverwriting ) { mbOverwriting = bOverwriting; }
+ void SetExportTextOptions( const ScExportTextOptions& options ) { mExportTextOptions = options; }
+};
+
+// Helper class for importing clipboard strings as streams.
+class ScImportStringStream : public SvMemoryStream
+{
+public:
+ ScImportStringStream(const OUString& rStr);
+};
+
+/** Read a CSV (comma separated values) data line using
+ ReadUniOrByteStringLine().
+
+ @param bEmbeddedLineBreak
+ If TRUE and a line-break occurs inside a field of data,
+ a line feed LF '\n' and the next line are appended. Repeats
+ until a line-break is not in a field. A field is determined
+ by delimiting rFieldSeparators and optionally surrounded by
+ a pair of cFieldQuote characters. For a line-break to be
+ within a field, the field content MUST be surrounded by
+ cFieldQuote characters, and the opening cFieldQuote MUST be
+ at the very start of a line or follow right behind a field
+ separator with no extra characters in between, with the
+ exception of blanks contradictory to RFC 4180. Anything,
+ including field separators and escaped quotes (by doubling
+ them) may appear in a quoted field.
+
+ If bEmbeddedLineBreak==FALSE, nothing is parsed and the
+ string returned is simply one ReadUniOrByteStringLine().
+
+ @param rFieldSeparators
+ A list of characters that each may act as a field separator.
+ If rcDetectSep was 0 and a separator is detected then it is appended to
+ rFieldSeparators.
+
+ @param cFieldQuote
+ The quote character used.
+
+ @param rcDetectSep
+ If 0 then attempt to detect a possible separator if
+ rFieldSeparators doesn't include it already. This can be necessary because
+ of the "accept broken misquoted CSV fields" feature that tries to ignore
+ trailing blanks after a quoted field and if no separator follows continues
+ to add content to the field assuming the single double quote was in error.
+ It is also necessary if the only possible separator was not selected and
+ not included in rFieldSeparators and a line starts with a quoted field, in
+ which case appending lines is tried until end of file.
+ If a separator is detected it is added to rFieldSeparators and the
+ line is reread with the new separators
+
+ @param nMaxSourceLines
+ Maximum source lines to read and combine into one logical line for embedded
+ new line purpose. Should be limited for the preview dialog because only
+ non-matching separators selected otherwise would lead to trying to
+ concatenate lines until file end.
+ If 0 no limit other than the internal arbitrary resulting line length
+ limit.
+
+ check Stream::good() to detect IO problems during read
+
+ @ATTENTION
+ Note that the string returned may be truncated even inside
+ a quoted field if some (arbitrary) maximum length was reached.
+ There currently is no way to exactly determine the conditions,
+ whether this was at a line end, or whether open quotes
+ would have closed the field before the line end, as even a
+ ReadUniOrByteStringLine() may return prematurely but the
+ stream was positioned ahead until the real end of line.
+ Additionally, due to character encoding conversions, string
+ length and bytes read don't necessarily match, and
+ resyncing to a previous position matching the string's
+ length isn't always possible. As a result, a logical line
+ with embedded line breaks and more than the maximum length
+ characters will be spoiled, and a subsequent ReadCsvLine()
+ may start under false preconditions.
+
+ */
+SC_DLLPUBLIC OUString ReadCsvLine( SvStream &rStream, bool bEmbeddedLineBreak,
+ OUString& rFieldSeparators, sal_Unicode cFieldQuote, sal_Unicode& rcDetectSep,
+ sal_uInt32 nMaxSourceLines = 0 );
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */