1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 29*cdf0e10cSrcweir #include "precompiled_xmloff.hxx" 30*cdf0e10cSrcweir #include <xmloff/XMLEventExport.hxx> 31*cdf0e10cSrcweir 32*cdf0e10cSrcweir #ifndef _COM_SUN_STAR_BEANS_PROPERTYVALUE_HPP 33*cdf0e10cSrcweir #include <com/sun/star/beans/PropertyValue.hpp> 34*cdf0e10cSrcweir #endif 35*cdf0e10cSrcweir 36*cdf0e10cSrcweir #ifndef _COM_SUN_STAR_DOCUMENT_XEVENTSSUPPLIER_HPP 37*cdf0e10cSrcweir #include <com/sun/star/document/XEventsSupplier.hpp> 38*cdf0e10cSrcweir #endif 39*cdf0e10cSrcweir 40*cdf0e10cSrcweir #ifndef _COM_SUN_STAR_CONTAINER_XNAMEREPLACE_HPP 41*cdf0e10cSrcweir #include <com/sun/star/container/XNameReplace.hpp> 42*cdf0e10cSrcweir #endif 43*cdf0e10cSrcweir #include <tools/debug.hxx> 44*cdf0e10cSrcweir #include <xmloff/xmlexp.hxx> 45*cdf0e10cSrcweir #include <xmloff/xmltoken.hxx> 46*cdf0e10cSrcweir #include "xmloff/xmlnmspe.hxx" 47*cdf0e10cSrcweir #include <xmloff/nmspmap.hxx> 48*cdf0e10cSrcweir 49*cdf0e10cSrcweir 50*cdf0e10cSrcweir using namespace ::com::sun::star::uno; 51*cdf0e10cSrcweir 52*cdf0e10cSrcweir using std::map; 53*cdf0e10cSrcweir using ::rtl::OUString; 54*cdf0e10cSrcweir using ::com::sun::star::beans::PropertyValue; 55*cdf0e10cSrcweir using ::com::sun::star::document::XEventsSupplier; 56*cdf0e10cSrcweir using ::com::sun::star::container::XNameReplace; 57*cdf0e10cSrcweir using ::com::sun::star::container::XNameAccess; 58*cdf0e10cSrcweir using ::xmloff::token::GetXMLToken; 59*cdf0e10cSrcweir using ::xmloff::token::XML_EVENT_LISTENERS; 60*cdf0e10cSrcweir 61*cdf0e10cSrcweir 62*cdf0e10cSrcweir XMLEventExport::XMLEventExport(SvXMLExport& rExp, 63*cdf0e10cSrcweir const XMLEventNameTranslation* pTranslationTable) : 64*cdf0e10cSrcweir sEventType(RTL_CONSTASCII_USTRINGPARAM("EventType")), 65*cdf0e10cSrcweir rExport(rExp), 66*cdf0e10cSrcweir bExtNamespace(false) 67*cdf0e10cSrcweir { 68*cdf0e10cSrcweir AddTranslationTable(pTranslationTable); 69*cdf0e10cSrcweir } 70*cdf0e10cSrcweir 71*cdf0e10cSrcweir XMLEventExport::~XMLEventExport() 72*cdf0e10cSrcweir { 73*cdf0e10cSrcweir // delete all handlers 74*cdf0e10cSrcweir HandlerMap::iterator aEnd = aHandlerMap.end(); 75*cdf0e10cSrcweir for( HandlerMap::iterator aIter = 76*cdf0e10cSrcweir aHandlerMap.begin(); 77*cdf0e10cSrcweir aIter != aEnd; 78*cdf0e10cSrcweir aIter++ ) 79*cdf0e10cSrcweir { 80*cdf0e10cSrcweir delete aIter->second; 81*cdf0e10cSrcweir } 82*cdf0e10cSrcweir aHandlerMap.clear(); 83*cdf0e10cSrcweir } 84*cdf0e10cSrcweir 85*cdf0e10cSrcweir void XMLEventExport::AddHandler( const OUString& rName, 86*cdf0e10cSrcweir XMLEventExportHandler* pHandler ) 87*cdf0e10cSrcweir { 88*cdf0e10cSrcweir DBG_ASSERT(pHandler != NULL, "Need EventExportHandler"); 89*cdf0e10cSrcweir if (pHandler != NULL) 90*cdf0e10cSrcweir { 91*cdf0e10cSrcweir aHandlerMap[rName] = pHandler; 92*cdf0e10cSrcweir } 93*cdf0e10cSrcweir } 94*cdf0e10cSrcweir 95*cdf0e10cSrcweir void XMLEventExport::AddTranslationTable( 96*cdf0e10cSrcweir const XMLEventNameTranslation* pTransTable ) 97*cdf0e10cSrcweir { 98*cdf0e10cSrcweir if (NULL != pTransTable) 99*cdf0e10cSrcweir { 100*cdf0e10cSrcweir // put translation table into map 101*cdf0e10cSrcweir for(const XMLEventNameTranslation* pTrans = pTransTable; 102*cdf0e10cSrcweir pTrans->sAPIName != NULL; 103*cdf0e10cSrcweir pTrans++) 104*cdf0e10cSrcweir { 105*cdf0e10cSrcweir aNameTranslationMap[OUString::createFromAscii(pTrans->sAPIName)] = 106*cdf0e10cSrcweir XMLEventName(pTrans->nPrefix, pTrans->sXMLName); 107*cdf0e10cSrcweir } 108*cdf0e10cSrcweir } 109*cdf0e10cSrcweir // else? ignore! 110*cdf0e10cSrcweir } 111*cdf0e10cSrcweir 112*cdf0e10cSrcweir void XMLEventExport::Export( Reference<XEventsSupplier> & rSupplier, 113*cdf0e10cSrcweir sal_Bool bWhitespace) 114*cdf0e10cSrcweir { 115*cdf0e10cSrcweir if (rSupplier.is()) 116*cdf0e10cSrcweir { 117*cdf0e10cSrcweir Reference<XNameAccess> xAccess(rSupplier->getEvents(), UNO_QUERY); 118*cdf0e10cSrcweir Export(xAccess, bWhitespace); 119*cdf0e10cSrcweir } 120*cdf0e10cSrcweir // else: no supplier, no export -> ignore! 121*cdf0e10cSrcweir } 122*cdf0e10cSrcweir 123*cdf0e10cSrcweir void XMLEventExport::Export( Reference<XNameReplace> & rReplace, 124*cdf0e10cSrcweir sal_Bool bWhitespace) 125*cdf0e10cSrcweir { 126*cdf0e10cSrcweir Reference<XNameAccess> xAccess(rReplace, UNO_QUERY); 127*cdf0e10cSrcweir Export(xAccess, bWhitespace); 128*cdf0e10cSrcweir } 129*cdf0e10cSrcweir 130*cdf0e10cSrcweir void XMLEventExport::Export( Reference<XNameAccess> & rAccess, 131*cdf0e10cSrcweir sal_Bool bWhitespace) 132*cdf0e10cSrcweir { 133*cdf0e10cSrcweir // early out if we don't actually get any events 134*cdf0e10cSrcweir if (!rAccess.is()) 135*cdf0e10cSrcweir { 136*cdf0e10cSrcweir return; 137*cdf0e10cSrcweir } 138*cdf0e10cSrcweir 139*cdf0e10cSrcweir // have we already processed an element? 140*cdf0e10cSrcweir sal_Bool bStarted = sal_False; 141*cdf0e10cSrcweir 142*cdf0e10cSrcweir // iterate over all event types 143*cdf0e10cSrcweir Sequence<OUString> aNames = rAccess->getElementNames(); 144*cdf0e10cSrcweir sal_Int32 nCount = aNames.getLength(); 145*cdf0e10cSrcweir for(sal_Int32 i = 0; i < nCount; i++) 146*cdf0e10cSrcweir { 147*cdf0e10cSrcweir // translate name 148*cdf0e10cSrcweir NameMap::iterator aIter = aNameTranslationMap.find(aNames[i]); 149*cdf0e10cSrcweir if (aIter != aNameTranslationMap.end()) 150*cdf0e10cSrcweir { 151*cdf0e10cSrcweir const XMLEventName& rXmlName = aIter->second; 152*cdf0e10cSrcweir 153*cdf0e10cSrcweir // get PropertyValues for this event 154*cdf0e10cSrcweir Any aAny = rAccess->getByName( aNames[i] ); 155*cdf0e10cSrcweir Sequence<PropertyValue> aValues; 156*cdf0e10cSrcweir aAny >>= aValues; 157*cdf0e10cSrcweir 158*cdf0e10cSrcweir // now export the current event 159*cdf0e10cSrcweir ExportEvent( aValues, rXmlName, bWhitespace, bStarted ); 160*cdf0e10cSrcweir } 161*cdf0e10cSrcweir #ifdef DBG_UTIL 162*cdf0e10cSrcweir else 163*cdf0e10cSrcweir { 164*cdf0e10cSrcweir // don't proceed further 165*cdf0e10cSrcweir ::rtl::OString aStr("Unknown event name:" ); 166*cdf0e10cSrcweir aStr += ::rtl::OUStringToOString( aNames[i], RTL_TEXTENCODING_UTF8 ); 167*cdf0e10cSrcweir DBG_ERROR( aStr.getStr() ); 168*cdf0e10cSrcweir } 169*cdf0e10cSrcweir #endif 170*cdf0e10cSrcweir } 171*cdf0e10cSrcweir 172*cdf0e10cSrcweir // close <script:events> element (if it was opened before) 173*cdf0e10cSrcweir if (bStarted) 174*cdf0e10cSrcweir { 175*cdf0e10cSrcweir EndElement(bWhitespace); 176*cdf0e10cSrcweir } 177*cdf0e10cSrcweir } 178*cdf0e10cSrcweir 179*cdf0e10cSrcweir void XMLEventExport::ExportExt( Reference<XNameAccess> & rAccess, 180*cdf0e10cSrcweir sal_Bool bWhitespace ) 181*cdf0e10cSrcweir { 182*cdf0e10cSrcweir // set bExtNamespace flag to use XML_NAMESPACE_OFFICE_EXT namespace 183*cdf0e10cSrcweir // for events element (not for child elements) 184*cdf0e10cSrcweir bExtNamespace = true; 185*cdf0e10cSrcweir Export(rAccess, bWhitespace); 186*cdf0e10cSrcweir bExtNamespace = false; // reset for future Export calls 187*cdf0e10cSrcweir } 188*cdf0e10cSrcweir 189*cdf0e10cSrcweir /// export a singular event and wirte <office:events> container 190*cdf0e10cSrcweir void XMLEventExport::ExportSingleEvent( 191*cdf0e10cSrcweir Sequence<PropertyValue>& rEventValues, 192*cdf0e10cSrcweir const OUString& rApiEventName, 193*cdf0e10cSrcweir sal_Bool bUseWhitespace ) 194*cdf0e10cSrcweir { 195*cdf0e10cSrcweir // translate the name 196*cdf0e10cSrcweir NameMap::iterator aIter = aNameTranslationMap.find(rApiEventName); 197*cdf0e10cSrcweir if (aIter != aNameTranslationMap.end()) 198*cdf0e10cSrcweir { 199*cdf0e10cSrcweir const XMLEventName& rXmlName = aIter->second; 200*cdf0e10cSrcweir 201*cdf0e10cSrcweir // export the event ... 202*cdf0e10cSrcweir sal_Bool bStarted = sal_False; 203*cdf0e10cSrcweir ExportEvent( rEventValues, rXmlName, bUseWhitespace, bStarted ); 204*cdf0e10cSrcweir 205*cdf0e10cSrcweir // ... and close the container element (if necessary) 206*cdf0e10cSrcweir if (bStarted) 207*cdf0e10cSrcweir { 208*cdf0e10cSrcweir EndElement(bUseWhitespace); 209*cdf0e10cSrcweir } 210*cdf0e10cSrcweir } 211*cdf0e10cSrcweir #ifdef DBG_UTIL 212*cdf0e10cSrcweir else 213*cdf0e10cSrcweir { 214*cdf0e10cSrcweir // don't proceed further 215*cdf0e10cSrcweir ::rtl::OString aStr("Unknown event name:" ); 216*cdf0e10cSrcweir aStr += ::rtl::OUStringToOString( rApiEventName, RTL_TEXTENCODING_UTF8 ); 217*cdf0e10cSrcweir DBG_ERROR( aStr.getStr() ); 218*cdf0e10cSrcweir } 219*cdf0e10cSrcweir #endif 220*cdf0e10cSrcweir } 221*cdf0e10cSrcweir 222*cdf0e10cSrcweir 223*cdf0e10cSrcweir /// export a single event 224*cdf0e10cSrcweir void XMLEventExport::ExportEvent( 225*cdf0e10cSrcweir Sequence<PropertyValue>& rEventValues, 226*cdf0e10cSrcweir const XMLEventName& rXmlEventName, 227*cdf0e10cSrcweir sal_Bool bUseWhitespace, 228*cdf0e10cSrcweir sal_Bool& rExported ) 229*cdf0e10cSrcweir { 230*cdf0e10cSrcweir // search for EventType value and then delegate to EventHandler 231*cdf0e10cSrcweir sal_Int32 nValues = rEventValues.getLength(); 232*cdf0e10cSrcweir const PropertyValue* pValues = rEventValues.getConstArray(); 233*cdf0e10cSrcweir 234*cdf0e10cSrcweir for(sal_Int32 nVal = 0; nVal < nValues; nVal++) 235*cdf0e10cSrcweir { 236*cdf0e10cSrcweir if (sEventType.equals(pValues[nVal].Name)) 237*cdf0e10cSrcweir { 238*cdf0e10cSrcweir // found! Now find handler and delegate 239*cdf0e10cSrcweir OUString sType; 240*cdf0e10cSrcweir pValues[nVal].Value >>= sType; 241*cdf0e10cSrcweir 242*cdf0e10cSrcweir if (aHandlerMap.count(sType)) 243*cdf0e10cSrcweir { 244*cdf0e10cSrcweir if (! rExported) 245*cdf0e10cSrcweir { 246*cdf0e10cSrcweir // OK, we have't yet exported the enclosing 247*cdf0e10cSrcweir // element. So we do that now. 248*cdf0e10cSrcweir rExported = sal_True; 249*cdf0e10cSrcweir StartElement(bUseWhitespace); 250*cdf0e10cSrcweir } 251*cdf0e10cSrcweir 252*cdf0e10cSrcweir OUString aEventQName( 253*cdf0e10cSrcweir rExport.GetNamespaceMap().GetQNameByKey( 254*cdf0e10cSrcweir rXmlEventName.m_nPrefix, rXmlEventName.m_aName ) ); 255*cdf0e10cSrcweir 256*cdf0e10cSrcweir // delegate to proper ExportEventHandler 257*cdf0e10cSrcweir aHandlerMap[sType]->Export(rExport, aEventQName, 258*cdf0e10cSrcweir rEventValues, bUseWhitespace); 259*cdf0e10cSrcweir } 260*cdf0e10cSrcweir else 261*cdf0e10cSrcweir { 262*cdf0e10cSrcweir if (! sType.equalsAsciiL("None", sizeof("None")-1)) 263*cdf0e10cSrcweir { 264*cdf0e10cSrcweir DBG_ERROR("unknown event type returned by API"); 265*cdf0e10cSrcweir // unknown type -> error (ignore) 266*cdf0e10cSrcweir } 267*cdf0e10cSrcweir // else: we ignore None fields 268*cdf0e10cSrcweir } 269*cdf0e10cSrcweir 270*cdf0e10cSrcweir // early out: we don't need to look for another type 271*cdf0e10cSrcweir break; 272*cdf0e10cSrcweir } 273*cdf0e10cSrcweir // else: we only care for EventType -> ignore 274*cdf0e10cSrcweir } 275*cdf0e10cSrcweir } 276*cdf0e10cSrcweir 277*cdf0e10cSrcweir 278*cdf0e10cSrcweir void XMLEventExport::StartElement(sal_Bool bWhitespace) 279*cdf0e10cSrcweir { 280*cdf0e10cSrcweir if (bWhitespace) 281*cdf0e10cSrcweir { 282*cdf0e10cSrcweir rExport.IgnorableWhitespace(); 283*cdf0e10cSrcweir } 284*cdf0e10cSrcweir sal_uInt16 nNamespace = bExtNamespace ? XML_NAMESPACE_OFFICE_EXT 285*cdf0e10cSrcweir : XML_NAMESPACE_OFFICE; 286*cdf0e10cSrcweir rExport.StartElement( nNamespace, XML_EVENT_LISTENERS, 287*cdf0e10cSrcweir bWhitespace); 288*cdf0e10cSrcweir } 289*cdf0e10cSrcweir 290*cdf0e10cSrcweir void XMLEventExport::EndElement(sal_Bool bWhitespace) 291*cdf0e10cSrcweir { 292*cdf0e10cSrcweir sal_uInt16 nNamespace = bExtNamespace ? XML_NAMESPACE_OFFICE_EXT 293*cdf0e10cSrcweir : XML_NAMESPACE_OFFICE; 294*cdf0e10cSrcweir rExport.EndElement(nNamespace, XML_EVENT_LISTENERS, bWhitespace); 295*cdf0e10cSrcweir if (bWhitespace) 296*cdf0e10cSrcweir { 297*cdf0e10cSrcweir rExport.IgnorableWhitespace(); 298*cdf0e10cSrcweir } 299*cdf0e10cSrcweir } 300*cdf0e10cSrcweir 301*cdf0e10cSrcweir 302*cdf0e10cSrcweir // implement aStandardEventTable (defined in xmlevent.hxx) 303*cdf0e10cSrcweir const XMLEventNameTranslation aStandardEventTable[] = 304*cdf0e10cSrcweir { 305*cdf0e10cSrcweir { "OnSelect", XML_NAMESPACE_DOM, "select" }, // "on-select" 306*cdf0e10cSrcweir { "OnInsertStart", XML_NAMESPACE_OFFICE, "insert-start" }, // "on-insert-start" 307*cdf0e10cSrcweir { "OnInsertDone", XML_NAMESPACE_OFFICE, "insert-done" }, // "on-insert-done" 308*cdf0e10cSrcweir { "OnMailMerge", XML_NAMESPACE_OFFICE, "mail-merge" }, // "on-mail-merge" 309*cdf0e10cSrcweir { "OnAlphaCharInput", XML_NAMESPACE_OFFICE, "alpha-char-input" }, // "on-alpha-char-input" 310*cdf0e10cSrcweir { "OnNonAlphaCharInput", XML_NAMESPACE_OFFICE, "non-alpha-char-input" }, // "on-non-alpha-char-input" 311*cdf0e10cSrcweir { "OnResize", XML_NAMESPACE_DOM, "resize" }, // "on-resize" 312*cdf0e10cSrcweir { "OnMove", XML_NAMESPACE_OFFICE, "move" }, // "on-move" 313*cdf0e10cSrcweir { "OnPageCountChange", XML_NAMESPACE_OFFICE, "page-count-change" }, // "on-page-count-change" 314*cdf0e10cSrcweir { "OnMouseOver", XML_NAMESPACE_DOM, "mouseover" }, // "on-mouse-over" 315*cdf0e10cSrcweir { "OnClick", XML_NAMESPACE_DOM, "click" }, // "on-click" 316*cdf0e10cSrcweir { "OnMouseOut", XML_NAMESPACE_DOM, "mouseout" }, // "on-mouse-out" 317*cdf0e10cSrcweir { "OnLoadError", XML_NAMESPACE_OFFICE, "load-error" }, // "on-load-error" 318*cdf0e10cSrcweir { "OnLoadCancel", XML_NAMESPACE_OFFICE, "load-cancel" }, // "on-load-cancel" 319*cdf0e10cSrcweir { "OnLoadDone", XML_NAMESPACE_OFFICE, "load-done" }, // "on-load-done" 320*cdf0e10cSrcweir { "OnLoad", XML_NAMESPACE_DOM, "load" }, // "on-load" 321*cdf0e10cSrcweir { "OnUnload", XML_NAMESPACE_DOM, "unload" }, // "on-unload" 322*cdf0e10cSrcweir { "OnStartApp", XML_NAMESPACE_OFFICE, "start-app" }, // "on-start-app" 323*cdf0e10cSrcweir { "OnCloseApp", XML_NAMESPACE_OFFICE, "close-app" }, // "on-close-app" 324*cdf0e10cSrcweir { "OnNew", XML_NAMESPACE_OFFICE, "new" }, // "on-new" 325*cdf0e10cSrcweir { "OnSave", XML_NAMESPACE_OFFICE, "save" }, // "on-save" 326*cdf0e10cSrcweir { "OnSaveAs", XML_NAMESPACE_OFFICE, "save-as" }, // "on-save-as" 327*cdf0e10cSrcweir { "OnFocus", XML_NAMESPACE_DOM, "DOMFocusIn" }, // "on-focus" 328*cdf0e10cSrcweir { "OnUnfocus", XML_NAMESPACE_DOM, "DOMFocusOut" }, // "on-unfocus" 329*cdf0e10cSrcweir { "OnPrint", XML_NAMESPACE_OFFICE, "print" }, // "on-print" 330*cdf0e10cSrcweir { "OnError", XML_NAMESPACE_DOM, "error" }, // "on-error" 331*cdf0e10cSrcweir { "OnLoadFinished", XML_NAMESPACE_OFFICE, "load-finished" }, // "on-load-finished" 332*cdf0e10cSrcweir { "OnSaveFinished", XML_NAMESPACE_OFFICE, "save-finished" }, // "on-save-finished" 333*cdf0e10cSrcweir { "OnModifyChanged", XML_NAMESPACE_OFFICE, "modify-changed" }, // "on-modify-changed" 334*cdf0e10cSrcweir { "OnPrepareUnload", XML_NAMESPACE_OFFICE, "prepare-unload" }, // "on-prepare-unload" 335*cdf0e10cSrcweir { "OnNewMail", XML_NAMESPACE_OFFICE, "new-mail" }, // "on-new-mail" 336*cdf0e10cSrcweir { "OnToggleFullscreen", XML_NAMESPACE_OFFICE, "toggle-fullscreen" }, // "on-toggle-fullscreen" 337*cdf0e10cSrcweir { "OnSaveDone", XML_NAMESPACE_OFFICE, "save-done" }, // "on-save-done" 338*cdf0e10cSrcweir { "OnSaveAsDone", XML_NAMESPACE_OFFICE, "save-as-done" }, // "on-save-as-done" 339*cdf0e10cSrcweir { "OnCopyTo", XML_NAMESPACE_OFFICE, "copy-to" }, 340*cdf0e10cSrcweir { "OnCopyToDone", XML_NAMESPACE_OFFICE, "copy-to-done" }, 341*cdf0e10cSrcweir { "OnViewCreated", XML_NAMESPACE_OFFICE, "view-created" }, 342*cdf0e10cSrcweir { "OnPrepareViewClosing", XML_NAMESPACE_OFFICE, "prepare-view-closing" }, 343*cdf0e10cSrcweir { "OnViewClosed", XML_NAMESPACE_OFFICE, "view-close" }, 344*cdf0e10cSrcweir { "OnVisAreaChanged", XML_NAMESPACE_OFFICE, "visarea-changed" }, // "on-visarea-changed" 345*cdf0e10cSrcweir { "OnCreate", XML_NAMESPACE_OFFICE, "create" }, 346*cdf0e10cSrcweir { "OnSaveAsFailed", XML_NAMESPACE_OFFICE, "save-as-failed" }, 347*cdf0e10cSrcweir { "OnSaveFailed", XML_NAMESPACE_OFFICE, "save-failed" }, 348*cdf0e10cSrcweir { "OnCopyToFailed", XML_NAMESPACE_OFFICE, "copy-to-failed" }, 349*cdf0e10cSrcweir { "OnTitleChanged", XML_NAMESPACE_OFFICE, "title-changed" }, 350*cdf0e10cSrcweir { "OnModeChanged", XML_NAMESPACE_OFFICE, "mode-changed" }, 351*cdf0e10cSrcweir { "OnSaveTo", XML_NAMESPACE_OFFICE, "save-to" }, 352*cdf0e10cSrcweir { "OnSaveToDone", XML_NAMESPACE_OFFICE, "save-to-done" }, 353*cdf0e10cSrcweir { "OnSaveToFailed", XML_NAMESPACE_OFFICE, "save-to-failed" }, 354*cdf0e10cSrcweir { "OnSubComponentOpened", XML_NAMESPACE_OFFICE, "subcomponent-opened" }, 355*cdf0e10cSrcweir { "OnSubComponentClosed", XML_NAMESPACE_OFFICE, "subcomponent-closed" }, 356*cdf0e10cSrcweir { "OnStorageChanged", XML_NAMESPACE_OFFICE, "storage-changed" }, 357*cdf0e10cSrcweir { "OnMailMergeFinished", XML_NAMESPACE_OFFICE, "mail-merge-finished" }, 358*cdf0e10cSrcweir { "OnFieldMerge", XML_NAMESPACE_OFFICE, "field-merge" }, 359*cdf0e10cSrcweir { "OnFieldMergeFinished", XML_NAMESPACE_OFFICE, "field-merge-finished" }, 360*cdf0e10cSrcweir { "OnLayoutFinished", XML_NAMESPACE_OFFICE, "layout-finished" }, 361*cdf0e10cSrcweir { "OnDoubleClick", XML_NAMESPACE_OFFICE, "dblclick" }, 362*cdf0e10cSrcweir { "OnRightClick", XML_NAMESPACE_OFFICE, "contextmenu" }, 363*cdf0e10cSrcweir { "OnChange", XML_NAMESPACE_OFFICE, "content-changed" }, 364*cdf0e10cSrcweir { "OnCalculate", XML_NAMESPACE_OFFICE, "calculated" }, 365*cdf0e10cSrcweir 366*cdf0e10cSrcweir { NULL, 0, 0 } 367*cdf0e10cSrcweir }; 368