summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--oox/source/core/xmlfilterbase.cxx6
-rw-r--r--oox/source/token/namespaces-strict.txt3
-rw-r--r--oox/source/token/namespaces.hxx.tail1
-rw-r--r--oox/source/token/namespaces.txt3
-rw-r--r--oox/source/token/tokens.txt7
-rw-r--r--sc/source/filter/excel/excdoc.cxx5
-rw-r--r--sc/source/filter/excel/xeextlst.cxx42
-rw-r--r--sc/source/filter/inc/extlstcontext.hxx22
-rw-r--r--sc/source/filter/inc/xeextlst.hxx17
-rw-r--r--sc/source/filter/oox/extlstcontext.cxx51
-rw-r--r--sc/source/filter/oox/workbookfragment.cxx3
11 files changed, 157 insertions, 3 deletions
diff --git a/oox/source/core/xmlfilterbase.cxx b/oox/source/core/xmlfilterbase.cxx
index f1c80df9a97f..535c81147ec0 100644
--- a/oox/source/core/xmlfilterbase.cxx
+++ b/oox/source/core/xmlfilterbase.cxx
@@ -118,7 +118,8 @@ struct NamespaceIds: public rtl::StaticWithInit<
"http://schemas.openxmlformats.org/markup-compatibility/2006",
"http://schemas.openxmlformats.org/spreadsheetml/2006/main/v2",
"http://schemas.microsoft.com/office/drawing/2008/diagram",
- "http://schemas.microsoft.com/office/spreadsheetml/2009/9/main"
+ "http://schemas.microsoft.com/office/spreadsheetml/2009/9/main",
+ "http://schemas.libreoffice.org/"
};
static const sal_Int32 namespaceIds[] = {
@@ -145,7 +146,8 @@ struct NamespaceIds: public rtl::StaticWithInit<
NMSP_mce,
NMSP_mceTest,
NMSP_dsp,
- NMSP_xls14Lst
+ NMSP_xls14Lst,
+ NMSP_loext
};
Sequence< beans::Pair< OUString, sal_Int32 > > aRet(SAL_N_ELEMENTS(namespaceIds));
diff --git a/oox/source/token/namespaces-strict.txt b/oox/source/token/namespaces-strict.txt
index 9359f8b48094..026fcfe8ded9 100644
--- a/oox/source/token/namespaces-strict.txt
+++ b/oox/source/token/namespaces-strict.txt
@@ -80,3 +80,6 @@ a14 http://schemas.microsoft.com/office/drawingml/2010/main
# xls14Lst for features introduced by excel 2010
xls14Lst http://schemas.microsoft.com/office/spreadsheetml/2009/9/main
+
+# LibreOffice's own extensions
+loext http://schemas.libreoffice.org/
diff --git a/oox/source/token/namespaces.hxx.tail b/oox/source/token/namespaces.hxx.tail
index de5cc21d86a6..24de6457698a 100644
--- a/oox/source/token/namespaces.hxx.tail
+++ b/oox/source/token/namespaces.hxx.tail
@@ -55,6 +55,7 @@ inline sal_Int32 getNamespace( sal_Int32 nToken ) { return nToken & NMSP_MASK; }
#define WPS_TOKEN( token ) OOX_TOKEN( wps, token )
#define WPG_TOKEN( token ) OOX_TOKEN( wpg, token )
#define W_TOKEN( token ) OOX_TOKEN( doc, token )
+#define LOEXT_TOKEN( token ) OOX_TOKEN( loext, token )
diff --git a/oox/source/token/namespaces.txt b/oox/source/token/namespaces.txt
index face9d62db10..2c61d606ff9d 100644
--- a/oox/source/token/namespaces.txt
+++ b/oox/source/token/namespaces.txt
@@ -80,3 +80,6 @@ a14 http://schemas.microsoft.com/office/drawing/2010/main
# xls14Lst for features introduced by excel 2010
xls14Lst http://schemas.microsoft.com/office/spreadsheetml/2009/9/main
+
+# LibreOffice's own extensions
+loext http://schemas.libreoffice.org/
diff --git a/oox/source/token/tokens.txt b/oox/source/token/tokens.txt
index c26e957f6d6b..1ed16812f77d 100644
--- a/oox/source/token/tokens.txt
+++ b/oox/source/token/tokens.txt
@@ -69,6 +69,7 @@ BroadcastTitle
Broadcaster
Button
CF
+CalcA1
Camera
Cancel
Caption
@@ -141,6 +142,8 @@ Editor
ElectronicSource
Embed
EnhancedMetaFile
+ExcelA1
+ExcelR1C1
Extend
Extension
External
@@ -392,6 +395,7 @@ True
Type
Types
UIObj
+Unspecified
URI
URL
UpdateMode
@@ -2137,6 +2141,7 @@ exp
explosion
expression
ext
+extCalcPr
extLst
extend
extendable
@@ -3165,6 +3170,7 @@ lockWindows
locked
lockedCanvas
lockrotationcenter
+loext
log
logBase
lon
@@ -4954,6 +4960,7 @@ strikeH
strikeTLBR
strikeV
string
+stringRefSyntax
stringValue1
stringValue2
stripedRightArrow
diff --git a/sc/source/filter/excel/excdoc.cxx b/sc/source/filter/excel/excdoc.cxx
index b9788d7f8154..b56c9b179bb4 100644
--- a/sc/source/filter/excel/excdoc.cxx
+++ b/sc/source/filter/excel/excdoc.cxx
@@ -445,6 +445,11 @@ void ExcTable::FillAsHeaderXml( ExcBoundsheetList& rBoundsheetList )
aRecList.AppendRecord( GetObjectManager().CreateDrawingGroup() );
// Shared string table: SST, EXTSST
aRecList.AppendRecord( CreateRecord( EXC_ID_SST ) );
+
+ XclExtLstRef xExtLst( new XclExtLst( GetRoot() ) );
+ const ScCalcConfig& rCalcConfig = rDoc.GetCalcConfig();
+ xExtLst->AddRecord( XclExpExtRef( new XclExpExtCalcPr( GetRoot(), rCalcConfig.meStringRefAddressSyntax )) );
+ aRecList.AppendRecord( xExtLst );
}
void ExcTable::FillAsTableBinary( SCTAB nCodeNameIdx )
diff --git a/sc/source/filter/excel/xeextlst.cxx b/sc/source/filter/excel/xeextlst.cxx
index 2639bec35fef..ebfe2cd7a6f2 100644
--- a/sc/source/filter/excel/xeextlst.cxx
+++ b/sc/source/filter/excel/xeextlst.cxx
@@ -361,6 +361,48 @@ void XclExpExtConditionalFormatting::SaveXml( XclExpXmlStream& rStrm )
rWorksheet->endElementNS( XML_x14, XML_conditionalFormatting );
}
+XclExpExtCalcPr::XclExpExtCalcPr( const XclExpRoot& rRoot, formula::FormulaGrammar::AddressConvention eConv ):
+ XclExpExt( rRoot ),
+ meConv( eConv )
+{
+ maURI = OString("{7626C862-2A13-11E5-B345-FEFF819CDC9F}");
+
+ switch (meConv)
+ {
+ case formula::FormulaGrammar::CONV_OOO:
+ maSyntax = OString("CalcA1");
+ break;
+ case formula::FormulaGrammar::CONV_XL_A1:
+ maSyntax = OString("ExcelA1");
+ break;
+ case formula::FormulaGrammar::CONV_XL_R1C1:
+ maSyntax = OString("ExcelR1C1");
+ break;
+ case formula::FormulaGrammar::CONV_UNSPECIFIED:
+ case formula::FormulaGrammar::CONV_ODF:
+ case formula::FormulaGrammar::CONV_XL_OOX:
+ case formula::FormulaGrammar::CONV_LOTUS_A1:
+ case formula::FormulaGrammar::CONV_LAST:
+ maSyntax = OString("Unspecified");
+ break;
+ }
+}
+
+void XclExpExtCalcPr::SaveXml( XclExpXmlStream& rStrm )
+{
+ sax_fastparser::FSHelperPtr& rWorksheet = rStrm.GetCurrentStream();
+ rWorksheet->startElement( XML_ext,
+ FSNS( XML_xmlns, XML_loext ), "http://schemas.libreoffice.org/",
+ XML_uri, maURI.getStr(),
+ FSEND );
+
+ rWorksheet->singleElementNS( XML_loext, XML_extCalcPr,
+ XML_stringRefSyntax, maSyntax.getStr(),
+ FSEND );
+
+ rWorksheet->endElement( XML_ext );
+}
+
XclExpExtCondFormat::XclExpExtCondFormat( const XclExpRoot& rRoot ):
XclExpExt( rRoot )
{
diff --git a/sc/source/filter/inc/extlstcontext.hxx b/sc/source/filter/inc/extlstcontext.hxx
index 598adbd5f6e3..d77d51ae50d0 100644
--- a/sc/source/filter/inc/extlstcontext.hxx
+++ b/sc/source/filter/inc/extlstcontext.hxx
@@ -12,6 +12,7 @@
#include "excelhandlers.hxx"
#include "worksheetfragment.hxx"
+#include "workbookfragment.hxx"
#include <boost/ptr_container/ptr_vector.hpp>
@@ -103,6 +104,27 @@ protected:
virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ) SAL_OVERRIDE;
};
+class ExtGlobalWorkbookContext : public WorkbookContextBase
+{
+public:
+ explicit ExtGlobalWorkbookContext( WorkbookContextBase& rFragment );
+
+protected:
+ virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ) SAL_OVERRIDE;
+ virtual void onStartElement( const AttributeList& rAttribs ) SAL_OVERRIDE;
+
+private:
+};
+
+class ExtLstGlobalWorkbookContext : public WorkbookContextBase
+{
+public:
+ explicit ExtLstGlobalWorkbookContext( WorkbookFragment& rFragment );
+
+protected:
+ virtual ::oox::core::ContextHandlerRef onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ) SAL_OVERRIDE;
+};
+
} //namespace xls
} //namespace oox
diff --git a/sc/source/filter/inc/xeextlst.hxx b/sc/source/filter/inc/xeextlst.hxx
index f148f836186e..d31fb4dc5ea8 100644
--- a/sc/source/filter/inc/xeextlst.hxx
+++ b/sc/source/filter/inc/xeextlst.hxx
@@ -14,12 +14,14 @@
#include "xeroot.hxx"
#include "colorscale.hxx"
+#include "formulaopt.hxx"
#include <memory>
enum XclExpExtType
{
- XclExpExtDataBarType
+ XclExpExtDataBarType,
+ XclExpExtDataFooType
};
struct XclExpExtCondFormatData
@@ -167,6 +169,19 @@ private:
XclExpRecordList< XclExpExtConditionalFormatting > maCF;
};
+class XclExpExtCalcPr : public XclExpExt
+{
+public:
+ XclExpExtCalcPr( const XclExpRoot& rRoot, formula::FormulaGrammar::AddressConvention eConv );
+ virtual void SaveXml( XclExpXmlStream& rStrm ) SAL_OVERRIDE;
+
+ virtual XclExpExtType GetType() SAL_OVERRIDE { return XclExpExtDataFooType; }
+
+private:
+ formula::FormulaGrammar::AddressConvention meConv;
+ OString maSyntax;
+};
+
class XclExtLst : public XclExpRecordBase, public XclExpRoot
{
public:
diff --git a/sc/source/filter/oox/extlstcontext.cxx b/sc/source/filter/oox/extlstcontext.cxx
index 7371f99574ba..81590b42e314 100644
--- a/sc/source/filter/oox/extlstcontext.cxx
+++ b/sc/source/filter/oox/extlstcontext.cxx
@@ -249,6 +249,57 @@ ContextHandlerRef ExtLstGlobalContext::onCreateContext( sal_Int32 nElement, cons
return this;
}
+ExtGlobalWorkbookContext::ExtGlobalWorkbookContext( WorkbookContextBase& rFragment ):
+ WorkbookContextBase(rFragment)
+{
+}
+
+ContextHandlerRef ExtGlobalWorkbookContext::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs )
+{
+ if (nElement == LOEXT_TOKEN(extCalcPr))
+ {
+ ScDocument* pDoc = &getScDocument();
+ sal_Int32 nToken = rAttribs.getToken( XML_stringRefSyntax, XML_CalcA1 );
+ ScCalcConfig aCalcConfig = pDoc->GetCalcConfig();
+
+ switch( nToken )
+ {
+ case XML_CalcA1:
+ aCalcConfig.meStringRefAddressSyntax = formula::FormulaGrammar::CONV_OOO;
+ break;
+ case XML_ExcelA1:
+ aCalcConfig.meStringRefAddressSyntax = formula::FormulaGrammar::CONV_XL_A1;
+ break;
+ case XML_ExcelR1C1:
+ aCalcConfig.meStringRefAddressSyntax = formula::FormulaGrammar::CONV_XL_R1C1;
+ break;
+ default:
+ aCalcConfig.meStringRefAddressSyntax = formula::FormulaGrammar::CONV_UNSPECIFIED;
+ break;
+ }
+ pDoc->SetCalcConfig(aCalcConfig);
+ }
+
+ return this;
+}
+
+void ExtGlobalWorkbookContext::onStartElement( const AttributeList& /*rAttribs*/ )
+{
+}
+
+ExtLstGlobalWorkbookContext::ExtLstGlobalWorkbookContext( WorkbookFragment& rFragment ):
+ WorkbookContextBase(rFragment)
+{
+}
+
+ContextHandlerRef ExtLstGlobalWorkbookContext::onCreateContext( sal_Int32 nElement, const AttributeList& )
+{
+ if (nElement == XLS_TOKEN( ext ))
+ return new ExtGlobalWorkbookContext( *this );
+
+ return this;
+}
+
} //namespace oox
} //namespace xls
diff --git a/sc/source/filter/oox/workbookfragment.cxx b/sc/source/filter/oox/workbookfragment.cxx
index 4b37d0f20c79..06881c02c5cf 100644
--- a/sc/source/filter/oox/workbookfragment.cxx
+++ b/sc/source/filter/oox/workbookfragment.cxx
@@ -46,6 +46,7 @@
#include "worksheethelper.hxx"
#include "worksheetfragment.hxx"
#include "sheetdatacontext.hxx"
+#include "extlstcontext.hxx"
#include "officecfg/Office/Common.hxx"
#include "document.hxx"
@@ -110,6 +111,8 @@ ContextHandlerRef WorkbookFragment::onCreateContext( sal_Int32 nElement, const A
case XLS_TOKEN( workbookPr ): getWorkbookSettings().importWorkbookPr( rAttribs ); break;
case XLS_TOKEN( calcPr ): getWorkbookSettings().importCalcPr( rAttribs ); break;
case XLS_TOKEN( oleSize ): getViewSettings().importOleSize( rAttribs ); break;
+
+ case XLS_TOKEN( extLst ): return new ExtLstGlobalWorkbookContext( *this );
}
break;