1*2a97ec55SAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
3*2a97ec55SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
4*2a97ec55SAndrew Rist * or more contributor license agreements. See the NOTICE file
5*2a97ec55SAndrew Rist * distributed with this work for additional information
6*2a97ec55SAndrew Rist * regarding copyright ownership. The ASF licenses this file
7*2a97ec55SAndrew Rist * to you under the Apache License, Version 2.0 (the
8*2a97ec55SAndrew Rist * "License"); you may not use this file except in compliance
9*2a97ec55SAndrew Rist * with the License. You may obtain a copy of the License at
10*2a97ec55SAndrew Rist *
11*2a97ec55SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12*2a97ec55SAndrew Rist *
13*2a97ec55SAndrew Rist * Unless required by applicable law or agreed to in writing,
14*2a97ec55SAndrew Rist * software distributed under the License is distributed on an
15*2a97ec55SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*2a97ec55SAndrew Rist * KIND, either express or implied. See the License for the
17*2a97ec55SAndrew Rist * specific language governing permissions and limitations
18*2a97ec55SAndrew Rist * under the License.
19*2a97ec55SAndrew Rist *
20*2a97ec55SAndrew Rist *************************************************************/
21*2a97ec55SAndrew Rist
22*2a97ec55SAndrew Rist
23cdf0e10cSrcweir
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_extensions.hxx"
26cdf0e10cSrcweir
27cdf0e10cSrcweir #include "eventhandler.hxx"
28cdf0e10cSrcweir #include "propctrlr.hrc"
29cdf0e10cSrcweir #include "formbrowsertools.hxx"
30cdf0e10cSrcweir #include "formresid.hrc"
31cdf0e10cSrcweir #include "formstrings.hxx"
32cdf0e10cSrcweir #include "handlerhelper.hxx"
33cdf0e10cSrcweir #include "modulepcr.hxx"
34cdf0e10cSrcweir #include "pcrcommon.hxx"
35cdf0e10cSrcweir #include "pcrstrings.hxx"
36cdf0e10cSrcweir #include "propertycontrolextender.hxx"
37cdf0e10cSrcweir
38cdf0e10cSrcweir /** === begin UNO includes === **/
39cdf0e10cSrcweir #include <com/sun/star/awt/XTabControllerModel.hpp>
40cdf0e10cSrcweir #include <com/sun/star/beans/PropertyAttribute.hpp>
41cdf0e10cSrcweir #include <com/sun/star/beans/UnknownPropertyException.hpp>
42cdf0e10cSrcweir #include <com/sun/star/beans/XIntrospection.hpp>
43cdf0e10cSrcweir #include <com/sun/star/beans/XIntrospectionAccess.hpp>
44cdf0e10cSrcweir #include <com/sun/star/container/NoSuchElementException.hpp>
45cdf0e10cSrcweir #include <com/sun/star/container/XChild.hpp>
46cdf0e10cSrcweir #include <com/sun/star/container/XIndexAccess.hpp>
47cdf0e10cSrcweir #include <com/sun/star/container/XNameContainer.hpp>
48cdf0e10cSrcweir #include <com/sun/star/container/XNameReplace.hpp>
49cdf0e10cSrcweir #include <com/sun/star/form/FormComponentType.hpp>
50cdf0e10cSrcweir #include <com/sun/star/form/XForm.hpp>
51cdf0e10cSrcweir #include <com/sun/star/form/runtime/XFormController.hpp>
52cdf0e10cSrcweir #include <com/sun/star/inspection/PropertyControlType.hpp>
53cdf0e10cSrcweir #include <com/sun/star/lang/NullPointerException.hpp>
54cdf0e10cSrcweir #include <com/sun/star/script/XEventAttacherManager.hpp>
55cdf0e10cSrcweir #include <com/sun/star/script/XScriptEventsSupplier.hpp>
56cdf0e10cSrcweir #include <com/sun/star/util/XModifiable.hpp>
57cdf0e10cSrcweir #include <com/sun/star/uri/UriReferenceFactory.hpp>
58cdf0e10cSrcweir #include <com/sun/star/uri/XVndSunStarScriptUrlReference.hpp>
59cdf0e10cSrcweir /** === end UNO includes === **/
60cdf0e10cSrcweir
61cdf0e10cSrcweir #include <comphelper/namedvaluecollection.hxx>
62cdf0e10cSrcweir #include <comphelper/evtmethodhelper.hxx>
63cdf0e10cSrcweir #include <comphelper/types.hxx>
64cdf0e10cSrcweir #include <cppuhelper/implbase1.hxx>
65cdf0e10cSrcweir #include <rtl/ref.hxx>
66cdf0e10cSrcweir #include <rtl/ustrbuf.hxx>
67cdf0e10cSrcweir #include <sfx2/app.hxx>
68cdf0e10cSrcweir #include <svl/eitem.hxx>
69cdf0e10cSrcweir #include <svl/itemset.hxx>
70cdf0e10cSrcweir #include <svx/svxdlg.hxx>
71cdf0e10cSrcweir #include <svx/svxids.hrc>
72cdf0e10cSrcweir #include <tools/diagnose_ex.h>
73cdf0e10cSrcweir #include <vcl/msgbox.hxx>
74cdf0e10cSrcweir
75cdf0e10cSrcweir #include <map>
76cdf0e10cSrcweir #include <algorithm>
77cdf0e10cSrcweir
78cdf0e10cSrcweir //------------------------------------------------------------------------
createRegistryInfo_EventHandler()79cdf0e10cSrcweir extern "C" void SAL_CALL createRegistryInfo_EventHandler()
80cdf0e10cSrcweir {
81cdf0e10cSrcweir ::pcr::OAutoRegistration< ::pcr::EventHandler > aAutoRegistration;
82cdf0e10cSrcweir }
83cdf0e10cSrcweir
84cdf0e10cSrcweir //........................................................................
85cdf0e10cSrcweir namespace pcr
86cdf0e10cSrcweir {
87cdf0e10cSrcweir //........................................................................
88cdf0e10cSrcweir
89cdf0e10cSrcweir /** === begin UNO using === **/
90cdf0e10cSrcweir using ::com::sun::star::uno::Reference;
91cdf0e10cSrcweir using ::com::sun::star::uno::XComponentContext;
92cdf0e10cSrcweir using ::com::sun::star::beans::XPropertySet;
93cdf0e10cSrcweir using ::com::sun::star::uno::Any;
94cdf0e10cSrcweir using ::com::sun::star::uno::TypeClass_STRING;
95cdf0e10cSrcweir using ::com::sun::star::uno::Type;
96cdf0e10cSrcweir using ::com::sun::star::beans::XPropertyChangeListener;
97cdf0e10cSrcweir using ::com::sun::star::beans::Property;
98cdf0e10cSrcweir using ::com::sun::star::beans::PropertyState;
99cdf0e10cSrcweir using ::com::sun::star::beans::PropertyState_DIRECT_VALUE;
100cdf0e10cSrcweir using ::com::sun::star::uno::Sequence;
101cdf0e10cSrcweir using ::com::sun::star::script::ScriptEventDescriptor;
102cdf0e10cSrcweir using ::com::sun::star::script::XScriptEventsSupplier;
103cdf0e10cSrcweir using ::com::sun::star::lang::NullPointerException;
104cdf0e10cSrcweir using ::com::sun::star::uno::Exception;
105cdf0e10cSrcweir using ::com::sun::star::container::XChild;
106cdf0e10cSrcweir using ::com::sun::star::container::XIndexAccess;
107cdf0e10cSrcweir using ::com::sun::star::script::XEventAttacherManager;
108cdf0e10cSrcweir using ::com::sun::star::uno::UNO_QUERY;
109cdf0e10cSrcweir using ::com::sun::star::uno::UNO_QUERY_THROW;
110cdf0e10cSrcweir using ::com::sun::star::uno::XInterface;
111cdf0e10cSrcweir using ::com::sun::star::beans::XIntrospection;
112cdf0e10cSrcweir using ::com::sun::star::beans::XIntrospectionAccess;
113cdf0e10cSrcweir using ::com::sun::star::container::XNameContainer;
114cdf0e10cSrcweir using ::com::sun::star::awt::XTabControllerModel;
115cdf0e10cSrcweir using ::com::sun::star::form::XForm;
116cdf0e10cSrcweir using ::com::sun::star::form::runtime::XFormController;
117cdf0e10cSrcweir using ::com::sun::star::beans::UnknownPropertyException;
118cdf0e10cSrcweir using ::com::sun::star::uno::makeAny;
119cdf0e10cSrcweir using ::com::sun::star::container::NoSuchElementException;
120cdf0e10cSrcweir using ::com::sun::star::beans::XPropertySetInfo;
121cdf0e10cSrcweir using ::com::sun::star::container::XNameReplace;
122cdf0e10cSrcweir using ::com::sun::star::lang::IllegalArgumentException;
123cdf0e10cSrcweir using ::com::sun::star::lang::WrappedTargetException;
124cdf0e10cSrcweir using ::com::sun::star::uno::RuntimeException;
125cdf0e10cSrcweir using ::com::sun::star::beans::PropertyValue;
126cdf0e10cSrcweir using ::com::sun::star::inspection::LineDescriptor;
127cdf0e10cSrcweir using ::com::sun::star::inspection::XPropertyControlFactory;
128cdf0e10cSrcweir using ::com::sun::star::inspection::InteractiveSelectionResult;
129cdf0e10cSrcweir using ::com::sun::star::inspection::InteractiveSelectionResult_Cancelled;
130cdf0e10cSrcweir using ::com::sun::star::inspection::InteractiveSelectionResult_Success;
131cdf0e10cSrcweir using ::com::sun::star::inspection::XObjectInspectorUI;
132cdf0e10cSrcweir using ::com::sun::star::util::XModifiable;
133cdf0e10cSrcweir using ::com::sun::star::beans::PropertyChangeEvent;
134cdf0e10cSrcweir using ::com::sun::star::frame::XFrame;
135cdf0e10cSrcweir using ::com::sun::star::frame::XModel;
136cdf0e10cSrcweir using ::com::sun::star::frame::XController;
137cdf0e10cSrcweir using ::com::sun::star::uno::UNO_SET_THROW;
138cdf0e10cSrcweir using com::sun::star::uri::UriReferenceFactory;
139cdf0e10cSrcweir using com::sun::star::uri::XUriReferenceFactory;
140cdf0e10cSrcweir using com::sun::star::uri::XVndSunStarScriptUrlReference;
141cdf0e10cSrcweir using ::com::sun::star::lang::XEventListener;
142cdf0e10cSrcweir /** === end UNO using === **/
143cdf0e10cSrcweir namespace PropertyControlType = ::com::sun::star::inspection::PropertyControlType;
144cdf0e10cSrcweir namespace PropertyAttribute = ::com::sun::star::beans::PropertyAttribute;
145cdf0e10cSrcweir namespace FormComponentType = ::com::sun::star::form::FormComponentType;
146cdf0e10cSrcweir
147cdf0e10cSrcweir //====================================================================
148cdf0e10cSrcweir //= EventDescription
149cdf0e10cSrcweir //====================================================================
EventDescription(EventId _nId,const sal_Char * _pListenerNamespaceAscii,const sal_Char * _pListenerClassAsciiName,const sal_Char * _pListenerMethodAsciiName,sal_uInt16 _nDisplayNameResId,const rtl::OString & _sHelpId,const rtl::OString & _sUniqueBrowseId)150cdf0e10cSrcweir EventDescription::EventDescription( EventId _nId, const sal_Char* _pListenerNamespaceAscii, const sal_Char* _pListenerClassAsciiName,
151cdf0e10cSrcweir const sal_Char* _pListenerMethodAsciiName, sal_uInt16 _nDisplayNameResId, const rtl::OString& _sHelpId, const rtl::OString& _sUniqueBrowseId )
152cdf0e10cSrcweir :sDisplayName( String( PcrRes( _nDisplayNameResId ) ) )
153cdf0e10cSrcweir ,sListenerMethodName( ::rtl::OUString::createFromAscii( _pListenerMethodAsciiName ) )
154cdf0e10cSrcweir ,sHelpId( _sHelpId )
155cdf0e10cSrcweir ,sUniqueBrowseId( _sUniqueBrowseId )
156cdf0e10cSrcweir ,nId( _nId )
157cdf0e10cSrcweir {
158cdf0e10cSrcweir ::rtl::OUStringBuffer aQualifiedListenerClass;
159cdf0e10cSrcweir aQualifiedListenerClass.appendAscii( "com.sun.star." );
160cdf0e10cSrcweir aQualifiedListenerClass.appendAscii( _pListenerNamespaceAscii );
161cdf0e10cSrcweir aQualifiedListenerClass.appendAscii( "." );
162cdf0e10cSrcweir aQualifiedListenerClass.appendAscii( _pListenerClassAsciiName );
163cdf0e10cSrcweir sListenerClassName = aQualifiedListenerClass.makeStringAndClear();
164cdf0e10cSrcweir }
165cdf0e10cSrcweir
166cdf0e10cSrcweir //========================================================================
167cdf0e10cSrcweir //= helper
168cdf0e10cSrcweir //========================================================================
169cdf0e10cSrcweir namespace
170cdf0e10cSrcweir {
171cdf0e10cSrcweir //....................................................................
172cdf0e10cSrcweir #define DESCRIBE_EVENT( asciinamespace, asciilistener, asciimethod, id_postfix ) \
173cdf0e10cSrcweir s_aKnownEvents.insert( EventMap::value_type( \
174cdf0e10cSrcweir ::rtl::OUString::createFromAscii( asciimethod ), \
175cdf0e10cSrcweir EventDescription( ++nEventId, asciinamespace, asciilistener, asciimethod, RID_STR_EVT_##id_postfix, HID_EVT_##id_postfix, UID_BRWEVT_##id_postfix ) ) )
176cdf0e10cSrcweir
177cdf0e10cSrcweir //....................................................................
lcl_getEventDescriptionForMethod(const::rtl::OUString & _rMethodName,EventDescription & _out_rDescription)178cdf0e10cSrcweir bool lcl_getEventDescriptionForMethod( const ::rtl::OUString& _rMethodName, EventDescription& _out_rDescription )
179cdf0e10cSrcweir {
180cdf0e10cSrcweir static EventMap s_aKnownEvents;
181cdf0e10cSrcweir if ( s_aKnownEvents.empty() )
182cdf0e10cSrcweir {
183cdf0e10cSrcweir ::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() );
184cdf0e10cSrcweir if ( s_aKnownEvents.empty() )
185cdf0e10cSrcweir {
186cdf0e10cSrcweir static sal_Int32 nEventId = 0;
187cdf0e10cSrcweir
188cdf0e10cSrcweir DESCRIBE_EVENT( "form", "XApproveActionListener", "approveAction", APPROVEACTIONPERFORMED );
189cdf0e10cSrcweir DESCRIBE_EVENT( "awt", "XActionListener", "actionPerformed", ACTIONPERFORMED );
190cdf0e10cSrcweir DESCRIBE_EVENT( "form", "XChangeListener", "changed", CHANGED );
191cdf0e10cSrcweir DESCRIBE_EVENT( "awt", "XTextListener", "textChanged", TEXTCHANGED );
192cdf0e10cSrcweir DESCRIBE_EVENT( "awt", "XItemListener", "itemStateChanged", ITEMSTATECHANGED );
193cdf0e10cSrcweir DESCRIBE_EVENT( "awt", "XFocusListener", "focusGained", FOCUSGAINED );
194cdf0e10cSrcweir DESCRIBE_EVENT( "awt", "XFocusListener", "focusLost", FOCUSLOST );
195cdf0e10cSrcweir DESCRIBE_EVENT( "awt", "XKeyListener", "keyPressed", KEYTYPED );
196cdf0e10cSrcweir DESCRIBE_EVENT( "awt", "XKeyListener", "keyReleased", KEYUP );
197cdf0e10cSrcweir DESCRIBE_EVENT( "awt", "XMouseListener", "mouseEntered", MOUSEENTERED );
198cdf0e10cSrcweir DESCRIBE_EVENT( "awt", "XMouseMotionListener", "mouseDragged", MOUSEDRAGGED );
199cdf0e10cSrcweir DESCRIBE_EVENT( "awt", "XMouseMotionListener", "mouseMoved", MOUSEMOVED );
200cdf0e10cSrcweir DESCRIBE_EVENT( "awt", "XMouseListener", "mousePressed", MOUSEPRESSED );
201cdf0e10cSrcweir DESCRIBE_EVENT( "awt", "XMouseListener", "mouseReleased", MOUSERELEASED );
202cdf0e10cSrcweir DESCRIBE_EVENT( "awt", "XMouseListener", "mouseExited", MOUSEEXITED );
203cdf0e10cSrcweir DESCRIBE_EVENT( "form", "XResetListener", "approveReset", APPROVERESETTED );
204cdf0e10cSrcweir DESCRIBE_EVENT( "form", "XResetListener", "resetted", RESETTED );
205cdf0e10cSrcweir DESCRIBE_EVENT( "form", "XSubmitListener", "approveSubmit", SUBMITTED );
206cdf0e10cSrcweir DESCRIBE_EVENT( "form", "XUpdateListener", "approveUpdate", BEFOREUPDATE );
207cdf0e10cSrcweir DESCRIBE_EVENT( "form", "XUpdateListener", "updated", AFTERUPDATE );
208cdf0e10cSrcweir DESCRIBE_EVENT( "form", "XLoadListener", "loaded", LOADED );
209cdf0e10cSrcweir DESCRIBE_EVENT( "form", "XLoadListener", "reloading", RELOADING );
210cdf0e10cSrcweir DESCRIBE_EVENT( "form", "XLoadListener", "reloaded", RELOADED );
211cdf0e10cSrcweir DESCRIBE_EVENT( "form", "XLoadListener", "unloading", UNLOADING );
212cdf0e10cSrcweir DESCRIBE_EVENT( "form", "XLoadListener", "unloaded", UNLOADED );
213cdf0e10cSrcweir DESCRIBE_EVENT( "form", "XConfirmDeleteListener", "confirmDelete", CONFIRMDELETE );
214cdf0e10cSrcweir DESCRIBE_EVENT( "sdb", "XRowSetApproveListener", "approveRowChange", APPROVEROWCHANGE );
215cdf0e10cSrcweir DESCRIBE_EVENT( "sdbc", "XRowSetListener", "rowChanged", ROWCHANGE );
216cdf0e10cSrcweir DESCRIBE_EVENT( "sdb", "XRowSetApproveListener", "approveCursorMove", POSITIONING );
217cdf0e10cSrcweir DESCRIBE_EVENT( "sdbc", "XRowSetListener", "cursorMoved", POSITIONED );
218cdf0e10cSrcweir DESCRIBE_EVENT( "form", "XDatabaseParameterListener", "approveParameter", APPROVEPARAMETER );
219cdf0e10cSrcweir DESCRIBE_EVENT( "sdb", "XSQLErrorListener", "errorOccured", ERROROCCURED );
220cdf0e10cSrcweir DESCRIBE_EVENT( "awt", "XAdjustmentListener", "adjustmentValueChanged", ADJUSTMENTVALUECHANGED );
221cdf0e10cSrcweir }
222cdf0e10cSrcweir }
223cdf0e10cSrcweir
224cdf0e10cSrcweir EventMap::const_iterator pos = s_aKnownEvents.find( _rMethodName );
225cdf0e10cSrcweir if ( pos == s_aKnownEvents.end() )
226cdf0e10cSrcweir return false;
227cdf0e10cSrcweir
228cdf0e10cSrcweir _out_rDescription = pos->second;
229cdf0e10cSrcweir return true;
230cdf0e10cSrcweir }
231cdf0e10cSrcweir
232cdf0e10cSrcweir //....................................................................
lcl_getEventPropertyName(const::rtl::OUString & _rListenerClassName,const::rtl::OUString & _rMethodName)233cdf0e10cSrcweir ::rtl::OUString lcl_getEventPropertyName( const ::rtl::OUString& _rListenerClassName, const ::rtl::OUString& _rMethodName )
234cdf0e10cSrcweir {
235cdf0e10cSrcweir ::rtl::OUStringBuffer aPropertyName;
236cdf0e10cSrcweir aPropertyName.append( _rListenerClassName );
237cdf0e10cSrcweir aPropertyName.append( (sal_Unicode)';' );
238cdf0e10cSrcweir aPropertyName.append( _rMethodName.getStr() );
239cdf0e10cSrcweir return aPropertyName.makeStringAndClear();
240cdf0e10cSrcweir }
241cdf0e10cSrcweir
242cdf0e10cSrcweir //................................................................
lcl_getAssignedScriptEvent(const EventDescription & _rEvent,const Sequence<ScriptEventDescriptor> & _rAllAssignedMacros)243cdf0e10cSrcweir ScriptEventDescriptor lcl_getAssignedScriptEvent( const EventDescription& _rEvent, const Sequence< ScriptEventDescriptor >& _rAllAssignedMacros )
244cdf0e10cSrcweir {
245cdf0e10cSrcweir ScriptEventDescriptor aScriptEvent;
246cdf0e10cSrcweir // for the case there is actually no event assigned, initialize at least ListenerType and MethodName,
247cdf0e10cSrcweir // so this ScriptEventDescriptor properly describes the given event
248cdf0e10cSrcweir aScriptEvent.ListenerType = _rEvent.sListenerClassName;
249cdf0e10cSrcweir aScriptEvent.EventMethod = _rEvent.sListenerMethodName;
250cdf0e10cSrcweir
251cdf0e10cSrcweir const ScriptEventDescriptor* pAssignedEvent = _rAllAssignedMacros.getConstArray();
252cdf0e10cSrcweir sal_Int32 assignedEventCount( _rAllAssignedMacros.getLength() );
253cdf0e10cSrcweir for ( sal_Int32 assignedEvent = 0; assignedEvent < assignedEventCount; ++assignedEvent, ++pAssignedEvent )
254cdf0e10cSrcweir {
255cdf0e10cSrcweir if ( ( pAssignedEvent->ListenerType != _rEvent.sListenerClassName )
256cdf0e10cSrcweir || ( pAssignedEvent->EventMethod != _rEvent.sListenerMethodName )
257cdf0e10cSrcweir )
258cdf0e10cSrcweir continue;
259cdf0e10cSrcweir
260cdf0e10cSrcweir if ( ( pAssignedEvent->ScriptCode.getLength() == 0 )
261cdf0e10cSrcweir || ( pAssignedEvent->ScriptType.getLength() == 0 )
262cdf0e10cSrcweir )
263cdf0e10cSrcweir {
264cdf0e10cSrcweir DBG_ERROR( "lcl_getAssignedScriptEvent: me thinks this should not happen!" );
265cdf0e10cSrcweir continue;
266cdf0e10cSrcweir }
267cdf0e10cSrcweir
268cdf0e10cSrcweir aScriptEvent = *pAssignedEvent;
269cdf0e10cSrcweir
270cdf0e10cSrcweir if ( !aScriptEvent.ScriptType.equalsAscii( "StarBasic" ) )
271cdf0e10cSrcweir continue;
272cdf0e10cSrcweir
273cdf0e10cSrcweir // this is an old-style macro specification:
274cdf0e10cSrcweir // [document|application]:Library.Module.Function
275cdf0e10cSrcweir // we need to translate this to the new-style macro specification
276cdf0e10cSrcweir // vnd.sun.star.script:Library.Module.Function?language=Basic&location=[document|application]
277cdf0e10cSrcweir
278cdf0e10cSrcweir sal_Int32 nPrefixLen = aScriptEvent.ScriptCode.indexOf( ':' );
279cdf0e10cSrcweir OSL_ENSURE( nPrefixLen > 0, "lcl_getAssignedScriptEvent: illegal location!" );
280cdf0e10cSrcweir ::rtl::OUString sLocation = aScriptEvent.ScriptCode.copy( 0, nPrefixLen );
281cdf0e10cSrcweir ::rtl::OUString sMacroPath = aScriptEvent.ScriptCode.copy( nPrefixLen + 1 );
282cdf0e10cSrcweir
283cdf0e10cSrcweir ::rtl::OUStringBuffer aNewStyleSpec;
284cdf0e10cSrcweir aNewStyleSpec.appendAscii( "vnd.sun.star.script:" );
285cdf0e10cSrcweir aNewStyleSpec.append ( sMacroPath );
286cdf0e10cSrcweir aNewStyleSpec.appendAscii( "?language=Basic&location=" );
287cdf0e10cSrcweir aNewStyleSpec.append ( sLocation );
288cdf0e10cSrcweir
289cdf0e10cSrcweir aScriptEvent.ScriptCode = aNewStyleSpec.makeStringAndClear();
290cdf0e10cSrcweir
291cdf0e10cSrcweir // also, this new-style spec requires the script code to be "Script" instead of "StarBasic"
292cdf0e10cSrcweir aScriptEvent.ScriptType = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Script" ) );
293cdf0e10cSrcweir }
294cdf0e10cSrcweir return aScriptEvent;
295cdf0e10cSrcweir }
296cdf0e10cSrcweir
297cdf0e10cSrcweir //................................................................
lcl_getQualifiedKnownListenerName(const ScriptEventDescriptor & _rFormComponentEventDescriptor)298cdf0e10cSrcweir ::rtl::OUString lcl_getQualifiedKnownListenerName( const ScriptEventDescriptor& _rFormComponentEventDescriptor )
299cdf0e10cSrcweir {
300cdf0e10cSrcweir EventDescription aKnownEvent;
301cdf0e10cSrcweir if ( lcl_getEventDescriptionForMethod( _rFormComponentEventDescriptor.EventMethod, aKnownEvent ) )
302cdf0e10cSrcweir return aKnownEvent.sListenerClassName;
303cdf0e10cSrcweir DBG_ERROR( "lcl_getQualifiedKnownListenerName: unknown method name!" );
304cdf0e10cSrcweir // somebody assigned an script to a form component event which we don't know
305cdf0e10cSrcweir // Speaking strictly, this is not really an error - it is possible to do
306cdf0e10cSrcweir // this programmatically -, but it should rarely happen, since it's not possible
307cdf0e10cSrcweir // via UI
308cdf0e10cSrcweir return _rFormComponentEventDescriptor.ListenerType;
309cdf0e10cSrcweir }
310cdf0e10cSrcweir
311cdf0e10cSrcweir //................................................................
312cdf0e10cSrcweir typedef ::std::set< Type, TypeLessByName > TypeBag;
313cdf0e10cSrcweir
314cdf0e10cSrcweir //................................................................
lcl_addListenerTypesFor_throw(const Reference<XInterface> & _rxComponent,const Reference<XIntrospection> & _rxIntrospection,TypeBag & _out_rTypes)315cdf0e10cSrcweir void lcl_addListenerTypesFor_throw( const Reference< XInterface >& _rxComponent,
316cdf0e10cSrcweir const Reference< XIntrospection >& _rxIntrospection, TypeBag& _out_rTypes )
317cdf0e10cSrcweir {
318cdf0e10cSrcweir if ( !_rxComponent.is() )
319cdf0e10cSrcweir return;
320cdf0e10cSrcweir OSL_PRECOND( _rxIntrospection.is(), "lcl_addListenerTypesFor_throw: this will crash!" );
321cdf0e10cSrcweir
322cdf0e10cSrcweir Reference< XIntrospectionAccess > xIntrospectionAccess(
323cdf0e10cSrcweir _rxIntrospection->inspect( makeAny( _rxComponent ) ), UNO_QUERY_THROW );
324cdf0e10cSrcweir
325cdf0e10cSrcweir Sequence< Type > aListeners( xIntrospectionAccess->getSupportedListeners() );
326cdf0e10cSrcweir
327cdf0e10cSrcweir ::std::copy( aListeners.getConstArray(), aListeners.getConstArray() + aListeners.getLength(),
328cdf0e10cSrcweir ::std::insert_iterator< TypeBag >( _out_rTypes, _out_rTypes.begin() ) );
329cdf0e10cSrcweir }
330cdf0e10cSrcweir
331cdf0e10cSrcweir //................................................................
operator ==(const ScriptEventDescriptor _lhs,const ScriptEventDescriptor _rhs)332cdf0e10cSrcweir bool operator ==( const ScriptEventDescriptor _lhs, const ScriptEventDescriptor _rhs )
333cdf0e10cSrcweir {
334cdf0e10cSrcweir return ( ( _lhs.ListenerType == _rhs.ListenerType )
335cdf0e10cSrcweir && ( _lhs.EventMethod == _rhs.EventMethod )
336cdf0e10cSrcweir && ( _lhs.AddListenerParam == _rhs.AddListenerParam )
337cdf0e10cSrcweir && ( _lhs.ScriptType == _rhs.ScriptType )
338cdf0e10cSrcweir && ( _lhs.ScriptCode == _rhs.ScriptCode )
339cdf0e10cSrcweir );
340cdf0e10cSrcweir }
341cdf0e10cSrcweir }
342cdf0e10cSrcweir
343cdf0e10cSrcweir //====================================================================
344cdf0e10cSrcweir //= EventHandler
345cdf0e10cSrcweir //====================================================================
346cdf0e10cSrcweir typedef ::cppu::WeakImplHelper1 < ::com::sun::star::container::XNameReplace
347cdf0e10cSrcweir > EventHolder_Base;
348cdf0e10cSrcweir /** a UNO component holding assigned event descriptions, for use with a SvxMacroAssignDlg
349cdf0e10cSrcweir */
350cdf0e10cSrcweir class EventHolder : public EventHolder_Base
351cdf0e10cSrcweir {
352cdf0e10cSrcweir private:
353cdf0e10cSrcweir typedef ::std::hash_map< ::rtl::OUString, ScriptEventDescriptor, ::rtl::OUStringHash > EventMap;
354cdf0e10cSrcweir typedef ::std::map< EventId, EventMap::iterator > EventMapIndexAccess;
355cdf0e10cSrcweir
356cdf0e10cSrcweir EventMap m_aEventNameAccess;
357cdf0e10cSrcweir EventMapIndexAccess m_aEventIndexAccess;
358cdf0e10cSrcweir
359cdf0e10cSrcweir public:
360cdf0e10cSrcweir EventHolder( );
361cdf0e10cSrcweir
362cdf0e10cSrcweir void addEvent( EventId _nId, const ::rtl::OUString& _rEventName, const ScriptEventDescriptor& _rScriptEvent );
363cdf0e10cSrcweir
364cdf0e10cSrcweir /** effectively the same as getByName, but instead of converting the ScriptEventDescriptor to the weird
365cdf0e10cSrcweir format used by the macro assignment dialog, it is returned directly
366cdf0e10cSrcweir */
367cdf0e10cSrcweir ScriptEventDescriptor getNormalizedDescriptorByName( const ::rtl::OUString& _rEventName ) const;
368cdf0e10cSrcweir
369cdf0e10cSrcweir // XNameReplace
370cdf0e10cSrcweir virtual void SAL_CALL replaceByName( const ::rtl::OUString& _rName, const Any& aElement ) throw (IllegalArgumentException, NoSuchElementException, WrappedTargetException, RuntimeException);
371cdf0e10cSrcweir virtual Any SAL_CALL getByName( const ::rtl::OUString& _rName ) throw (NoSuchElementException, WrappedTargetException, RuntimeException);
372cdf0e10cSrcweir virtual Sequence< ::rtl::OUString > SAL_CALL getElementNames( ) throw (RuntimeException);
373cdf0e10cSrcweir virtual ::sal_Bool SAL_CALL hasByName( const ::rtl::OUString& _rName ) throw (RuntimeException);
374cdf0e10cSrcweir virtual Type SAL_CALL getElementType( ) throw (RuntimeException);
375cdf0e10cSrcweir virtual ::sal_Bool SAL_CALL hasElements( ) throw (RuntimeException);
376cdf0e10cSrcweir
377cdf0e10cSrcweir protected:
378cdf0e10cSrcweir ~EventHolder( );
379cdf0e10cSrcweir
380cdf0e10cSrcweir private:
381cdf0e10cSrcweir ScriptEventDescriptor impl_getDescriptor_throw( const ::rtl::OUString& _rEventName ) const;
382cdf0e10cSrcweir };
383cdf0e10cSrcweir
DBG_NAME(EventHolder)384cdf0e10cSrcweir DBG_NAME( EventHolder )
385cdf0e10cSrcweir //------------------------------------------------------------------------
386cdf0e10cSrcweir EventHolder::EventHolder()
387cdf0e10cSrcweir {
388cdf0e10cSrcweir DBG_CTOR( EventHolder, NULL );
389cdf0e10cSrcweir }
390cdf0e10cSrcweir
391cdf0e10cSrcweir //------------------------------------------------------------------------
~EventHolder()392cdf0e10cSrcweir EventHolder::~EventHolder()
393cdf0e10cSrcweir {
394cdf0e10cSrcweir m_aEventNameAccess.clear();
395cdf0e10cSrcweir m_aEventIndexAccess.clear();
396cdf0e10cSrcweir DBG_DTOR( EventHolder, NULL );
397cdf0e10cSrcweir }
398cdf0e10cSrcweir
399cdf0e10cSrcweir //------------------------------------------------------------------------
addEvent(EventId _nId,const::rtl::OUString & _rEventName,const ScriptEventDescriptor & _rScriptEvent)400cdf0e10cSrcweir void EventHolder::addEvent( EventId _nId, const ::rtl::OUString& _rEventName, const ScriptEventDescriptor& _rScriptEvent )
401cdf0e10cSrcweir {
402cdf0e10cSrcweir ::std::pair< EventMap::iterator, bool > insertionResult =
403cdf0e10cSrcweir m_aEventNameAccess.insert( EventMap::value_type( _rEventName, _rScriptEvent ) );
404cdf0e10cSrcweir OSL_ENSURE( insertionResult.second, "EventHolder::addEvent: there already was a MacroURL for this event!" );
405cdf0e10cSrcweir m_aEventIndexAccess[ _nId ] = insertionResult.first;
406cdf0e10cSrcweir }
407cdf0e10cSrcweir
408cdf0e10cSrcweir //------------------------------------------------------------------------
getNormalizedDescriptorByName(const::rtl::OUString & _rEventName) const409cdf0e10cSrcweir ScriptEventDescriptor EventHolder::getNormalizedDescriptorByName( const ::rtl::OUString& _rEventName ) const
410cdf0e10cSrcweir {
411cdf0e10cSrcweir return impl_getDescriptor_throw( _rEventName );
412cdf0e10cSrcweir }
413cdf0e10cSrcweir
414cdf0e10cSrcweir //------------------------------------------------------------------------
impl_getDescriptor_throw(const::rtl::OUString & _rEventName) const415cdf0e10cSrcweir ScriptEventDescriptor EventHolder::impl_getDescriptor_throw( const ::rtl::OUString& _rEventName ) const
416cdf0e10cSrcweir {
417cdf0e10cSrcweir EventMap::const_iterator pos = m_aEventNameAccess.find( _rEventName );
418cdf0e10cSrcweir if ( pos == m_aEventNameAccess.end() )
419cdf0e10cSrcweir throw NoSuchElementException( ::rtl::OUString(), *const_cast< EventHolder* >( this ) );
420cdf0e10cSrcweir return pos->second;
421cdf0e10cSrcweir }
422cdf0e10cSrcweir
423cdf0e10cSrcweir //------------------------------------------------------------------------
replaceByName(const::rtl::OUString & _rName,const Any & _rElement)424cdf0e10cSrcweir void SAL_CALL EventHolder::replaceByName( const ::rtl::OUString& _rName, const Any& _rElement ) throw (IllegalArgumentException, NoSuchElementException, WrappedTargetException, RuntimeException)
425cdf0e10cSrcweir {
426cdf0e10cSrcweir EventMap::iterator pos = m_aEventNameAccess.find( _rName );
427cdf0e10cSrcweir if ( pos == m_aEventNameAccess.end() )
428cdf0e10cSrcweir throw NoSuchElementException( ::rtl::OUString(), *this );
429cdf0e10cSrcweir
430cdf0e10cSrcweir Sequence< PropertyValue > aScriptDescriptor;
431cdf0e10cSrcweir OSL_VERIFY( _rElement >>= aScriptDescriptor );
432cdf0e10cSrcweir
433cdf0e10cSrcweir ::comphelper::NamedValueCollection aExtractor( aScriptDescriptor );
434cdf0e10cSrcweir
435cdf0e10cSrcweir pos->second.ScriptType = aExtractor.getOrDefault( "EventType", ::rtl::OUString() );
436cdf0e10cSrcweir pos->second.ScriptCode = aExtractor.getOrDefault( "Script", ::rtl::OUString() );
437cdf0e10cSrcweir }
438cdf0e10cSrcweir
439cdf0e10cSrcweir //------------------------------------------------------------------------
getByName(const::rtl::OUString & _rName)440cdf0e10cSrcweir Any SAL_CALL EventHolder::getByName( const ::rtl::OUString& _rName ) throw (NoSuchElementException, WrappedTargetException, RuntimeException)
441cdf0e10cSrcweir {
442cdf0e10cSrcweir ScriptEventDescriptor aDescriptor( impl_getDescriptor_throw( _rName ) );
443cdf0e10cSrcweir
444cdf0e10cSrcweir Any aRet;
445cdf0e10cSrcweir Sequence< PropertyValue > aScriptDescriptor( 2 );
446cdf0e10cSrcweir aScriptDescriptor[0].Name = ::rtl::OUString::createFromAscii( "EventType" );
447cdf0e10cSrcweir aScriptDescriptor[0].Value <<= aDescriptor.ScriptType;
448cdf0e10cSrcweir aScriptDescriptor[1].Name = ::rtl::OUString::createFromAscii( "Script" );
449cdf0e10cSrcweir aScriptDescriptor[1].Value <<= aDescriptor.ScriptCode;
450cdf0e10cSrcweir
451cdf0e10cSrcweir return makeAny( aScriptDescriptor );
452cdf0e10cSrcweir }
453cdf0e10cSrcweir
454cdf0e10cSrcweir //------------------------------------------------------------------------
getElementNames()455cdf0e10cSrcweir Sequence< ::rtl::OUString > SAL_CALL EventHolder::getElementNames( ) throw (RuntimeException)
456cdf0e10cSrcweir {
457cdf0e10cSrcweir Sequence< ::rtl::OUString > aReturn( m_aEventIndexAccess.size() );
458cdf0e10cSrcweir ::rtl::OUString* pReturn = aReturn.getArray();
459cdf0e10cSrcweir
460cdf0e10cSrcweir // SvxMacroAssignDlg has a weird API: It expects a XNameReplace, means a container whose
461cdf0e10cSrcweir // main access method is by name. In it's UI, it shows the possible events in exactly the
462cdf0e10cSrcweir // order in which XNameAccess::getElementNames returns them.
463cdf0e10cSrcweir // However, SvxMacroAssignDlg *also* takes an index for the initial selection, which is
464cdf0e10cSrcweir // relative to the sequence returned by XNameAccess::getElementNames.
465cdf0e10cSrcweir // This is IMO weird, since it mixes index access with name access, which decreases efficiency
466cdf0e10cSrcweir // of the implementation.
467cdf0e10cSrcweir // Well, it means we're forced to return the events in getElementNames in exactly the same as they
468cdf0e10cSrcweir // appear in the property browser UI.
469cdf0e10cSrcweir for ( EventMapIndexAccess::const_iterator loop = m_aEventIndexAccess.begin();
470cdf0e10cSrcweir loop != m_aEventIndexAccess.end();
471cdf0e10cSrcweir ++loop, ++pReturn
472cdf0e10cSrcweir )
473cdf0e10cSrcweir *pReturn = loop->second->first;
474cdf0e10cSrcweir return aReturn;
475cdf0e10cSrcweir }
476cdf0e10cSrcweir
477cdf0e10cSrcweir //------------------------------------------------------------------------
hasByName(const::rtl::OUString & _rName)478cdf0e10cSrcweir sal_Bool SAL_CALL EventHolder::hasByName( const ::rtl::OUString& _rName ) throw (RuntimeException)
479cdf0e10cSrcweir {
480cdf0e10cSrcweir EventMap::const_iterator pos = m_aEventNameAccess.find( _rName );
481cdf0e10cSrcweir return pos != m_aEventNameAccess.end();
482cdf0e10cSrcweir }
483cdf0e10cSrcweir
484cdf0e10cSrcweir //------------------------------------------------------------------------
getElementType()485cdf0e10cSrcweir Type SAL_CALL EventHolder::getElementType( ) throw (RuntimeException)
486cdf0e10cSrcweir {
487cdf0e10cSrcweir return ::getCppuType( static_cast< Sequence< PropertyValue >* >( NULL ) );
488cdf0e10cSrcweir }
489cdf0e10cSrcweir
490cdf0e10cSrcweir //------------------------------------------------------------------------
hasElements()491cdf0e10cSrcweir sal_Bool SAL_CALL EventHolder::hasElements( ) throw (RuntimeException)
492cdf0e10cSrcweir {
493cdf0e10cSrcweir return !m_aEventNameAccess.empty();
494cdf0e10cSrcweir }
495cdf0e10cSrcweir
496cdf0e10cSrcweir
497cdf0e10cSrcweir //====================================================================
498cdf0e10cSrcweir //= EventHandler
499cdf0e10cSrcweir //====================================================================
DBG_NAME(EventHandler)500cdf0e10cSrcweir DBG_NAME( EventHandler )
501cdf0e10cSrcweir //--------------------------------------------------------------------
502cdf0e10cSrcweir EventHandler::EventHandler( const Reference< XComponentContext >& _rxContext )
503cdf0e10cSrcweir :EventHandler_Base( m_aMutex )
504cdf0e10cSrcweir ,m_aContext( _rxContext )
505cdf0e10cSrcweir ,m_aPropertyListeners( m_aMutex )
506cdf0e10cSrcweir ,m_bEventsMapInitialized( false )
507cdf0e10cSrcweir ,m_bIsDialogElement( false )
508cdf0e10cSrcweir ,m_nGridColumnType( -1 )
509cdf0e10cSrcweir {
510cdf0e10cSrcweir DBG_CTOR( EventHandler, NULL );
511cdf0e10cSrcweir }
512cdf0e10cSrcweir
513cdf0e10cSrcweir //--------------------------------------------------------------------
~EventHandler()514cdf0e10cSrcweir EventHandler::~EventHandler()
515cdf0e10cSrcweir {
516cdf0e10cSrcweir DBG_DTOR( EventHandler, NULL );
517cdf0e10cSrcweir }
518cdf0e10cSrcweir
519cdf0e10cSrcweir //--------------------------------------------------------------------
getImplementationName()520cdf0e10cSrcweir ::rtl::OUString SAL_CALL EventHandler::getImplementationName( ) throw (RuntimeException)
521cdf0e10cSrcweir {
522cdf0e10cSrcweir return getImplementationName_static();
523cdf0e10cSrcweir }
524cdf0e10cSrcweir
525cdf0e10cSrcweir //--------------------------------------------------------------------
supportsService(const::rtl::OUString & ServiceName)526cdf0e10cSrcweir ::sal_Bool SAL_CALL EventHandler::supportsService( const ::rtl::OUString& ServiceName ) throw (RuntimeException)
527cdf0e10cSrcweir {
528cdf0e10cSrcweir StlSyntaxSequence< ::rtl::OUString > aAllServices( getSupportedServiceNames() );
529cdf0e10cSrcweir return ::std::find( aAllServices.begin(), aAllServices.end(), ServiceName ) != aAllServices.end();
530cdf0e10cSrcweir }
531cdf0e10cSrcweir
532cdf0e10cSrcweir //--------------------------------------------------------------------
getSupportedServiceNames()533cdf0e10cSrcweir Sequence< ::rtl::OUString > SAL_CALL EventHandler::getSupportedServiceNames( ) throw (RuntimeException)
534cdf0e10cSrcweir {
535cdf0e10cSrcweir return getSupportedServiceNames_static();
536cdf0e10cSrcweir }
537cdf0e10cSrcweir
538cdf0e10cSrcweir //--------------------------------------------------------------------
getImplementationName_static()539cdf0e10cSrcweir ::rtl::OUString SAL_CALL EventHandler::getImplementationName_static( ) throw (RuntimeException)
540cdf0e10cSrcweir {
541cdf0e10cSrcweir return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.extensions.EventHandler" ) );
542cdf0e10cSrcweir }
543cdf0e10cSrcweir
544cdf0e10cSrcweir //--------------------------------------------------------------------
getSupportedServiceNames_static()545cdf0e10cSrcweir Sequence< ::rtl::OUString > SAL_CALL EventHandler::getSupportedServiceNames_static( ) throw (RuntimeException)
546cdf0e10cSrcweir {
547cdf0e10cSrcweir Sequence< ::rtl::OUString > aSupported( 1 );
548cdf0e10cSrcweir aSupported[0] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.form.inspection.EventHandler" ) );
549cdf0e10cSrcweir return aSupported;
550cdf0e10cSrcweir }
551cdf0e10cSrcweir
552cdf0e10cSrcweir //--------------------------------------------------------------------
Create(const Reference<XComponentContext> & _rxContext)553cdf0e10cSrcweir Reference< XInterface > SAL_CALL EventHandler::Create( const Reference< XComponentContext >& _rxContext )
554cdf0e10cSrcweir {
555cdf0e10cSrcweir return *( new EventHandler( _rxContext ) );
556cdf0e10cSrcweir }
557cdf0e10cSrcweir
558cdf0e10cSrcweir //--------------------------------------------------------------------
inspect(const Reference<XInterface> & _rxIntrospectee)559cdf0e10cSrcweir void SAL_CALL EventHandler::inspect( const Reference< XInterface >& _rxIntrospectee ) throw (RuntimeException, NullPointerException)
560cdf0e10cSrcweir {
561cdf0e10cSrcweir ::osl::MutexGuard aGuard( m_aMutex );
562cdf0e10cSrcweir
563cdf0e10cSrcweir if ( !_rxIntrospectee.is() )
564cdf0e10cSrcweir throw NullPointerException();
565cdf0e10cSrcweir
566cdf0e10cSrcweir m_xComponent = Reference< XPropertySet >( _rxIntrospectee, UNO_QUERY_THROW );
567cdf0e10cSrcweir
568cdf0e10cSrcweir m_bEventsMapInitialized = false;
569cdf0e10cSrcweir EventMap aEmpty;
570cdf0e10cSrcweir m_aEvents.swap( aEmpty );
571cdf0e10cSrcweir
572cdf0e10cSrcweir m_bIsDialogElement = false;
573cdf0e10cSrcweir m_nGridColumnType = -1;
574cdf0e10cSrcweir try
575cdf0e10cSrcweir {
576cdf0e10cSrcweir Reference< XPropertySetInfo > xPSI( m_xComponent->getPropertySetInfo() );
577cdf0e10cSrcweir m_bIsDialogElement = xPSI.is()
578cdf0e10cSrcweir && xPSI->hasPropertyByName( PROPERTY_WIDTH )
579cdf0e10cSrcweir && xPSI->hasPropertyByName( PROPERTY_HEIGHT )
580cdf0e10cSrcweir && xPSI->hasPropertyByName( PROPERTY_POSITIONX )
581cdf0e10cSrcweir && xPSI->hasPropertyByName( PROPERTY_POSITIONY );
582cdf0e10cSrcweir
583cdf0e10cSrcweir Reference< XChild > xAsChild( _rxIntrospectee, UNO_QUERY );
584cdf0e10cSrcweir if ( xAsChild.is() && !Reference< XForm >( _rxIntrospectee, UNO_QUERY ).is() )
585cdf0e10cSrcweir {
586cdf0e10cSrcweir if ( FormComponentType::GRIDCONTROL == classifyComponent( xAsChild->getParent() ) )
587cdf0e10cSrcweir {
588cdf0e10cSrcweir m_nGridColumnType = classifyComponent( _rxIntrospectee );
589cdf0e10cSrcweir }
590cdf0e10cSrcweir }
591cdf0e10cSrcweir }
592cdf0e10cSrcweir catch( const Exception& )
593cdf0e10cSrcweir {
594cdf0e10cSrcweir DBG_UNHANDLED_EXCEPTION();
595cdf0e10cSrcweir }
596cdf0e10cSrcweir }
597cdf0e10cSrcweir
598cdf0e10cSrcweir //--------------------------------------------------------------------
getPropertyValue(const::rtl::OUString & _rPropertyName)599cdf0e10cSrcweir Any SAL_CALL EventHandler::getPropertyValue( const ::rtl::OUString& _rPropertyName ) throw (UnknownPropertyException, RuntimeException)
600cdf0e10cSrcweir {
601cdf0e10cSrcweir ::osl::MutexGuard aGuard( m_aMutex );
602cdf0e10cSrcweir
603cdf0e10cSrcweir const EventDescription& rEvent = impl_getEventForName_throw( _rPropertyName );
604cdf0e10cSrcweir
605cdf0e10cSrcweir Sequence< ScriptEventDescriptor > aEvents;
606cdf0e10cSrcweir impl_getComponentScriptEvents_nothrow( aEvents );
607cdf0e10cSrcweir
608cdf0e10cSrcweir sal_Int32 nEventCount = aEvents.getLength();
609cdf0e10cSrcweir const ScriptEventDescriptor* pEvents = aEvents.getConstArray();
610cdf0e10cSrcweir
611cdf0e10cSrcweir ScriptEventDescriptor aPropertyValue;
612cdf0e10cSrcweir for ( sal_Int32 event = 0; event < nEventCount; ++event, ++pEvents )
613cdf0e10cSrcweir {
614cdf0e10cSrcweir if ( rEvent.sListenerClassName == pEvents->ListenerType
615cdf0e10cSrcweir && rEvent.sListenerMethodName == pEvents->EventMethod
616cdf0e10cSrcweir )
617cdf0e10cSrcweir {
618cdf0e10cSrcweir aPropertyValue = *pEvents;
619cdf0e10cSrcweir break;
620cdf0e10cSrcweir }
621cdf0e10cSrcweir }
622cdf0e10cSrcweir
623cdf0e10cSrcweir return makeAny( aPropertyValue );
624cdf0e10cSrcweir }
625cdf0e10cSrcweir
626cdf0e10cSrcweir //--------------------------------------------------------------------
setPropertyValue(const::rtl::OUString & _rPropertyName,const Any & _rValue)627cdf0e10cSrcweir void SAL_CALL EventHandler::setPropertyValue( const ::rtl::OUString& _rPropertyName, const Any& _rValue ) throw (UnknownPropertyException, RuntimeException)
628cdf0e10cSrcweir {
629cdf0e10cSrcweir ::osl::MutexGuard aGuard( m_aMutex );
630cdf0e10cSrcweir
631cdf0e10cSrcweir const EventDescription& rEvent = impl_getEventForName_throw( _rPropertyName );
632cdf0e10cSrcweir
633cdf0e10cSrcweir ScriptEventDescriptor aNewScriptEvent;
634cdf0e10cSrcweir OSL_VERIFY( _rValue >>= aNewScriptEvent );
635cdf0e10cSrcweir
636cdf0e10cSrcweir ScriptEventDescriptor aOldScriptEvent;
637cdf0e10cSrcweir OSL_VERIFY( getPropertyValue( _rPropertyName ) >>= aOldScriptEvent );
638cdf0e10cSrcweir if ( aOldScriptEvent == aNewScriptEvent )
639cdf0e10cSrcweir return;
640cdf0e10cSrcweir
641cdf0e10cSrcweir if ( m_bIsDialogElement )
642cdf0e10cSrcweir impl_setDialogElementScriptEvent_nothrow( aNewScriptEvent );
643cdf0e10cSrcweir else
644cdf0e10cSrcweir impl_setFormComponentScriptEvent_nothrow( aNewScriptEvent );
645cdf0e10cSrcweir
646cdf0e10cSrcweir Reference< XModifiable > xDoc( m_aContext.getContextValueByAsciiName( "ContextDocument" ), UNO_QUERY );
647cdf0e10cSrcweir if ( xDoc.is() )
648cdf0e10cSrcweir xDoc->setModified( sal_True );
649cdf0e10cSrcweir
650cdf0e10cSrcweir PropertyChangeEvent aEvent;
651cdf0e10cSrcweir aEvent.Source = m_xComponent;
652cdf0e10cSrcweir aEvent.PropertyHandle = rEvent.nId;
653cdf0e10cSrcweir aEvent.PropertyName = _rPropertyName;
654cdf0e10cSrcweir aEvent.OldValue <<= aOldScriptEvent;
655cdf0e10cSrcweir aEvent.NewValue <<= aNewScriptEvent;
656cdf0e10cSrcweir m_aPropertyListeners.notify( aEvent, &XPropertyChangeListener::propertyChange );
657cdf0e10cSrcweir }
658cdf0e10cSrcweir
659cdf0e10cSrcweir //--------------------------------------------------------------------
convertToPropertyValue(const::rtl::OUString & _rPropertyName,const Any & _rControlValue)660cdf0e10cSrcweir Any SAL_CALL EventHandler::convertToPropertyValue( const ::rtl::OUString& _rPropertyName, const Any& _rControlValue ) throw (UnknownPropertyException, RuntimeException)
661cdf0e10cSrcweir {
662cdf0e10cSrcweir ::osl::MutexGuard aGuard( m_aMutex );
663cdf0e10cSrcweir
664cdf0e10cSrcweir ::rtl::OUString sNewScriptCode;
665cdf0e10cSrcweir OSL_VERIFY( _rControlValue >>= sNewScriptCode );
666cdf0e10cSrcweir
667cdf0e10cSrcweir Sequence< ScriptEventDescriptor > aAllAssignedEvents;
668cdf0e10cSrcweir impl_getComponentScriptEvents_nothrow( aAllAssignedEvents );
669cdf0e10cSrcweir
670cdf0e10cSrcweir const EventDescription& rEvent = impl_getEventForName_throw( _rPropertyName );
671cdf0e10cSrcweir ScriptEventDescriptor aAssignedScript = lcl_getAssignedScriptEvent( rEvent, aAllAssignedEvents );
672cdf0e10cSrcweir
673cdf0e10cSrcweir OSL_ENSURE( !sNewScriptCode.getLength(), "EventHandler::convertToPropertyValue: cannot convert a non-empty display name!" );
674cdf0e10cSrcweir // Usually, there is no possibility for the user to change the content of an event binding directly in the
675cdf0e10cSrcweir // input field, this instead is done with the macro assignment dialog.
676cdf0e10cSrcweir // The only exception is the user pressing "DEL" while the control has the focus, in this case, we reset the
677cdf0e10cSrcweir // control content to an empty string. So this is the only scenario where this method is allowed to be called.
678cdf0e10cSrcweir
679cdf0e10cSrcweir // Striclty, we would be able to convert the display value to a property value,
680cdf0e10cSrcweir // using the "name (location, language)" format we used in convertToControlValue. However,
681cdf0e10cSrcweir // there is no need for this code ...
682cdf0e10cSrcweir
683cdf0e10cSrcweir aAssignedScript.ScriptCode = sNewScriptCode;
684cdf0e10cSrcweir return makeAny( aAssignedScript );
685cdf0e10cSrcweir }
686cdf0e10cSrcweir
687cdf0e10cSrcweir //--------------------------------------------------------------------
convertToControlValue(const::rtl::OUString &,const Any & _rPropertyValue,const Type & _rControlValueType)688cdf0e10cSrcweir Any SAL_CALL EventHandler::convertToControlValue( const ::rtl::OUString& /*_rPropertyName*/, const Any& _rPropertyValue, const Type& _rControlValueType ) throw (UnknownPropertyException, RuntimeException)
689cdf0e10cSrcweir {
690cdf0e10cSrcweir ::osl::MutexGuard aGuard( m_aMutex );
691cdf0e10cSrcweir
692cdf0e10cSrcweir ScriptEventDescriptor aScriptEvent;
693cdf0e10cSrcweir OSL_VERIFY( _rPropertyValue >>= aScriptEvent );
694cdf0e10cSrcweir
695cdf0e10cSrcweir OSL_ENSURE( _rControlValueType.getTypeClass() == TypeClass_STRING,
696cdf0e10cSrcweir "EventHandler::convertToControlValue: unexpected ControlValue type class!" );
697cdf0e10cSrcweir (void)_rControlValueType;
698cdf0e10cSrcweir
699cdf0e10cSrcweir ::rtl::OUString sScript( aScriptEvent.ScriptCode );
700cdf0e10cSrcweir if ( sScript.getLength() )
701cdf0e10cSrcweir {
702cdf0e10cSrcweir // format is: "name (location, language)"
703cdf0e10cSrcweir try
704cdf0e10cSrcweir {
705cdf0e10cSrcweir // parse
706cdf0e10cSrcweir Reference< XUriReferenceFactory > xUriRefFac = UriReferenceFactory::create( m_aContext.getUNOContext() );
707cdf0e10cSrcweir Reference< XVndSunStarScriptUrlReference > xScriptUri( xUriRefFac->parse( sScript ), UNO_QUERY_THROW );
708cdf0e10cSrcweir
709cdf0e10cSrcweir ::rtl::OUStringBuffer aComposeBuffer;
710cdf0e10cSrcweir
711cdf0e10cSrcweir // name
712cdf0e10cSrcweir aComposeBuffer.append( xScriptUri->getName() );
713cdf0e10cSrcweir
714cdf0e10cSrcweir // location
715cdf0e10cSrcweir const ::rtl::OUString sLocationParamName( RTL_CONSTASCII_USTRINGPARAM( "location" ) );
716cdf0e10cSrcweir const ::rtl::OUString sLocation = xScriptUri->getParameter( sLocationParamName );
717cdf0e10cSrcweir const ::rtl::OUString sLangParamName( RTL_CONSTASCII_USTRINGPARAM( "language" ) );
718cdf0e10cSrcweir const ::rtl::OUString sLanguage = xScriptUri->getParameter( sLangParamName );
719cdf0e10cSrcweir
720cdf0e10cSrcweir if ( sLocation.getLength() || sLanguage.getLength() )
721cdf0e10cSrcweir {
722cdf0e10cSrcweir aComposeBuffer.appendAscii( " (" );
723cdf0e10cSrcweir
724cdf0e10cSrcweir // location
725cdf0e10cSrcweir OSL_ENSURE( sLocation.getLength(), "EventHandler::convertToControlValue: unexpected: no location!" );
726cdf0e10cSrcweir if ( sLocation.getLength() )
727cdf0e10cSrcweir {
728cdf0e10cSrcweir aComposeBuffer.append( sLocation );
729cdf0e10cSrcweir aComposeBuffer.appendAscii( ", " );
730cdf0e10cSrcweir }
731cdf0e10cSrcweir
732cdf0e10cSrcweir // language
733cdf0e10cSrcweir if ( sLanguage.getLength() )
734cdf0e10cSrcweir {
735cdf0e10cSrcweir aComposeBuffer.append( sLanguage );
736cdf0e10cSrcweir }
737cdf0e10cSrcweir
738cdf0e10cSrcweir aComposeBuffer.append( sal_Unicode( ')' ) );
739cdf0e10cSrcweir }
740cdf0e10cSrcweir
741cdf0e10cSrcweir sScript = aComposeBuffer.makeStringAndClear();
742cdf0e10cSrcweir }
743cdf0e10cSrcweir catch( const Exception& )
744cdf0e10cSrcweir {
745cdf0e10cSrcweir DBG_UNHANDLED_EXCEPTION();
746cdf0e10cSrcweir }
747cdf0e10cSrcweir }
748cdf0e10cSrcweir
749cdf0e10cSrcweir return makeAny( sScript );
750cdf0e10cSrcweir }
751cdf0e10cSrcweir
752cdf0e10cSrcweir //--------------------------------------------------------------------
getPropertyState(const::rtl::OUString &)753cdf0e10cSrcweir PropertyState SAL_CALL EventHandler::getPropertyState( const ::rtl::OUString& /*_rPropertyName*/ ) throw (UnknownPropertyException, RuntimeException)
754cdf0e10cSrcweir {
755cdf0e10cSrcweir return PropertyState_DIRECT_VALUE;
756cdf0e10cSrcweir }
757cdf0e10cSrcweir
758cdf0e10cSrcweir //--------------------------------------------------------------------
addPropertyChangeListener(const Reference<XPropertyChangeListener> & _rxListener)759cdf0e10cSrcweir void SAL_CALL EventHandler::addPropertyChangeListener( const Reference< XPropertyChangeListener >& _rxListener ) throw (RuntimeException)
760cdf0e10cSrcweir {
761cdf0e10cSrcweir ::osl::MutexGuard aGuard( m_aMutex );
762cdf0e10cSrcweir if ( !_rxListener.is() )
763cdf0e10cSrcweir throw NullPointerException();
764cdf0e10cSrcweir m_aPropertyListeners.addListener( _rxListener );
765cdf0e10cSrcweir }
766cdf0e10cSrcweir
767cdf0e10cSrcweir //--------------------------------------------------------------------
removePropertyChangeListener(const Reference<XPropertyChangeListener> & _rxListener)768cdf0e10cSrcweir void SAL_CALL EventHandler::removePropertyChangeListener( const Reference< XPropertyChangeListener >& _rxListener ) throw (RuntimeException)
769cdf0e10cSrcweir {
770cdf0e10cSrcweir ::osl::MutexGuard aGuard( m_aMutex );
771cdf0e10cSrcweir m_aPropertyListeners.removeListener( _rxListener );
772cdf0e10cSrcweir }
773cdf0e10cSrcweir
774cdf0e10cSrcweir //--------------------------------------------------------------------
getSupportedProperties()775cdf0e10cSrcweir Sequence< Property > SAL_CALL EventHandler::getSupportedProperties() throw (RuntimeException)
776cdf0e10cSrcweir {
777cdf0e10cSrcweir ::osl::MutexGuard aGuard( m_aMutex );
778cdf0e10cSrcweir if ( !m_bEventsMapInitialized )
779cdf0e10cSrcweir {
780cdf0e10cSrcweir const_cast< EventHandler* >( this )->m_bEventsMapInitialized = true;
781cdf0e10cSrcweir try
782cdf0e10cSrcweir {
783cdf0e10cSrcweir Sequence< Type > aListeners;
784cdf0e10cSrcweir impl_getCopmonentListenerTypes_nothrow( aListeners );
785cdf0e10cSrcweir sal_Int32 listenerCount = aListeners.getLength();
786cdf0e10cSrcweir
787cdf0e10cSrcweir Property aCurrentProperty;
788cdf0e10cSrcweir ::rtl::OUString sListenerClassName;
789cdf0e10cSrcweir
790cdf0e10cSrcweir // loop through all listeners and all methods, and see which we can present at the UI
791cdf0e10cSrcweir const Type* pListeners = aListeners.getConstArray();
792cdf0e10cSrcweir for ( sal_Int32 listener = 0; listener < listenerCount; ++listener, ++pListeners )
793cdf0e10cSrcweir {
794cdf0e10cSrcweir aCurrentProperty = Property();
795cdf0e10cSrcweir
796cdf0e10cSrcweir // the programmatic name of the listener, to be used as "property" name
797cdf0e10cSrcweir sListenerClassName = pListeners->getTypeName();
798cdf0e10cSrcweir OSL_ENSURE( sListenerClassName.getLength(), "EventHandler::getSupportedProperties: strange - no listener name ..." );
799cdf0e10cSrcweir if ( !sListenerClassName.getLength() )
800cdf0e10cSrcweir continue;
801cdf0e10cSrcweir
802cdf0e10cSrcweir // loop through all methods
803cdf0e10cSrcweir Sequence< ::rtl::OUString > aMethods( comphelper::getEventMethodsForType( *pListeners ) );
804cdf0e10cSrcweir
805cdf0e10cSrcweir const ::rtl::OUString* pMethods = aMethods.getConstArray();
806cdf0e10cSrcweir sal_uInt32 methodCount = aMethods.getLength();
807cdf0e10cSrcweir
808cdf0e10cSrcweir for (sal_uInt32 method = 0 ; method < methodCount ; ++method, ++pMethods )
809cdf0e10cSrcweir {
810cdf0e10cSrcweir EventDescription aEvent;
811cdf0e10cSrcweir if ( !lcl_getEventDescriptionForMethod( *pMethods, aEvent ) )
812cdf0e10cSrcweir continue;
813cdf0e10cSrcweir
814cdf0e10cSrcweir if ( !impl_filterMethod_nothrow( aEvent ) )
815cdf0e10cSrcweir continue;
816cdf0e10cSrcweir
817cdf0e10cSrcweir const_cast< EventHandler* >( this )->m_aEvents.insert( EventMap::value_type(
818cdf0e10cSrcweir lcl_getEventPropertyName( sListenerClassName, *pMethods ), aEvent ) );
819cdf0e10cSrcweir }
820cdf0e10cSrcweir }
821cdf0e10cSrcweir
822cdf0e10cSrcweir }
823cdf0e10cSrcweir catch( const Exception& )
824cdf0e10cSrcweir {
825cdf0e10cSrcweir DBG_UNHANDLED_EXCEPTION();
826cdf0e10cSrcweir }
827cdf0e10cSrcweir }
828cdf0e10cSrcweir
829cdf0e10cSrcweir // sort them by ID - this is the relative ordering in the UI
830cdf0e10cSrcweir ::std::map< EventId, Property > aOrderedProperties;
831cdf0e10cSrcweir for ( EventMap::const_iterator loop = m_aEvents.begin();
832cdf0e10cSrcweir loop != m_aEvents.end();
833cdf0e10cSrcweir ++loop
834cdf0e10cSrcweir )
835cdf0e10cSrcweir {
836cdf0e10cSrcweir aOrderedProperties[ loop->second.nId ] = Property(
837cdf0e10cSrcweir loop->first, loop->second.nId,
838cdf0e10cSrcweir ::getCppuType( static_cast< const ::rtl::OUString* >( NULL ) ),
839cdf0e10cSrcweir PropertyAttribute::BOUND );
840cdf0e10cSrcweir }
841cdf0e10cSrcweir
842cdf0e10cSrcweir StlSyntaxSequence< Property > aReturn( aOrderedProperties.size() );
843cdf0e10cSrcweir ::std::transform( aOrderedProperties.begin(), aOrderedProperties.end(), aReturn.begin(),
844cdf0e10cSrcweir ::std::select2nd< ::std::map< EventId, Property >::value_type >() );
845cdf0e10cSrcweir return aReturn;
846cdf0e10cSrcweir }
847cdf0e10cSrcweir
848cdf0e10cSrcweir //--------------------------------------------------------------------
getSupersededProperties()849cdf0e10cSrcweir Sequence< ::rtl::OUString > SAL_CALL EventHandler::getSupersededProperties( ) throw (RuntimeException)
850cdf0e10cSrcweir {
851cdf0e10cSrcweir // none
852cdf0e10cSrcweir return Sequence< ::rtl::OUString >( );
853cdf0e10cSrcweir }
854cdf0e10cSrcweir
855cdf0e10cSrcweir //--------------------------------------------------------------------
getActuatingProperties()856cdf0e10cSrcweir Sequence< ::rtl::OUString > SAL_CALL EventHandler::getActuatingProperties( ) throw (RuntimeException)
857cdf0e10cSrcweir {
858cdf0e10cSrcweir // none
859cdf0e10cSrcweir return Sequence< ::rtl::OUString >( );
860cdf0e10cSrcweir }
861cdf0e10cSrcweir
862cdf0e10cSrcweir //--------------------------------------------------------------------
describePropertyLine(const::rtl::OUString & _rPropertyName,const Reference<XPropertyControlFactory> & _rxControlFactory)863cdf0e10cSrcweir LineDescriptor SAL_CALL EventHandler::describePropertyLine( const ::rtl::OUString& _rPropertyName,
864cdf0e10cSrcweir const Reference< XPropertyControlFactory >& _rxControlFactory )
865cdf0e10cSrcweir throw (UnknownPropertyException, NullPointerException, RuntimeException)
866cdf0e10cSrcweir {
867cdf0e10cSrcweir if ( !_rxControlFactory.is() )
868cdf0e10cSrcweir throw NullPointerException();
869cdf0e10cSrcweir
870cdf0e10cSrcweir ::osl::MutexGuard aGuard( m_aMutex );
871cdf0e10cSrcweir
872cdf0e10cSrcweir LineDescriptor aDescriptor;
873cdf0e10cSrcweir
874cdf0e10cSrcweir aDescriptor.Control = _rxControlFactory->createPropertyControl( PropertyControlType::TextField, sal_True );
875cdf0e10cSrcweir Reference< XEventListener > xControlExtender = new PropertyControlExtender( aDescriptor.Control );
876cdf0e10cSrcweir
877cdf0e10cSrcweir const EventDescription& rEvent = impl_getEventForName_throw( _rPropertyName );
878cdf0e10cSrcweir aDescriptor.DisplayName = rEvent.sDisplayName;
879cdf0e10cSrcweir aDescriptor.HelpURL = HelpIdUrl::getHelpURL( rEvent.sHelpId );
880cdf0e10cSrcweir aDescriptor.PrimaryButtonId = rtl::OStringToOUString(rEvent.sUniqueBrowseId, RTL_TEXTENCODING_UTF8);
881cdf0e10cSrcweir aDescriptor.HasPrimaryButton = sal_True;
882cdf0e10cSrcweir aDescriptor.Category = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Events" ) );
883cdf0e10cSrcweir return aDescriptor;
884cdf0e10cSrcweir }
885cdf0e10cSrcweir
886cdf0e10cSrcweir //--------------------------------------------------------------------
isComposable(const::rtl::OUString &)887cdf0e10cSrcweir ::sal_Bool SAL_CALL EventHandler::isComposable( const ::rtl::OUString& /*_rPropertyName*/ ) throw (UnknownPropertyException, RuntimeException)
888cdf0e10cSrcweir {
889cdf0e10cSrcweir return sal_False;
890cdf0e10cSrcweir }
891cdf0e10cSrcweir
892cdf0e10cSrcweir //--------------------------------------------------------------------
onInteractivePropertySelection(const::rtl::OUString & _rPropertyName,sal_Bool,Any &,const Reference<XObjectInspectorUI> & _rxInspectorUI)893cdf0e10cSrcweir InteractiveSelectionResult SAL_CALL EventHandler::onInteractivePropertySelection( const ::rtl::OUString& _rPropertyName, sal_Bool /*_bPrimary*/, Any& /*_rData*/, const Reference< XObjectInspectorUI >& _rxInspectorUI ) throw (UnknownPropertyException, NullPointerException, RuntimeException)
894cdf0e10cSrcweir {
895cdf0e10cSrcweir if ( !_rxInspectorUI.is() )
896cdf0e10cSrcweir throw NullPointerException();
897cdf0e10cSrcweir
898cdf0e10cSrcweir ::osl::MutexGuard aGuard( m_aMutex );
899cdf0e10cSrcweir const EventDescription& rForEvent = impl_getEventForName_throw( _rPropertyName );
900cdf0e10cSrcweir
901cdf0e10cSrcweir Sequence< ScriptEventDescriptor > aAllAssignedEvents;
902cdf0e10cSrcweir impl_getComponentScriptEvents_nothrow( aAllAssignedEvents );
903cdf0e10cSrcweir
904cdf0e10cSrcweir // SvxMacroAssignDlg-compatible structure holding all event/assignments
905cdf0e10cSrcweir ::rtl::Reference< EventHolder > pEventHolder( new EventHolder );
906cdf0e10cSrcweir
907cdf0e10cSrcweir for ( EventMap::const_iterator event = m_aEvents.begin();
908cdf0e10cSrcweir event != m_aEvents.end();
909cdf0e10cSrcweir ++event
910cdf0e10cSrcweir )
911cdf0e10cSrcweir {
912cdf0e10cSrcweir // the script which is assigned to the current event (if any)
913cdf0e10cSrcweir ScriptEventDescriptor aAssignedScript = lcl_getAssignedScriptEvent( event->second, aAllAssignedEvents );
914cdf0e10cSrcweir pEventHolder->addEvent( event->second.nId, event->second.sListenerMethodName, aAssignedScript );
915cdf0e10cSrcweir }
916cdf0e10cSrcweir
917cdf0e10cSrcweir // the inital selection in the dialog
918cdf0e10cSrcweir Sequence< ::rtl::OUString > aNames( pEventHolder->getElementNames() );
919cdf0e10cSrcweir const ::rtl::OUString* pChosenEvent = ::std::find( aNames.getConstArray(), aNames.getConstArray() + aNames.getLength(), rForEvent.sListenerMethodName );
920cdf0e10cSrcweir sal_uInt16 nInitialSelection = (sal_uInt16)( pChosenEvent - aNames.getConstArray() );
921cdf0e10cSrcweir
922cdf0e10cSrcweir // the dialog
923cdf0e10cSrcweir SvxAbstractDialogFactory* pFactory = SvxAbstractDialogFactory::Create();
924cdf0e10cSrcweir if ( !pFactory )
925cdf0e10cSrcweir return InteractiveSelectionResult_Cancelled;
926cdf0e10cSrcweir
927cdf0e10cSrcweir ::std::auto_ptr< VclAbstractDialog > pDialog( pFactory->CreateSvxMacroAssignDlg(
928cdf0e10cSrcweir PropertyHandlerHelper::getDialogParentWindow( m_aContext ),
929cdf0e10cSrcweir impl_getContextFrame_nothrow(),
930cdf0e10cSrcweir m_bIsDialogElement,
931cdf0e10cSrcweir pEventHolder.get(),
932cdf0e10cSrcweir nInitialSelection
933cdf0e10cSrcweir ) );
934cdf0e10cSrcweir
935cdf0e10cSrcweir if ( !pDialog.get() )
936cdf0e10cSrcweir return InteractiveSelectionResult_Cancelled;
937cdf0e10cSrcweir
938cdf0e10cSrcweir // DF definite problem here
939cdf0e10cSrcweir // OK & Cancel seem to be both returning 0
940cdf0e10cSrcweir if ( pDialog->Execute() == RET_CANCEL )
941cdf0e10cSrcweir return InteractiveSelectionResult_Cancelled;
942cdf0e10cSrcweir
943cdf0e10cSrcweir try
944cdf0e10cSrcweir {
945cdf0e10cSrcweir for ( EventMap::const_iterator event = m_aEvents.begin();
946cdf0e10cSrcweir event != m_aEvents.end();
947cdf0e10cSrcweir ++event
948cdf0e10cSrcweir )
949cdf0e10cSrcweir {
950cdf0e10cSrcweir ScriptEventDescriptor aScriptDescriptor( pEventHolder->getNormalizedDescriptorByName( event->second.sListenerMethodName ) );
951cdf0e10cSrcweir
952cdf0e10cSrcweir // set the new "property value"
953cdf0e10cSrcweir setPropertyValue(
954cdf0e10cSrcweir lcl_getEventPropertyName( event->second.sListenerClassName, event->second.sListenerMethodName ),
955cdf0e10cSrcweir makeAny( aScriptDescriptor )
956cdf0e10cSrcweir );
957cdf0e10cSrcweir }
958cdf0e10cSrcweir }
959cdf0e10cSrcweir catch( const Exception& )
960cdf0e10cSrcweir {
961cdf0e10cSrcweir DBG_UNHANDLED_EXCEPTION();
962cdf0e10cSrcweir }
963cdf0e10cSrcweir
964cdf0e10cSrcweir return InteractiveSelectionResult_Success;
965cdf0e10cSrcweir }
966cdf0e10cSrcweir
967cdf0e10cSrcweir //--------------------------------------------------------------------
actuatingPropertyChanged(const::rtl::OUString &,const Any &,const Any &,const Reference<XObjectInspectorUI> &,sal_Bool)968cdf0e10cSrcweir void SAL_CALL EventHandler::actuatingPropertyChanged( const ::rtl::OUString& /*_rActuatingPropertyName*/, const Any& /*_rNewValue*/, const Any& /*_rOldValue*/, const Reference< XObjectInspectorUI >& /*_rxInspectorUI*/, sal_Bool /*_bFirstTimeInit*/ ) throw (NullPointerException, RuntimeException)
969cdf0e10cSrcweir {
970cdf0e10cSrcweir DBG_ERROR( "EventHandler::actuatingPropertyChanged: no actuating properties -> no callback (well, this is how it *should* be!)" );
971cdf0e10cSrcweir }
972cdf0e10cSrcweir
973cdf0e10cSrcweir //--------------------------------------------------------------------
IMPLEMENT_FORWARD_XCOMPONENT(EventHandler,EventHandler_Base)974cdf0e10cSrcweir IMPLEMENT_FORWARD_XCOMPONENT( EventHandler, EventHandler_Base )
975cdf0e10cSrcweir
976cdf0e10cSrcweir //--------------------------------------------------------------------
977cdf0e10cSrcweir void SAL_CALL EventHandler::disposing()
978cdf0e10cSrcweir {
979cdf0e10cSrcweir EventMap aEmpty;
980cdf0e10cSrcweir m_aEvents.swap( aEmpty );
981cdf0e10cSrcweir m_xComponent.clear();
982cdf0e10cSrcweir }
983cdf0e10cSrcweir
984cdf0e10cSrcweir //--------------------------------------------------------------------
suspend(sal_Bool)985cdf0e10cSrcweir sal_Bool SAL_CALL EventHandler::suspend( sal_Bool /*_bSuspend*/ ) throw (RuntimeException)
986cdf0e10cSrcweir {
987cdf0e10cSrcweir return sal_True;
988cdf0e10cSrcweir }
989cdf0e10cSrcweir
990cdf0e10cSrcweir //------------------------------------------------------------------------
impl_getContextFrame_nothrow() const991cdf0e10cSrcweir Reference< XFrame > EventHandler::impl_getContextFrame_nothrow() const
992cdf0e10cSrcweir {
993cdf0e10cSrcweir Reference< XFrame > xContextFrame;
994cdf0e10cSrcweir
995cdf0e10cSrcweir try
996cdf0e10cSrcweir {
997cdf0e10cSrcweir Reference< XModel > xContextDocument( m_aContext.getContextValueByAsciiName( "ContextDocument" ), UNO_QUERY_THROW );
998cdf0e10cSrcweir Reference< XController > xController( xContextDocument->getCurrentController(), UNO_SET_THROW );
999cdf0e10cSrcweir xContextFrame.set( xController->getFrame(), UNO_SET_THROW );
1000cdf0e10cSrcweir }
1001cdf0e10cSrcweir catch( const Exception& )
1002cdf0e10cSrcweir {
1003cdf0e10cSrcweir DBG_UNHANDLED_EXCEPTION();
1004cdf0e10cSrcweir }
1005cdf0e10cSrcweir
1006cdf0e10cSrcweir return xContextFrame;
1007cdf0e10cSrcweir }
1008cdf0e10cSrcweir
1009cdf0e10cSrcweir //--------------------------------------------------------------------
impl_getComponentIndexInParent_throw() const1010cdf0e10cSrcweir sal_Int32 EventHandler::impl_getComponentIndexInParent_throw() const
1011cdf0e10cSrcweir {
1012cdf0e10cSrcweir Reference< XChild > xChild( m_xComponent, UNO_QUERY_THROW );
1013cdf0e10cSrcweir Reference< XIndexAccess > xParentAsIndexAccess( xChild->getParent(), UNO_QUERY_THROW );
1014cdf0e10cSrcweir
1015cdf0e10cSrcweir // get the index of the inspected object within it's parent container
1016cdf0e10cSrcweir sal_Int32 nElements = xParentAsIndexAccess->getCount();
1017cdf0e10cSrcweir for ( sal_Int32 i=0; i<nElements; ++i )
1018cdf0e10cSrcweir {
1019cdf0e10cSrcweir Reference< XInterface > xElement( xParentAsIndexAccess->getByIndex( i ), UNO_QUERY_THROW );
1020cdf0e10cSrcweir if ( xElement == m_xComponent )
1021cdf0e10cSrcweir return i;
1022cdf0e10cSrcweir }
1023cdf0e10cSrcweir throw NoSuchElementException();
1024cdf0e10cSrcweir }
1025cdf0e10cSrcweir
1026cdf0e10cSrcweir //--------------------------------------------------------------------
impl_getFormComponentScriptEvents_nothrow(Sequence<ScriptEventDescriptor> & _out_rEvents) const1027cdf0e10cSrcweir void EventHandler::impl_getFormComponentScriptEvents_nothrow( Sequence < ScriptEventDescriptor >& _out_rEvents ) const
1028cdf0e10cSrcweir {
1029cdf0e10cSrcweir _out_rEvents = Sequence < ScriptEventDescriptor >();
1030cdf0e10cSrcweir try
1031cdf0e10cSrcweir {
1032cdf0e10cSrcweir Reference< XChild > xChild( m_xComponent, UNO_QUERY_THROW );
1033cdf0e10cSrcweir Reference< XEventAttacherManager > xEventManager( xChild->getParent(), UNO_QUERY_THROW );
1034cdf0e10cSrcweir _out_rEvents = xEventManager->getScriptEvents( impl_getComponentIndexInParent_throw() );
1035cdf0e10cSrcweir
1036cdf0e10cSrcweir // the form component script API has unqualified listener names, but for normalization
1037cdf0e10cSrcweir // purpose, we want fully qualified ones
1038cdf0e10cSrcweir ScriptEventDescriptor* pEvents = _out_rEvents.getArray();
1039cdf0e10cSrcweir ScriptEventDescriptor* pEventsEnd = _out_rEvents.getArray() + _out_rEvents.getLength();
1040cdf0e10cSrcweir while ( pEvents != pEventsEnd )
1041cdf0e10cSrcweir {
1042cdf0e10cSrcweir pEvents->ListenerType = lcl_getQualifiedKnownListenerName( *pEvents );
1043cdf0e10cSrcweir ++pEvents;
1044cdf0e10cSrcweir }
1045cdf0e10cSrcweir }
1046cdf0e10cSrcweir catch( const Exception& )
1047cdf0e10cSrcweir {
1048cdf0e10cSrcweir DBG_UNHANDLED_EXCEPTION();
1049cdf0e10cSrcweir }
1050cdf0e10cSrcweir }
1051cdf0e10cSrcweir
1052cdf0e10cSrcweir //--------------------------------------------------------------------
impl_getCopmonentListenerTypes_nothrow(Sequence<Type> & _out_rTypes) const1053cdf0e10cSrcweir void EventHandler::impl_getCopmonentListenerTypes_nothrow( Sequence< Type >& _out_rTypes ) const
1054cdf0e10cSrcweir {
1055cdf0e10cSrcweir _out_rTypes.realloc( 0 );
1056cdf0e10cSrcweir try
1057cdf0e10cSrcweir {
1058cdf0e10cSrcweir // we use a set to avoid duplicates
1059cdf0e10cSrcweir TypeBag aListeners;
1060cdf0e10cSrcweir
1061cdf0e10cSrcweir Reference< XIntrospection > xIntrospection( m_aContext.createComponent( "com.sun.star.beans.Introspection" ), UNO_QUERY_THROW );
1062cdf0e10cSrcweir
1063cdf0e10cSrcweir // --- model listeners
1064cdf0e10cSrcweir lcl_addListenerTypesFor_throw(
1065cdf0e10cSrcweir m_xComponent, xIntrospection, aListeners );
1066cdf0e10cSrcweir
1067cdf0e10cSrcweir // --- "secondary component" (usually: "control" listeners)
1068cdf0e10cSrcweir {
1069cdf0e10cSrcweir Reference< XInterface > xSecondaryComponent( impl_getSecondaryComponentForEventInspection_throw() );
1070cdf0e10cSrcweir lcl_addListenerTypesFor_throw( xSecondaryComponent, xIntrospection, aListeners );
1071cdf0e10cSrcweir ::comphelper::disposeComponent( xSecondaryComponent );
1072cdf0e10cSrcweir }
1073cdf0e10cSrcweir
1074cdf0e10cSrcweir // now that they're disambiguated, copy these types into our member
1075cdf0e10cSrcweir _out_rTypes.realloc( aListeners.size() );
1076cdf0e10cSrcweir ::std::copy( aListeners.begin(), aListeners.end(), _out_rTypes.getArray() );
1077cdf0e10cSrcweir }
1078cdf0e10cSrcweir catch( const Exception& )
1079cdf0e10cSrcweir {
1080cdf0e10cSrcweir DBG_UNHANDLED_EXCEPTION();
1081cdf0e10cSrcweir }
1082cdf0e10cSrcweir }
1083cdf0e10cSrcweir
1084cdf0e10cSrcweir //--------------------------------------------------------------------
impl_getDialogElementScriptEvents_nothrow(Sequence<ScriptEventDescriptor> & _out_rEvents) const1085cdf0e10cSrcweir void EventHandler::impl_getDialogElementScriptEvents_nothrow( Sequence < ScriptEventDescriptor >& _out_rEvents ) const
1086cdf0e10cSrcweir {
1087cdf0e10cSrcweir _out_rEvents = Sequence < ScriptEventDescriptor >();
1088cdf0e10cSrcweir try
1089cdf0e10cSrcweir {
1090cdf0e10cSrcweir Reference< XScriptEventsSupplier > xEventsSupplier( m_xComponent, UNO_QUERY_THROW );
1091cdf0e10cSrcweir Reference< XNameContainer > xEvents( xEventsSupplier->getEvents(), UNO_QUERY_THROW );
1092cdf0e10cSrcweir Sequence< ::rtl::OUString > aEventNames( xEvents->getElementNames() );
1093cdf0e10cSrcweir
1094cdf0e10cSrcweir sal_Int32 nEventCount = aEventNames.getLength();
1095cdf0e10cSrcweir _out_rEvents.realloc( nEventCount );
1096cdf0e10cSrcweir
1097cdf0e10cSrcweir const ::rtl::OUString* pNames = aEventNames.getConstArray();
1098cdf0e10cSrcweir ScriptEventDescriptor* pDescs = _out_rEvents.getArray();
1099cdf0e10cSrcweir
1100cdf0e10cSrcweir for( sal_Int32 i = 0 ; i < nEventCount ; ++i, ++pNames, ++pDescs )
1101cdf0e10cSrcweir OSL_VERIFY( xEvents->getByName( *pNames ) >>= *pDescs );
1102cdf0e10cSrcweir }
1103cdf0e10cSrcweir catch( const Exception& )
1104cdf0e10cSrcweir {
1105cdf0e10cSrcweir DBG_UNHANDLED_EXCEPTION();
1106cdf0e10cSrcweir }
1107cdf0e10cSrcweir }
1108cdf0e10cSrcweir
1109cdf0e10cSrcweir //--------------------------------------------------------------------
impl_getSecondaryComponentForEventInspection_throw() const1110cdf0e10cSrcweir Reference< XInterface > EventHandler::impl_getSecondaryComponentForEventInspection_throw( ) const
1111cdf0e10cSrcweir {
1112cdf0e10cSrcweir Reference< XInterface > xReturn;
1113cdf0e10cSrcweir
1114cdf0e10cSrcweir // if it's a form, create a form controller for the additional events
1115cdf0e10cSrcweir Reference< XForm > xComponentAsForm( m_xComponent, UNO_QUERY );
1116cdf0e10cSrcweir if ( xComponentAsForm.is() )
1117cdf0e10cSrcweir {
1118cdf0e10cSrcweir Reference< XTabControllerModel > xComponentAsTCModel( m_xComponent, UNO_QUERY_THROW );
1119cdf0e10cSrcweir Reference< XFormController > xController(
1120cdf0e10cSrcweir m_aContext.createComponent( "com.sun.star.form.runtime.FormController" ), UNO_QUERY_THROW );
1121cdf0e10cSrcweir xController->setModel( xComponentAsTCModel );
1122cdf0e10cSrcweir
1123cdf0e10cSrcweir xReturn = xController;
1124cdf0e10cSrcweir }
1125cdf0e10cSrcweir else
1126cdf0e10cSrcweir {
1127cdf0e10cSrcweir ::rtl::OUString sControlService;
1128cdf0e10cSrcweir OSL_VERIFY( m_xComponent->getPropertyValue( PROPERTY_DEFAULTCONTROL ) >>= sControlService );
1129cdf0e10cSrcweir
1130cdf0e10cSrcweir xReturn = m_aContext.createComponent( sControlService );
1131cdf0e10cSrcweir }
1132cdf0e10cSrcweir return xReturn;
1133cdf0e10cSrcweir }
1134cdf0e10cSrcweir
1135cdf0e10cSrcweir //--------------------------------------------------------------------
impl_getEventForName_throw(const::rtl::OUString & _rPropertyName) const1136cdf0e10cSrcweir const EventDescription& EventHandler::impl_getEventForName_throw( const ::rtl::OUString& _rPropertyName ) const
1137cdf0e10cSrcweir {
1138cdf0e10cSrcweir EventMap::const_iterator pos = m_aEvents.find( _rPropertyName );
1139cdf0e10cSrcweir if ( pos == m_aEvents.end() )
1140cdf0e10cSrcweir throw UnknownPropertyException();
1141cdf0e10cSrcweir return pos->second;
1142cdf0e10cSrcweir }
1143cdf0e10cSrcweir
1144cdf0e10cSrcweir //--------------------------------------------------------------------
1145cdf0e10cSrcweir namespace
1146cdf0e10cSrcweir {
lcl_endsWith(const::rtl::OUString & _rText,const::rtl::OUString & _rCheck)1147cdf0e10cSrcweir static bool lcl_endsWith( const ::rtl::OUString& _rText, const ::rtl::OUString& _rCheck )
1148cdf0e10cSrcweir {
1149cdf0e10cSrcweir sal_Int32 nTextLen = _rText.getLength();
1150cdf0e10cSrcweir sal_Int32 nCheckLen = _rCheck.getLength();
1151cdf0e10cSrcweir if ( nCheckLen > nTextLen )
1152cdf0e10cSrcweir return false;
1153cdf0e10cSrcweir
1154cdf0e10cSrcweir return _rText.indexOf( _rCheck ) == ( nTextLen - nCheckLen );
1155cdf0e10cSrcweir }
1156cdf0e10cSrcweir }
1157cdf0e10cSrcweir //--------------------------------------------------------------------
impl_setFormComponentScriptEvent_nothrow(const ScriptEventDescriptor & _rScriptEvent)1158cdf0e10cSrcweir void EventHandler::impl_setFormComponentScriptEvent_nothrow( const ScriptEventDescriptor& _rScriptEvent )
1159cdf0e10cSrcweir {
1160cdf0e10cSrcweir try
1161cdf0e10cSrcweir {
1162cdf0e10cSrcweir ::rtl::OUString sScriptCode( _rScriptEvent.ScriptCode );
1163cdf0e10cSrcweir ::rtl::OUString sScriptType( _rScriptEvent.ScriptType );
1164cdf0e10cSrcweir bool bResetScript = ( sScriptCode.getLength() == 0 );
1165cdf0e10cSrcweir
1166cdf0e10cSrcweir sal_Int32 nObjectIndex = impl_getComponentIndexInParent_throw();
1167cdf0e10cSrcweir Reference< XChild > xChild( m_xComponent, UNO_QUERY_THROW );
1168cdf0e10cSrcweir Reference< XEventAttacherManager > xEventManager( xChild->getParent(), UNO_QUERY_THROW );
1169cdf0e10cSrcweir Sequence< ScriptEventDescriptor > aEvents( xEventManager->getScriptEvents( nObjectIndex ) );
1170cdf0e10cSrcweir
1171cdf0e10cSrcweir // is there already a registered script for this event?
1172cdf0e10cSrcweir ScriptEventDescriptor* pEvent = aEvents.getArray();
1173cdf0e10cSrcweir sal_Int32 eventCount = aEvents.getLength(), event = 0;
1174cdf0e10cSrcweir for ( event = 0; event < eventCount; ++event, ++pEvent )
1175cdf0e10cSrcweir {
1176cdf0e10cSrcweir if ( ( pEvent->EventMethod == _rScriptEvent.EventMethod )
1177cdf0e10cSrcweir && ( lcl_endsWith( _rScriptEvent.ListenerType, pEvent->ListenerType ) )
1178cdf0e10cSrcweir // (strange enough, the events we get from getScriptEvents are not fully qualified)
1179cdf0e10cSrcweir )
1180cdf0e10cSrcweir {
1181cdf0e10cSrcweir // yes
1182cdf0e10cSrcweir if ( !bResetScript )
1183cdf0e10cSrcweir {
1184cdf0e10cSrcweir // set to something non-empty -> overwrite
1185cdf0e10cSrcweir pEvent->ScriptCode = sScriptCode;
1186cdf0e10cSrcweir pEvent->ScriptType = sScriptType;
1187cdf0e10cSrcweir }
1188cdf0e10cSrcweir else
1189cdf0e10cSrcweir {
1190cdf0e10cSrcweir // set to empty -> remove from sequence
1191cdf0e10cSrcweir ::std::copy( pEvent + 1, aEvents.getArray() + eventCount, pEvent );
1192cdf0e10cSrcweir aEvents.realloc( eventCount - 1 );
1193cdf0e10cSrcweir --eventCount;
1194cdf0e10cSrcweir }
1195cdf0e10cSrcweir break;
1196cdf0e10cSrcweir }
1197cdf0e10cSrcweir }
1198cdf0e10cSrcweir if ( ( event >= eventCount ) && !bResetScript )
1199cdf0e10cSrcweir {
1200cdf0e10cSrcweir // no, did not find it -> append
1201cdf0e10cSrcweir aEvents.realloc( eventCount + 1 );
1202cdf0e10cSrcweir aEvents[ eventCount ] = _rScriptEvent;
1203cdf0e10cSrcweir }
1204cdf0e10cSrcweir
1205cdf0e10cSrcweir xEventManager->revokeScriptEvents( nObjectIndex );
1206cdf0e10cSrcweir xEventManager->registerScriptEvents( nObjectIndex, aEvents );
1207cdf0e10cSrcweir
1208cdf0e10cSrcweir PropertyHandlerHelper::setContextDocumentModified( m_aContext );
1209cdf0e10cSrcweir }
1210cdf0e10cSrcweir catch( const Exception& )
1211cdf0e10cSrcweir {
1212cdf0e10cSrcweir DBG_UNHANDLED_EXCEPTION();
1213cdf0e10cSrcweir }
1214cdf0e10cSrcweir }
1215cdf0e10cSrcweir
1216cdf0e10cSrcweir //--------------------------------------------------------------------
impl_setDialogElementScriptEvent_nothrow(const ScriptEventDescriptor & _rScriptEvent)1217cdf0e10cSrcweir void EventHandler::impl_setDialogElementScriptEvent_nothrow( const ScriptEventDescriptor& _rScriptEvent )
1218cdf0e10cSrcweir {
1219cdf0e10cSrcweir try
1220cdf0e10cSrcweir {
1221cdf0e10cSrcweir ::rtl::OUString sScriptCode( _rScriptEvent.ScriptCode );
1222cdf0e10cSrcweir bool bResetScript = ( sScriptCode.getLength() == 0 );
1223cdf0e10cSrcweir
1224cdf0e10cSrcweir Reference< XScriptEventsSupplier > xEventsSupplier( m_xComponent, UNO_QUERY_THROW );
1225cdf0e10cSrcweir Reference< XNameContainer > xEvents( xEventsSupplier->getEvents(), UNO_QUERY_THROW );
1226cdf0e10cSrcweir
1227cdf0e10cSrcweir ::rtl::OUStringBuffer aCompleteName;
1228cdf0e10cSrcweir aCompleteName.append( _rScriptEvent.ListenerType );
1229cdf0e10cSrcweir aCompleteName.appendAscii( "::" );
1230cdf0e10cSrcweir aCompleteName.append( _rScriptEvent.EventMethod );
1231cdf0e10cSrcweir ::rtl::OUString sCompleteName( aCompleteName.makeStringAndClear() );
1232cdf0e10cSrcweir
1233cdf0e10cSrcweir bool bExists = xEvents->hasByName( sCompleteName );
1234cdf0e10cSrcweir
1235cdf0e10cSrcweir if ( bResetScript )
1236cdf0e10cSrcweir {
1237cdf0e10cSrcweir if ( bExists )
1238cdf0e10cSrcweir xEvents->removeByName( sCompleteName );
1239cdf0e10cSrcweir }
1240cdf0e10cSrcweir else
1241cdf0e10cSrcweir {
1242cdf0e10cSrcweir Any aNewValue; aNewValue <<= _rScriptEvent;
1243cdf0e10cSrcweir
1244cdf0e10cSrcweir if ( bExists )
1245cdf0e10cSrcweir xEvents->replaceByName( sCompleteName, aNewValue );
1246cdf0e10cSrcweir else
1247cdf0e10cSrcweir xEvents->insertByName( sCompleteName, aNewValue );
1248cdf0e10cSrcweir }
1249cdf0e10cSrcweir }
1250cdf0e10cSrcweir catch( const Exception& )
1251cdf0e10cSrcweir {
1252cdf0e10cSrcweir DBG_UNHANDLED_EXCEPTION();
1253cdf0e10cSrcweir }
1254cdf0e10cSrcweir }
1255cdf0e10cSrcweir
1256cdf0e10cSrcweir //--------------------------------------------------------------------
impl_filterMethod_nothrow(const EventDescription & _rEvent) const1257cdf0e10cSrcweir bool EventHandler::impl_filterMethod_nothrow( const EventDescription& _rEvent ) const
1258cdf0e10cSrcweir {
1259cdf0e10cSrcweir // some (control-triggered) events do not make sense for certain grid control columns. However,
1260cdf0e10cSrcweir // our mechnism to retrieve control-triggered events does not know about this, so we do some
1261cdf0e10cSrcweir // late filtering here.
1262cdf0e10cSrcweir switch ( m_nGridColumnType )
1263cdf0e10cSrcweir {
1264cdf0e10cSrcweir case FormComponentType::COMBOBOX:
1265cdf0e10cSrcweir if ( UID_BRWEVT_ACTIONPERFORMED == _rEvent.sUniqueBrowseId )
1266cdf0e10cSrcweir return false;
1267cdf0e10cSrcweir break;
1268cdf0e10cSrcweir case FormComponentType::LISTBOX:
1269cdf0e10cSrcweir if ( ( UID_BRWEVT_CHANGED == _rEvent.sUniqueBrowseId )
1270cdf0e10cSrcweir || ( UID_BRWEVT_ACTIONPERFORMED == _rEvent.sUniqueBrowseId )
1271cdf0e10cSrcweir )
1272cdf0e10cSrcweir return false;
1273cdf0e10cSrcweir break;
1274cdf0e10cSrcweir }
1275cdf0e10cSrcweir
1276cdf0e10cSrcweir return true;
1277cdf0e10cSrcweir }
1278cdf0e10cSrcweir
1279cdf0e10cSrcweir //........................................................................
1280cdf0e10cSrcweir } // namespace pcr
1281cdf0e10cSrcweir //........................................................................
1282cdf0e10cSrcweir
1283