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