Kaydet (Commit) 1e39e93a authored tarafından Kohei Yoshida's avatar Kohei Yoshida

Added handler to handle the new <table:filter-set-item> elements.

The export is working, while the import part is still in progress.
üst 825d5166
...@@ -440,24 +440,61 @@ private: ...@@ -440,24 +440,61 @@ private:
return OUString(RTL_CONSTASCII_USTRINGPARAM("=")); return OUString(RTL_CONSTASCII_USTRINGPARAM("="));
} }
class WriteSetItem : public std::unary_function<ScQueryEntry::Item, void>
{
ScXMLExport& mrExport;
public:
WriteSetItem(ScXMLExport& r) : mrExport(r) {}
void operator() (const ScQueryEntry::Item& rItem) const
{
mrExport.AddAttribute(XML_NAMESPACE_TABLE, XML_VALUE, rItem.maString);
SvXMLElementExport aElem(mrExport, XML_NAMESPACE_TABLE, XML_FILTER_SET_ITEM, true, true);
}
};
void writeCondition(const ScQueryEntry& rEntry, SCCOLROW nFieldStart, bool bCaseSens, bool bRegExp) void writeCondition(const ScQueryEntry& rEntry, SCCOLROW nFieldStart, bool bCaseSens, bool bRegExp)
{ {
const ScQueryEntry::Item& rItem = rEntry.GetQueryItem();
mrExport.AddAttribute(XML_NAMESPACE_TABLE, XML_FIELD_NUMBER, OUString::valueOf(rEntry.nField - nFieldStart)); mrExport.AddAttribute(XML_NAMESPACE_TABLE, XML_FIELD_NUMBER, OUString::valueOf(rEntry.nField - nFieldStart));
if (bCaseSens) if (bCaseSens)
mrExport.AddAttribute(XML_NAMESPACE_TABLE, XML_CASE_SENSITIVE, XML_TRUE); mrExport.AddAttribute(XML_NAMESPACE_TABLE, XML_CASE_SENSITIVE, XML_TRUE);
if (rItem.meType == ScQueryEntry::ByString)
mrExport.AddAttribute(XML_NAMESPACE_TABLE, XML_VALUE, rItem.maString); const ScQueryEntry::QueryItemsType& rItems = rEntry.GetQueryItems();
else if (rItems.empty())
{ {
mrExport.AddAttribute(XML_NAMESPACE_TABLE, XML_DATA_TYPE, XML_NUMBER); OSL_FAIL("Query entry has no items at all! It must have at least one!");
OUStringBuffer aBuf; return;
::sax::Converter::convertDouble(aBuf, rItem.mfVal);
mrExport.AddAttribute(XML_NAMESPACE_TABLE, XML_VALUE, aBuf.makeStringAndClear());
} }
mrExport.AddAttribute(XML_NAMESPACE_TABLE, XML_OPERATOR, getOperatorXML(rEntry, bRegExp)); else if (rItems.size() == 1)
SvXMLElementExport aElemC(mrExport, XML_NAMESPACE_TABLE, XML_FILTER_CONDITION, true, true); {
// Single item condition.
const ScQueryEntry::Item& rItem = rItems.front();
if (rItem.meType == ScQueryEntry::ByString)
mrExport.AddAttribute(XML_NAMESPACE_TABLE, XML_VALUE, rItem.maString);
else
{
mrExport.AddAttribute(XML_NAMESPACE_TABLE, XML_DATA_TYPE, XML_NUMBER);
OUStringBuffer aBuf;
::sax::Converter::convertDouble(aBuf, rItem.mfVal);
mrExport.AddAttribute(XML_NAMESPACE_TABLE, XML_VALUE, aBuf.makeStringAndClear());
}
mrExport.AddAttribute(XML_NAMESPACE_TABLE, XML_OPERATOR, getOperatorXML(rEntry, bRegExp));
SvXMLElementExport aElemC(mrExport, XML_NAMESPACE_TABLE, XML_FILTER_CONDITION, true, true);
}
else
{
// Multi-item condition.
OSL_ASSERT(rItems.size() > 1);
// Store the 1st value for backward compatibility.
const ScQueryEntry::Item& rItem = rItems.front();
mrExport.AddAttribute(XML_NAMESPACE_TABLE, XML_VALUE, rItem.maString);
mrExport.AddAttribute(XML_NAMESPACE_TABLE, XML_OPERATOR, OUString(RTL_CONSTASCII_USTRINGPARAM("=")));
SvXMLElementExport aElemC(mrExport, XML_NAMESPACE_TABLE, XML_FILTER_CONDITION, true, true);
std::for_each(rItems.begin(), rItems.end(), WriteSetItem(mrExport));
}
} }
void writeFilter(const ScDBData& rData) void writeFilter(const ScDBData& rData)
......
...@@ -47,6 +47,9 @@ ...@@ -47,6 +47,9 @@
using namespace com::sun::star; using namespace com::sun::star;
using namespace xmloff::token; using namespace xmloff::token;
using ::com::sun::star::uno::Reference;
using ::com::sun::star::xml::sax::XAttributeList;
//------------------------------------------------------------------ //------------------------------------------------------------------
ScXMLFilterContext::ScXMLFilterContext( ScXMLImport& rImport, ScXMLFilterContext::ScXMLFilterContext( ScXMLImport& rImport,
...@@ -328,10 +331,25 @@ ScXMLConditionContext::~ScXMLConditionContext() ...@@ -328,10 +331,25 @@ ScXMLConditionContext::~ScXMLConditionContext()
SvXMLImportContext *ScXMLConditionContext::CreateChildContext( sal_uInt16 nPrefix, SvXMLImportContext *ScXMLConditionContext::CreateChildContext( sal_uInt16 nPrefix,
const ::rtl::OUString& rLName, const ::rtl::OUString& rLName,
const ::com::sun::star::uno::Reference< const Reference<XAttributeList>& xAttrList )
::com::sun::star::xml::sax::XAttributeList>& /* xAttrList */ )
{ {
return new SvXMLImportContext( GetImport(), nPrefix, rLName ); SvXMLImportContext *pContext = NULL;
const SvXMLTokenMap& rTokenMap(GetScImport().GetFilterConditionElemTokenMap());
switch( rTokenMap.Get( nPrefix, rLName ) )
{
case XML_TOK_CONDITION_FILTER_SET_ITEM:
{
pContext = new ScXMLSetItemContext(
GetScImport(), nPrefix, rLName, xAttrList);
}
break;
}
if( !pContext )
pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName );
return pContext;
} }
void ScXMLConditionContext::getOperatorXML(const rtl::OUString sTempOperator, sal_Int32& aFilterOperator, bool& bUseRegularExpressions) const void ScXMLConditionContext::getOperatorXML(const rtl::OUString sTempOperator, sal_Int32& aFilterOperator, bool& bUseRegularExpressions) const
...@@ -410,6 +428,58 @@ void ScXMLConditionContext::EndElement() ...@@ -410,6 +428,58 @@ void ScXMLConditionContext::EndElement()
pFilterContext->AddFilterField(aFilterField); pFilterContext->AddFilterField(aFilterField);
} }
const ScXMLImport& ScXMLSetItemContext::GetScImport() const
{
return static_cast<const ScXMLImport&>(GetImport());
}
ScXMLImport& ScXMLSetItemContext::GetScImport()
{
return static_cast<ScXMLImport&>(GetImport());
}
ScXMLSetItemContext::ScXMLSetItemContext(
ScXMLImport& rImport, sal_uInt16 nPrfx, const rtl::OUString& rLName,
const Reference<XAttributeList>& xAttrList) :
SvXMLImportContext(rImport, nPrfx, rLName)
{
sal_Int32 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
const SvXMLTokenMap& rAttrTokenMap = GetScImport().GetFilterSetItemAttrTokenMap();
for (sal_Int32 i = 0; i < nAttrCount; ++i)
{
const rtl::OUString& sAttrName = xAttrList->getNameByIndex(i);
rtl::OUString aLocalName;
sal_uInt16 nPrefix =
GetScImport().GetNamespaceMap().GetKeyByAttrName(sAttrName, &aLocalName);
const rtl::OUString& sValue = xAttrList->getValueByIndex(i);
switch (rAttrTokenMap.Get(nPrefix, aLocalName))
{
case XML_TOK_FILTER_SET_ITEM_ATTR_VALUE:
{
// TODO: import the value.
}
break;
}
}
}
SvXMLImportContext* ScXMLSetItemContext::CreateChildContext(
sal_uInt16 nPrefix, const ::rtl::OUString& rLName,
const Reference<XAttributeList>& /*xAttrList*/ )
{
return new SvXMLImportContext( GetImport(), nPrefix, rLName );;
}
ScXMLSetItemContext::~ScXMLSetItemContext()
{
}
void ScXMLSetItemContext::EndElement()
{
}
//========================================================================== //==========================================================================
ScXMLDPFilterContext::ScXMLDPFilterContext( ScXMLImport& rImport, ScXMLDPFilterContext::ScXMLDPFilterContext( ScXMLImport& rImport,
......
...@@ -174,6 +174,27 @@ public: ...@@ -174,6 +174,27 @@ public:
virtual void EndElement(); virtual void EndElement();
}; };
class ScXMLSetItemContext : public SvXMLImportContext
{
const ScXMLImport& GetScImport() const;
ScXMLImport& GetScImport();
public:
ScXMLSetItemContext(ScXMLImport& rImport, sal_uInt16 nPrfx,
const ::rtl::OUString& rLName,
const ::com::sun::star::uno::Reference<
::com::sun::star::xml::sax::XAttributeList>& xAttrList);
virtual ~ScXMLSetItemContext();
virtual SvXMLImportContext *CreateChildContext(
sal_uInt16 nPrefix,
const ::rtl::OUString& rLocalName,
const ::com::sun::star::uno::Reference<
::com::sun::star::xml::sax::XAttributeList>& xAttrList);
virtual void EndElement();
};
// Datapilot (Core) // Datapilot (Core)
class ScXMLDPFilterContext : public SvXMLImportContext class ScXMLDPFilterContext : public SvXMLImportContext
......
...@@ -1151,6 +1151,22 @@ const SvXMLTokenMap& ScXMLImport::GetFilterAttrTokenMap() ...@@ -1151,6 +1151,22 @@ const SvXMLTokenMap& ScXMLImport::GetFilterAttrTokenMap()
return *pFilterAttrTokenMap; return *pFilterAttrTokenMap;
} }
const SvXMLTokenMap& ScXMLImport::GetFilterConditionElemTokenMap()
{
if( !pFilterConditionElemTokenMap )
{
static SvXMLTokenMapEntry aTokenMap[] =
{
{ XML_NAMESPACE_TABLE, XML_FILTER_SET_ITEM, XML_TOK_CONDITION_FILTER_SET_ITEM },
XML_TOKEN_MAP_END
};
pFilterConditionElemTokenMap = new SvXMLTokenMap( aTokenMap );
}
return *pFilterConditionElemTokenMap;
}
const SvXMLTokenMap& ScXMLImport::GetFilterConditionAttrTokenMap() const SvXMLTokenMap& ScXMLImport::GetFilterConditionAttrTokenMap()
{ {
if( !pFilterConditionAttrTokenMap ) if( !pFilterConditionAttrTokenMap )
...@@ -1171,6 +1187,22 @@ const SvXMLTokenMap& ScXMLImport::GetFilterConditionAttrTokenMap() ...@@ -1171,6 +1187,22 @@ const SvXMLTokenMap& ScXMLImport::GetFilterConditionAttrTokenMap()
return *pFilterConditionAttrTokenMap; return *pFilterConditionAttrTokenMap;
} }
const SvXMLTokenMap& ScXMLImport::GetFilterSetItemAttrTokenMap()
{
if( !pFilterSetItemAttrTokenMap )
{
static SvXMLTokenMapEntry aTokenMap[] =
{
{ XML_NAMESPACE_TABLE, XML_VALUE, XML_TOK_FILTER_SET_ITEM_ATTR_VALUE },
XML_TOKEN_MAP_END
};
pFilterSetItemAttrTokenMap = new SvXMLTokenMap( aTokenMap );
}
return *pFilterSetItemAttrTokenMap;
}
const SvXMLTokenMap& ScXMLImport::GetSortElemTokenMap() const SvXMLTokenMap& ScXMLImport::GetSortElemTokenMap()
{ {
if( !pSortElemTokenMap ) if( !pSortElemTokenMap )
...@@ -1717,7 +1749,9 @@ ScXMLImport::ScXMLImport( ...@@ -1717,7 +1749,9 @@ ScXMLImport::ScXMLImport(
pDatabaseRangeSourceQueryAttrTokenMap( 0 ), pDatabaseRangeSourceQueryAttrTokenMap( 0 ),
pFilterElemTokenMap( 0 ), pFilterElemTokenMap( 0 ),
pFilterAttrTokenMap( 0 ), pFilterAttrTokenMap( 0 ),
pFilterConditionElemTokenMap( 0 ),
pFilterConditionAttrTokenMap( 0 ), pFilterConditionAttrTokenMap( 0 ),
pFilterSetItemAttrTokenMap( 0 ),
pSortElemTokenMap( 0 ), pSortElemTokenMap( 0 ),
pSortAttrTokenMap( 0 ), pSortAttrTokenMap( 0 ),
pSortSortByAttrTokenMap( 0 ), pSortSortByAttrTokenMap( 0 ),
...@@ -1842,7 +1876,9 @@ ScXMLImport::~ScXMLImport() throw() ...@@ -1842,7 +1876,9 @@ ScXMLImport::~ScXMLImport() throw()
delete pDatabaseRangeSourceQueryAttrTokenMap; delete pDatabaseRangeSourceQueryAttrTokenMap;
delete pFilterElemTokenMap; delete pFilterElemTokenMap;
delete pFilterAttrTokenMap; delete pFilterAttrTokenMap;
delete pFilterConditionElemTokenMap;
delete pFilterConditionAttrTokenMap; delete pFilterConditionAttrTokenMap;
delete pFilterSetItemAttrTokenMap;
delete pSortElemTokenMap; delete pSortElemTokenMap;
delete pSortAttrTokenMap; delete pSortAttrTokenMap;
delete pSortSortByAttrTokenMap; delete pSortSortByAttrTokenMap;
......
...@@ -413,6 +413,11 @@ enum ScXMLFilterAttrTokens ...@@ -413,6 +413,11 @@ enum ScXMLFilterAttrTokens
XML_TOK_FILTER_ATTR_DISPLAY_DUPLICATES XML_TOK_FILTER_ATTR_DISPLAY_DUPLICATES
}; };
enum ScXMLFilterConditionElemTokens
{
XML_TOK_CONDITION_FILTER_SET_ITEM
};
enum ScXMLFilterConditionAttrTokens enum ScXMLFilterConditionAttrTokens
{ {
XML_TOK_CONDITION_ATTR_FIELD_NUMBER, XML_TOK_CONDITION_ATTR_FIELD_NUMBER,
...@@ -422,6 +427,11 @@ enum ScXMLFilterConditionAttrTokens ...@@ -422,6 +427,11 @@ enum ScXMLFilterConditionAttrTokens
XML_TOK_CONDITION_ATTR_OPERATOR XML_TOK_CONDITION_ATTR_OPERATOR
}; };
enum ScXMLFilterSetItemAttrTokens
{
XML_TOK_FILTER_SET_ITEM_ATTR_VALUE
};
enum ScXMLSortTokens enum ScXMLSortTokens
{ {
XML_TOK_SORT_SORT_BY XML_TOK_SORT_SORT_BY
...@@ -736,7 +746,9 @@ class ScXMLImport: public SvXMLImport ...@@ -736,7 +746,9 @@ class ScXMLImport: public SvXMLImport
SvXMLTokenMap *pDatabaseRangeSourceQueryAttrTokenMap; SvXMLTokenMap *pDatabaseRangeSourceQueryAttrTokenMap;
SvXMLTokenMap *pFilterElemTokenMap; SvXMLTokenMap *pFilterElemTokenMap;
SvXMLTokenMap *pFilterAttrTokenMap; SvXMLTokenMap *pFilterAttrTokenMap;
SvXMLTokenMap *pFilterConditionElemTokenMap;
SvXMLTokenMap *pFilterConditionAttrTokenMap; SvXMLTokenMap *pFilterConditionAttrTokenMap;
SvXMLTokenMap *pFilterSetItemAttrTokenMap;
SvXMLTokenMap *pSortElemTokenMap; SvXMLTokenMap *pSortElemTokenMap;
SvXMLTokenMap *pSortAttrTokenMap; SvXMLTokenMap *pSortAttrTokenMap;
SvXMLTokenMap *pSortSortByAttrTokenMap; SvXMLTokenMap *pSortSortByAttrTokenMap;
...@@ -887,7 +899,9 @@ public: ...@@ -887,7 +899,9 @@ public:
const SvXMLTokenMap& GetDatabaseRangeSourceQueryAttrTokenMap(); const SvXMLTokenMap& GetDatabaseRangeSourceQueryAttrTokenMap();
const SvXMLTokenMap& GetFilterElemTokenMap(); const SvXMLTokenMap& GetFilterElemTokenMap();
const SvXMLTokenMap& GetFilterAttrTokenMap(); const SvXMLTokenMap& GetFilterAttrTokenMap();
const SvXMLTokenMap& GetFilterConditionElemTokenMap();
const SvXMLTokenMap& GetFilterConditionAttrTokenMap(); const SvXMLTokenMap& GetFilterConditionAttrTokenMap();
const SvXMLTokenMap& GetFilterSetItemAttrTokenMap();
const SvXMLTokenMap& GetSortElemTokenMap(); const SvXMLTokenMap& GetSortElemTokenMap();
const SvXMLTokenMap& GetSortAttrTokenMap(); const SvXMLTokenMap& GetSortAttrTokenMap();
const SvXMLTokenMap& GetSortSortByAttrTokenMap(); const SvXMLTokenMap& GetSortSortByAttrTokenMap();
......
...@@ -748,6 +748,7 @@ namespace xmloff { namespace token { ...@@ -748,6 +748,7 @@ namespace xmloff { namespace token {
XML_FILTER_NAME, XML_FILTER_NAME,
XML_FILTER_OPTIONS, XML_FILTER_OPTIONS,
XML_FILTER_OR, XML_FILTER_OR,
XML_FILTER_SET_ITEM,
XML_FIRST_DATE_TIME, XML_FIRST_DATE_TIME,
XML_FIRST_PAGE, XML_FIRST_PAGE,
XML_FIRST_PAGE_NUMBER, XML_FIRST_PAGE_NUMBER,
......
...@@ -754,6 +754,7 @@ namespace xmloff { namespace token { ...@@ -754,6 +754,7 @@ namespace xmloff { namespace token {
TOKEN( "filter-name", XML_FILTER_NAME ), TOKEN( "filter-name", XML_FILTER_NAME ),
TOKEN( "filter-options", XML_FILTER_OPTIONS ), TOKEN( "filter-options", XML_FILTER_OPTIONS ),
TOKEN( "filter-or", XML_FILTER_OR ), TOKEN( "filter-or", XML_FILTER_OR ),
TOKEN( "filter-set-item", XML_FILTER_SET_ITEM ),
TOKEN( "first-date-time", XML_FIRST_DATE_TIME ), TOKEN( "first-date-time", XML_FIRST_DATE_TIME ),
TOKEN( "first-page", XML_FIRST_PAGE ), TOKEN( "first-page", XML_FIRST_PAGE ),
TOKEN( "first-page-number", XML_FIRST_PAGE_NUMBER ), TOKEN( "first-page-number", XML_FIRST_PAGE_NUMBER ),
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment