[Libreoffice-commits] .: sc/inc sc/source

Eike Rathke erack at kemper.freedesktop.org
Tue Apr 10 14:51:07 PDT 2012


 sc/inc/scerrors.hxx             |    5 +-
 sc/source/ui/dbgui/csvgrid.cxx  |    5 ++
 sc/source/ui/docshell/docsh.cxx |   16 ++++++---
 sc/source/ui/docshell/impex.cxx |   70 +++++++++++++++++++++++++---------------
 sc/source/ui/inc/impex.hxx      |   13 +++++--
 sc/source/ui/src/scerrors.src   |    4 ++
 6 files changed, 77 insertions(+), 36 deletions(-)

New commits:
commit 684cf5cca6ea6c8fc2743f1622f624f668db9e84
Author: Eike Rathke <erack at redhat.com>
Date:   Tue Apr 10 23:50:29 2012 +0200

    resolved fdo#48516 use "max columns exceeded" message if appropriate
    
    In CSV import, instead of SCWARN_IMPORT_RANGE_OVERFLOW use
    SCWARN_IMPORT_ROW_OVERFLOW and SCWARN_IMPORT_COLUMN_OVERFLOW that already
    existed, additionally introduced SCWARN_IMPORT_CELL_OVERFLOW if single field
    data exceeds STRING_MAXLEN.
    
    Row overflow takes precedence over column overflow that takes precedence over
    cell overflow.

diff --git a/sc/inc/scerrors.hxx b/sc/inc/scerrors.hxx
index fc6b9cb..ea7e590 100644
--- a/sc/inc/scerrors.hxx
+++ b/sc/inc/scerrors.hxx
@@ -60,9 +60,10 @@
 
 // ERRCODE_CLASS_IMPORT - does not display "Read-Error" in MsgBox
 #define SCWARN_IMPORT_RANGE_OVERFLOW (  1 | ERRCODE_CLASS_IMPORT | ERRCODE_WARNING_MASK | ERRCODE_AREA_SC )
-#define SCWARN_IMPORT_ROW_OVERFLOW (  2 | ERRCODE_CLASS_IMPORT | ERRCODE_WARNING_MASK | ERRCODE_AREA_SC )
-#define SCWARN_IMPORT_COLUMN_OVERFLOW (  3 | ERRCODE_CLASS_IMPORT | ERRCODE_WARNING_MASK | ERRCODE_AREA_SC )
+#define SCWARN_IMPORT_ROW_OVERFLOW  (   2 | ERRCODE_CLASS_IMPORT | ERRCODE_WARNING_MASK | ERRCODE_AREA_SC )
+#define SCWARN_IMPORT_COLUMN_OVERFLOW ( 3 | ERRCODE_CLASS_IMPORT | ERRCODE_WARNING_MASK | ERRCODE_AREA_SC )
 #define SCWARN_IMPORT_SHEET_OVERFLOW (  4 | ERRCODE_CLASS_IMPORT | ERRCODE_WARNING_MASK | ERRCODE_AREA_SC )
+#define SCWARN_IMPORT_CELL_OVERFLOW (   5 | ERRCODE_CLASS_IMPORT | ERRCODE_WARNING_MASK | ERRCODE_AREA_SC )
 
 // ERRCODE_CLASS_EXPORT - does not display "Write-Error" in MsgBox
 #define SCWARN_EXPORT_NONCONVERTIBLE_CHARS  (   1 | ERRCODE_CLASS_EXPORT | ERRCODE_WARNING_MASK | ERRCODE_AREA_SC )
diff --git a/sc/source/ui/dbgui/csvgrid.cxx b/sc/source/ui/dbgui/csvgrid.cxx
index 09d3651..68c6fd9 100644
--- a/sc/source/ui/dbgui/csvgrid.cxx
+++ b/sc/source/ui/dbgui/csvgrid.cxx
@@ -750,7 +750,10 @@ void ScCsvGrid::ImplSetTextLineSep(
     {
         // scan for next cell text
         bool bIsQuoted = false;
-        pChar = ScImportExport::ScanNextFieldFromString( pChar, aCellText, cTextSep, pSepChars, bMergeSep, bIsQuoted );
+        bool bOverflowCell = false;
+        pChar = ScImportExport::ScanNextFieldFromString( pChar, aCellText,
+                cTextSep, pSepChars, bMergeSep, bIsQuoted, bOverflowCell );
+        /* TODO: signal overflow somewhere in UI */
 
         // update column width
         sal_Int32 nWidth = Max( CSV_MINCOLWIDTH, aCellText.Len() + sal_Int32( 1 ) );
diff --git a/sc/source/ui/docshell/docsh.cxx b/sc/source/ui/docshell/docsh.cxx
index 3e931c4..57e2ee4 100644
--- a/sc/source/ui/docshell/docsh.cxx
+++ b/sc/source/ui/docshell/docsh.cxx
@@ -1170,7 +1170,8 @@ sal_Bool ScDocShell::ConvertFrom( SfxMedium& rMedium )
             }
 
             FltError eError = eERR_OK;
-            sal_Bool bOverflow = false;
+            bool bOverflowRow, bOverflowCol, bOverflowCell;
+            bOverflowRow = bOverflowCol = bOverflowCell = false;
 
             if( ! rMedium.IsStorage() )
             {
@@ -1186,7 +1187,9 @@ sal_Bool ScDocShell::ConvertFrom( SfxMedium& rMedium )
                     eError = bRet ? eERR_OK : SCERR_IMPORT_CONNECT;
                     aDocument.StartAllListeners();
                     aDocument.SetDirty();
-                    bOverflow = aImpEx.IsOverflow();
+                    bOverflowRow = aImpEx.IsOverflowRow();
+                    bOverflowCol = aImpEx.IsOverflowCol();
+                    bOverflowCell = aImpEx.IsOverflowCell();
                 }
                 else
                 {
@@ -1199,10 +1202,13 @@ sal_Bool ScDocShell::ConvertFrom( SfxMedium& rMedium )
                 if (!GetError())
                     SetError(eError, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ));
             }
-            else if ( bOverflow )
+            else if (!GetError() && (bOverflowRow || bOverflowCol || bOverflowCell))
             {
-                if (!GetError())
-                    SetError(SCWARN_IMPORT_RANGE_OVERFLOW, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ));
+                // precedence: row, column, cell
+                FltError nWarn = (bOverflowRow ? SCWARN_IMPORT_ROW_OVERFLOW :
+                        (bOverflowCol ? SCWARN_IMPORT_COLUMN_OVERFLOW :
+                         SCWARN_IMPORT_CELL_OVERFLOW));
+                SetError( nWarn, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ));
             }
             bSetColWidths = sal_True;
             bSetSimpleTextColWidths = sal_True;
diff --git a/sc/source/ui/docshell/impex.cxx b/sc/source/ui/docshell/impex.cxx
index 7f0b829..a8790bb 100644
--- a/sc/source/ui/docshell/impex.cxx
+++ b/sc/source/ui/docshell/impex.cxx
@@ -118,7 +118,8 @@ ScImportExport::ScImportExport( ScDocument* p )
       nSizeLimit( 0 ), cSep( '\t' ), cStr( '"' ),
       bFormulas( false ), bIncludeFiltered( true ),
       bAll( true ), bSingle( true ), bUndo( false ),
-      bOverflow( false ), mbApi( true ), mExportTextOptions()
+      bOverflowRow( false ), bOverflowCol( false ), bOverflowCell( false ),
+      mbApi( true ), mExportTextOptions()
 {
     pUndoDoc = NULL;
     pExtOptions = NULL;
@@ -133,7 +134,8 @@ ScImportExport::ScImportExport( ScDocument* p, const ScAddress& rPt )
       nSizeLimit( 0 ), cSep( '\t' ), cStr( '"' ),
       bFormulas( false ), bIncludeFiltered( true ),
       bAll( false ), bSingle( true ), bUndo( pDocSh != NULL ),
-      bOverflow( false ), mbApi( true ), mExportTextOptions()
+      bOverflowRow( false ), bOverflowCol( false ), bOverflowCell( false ),
+      mbApi( true ), mExportTextOptions()
 {
     pUndoDoc = NULL;
     pExtOptions = NULL;
@@ -149,7 +151,8 @@ ScImportExport::ScImportExport( ScDocument* p, const ScRange& r )
       nSizeLimit( 0 ), cSep( '\t' ), cStr( '"' ),
       bFormulas( false ), bIncludeFiltered( true ),
       bAll( false ), bSingle( false ), bUndo( pDocSh != NULL ),
-      bOverflow( false ), mbApi( true ), mExportTextOptions()
+      bOverflowRow( false ), bOverflowCol( false ), bOverflowCell( false ),
+      mbApi( true ), mExportTextOptions()
 {
     pUndoDoc = NULL;
     pExtOptions = NULL;
@@ -166,7 +169,8 @@ ScImportExport::ScImportExport( ScDocument* p, const String& rPos )
       nSizeLimit( 0 ), cSep( '\t' ), cStr( '"' ),
       bFormulas( false ), bIncludeFiltered( true ),
       bAll( false ), bSingle( true ), bUndo( pDocSh != NULL ),
-      bOverflow( false ), mbApi( true ), mExportTextOptions()
+      bOverflowRow( false ), bOverflowCol( false ), bOverflowCell( false ),
+      mbApi( true ), mExportTextOptions()
 {
     pUndoDoc = NULL;
     pExtOptions = NULL;
@@ -849,9 +853,7 @@ bool ScImportExport::Text2Doc( SvStream& rStrm )
                     while( *p && *p != cSep )
                         p++;
                     if (!lcl_appendLineData( aCell, q, p))
-                    {
-                        /* TODO: warning at UI, data truncated */
-                    }
+                        bOverflowCell = true;   // display warning on import
                     if( *p )
                         p++;
                 }
@@ -866,7 +868,12 @@ bool ScImportExport::Text2Doc( SvStream& rStrm )
                         pDoc->SetString( nCol, nRow, aRange.aStart.Tab(), aCell );
                 }
                 else                            // zuviele Spalten/Zeilen
-                    bOverflow = true;           // beim Import Warnung ausgeben
+                {
+                    if (!ValidRow(nRow))
+                        bOverflowRow = true;    // display warning on import
+                    if (!ValidCol(nCol))
+                        bOverflowCol = true;    // display warning on import
+                }
                 ++nCol;
             }
             ++nRow;
@@ -1144,7 +1151,8 @@ static bool lcl_PutString(
 }
 
 
-String lcl_GetFixed( const rtl::OUString& rLine, sal_Int32 nStart, sal_Int32 nNext, bool& rbIsQuoted )
+String lcl_GetFixed( const rtl::OUString& rLine, sal_Int32 nStart, sal_Int32 nNext,
+                     bool& rbIsQuoted, bool& rbOverflowCell )
 {
     sal_Int32 nLen = rLine.getLength();
     if (nNext > nLen)
@@ -1161,13 +1169,27 @@ String lcl_GetFixed( const rtl::OUString& rLine, sal_Int32 nStart, sal_Int32 nNe
     rbIsQuoted = (pStr[nStart] == sal_Unicode('"') && pStr[nSpace-1] == sal_Unicode('"'));
     if (rbIsQuoted)
     {
-        OSL_ENSURE( nSpace - nStart - 3 <= STRING_MAXLEN, "lcl_GetFixed: line doesn't fit into data");
-        return rLine.copy(nStart+1, nSpace-nStart-2);
+        bool bFits = (nSpace - nStart - 3 <= STRING_MAXLEN);
+        OSL_ENSURE( bFits, "lcl_GetFixed: line doesn't fit into data");
+        if (bFits)
+            return rLine.copy(nStart+1, nSpace-nStart-2);
+        else
+        {
+            rbOverflowCell = true;
+            return rLine.copy(nStart+1, STRING_MAXLEN);
+        }
     }
     else
     {
-        OSL_ENSURE( nSpace - nStart <= STRING_MAXLEN, "lcl_GetFixed: line doesn't fit into data");
-        return rLine.copy(nStart, nSpace-nStart);
+        bool bFits = (nSpace - nStart <= STRING_MAXLEN);
+        OSL_ENSURE( bFits, "lcl_GetFixed: line doesn't fit into data");
+        if (bFits)
+            return rLine.copy(nStart, nSpace-nStart);
+        else
+        {
+            rbOverflowCell = true;
+            return rLine.copy(nStart, STRING_MAXLEN);
+        }
     }
 }
 
@@ -1271,13 +1293,13 @@ bool ScImportExport::ExtText2Doc( SvStream& rStrm )
                     if (nFmt != SC_COL_SKIP)        // sonst auch nCol nicht hochzaehlen
                     {
                         if (nCol > MAXCOL)
-                            bOverflow = true;       // display warning on import
+                            bOverflowCol = true;    // display warning on import
                         else if (!bDetermineRange)
                         {
                             sal_Int32 nStart = pColStart[i];
                             sal_Int32 nNext = ( i+1 < nInfoCount ) ? pColStart[i+1] : nLineLen;
                             bool bIsQuoted = false;
-                            aCell = lcl_GetFixed( aLine, nStart, nNext, bIsQuoted );
+                            aCell = lcl_GetFixed( aLine, nStart, nNext, bIsQuoted, bOverflowCell );
                             if (bIsQuoted && bQuotedAsText)
                                 nFmt = SC_COL_TEXT;
 
@@ -1302,7 +1324,8 @@ bool ScImportExport::ExtText2Doc( SvStream& rStrm )
                 while (*p && nCol <= MAXCOL+1)
                 {
                     bool bIsQuoted = false;
-                    p = ScImportExport::ScanNextFieldFromString( p, aCell, cStr, pSeps, bMerge, bIsQuoted );
+                    p = ScImportExport::ScanNextFieldFromString( p, aCell,
+                            cStr, pSeps, bMerge, bIsQuoted, bOverflowCell );
 
                     sal_uInt8 nFmt = SC_COL_STANDARD;
                     for ( i=nInfoStart; i<nInfoCount; i++ )
@@ -1317,7 +1340,7 @@ bool ScImportExport::ExtText2Doc( SvStream& rStrm )
                     if ( nFmt != SC_COL_SKIP )
                     {
                         if (nCol > MAXCOL)
-                            bOverflow = true;       // display warning on import
+                            bOverflowCol = true;    // display warning on import
                         else if (!bDetermineRange)
                         {
                             if (bIsQuoted && bQuotedAsText)
@@ -1346,7 +1369,7 @@ bool ScImportExport::ExtText2Doc( SvStream& rStrm )
             ++nRow;
             if ( nRow > MAXROW )
             {
-                bOverflow = true;       // display warning on import
+                bOverflowRow = true;    // display warning on import
                 break;  // for
             }
         }
@@ -1399,7 +1422,8 @@ bool ScImportExport::ExtText2Doc( SvStream& rStrm )
 
 
 const sal_Unicode* ScImportExport::ScanNextFieldFromString( const sal_Unicode* p,
-        String& rField, sal_Unicode cStr, const sal_Unicode* pSeps, bool bMergeSeps, bool& rbIsQuoted )
+        String& rField, sal_Unicode cStr, const sal_Unicode* pSeps, bool bMergeSeps, bool& rbIsQuoted,
+        bool& rbOverflowCell )
 {
     rbIsQuoted = false;
     rField.Erase();
@@ -1427,9 +1451,7 @@ const sal_Unicode* ScImportExport::ScanNextFieldFromString( const sal_Unicode* p
         if (p > p1)
         {
             if (!lcl_appendLineData( rField, p1, p))
-            {
-                /* TODO: warning at UI, data truncated */
-            }
+                rbOverflowCell = true;
         }
         if( *p )
             p++;
@@ -1440,9 +1462,7 @@ const sal_Unicode* ScImportExport::ScanNextFieldFromString( const sal_Unicode* p
         while ( *p && !ScGlobal::UnicodeStrChr( pSeps, *p ) )
             p++;
         if (!lcl_appendLineData( rField, p0, p))
-        {
-            /* TODO: warning at UI, data truncated */
-        }
+            rbOverflowCell = true;
         if( *p )
             p++;
     }
diff --git a/sc/source/ui/inc/impex.hxx b/sc/source/ui/inc/impex.hxx
index 7db910d..03aff68 100644
--- a/sc/source/ui/inc/impex.hxx
+++ b/sc/source/ui/inc/impex.hxx
@@ -71,7 +71,9 @@ class SC_DLLPUBLIC ScImportExport
     bool        bAll;                   // keine Selektion
     bool        bSingle;                // Einfachselektion
     bool        bUndo;                  // Mit Undo?
-    bool        bOverflow;              // zuviele Zeilen/Spalten
+    bool        bOverflowRow;           // too many rows
+    bool        bOverflowCol;           // too many columns
+    bool        bOverflowCell;          // too much data for a cell
     bool        mbApi;
     ScExportTextOptions mExportTextOptions;
 
@@ -112,7 +114,8 @@ public:
 
     static bool  IsFormatSupported( sal_uLong nFormat );
     static const sal_Unicode* ScanNextFieldFromString( const sal_Unicode* p,
-            String& rField, sal_Unicode cStr, const sal_Unicode* pSeps, bool bMergeSeps, bool& rbIsQuoted );
+            String& rField, sal_Unicode cStr, const sal_Unicode* pSeps,
+            bool bMergeSeps, bool& rbIsQuoted, bool& rbOverflowCell );
     static  void    WriteUnicodeOrByteString( SvStream& rStrm, const String& rString, bool bZero = false );
     static  void    WriteUnicodeOrByteEndl( SvStream& rStrm );
     static  inline  bool    IsEndianSwap( const SvStream& rStrm );
@@ -146,7 +149,11 @@ public:
     bool ExportData( const String& rMimeType,
                      ::com::sun::star::uno::Any & rValue  );
 
-    bool IsOverflow() const { return bOverflow; }       // nach dem Importieren
+    // 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 String& GetNonConvertibleChars() const { return aNonConvertibleChars; }
 
diff --git a/sc/source/ui/src/scerrors.src b/sc/source/ui/src/scerrors.src
index f77dcf0..ae3ebd1 100644
--- a/sc/source/ui/src/scerrors.src
+++ b/sc/source/ui/src/scerrors.src
@@ -134,6 +134,10 @@ Resource RID_ERRHDLSC
     {
         Text [ en-US ] = "Not all sheets have been loaded because the maximum number of sheets was exceeded.\n\nPlease be warned that re-saving this document will permanently delete those sheets that have not been loaded!" ;
     };
+    String SCWARN_IMPORT_CELL_OVERFLOW & ERRCODE_RES_MASK
+    {
+        Text [ en-US ] = "The data could not be loaded completely because the maximum number of characters per cell was exceeded." ;
+    };
     String SCWARN_IMPORT_OPEN_FM3 & ERRCODE_RES_MASK
     {
         Text [ en-US ] = "Corresponding FM3-File could not be opened." ;


More information about the Libreoffice-commits mailing list