1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_xmloff.hxx" 26 #include "eventimport.hxx" 27 #include <com/sun/star/script/XEventAttacherManager.hpp> 28 #include <com/sun/star/beans/PropertyValue.hpp> 29 #include <comphelper/extract.hxx> 30 #include "strings.hxx" 31 32 //......................................................................... 33 namespace xmloff 34 { 35 //......................................................................... 36 37 using namespace ::com::sun::star::uno; 38 using namespace ::com::sun::star::beans; 39 using namespace ::com::sun::star::script; 40 using namespace ::com::sun::star::container; 41 42 //===================================================================== 43 //= OFormEventsImportContext 44 //===================================================================== 45 //--------------------------------------------------------------------- OFormEventsImportContext(SvXMLImport & _rImport,sal_uInt16 _nPrefix,const::rtl::OUString & _rLocalName,IEventAttacher & _rEventAttacher)46 OFormEventsImportContext::OFormEventsImportContext(SvXMLImport& _rImport, sal_uInt16 _nPrefix, const ::rtl::OUString& _rLocalName, IEventAttacher& _rEventAttacher) 47 :XMLEventsImportContext(_rImport, _nPrefix, _rLocalName) 48 ,m_rEventAttacher(_rEventAttacher) 49 { 50 } 51 52 //--------------------------------------------------------------------- EndElement()53 void OFormEventsImportContext::EndElement() 54 { 55 Sequence< ScriptEventDescriptor > aTranslated(aCollectEvents.size()); 56 ScriptEventDescriptor* pTranslated = aTranslated.getArray(); 57 58 // loop through the collected events and translate them 59 const PropertyValue* pEventDescription; 60 const PropertyValue* pEventDescriptionEnd; 61 sal_Int32 nSeparatorPos = -1; 62 for ( EventsVector::const_iterator aEvent = aCollectEvents.begin(); 63 aEvent != aCollectEvents.end(); 64 ++aEvent, ++pTranslated 65 ) 66 { 67 // the name of the event is built from ListenerType::EventMethod 68 nSeparatorPos = aEvent->first.indexOf(EVENT_NAME_SEPARATOR); 69 OSL_ENSURE(-1 != nSeparatorPos, "OFormEventsImportContext::EndElement: invalid (unrecognized) event name!"); 70 pTranslated->ListenerType = aEvent->first.copy(0, nSeparatorPos); 71 pTranslated->EventMethod = aEvent->first.copy(nSeparatorPos + EVENT_NAME_SEPARATOR.length); 72 73 ::rtl::OUString sLibrary; 74 75 // the local macro name and the event type are specified as properties 76 pEventDescription = aEvent->second.getConstArray(); 77 pEventDescriptionEnd = pEventDescription + aEvent->second.getLength(); 78 for (;pEventDescription != pEventDescriptionEnd; ++pEventDescription) 79 { 80 if ((0 == pEventDescription->Name.compareToAscii(EVENT_LOCALMACRONAME)) || 81 (0 == pEventDescription->Name.compareToAscii(EVENT_SCRIPTURL))) 82 pEventDescription->Value >>= pTranslated->ScriptCode; 83 else if (0 == pEventDescription->Name.compareToAscii(EVENT_TYPE)) 84 pEventDescription->Value >>= pTranslated->ScriptType; 85 else if ( 0 == pEventDescription->Name.compareToAscii( EVENT_LIBRARY ) ) 86 pEventDescription->Value >>= sLibrary; 87 } 88 89 if ( 0 == pTranslated->ScriptType.compareToAscii( EVENT_STARBASIC ) ) 90 { 91 if ( 0 == sLibrary.compareToAscii( EVENT_STAROFFICE ) ) 92 sLibrary = EVENT_APPLICATION; 93 94 if ( sLibrary.getLength() ) 95 { 96 // for StarBasic, the library is prepended 97 sal_Unicode cLibSeparator = ':'; 98 sLibrary += ::rtl::OUString( &cLibSeparator, 1 ); 99 } 100 sLibrary += pTranslated->ScriptCode; 101 pTranslated->ScriptCode = sLibrary; 102 } 103 } 104 105 // register the events 106 m_rEventAttacher.registerEvents(aTranslated); 107 108 XMLEventsImportContext::EndElement(); 109 } 110 111 //===================================================================== 112 //= ODefaultEventAttacherManager 113 //===================================================================== 114 ~ODefaultEventAttacherManager()115 ODefaultEventAttacherManager::~ODefaultEventAttacherManager() 116 { 117 } 118 119 //------------------------------------------------------------------------- registerEvents(const Reference<XPropertySet> & _rxElement,const Sequence<ScriptEventDescriptor> & _rEvents)120 void ODefaultEventAttacherManager::registerEvents(const Reference< XPropertySet >& _rxElement, 121 const Sequence< ScriptEventDescriptor >& _rEvents) 122 { 123 OSL_ENSURE(m_aEvents.end() == m_aEvents.find(_rxElement), 124 "ODefaultEventAttacherManager::registerEvents: already have events for this object!"); 125 // for the moment, only remember the script events 126 m_aEvents[_rxElement] = _rEvents; 127 } 128 129 //------------------------------------------------------------------------- setEvents(const Reference<XIndexAccess> & _rxContainer)130 void ODefaultEventAttacherManager::setEvents(const Reference< XIndexAccess >& _rxContainer) 131 { 132 Reference< XEventAttacherManager > xEventManager(_rxContainer, UNO_QUERY); 133 if (!xEventManager.is()) 134 { 135 OSL_ENSURE(sal_False, "ODefaultEventAttacherManager::setEvents: invalid argument!"); 136 return; 137 } 138 139 // loop through all elements 140 sal_Int32 nCount = _rxContainer->getCount(); 141 Reference< XPropertySet > xCurrent; 142 ConstMapPropertySet2ScriptSequenceIterator aRegisteredEventsPos; 143 for (sal_Int32 i=0; i<nCount; ++i) 144 { 145 ::cppu::extractInterface(xCurrent, _rxContainer->getByIndex(i)); 146 if (xCurrent.is()) 147 { 148 aRegisteredEventsPos = m_aEvents.find(xCurrent); 149 if (m_aEvents.end() != aRegisteredEventsPos) 150 xEventManager->registerScriptEvents(i, aRegisteredEventsPos->second); 151 } 152 } 153 } 154 155 //......................................................................... 156 } // namespace xmloff 157 //......................................................................... 158 159 160