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_vcl.hxx"
26 #include <com/sun/star/container/XIndexAccess.hpp>
27 #include <com/sun/star/lang/XServiceInfo.hpp>
28 #include <com/sun/star/beans/XPropertySet.hpp>
29 #include <com/sun/star/beans/PropertyAttribute.hpp>
30 #include <com/sun/star/awt/Rectangle.hpp>
31 #include <com/sun/star/lang/DisposedException.hpp>
32
33 #include <vcl/svapp.hxx>
34
35 #include <cppuhelper/implbase3.hxx>
36 #include <cppuhelper/implbase4.hxx>
37
38 #include <vector>
39 #include <tools/debug.hxx>
40
41
42 using ::rtl::OUString;
43 using namespace ::com::sun::star::uno;
44 using namespace ::com::sun::star::lang;
45 using namespace ::com::sun::star::container;
46 using namespace ::com::sun::star::beans;
47
48 // -----------------------------------------------------------------------
49
50 namespace vcl
51 {
52
53 class DisplayInfo : public ::cppu::WeakAggImplHelper3< XPropertySet, XPropertySetInfo, XServiceInfo >
54 {
55 public:
56 DisplayInfo( sal_uInt32 nDisplay );
57
58 // XPropertySet
59 virtual Reference< XPropertySetInfo > SAL_CALL getPropertySetInfo( ) throw (RuntimeException);
60 virtual void SAL_CALL setPropertyValue( const OUString& aPropertyName, const Any& aValue ) throw (UnknownPropertyException, PropertyVetoException, IllegalArgumentException, WrappedTargetException, RuntimeException);
61 virtual Any SAL_CALL getPropertyValue( const OUString& PropertyName ) throw (UnknownPropertyException, WrappedTargetException, RuntimeException);
62 virtual void SAL_CALL addPropertyChangeListener( const OUString& aPropertyName, const Reference< XPropertyChangeListener >& xListener ) throw (UnknownPropertyException, WrappedTargetException, RuntimeException);
63 virtual void SAL_CALL removePropertyChangeListener( const OUString& aPropertyName, const Reference< XPropertyChangeListener >& aListener ) throw (UnknownPropertyException, WrappedTargetException, RuntimeException);
64 virtual void SAL_CALL addVetoableChangeListener( const OUString& PropertyName, const Reference< XVetoableChangeListener >& aListener ) throw (UnknownPropertyException, WrappedTargetException, RuntimeException);
65 virtual void SAL_CALL removeVetoableChangeListener( const OUString& PropertyName, const Reference< XVetoableChangeListener >& aListener ) throw (UnknownPropertyException, WrappedTargetException, RuntimeException);
66
67 // XPropertySetInfo
68 virtual Sequence< Property > SAL_CALL getProperties( ) throw (RuntimeException);
69 virtual Property SAL_CALL getPropertyByName( const OUString& aName ) throw (UnknownPropertyException, RuntimeException);
70 virtual ::sal_Bool SAL_CALL hasPropertyByName( const OUString& Name ) throw (RuntimeException);
71
72 // XServiceInfo
73 virtual OUString SAL_CALL getImplementationName( ) throw (RuntimeException);
74 virtual ::sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) throw (RuntimeException);
75 virtual Sequence< OUString > SAL_CALL getSupportedServiceNames( ) throw (RuntimeException);
76
77 private:
78 sal_uInt32 mnDisplay;
79 };
80
81 static const char* pScreenAreaName = "ScreenArea";
82 static const char* pWorkAreaName = "WorkArea";
83 static const char* pScreenName = "ScreenName";
84
85 // --------------------------------------------------------------------
86
DisplayInfo(sal_uInt32 nDisplay)87 DisplayInfo::DisplayInfo( sal_uInt32 nDisplay )
88 : mnDisplay( nDisplay )
89 {
90 }
91
92 // XPropertySet
getPropertySetInfo()93 Reference< XPropertySetInfo > SAL_CALL DisplayInfo::getPropertySetInfo( ) throw (RuntimeException)
94 {
95 return this;
96 }
97
setPropertyValue(const OUString &,const Any &)98 void SAL_CALL DisplayInfo::setPropertyValue( const OUString& /*aPropertyName* */, const Any& /*aValue*/ ) throw (UnknownPropertyException, PropertyVetoException, IllegalArgumentException, WrappedTargetException, RuntimeException)
99 {
100 throw PropertyVetoException();
101 }
102
getPropertyValue(const OUString & PropertyName)103 Any SAL_CALL DisplayInfo::getPropertyValue( const OUString& PropertyName ) throw (UnknownPropertyException, WrappedTargetException, RuntimeException)
104 {
105 Rectangle aRect;
106 if( PropertyName.equalsAscii( pScreenAreaName ) )
107 {
108 aRect = Application::GetScreenPosSizePixel( mnDisplay );
109 }
110 else if( PropertyName.equalsAscii( pWorkAreaName ) )
111 {
112 aRect = Application::GetWorkAreaPosSizePixel( mnDisplay );
113 }
114 else if( PropertyName.equalsAscii( pScreenName ) )
115 {
116 return Any( Application::GetScreenName( mnDisplay ) );
117 }
118 else
119 throw UnknownPropertyException();
120
121 return Any( com::sun::star::awt::Rectangle( aRect.Left(), aRect.Top(), aRect.getWidth(), aRect.getHeight() ) );
122 }
123
addPropertyChangeListener(const OUString &,const Reference<XPropertyChangeListener> &)124 void SAL_CALL DisplayInfo::addPropertyChangeListener( const OUString&, const Reference< XPropertyChangeListener >& ) throw (UnknownPropertyException, WrappedTargetException, RuntimeException) {}
removePropertyChangeListener(const OUString &,const Reference<XPropertyChangeListener> &)125 void SAL_CALL DisplayInfo::removePropertyChangeListener( const OUString&, const Reference< XPropertyChangeListener >& ) throw (UnknownPropertyException, WrappedTargetException, RuntimeException) {}
addVetoableChangeListener(const OUString &,const Reference<XVetoableChangeListener> &)126 void SAL_CALL DisplayInfo::addVetoableChangeListener( const OUString&, const Reference< XVetoableChangeListener >& ) throw (UnknownPropertyException, WrappedTargetException, RuntimeException) {}
removeVetoableChangeListener(const OUString &,const Reference<XVetoableChangeListener> &)127 void SAL_CALL DisplayInfo::removeVetoableChangeListener( const OUString&, const Reference< XVetoableChangeListener >& ) throw (UnknownPropertyException, WrappedTargetException, RuntimeException) {}
128
129 // XPropertySetInfo
getProperties()130 Sequence< Property > SAL_CALL DisplayInfo::getProperties( ) throw (RuntimeException)
131 {
132 Sequence< Property > aProps(2);
133 aProps[0] = getPropertyByName( OUString::createFromAscii( pScreenAreaName ) );
134 aProps[1] = getPropertyByName( OUString::createFromAscii( pWorkAreaName ) );
135 return aProps;
136 }
137
getPropertyByName(const OUString & aName)138 Property SAL_CALL DisplayInfo::getPropertyByName( const OUString& aName ) throw (UnknownPropertyException, RuntimeException)
139 {
140 if( aName.equalsAscii( pScreenAreaName ) ||
141 aName.equalsAscii( pWorkAreaName ) )
142 return Property( aName, 0, ::getCppuType( (::com::sun::star::awt::Rectangle const *)0 ), PropertyAttribute::READONLY );
143 throw UnknownPropertyException();
144 }
145
hasPropertyByName(const OUString & Name)146 ::sal_Bool SAL_CALL DisplayInfo::hasPropertyByName( const OUString& Name ) throw (RuntimeException)
147 {
148 return Name.equalsAscii( pScreenAreaName ) ||
149 Name.equalsAscii( pWorkAreaName );
150 }
151
152 // XServiceInfo
getImplementationName()153 OUString SAL_CALL DisplayInfo::getImplementationName( ) throw (RuntimeException)
154 {
155 static OUString aImplementationName( RTL_CONSTASCII_USTRINGPARAM( "vcl::DisplayInfo" ) );
156 return aImplementationName;
157 }
158
supportsService(const OUString & ServiceName)159 ::sal_Bool SAL_CALL DisplayInfo::supportsService( const OUString& ServiceName ) throw (RuntimeException)
160 {
161 Sequence< OUString > aSN( getSupportedServiceNames() );
162 for( sal_Int32 nService = 0; nService < aSN.getLength(); nService++ )
163 {
164 if( aSN[nService] == ServiceName )
165 return sal_True;
166 }
167 return sal_False;
168 }
169
getSupportedServiceNames()170 Sequence< OUString > SAL_CALL DisplayInfo::getSupportedServiceNames( ) throw (RuntimeException)
171 {
172 static OUString aServiceName( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.DisplayInfo" ) );
173 static Sequence< OUString > aServiceNames( &aServiceName, 1 );
174 return aServiceNames;
175 }
176
177 // ====================================================================
178
179 class DisplayAccess : public ::cppu::WeakAggImplHelper4< XPropertySet, XPropertySetInfo, XIndexAccess, XServiceInfo >
180 {
181 public:
182 DisplayAccess ();
183
184 // XPropertySet
185 virtual Reference< XPropertySetInfo > SAL_CALL getPropertySetInfo( ) throw (RuntimeException);
186 virtual void SAL_CALL setPropertyValue( const OUString& aPropertyName, const Any& aValue ) throw (UnknownPropertyException, PropertyVetoException, IllegalArgumentException, WrappedTargetException, RuntimeException);
187 virtual Any SAL_CALL getPropertyValue( const OUString& PropertyName ) throw (UnknownPropertyException, WrappedTargetException, RuntimeException);
188 virtual void SAL_CALL addPropertyChangeListener( const OUString& aPropertyName, const Reference< XPropertyChangeListener >& xListener ) throw (UnknownPropertyException, WrappedTargetException, RuntimeException);
189 virtual void SAL_CALL removePropertyChangeListener( const OUString& aPropertyName, const Reference< XPropertyChangeListener >& aListener ) throw (UnknownPropertyException, WrappedTargetException, RuntimeException);
190 virtual void SAL_CALL addVetoableChangeListener( const OUString& PropertyName, const Reference< XVetoableChangeListener >& aListener ) throw (UnknownPropertyException, WrappedTargetException, RuntimeException);
191 virtual void SAL_CALL removeVetoableChangeListener( const OUString& PropertyName, const Reference< XVetoableChangeListener >& aListener ) throw (UnknownPropertyException, WrappedTargetException, RuntimeException);
192
193 // XPropertySetInfo
194 virtual Sequence< Property > SAL_CALL getProperties( ) throw (RuntimeException);
195 virtual Property SAL_CALL getPropertyByName( const OUString& aName ) throw (UnknownPropertyException, RuntimeException);
196 virtual ::sal_Bool SAL_CALL hasPropertyByName( const OUString& Name ) throw (RuntimeException);
197
198 // XIndexAccess
199 virtual ::sal_Int32 SAL_CALL getCount() throw (RuntimeException);
200 virtual Any SAL_CALL getByIndex( ::sal_Int32 Index ) throw (IndexOutOfBoundsException, WrappedTargetException, RuntimeException);
201
202 // XElementAccess
203 virtual Type SAL_CALL getElementType( ) throw (RuntimeException);
204 virtual ::sal_Bool SAL_CALL hasElements( ) throw (RuntimeException);
205
206 // XServiceInfo
207 virtual OUString SAL_CALL getImplementationName( ) throw (RuntimeException);
208 virtual ::sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) throw (RuntimeException);
209 virtual Sequence< OUString > SAL_CALL getSupportedServiceNames( ) throw (RuntimeException);
210 };
211
DisplayAccess_getSupportedServiceNames()212 Sequence< OUString > DisplayAccess_getSupportedServiceNames()
213 {
214 static OUString aServiceName( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.DisplayAccess" ) );
215 static Sequence< OUString > aServiceNames( &aServiceName, 1 );
216 return aServiceNames;
217 }
218
DisplayAccess_getImplementationName()219 OUString DisplayAccess_getImplementationName()
220 {
221 return OUString( RTL_CONSTASCII_USTRINGPARAM( "vcl::DisplayAccess" ) );
222 }
223
DisplayAccess_createInstance(const Reference<XMultiServiceFactory> &)224 Reference< XInterface > SAL_CALL DisplayAccess_createInstance( const Reference< XMultiServiceFactory >& )
225 {
226 return static_cast< ::cppu::OWeakObject * >( new DisplayAccess );
227 }
228
DisplayAccess()229 DisplayAccess::DisplayAccess()
230 {
231 }
232
233 static const char* pMultiDisplayName = "MultiDisplay";
234 static const char* pDefaultDisplayName = "DefaultDisplay";
235
236 // XPropertySet
getPropertySetInfo()237 Reference< XPropertySetInfo > SAL_CALL DisplayAccess::getPropertySetInfo( ) throw (RuntimeException)
238 {
239 return this;
240 }
241
setPropertyValue(const OUString &,const Any &)242 void SAL_CALL DisplayAccess::setPropertyValue( const OUString& /*aPropertyName* */, const Any& /*aValue*/ ) throw (UnknownPropertyException, PropertyVetoException, IllegalArgumentException, WrappedTargetException, RuntimeException)
243 {
244 throw PropertyVetoException();
245 }
246
getPropertyValue(const OUString & PropertyName)247 Any SAL_CALL DisplayAccess::getPropertyValue( const OUString& PropertyName ) throw (UnknownPropertyException, WrappedTargetException, RuntimeException)
248 {
249 Any aRet;
250 if( PropertyName.equalsAscii( pMultiDisplayName ) )
251 {
252 aRet <<= sal_Bool( Application::IsMultiDisplay() );
253 }
254 else if( PropertyName.equalsAscii( pDefaultDisplayName ) )
255 {
256 aRet <<= sal_Int32( Application::GetDefaultDisplayNumber() );
257 }
258 else
259 throw UnknownPropertyException();
260
261 return aRet;
262 }
263
addPropertyChangeListener(const OUString &,const Reference<XPropertyChangeListener> &)264 void SAL_CALL DisplayAccess::addPropertyChangeListener( const OUString&, const Reference< XPropertyChangeListener >& ) throw (UnknownPropertyException, WrappedTargetException, RuntimeException) {}
removePropertyChangeListener(const OUString &,const Reference<XPropertyChangeListener> &)265 void SAL_CALL DisplayAccess::removePropertyChangeListener( const OUString&, const Reference< XPropertyChangeListener >& ) throw (UnknownPropertyException, WrappedTargetException, RuntimeException) {}
addVetoableChangeListener(const OUString &,const Reference<XVetoableChangeListener> &)266 void SAL_CALL DisplayAccess::addVetoableChangeListener( const OUString&, const Reference< XVetoableChangeListener >& ) throw (UnknownPropertyException, WrappedTargetException, RuntimeException) {}
removeVetoableChangeListener(const OUString &,const Reference<XVetoableChangeListener> &)267 void SAL_CALL DisplayAccess::removeVetoableChangeListener( const OUString&, const Reference< XVetoableChangeListener >& ) throw (UnknownPropertyException, WrappedTargetException, RuntimeException) {}
268
269 // XPropertySetInfo
getProperties()270 Sequence< Property > SAL_CALL DisplayAccess::getProperties( ) throw (RuntimeException)
271 {
272 Sequence< Property > aProps(2);
273 aProps[0] = getPropertyByName( OUString::createFromAscii( pMultiDisplayName ) );
274 aProps[1] = getPropertyByName( OUString::createFromAscii( pDefaultDisplayName ) );
275 return aProps;
276 }
277
getPropertyByName(const OUString & aName)278 Property SAL_CALL DisplayAccess::getPropertyByName( const OUString& aName ) throw (UnknownPropertyException, RuntimeException)
279 {
280 if( aName.equalsAscii( pMultiDisplayName ) )
281 return Property( aName, 0, ::getCppuType( (sal_Bool const *)0 ), PropertyAttribute::READONLY );
282
283 if( aName.equalsAscii( pDefaultDisplayName ) )
284 return Property( aName, 0, ::getCppuType( (sal_Int32 const *)0 ), PropertyAttribute::READONLY );
285 throw UnknownPropertyException();
286 }
287
hasPropertyByName(const OUString & Name)288 ::sal_Bool SAL_CALL DisplayAccess::hasPropertyByName( const OUString& Name ) throw (RuntimeException)
289 {
290 return Name.equalsAscii( pMultiDisplayName ) ||
291 Name.equalsAscii( pDefaultDisplayName );
292 }
293
294 // XIndexAccess
getCount()295 ::sal_Int32 SAL_CALL DisplayAccess::getCount() throw (RuntimeException)
296 {
297 return Application::GetScreenCount();
298 }
299
getByIndex(::sal_Int32 Index)300 Any SAL_CALL DisplayAccess::getByIndex( ::sal_Int32 Index ) throw (IndexOutOfBoundsException, WrappedTargetException, RuntimeException)
301 {
302 if( (Index < 0) || (Index >= getCount()) )
303 throw IndexOutOfBoundsException();
304
305 return makeAny( Reference< XPropertySet >( new DisplayInfo( Index ) ) );
306 }
307
308 // XElementAccess
getElementType()309 Type SAL_CALL DisplayAccess::getElementType( ) throw (RuntimeException)
310 {
311 return XPropertySet::static_type();
312 }
313
hasElements()314 ::sal_Bool SAL_CALL DisplayAccess::hasElements() throw (RuntimeException)
315 {
316 return true;
317 }
318
319 // XServiceInfo
getImplementationName()320 OUString SAL_CALL DisplayAccess::getImplementationName( ) throw (RuntimeException)
321 {
322 return DisplayAccess_getImplementationName();
323 }
324
supportsService(const OUString & ServiceName)325 ::sal_Bool SAL_CALL DisplayAccess::supportsService( const OUString& ServiceName ) throw (RuntimeException)
326 {
327 Sequence< OUString > aSN( DisplayAccess_getSupportedServiceNames() );
328 for( sal_Int32 nService = 0; nService < aSN.getLength(); nService++ )
329 {
330 if( aSN[nService] == ServiceName )
331 return sal_True;
332 }
333 return sal_False;
334 }
335
getSupportedServiceNames()336 Sequence< OUString > SAL_CALL DisplayAccess::getSupportedServiceNames( ) throw (RuntimeException)
337 {
338 return DisplayAccess_getSupportedServiceNames();
339 }
340
341 } // namespace vcl
342