/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_sc.hxx" //___________________________________________________________________ #include "XMLDetectiveContext.hxx" #include #include #include #include "convuno.hxx" #include "xmlimprt.hxx" #include "XMLConverter.hxx" #include "rangeutl.hxx" #include using ::rtl::OUString; using namespace ::com::sun::star; using namespace xmloff::token; //___________________________________________________________________ ScMyImpDetectiveObj::ScMyImpDetectiveObj() : aSourceRange(), eObjType( SC_DETOBJ_NONE ), bHasError( sal_False ) { } //___________________________________________________________________ sal_Bool ScMyImpDetectiveOp::operator<(const ScMyImpDetectiveOp& rDetOp) const { return (nIndex < rDetOp.nIndex); } void ScMyImpDetectiveOpArray::Sort() { aDetectiveOpList.sort(); } sal_Bool ScMyImpDetectiveOpArray::GetFirstOp( ScMyImpDetectiveOp& rDetOp ) { if( aDetectiveOpList.empty() ) return sal_False; ScMyImpDetectiveOpList::iterator aItr = aDetectiveOpList.begin(); rDetOp = *aItr; aDetectiveOpList.erase( aItr ); return sal_True; } //___________________________________________________________________ ScXMLDetectiveContext::ScXMLDetectiveContext( ScXMLImport& rImport, sal_uInt16 nPrfx, const OUString& rLName, ScMyImpDetectiveObjVec* pNewDetectiveObjVec ) : SvXMLImportContext( rImport, nPrfx, rLName ), pDetectiveObjVec( pNewDetectiveObjVec ) { } ScXMLDetectiveContext::~ScXMLDetectiveContext() { } SvXMLImportContext *ScXMLDetectiveContext::CreateChildContext( sal_uInt16 nPrefix, const OUString& rLName, const uno::Reference< xml::sax::XAttributeList>& xAttrList ) { SvXMLImportContext* pContext = NULL; const SvXMLTokenMap& rTokenMap = GetScImport().GetDetectiveElemTokenMap(); switch( rTokenMap.Get( nPrefix, rLName ) ) { case XML_TOK_DETECTIVE_ELEM_HIGHLIGHTED: pContext = new ScXMLDetectiveHighlightedContext( GetScImport(), nPrefix, rLName, xAttrList, pDetectiveObjVec ); break; case XML_TOK_DETECTIVE_ELEM_OPERATION: pContext = new ScXMLDetectiveOperationContext( GetScImport(), nPrefix, rLName, xAttrList ); break; } if( !pContext ) pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName ); return pContext; } void ScXMLDetectiveContext::EndElement() { } //___________________________________________________________________ ScXMLDetectiveHighlightedContext::ScXMLDetectiveHighlightedContext( ScXMLImport& rImport, sal_uInt16 nPrfx, const OUString& rLName, const uno::Reference< xml::sax::XAttributeList >& xAttrList, ScMyImpDetectiveObjVec* pNewDetectiveObjVec ): SvXMLImportContext( rImport, nPrfx, rLName ), pDetectiveObjVec( pNewDetectiveObjVec ), aDetectiveObj(), bValid( sal_False ) { if( !xAttrList.is() ) return; sal_Int16 nAttrCount = xAttrList->getLength(); const SvXMLTokenMap& rAttrTokenMap = GetScImport().GetDetectiveHighlightedAttrTokenMap(); for( sal_Int16 nIndex = 0; nIndex < nAttrCount; ++nIndex ) { const rtl::OUString& sAttrName (xAttrList->getNameByIndex( nIndex )); const rtl::OUString& sValue (xAttrList->getValueByIndex( nIndex )); OUString aLocalName; sal_uInt16 nPrefix = GetScImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName ); switch( rAttrTokenMap.Get( nPrefix, aLocalName ) ) { case XML_TOK_DETECTIVE_HIGHLIGHTED_ATTR_CELL_RANGE: { sal_Int32 nOffset(0); GetScImport().LockSolarMutex(); bValid = ScRangeStringConverter::GetRangeFromString( aDetectiveObj.aSourceRange, sValue, GetScImport().GetDocument(), ::formula::FormulaGrammar::CONV_OOO, nOffset ); GetScImport().UnlockSolarMutex(); } break; case XML_TOK_DETECTIVE_HIGHLIGHTED_ATTR_DIRECTION: aDetectiveObj.eObjType = ScXMLConverter::GetDetObjTypeFromString( sValue ); break; case XML_TOK_DETECTIVE_HIGHLIGHTED_ATTR_CONTAINS_ERROR: aDetectiveObj.bHasError = IsXMLToken(sValue, XML_TRUE); break; case XML_TOK_DETECTIVE_HIGHLIGHTED_ATTR_MARKED_INVALID: { if (IsXMLToken(sValue, XML_TRUE)) aDetectiveObj.eObjType = SC_DETOBJ_CIRCLE; } break; } } } ScXMLDetectiveHighlightedContext::~ScXMLDetectiveHighlightedContext() { } SvXMLImportContext *ScXMLDetectiveHighlightedContext::CreateChildContext( sal_uInt16 nPrefix, const OUString& rLName, const uno::Reference< xml::sax::XAttributeList>& /* xAttrList */ ) { return new SvXMLImportContext( GetImport(), nPrefix, rLName ); } void ScXMLDetectiveHighlightedContext::EndElement() { switch( aDetectiveObj.eObjType ) { case SC_DETOBJ_ARROW: case SC_DETOBJ_TOOTHERTAB: break; case SC_DETOBJ_FROMOTHERTAB: case SC_DETOBJ_CIRCLE: bValid = sal_True; break; default: bValid = sal_False; } if( bValid ) pDetectiveObjVec->push_back( aDetectiveObj ); } //___________________________________________________________________ ScXMLDetectiveOperationContext::ScXMLDetectiveOperationContext( ScXMLImport& rImport, sal_uInt16 nPrfx, const OUString& rLName, const uno::Reference< xml::sax::XAttributeList >& xAttrList ) : SvXMLImportContext( rImport, nPrfx, rLName ), aDetectiveOp(), bHasType( sal_False ) { if( !xAttrList.is() ) return; sal_Int16 nAttrCount = xAttrList->getLength(); const SvXMLTokenMap& rAttrTokenMap = GetScImport().GetDetectiveOperationAttrTokenMap(); for( sal_Int16 nIndex = 0; nIndex < nAttrCount; ++nIndex ) { const rtl::OUString& sAttrName (xAttrList->getNameByIndex( nIndex )); const rtl::OUString& sValue (xAttrList->getValueByIndex( nIndex )); OUString aLocalName; sal_uInt16 nPrefix = GetScImport().GetNamespaceMap().GetKeyByAttrName( sAttrName, &aLocalName ); switch( rAttrTokenMap.Get( nPrefix, aLocalName ) ) { case XML_TOK_DETECTIVE_OPERATION_ATTR_NAME: bHasType = ScXMLConverter::GetDetOpTypeFromString( aDetectiveOp.eOpType, sValue ); break; case XML_TOK_DETECTIVE_OPERATION_ATTR_INDEX: { sal_Int32 nValue; if( SvXMLUnitConverter::convertNumber( nValue, sValue, 0 ) ) aDetectiveOp.nIndex = nValue; } break; } } ScUnoConversion::FillScAddress( aDetectiveOp.aPosition, rImport.GetTables().GetRealCellPos() ); } ScXMLDetectiveOperationContext::~ScXMLDetectiveOperationContext() { } SvXMLImportContext *ScXMLDetectiveOperationContext::CreateChildContext( sal_uInt16 nPrefix, const OUString& rLName, const uno::Reference< xml::sax::XAttributeList>& /* xAttrList */ ) { return new SvXMLImportContext( GetImport(), nPrefix, rLName ); } void ScXMLDetectiveOperationContext::EndElement() { if( bHasType && (aDetectiveOp.nIndex >= 0) ) GetScImport().GetDetectiveOpArray()->AddDetectiveOp( aDetectiveOp ); }