[Libreoffice-commits] .: 9 commits - filter/source oox/inc oox/source sc/inc sc/source
Eike Rathke
erack at kemper.freedesktop.org
Thu Nov 24 16:01:47 PST 2011
filter/source/config/fragments/types/calc_MS_Excel_40.xcu | 2
filter/source/config/fragments/types/calc_MS_Excel_40_VorlageTemplate.xcu | 2
filter/source/config/fragments/types/calc_MS_Excel_5095.xcu | 2
filter/source/config/fragments/types/calc_MS_Excel_5095_VorlageTemplate.xcu | 2
filter/source/config/fragments/types/calc_MS_Excel_95.xcu | 2
filter/source/config/fragments/types/calc_MS_Excel_95_VorlageTemplate.xcu | 2
filter/source/config/fragments/types/calc_MS_Excel_97.xcu | 2
filter/source/config/fragments/types/calc_MS_Excel_97_VorlageTemplate.xcu | 2
oox/inc/oox/xls/richstring.hxx | 1
oox/source/xls/commentsbuffer.cxx | 2
oox/source/xls/richstring.cxx | 16 ++--
oox/source/xls/worksheethelper.cxx | 5 +
sc/inc/dptabsrc.hxx | 1
sc/source/core/data/dptabsrc.cxx | 16 ++++
sc/source/core/data/table1.cxx | 1
sc/source/core/data/table5.cxx | 4 +
sc/source/filter/excel/impop.cxx | 4 -
sc/source/ui/unoobj/scdetect.cxx | 38 ++++++++--
sc/source/ui/view/drawutil.cxx | 12 +++
sc/source/ui/view/drawvie4.cxx | 2
sc/source/ui/view/drawview.cxx | 2
sc/source/ui/view/gridwin3.cxx | 2
sc/source/ui/view/gridwin4.cxx | 4 +
23 files changed, 99 insertions(+), 27 deletions(-)
New commits:
commit 31012ab9d7035f942486c87ecc1a79b4d6579975
Author: Eike Rathke <erack at redhat.com>
Date: Fri Nov 25 00:59:12 2011 +0100
Fixed #i116848# Shapes are at wrong position
# Original author: Niklas Nebel <nn at openoffice.org>
Taken from OOO340 repository, changeset 7ebd38de6d70 introduced with CWS dr78.
diff --git a/sc/source/ui/view/drawvie4.cxx b/sc/source/ui/view/drawvie4.cxx
index 1e6f330..cdd8abb 100644
--- a/sc/source/ui/view/drawvie4.cxx
+++ b/sc/source/ui/view/drawvie4.cxx
@@ -245,7 +245,7 @@ void ScDrawView::CalcNormScale( Fraction& rFractX, Fraction& rFractY ) const
if (nEndCol<20)
nEndCol = 20;
if (nEndRow<20)
- nEndRow = 1000;
+ nEndRow = 20;
Fraction aZoom(1,1);
ScDrawUtil::CalcScale( pDoc, nTab, 0,0, nEndCol,nEndRow, pDev, aZoom,aZoom,
diff --git a/sc/source/ui/view/drawview.cxx b/sc/source/ui/view/drawview.cxx
index bfd65dd..0494dcb 100644
--- a/sc/source/ui/view/drawview.cxx
+++ b/sc/source/ui/view/drawview.cxx
@@ -332,7 +332,7 @@ void ScDrawView::RecalcScale()
if (nEndCol<20)
nEndCol = 20;
if (nEndRow<20)
- nEndRow = 1000;
+ nEndRow = 20; // #i116848# instead of a large row number for an empty sheet, heights are multiplied in CalcScale
ScDrawUtil::CalcScale( pDoc, nTab, 0,0, nEndCol,nEndRow, pDev,aZoomX,aZoomY,nPPTX,nPPTY,
aScaleX,aScaleY );
diff --git a/sc/source/ui/view/gridwin3.cxx b/sc/source/ui/view/gridwin3.cxx
index 4e3189c..69a2b6a 100644
--- a/sc/source/ui/view/gridwin3.cxx
+++ b/sc/source/ui/view/gridwin3.cxx
@@ -266,7 +266,7 @@ MapMode ScGridWindow::GetDrawMapMode( bool bForce )
SCROW nEndRow = 0;
pDoc->GetTableArea( nTab, nEndCol, nEndRow );
if (nEndCol<20) nEndCol = 20;
- if (nEndRow<20) nEndRow = 1000;
+ if (nEndRow<20) nEndRow = 20;
ScDrawUtil::CalcScale( pDoc, nTab, 0,0, nEndCol,nEndRow, this,
pViewData->GetZoomX(),pViewData->GetZoomY(),
pViewData->GetPPTX(),pViewData->GetPPTY(),
commit 8a838b9fbf46ece9680824cd3a044ab7338bf306
Author: Eike Rathke <erack at redhat.com>
Date: Fri Nov 25 00:04:53 2011 +0100
calc69: #i118068# handle all-hidden case in ScDrawUtil::CalcScale
# Original author: Niklas Nebel <nn at openoffice.org>
* found as LGPLv3-only fix at svn rev 1172138 (http://svn.apache.org/viewvc?view=revision&revision=1172138)
Plus the original comment from the replaced code why it is there, to fix
#i116848#
diff --git a/sc/source/ui/view/drawutil.cxx b/sc/source/ui/view/drawutil.cxx
index 54b4ef9..1cb5c74 100644
--- a/sc/source/ui/view/drawutil.cxx
+++ b/sc/source/ui/view/drawutil.cxx
@@ -82,6 +82,18 @@ void ScDrawUtil::CalcScale( ScDocument* pDoc, SCTAB nTab,
nPixelY += ScViewData::ToPixel(nHeight, nPPTY);
}
+ // #i116848# To get a large-enough number for PixelToLogic, multiply the integer values
+ // instead of using a larger number of rows
+ if ( nTwipsY )
+ {
+ long nMultiply = 2000000 / nTwipsY;
+ if ( nMultiply > 1 )
+ {
+ nTwipsY *= nMultiply;
+ nPixelY *= nMultiply;
+ }
+ }
+
MapMode aHMMMode( MAP_100TH_MM, Point(), rZoomX, rZoomY );
Point aPixelLog = pDev->PixelToLogic( Point( nPixelX,nPixelY ), aHMMMode );
commit 73d344c18ead9a905871541d5d0d37c56c598a03
Author: Eike Rathke <erack at redhat.com>
Date: Thu Nov 24 23:44:05 2011 +0100
calc69: #i117952# invalidate page breaks when print range is removed
# Original author: Niklas Nebel <nn at openoffice.org>
* found as LGPLv3-only fix at svn rev 1172137 (http://svn.apache.org/viewvc?view=revision&revision=1172137)
diff --git a/sc/source/core/data/table1.cxx b/sc/source/core/data/table1.cxx
index e88fba6..b746ffc 100644
--- a/sc/source/core/data/table1.cxx
+++ b/sc/source/core/data/table1.cxx
@@ -1792,6 +1792,7 @@ void ScTable::RestorePrintRanges( const ScPrintSaverTab& rSaveTab )
SetRepeatColRange( rSaveTab.GetRepeatCol() );
SetRepeatRowRange( rSaveTab.GetRepeatRow() );
+ InvalidatePageBreaks(); // #i117952# forget page breaks for an old print range
UpdatePageBreaks(NULL);
}
diff --git a/sc/source/core/data/table5.cxx b/sc/source/core/data/table5.cxx
index c6999dc..e5d8dc8 100644
--- a/sc/source/core/data/table5.cxx
+++ b/sc/source/core/data/table5.cxx
@@ -1085,6 +1085,10 @@ Size ScTable::GetPageSize() const
void ScTable::SetRepeatArea( SCCOL nStartCol, SCCOL nEndCol, SCROW nStartRow, SCROW nEndRow )
{
+ // #i117952# page break calculation uses these values (set from ScPrintFunc), not pRepeatColRange/pRepeatRowRange
+ if ( nStartCol != nRepeatStartX || nEndCol != nRepeatEndX || nStartRow != nRepeatStartY || nEndRow != nRepeatEndY )
+ InvalidatePageBreaks();
+
nRepeatStartX = nStartCol;
nRepeatEndX = nEndCol;
nRepeatStartY = nStartRow;
commit 871b87f9d3787967bfe1ff9dd9314d7b2a0f19c3
Author: Eike Rathke <erack at redhat.com>
Date: Thu Nov 24 23:36:57 2011 +0100
calc69: #i117893# call GetSizePixel before setting bIsInPaint
# Original author: Niklas Nebel <nn at openoffice.org>
* found as LGPLv3-only fix at svn rev 1172136 (http://svn.apache.org/viewvc?view=revision&revision=1172136)
diff --git a/sc/source/ui/view/gridwin4.cxx b/sc/source/ui/view/gridwin4.cxx
index e1d582c..1f82d64 100644
--- a/sc/source/ui/view/gridwin4.cxx
+++ b/sc/source/ui/view/gridwin4.cxx
@@ -342,6 +342,10 @@ void ScGridWindow::Paint( const Rectangle& rRect )
return;
}
+ // #i117893# If GetSizePixel needs to call the resize handler, the resulting nested Paint call
+ // (possibly for a larger rectangle) has to be allowed. Call GetSizePixel before setting bIsInPaint.
+ GetSizePixel();
+
if (bIsInPaint)
return;
commit a70f7bfc5ee22aa54c98cb8aab69b5eb97a86bbd
Author: Eike Rathke <erack at redhat.com>
Date: Thu Nov 24 23:33:32 2011 +0100
calc69: #i117836# repair import of multiline cells and cells with leading font escapement
# Original author: Daniel Rentz [dr] <daniel.rentz at oracle.com>
* found as LGPLv3-only fix at svn rev 1172134 (http://svn.apache.org/viewvc?view=revision&revision=1172134)
diff --git a/oox/inc/oox/xls/richstring.hxx b/oox/inc/oox/xls/richstring.hxx
index cf20fba..8efffdf 100644
--- a/oox/inc/oox/xls/richstring.hxx
+++ b/oox/inc/oox/xls/richstring.hxx
@@ -276,6 +276,7 @@ public:
formatting for the first text portion, e.g. font escapement. */
void convert(
const ::com::sun::star::uno::Reference< ::com::sun::star::text::XText >& rxText,
+ bool bReplaceOld,
const Font* pFirstPortionFont = 0 ) const;
private:
diff --git a/oox/source/xls/commentsbuffer.cxx b/oox/source/xls/commentsbuffer.cxx
index c8a8d7d..55dd28b 100644
--- a/oox/source/xls/commentsbuffer.cxx
+++ b/oox/source/xls/commentsbuffer.cxx
@@ -284,7 +284,7 @@ void Comment::finalizeImport()
// insert text and convert text formatting
maModel.mxText->finalizeImport();
Reference< XText > xAnnoText( xAnnoShape, UNO_QUERY_THROW );
- maModel.mxText->convert( xAnnoText );
+ maModel.mxText->convert( xAnnoText, true );
}
catch( Exception& )
{
diff --git a/oox/source/xls/richstring.cxx b/oox/source/xls/richstring.cxx
index 6a2bbd9..7b025e5 100644
--- a/oox/source/xls/richstring.cxx
+++ b/oox/source/xls/richstring.cxx
@@ -110,9 +110,10 @@ void RichStringPortion::convert( const Reference< XText >& rxText, const Font* p
mxFont->writeToPropertySet( aPropSet, FONT_PROPTYPE_TEXT );
}
- /* Some font attributes cannot be set to cell formattiing in Calc but
- require to use rich formatting, e.g. font escapement. */
- if( lclNeedsRichTextFormat( pFont ) )
+ /* Some font attributes cannot be set to cell formatting in Calc but
+ require to use rich formatting, e.g. font escapement. But do not
+ use the passed font if this portion has its own font. */
+ else if( lclNeedsRichTextFormat( pFont ) )
{
PropertySet aPropSet( xRange );
pFont->writeToPropertySet( aPropSet, FONT_PROPTYPE_TEXT );
@@ -534,12 +535,12 @@ bool RichString::extractPlainString( OUString& orString, const Font* pFirstPorti
if( (maTextPortions.size() == 1) && !maTextPortions.front()->hasFont() && !lclNeedsRichTextFormat( pFirstPortionFont ) )
{
orString = maTextPortions.front()->getText();
- return true;
+ return orString.indexOf( '\x0A' ) < 0;
}
return false;
}
-void RichString::convert( const Reference< XText >& rxText, const Font* pFirstPortionFont ) const
+void RichString::convert( const Reference< XText >& rxText, bool bReplaceOld, const Font* pFirstPortionFont ) const
{
if (maTextPortions.size() == 1)
{
@@ -551,12 +552,11 @@ void RichString::convert( const Reference< XText >& rxText, const Font* pFirstPo
return;
}
- bool bReplace = true;
for( PortionVector::const_iterator aIt = maTextPortions.begin(), aEnd = maTextPortions.end(); aIt != aEnd; ++aIt )
{
- (*aIt)->convert( rxText, pFirstPortionFont, bReplace );
+ (*aIt)->convert( rxText, pFirstPortionFont, bReplaceOld );
pFirstPortionFont = 0; // use passed font for first portion only
- bReplace = false; // do not replace first portion text with following portions
+ bReplaceOld = false; // do not replace first portion text with following portions
}
}
diff --git a/oox/source/xls/worksheethelper.cxx b/oox/source/xls/worksheethelper.cxx
index a74e24f..02802a3 100644
--- a/oox/source/xls/worksheethelper.cxx
+++ b/oox/source/xls/worksheethelper.cxx
@@ -1679,7 +1679,10 @@ void WorksheetHelper::putRichString( const CellAddress& rAddress, const RichStri
{
Reference< XText > xText( getCell( rAddress ), UNO_QUERY );
OSL_ENSURE( xText.is(), "WorksheetHelper::putRichString - missing text interface" );
- rString.convert( xText, pFirstPortionFont );
+ /* Passing false will always append the portions to the XText. This is
+ essential for special rich formatting attributes at the leading text
+ portion supported by edit cells only, e.g. font escapement. */
+ rString.convert( xText, false, pFirstPortionFont );
}
void WorksheetHelper::putFormulaTokens( const CellAddress& rAddress, const ApiTokenSequence& rTokens ) const
commit 36018b12c460dd0e537f2a1aff8cb78a356cafbd
Author: Eike Rathke <erack at redhat.com>
Date: Thu Nov 24 23:01:47 2011 +0100
calc68: #i117728# allocate row/column outline buffers according to BIFF sheet size, not Calc sheet size
# Original author: Daniel Rentz [dr] <daniel.rentz at oracle.com>
* found as LGPLv3-only fix at svn rev 1166947 (http://svn.apache.org/viewvc?view=revision&revision=1166947)
diff --git a/sc/source/filter/excel/impop.cxx b/sc/source/filter/excel/impop.cxx
index dec262a..f30a4cb 100644
--- a/sc/source/filter/excel/impop.cxx
+++ b/sc/source/filter/excel/impop.cxx
@@ -1311,8 +1311,8 @@ void ImportExcel::PostDocLoad( void )
XclImpOutlineDataBuffer::XclImpOutlineDataBuffer( const XclImpRoot& rRoot, SCTAB nScTab ) :
XclImpRoot( rRoot ),
- mxColOutlineBuff( new XclImpOutlineBuffer( MAXCOLCOUNT ) ),
- mxRowOutlineBuff( new XclImpOutlineBuffer( MAXROWCOUNT ) ),
+ mxColOutlineBuff( new XclImpOutlineBuffer( rRoot.GetXclMaxPos().Col() + 1 ) ),
+ mxRowOutlineBuff( new XclImpOutlineBuffer( rRoot.GetXclMaxPos().Row() + 1 ) ),
mxColRowBuff( new XclImpColRowSettings( rRoot ) ),
mnScTab( nScTab )
{
commit d0cd63da64948d9a3ad885b696e44d5c5fcfd1ab
Author: Eike Rathke <erack at redhat.com>
Date: Thu Nov 24 22:27:45 2011 +0100
adapted FormatDetector patch to reality
diff --git a/sc/source/ui/unoobj/scdetect.cxx b/sc/source/ui/unoobj/scdetect.cxx
index 1fe317c..b2f9101 100644
--- a/sc/source/ui/unoobj/scdetect.cxx
+++ b/sc/source/ui/unoobj/scdetect.cxx
@@ -117,8 +117,7 @@ static const sal_Char pFilterExcel95[] = "MS Excel 95";
static const sal_Char pFilterEx95Temp[] = "MS Excel 95 Vorlage/Template";
static const sal_Char pFilterExcel97[] = "MS Excel 97";
static const sal_Char pFilterEx97Temp[] = "MS Excel 97 Vorlage/Template";
-static const sal_Char __FAR_DATA pFilterExcelXML[] = "MS Excel 2003 XML";
-static const sal_Char pFilter2003XML[] = "MS Excel 2003 XML";
+static const sal_Char pFilterExcelXML[] = "MS Excel 2003 XML";
static const sal_Char pFilterDBase[] = "dBase";
static const sal_Char pFilterDif[] = "DIF";
static const sal_Char pFilterSylk[] = "SYLK";
@@ -761,16 +760,11 @@ static sal_Bool lcl_MayBeDBase( SvStream& rStream )
else if ( bIsXLS && bMaybeText )
{
aHeader = comphelper::string::stripStart(aHeader, ' ');
- if( aHeader.CompareTo( "<?xml", 5 ) == COMPARE_EQUAL )
- pFilter = aMatcher.GetFilter4FilterName( String::CreateFromAscii(pFilter2003XML) );
- else
- {
- // Detect Excel 2003 XML here only if XLS was preselected.
- // The configured detection for Excel 2003 XML is still in XMLFilterDetect.
- pFilter = lcl_DetectExcelXML( rStr, aMatcher );
- if (!pFilter)
- pFilter = aMatcher.GetFilter4FilterName( String::CreateFromAscii(pFilterAscii) );
- }
+ // Detect Excel 2003 XML here only if XLS was preselected.
+ // The configured detection for Excel 2003 XML is still in XMLFilterDetect.
+ pFilter = lcl_DetectExcelXML( rStr, aMatcher );
+ if (!pFilter)
+ pFilter = aMatcher.GetFilter4FilterName( String::CreateFromAscii(pFilterAscii) );
bFakeXLS = true;
}
else if ( pPreselectedFilter->GetName().EqualsAscii(pFilterDBase) && lcl_MayBeDBase( rStr ) )
commit a185c4c15b16a9db61019aa0c94f3e67ca81699d
Author: Eike Rathke <erack at redhat.com>
Date: Thu Nov 24 22:21:41 2011 +0100
calc67: #i117735# use calc FormatDetector for XLS again, handle Excel 2003 XML directly in XLS detection
# Original author: Niklas Nebel <nn at openoffice.org>
* found as LGPLv3-only fix at svn rev 1167327 (http://svn.apache.org/viewvc?view=revision&revision=1167327)
diff --git a/filter/source/config/fragments/types/calc_MS_Excel_40.xcu b/filter/source/config/fragments/types/calc_MS_Excel_40.xcu
index 939a0a4..b45c21f 100644
--- a/filter/source/config/fragments/types/calc_MS_Excel_40.xcu
+++ b/filter/source/config/fragments/types/calc_MS_Excel_40.xcu
@@ -1,5 +1,5 @@
<node oor:name="calc_MS_Excel_40" oor:op="replace" >
- <prop oor:name="DetectService"><value>com.sun.star.comp.oox.xls.BiffDetector</value></prop>
+ <prop oor:name="DetectService"><value>com.sun.star.comp.calc.FormatDetector</value></prop>
<prop oor:name="URLPattern"/>
<prop oor:name="Extensions"><value>xls xlw xlc xlm</value></prop>
<prop oor:name="MediaType"><value>application/vnd.ms-excel</value></prop>
diff --git a/filter/source/config/fragments/types/calc_MS_Excel_40_VorlageTemplate.xcu b/filter/source/config/fragments/types/calc_MS_Excel_40_VorlageTemplate.xcu
index 291382d..42bb10e 100644
--- a/filter/source/config/fragments/types/calc_MS_Excel_40_VorlageTemplate.xcu
+++ b/filter/source/config/fragments/types/calc_MS_Excel_40_VorlageTemplate.xcu
@@ -1,5 +1,5 @@
<node oor:name="calc_MS_Excel_40_VorlageTemplate" oor:op="replace" >
- <prop oor:name="DetectService"><value>com.sun.star.comp.oox.xls.BiffDetector</value></prop>
+ <prop oor:name="DetectService"><value>com.sun.star.comp.calc.FormatDetector</value></prop>
<prop oor:name="URLPattern"/>
<prop oor:name="Extensions"><value>xlt</value></prop>
<prop oor:name="MediaType"><value>application/vnd.ms-excel</value></prop>
diff --git a/filter/source/config/fragments/types/calc_MS_Excel_5095.xcu b/filter/source/config/fragments/types/calc_MS_Excel_5095.xcu
index 5656b73..3f450f0 100644
--- a/filter/source/config/fragments/types/calc_MS_Excel_5095.xcu
+++ b/filter/source/config/fragments/types/calc_MS_Excel_5095.xcu
@@ -1,5 +1,5 @@
<node oor:name="calc_MS_Excel_5095" oor:op="replace" >
- <prop oor:name="DetectService"><value>com.sun.star.comp.oox.xls.BiffDetector</value></prop>
+ <prop oor:name="DetectService"><value>com.sun.star.comp.calc.FormatDetector</value></prop>
<prop oor:name="URLPattern"/>
<prop oor:name="Extensions"><value>xls xlc xlm xlw</value></prop>
<prop oor:name="MediaType"><value>application/vnd.ms-excel</value></prop>
diff --git a/filter/source/config/fragments/types/calc_MS_Excel_5095_VorlageTemplate.xcu b/filter/source/config/fragments/types/calc_MS_Excel_5095_VorlageTemplate.xcu
index 9c1799d..8dbb02c 100644
--- a/filter/source/config/fragments/types/calc_MS_Excel_5095_VorlageTemplate.xcu
+++ b/filter/source/config/fragments/types/calc_MS_Excel_5095_VorlageTemplate.xcu
@@ -1,5 +1,5 @@
<node oor:name="calc_MS_Excel_5095_VorlageTemplate" oor:op="replace" >
- <prop oor:name="DetectService"><value>com.sun.star.comp.oox.xls.BiffDetector</value></prop>
+ <prop oor:name="DetectService"><value>com.sun.star.comp.calc.FormatDetector</value></prop>
<prop oor:name="URLPattern"/>
<prop oor:name="Extensions"><value>xlt</value></prop>
<prop oor:name="MediaType"><value>application/vnd.ms-excel</value></prop>
diff --git a/filter/source/config/fragments/types/calc_MS_Excel_95.xcu b/filter/source/config/fragments/types/calc_MS_Excel_95.xcu
index 8e02ea8..0ea10dd 100644
--- a/filter/source/config/fragments/types/calc_MS_Excel_95.xcu
+++ b/filter/source/config/fragments/types/calc_MS_Excel_95.xcu
@@ -1,5 +1,5 @@
<node oor:name="calc_MS_Excel_95" oor:op="replace" >
- <prop oor:name="DetectService"><value>com.sun.star.comp.oox.xls.BiffDetector</value></prop>
+ <prop oor:name="DetectService"><value>com.sun.star.comp.calc.FormatDetector</value></prop>
<prop oor:name="URLPattern"/>
<prop oor:name="Extensions"><value>xls xlc xlm xlw</value></prop>
<prop oor:name="MediaType"><value>application/vnd.ms-excel</value></prop>
diff --git a/filter/source/config/fragments/types/calc_MS_Excel_95_VorlageTemplate.xcu b/filter/source/config/fragments/types/calc_MS_Excel_95_VorlageTemplate.xcu
index bc80367..fb3e410 100644
--- a/filter/source/config/fragments/types/calc_MS_Excel_95_VorlageTemplate.xcu
+++ b/filter/source/config/fragments/types/calc_MS_Excel_95_VorlageTemplate.xcu
@@ -1,5 +1,5 @@
<node oor:name="calc_MS_Excel_95_VorlageTemplate" oor:op="replace" >
- <prop oor:name="DetectService"><value>com.sun.star.comp.oox.xls.BiffDetector</value></prop>
+ <prop oor:name="DetectService"><value>com.sun.star.comp.calc.FormatDetector</value></prop>
<prop oor:name="URLPattern"/>
<prop oor:name="Extensions"><value>xlt</value></prop>
<prop oor:name="MediaType"><value>application/vnd.ms-excel</value></prop>
diff --git a/filter/source/config/fragments/types/calc_MS_Excel_97.xcu b/filter/source/config/fragments/types/calc_MS_Excel_97.xcu
index 0f7b643..bb232c3 100644
--- a/filter/source/config/fragments/types/calc_MS_Excel_97.xcu
+++ b/filter/source/config/fragments/types/calc_MS_Excel_97.xcu
@@ -1,5 +1,5 @@
<node oor:name="calc_MS_Excel_97" oor:op="replace" >
- <prop oor:name="DetectService"><value>com.sun.star.comp.oox.xls.BiffDetector</value></prop>
+ <prop oor:name="DetectService"><value>com.sun.star.comp.calc.FormatDetector</value></prop>
<prop oor:name="URLPattern"/>
<prop oor:name="Extensions"><value>xls xlc xlm xlw xlk</value></prop>
<prop oor:name="MediaType"><value>application/vnd.ms-excel</value></prop>
diff --git a/filter/source/config/fragments/types/calc_MS_Excel_97_VorlageTemplate.xcu b/filter/source/config/fragments/types/calc_MS_Excel_97_VorlageTemplate.xcu
index ff390ce..26f4bca 100644
--- a/filter/source/config/fragments/types/calc_MS_Excel_97_VorlageTemplate.xcu
+++ b/filter/source/config/fragments/types/calc_MS_Excel_97_VorlageTemplate.xcu
@@ -1,5 +1,5 @@
<node oor:name="calc_MS_Excel_97_VorlageTemplate" oor:op="replace" >
- <prop oor:name="DetectService"><value>com.sun.star.comp.oox.xls.BiffDetector</value></prop>
+ <prop oor:name="DetectService"><value>com.sun.star.comp.calc.FormatDetector</value></prop>
<prop oor:name="URLPattern"/>
<prop oor:name="Extensions"><value>xlt</value></prop>
<prop oor:name="MediaType"><value>application/vnd.ms-excel</value></prop>
diff --git a/sc/source/ui/unoobj/scdetect.cxx b/sc/source/ui/unoobj/scdetect.cxx
index 1132a76..1fe317c 100644
--- a/sc/source/ui/unoobj/scdetect.cxx
+++ b/sc/source/ui/unoobj/scdetect.cxx
@@ -117,6 +117,7 @@ static const sal_Char pFilterExcel95[] = "MS Excel 95";
static const sal_Char pFilterEx95Temp[] = "MS Excel 95 Vorlage/Template";
static const sal_Char pFilterExcel97[] = "MS Excel 97";
static const sal_Char pFilterEx97Temp[] = "MS Excel 97 Vorlage/Template";
+static const sal_Char __FAR_DATA pFilterExcelXML[] = "MS Excel 2003 XML";
static const sal_Char pFilter2003XML[] = "MS Excel 2003 XML";
static const sal_Char pFilterDBase[] = "dBase";
static const sal_Char pFilterDif[] = "DIF";
@@ -160,6 +161,35 @@ static sal_Bool lcl_MayBeAscii( SvStream& rStream )
return nMask != 0;
}
+static const SfxFilter* lcl_DetectExcelXML( SvStream& rStream, SfxFilterMatcher& rMatcher )
+{
+ const SfxFilter* pFound = NULL;
+ rStream.Seek(STREAM_SEEK_TO_BEGIN);
+
+ const size_t nBufSize = 4000;
+ sal_uInt8 aBuffer[ nBufSize ];
+ sal_uLong nBytesRead = rStream.Read( aBuffer, nBufSize );
+ sal_uLong nXMLStart = 0;
+
+ // Skip UTF-8 BOM if present.
+ // No need to handle UTF-16 etc (also rejected in XMLFilterDetect).
+ if ( nBytesRead >= 3 && aBuffer[0] == 0xEF && aBuffer[1] == 0xBB && aBuffer[2] == 0xBF )
+ nXMLStart = 3;
+
+ if ( nBytesRead >= nXMLStart + 5 && rtl_compareMemory( aBuffer+nXMLStart, "<?xml", 5 ) == 0 )
+ {
+ // Be consistent with XMLFilterDetect service: Check for presence of "Workbook" in XML file.
+
+ rtl::OString aTryStr( "Workbook" );
+ rtl::OString aFileString(reinterpret_cast<const sal_Char*>(aBuffer), nBytesRead);
+
+ if (aFileString.indexOf(aTryStr) >= 0)
+ pFound = rMatcher.GetFilter4FilterName( String::CreateFromAscii(pFilterExcelXML) );
+ }
+
+ return pFound;
+}
+
static sal_Bool lcl_MayBeDBase( SvStream& rStream )
{
// Look for dbf marker, see connectivity/source/inc/dbase/DTable.hxx
@@ -734,7 +764,13 @@ static sal_Bool lcl_MayBeDBase( SvStream& rStream )
if( aHeader.CompareTo( "<?xml", 5 ) == COMPARE_EQUAL )
pFilter = aMatcher.GetFilter4FilterName( String::CreateFromAscii(pFilter2003XML) );
else
- pFilter = aMatcher.GetFilter4FilterName( String::CreateFromAscii(pFilterAscii) );
+ {
+ // Detect Excel 2003 XML here only if XLS was preselected.
+ // The configured detection for Excel 2003 XML is still in XMLFilterDetect.
+ pFilter = lcl_DetectExcelXML( rStr, aMatcher );
+ if (!pFilter)
+ pFilter = aMatcher.GetFilter4FilterName( String::CreateFromAscii(pFilterAscii) );
+ }
bFakeXLS = true;
}
else if ( pPreselectedFilter->GetName().EqualsAscii(pFilterDBase) && lcl_MayBeDBase( rStr ) )
commit f37a539b79f601e047fefee06357b5538c6c81b0
Author: Eike Rathke <erack at redhat.com>
Date: Thu Nov 24 21:44:40 2011 +0100
calc67: #i117661# filterByPageDimension: don't overwrite source filter with page field selection
# Original author: Niklas Nebel <nn at openoffice.org>
* found as LGPLv3-only fix at svn rev 1167326 (http://svn.apache.org/viewvc?view=revision&revision=1167326)
diff --git a/sc/inc/dptabsrc.hxx b/sc/inc/dptabsrc.hxx
index 0519bd2..79986f7 100644
--- a/sc/inc/dptabsrc.hxx
+++ b/sc/inc/dptabsrc.hxx
@@ -132,6 +132,7 @@ private:
std::vector<ScDPLevel*> aColLevelList;
std::vector<ScDPLevel*> aRowLevelList;
sal_Bool bResultOverflow;
+ bool bPageFiltered; // set if page field filters have been applied to cache table
SAL_WNODEPRECATED_DECLARATIONS_PUSH
::std::auto_ptr<rtl::OUString> mpGrandTotalName;
diff --git a/sc/source/core/data/dptabsrc.cxx b/sc/source/core/data/dptabsrc.cxx
index b0ac477..928cb86 100644
--- a/sc/source/core/data/dptabsrc.cxx
+++ b/sc/source/core/data/dptabsrc.cxx
@@ -139,6 +139,7 @@ ScDPSource::ScDPSource( ScDPTableData* pD ) :
pColResults( NULL ),
pRowResults( NULL ),
bResultOverflow( false ),
+ bPageFiltered( false ),
mpGrandTotalName(NULL)
{
pData->SetEmptyFlags( bIgnoreEmptyRows, bRepeatIfEmpty );
@@ -576,6 +577,7 @@ void ScDPSource::disposeData()
nColDimCount = nRowDimCount = nDataDimCount = nPageDimCount = 0;
pData->DisposeData(); // cached entries etc.
+ bPageFiltered = false;
bResultOverflow = false;
}
@@ -728,6 +730,19 @@ void ScDPSource::GetCategoryDimensionIndices(boost::unordered_set<sal_Int32>& rC
void ScDPSource::FilterCacheTableByPageDimensions()
{
+ // #i117661# Repeated calls to ScDPCacheTable::filterByPageDimension are invalid because
+ // rows are only hidden, never shown again. If FilterCacheTableByPageDimensions is called
+ // again, the cache table must be re-initialized. Currently, CreateRes_Impl always uses
+ // a fresh cache because ScDBDocFunc::DataPilotUpdate calls InvalidateData.
+
+ if (bPageFiltered)
+ {
+ DBG_ERRORFILE("tried to apply page field filters several times");
+
+ pData->DisposeData();
+ pData->CreateCacheTable(); // re-initialize the cache table
+ bPageFiltered = false;
+ }
// filter table by page dimensions.
vector<ScDPCacheTable::Criterion> aCriteria;
@@ -774,6 +789,7 @@ void ScDPSource::FilterCacheTableByPageDimensions()
boost::unordered_set<sal_Int32> aCatDims;
GetCategoryDimensionIndices(aCatDims);
pData->FilterCacheTable(aCriteria, aCatDims);
+ bPageFiltered = true;
}
}
More information about the Libreoffice-commits
mailing list