xref: /AOO41X/main/svtools/source/uno/unoevent.cxx (revision 5900e8ec128faec89519683efce668ccd8cc6084)
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_svtools.hxx"
26 
27 #include <com/sun/star/beans/PropertyValue.hpp>
28 #include <rtl/ustrbuf.hxx>
29 #include <tools/rtti.hxx>
30 #include <tools/solar.h>
31 #include <svtools/unoevent.hxx>
32 #include <svl/macitem.hxx>
33 
34 using namespace ::com::sun::star;
35 using namespace ::com::sun::star::uno;
36 
37 using ::com::sun::star::container::NoSuchElementException;
38 using ::com::sun::star::container::XNameReplace;
39 using ::com::sun::star::lang::IllegalArgumentException;
40 using ::com::sun::star::lang::WrappedTargetException;
41 using ::com::sun::star::lang::XServiceInfo;
42 using ::com::sun::star::beans::PropertyValue;
43 using ::cppu::WeakImplHelper2;
44 using ::rtl::OUString;
45 using ::rtl::OUStringBuffer;
46 
47 
48 const sal_Char sAPI_ServiceName[] = "com.sun.star.container.XNameReplace";
49 const sal_Char sAPI_SvDetachedEventDescriptor[] = "SvDetachedEventDescriptor";
50 
51 //
52 // SvBaseEventDescriptor
53 //
54 
SvBaseEventDescriptor(const SvEventDescription * pSupportedMacroItems)55 SvBaseEventDescriptor::SvBaseEventDescriptor( const SvEventDescription* pSupportedMacroItems ) :
56         sEventType(RTL_CONSTASCII_USTRINGPARAM("EventType")),
57         sMacroName(RTL_CONSTASCII_USTRINGPARAM("MacroName")),
58         sLibrary(RTL_CONSTASCII_USTRINGPARAM("Library")),
59         sStarBasic(RTL_CONSTASCII_USTRINGPARAM("StarBasic")),
60         sJavaScript(RTL_CONSTASCII_USTRINGPARAM("JavaScript")),
61         sScript(RTL_CONSTASCII_USTRINGPARAM("Script")),
62         sNone(RTL_CONSTASCII_USTRINGPARAM("None")),
63         sServiceName(RTL_CONSTASCII_USTRINGPARAM(sAPI_ServiceName)),
64         sEmpty(),
65         mpSupportedMacroItems(pSupportedMacroItems),
66         mnMacroItems(0)
67 {
68     DBG_ASSERT(pSupportedMacroItems != NULL, "Need a list of supported events!");
69 
70     for( ; mpSupportedMacroItems[mnMacroItems].mnEvent != 0; mnMacroItems++) ;
71 }
72 
73 
~SvBaseEventDescriptor()74 SvBaseEventDescriptor::~SvBaseEventDescriptor()
75 {
76 }
77 
replaceByName(const OUString & rName,const Any & rElement)78 void SvBaseEventDescriptor::replaceByName(
79     const OUString& rName,
80     const Any& rElement )
81     throw(
82         IllegalArgumentException,
83         NoSuchElementException,
84         WrappedTargetException,
85         RuntimeException)
86 {
87     sal_uInt16 nMacroID = getMacroID(rName);
88 
89     // error checking
90     if (0 == nMacroID)
91         throw NoSuchElementException();
92     if (rElement.getValueType() != getElementType())
93         throw IllegalArgumentException();
94 
95     // get sequence
96     Sequence<PropertyValue> aSequence;
97     rElement >>= aSequence;
98 
99     // perform replace (in subclass)
100     SvxMacro aMacro(sEmpty,sEmpty);
101     getMacroFromAny(aMacro, rElement);
102     replaceByName(nMacroID, aMacro);
103 }
104 
getByName(const OUString & rName)105 Any SvBaseEventDescriptor::getByName(
106     const OUString& rName )
107     throw(
108         NoSuchElementException,
109         WrappedTargetException,
110         RuntimeException)
111 {
112     sal_uInt16 nMacroID = getMacroID(rName);
113 
114     // error checking
115     if (0 == nMacroID)
116         throw NoSuchElementException();
117 
118     // perform get (in subclass)
119     Any aAny;
120     SvxMacro aMacro( sEmpty, sEmpty );
121     getByName(aMacro, nMacroID);
122     getAnyFromMacro(aAny, aMacro);
123     return aAny;
124 }
125 
getElementNames()126 Sequence<OUString> SvBaseEventDescriptor::getElementNames()
127     throw(RuntimeException)
128 {
129     // create and fill sequence
130     Sequence<OUString> aSequence(mnMacroItems);
131     for( sal_Int16 i = 0; i < mnMacroItems; i++)
132     {
133         aSequence[i] = OUString::createFromAscii( mpSupportedMacroItems[i].mpEventName );
134     }
135 
136     return aSequence;
137 }
138 
hasByName(const OUString & rName)139 sal_Bool SvBaseEventDescriptor::hasByName(
140     const OUString& rName )
141     throw(RuntimeException)
142 {
143     sal_uInt16 nMacroID = getMacroID(rName);
144     return (nMacroID != 0);
145 }
146 
getElementType()147 Type SvBaseEventDescriptor::getElementType()
148     throw(RuntimeException)
149 {
150     return ::getCppuType((Sequence<PropertyValue> *)0);
151 }
152 
hasElements()153 sal_Bool SvBaseEventDescriptor::hasElements()
154     throw(RuntimeException)
155 {
156     return mnMacroItems != 0;
157 }
158 
supportsService(const OUString & rServiceName)159 sal_Bool SvBaseEventDescriptor::supportsService(const OUString& rServiceName)
160     throw(RuntimeException)
161 {
162     return sServiceName.equals(rServiceName);
163 }
164 
getSupportedServiceNames(void)165 Sequence<OUString> SvBaseEventDescriptor::getSupportedServiceNames(void)
166     throw(RuntimeException)
167 {
168     Sequence<OUString> aSequence(1);
169     aSequence[0] = sServiceName;
170 
171     return aSequence;
172 }
173 
mapNameToEventID(const OUString & rName) const174 sal_uInt16 SvBaseEventDescriptor::mapNameToEventID(const OUString& rName) const
175 {
176     // iterate over known event names
177     for(sal_Int16 i = 0; i < mnMacroItems; i++)
178     {
179         if (0 == rName.compareToAscii(mpSupportedMacroItems[i].mpEventName))
180         {
181             return mpSupportedMacroItems[i].mnEvent;
182         }
183     }
184 
185     // not found -> return zero
186     return 0;
187 }
188 
mapEventIDToName(sal_uInt16 nPoolID) const189 OUString SvBaseEventDescriptor::mapEventIDToName(sal_uInt16 nPoolID) const
190 {
191     // iterate over known event IDs
192     for(sal_Int16 i = 0; i < mnMacroItems; i++)
193     {
194         if (nPoolID == mpSupportedMacroItems[i].mnEvent)
195         {
196             return OUString::createFromAscii(mpSupportedMacroItems[i].mpEventName);
197         }
198     }
199 
200     // not found -> return empty string
201     return OUString();
202 }
203 
getMacroID(const OUString & rName) const204 sal_uInt16 SvBaseEventDescriptor::getMacroID(const OUString& rName) const
205 {
206     return mapNameToEventID(rName);
207 }
208 
getAnyFromMacro(Any & rAny,const SvxMacro & rMacro)209 void SvBaseEventDescriptor::getAnyFromMacro(Any& rAny,
210                                        const SvxMacro& rMacro)
211 {
212     sal_Bool bRetValueOK = sal_False;   // do we have a ret value?
213 
214     if (rMacro.HasMacro())
215     {
216         switch (rMacro.GetScriptType())
217         {
218             case STARBASIC:
219             {
220                 // create sequence
221                 Sequence<PropertyValue> aSequence(3);
222                 Any aTmp;
223 
224                 // create type
225                 PropertyValue aTypeValue;
226                 aTypeValue.Name = sEventType;
227                 aTmp <<= sStarBasic;
228                 aTypeValue.Value = aTmp;
229                 aSequence[0] = aTypeValue;
230 
231                 // macro name
232                 PropertyValue aNameValue;
233                 aNameValue.Name = sMacroName;
234                 OUString sNameTmp(rMacro.GetMacName());
235                 aTmp <<= sNameTmp;
236                 aNameValue.Value = aTmp;
237                 aSequence[1] = aNameValue;
238 
239                 // library name
240                 PropertyValue aLibValue;
241                 aLibValue.Name = sLibrary;
242                 OUString sLibTmp(rMacro.GetLibName());
243                 aTmp <<= sLibTmp;
244                 aLibValue.Value = aTmp;
245                 aSequence[2] = aLibValue;
246 
247                 rAny <<= aSequence;
248                 bRetValueOK = sal_True;
249                 break;
250             }
251             case EXTENDED_STYPE:
252             {
253                 // create sequence
254                 Sequence<PropertyValue> aSequence(2);
255                 Any aTmp;
256 
257                 // create type
258                 PropertyValue aTypeValue;
259                 aTypeValue.Name = sEventType;
260                 aTmp <<= sScript;
261                 aTypeValue.Value = aTmp;
262                 aSequence[0] = aTypeValue;
263 
264                 // macro name
265                 PropertyValue aNameValue;
266                 aNameValue.Name = sScript;
267                 OUString sNameTmp(rMacro.GetMacName());
268                 aTmp <<= sNameTmp;
269                 aNameValue.Value = aTmp;
270                 aSequence[1] = aNameValue;
271 
272                 rAny <<= aSequence;
273                 bRetValueOK = sal_True;
274                 break;
275                         }
276             case JAVASCRIPT:
277             default:
278                 DBG_ERROR("not implemented");
279         }
280     }
281     // else: bRetValueOK not set
282 
283     // if we don't have a return value, make an empty one
284     if (! bRetValueOK)
285     {
286         // create "None" macro
287         Sequence<PropertyValue> aSequence(1);
288 
289         PropertyValue aKindValue;
290         aKindValue.Name = sEventType;
291         Any aTmp;
292         aTmp <<= sNone;
293         aKindValue.Value = aTmp;
294         aSequence[0] = aKindValue;
295 
296         rAny <<= aSequence;
297         bRetValueOK = sal_True;
298     }
299 }
300 
301 
getMacroFromAny(SvxMacro & rMacro,const Any & rAny)302 void SvBaseEventDescriptor::getMacroFromAny(
303     SvxMacro& rMacro,
304     const Any& rAny)
305         throw ( IllegalArgumentException )
306 {
307     // get sequence
308     Sequence<PropertyValue> aSequence;
309     rAny >>= aSequence;
310 
311     // process ...
312     sal_Bool bTypeOK = sal_False;
313     sal_Bool bNone = sal_False;     // true if EventType=="None"
314     enum ScriptType eType = EXTENDED_STYPE;
315     OUString sScriptVal;
316     OUString sMacroVal;
317     OUString sLibVal;
318     sal_Int32 nCount = aSequence.getLength();
319     for (sal_Int32 i = 0; i < nCount; i++)
320     {
321         PropertyValue& aValue = aSequence[i];
322         if (aValue.Name.equals(sEventType))
323         {
324             OUString sTmp;
325             aValue.Value >>= sTmp;
326             if (sTmp.equals(sStarBasic))
327             {
328                 eType = STARBASIC;
329                 bTypeOK = sal_True;
330             }
331             else if (sTmp.equals(sJavaScript))
332             {
333                 eType = JAVASCRIPT;
334                 bTypeOK = sal_True;
335             }
336             else if (sTmp.equals(sScript))
337             {
338                 eType = EXTENDED_STYPE;
339                 bTypeOK = sal_True;
340             }
341             else if (sTmp.equals(sNone))
342             {
343                 bNone = sal_True;
344                 bTypeOK = sal_True;
345             }
346             // else: unknown script type
347         }
348         else if (aValue.Name.equals(sMacroName))
349         {
350             aValue.Value >>= sMacroVal;
351         }
352         else if (aValue.Name.equals(sLibrary))
353         {
354             aValue.Value >>= sLibVal;
355         }
356         else if (aValue.Name.equals(sScript))
357         {
358             aValue.Value >>= sScriptVal;
359         }
360         // else: unknown PropertyValue -> ignore
361     }
362 
363     if (bTypeOK)
364     {
365         if (bNone)
366         {
367             // return empty macro
368             rMacro = SvxMacro( sEmpty, sEmpty );
369         }
370         else
371         {
372             if (eType == STARBASIC)
373             {
374                 // create macro and return
375                 SvxMacro aMacro(sMacroVal, sLibVal, eType);
376                 rMacro = aMacro;
377             }
378             else if (eType == EXTENDED_STYPE)
379             {
380                 SvxMacro aMacro(sScriptVal, sScript);
381                 rMacro = aMacro;
382             }
383             else
384             {
385                 // we can't process type: abort
386                 // TODO: JavaScript macros
387                 throw IllegalArgumentException();
388             }
389         }
390     }
391     else
392     {
393         // no valid type: abort
394         throw IllegalArgumentException();
395     }
396 }
397 
398 
399 
400 
401 //
402 // SvEventDescriptor
403 //
404 
405 
SvEventDescriptor(XInterface & rParent,const SvEventDescription * pSupportedMacroItems)406 SvEventDescriptor::SvEventDescriptor(
407     XInterface& rParent,
408     const SvEventDescription* pSupportedMacroItems) :
409         SvBaseEventDescriptor(pSupportedMacroItems),
410         xParentRef(&rParent)
411 {
412 }
413 
414 
~SvEventDescriptor()415 SvEventDescriptor::~SvEventDescriptor()
416 {
417     // automatically release xParentRef !
418 }
419 
replaceByName(const sal_uInt16 nEvent,const SvxMacro & rMacro)420 void SvEventDescriptor::replaceByName(
421     const sal_uInt16 nEvent,
422     const SvxMacro& rMacro)
423         throw(
424             IllegalArgumentException,
425             NoSuchElementException,
426             WrappedTargetException,
427             RuntimeException)
428 {
429     SvxMacroItem aItem(getMacroItemWhich());
430     aItem.SetMacroTable(getMacroItem().GetMacroTable());
431     aItem.SetMacro(nEvent, rMacro);
432     setMacroItem(aItem);
433 }
434 
getByName(SvxMacro & rMacro,const sal_uInt16 nEvent)435 void SvEventDescriptor::getByName(
436     SvxMacro& rMacro,
437     const sal_uInt16 nEvent )
438         throw(
439             NoSuchElementException,
440             WrappedTargetException,
441             RuntimeException)
442 {
443     const SvxMacroItem& rItem = getMacroItem();
444     if( rItem.HasMacro( nEvent ) )
445         rMacro = rItem.GetMacro(nEvent);
446     else
447     {
448         SvxMacro aEmptyMacro(sEmpty, sEmpty);
449         rMacro = aEmptyMacro;
450     }
451 }
452 
453 
454 
455 
456 //
457 // SvDetachedEventDescriptor
458 //
459 
SvDetachedEventDescriptor(const SvEventDescription * pSupportedMacroItems)460 SvDetachedEventDescriptor::SvDetachedEventDescriptor(
461     const SvEventDescription* pSupportedMacroItems) :
462     SvBaseEventDescriptor(pSupportedMacroItems),
463     sImplName(RTL_CONSTASCII_USTRINGPARAM(sAPI_SvDetachedEventDescriptor))
464 {
465     // allocate aMacros
466     aMacros = new SvxMacro*[mnMacroItems];
467 
468     // ... and initialize
469     for(sal_Int16 i = 0; i < mnMacroItems; i++)
470     {
471         aMacros[i] = NULL;
472     }
473 }
474 
~SvDetachedEventDescriptor()475 SvDetachedEventDescriptor::~SvDetachedEventDescriptor()
476 {
477     // delete contents of aMacros
478     for(sal_Int16 i = 0; i < mnMacroItems; i++)
479     {
480         if (NULL != aMacros[i])
481             delete aMacros[i];
482     }
483 
484     delete [] aMacros;
485 }
486 
getIndex(const sal_uInt16 nID) const487 sal_Int16 SvDetachedEventDescriptor::getIndex(const sal_uInt16 nID) const
488 {
489     // iterate over supported events
490     sal_Int16 nIndex = 0;
491     while ( (mpSupportedMacroItems[nIndex].mnEvent != nID) &&
492             (mpSupportedMacroItems[nIndex].mnEvent != 0)      )
493     {
494         nIndex++;
495     }
496     return (mpSupportedMacroItems[nIndex].mnEvent == nID) ? nIndex : -1;
497 }
498 
getImplementationName()499 OUString SvDetachedEventDescriptor::getImplementationName()
500     throw( ::com::sun::star::uno::RuntimeException )
501 {
502     return sImplName;
503 }
504 
505 
replaceByName(const sal_uInt16 nEvent,const SvxMacro & rMacro)506 void SvDetachedEventDescriptor::replaceByName(
507     const sal_uInt16 nEvent,
508     const SvxMacro& rMacro)
509     throw(
510         IllegalArgumentException,
511         NoSuchElementException,
512         WrappedTargetException,
513         RuntimeException)
514 {
515     sal_Int16 nIndex = getIndex(nEvent);
516     if (-1 == nIndex)
517         throw IllegalArgumentException();
518 
519     aMacros[nIndex] = new SvxMacro(rMacro.GetMacName(), rMacro.GetLibName(),
520                                    rMacro.GetScriptType() );
521 }
522 
523 
getByName(SvxMacro & rMacro,const sal_uInt16 nEvent)524 void SvDetachedEventDescriptor::getByName(
525     SvxMacro& rMacro,
526     const sal_uInt16 nEvent )
527     throw(
528         NoSuchElementException,
529         WrappedTargetException,
530         RuntimeException)
531 {
532     sal_Int16 nIndex = getIndex(nEvent);
533     if (-1 == nIndex )
534         throw NoSuchElementException();
535 
536     if( aMacros[nIndex] )
537         rMacro = (*aMacros[nIndex]);
538 }
539 
hasByName(const sal_uInt16 nEvent) const540 sal_Bool SvDetachedEventDescriptor::hasByName(
541     const sal_uInt16 nEvent ) const     /// item ID of event
542         throw(IllegalArgumentException)
543 {
544     sal_Int16 nIndex = getIndex(nEvent);
545     if (-1 == nIndex)
546         throw IllegalArgumentException();
547 
548     return (NULL == aMacros[nIndex]) ? sal_False : aMacros[nIndex]->HasMacro();
549 }
550 
551 
552 //
553 // SvMacroTableEventDescriptor
554 //
555 
SvMacroTableEventDescriptor(const SvEventDescription * pSupportedMacroItems)556 SvMacroTableEventDescriptor::SvMacroTableEventDescriptor(const SvEventDescription* pSupportedMacroItems) :
557     SvDetachedEventDescriptor(pSupportedMacroItems)
558 {
559 }
560 
SvMacroTableEventDescriptor(const SvxMacroTableDtor & rMacroTable,const SvEventDescription * pSupportedMacroItems)561 SvMacroTableEventDescriptor::SvMacroTableEventDescriptor(
562     const SvxMacroTableDtor& rMacroTable,
563     const SvEventDescription* pSupportedMacroItems) :
564         SvDetachedEventDescriptor(pSupportedMacroItems)
565 {
566     copyMacrosFromTable(rMacroTable);
567 }
568 
~SvMacroTableEventDescriptor()569 SvMacroTableEventDescriptor::~SvMacroTableEventDescriptor()
570 {
571 }
572 
copyMacrosFromTable(const SvxMacroTableDtor & rMacroTable)573 void SvMacroTableEventDescriptor::copyMacrosFromTable(
574     const SvxMacroTableDtor& rMacroTable)
575 {
576     for(sal_Int16 i = 0; mpSupportedMacroItems[i].mnEvent != 0; i++)
577     {
578         const sal_uInt16 nEvent = mpSupportedMacroItems[i].mnEvent;
579         const SvxMacro* pMacro = rMacroTable.Get(nEvent);
580         if (NULL != pMacro)
581             replaceByName(nEvent, *pMacro);
582     }
583 
584 }
585 
copyMacrosIntoTable(SvxMacroTableDtor & rMacroTable)586 void SvMacroTableEventDescriptor::copyMacrosIntoTable(
587     SvxMacroTableDtor& rMacroTable)
588 {
589     for(sal_Int16 i = 0; mpSupportedMacroItems[i].mnEvent != 0; i++)
590     {
591         const sal_uInt16 nEvent = mpSupportedMacroItems[i].mnEvent;
592         if (hasByName(nEvent))
593         {
594             SvxMacro* pMacro = new SvxMacro(sEmpty, sEmpty);
595             getByName(*pMacro, nEvent);
596             rMacroTable.Insert(nEvent, pMacro);
597         }
598     }
599 }
600 
601 
602 
603