diff -cNr sc.old/source/filter/xml/XMLExportDatabaseRanges.cxx sc.new/source/filter/xml/XMLExportDatabaseRanges.cxx *** sc.old/source/filter/xml/XMLExportDatabaseRanges.cxx Tue Mar 11 13:31:36 2008 --- sc.new/source/filter/xml/XMLExportDatabaseRanges.cxx Tue Mar 18 15:35:18 2008 *************** *** 259,264 **** --- 259,322 ---- } } + rtl::OUString ScXMLExportDatabaseRanges::getOperatorXML(const long aFilterOperator, const sal_Bool bUseRegularExpressions) const + { + switch (aFilterOperator) + { + case sheet::FilterOperator2::EQUAL : + { + if (bUseRegularExpressions) + return GetXMLToken(XML_MATCH); + else + return rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("=")); + } + case sheet::FilterOperator2::NOT_EQUAL : + { + if (bUseRegularExpressions) + return GetXMLToken(XML_NOMATCH); + else + return rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("!=")); + } + case sheet::FilterOperator2::BOTTOM_PERCENT : + return GetXMLToken(XML_BOTTOM_PERCENT); + case sheet::FilterOperator2::BOTTOM_VALUES : + return GetXMLToken(XML_BOTTOM_VALUES); + case sheet::FilterOperator2::EMPTY : + return GetXMLToken(XML_EMPTY); + case sheet::FilterOperator2::GREATER : + return rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(">")); + case sheet::FilterOperator2::GREATER_EQUAL : + return rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(">=")); + case sheet::FilterOperator2::LESS : + return rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("<")); + case sheet::FilterOperator2::LESS_EQUAL : + return rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("<=")); + case sheet::FilterOperator2::NOT_EMPTY : + return GetXMLToken(XML_NOEMPTY); + case sheet::FilterOperator2::TOP_PERCENT : + return GetXMLToken(XML_TOP_PERCENT); + case sheet::FilterOperator2::TOP_VALUES : + return GetXMLToken(XML_TOP_VALUES); + case sheet::FilterOperator2::CONTAINS : + return GetXMLToken(XML_CONTAINS); + case sheet::FilterOperator2::DOES_NOT_CONTAIN : + return GetXMLToken(XML_DOES_NOT_CONTAIN); + case sheet::FilterOperator2::BEGINS_WITH : + return GetXMLToken(XML_BEGINS_WITH); + case sheet::FilterOperator2::DOES_NOT_BEGIN_WITH : + return GetXMLToken(XML_DOES_NOT_BEGIN_WITH); + case sheet::FilterOperator2::ENDS_WITH : + return GetXMLToken(XML_ENDS_WITH); + case sheet::FilterOperator2::DOES_NOT_END_WITH : + return GetXMLToken(XML_DOES_NOT_END_WITH); + default: + { + // added to avoid warnings + } + } + return rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("=")); + } + rtl::OUString ScXMLExportDatabaseRanges::getOperatorXML(const sheet::FilterOperator aFilterOperator, const sal_Bool bUseRegularExpressions) const { switch (aFilterOperator) *************** *** 305,310 **** --- 363,386 ---- return rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("=")); } + void ScXMLExportDatabaseRanges::WriteCondition(const sheet::TableFilterField2& aFilterField, sal_Bool bIsCaseSensitive, sal_Bool bUseRegularExpressions) + { + rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_FIELD_NUMBER, rtl::OUString::valueOf(aFilterField.Field)); + if (bIsCaseSensitive) + rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_CASE_SENSITIVE, XML_TRUE); + if (aFilterField.IsNumeric) + { + rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_DATA_TYPE, XML_NUMBER); + rtl::OUStringBuffer sBuffer; + rExport.GetMM100UnitConverter().convertDouble(sBuffer, aFilterField.NumericValue); + rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_VALUE, sBuffer.makeStringAndClear()); + } + else + rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_VALUE, aFilterField.StringValue); + rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_OPERATOR, getOperatorXML(aFilterField.Operator, bUseRegularExpressions)); + SvXMLElementExport aElemC(rExport, XML_NAMESPACE_TABLE, XML_FILTER_CONDITION, sal_True, sal_True); + } + void ScXMLExportDatabaseRanges::WriteCondition(const sheet::TableFilterField& aFilterField, sal_Bool bIsCaseSensitive, sal_Bool bUseRegularExpressions) { rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_FIELD_NUMBER, rtl::OUString::valueOf(aFilterField.Field)); *************** *** 323,454 **** SvXMLElementExport aElemC(rExport, XML_NAMESPACE_TABLE, XML_FILTER_CONDITION, sal_True, sal_True); } ! void ScXMLExportDatabaseRanges::WriteFilterDescriptor(const uno::Reference & xSheetFilterDescriptor, const rtl::OUString sDatabaseRangeName) { ! uno::Sequence aTableFilterFields(xSheetFilterDescriptor->getFilterFields()); ! sal_Int32 nTableFilterFields = aTableFilterFields.getLength(); ! if (nTableFilterFields > 0) ! { ! uno::Reference xPropertySet (xSheetFilterDescriptor, uno::UNO_QUERY); ! if (xPropertySet.is()) ! { ! if (::cppu::any2bool(xPropertySet->getPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_COPYOUT))))) { ! table::CellAddress aOutputPosition; ! if (xPropertySet->getPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_OUTPOS))) >>= aOutputPosition) ! { ! rtl::OUString sOUCellAddress; ! ScRangeStringConverter::GetStringFromAddress( sOUCellAddress, aOutputPosition, pDoc ); ! rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_TARGET_RANGE_ADDRESS, sOUCellAddress); ! } ! } ! ScDBCollection* pDBCollection = pDoc->GetDBCollection(); ! sal_uInt16 nIndex; ! pDBCollection->SearchName(sDatabaseRangeName, nIndex); ! ScDBData* pDBData = (*pDBCollection)[nIndex]; ! ScRange aAdvSource; ! if (pDBData->GetAdvancedQuerySource(aAdvSource)) ! { ! rtl::OUString sOUCellAddress; ! ScRangeStringConverter::GetStringFromRange( sOUCellAddress, aAdvSource, pDoc ); ! rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_CONDITION_SOURCE_RANGE_ADDRESS, sOUCellAddress); ! } ! ! if (::cppu::any2bool(xPropertySet->getPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_SKIPDUP))))) ! rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_DISPLAY_DUPLICATES, XML_FALSE); ! SvXMLElementExport aElemF(rExport, XML_NAMESPACE_TABLE, XML_FILTER, sal_True, sal_True); ! rExport.CheckAttrList(); ! sal_Bool bIsCaseSensitive = ::cppu::any2bool(xPropertySet->getPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_ISCASE)))); ! sal_Bool bUseRegularExpressions = ::cppu::any2bool(xPropertySet->getPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_USEREGEX)))); ! sal_Bool bAnd = sal_False; ! sal_Bool bOr = sal_False; ! for (sal_Int32 i = 1; i < nTableFilterFields; ++i) ! { ! if (aTableFilterFields[i].Connection == sheet::FilterConnection_AND) ! bAnd = sal_True; ! else ! bOr = sal_True; ! } ! if (bOr && !bAnd) ! { ! SvXMLElementExport aElemOr(rExport, XML_NAMESPACE_TABLE, XML_FILTER_OR, sal_True, sal_True); for (sal_Int32 i = 0; i < nTableFilterFields; ++i) ! { ! WriteCondition(aTableFilterFields[i], bIsCaseSensitive, bUseRegularExpressions); ! } ! } ! else if (bAnd && !bOr) ! { ! SvXMLElementExport aElemAnd(rExport, XML_NAMESPACE_TABLE, XML_FILTER_AND, sal_True, sal_True); for (sal_Int32 i = 0; i < nTableFilterFields; ++i) ! { ! WriteCondition(aTableFilterFields[i], bIsCaseSensitive, bUseRegularExpressions); ! } ! } ! else if (nTableFilterFields == 1) ! { ! WriteCondition(aTableFilterFields[0], bIsCaseSensitive, bUseRegularExpressions); ! } ! else ! { ! SvXMLElementExport aElemC(rExport, XML_NAMESPACE_TABLE, XML_FILTER_OR, sal_True, sal_True); ! sheet::TableFilterField aPrevFilterField = aTableFilterFields[0]; ! sheet::FilterConnection aConnection = aTableFilterFields[1].Connection; ! sal_Bool bOpenAndElement; ! rtl::OUString aName = rExport.GetNamespaceMap().GetQNameByKey(XML_NAMESPACE_TABLE, GetXMLToken(XML_FILTER_AND)); ! if (aConnection == sheet::FilterConnection_AND) ! { ! rExport.StartElement( aName, sal_True); ! bOpenAndElement = sal_True; ! } ! else ! bOpenAndElement = sal_False; for (sal_Int32 i = 1; i < nTableFilterFields; ++i) ! { ! if (aConnection != aTableFilterFields[i].Connection) ! { ! aConnection = aTableFilterFields[i].Connection; ! if (aTableFilterFields[i].Connection == sheet::FilterConnection_AND) ! { ! rExport.StartElement( aName, sal_True ); ! bOpenAndElement = sal_True; ! WriteCondition(aPrevFilterField, bIsCaseSensitive, bUseRegularExpressions); ! aPrevFilterField = aTableFilterFields[i]; ! if (i == nTableFilterFields - 1) ! { ! WriteCondition(aPrevFilterField, bIsCaseSensitive, bUseRegularExpressions); ! rExport.EndElement(aName, sal_True); ! bOpenAndElement = sal_False; ! } ! } ! else ! { ! WriteCondition(aPrevFilterField, bIsCaseSensitive, bUseRegularExpressions); ! aPrevFilterField = aTableFilterFields[i]; ! if (bOpenAndElement) ! { ! rExport.EndElement(aName, sal_True); ! bOpenAndElement = sal_False; ! } ! if (i == nTableFilterFields - 1) ! { ! WriteCondition(aPrevFilterField, bIsCaseSensitive, bUseRegularExpressions); ! } ! } ! } ! else ! { ! WriteCondition(aPrevFilterField, bIsCaseSensitive, bUseRegularExpressions); ! aPrevFilterField = aTableFilterFields[i]; ! if (i == nTableFilterFields - 1) ! WriteCondition(aPrevFilterField, bIsCaseSensitive, bUseRegularExpressions); ! } ! } if(bOpenAndElement) rExport.EndElement(aName, sal_True); ! } ! } ! } } void ScXMLExportDatabaseRanges::WriteSortDescriptor(const uno::Sequence aSortProperties) --- 399,663 ---- SvXMLElementExport aElemC(rExport, XML_NAMESPACE_TABLE, XML_FILTER_CONDITION, sal_True, sal_True); } ! void ScXMLExportDatabaseRanges::WriteFilterDescriptor(const uno::Reference & xSheetFilterDescriptor, const rtl::OUString sDatabaseRangeName) { ! uno::Reference< sheet::XSheetFilterDescriptor2 > xSheetFilterDescriptor2( xSheetFilterDescriptor, uno::UNO_QUERY ); ! if ( xSheetFilterDescriptor2.is() ) ! { ! uno::Sequence< sheet::TableFilterField2 > aTableFilterFields2( ! xSheetFilterDescriptor2->getFilterFields2() ); ! sal_Int32 nTableFilterFields = aTableFilterFields2.getLength(); ! if (nTableFilterFields > 0) ! { ! uno::Reference xPropertySet (xSheetFilterDescriptor, uno::UNO_QUERY); ! if (xPropertySet.is()) { ! if (::cppu::any2bool(xPropertySet->getPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_COPYOUT))))) ! { ! table::CellAddress aOutputPosition; ! if (xPropertySet->getPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_OUTPOS))) >>= aOutputPosition) ! { ! rtl::OUString sOUCellAddress; ! ScRangeStringConverter::GetStringFromAddress( sOUCellAddress, aOutputPosition, pDoc ); ! rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_TARGET_RANGE_ADDRESS, sOUCellAddress); ! } ! } ! ScDBCollection* pDBCollection = pDoc->GetDBCollection(); ! sal_uInt16 nIndex; ! pDBCollection->SearchName(sDatabaseRangeName, nIndex); ! ScDBData* pDBData = (*pDBCollection)[nIndex]; ! ScRange aAdvSource; ! if (pDBData->GetAdvancedQuerySource(aAdvSource)) ! { ! rtl::OUString sOUCellAddress; ! ScRangeStringConverter::GetStringFromRange( sOUCellAddress, aAdvSource, pDoc ); ! rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_CONDITION_SOURCE_RANGE_ADDRESS, sOUCellAddress); ! } ! ! if (::cppu::any2bool(xPropertySet->getPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_SKIPDUP))))) ! rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_DISPLAY_DUPLICATES, XML_FALSE); ! SvXMLElementExport aElemF(rExport, XML_NAMESPACE_TABLE, XML_FILTER, sal_True, sal_True); ! rExport.CheckAttrList(); ! sal_Bool bIsCaseSensitive = ::cppu::any2bool(xPropertySet->getPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_ISCASE)))); ! sal_Bool bUseRegularExpressions = ::cppu::any2bool(xPropertySet->getPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_USEREGEX)))); ! sal_Bool bAnd = sal_False; ! sal_Bool bOr = sal_False; ! for (sal_Int32 i = 1; i < nTableFilterFields; ++i) ! { ! if (aTableFilterFields2[i].Connection == sheet::FilterConnection_AND) ! bAnd = sal_True; ! else ! bOr = sal_True; ! } ! if (bOr && !bAnd) ! { ! SvXMLElementExport aElemOr(rExport, XML_NAMESPACE_TABLE, XML_FILTER_OR, sal_True, sal_True); ! for (sal_Int32 i = 0; i < nTableFilterFields; ++i) ! { ! WriteCondition(aTableFilterFields2[i], bIsCaseSensitive, bUseRegularExpressions); ! } ! } ! else if (bAnd && !bOr) ! { ! SvXMLElementExport aElemAnd(rExport, XML_NAMESPACE_TABLE, XML_FILTER_AND, sal_True, sal_True); ! for (sal_Int32 i = 0; i < nTableFilterFields; ++i) ! { ! WriteCondition(aTableFilterFields2[i], bIsCaseSensitive, bUseRegularExpressions); ! } ! } ! else if (nTableFilterFields == 1) ! { ! WriteCondition(aTableFilterFields2[0], bIsCaseSensitive, bUseRegularExpressions); ! } ! else ! { ! SvXMLElementExport aElemC(rExport, XML_NAMESPACE_TABLE, XML_FILTER_OR, sal_True, sal_True); ! sheet::TableFilterField2 aPrevFilterField = aTableFilterFields2[0]; ! sheet::FilterConnection aConnection = aTableFilterFields2[1].Connection; ! sal_Bool bOpenAndElement; ! rtl::OUString aName = rExport.GetNamespaceMap().GetQNameByKey(XML_NAMESPACE_TABLE, GetXMLToken(XML_FILTER_AND)); ! if (aConnection == sheet::FilterConnection_AND) ! { ! rExport.StartElement( aName, sal_True); ! bOpenAndElement = sal_True; ! } ! else ! bOpenAndElement = sal_False; ! for (sal_Int32 i = 1; i < nTableFilterFields; ++i) ! { ! if (aConnection != aTableFilterFields2[i].Connection) ! { ! aConnection = aTableFilterFields2[i].Connection; ! if (aTableFilterFields2[i].Connection == sheet::FilterConnection_AND) ! { ! rExport.StartElement( aName, sal_True ); ! bOpenAndElement = sal_True; ! WriteCondition(aPrevFilterField, bIsCaseSensitive, bUseRegularExpressions); ! aPrevFilterField = aTableFilterFields2[i]; ! if (i == nTableFilterFields - 1) ! { ! WriteCondition(aPrevFilterField, bIsCaseSensitive, bUseRegularExpressions); ! rExport.EndElement(aName, sal_True); ! bOpenAndElement = sal_False; ! } ! } ! else ! { ! WriteCondition(aPrevFilterField, bIsCaseSensitive, bUseRegularExpressions); ! aPrevFilterField = aTableFilterFields2[i]; ! if (bOpenAndElement) ! { ! rExport.EndElement(aName, sal_True); ! bOpenAndElement = sal_False; ! } ! if (i == nTableFilterFields - 1) ! { ! WriteCondition(aPrevFilterField, bIsCaseSensitive, bUseRegularExpressions); ! } ! } ! } ! else ! { ! WriteCondition(aPrevFilterField, bIsCaseSensitive, bUseRegularExpressions); ! aPrevFilterField = aTableFilterFields2[i]; ! if (i == nTableFilterFields - 1) ! WriteCondition(aPrevFilterField, bIsCaseSensitive, bUseRegularExpressions); ! } ! } ! if(bOpenAndElement) ! rExport.EndElement(aName, sal_True); ! } ! } ! } ! } ! } ! void ScXMLExportDatabaseRanges::WriteFilterDescriptor(const uno::Reference & xSheetFilterDescriptor, const rtl::OUString sDatabaseRangeName) ! { ! uno::Sequence< sheet::TableFilterField > aTableFilterFields( ! xSheetFilterDescriptor->getFilterFields() ); ! sal_Int32 nTableFilterFields = aTableFilterFields.getLength(); ! if (nTableFilterFields > 0) ! { ! uno::Reference xPropertySet (xSheetFilterDescriptor, uno::UNO_QUERY); ! if (xPropertySet.is()) ! { ! if (::cppu::any2bool(xPropertySet->getPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_COPYOUT))))) ! { ! table::CellAddress aOutputPosition; ! if (xPropertySet->getPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_OUTPOS))) >>= aOutputPosition) ! { ! rtl::OUString sOUCellAddress; ! ScRangeStringConverter::GetStringFromAddress( sOUCellAddress, aOutputPosition, pDoc ); ! rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_TARGET_RANGE_ADDRESS, sOUCellAddress); ! } ! } ! ScDBCollection* pDBCollection = pDoc->GetDBCollection(); ! sal_uInt16 nIndex; ! pDBCollection->SearchName(sDatabaseRangeName, nIndex); ! ScDBData* pDBData = (*pDBCollection)[nIndex]; ! ScRange aAdvSource; ! if (pDBData->GetAdvancedQuerySource(aAdvSource)) ! { ! rtl::OUString sOUCellAddress; ! ScRangeStringConverter::GetStringFromRange( sOUCellAddress, aAdvSource, pDoc ); ! rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_CONDITION_SOURCE_RANGE_ADDRESS, sOUCellAddress); ! } ! ! if (::cppu::any2bool(xPropertySet->getPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_SKIPDUP))))) ! rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_DISPLAY_DUPLICATES, XML_FALSE); ! SvXMLElementExport aElemF(rExport, XML_NAMESPACE_TABLE, XML_FILTER, sal_True, sal_True); ! rExport.CheckAttrList(); ! sal_Bool bIsCaseSensitive = ::cppu::any2bool(xPropertySet->getPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_ISCASE)))); ! sal_Bool bUseRegularExpressions = ::cppu::any2bool(xPropertySet->getPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_USEREGEX)))); ! sal_Bool bAnd = sal_False; ! sal_Bool bOr = sal_False; ! for (sal_Int32 i = 1; i < nTableFilterFields; ++i) ! { ! if (aTableFilterFields[i].Connection == sheet::FilterConnection_AND) ! bAnd = sal_True; ! else ! bOr = sal_True; ! } ! if (bOr && !bAnd) ! { ! SvXMLElementExport aElemOr(rExport, XML_NAMESPACE_TABLE, XML_FILTER_OR, sal_True, sal_True); for (sal_Int32 i = 0; i < nTableFilterFields; ++i) ! { ! WriteCondition(aTableFilterFields[i], bIsCaseSensitive, bUseRegularExpressions); ! } ! } ! else if (bAnd && !bOr) ! { ! SvXMLElementExport aElemAnd(rExport, XML_NAMESPACE_TABLE, XML_FILTER_AND, sal_True, sal_True); for (sal_Int32 i = 0; i < nTableFilterFields; ++i) ! { ! WriteCondition(aTableFilterFields[i], bIsCaseSensitive, bUseRegularExpressions); ! } ! } ! else if (nTableFilterFields == 1) ! { ! WriteCondition(aTableFilterFields[0], bIsCaseSensitive, bUseRegularExpressions); ! } ! else ! { ! SvXMLElementExport aElemC(rExport, XML_NAMESPACE_TABLE, XML_FILTER_OR, sal_True, sal_True); ! sheet::TableFilterField aPrevFilterField = aTableFilterFields[0]; ! sheet::FilterConnection aConnection = aTableFilterFields[1].Connection; ! sal_Bool bOpenAndElement; ! rtl::OUString aName = rExport.GetNamespaceMap().GetQNameByKey(XML_NAMESPACE_TABLE, GetXMLToken(XML_FILTER_AND)); ! if (aConnection == sheet::FilterConnection_AND) ! { ! rExport.StartElement( aName, sal_True); ! bOpenAndElement = sal_True; ! } ! else ! bOpenAndElement = sal_False; for (sal_Int32 i = 1; i < nTableFilterFields; ++i) ! { ! if (aConnection != aTableFilterFields[i].Connection) ! { ! aConnection = aTableFilterFields[i].Connection; ! if (aTableFilterFields[i].Connection == sheet::FilterConnection_AND) ! { ! rExport.StartElement( aName, sal_True ); ! bOpenAndElement = sal_True; ! WriteCondition(aPrevFilterField, bIsCaseSensitive, bUseRegularExpressions); ! aPrevFilterField = aTableFilterFields[i]; ! if (i == nTableFilterFields - 1) ! { ! WriteCondition(aPrevFilterField, bIsCaseSensitive, bUseRegularExpressions); ! rExport.EndElement(aName, sal_True); ! bOpenAndElement = sal_False; ! } ! } ! else ! { ! WriteCondition(aPrevFilterField, bIsCaseSensitive, bUseRegularExpressions); ! aPrevFilterField = aTableFilterFields[i]; ! if (bOpenAndElement) ! { ! rExport.EndElement(aName, sal_True); ! bOpenAndElement = sal_False; ! } ! if (i == nTableFilterFields - 1) ! { ! WriteCondition(aPrevFilterField, bIsCaseSensitive, bUseRegularExpressions); ! } ! } ! } ! else ! { ! WriteCondition(aPrevFilterField, bIsCaseSensitive, bUseRegularExpressions); ! aPrevFilterField = aTableFilterFields[i]; ! if (i == nTableFilterFields - 1) ! WriteCondition(aPrevFilterField, bIsCaseSensitive, bUseRegularExpressions); ! } ! } if(bOpenAndElement) rExport.EndElement(aName, sal_True); ! } ! } ! } } void ScXMLExportDatabaseRanges::WriteSortDescriptor(const uno::Sequence aSortProperties) diff -cNr sc.old/source/filter/xml/XMLExportDatabaseRanges.hxx sc.new/source/filter/xml/XMLExportDatabaseRanges.hxx *** sc.old/source/filter/xml/XMLExportDatabaseRanges.hxx Tue Mar 11 13:31:46 2008 --- sc.new/source/filter/xml/XMLExportDatabaseRanges.hxx Fri Mar 14 17:13:26 2008 *************** *** 45,56 **** --- 45,65 ---- #ifndef _COM_SUN_STAR_SHEET_FILTEROPERATOR_HPP_ #include #endif + #ifndef _COM_SUN_STAR_SHEET_FILTEROPERATOR2_HPP_ + #include + #endif #ifndef _COM_SUN_STAR_SHEET_TABLEFILTERFIELD_HPP_ #include #endif + #ifndef _COM_SUN_STAR_SHEET_TABLEFILTERFIELD2_HPP_ + #include + #endif #ifndef _COM_SUN_STAR_SHEET_XSHEETFILTERDESCRIPTOR_HPP_ #include #endif + #ifndef _COM_SUN_STAR_SHEET_XSHEETFILTERDESCRIPTOR2_HPP_ + #include + #endif #ifndef _COM_SUN_STAR_SHEET_XSUBTOTALDESCRIPTOR_HPP_ #include #endif *************** *** 69,76 **** --- 78,88 ---- void WriteImportDescriptor(const com::sun::star::uno::Sequence aImportDescriptor); rtl::OUString getOperatorXML(const com::sun::star::sheet::FilterOperator aFilterOperator, const sal_Bool bUseRegularExpressions) const; + rtl::OUString getOperatorXML(const long aFilterOperator, const sal_Bool bUseRegularExpressions) const; void WriteCondition(const com::sun::star::sheet::TableFilterField& aFilterField, sal_Bool bIsCaseSensitive, sal_Bool bUseRegularExpressions); + void WriteCondition(const com::sun::star::sheet::TableFilterField2& aFilterField, sal_Bool bIsCaseSensitive, sal_Bool bUseRegularExpressions); void WriteFilterDescriptor(const com::sun::star::uno::Reference & xSheetFilterDescriptor, const rtl::OUString sDatabaseRangeName); + void WriteFilterDescriptor(const com::sun::star::uno::Reference & xSheetFilterDescriptor, const rtl::OUString sDatabaseRangeName); void WriteSortDescriptor(const com::sun::star::uno::Sequence aSortProperties); void WriteSubTotalDescriptor(const com::sun::star::uno::Reference xSubTotalDescriptor, const rtl::OUString sDatabaseRangeName); public: diff -cNr sc.old/source/filter/xml/xmldrani.cxx sc.new/source/filter/xml/xmldrani.cxx *** sc.old/source/filter/xml/xmldrani.cxx Tue Mar 11 13:30:14 2008 --- sc.new/source/filter/xml/xmldrani.cxx Tue Mar 18 11:44:56 2008 *************** *** 426,432 **** xFilterPropertySet->setPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_USEREGEX)), uno::makeAny(bFilterUseRegularExpressions)); xFilterPropertySet->setPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_OUTPOS)), uno::makeAny(aFilterOutputPosition)); } ! xSheetFilterDescriptor->setFilterFields(aFilterFields); if (bFilterConditionSourceRange) { ScRange aAdvSource; --- 426,441 ---- xFilterPropertySet->setPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_USEREGEX)), uno::makeAny(bFilterUseRegularExpressions)); xFilterPropertySet->setPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_OUTPOS)), uno::makeAny(aFilterOutputPosition)); } ! uno::Reference< sheet::XSheetFilterDescriptor2 > xSheetFilterDescriptor2( ! xSheetFilterDescriptor, uno::UNO_QUERY ); ! if ( xSheetFilterDescriptor2.is() ) ! { ! xSheetFilterDescriptor2->setFilterFields2(aFilterFields2); ! } ! else ! { ! xSheetFilterDescriptor->setFilterFields(aFilterFields); ! } if (bFilterConditionSourceRange) { ScRange aAdvSource; diff -cNr sc.old/source/filter/xml/xmldrani.hxx sc.new/source/filter/xml/xmldrani.hxx *** sc.old/source/filter/xml/xmldrani.hxx Tue Mar 11 13:30:32 2008 --- sc.new/source/filter/xml/xmldrani.hxx Tue Mar 18 11:46:04 2008 *************** *** 56,61 **** --- 56,64 ---- #ifndef _COM_SUN_STAR_SHEET_TABLEFILTERFIELD_HPP_ #include #endif + #ifndef _COM_SUN_STAR_SHEET_TABLEFILTERFIELD2_HPP_ + #include + #endif #ifndef _COM_SUN_STAR_TABLE_CELLADDRESS_HPP_ #include #endif *************** *** 105,110 **** --- 108,114 ---- rtl::OUString sSourceObject; com::sun::star::uno::Sequence aSortSequence; com::sun::star::uno::Sequence aFilterFields; + com::sun::star::uno::Sequence aFilterFields2; std::vector < ScSubTotalRule > aSubTotalRules; com::sun::star::table::CellAddress aFilterOutputPosition; com::sun::star::table::CellRangeAddress aFilterConditionSourceRangeAddress; diff -cNr sc.old/source/ui/unoobj/cellsuno.cxx sc.new/source/ui/unoobj/cellsuno.cxx *** sc.old/source/ui/unoobj/cellsuno.cxx Tue Mar 11 13:33:12 2008 --- sc.new/source/ui/unoobj/cellsuno.cxx Tue Mar 18 09:50:44 2008 *************** *** 5581,5587 **** ScDocShell* pDocSh = GetDocShell(); ScFilterDescriptor aImpl(pDocSh); ! aImpl.setFilterFields( xDescriptor->getFilterFields() ); // Rest sind jetzt Properties... uno::Reference xPropSet( xDescriptor, uno::UNO_QUERY ); --- 5581,5596 ---- ScDocShell* pDocSh = GetDocShell(); ScFilterDescriptor aImpl(pDocSh); ! uno::Reference< sheet::XSheetFilterDescriptor2 > xDescriptor2( ! xDescriptor, uno::UNO_QUERY ); ! if ( xDescriptor2.is() ) ! { ! aImpl.setFilterFields2( xDescriptor2->getFilterFields2() ); ! } ! else ! { ! aImpl.setFilterFields( xDescriptor->getFilterFields() ); ! } // Rest sind jetzt Properties... uno::Reference xPropSet( xDescriptor, uno::UNO_QUERY ); diff -cNr sc.old/source/ui/vba/vbarange.cxx sc.new/source/ui/vba/vbarange.cxx *** sc.old/source/ui/vba/vbarange.cxx Tue Mar 11 13:33:40 2008 --- sc.new/source/ui/vba/vbarange.cxx Tue Mar 18 14:46:54 2008 *************** *** 105,110 **** --- 105,111 ---- #include #include #include + #include #include #include *************** *** 3323,3388 **** Criteria1 >>= sCriteria1; uno::Reference< sheet::XSheetFilterable > xFilt( mxRange, uno::UNO_QUERY_THROW ); uno::Reference< sheet::XSheetFilterDescriptor > xDesc = xFilt->createFilterDescriptor( sal_True ); ! uno::Sequence< sheet::TableFilterField > sTabFilts = xDesc->getFilterFields(); ! sTabFilts.realloc( 1 ); ! sTabFilts[0].IsNumeric = bCritHasNumericValue; ! OSL_TRACE("No filt fields is %d", sTabFilts.getLength() ); ! ! if ( bHasCritValue && sCriteria1.getLength() ) ! { ! if ( sCriteria1.equals( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("=") ) ) ) ! nOp = sheet::FilterOperator_EMPTY; ! else if ( sCriteria1.equals( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("<>") ) ) ) ! nOp = sheet::FilterOperator_NOT_EMPTY; ! else ! nOp = sheet::FilterOperator_EQUAL; ! } ! if ( Operator.hasValue() ) ! { ! // if its a bottom/top Ten(Percent/Value) and there ! // is no value specified for critera1 set it to 10 ! if ( !bCritHasNumericValue && !sCriteria1.getLength() && ( nOperator != excel::XlAutoFilterOperator::xlOr ) && ( nOperator != excel::XlAutoFilterOperator::xlAnd ) ) ! { ! nCriteria1 = 10; ! sTabFilts[0].IsNumeric = sal_True; ! } ! switch ( nOperator ) ! { ! case excel::XlAutoFilterOperator::xlBottom10Items: ! nOp = sheet::FilterOperator_BOTTOM_VALUES; ! break; ! case excel::XlAutoFilterOperator::xlBottom10Percent: ! nOp = sheet::FilterOperator_BOTTOM_PERCENT; ! break; ! case excel::XlAutoFilterOperator::xlTop10Items: ! nOp = sheet::FilterOperator_TOP_VALUES; ! break; ! case excel::XlAutoFilterOperator::xlTop10Percent: ! nOp = sheet::FilterOperator_TOP_PERCENT; ! break; ! case excel::XlAutoFilterOperator::xlOr: ! nConn = sheet::FilterConnection_OR; ! case excel::XlAutoFilterOperator::xlAnd: ! nConn = sheet::FilterConnection_AND; ! default: ! throw uno::RuntimeException( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("UnknownOption") ), uno::Reference< uno::XInterface >() ); ! ! } ! } ! sTabFilts[0].Connection = nConn; ! if ( nField > 0 ) ! sTabFilts[0].Field = (nField - 1); ! else ! sTabFilts[0].Field = 0; ! sTabFilts[0].Operator = nOp; ! if( sTabFilts[0].IsNumeric ) ! sTabFilts[0].NumericValue = nCriteria1; ! else ! sTabFilts[0].StringValue = sCriteria1; ! xDesc->setFilterFields( sTabFilts ); uno::Reference< beans::XPropertySet > xProps( xDesc, uno::UNO_QUERY_THROW ); xProps->setPropertyValue( CONTS_HEADER, uno::makeAny( sal_True ) ); xFilt->filter( xDesc ); --- 3324,3457 ---- Criteria1 >>= sCriteria1; uno::Reference< sheet::XSheetFilterable > xFilt( mxRange, uno::UNO_QUERY_THROW ); uno::Reference< sheet::XSheetFilterDescriptor > xDesc = xFilt->createFilterDescriptor( sal_True ); ! uno::Reference< sheet::XSheetFilterDescriptor2 > xDesc2( ! xDesc, uno::UNO_QUERY ); ! if ( xDesc2.is() ) ! { ! uno::Sequence< sheet::TableFilterField2 > sTabFilts2 = xDesc2->getFilterFields2(); ! sTabFilts2.realloc( 1 ); ! sTabFilts2[0].IsNumeric = bCritHasNumericValue; ! OSL_TRACE("No filt fields is %d", sTabFilts2.getLength() ); ! if ( bHasCritValue && sCriteria1.getLength() ) ! { ! if ( sCriteria1.equals( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("=") ) ) ) ! nOp = sheet::FilterOperator_EMPTY; ! else if ( sCriteria1.equals( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("<>") ) ) ) ! nOp = sheet::FilterOperator_NOT_EMPTY; ! else ! nOp = sheet::FilterOperator_EQUAL; ! } ! if ( Operator.hasValue() ) ! { ! // if its a bottom/top Ten(Percent/Value) and there ! // is no value specified for critera1 set it to 10 ! if ( !bCritHasNumericValue && !sCriteria1.getLength() && ( nOperator != excel::XlAutoFilterOperator::xlOr ) && ( nOperator != excel::XlAutoFilterOperator::xlAnd ) ) ! { ! nCriteria1 = 10; ! sTabFilts2[0].IsNumeric = sal_True; ! } ! switch ( nOperator ) ! { ! case excel::XlAutoFilterOperator::xlBottom10Items: ! nOp = sheet::FilterOperator_BOTTOM_VALUES; ! break; ! case excel::XlAutoFilterOperator::xlBottom10Percent: ! nOp = sheet::FilterOperator_BOTTOM_PERCENT; ! break; ! case excel::XlAutoFilterOperator::xlTop10Items: ! nOp = sheet::FilterOperator_TOP_VALUES; ! break; ! case excel::XlAutoFilterOperator::xlTop10Percent: ! nOp = sheet::FilterOperator_TOP_PERCENT; ! break; ! case excel::XlAutoFilterOperator::xlOr: ! nConn = sheet::FilterConnection_OR; ! case excel::XlAutoFilterOperator::xlAnd: ! nConn = sheet::FilterConnection_AND; ! default: ! throw uno::RuntimeException( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("UnknownOption") ), uno::Reference< uno::XInterface >() ); ! ! } ! ! } ! sTabFilts2[0].Connection = nConn; ! if ( nField > 0 ) ! sTabFilts2[0].Field = (nField - 1); ! else ! sTabFilts2[0].Field = 0; ! sTabFilts2[0].Operator = nOp; ! if( sTabFilts2[0].IsNumeric ) ! sTabFilts2[0].NumericValue = nCriteria1; ! else ! sTabFilts2[0].StringValue = sCriteria1; ! ! xDesc2->setFilterFields2( sTabFilts2 ); ! } ! else ! { ! uno::Sequence< sheet::TableFilterField > sTabFilts = xDesc->getFilterFields(); ! sTabFilts.realloc( 1 ); ! sTabFilts[0].IsNumeric = bCritHasNumericValue; ! OSL_TRACE("No filt fields is %d", sTabFilts.getLength() ); ! ! if ( bHasCritValue && sCriteria1.getLength() ) ! { ! if ( sCriteria1.equals( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("=") ) ) ) ! nOp = sheet::FilterOperator_EMPTY; ! else if ( sCriteria1.equals( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("<>") ) ) ) ! nOp = sheet::FilterOperator_NOT_EMPTY; ! else ! nOp = sheet::FilterOperator_EQUAL; ! } ! if ( Operator.hasValue() ) ! { ! // if its a bottom/top Ten(Percent/Value) and there ! // is no value specified for critera1 set it to 10 ! if ( !bCritHasNumericValue && !sCriteria1.getLength() && ( nOperator != excel::XlAutoFilterOperator::xlOr ) && ( nOperator != excel::XlAutoFilterOperator::xlAnd ) ) ! { ! nCriteria1 = 10; ! sTabFilts[0].IsNumeric = sal_True; ! } ! switch ( nOperator ) ! { ! case excel::XlAutoFilterOperator::xlBottom10Items: ! nOp = sheet::FilterOperator_BOTTOM_VALUES; ! break; ! case excel::XlAutoFilterOperator::xlBottom10Percent: ! nOp = sheet::FilterOperator_BOTTOM_PERCENT; ! break; ! case excel::XlAutoFilterOperator::xlTop10Items: ! nOp = sheet::FilterOperator_TOP_VALUES; ! break; ! case excel::XlAutoFilterOperator::xlTop10Percent: ! nOp = sheet::FilterOperator_TOP_PERCENT; ! break; ! case excel::XlAutoFilterOperator::xlOr: ! nConn = sheet::FilterConnection_OR; ! case excel::XlAutoFilterOperator::xlAnd: ! nConn = sheet::FilterConnection_AND; ! default: ! throw uno::RuntimeException( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("UnknownOption") ), uno::Reference< uno::XInterface >() ); ! ! } ! ! } ! sTabFilts[0].Connection = nConn; ! if ( nField > 0 ) ! sTabFilts[0].Field = (nField - 1); ! else ! sTabFilts[0].Field = 0; ! sTabFilts[0].Operator = nOp; ! if( sTabFilts[0].IsNumeric ) ! sTabFilts[0].NumericValue = nCriteria1; ! else ! sTabFilts[0].StringValue = sCriteria1; ! ! xDesc->setFilterFields( sTabFilts ); ! } uno::Reference< beans::XPropertySet > xProps( xDesc, uno::UNO_QUERY_THROW ); xProps->setPropertyValue( CONTS_HEADER, uno::makeAny( sal_True ) ); xFilt->filter( xDesc );