summaryrefslogtreecommitdiff
path: root/xmloff
diff options
context:
space:
mode:
authorJens-Heiner Rechtien <hr@openoffice.org>2004-11-09 11:21:53 +0000
committerJens-Heiner Rechtien <hr@openoffice.org>2004-11-09 11:21:53 +0000
commita18d144f768bf6007af9c5b7a107352c6ba153bb (patch)
tree560f1008062df24658f7180f24045a8116856482 /xmloff
parentfe69cae18a40e863653facc975669319ea712d7f (diff)
INTEGRATION: CWS oasisbf1 (1.2.38); FILE MERGED
2004/09/16 10:35:54 toconnor 1.2.38.3: #i33735# - add conditional compilation of UNO URL parsing code 2004/09/14 17:07:35 toconnor 1.2.38.2: #i33735# export of bindings to Scripting Framework macros and dlg:border attributes from Oasis to OOo 2004/08/18 12:53:13 mib 1.2.38.1: #i32840#: some form events had different names
Diffstat (limited to 'xmloff')
-rw-r--r--xmloff/source/transform/EventOASISTContext.cxx212
1 files changed, 205 insertions, 7 deletions
diff --git a/xmloff/source/transform/EventOASISTContext.cxx b/xmloff/source/transform/EventOASISTContext.cxx
index 60148cbd26e4..5b4f0d24ccfe 100644
--- a/xmloff/source/transform/EventOASISTContext.cxx
+++ b/xmloff/source/transform/EventOASISTContext.cxx
@@ -2,9 +2,9 @@
*
* $RCSfile: EventOASISTContext.cxx,v $
*
- * $Revision: 1.2 $
+ * $Revision: 1.3 $
*
- * last change: $Author: rt $ $Date: 2004-07-13 08:48:41 $
+ * last change: $Author: hr $ $Date: 2004-11-09 12:21:53 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@@ -84,6 +84,17 @@
#include "TransformerBase.hxx"
#endif
+#ifndef OASIS_FILTER_OOO_1X
+// Used to parse Scripting Framework URLs
+#ifndef _COM_SUN_STAR_URI_XURIREFERENCEFACTORY_HPP_
+#include <com/sun/star/uri/XUriReferenceFactory.hpp>
+#endif
+#ifndef _COM_SUN_STAR_URI_XVNDSUNSTARSCRIPTURL_HPP_
+#include <com/sun/star/uri/XVndSunStarScriptUrl.hpp>
+#endif
+#include <comphelper/processfactory.hxx>
+#endif
+
#include <hash_map>
using namespace ::rtl;
@@ -149,6 +160,12 @@ XMLTransformerOASISEventMap_Impl
return new XMLTransformerOASISEventMap_Impl( aTransformerEventMap );
}
+XMLTransformerOASISEventMap_Impl
+ *XMLEventOASISTransformerContext::CreateFormEventMap()
+{
+ return new XMLTransformerOASISEventMap_Impl( aFormTransformerEventMap );
+}
+
void XMLEventOASISTransformerContext::FlushEventMap(
XMLTransformerOASISEventMap_Impl *p )
{
@@ -158,9 +175,18 @@ void XMLEventOASISTransformerContext::FlushEventMap(
OUString XMLEventOASISTransformerContext::GetEventName(
sal_uInt16 nPrefix,
const OUString& rName,
- XMLTransformerOASISEventMap_Impl& rMap )
+ XMLTransformerOASISEventMap_Impl& rMap,
+ XMLTransformerOASISEventMap_Impl *pMap2)
{
XMLTransformerOASISEventMap_Impl::key_type aKey( nPrefix, rName );
+ if( pMap2 )
+ {
+ XMLTransformerOASISEventMap_Impl::const_iterator aIter =
+ pMap2->find( aKey );
+ if( !(aIter == pMap2->end()) )
+ return (*aIter).second;
+ }
+
XMLTransformerOASISEventMap_Impl::const_iterator aIter = rMap.find( aKey );
if( aIter == rMap.end() )
return rName;
@@ -168,6 +194,109 @@ OUString XMLEventOASISTransformerContext::GetEventName(
return (*aIter).second;
}
+bool ParseURLAsString(
+ const OUString& rAttrValue,
+ OUString* pName, OUString* pLocation )
+{
+ OUString SCHEME( RTL_CONSTASCII_USTRINGPARAM( "vnd.sun.star.script:" ) );
+
+ sal_Int32 params = rAttrValue.indexOf( '?' );
+ if ( rAttrValue.indexOf( SCHEME ) != 0 || params < 0 )
+ {
+ return FALSE;
+ }
+
+ sal_Int32 start = SCHEME.getLength();
+ *pName = rAttrValue.copy( start, params - start );
+
+ OUString aToken;
+ OUString aLanguage;
+ params++;
+ do
+ {
+ aToken = rAttrValue.getToken( 0, '&', params );
+ sal_Int32 dummy = 0;
+
+ if ( aToken.match( GetXMLToken( XML_LANGUAGE ) ) )
+ {
+ aLanguage = aToken.getToken( 1, '=', dummy );
+ }
+ else if ( aToken.match( GetXMLToken( XML_LOCATION ) ) )
+ {
+ OUString tmp = aToken.getToken( 1, '=', dummy );
+ if ( tmp.equalsIgnoreAsciiCase( GetXMLToken( XML_DOCUMENT ) ) )
+ {
+ *pLocation = GetXMLToken( XML_DOCUMENT );
+ }
+ else
+ {
+ *pLocation = GetXMLToken( XML_APPLICATION );
+ }
+ }
+ } while ( params >= 0 );
+
+ if ( aLanguage.equalsIgnoreAsciiCaseAscii( "basic" ) )
+ {
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool ParseURL(
+ const OUString& rAttrValue,
+ OUString* pName, OUString* pLocation )
+{
+#ifdef OASIS_FILTER_OOO_1X
+ return ParseURLAsString( rAttrValue, pName, pLocation );
+#else
+ Reference< com::sun::star::lang::XMultiServiceFactory >
+ xSMgr = ::comphelper::getProcessServiceFactory();
+
+ Reference< com::sun::star::uri::XUriReferenceFactory >
+ xFactory( xSMgr->createInstance( OUString::createFromAscii(
+ "com.sun.star.uri.UriReferenceFactory" ) ), UNO_QUERY );
+
+ if ( xFactory.is() )
+ {
+ Reference< com::sun::star::uri::XVndSunStarScriptUrl > xUrl (
+ xFactory->parse( rAttrValue ), UNO_QUERY );
+
+ if ( xUrl.is() )
+ {
+ OUString aLanguageKey = GetXMLToken( XML_LANGUAGE );
+ if ( xUrl.is() && xUrl->hasParameter( aLanguageKey ) )
+ {
+ OUString aLanguage = xUrl->getParameter( aLanguageKey );
+
+ if ( aLanguage.equalsIgnoreAsciiCaseAscii( "basic" ) )
+ {
+ *pName = xUrl->getName();
+
+ OUString tmp =
+ xUrl->getParameter( GetXMLToken( XML_LOCATION ) );
+
+ OUString doc = GetXMLToken( XML_DOCUMENT );
+
+ if ( tmp.equalsIgnoreAsciiCase( doc ) )
+ {
+ *pLocation = doc;
+ }
+ else
+ {
+ *pLocation = GetXMLToken( XML_APPLICATION );
+ }
+ return TRUE;
+ }
+ }
+ }
+ return FALSE;
+ }
+ else
+ {
+ return ParseURLAsString( rAttrValue, pName, pLocation );
+ }
+#endif
+}
void XMLEventOASISTransformerContext::StartElement(
const Reference< XAttributeList >& rAttrList )
@@ -201,11 +330,55 @@ void XMLEventOASISTransformerContext::StartElement(
switch( (*aIter).second.m_nActionType )
{
case XML_ATACTION_HREF:
- // TODO
+ {
+ OUString aAttrValue( rAttrValue );
+ OUString aName, aLocation;
+
+ bool bNeedsTransform =
+ ParseURL( rAttrValue, &aName, &aLocation );
+
+ if ( bNeedsTransform )
+ {
+ pMutableAttrList->RemoveAttributeByIndex( i );
+
+ OUString aAttrQName(
+ GetTransformer().GetNamespaceMap().GetQNameByKey(
+ XML_NAMESPACE_SCRIPT,
+ ::xmloff::token::GetXMLToken( XML_MACRO_NAME ) ) );
+
+ pMutableAttrList->AddAttribute( aAttrQName, aName );
+
+ sal_Int16 idx = pMutableAttrList->GetIndexByName(
+ GetTransformer().GetNamespaceMap().GetQNameByKey(
+ XML_NAMESPACE_SCRIPT,
+ GetXMLToken( XML_LANGUAGE ) ) );
+
+ pMutableAttrList->SetValueByIndex( idx,
+ OUString::createFromAscii("StarBasic") );
+
+ OUString aLocQName(
+ GetTransformer().GetNamespaceMap().GetQNameByKey(
+ XML_NAMESPACE_SCRIPT,
+ GetXMLToken( XML_LOCATION ) ) );
+
+ pMutableAttrList->AddAttribute( aLocQName, aLocation );
+ }
+ }
break;
case XML_ATACTION_EVENT_NAME:
- pMutableAttrList->SetValueByIndex( i,
- GetTransformer().GetEventName( rAttrValue ) );
+ {
+ // Check if the event belongs to a form or control by
+ // cehcking the 2nd ancestor element, f.i.:
+ // <form:button><form:event-listeners><form:event-listener>
+ const XMLTransformerContext *pObjContext =
+ GetTransformer().GetAncestorContext( 1 );
+ sal_Bool bForm = pObjContext &&
+
+ pObjContext->HasNamespace(XML_NAMESPACE_FORM );
+ pMutableAttrList->SetValueByIndex( i,
+ GetTransformer().GetEventName( rAttrValue,
+ bForm ) );
+ }
break;
case XML_ATACTION_REMOVE_NAMESPACE_PREFIX:
{
@@ -219,6 +392,31 @@ void XMLEventOASISTransformerContext::StartElement(
break;
case XML_ATACTION_MACRO_NAME:
{
+ OUString aName, aLocation;
+ bool bNeedsTransform =
+ ParseURL( rAttrValue, &aName, &aLocation );
+
+ if ( bNeedsTransform )
+ {
+ pMutableAttrList->SetValueByIndex( i, aName );
+
+ sal_Int16 idx = pMutableAttrList->GetIndexByName(
+ GetTransformer().GetNamespaceMap().GetQNameByKey(
+ XML_NAMESPACE_SCRIPT,
+ GetXMLToken( XML_LANGUAGE ) ) );
+
+ pMutableAttrList->SetValueByIndex( idx,
+ OUString::createFromAscii("StarBasic") );
+
+ OUString aLocQName(
+ GetTransformer().GetNamespaceMap().GetQNameByKey(
+ XML_NAMESPACE_SCRIPT,
+ GetXMLToken( XML_LOCATION ) ) );
+
+ pMutableAttrList->AddAttribute( aLocQName, aLocation );
+ }
+ else
+ {
const OUString& rApp = GetXMLToken( XML_APPLICATION );
const OUString& rDoc = GetXMLToken( XML_DOCUMENT );
OUString aLocation;
@@ -254,7 +452,7 @@ void XMLEventOASISTransformerContext::StartElement(
::xmloff::token::GetXMLToken( XML_LIBRARY ) );
pMutableAttrList->AddAttribute( aAttrQName, aLocation );
}
-
+ }
}
break;
case XML_ATACTION_COPY: