1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3 * This file is part of the LibreOffice project.
4 *
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 *
9 * This file incorporates work covered by the following license notice:
10 *
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 */
19
20 #include <com/sun/star/awt/XLayoutConstrains.hpp>
21 #include <com/sun/star/awt/XTextLayoutConstrains.hpp>
22 #include <com/sun/star/beans/XPropertySet.hpp>
23 #include <com/sun/star/beans/XMultiPropertySet.hpp>
24
25 #include <toolkit/controls/unocontrolbase.hxx>
26 #include <toolkit/helper/property.hxx>
27
28 #include <tools/debug.hxx>
29
30 using namespace com::sun::star;
31
32
33
34
ImplHasProperty(sal_uInt16 nPropId)35 bool UnoControlBase::ImplHasProperty( sal_uInt16 nPropId )
36 {
37 const OUString& aPropName( GetPropertyName( nPropId ) );
38 return ImplHasProperty( aPropName );
39 }
40
ImplHasProperty(const OUString & aPropertyName)41 bool UnoControlBase::ImplHasProperty( const OUString& aPropertyName )
42 {
43 css::uno::Reference< css::beans::XPropertySet > xPSet( mxModel, css::uno::UNO_QUERY );
44 if ( !xPSet.is() )
45 return false;
46 css::uno::Reference< css::beans::XPropertySetInfo > xInfo = xPSet->getPropertySetInfo();
47 if ( !xInfo.is() )
48 return false;
49
50 return xInfo->hasPropertyByName( aPropertyName );
51 }
52
ImplSetPropertyValues(const css::uno::Sequence<OUString> & aPropertyNames,const css::uno::Sequence<css::uno::Any> & aValues,bool bUpdateThis)53 void UnoControlBase::ImplSetPropertyValues( const css::uno::Sequence< OUString >& aPropertyNames, const css::uno::Sequence< css::uno::Any >& aValues, bool bUpdateThis )
54 {
55 css::uno::Reference< css::beans::XMultiPropertySet > xMPS( mxModel, css::uno::UNO_QUERY );
56 if ( !mxModel.is() )
57 return;
58
59 DBG_ASSERT( xMPS.is(), "UnoControlBase::ImplSetPropertyValues: no multi property set interface!" );
60 if ( !xMPS.is() )
61 return;
62
63 if ( !bUpdateThis )
64 ImplLockPropertyChangeNotifications( aPropertyNames, true );
65
66 try
67 {
68 xMPS->setPropertyValues( aPropertyNames, aValues );
69 }
70 catch( const css::uno::Exception& )
71 {
72 if ( !bUpdateThis )
73 ImplLockPropertyChangeNotifications( aPropertyNames, false );
74 }
75 if ( !bUpdateThis )
76 ImplLockPropertyChangeNotifications( aPropertyNames, false );
77 }
78
ImplSetPropertyValue(const OUString & aPropertyName,const css::uno::Any & aValue,bool bUpdateThis)79 void UnoControlBase::ImplSetPropertyValue( const OUString& aPropertyName, const css::uno::Any& aValue, bool bUpdateThis )
80 {
81 // Model might be logged off already but an event still fires
82 if ( !mxModel.is() )
83 return;
84
85 css::uno::Reference< css::beans::XPropertySet > xPSet( mxModel, css::uno::UNO_QUERY );
86 if ( !bUpdateThis )
87 ImplLockPropertyChangeNotification( aPropertyName, true );
88
89 try
90 {
91 xPSet->setPropertyValue( aPropertyName, aValue );
92 }
93 catch( const css::uno::Exception& )
94 {
95 if ( !bUpdateThis )
96 ImplLockPropertyChangeNotification( aPropertyName, false );
97 throw;
98 }
99 if ( !bUpdateThis )
100 ImplLockPropertyChangeNotification( aPropertyName, false );
101 }
102
ImplGetPropertyValue(const OUString & aPropertyName)103 css::uno::Any UnoControlBase::ImplGetPropertyValue( const OUString& aPropertyName )
104 {
105 css::uno::Reference< css::beans::XPropertySet > xPSet( mxModel, css::uno::UNO_QUERY );
106 if ( xPSet.is() )
107 return xPSet->getPropertyValue( aPropertyName );
108 else
109 return css::uno::Any();
110 }
111
ImplGetPropertyValuePOD(sal_uInt16 nProp)112 template <typename T> T UnoControlBase::ImplGetPropertyValuePOD( sal_uInt16 nProp )
113 {
114 T t(0);
115 if ( mxModel.is() )
116 {
117 css::uno::Any aVal = ImplGetPropertyValue( GetPropertyName( nProp ) );
118 aVal >>= t;
119 }
120 return t;
121 }
122
ImplGetPropertyValueClass(sal_uInt16 nProp)123 template <typename T> T UnoControlBase::ImplGetPropertyValueClass( sal_uInt16 nProp )
124 {
125 T t;
126 if ( mxModel.is() )
127 {
128 css::uno::Any aVal = ImplGetPropertyValue( GetPropertyName( nProp ) );
129 aVal >>= t;
130 }
131 return t;
132 }
133
ImplGetPropertyValue_BOOL(sal_uInt16 nProp)134 bool UnoControlBase::ImplGetPropertyValue_BOOL( sal_uInt16 nProp )
135 {
136 return ImplGetPropertyValuePOD<bool>(nProp);
137 }
138
ImplGetPropertyValue_INT16(sal_uInt16 nProp)139 sal_Int16 UnoControlBase::ImplGetPropertyValue_INT16( sal_uInt16 nProp )
140 {
141 return ImplGetPropertyValuePOD<sal_Int16>(nProp);
142 }
143
ImplGetPropertyValue_INT32(sal_uInt16 nProp)144 sal_Int32 UnoControlBase::ImplGetPropertyValue_INT32( sal_uInt16 nProp )
145 {
146 return ImplGetPropertyValuePOD<sal_Int32>(nProp);
147 }
148
ImplGetPropertyValue_DOUBLE(sal_uInt16 nProp)149 double UnoControlBase::ImplGetPropertyValue_DOUBLE( sal_uInt16 nProp )
150 {
151 return ImplGetPropertyValuePOD<double>(nProp);
152 }
153
ImplGetPropertyValue_UString(sal_uInt16 nProp)154 OUString UnoControlBase::ImplGetPropertyValue_UString( sal_uInt16 nProp )
155 {
156 return ImplGetPropertyValueClass<OUString>(nProp);
157 }
158
ImplGetPropertyValue_Date(sal_uInt16 nProp)159 util::Date UnoControlBase::ImplGetPropertyValue_Date( sal_uInt16 nProp )
160 {
161 return ImplGetPropertyValueClass<util::Date>(nProp);
162 }
163
ImplGetPropertyValue_Time(sal_uInt16 nProp)164 util::Time UnoControlBase::ImplGetPropertyValue_Time( sal_uInt16 nProp )
165 {
166 return ImplGetPropertyValueClass<util::Time>(nProp);
167 }
168
Impl_getMinimumSize()169 css::awt::Size UnoControlBase::Impl_getMinimumSize()
170 {
171 css::awt::Size aSz;
172 css::uno::Reference< css::awt::XWindowPeer > xP = ImplGetCompatiblePeer();
173 DBG_ASSERT( xP.is(), "Layout: No Peer!" );
174 if ( xP.is() )
175 {
176 css::uno::Reference< css::awt::XLayoutConstrains > xL( xP, css::uno::UNO_QUERY );
177 if ( xL.is() )
178 aSz = xL->getMinimumSize();
179
180 if ( !getPeer().is() || ( getPeer() != xP ) )
181 xP->dispose();
182 }
183 return aSz;
184 }
185
Impl_getPreferredSize()186 css::awt::Size UnoControlBase::Impl_getPreferredSize()
187 {
188 css::awt::Size aSz;
189 css::uno::Reference< css::awt::XWindowPeer > xP = ImplGetCompatiblePeer();
190 DBG_ASSERT( xP.is(), "Layout: No Peer!" );
191 if ( xP.is() )
192 {
193 css::uno::Reference< css::awt::XLayoutConstrains > xL( xP, css::uno::UNO_QUERY );
194 if ( xL.is() )
195 aSz = xL->getPreferredSize();
196
197 if ( !getPeer().is() || ( getPeer() != xP ) )
198 xP->dispose();
199 }
200 return aSz;
201 }
202
Impl_calcAdjustedSize(const css::awt::Size & rNewSize)203 css::awt::Size UnoControlBase::Impl_calcAdjustedSize( const css::awt::Size& rNewSize )
204 {
205 css::awt::Size aSz;
206 css::uno::Reference< css::awt::XWindowPeer > xP = ImplGetCompatiblePeer();
207 DBG_ASSERT( xP.is(), "Layout: No Peer!" );
208 if ( xP.is() )
209 {
210 css::uno::Reference< css::awt::XLayoutConstrains > xL( xP, css::uno::UNO_QUERY );
211 if ( xL.is() )
212 aSz = xL->calcAdjustedSize( rNewSize );
213
214 if ( !getPeer().is() || ( getPeer() != xP ) )
215 xP->dispose();
216 }
217 return aSz;
218 }
219
Impl_getMinimumSize(sal_Int16 nCols,sal_Int16 nLines)220 css::awt::Size UnoControlBase::Impl_getMinimumSize( sal_Int16 nCols, sal_Int16 nLines )
221 {
222 css::awt::Size aSz;
223 css::uno::Reference< css::awt::XWindowPeer > xP = ImplGetCompatiblePeer();
224 DBG_ASSERT( xP.is(), "Layout: No Peer!" );
225 if ( xP.is() )
226 {
227 css::uno::Reference< css::awt::XTextLayoutConstrains > xL( xP, css::uno::UNO_QUERY );
228 if ( xL.is() )
229 aSz = xL->getMinimumSize( nCols, nLines );
230
231 if ( !getPeer().is() || ( getPeer() != xP ) )
232 xP->dispose();
233 }
234 return aSz;
235 }
236
Impl_getColumnsAndLines(sal_Int16 & nCols,sal_Int16 & nLines)237 void UnoControlBase::Impl_getColumnsAndLines( sal_Int16& nCols, sal_Int16& nLines )
238 {
239 css::uno::Reference< css::awt::XWindowPeer > xP = ImplGetCompatiblePeer();
240 DBG_ASSERT( xP.is(), "Layout: No Peer!" );
241 if ( xP.is() )
242 {
243 css::uno::Reference< css::awt::XTextLayoutConstrains > xL( xP, css::uno::UNO_QUERY );
244 if ( xL.is() )
245 xL->getColumnsAndLines( nCols, nLines );
246
247 if ( !getPeer().is() || ( getPeer() != xP ) )
248 xP->dispose();
249 }
250 }
251
252
253 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
254