1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: xmlfilti.cxx,v $
12 * This file is part of OpenOffice.org.
14 * OpenOffice.org is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU Lesser General Public License version 3
16 * only, as published by the Free Software Foundation.
18 * OpenOffice.org is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU Lesser General Public License version 3 for more details
22 * (a copy is included in the LICENSE file that accompanied this code).
24 * You should have received a copy of the GNU Lesser General Public License
25 * version 3 along with OpenOffice.org. If not, see
26 * <http://www.openoffice.org/license.html>
27 * for a copy of the LGPLv3 License.
29 ************************************************************************/
31 // MARKER(update_precomp.py): autogen include statement, do not remove
32 #include "precompiled_sc.hxx"
35 // INCLUDE ---------------------------------------------------------------
37 #include "xmlfilti.hxx"
38 #include "xmlimprt.hxx"
40 #include "convuno.hxx"
41 #include "XMLConverter.hxx"
42 #include "rangeutl.hxx"
44 #include <xmloff/xmltkmap.hxx>
45 #include <xmloff/nmspmap.hxx>
46 #include <xmloff/xmltoken.hxx>
48 using namespace com::sun::star
;
49 using namespace xmloff::token
;
51 //------------------------------------------------------------------
53 ScXMLFilterContext::ScXMLFilterContext( ScXMLImport
& rImport
,
55 const ::rtl::OUString
& rLName
,
56 const ::com::sun::star::uno::Reference
<
57 ::com::sun::star::xml::sax::XAttributeList
>& xAttrList
,
58 ScXMLDatabaseRangeContext
* pTempDatabaseRangeContext
) :
59 SvXMLImportContext( rImport
, nPrfx
, rLName
),
60 pDatabaseRangeContext(pTempDatabaseRangeContext
),
62 bSkipDuplicates(sal_False
),
63 bCopyOutputData(sal_False
),
64 bUseRegularExpressions(sal_False
),
65 bConnectionOr(sal_True
),
66 bNextConnectionOr(sal_True
),
67 bConditionSourceRange(sal_False
)
69 ScDocument
* pDoc(GetScImport().GetDocument());
71 sal_Int16 nAttrCount
= xAttrList
.is() ? xAttrList
->getLength() : 0;
72 const SvXMLTokenMap
& rAttrTokenMap
= GetScImport().GetFilterAttrTokenMap();
73 for( sal_Int16 i
=0; i
< nAttrCount
; ++i
)
75 const rtl::OUString
& sAttrName(xAttrList
->getNameByIndex( i
));
76 rtl::OUString aLocalName
;
77 USHORT nPrefix
= GetScImport().GetNamespaceMap().GetKeyByAttrName(
78 sAttrName
, &aLocalName
);
79 const rtl::OUString
& sValue(xAttrList
->getValueByIndex( i
));
81 switch( rAttrTokenMap
.Get( nPrefix
, aLocalName
) )
83 case XML_TOK_FILTER_ATTR_TARGET_RANGE_ADDRESS
:
87 if (ScRangeStringConverter::GetRangeFromString( aScRange
, sValue
, pDoc
, ::formula::FormulaGrammar::CONV_OOO
, nOffset
))
89 ScUnoConversion::FillApiAddress( aOutputPosition
, aScRange
.aStart
);
90 bCopyOutputData
= sal_True
;
94 case XML_TOK_FILTER_ATTR_CONDITION_SOURCE_RANGE_ADDRESS
:
97 if (ScRangeStringConverter::GetRangeFromString( aConditionSourceRangeAddress
, sValue
, pDoc
, ::formula::FormulaGrammar::CONV_OOO
, nOffset
))
98 bConditionSourceRange
= sal_True
;
101 case XML_TOK_FILTER_ATTR_CONDITION_SOURCE
:
103 // not supported by StarOffice
106 case XML_TOK_FILTER_ATTR_DISPLAY_DUPLICATES
:
108 bSkipDuplicates
= !IsXMLToken(sValue
, XML_TRUE
);
115 ScXMLFilterContext::~ScXMLFilterContext()
119 SvXMLImportContext
*ScXMLFilterContext::CreateChildContext( USHORT nPrefix
,
120 const ::rtl::OUString
& rLName
,
121 const ::com::sun::star::uno::Reference
<
122 ::com::sun::star::xml::sax::XAttributeList
>& xAttrList
)
124 SvXMLImportContext
*pContext(0);
126 const SvXMLTokenMap
& rTokenMap(GetScImport().GetFilterElemTokenMap());
127 switch( rTokenMap
.Get( nPrefix
, rLName
) )
129 case XML_TOK_FILTER_AND
:
131 pContext
= new ScXMLAndContext( GetScImport(), nPrefix
,
132 rLName
, xAttrList
, this);
135 case XML_TOK_FILTER_OR
:
137 pContext
= new ScXMLOrContext( GetScImport(), nPrefix
,
138 rLName
, xAttrList
, this);
141 case XML_TOK_FILTER_CONDITION
:
143 pContext
= new ScXMLConditionContext( GetScImport(), nPrefix
,
144 rLName
, xAttrList
, this);
150 pContext
= new SvXMLImportContext( GetImport(), nPrefix
, rLName
);
155 void ScXMLFilterContext::EndElement()
157 pDatabaseRangeContext
->SetFilterUseRegularExpressions(bUseRegularExpressions
);
160 pDatabaseRangeContext
->SetFilterOutputPosition(aOutputPosition
);
161 pDatabaseRangeContext
->SetFilterCopyOutputData(bCopyOutputData
);
164 pDatabaseRangeContext
->SetFilterCopyOutputData(sal_False
);
165 pDatabaseRangeContext
->SetFilterIsCaseSensitive(bIsCaseSensitive
);
166 pDatabaseRangeContext
->SetFilterSkipDuplicates(bSkipDuplicates
);
167 pDatabaseRangeContext
->SetFilterFields(aFilterFields
);
168 if (bConditionSourceRange
)
169 pDatabaseRangeContext
->SetFilterConditionSourceRangeAddress(aConditionSourceRangeAddress
);
172 ScXMLAndContext::ScXMLAndContext( ScXMLImport
& rImport
,
174 const ::rtl::OUString
& rLName
,
175 const ::com::sun::star::uno::Reference
<
176 ::com::sun::star::xml::sax::XAttributeList
>& /* xAttrList */,
177 ScXMLFilterContext
* pTempFilterContext
) :
178 SvXMLImportContext( rImport
, nPrfx
, rLName
),
179 pFilterContext(pTempFilterContext
)
181 pFilterContext
->OpenConnection(sal_False
);
184 ScXMLAndContext::~ScXMLAndContext()
188 SvXMLImportContext
*ScXMLAndContext::CreateChildContext( USHORT nPrefix
,
189 const ::rtl::OUString
& rLName
,
190 const ::com::sun::star::uno::Reference
<
191 ::com::sun::star::xml::sax::XAttributeList
>& xAttrList
)
193 SvXMLImportContext
*pContext(0);
195 const SvXMLTokenMap
& rTokenMap(GetScImport().GetFilterElemTokenMap());
196 switch( rTokenMap
.Get( nPrefix
, rLName
) )
198 case XML_TOK_FILTER_OR
:
200 // not supported in StarOffice
203 case XML_TOK_FILTER_CONDITION
:
205 pContext
= new ScXMLConditionContext( GetScImport(), nPrefix
,
206 rLName
, xAttrList
, pFilterContext
);
212 pContext
= new SvXMLImportContext( GetImport(), nPrefix
, rLName
);
217 void ScXMLAndContext::EndElement()
219 pFilterContext
->CloseConnection();
222 ScXMLOrContext::ScXMLOrContext( ScXMLImport
& rImport
,
224 const ::rtl::OUString
& rLName
,
225 const ::com::sun::star::uno::Reference
<
226 ::com::sun::star::xml::sax::XAttributeList
>& /* xAttrList */,
227 ScXMLFilterContext
* pTempFilterContext
) :
228 SvXMLImportContext( rImport
, nPrfx
, rLName
),
229 pFilterContext(pTempFilterContext
)
231 pFilterContext
->OpenConnection(sal_True
);
234 ScXMLOrContext::~ScXMLOrContext()
238 SvXMLImportContext
*ScXMLOrContext::CreateChildContext( USHORT nPrefix
,
239 const ::rtl::OUString
& rLName
,
240 const ::com::sun::star::uno::Reference
<
241 ::com::sun::star::xml::sax::XAttributeList
>& xAttrList
)
243 SvXMLImportContext
*pContext(0);
245 const SvXMLTokenMap
& rTokenMap(GetScImport().GetFilterElemTokenMap());
246 switch( rTokenMap
.Get( nPrefix
, rLName
) )
248 case XML_TOK_FILTER_AND
:
250 pContext
= new ScXMLAndContext( GetScImport(), nPrefix
,
251 rLName
, xAttrList
, pFilterContext
);
254 case XML_TOK_FILTER_CONDITION
:
256 pContext
= new ScXMLConditionContext( GetScImport(), nPrefix
,
257 rLName
, xAttrList
, pFilterContext
);
263 pContext
= new SvXMLImportContext( GetImport(), nPrefix
, rLName
);
268 void ScXMLOrContext::EndElement()
270 pFilterContext
->CloseConnection();
273 ScXMLConditionContext::ScXMLConditionContext( ScXMLImport
& rImport
,
275 const ::rtl::OUString
& rLName
,
276 const ::com::sun::star::uno::Reference
<
277 ::com::sun::star::xml::sax::XAttributeList
>& xAttrList
,
278 ScXMLFilterContext
* pTempFilterContext
) :
279 SvXMLImportContext( rImport
, nPrfx
, rLName
),
280 pFilterContext(pTempFilterContext
),
281 bIsCaseSensitive(sal_False
)
283 sDataType
= GetXMLToken(XML_TEXT
);
285 sal_Int16
nAttrCount(xAttrList
.is() ? xAttrList
->getLength() : 0);
286 const SvXMLTokenMap
& rAttrTokenMap(GetScImport().GetFilterConditionAttrTokenMap());
287 for( sal_Int16 i
=0; i
< nAttrCount
; ++i
)
289 const rtl::OUString
& sAttrName(xAttrList
->getNameByIndex( i
));
290 rtl::OUString aLocalName
;
291 USHORT nPrefix
= GetScImport().GetNamespaceMap().GetKeyByAttrName(
292 sAttrName
, &aLocalName
);
293 const rtl::OUString
& sValue(xAttrList
->getValueByIndex( i
));
295 switch( rAttrTokenMap
.Get( nPrefix
, aLocalName
) )
297 case XML_TOK_CONDITION_ATTR_FIELD_NUMBER
:
299 nField
= sValue
.toInt32();
302 case XML_TOK_CONDITION_ATTR_CASE_SENSITIVE
:
304 bIsCaseSensitive
= IsXMLToken(sValue
, XML_TRUE
);
307 case XML_TOK_CONDITION_ATTR_DATA_TYPE
:
312 case XML_TOK_CONDITION_ATTR_VALUE
:
314 sConditionValue
= sValue
;
317 case XML_TOK_CONDITION_ATTR_OPERATOR
:
326 ScXMLConditionContext::~ScXMLConditionContext()
330 SvXMLImportContext
*ScXMLConditionContext::CreateChildContext( USHORT nPrefix
,
331 const ::rtl::OUString
& rLName
,
332 const ::com::sun::star::uno::Reference
<
333 ::com::sun::star::xml::sax::XAttributeList
>& /* xAttrList */ )
335 return new SvXMLImportContext( GetImport(), nPrefix
, rLName
);
338 void ScXMLConditionContext::getOperatorXML(const rtl::OUString sTempOperator
, sheet::FilterOperator
& aFilterOperator
, sal_Bool
& bUseRegularExpressions
) const
340 bUseRegularExpressions
= sal_False
;
341 if (IsXMLToken(sTempOperator
, XML_MATCH
))
343 bUseRegularExpressions
= sal_True
;
344 aFilterOperator
= sheet::FilterOperator_EQUAL
;
346 else if (IsXMLToken(sTempOperator
, XML_NOMATCH
))
348 bUseRegularExpressions
= sal_True
;
349 aFilterOperator
= sheet::FilterOperator_NOT_EQUAL
;
351 else if (sTempOperator
.compareToAscii("=") == 0)
352 aFilterOperator
= sheet::FilterOperator_EQUAL
;
353 else if (sTempOperator
.compareToAscii("!=") == 0)
354 aFilterOperator
= sheet::FilterOperator_NOT_EQUAL
;
355 else if (IsXMLToken(sTempOperator
, XML_BOTTOM_PERCENT
))
356 aFilterOperator
= sheet::FilterOperator_BOTTOM_PERCENT
;
357 else if (IsXMLToken(sTempOperator
, XML_BOTTOM_VALUES
))
358 aFilterOperator
= sheet::FilterOperator_BOTTOM_VALUES
;
359 else if (IsXMLToken(sTempOperator
, XML_EMPTY
))
360 aFilterOperator
= sheet::FilterOperator_EMPTY
;
361 else if (sTempOperator
.compareToAscii(">") == 0)
362 aFilterOperator
= sheet::FilterOperator_GREATER
;
363 else if (sTempOperator
.compareToAscii(">=") == 0)
364 aFilterOperator
= sheet::FilterOperator_GREATER_EQUAL
;
365 else if (sTempOperator
.compareToAscii("<") == 0)
366 aFilterOperator
= sheet::FilterOperator_LESS
;
367 else if (sTempOperator
.compareToAscii("<=") == 0)
368 aFilterOperator
= sheet::FilterOperator_LESS_EQUAL
;
369 else if (IsXMLToken(sTempOperator
, XML_NOEMPTY
))
370 aFilterOperator
= sheet::FilterOperator_NOT_EMPTY
;
371 else if (IsXMLToken(sTempOperator
, XML_TOP_PERCENT
))
372 aFilterOperator
= sheet::FilterOperator_TOP_PERCENT
;
373 else if (IsXMLToken(sTempOperator
, XML_TOP_VALUES
))
374 aFilterOperator
= sheet::FilterOperator_TOP_VALUES
;
375 else if (IsXMLToken(sTempOperator
, XML_BEGINS
))
376 aFilterOperator
= (sheet::FilterOperator
) (100+SC_BEGINS_WITH
);
377 else if (IsXMLToken(sTempOperator
, XML_ENDS
))
378 aFilterOperator
= (sheet::FilterOperator
) (100+SC_ENDS_WITH
);
379 else if (IsXMLToken(sTempOperator
, XML_CONTAINS
))
380 aFilterOperator
= (sheet::FilterOperator
) (100+SC_CONTAINS
);
381 else if (IsXMLToken(sTempOperator
, XML_NOT_CONTAINS
))
382 aFilterOperator
= (sheet::FilterOperator
) (100+SC_DOES_NOT_CONTAIN
);
385 void ScXMLConditionContext::EndElement()
387 sheet::TableFilterField aFilterField
;
388 if (pFilterContext
->GetConnection())
389 aFilterField
.Connection
= sheet::FilterConnection_OR
;
391 aFilterField
.Connection
= sheet::FilterConnection_AND
;
392 pFilterContext
->SetIsCaseSensitive(bIsCaseSensitive
);
393 sal_Bool bUseRegularExpressions
;
394 getOperatorXML(sOperator
, aFilterField
.Operator
, bUseRegularExpressions
);
395 pFilterContext
->SetUseRegularExpressions(bUseRegularExpressions
);
396 aFilterField
.Field
= nField
;
397 if (IsXMLToken(sDataType
, XML_NUMBER
))
399 aFilterField
.NumericValue
= sConditionValue
.toDouble();
400 aFilterField
.IsNumeric
= sal_True
;
404 aFilterField
.StringValue
= sConditionValue
;
405 aFilterField
.IsNumeric
= sal_False
;
407 pFilterContext
->AddFilterField(aFilterField
);
410 //==========================================================================
412 ScXMLDPFilterContext::ScXMLDPFilterContext( ScXMLImport
& rImport
,
414 const ::rtl::OUString
& rLName
,
415 const ::com::sun::star::uno::Reference
<
416 ::com::sun::star::xml::sax::XAttributeList
>& xAttrList
,
417 ScXMLDataPilotTableContext
* pTempDataPilotTableContext
) :
418 SvXMLImportContext( rImport
, nPrfx
, rLName
),
419 pDataPilotTable(pTempDataPilotTableContext
),
421 nFilterFieldCount(0),
422 bSkipDuplicates(sal_False
),
423 bCopyOutputData(sal_False
),
424 bUseRegularExpressions(sal_False
),
425 bConnectionOr(sal_True
),
426 bNextConnectionOr(sal_True
),
427 bConditionSourceRange(sal_False
)
429 ScDocument
* pDoc(GetScImport().GetDocument());
431 sal_Int16
nAttrCount(xAttrList
.is() ? xAttrList
->getLength() : 0);
432 const SvXMLTokenMap
& rAttrTokenMap(GetScImport().GetFilterAttrTokenMap());
433 for( sal_Int16 i
=0; i
< nAttrCount
; ++i
)
435 const rtl::OUString
& sAttrName(xAttrList
->getNameByIndex( i
));
436 rtl::OUString aLocalName
;
437 USHORT
nPrefix(GetScImport().GetNamespaceMap().GetKeyByAttrName(
438 sAttrName
, &aLocalName
));
439 const rtl::OUString
& sValue(xAttrList
->getValueByIndex( i
));
441 switch( rAttrTokenMap
.Get( nPrefix
, aLocalName
) )
443 case XML_TOK_FILTER_ATTR_TARGET_RANGE_ADDRESS
:
446 sal_Int32
nOffset(0);
447 if (ScRangeStringConverter::GetRangeFromString( aScRange
, sValue
, pDoc
, ::formula::FormulaGrammar::CONV_OOO
, nOffset
))
449 aOutputPosition
= aScRange
.aStart
;
450 bCopyOutputData
= sal_True
;
454 case XML_TOK_FILTER_ATTR_CONDITION_SOURCE_RANGE_ADDRESS
:
456 sal_Int32
nOffset(0);
457 if(ScRangeStringConverter::GetRangeFromString( aConditionSourceRangeAddress
, sValue
, pDoc
, ::formula::FormulaGrammar::CONV_OOO
, nOffset
))
458 bConditionSourceRange
= sal_True
;
461 case XML_TOK_FILTER_ATTR_CONDITION_SOURCE
:
463 // not supported by StarOffice
466 case XML_TOK_FILTER_ATTR_DISPLAY_DUPLICATES
:
468 bSkipDuplicates
= !IsXMLToken(sValue
, XML_TRUE
);
475 ScXMLDPFilterContext::~ScXMLDPFilterContext()
479 SvXMLImportContext
*ScXMLDPFilterContext::CreateChildContext( USHORT nPrefix
,
480 const ::rtl::OUString
& rLName
,
481 const ::com::sun::star::uno::Reference
<
482 ::com::sun::star::xml::sax::XAttributeList
>& xAttrList
)
484 SvXMLImportContext
*pContext(0);
486 const SvXMLTokenMap
& rTokenMap(GetScImport().GetFilterElemTokenMap());
487 switch( rTokenMap
.Get( nPrefix
, rLName
) )
489 case XML_TOK_FILTER_AND
:
491 pContext
= new ScXMLDPAndContext( GetScImport(), nPrefix
,
492 rLName
, xAttrList
, this);
495 case XML_TOK_FILTER_OR
:
497 pContext
= new ScXMLDPOrContext( GetScImport(), nPrefix
,
498 rLName
, xAttrList
, this);
501 case XML_TOK_FILTER_CONDITION
:
503 pContext
= new ScXMLDPConditionContext( GetScImport(), nPrefix
,
504 rLName
, xAttrList
, this);
510 pContext
= new SvXMLImportContext( GetImport(), nPrefix
, rLName
);
515 void ScXMLDPFilterContext::EndElement()
517 aFilterFields
.bRegExp
= bUseRegularExpressions
;
518 aFilterFields
.bCaseSens
= bIsCaseSensitive
;
519 aFilterFields
.bDuplicate
= !bSkipDuplicates
;
520 // pDataPilotTable->SetFilterUseRegularExpressions(bUseRegularExpressions);
523 pDataPilotTable
->SetFilterOutputPosition(aOutputPosition
);
524 pDataPilotTable
->SetFilterCopyOutputData(bCopyOutputData
);
527 pDataPilotTable
->SetFilterCopyOutputData(sal_False
);
528 // pDataPilotTable->SetFilterIsCaseSensitive(bIsCaseSensitive);
529 // pDataPilotTable->SetFilterSkipDuplicates(bSkipDuplicates);
530 pDataPilotTable
->SetSourceQueryParam(aFilterFields
);
531 if (bConditionSourceRange
)
532 pDataPilotTable
->SetFilterSourceRange(aConditionSourceRangeAddress
);
535 void ScXMLDPFilterContext::AddFilterField (const ScQueryEntry
& aFilterField
)
537 aFilterFields
.Resize(nFilterFieldCount
+ 1);
538 ScQueryEntry
& rEntry(aFilterFields
.GetEntry(nFilterFieldCount
));
539 rEntry
= aFilterField
;
540 rEntry
.bDoQuery
= sal_True
;
544 ScXMLDPAndContext::ScXMLDPAndContext( ScXMLImport
& rImport
,
546 const ::rtl::OUString
& rLName
,
547 const ::com::sun::star::uno::Reference
<
548 ::com::sun::star::xml::sax::XAttributeList
>& /* xAttrList */,
549 ScXMLDPFilterContext
* pTempFilterContext
) :
550 SvXMLImportContext( rImport
, nPrfx
, rLName
)
552 pFilterContext
= pTempFilterContext
;
553 pFilterContext
->OpenConnection(sal_False
);
556 ScXMLDPAndContext::~ScXMLDPAndContext()
560 SvXMLImportContext
*ScXMLDPAndContext::CreateChildContext( USHORT nPrefix
,
561 const ::rtl::OUString
& rLName
,
562 const ::com::sun::star::uno::Reference
<
563 ::com::sun::star::xml::sax::XAttributeList
>& xAttrList
)
565 SvXMLImportContext
*pContext(0);
567 const SvXMLTokenMap
& rTokenMap(GetScImport().GetFilterElemTokenMap());
568 switch( rTokenMap
.Get( nPrefix
, rLName
) )
570 case XML_TOK_FILTER_OR
:
572 // not supported in StarOffice
575 case XML_TOK_FILTER_CONDITION
:
577 pContext
= new ScXMLDPConditionContext( GetScImport(), nPrefix
,
578 rLName
, xAttrList
, pFilterContext
);
584 pContext
= new SvXMLImportContext( GetImport(), nPrefix
, rLName
);
589 void ScXMLDPAndContext::EndElement()
591 pFilterContext
->CloseConnection();
594 ScXMLDPOrContext::ScXMLDPOrContext( ScXMLImport
& rImport
,
596 const ::rtl::OUString
& rLName
,
597 const ::com::sun::star::uno::Reference
<
598 ::com::sun::star::xml::sax::XAttributeList
>& /* xAttrList */,
599 ScXMLDPFilterContext
* pTempFilterContext
) :
600 SvXMLImportContext( rImport
, nPrfx
, rLName
),
601 pFilterContext(pTempFilterContext
)
603 pFilterContext
->OpenConnection(sal_True
);
606 ScXMLDPOrContext::~ScXMLDPOrContext()
610 SvXMLImportContext
*ScXMLDPOrContext::CreateChildContext( USHORT nPrefix
,
611 const ::rtl::OUString
& rLName
,
612 const ::com::sun::star::uno::Reference
<
613 ::com::sun::star::xml::sax::XAttributeList
>& xAttrList
)
615 SvXMLImportContext
*pContext(0);
617 const SvXMLTokenMap
& rTokenMap(GetScImport().GetFilterElemTokenMap());
618 switch( rTokenMap
.Get( nPrefix
, rLName
) )
620 case XML_TOK_FILTER_AND
:
622 pContext
= new ScXMLDPAndContext( GetScImport(), nPrefix
,
623 rLName
, xAttrList
, pFilterContext
);
626 case XML_TOK_FILTER_CONDITION
:
628 pContext
= new ScXMLDPConditionContext( GetScImport(), nPrefix
,
629 rLName
, xAttrList
, pFilterContext
);
635 pContext
= new SvXMLImportContext( GetImport(), nPrefix
, rLName
);
640 void ScXMLDPOrContext::EndElement()
642 pFilterContext
->CloseConnection();
645 ScXMLDPConditionContext::ScXMLDPConditionContext( ScXMLImport
& rImport
,
647 const ::rtl::OUString
& rLName
,
648 const ::com::sun::star::uno::Reference
<
649 ::com::sun::star::xml::sax::XAttributeList
>& xAttrList
,
650 ScXMLDPFilterContext
* pTempFilterContext
) :
651 SvXMLImportContext( rImport
, nPrfx
, rLName
),
652 pFilterContext(pTempFilterContext
),
653 sDataType(GetXMLToken(XML_TEXT
)),
654 bIsCaseSensitive(sal_False
)
657 sal_Int16
nAttrCount(xAttrList
.is() ? xAttrList
->getLength() : 0);
658 const SvXMLTokenMap
& rAttrTokenMap(GetScImport().GetFilterConditionAttrTokenMap());
659 for( sal_Int16 i
=0; i
< nAttrCount
; ++i
)
661 const rtl::OUString
& sAttrName(xAttrList
->getNameByIndex( i
));
662 rtl::OUString aLocalName
;
663 USHORT
nPrefix(GetScImport().GetNamespaceMap().GetKeyByAttrName(
664 sAttrName
, &aLocalName
));
665 const rtl::OUString
& sValue(xAttrList
->getValueByIndex( i
));
667 switch( rAttrTokenMap
.Get( nPrefix
, aLocalName
) )
669 case XML_TOK_CONDITION_ATTR_FIELD_NUMBER
:
671 nField
= sValue
.toInt32();
674 case XML_TOK_CONDITION_ATTR_CASE_SENSITIVE
:
676 bIsCaseSensitive
= IsXMLToken(sValue
, XML_TRUE
);
679 case XML_TOK_CONDITION_ATTR_DATA_TYPE
:
684 case XML_TOK_CONDITION_ATTR_VALUE
:
686 sConditionValue
= sValue
;
689 case XML_TOK_CONDITION_ATTR_OPERATOR
:
698 ScXMLDPConditionContext::~ScXMLDPConditionContext()
702 SvXMLImportContext
*ScXMLDPConditionContext::CreateChildContext( USHORT nPrefix
,
703 const ::rtl::OUString
& rLName
,
704 const ::com::sun::star::uno::Reference
<
705 ::com::sun::star::xml::sax::XAttributeList
>& /* xAttrList */ )
707 return new SvXMLImportContext( GetImport(), nPrefix
, rLName
);
710 void ScXMLDPConditionContext::getOperatorXML(const rtl::OUString sTempOperator
, ScQueryOp
& aFilterOperator
, sal_Bool
& bUseRegularExpressions
,
713 bUseRegularExpressions
= sal_False
;
714 if (IsXMLToken(sTempOperator
, XML_MATCH
))
716 bUseRegularExpressions
= sal_True
;
717 aFilterOperator
= SC_EQUAL
;
719 else if (IsXMLToken(sTempOperator
, XML_NOMATCH
))
721 bUseRegularExpressions
= sal_True
;
722 aFilterOperator
= SC_NOT_EQUAL
;
724 else if (sTempOperator
.compareToAscii("=") == 0)
725 aFilterOperator
= SC_EQUAL
;
726 else if (sTempOperator
.compareToAscii("!=") == 0)
727 aFilterOperator
= SC_NOT_EQUAL
;
728 else if (IsXMLToken(sTempOperator
, XML_BOTTOM_PERCENT
))
729 aFilterOperator
= SC_BOTPERC
;
730 else if (IsXMLToken(sTempOperator
, XML_BOTTOM_VALUES
))
731 aFilterOperator
= SC_BOTVAL
;
732 else if (IsXMLToken(sTempOperator
, XML_EMPTY
))
733 dVal
= SC_EMPTYFIELDS
;
734 else if (sTempOperator
.compareToAscii(">") == 0)
735 aFilterOperator
= SC_GREATER
;
736 else if (sTempOperator
.compareToAscii(">=") == 0)
737 aFilterOperator
= SC_GREATER_EQUAL
;
738 else if (sTempOperator
.compareToAscii("<") == 0)
739 aFilterOperator
= SC_LESS
;
740 else if (sTempOperator
.compareToAscii("<=") == 0)
741 aFilterOperator
= SC_LESS_EQUAL
;
742 else if (IsXMLToken(sTempOperator
, XML_NOEMPTY
))
743 dVal
= SC_NONEMPTYFIELDS
;
744 else if (IsXMLToken(sTempOperator
, XML_TOP_PERCENT
))
745 aFilterOperator
= SC_TOPPERC
;
746 else if (IsXMLToken(sTempOperator
, XML_TOP_VALUES
))
747 aFilterOperator
= SC_TOPVAL
;
748 else if (IsXMLToken(sTempOperator
, XML_BEGINS
))
749 aFilterOperator
= SC_BEGINS_WITH
;
750 else if (IsXMLToken(sTempOperator
, XML_ENDS
))
751 aFilterOperator
= SC_ENDS_WITH
;
752 else if (IsXMLToken(sTempOperator
, XML_CONTAINS
))
753 aFilterOperator
= SC_CONTAINS
;
754 else if (IsXMLToken(sTempOperator
, XML_NOT_CONTAINS
))
755 aFilterOperator
= SC_DOES_NOT_CONTAIN
;
758 void ScXMLDPConditionContext::EndElement()
760 ScQueryEntry aFilterField
;
761 if (pFilterContext
->GetConnection())
762 aFilterField
.eConnect
= SC_OR
;
764 aFilterField
.eConnect
= SC_AND
;
765 pFilterContext
->SetIsCaseSensitive(bIsCaseSensitive
);
766 sal_Bool bUseRegularExpressions
;
768 getOperatorXML(sOperator
, aFilterField
.eOp
, bUseRegularExpressions
, dVal
);
769 pFilterContext
->SetUseRegularExpressions(bUseRegularExpressions
);
770 aFilterField
.nField
= nField
;
771 if (IsXMLToken(sDataType
, XML_NUMBER
))
773 aFilterField
.nVal
= sConditionValue
.toDouble();
774 *aFilterField
.pStr
= sConditionValue
;
775 aFilterField
.bQueryByString
= sal_False
;
778 aFilterField
.nVal
= dVal
;
779 *aFilterField
.pStr
= EMPTY_STRING
;
784 aFilterField
.pStr
= new String(sConditionValue
);
785 aFilterField
.bQueryByString
= sal_True
;
786 aFilterField
.nVal
= 0;
788 pFilterContext
->AddFilterField(aFilterField
);