summaryrefslogtreecommitdiff
path: root/xmloff/source/script/XMLEventImportHelper.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'xmloff/source/script/XMLEventImportHelper.cxx')
-rw-r--r--xmloff/source/script/XMLEventImportHelper.cxx179
1 files changed, 179 insertions, 0 deletions
diff --git a/xmloff/source/script/XMLEventImportHelper.cxx b/xmloff/source/script/XMLEventImportHelper.cxx
new file mode 100644
index 000000000000..cdd2906760a0
--- /dev/null
+++ b/xmloff/source/script/XMLEventImportHelper.cxx
@@ -0,0 +1,179 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_xmloff.hxx"
+
+#ifndef _XMLOFF_XMLEVENTIMPORTHELPER_HXX
+#include "XMLEventImportHelper.hxx"
+#endif
+#include <tools/debug.hxx>
+#include <xmloff/xmlimp.hxx>
+#include <xmloff/nmspmap.hxx>
+#include "xmlnmspe.hxx"
+#include "xmlerror.hxx"
+
+using ::rtl::OUString;
+using ::com::sun::star::xml::sax::XAttributeList;
+using ::com::sun::star::uno::Reference;
+using ::com::sun::star::uno::Sequence;
+
+XMLEventImportHelper::XMLEventImportHelper() :
+ aFactoryMap(),
+ pEventNameMap(new NameMap()),
+ aEventNameMapList()
+{
+}
+
+
+XMLEventImportHelper::~XMLEventImportHelper()
+{
+ // delete factories
+ FactoryMap::iterator aEnd = aFactoryMap.end();
+ for(FactoryMap::iterator aIter = aFactoryMap.begin();
+ aIter != aEnd;
+ aIter++ )
+ {
+ delete aIter->second;
+ }
+ aFactoryMap.clear();
+
+ // delete name map
+ delete pEventNameMap;
+}
+
+void XMLEventImportHelper::RegisterFactory(
+ const OUString& rLanguage,
+ XMLEventContextFactory* pFactory )
+{
+ DBG_ASSERT(pFactory != NULL, "I need a factory.");
+ if (NULL != pFactory)
+ {
+ aFactoryMap[rLanguage] = pFactory;
+ }
+}
+
+void XMLEventImportHelper::AddTranslationTable(
+ const XMLEventNameTranslation* pTransTable )
+{
+ if (NULL != pTransTable)
+ {
+ // put translation table into map
+ for(const XMLEventNameTranslation* pTrans = pTransTable;
+ pTrans->sAPIName != NULL;
+ pTrans++)
+ {
+ XMLEventName aName( pTrans->nPrefix, pTrans->sXMLName );
+
+ // check for conflicting entries
+ DBG_ASSERT(pEventNameMap->find(aName) == pEventNameMap->end(),
+ "conflicting event translations");
+
+ // assign new translation
+ (*pEventNameMap)[aName] =
+ OUString::createFromAscii(pTrans->sAPIName);
+ }
+ }
+ // else? ignore!
+}
+
+void XMLEventImportHelper::PushTranslationTable()
+{
+ // save old map and install new one
+ aEventNameMapList.push_back(pEventNameMap);
+ pEventNameMap = new NameMap();
+}
+
+void XMLEventImportHelper::PopTranslationTable()
+{
+ DBG_ASSERT(aEventNameMapList.size() > 0,
+ "no translation tables left to pop");
+ if ( !aEventNameMapList.empty() )
+ {
+ // delete current and install old map
+ delete pEventNameMap;
+ pEventNameMap = aEventNameMapList.back();
+ aEventNameMapList.pop_back();
+ }
+}
+
+
+SvXMLImportContext* XMLEventImportHelper::CreateContext(
+ SvXMLImport& rImport,
+ sal_uInt16 nPrefix,
+ const OUString& rLocalName,
+ const Reference<XAttributeList> & xAttrList,
+ XMLEventsImportContext* rEvents,
+ const OUString& rXmlEventName,
+ const OUString& rLanguage)
+{
+ SvXMLImportContext* pContext = NULL;
+
+ // translate event name form xml to api
+ OUString sMacroName;
+ sal_uInt16 nMacroPrefix =
+ rImport.GetNamespaceMap().GetKeyByAttrName( rXmlEventName,
+ &sMacroName );
+ XMLEventName aEventName( nMacroPrefix, sMacroName );
+ NameMap::iterator aNameIter = pEventNameMap->find(aEventName);
+ if (aNameIter != pEventNameMap->end())
+ {
+ OUString aScriptLanguage;
+ sal_uInt16 nScriptPrefix = rImport.GetNamespaceMap().
+ GetKeyByAttrName( rLanguage, &aScriptLanguage );
+ if( XML_NAMESPACE_OOO != nScriptPrefix )
+ aScriptLanguage = rLanguage ;
+
+ // check for factory
+ FactoryMap::iterator aFactoryIterator =
+ aFactoryMap.find(aScriptLanguage);
+ if (aFactoryIterator != aFactoryMap.end())
+ {
+ // delegate to factory
+ pContext = aFactoryIterator->second->CreateContext(
+ rImport, nPrefix, rLocalName, xAttrList,
+ rEvents, aNameIter->second, aScriptLanguage);
+ }
+ }
+
+ // default context (if no context was created above)
+ if( NULL == pContext )
+ {
+ pContext = new SvXMLImportContext(rImport, nPrefix, rLocalName);
+
+ Sequence<OUString> aMsgParams(2);
+
+ aMsgParams[0] = rXmlEventName;
+ aMsgParams[1] = rLanguage;
+
+ rImport.SetError(XMLERROR_FLAG_ERROR | XMLERROR_ILLEGAL_EVENT,
+ aMsgParams);
+
+ }
+
+ return pContext;
+}