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_extensions.hxx"
26 #include "buttonnavigationhandler.hxx"
27 #include "formstrings.hxx"
28 #include "formmetadata.hxx"
29 #include "pushbuttonnavigation.hxx"
30
31 /** === begin UNO includes === **/
32 /** === end UNO includes === **/
33 #include <tools/debug.hxx>
34
35 //------------------------------------------------------------------------
createRegistryInfo_ButtonNavigationHandler()36 extern "C" void SAL_CALL createRegistryInfo_ButtonNavigationHandler()
37 {
38 ::pcr::ButtonNavigationHandler::registerImplementation();
39 }
40
41 //........................................................................
42 namespace pcr
43 {
44 //........................................................................
45
46 using namespace ::com::sun::star::uno;
47 using namespace ::com::sun::star::lang;
48 using namespace ::com::sun::star::beans;
49 using namespace ::com::sun::star::script;
50 using namespace ::com::sun::star::frame;
51 using namespace ::com::sun::star::inspection;
52
53 //====================================================================
54 //= ButtonNavigationHandler
55 //====================================================================
DBG_NAME(ButtonNavigationHandler)56 DBG_NAME( ButtonNavigationHandler )
57 //--------------------------------------------------------------------
58 ButtonNavigationHandler::ButtonNavigationHandler( const Reference< XComponentContext >& _rxContext )
59 :ButtonNavigationHandler_Base( _rxContext )
60 {
61 DBG_CTOR( ButtonNavigationHandler, NULL );
62
63 m_aContext.createComponent(
64 ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.form.inspection.FormComponentPropertyHandler" ) ),
65 m_xSlaveHandler );
66 if ( !m_xSlaveHandler.is() )
67 throw RuntimeException();
68 }
69
70 //--------------------------------------------------------------------
~ButtonNavigationHandler()71 ButtonNavigationHandler::~ButtonNavigationHandler( )
72 {
73 DBG_DTOR( ButtonNavigationHandler, NULL );
74 }
75
76 //--------------------------------------------------------------------
getImplementationName_static()77 ::rtl::OUString SAL_CALL ButtonNavigationHandler::getImplementationName_static( ) throw (RuntimeException)
78 {
79 return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.extensions.ButtonNavigationHandler" ) );
80 }
81
82 //--------------------------------------------------------------------
getSupportedServiceNames_static()83 Sequence< ::rtl::OUString > SAL_CALL ButtonNavigationHandler::getSupportedServiceNames_static( ) throw (RuntimeException)
84 {
85 Sequence< ::rtl::OUString > aSupported( 1 );
86 aSupported[0] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.form.inspection.ButtonNavigationHandler" ) );
87 return aSupported;
88 }
89
90 //--------------------------------------------------------------------
inspect(const Reference<XInterface> & _rxIntrospectee)91 void SAL_CALL ButtonNavigationHandler::inspect( const Reference< XInterface >& _rxIntrospectee ) throw (RuntimeException, NullPointerException)
92 {
93 ButtonNavigationHandler_Base::inspect( _rxIntrospectee );
94 m_xSlaveHandler->inspect( _rxIntrospectee );
95 }
96
97 //--------------------------------------------------------------------
getPropertyState(const::rtl::OUString & _rPropertyName)98 PropertyState SAL_CALL ButtonNavigationHandler::getPropertyState( const ::rtl::OUString& _rPropertyName ) throw (UnknownPropertyException, RuntimeException)
99 {
100 ::osl::MutexGuard aGuard( m_aMutex );
101 PropertyId nPropId( impl_getPropertyId_throw( _rPropertyName ) );
102 PropertyState eState = PropertyState_DIRECT_VALUE;
103 switch ( nPropId )
104 {
105 case PROPERTY_ID_BUTTONTYPE:
106 {
107 PushButtonNavigation aHelper( m_xComponent );
108 eState = aHelper.getCurrentButtonTypeState();
109 }
110 break;
111 case PROPERTY_ID_TARGET_URL:
112 {
113 PushButtonNavigation aHelper( m_xComponent );
114 eState = aHelper.getCurrentTargetURLState();
115 }
116 break;
117
118 default:
119 DBG_ERROR( "ButtonNavigationHandler::getPropertyState: cannot handle this property!" );
120 break;
121 }
122
123 return eState;
124 }
125
126 //--------------------------------------------------------------------
getPropertyValue(const::rtl::OUString & _rPropertyName)127 Any SAL_CALL ButtonNavigationHandler::getPropertyValue( const ::rtl::OUString& _rPropertyName ) throw (UnknownPropertyException, RuntimeException)
128 {
129 ::osl::MutexGuard aGuard( m_aMutex );
130 PropertyId nPropId( impl_getPropertyId_throw( _rPropertyName ) );
131
132 Any aReturn;
133 switch ( nPropId )
134 {
135 case PROPERTY_ID_BUTTONTYPE:
136 {
137 PushButtonNavigation aHelper( m_xComponent );
138 aReturn = aHelper.getCurrentButtonType();
139 }
140 break;
141
142 case PROPERTY_ID_TARGET_URL:
143 {
144 PushButtonNavigation aHelper( m_xComponent );
145 aReturn = aHelper.getCurrentTargetURL();
146 }
147 break;
148
149 default:
150 DBG_ERROR( "ButtonNavigationHandler::getPropertyValue: cannot handle this property!" );
151 break;
152 }
153
154 return aReturn;
155 }
156
157 //--------------------------------------------------------------------
setPropertyValue(const::rtl::OUString & _rPropertyName,const Any & _rValue)158 void SAL_CALL ButtonNavigationHandler::setPropertyValue( const ::rtl::OUString& _rPropertyName, const Any& _rValue ) throw (UnknownPropertyException, RuntimeException)
159 {
160 ::osl::MutexGuard aGuard( m_aMutex );
161 PropertyId nPropId( impl_getPropertyId_throw( _rPropertyName ) );
162 switch ( nPropId )
163 {
164 case PROPERTY_ID_BUTTONTYPE:
165 {
166 PushButtonNavigation aHelper( m_xComponent );
167 aHelper.setCurrentButtonType( _rValue );
168 }
169 break;
170
171 case PROPERTY_ID_TARGET_URL:
172 {
173 PushButtonNavigation aHelper( m_xComponent );
174 aHelper.setCurrentTargetURL( _rValue );
175 }
176 break;
177
178 default:
179 OSL_ENSURE( sal_False, "ButtonNavigationHandler::setPropertyValue: cannot handle this id!" );
180 }
181 }
182
183 //--------------------------------------------------------------------
isNavigationCapableButton(const Reference<XPropertySet> & _rxComponent)184 bool ButtonNavigationHandler::isNavigationCapableButton( const Reference< XPropertySet >& _rxComponent )
185 {
186 Reference< XPropertySetInfo > xPSI;
187 if ( _rxComponent.is() )
188 xPSI = _rxComponent->getPropertySetInfo();
189
190 return xPSI.is()
191 && xPSI->hasPropertyByName( PROPERTY_TARGET_URL )
192 && xPSI->hasPropertyByName( PROPERTY_BUTTONTYPE );
193 }
194
195 //--------------------------------------------------------------------
doDescribeSupportedProperties() const196 Sequence< Property > SAL_CALL ButtonNavigationHandler::doDescribeSupportedProperties() const
197 {
198 ::std::vector< Property > aProperties;
199
200 if ( isNavigationCapableButton( m_xComponent ) )
201 {
202 addStringPropertyDescription( aProperties, PROPERTY_TARGET_URL );
203 implAddPropertyDescription( aProperties, PROPERTY_BUTTONTYPE, ::getCppuType( static_cast< sal_Int32* >( NULL ) ) );
204 }
205
206 if ( aProperties.empty() )
207 return Sequence< Property >();
208 return Sequence< Property >( &(*aProperties.begin()), aProperties.size() );
209 }
210
211 //--------------------------------------------------------------------
getActuatingProperties()212 Sequence< ::rtl::OUString > SAL_CALL ButtonNavigationHandler::getActuatingProperties( ) throw (RuntimeException)
213 {
214 Sequence< ::rtl::OUString > aActuating( 2 );
215 aActuating[0] = PROPERTY_BUTTONTYPE;
216 aActuating[1] = PROPERTY_TARGET_URL;
217 return aActuating;
218 }
219
220 //--------------------------------------------------------------------
onInteractivePropertySelection(const::rtl::OUString & _rPropertyName,sal_Bool _bPrimary,Any & _rData,const Reference<XObjectInspectorUI> & _rxInspectorUI)221 InteractiveSelectionResult SAL_CALL ButtonNavigationHandler::onInteractivePropertySelection( const ::rtl::OUString& _rPropertyName, sal_Bool _bPrimary, Any& _rData, const Reference< XObjectInspectorUI >& _rxInspectorUI ) throw (UnknownPropertyException, NullPointerException, RuntimeException)
222 {
223 ::osl::MutexGuard aGuard( m_aMutex );
224 PropertyId nPropId( impl_getPropertyId_throw( _rPropertyName ) );
225
226 InteractiveSelectionResult eReturn( InteractiveSelectionResult_Cancelled );
227
228 switch ( nPropId )
229 {
230 case PROPERTY_ID_TARGET_URL:
231 eReturn = m_xSlaveHandler->onInteractivePropertySelection( _rPropertyName, _bPrimary, _rData, _rxInspectorUI );
232 break;
233 default:
234 eReturn = ButtonNavigationHandler_Base::onInteractivePropertySelection( _rPropertyName, _bPrimary, _rData, _rxInspectorUI );
235 break;
236 }
237
238 return eReturn;
239 }
240
241 //--------------------------------------------------------------------
actuatingPropertyChanged(const::rtl::OUString & _rActuatingPropertyName,const Any &,const Any &,const Reference<XObjectInspectorUI> & _rxInspectorUI,sal_Bool)242 void SAL_CALL ButtonNavigationHandler::actuatingPropertyChanged( const ::rtl::OUString& _rActuatingPropertyName, const Any& /*_rNewValue*/, const Any& /*_rOldValue*/, const Reference< XObjectInspectorUI >& _rxInspectorUI, sal_Bool /*_bFirstTimeInit*/ ) throw (NullPointerException, RuntimeException)
243 {
244 ::osl::MutexGuard aGuard( m_aMutex );
245 PropertyId nPropId( impl_getPropertyId_throw( _rActuatingPropertyName ) );
246 switch ( nPropId )
247 {
248 case PROPERTY_ID_BUTTONTYPE:
249 {
250 PushButtonNavigation aHelper( m_xComponent );
251 _rxInspectorUI->enablePropertyUI( PROPERTY_TARGET_URL, aHelper.currentButtonTypeIsOpenURL() );
252 }
253 break;
254
255 case PROPERTY_ID_TARGET_URL:
256 {
257 PushButtonNavigation aHelper( m_xComponent );
258 _rxInspectorUI->enablePropertyUI( PROPERTY_TARGET_FRAME, aHelper.hasNonEmptyCurrentTargetURL() );
259 }
260 break;
261
262 default:
263 OSL_ENSURE( sal_False, "ButtonNavigationHandler::actuatingPropertyChanged: cannot handle this id!" );
264 }
265 }
266
267 //--------------------------------------------------------------------
describePropertyLine(const::rtl::OUString & _rPropertyName,const Reference<XPropertyControlFactory> & _rxControlFactory)268 LineDescriptor SAL_CALL ButtonNavigationHandler::describePropertyLine( const ::rtl::OUString& _rPropertyName, const Reference< XPropertyControlFactory >& _rxControlFactory ) throw (UnknownPropertyException, NullPointerException, RuntimeException)
269 {
270 ::osl::MutexGuard aGuard( m_aMutex );
271 PropertyId nPropId( impl_getPropertyId_throw( _rPropertyName ) );
272
273 LineDescriptor aReturn;
274
275 switch ( nPropId )
276 {
277 case PROPERTY_ID_TARGET_URL:
278 aReturn = m_xSlaveHandler->describePropertyLine( _rPropertyName, _rxControlFactory );
279 break;
280 default:
281 aReturn = ButtonNavigationHandler_Base::describePropertyLine( _rPropertyName, _rxControlFactory );
282 break;
283 }
284
285 return aReturn;
286 }
287
288 //........................................................................
289 } // namespace pcr
290 //........................................................................
291
292