Line data Source code
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 :
21 : #include <com/sun/star/awt/WindowEvent.hpp>
22 : #include <com/sun/star/awt/KeyEvent.hpp>
23 : #include <com/sun/star/awt/KeyModifier.hpp>
24 : #include <com/sun/star/awt/MouseEvent.hpp>
25 : #include <com/sun/star/awt/MouseButton.hpp>
26 : #include <com/sun/star/awt/MouseWheelBehavior.hpp>
27 : #include <com/sun/star/awt/XTopWindow.hpp>
28 : #include <com/sun/star/awt/Style.hpp>
29 : #include <com/sun/star/accessibility/AccessibleRole.hpp>
30 : #include <com/sun/star/awt/DockingEvent.hpp>
31 : #include <com/sun/star/awt/EndDockingEvent.hpp>
32 : #include <com/sun/star/awt/EndPopupModeEvent.hpp>
33 : #include <com/sun/star/awt/XWindowListener2.hpp>
34 : #include <com/sun/star/style/VerticalAlignment.hpp>
35 : #include <com/sun/star/lang/DisposedException.hpp>
36 : #include <com/sun/star/text/WritingMode2.hpp>
37 : #include <toolkit/awt/vclxwindow.hxx>
38 : #include <toolkit/awt/vclxpointer.hxx>
39 : #include <toolkit/awt/vclxwindows.hxx>
40 : #include <toolkit/helper/macros.hxx>
41 : #include <toolkit/helper/vclunohelper.hxx>
42 : #include <toolkit/helper/convert.hxx>
43 : #include <toolkit/helper/property.hxx>
44 : #include <cppuhelper/typeprovider.hxx>
45 : #include <rtl/uuid.h>
46 : #include <rtl/ustrbuf.hxx>
47 : #include <vcl/svapp.hxx>
48 : #include <vcl/window.hxx>
49 : #include <tools/color.hxx>
50 : #include <tools/fract.hxx>
51 : #include <vcl/dockwin.hxx>
52 : #include <vcl/pdfextoutdevdata.hxx>
53 : #include <vcl/tabpage.hxx>
54 : #include <vcl/button.hxx>
55 : #include <vcl/settings.hxx>
56 : #include <comphelper/asyncnotification.hxx>
57 : #include <comphelper/flagguard.hxx>
58 : #include "stylesettings.hxx"
59 : #include <tools/urlobj.hxx>
60 :
61 : #include <boost/bind.hpp>
62 : #include <boost/noncopyable.hpp>
63 :
64 : #include "helper/accessibilityclient.hxx"
65 : #include "helper/unopropertyarrayhelper.hxx"
66 :
67 : using namespace ::com::sun::star;
68 :
69 : using ::com::sun::star::uno::Reference;
70 : using ::com::sun::star::uno::UNO_QUERY;
71 : using ::com::sun::star::uno::RuntimeException;
72 : using ::com::sun::star::lang::EventObject;
73 : using ::com::sun::star::awt::XWindowListener2;
74 : using ::com::sun::star::awt::XDockableWindowListener;
75 : using ::com::sun::star::awt::XDevice;
76 : using ::com::sun::star::awt::XStyleSettings;
77 : using ::com::sun::star::lang::DisposedException;
78 : using ::com::sun::star::style::VerticalAlignment;
79 : using ::com::sun::star::style::VerticalAlignment_TOP;
80 : using ::com::sun::star::style::VerticalAlignment_MIDDLE;
81 : using ::com::sun::star::style::VerticalAlignment_BOTTOM;
82 : using ::com::sun::star::style::VerticalAlignment_MAKE_FIXED_SIZE;
83 :
84 : namespace WritingMode2 = ::com::sun::star::text::WritingMode2;
85 :
86 :
87 : //= VCLXWindowImpl
88 :
89 : class VCLXWindowImpl: private boost::noncopyable
90 : {
91 : private:
92 : typedef ::std::vector< VCLXWindow::Callback > CallbackArray;
93 :
94 : private:
95 : VCLXWindow& mrAntiImpl;
96 : ::toolkit::AccessibilityClient maAccFactory;
97 : bool mbDisposed;
98 : bool mbDrawingOntoParent; // no bit mask, is passed around by reference
99 : bool mbEnableVisible;
100 : bool mbDirectVisible;
101 :
102 : ::osl::Mutex maListenerContainerMutex;
103 : ::cppu::OInterfaceContainerHelper maWindow2Listeners;
104 : ::cppu::OInterfaceContainerHelper maDockableWindowListeners;
105 : EventListenerMultiplexer maEventListeners;
106 : FocusListenerMultiplexer maFocusListeners;
107 : WindowListenerMultiplexer maWindowListeners;
108 : KeyListenerMultiplexer maKeyListeners;
109 : MouseListenerMultiplexer maMouseListeners;
110 : MouseMotionListenerMultiplexer maMouseMotionListeners;
111 : PaintListenerMultiplexer maPaintListeners;
112 : VclContainerListenerMultiplexer maContainerListeners;
113 : TopWindowListenerMultiplexer maTopWindowListeners;
114 :
115 : CallbackArray maCallbackEvents;
116 : ImplSVEvent * mnCallbackEventId;
117 :
118 : public:
119 : bool mbDisposing : 1;
120 : bool mbDesignMode : 1;
121 : bool mbSynthesizingVCLEvent : 1;
122 : bool mbWithDefaultProps : 1;
123 :
124 : sal_uLong mnListenerLockLevel;
125 : sal_Int16 mnWritingMode;
126 : sal_Int16 mnContextWritingMode;
127 :
128 : UnoPropertyArrayHelper* mpPropHelper;
129 :
130 : ::com::sun::star::uno::Reference< ::com::sun::star::awt::XPointer >
131 : mxPointer;
132 : ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleContext >
133 : mxAccessibleContext;
134 : ::com::sun::star::uno::Reference< ::com::sun::star::awt::XGraphics >
135 : mxViewGraphics;
136 : ::com::sun::star::uno::Reference< ::com::sun::star::awt::XStyleSettings >
137 : mxWindowStyleSettings;
138 :
139 : public:
140 0 : bool& getDrawingOntoParent_ref() { return mbDrawingOntoParent; }
141 :
142 : public:
143 : /** ctor
144 : @param _pAntiImpl
145 : the <type>VCLXWindow</type> instance which the object belongs to. Must
146 : live longer then the object just being constructed.
147 : */
148 : VCLXWindowImpl( VCLXWindow& _rAntiImpl, bool _bWithDefaultProps );
149 :
150 : /** synchronously mbEnableVisible
151 : */
152 165 : void setEnableVisible( bool bEnableVisible ) { mbEnableVisible = bEnableVisible; }
153 46261 : bool isEnableVisible() { return mbEnableVisible; }
154 : /** synchronously mbDirectVisible;
155 : */
156 128009 : void setDirectVisible( bool bDirectVisible ) { mbDirectVisible = bDirectVisible; }
157 52 : bool isDirectVisible() { return mbDirectVisible; }
158 :
159 : /** impl-version of VCLXWindow::ImplExecuteAsyncWithoutSolarLock
160 : */
161 : void callBackAsync( const VCLXWindow::Callback& i_callback );
162 :
163 : /** notifies the object that its VCLXWindow is being disposed
164 : */
165 : void disposing();
166 :
167 248 : inline ::toolkit::AccessibilityClient& getAccessibleFactory()
168 : {
169 248 : return maAccFactory;
170 : }
171 :
172 : Reference< XStyleSettings > getStyleSettings();
173 :
174 : /** returns the container of registered XWindowListener2 listeners
175 : */
176 22988 : inline ::cppu::OInterfaceContainerHelper& getWindow2Listeners() { return maWindow2Listeners; }
177 9523 : inline ::cppu::OInterfaceContainerHelper& getDockableWindowListeners(){ return maDockableWindowListeners; }
178 145 : inline EventListenerMultiplexer& getEventListeners() { return maEventListeners; }
179 42489 : inline FocusListenerMultiplexer& getFocusListeners() { return maFocusListeners; }
180 406371 : inline WindowListenerMultiplexer& getWindowListeners() { return maWindowListeners; }
181 95 : inline KeyListenerMultiplexer& getKeyListeners() { return maKeyListeners; }
182 130 : inline MouseListenerMultiplexer& getMouseListeners() { return maMouseListeners; }
183 10 : inline MouseMotionListenerMultiplexer& getMouseMotionListeners() { return maMouseMotionListeners; }
184 10420 : inline PaintListenerMultiplexer& getPaintListeners() { return maPaintListeners; }
185 126858 : inline VclContainerListenerMultiplexer& getContainerListeners() { return maContainerListeners; }
186 141471 : inline TopWindowListenerMultiplexer& getTopWindowListeners() { return maTopWindowListeners; }
187 :
188 : ~VCLXWindowImpl();
189 :
190 : private:
191 : DECL_LINK( OnProcessCallbacks, void* );
192 : };
193 :
194 :
195 78885 : VCLXWindowImpl::VCLXWindowImpl( VCLXWindow& _rAntiImpl, bool _bWithDefaultProps )
196 : :mrAntiImpl( _rAntiImpl )
197 : ,mbDisposed( false )
198 : ,mbDrawingOntoParent( false )
199 : ,mbEnableVisible(true)
200 : ,mbDirectVisible(true)
201 : ,maListenerContainerMutex( )
202 : ,maWindow2Listeners( maListenerContainerMutex )
203 : ,maDockableWindowListeners( maListenerContainerMutex )
204 : ,maEventListeners( _rAntiImpl )
205 : ,maFocusListeners( _rAntiImpl )
206 : ,maWindowListeners( _rAntiImpl )
207 : ,maKeyListeners( _rAntiImpl )
208 : ,maMouseListeners( _rAntiImpl )
209 : ,maMouseMotionListeners( _rAntiImpl )
210 : ,maPaintListeners( _rAntiImpl )
211 : ,maContainerListeners( _rAntiImpl )
212 : ,maTopWindowListeners( _rAntiImpl )
213 : ,mnCallbackEventId( 0 )
214 : ,mbDisposing( false )
215 : ,mbDesignMode( false )
216 : ,mbSynthesizingVCLEvent( false )
217 : ,mbWithDefaultProps( _bWithDefaultProps )
218 : ,mnListenerLockLevel( 0 )
219 : ,mnWritingMode( WritingMode2::CONTEXT )
220 : ,mnContextWritingMode( WritingMode2::CONTEXT )
221 78885 : ,mpPropHelper( NULL )
222 : {
223 78885 : }
224 :
225 135462 : VCLXWindowImpl::~VCLXWindowImpl()
226 : {
227 67731 : delete mpPropHelper;
228 67731 : }
229 :
230 :
231 82218 : void VCLXWindowImpl::disposing()
232 : {
233 82218 : SolarMutexGuard aGuard;
234 82218 : if ( mnCallbackEventId )
235 10896 : Application::RemoveUserEvent( mnCallbackEventId );
236 82218 : mnCallbackEventId = 0;
237 :
238 82218 : mbDisposed= true;
239 :
240 164436 : ::com::sun::star::lang::EventObject aEvent;
241 82218 : aEvent.Source = mrAntiImpl;
242 :
243 82218 : maDockableWindowListeners.disposeAndClear( aEvent );
244 82218 : maEventListeners.disposeAndClear( aEvent );
245 82218 : maFocusListeners.disposeAndClear( aEvent );
246 82218 : maWindowListeners.disposeAndClear( aEvent );
247 82218 : maKeyListeners.disposeAndClear( aEvent );
248 82218 : maMouseListeners.disposeAndClear( aEvent );
249 82218 : maMouseMotionListeners.disposeAndClear( aEvent );
250 82218 : maPaintListeners.disposeAndClear( aEvent );
251 82218 : maContainerListeners.disposeAndClear( aEvent );
252 82218 : maTopWindowListeners.disposeAndClear( aEvent );
253 :
254 82218 : ::toolkit::WindowStyleSettings* pStyleSettings = static_cast< ::toolkit::WindowStyleSettings* >( mxWindowStyleSettings.get() );
255 82218 : if ( pStyleSettings != NULL )
256 0 : pStyleSettings->dispose();
257 164436 : mxWindowStyleSettings.clear();
258 82218 : }
259 :
260 :
261 22261 : void VCLXWindowImpl::callBackAsync( const VCLXWindow::Callback& i_callback )
262 : {
263 : DBG_TESTSOLARMUTEX();
264 22261 : maCallbackEvents.push_back( i_callback );
265 22261 : if ( !mnCallbackEventId )
266 : {
267 : // ensure our VCLXWindow is not destroyed while the event is underway
268 11324 : mrAntiImpl.acquire();
269 11324 : mnCallbackEventId = Application::PostUserEvent( LINK( this, VCLXWindowImpl, OnProcessCallbacks ) );
270 : }
271 22261 : }
272 :
273 :
274 856 : IMPL_LINK_NOARG(VCLXWindowImpl, OnProcessCallbacks)
275 : {
276 428 : const Reference< uno::XInterface > xKeepAlive( mrAntiImpl );
277 :
278 : // work on a copy of the callback array
279 856 : CallbackArray aCallbacksCopy;
280 : {
281 428 : SolarMutexGuard aGuard;
282 428 : aCallbacksCopy = maCallbackEvents;
283 428 : maCallbackEvents.clear();
284 :
285 : // we acquired our VCLXWindow once before posting the event, release this one ref now
286 428 : mrAntiImpl.release();
287 :
288 428 : if ( !mnCallbackEventId )
289 : // we were disposed while waiting for the mutex to lock
290 0 : return 1L;
291 :
292 428 : mnCallbackEventId = 0;
293 : }
294 :
295 : {
296 428 : SolarMutexReleaser aReleaseSolar;
297 2745 : for ( CallbackArray::const_iterator loop = aCallbacksCopy.begin();
298 1830 : loop != aCallbacksCopy.end();
299 : ++loop
300 : )
301 : {
302 487 : (*loop)();
303 428 : }
304 : }
305 :
306 856 : return 0L;
307 : }
308 :
309 0 : Reference< XStyleSettings > VCLXWindowImpl::getStyleSettings()
310 : {
311 0 : SolarMutexGuard aGuard;
312 0 : if ( mbDisposed )
313 0 : throw DisposedException( OUString(), mrAntiImpl );
314 0 : if ( !mxWindowStyleSettings.is() )
315 0 : mxWindowStyleSettings = new ::toolkit::WindowStyleSettings( maListenerContainerMutex, mrAntiImpl );
316 0 : return mxWindowStyleSettings;
317 : }
318 :
319 :
320 :
321 :
322 : // Uses an out-parameter instead of return value, due to the object reference
323 :
324 64862 : void ImplInitWindowEvent( ::com::sun::star::awt::WindowEvent& rEvent, vcl::Window* pWindow )
325 : {
326 64862 : Point aPos = pWindow->GetPosPixel();
327 64862 : Size aSz = pWindow->GetSizePixel();
328 :
329 64862 : rEvent.X = aPos.X();
330 64862 : rEvent.Y = aPos.Y();
331 :
332 64862 : rEvent.Width = aSz.Width();
333 64862 : rEvent.Height = aSz.Height();
334 :
335 64862 : pWindow->GetBorder( rEvent.LeftInset, rEvent.TopInset, rEvent.RightInset, rEvent.BottomInset );
336 64862 : }
337 :
338 78885 : VCLXWindow::VCLXWindow( bool _bWithDefaultProps )
339 78885 : :mpImpl( NULL )
340 : {
341 78885 : mpImpl = new VCLXWindowImpl( *this, _bWithDefaultProps );
342 78885 : }
343 :
344 169483 : VCLXWindow::~VCLXWindow()
345 : {
346 67731 : delete mpImpl;
347 :
348 67731 : if ( GetWindow() )
349 : {
350 0 : GetWindow()->RemoveEventListener( LINK( this, VCLXWindow, WindowEventListener ) );
351 0 : GetWindow()->SetWindowPeer( NULL, NULL );
352 0 : GetWindow()->SetAccessible( NULL );
353 : }
354 101752 : }
355 :
356 :
357 22261 : void VCLXWindow::ImplExecuteAsyncWithoutSolarLock( const Callback& i_callback )
358 : {
359 22261 : mpImpl->callBackAsync( i_callback );
360 22261 : }
361 :
362 :
363 248 : ::toolkit::IAccessibleFactory& VCLXWindow::getAccessibleFactory()
364 : {
365 248 : return mpImpl->getAccessibleFactory().getFactory();
366 : }
367 :
368 200293 : void VCLXWindow::SetWindow( const VclPtr<vcl::Window> &pWindow )
369 : {
370 200293 : if ( GetWindow() )
371 : {
372 121408 : GetWindow()->RemoveEventListener( LINK( this, VCLXWindow, WindowEventListener ) );
373 : // GetWindow()->DbgAssertNoEventListeners();
374 : }
375 :
376 200293 : SetOutputDevice( pWindow );
377 :
378 200293 : if ( GetWindow() )
379 : {
380 78886 : GetWindow()->AddEventListener( LINK( this, VCLXWindow, WindowEventListener ) );
381 78886 : bool bDirectVisible = pWindow && pWindow->IsVisible();
382 78886 : mpImpl->setDirectVisible( bDirectVisible );
383 : }
384 200293 : }
385 :
386 4791 : void VCLXWindow::suspendVclEventListening( )
387 : {
388 4791 : ++mpImpl->mnListenerLockLevel;
389 4791 : }
390 :
391 4791 : void VCLXWindow::resumeVclEventListening( )
392 : {
393 : DBG_ASSERT( mpImpl->mnListenerLockLevel, "VCLXWindow::resumeVclEventListening: not suspended!" );
394 4791 : --mpImpl->mnListenerLockLevel;
395 4791 : }
396 :
397 126858 : void VCLXWindow::notifyWindowRemoved( vcl::Window& _rWindow )
398 : {
399 126858 : if ( mpImpl->getContainerListeners().getLength() )
400 : {
401 0 : awt::VclContainerEvent aEvent;
402 0 : aEvent.Source = *this;
403 0 : aEvent.Child = static_cast< XWindow* >( _rWindow.GetWindowPeer() );
404 0 : mpImpl->getContainerListeners().windowRemoved( aEvent );
405 : }
406 126858 : }
407 :
408 2211844 : IMPL_LINK( VCLXWindow, WindowEventListener, VclSimpleEvent*, pEvent )
409 : {
410 1105922 : if ( mpImpl->mnListenerLockLevel )
411 3056 : return 0L;
412 :
413 : DBG_ASSERT( pEvent && pEvent->ISA( VclWindowEvent ), "Unknown WindowEvent!" );
414 1102866 : if ( pEvent && pEvent->ISA( VclWindowEvent ) )
415 : {
416 : DBG_ASSERT( static_cast<VclWindowEvent*>(pEvent)->GetWindow() && GetWindow(), "Window???" );
417 1102866 : ProcessWindowEvent( *static_cast<VclWindowEvent*>(pEvent) );
418 : }
419 1102866 : return 0;
420 : }
421 :
422 : namespace
423 : {
424 290452 : struct CallWindow2Listener
425 : {
426 22260 : CallWindow2Listener( ::cppu::OInterfaceContainerHelper& i_rWindow2Listeners, const bool i_bEnabled, const EventObject& i_rEvent )
427 : :m_rWindow2Listeners( i_rWindow2Listeners )
428 : ,m_bEnabled( i_bEnabled )
429 22260 : ,m_aEvent( i_rEvent )
430 : {
431 22260 : }
432 :
433 486 : void operator()()
434 : {
435 486 : m_rWindow2Listeners.notifyEach( m_bEnabled ? &XWindowListener2::windowEnabled : &XWindowListener2::windowDisabled, m_aEvent );
436 486 : }
437 :
438 : ::cppu::OInterfaceContainerHelper& m_rWindow2Listeners;
439 : const bool m_bEnabled;
440 : const EventObject m_aEvent;
441 : };
442 : }
443 :
444 1102628 : void VCLXWindow::ProcessWindowEvent( const VclWindowEvent& rVclWindowEvent )
445 : {
446 1102628 : ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > xThis( static_cast<cppu::OWeakObject*>(this) );
447 :
448 1102628 : switch ( rVclWindowEvent.GetId() )
449 : {
450 : case VCLEVENT_WINDOW_ENABLED:
451 : case VCLEVENT_WINDOW_DISABLED:
452 : {
453 : Callback aCallback = CallWindow2Listener(
454 22260 : mpImpl->getWindow2Listeners(),
455 22260 : ( VCLEVENT_WINDOW_ENABLED == rVclWindowEvent.GetId() ),
456 : EventObject( *this )
457 66780 : );
458 22260 : ImplExecuteAsyncWithoutSolarLock( aCallback );
459 : }
460 22260 : break;
461 :
462 : case VCLEVENT_WINDOW_PAINT:
463 : {
464 10420 : if ( mpImpl->getPaintListeners().getLength() )
465 : {
466 0 : ::com::sun::star::awt::PaintEvent aEvent;
467 0 : aEvent.Source = static_cast<cppu::OWeakObject*>(this);
468 0 : aEvent.UpdateRect = AWTRectangle( *static_cast<Rectangle*>(rVclWindowEvent.GetData()) );
469 0 : aEvent.Count = 0;
470 0 : mpImpl->getPaintListeners().windowPaint( aEvent );
471 : }
472 : }
473 10420 : break;
474 : case VCLEVENT_WINDOW_MOVE:
475 : {
476 111568 : if ( mpImpl->getWindowListeners().getLength() )
477 : {
478 17188 : ::com::sun::star::awt::WindowEvent aEvent;
479 17188 : aEvent.Source = static_cast<cppu::OWeakObject*>(this);
480 17188 : ImplInitWindowEvent( aEvent, rVclWindowEvent.GetWindow() );
481 17188 : mpImpl->getWindowListeners().windowMoved( aEvent );
482 : }
483 : }
484 111568 : break;
485 : case VCLEVENT_WINDOW_RESIZE:
486 : {
487 103127 : if ( mpImpl->getWindowListeners().getLength() )
488 : {
489 18518 : ::com::sun::star::awt::WindowEvent aEvent;
490 18518 : aEvent.Source = static_cast<cppu::OWeakObject*>(this);
491 18518 : ImplInitWindowEvent( aEvent, rVclWindowEvent.GetWindow() );
492 18518 : mpImpl->getWindowListeners().windowResized( aEvent );
493 : }
494 : }
495 103127 : break;
496 : case VCLEVENT_WINDOW_SHOW:
497 : {
498 51416 : if ( mpImpl->getWindowListeners().getLength() )
499 : {
500 18625 : ::com::sun::star::awt::WindowEvent aEvent;
501 18625 : aEvent.Source = static_cast<cppu::OWeakObject*>(this);
502 18625 : ImplInitWindowEvent( aEvent, rVclWindowEvent.GetWindow() );
503 18625 : mpImpl->getWindowListeners().windowShown( aEvent );
504 : }
505 :
506 : // For TopWindows this means opened...
507 51416 : if ( mpImpl->getTopWindowListeners().getLength() )
508 : {
509 6344 : ::com::sun::star::lang::EventObject aEvent;
510 6344 : aEvent.Source = static_cast<cppu::OWeakObject*>(this);
511 6344 : mpImpl->getTopWindowListeners().windowOpened( aEvent );
512 : }
513 : }
514 51416 : break;
515 : case VCLEVENT_WINDOW_HIDE:
516 : {
517 37787 : if ( mpImpl->getWindowListeners().getLength() )
518 : {
519 10531 : ::com::sun::star::awt::WindowEvent aEvent;
520 10531 : aEvent.Source = static_cast<cppu::OWeakObject*>(this);
521 10531 : ImplInitWindowEvent( aEvent, rVclWindowEvent.GetWindow() );
522 10531 : mpImpl->getWindowListeners().windowHidden( aEvent );
523 : }
524 :
525 : // For TopWindows this means closed...
526 37787 : if ( mpImpl->getTopWindowListeners().getLength() )
527 : {
528 5 : ::com::sun::star::lang::EventObject aEvent;
529 5 : aEvent.Source = static_cast<cppu::OWeakObject*>(this);
530 5 : mpImpl->getTopWindowListeners().windowClosed( aEvent );
531 : }
532 : }
533 37787 : break;
534 : case VCLEVENT_WINDOW_ACTIVATE:
535 : {
536 15420 : if ( mpImpl->getTopWindowListeners().getLength() )
537 : {
538 3552 : ::com::sun::star::lang::EventObject aEvent;
539 3552 : aEvent.Source = static_cast<cppu::OWeakObject*>(this);
540 3552 : mpImpl->getTopWindowListeners().windowActivated( aEvent );
541 : }
542 : }
543 15420 : break;
544 : case VCLEVENT_WINDOW_DEACTIVATE:
545 : {
546 6926 : if ( mpImpl->getTopWindowListeners().getLength() )
547 : {
548 230 : ::com::sun::star::lang::EventObject aEvent;
549 230 : aEvent.Source = static_cast<cppu::OWeakObject*>(this);
550 230 : mpImpl->getTopWindowListeners().windowDeactivated( aEvent );
551 : }
552 : }
553 6926 : break;
554 : case VCLEVENT_WINDOW_CLOSE:
555 : {
556 0 : if ( mpImpl->getDockableWindowListeners().getLength() )
557 : {
558 0 : ::com::sun::star::lang::EventObject aEvent;
559 0 : aEvent.Source = static_cast<cppu::OWeakObject*>(this);
560 0 : mpImpl->getDockableWindowListeners().notifyEach( &XDockableWindowListener::closed, aEvent );
561 : }
562 0 : if ( mpImpl->getTopWindowListeners().getLength() )
563 : {
564 0 : ::com::sun::star::lang::EventObject aEvent;
565 0 : aEvent.Source = static_cast<cppu::OWeakObject*>(this);
566 0 : mpImpl->getTopWindowListeners().windowClosing( aEvent );
567 : }
568 : }
569 0 : break;
570 : case VCLEVENT_CONTROL_GETFOCUS:
571 : case VCLEVENT_WINDOW_GETFOCUS:
572 : {
573 24588 : if ( ( rVclWindowEvent.GetWindow()->IsCompoundControl()
574 6 : && rVclWindowEvent.GetId() == VCLEVENT_CONTROL_GETFOCUS
575 : )
576 36874 : || ( !rVclWindowEvent.GetWindow()->IsCompoundControl()
577 12288 : && rVclWindowEvent.GetId() == VCLEVENT_WINDOW_GETFOCUS
578 : )
579 : )
580 : {
581 12288 : if ( mpImpl->getFocusListeners().getLength() )
582 : {
583 2999 : ::com::sun::star::awt::FocusEvent aEvent;
584 2999 : aEvent.Source = static_cast<cppu::OWeakObject*>(this);
585 2999 : aEvent.FocusFlags = static_cast<sal_Int16>(rVclWindowEvent.GetWindow()->GetGetFocusFlags());
586 2999 : aEvent.Temporary = sal_False;
587 2999 : mpImpl->getFocusListeners().focusGained( aEvent );
588 : }
589 : }
590 : }
591 12294 : break;
592 : case VCLEVENT_CONTROL_LOSEFOCUS:
593 : case VCLEVENT_WINDOW_LOSEFOCUS:
594 : {
595 13266 : if ( ( rVclWindowEvent.GetWindow()->IsCompoundControl()
596 0 : && rVclWindowEvent.GetId() == VCLEVENT_CONTROL_LOSEFOCUS
597 : )
598 19896 : || ( !rVclWindowEvent.GetWindow()->IsCompoundControl()
599 6633 : && rVclWindowEvent.GetId() == VCLEVENT_WINDOW_LOSEFOCUS
600 : )
601 : )
602 : {
603 6630 : if ( mpImpl->getFocusListeners().getLength() )
604 : {
605 660 : ::com::sun::star::awt::FocusEvent aEvent;
606 660 : aEvent.Source = static_cast<cppu::OWeakObject*>(this);
607 660 : aEvent.FocusFlags = static_cast<sal_Int16>(rVclWindowEvent.GetWindow()->GetGetFocusFlags());
608 660 : aEvent.Temporary = sal_False;
609 :
610 660 : vcl::Window* pNext = Application::GetFocusWindow();
611 660 : if ( pNext )
612 : {
613 : // Don't care about internals if this control is compound
614 659 : vcl::Window* pNextC = pNext;
615 3300 : while ( pNextC && !pNextC->IsCompoundControl() )
616 1982 : pNextC = pNextC->GetParent();
617 659 : if ( pNextC )
618 0 : pNext = pNextC;
619 :
620 659 : pNext->GetComponentInterface( true );
621 659 : aEvent.NextFocus = static_cast<cppu::OWeakObject*>(pNext->GetWindowPeer());
622 : }
623 660 : mpImpl->getFocusListeners().focusLost( aEvent );
624 : }
625 : }
626 : }
627 6633 : break;
628 : case VCLEVENT_WINDOW_MINIMIZE:
629 : {
630 14 : if ( mpImpl->getTopWindowListeners().getLength() )
631 : {
632 4 : ::com::sun::star::lang::EventObject aEvent;
633 4 : aEvent.Source = static_cast<cppu::OWeakObject*>(this);
634 4 : mpImpl->getTopWindowListeners().windowMinimized( aEvent );
635 : }
636 : }
637 14 : break;
638 : case VCLEVENT_WINDOW_NORMALIZE:
639 : {
640 10 : if ( mpImpl->getTopWindowListeners().getLength() )
641 : {
642 2 : ::com::sun::star::lang::EventObject aEvent;
643 2 : aEvent.Source = static_cast<cppu::OWeakObject*>(this);
644 2 : mpImpl->getTopWindowListeners().windowNormalized( aEvent );
645 : }
646 : }
647 10 : break;
648 : case VCLEVENT_WINDOW_KEYINPUT:
649 : {
650 0 : if ( mpImpl->getKeyListeners().getLength() )
651 : {
652 : ::com::sun::star::awt::KeyEvent aEvent( VCLUnoHelper::createKeyEvent(
653 0 : *static_cast<KeyEvent*>(rVclWindowEvent.GetData()), *this
654 0 : ) );
655 0 : mpImpl->getKeyListeners().keyPressed( aEvent );
656 : }
657 : }
658 0 : break;
659 : case VCLEVENT_WINDOW_KEYUP:
660 : {
661 0 : if ( mpImpl->getKeyListeners().getLength() )
662 : {
663 : ::com::sun::star::awt::KeyEvent aEvent( VCLUnoHelper::createKeyEvent(
664 0 : *static_cast<KeyEvent*>(rVclWindowEvent.GetData()), *this
665 0 : ) );
666 0 : mpImpl->getKeyListeners().keyReleased( aEvent );
667 : }
668 : }
669 0 : break;
670 : case VCLEVENT_WINDOW_COMMAND:
671 : {
672 0 : CommandEvent* pCmdEvt = static_cast<CommandEvent*>(rVclWindowEvent.GetData());
673 0 : if ( mpImpl->getMouseListeners().getLength() && ( pCmdEvt->GetCommand() == CommandEventId::ContextMenu ) )
674 : {
675 : // CommandEventId::ContextMenu als mousePressed mit PopupTrigger = sal_True versenden...
676 0 : Point aWhere = static_cast< CommandEvent* >( rVclWindowEvent.GetData() )->GetMousePosPixel();
677 0 : if ( !pCmdEvt->IsMouseEvent() )
678 : { // for keyboard events, we set the coordinates to -1,-1. This is a slight HACK, but the current API
679 : // handles a context menu command as special case of a mouse event, which is simply wrong.
680 : // Without extending the API, we would not have another chance to notify listeners of a
681 : // keyboard-triggered context menu request
682 0 : aWhere = Point( -1, -1 );
683 : }
684 :
685 0 : MouseEvent aMEvt( aWhere, 1, MouseEventModifiers::SIMPLECLICK, MOUSE_LEFT, 0 );
686 0 : awt::MouseEvent aEvent( VCLUnoHelper::createMouseEvent( aMEvt, *this ) );
687 0 : aEvent.PopupTrigger = sal_True;
688 :
689 : Callback aCallback = ::boost::bind(
690 : &MouseListenerMultiplexer::mousePressed,
691 0 : &mpImpl->getMouseListeners(),
692 : aEvent
693 0 : );
694 0 : ImplExecuteAsyncWithoutSolarLock( aCallback );
695 : }
696 : }
697 0 : break;
698 : case VCLEVENT_WINDOW_MOUSEMOVE:
699 : {
700 0 : MouseEvent* pMouseEvt = static_cast<MouseEvent*>(rVclWindowEvent.GetData());
701 0 : if ( mpImpl->getMouseListeners().getLength() && ( pMouseEvt->IsEnterWindow() || pMouseEvt->IsLeaveWindow() ) )
702 : {
703 0 : awt::MouseEvent aEvent( VCLUnoHelper::createMouseEvent( *pMouseEvt, *this ) );
704 :
705 : Callback aCallback = ::boost::bind(
706 0 : pMouseEvt->IsEnterWindow() ? &MouseListenerMultiplexer::mouseEntered : &MouseListenerMultiplexer::mouseExited,
707 0 : &mpImpl->getMouseListeners(),
708 : aEvent
709 0 : );
710 0 : ImplExecuteAsyncWithoutSolarLock( aCallback );
711 : }
712 :
713 0 : if ( mpImpl->getMouseMotionListeners().getLength() && !pMouseEvt->IsEnterWindow() && !pMouseEvt->IsLeaveWindow() )
714 : {
715 0 : awt::MouseEvent aEvent( VCLUnoHelper::createMouseEvent( *pMouseEvt, *this ) );
716 0 : aEvent.ClickCount = 0; // #92138#
717 0 : if ( pMouseEvt->GetMode() & MouseEventModifiers::SIMPLEMOVE )
718 0 : mpImpl->getMouseMotionListeners().mouseMoved( aEvent );
719 : else
720 0 : mpImpl->getMouseMotionListeners().mouseDragged( aEvent );
721 : }
722 : }
723 0 : break;
724 : case VCLEVENT_WINDOW_MOUSEBUTTONDOWN:
725 : {
726 0 : if ( mpImpl->getMouseListeners().getLength() )
727 : {
728 0 : awt::MouseEvent aEvent( VCLUnoHelper::createMouseEvent( *static_cast<MouseEvent*>(rVclWindowEvent.GetData()), *this ) );
729 : Callback aCallback = ::boost::bind(
730 : &MouseListenerMultiplexer::mousePressed,
731 0 : &mpImpl->getMouseListeners(),
732 : aEvent
733 0 : );
734 0 : ImplExecuteAsyncWithoutSolarLock( aCallback );
735 : }
736 : }
737 0 : break;
738 : case VCLEVENT_WINDOW_MOUSEBUTTONUP:
739 : {
740 0 : if ( mpImpl->getMouseListeners().getLength() )
741 : {
742 0 : awt::MouseEvent aEvent( VCLUnoHelper::createMouseEvent( *static_cast<MouseEvent*>(rVclWindowEvent.GetData()), *this ) );
743 : Callback aCallback = ::boost::bind(
744 : &MouseListenerMultiplexer::mouseReleased,
745 0 : &mpImpl->getMouseListeners(),
746 : aEvent
747 0 : );
748 0 : ImplExecuteAsyncWithoutSolarLock( aCallback );
749 : }
750 : }
751 0 : break;
752 : case VCLEVENT_WINDOW_STARTDOCKING:
753 : {
754 0 : if ( mpImpl->getDockableWindowListeners().getLength() )
755 : {
756 0 : DockingData *pData = static_cast<DockingData*>(rVclWindowEvent.GetData());
757 :
758 0 : if( pData )
759 : {
760 0 : ::com::sun::star::awt::DockingEvent aEvent;
761 0 : aEvent.Source = static_cast<cppu::OWeakObject*>(this);
762 0 : aEvent.TrackingRectangle = AWTRectangle( pData->maTrackRect );
763 0 : aEvent.MousePos.X = pData->maMousePos.X();
764 0 : aEvent.MousePos.Y = pData->maMousePos.Y();
765 0 : aEvent.bLiveMode = pData->mbLivemode;
766 0 : aEvent.bInteractive = pData->mbInteractive;
767 :
768 0 : mpImpl->getDockableWindowListeners().notifyEach( &XDockableWindowListener::startDocking, aEvent );
769 : }
770 : }
771 : }
772 0 : break;
773 : case VCLEVENT_WINDOW_DOCKING:
774 : {
775 0 : if ( mpImpl->getDockableWindowListeners().getLength() )
776 : {
777 0 : DockingData *pData = static_cast<DockingData*>(rVclWindowEvent.GetData());
778 :
779 0 : if( pData )
780 : {
781 0 : ::com::sun::star::awt::DockingEvent aEvent;
782 0 : aEvent.Source = static_cast<cppu::OWeakObject*>(this);
783 0 : aEvent.TrackingRectangle = AWTRectangle( pData->maTrackRect );
784 0 : aEvent.MousePos.X = pData->maMousePos.X();
785 0 : aEvent.MousePos.Y = pData->maMousePos.Y();
786 0 : aEvent.bLiveMode = pData->mbLivemode;
787 0 : aEvent.bInteractive = pData->mbInteractive;
788 :
789 0 : Reference< XDockableWindowListener > xFirstListener;
790 0 : ::cppu::OInterfaceIteratorHelper aIter( mpImpl->getDockableWindowListeners() );
791 0 : while ( aIter.hasMoreElements() && !xFirstListener.is() )
792 : {
793 0 : xFirstListener.set( aIter.next(), UNO_QUERY );
794 : }
795 :
796 : ::com::sun::star::awt::DockingData aDockingData =
797 0 : xFirstListener->docking( aEvent );
798 0 : pData->maTrackRect = VCLRectangle( aDockingData.TrackingRectangle );
799 0 : pData->mbFloating = aDockingData.bFloating;
800 : }
801 : }
802 : }
803 0 : break;
804 : case VCLEVENT_WINDOW_ENDDOCKING:
805 : {
806 0 : if ( mpImpl->getDockableWindowListeners().getLength() )
807 : {
808 0 : EndDockingData *pData = static_cast<EndDockingData*>(rVclWindowEvent.GetData());
809 :
810 0 : if( pData )
811 : {
812 0 : ::com::sun::star::awt::EndDockingEvent aEvent;
813 0 : aEvent.Source = static_cast<cppu::OWeakObject*>(this);
814 0 : aEvent.WindowRectangle = AWTRectangle( pData->maWindowRect );
815 0 : aEvent.bFloating = pData->mbFloating;
816 0 : aEvent.bCancelled = pData->mbCancelled;
817 0 : mpImpl->getDockableWindowListeners().notifyEach( &XDockableWindowListener::endDocking, aEvent );
818 : }
819 : }
820 : }
821 0 : break;
822 : case VCLEVENT_WINDOW_PREPARETOGGLEFLOATING:
823 : {
824 0 : if ( mpImpl->getDockableWindowListeners().getLength() )
825 : {
826 0 : sal_Bool *p_bFloating = static_cast<sal_Bool*>(rVclWindowEvent.GetData());
827 :
828 0 : ::com::sun::star::lang::EventObject aEvent;
829 0 : aEvent.Source = static_cast<cppu::OWeakObject*>(this);
830 :
831 0 : Reference< XDockableWindowListener > xFirstListener;
832 0 : ::cppu::OInterfaceIteratorHelper aIter( mpImpl->getDockableWindowListeners() );
833 0 : while ( aIter.hasMoreElements() && !xFirstListener.is() )
834 : {
835 0 : xFirstListener.set( aIter.next(), UNO_QUERY );
836 : }
837 :
838 0 : *p_bFloating = xFirstListener->prepareToggleFloatingMode( aEvent );
839 : }
840 : }
841 0 : break;
842 : case VCLEVENT_WINDOW_TOGGLEFLOATING:
843 : {
844 0 : if ( mpImpl->getDockableWindowListeners().getLength() )
845 : {
846 0 : ::com::sun::star::lang::EventObject aEvent;
847 0 : aEvent.Source = static_cast<cppu::OWeakObject*>(this);
848 0 : mpImpl->getDockableWindowListeners().notifyEach( &XDockableWindowListener::toggleFloatingMode, aEvent );
849 : }
850 : }
851 0 : break;
852 : case VCLEVENT_WINDOW_ENDPOPUPMODE:
853 : {
854 0 : if ( mpImpl->getDockableWindowListeners().getLength() )
855 : {
856 0 : EndPopupModeData *pData = static_cast<EndPopupModeData*>(rVclWindowEvent.GetData());
857 :
858 0 : if( pData )
859 : {
860 0 : ::com::sun::star::awt::EndPopupModeEvent aEvent;
861 0 : aEvent.Source = static_cast<cppu::OWeakObject*>(this);
862 0 : aEvent.FloatingPosition.X = pData->maFloatingPos.X();
863 0 : aEvent.FloatingPosition.Y = pData->maFloatingPos.Y();
864 0 : aEvent.bTearoff = pData->mbTearoff;
865 0 : mpImpl->getDockableWindowListeners().notifyEach( &XDockableWindowListener::endPopupMode, aEvent );
866 : }
867 : }
868 : }
869 0 : break;
870 :
871 1102628 : }
872 1102628 : }
873 :
874 182 : uno::Reference< accessibility::XAccessibleContext > VCLXWindow::CreateAccessibleContext()
875 : {
876 182 : SolarMutexGuard aGuard;
877 182 : return getAccessibleFactory().createAccessibleContext( this );
878 : }
879 :
880 884 : void VCLXWindow::SetSynthesizingVCLEvent( bool _b )
881 : {
882 884 : mpImpl->mbSynthesizingVCLEvent = _b;
883 884 : }
884 :
885 7 : bool VCLXWindow::IsSynthesizingVCLEvent() const
886 : {
887 7 : return mpImpl->mbSynthesizingVCLEvent;
888 : }
889 :
890 9 : Size VCLXWindow::ImplCalcWindowSize( const Size& rOutSz ) const
891 : {
892 9 : Size aSz = rOutSz;
893 :
894 9 : vcl::Window* pWindow = GetWindow();
895 9 : if ( pWindow )
896 : {
897 : sal_Int32 nLeft, nTop, nRight, nBottom;
898 9 : pWindow->GetBorder( nLeft, nTop, nRight, nBottom );
899 9 : aSz.Width() += nLeft+nRight;
900 9 : aSz.Height() += nTop+nBottom;
901 : }
902 9 : return aSz;
903 : }
904 :
905 :
906 : // ::com::sun::star::lang::XUnoTunnel
907 2663391 : IMPL_XUNOTUNNEL2( VCLXWindow, VCLXDevice )
908 :
909 : // ::com::sun::star::lang::Component
910 124931 : void VCLXWindow::dispose( ) throw(::com::sun::star::uno::RuntimeException, std::exception)
911 : {
912 124931 : SolarMutexGuard aGuard;
913 :
914 124931 : mpImpl->mxViewGraphics = NULL;
915 :
916 124931 : if ( !mpImpl->mbDisposing )
917 : {
918 82218 : mpImpl->mbDisposing = true;
919 :
920 82218 : mpImpl->disposing();
921 :
922 82218 : if ( GetWindow() )
923 : {
924 42649 : VclPtr<OutputDevice> pOutDev = GetOutputDevice();
925 42649 : SetWindow( NULL ); // so that handlers are logged off, if necessary (virtual)
926 42649 : SetOutputDevice( pOutDev );
927 42649 : pOutDev.disposeAndClear();
928 42649 : SetOutputDevice( NULL );
929 : }
930 :
931 : // #i14103# dispose the accessible context after the window has been destroyed,
932 : // otherwise the old value in the child event fired in VCLXAccessibleComponent::ProcessWindowEvent()
933 : // for VCLEVENT_WINDOW_CHILDDESTROYED contains a reference to an already disposed accessible object
934 : try
935 : {
936 82218 : ::com::sun::star::uno::Reference< ::com::sun::star::lang::XComponent > xComponent( mpImpl->mxAccessibleContext, ::com::sun::star::uno::UNO_QUERY );
937 82218 : if ( xComponent.is() )
938 248 : xComponent->dispose();
939 : }
940 0 : catch ( const ::com::sun::star::uno::Exception& )
941 : {
942 : OSL_FAIL( "VCLXWindow::dispose: could not dispose the accessible context!" );
943 : }
944 82218 : mpImpl->mxAccessibleContext.clear();
945 :
946 82218 : mpImpl->mbDisposing = false;
947 124931 : }
948 124931 : }
949 :
950 112 : void VCLXWindow::addEventListener( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener >& rxListener ) throw(::com::sun::star::uno::RuntimeException, std::exception)
951 : {
952 112 : SolarMutexGuard aGuard;
953 :
954 112 : mpImpl->getEventListeners().addInterface( rxListener );
955 112 : }
956 :
957 33 : void VCLXWindow::removeEventListener( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener >& rxListener ) throw(::com::sun::star::uno::RuntimeException, std::exception)
958 : {
959 33 : SolarMutexGuard aGuard;
960 :
961 33 : mpImpl->getEventListeners().removeInterface( rxListener );
962 33 : }
963 :
964 :
965 : // ::com::sun::star::awt::XWindow
966 122710 : void VCLXWindow::setPosSize( sal_Int32 X, sal_Int32 Y, sal_Int32 Width, sal_Int32 Height, sal_Int16 Flags ) throw(::com::sun::star::uno::RuntimeException, std::exception)
967 : {
968 122710 : SolarMutexGuard aGuard;
969 :
970 122710 : if ( GetWindow() )
971 : {
972 122710 : if( vcl::Window::GetDockingManager()->IsDockable( GetWindow() ) )
973 9522 : vcl::Window::GetDockingManager()->SetPosSizePixel( GetWindow() , X, Y, Width, Height, static_cast<PosSizeFlags>(Flags) );
974 : else
975 113188 : GetWindow()->setPosSizePixel( X, Y, Width, Height, static_cast<PosSizeFlags>(Flags) );
976 122710 : }
977 122710 : }
978 :
979 179980 : ::com::sun::star::awt::Rectangle VCLXWindow::getPosSize( ) throw(::com::sun::star::uno::RuntimeException, std::exception)
980 : {
981 179980 : SolarMutexGuard aGuard;
982 :
983 179980 : ::com::sun::star::awt::Rectangle aBounds;
984 179980 : if ( GetWindow() )
985 : {
986 179980 : if( vcl::Window::GetDockingManager()->IsDockable( GetWindow() ) )
987 22041 : aBounds = AWTRectangle( vcl::Window::GetDockingManager()->GetPosSizePixel( GetWindow() ) );
988 : else
989 157939 : aBounds = AWTRectangle( Rectangle( GetWindow()->GetPosPixel(), GetWindow()->GetSizePixel() ) );
990 : }
991 :
992 179980 : return aBounds;
993 : }
994 :
995 49124 : void VCLXWindow::setVisible( sal_Bool bVisible ) throw(::com::sun::star::uno::RuntimeException, std::exception)
996 : {
997 49124 : SolarMutexGuard aGuard;
998 :
999 49124 : vcl::Window* pWindow = GetWindow();
1000 49124 : if ( pWindow )
1001 : {
1002 49123 : mpImpl->setDirectVisible( bVisible );
1003 49123 : pWindow->Show( bVisible && mpImpl->isEnableVisible() );
1004 49124 : }
1005 49124 : }
1006 :
1007 551 : void VCLXWindow::setEnable( sal_Bool bEnable ) throw(::com::sun::star::uno::RuntimeException, std::exception)
1008 : {
1009 551 : SolarMutexGuard aGuard;
1010 :
1011 551 : vcl::Window* pWindow = GetWindow();
1012 551 : if ( pWindow )
1013 : {
1014 551 : pWindow->Enable( bEnable, false ); // #95824# without children!
1015 551 : pWindow->EnableInput( bEnable );
1016 551 : }
1017 551 : }
1018 :
1019 3216 : void VCLXWindow::setFocus( ) throw(::com::sun::star::uno::RuntimeException, std::exception)
1020 : {
1021 3216 : SolarMutexGuard aGuard;
1022 :
1023 3216 : if ( GetWindow() )
1024 3216 : GetWindow()->GrabFocus();
1025 3216 : }
1026 :
1027 23693 : void VCLXWindow::addWindowListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindowListener >& rxListener ) throw(::com::sun::star::uno::RuntimeException, std::exception)
1028 : {
1029 23693 : SolarMutexGuard aGuard;
1030 :
1031 23693 : mpImpl->getWindowListeners().addInterface( rxListener );
1032 :
1033 47386 : Reference< XWindowListener2 > xListener2( rxListener, UNO_QUERY );
1034 23693 : if ( xListener2.is() )
1035 364 : mpImpl->getWindow2Listeners().addInterface( xListener2 );
1036 :
1037 : // #100119# Get all resize events, even if height or width 0, or invisible
1038 23693 : if ( GetWindow() )
1039 47386 : GetWindow()->EnableAllResize( true );
1040 23693 : }
1041 :
1042 13918 : void VCLXWindow::removeWindowListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindowListener >& rxListener ) throw(::com::sun::star::uno::RuntimeException, std::exception)
1043 : {
1044 13918 : SolarMutexGuard aGuard;
1045 :
1046 27836 : Reference< XWindowListener2 > xListener2( rxListener, UNO_QUERY );
1047 13918 : if ( xListener2.is() )
1048 364 : mpImpl->getWindow2Listeners().removeInterface( xListener2 );
1049 :
1050 27836 : mpImpl->getWindowListeners().removeInterface( rxListener );
1051 13918 : }
1052 :
1053 10015 : void VCLXWindow::addFocusListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XFocusListener >& rxListener ) throw(::com::sun::star::uno::RuntimeException, std::exception)
1054 : {
1055 10015 : SolarMutexGuard aGuard;
1056 10015 : mpImpl->getFocusListeners().addInterface( rxListener );
1057 10015 : }
1058 :
1059 9897 : void VCLXWindow::removeFocusListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XFocusListener >& rxListener ) throw(::com::sun::star::uno::RuntimeException, std::exception)
1060 : {
1061 9897 : SolarMutexGuard aGuard;
1062 9897 : mpImpl->getFocusListeners().removeInterface( rxListener );
1063 9897 : }
1064 :
1065 93 : void VCLXWindow::addKeyListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XKeyListener >& rxListener ) throw(::com::sun::star::uno::RuntimeException, std::exception)
1066 : {
1067 93 : SolarMutexGuard aGuard;
1068 93 : mpImpl->getKeyListeners().addInterface( rxListener );
1069 93 : }
1070 :
1071 2 : void VCLXWindow::removeKeyListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XKeyListener >& rxListener ) throw(::com::sun::star::uno::RuntimeException, std::exception)
1072 : {
1073 2 : SolarMutexGuard aGuard;
1074 2 : mpImpl->getKeyListeners().removeInterface( rxListener );
1075 2 : }
1076 :
1077 74 : void VCLXWindow::addMouseListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XMouseListener >& rxListener ) throw(::com::sun::star::uno::RuntimeException, std::exception)
1078 : {
1079 74 : SolarMutexGuard aGuard;
1080 74 : mpImpl->getMouseListeners().addInterface( rxListener );
1081 74 : }
1082 :
1083 56 : void VCLXWindow::removeMouseListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XMouseListener >& rxListener ) throw(::com::sun::star::uno::RuntimeException, std::exception)
1084 : {
1085 56 : SolarMutexGuard aGuard;
1086 56 : mpImpl->getMouseListeners().removeInterface( rxListener );
1087 56 : }
1088 :
1089 9 : void VCLXWindow::addMouseMotionListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XMouseMotionListener >& rxListener ) throw(::com::sun::star::uno::RuntimeException, std::exception)
1090 : {
1091 9 : SolarMutexGuard aGuard;
1092 9 : mpImpl->getMouseMotionListeners().addInterface( rxListener );
1093 9 : }
1094 :
1095 1 : void VCLXWindow::removeMouseMotionListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XMouseMotionListener >& rxListener ) throw(::com::sun::star::uno::RuntimeException, std::exception)
1096 : {
1097 1 : SolarMutexGuard aGuard;
1098 1 : mpImpl->getMouseMotionListeners().removeInterface( rxListener );
1099 1 : }
1100 :
1101 0 : void VCLXWindow::addPaintListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XPaintListener >& rxListener ) throw(::com::sun::star::uno::RuntimeException, std::exception)
1102 : {
1103 0 : SolarMutexGuard aGuard;
1104 0 : mpImpl->getPaintListeners().addInterface( rxListener );
1105 0 : }
1106 :
1107 0 : void VCLXWindow::removePaintListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XPaintListener >& rxListener ) throw(::com::sun::star::uno::RuntimeException, std::exception)
1108 : {
1109 0 : SolarMutexGuard aGuard;
1110 0 : mpImpl->getPaintListeners().removeInterface( rxListener );
1111 0 : }
1112 :
1113 : // ::com::sun::star::awt::XWindowPeer
1114 352 : ::com::sun::star::uno::Reference< ::com::sun::star::awt::XToolkit > VCLXWindow::getToolkit( ) throw(::com::sun::star::uno::RuntimeException, std::exception)
1115 : {
1116 : // no guard. nothing to guard here.
1117 : // 82463 - 12/21/00 - fs
1118 352 : return Application::GetVCLToolkit();
1119 : }
1120 :
1121 0 : void VCLXWindow::setPointer( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XPointer >& rxPointer ) throw(::com::sun::star::uno::RuntimeException, std::exception)
1122 : {
1123 0 : SolarMutexGuard aGuard;
1124 :
1125 0 : VCLXPointer* pPointer = VCLXPointer::GetImplementation( rxPointer );
1126 0 : if ( pPointer )
1127 : {
1128 0 : mpImpl->mxPointer = rxPointer;
1129 0 : if ( GetWindow() )
1130 0 : GetWindow()->SetPointer( pPointer->GetPointer() );
1131 0 : }
1132 0 : }
1133 :
1134 3278 : void VCLXWindow::setBackground( sal_Int32 nColor ) throw(::com::sun::star::uno::RuntimeException, std::exception)
1135 : {
1136 3278 : SolarMutexGuard aGuard;
1137 :
1138 3278 : if ( GetWindow() )
1139 : {
1140 3278 : Color aColor( (sal_uInt32)nColor );
1141 3278 : GetWindow()->SetBackground( aColor );
1142 3278 : GetWindow()->SetControlBackground( aColor );
1143 :
1144 3278 : WindowType eWinType = GetWindow()->GetType();
1145 3278 : if ( ( eWinType == WINDOW_WINDOW ) ||
1146 0 : ( eWinType == WINDOW_WORKWINDOW ) ||
1147 : ( eWinType == WINDOW_FLOATINGWINDOW ) )
1148 : {
1149 3278 : GetWindow()->Invalidate();
1150 : }
1151 3278 : }
1152 3278 : }
1153 :
1154 0 : void VCLXWindow::invalidate( sal_Int16 nInvalidateFlags ) throw(::com::sun::star::uno::RuntimeException, std::exception)
1155 : {
1156 0 : SolarMutexGuard aGuard;
1157 :
1158 0 : if ( GetWindow() )
1159 0 : GetWindow()->Invalidate( static_cast<InvalidateFlags>(nInvalidateFlags) );
1160 0 : }
1161 :
1162 0 : void VCLXWindow::invalidateRect( const ::com::sun::star::awt::Rectangle& rRect, sal_Int16 nInvalidateFlags ) throw(::com::sun::star::uno::RuntimeException, std::exception)
1163 : {
1164 0 : SolarMutexGuard aGuard;
1165 :
1166 0 : if ( GetWindow() )
1167 0 : GetWindow()->Invalidate( VCLRectangle(rRect), static_cast<InvalidateFlags>(nInvalidateFlags) );
1168 0 : }
1169 :
1170 :
1171 : // ::com::sun::star::awt::XVclWindowPeer
1172 0 : sal_Bool VCLXWindow::isChild( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindowPeer >& rxPeer ) throw(::com::sun::star::uno::RuntimeException, std::exception)
1173 : {
1174 0 : SolarMutexGuard aGuard;
1175 :
1176 0 : bool bIsChild = false;
1177 0 : vcl::Window* pWindow = GetWindow();
1178 0 : if ( pWindow )
1179 : {
1180 0 : vcl::Window* pPeerWindow = VCLUnoHelper::GetWindow( rxPeer );
1181 0 : bIsChild = pPeerWindow && pWindow->IsChild( pPeerWindow );
1182 : }
1183 :
1184 0 : return bIsChild;
1185 : }
1186 :
1187 4578 : void VCLXWindow::setDesignMode( sal_Bool bOn ) throw(::com::sun::star::uno::RuntimeException, std::exception)
1188 : {
1189 4578 : SolarMutexGuard aGuard;
1190 :
1191 4578 : mpImpl->mbDesignMode = bOn;
1192 4578 : }
1193 :
1194 13708 : sal_Bool VCLXWindow::isDesignMode( ) throw(::com::sun::star::uno::RuntimeException, std::exception)
1195 : {
1196 13708 : SolarMutexGuard aGuard;
1197 13708 : return mpImpl->mbDesignMode;
1198 : }
1199 :
1200 0 : void VCLXWindow::enableClipSiblings( sal_Bool bClip ) throw(::com::sun::star::uno::RuntimeException, std::exception)
1201 : {
1202 0 : SolarMutexGuard aGuard;
1203 :
1204 0 : if ( GetWindow() )
1205 0 : GetWindow()->EnableClipSiblings( bClip );
1206 0 : }
1207 :
1208 0 : void VCLXWindow::setForeground( sal_Int32 nColor ) throw(::com::sun::star::uno::RuntimeException, std::exception)
1209 : {
1210 0 : SolarMutexGuard aGuard;
1211 :
1212 0 : if ( GetWindow() )
1213 : {
1214 0 : Color aColor( (sal_uInt32)nColor );
1215 0 : GetWindow()->SetControlForeground( aColor );
1216 0 : }
1217 0 : }
1218 :
1219 0 : void VCLXWindow::setControlFont( const ::com::sun::star::awt::FontDescriptor& rFont ) throw(::com::sun::star::uno::RuntimeException, std::exception)
1220 : {
1221 0 : SolarMutexGuard aGuard;
1222 :
1223 0 : if ( GetWindow() )
1224 0 : GetWindow()->SetControlFont( VCLUnoHelper::CreateFont( rFont, GetWindow()->GetControlFont() ) );
1225 0 : }
1226 :
1227 0 : void VCLXWindow::getStyles( sal_Int16 nType, ::com::sun::star::awt::FontDescriptor& Font, sal_Int32& ForegroundColor, sal_Int32& BackgroundColor ) throw(::com::sun::star::uno::RuntimeException, std::exception)
1228 : {
1229 0 : SolarMutexGuard aGuard;
1230 :
1231 0 : if ( GetWindow() )
1232 : {
1233 0 : const StyleSettings& rStyleSettings = GetWindow()->GetSettings().GetStyleSettings();
1234 :
1235 0 : switch ( nType )
1236 : {
1237 : case ::com::sun::star::awt::Style::FRAME:
1238 : {
1239 0 : Font = VCLUnoHelper::CreateFontDescriptor( rStyleSettings.GetAppFont() );
1240 0 : ForegroundColor = rStyleSettings.GetWindowTextColor().GetColor();
1241 0 : BackgroundColor = rStyleSettings.GetWindowColor().GetColor();
1242 : }
1243 0 : break;
1244 : case ::com::sun::star::awt::Style::DIALOG:
1245 : {
1246 0 : Font = VCLUnoHelper::CreateFontDescriptor( rStyleSettings.GetAppFont() );
1247 0 : ForegroundColor = rStyleSettings.GetDialogTextColor().GetColor();
1248 0 : BackgroundColor = rStyleSettings.GetDialogColor().GetColor();
1249 : }
1250 0 : break;
1251 : default: OSL_FAIL( "VCLWindow::getStyles() - unknown Type" );
1252 : }
1253 :
1254 0 : }
1255 0 : }
1256 :
1257 : namespace toolkit
1258 : {
1259 267 : static void setColorSettings( vcl::Window* _pWindow, const ::com::sun::star::uno::Any& _rValue,
1260 : void (StyleSettings::*pSetter)( const Color& ), const Color& (StyleSettings::*pGetter)( ) const )
1261 : {
1262 267 : sal_Int32 nColor = 0;
1263 267 : if ( !( _rValue >>= nColor ) )
1264 262 : nColor = (Application::GetSettings().GetStyleSettings().*pGetter)().GetColor();
1265 :
1266 267 : AllSettings aSettings = _pWindow->GetSettings();
1267 534 : StyleSettings aStyleSettings = aSettings.GetStyleSettings();
1268 :
1269 267 : (aStyleSettings.*pSetter)( Color( nColor ) );
1270 :
1271 267 : aSettings.SetStyleSettings( aStyleSettings );
1272 534 : _pWindow->SetSettings( aSettings, true );
1273 267 : }
1274 : }
1275 :
1276 : // Terminated by BASEPROPERTY_NOTFOUND (or 0)
1277 411 : void VCLXWindow::PushPropertyIds( std::list< sal_uInt16 > &rIds,
1278 : int nFirstId, ...)
1279 : {
1280 : va_list pVarArgs;
1281 411 : va_start( pVarArgs, nFirstId );
1282 :
1283 11905 : for ( int nId = nFirstId; nId != BASEPROPERTY_NOTFOUND;
1284 18056 : nId = va_arg( pVarArgs, int ) )
1285 9850 : rIds.push_back( (sal_uInt16) nId );
1286 :
1287 411 : va_end( pVarArgs );
1288 411 : }
1289 :
1290 411 : void VCLXWindow::ImplGetPropertyIds( std::list< sal_uInt16 > &rIds, bool bWithDefaults )
1291 : {
1292 : // These are common across ~all VCLXWindow derived classes
1293 411 : if( bWithDefaults )
1294 : PushPropertyIds( rIds,
1295 : BASEPROPERTY_ALIGN,
1296 : BASEPROPERTY_BACKGROUNDCOLOR,
1297 : BASEPROPERTY_BORDER,
1298 : BASEPROPERTY_BORDERCOLOR,
1299 : BASEPROPERTY_DEFAULTCONTROL,
1300 : BASEPROPERTY_ENABLED,
1301 : BASEPROPERTY_FONTDESCRIPTOR,
1302 : BASEPROPERTY_HELPTEXT,
1303 : BASEPROPERTY_HELPURL,
1304 : BASEPROPERTY_TEXT,
1305 : BASEPROPERTY_PRINTABLE,
1306 : BASEPROPERTY_ENABLEVISIBLE, // for visibility
1307 : BASEPROPERTY_TABSTOP,
1308 0 : 0);
1309 :
1310 : // lovely hack from:
1311 : // void UnoControlModel::ImplRegisterProperty( sal_uInt16 nPropId )
1312 411 : std::list< sal_uInt16 >::const_iterator iter;
1313 3726 : for( iter = rIds.begin(); iter != rIds.end(); ++iter) {
1314 3688 : if( *iter == BASEPROPERTY_FONTDESCRIPTOR )
1315 : {
1316 : // some properties are not included in the FontDescriptor, but every time
1317 : // when we have a FontDescriptor we want to have these properties too.
1318 : // => Easier to register the here, istead everywhere where I register the FontDescriptor...
1319 :
1320 373 : rIds.push_back( BASEPROPERTY_TEXTCOLOR );
1321 373 : rIds.push_back( BASEPROPERTY_TEXTLINECOLOR );
1322 373 : rIds.push_back( BASEPROPERTY_FONTRELIEF );
1323 373 : rIds.push_back( BASEPROPERTY_FONTEMPHASISMARK );
1324 373 : break;
1325 : }
1326 : }
1327 411 : }
1328 :
1329 0 : void VCLXWindow::GetPropertyIds( std::list< sal_uInt16 >& _out_rIds )
1330 : {
1331 0 : return ImplGetPropertyIds( _out_rIds, mpImpl->mbWithDefaultProps );
1332 : }
1333 :
1334 0 : ::cppu::OInterfaceContainerHelper& VCLXWindow::GetContainerListeners()
1335 : {
1336 0 : return mpImpl->getContainerListeners();
1337 : }
1338 :
1339 19761 : ::cppu::OInterfaceContainerHelper& VCLXWindow::GetTopWindowListeners()
1340 : {
1341 19761 : return mpImpl->getTopWindowListeners();
1342 : }
1343 :
1344 : namespace
1345 : {
1346 891 : void lcl_updateWritingMode( vcl::Window& _rWindow, const sal_Int16 _nWritingMode, const sal_Int16 _nContextWritingMode )
1347 : {
1348 891 : bool bEnableRTL = false;
1349 891 : switch ( _nWritingMode )
1350 : {
1351 2 : case WritingMode2::LR_TB: bEnableRTL = false; break;
1352 0 : case WritingMode2::RL_TB: bEnableRTL = true; break;
1353 : case WritingMode2::CONTEXT:
1354 : {
1355 : // consult our ContextWritingMode. If it has an explicit RTL/LTR value, then use
1356 : // it. If it doesn't (but is CONTEXT itself), then just ask the parent window of our
1357 : // own window for its RTL mode
1358 677 : switch ( _nContextWritingMode )
1359 : {
1360 404 : case WritingMode2::LR_TB: bEnableRTL = false; break;
1361 84 : case WritingMode2::RL_TB: bEnableRTL = true; break;
1362 : case WritingMode2::CONTEXT:
1363 : {
1364 125 : const vcl::Window* pParent = _rWindow.GetParent();
1365 : OSL_ENSURE( pParent, "lcl_updateWritingMode: cannot determine context's writing mode!" );
1366 125 : if ( pParent )
1367 125 : bEnableRTL = pParent->IsRTLEnabled();
1368 : }
1369 125 : break;
1370 : }
1371 : }
1372 677 : break;
1373 : default:
1374 : OSL_FAIL( "lcl_updateWritingMode: unsupported WritingMode!" );
1375 : } // switch ( nWritingMode )
1376 :
1377 891 : _rWindow.EnableRTL( bEnableRTL );
1378 891 : }
1379 : }
1380 :
1381 28904 : void VCLXWindow::setProperty( const OUString& PropertyName, const ::com::sun::star::uno::Any& Value )
1382 : throw(::com::sun::star::uno::RuntimeException,
1383 : std::exception)
1384 : {
1385 28904 : SolarMutexGuard aGuard;
1386 :
1387 28904 : vcl::Window* pWindow = GetWindow();
1388 28904 : if ( !pWindow )
1389 28904 : return;
1390 :
1391 28904 : bool bVoid = Value.getValueType().getTypeClass() == ::com::sun::star::uno::TypeClass_VOID;
1392 :
1393 28904 : WindowType eWinType = pWindow->GetType();
1394 28904 : sal_uInt16 nPropType = GetPropertyId( PropertyName );
1395 28904 : switch ( nPropType )
1396 : {
1397 : case BASEPROPERTY_REFERENCE_DEVICE:
1398 : {
1399 228 : Control* pControl = dynamic_cast< Control* >( pWindow );
1400 : OSL_ENSURE( pControl, "VCLXWindow::setProperty( RefDevice ): need a Control for this!" );
1401 228 : if ( !pControl )
1402 0 : break;
1403 228 : Reference< XDevice > xDevice( Value, UNO_QUERY );
1404 228 : OutputDevice* pDevice = VCLUnoHelper::GetOutputDevice( xDevice );
1405 228 : pControl->SetReferenceDevice( pDevice );
1406 : }
1407 228 : break;
1408 :
1409 : case BASEPROPERTY_CONTEXT_WRITING_MODE:
1410 : {
1411 479 : OSL_VERIFY( Value >>= mpImpl->mnContextWritingMode );
1412 479 : if ( mpImpl->mnWritingMode == WritingMode2::CONTEXT )
1413 406 : lcl_updateWritingMode( *pWindow, mpImpl->mnWritingMode, mpImpl->mnContextWritingMode );
1414 : }
1415 479 : break;
1416 :
1417 : case BASEPROPERTY_WRITING_MODE:
1418 : {
1419 485 : bool bProperType = ( Value >>= mpImpl->mnWritingMode );
1420 : OSL_ENSURE( bProperType, "VCLXWindow::setProperty( 'WritingMode' ): illegal value type!" );
1421 485 : if ( bProperType )
1422 485 : lcl_updateWritingMode( *pWindow, mpImpl->mnWritingMode, mpImpl->mnContextWritingMode );
1423 : }
1424 485 : break;
1425 :
1426 : case BASEPROPERTY_MOUSE_WHEEL_BEHAVIOUR:
1427 : {
1428 195 : sal_uInt16 nWheelBehavior( css::awt::MouseWheelBehavior::SCROLL_FOCUS_ONLY );
1429 195 : OSL_VERIFY( Value >>= nWheelBehavior );
1430 :
1431 195 : AllSettings aSettings = pWindow->GetSettings();
1432 390 : MouseSettings aMouseSettings = aSettings.GetMouseSettings();
1433 :
1434 195 : MouseWheelBehaviour nVclBehavior( MouseWheelBehaviour::FocusOnly );
1435 195 : switch ( nWheelBehavior )
1436 : {
1437 0 : case css::awt::MouseWheelBehavior::SCROLL_DISABLED: nVclBehavior = MouseWheelBehaviour::Disable; break;
1438 85 : case css::awt::MouseWheelBehavior::SCROLL_FOCUS_ONLY: nVclBehavior = MouseWheelBehaviour::FocusOnly; break;
1439 35 : case css::awt::MouseWheelBehavior::SCROLL_ALWAYS: nVclBehavior = MouseWheelBehaviour::ALWAYS; break;
1440 : default:
1441 : OSL_FAIL( "VCLXWindow::setProperty( 'MouseWheelBehavior' ): illegal property value!" );
1442 : }
1443 :
1444 195 : aMouseSettings.SetWheelBehavior( nVclBehavior );
1445 195 : aSettings.SetMouseSettings( aMouseSettings );
1446 390 : pWindow->SetSettings( aSettings, true );
1447 : }
1448 195 : break;
1449 :
1450 : case BASEPROPERTY_NATIVE_WIDGET_LOOK:
1451 : {
1452 466 : bool bEnable( true );
1453 466 : OSL_VERIFY( Value >>= bEnable );
1454 466 : pWindow->EnableNativeWidget( bEnable );
1455 : }
1456 466 : break;
1457 :
1458 : case BASEPROPERTY_PLUGINPARENT:
1459 : {
1460 : // set parent handle
1461 0 : SetSystemParent_Impl( Value );
1462 : }
1463 0 : break;
1464 :
1465 : case BASEPROPERTY_ENABLED:
1466 : {
1467 467 : bool b = bool();
1468 467 : if ( Value >>= b )
1469 467 : setEnable( b );
1470 : }
1471 467 : break;
1472 : case BASEPROPERTY_ENABLEVISIBLE:
1473 : {
1474 478 : bool b = false;
1475 478 : if ( Value >>= b )
1476 : {
1477 478 : if( b != mpImpl->isEnableVisible() )
1478 : {
1479 165 : mpImpl->setEnableVisible( b );
1480 165 : pWindow->Show( b && mpImpl->isDirectVisible() );
1481 : }
1482 : }
1483 : }
1484 478 : break;
1485 : case BASEPROPERTY_TEXT:
1486 : case BASEPROPERTY_LABEL:
1487 : case BASEPROPERTY_TITLE:
1488 : {
1489 155 : OUString aText;
1490 155 : if ( Value >>= aText )
1491 : {
1492 155 : switch (eWinType)
1493 : {
1494 : case WINDOW_OKBUTTON:
1495 : case WINDOW_CANCELBUTTON:
1496 : case WINDOW_HELPBUTTON:
1497 : // Standard Button: overwrite only if not empty.
1498 0 : if (!aText.isEmpty())
1499 0 : pWindow->SetText( aText );
1500 0 : break;
1501 :
1502 : default:
1503 155 : pWindow->SetText( aText );
1504 155 : break;
1505 : }
1506 155 : }
1507 : }
1508 155 : break;
1509 : case BASEPROPERTY_ACCESSIBLENAME:
1510 : {
1511 0 : OUString aText;
1512 0 : if ( Value >>= aText )
1513 0 : pWindow->SetAccessibleName( aText );
1514 : }
1515 0 : break;
1516 : case BASEPROPERTY_HELPURL:
1517 : {
1518 416 : OUString aURL;
1519 416 : if ( Value >>= aURL )
1520 : {
1521 416 : INetURLObject aHelpURL( aURL );
1522 416 : if ( aHelpURL.GetProtocol() == INetProtocol::Hid )
1523 0 : pWindow->SetHelpId( OUStringToOString( aHelpURL.GetURLPath(), RTL_TEXTENCODING_UTF8 ) );
1524 : else
1525 416 : pWindow->SetHelpId( OUStringToOString( aURL, RTL_TEXTENCODING_UTF8 ) );
1526 416 : }
1527 : }
1528 416 : break;
1529 : case BASEPROPERTY_HELPTEXT:
1530 : {
1531 504 : OUString aHelpText;
1532 504 : if ( Value >>= aHelpText )
1533 : {
1534 504 : pWindow->SetQuickHelpText( aHelpText );
1535 504 : }
1536 : }
1537 504 : break;
1538 : case BASEPROPERTY_FONTDESCRIPTOR:
1539 : {
1540 1311 : if ( bVoid )
1541 0 : pWindow->SetControlFont( vcl::Font() );
1542 : else
1543 : {
1544 1311 : ::com::sun::star::awt::FontDescriptor aFont;
1545 1311 : if ( Value >>= aFont )
1546 1311 : pWindow->SetControlFont( VCLUnoHelper::CreateFont( aFont, pWindow->GetControlFont() ) );
1547 : }
1548 : }
1549 1311 : break;
1550 : case BASEPROPERTY_FONTRELIEF:
1551 : {
1552 400 : sal_Int16 n = sal_Int16();
1553 400 : if ( Value >>= n )
1554 : {
1555 400 : vcl::Font aFont = pWindow->GetControlFont();
1556 400 : aFont.SetRelief( (FontRelief)n );
1557 400 : pWindow->SetControlFont( aFont );
1558 : }
1559 : }
1560 400 : break;
1561 : case BASEPROPERTY_FONTEMPHASISMARK:
1562 : {
1563 400 : sal_Int16 n = sal_Int16();
1564 400 : if ( Value >>= n )
1565 : {
1566 400 : vcl::Font aFont = pWindow->GetControlFont();
1567 400 : aFont.SetEmphasisMark( n );
1568 400 : pWindow->SetControlFont( aFont );
1569 : }
1570 : }
1571 400 : break;
1572 : case BASEPROPERTY_BACKGROUNDCOLOR:
1573 320 : if ( bVoid )
1574 : {
1575 281 : switch ( eWinType )
1576 : {
1577 : // set dialog color for default
1578 : case WINDOW_DIALOG:
1579 : case WINDOW_MESSBOX:
1580 : case WINDOW_INFOBOX:
1581 : case WINDOW_WARNINGBOX:
1582 : case WINDOW_ERRORBOX:
1583 : case WINDOW_QUERYBOX:
1584 : case WINDOW_TABPAGE:
1585 : {
1586 2 : Color aColor = pWindow->GetSettings().GetStyleSettings().GetDialogColor();
1587 2 : pWindow->SetBackground( aColor );
1588 2 : pWindow->SetControlBackground( aColor );
1589 2 : break;
1590 : }
1591 :
1592 : case WINDOW_FIXEDTEXT:
1593 : case WINDOW_CHECKBOX:
1594 : case WINDOW_RADIOBUTTON:
1595 : case WINDOW_GROUPBOX:
1596 : case WINDOW_FIXEDLINE:
1597 : {
1598 : // support transparency only for special controls
1599 36 : pWindow->SetBackground();
1600 36 : pWindow->SetControlBackground();
1601 36 : pWindow->SetPaintTransparent( true );
1602 36 : break;
1603 : }
1604 :
1605 : default:
1606 : {
1607 : // default code which enables transparency for
1608 : // compound controls. It's not real transparency
1609 : // as most of these controls repaint their client
1610 : // area completely new.
1611 243 : if ( pWindow->IsCompoundControl() )
1612 93 : pWindow->SetBackground();
1613 243 : pWindow->SetControlBackground();
1614 243 : break;
1615 : }
1616 : }
1617 : }
1618 : else
1619 : {
1620 39 : sal_Int32 nColor = 0;
1621 39 : if ( Value >>= nColor )
1622 : {
1623 39 : Color aColor( nColor );
1624 39 : pWindow->SetControlBackground( aColor );
1625 39 : pWindow->SetBackground( aColor );
1626 39 : switch ( eWinType )
1627 : {
1628 : // reset paint transparent mode
1629 : case WINDOW_FIXEDTEXT:
1630 : case WINDOW_CHECKBOX:
1631 : case WINDOW_RADIOBUTTON:
1632 : case WINDOW_GROUPBOX:
1633 : case WINDOW_FIXEDLINE:
1634 8 : pWindow->SetPaintTransparent( false );
1635 : default: ;
1636 : }
1637 39 : pWindow->Invalidate(); // Invalidate if control does not respond to it
1638 : }
1639 : }
1640 320 : break;
1641 : case BASEPROPERTY_TEXTCOLOR:
1642 355 : if ( bVoid )
1643 : {
1644 317 : pWindow->SetControlForeground();
1645 : }
1646 : else
1647 : {
1648 38 : sal_Int32 nColor = 0;
1649 38 : if ( Value >>= nColor )
1650 : {
1651 38 : Color aColor( nColor );
1652 38 : pWindow->SetTextColor( aColor );
1653 38 : pWindow->SetControlForeground( aColor );
1654 : }
1655 : }
1656 355 : break;
1657 : case BASEPROPERTY_TEXTLINECOLOR:
1658 337 : if ( bVoid )
1659 : {
1660 337 : pWindow->SetTextLineColor();
1661 : }
1662 : else
1663 : {
1664 0 : sal_Int32 nColor = 0;
1665 0 : if ( Value >>= nColor )
1666 : {
1667 0 : Color aColor( nColor );
1668 0 : pWindow->SetTextLineColor( aColor );
1669 : }
1670 : }
1671 337 : break;
1672 : case BASEPROPERTY_FILLCOLOR:
1673 1 : if ( bVoid )
1674 1 : pWindow->SetFillColor();
1675 : else
1676 : {
1677 0 : sal_Int32 nColor = 0;
1678 0 : if ( Value >>= nColor )
1679 : {
1680 0 : Color aColor( nColor );
1681 0 : pWindow->SetFillColor( aColor );
1682 : }
1683 : }
1684 1 : break;
1685 : case BASEPROPERTY_LINECOLOR:
1686 0 : if ( bVoid )
1687 0 : pWindow->SetLineColor();
1688 : else
1689 : {
1690 0 : sal_Int32 nColor = 0;
1691 0 : if ( Value >>= nColor )
1692 : {
1693 0 : Color aColor( nColor );
1694 0 : pWindow->SetLineColor( aColor );
1695 : }
1696 : }
1697 0 : break;
1698 : case BASEPROPERTY_BORDER:
1699 : {
1700 283 : WinBits nStyle = pWindow->GetStyle();
1701 283 : sal_uInt16 nTmp = 0;
1702 283 : Value >>= nTmp;
1703 283 : WindowBorderStyle nBorder = static_cast<WindowBorderStyle>(nTmp);
1704 283 : if ( !bool(nBorder) )
1705 : {
1706 12 : pWindow->SetStyle( nStyle & ~WB_BORDER );
1707 : }
1708 : else
1709 : {
1710 271 : pWindow->SetStyle( nStyle | WB_BORDER );
1711 271 : pWindow->SetBorderStyle( nBorder );
1712 : }
1713 : }
1714 283 : break;
1715 : case BASEPROPERTY_TABSTOP:
1716 : {
1717 375 : WinBits nStyle = pWindow->GetStyle() & ~WB_TABSTOP;
1718 375 : if ( !bVoid )
1719 : {
1720 6 : bool bTab = false;
1721 6 : Value >>= bTab;
1722 6 : if ( bTab )
1723 6 : nStyle |= WB_TABSTOP;
1724 : else
1725 0 : nStyle |= WB_NOTABSTOP;
1726 : }
1727 375 : pWindow->SetStyle( nStyle );
1728 : }
1729 375 : break;
1730 : case BASEPROPERTY_VERTICALALIGN:
1731 : {
1732 275 : VerticalAlignment eAlign = VerticalAlignment_MAKE_FIXED_SIZE;
1733 275 : WinBits nStyle = pWindow->GetStyle();
1734 275 : nStyle &= ~(WB_TOP|WB_VCENTER|WB_BOTTOM);
1735 275 : if ( !bVoid )
1736 31 : Value >>= eAlign;
1737 275 : switch ( eAlign )
1738 : {
1739 : case VerticalAlignment_TOP:
1740 0 : nStyle |= WB_TOP;
1741 0 : break;
1742 : case VerticalAlignment_MIDDLE:
1743 31 : nStyle |= WB_VCENTER;
1744 31 : break;
1745 : case VerticalAlignment_BOTTOM:
1746 0 : nStyle |= WB_BOTTOM;
1747 0 : break;
1748 : default: ; // for warning free code, MAKE_FIXED_SIZE
1749 : }
1750 275 : pWindow->SetStyle( nStyle );
1751 : }
1752 275 : break;
1753 : case BASEPROPERTY_ALIGN:
1754 : {
1755 324 : sal_Int16 nAlign = PROPERTY_ALIGN_LEFT;
1756 324 : switch ( eWinType )
1757 : {
1758 : case WINDOW_COMBOBOX:
1759 : case WINDOW_BUTTON:
1760 : case WINDOW_PUSHBUTTON:
1761 : case WINDOW_OKBUTTON:
1762 : case WINDOW_CANCELBUTTON:
1763 : case WINDOW_HELPBUTTON:
1764 79 : nAlign = PROPERTY_ALIGN_CENTER;
1765 : // no break here!
1766 : case WINDOW_FIXEDTEXT:
1767 : case WINDOW_EDIT:
1768 : case WINDOW_MULTILINEEDIT:
1769 : case WINDOW_CHECKBOX:
1770 : case WINDOW_RADIOBUTTON:
1771 : case WINDOW_LISTBOX:
1772 : {
1773 209 : WinBits nStyle = pWindow->GetStyle();
1774 209 : nStyle &= ~(WB_LEFT|WB_CENTER|WB_RIGHT);
1775 209 : if ( !bVoid )
1776 209 : Value >>= nAlign;
1777 209 : if ( nAlign == PROPERTY_ALIGN_LEFT )
1778 133 : nStyle |= WB_LEFT;
1779 76 : else if ( nAlign == PROPERTY_ALIGN_CENTER )
1780 76 : nStyle |= WB_CENTER;
1781 : else
1782 0 : nStyle |= WB_RIGHT;
1783 209 : pWindow->SetStyle( nStyle );
1784 : }
1785 209 : break;
1786 : }
1787 : }
1788 324 : break;
1789 : case BASEPROPERTY_MULTILINE:
1790 : {
1791 184 : if ( ( eWinType == WINDOW_FIXEDTEXT )
1792 182 : || ( eWinType == WINDOW_CHECKBOX )
1793 161 : || ( eWinType == WINDOW_RADIOBUTTON )
1794 140 : || ( eWinType == WINDOW_BUTTON )
1795 140 : || ( eWinType == WINDOW_PUSHBUTTON )
1796 89 : || ( eWinType == WINDOW_OKBUTTON )
1797 89 : || ( eWinType == WINDOW_CANCELBUTTON )
1798 89 : || ( eWinType == WINDOW_HELPBUTTON )
1799 : )
1800 : {
1801 95 : WinBits nStyle = pWindow->GetStyle();
1802 95 : bool bMulti = false;
1803 95 : Value >>= bMulti;
1804 95 : if ( bMulti )
1805 21 : nStyle |= WB_WORDBREAK;
1806 : else
1807 74 : nStyle &= ~WB_WORDBREAK;
1808 95 : pWindow->SetStyle( nStyle );
1809 : }
1810 : }
1811 184 : break;
1812 : case BASEPROPERTY_ORIENTATION:
1813 : {
1814 0 : switch ( eWinType )
1815 : {
1816 : case WINDOW_FIXEDLINE:
1817 : {
1818 0 : sal_Int32 nOrientation = 0;
1819 0 : if ( Value >>= nOrientation )
1820 : {
1821 0 : WinBits nStyle = pWindow->GetStyle();
1822 0 : nStyle &= ~(WB_HORZ|WB_VERT);
1823 0 : if ( nOrientation == 0 )
1824 0 : nStyle |= WB_HORZ;
1825 : else
1826 0 : nStyle |= WB_VERT;
1827 :
1828 0 : pWindow->SetStyle( nStyle );
1829 : }
1830 : }
1831 0 : break;
1832 : }
1833 : }
1834 0 : break;
1835 : case BASEPROPERTY_AUTOMNEMONICS:
1836 : {
1837 0 : bool bAutoMnemonics = false;
1838 0 : Value >>= bAutoMnemonics;
1839 0 : AllSettings aSettings = pWindow->GetSettings();
1840 0 : StyleSettings aStyleSettings = aSettings.GetStyleSettings();
1841 0 : if ( aStyleSettings.GetAutoMnemonic() != bAutoMnemonics )
1842 : {
1843 0 : aStyleSettings.SetAutoMnemonic( bAutoMnemonics );
1844 0 : aSettings.SetStyleSettings( aStyleSettings );
1845 0 : pWindow->SetSettings( aSettings );
1846 0 : }
1847 : }
1848 0 : break;
1849 : case BASEPROPERTY_MOUSETRANSPARENT:
1850 : {
1851 0 : bool bMouseTransparent = false;
1852 0 : Value >>= bMouseTransparent;
1853 0 : pWindow->SetMouseTransparent( bMouseTransparent );
1854 : }
1855 0 : break;
1856 : case BASEPROPERTY_PAINTTRANSPARENT:
1857 : {
1858 1 : bool bPaintTransparent = false;
1859 1 : Value >>= bPaintTransparent;
1860 1 : pWindow->SetPaintTransparent( bPaintTransparent );
1861 : // pWindow->SetBackground();
1862 : }
1863 1 : break;
1864 :
1865 : case BASEPROPERTY_REPEAT:
1866 : {
1867 171 : bool bRepeat( false );
1868 171 : Value >>= bRepeat;
1869 :
1870 171 : WinBits nStyle = pWindow->GetStyle();
1871 171 : if ( bRepeat )
1872 43 : nStyle |= WB_REPEAT;
1873 : else
1874 128 : nStyle &= ~WB_REPEAT;
1875 171 : pWindow->SetStyle( nStyle );
1876 : }
1877 171 : break;
1878 :
1879 : case BASEPROPERTY_REPEAT_DELAY:
1880 : {
1881 198 : sal_Int32 nRepeatDelay = 0;
1882 198 : if ( Value >>= nRepeatDelay )
1883 : {
1884 198 : AllSettings aSettings = pWindow->GetSettings();
1885 396 : MouseSettings aMouseSettings = aSettings.GetMouseSettings();
1886 :
1887 198 : aMouseSettings.SetButtonRepeat( nRepeatDelay );
1888 198 : aSettings.SetMouseSettings( aMouseSettings );
1889 :
1890 396 : pWindow->SetSettings( aSettings, true );
1891 : }
1892 : }
1893 198 : break;
1894 :
1895 : case BASEPROPERTY_SYMBOL_COLOR:
1896 2 : ::toolkit::setColorSettings( pWindow, Value, &StyleSettings::SetButtonTextColor, &StyleSettings::GetButtonTextColor );
1897 2 : break;
1898 :
1899 : case BASEPROPERTY_BORDERCOLOR:
1900 265 : ::toolkit::setColorSettings( pWindow, Value, &StyleSettings::SetMonoColor, &StyleSettings::GetMonoColor);
1901 265 : break;
1902 : case BASEPROPERTY_DEFAULTCONTROL:
1903 : {
1904 496 : OUString aName;
1905 496 : Value >>= aName;
1906 496 : break;
1907 : }
1908 28904 : }
1909 : }
1910 :
1911 52 : ::com::sun::star::uno::Any VCLXWindow::getProperty( const OUString& PropertyName ) throw(::com::sun::star::uno::RuntimeException, std::exception)
1912 : {
1913 52 : SolarMutexGuard aGuard;
1914 :
1915 52 : ::com::sun::star::uno::Any aProp;
1916 52 : if ( GetWindow() )
1917 : {
1918 52 : WindowType eWinType = GetWindow()->GetType();
1919 52 : sal_uInt16 nPropType = GetPropertyId( PropertyName );
1920 52 : switch ( nPropType )
1921 : {
1922 : case BASEPROPERTY_REFERENCE_DEVICE:
1923 : {
1924 0 : VclPtr<Control> pControl = GetAsDynamic<Control >();
1925 : OSL_ENSURE( pControl, "VCLXWindow::setProperty( RefDevice ): need a Control for this!" );
1926 0 : if ( !pControl )
1927 0 : break;
1928 :
1929 0 : VCLXDevice* pDevice = new VCLXDevice;
1930 0 : pDevice->SetOutputDevice( pControl->GetReferenceDevice() );
1931 0 : aProp <<= Reference< XDevice >( pDevice );
1932 : }
1933 0 : break;
1934 :
1935 : case BASEPROPERTY_CONTEXT_WRITING_MODE:
1936 0 : aProp <<= mpImpl->mnContextWritingMode;
1937 0 : break;
1938 :
1939 : case BASEPROPERTY_WRITING_MODE:
1940 0 : aProp <<= mpImpl->mnWritingMode;
1941 0 : break;
1942 :
1943 : case BASEPROPERTY_MOUSE_WHEEL_BEHAVIOUR:
1944 : {
1945 0 : MouseWheelBehaviour nVclBehavior = GetWindow()->GetSettings().GetMouseSettings().GetWheelBehavior();
1946 0 : sal_uInt16 nBehavior = css::awt::MouseWheelBehavior::SCROLL_FOCUS_ONLY;
1947 0 : switch ( nVclBehavior )
1948 : {
1949 0 : case MouseWheelBehaviour::Disable: nBehavior = css::awt::MouseWheelBehavior::SCROLL_DISABLED; break;
1950 0 : case MouseWheelBehaviour::FocusOnly: nBehavior = css::awt::MouseWheelBehavior::SCROLL_FOCUS_ONLY; break;
1951 0 : case MouseWheelBehaviour::ALWAYS: nBehavior = css::awt::MouseWheelBehavior::SCROLL_ALWAYS; break;
1952 : default:
1953 : OSL_FAIL( "VCLXWindow::getProperty( 'MouseWheelBehavior' ): illegal VCL value!" );
1954 : }
1955 0 : aProp <<= nBehavior;
1956 : }
1957 0 : break;
1958 :
1959 : case BASEPROPERTY_NATIVE_WIDGET_LOOK:
1960 0 : aProp <<= GetWindow()->IsNativeWidgetEnabled();
1961 0 : break;
1962 :
1963 : case BASEPROPERTY_ENABLED:
1964 0 : aProp <<= GetWindow()->IsEnabled();
1965 0 : break;
1966 :
1967 : case BASEPROPERTY_ENABLEVISIBLE:
1968 0 : aProp <<= mpImpl->isEnableVisible();
1969 0 : break;
1970 :
1971 : case BASEPROPERTY_HIGHCONTRASTMODE:
1972 0 : aProp <<= GetWindow()->GetSettings().GetStyleSettings().GetHighContrastMode();
1973 0 : break;
1974 :
1975 : case BASEPROPERTY_TEXT:
1976 : case BASEPROPERTY_LABEL:
1977 : case BASEPROPERTY_TITLE:
1978 : {
1979 52 : OUString aText = GetWindow()->GetText();
1980 52 : aProp <<= aText;
1981 : }
1982 52 : break;
1983 : case BASEPROPERTY_ACCESSIBLENAME:
1984 : {
1985 0 : OUString aText = GetWindow()->GetAccessibleName();
1986 0 : aProp <<= aText;
1987 : }
1988 0 : break;
1989 : case BASEPROPERTY_HELPTEXT:
1990 : {
1991 0 : OUString aText = GetWindow()->GetQuickHelpText();
1992 0 : aProp <<= aText;
1993 : }
1994 0 : break;
1995 : case BASEPROPERTY_HELPURL:
1996 : {
1997 0 : OUString aHelpId( OStringToOUString( GetWindow()->GetHelpId(), RTL_TEXTENCODING_UTF8 ) );
1998 0 : aProp <<= OUString( aHelpId );
1999 : }
2000 0 : break;
2001 : case BASEPROPERTY_FONTDESCRIPTOR:
2002 : {
2003 0 : vcl::Font aFont = GetWindow()->GetControlFont();
2004 0 : ::com::sun::star::awt::FontDescriptor aFD = VCLUnoHelper::CreateFontDescriptor( aFont );
2005 0 : aProp <<= aFD;
2006 : }
2007 0 : break;
2008 : case BASEPROPERTY_BACKGROUNDCOLOR:
2009 0 : aProp <<= (sal_Int32) GetWindow()->GetControlBackground().GetColor();
2010 0 : break;
2011 : case BASEPROPERTY_DISPLAYBACKGROUNDCOLOR:
2012 0 : aProp <<= (sal_Int32) GetWindow()->GetDisplayBackground().GetColor().GetColor();
2013 0 : break;
2014 : case BASEPROPERTY_FONTRELIEF:
2015 0 : aProp <<= (sal_Int16) GetWindow()->GetControlFont().GetRelief();
2016 0 : break;
2017 : case BASEPROPERTY_FONTEMPHASISMARK:
2018 0 : aProp <<= (sal_Int16) GetWindow()->GetControlFont().GetEmphasisMark();
2019 0 : break;
2020 : case BASEPROPERTY_TEXTCOLOR:
2021 0 : aProp <<= (sal_Int32) GetWindow()->GetControlForeground().GetColor();
2022 0 : break;
2023 : case BASEPROPERTY_TEXTLINECOLOR:
2024 0 : aProp <<= (sal_Int32) GetWindow()->GetTextLineColor().GetColor();
2025 0 : break;
2026 : case BASEPROPERTY_FILLCOLOR:
2027 0 : aProp <<= (sal_Int32) GetWindow()->GetFillColor().GetColor();
2028 0 : break;
2029 : case BASEPROPERTY_LINECOLOR:
2030 0 : aProp <<= (sal_Int32) GetWindow()->GetLineColor().GetColor();
2031 0 : break;
2032 : case BASEPROPERTY_BORDER:
2033 : {
2034 0 : WindowBorderStyle nBorder = WindowBorderStyle::NONE;
2035 0 : if ( GetWindow()->GetStyle() & WB_BORDER )
2036 0 : nBorder = GetWindow()->GetBorderStyle();
2037 0 : aProp <<= static_cast<sal_uInt16>(nBorder);
2038 : }
2039 0 : break;
2040 : case BASEPROPERTY_TABSTOP:
2041 0 : aProp <<= ( GetWindow()->GetStyle() & WB_TABSTOP ) != 0;
2042 0 : break;
2043 : case BASEPROPERTY_VERTICALALIGN:
2044 : {
2045 0 : WinBits nStyle = GetWindow()->GetStyle();
2046 0 : if ( nStyle & WB_TOP )
2047 0 : aProp <<= VerticalAlignment_TOP;
2048 0 : else if ( nStyle & WB_VCENTER )
2049 0 : aProp <<= VerticalAlignment_MIDDLE;
2050 0 : else if ( nStyle & WB_BOTTOM )
2051 0 : aProp <<= VerticalAlignment_BOTTOM;
2052 : }
2053 0 : break;
2054 : case BASEPROPERTY_ALIGN:
2055 : {
2056 0 : switch ( eWinType )
2057 : {
2058 : case WINDOW_FIXEDTEXT:
2059 : case WINDOW_EDIT:
2060 : case WINDOW_MULTILINEEDIT:
2061 : case WINDOW_CHECKBOX:
2062 : case WINDOW_RADIOBUTTON:
2063 : case WINDOW_LISTBOX:
2064 : case WINDOW_COMBOBOX:
2065 : case WINDOW_BUTTON:
2066 : case WINDOW_PUSHBUTTON:
2067 : case WINDOW_OKBUTTON:
2068 : case WINDOW_CANCELBUTTON:
2069 : case WINDOW_HELPBUTTON:
2070 : {
2071 0 : WinBits nStyle = GetWindow()->GetStyle();
2072 0 : if ( nStyle & WB_LEFT )
2073 0 : aProp <<= (sal_Int16) PROPERTY_ALIGN_LEFT;
2074 0 : else if ( nStyle & WB_CENTER )
2075 0 : aProp <<= (sal_Int16) PROPERTY_ALIGN_CENTER;
2076 0 : else if ( nStyle & WB_RIGHT )
2077 0 : aProp <<= (sal_Int16) PROPERTY_ALIGN_RIGHT;
2078 : }
2079 0 : break;
2080 : }
2081 : }
2082 0 : break;
2083 : case BASEPROPERTY_MULTILINE:
2084 : {
2085 0 : if ( ( eWinType == WINDOW_FIXEDTEXT )
2086 0 : || ( eWinType == WINDOW_CHECKBOX )
2087 0 : || ( eWinType == WINDOW_RADIOBUTTON )
2088 0 : || ( eWinType == WINDOW_BUTTON )
2089 0 : || ( eWinType == WINDOW_PUSHBUTTON )
2090 0 : || ( eWinType == WINDOW_OKBUTTON )
2091 0 : || ( eWinType == WINDOW_CANCELBUTTON )
2092 0 : || ( eWinType == WINDOW_HELPBUTTON )
2093 : )
2094 0 : aProp <<= ( GetWindow()->GetStyle() & WB_WORDBREAK ) != 0;
2095 : }
2096 0 : break;
2097 : case BASEPROPERTY_AUTOMNEMONICS:
2098 : {
2099 0 : bool bAutoMnemonics = GetWindow()->GetSettings().GetStyleSettings().GetAutoMnemonic();
2100 0 : aProp <<= bAutoMnemonics;
2101 : }
2102 0 : break;
2103 : case BASEPROPERTY_MOUSETRANSPARENT:
2104 : {
2105 0 : bool bMouseTransparent = GetWindow()->IsMouseTransparent();
2106 0 : aProp <<= bMouseTransparent;
2107 : }
2108 0 : break;
2109 : case BASEPROPERTY_PAINTTRANSPARENT:
2110 : {
2111 0 : bool bPaintTransparent = GetWindow()->IsPaintTransparent();
2112 0 : aProp <<= bPaintTransparent;
2113 : }
2114 0 : break;
2115 :
2116 : case BASEPROPERTY_REPEAT:
2117 0 : aProp <<= ( 0 != ( GetWindow()->GetStyle() & WB_REPEAT ) );
2118 0 : break;
2119 :
2120 : case BASEPROPERTY_REPEAT_DELAY:
2121 : {
2122 0 : sal_Int32 nButtonRepeat = GetWindow()->GetSettings().GetMouseSettings().GetButtonRepeat();
2123 0 : aProp <<= (sal_Int32)nButtonRepeat;
2124 : }
2125 0 : break;
2126 :
2127 : case BASEPROPERTY_SYMBOL_COLOR:
2128 0 : aProp <<= (sal_Int32)GetWindow()->GetSettings().GetStyleSettings().GetButtonTextColor().GetColor();
2129 0 : break;
2130 :
2131 : case BASEPROPERTY_BORDERCOLOR:
2132 0 : aProp <<= (sal_Int32)GetWindow()->GetSettings().GetStyleSettings().GetMonoColor().GetColor();
2133 0 : break;
2134 : }
2135 : }
2136 52 : return aProp;
2137 : }
2138 :
2139 :
2140 : // ::com::sun::star::awt::XLayoutConstrains
2141 0 : ::com::sun::star::awt::Size VCLXWindow::getMinimumSize( ) throw(::com::sun::star::uno::RuntimeException, std::exception)
2142 : {
2143 0 : SolarMutexGuard aGuard;
2144 :
2145 : // Use this method only for those components which can be created through
2146 : // ::com::sun::star::awt::Toolkit , but do not have an interface
2147 :
2148 0 : Size aSz;
2149 0 : if ( GetWindow() )
2150 : {
2151 0 : WindowType nWinType = GetWindow()->GetType();
2152 0 : switch ( nWinType )
2153 : {
2154 : case WINDOW_CONTROL:
2155 0 : aSz.Width() = GetWindow()->GetTextWidth( GetWindow()->GetText() )+2*12;
2156 0 : aSz.Height() = GetWindow()->GetTextHeight()+2*6;
2157 0 : break;
2158 :
2159 : case WINDOW_PATTERNBOX:
2160 : case WINDOW_NUMERICBOX:
2161 : case WINDOW_METRICBOX:
2162 : case WINDOW_CURRENCYBOX:
2163 : case WINDOW_DATEBOX:
2164 : case WINDOW_TIMEBOX:
2165 : case WINDOW_LONGCURRENCYBOX:
2166 0 : aSz.Width() = GetWindow()->GetTextWidth( GetWindow()->GetText() )+2*2;
2167 0 : aSz.Height() = GetWindow()->GetTextHeight()+2*2;
2168 0 : break;
2169 : case WINDOW_SCROLLBARBOX:
2170 0 : return VCLXScrollBar::implGetMinimumSize( GetWindow() );
2171 : default:
2172 0 : aSz = GetWindow()->get_preferred_size();
2173 : }
2174 : }
2175 :
2176 0 : return ::com::sun::star::awt::Size( aSz.Width(), aSz.Height() );
2177 : }
2178 :
2179 0 : ::com::sun::star::awt::Size VCLXWindow::getPreferredSize( ) throw(::com::sun::star::uno::RuntimeException, std::exception)
2180 : {
2181 0 : return getMinimumSize();
2182 : }
2183 :
2184 0 : ::com::sun::star::awt::Size VCLXWindow::calcAdjustedSize( const ::com::sun::star::awt::Size& rNewSize ) throw(::com::sun::star::uno::RuntimeException, std::exception)
2185 : {
2186 0 : SolarMutexGuard aGuard;
2187 :
2188 0 : ::com::sun::star::awt::Size aNewSize( rNewSize );
2189 0 : ::com::sun::star::awt::Size aMinSize = getMinimumSize();
2190 :
2191 0 : if ( aNewSize.Width < aMinSize.Width )
2192 0 : aNewSize.Width = aMinSize.Width;
2193 0 : if ( aNewSize.Height < aMinSize.Height )
2194 0 : aNewSize.Height = aMinSize.Height;
2195 :
2196 0 : return aNewSize;
2197 : }
2198 :
2199 :
2200 : // ::com::sun::star::awt::XView
2201 10075 : sal_Bool VCLXWindow::setGraphics( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XGraphics >& rxDevice ) throw(::com::sun::star::uno::RuntimeException, std::exception)
2202 : {
2203 10075 : SolarMutexGuard aGuard;
2204 :
2205 10075 : if ( VCLUnoHelper::GetOutputDevice( rxDevice ) )
2206 4852 : mpImpl->mxViewGraphics = rxDevice;
2207 : else
2208 5223 : mpImpl->mxViewGraphics = NULL;
2209 :
2210 10075 : return mpImpl->mxViewGraphics.is();
2211 : }
2212 :
2213 157 : ::com::sun::star::uno::Reference< ::com::sun::star::awt::XGraphics > VCLXWindow::getGraphics( ) throw(::com::sun::star::uno::RuntimeException, std::exception)
2214 : {
2215 157 : SolarMutexGuard aGuard;
2216 :
2217 157 : return mpImpl->mxViewGraphics;
2218 : }
2219 :
2220 0 : ::com::sun::star::awt::Size VCLXWindow::getSize( ) throw(::com::sun::star::uno::RuntimeException, std::exception)
2221 : {
2222 0 : SolarMutexGuard aGuard;
2223 :
2224 0 : Size aSz;
2225 0 : if ( GetWindow() )
2226 0 : aSz = GetWindow()->GetSizePixel();
2227 0 : return ::com::sun::star::awt::Size( aSz.Width(), aSz.Height() );
2228 : }
2229 :
2230 4462 : void VCLXWindow::draw( sal_Int32 nX, sal_Int32 nY ) throw(::com::sun::star::uno::RuntimeException, std::exception)
2231 : {
2232 4462 : SolarMutexGuard aGuard;
2233 :
2234 4462 : vcl::Window* pWindow = GetWindow();
2235 4462 : if ( !pWindow )
2236 0 : return;
2237 :
2238 4462 : if ( isDesignMode() || mpImpl->isEnableVisible() )
2239 : {
2240 4462 : OutputDevice* pDev = VCLUnoHelper::GetOutputDevice( mpImpl->mxViewGraphics );
2241 4462 : if (!pDev)
2242 0 : pDev = pWindow->GetParent();
2243 4462 : TabPage* pTabPage = dynamic_cast< TabPage* >( pWindow );
2244 4462 : if ( pTabPage )
2245 : {
2246 0 : Point aPos( nX, nY );
2247 0 : Size aSize = pWindow->GetSizePixel();
2248 :
2249 0 : aPos = pDev->PixelToLogic( aPos );
2250 0 : aSize = pDev->PixelToLogic( aSize );
2251 :
2252 0 : pTabPage->Draw( pDev, aPos, aSize, DrawFlags::NONE );
2253 0 : return;
2254 : }
2255 :
2256 4462 : Point aPos( nX, nY );
2257 :
2258 4462 : if ( pWindow->GetParent() && !pWindow->IsSystemWindow() && ( pWindow->GetParent() == pDev ) )
2259 : {
2260 : // #i40647# don't draw here if this is a recursive call
2261 : // sometimes this is called recursively, because the Update call on the parent
2262 : // (strangely) triggers another paint. Prevent a stack overflow here
2263 : // Yes, this is only fixing symptoms for the moment ....
2264 : // #i40647# / 2005-01-18 / frank.schoenheit@sun.com
2265 0 : if ( !mpImpl->getDrawingOntoParent_ref() )
2266 : {
2267 0 : ::comphelper::FlagGuard aDrawingflagGuard( mpImpl->getDrawingOntoParent_ref() );
2268 :
2269 0 : bool bWasVisible = pWindow->IsVisible();
2270 0 : Point aOldPos( pWindow->GetPosPixel() );
2271 :
2272 0 : if ( bWasVisible && aOldPos == aPos )
2273 : {
2274 0 : pWindow->Update();
2275 0 : return;
2276 : }
2277 :
2278 0 : pWindow->SetPosPixel( aPos );
2279 :
2280 : // Update parent first to avoid painting the parent upon the update
2281 : // of this window, as it may otherwise cause the parent
2282 : // to hide this window again
2283 0 : if( pWindow->GetParent() )
2284 0 : pWindow->GetParent()->Update();
2285 :
2286 0 : pWindow->Show();
2287 0 : pWindow->Update();
2288 0 : pWindow->SetParentUpdateMode( false );
2289 0 : pWindow->Hide();
2290 0 : pWindow->SetParentUpdateMode( true );
2291 :
2292 0 : pWindow->SetPosPixel( aOldPos );
2293 0 : if ( bWasVisible )
2294 0 : pWindow->Show( true );
2295 : }
2296 : }
2297 4462 : else if ( pDev )
2298 : {
2299 4462 : Size aSz = pWindow->GetSizePixel();
2300 4462 : aSz = pDev->PixelToLogic( aSz );
2301 4462 : Point aP = pDev->PixelToLogic( aPos );
2302 :
2303 4462 : vcl::PDFExtOutDevData* pPDFExport = dynamic_cast<vcl::PDFExtOutDevData*>(pDev->GetExtOutDevData());
2304 4462 : bool bDrawSimple = ( pDev->GetOutDevType() == OUTDEV_PRINTER )
2305 4462 : || ( pDev->GetOutDevViewType() == OUTDEV_VIEWTYPE_PRINTPREVIEW )
2306 8924 : || ( pPDFExport != NULL );
2307 4462 : if ( bDrawSimple )
2308 : {
2309 0 : pWindow->Draw( pDev, aP, aSz, DrawFlags::NoControls );
2310 : }
2311 : else
2312 : {
2313 4462 : bool bOldNW =pWindow->IsNativeWidgetEnabled();
2314 4462 : if( bOldNW )
2315 1526 : pWindow->EnableNativeWidget(false);
2316 4462 : pWindow->PaintToDevice( pDev, aP, aSz );
2317 4462 : if( bOldNW )
2318 1526 : pWindow->EnableNativeWidget(true);
2319 : }
2320 : }
2321 4462 : }
2322 : }
2323 :
2324 26602 : void VCLXWindow::setZoom( float fZoomX, float /*fZoomY*/ ) throw(::com::sun::star::uno::RuntimeException, std::exception)
2325 : {
2326 26602 : SolarMutexGuard aGuard;
2327 :
2328 26602 : if ( GetWindow() )
2329 : {
2330 : // Fraction::Fraction takes a double, but we have a float only.
2331 : // The implicit conversion from float to double can result in a precision loss, i.e. 1.2 is converted to
2332 : // 1.200000000047something. To prevent this, we convert explicitly to double, and round it.
2333 26602 : double nZoom( fZoomX );
2334 26602 : Fraction aZoom(::rtl::math::round(nZoom, 4));
2335 26602 : aZoom.ReduceInaccurate(10); // to avoid runovers and BigInt mapping
2336 26602 : GetWindow()->SetZoom(aZoom);
2337 26602 : }
2338 26602 : }
2339 :
2340 : // ::com::sun::star::lang::XEventListener
2341 360 : void SAL_CALL VCLXWindow::disposing( const ::com::sun::star::lang::EventObject& _rSource ) throw (::com::sun::star::uno::RuntimeException, std::exception)
2342 : {
2343 360 : SolarMutexGuard aGuard;
2344 :
2345 : // check if it comes from our AccessibleContext
2346 720 : uno::Reference< uno::XInterface > aAC( mpImpl->mxAccessibleContext, uno::UNO_QUERY );
2347 720 : uno::Reference< uno::XInterface > xSource( _rSource.Source, uno::UNO_QUERY );
2348 :
2349 360 : if ( aAC.get() == xSource.get() )
2350 : { // yep, it does
2351 248 : mpImpl->mxAccessibleContext = uno::Reference< accessibility::XAccessibleContext >();
2352 360 : }
2353 360 : }
2354 :
2355 : // ::com::sun::star::accessibility::XAccessible
2356 1129 : ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleContext > VCLXWindow::getAccessibleContext( ) throw (::com::sun::star::uno::RuntimeException, std::exception)
2357 : {
2358 : using namespace ::com::sun::star;
2359 :
2360 1129 : SolarMutexGuard aGuard;
2361 :
2362 : // already disposed
2363 1129 : if( ! mpImpl )
2364 0 : return uno::Reference< accessibility::XAccessibleContext >();
2365 :
2366 1129 : if ( !mpImpl->mxAccessibleContext.is() && GetWindow() )
2367 : {
2368 248 : mpImpl->mxAccessibleContext = CreateAccessibleContext();
2369 :
2370 : // add as event listener to this component
2371 : // in case somebody disposes it, we do not want to have a (though weak) reference to a dead
2372 : // object
2373 248 : uno::Reference< lang::XComponent > xComp( mpImpl->mxAccessibleContext, uno::UNO_QUERY );
2374 248 : if ( xComp.is() )
2375 248 : xComp->addEventListener( this );
2376 : }
2377 :
2378 1129 : return mpImpl->mxAccessibleContext;
2379 : }
2380 :
2381 : // ::com::sun::star::awt::XDockable
2382 9522 : void SAL_CALL VCLXWindow::addDockableWindowListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XDockableWindowListener >& xListener ) throw (::com::sun::star::uno::RuntimeException, std::exception)
2383 : {
2384 9522 : SolarMutexGuard aGuard;
2385 :
2386 9522 : if ( xListener.is() )
2387 9522 : mpImpl->getDockableWindowListeners().addInterface( xListener );
2388 :
2389 9522 : }
2390 :
2391 1 : void SAL_CALL VCLXWindow::removeDockableWindowListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XDockableWindowListener >& xListener ) throw (::com::sun::star::uno::RuntimeException, std::exception)
2392 : {
2393 1 : SolarMutexGuard aGuard;
2394 :
2395 1 : mpImpl->getDockableWindowListeners().removeInterface( xListener );
2396 1 : }
2397 :
2398 9522 : void SAL_CALL VCLXWindow::enableDocking( sal_Bool bEnable ) throw (::com::sun::star::uno::RuntimeException, std::exception)
2399 : {
2400 9522 : SolarMutexGuard aGuard;
2401 :
2402 9522 : vcl::Window* pWindow = GetWindow();
2403 9522 : if ( pWindow )
2404 9522 : pWindow->EnableDocking( bEnable );
2405 9522 : }
2406 :
2407 17721 : sal_Bool SAL_CALL VCLXWindow::isFloating( ) throw (::com::sun::star::uno::RuntimeException, std::exception)
2408 : {
2409 17721 : SolarMutexGuard aGuard;
2410 :
2411 17721 : vcl::Window* pWindow = GetWindow();
2412 17721 : if( pWindow )
2413 17721 : return vcl::Window::GetDockingManager()->IsFloating( pWindow );
2414 : else
2415 0 : return sal_False;
2416 : }
2417 :
2418 9522 : void SAL_CALL VCLXWindow::setFloatingMode( sal_Bool bFloating ) throw (::com::sun::star::uno::RuntimeException, std::exception)
2419 : {
2420 9522 : SolarMutexGuard aGuard;
2421 :
2422 9522 : vcl::Window* pWindow = GetWindow();
2423 9522 : if( pWindow )
2424 9522 : vcl::Window::GetDockingManager()->SetFloatingMode( pWindow, bFloating );
2425 9522 : }
2426 :
2427 0 : sal_Bool SAL_CALL VCLXWindow::isLocked( ) throw (::com::sun::star::uno::RuntimeException, std::exception)
2428 : {
2429 0 : SolarMutexGuard aGuard;
2430 :
2431 0 : vcl::Window* pWindow = GetWindow();
2432 0 : if( pWindow )
2433 0 : return vcl::Window::GetDockingManager()->IsLocked( pWindow );
2434 : else
2435 0 : return sal_False;
2436 : }
2437 :
2438 0 : void SAL_CALL VCLXWindow::lock( ) throw (::com::sun::star::uno::RuntimeException, std::exception)
2439 : {
2440 0 : SolarMutexGuard aGuard;
2441 :
2442 0 : vcl::Window* pWindow = GetWindow();
2443 0 : if( pWindow && !vcl::Window::GetDockingManager()->IsFloating( pWindow ) )
2444 0 : vcl::Window::GetDockingManager()->Lock( pWindow );
2445 0 : }
2446 :
2447 0 : void SAL_CALL VCLXWindow::unlock( ) throw (::com::sun::star::uno::RuntimeException, std::exception)
2448 : {
2449 0 : SolarMutexGuard aGuard;
2450 :
2451 0 : vcl::Window* pWindow = GetWindow();
2452 0 : if( pWindow && !vcl::Window::GetDockingManager()->IsFloating( pWindow ) )
2453 0 : vcl::Window::GetDockingManager()->Unlock( pWindow );
2454 0 : }
2455 0 : void SAL_CALL VCLXWindow::startPopupMode( const ::com::sun::star::awt::Rectangle& ) throw (::com::sun::star::uno::RuntimeException, std::exception)
2456 : {
2457 : // TODO: remove interface in the next incompatible build
2458 0 : SolarMutexGuard aGuard;
2459 :
2460 0 : }
2461 :
2462 0 : sal_Bool SAL_CALL VCLXWindow::isInPopupMode( ) throw (::com::sun::star::uno::RuntimeException, std::exception)
2463 : {
2464 : // TODO: remove interface in the next incompatible build
2465 0 : SolarMutexGuard aGuard;
2466 0 : return sal_False;
2467 : }
2468 :
2469 :
2470 : // ::com::sun::star::awt::XWindow2
2471 :
2472 9522 : void SAL_CALL VCLXWindow::setOutputSize( const ::com::sun::star::awt::Size& aSize ) throw (::com::sun::star::uno::RuntimeException, std::exception)
2473 : {
2474 9522 : SolarMutexGuard aGuard;
2475 : vcl::Window *pWindow;
2476 9522 : if( (pWindow = GetWindow()) != NULL )
2477 : {
2478 9522 : DockingWindow *pDockingWindow = dynamic_cast< DockingWindow* >(pWindow);
2479 9522 : if( pDockingWindow )
2480 9522 : pDockingWindow->SetOutputSizePixel( VCLSize( aSize ) );
2481 : else
2482 0 : pWindow->SetOutputSizePixel( VCLSize( aSize ) );
2483 9522 : }
2484 9522 : }
2485 :
2486 0 : ::com::sun::star::awt::Size SAL_CALL VCLXWindow::getOutputSize( ) throw (::com::sun::star::uno::RuntimeException, std::exception)
2487 : {
2488 0 : SolarMutexGuard aGuard;
2489 : vcl::Window *pWindow;
2490 0 : if( (pWindow = GetWindow()) != NULL )
2491 : {
2492 0 : DockingWindow *pDockingWindow = dynamic_cast< DockingWindow* >(pWindow);
2493 0 : if( pDockingWindow )
2494 0 : return AWTSize( pDockingWindow->GetOutputSizePixel() );
2495 : else
2496 0 : return AWTSize( pWindow->GetOutputSizePixel() );
2497 : }
2498 : else
2499 0 : return ::com::sun::star::awt::Size();
2500 : }
2501 :
2502 19343 : sal_Bool SAL_CALL VCLXWindow::isVisible( ) throw (::com::sun::star::uno::RuntimeException, std::exception)
2503 : {
2504 19343 : SolarMutexGuard aGuard;
2505 19343 : if( GetWindow() )
2506 19343 : return GetWindow()->IsVisible();
2507 : else
2508 0 : return sal_False;
2509 : }
2510 :
2511 16070 : sal_Bool SAL_CALL VCLXWindow::isActive( ) throw (::com::sun::star::uno::RuntimeException, std::exception)
2512 : {
2513 16070 : SolarMutexGuard aGuard;
2514 16070 : if( GetWindow() )
2515 16070 : return GetWindow()->IsActive();
2516 : else
2517 0 : return sal_False;
2518 :
2519 : }
2520 :
2521 25 : sal_Bool SAL_CALL VCLXWindow::isEnabled( ) throw (::com::sun::star::uno::RuntimeException, std::exception)
2522 : {
2523 25 : SolarMutexGuard aGuard;
2524 25 : if( GetWindow() )
2525 25 : return GetWindow()->IsEnabled();
2526 : else
2527 0 : return sal_False;
2528 : }
2529 :
2530 0 : sal_Bool SAL_CALL VCLXWindow::hasFocus( ) throw (::com::sun::star::uno::RuntimeException, std::exception)
2531 : {
2532 0 : SolarMutexGuard aGuard;
2533 0 : if( GetWindow() )
2534 0 : return GetWindow()->HasFocus();
2535 : else
2536 0 : return sal_False;
2537 : }
2538 :
2539 : // ::com::sun::star::beans::XPropertySetInfo
2540 :
2541 : UnoPropertyArrayHelper *
2542 0 : VCLXWindow::GetPropHelper()
2543 : {
2544 0 : SolarMutexGuard aGuard;
2545 0 : if ( mpImpl->mpPropHelper == NULL )
2546 : {
2547 0 : std::list< sal_uInt16 > aIDs;
2548 0 : GetPropertyIds( aIDs );
2549 0 : mpImpl->mpPropHelper = new UnoPropertyArrayHelper( aIDs );
2550 : }
2551 0 : return mpImpl->mpPropHelper;
2552 : }
2553 :
2554 : ::com::sun::star::uno::Sequence< ::com::sun::star::beans::Property > SAL_CALL
2555 0 : VCLXWindow::getProperties() throw (::com::sun::star::uno::RuntimeException, std::exception)
2556 : {
2557 0 : return GetPropHelper()->getProperties();
2558 : }
2559 : ::com::sun::star::beans::Property SAL_CALL
2560 0 : VCLXWindow::getPropertyByName( const OUString& rName ) throw (::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::uno::RuntimeException, std::exception)
2561 : {
2562 0 : return GetPropHelper()->getPropertyByName( rName );
2563 : }
2564 :
2565 : sal_Bool SAL_CALL
2566 0 : VCLXWindow::hasPropertyByName( const OUString& rName ) throw (::com::sun::star::uno::RuntimeException, std::exception)
2567 : {
2568 0 : return GetPropHelper()->hasPropertyByName( rName );
2569 : }
2570 :
2571 0 : Reference< XStyleSettings > SAL_CALL VCLXWindow::getStyleSettings() throw (RuntimeException, std::exception)
2572 : {
2573 0 : return mpImpl->getStyleSettings();
2574 798 : }
2575 :
2576 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|