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