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_toolkit.hxx" 26 #include <com/sun/star/awt/XLayoutConstrains.hpp> 27 #include <com/sun/star/awt/XTextLayoutConstrains.hpp> 28 29 #include <toolkit/controls/unocontrolbase.hxx> 30 #include <toolkit/helper/property.hxx> 31 #include <comphelper/processfactory.hxx> 32 33 #include <tools/debug.hxx> 34 35 // ---------------------------------------------------- 36 // class UnoControlBase 37 // ---------------------------------------------------- 38 39 UnoControlBase::UnoControlBase() 40 :UnoControl( ::comphelper::getProcessServiceFactory() ) 41 { 42 OSL_ENSURE( false, "UnoControlBase::UnoControlBase: not implemented. Well, not really." ); 43 // just implemented to let the various FooImplInheritanceHelper compile, you should use the 44 // version taking a service factory 45 } 46 47 sal_Bool UnoControlBase::ImplHasProperty( sal_uInt16 nPropId ) 48 { 49 ::rtl::OUString aPropName( GetPropertyName( nPropId ) ); 50 return ImplHasProperty( aPropName ); 51 } 52 53 sal_Bool UnoControlBase::ImplHasProperty( const ::rtl::OUString& aPropertyName ) 54 { 55 ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > xPSet( mxModel, ::com::sun::star::uno::UNO_QUERY ); 56 if ( !xPSet.is() ) 57 return sal_False; 58 ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > xInfo = xPSet->getPropertySetInfo(); 59 if ( !xInfo.is() ) 60 return sal_False; 61 62 return xInfo->hasPropertyByName( aPropertyName ); 63 } 64 65 void UnoControlBase::ImplSetPropertyValues( const ::com::sun::star::uno::Sequence< ::rtl::OUString >& aPropertyNames, const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& aValues, sal_Bool bUpdateThis ) 66 { 67 ::com::sun::star::uno::Reference< ::com::sun::star::beans::XMultiPropertySet > xMPS( mxModel, ::com::sun::star::uno::UNO_QUERY ); 68 if ( !mxModel.is() ) 69 return; 70 71 DBG_ASSERT( xMPS.is(), "UnoControlBase::ImplSetPropertyValues: no multi property set interface!" ); 72 if ( xMPS.is() ) 73 { 74 if ( !bUpdateThis ) 75 ImplLockPropertyChangeNotifications( aPropertyNames, true ); 76 77 try 78 { 79 xMPS->setPropertyValues( aPropertyNames, aValues ); 80 } 81 catch( const ::com::sun::star::uno::Exception& ) 82 { 83 if ( !bUpdateThis ) 84 ImplLockPropertyChangeNotifications( aPropertyNames, false ); 85 } 86 if ( !bUpdateThis ) 87 ImplLockPropertyChangeNotifications( aPropertyNames, false ); 88 } 89 else 90 { 91 int dummy = 0; 92 (void)dummy; 93 } 94 } 95 96 void UnoControlBase::ImplSetPropertyValue( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Any& aValue, sal_Bool bUpdateThis ) 97 { 98 // Model ggf. schon abgemeldet, aber ein Event schlaegt noch zu... 99 if ( mxModel.is() ) 100 { 101 ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > xPSet( mxModel, ::com::sun::star::uno::UNO_QUERY ); 102 if ( !bUpdateThis ) 103 ImplLockPropertyChangeNotification( aPropertyName, true ); 104 105 try 106 { 107 xPSet->setPropertyValue( aPropertyName, aValue ); 108 } 109 catch( const com::sun::star::uno::Exception& ) 110 { 111 if ( !bUpdateThis ) 112 ImplLockPropertyChangeNotification( aPropertyName, false ); 113 throw; 114 } 115 if ( !bUpdateThis ) 116 ImplLockPropertyChangeNotification( aPropertyName, false ); 117 } 118 } 119 120 ::com::sun::star::uno::Any UnoControlBase::ImplGetPropertyValue( const ::rtl::OUString& aPropertyName ) 121 { 122 ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > xPSet( mxModel, ::com::sun::star::uno::UNO_QUERY ); 123 if ( xPSet.is() ) 124 return xPSet->getPropertyValue( aPropertyName ); 125 else 126 return ::com::sun::star::uno::Any(); 127 } 128 129 sal_Bool UnoControlBase::ImplGetPropertyValue_BOOL( sal_uInt16 nProp ) 130 { 131 sal_Bool b = sal_False; 132 if ( mxModel.is() ) 133 { 134 ::com::sun::star::uno::Any aVal = ImplGetPropertyValue( GetPropertyName( nProp ) ); 135 aVal >>= b; 136 } 137 return b; 138 } 139 140 sal_Int16 UnoControlBase::ImplGetPropertyValue_INT16( sal_uInt16 nProp ) 141 { 142 sal_Int16 n = 0; 143 if ( mxModel.is() ) 144 { 145 ::com::sun::star::uno::Any aVal = ImplGetPropertyValue( GetPropertyName( nProp ) ); 146 aVal >>= n; 147 } 148 return n; 149 } 150 151 sal_uInt16 UnoControlBase::ImplGetPropertyValue_UINT16( sal_uInt16 nProp ) 152 { 153 sal_uInt16 n = 0; 154 if ( mxModel.is() ) 155 { 156 ::com::sun::star::uno::Any aVal = ImplGetPropertyValue( GetPropertyName( nProp ) ); 157 aVal >>= n; 158 } 159 return n; 160 } 161 162 sal_Int32 UnoControlBase::ImplGetPropertyValue_INT32( sal_uInt16 nProp ) 163 { 164 sal_Int32 n = 0; 165 if ( mxModel.is() ) 166 { 167 ::com::sun::star::uno::Any aVal = ImplGetPropertyValue( GetPropertyName( nProp ) ); 168 aVal >>= n; 169 } 170 return n; 171 } 172 173 sal_uInt32 UnoControlBase::ImplGetPropertyValue_UINT32( sal_uInt16 nProp ) 174 { 175 sal_uInt32 n = 0; 176 if ( mxModel.is() ) 177 { 178 ::com::sun::star::uno::Any aVal = ImplGetPropertyValue( GetPropertyName( nProp ) ); 179 aVal >>= n; 180 } 181 return n; 182 } 183 184 double UnoControlBase::ImplGetPropertyValue_DOUBLE( sal_uInt16 nProp ) 185 { 186 double n = 0; 187 if ( mxModel.is() ) 188 { 189 ::com::sun::star::uno::Any aVal = ImplGetPropertyValue( GetPropertyName( nProp ) ); 190 aVal >>= n; 191 } 192 return n; 193 } 194 195 ::rtl::OUString UnoControlBase::ImplGetPropertyValue_UString( sal_uInt16 nProp ) 196 { 197 ::rtl::OUString aStr; 198 if ( mxModel.is() ) 199 { 200 ::com::sun::star::uno::Any aVal = ImplGetPropertyValue( GetPropertyName( nProp ) ); 201 aVal >>= aStr; 202 } 203 return aStr; 204 } 205 206 ::com::sun::star::awt::Size UnoControlBase::Impl_getMinimumSize() 207 { 208 ::com::sun::star::awt::Size aSz; 209 ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindowPeer > xP = ImplGetCompatiblePeer( sal_True ); 210 DBG_ASSERT( xP.is(), "Layout: No Peer!" ); 211 if ( xP.is() ) 212 { 213 ::com::sun::star::uno::Reference< ::com::sun::star::awt::XLayoutConstrains > xL( xP, ::com::sun::star::uno::UNO_QUERY ); 214 if ( xL.is() ) 215 aSz = xL->getMinimumSize(); 216 217 if ( !getPeer().is() || ( getPeer() != xP ) ) 218 xP->dispose(); 219 } 220 return aSz; 221 } 222 223 ::com::sun::star::awt::Size UnoControlBase::Impl_getPreferredSize() 224 { 225 ::com::sun::star::awt::Size aSz; 226 ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindowPeer > xP = ImplGetCompatiblePeer( sal_True ); 227 DBG_ASSERT( xP.is(), "Layout: No Peer!" ); 228 if ( xP.is() ) 229 { 230 ::com::sun::star::uno::Reference< ::com::sun::star::awt::XLayoutConstrains > xL( xP, ::com::sun::star::uno::UNO_QUERY ); 231 if ( xL.is() ) 232 aSz = xL->getPreferredSize(); 233 234 if ( !getPeer().is() || ( getPeer() != xP ) ) 235 xP->dispose(); 236 } 237 return aSz; 238 } 239 240 ::com::sun::star::awt::Size UnoControlBase::Impl_calcAdjustedSize( const ::com::sun::star::awt::Size& rNewSize ) 241 { 242 ::com::sun::star::awt::Size aSz; 243 ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindowPeer > xP = ImplGetCompatiblePeer( sal_True ); 244 DBG_ASSERT( xP.is(), "Layout: No Peer!" ); 245 if ( xP.is() ) 246 { 247 ::com::sun::star::uno::Reference< ::com::sun::star::awt::XLayoutConstrains > xL( xP, ::com::sun::star::uno::UNO_QUERY ); 248 if ( xL.is() ) 249 aSz = xL->calcAdjustedSize( rNewSize ); 250 251 if ( !getPeer().is() || ( getPeer() != xP ) ) 252 xP->dispose(); 253 } 254 return aSz; 255 } 256 257 ::com::sun::star::awt::Size UnoControlBase::Impl_getMinimumSize( sal_Int16 nCols, sal_Int16 nLines ) 258 { 259 ::com::sun::star::awt::Size aSz; 260 ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindowPeer > xP = ImplGetCompatiblePeer( sal_True ); 261 DBG_ASSERT( xP.is(), "Layout: No Peer!" ); 262 if ( xP.is() ) 263 { 264 ::com::sun::star::uno::Reference< ::com::sun::star::awt::XTextLayoutConstrains > xL( xP, ::com::sun::star::uno::UNO_QUERY ); 265 if ( xL.is() ) 266 aSz = xL->getMinimumSize( nCols, nLines ); 267 268 if ( !getPeer().is() || ( getPeer() != xP ) ) 269 xP->dispose(); 270 } 271 return aSz; 272 } 273 274 void UnoControlBase::Impl_getColumnsAndLines( sal_Int16& nCols, sal_Int16& nLines ) 275 { 276 ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindowPeer > xP = ImplGetCompatiblePeer( sal_True ); 277 DBG_ASSERT( xP.is(), "Layout: No Peer!" ); 278 if ( xP.is() ) 279 { 280 ::com::sun::star::uno::Reference< ::com::sun::star::awt::XTextLayoutConstrains > xL( xP, ::com::sun::star::uno::UNO_QUERY ); 281 if ( xL.is() ) 282 xL->getColumnsAndLines( nCols, nLines ); 283 284 if ( !getPeer().is() || ( getPeer() != xP ) ) 285 xP->dispose(); 286 } 287 } 288 289 290 291