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