blob: 22a06b7a71623c1d48f983d0aea8fd7638c7d175 [file] [log] [blame]
/**************************************************************
*
* 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 ---------------------------------------------------------------
#include "XMLTableSourceContext.hxx"
#include "xmlimprt.hxx"
#include "document.hxx"
#include "xmlsubti.hxx"
#include "tablink.hxx"
#include <xmloff/xmltoken.hxx>
#include <xmloff/xmlnmspe.hxx>
#include <xmloff/nmspmap.hxx>
#include <xmloff/xmluconv.hxx>
#include <com/sun/star/sheet/XSheetLinkable.hpp>
using namespace com::sun::star;
using namespace xmloff::token;
//------------------------------------------------------------------
ScXMLTableSourceContext::ScXMLTableSourceContext( ScXMLImport& rImport,
sal_uInt16 nPrfx,
const ::rtl::OUString& rLName,
const ::com::sun::star::uno::Reference<
::com::sun::star::xml::sax::XAttributeList>& xAttrList) :
SvXMLImportContext( rImport, nPrfx, rLName ),
sLink(),
sTableName(),
sFilterName(),
sFilterOptions(),
nRefresh(0),
nMode(sheet::SheetLinkMode_NORMAL)
{
sal_Int16 nAttrCount(xAttrList.is() ? xAttrList->getLength() : 0);
for( sal_Int16 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 ));
if(nPrefix == XML_NAMESPACE_XLINK)
{
if (IsXMLToken(aLocalName, XML_HREF))
sLink = GetScImport().GetAbsoluteReference(sValue);
}
else if (nPrefix == XML_NAMESPACE_TABLE)
{
if (IsXMLToken(aLocalName, XML_TABLE_NAME))
sTableName = sValue;
else if (IsXMLToken(aLocalName, XML_FILTER_NAME))
sFilterName = sValue;
else if (IsXMLToken(aLocalName, XML_FILTER_OPTIONS))
sFilterOptions = sValue;
else if (IsXMLToken(aLocalName, XML_MODE))
{
if (IsXMLToken(sValue, XML_COPY_RESULTS_ONLY))
nMode = sheet::SheetLinkMode_VALUE;
}
else if (IsXMLToken(aLocalName, XML_REFRESH_DELAY))
{
double fTime;
if( SvXMLUnitConverter::convertTime( fTime, sValue ) )
nRefresh = Max( (sal_Int32)(fTime * 86400.0), (sal_Int32)0 );
}
}
}
}
ScXMLTableSourceContext::~ScXMLTableSourceContext()
{
}
SvXMLImportContext *ScXMLTableSourceContext::CreateChildContext( sal_uInt16 nPrefix,
const ::rtl::OUString& rLName,
const ::com::sun::star::uno::Reference<
::com::sun::star::xml::sax::XAttributeList>& /* xAttrList */ )
{
return new SvXMLImportContext( GetImport(), nPrefix, rLName );
}
void ScXMLTableSourceContext::EndElement()
{
if (sLink.getLength())
{
uno::Reference <sheet::XSheetLinkable> xLinkable (GetScImport().GetTables().GetCurrentXSheet(), uno::UNO_QUERY);
ScDocument* pDoc(GetScImport().GetDocument());
if (xLinkable.is() && pDoc)
{
GetScImport().LockSolarMutex();
if (pDoc->RenameTab( static_cast<SCTAB>(GetScImport().GetTables().GetCurrentSheet()),
GetScImport().GetTables().GetCurrentSheetName(), sal_False, sal_True))
{
String aFileString(sLink);
String aFilterString(sFilterName);
String aOptString(sFilterOptions);
String aSheetString(sTableName);
aFileString = ScGlobal::GetAbsDocName( aFileString, pDoc->GetDocumentShell() );
if ( !aFilterString.Len() )
ScDocumentLoader::GetFilterName( aFileString, aFilterString, aOptString, sal_False, sal_False );
sal_uInt8 nLinkMode = SC_LINK_NONE;
if ( nMode == sheet::SheetLinkMode_NORMAL )
nLinkMode = SC_LINK_NORMAL;
else if ( nMode == sheet::SheetLinkMode_VALUE )
nLinkMode = SC_LINK_VALUE;
pDoc->SetLink( static_cast<SCTAB>(GetScImport().GetTables().GetCurrentSheet()),
nLinkMode, aFileString, aFilterString, aOptString,
aSheetString, nRefresh );
}
GetScImport().UnlockSolarMutex();
}
}
}