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 #ifndef EXTENSIONS_SOURCE_PROPCTRLR_EVENTHANDLER_HXX 25 #define EXTENSIONS_SOURCE_PROPCTRLR_EVENTHANDLER_HXX 26 27 #include "pcrcomponentcontext.hxx" 28 #include "pcrcommontypes.hxx" 29 #include "pcrcommon.hxx" 30 31 /** === begin UNO includes === **/ 32 #include <com/sun/star/script/ScriptEventDescriptor.hpp> 33 #include <com/sun/star/lang/XServiceInfo.hpp> 34 #include <com/sun/star/inspection/XPropertyHandler.hpp> 35 #include <com/sun/star/beans/XPropertySet.hpp> 36 #include <com/sun/star/frame/XFrame.hpp> 37 /** === end UNO includes === **/ 38 #include <cppuhelper/compbase2.hxx> 39 #include <comphelper/listenernotification.hxx> 40 41 //........................................................................ 42 namespace pcr 43 { 44 //........................................................................ 45 46 //==================================================================== 47 //= EventDescription 48 //==================================================================== 49 typedef sal_Int32 EventId; 50 struct EventDescription 51 { 52 public: 53 ::rtl::OUString sDisplayName; 54 ::rtl::OUString sListenerClassName; 55 ::rtl::OUString sListenerMethodName; 56 ::rtl::OString sHelpId; 57 ::rtl::OString sUniqueBrowseId; 58 EventId nId; 59 EventDescriptionpcr::EventDescription60 EventDescription() 61 :nId( 0 ) 62 { 63 } 64 65 EventDescription( 66 EventId _nId, 67 const sal_Char* _pListenerNamespaceAscii, 68 const sal_Char* _pListenerClassAsciiName, 69 const sal_Char* _pListenerMethodAsciiName, 70 sal_uInt16 _nDisplayNameResId, 71 const rtl::OString& _sHelpId, 72 const rtl::OString& _sUniqueBrowseId ); 73 }; 74 75 typedef ::std::hash_map< ::rtl::OUString, EventDescription, ::rtl::OUStringHash > EventMap; 76 77 //==================================================================== 78 //= EventHandler 79 //==================================================================== 80 typedef ::cppu::WeakComponentImplHelper2 < ::com::sun::star::inspection::XPropertyHandler 81 , ::com::sun::star::lang::XServiceInfo 82 > EventHandler_Base; 83 class EventHandler : public EventHandler_Base 84 { 85 private: 86 mutable ::osl::Mutex m_aMutex; 87 88 /// the context in which the instance was created 89 ComponentContext m_aContext; 90 /// the properties of the object we're handling 91 ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > m_xComponent; 92 /// our XPropertyChangeListener(s) 93 PropertyChangeListeners m_aPropertyListeners; 94 /// cache of the events we found at our introspectee 95 EventMap m_aEvents; 96 /// has m_aEvents been initialized? 97 bool m_bEventsMapInitialized; 98 /// is our introspectee a dialog element? 99 bool m_bIsDialogElement; 100 // TODO: move different handling into different derived classes? 101 /// (FormComponent) type of the grid column being inspected, or -1 if we're not inspecting a grid column 102 sal_Int16 m_nGridColumnType; 103 104 public: 105 // XServiceInfo - static versions 106 static ::rtl::OUString SAL_CALL getImplementationName_static( ) throw (::com::sun::star::uno::RuntimeException); 107 static ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames_static( ) throw (::com::sun::star::uno::RuntimeException); 108 static ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > Create( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext >& _rxContext ); 109 110 protected: 111 EventHandler( 112 const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext >& _rxContext 113 ); 114 115 ~EventHandler(); 116 117 protected: 118 // XPropertyHandler overridables 119 virtual void SAL_CALL inspect( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _rxIntrospectee ) throw (::com::sun::star::lang::NullPointerException, ::com::sun::star::uno::RuntimeException); 120 virtual ::com::sun::star::uno::Any SAL_CALL getPropertyValue( const ::rtl::OUString& _rPropertyName ) throw (::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::uno::RuntimeException); 121 virtual void SAL_CALL setPropertyValue( const ::rtl::OUString& _rPropertyName, const ::com::sun::star::uno::Any& _rValue ) throw (::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::uno::RuntimeException); 122 virtual ::com::sun::star::uno::Any SAL_CALL convertToPropertyValue( const ::rtl::OUString& _rPropertyName, const ::com::sun::star::uno::Any& _rControlValue ) throw (::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::uno::RuntimeException); 123 virtual ::com::sun::star::uno::Any SAL_CALL convertToControlValue( const ::rtl::OUString& _rPropertyName, const ::com::sun::star::uno::Any& _rPropertyValue, const ::com::sun::star::uno::Type& _rControlValueType ) throw (::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::uno::RuntimeException); 124 virtual ::com::sun::star::beans::PropertyState SAL_CALL getPropertyState( const ::rtl::OUString& _rPropertyName ) throw (::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::uno::RuntimeException); 125 virtual void SAL_CALL addPropertyChangeListener( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& _rxListener ) throw (::com::sun::star::uno::RuntimeException); 126 virtual void SAL_CALL removePropertyChangeListener( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& _rxListener ) throw (::com::sun::star::uno::RuntimeException); 127 virtual ::com::sun::star::uno::Sequence< ::com::sun::star::beans::Property > 128 SAL_CALL getSupportedProperties() throw (::com::sun::star::uno::RuntimeException); 129 virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupersededProperties( ) throw (::com::sun::star::uno::RuntimeException); 130 virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getActuatingProperties( ) throw (::com::sun::star::uno::RuntimeException); 131 virtual ::com::sun::star::inspection::LineDescriptor SAL_CALL describePropertyLine( const ::rtl::OUString& _rPropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::inspection::XPropertyControlFactory >& _rxControlFactory ) throw (::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::NullPointerException, ::com::sun::star::uno::RuntimeException); 132 virtual ::sal_Bool SAL_CALL isComposable( const ::rtl::OUString& _rPropertyName ) throw (::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::uno::RuntimeException); 133 virtual ::com::sun::star::inspection::InteractiveSelectionResult 134 SAL_CALL onInteractivePropertySelection( const ::rtl::OUString& _rPropertyName, sal_Bool _bPrimary, ::com::sun::star::uno::Any& _rData, const ::com::sun::star::uno::Reference< ::com::sun::star::inspection::XObjectInspectorUI >& _rxInspectorUI ) throw (::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::NullPointerException, ::com::sun::star::uno::RuntimeException); 135 virtual void SAL_CALL actuatingPropertyChanged( const ::rtl::OUString& _rActuatingPropertyName, const ::com::sun::star::uno::Any& _rNewValue, const ::com::sun::star::uno::Any& _rOldValue, const ::com::sun::star::uno::Reference< ::com::sun::star::inspection::XObjectInspectorUI >& _rxInspectorUI, sal_Bool _bFirstTimeInit ) throw (::com::sun::star::lang::NullPointerException, ::com::sun::star::uno::RuntimeException); 136 virtual sal_Bool SAL_CALL suspend( sal_Bool _bSuspend ) throw (::com::sun::star::uno::RuntimeException); 137 138 // XComponent 139 DECLARE_XCOMPONENT() 140 virtual void SAL_CALL disposing(); 141 142 // XServiceInfo 143 virtual ::rtl::OUString SAL_CALL getImplementationName( ) throw (::com::sun::star::uno::RuntimeException); 144 virtual ::sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName ) throw (::com::sun::star::uno::RuntimeException); 145 virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames( ) throw (::com::sun::star::uno::RuntimeException); 146 147 private: 148 /** returns the script events associated with our introspectee 149 @param _out_rEvents 150 Takes, upon successful return, the events currently associated with the introspectee 151 @precond 152 Our introspectee is a form component 153 */ 154 void impl_getFormComponentScriptEvents_nothrow( 155 ::com::sun::star::uno::Sequence< ::com::sun::star::script::ScriptEventDescriptor >& _out_rEvents 156 ) const; 157 158 /** returns the script events associated with our introspectee 159 @param _out_rEvents 160 Takes, upon successful return, the events currently associated with the introspectee 161 @precond 162 Our introspectee is a dialog element 163 */ 164 void impl_getDialogElementScriptEvents_nothrow( 165 ::com::sun::star::uno::Sequence< ::com::sun::star::script::ScriptEventDescriptor >& _out_rEvents 166 ) const; 167 168 /** returns the script events associated with our introspectee 169 @param _out_rEvents 170 Takes, the events currently associated with the introspectee 171 */ impl_getComponentScriptEvents_nothrow(::com::sun::star::uno::Sequence<::com::sun::star::script::ScriptEventDescriptor> & _out_rEvents) const172 inline void impl_getComponentScriptEvents_nothrow( 173 ::com::sun::star::uno::Sequence< ::com::sun::star::script::ScriptEventDescriptor >& _out_rEvents 174 ) const 175 { 176 if ( m_bIsDialogElement ) 177 impl_getDialogElementScriptEvents_nothrow( _out_rEvents ); 178 else 179 impl_getFormComponentScriptEvents_nothrow( _out_rEvents ); 180 } 181 182 /** returns the types of the listeners which can be registered at our introspectee 183 @param _out_rTypes 184 Takes, upon successful return, the types of possible listeners at the introspectee 185 */ 186 void impl_getCopmonentListenerTypes_nothrow( 187 ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type >& _out_rTypes 188 ) const; 189 190 /** returns a secondary component to be used for event inspection 191 192 In the UI, we want to mix events for the control model with events for the control. 193 Since our introspectee is a model, this method creates a control for it (if possible). 194 195 @return 196 the secondary component whose events should be mixed with the introspectee's events 197 The caller takes the ownership of the component (if not <NULL/>). 198 199 @throws 200 if an unexpected error occurs during creation of the secondary component. 201 A <NULL/> component to be returned is not unexpected, but allowed 202 203 @precond 204 ->m_xComponent is not <NULL/> 205 */ 206 ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > 207 impl_getSecondaryComponentForEventInspection_throw( ) const; 208 209 /** returns the event description for the given (programmatic) property name 210 @param _rPropertyName 211 the name whose event description should be looked up 212 @return 213 the event description for the property name 214 @throws ::com::sun::star::beans::UnknownPropertyException 215 if our introspectee does not have an event with the given logical name (see ->getSupportedProperties) 216 */ 217 const EventDescription& 218 impl_getEventForName_throw( const ::rtl::OUString& _rPropertyName ) const; 219 220 /** returns the index of our component within its parent, if this parent can be 221 obtained (XChild::getParent) and supports an ->XIndexAccess interface 222 */ 223 sal_Int32 impl_getComponentIndexInParent_throw() const; 224 225 /** sets a given script event as event handler at a form component 226 227 @param _rScriptEvent 228 the script event to set 229 */ 230 void impl_setFormComponentScriptEvent_nothrow( const ::com::sun::star::script::ScriptEventDescriptor& _rScriptEvent ); 231 232 /** sets a given script event as event handler at a dialog component 233 234 @param _rScriptEvent 235 the script event to set 236 */ 237 void impl_setDialogElementScriptEvent_nothrow( const ::com::sun::star::script::ScriptEventDescriptor& _rScriptEvent ); 238 239 /** returns the frame associated with our context document 240 */ 241 ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame > 242 impl_getContextFrame_nothrow() const; 243 244 /** approves or denies a certain method to be included in the UI 245 @return 246 <TRUE/> if and only if the given method is allowed. 247 */ 248 bool impl_filterMethod_nothrow( const EventDescription& _rEvent ) const; 249 250 private: 251 EventHandler(); // never implemented 252 EventHandler( const EventHandler& ); // never implemented 253 EventHandler& operator=( const EventHandler& ); // never implemented 254 }; 255 256 //........................................................................ 257 } // namespace pcr 258 //........................................................................ 259 260 #endif // EXTENSIONS_SOURCE_PROPCTRLR_EVENTHANDLER_HXX 261 262