xref: /trunk/main/toolkit/source/awt/vclxwindows.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_toolkit.hxx"
30 #include <toolkit/awt/vclxwindows.hxx>
31 #include <com/sun/star/awt/ScrollBarOrientation.hpp>
32 #include <com/sun/star/graphic/XGraphicProvider.hpp>
33 #include <toolkit/helper/vclunohelper.hxx>
34 #include <toolkit/helper/macros.hxx>
35 #include <toolkit/helper/property.hxx>
36 #include <toolkit/helper/convert.hxx>
37 #include <toolkit/helper/imagealign.hxx>
38 #include <toolkit/helper/accessibilityclient.hxx>
39 #include <toolkit/helper/fixedhyperbase.hxx>
40 #include <toolkit/helper/tkresmgr.hxx>
41 #include <cppuhelper/typeprovider.hxx>
42 #include <com/sun/star/awt/VisualEffect.hpp>
43 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
44 #include <com/sun/star/system/XSystemShellExecute.hpp>
45 #include <com/sun/star/system/SystemShellExecuteFlags.hpp>
46 #include <com/sun/star/resource/XStringResourceResolver.hpp>
47 #include <com/sun/star/awt/ImageScaleMode.hpp>
48 #include <com/sun/star/awt/XItemList.hpp>
49 #include <comphelper/componentcontext.hxx>
50 #include <comphelper/namedvaluecollection.hxx>
51 #include <comphelper/processfactory.hxx>
52 
53 #ifndef _SV_BUTTON_HXX
54 #include <vcl/button.hxx>
55 #endif
56 #include <vcl/lstbox.hxx>
57 #include <vcl/combobox.hxx>
58 #include <vcl/field.hxx>
59 #include <vcl/longcurr.hxx>
60 #include <vcl/imgctrl.hxx>
61 #include <vcl/dialog.hxx>
62 #include <vcl/msgbox.hxx>
63 #include <vcl/scrbar.hxx>
64 #include <vcl/svapp.hxx>
65 #include <vcl/tabpage.hxx>
66 #include <vcl/tabctrl.hxx>
67 #include <tools/diagnose_ex.h>
68 
69 #include <boost/bind.hpp>
70 #include <boost/function.hpp>
71 
72 using ::com::sun::star::uno::Any;
73 using ::com::sun::star::uno::Reference;
74 using ::com::sun::star::uno::makeAny;
75 using ::com::sun::star::uno::RuntimeException;
76 using ::com::sun::star::lang::EventObject;
77 using ::com::sun::star::awt::ItemListEvent;
78 using ::com::sun::star::awt::XItemList;
79 using ::com::sun::star::graphic::XGraphic;
80 using ::com::sun::star::graphic::XGraphicProvider;
81 
82 using namespace ::com::sun::star;
83 using namespace ::com::sun::star::awt::VisualEffect;
84 namespace ImageScaleMode = ::com::sun::star::awt::ImageScaleMode;
85 
86 static double ImplCalcLongValue( double nValue, sal_uInt16 nDigits )
87 {
88     double n = nValue;
89     for ( sal_uInt16 d = 0; d < nDigits; d++ )
90         n *= 10;
91     return n;
92 }
93 
94 static double ImplCalcDoubleValue( double nValue, sal_uInt16 nDigits )
95 {
96     double n = nValue;
97     for ( sal_uInt16 d = 0; d < nDigits; d++ )
98         n /= 10;
99     return n;
100 }
101 
102 namespace toolkit
103 {
104     /** sets the "face color" for button like controls (scroll bar, spin button)
105     */
106     void setButtonLikeFaceColor( Window* _pWindow, const ::com::sun::star::uno::Any& _rColorValue )
107     {
108         AllSettings aSettings = _pWindow->GetSettings();
109         StyleSettings aStyleSettings = aSettings.GetStyleSettings();
110 
111         if ( !_rColorValue.hasValue() )
112         {
113             const StyleSettings& aAppStyle = Application::GetSettings().GetStyleSettings();
114             aStyleSettings.SetFaceColor( aAppStyle.GetFaceColor( ) );
115             aStyleSettings.SetCheckedColor( aAppStyle.GetCheckedColor( ) );
116             aStyleSettings.SetLightBorderColor( aAppStyle.GetLightBorderColor() );
117             aStyleSettings.SetLightColor( aAppStyle.GetLightColor() );
118             aStyleSettings.SetShadowColor( aAppStyle.GetShadowColor() );
119             aStyleSettings.SetDarkShadowColor( aAppStyle.GetDarkShadowColor() );
120         }
121         else
122         {
123             sal_Int32 nBackgroundColor = 0;
124             _rColorValue >>= nBackgroundColor;
125             aStyleSettings.SetFaceColor( nBackgroundColor );
126 
127             // for the real background (everything except the buttons and the thumb),
128             // use an average between the desired color and "white"
129             Color aWhite( COL_WHITE );
130             Color aBackground( nBackgroundColor );
131             aBackground.SetRed( ( aBackground.GetRed() + aWhite.GetRed() ) / 2 );
132             aBackground.SetGreen( ( aBackground.GetGreen() + aWhite.GetGreen() ) / 2 );
133             aBackground.SetBlue( ( aBackground.GetBlue() + aWhite.GetBlue() ) / 2 );
134             aStyleSettings.SetCheckedColor( aBackground );
135 
136             sal_Int32 nBackgroundLuminance = Color( nBackgroundColor ).GetLuminance();
137             sal_Int32 nWhiteLuminance = Color( COL_WHITE ).GetLuminance();
138 
139             Color aLightShadow( nBackgroundColor );
140             aLightShadow.IncreaseLuminance( (sal_uInt8)( ( nWhiteLuminance - nBackgroundLuminance ) * 2 / 3 ) );
141             aStyleSettings.SetLightBorderColor( aLightShadow );
142 
143             Color aLight( nBackgroundColor );
144             aLight.IncreaseLuminance( (sal_uInt8)( ( nWhiteLuminance - nBackgroundLuminance ) * 1 / 3 ) );
145             aStyleSettings.SetLightColor( aLight );
146 
147             Color aShadow( nBackgroundColor );
148             aShadow.DecreaseLuminance( (sal_uInt8)( nBackgroundLuminance * 1 / 3 ) );
149             aStyleSettings.SetShadowColor( aShadow );
150 
151             Color aDarkShadow( nBackgroundColor );
152             aDarkShadow.DecreaseLuminance( (sal_uInt8)( nBackgroundLuminance * 2 / 3 ) );
153             aStyleSettings.SetDarkShadowColor( aDarkShadow );
154         }
155 
156         aSettings.SetStyleSettings( aStyleSettings );
157         _pWindow->SetSettings( aSettings, sal_True );
158     }
159 
160     Any getButtonLikeFaceColor( const Window* _pWindow )
161     {
162         sal_Int32 nBackgroundColor = _pWindow->GetSettings().GetStyleSettings().GetFaceColor().GetColor();
163         return makeAny( nBackgroundColor );
164     }
165 
166     static void adjustBooleanWindowStyle( const Any& _rValue, Window* _pWindow, WinBits _nBits, sal_Bool _bInverseSemantics )
167     {
168         WinBits nStyle = _pWindow->GetStyle();
169         sal_Bool bValue( sal_False );
170         OSL_VERIFY( _rValue >>= bValue );
171         if ( bValue != _bInverseSemantics )
172             nStyle |= _nBits;
173         else
174             nStyle &= ~_nBits;
175         _pWindow->SetStyle( nStyle );
176     }
177 
178     static void setVisualEffect( const Any& _rValue, Window* _pWindow )
179     {
180         AllSettings aSettings = _pWindow->GetSettings();
181         StyleSettings aStyleSettings = aSettings.GetStyleSettings();
182 
183         sal_Int16 nStyle = LOOK3D;
184         OSL_VERIFY( _rValue >>= nStyle );
185         switch ( nStyle )
186         {
187         case FLAT:
188             aStyleSettings.SetOptions( aStyleSettings.GetOptions() & ~STYLE_OPTION_MONO );
189             break;
190         case LOOK3D:
191         default:
192             aStyleSettings.SetOptions( aStyleSettings.GetOptions() | STYLE_OPTION_MONO );
193         }
194         aSettings.SetStyleSettings( aStyleSettings );
195         _pWindow->SetSettings( aSettings );
196     }
197 
198     static Any getVisualEffect( Window* _pWindow )
199     {
200         Any aEffect;
201 
202         StyleSettings aStyleSettings = _pWindow->GetSettings().GetStyleSettings();
203         if ( (aStyleSettings.GetOptions() & STYLE_OPTION_MONO) )
204             aEffect <<= (sal_Int16)FLAT;
205         else
206             aEffect <<= (sal_Int16)LOOK3D;
207         return aEffect;
208     }
209 }
210 
211 //  ----------------------------------------------------
212 //  class VCLXGraphicControl
213 //  ----------------------------------------------------
214 
215 void VCLXGraphicControl::ImplGetPropertyIds( std::list< sal_uInt16 > &rIds )
216 {
217     VCLXWindow::ImplGetPropertyIds( rIds );
218 }
219 
220 void VCLXGraphicControl::ImplSetNewImage()
221 {
222     OSL_PRECOND( GetWindow(), "VCLXGraphicControl::ImplSetNewImage: window is required to be not-NULL!" );
223     Button* pButton = static_cast< Button* >( GetWindow() );
224     pButton->SetModeImage( GetImage() );
225 }
226 
227 void VCLXGraphicControl::setPosSize( sal_Int32 X, sal_Int32 Y, sal_Int32 Width, sal_Int32 Height, short Flags ) throw(::com::sun::star::uno::RuntimeException)
228 {
229     ::vos::OGuard aGuard( GetMutex() );
230 
231     if ( GetWindow() )
232     {
233         Size aOldSize = GetWindow()->GetSizePixel();
234         VCLXWindow::setPosSize( X, Y, Width, Height, Flags );
235         if ( ( aOldSize.Width() != Width ) || ( aOldSize.Height() != Height ) )
236             ImplSetNewImage();
237     }
238 }
239 
240 void VCLXGraphicControl::setProperty( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Any& Value) throw(::com::sun::star::uno::RuntimeException)
241 {
242     ::vos::OGuard aGuard( GetMutex() );
243 
244     Button* pButton = static_cast< Button* >( GetWindow() );
245     if ( !pButton )
246         return;
247     sal_uInt16 nPropType = GetPropertyId( PropertyName );
248     switch ( nPropType )
249     {
250         case BASEPROPERTY_GRAPHIC:
251         {
252             Reference< XGraphic > xGraphic;
253             OSL_VERIFY( Value >>= xGraphic );
254             maImage = Image( xGraphic );
255             ImplSetNewImage();
256         }
257         break;
258 
259         case BASEPROPERTY_IMAGEALIGN:
260         {
261             WindowType eType = GetWindow()->GetType();
262             if (  ( eType == WINDOW_PUSHBUTTON )
263                || ( eType == WINDOW_RADIOBUTTON )
264                || ( eType == WINDOW_CHECKBOX )
265                )
266             {
267                 sal_Int16 nAlignment = sal_Int16();
268                 if ( Value >>= nAlignment )
269                     pButton->SetImageAlign( static_cast< ImageAlign >( nAlignment ) );
270             }
271         }
272         break;
273         case BASEPROPERTY_IMAGEPOSITION:
274         {
275             WindowType eType = GetWindow()->GetType();
276             if (  ( eType == WINDOW_PUSHBUTTON )
277                || ( eType == WINDOW_RADIOBUTTON )
278                || ( eType == WINDOW_CHECKBOX )
279                )
280             {
281                 sal_Int16 nImagePosition = 2;
282                 OSL_VERIFY( Value >>= nImagePosition );
283                 pButton->SetImageAlign( ::toolkit::translateImagePosition( nImagePosition ) );
284             }
285         }
286         break;
287         default:
288             VCLXWindow::setProperty( PropertyName, Value );
289             break;
290     }
291 }
292 
293 ::com::sun::star::uno::Any VCLXGraphicControl::getProperty( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::uno::RuntimeException)
294 {
295     ::vos::OGuard aGuard( GetMutex() );
296 
297     ::com::sun::star::uno::Any aProp;
298     if ( !GetWindow() )
299         return aProp;
300 
301     sal_uInt16 nPropType = GetPropertyId( PropertyName );
302     switch ( nPropType )
303     {
304         case BASEPROPERTY_GRAPHIC:
305             aProp <<= maImage.GetXGraphic();
306             break;
307         case BASEPROPERTY_IMAGEALIGN:
308         {
309             WindowType eType = GetWindow()->GetType();
310             if  (  ( eType == WINDOW_PUSHBUTTON )
311                 || ( eType == WINDOW_RADIOBUTTON )
312                 || ( eType == WINDOW_CHECKBOX )
313                 )
314             {
315                 aProp <<= ::toolkit::getCompatibleImageAlign( static_cast< Button* >( GetWindow() )->GetImageAlign() );
316             }
317         }
318         break;
319         case BASEPROPERTY_IMAGEPOSITION:
320         {
321             WindowType eType = GetWindow()->GetType();
322             if  (  ( eType == WINDOW_PUSHBUTTON )
323                 || ( eType == WINDOW_RADIOBUTTON )
324                 || ( eType == WINDOW_CHECKBOX )
325                 )
326             {
327                 aProp <<= ::toolkit::translateImagePosition( static_cast< Button* >( GetWindow() )->GetImageAlign() );
328             }
329         }
330         break;
331         default:
332         {
333             aProp <<= VCLXWindow::getProperty( PropertyName );
334         }
335         break;
336     }
337     return aProp;
338 }
339 
340 //--------------------------------------------------------------------
341 //  class VCLXButton
342 //  ----------------------------------------------------
343 
344 void VCLXButton::ImplGetPropertyIds( std::list< sal_uInt16 > &rIds )
345 {
346     PushPropertyIds( rIds,
347                      BASEPROPERTY_BACKGROUNDCOLOR,
348                      BASEPROPERTY_DEFAULTBUTTON,
349                      BASEPROPERTY_DEFAULTCONTROL,
350                      BASEPROPERTY_ENABLED,
351                      BASEPROPERTY_ENABLEVISIBLE,
352                      BASEPROPERTY_FONTDESCRIPTOR,
353                      BASEPROPERTY_GRAPHIC,
354                      BASEPROPERTY_HELPTEXT,
355                      BASEPROPERTY_HELPURL,
356                      BASEPROPERTY_IMAGEALIGN,
357                      BASEPROPERTY_IMAGEPOSITION,
358                      BASEPROPERTY_IMAGEURL,
359                      BASEPROPERTY_LABEL,
360                      BASEPROPERTY_PRINTABLE,
361                      BASEPROPERTY_PUSHBUTTONTYPE,
362                      BASEPROPERTY_REPEAT,
363                      BASEPROPERTY_REPEAT_DELAY,
364                      BASEPROPERTY_STATE,
365                      BASEPROPERTY_TABSTOP,
366                      BASEPROPERTY_TOGGLE,
367                      BASEPROPERTY_FOCUSONCLICK,
368                      BASEPROPERTY_MULTILINE,
369                      BASEPROPERTY_ALIGN,
370                      BASEPROPERTY_VERTICALALIGN,
371                      BASEPROPERTY_WRITING_MODE,
372                      BASEPROPERTY_CONTEXT_WRITING_MODE,
373                      BASEPROPERTY_REFERENCE_DEVICE,
374                      0);
375     VCLXGraphicControl::ImplGetPropertyIds( rIds );
376 }
377 
378 VCLXButton::VCLXButton()
379     :maActionListeners( *this )
380     ,maItemListeners( *this )
381 {
382 }
383 
384 VCLXButton::~VCLXButton()
385 {
386 }
387 
388 ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleContext > VCLXButton::CreateAccessibleContext()
389 {
390     return getAccessibleFactory().createAccessibleContext( this );
391 }
392 
393 void VCLXButton::dispose() throw(::com::sun::star::uno::RuntimeException)
394 {
395     ::vos::OGuard aGuard( GetMutex() );
396 
397     ::com::sun::star::lang::EventObject aObj;
398     aObj.Source = (::cppu::OWeakObject*)this;
399     maActionListeners.disposeAndClear( aObj );
400     maItemListeners.disposeAndClear( aObj );
401     VCLXGraphicControl::dispose();
402 }
403 
404 void VCLXButton::addActionListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XActionListener > & l  )throw(::com::sun::star::uno::RuntimeException)
405 {
406     ::vos::OGuard aGuard( GetMutex() );
407     maActionListeners.addInterface( l );
408 }
409 
410 void VCLXButton::removeActionListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XActionListener > & l ) throw(::com::sun::star::uno::RuntimeException)
411 {
412     ::vos::OGuard aGuard( GetMutex() );
413     maActionListeners.removeInterface( l );
414 }
415 
416 void VCLXButton::addItemListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XItemListener > & l  )throw(::com::sun::star::uno::RuntimeException)
417 {
418     ::vos::OGuard aGuard( GetMutex() );
419     maItemListeners.addInterface( l );
420 }
421 
422 void VCLXButton::removeItemListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XItemListener > & l ) throw(::com::sun::star::uno::RuntimeException)
423 {
424     ::vos::OGuard aGuard( GetMutex() );
425     maItemListeners.removeInterface( l );
426 }
427 
428 void VCLXButton::setLabel( const ::rtl::OUString& rLabel ) throw(::com::sun::star::uno::RuntimeException)
429 {
430     ::vos::OGuard aGuard( GetMutex() );
431 
432     Window* pWindow = GetWindow();
433     if ( pWindow )
434         pWindow->SetText( rLabel );
435 }
436 
437 void VCLXButton::setActionCommand( const ::rtl::OUString& rCommand ) throw(::com::sun::star::uno::RuntimeException)
438 {
439     ::vos::OGuard aGuard( GetMutex() );
440 
441     maActionCommand = rCommand;
442 }
443 
444 ::com::sun::star::awt::Size VCLXButton::getMinimumSize(  ) throw(::com::sun::star::uno::RuntimeException)
445 {
446     ::vos::OGuard aGuard( GetMutex() );
447 
448     Size aSz;
449     PushButton* pButton = (PushButton*) GetWindow();
450     if ( pButton )
451         aSz = pButton->CalcMinimumSize();
452     return AWTSize(aSz);
453 }
454 
455 ::com::sun::star::awt::Size VCLXButton::getPreferredSize(  ) throw(::com::sun::star::uno::RuntimeException)
456 {
457     ::com::sun::star::awt::Size aSz = getMinimumSize();
458     aSz.Width += 16;
459     aSz.Height += 10;
460     return aSz;
461 }
462 
463 ::com::sun::star::awt::Size VCLXButton::calcAdjustedSize( const ::com::sun::star::awt::Size& rNewSize ) throw(::com::sun::star::uno::RuntimeException)
464 {
465     ::vos::OGuard aGuard( GetMutex() );
466 
467     Size aSz = VCLSize(rNewSize);
468     PushButton* pButton = (PushButton*) GetWindow();
469     if ( pButton )
470     {
471         Size aMinSz = pButton->CalcMinimumSize();
472         // Kein Text, also Image
473         if ( !pButton->GetText().Len() )
474         {
475             if ( aSz.Width() < aMinSz.Width() )
476                 aSz.Width() = aMinSz.Width();
477             if ( aSz.Height() < aMinSz.Height() )
478                 aSz.Height() = aMinSz.Height();
479         }
480         else
481         {
482             if ( ( aSz.Width() > aMinSz.Width() ) && ( aSz.Height() < aMinSz.Height() ) )
483                 aSz.Height() = aMinSz.Height();
484             else
485                 aSz = aMinSz;
486         }
487     }
488     return AWTSize(aSz);
489 }
490 
491 void VCLXButton::setProperty( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Any& Value) throw(::com::sun::star::uno::RuntimeException)
492 {
493     ::vos::OGuard aGuard( GetMutex() );
494 
495     Button* pButton = (Button*)GetWindow();
496     if ( pButton )
497     {
498         sal_uInt16 nPropType = GetPropertyId( PropertyName );
499         switch ( nPropType )
500         {
501             case BASEPROPERTY_FOCUSONCLICK:
502                 ::toolkit::adjustBooleanWindowStyle( Value, pButton, WB_NOPOINTERFOCUS, sal_True );
503                 break;
504 
505             case BASEPROPERTY_TOGGLE:
506                 ::toolkit::adjustBooleanWindowStyle( Value, pButton, WB_TOGGLE, sal_False );
507                 break;
508 
509             case BASEPROPERTY_DEFAULTBUTTON:
510             {
511                 WinBits nStyle = pButton->GetStyle() | WB_DEFBUTTON;
512                 sal_Bool b = sal_Bool();
513                 if ( ( Value >>= b ) && !b )
514                     nStyle &= ~WB_DEFBUTTON;
515                 pButton->SetStyle( nStyle );
516             }
517             break;
518             case BASEPROPERTY_STATE:
519             {
520                 if ( GetWindow()->GetType() == WINDOW_PUSHBUTTON )
521                 {
522                     sal_Int16 n = sal_Int16();
523                     if ( Value >>= n )
524                         ((PushButton*)pButton)->SetState( (TriState)n );
525                 }
526             }
527             break;
528             default:
529             {
530                 VCLXGraphicControl::setProperty( PropertyName, Value );
531             }
532         }
533     }
534 }
535 
536 ::com::sun::star::uno::Any VCLXButton::getProperty( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::uno::RuntimeException)
537 {
538     ::vos::OGuard aGuard( GetMutex() );
539 
540     ::com::sun::star::uno::Any aProp;
541     Button* pButton = (Button*)GetWindow();
542     if ( pButton )
543     {
544         sal_uInt16 nPropType = GetPropertyId( PropertyName );
545         switch ( nPropType )
546         {
547             case BASEPROPERTY_FOCUSONCLICK:
548                 aProp <<= (sal_Bool)( ( pButton->GetStyle() & WB_NOPOINTERFOCUS ) == 0 );
549                 break;
550 
551             case BASEPROPERTY_TOGGLE:
552                 aProp <<= (sal_Bool)( ( pButton->GetStyle() & WB_TOGGLE ) != 0 );
553                 break;
554 
555             case BASEPROPERTY_DEFAULTBUTTON:
556             {
557                 aProp <<= (sal_Bool) ( ( pButton->GetStyle() & WB_DEFBUTTON ) ? sal_True : sal_False );
558             }
559             break;
560             case BASEPROPERTY_STATE:
561             {
562                 if ( GetWindow()->GetType() == WINDOW_PUSHBUTTON )
563                 {
564                     aProp <<= (sal_Int16)((PushButton*)pButton)->GetState();
565                 }
566             }
567             break;
568             default:
569             {
570                 aProp <<= VCLXGraphicControl::getProperty( PropertyName );
571             }
572         }
573     }
574     return aProp;
575 }
576 
577 void VCLXButton::ProcessWindowEvent( const VclWindowEvent& rVclWindowEvent )
578 {
579     switch ( rVclWindowEvent.GetId() )
580     {
581         case VCLEVENT_BUTTON_CLICK:
582         {
583             ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindow > xKeepAlive( this );
584                 // since we call listeners below, there is a potential that we will be destroyed
585                 // during the listener call. To prevent the resulting crashs, we keep us
586                 // alive as long as we're here
587                 // #20178# - 2003-10-01 - fs@openoffice.org
588 
589             if ( maActionListeners.getLength() )
590             {
591                 ::com::sun::star::awt::ActionEvent aEvent;
592                 aEvent.Source = (::cppu::OWeakObject*)this;
593                 aEvent.ActionCommand = maActionCommand;
594 
595                 Callback aCallback = ::boost::bind(
596                     &ActionListenerMultiplexer::actionPerformed,
597                     &maActionListeners,
598                     aEvent
599                 );
600                 ImplExecuteAsyncWithoutSolarLock( aCallback );
601             }
602         }
603         break;
604 
605         case VCLEVENT_PUSHBUTTON_TOGGLE:
606         {
607             PushButton& rButton = dynamic_cast< PushButton& >( *rVclWindowEvent.GetWindow() );
608 
609             ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindow > xKeepAlive( this );
610             if ( maItemListeners.getLength() )
611             {
612                 ::com::sun::star::awt::ItemEvent aEvent;
613                 aEvent.Source = (::cppu::OWeakObject*)this;
614                 aEvent.Selected = ( rButton.GetState() == STATE_CHECK ) ? 1 : 0;
615                 maItemListeners.itemStateChanged( aEvent );
616             }
617         }
618         break;
619 
620         default:
621             VCLXGraphicControl::ProcessWindowEvent( rVclWindowEvent );
622             break;
623     }
624 }
625 
626 //  ----------------------------------------------------
627 //  class VCLXImageControl
628 //  ----------------------------------------------------
629 
630 void VCLXImageControl::ImplGetPropertyIds( std::list< sal_uInt16 > &rIds )
631 {
632     PushPropertyIds( rIds,
633                      BASEPROPERTY_BACKGROUNDCOLOR,
634                      BASEPROPERTY_BORDER,
635                      BASEPROPERTY_BORDERCOLOR,
636                      BASEPROPERTY_DEFAULTCONTROL,
637                      BASEPROPERTY_ENABLED,
638                      BASEPROPERTY_ENABLEVISIBLE,
639                      BASEPROPERTY_GRAPHIC,
640                      BASEPROPERTY_HELPTEXT,
641                      BASEPROPERTY_HELPURL,
642                      BASEPROPERTY_IMAGEURL,
643                      BASEPROPERTY_PRINTABLE,
644                      BASEPROPERTY_SCALEIMAGE,
645                      BASEPROPERTY_IMAGE_SCALE_MODE,
646                      BASEPROPERTY_TABSTOP,
647                      BASEPROPERTY_WRITING_MODE,
648                      BASEPROPERTY_CONTEXT_WRITING_MODE,
649                      0);
650     VCLXGraphicControl::ImplGetPropertyIds( rIds );
651 }
652 
653 VCLXImageControl::VCLXImageControl()
654 {
655 }
656 
657 VCLXImageControl::~VCLXImageControl()
658 {
659 }
660 
661 void VCLXImageControl::ImplSetNewImage()
662 {
663     OSL_PRECOND( GetWindow(), "VCLXImageControl::ImplSetNewImage: window is required to be not-NULL!" );
664     ImageControl* pControl = static_cast< ImageControl* >( GetWindow() );
665     pControl->SetImage( GetImage() );
666 }
667 
668 ::com::sun::star::awt::Size VCLXImageControl::getMinimumSize(  ) throw(::com::sun::star::uno::RuntimeException)
669 {
670     ::vos::OGuard aGuard( GetMutex() );
671 
672     Size aSz = GetImage().GetSizePixel();
673     aSz = ImplCalcWindowSize( aSz );
674 
675     return AWTSize(aSz);
676 }
677 
678 ::com::sun::star::awt::Size VCLXImageControl::getPreferredSize(  ) throw(::com::sun::star::uno::RuntimeException)
679 {
680     return getMinimumSize();
681 }
682 
683 ::com::sun::star::awt::Size VCLXImageControl::calcAdjustedSize( const ::com::sun::star::awt::Size& rNewSize ) throw(::com::sun::star::uno::RuntimeException)
684 {
685     ::vos::OGuard aGuard( GetMutex() );
686 
687     ::com::sun::star::awt::Size aSz = rNewSize;
688     ::com::sun::star::awt::Size aMinSz = getMinimumSize();
689     if ( aSz.Width < aMinSz.Width )
690         aSz.Width = aMinSz.Width;
691     if ( aSz.Height < aMinSz.Height )
692         aSz.Height = aMinSz.Height;
693     return aSz;
694 }
695 
696 void VCLXImageControl::setProperty( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Any& Value) throw(::com::sun::star::uno::RuntimeException)
697 {
698     ::vos::OGuard aGuard( GetMutex() );
699 
700     ImageControl* pImageControl = (ImageControl*)GetWindow();
701 
702     sal_uInt16 nPropType = GetPropertyId( PropertyName );
703     switch ( nPropType )
704     {
705         case BASEPROPERTY_IMAGE_SCALE_MODE:
706         {
707             sal_Int16 nScaleMode( ImageScaleMode::Anisotropic );
708             if ( pImageControl && ( Value >>= nScaleMode ) )
709             {
710                 pImageControl->SetScaleMode( nScaleMode );
711             }
712         }
713         break;
714 
715         case BASEPROPERTY_SCALEIMAGE:
716         {
717             // this is for compatibility only, nowadays, the ImageScaleMode property should be used
718             sal_Bool bScaleImage = sal_False;
719             if ( pImageControl && ( Value >>= bScaleImage ) )
720             {
721                 pImageControl->SetScaleMode( bScaleImage ? ImageScaleMode::Anisotropic : ImageScaleMode::None );
722             }
723         }
724         break;
725 
726         default:
727             VCLXGraphicControl::setProperty( PropertyName, Value );
728             break;
729     }
730 }
731 
732 ::com::sun::star::uno::Any VCLXImageControl::getProperty( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::uno::RuntimeException)
733 {
734     ::vos::OGuard aGuard( GetMutex() );
735 
736     ::com::sun::star::uno::Any aProp;
737     ImageControl* pImageControl = (ImageControl*)GetWindow();
738     sal_uInt16 nPropType = GetPropertyId( PropertyName );
739 
740     switch ( nPropType )
741     {
742         case BASEPROPERTY_IMAGE_SCALE_MODE:
743             aProp <<= ( pImageControl ? pImageControl->GetScaleMode() : ImageScaleMode::Anisotropic );
744             break;
745 
746         case BASEPROPERTY_SCALEIMAGE:
747             aProp <<= ( pImageControl && pImageControl->GetScaleMode() != ImageScaleMode::None ) ? sal_True : sal_False;
748             break;
749 
750         default:
751             aProp = VCLXGraphicControl::getProperty( PropertyName );
752             break;
753     }
754     return aProp;
755 }
756 
757 //  ----------------------------------------------------
758 //  class VCLXCheckBox
759 //  ----------------------------------------------------
760 
761 
762 void VCLXCheckBox::ImplGetPropertyIds( std::list< sal_uInt16 > &rIds )
763 {
764     PushPropertyIds( rIds,
765                      BASEPROPERTY_DEFAULTCONTROL,
766                      BASEPROPERTY_ENABLED,
767                      BASEPROPERTY_ENABLEVISIBLE,
768                      BASEPROPERTY_FONTDESCRIPTOR,
769                      BASEPROPERTY_GRAPHIC,
770                      BASEPROPERTY_HELPTEXT,
771                      BASEPROPERTY_HELPURL,
772                      BASEPROPERTY_IMAGEPOSITION,
773                      BASEPROPERTY_IMAGEURL,
774                      BASEPROPERTY_LABEL,
775                      BASEPROPERTY_PRINTABLE,
776                      BASEPROPERTY_STATE,
777                      BASEPROPERTY_TABSTOP,
778                      BASEPROPERTY_TRISTATE,
779                      BASEPROPERTY_VISUALEFFECT,
780                      BASEPROPERTY_MULTILINE,
781                      BASEPROPERTY_BACKGROUNDCOLOR,
782                      BASEPROPERTY_ALIGN,
783                      BASEPROPERTY_VERTICALALIGN,
784                      BASEPROPERTY_WRITING_MODE,
785                      BASEPROPERTY_CONTEXT_WRITING_MODE,
786                      BASEPROPERTY_REFERENCE_DEVICE,
787                      0);
788     VCLXGraphicControl::ImplGetPropertyIds( rIds );
789 }
790 
791 VCLXCheckBox::VCLXCheckBox() :  maActionListeners( *this ), maItemListeners( *this )
792 {
793 }
794 
795 // ::com::sun::star::uno::XInterface
796 ::com::sun::star::uno::Any VCLXCheckBox::queryInterface( const ::com::sun::star::uno::Type & rType ) throw(::com::sun::star::uno::RuntimeException)
797 {
798     ::com::sun::star::uno::Any aRet = ::cppu::queryInterface( rType,
799                                         SAL_STATIC_CAST( ::com::sun::star::awt::XButton*, this ),
800                                         SAL_STATIC_CAST( ::com::sun::star::awt::XCheckBox*, this ) );
801     return (aRet.hasValue() ? aRet : VCLXGraphicControl::queryInterface( rType ));
802 }
803 
804 // ::com::sun::star::lang::XTypeProvider
805 IMPL_XTYPEPROVIDER_START( VCLXCheckBox )
806     getCppuType( ( ::com::sun::star::uno::Reference< ::com::sun::star::awt::XButton>* ) NULL ),
807     getCppuType( ( ::com::sun::star::uno::Reference< ::com::sun::star::awt::XCheckBox>* ) NULL ),
808     VCLXGraphicControl::getTypes()
809 IMPL_XTYPEPROVIDER_END
810 
811 ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleContext > VCLXCheckBox::CreateAccessibleContext()
812 {
813     return getAccessibleFactory().createAccessibleContext( this );
814 }
815 
816 void VCLXCheckBox::dispose() throw(::com::sun::star::uno::RuntimeException)
817 {
818     ::vos::OGuard aGuard( GetMutex() );
819 
820     ::com::sun::star::lang::EventObject aObj;
821     aObj.Source = (::cppu::OWeakObject*)this;
822     maItemListeners.disposeAndClear( aObj );
823     VCLXGraphicControl::dispose();
824 }
825 
826 void VCLXCheckBox::addItemListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XItemListener > & l ) throw(::com::sun::star::uno::RuntimeException)
827 {
828     ::vos::OGuard aGuard( GetMutex() );
829     maItemListeners.addInterface( l );
830 }
831 
832 void VCLXCheckBox::removeItemListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XItemListener > & l ) throw(::com::sun::star::uno::RuntimeException)
833 {
834     ::vos::OGuard aGuard( GetMutex() );
835     maItemListeners.removeInterface( l );
836 }
837 
838 void VCLXCheckBox::addActionListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XActionListener > & l  )throw(::com::sun::star::uno::RuntimeException)
839 {
840     ::vos::OGuard aGuard( GetMutex() );
841     maActionListeners.addInterface( l );
842 }
843 
844 void VCLXCheckBox::removeActionListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XActionListener > & l ) throw(::com::sun::star::uno::RuntimeException)
845 {
846     ::vos::OGuard aGuard( GetMutex() );
847     maActionListeners.removeInterface( l );
848 }
849 
850 void VCLXCheckBox::setActionCommand( const ::rtl::OUString& rCommand ) throw(::com::sun::star::uno::RuntimeException)
851 {
852     ::vos::OGuard aGuard( GetMutex() );
853     maActionCommand = rCommand;
854 }
855 
856 void VCLXCheckBox::setLabel( const ::rtl::OUString& rLabel ) throw(::com::sun::star::uno::RuntimeException)
857 {
858     ::vos::OGuard aGuard( GetMutex() );
859 
860     Window* pWindow = GetWindow();
861     if ( pWindow )
862         pWindow->SetText( rLabel );
863 }
864 
865 void VCLXCheckBox::setState( short n ) throw(::com::sun::star::uno::RuntimeException)
866 {
867     ::vos::OGuard aGuard( GetMutex() );
868 
869     CheckBox* pCheckBox = (CheckBox*)GetWindow();
870     if ( pCheckBox)
871     {
872         TriState eState;
873         switch ( n )
874         {
875             case 0:     eState = STATE_NOCHECK;     break;
876             case 1:     eState = STATE_CHECK;       break;
877             case 2:     eState = STATE_DONTKNOW;    break;
878             default:    eState = STATE_NOCHECK;
879         }
880         pCheckBox->SetState( eState );
881 
882         // #105198# call C++ click listeners (needed for accessibility)
883         // pCheckBox->GetClickHdl().Call( pCheckBox );
884 
885         // #107218# Call same virtual methods and listeners like VCL would do after user interaction
886         SetSynthesizingVCLEvent( sal_True );
887         pCheckBox->Toggle();
888         pCheckBox->Click();
889         SetSynthesizingVCLEvent( sal_False );
890     }
891 }
892 
893 short VCLXCheckBox::getState() throw(::com::sun::star::uno::RuntimeException)
894 {
895     ::vos::OGuard aGuard( GetMutex() );
896 
897     short nState = -1;
898     CheckBox* pCheckBox = (CheckBox*)GetWindow();
899     if ( pCheckBox )
900     {
901         switch ( pCheckBox->GetState() )
902         {
903             case STATE_NOCHECK:     nState = 0; break;
904             case STATE_CHECK:       nState = 1; break;
905             case STATE_DONTKNOW:    nState = 2; break;
906             default:                DBG_ERROR( "VCLXCheckBox::getState(): unknown TriState!" );
907         }
908     }
909 
910     return nState;
911 }
912 
913 void VCLXCheckBox::enableTriState( sal_Bool b ) throw(::com::sun::star::uno::RuntimeException)
914 {
915     ::vos::OGuard aGuard( GetMutex() );
916 
917     CheckBox* pCheckBox = (CheckBox*)GetWindow();
918     if ( pCheckBox)
919         pCheckBox->EnableTriState( b );
920 }
921 
922 ::com::sun::star::awt::Size VCLXCheckBox::getMinimumSize(  ) throw(::com::sun::star::uno::RuntimeException)
923 {
924     ::vos::OGuard aGuard( GetMutex() );
925 
926     Size aSz;
927     CheckBox* pCheckBox = (CheckBox*) GetWindow();
928     if ( pCheckBox )
929         aSz = pCheckBox->CalcMinimumSize();
930     return AWTSize(aSz);
931 }
932 
933 ::com::sun::star::awt::Size VCLXCheckBox::getPreferredSize(  ) throw(::com::sun::star::uno::RuntimeException)
934 {
935     return getMinimumSize();
936 }
937 
938 ::com::sun::star::awt::Size VCLXCheckBox::calcAdjustedSize( const ::com::sun::star::awt::Size& rNewSize ) throw(::com::sun::star::uno::RuntimeException)
939 {
940     ::vos::OGuard aGuard( GetMutex() );
941 
942     Size aSz = VCLSize(rNewSize);
943     CheckBox* pCheckBox = (CheckBox*) GetWindow();
944     if ( pCheckBox )
945     {
946         Size aMinSz = pCheckBox->CalcMinimumSize();
947         if ( ( aSz.Width() > aMinSz.Width() ) && ( aSz.Height() < aMinSz.Height() ) )
948             aSz.Height() = aMinSz.Height();
949         else
950             aSz = aMinSz;
951     }
952     return AWTSize(aSz);
953 }
954 
955 void VCLXCheckBox::setProperty( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Any& Value) throw(::com::sun::star::uno::RuntimeException)
956 {
957     ::vos::OGuard aGuard( GetMutex() );
958 
959     CheckBox* pCheckBox = (CheckBox*)GetWindow();
960     if ( pCheckBox )
961     {
962         sal_uInt16 nPropType = GetPropertyId( PropertyName );
963         switch ( nPropType )
964         {
965             case BASEPROPERTY_VISUALEFFECT:
966                 ::toolkit::setVisualEffect( Value, pCheckBox );
967                 break;
968 
969             case BASEPROPERTY_TRISTATE:
970             {
971                 sal_Bool b = sal_Bool();
972                 if ( Value >>= b )
973                     pCheckBox->EnableTriState( b );
974             }
975             break;
976             case BASEPROPERTY_STATE:
977             {
978                 sal_Int16 n = sal_Int16();
979                 if ( Value >>= n )
980                     setState( n );
981             }
982             break;
983             default:
984             {
985                 VCLXGraphicControl::setProperty( PropertyName, Value );
986             }
987         }
988     }
989 }
990 
991 ::com::sun::star::uno::Any VCLXCheckBox::getProperty( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::uno::RuntimeException)
992 {
993     ::vos::OGuard aGuard( GetMutex() );
994 
995     ::com::sun::star::uno::Any aProp;
996     CheckBox* pCheckBox = (CheckBox*)GetWindow();
997     if ( pCheckBox )
998     {
999         sal_uInt16 nPropType = GetPropertyId( PropertyName );
1000         switch ( nPropType )
1001         {
1002             case BASEPROPERTY_VISUALEFFECT:
1003                 aProp = ::toolkit::getVisualEffect( pCheckBox );
1004                 break;
1005             case BASEPROPERTY_TRISTATE:
1006                 aProp <<= (sal_Bool)pCheckBox->IsTriStateEnabled();
1007                 break;
1008             case BASEPROPERTY_STATE:
1009                 aProp <<= (sal_Int16)pCheckBox->GetState();
1010                 break;
1011             default:
1012             {
1013                 aProp <<= VCLXGraphicControl::getProperty( PropertyName );
1014             }
1015         }
1016     }
1017     return aProp;
1018 }
1019 
1020 void VCLXCheckBox::ProcessWindowEvent( const VclWindowEvent& rVclWindowEvent )
1021 {
1022     switch ( rVclWindowEvent.GetId() )
1023     {
1024         case VCLEVENT_CHECKBOX_TOGGLE:
1025         {
1026             ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindow > xKeepAlive( this );
1027                 // since we call listeners below, there is a potential that we will be destroyed
1028                 // in during the listener call. To prevent the resulting crashs, we keep us
1029                 // alive as long as we're here
1030                 // #20178# - 2003-10-01 - fs@openoffice.org
1031 
1032             CheckBox* pCheckBox = (CheckBox*)GetWindow();
1033             if ( pCheckBox )
1034             {
1035                 if ( maItemListeners.getLength() )
1036                 {
1037                     ::com::sun::star::awt::ItemEvent aEvent;
1038                     aEvent.Source = (::cppu::OWeakObject*)this;
1039                     aEvent.Highlighted = sal_False;
1040                     aEvent.Selected = pCheckBox->GetState();
1041                     maItemListeners.itemStateChanged( aEvent );
1042                 }
1043                 if ( !IsSynthesizingVCLEvent() && maActionListeners.getLength() )
1044                 {
1045                     ::com::sun::star::awt::ActionEvent aEvent;
1046                     aEvent.Source = (::cppu::OWeakObject*)this;
1047                     aEvent.ActionCommand = maActionCommand;
1048                     maActionListeners.actionPerformed( aEvent );
1049                 }
1050             }
1051         }
1052         break;
1053 
1054         default:
1055             VCLXGraphicControl::ProcessWindowEvent( rVclWindowEvent );
1056             break;
1057     }
1058 }
1059 
1060 //  ----------------------------------------------------
1061 //  class VCLXRadioButton
1062 //  ----------------------------------------------------
1063 void VCLXRadioButton::ImplGetPropertyIds( std::list< sal_uInt16 > &rIds )
1064 {
1065     PushPropertyIds( rIds,
1066                      BASEPROPERTY_DEFAULTCONTROL,
1067                      BASEPROPERTY_ENABLED,
1068                      BASEPROPERTY_ENABLEVISIBLE,
1069                      BASEPROPERTY_FONTDESCRIPTOR,
1070                      BASEPROPERTY_GRAPHIC,
1071                      BASEPROPERTY_HELPTEXT,
1072                      BASEPROPERTY_HELPURL,
1073                      BASEPROPERTY_IMAGEPOSITION,
1074                      BASEPROPERTY_IMAGEURL,
1075                      BASEPROPERTY_LABEL,
1076                      BASEPROPERTY_PRINTABLE,
1077                      BASEPROPERTY_STATE,
1078                      BASEPROPERTY_TABSTOP,
1079                      BASEPROPERTY_VISUALEFFECT,
1080                      BASEPROPERTY_MULTILINE,
1081                      BASEPROPERTY_BACKGROUNDCOLOR,
1082                      BASEPROPERTY_ALIGN,
1083                      BASEPROPERTY_VERTICALALIGN,
1084                      BASEPROPERTY_WRITING_MODE,
1085                      BASEPROPERTY_CONTEXT_WRITING_MODE,
1086                      BASEPROPERTY_REFERENCE_DEVICE,
1087                      0);
1088     VCLXGraphicControl::ImplGetPropertyIds( rIds );
1089 }
1090 
1091 
1092 VCLXRadioButton::VCLXRadioButton() : maItemListeners( *this ), maActionListeners( *this )
1093 {
1094 }
1095 
1096 // ::com::sun::star::uno::XInterface
1097 ::com::sun::star::uno::Any VCLXRadioButton::queryInterface( const ::com::sun::star::uno::Type & rType ) throw(::com::sun::star::uno::RuntimeException)
1098 {
1099     ::com::sun::star::uno::Any aRet = ::cppu::queryInterface( rType,
1100                                         SAL_STATIC_CAST( ::com::sun::star::awt::XRadioButton*, this ),
1101                                         SAL_STATIC_CAST( ::com::sun::star::awt::XButton*, this ) );
1102     return (aRet.hasValue() ? aRet : VCLXGraphicControl::queryInterface( rType ));
1103 }
1104 
1105 // ::com::sun::star::lang::XTypeProvider
1106 IMPL_XTYPEPROVIDER_START( VCLXRadioButton )
1107     getCppuType( ( ::com::sun::star::uno::Reference< ::com::sun::star::awt::XRadioButton>* ) NULL ),
1108     getCppuType( ( ::com::sun::star::uno::Reference< ::com::sun::star::awt::XButton>* ) NULL ),
1109     VCLXGraphicControl::getTypes()
1110 IMPL_XTYPEPROVIDER_END
1111 
1112 ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleContext > VCLXRadioButton::CreateAccessibleContext()
1113 {
1114     return getAccessibleFactory().createAccessibleContext( this );
1115 }
1116 
1117 void VCLXRadioButton::dispose() throw(::com::sun::star::uno::RuntimeException)
1118 {
1119     ::vos::OGuard aGuard( GetMutex() );
1120 
1121     ::com::sun::star::lang::EventObject aObj;
1122     aObj.Source = (::cppu::OWeakObject*)this;
1123     maItemListeners.disposeAndClear( aObj );
1124     VCLXGraphicControl::dispose();
1125 }
1126 
1127 void VCLXRadioButton::setProperty( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Any& Value) throw(::com::sun::star::uno::RuntimeException)
1128 {
1129     ::vos::OGuard aGuard( GetMutex() );
1130 
1131     RadioButton* pButton = (RadioButton*)GetWindow();
1132     if ( pButton )
1133     {
1134         sal_uInt16 nPropType = GetPropertyId( PropertyName );
1135         switch ( nPropType )
1136         {
1137             case BASEPROPERTY_VISUALEFFECT:
1138                 ::toolkit::setVisualEffect( Value, pButton );
1139                 break;
1140 
1141             case BASEPROPERTY_STATE:
1142             {
1143                 sal_Int16 n = sal_Int16();
1144                 if ( Value >>= n )
1145                 {
1146                     sal_Bool b = n ? sal_True : sal_False;
1147                     if ( pButton->IsRadioCheckEnabled() )
1148                         pButton->Check( b );
1149                     else
1150                         pButton->SetState( b );
1151                 }
1152             }
1153             break;
1154             case BASEPROPERTY_AUTOTOGGLE:
1155             {
1156                 sal_Bool b = sal_Bool();
1157                 if ( Value >>= b )
1158                     pButton->EnableRadioCheck( b );
1159             }
1160             break;
1161             default:
1162             {
1163                 VCLXGraphicControl::setProperty( PropertyName, Value );
1164             }
1165         }
1166     }
1167 }
1168 
1169 ::com::sun::star::uno::Any VCLXRadioButton::getProperty( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::uno::RuntimeException)
1170 {
1171     ::vos::OGuard aGuard( GetMutex() );
1172 
1173     ::com::sun::star::uno::Any aProp;
1174     RadioButton* pButton = (RadioButton*)GetWindow();
1175     if ( pButton )
1176     {
1177         sal_uInt16 nPropType = GetPropertyId( PropertyName );
1178         switch ( nPropType )
1179         {
1180             case BASEPROPERTY_VISUALEFFECT:
1181                 aProp = ::toolkit::getVisualEffect( pButton );
1182                 break;
1183             case BASEPROPERTY_STATE:
1184                 aProp <<= (sal_Int16) ( pButton->IsChecked() ? 1 : 0 );
1185                 break;
1186             case BASEPROPERTY_AUTOTOGGLE:
1187                 aProp <<= (sal_Bool) pButton->IsRadioCheckEnabled();
1188                 break;
1189             default:
1190             {
1191                 aProp <<= VCLXGraphicControl::getProperty( PropertyName );
1192             }
1193         }
1194     }
1195     return aProp;
1196 }
1197 
1198 void VCLXRadioButton::addItemListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XItemListener > & l ) throw(::com::sun::star::uno::RuntimeException)
1199 {
1200     ::vos::OGuard aGuard( GetMutex() );
1201     maItemListeners.addInterface( l );
1202 }
1203 
1204 void VCLXRadioButton::removeItemListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XItemListener > & l ) throw(::com::sun::star::uno::RuntimeException)
1205 {
1206     ::vos::OGuard aGuard( GetMutex() );
1207     maItemListeners.removeInterface( l );
1208 }
1209 
1210 void VCLXRadioButton::addActionListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XActionListener > & l  )throw(::com::sun::star::uno::RuntimeException)
1211 {
1212     ::vos::OGuard aGuard( GetMutex() );
1213     maActionListeners.addInterface( l );
1214 }
1215 
1216 void VCLXRadioButton::removeActionListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XActionListener > & l ) throw(::com::sun::star::uno::RuntimeException)
1217 {
1218     ::vos::OGuard aGuard( GetMutex() );
1219     maActionListeners.removeInterface( l );
1220 }
1221 
1222 void VCLXRadioButton::setLabel( const ::rtl::OUString& rLabel ) throw(::com::sun::star::uno::RuntimeException)
1223 {
1224     ::vos::OGuard aGuard( GetMutex() );
1225 
1226     Window* pWindow = GetWindow();
1227     if ( pWindow )
1228         pWindow->SetText( rLabel );
1229 }
1230 
1231 void VCLXRadioButton::setActionCommand( const ::rtl::OUString& rCommand ) throw(::com::sun::star::uno::RuntimeException)
1232 {
1233     ::vos::OGuard aGuard( GetMutex() );
1234     maActionCommand = rCommand;
1235 }
1236 
1237 void VCLXRadioButton::setState( sal_Bool b ) throw(::com::sun::star::uno::RuntimeException)
1238 {
1239     ::vos::OGuard aGuard( GetMutex() );
1240 
1241     RadioButton* pRadioButton = (RadioButton*)GetWindow();
1242     if ( pRadioButton)
1243     {
1244         pRadioButton->Check( b );
1245         // #102717# item listeners are called, but not C++ click listeners in StarOffice code => call click hdl
1246         // But this is needed in old code because Accessibility API uses it.
1247         // pRadioButton->GetClickHdl().Call( pRadioButton );
1248 
1249         // #107218# Call same virtual methods and listeners like VCL would do after user interaction
1250         SetSynthesizingVCLEvent( sal_True );
1251         pRadioButton->Click();
1252         SetSynthesizingVCLEvent( sal_False );
1253     }
1254 }
1255 
1256 sal_Bool VCLXRadioButton::getState() throw(::com::sun::star::uno::RuntimeException)
1257 {
1258     ::vos::OGuard aGuard( GetMutex() );
1259 
1260     RadioButton* pRadioButton = (RadioButton*)GetWindow();
1261     return pRadioButton ? pRadioButton->IsChecked() : sal_False;
1262 }
1263 
1264 ::com::sun::star::awt::Size VCLXRadioButton::getMinimumSize(  ) throw(::com::sun::star::uno::RuntimeException)
1265 {
1266     ::vos::OGuard aGuard( GetMutex() );
1267 
1268     Size aSz;
1269     RadioButton* pRadioButton = (RadioButton*) GetWindow();
1270     if ( pRadioButton )
1271         aSz = pRadioButton->CalcMinimumSize();
1272     return AWTSize(aSz);
1273 }
1274 
1275 ::com::sun::star::awt::Size VCLXRadioButton::getPreferredSize(  ) throw(::com::sun::star::uno::RuntimeException)
1276 {
1277     return getMinimumSize();
1278 }
1279 
1280 ::com::sun::star::awt::Size VCLXRadioButton::calcAdjustedSize( const ::com::sun::star::awt::Size& rNewSize ) throw(::com::sun::star::uno::RuntimeException)
1281 {
1282     ::vos::OGuard aGuard( GetMutex() );
1283 
1284     Size aSz = VCLSize(rNewSize);
1285     RadioButton* pRadioButton = (RadioButton*) GetWindow();
1286     if ( pRadioButton )
1287     {
1288         Size aMinSz = pRadioButton->CalcMinimumSize();
1289         if ( ( aSz.Width() > aMinSz.Width() ) && ( aSz.Height() < aMinSz.Height() ) )
1290             aSz.Height() = aMinSz.Height();
1291         else
1292             aSz = aMinSz;
1293     }
1294     return AWTSize(aSz);
1295 }
1296 
1297 void VCLXRadioButton::ProcessWindowEvent( const VclWindowEvent& rVclWindowEvent )
1298 {
1299     ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindow > xKeepAlive( this );
1300         // since we call listeners below, there is a potential that we will be destroyed
1301         // in during the listener call. To prevent the resulting crashs, we keep us
1302         // alive as long as we're here
1303         // #20178# - 2003-10-01 - fs@openoffice.org
1304 
1305     switch ( rVclWindowEvent.GetId() )
1306     {
1307         case VCLEVENT_BUTTON_CLICK:
1308             if ( !IsSynthesizingVCLEvent() && maActionListeners.getLength() )
1309             {
1310                 ::com::sun::star::awt::ActionEvent aEvent;
1311                 aEvent.Source = (::cppu::OWeakObject*)this;
1312                 aEvent.ActionCommand = maActionCommand;
1313                 maActionListeners.actionPerformed( aEvent );
1314             }
1315             ImplClickedOrToggled( sal_False );
1316             break;
1317 
1318         case VCLEVENT_RADIOBUTTON_TOGGLE:
1319             ImplClickedOrToggled( sal_True );
1320             break;
1321 
1322         default:
1323             VCLXGraphicControl::ProcessWindowEvent( rVclWindowEvent );
1324             break;
1325     }
1326 }
1327 
1328 void VCLXRadioButton::ImplClickedOrToggled( sal_Bool bToggled )
1329 {
1330     // In the formulars, RadioChecked is not enabled, call itemStateChanged only for click
1331     // In the dialog editor, RadioChecked is enabled, call itemStateChanged only for bToggled
1332     RadioButton* pRadioButton = (RadioButton*)GetWindow();
1333     if ( pRadioButton && ( pRadioButton->IsRadioCheckEnabled() == bToggled ) && ( bToggled || pRadioButton->IsStateChanged() ) && maItemListeners.getLength() )
1334     {
1335         ::com::sun::star::awt::ItemEvent aEvent;
1336         aEvent.Source = (::cppu::OWeakObject*)this;
1337         aEvent.Highlighted = sal_False;
1338         aEvent.Selected = pRadioButton->IsChecked();
1339         maItemListeners.itemStateChanged( aEvent );
1340     }
1341 }
1342 
1343 ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > VCLXRadioButton::getFirstActionListener ()
1344 {
1345     if (!maItemListeners.getLength ())
1346         return ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > ();
1347     return maActionListeners.getElements()[0];
1348 }
1349 
1350 //  ----------------------------------------------------
1351 //  class VCLXSpinField
1352 //  ----------------------------------------------------
1353 void VCLXSpinField::ImplGetPropertyIds( std::list< sal_uInt16 > &rIds )
1354 {
1355     PushPropertyIds( rIds,
1356                      BASEPROPERTY_MOUSE_WHEEL_BEHAVIOUR,
1357                      0 );
1358     VCLXEdit::ImplGetPropertyIds( rIds );
1359 }
1360 
1361 VCLXSpinField::VCLXSpinField() : maSpinListeners( *this )
1362 {
1363 }
1364 
1365 // ::com::sun::star::uno::XInterface
1366 ::com::sun::star::uno::Any VCLXSpinField::queryInterface( const ::com::sun::star::uno::Type & rType ) throw(::com::sun::star::uno::RuntimeException)
1367 {
1368     ::com::sun::star::uno::Any aRet = ::cppu::queryInterface( rType,
1369                                         SAL_STATIC_CAST( ::com::sun::star::awt::XSpinField*, this ) );
1370     return (aRet.hasValue() ? aRet : VCLXEdit::queryInterface( rType ));
1371 }
1372 
1373 // ::com::sun::star::lang::XTypeProvider
1374 IMPL_XTYPEPROVIDER_START( VCLXSpinField )
1375     getCppuType( ( ::com::sun::star::uno::Reference< ::com::sun::star::awt::XSpinField>* ) NULL ),
1376     VCLXEdit::getTypes()
1377 IMPL_XTYPEPROVIDER_END
1378 
1379 void VCLXSpinField::addSpinListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XSpinListener > & l ) throw(::com::sun::star::uno::RuntimeException)
1380 {
1381     ::vos::OGuard aGuard( GetMutex() );
1382     maSpinListeners.addInterface( l );
1383 }
1384 
1385 void VCLXSpinField::removeSpinListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XSpinListener > & l ) throw(::com::sun::star::uno::RuntimeException)
1386 {
1387     ::vos::OGuard aGuard( GetMutex() );
1388     maSpinListeners.removeInterface( l );
1389 }
1390 
1391 void VCLXSpinField::up() throw(::com::sun::star::uno::RuntimeException)
1392 {
1393     ::vos::OGuard aGuard( GetMutex() );
1394 
1395     SpinField* pSpinField = (SpinField*) GetWindow();
1396     if ( pSpinField )
1397         pSpinField->Up();
1398 }
1399 
1400 void VCLXSpinField::down() throw(::com::sun::star::uno::RuntimeException)
1401 {
1402     ::vos::OGuard aGuard( GetMutex() );
1403 
1404     SpinField* pSpinField = (SpinField*) GetWindow();
1405     if ( pSpinField )
1406         pSpinField->Down();
1407 }
1408 
1409 void VCLXSpinField::first() throw(::com::sun::star::uno::RuntimeException)
1410 {
1411     ::vos::OGuard aGuard( GetMutex() );
1412 
1413     SpinField* pSpinField = (SpinField*) GetWindow();
1414     if ( pSpinField )
1415         pSpinField->First();
1416 }
1417 
1418 void VCLXSpinField::last() throw(::com::sun::star::uno::RuntimeException)
1419 {
1420     ::vos::OGuard aGuard( GetMutex() );
1421 
1422     SpinField* pSpinField = (SpinField*) GetWindow();
1423     if ( pSpinField )
1424         pSpinField->Last();
1425 }
1426 
1427 void VCLXSpinField::enableRepeat( sal_Bool bRepeat ) throw(::com::sun::star::uno::RuntimeException)
1428 {
1429     ::vos::OGuard aGuard( GetMutex() );
1430 
1431     Window* pWindow = GetWindow();
1432     if ( pWindow )
1433     {
1434         WinBits nStyle = pWindow->GetStyle();
1435         if ( bRepeat )
1436             nStyle |= WB_REPEAT;
1437         else
1438             nStyle &= ~WB_REPEAT;
1439         pWindow->SetStyle( nStyle );
1440     }
1441 }
1442 
1443 void VCLXSpinField::ProcessWindowEvent( const VclWindowEvent& rVclWindowEvent )
1444 {
1445     switch ( rVclWindowEvent.GetId() )
1446     {
1447         case VCLEVENT_SPINFIELD_UP:
1448         case VCLEVENT_SPINFIELD_DOWN:
1449         case VCLEVENT_SPINFIELD_FIRST:
1450         case VCLEVENT_SPINFIELD_LAST:
1451         {
1452             ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindow > xKeepAlive( this );
1453                 // since we call listeners below, there is a potential that we will be destroyed
1454                 // in during the listener call. To prevent the resulting crashs, we keep us
1455                 // alive as long as we're here
1456                 // #20178# - 2003-10-01 - fs@openoffice.org
1457 
1458             if ( maSpinListeners.getLength() )
1459             {
1460                 ::com::sun::star::awt::SpinEvent aEvent;
1461                 aEvent.Source = (::cppu::OWeakObject*)this;
1462                 switch ( rVclWindowEvent.GetId() )
1463                 {
1464                     case VCLEVENT_SPINFIELD_UP:     maSpinListeners.up( aEvent );
1465                                                     break;
1466                     case VCLEVENT_SPINFIELD_DOWN:   maSpinListeners.down( aEvent );
1467                                                     break;
1468                     case VCLEVENT_SPINFIELD_FIRST:  maSpinListeners.first( aEvent );
1469                                                     break;
1470                     case VCLEVENT_SPINFIELD_LAST:   maSpinListeners.last( aEvent );
1471                                                     break;
1472                 }
1473 
1474             }
1475         }
1476         break;
1477 
1478         default:
1479             VCLXEdit::ProcessWindowEvent( rVclWindowEvent );
1480             break;
1481     }
1482 }
1483 
1484 
1485 //  ----------------------------------------------------
1486 //  class VCLXListBox
1487 //  ----------------------------------------------------
1488 void VCLXListBox::ImplGetPropertyIds( std::list< sal_uInt16 > &rIds )
1489 {
1490     PushPropertyIds( rIds,
1491                      BASEPROPERTY_BACKGROUNDCOLOR,
1492                      BASEPROPERTY_BORDER,
1493                      BASEPROPERTY_BORDERCOLOR,
1494                      BASEPROPERTY_DEFAULTCONTROL,
1495                      BASEPROPERTY_DROPDOWN,
1496                      BASEPROPERTY_ENABLED,
1497                      BASEPROPERTY_ENABLEVISIBLE,
1498                      BASEPROPERTY_FONTDESCRIPTOR,
1499                      BASEPROPERTY_HELPTEXT,
1500                      BASEPROPERTY_HELPURL,
1501                      BASEPROPERTY_LINECOUNT,
1502                      BASEPROPERTY_MULTISELECTION,
1503                      BASEPROPERTY_MULTISELECTION_SIMPLEMODE,
1504                      BASEPROPERTY_ITEM_SEPARATOR_POS,
1505                      BASEPROPERTY_PRINTABLE,
1506                      BASEPROPERTY_SELECTEDITEMS,
1507                      BASEPROPERTY_STRINGITEMLIST,
1508                      BASEPROPERTY_TABSTOP,
1509                      BASEPROPERTY_READONLY,
1510                      BASEPROPERTY_ALIGN,
1511                      BASEPROPERTY_WRITING_MODE,
1512                      BASEPROPERTY_CONTEXT_WRITING_MODE,
1513                      BASEPROPERTY_REFERENCE_DEVICE,
1514                      BASEPROPERTY_MOUSE_WHEEL_BEHAVIOUR,
1515                      0);
1516     VCLXWindow::ImplGetPropertyIds( rIds );
1517 }
1518 
1519 
1520 VCLXListBox::VCLXListBox()
1521     : maActionListeners( *this ),
1522       maItemListeners( *this )
1523 {
1524 }
1525 
1526 void VCLXListBox::dispose() throw(::com::sun::star::uno::RuntimeException)
1527 {
1528     ::vos::OGuard aGuard( GetMutex() );
1529 
1530     ::com::sun::star::lang::EventObject aObj;
1531     aObj.Source = (::cppu::OWeakObject*)this;
1532     maItemListeners.disposeAndClear( aObj );
1533     maActionListeners.disposeAndClear( aObj );
1534     VCLXWindow::dispose();
1535 }
1536 
1537 void VCLXListBox::addItemListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XItemListener > & l ) throw(::com::sun::star::uno::RuntimeException)
1538 {
1539     ::vos::OGuard aGuard( GetMutex() );
1540     maItemListeners.addInterface( l );
1541 }
1542 
1543 void VCLXListBox::removeItemListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XItemListener > & l ) throw(::com::sun::star::uno::RuntimeException)
1544 {
1545     ::vos::OGuard aGuard( GetMutex() );
1546     maItemListeners.removeInterface( l );
1547 }
1548 
1549 void VCLXListBox::addActionListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XActionListener > & l ) throw(::com::sun::star::uno::RuntimeException)
1550 {
1551     ::vos::OGuard aGuard( GetMutex() );
1552     maActionListeners.addInterface( l );
1553 }
1554 
1555 void VCLXListBox::removeActionListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XActionListener > & l ) throw(::com::sun::star::uno::RuntimeException)
1556 {
1557     ::vos::OGuard aGuard( GetMutex() );
1558     maActionListeners.removeInterface( l );
1559 }
1560 
1561 void VCLXListBox::addItem( const ::rtl::OUString& aItem, sal_Int16 nPos ) throw(::com::sun::star::uno::RuntimeException)
1562 {
1563     ::vos::OGuard aGuard( GetMutex() );
1564 
1565     ListBox* pBox = (ListBox*) GetWindow();
1566     if ( pBox )
1567         pBox->InsertEntry( aItem, nPos );
1568 }
1569 
1570 void VCLXListBox::addItems( const ::com::sun::star::uno::Sequence< ::rtl::OUString>& aItems, sal_Int16 nPos ) throw(::com::sun::star::uno::RuntimeException)
1571 {
1572     ::vos::OGuard aGuard( GetMutex() );
1573 
1574     ListBox* pBox = (ListBox*) GetWindow();
1575     if ( pBox )
1576     {
1577         sal_uInt16 nP = nPos;
1578         const ::rtl::OUString* pItems = aItems.getConstArray();
1579         const ::rtl::OUString* pItemsEnd = aItems.getConstArray() + aItems.getLength();
1580         while ( pItems != pItemsEnd )
1581         {
1582             if ( (sal_uInt16)nP == 0xFFFF )
1583             {
1584                 OSL_ENSURE( false, "VCLXListBox::addItems: too many entries!" );
1585                 // skip remaining entries, list cannot hold them, anyway
1586                 break;
1587             }
1588 
1589             pBox->InsertEntry( *pItems++, nP++ );
1590         }
1591     }
1592 }
1593 
1594 void VCLXListBox::removeItems( sal_Int16 nPos, sal_Int16 nCount ) throw(::com::sun::star::uno::RuntimeException)
1595 {
1596     ::vos::OGuard aGuard( GetMutex() );
1597 
1598     ListBox* pBox = (ListBox*) GetWindow();
1599     if ( pBox )
1600     {
1601         for ( sal_uInt16 n = nCount; n; )
1602             pBox->RemoveEntry( nPos + (--n) );
1603     }
1604 }
1605 
1606 sal_Int16 VCLXListBox::getItemCount() throw(::com::sun::star::uno::RuntimeException)
1607 {
1608     ::vos::OGuard aGuard( GetMutex() );
1609 
1610     ListBox* pBox = (ListBox*) GetWindow();
1611     return pBox ? pBox->GetEntryCount() : 0;
1612 }
1613 
1614 ::rtl::OUString VCLXListBox::getItem( sal_Int16 nPos ) throw(::com::sun::star::uno::RuntimeException)
1615 {
1616     ::vos::OGuard aGuard( GetMutex() );
1617 
1618     String aItem;
1619     ListBox* pBox = (ListBox*) GetWindow();
1620     if ( pBox )
1621         aItem = pBox->GetEntry( nPos );
1622     return aItem;
1623 }
1624 
1625 ::com::sun::star::uno::Sequence< ::rtl::OUString> VCLXListBox::getItems() throw(::com::sun::star::uno::RuntimeException)
1626 {
1627     ::vos::OGuard aGuard( GetMutex() );
1628 
1629     ::com::sun::star::uno::Sequence< ::rtl::OUString> aSeq;
1630     ListBox* pBox = (ListBox*) GetWindow();
1631     if ( pBox )
1632     {
1633         sal_uInt16 nEntries = pBox->GetEntryCount();
1634         aSeq = ::com::sun::star::uno::Sequence< ::rtl::OUString>( nEntries );
1635         for ( sal_uInt16 n = nEntries; n; )
1636         {
1637             --n;
1638             aSeq.getArray()[n] = ::rtl::OUString( pBox->GetEntry( n ) );
1639         }
1640     }
1641     return aSeq;
1642 }
1643 
1644 sal_Int16 VCLXListBox::getSelectedItemPos() throw(::com::sun::star::uno::RuntimeException)
1645 {
1646     ::vos::OGuard aGuard( GetMutex() );
1647 
1648     ListBox* pBox = (ListBox*) GetWindow();
1649     return pBox ? pBox->GetSelectEntryPos() : 0;
1650 }
1651 
1652 ::com::sun::star::uno::Sequence<sal_Int16> VCLXListBox::getSelectedItemsPos() throw(::com::sun::star::uno::RuntimeException)
1653 {
1654     ::vos::OGuard aGuard( GetMutex() );
1655 
1656     ::com::sun::star::uno::Sequence<sal_Int16> aSeq;
1657     ListBox* pBox = (ListBox*) GetWindow();
1658     if ( pBox )
1659     {
1660         sal_uInt16 nSelEntries = pBox->GetSelectEntryCount();
1661         aSeq = ::com::sun::star::uno::Sequence<sal_Int16>( nSelEntries );
1662         for ( sal_uInt16 n = 0; n < nSelEntries; n++ )
1663             aSeq.getArray()[n] = pBox->GetSelectEntryPos( n );
1664     }
1665     return aSeq;
1666 }
1667 
1668 ::rtl::OUString VCLXListBox::getSelectedItem() throw(::com::sun::star::uno::RuntimeException)
1669 {
1670     ::vos::OGuard aGuard( GetMutex() );
1671 
1672     String aItem;
1673     ListBox* pBox = (ListBox*) GetWindow();
1674     if ( pBox )
1675         aItem = pBox->GetSelectEntry();
1676     return aItem;
1677 }
1678 
1679 ::com::sun::star::uno::Sequence< ::rtl::OUString> VCLXListBox::getSelectedItems() throw(::com::sun::star::uno::RuntimeException)
1680 {
1681     ::vos::OGuard aGuard( GetMutex() );
1682 
1683     ::com::sun::star::uno::Sequence< ::rtl::OUString> aSeq;
1684     ListBox* pBox = (ListBox*) GetWindow();
1685     if ( pBox )
1686     {
1687         sal_uInt16 nSelEntries = pBox->GetSelectEntryCount();
1688         aSeq = ::com::sun::star::uno::Sequence< ::rtl::OUString>( nSelEntries );
1689         for ( sal_uInt16 n = 0; n < nSelEntries; n++ )
1690             aSeq.getArray()[n] = ::rtl::OUString( pBox->GetSelectEntry( n ) );
1691     }
1692     return aSeq;
1693 }
1694 
1695 void VCLXListBox::selectItemPos( sal_Int16 nPos, sal_Bool bSelect ) throw(::com::sun::star::uno::RuntimeException)
1696 {
1697     ::vos::OGuard aGuard( GetMutex() );
1698 
1699     ListBox* pBox = (ListBox*) GetWindow();
1700     if ( pBox && ( pBox->IsEntryPosSelected( nPos ) != bSelect ) )
1701     {
1702         pBox->SelectEntryPos( nPos, bSelect );
1703 
1704         // VCL doesn't call select handler after API call.
1705         // ImplCallItemListeners();
1706 
1707         // #107218# Call same listeners like VCL would do after user interaction
1708         SetSynthesizingVCLEvent( sal_True );
1709         pBox->Select();
1710         SetSynthesizingVCLEvent( sal_False );
1711     }
1712 }
1713 
1714 void VCLXListBox::selectItemsPos( const ::com::sun::star::uno::Sequence<sal_Int16>& aPositions, sal_Bool bSelect ) throw(::com::sun::star::uno::RuntimeException)
1715 {
1716     ::vos::OGuard aGuard( GetMutex() );
1717 
1718     ListBox* pBox = (ListBox*) GetWindow();
1719     if ( pBox )
1720     {
1721         sal_Bool bChanged = sal_False;
1722         for ( sal_uInt16 n = (sal_uInt16)aPositions.getLength(); n; )
1723         {
1724             sal_uInt16 nPos = (sal_uInt16) aPositions.getConstArray()[--n];
1725             if ( pBox->IsEntryPosSelected( nPos ) != bSelect )
1726             {
1727                 pBox->SelectEntryPos( nPos, bSelect );
1728                 bChanged = sal_True;
1729             }
1730         }
1731 
1732         if ( bChanged )
1733         {
1734             // VCL doesn't call select handler after API call.
1735             // ImplCallItemListeners();
1736 
1737             // #107218# Call same listeners like VCL would do after user interaction
1738             SetSynthesizingVCLEvent( sal_True );
1739             pBox->Select();
1740             SetSynthesizingVCLEvent( sal_False );
1741         }
1742     }
1743 }
1744 
1745 void VCLXListBox::selectItem( const ::rtl::OUString& rItemText, sal_Bool bSelect ) throw(::com::sun::star::uno::RuntimeException)
1746 {
1747     ::vos::OGuard aGuard( GetMutex() );
1748 
1749     ListBox* pBox = (ListBox*) GetWindow();
1750     if ( pBox )
1751     {
1752         String aItemText( rItemText );
1753         selectItemPos( pBox->GetEntryPos( aItemText ), bSelect );
1754     }
1755 }
1756 
1757 
1758 void VCLXListBox::setDropDownLineCount( sal_Int16 nLines ) throw(::com::sun::star::uno::RuntimeException)
1759 {
1760     ::vos::OGuard aGuard( GetMutex() );
1761 
1762     ListBox* pBox = (ListBox*) GetWindow();
1763     if ( pBox )
1764         pBox->SetDropDownLineCount( nLines );
1765 }
1766 
1767 sal_Int16 VCLXListBox::getDropDownLineCount() throw(::com::sun::star::uno::RuntimeException)
1768 {
1769     ::vos::OGuard aGuard( GetMutex() );
1770 
1771     sal_Int16 nLines = 0;
1772     ListBox* pBox = (ListBox*) GetWindow();
1773     if ( pBox )
1774         nLines = pBox->GetDropDownLineCount();
1775     return nLines;
1776 }
1777 
1778 sal_Bool VCLXListBox::isMutipleMode() throw(::com::sun::star::uno::RuntimeException)
1779 {
1780     ::vos::OGuard aGuard( GetMutex() );
1781 
1782     sal_Bool bMulti = sal_False;
1783     ListBox* pBox = (ListBox*) GetWindow();
1784     if ( pBox )
1785         bMulti = pBox->IsMultiSelectionEnabled();
1786     return bMulti;
1787 }
1788 
1789 void VCLXListBox::setMultipleMode( sal_Bool bMulti ) throw(::com::sun::star::uno::RuntimeException)
1790 {
1791     ::vos::OGuard aGuard( GetMutex() );
1792 
1793     ListBox* pBox = (ListBox*) GetWindow();
1794     if ( pBox )
1795         pBox->EnableMultiSelection( bMulti );
1796 }
1797 
1798 void VCLXListBox::makeVisible( sal_Int16 nEntry ) throw(::com::sun::star::uno::RuntimeException)
1799 {
1800     ::vos::OGuard aGuard( GetMutex() );
1801 
1802     ListBox* pBox = (ListBox*) GetWindow();
1803     if ( pBox )
1804         pBox->SetTopEntry( nEntry );
1805 }
1806 
1807 void VCLXListBox::ProcessWindowEvent( const VclWindowEvent& rVclWindowEvent )
1808 {
1809     ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindow > xKeepAlive( this );
1810         // since we call listeners below, there is a potential that we will be destroyed
1811         // in during the listener call. To prevent the resulting crashs, we keep us
1812         // alive as long as we're here
1813         // #20178# - 2003-10-01 - fs@openoffice.org
1814 
1815     switch ( rVclWindowEvent.GetId() )
1816     {
1817         case VCLEVENT_LISTBOX_SELECT:
1818         {
1819             ListBox* pListBox = (ListBox*)GetWindow();
1820 
1821             if( pListBox )
1822             {
1823                 sal_Bool bDropDown = ( pListBox->GetStyle() & WB_DROPDOWN ) ? sal_True : sal_False;
1824                 if ( bDropDown && !IsSynthesizingVCLEvent() && maActionListeners.getLength() )
1825                 {
1826                     // Bei DropDown den ActionListener rufen...
1827                     ::com::sun::star::awt::ActionEvent aEvent;
1828                     aEvent.Source = (::cppu::OWeakObject*)this;
1829                     aEvent.ActionCommand = pListBox->GetSelectEntry();
1830                     maActionListeners.actionPerformed( aEvent );
1831                 }
1832 
1833                 if ( maItemListeners.getLength() )
1834                 {
1835                     ImplCallItemListeners();
1836                 }
1837             }
1838         }
1839         break;
1840 
1841         case VCLEVENT_LISTBOX_DOUBLECLICK:
1842             if ( GetWindow() && maActionListeners.getLength() )
1843             {
1844                 ::com::sun::star::awt::ActionEvent aEvent;
1845                 aEvent.Source = (::cppu::OWeakObject*)this;
1846                 aEvent.ActionCommand = ((ListBox*)GetWindow())->GetSelectEntry();
1847                 maActionListeners.actionPerformed( aEvent );
1848             }
1849             break;
1850 
1851         default:
1852             VCLXWindow::ProcessWindowEvent( rVclWindowEvent );
1853             break;
1854     }
1855 }
1856 
1857 ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleContext > VCLXListBox::CreateAccessibleContext()
1858 {
1859     ::vos::OGuard aGuard( GetMutex() );
1860 
1861     return getAccessibleFactory().createAccessibleContext( this );
1862 }
1863 
1864 void VCLXListBox::setProperty( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Any& Value) throw(::com::sun::star::uno::RuntimeException)
1865 {
1866     ::vos::OGuard aGuard( GetMutex() );
1867 
1868     ListBox* pListBox = (ListBox*)GetWindow();
1869     if ( pListBox )
1870     {
1871         sal_uInt16 nPropType = GetPropertyId( PropertyName );
1872         switch ( nPropType )
1873         {
1874             case BASEPROPERTY_ITEM_SEPARATOR_POS:
1875             {
1876                 sal_Int16 nSeparatorPos(0);
1877                 if ( Value >>= nSeparatorPos )
1878                     pListBox->SetSeparatorPos( nSeparatorPos );
1879             }
1880             break;
1881             case BASEPROPERTY_READONLY:
1882             {
1883                 sal_Bool b = sal_Bool();
1884                 if ( Value >>= b )
1885                     pListBox->SetReadOnly( b);
1886             }
1887             break;
1888             case BASEPROPERTY_MULTISELECTION:
1889             {
1890                 sal_Bool b = sal_Bool();
1891                 if ( Value >>= b )
1892                     pListBox->EnableMultiSelection( b );
1893             }
1894             break;
1895             case BASEPROPERTY_MULTISELECTION_SIMPLEMODE:
1896                 ::toolkit::adjustBooleanWindowStyle( Value, pListBox, WB_SIMPLEMODE, sal_False );
1897                 break;
1898             case BASEPROPERTY_LINECOUNT:
1899             {
1900                 sal_Int16 n = sal_Int16();
1901                 if ( Value >>= n )
1902                     pListBox->SetDropDownLineCount( n );
1903             }
1904             break;
1905             case BASEPROPERTY_STRINGITEMLIST:
1906             {
1907                 ::com::sun::star::uno::Sequence< ::rtl::OUString> aItems;
1908                 if ( Value >>= aItems )
1909                 {
1910                     pListBox->Clear();
1911                     addItems( aItems, 0 );
1912                 }
1913             }
1914             break;
1915             case BASEPROPERTY_SELECTEDITEMS:
1916             {
1917                 ::com::sun::star::uno::Sequence<sal_Int16> aItems;
1918                 if ( Value >>= aItems )
1919                 {
1920                     for ( sal_uInt16 n = pListBox->GetEntryCount(); n; )
1921                         pListBox->SelectEntryPos( --n, sal_False );
1922 
1923                     if ( aItems.getLength() )
1924                         selectItemsPos( aItems, sal_True );
1925                     else
1926                         pListBox->SetNoSelection();
1927 
1928                     if ( !pListBox->GetSelectEntryCount() )
1929                         pListBox->SetTopEntry( 0 );
1930                 }
1931             }
1932             break;
1933             default:
1934             {
1935                 VCLXWindow::setProperty( PropertyName, Value );
1936             }
1937         }
1938     }
1939 }
1940 
1941 ::com::sun::star::uno::Any VCLXListBox::getProperty( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::uno::RuntimeException)
1942 {
1943     ::vos::OGuard aGuard( GetMutex() );
1944 
1945     ::com::sun::star::uno::Any aProp;
1946     ListBox* pListBox = (ListBox*)GetWindow();
1947     if ( pListBox )
1948     {
1949         sal_uInt16 nPropType = GetPropertyId( PropertyName );
1950         switch ( nPropType )
1951         {
1952             case BASEPROPERTY_ITEM_SEPARATOR_POS:
1953                 aProp <<= sal_Int16( pListBox->GetSeparatorPos() );
1954                 break;
1955             case BASEPROPERTY_READONLY:
1956             {
1957                 aProp <<= (sal_Bool) pListBox->IsReadOnly();
1958             }
1959             break;
1960             case BASEPROPERTY_MULTISELECTION:
1961             {
1962                 aProp <<= (sal_Bool) pListBox->IsMultiSelectionEnabled();
1963             }
1964             break;
1965             case BASEPROPERTY_MULTISELECTION_SIMPLEMODE:
1966             {
1967                 aProp <<= (sal_Bool)( ( pListBox->GetStyle() & WB_SIMPLEMODE ) == 0 );
1968             }
1969             break;
1970             case BASEPROPERTY_LINECOUNT:
1971             {
1972                 aProp <<= (sal_Int16) pListBox->GetDropDownLineCount();
1973             }
1974             break;
1975             case BASEPROPERTY_STRINGITEMLIST:
1976             {
1977                 sal_uInt16 nItems = pListBox->GetEntryCount();
1978                 ::com::sun::star::uno::Sequence< ::rtl::OUString> aSeq( nItems );
1979                 ::rtl::OUString* pStrings = aSeq.getArray();
1980                 for ( sal_uInt16 n = 0; n < nItems; n++ )
1981                     pStrings[n] = pListBox->GetEntry( n );
1982                 aProp <<= aSeq;
1983 
1984             }
1985             break;
1986             default:
1987             {
1988                 aProp <<= VCLXWindow::getProperty( PropertyName );
1989             }
1990         }
1991     }
1992     return aProp;
1993 }
1994 
1995 ::com::sun::star::awt::Size VCLXListBox::getMinimumSize(  ) throw(::com::sun::star::uno::RuntimeException)
1996 {
1997     ::vos::OGuard aGuard( GetMutex() );
1998 
1999     Size aSz;
2000     ListBox* pListBox = (ListBox*) GetWindow();
2001     if ( pListBox )
2002         aSz = pListBox->CalcMinimumSize();
2003     return AWTSize(aSz);
2004 }
2005 
2006 ::com::sun::star::awt::Size VCLXListBox::getPreferredSize(  ) throw(::com::sun::star::uno::RuntimeException)
2007 {
2008     ::vos::OGuard aGuard( GetMutex() );
2009 
2010     Size aSz;
2011     ListBox* pListBox = (ListBox*) GetWindow();
2012     if ( pListBox )
2013     {
2014         aSz = pListBox->CalcMinimumSize();
2015         if ( pListBox->GetStyle() & WB_DROPDOWN )
2016             aSz.Height() += 4;
2017     }
2018     return AWTSize(aSz);
2019 }
2020 
2021 ::com::sun::star::awt::Size VCLXListBox::calcAdjustedSize( const ::com::sun::star::awt::Size& rNewSize ) throw(::com::sun::star::uno::RuntimeException)
2022 {
2023     ::vos::OGuard aGuard( GetMutex() );
2024 
2025     Size aSz = VCLSize(rNewSize);
2026     ListBox* pListBox = (ListBox*) GetWindow();
2027     if ( pListBox )
2028         aSz = pListBox->CalcAdjustedSize( aSz );
2029     return AWTSize(aSz);
2030 }
2031 
2032 ::com::sun::star::awt::Size VCLXListBox::getMinimumSize( sal_Int16 nCols, sal_Int16 nLines ) throw(::com::sun::star::uno::RuntimeException)
2033 {
2034     ::vos::OGuard aGuard( GetMutex() );
2035 
2036     Size aSz;
2037     ListBox* pListBox = (ListBox*) GetWindow();
2038     if ( pListBox )
2039         aSz = pListBox->CalcSize( nCols, nLines );
2040     return AWTSize(aSz);
2041 }
2042 
2043 void VCLXListBox::getColumnsAndLines( sal_Int16& nCols, sal_Int16& nLines ) throw(::com::sun::star::uno::RuntimeException)
2044 {
2045     ::vos::OGuard aGuard( GetMutex() );
2046 
2047     nCols = nLines = 0;
2048     ListBox* pListBox = (ListBox*) GetWindow();
2049     if ( pListBox )
2050     {
2051         sal_uInt16 nC, nL;
2052         pListBox->GetMaxVisColumnsAndLines( nC, nL );
2053         nCols = nC;
2054         nLines = nL;
2055     }
2056 }
2057 
2058 void VCLXListBox::ImplCallItemListeners()
2059 {
2060     ListBox* pListBox = (ListBox*) GetWindow();
2061     if ( pListBox && maItemListeners.getLength() )
2062     {
2063         ::com::sun::star::awt::ItemEvent aEvent;
2064         aEvent.Source = (::cppu::OWeakObject*)this;
2065         aEvent.Highlighted = sal_False;
2066 
2067         // Bei Mehrfachselektion 0xFFFF, sonst die ID
2068         aEvent.Selected = (pListBox->GetSelectEntryCount() == 1 ) ? pListBox->GetSelectEntryPos() : 0xFFFF;
2069 
2070         maItemListeners.itemStateChanged( aEvent );
2071     }
2072 }
2073 namespace
2074 {
2075      Image lcl_getImageFromURL( const ::rtl::OUString& i_rImageURL )
2076      {
2077          if ( !i_rImageURL.getLength() )
2078              return Image();
2079 
2080         try
2081         {
2082              ::comphelper::ComponentContext aContext( ::comphelper::getProcessServiceFactory() );
2083              Reference< XGraphicProvider > xProvider;
2084              if ( aContext.createComponent( "com.sun.star.graphic.GraphicProvider", xProvider ) )
2085              {
2086                  ::comphelper::NamedValueCollection aMediaProperties;
2087                  aMediaProperties.put( "URL", i_rImageURL );
2088                  Reference< XGraphic > xGraphic = xProvider->queryGraphic( aMediaProperties.getPropertyValues() );
2089                 return Image( xGraphic );
2090              }
2091          }
2092          catch( const uno::Exception& )
2093          {
2094              DBG_UNHANDLED_EXCEPTION();
2095          }
2096          return Image();
2097      }
2098 }
2099 void SAL_CALL VCLXListBox::listItemInserted( const ItemListEvent& i_rEvent ) throw (RuntimeException)
2100 {
2101     ::vos::OGuard aGuard( GetMutex() );
2102 
2103     ListBox* pListBox = dynamic_cast< ListBox* >( GetWindow() );
2104 
2105     ENSURE_OR_RETURN_VOID( pListBox, "VCLXListBox::listItemInserted: no ListBox?!" );
2106     ENSURE_OR_RETURN_VOID( ( i_rEvent.ItemPosition >= 0 ) && ( i_rEvent.ItemPosition <= sal_Int32( pListBox->GetEntryCount() ) ),
2107         "VCLXListBox::listItemInserted: illegal (inconsistent) item position!" );
2108     pListBox->InsertEntry(
2109         i_rEvent.ItemText.IsPresent ? i_rEvent.ItemText.Value : ::rtl::OUString(),
2110         i_rEvent.ItemImageURL.IsPresent ? TkResMgr::getImageFromURL( i_rEvent.ItemImageURL.Value ) : Image(),
2111         i_rEvent.ItemPosition );
2112 }
2113 
2114 void SAL_CALL VCLXListBox::listItemRemoved( const ItemListEvent& i_rEvent ) throw (RuntimeException)
2115 {
2116     ::vos::OGuard aGuard( GetMutex() );
2117 
2118     ListBox* pListBox = dynamic_cast< ListBox* >( GetWindow() );
2119 
2120     ENSURE_OR_RETURN_VOID( pListBox, "VCLXListBox::listItemRemoved: no ListBox?!" );
2121     ENSURE_OR_RETURN_VOID( ( i_rEvent.ItemPosition >= 0 ) && ( i_rEvent.ItemPosition < sal_Int32( pListBox->GetEntryCount() ) ),
2122         "VCLXListBox::listItemRemoved: illegal (inconsistent) item position!" );
2123 
2124     pListBox->RemoveEntry( i_rEvent.ItemPosition );
2125 }
2126 
2127 void SAL_CALL VCLXListBox::listItemModified( const ItemListEvent& i_rEvent ) throw (RuntimeException)
2128 {
2129     ::vos::OGuard aGuard( GetMutex() );
2130 
2131     ListBox* pListBox = dynamic_cast< ListBox* >( GetWindow() );
2132 
2133     ENSURE_OR_RETURN_VOID( pListBox, "VCLXListBox::listItemModified: no ListBox?!" );
2134     ENSURE_OR_RETURN_VOID( ( i_rEvent.ItemPosition >= 0 ) && ( i_rEvent.ItemPosition < sal_Int32( pListBox->GetEntryCount() ) ),
2135         "VCLXListBox::listItemModified: illegal (inconsistent) item position!" );
2136 
2137     // VCL's ListBox does not support changing an entry's text or image, so remove and re-insert
2138 
2139     const ::rtl::OUString sNewText = i_rEvent.ItemText.IsPresent ? i_rEvent.ItemText.Value : ::rtl::OUString( pListBox->GetEntry( i_rEvent.ItemPosition ) );
2140     const Image aNewImage( i_rEvent.ItemImageURL.IsPresent ? TkResMgr::getImageFromURL( i_rEvent.ItemImageURL.Value ) : pListBox->GetEntryImage( i_rEvent.ItemPosition  ) );
2141 
2142     pListBox->RemoveEntry( i_rEvent.ItemPosition );
2143     pListBox->InsertEntry( sNewText, aNewImage, i_rEvent.ItemPosition );
2144 }
2145 
2146 void SAL_CALL VCLXListBox::allItemsRemoved( const EventObject& i_rEvent ) throw (RuntimeException)
2147 {
2148     ::vos::OGuard aGuard( GetMutex() );
2149 
2150     ListBox* pListBox = dynamic_cast< ListBox* >( GetWindow() );
2151     ENSURE_OR_RETURN_VOID( pListBox, "VCLXListBox::listItemModified: no ListBox?!" );
2152 
2153     pListBox->Clear();
2154 
2155     (void)i_rEvent;
2156 }
2157 
2158 void SAL_CALL VCLXListBox::itemListChanged( const EventObject& i_rEvent ) throw (RuntimeException)
2159 {
2160     ::vos::OGuard aGuard( GetMutex() );
2161 
2162     ListBox* pListBox = dynamic_cast< ListBox* >( GetWindow() );
2163     ENSURE_OR_RETURN_VOID( pListBox, "VCLXListBox::listItemModified: no ListBox?!" );
2164 
2165     pListBox->Clear();
2166 
2167     uno::Reference< beans::XPropertySet > xPropSet( i_rEvent.Source, uno::UNO_QUERY_THROW );
2168     uno::Reference< beans::XPropertySetInfo > xPSI( xPropSet->getPropertySetInfo(), uno::UNO_QUERY_THROW );
2169     uno::Reference< resource::XStringResourceResolver > xStringResourceResolver;
2170     if ( xPSI->hasPropertyByName( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ResourceResolver" ) ) ) )
2171     {
2172         xStringResourceResolver.set(
2173             xPropSet->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ResourceResolver" ) ) ),
2174             uno::UNO_QUERY
2175         );
2176     }
2177 
2178 
2179     Reference< XItemList > xItemList( i_rEvent.Source, uno::UNO_QUERY_THROW );
2180     uno::Sequence< beans::Pair< ::rtl::OUString, ::rtl::OUString > > aItems = xItemList->getAllItems();
2181     for ( sal_Int32 i=0; i<aItems.getLength(); ++i )
2182     {
2183         ::rtl::OUString aLocalizationKey( aItems[i].First );
2184         if ( xStringResourceResolver.is() && aLocalizationKey.getLength() != 0 && aLocalizationKey[0] == '&' )
2185         {
2186             aLocalizationKey = xStringResourceResolver->resolveString(aLocalizationKey.copy( 1 ));
2187         }
2188         pListBox->InsertEntry( aLocalizationKey, lcl_getImageFromURL( aItems[i].Second ) );
2189     }
2190 }
2191 
2192 void SAL_CALL VCLXListBox::disposing( const EventObject& i_rEvent ) throw (RuntimeException)
2193 {
2194     // just disambiguate
2195     VCLXWindow::disposing( i_rEvent );
2196 }
2197 
2198 //  ----------------------------------------------------
2199 //  class VCLXMessageBox
2200 //  ----------------------------------------------------
2201 
2202 void VCLXMessageBox::ImplGetPropertyIds( std::list< sal_uInt16 > &rIds )
2203 {
2204     VCLXTopWindow::ImplGetPropertyIds( rIds );
2205 }
2206 
2207 VCLXMessageBox::VCLXMessageBox()
2208 {
2209 }
2210 
2211 VCLXMessageBox::~VCLXMessageBox()
2212 {
2213 }
2214 
2215 // ::com::sun::star::uno::XInterface
2216 ::com::sun::star::uno::Any VCLXMessageBox::queryInterface( const ::com::sun::star::uno::Type & rType ) throw(::com::sun::star::uno::RuntimeException)
2217 {
2218     ::com::sun::star::uno::Any aRet = ::cppu::queryInterface( rType,
2219                                         SAL_STATIC_CAST( ::com::sun::star::awt::XMessageBox*, this ) );
2220     return (aRet.hasValue() ? aRet : VCLXTopWindow::queryInterface( rType ));
2221 }
2222 
2223 // ::com::sun::star::lang::XTypeProvider
2224 IMPL_XTYPEPROVIDER_START( VCLXMessageBox )
2225     getCppuType( ( ::com::sun::star::uno::Reference< ::com::sun::star::awt::XMessageBox>* ) NULL ),
2226     VCLXTopWindow::getTypes()
2227 IMPL_XTYPEPROVIDER_END
2228 
2229 void VCLXMessageBox::setCaptionText( const ::rtl::OUString& rText ) throw(::com::sun::star::uno::RuntimeException)
2230 {
2231     ::vos::OGuard aGuard( GetMutex() );
2232 
2233     Window* pWindow = GetWindow();
2234     if ( pWindow )
2235         pWindow->SetText( rText );
2236 }
2237 
2238 ::rtl::OUString VCLXMessageBox::getCaptionText() throw(::com::sun::star::uno::RuntimeException)
2239 {
2240     ::vos::OGuard aGuard( GetMutex() );
2241 
2242     String aText;
2243     Window* pWindow = GetWindow();
2244     if ( pWindow )
2245         aText = pWindow->GetText();
2246     return aText;
2247 }
2248 
2249 void VCLXMessageBox::setMessageText( const ::rtl::OUString& rText ) throw(::com::sun::star::uno::RuntimeException)
2250 {
2251     ::vos::OGuard aGuard( GetMutex() );
2252 
2253     MessBox* pBox = (MessBox*)GetWindow();
2254     if ( pBox )
2255         pBox->SetMessText( rText );
2256 }
2257 
2258 ::rtl::OUString VCLXMessageBox::getMessageText() throw(::com::sun::star::uno::RuntimeException)
2259 {
2260     ::vos::OGuard aGuard( GetMutex() );
2261 
2262     ::rtl::OUString aText;
2263     MessBox* pBox = (MessBox*)GetWindow();
2264     if ( pBox )
2265         aText = pBox->GetMessText();
2266     return aText;
2267 }
2268 
2269 sal_Int16 VCLXMessageBox::execute() throw(::com::sun::star::uno::RuntimeException)
2270 {
2271     ::vos::OGuard aGuard( GetMutex() );
2272 
2273     MessBox* pBox = (MessBox*)GetWindow();
2274     return pBox ? pBox->Execute() : 0;
2275 }
2276 
2277 ::com::sun::star::awt::Size SAL_CALL VCLXMessageBox::getMinimumSize() throw(::com::sun::star::uno::RuntimeException)
2278 {
2279     ::vos::OGuard aGuard( GetMutex() );
2280     return ::com::sun::star::awt::Size( 250, 100 );
2281 }
2282 
2283 //  ----------------------------------------------------
2284 //  class VCLXDialog
2285 //  ----------------------------------------------------
2286 void VCLXDialog::ImplGetPropertyIds( std::list< sal_uInt16 > &rIds )
2287 {
2288     VCLXTopWindow::ImplGetPropertyIds( rIds );
2289 }
2290 
2291 VCLXDialog::VCLXDialog()
2292 {
2293 }
2294 
2295 VCLXDialog::~VCLXDialog()
2296 {
2297 #ifndef __SUNPRO_CC
2298     OSL_TRACE ("%s", __FUNCTION__);
2299 #endif
2300 }
2301 
2302 // ::com::sun::star::uno::XInterface
2303 ::com::sun::star::uno::Any VCLXDialog::queryInterface( const ::com::sun::star::uno::Type & rType ) throw(::com::sun::star::uno::RuntimeException)
2304 {
2305     ::com::sun::star::uno::Any aRet = ::cppu::queryInterface( rType,
2306                                         SAL_STATIC_CAST( ::com::sun::star::awt::XDialog2*, this ),
2307                                         SAL_STATIC_CAST( ::com::sun::star::awt::XDialog*, this ) );
2308     return (aRet.hasValue() ? aRet : VCLXTopWindow::queryInterface( rType ));
2309 }
2310 
2311 // ::com::sun::star::lang::XTypeProvider
2312 IMPL_XTYPEPROVIDER_START( VCLXDialog )
2313     getCppuType( ( ::com::sun::star::uno::Reference< ::com::sun::star::awt::XDialog2>* ) NULL ),
2314     getCppuType( ( ::com::sun::star::uno::Reference< ::com::sun::star::awt::XDialog>* ) NULL ),
2315     VCLXTopWindow::getTypes()
2316 IMPL_XTYPEPROVIDER_END
2317 
2318 void SAL_CALL VCLXDialog::endDialog( ::sal_Int32 i_result ) throw (RuntimeException)
2319 {
2320     ::vos::OGuard aGuard( GetMutex() );
2321 
2322     Dialog* pDialog = dynamic_cast< Dialog* >( GetWindow() );
2323     if ( pDialog )
2324         pDialog->EndDialog( i_result );
2325 }
2326 
2327 void SAL_CALL VCLXDialog::setHelpId( const ::rtl::OUString& rId ) throw (RuntimeException)
2328 {
2329     ::vos::OGuard aGuard( GetMutex() );
2330 
2331     Window* pWindow = GetWindow();
2332     if ( pWindow )
2333         pWindow->SetHelpId( rtl::OUStringToOString( rId, RTL_TEXTENCODING_UTF8 ) );
2334 }
2335 
2336 void VCLXDialog::setTitle( const ::rtl::OUString& Title ) throw(::com::sun::star::uno::RuntimeException)
2337 {
2338     ::vos::OGuard aGuard( GetMutex() );
2339 
2340     Window* pWindow = GetWindow();
2341     if ( pWindow )
2342         pWindow->SetText( Title );
2343 }
2344 
2345 ::rtl::OUString VCLXDialog::getTitle() throw(::com::sun::star::uno::RuntimeException)
2346 {
2347     ::vos::OGuard aGuard( GetMutex() );
2348 
2349     ::rtl::OUString aTitle;
2350     Window* pWindow = GetWindow();
2351     if ( pWindow )
2352         aTitle = pWindow->GetText();
2353     return aTitle;
2354 }
2355 
2356 sal_Int16 VCLXDialog::execute() throw(::com::sun::star::uno::RuntimeException)
2357 {
2358     ::vos::OGuard aGuard( GetMutex() );
2359 
2360     sal_Int16 nRet = 0;
2361     if ( GetWindow() )
2362     {
2363         Dialog* pDlg = (Dialog*) GetWindow();
2364         Window* pParent = pDlg->GetWindow( WINDOW_PARENTOVERLAP );
2365         Window* pOldParent = NULL;
2366         Window* pSetParent = NULL;
2367         if ( pParent && !pParent->IsReallyVisible() )
2368         {
2369             pOldParent = pDlg->GetParent();
2370             Window* pFrame = pDlg->GetWindow( WINDOW_FRAME );
2371             if( pFrame != pDlg )
2372             {
2373                 pDlg->SetParent( pFrame );
2374                 pSetParent = pFrame;
2375             }
2376         }
2377 
2378         nRet = pDlg->Execute();
2379 
2380         // set the parent back only in case no new parent was set from outside
2381         // in other words, revert only own changes
2382         if ( pOldParent && pDlg->GetParent() == pSetParent )
2383             pDlg->SetParent( pOldParent );
2384     }
2385     return nRet;
2386 }
2387 
2388 void VCLXDialog::endExecute() throw(::com::sun::star::uno::RuntimeException)
2389 {
2390     endDialog(0);
2391 }
2392 
2393 void SAL_CALL VCLXDialog::draw( sal_Int32 nX, sal_Int32 nY ) throw(::com::sun::star::uno::RuntimeException)
2394 {
2395     ::vos::OGuard aGuard( GetMutex() );
2396     Window* pWindow = GetWindow();
2397 
2398     if ( pWindow )
2399     {
2400         OutputDevice* pDev = VCLUnoHelper::GetOutputDevice( getGraphics() );
2401         if ( !pDev )
2402             pDev = pWindow->GetParent();
2403 
2404         Size aSize = pDev->PixelToLogic( pWindow->GetSizePixel() );
2405         Point aPos = pDev->PixelToLogic( Point( nX, nY ) );
2406 
2407         pWindow->Draw( pDev, aPos, aSize, WINDOW_DRAW_NOCONTROLS );
2408     }
2409 }
2410 
2411 ::com::sun::star::awt::DeviceInfo VCLXDialog::getInfo() throw(::com::sun::star::uno::RuntimeException)
2412 {
2413     ::com::sun::star::awt::DeviceInfo aInfo = VCLXDevice::getInfo();
2414 
2415     ::vos::OGuard aGuard( GetMutex() );
2416     Dialog* pDlg = (Dialog*) GetWindow();
2417     if ( pDlg )
2418         pDlg->GetDrawWindowBorder( aInfo.LeftInset, aInfo.TopInset, aInfo.RightInset, aInfo.BottomInset );
2419 
2420     return aInfo;
2421 }
2422 
2423 
2424 void SAL_CALL VCLXDialog::setProperty(
2425     const ::rtl::OUString& PropertyName,
2426     const ::com::sun::star::uno::Any& Value )
2427 throw(::com::sun::star::uno::RuntimeException)
2428 {
2429     ::vos::OGuard aGuard( GetMutex() );
2430 
2431     Dialog* pDialog = (Dialog*)GetWindow();
2432     if ( pDialog )
2433     {
2434         sal_Bool bVoid = Value.getValueType().getTypeClass() == ::com::sun::star::uno::TypeClass_VOID;
2435 
2436         sal_uInt16 nPropType = GetPropertyId( PropertyName );
2437         switch ( nPropType )
2438         {
2439             case BASEPROPERTY_GRAPHIC:
2440             {
2441                 Reference< XGraphic > xGraphic;
2442                 if (( Value >>= xGraphic ) && xGraphic.is() )
2443                 {
2444                     Image aImage( xGraphic );
2445 
2446                     Wallpaper aWallpaper( aImage.GetBitmapEx());
2447                     aWallpaper.SetStyle( WALLPAPER_SCALE );
2448                     pDialog->SetBackground( aWallpaper );
2449                 }
2450                 else if ( bVoid || !xGraphic.is() )
2451                 {
2452                     Color aColor = pDialog->GetControlBackground().GetColor();
2453                     if ( aColor == COL_AUTO )
2454                         aColor = pDialog->GetSettings().GetStyleSettings().GetDialogColor();
2455 
2456                     Wallpaper aWallpaper( aColor );
2457                     pDialog->SetBackground( aWallpaper );
2458                 }
2459             }
2460             break;
2461 
2462             default:
2463             {
2464                 VCLXWindow::setProperty( PropertyName, Value );
2465             }
2466         }
2467     }
2468 }
2469 
2470 //  ----------------------------------------------------
2471 //  class VCLXTabPage
2472 //  ----------------------------------------------------
2473 VCLXTabPage::VCLXTabPage()
2474 {
2475 }
2476 
2477 VCLXTabPage::~VCLXTabPage()
2478 {
2479 }
2480 
2481 ::com::sun::star::uno::Any SAL_CALL VCLXTabPage::queryInterface(const ::com::sun::star::uno::Type & rType )
2482 throw(::com::sun::star::uno::RuntimeException)
2483 {
2484     return VCLXContainer::queryInterface( rType );
2485 }
2486 
2487 // ::com::sun::star::lang::XTypeProvider
2488 IMPL_XTYPEPROVIDER_START( VCLXTabPage )
2489     VCLXContainer::getTypes()
2490 IMPL_XTYPEPROVIDER_END
2491 
2492 // ::com::sun::star::awt::XView
2493 void SAL_CALL VCLXTabPage::draw( sal_Int32 nX, sal_Int32 nY )
2494 throw(::com::sun::star::uno::RuntimeException)
2495 {
2496     ::vos::OGuard aGuard( GetMutex() );
2497     Window* pWindow = GetWindow();
2498 
2499     if ( pWindow )
2500     {
2501         OutputDevice* pDev = VCLUnoHelper::GetOutputDevice( getGraphics() );
2502         if ( !pDev )
2503             pDev = pWindow->GetParent();
2504 
2505         Size aSize = pDev->PixelToLogic( pWindow->GetSizePixel() );
2506         Point aPos = pDev->PixelToLogic( Point( nX, nY ) );
2507 
2508         pWindow->Draw( pDev, aPos, aSize, WINDOW_DRAW_NOCONTROLS );
2509     }
2510 }
2511 
2512 // ::com::sun::star::awt::XDevice,
2513 ::com::sun::star::awt::DeviceInfo SAL_CALL VCLXTabPage::getInfo()
2514 throw(::com::sun::star::uno::RuntimeException)
2515 {
2516     ::com::sun::star::awt::DeviceInfo aInfo = VCLXDevice::getInfo();
2517     return aInfo;
2518 }
2519 
2520 void SAL_CALL VCLXTabPage::setProperty(
2521     const ::rtl::OUString& PropertyName,
2522     const ::com::sun::star::uno::Any& Value )
2523 throw(::com::sun::star::uno::RuntimeException)
2524 {
2525     ::vos::OGuard aGuard( GetMutex() );
2526 
2527     TabPage* pTabPage = (TabPage*)GetWindow();
2528     if ( pTabPage )
2529     {
2530         sal_Bool bVoid = Value.getValueType().getTypeClass() == ::com::sun::star::uno::TypeClass_VOID;
2531 
2532         sal_uInt16 nPropType = GetPropertyId( PropertyName );
2533         switch ( nPropType )
2534         {
2535             case BASEPROPERTY_GRAPHIC:
2536             {
2537                 Reference< XGraphic > xGraphic;
2538                 if (( Value >>= xGraphic ) && xGraphic.is() )
2539                 {
2540                     Image aImage( xGraphic );
2541 
2542                     Wallpaper aWallpaper( aImage.GetBitmapEx());
2543                     aWallpaper.SetStyle( WALLPAPER_SCALE );
2544                     pTabPage->SetBackground( aWallpaper );
2545                 }
2546                 else if ( bVoid || !xGraphic.is() )
2547                 {
2548                     Color aColor = pTabPage->GetControlBackground().GetColor();
2549                     if ( aColor == COL_AUTO )
2550                         aColor = pTabPage->GetSettings().GetStyleSettings().GetDialogColor();
2551 
2552                     Wallpaper aWallpaper( aColor );
2553                     pTabPage->SetBackground( aWallpaper );
2554                 }
2555             }
2556             break;
2557             case BASEPROPERTY_TITLE:
2558                 {
2559                     ::rtl::OUString sTitle;
2560                     if ( Value >>= sTitle )
2561                     {
2562                         pTabPage->SetText(sTitle);
2563                     }
2564                 }
2565                 break;
2566 
2567             default:
2568             {
2569                 VCLXContainer::setProperty( PropertyName, Value );
2570             }
2571         }
2572     }
2573 }
2574 
2575 //  ----------------------------------------------------
2576 //  class VCLXFixedHyperlink
2577 //  ----------------------------------------------------
2578 VCLXFixedHyperlink::VCLXFixedHyperlink() :
2579 
2580     maActionListeners( *this )
2581 
2582 {
2583 }
2584 
2585 VCLXFixedHyperlink::~VCLXFixedHyperlink()
2586 {
2587 }
2588 
2589 // ::com::sun::star::uno::XInterface
2590 ::com::sun::star::uno::Any VCLXFixedHyperlink::queryInterface( const ::com::sun::star::uno::Type & rType ) throw(::com::sun::star::uno::RuntimeException)
2591 {
2592     ::com::sun::star::uno::Any aRet = ::cppu::queryInterface( rType,
2593                                         SAL_STATIC_CAST( ::com::sun::star::awt::XFixedHyperlink*, this ) );
2594     return (aRet.hasValue() ? aRet : VCLXWindow::queryInterface( rType ));
2595 }
2596 
2597 void VCLXFixedHyperlink::dispose() throw(::com::sun::star::uno::RuntimeException)
2598 {
2599         ::vos::OGuard aGuard( GetMutex() );
2600 
2601         ::com::sun::star::lang::EventObject aObj;
2602         aObj.Source = (::cppu::OWeakObject*)this;
2603         maActionListeners.disposeAndClear( aObj );
2604         VCLXWindow::dispose();
2605 }
2606 
2607 // ::com::sun::star::lang::XTypeProvider
2608 IMPL_XTYPEPROVIDER_START( VCLXFixedHyperlink )
2609     getCppuType( ( ::com::sun::star::uno::Reference< ::com::sun::star::awt::XFixedHyperlink>* ) NULL ),
2610     VCLXWindow::getTypes()
2611 IMPL_XTYPEPROVIDER_END
2612 
2613 void VCLXFixedHyperlink::ProcessWindowEvent( const VclWindowEvent& rVclWindowEvent )
2614 {
2615     switch ( rVclWindowEvent.GetId() )
2616     {
2617         case VCLEVENT_BUTTON_CLICK:
2618         {
2619             if ( maActionListeners.getLength() )
2620             {
2621                 ::com::sun::star::awt::ActionEvent aEvent;
2622                 aEvent.Source = (::cppu::OWeakObject*)this;
2623                 maActionListeners.actionPerformed( aEvent );
2624             }
2625             else
2626             {
2627                 // open the URL
2628                 ::rtl::OUString sURL;
2629                 ::toolkit::FixedHyperlinkBase* pBase = (::toolkit::FixedHyperlinkBase*)GetWindow();
2630                 if ( pBase )
2631                     sURL = pBase->GetURL();
2632                 Reference< ::com::sun::star::system::XSystemShellExecute > xSystemShellExecute(
2633                     ::comphelper::getProcessServiceFactory()->createInstance(
2634                         ::rtl::OUString::createFromAscii( "com.sun.star.system.SystemShellExecute" )), uno::UNO_QUERY );
2635                 if ( sURL.getLength() > 0 && xSystemShellExecute.is() )
2636                 {
2637                     try
2638                     {
2639                         // start browser
2640                         xSystemShellExecute->execute(
2641                             sURL, ::rtl::OUString(), ::com::sun::star::system::SystemShellExecuteFlags::DEFAULTS );
2642                     }
2643                     catch( uno::Exception& )
2644                     {
2645                     }
2646                 }
2647             }
2648         }
2649 
2650         default:
2651             VCLXWindow::ProcessWindowEvent( rVclWindowEvent );
2652             break;
2653     }
2654 }
2655 
2656 ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleContext > VCLXFixedHyperlink::CreateAccessibleContext()
2657 {
2658     return getAccessibleFactory().createAccessibleContext( this );
2659 }
2660 
2661 void VCLXFixedHyperlink::setText( const ::rtl::OUString& Text ) throw(::com::sun::star::uno::RuntimeException)
2662 {
2663     ::vos::OGuard aGuard( GetMutex() );
2664 
2665     ::toolkit::FixedHyperlinkBase* pBase = (::toolkit::FixedHyperlinkBase*)GetWindow();
2666     if ( pBase )
2667         pBase->SetDescription( Text );
2668 }
2669 
2670 ::rtl::OUString VCLXFixedHyperlink::getText() throw(::com::sun::star::uno::RuntimeException)
2671 {
2672     ::vos::OGuard aGuard( GetMutex() );
2673 
2674     ::rtl::OUString aText;
2675     Window* pWindow = GetWindow();
2676     if ( pWindow )
2677         aText = pWindow->GetText();
2678     return aText;
2679 }
2680 
2681 void VCLXFixedHyperlink::setURL( const ::rtl::OUString& URL ) throw(::com::sun::star::uno::RuntimeException)
2682 {
2683     ::vos::OGuard aGuard( GetMutex() );
2684 
2685     ::toolkit::FixedHyperlinkBase* pBase = (::toolkit::FixedHyperlinkBase*)GetWindow();
2686     if ( pBase )
2687         pBase->SetURL( URL );
2688 }
2689 
2690 ::rtl::OUString VCLXFixedHyperlink::getURL(  ) throw(::com::sun::star::uno::RuntimeException)
2691 {
2692     ::vos::OGuard aGuard( GetMutex() );
2693 
2694     ::rtl::OUString aText;
2695     ::toolkit::FixedHyperlinkBase* pBase = (::toolkit::FixedHyperlinkBase*)GetWindow();
2696     if ( pBase )
2697         aText = pBase->GetURL();
2698     return aText;
2699 }
2700 
2701 void VCLXFixedHyperlink::setAlignment( short nAlign ) throw(::com::sun::star::uno::RuntimeException)
2702 {
2703     ::vos::OGuard aGuard( GetMutex() );
2704 
2705     Window* pWindow = GetWindow();
2706     if ( pWindow )
2707     {
2708         WinBits nNewBits = 0;
2709         if ( nAlign == ::com::sun::star::awt::TextAlign::LEFT )
2710             nNewBits = WB_LEFT;
2711         else if ( nAlign == ::com::sun::star::awt::TextAlign::CENTER )
2712             nNewBits = WB_CENTER;
2713         else
2714             nNewBits = WB_RIGHT;
2715 
2716         WinBits nStyle = pWindow->GetStyle();
2717         nStyle &= ~(WB_LEFT|WB_CENTER|WB_RIGHT);
2718         pWindow->SetStyle( nStyle | nNewBits );
2719     }
2720 }
2721 
2722 short VCLXFixedHyperlink::getAlignment() throw(::com::sun::star::uno::RuntimeException)
2723 {
2724     ::vos::OGuard aGuard( GetMutex() );
2725 
2726     short nAlign = 0;
2727     Window* pWindow = GetWindow();
2728     if ( pWindow )
2729     {
2730         WinBits nStyle = pWindow->GetStyle();
2731         if ( nStyle & WB_LEFT )
2732             nAlign = ::com::sun::star::awt::TextAlign::LEFT;
2733         else if ( nStyle & WB_CENTER )
2734             nAlign = ::com::sun::star::awt::TextAlign::CENTER;
2735         else
2736             nAlign = ::com::sun::star::awt::TextAlign::RIGHT;
2737     }
2738     return nAlign;
2739 }
2740 
2741 void VCLXFixedHyperlink::addActionListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XActionListener > & l  )throw(::com::sun::star::uno::RuntimeException)
2742 {
2743         ::vos::OGuard aGuard( GetMutex() );
2744         maActionListeners.addInterface( l );
2745 }
2746 
2747 void VCLXFixedHyperlink::removeActionListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XActionListener > & l ) throw(::com::sun::star::uno::RuntimeException)
2748 {
2749         ::vos::OGuard aGuard( GetMutex() );
2750         maActionListeners.removeInterface( l );
2751 }
2752 
2753 ::com::sun::star::awt::Size VCLXFixedHyperlink::getMinimumSize(  ) throw(::com::sun::star::uno::RuntimeException)
2754 {
2755     ::vos::OGuard aGuard( GetMutex() );
2756 
2757     Size aSz;
2758     FixedText* pFixedText = (FixedText*)GetWindow();
2759     if ( pFixedText )
2760         aSz = pFixedText->CalcMinimumSize();
2761     return AWTSize(aSz);
2762 }
2763 
2764 ::com::sun::star::awt::Size VCLXFixedHyperlink::getPreferredSize(  ) throw(::com::sun::star::uno::RuntimeException)
2765 {
2766     return getMinimumSize();
2767 }
2768 
2769 ::com::sun::star::awt::Size VCLXFixedHyperlink::calcAdjustedSize( const ::com::sun::star::awt::Size& rNewSize ) throw(::com::sun::star::uno::RuntimeException)
2770 {
2771     ::vos::OGuard aGuard( GetMutex() );
2772 
2773     ::com::sun::star::awt::Size aSz = rNewSize;
2774     ::com::sun::star::awt::Size aMinSz = getMinimumSize();
2775     if ( aSz.Height != aMinSz.Height )
2776         aSz.Height = aMinSz.Height;
2777 
2778     return aSz;
2779 }
2780 
2781 void VCLXFixedHyperlink::setProperty( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Any& Value) throw(::com::sun::star::uno::RuntimeException)
2782 {
2783     ::vos::OGuard aGuard( GetMutex() );
2784 
2785     ::toolkit::FixedHyperlinkBase* pBase = (::toolkit::FixedHyperlinkBase*)GetWindow();
2786     if ( pBase )
2787     {
2788         sal_uInt16 nPropType = GetPropertyId( PropertyName );
2789         switch ( nPropType )
2790         {
2791             case BASEPROPERTY_LABEL:
2792             {
2793                 ::rtl::OUString sNewLabel;
2794                 if ( Value >>= sNewLabel )
2795                     pBase->SetDescription( sNewLabel );
2796                 break;
2797             }
2798 
2799             case BASEPROPERTY_URL:
2800             {
2801                 ::rtl::OUString sNewURL;
2802                 if ( Value >>= sNewURL )
2803                     pBase->SetURL( sNewURL );
2804                 break;
2805             }
2806 
2807             default:
2808             {
2809                 VCLXWindow::setProperty( PropertyName, Value );
2810             }
2811         }
2812     }
2813 }
2814 
2815 ::com::sun::star::uno::Any VCLXFixedHyperlink::getProperty( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::uno::RuntimeException)
2816 {
2817     ::vos::OGuard aGuard( GetMutex() );
2818 
2819     ::com::sun::star::uno::Any aProp;
2820     ::toolkit::FixedHyperlinkBase* pBase = (::toolkit::FixedHyperlinkBase*)GetWindow();
2821     if ( pBase )
2822     {
2823         sal_uInt16 nPropType = GetPropertyId( PropertyName );
2824         switch ( nPropType )
2825         {
2826             case BASEPROPERTY_URL:
2827             {
2828                 aProp = makeAny( ::rtl::OUString( pBase->GetURL() ) );
2829                 break;
2830             }
2831 
2832             default:
2833             {
2834                 aProp <<= VCLXWindow::getProperty( PropertyName );
2835             }
2836         }
2837     }
2838     return aProp;
2839 }
2840 
2841 void VCLXFixedHyperlink::ImplGetPropertyIds( std::list< sal_uInt16 > &rIds )
2842 {
2843     PushPropertyIds( rIds,
2844                      BASEPROPERTY_ALIGN,
2845                      BASEPROPERTY_BACKGROUNDCOLOR,
2846                      BASEPROPERTY_BORDER,
2847                      BASEPROPERTY_BORDERCOLOR,
2848                      BASEPROPERTY_DEFAULTCONTROL,
2849                      BASEPROPERTY_ENABLED,
2850                      BASEPROPERTY_ENABLEVISIBLE,
2851                      BASEPROPERTY_FONTDESCRIPTOR,
2852                      BASEPROPERTY_HELPTEXT,
2853                      BASEPROPERTY_HELPURL,
2854                      BASEPROPERTY_LABEL,
2855                      BASEPROPERTY_MULTILINE,
2856                      BASEPROPERTY_NOLABEL,
2857                      BASEPROPERTY_PRINTABLE,
2858                      BASEPROPERTY_TABSTOP,
2859                      BASEPROPERTY_VERTICALALIGN,
2860                      BASEPROPERTY_URL,
2861                      BASEPROPERTY_WRITING_MODE,
2862                      BASEPROPERTY_CONTEXT_WRITING_MODE,
2863                      0);
2864     VCLXWindow::ImplGetPropertyIds( rIds );
2865 }
2866 
2867 //  ----------------------------------------------------
2868 //  class VCLXFixedText
2869 //  ----------------------------------------------------
2870 void VCLXFixedText::ImplGetPropertyIds( std::list< sal_uInt16 > &rIds )
2871 {
2872     PushPropertyIds( rIds,
2873                      BASEPROPERTY_ALIGN,
2874                      BASEPROPERTY_BACKGROUNDCOLOR,
2875                      BASEPROPERTY_BORDER,
2876                      BASEPROPERTY_BORDERCOLOR,
2877                      BASEPROPERTY_DEFAULTCONTROL,
2878                      BASEPROPERTY_ENABLED,
2879                      BASEPROPERTY_ENABLEVISIBLE,
2880                      BASEPROPERTY_FONTDESCRIPTOR,
2881                      BASEPROPERTY_HELPTEXT,
2882                      BASEPROPERTY_HELPURL,
2883                      BASEPROPERTY_LABEL,
2884                      BASEPROPERTY_MULTILINE,
2885                      BASEPROPERTY_NOLABEL,
2886                      BASEPROPERTY_PRINTABLE,
2887                      BASEPROPERTY_TABSTOP,
2888                      BASEPROPERTY_VERTICALALIGN,
2889                      BASEPROPERTY_WRITING_MODE,
2890                      BASEPROPERTY_CONTEXT_WRITING_MODE,
2891                      BASEPROPERTY_REFERENCE_DEVICE,
2892                      0);
2893     VCLXWindow::ImplGetPropertyIds( rIds );
2894 }
2895 
2896 VCLXFixedText::VCLXFixedText()
2897 {
2898 }
2899 
2900 VCLXFixedText::~VCLXFixedText()
2901 {
2902 }
2903 
2904 // ::com::sun::star::uno::XInterface
2905 ::com::sun::star::uno::Any VCLXFixedText::queryInterface( const ::com::sun::star::uno::Type & rType ) throw(::com::sun::star::uno::RuntimeException)
2906 {
2907     ::com::sun::star::uno::Any aRet = ::cppu::queryInterface( rType,
2908                                         SAL_STATIC_CAST( ::com::sun::star::awt::XFixedText*, this ) );
2909     return (aRet.hasValue() ? aRet : VCLXWindow::queryInterface( rType ));
2910 }
2911 
2912 // ::com::sun::star::lang::XTypeProvider
2913 IMPL_XTYPEPROVIDER_START( VCLXFixedText )
2914     getCppuType( ( ::com::sun::star::uno::Reference< ::com::sun::star::awt::XFixedText>* ) NULL ),
2915     VCLXWindow::getTypes()
2916 IMPL_XTYPEPROVIDER_END
2917 
2918 ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleContext > VCLXFixedText::CreateAccessibleContext()
2919 {
2920     return getAccessibleFactory().createAccessibleContext( this );
2921 }
2922 
2923 void VCLXFixedText::setText( const ::rtl::OUString& Text ) throw(::com::sun::star::uno::RuntimeException)
2924 {
2925     ::vos::OGuard aGuard( GetMutex() );
2926 
2927     Window* pWindow = GetWindow();
2928     if ( pWindow )
2929         pWindow->SetText( Text );
2930 }
2931 
2932 ::rtl::OUString VCLXFixedText::getText() throw(::com::sun::star::uno::RuntimeException)
2933 {
2934     ::vos::OGuard aGuard( GetMutex() );
2935 
2936     ::rtl::OUString aText;
2937     Window* pWindow = GetWindow();
2938     if ( pWindow )
2939         aText = pWindow->GetText();
2940     return aText;
2941 }
2942 
2943 void VCLXFixedText::setAlignment( short nAlign ) throw(::com::sun::star::uno::RuntimeException)
2944 {
2945     ::vos::OGuard aGuard( GetMutex() );
2946 
2947     Window* pWindow = GetWindow();
2948     if ( pWindow )
2949     {
2950         WinBits nNewBits = 0;
2951         if ( nAlign == ::com::sun::star::awt::TextAlign::LEFT )
2952             nNewBits = WB_LEFT;
2953         else if ( nAlign == ::com::sun::star::awt::TextAlign::CENTER )
2954             nNewBits = WB_CENTER;
2955         else
2956             nNewBits = WB_RIGHT;
2957 
2958         WinBits nStyle = pWindow->GetStyle();
2959         nStyle &= ~(WB_LEFT|WB_CENTER|WB_RIGHT);
2960         pWindow->SetStyle( nStyle | nNewBits );
2961     }
2962 }
2963 
2964 short VCLXFixedText::getAlignment() throw(::com::sun::star::uno::RuntimeException)
2965 {
2966     ::vos::OGuard aGuard( GetMutex() );
2967 
2968     short nAlign = 0;
2969     Window* pWindow = GetWindow();
2970     if ( pWindow )
2971     {
2972         WinBits nStyle = pWindow->GetStyle();
2973         if ( nStyle & WB_LEFT )
2974             nAlign = ::com::sun::star::awt::TextAlign::LEFT;
2975         else if ( nStyle & WB_CENTER )
2976             nAlign = ::com::sun::star::awt::TextAlign::CENTER;
2977         else
2978             nAlign = ::com::sun::star::awt::TextAlign::RIGHT;
2979     }
2980     return nAlign;
2981 }
2982 
2983 ::com::sun::star::awt::Size VCLXFixedText::getMinimumSize(  ) throw(::com::sun::star::uno::RuntimeException)
2984 {
2985     ::vos::OGuard aGuard( GetMutex() );
2986 
2987     Size aSz;
2988     FixedText* pFixedText = (FixedText*)GetWindow();
2989     if ( pFixedText )
2990         aSz = pFixedText->CalcMinimumSize();
2991     return AWTSize(aSz);
2992 }
2993 
2994 ::com::sun::star::awt::Size VCLXFixedText::getPreferredSize(  ) throw(::com::sun::star::uno::RuntimeException)
2995 {
2996     return getMinimumSize();
2997 }
2998 
2999 ::com::sun::star::awt::Size VCLXFixedText::calcAdjustedSize( const ::com::sun::star::awt::Size& rMaxSize ) throw(::com::sun::star::uno::RuntimeException)
3000 {
3001     ::vos::OGuard aGuard( GetMutex() );
3002 
3003     Size aAdjustedSize( VCLUnoHelper::ConvertToVCLSize( rMaxSize ) );
3004     FixedText* pFixedText = (FixedText*)GetWindow();
3005     if ( pFixedText )
3006         aAdjustedSize = pFixedText->CalcMinimumSize( rMaxSize.Width );
3007     return VCLUnoHelper::ConvertToAWTSize( aAdjustedSize );
3008 }
3009 
3010 //  ----------------------------------------------------
3011 //  class VCLXScrollBar
3012 //  ----------------------------------------------------
3013 void VCLXScrollBar::ImplGetPropertyIds( std::list< sal_uInt16 > &rIds )
3014 {
3015     PushPropertyIds( rIds,
3016                      BASEPROPERTY_BACKGROUNDCOLOR,
3017                      BASEPROPERTY_BLOCKINCREMENT,
3018                      BASEPROPERTY_BORDER,
3019                      BASEPROPERTY_BORDERCOLOR,
3020                      BASEPROPERTY_DEFAULTCONTROL,
3021                      BASEPROPERTY_ENABLED,
3022                      BASEPROPERTY_ENABLEVISIBLE,
3023                      BASEPROPERTY_HELPTEXT,
3024                      BASEPROPERTY_HELPURL,
3025                      BASEPROPERTY_LINEINCREMENT,
3026                      BASEPROPERTY_LIVE_SCROLL,
3027                      BASEPROPERTY_ORIENTATION,
3028                      BASEPROPERTY_PRINTABLE,
3029                      BASEPROPERTY_REPEAT_DELAY,
3030                      BASEPROPERTY_SCROLLVALUE,
3031                      BASEPROPERTY_SCROLLVALUE_MAX,
3032                      BASEPROPERTY_SCROLLVALUE_MIN,
3033                      BASEPROPERTY_SYMBOL_COLOR,
3034                      BASEPROPERTY_TABSTOP,
3035                      BASEPROPERTY_VISIBLESIZE,
3036                      BASEPROPERTY_WRITING_MODE,
3037                      BASEPROPERTY_CONTEXT_WRITING_MODE,
3038                      0);
3039     VCLXWindow::ImplGetPropertyIds( rIds );
3040 }
3041 
3042 VCLXScrollBar::VCLXScrollBar() : maAdjustmentListeners( *this )
3043 {
3044 }
3045 
3046 // ::com::sun::star::uno::XInterface
3047 ::com::sun::star::uno::Any VCLXScrollBar::queryInterface( const ::com::sun::star::uno::Type & rType ) throw(::com::sun::star::uno::RuntimeException)
3048 {
3049     ::com::sun::star::uno::Any aRet = ::cppu::queryInterface( rType,
3050                                         SAL_STATIC_CAST( ::com::sun::star::awt::XScrollBar*, this ) );
3051     return (aRet.hasValue() ? aRet : VCLXWindow::queryInterface( rType ));
3052 }
3053 
3054 // ::com::sun::star::lang::XTypeProvider
3055 IMPL_XTYPEPROVIDER_START( VCLXScrollBar )
3056     getCppuType( ( ::com::sun::star::uno::Reference< ::com::sun::star::awt::XScrollBar>* ) NULL ),
3057     VCLXWindow::getTypes()
3058 IMPL_XTYPEPROVIDER_END
3059 
3060 ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleContext > VCLXScrollBar::CreateAccessibleContext()
3061 {
3062     return getAccessibleFactory().createAccessibleContext( this );
3063 }
3064 
3065 // ::com::sun::star::lang::XComponent
3066 void VCLXScrollBar::dispose() throw(::com::sun::star::uno::RuntimeException)
3067 {
3068     ::vos::OGuard aGuard( GetMutex() );
3069 
3070     ::com::sun::star::lang::EventObject aObj;
3071     aObj.Source = (::cppu::OWeakObject*)this;
3072     maAdjustmentListeners.disposeAndClear( aObj );
3073     VCLXWindow::dispose();
3074 }
3075 
3076 // ::com::sun::star::awt::XScrollbar
3077 void VCLXScrollBar::addAdjustmentListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XAdjustmentListener > & l ) throw(::com::sun::star::uno::RuntimeException)
3078 {
3079     ::vos::OGuard aGuard( GetMutex() );
3080     maAdjustmentListeners.addInterface( l );
3081 }
3082 
3083 void VCLXScrollBar::removeAdjustmentListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XAdjustmentListener > & l ) throw(::com::sun::star::uno::RuntimeException)
3084 {
3085     ::vos::OGuard aGuard( GetMutex() );
3086     maAdjustmentListeners.removeInterface( l );
3087 }
3088 
3089 void VCLXScrollBar::setValue( sal_Int32 n ) throw(::com::sun::star::uno::RuntimeException)
3090 {
3091     ::vos::OGuard aGuard( GetMutex() );
3092 
3093     ScrollBar* pScrollBar = (ScrollBar*) GetWindow();
3094     if ( pScrollBar )
3095         pScrollBar->DoScroll( n );
3096 }
3097 
3098 void VCLXScrollBar::setValues( sal_Int32 nValue, sal_Int32 nVisible, sal_Int32 nMax ) throw(::com::sun::star::uno::RuntimeException)
3099 {
3100     ::vos::OGuard aGuard( GetMutex() );
3101 
3102     ScrollBar* pScrollBar = (ScrollBar*) GetWindow();
3103     if ( pScrollBar )
3104     {
3105         pScrollBar->SetVisibleSize( nVisible );
3106         pScrollBar->SetRangeMax( nMax );
3107         pScrollBar->DoScroll( nValue );
3108     }
3109 }
3110 
3111 sal_Int32 VCLXScrollBar::getValue() throw(::com::sun::star::uno::RuntimeException)
3112 {
3113     ::vos::OGuard aGuard( GetMutex() );
3114 
3115     ScrollBar* pScrollBar = (ScrollBar*) GetWindow();
3116     return pScrollBar ? pScrollBar->GetThumbPos() : 0;
3117 }
3118 
3119 void VCLXScrollBar::setMaximum( sal_Int32 n ) throw(::com::sun::star::uno::RuntimeException)
3120 {
3121     ::vos::OGuard aGuard( GetMutex() );
3122 
3123     ScrollBar* pScrollBar = (ScrollBar*) GetWindow();
3124     if ( pScrollBar )
3125         pScrollBar->SetRangeMax( n );
3126 }
3127 
3128 sal_Int32 VCLXScrollBar::getMaximum() throw(::com::sun::star::uno::RuntimeException)
3129 {
3130     ::vos::OGuard aGuard( GetMutex() );
3131 
3132     ScrollBar* pScrollBar = (ScrollBar*) GetWindow();
3133     return pScrollBar ? pScrollBar->GetRangeMax() : 0;
3134 }
3135 
3136 void VCLXScrollBar::setMinimum( sal_Int32 n ) throw(::com::sun::star::uno::RuntimeException)
3137 {
3138     ::vos::OGuard aGuard( GetMutex() );
3139 
3140     ScrollBar* pScrollBar = static_cast< ScrollBar* >( GetWindow() );
3141     if ( pScrollBar )
3142         pScrollBar->SetRangeMin( n );
3143 }
3144 
3145 sal_Int32 VCLXScrollBar::getMinimum() throw(::com::sun::star::uno::RuntimeException)
3146 {
3147     ::vos::OGuard aGuard( GetMutex() );
3148 
3149     ScrollBar* pScrollBar = static_cast< ScrollBar* >( GetWindow() );
3150     return pScrollBar ? pScrollBar->GetRangeMin() : 0;
3151 }
3152 
3153 void VCLXScrollBar::setLineIncrement( sal_Int32 n ) throw(::com::sun::star::uno::RuntimeException)
3154 {
3155     ::vos::OGuard aGuard( GetMutex() );
3156 
3157     ScrollBar* pScrollBar = (ScrollBar*) GetWindow();
3158     if ( pScrollBar )
3159         pScrollBar->SetLineSize( n );
3160 }
3161 
3162 sal_Int32 VCLXScrollBar::getLineIncrement() throw(::com::sun::star::uno::RuntimeException)
3163 {
3164     ::vos::OGuard aGuard( GetMutex() );
3165 
3166     ScrollBar* pScrollBar = (ScrollBar*) GetWindow();
3167     return pScrollBar ? pScrollBar->GetLineSize() : 0;
3168 }
3169 
3170 void VCLXScrollBar::setBlockIncrement( sal_Int32 n ) throw(::com::sun::star::uno::RuntimeException)
3171 {
3172     ::vos::OGuard aGuard( GetMutex() );
3173 
3174     ScrollBar* pScrollBar = (ScrollBar*) GetWindow();
3175     if ( pScrollBar )
3176         pScrollBar->SetPageSize( n );
3177 }
3178 
3179 sal_Int32 VCLXScrollBar::getBlockIncrement() throw(::com::sun::star::uno::RuntimeException)
3180 {
3181     ::vos::OGuard aGuard( GetMutex() );
3182 
3183     ScrollBar* pScrollBar = (ScrollBar*) GetWindow();
3184     return pScrollBar ? pScrollBar->GetPageSize() : 0;
3185 }
3186 
3187 void VCLXScrollBar::setVisibleSize( sal_Int32 n ) throw(::com::sun::star::uno::RuntimeException)
3188 {
3189     ::vos::OGuard aGuard( GetMutex() );
3190 
3191     ScrollBar* pScrollBar = (ScrollBar*) GetWindow();
3192     if ( pScrollBar )
3193         pScrollBar->SetVisibleSize( n );
3194 }
3195 
3196 sal_Int32 VCLXScrollBar::getVisibleSize() throw(::com::sun::star::uno::RuntimeException)
3197 {
3198     ::vos::OGuard aGuard( GetMutex() );
3199 
3200     ScrollBar* pScrollBar = (ScrollBar*) GetWindow();
3201     return pScrollBar ? pScrollBar->GetVisibleSize() : 0;
3202 }
3203 
3204 void VCLXScrollBar::setOrientation( sal_Int32 n ) throw(::com::sun::star::uno::RuntimeException)
3205 {
3206     ::vos::OGuard aGuard( GetMutex() );
3207 
3208     Window* pWindow = GetWindow();
3209     if ( pWindow )
3210     {
3211         WinBits nStyle = pWindow->GetStyle();
3212         nStyle &= ~(WB_HORZ|WB_VERT);
3213         if ( n == ::com::sun::star::awt::ScrollBarOrientation::HORIZONTAL )
3214             nStyle |= WB_HORZ;
3215         else
3216             nStyle |= WB_VERT;
3217 
3218         pWindow->SetStyle( nStyle );
3219         pWindow->Resize();
3220     }
3221 }
3222 
3223 sal_Int32 VCLXScrollBar::getOrientation() throw(::com::sun::star::uno::RuntimeException)
3224 {
3225     ::vos::OGuard aGuard( GetMutex() );
3226 
3227     sal_Int32 n = 0;
3228     Window* pWindow = GetWindow();
3229     if ( pWindow )
3230     {
3231         WinBits nStyle = pWindow->GetStyle();
3232         if ( nStyle & WB_HORZ )
3233             n = ::com::sun::star::awt::ScrollBarOrientation::HORIZONTAL;
3234         else
3235             n = ::com::sun::star::awt::ScrollBarOrientation::VERTICAL;
3236     }
3237     return n;
3238 
3239 }
3240 
3241 // ::com::sun::star::awt::VclWindowPeer
3242 void VCLXScrollBar::setProperty( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Any& Value) throw(::com::sun::star::uno::RuntimeException)
3243 {
3244     ::vos::OGuard aGuard( GetMutex() );
3245 
3246     ScrollBar* pScrollBar = (ScrollBar*)GetWindow();
3247     if ( pScrollBar )
3248     {
3249         sal_Bool bVoid = Value.getValueType().getTypeClass() == ::com::sun::star::uno::TypeClass_VOID;
3250 
3251         sal_uInt16 nPropType = GetPropertyId( PropertyName );
3252         switch ( nPropType )
3253         {
3254             case BASEPROPERTY_LIVE_SCROLL:
3255             {
3256                 sal_Bool bDo = sal_False;
3257                 if ( !bVoid )
3258                 {
3259                     OSL_VERIFY( Value >>= bDo );
3260                 }
3261                 AllSettings aSettings( pScrollBar->GetSettings() );
3262                 StyleSettings aStyle( aSettings.GetStyleSettings() );
3263                 sal_uLong nDragOptions = aStyle.GetDragFullOptions();
3264                 if ( bDo )
3265                     nDragOptions |= DRAGFULL_OPTION_SCROLL;
3266                 else
3267                     nDragOptions &= ~DRAGFULL_OPTION_SCROLL;
3268                 aStyle.SetDragFullOptions( nDragOptions );
3269                 aSettings.SetStyleSettings( aStyle );
3270                 pScrollBar->SetSettings( aSettings );
3271             }
3272             break;
3273 
3274             case BASEPROPERTY_SCROLLVALUE:
3275             {
3276                 if ( !bVoid )
3277                 {
3278                     sal_Int32 n = 0;
3279                     if ( Value >>= n )
3280                         setValue( n );
3281                 }
3282             }
3283             break;
3284             case BASEPROPERTY_SCROLLVALUE_MAX:
3285             case BASEPROPERTY_SCROLLVALUE_MIN:
3286             {
3287                 if ( !bVoid )
3288                 {
3289                     sal_Int32 n = 0;
3290                     if ( Value >>= n )
3291                     {
3292                         if ( nPropType == BASEPROPERTY_SCROLLVALUE_MAX )
3293                             setMaximum( n );
3294                         else
3295                             setMinimum( n );
3296                     }
3297                 }
3298             }
3299             break;
3300             case BASEPROPERTY_LINEINCREMENT:
3301             {
3302                 if ( !bVoid )
3303                 {
3304                     sal_Int32 n = 0;
3305                     if ( Value >>= n )
3306                         setLineIncrement( n );
3307                 }
3308             }
3309             break;
3310             case BASEPROPERTY_BLOCKINCREMENT:
3311             {
3312                 if ( !bVoid )
3313                 {
3314                     sal_Int32 n = 0;
3315                     if ( Value >>= n )
3316                         setBlockIncrement( n );
3317                 }
3318             }
3319             break;
3320             case BASEPROPERTY_VISIBLESIZE:
3321             {
3322                 if ( !bVoid )
3323                 {
3324                     sal_Int32 n = 0;
3325                     if ( Value >>= n )
3326                         setVisibleSize( n );
3327                 }
3328             }
3329             break;
3330             case BASEPROPERTY_ORIENTATION:
3331             {
3332                 if ( !bVoid )
3333                 {
3334                     sal_Int32 n = 0;
3335                     if ( Value >>= n )
3336                         setOrientation( n );
3337                 }
3338             }
3339             break;
3340 
3341             case BASEPROPERTY_BACKGROUNDCOLOR:
3342             {
3343                 // the default implementation of the base class doesn't work here, since our
3344                 // interpretation for this property is slightly different
3345                 ::toolkit::setButtonLikeFaceColor( pScrollBar, Value);
3346             }
3347             break;
3348 
3349             default:
3350             {
3351                 VCLXWindow::setProperty( PropertyName, Value );
3352             }
3353         }
3354     }
3355 }
3356 
3357 ::com::sun::star::uno::Any VCLXScrollBar::getProperty( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::uno::RuntimeException)
3358 {
3359     ::vos::OGuard aGuard( GetMutex() );
3360 
3361     ::com::sun::star::uno::Any aProp;
3362     ScrollBar* pScrollBar = (ScrollBar*)GetWindow();
3363     if ( pScrollBar )
3364     {
3365         sal_uInt16 nPropType = GetPropertyId( PropertyName );
3366 
3367         switch ( nPropType )
3368         {
3369             case BASEPROPERTY_LIVE_SCROLL:
3370             {
3371                 aProp <<= (sal_Bool)( 0 != ( pScrollBar->GetSettings().GetStyleSettings().GetDragFullOptions() & DRAGFULL_OPTION_SCROLL ) );
3372             }
3373             break;
3374             case BASEPROPERTY_SCROLLVALUE:
3375             {
3376                 aProp <<= (sal_Int32) getValue();
3377             }
3378             break;
3379             case BASEPROPERTY_SCROLLVALUE_MAX:
3380             {
3381                 aProp <<= (sal_Int32) getMaximum();
3382             }
3383             break;
3384             case BASEPROPERTY_SCROLLVALUE_MIN:
3385             {
3386                 aProp <<= (sal_Int32) getMinimum();
3387             }
3388             break;
3389             case BASEPROPERTY_LINEINCREMENT:
3390             {
3391                 aProp <<= (sal_Int32) getLineIncrement();
3392             }
3393             break;
3394             case BASEPROPERTY_BLOCKINCREMENT:
3395             {
3396                 aProp <<= (sal_Int32) getBlockIncrement();
3397             }
3398             break;
3399             case BASEPROPERTY_VISIBLESIZE:
3400             {
3401                 aProp <<= (sal_Int32) getVisibleSize();
3402             }
3403             break;
3404             case BASEPROPERTY_ORIENTATION:
3405             {
3406                 aProp <<= (sal_Int32) getOrientation();
3407             }
3408             break;
3409             case BASEPROPERTY_BACKGROUNDCOLOR:
3410             {
3411                 // the default implementation of the base class doesn't work here, since our
3412                 // interpretation for this property is slightly different
3413                 aProp = ::toolkit::getButtonLikeFaceColor( pScrollBar );
3414             }
3415             break;
3416 
3417             default:
3418             {
3419                 aProp <<= VCLXWindow::getProperty( PropertyName );
3420             }
3421         }
3422     }
3423     return aProp;
3424 }
3425 
3426 void VCLXScrollBar::ProcessWindowEvent( const VclWindowEvent& rVclWindowEvent )
3427 {
3428     switch ( rVclWindowEvent.GetId() )
3429     {
3430         case VCLEVENT_SCROLLBAR_SCROLL:
3431         {
3432             ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindow > xKeepAlive( this );
3433                 // since we call listeners below, there is a potential that we will be destroyed
3434                 // in during the listener call. To prevent the resulting crashs, we keep us
3435                 // alive as long as we're here
3436                 // #20178# - 2003-10-01 - fs@openoffice.org
3437 
3438             if ( maAdjustmentListeners.getLength() )
3439             {
3440                 ScrollBar* pScrollBar = (ScrollBar*)GetWindow();
3441 
3442                 if( pScrollBar )
3443                 {
3444                     ::com::sun::star::awt::AdjustmentEvent aEvent;
3445                     aEvent.Source = (::cppu::OWeakObject*)this;
3446                     aEvent.Value = pScrollBar->GetThumbPos();
3447 
3448                     // set adjustment type
3449                     ScrollType aType = pScrollBar->GetType();
3450                     if ( aType == SCROLL_LINEUP || aType == SCROLL_LINEDOWN )
3451                     {
3452                         aEvent.Type = ::com::sun::star::awt::AdjustmentType_ADJUST_LINE;
3453                     }
3454                     else if ( aType == SCROLL_PAGEUP || aType == SCROLL_PAGEDOWN )
3455                     {
3456                         aEvent.Type = ::com::sun::star::awt::AdjustmentType_ADJUST_PAGE;
3457                     }
3458                     else if ( aType == SCROLL_DRAG )
3459                     {
3460                         aEvent.Type = ::com::sun::star::awt::AdjustmentType_ADJUST_ABS;
3461                     }
3462 
3463                     maAdjustmentListeners.adjustmentValueChanged( aEvent );
3464                 }
3465             }
3466         }
3467         break;
3468 
3469         default:
3470             VCLXWindow::ProcessWindowEvent( rVclWindowEvent );
3471             break;
3472     }
3473 }
3474 
3475 ::com::sun::star::awt::Size SAL_CALL VCLXScrollBar::implGetMinimumSize( Window* p ) throw(::com::sun::star::uno::RuntimeException)
3476 {
3477     long n = p->GetSettings().GetStyleSettings().GetScrollBarSize();
3478     return ::com::sun::star::awt::Size( n, n );
3479 }
3480 
3481 ::com::sun::star::awt::Size SAL_CALL VCLXScrollBar::getMinimumSize() throw(::com::sun::star::uno::RuntimeException)
3482 {
3483     ::vos::OGuard aGuard( GetMutex() );
3484     return implGetMinimumSize( GetWindow() );
3485 }
3486 
3487 
3488 //  ----------------------------------------------------
3489 //  class VCLXEdit
3490 //  ----------------------------------------------------
3491 
3492 void VCLXEdit::ImplGetPropertyIds( std::list< sal_uInt16 > &rIds )
3493 {
3494     PushPropertyIds( rIds,
3495                      BASEPROPERTY_ALIGN,
3496                      BASEPROPERTY_BACKGROUNDCOLOR,
3497                      BASEPROPERTY_BORDER,
3498                      BASEPROPERTY_BORDERCOLOR,
3499                      BASEPROPERTY_DEFAULTCONTROL,
3500                      BASEPROPERTY_ECHOCHAR,
3501                      BASEPROPERTY_ENABLED,
3502                      BASEPROPERTY_ENABLEVISIBLE,
3503                      BASEPROPERTY_FONTDESCRIPTOR,
3504                      BASEPROPERTY_HARDLINEBREAKS,
3505                      BASEPROPERTY_HELPTEXT,
3506                      BASEPROPERTY_HELPURL,
3507                      BASEPROPERTY_HSCROLL,
3508                      BASEPROPERTY_LINE_END_FORMAT,
3509                      BASEPROPERTY_MAXTEXTLEN,
3510                      BASEPROPERTY_MULTILINE,
3511                      BASEPROPERTY_PRINTABLE,
3512                      BASEPROPERTY_READONLY,
3513                      BASEPROPERTY_TABSTOP,
3514                      BASEPROPERTY_TEXT,
3515                      BASEPROPERTY_VSCROLL,
3516                      BASEPROPERTY_HIDEINACTIVESELECTION,
3517                      BASEPROPERTY_PAINTTRANSPARENT,
3518                      BASEPROPERTY_AUTOHSCROLL,
3519                      BASEPROPERTY_AUTOVSCROLL,
3520                      BASEPROPERTY_VERTICALALIGN,
3521                      BASEPROPERTY_WRITING_MODE,
3522                      BASEPROPERTY_CONTEXT_WRITING_MODE,
3523                      0);
3524     VCLXWindow::ImplGetPropertyIds( rIds );
3525 }
3526 
3527 VCLXEdit::VCLXEdit() : maTextListeners( *this )
3528 {
3529 }
3530 
3531 // ::com::sun::star::uno::XInterface
3532 ::com::sun::star::uno::Any VCLXEdit::queryInterface( const ::com::sun::star::uno::Type & rType ) throw(::com::sun::star::uno::RuntimeException)
3533 {
3534     ::com::sun::star::uno::Any aRet = ::cppu::queryInterface( rType,
3535                                         SAL_STATIC_CAST( ::com::sun::star::awt::XTextComponent*, this ),
3536                                         SAL_STATIC_CAST( ::com::sun::star::awt::XTextEditField*, this ),
3537                                         SAL_STATIC_CAST( ::com::sun::star::awt::XTextLayoutConstrains*, this ) );
3538     return (aRet.hasValue() ? aRet : VCLXWindow::queryInterface( rType ));
3539 }
3540 
3541 // ::com::sun::star::lang::XTypeProvider
3542 IMPL_XTYPEPROVIDER_START( VCLXEdit )
3543     getCppuType( ( ::com::sun::star::uno::Reference< ::com::sun::star::awt::XTextComponent>* ) NULL ),
3544     getCppuType( ( ::com::sun::star::uno::Reference< ::com::sun::star::awt::XTextEditField>* ) NULL ),
3545     getCppuType( ( ::com::sun::star::uno::Reference< ::com::sun::star::awt::XTextLayoutConstrains>* ) NULL ),
3546     VCLXWindow::getTypes()
3547 IMPL_XTYPEPROVIDER_END
3548 
3549 ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleContext > VCLXEdit::CreateAccessibleContext()
3550 {
3551     return getAccessibleFactory().createAccessibleContext( this );
3552 }
3553 
3554 void VCLXEdit::dispose() throw(::com::sun::star::uno::RuntimeException)
3555 {
3556     ::vos::OGuard aGuard( GetMutex() );
3557 
3558     ::com::sun::star::lang::EventObject aObj;
3559     aObj.Source = (::cppu::OWeakObject*)this;
3560     maTextListeners.disposeAndClear( aObj );
3561     VCLXWindow::dispose();
3562 }
3563 
3564 void VCLXEdit::addTextListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XTextListener > & l ) throw(::com::sun::star::uno::RuntimeException)
3565 {
3566     ::vos::OGuard aGuard( GetMutex() );
3567     GetTextListeners().addInterface( l );
3568 }
3569 
3570 void VCLXEdit::removeTextListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XTextListener > & l ) throw(::com::sun::star::uno::RuntimeException)
3571 {
3572     ::vos::OGuard aGuard( GetMutex() );
3573     GetTextListeners().removeInterface( l );
3574 }
3575 
3576 void VCLXEdit::setText( const ::rtl::OUString& aText ) throw(::com::sun::star::uno::RuntimeException)
3577 {
3578     ::vos::OGuard aGuard( GetMutex() );
3579 
3580     Edit* pEdit = (Edit*)GetWindow();
3581     if ( pEdit )
3582     {
3583         pEdit->SetText( aText );
3584 
3585         // #107218# Call same listeners like VCL would do after user interaction
3586         SetSynthesizingVCLEvent( sal_True );
3587         pEdit->SetModifyFlag();
3588         pEdit->Modify();
3589         SetSynthesizingVCLEvent( sal_False );
3590     }
3591 }
3592 
3593 void VCLXEdit::insertText( const ::com::sun::star::awt::Selection& rSel, const ::rtl::OUString& aText ) throw(::com::sun::star::uno::RuntimeException)
3594 {
3595     ::vos::OGuard aGuard( GetMutex() );
3596 
3597     Edit* pEdit = (Edit*)GetWindow();
3598     if ( pEdit )
3599     {
3600         pEdit->SetSelection( Selection( rSel.Min, rSel.Max ) );
3601         pEdit->ReplaceSelected( aText );
3602 
3603         // #107218# Call same listeners like VCL would do after user interaction
3604         SetSynthesizingVCLEvent( sal_True );
3605         pEdit->SetModifyFlag();
3606         pEdit->Modify();
3607         SetSynthesizingVCLEvent( sal_False );
3608     }
3609 }
3610 
3611 ::rtl::OUString VCLXEdit::getText() throw(::com::sun::star::uno::RuntimeException)
3612 {
3613     ::vos::OGuard aGuard( GetMutex() );
3614 
3615     ::rtl::OUString aText;
3616     Window* pWindow = GetWindow();
3617     if ( pWindow )
3618         aText = pWindow->GetText();
3619     return aText;
3620 }
3621 
3622 ::rtl::OUString VCLXEdit::getSelectedText() throw(::com::sun::star::uno::RuntimeException)
3623 {
3624     ::vos::OGuard aGuard( GetMutex() );
3625 
3626     ::rtl::OUString aText;
3627     Edit* pEdit = (Edit*) GetWindow();
3628     if ( pEdit)
3629         aText = pEdit->GetSelected();
3630     return aText;
3631 
3632 }
3633 
3634 void VCLXEdit::setSelection( const ::com::sun::star::awt::Selection& aSelection ) throw(::com::sun::star::uno::RuntimeException)
3635 {
3636     ::vos::OGuard aGuard( GetMutex() );
3637 
3638     Edit* pEdit = (Edit*) GetWindow();
3639     if ( pEdit )
3640         pEdit->SetSelection( Selection( aSelection.Min, aSelection.Max ) );
3641 }
3642 
3643 ::com::sun::star::awt::Selection VCLXEdit::getSelection() throw(::com::sun::star::uno::RuntimeException)
3644 {
3645     ::vos::OGuard aGuard( GetMutex() );
3646 
3647     Selection aSel;
3648     Edit* pEdit = (Edit*) GetWindow();
3649     if ( pEdit )
3650         aSel = pEdit->GetSelection();
3651     return ::com::sun::star::awt::Selection( aSel.Min(), aSel.Max() );
3652 }
3653 
3654 sal_Bool VCLXEdit::isEditable() throw(::com::sun::star::uno::RuntimeException)
3655 {
3656     ::vos::OGuard aGuard( GetMutex() );
3657 
3658     Edit* pEdit = (Edit*) GetWindow();
3659     return ( pEdit && !pEdit->IsReadOnly() && pEdit->IsEnabled() ) ? sal_True : sal_False;
3660 }
3661 
3662 void VCLXEdit::setEditable( sal_Bool bEditable ) throw(::com::sun::star::uno::RuntimeException)
3663 {
3664     ::vos::OGuard aGuard( GetMutex() );
3665 
3666     Edit* pEdit = (Edit*) GetWindow();
3667     if ( pEdit )
3668         pEdit->SetReadOnly( !bEditable );
3669 }
3670 
3671 
3672 void VCLXEdit::setMaxTextLen( sal_Int16 nLen ) throw(::com::sun::star::uno::RuntimeException)
3673 {
3674     ::vos::OGuard aGuard( GetMutex() );
3675 
3676     Edit* pEdit = (Edit*) GetWindow();
3677     if ( pEdit )
3678         pEdit->SetMaxTextLen( nLen );
3679 }
3680 
3681 sal_Int16 VCLXEdit::getMaxTextLen() throw(::com::sun::star::uno::RuntimeException)
3682 {
3683     ::vos::OGuard aGuard( GetMutex() );
3684 
3685     Edit* pEdit = (Edit*) GetWindow();
3686     return pEdit ? pEdit->GetMaxTextLen() : 0;
3687 }
3688 
3689 void VCLXEdit::setEchoChar( sal_Unicode cEcho ) throw(::com::sun::star::uno::RuntimeException)
3690 {
3691     ::vos::OGuard aGuard( GetMutex() );
3692 
3693     Edit* pEdit = (Edit*) GetWindow();
3694     if ( pEdit )
3695         pEdit->SetEchoChar( cEcho );
3696 }
3697 
3698 void VCLXEdit::setProperty( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Any& Value) throw(::com::sun::star::uno::RuntimeException)
3699 {
3700     ::vos::OGuard aGuard( GetMutex() );
3701 
3702     Edit* pEdit = (Edit*)GetWindow();
3703     if ( pEdit )
3704     {
3705         sal_uInt16 nPropType = GetPropertyId( PropertyName );
3706         switch ( nPropType )
3707         {
3708             case BASEPROPERTY_HIDEINACTIVESELECTION:
3709                 ::toolkit::adjustBooleanWindowStyle( Value, pEdit, WB_NOHIDESELECTION, sal_True );
3710                 if ( pEdit->GetSubEdit() )
3711                     ::toolkit::adjustBooleanWindowStyle( Value, pEdit->GetSubEdit(), WB_NOHIDESELECTION, sal_True );
3712                 break;
3713 
3714             case BASEPROPERTY_READONLY:
3715             {
3716                 sal_Bool b = sal_Bool();
3717                 if ( Value >>= b )
3718                     pEdit->SetReadOnly( b );
3719             }
3720             break;
3721             case BASEPROPERTY_ECHOCHAR:
3722             {
3723                 sal_Int16 n = sal_Int16();
3724                 if ( Value >>= n )
3725                     pEdit->SetEchoChar( n );
3726             }
3727             break;
3728             case BASEPROPERTY_MAXTEXTLEN:
3729             {
3730                 sal_Int16 n = sal_Int16();
3731                 if ( Value >>= n )
3732                     pEdit->SetMaxTextLen( n );
3733             }
3734             break;
3735             default:
3736             {
3737                 VCLXWindow::setProperty( PropertyName, Value );
3738             }
3739         }
3740     }
3741 }
3742 
3743 ::com::sun::star::uno::Any VCLXEdit::getProperty( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::uno::RuntimeException)
3744 {
3745     ::vos::OGuard aGuard( GetMutex() );
3746 
3747     ::com::sun::star::uno::Any aProp;
3748     Edit* pEdit = (Edit*)GetWindow();
3749     if ( pEdit )
3750     {
3751         sal_uInt16 nPropType = GetPropertyId( PropertyName );
3752         switch ( nPropType )
3753         {
3754             case BASEPROPERTY_HIDEINACTIVESELECTION:
3755                 aProp <<= (sal_Bool)( ( pEdit->GetStyle() & WB_NOHIDESELECTION ) == 0 );
3756                 break;
3757             case BASEPROPERTY_READONLY:
3758                 aProp <<= (sal_Bool) pEdit->IsReadOnly();
3759                 break;
3760             case BASEPROPERTY_ECHOCHAR:
3761                 aProp <<= (sal_Int16) pEdit->GetEchoChar();
3762                 break;
3763             case BASEPROPERTY_MAXTEXTLEN:
3764                 aProp <<= (sal_Int16) pEdit->GetMaxTextLen();
3765                 break;
3766             default:
3767             {
3768                 aProp = VCLXWindow::getProperty( PropertyName );
3769             }
3770         }
3771     }
3772     return aProp;
3773 }
3774 
3775 ::com::sun::star::awt::Size VCLXEdit::getMinimumSize(  ) throw(::com::sun::star::uno::RuntimeException)
3776 {
3777     ::vos::OGuard aGuard( GetMutex() );
3778 
3779     Size aSz;
3780     Edit* pEdit = (Edit*) GetWindow();
3781     if ( pEdit )
3782         aSz = pEdit->CalcMinimumSize();
3783     return AWTSize(aSz);
3784 }
3785 
3786 ::com::sun::star::awt::Size VCLXEdit::getPreferredSize(  ) throw(::com::sun::star::uno::RuntimeException)
3787 {
3788     ::vos::OGuard aGuard( GetMutex() );
3789 
3790     Size aSz;
3791     Edit* pEdit = (Edit*) GetWindow();
3792     if ( pEdit )
3793     {
3794         aSz = pEdit->CalcMinimumSize();
3795         aSz.Height() += 4;
3796     }
3797     return AWTSize(aSz);
3798 }
3799 
3800 ::com::sun::star::awt::Size VCLXEdit::calcAdjustedSize( const ::com::sun::star::awt::Size& rNewSize ) throw(::com::sun::star::uno::RuntimeException)
3801 {
3802     ::vos::OGuard aGuard( GetMutex() );
3803 
3804     ::com::sun::star::awt::Size aSz = rNewSize;
3805     ::com::sun::star::awt::Size aMinSz = getMinimumSize();
3806     if ( aSz.Height != aMinSz.Height )
3807         aSz.Height = aMinSz.Height;
3808 
3809     return aSz;
3810 }
3811 
3812 ::com::sun::star::awt::Size VCLXEdit::getMinimumSize( sal_Int16 nCols, sal_Int16 ) throw(::com::sun::star::uno::RuntimeException)
3813 {
3814     ::vos::OGuard aGuard( GetMutex() );
3815 
3816     Size aSz;
3817     Edit* pEdit = (Edit*) GetWindow();
3818     if ( pEdit )
3819     {
3820         if ( nCols )
3821             aSz = pEdit->CalcSize( nCols );
3822         else
3823             aSz = pEdit->CalcMinimumSize();
3824     }
3825     return AWTSize(aSz);
3826 }
3827 
3828 void VCLXEdit::getColumnsAndLines( sal_Int16& nCols, sal_Int16& nLines ) throw(::com::sun::star::uno::RuntimeException)
3829 {
3830     ::vos::OGuard aGuard( GetMutex() );
3831 
3832     nLines = 1;
3833     nCols = 0;
3834     Edit* pEdit = (Edit*) GetWindow();
3835     if ( pEdit )
3836         nCols = pEdit->GetMaxVisChars();
3837 }
3838 
3839 void VCLXEdit::ProcessWindowEvent( const VclWindowEvent& rVclWindowEvent )
3840 {
3841     switch ( rVclWindowEvent.GetId() )
3842     {
3843         case VCLEVENT_EDIT_MODIFY:
3844         {
3845             ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindow > xKeepAlive( this );
3846                 // since we call listeners below, there is a potential that we will be destroyed
3847                 // during the listener call. To prevent the resulting crashs, we keep us
3848                 // alive as long as we're here
3849                 // #20178# - 2003-10-01 - fs@openoffice.org
3850 
3851             if ( GetTextListeners().getLength() )
3852             {
3853                 ::com::sun::star::awt::TextEvent aEvent;
3854                 aEvent.Source = (::cppu::OWeakObject*)this;
3855                 GetTextListeners().textChanged( aEvent );
3856             }
3857         }
3858         break;
3859 
3860         default:
3861             VCLXWindow::ProcessWindowEvent( rVclWindowEvent );
3862             break;
3863     }
3864 }
3865 
3866 //  ----------------------------------------------------
3867 //  class VCLXComboBox
3868 //  ----------------------------------------------------
3869 
3870 void VCLXComboBox::ImplGetPropertyIds( std::list< sal_uInt16 > &rIds )
3871 {
3872     PushPropertyIds( rIds,
3873                      BASEPROPERTY_AUTOCOMPLETE,
3874                      BASEPROPERTY_BACKGROUNDCOLOR,
3875                      BASEPROPERTY_BORDER,
3876                      BASEPROPERTY_BORDERCOLOR,
3877                      BASEPROPERTY_DEFAULTCONTROL,
3878                      BASEPROPERTY_DROPDOWN,
3879                      BASEPROPERTY_ENABLED,
3880                      BASEPROPERTY_ENABLEVISIBLE,
3881                      BASEPROPERTY_FONTDESCRIPTOR,
3882                      BASEPROPERTY_HELPTEXT,
3883                      BASEPROPERTY_HELPURL,
3884                      BASEPROPERTY_LINECOUNT,
3885                      BASEPROPERTY_MAXTEXTLEN,
3886                      BASEPROPERTY_PRINTABLE,
3887                      BASEPROPERTY_READONLY,
3888                      BASEPROPERTY_STRINGITEMLIST,
3889                      BASEPROPERTY_TABSTOP,
3890                      BASEPROPERTY_TEXT,
3891                      BASEPROPERTY_HIDEINACTIVESELECTION,
3892                      BASEPROPERTY_ALIGN,
3893                      BASEPROPERTY_WRITING_MODE,
3894                      BASEPROPERTY_CONTEXT_WRITING_MODE,
3895                      BASEPROPERTY_REFERENCE_DEVICE,
3896                      BASEPROPERTY_MOUSE_WHEEL_BEHAVIOUR,
3897                      0);
3898     // no, don't call VCLXEdit here - it has properties which we do *not* want to have at at combo box
3899     // #i92690# / 2008-08-12 / frank.schoenheit@sun.com
3900     // VCLXEdit::ImplGetPropertyIds( rIds );
3901     VCLXWindow::ImplGetPropertyIds( rIds );
3902 }
3903 
3904 VCLXComboBox::VCLXComboBox()
3905     : maActionListeners( *this ), maItemListeners( *this )
3906 {
3907 }
3908 
3909 VCLXComboBox::~VCLXComboBox()
3910 {
3911 #ifndef __SUNPRO_CC
3912     OSL_TRACE ("%s", __FUNCTION__);
3913 #endif
3914 }
3915 
3916 ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleContext > VCLXComboBox::CreateAccessibleContext()
3917 {
3918     ::vos::OGuard aGuard( GetMutex() );
3919 
3920     return getAccessibleFactory().createAccessibleContext( this );
3921 }
3922 
3923 void VCLXComboBox::dispose() throw(::com::sun::star::uno::RuntimeException)
3924 {
3925     ::vos::OGuard aGuard( GetMutex() );
3926 
3927     ::com::sun::star::lang::EventObject aObj;
3928     aObj.Source = (::cppu::OWeakObject*)this;
3929     maItemListeners.disposeAndClear( aObj );
3930     maActionListeners.disposeAndClear( aObj );
3931     VCLXEdit::dispose();
3932 }
3933 
3934 
3935 void VCLXComboBox::addItemListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XItemListener > & l ) throw(::com::sun::star::uno::RuntimeException)
3936 {
3937     ::vos::OGuard aGuard( GetMutex() );
3938     maItemListeners.addInterface( l );
3939 }
3940 
3941 void VCLXComboBox::removeItemListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XItemListener > & l ) throw(::com::sun::star::uno::RuntimeException)
3942 {
3943     ::vos::OGuard aGuard( GetMutex() );
3944     maItemListeners.removeInterface( l );
3945 }
3946 
3947 void VCLXComboBox::addActionListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XActionListener > & l ) throw(::com::sun::star::uno::RuntimeException)
3948 {
3949     ::vos::OGuard aGuard( GetMutex() );
3950     maActionListeners.addInterface( l );
3951 }
3952 
3953 void VCLXComboBox::removeActionListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XActionListener > & l ) throw(::com::sun::star::uno::RuntimeException)
3954 {
3955     ::vos::OGuard aGuard( GetMutex() );
3956     maActionListeners.removeInterface( l );
3957 }
3958 
3959 void VCLXComboBox::addItem( const ::rtl::OUString& aItem, sal_Int16 nPos ) throw(::com::sun::star::uno::RuntimeException)
3960 {
3961     ::vos::OGuard aGuard( GetMutex() );
3962 
3963     ComboBox* pBox = (ComboBox*) GetWindow();
3964     if ( pBox )
3965         pBox->InsertEntry( aItem, nPos );
3966 }
3967 
3968 void VCLXComboBox::addItems( const ::com::sun::star::uno::Sequence< ::rtl::OUString>& aItems, sal_Int16 nPos ) throw(::com::sun::star::uno::RuntimeException)
3969 {
3970     ::vos::OGuard aGuard( GetMutex() );
3971 
3972     ComboBox* pBox = (ComboBox*) GetWindow();
3973     if ( pBox )
3974     {
3975         sal_uInt16 nP = nPos;
3976         for ( sal_uInt16 n = 0; n < aItems.getLength(); n++ )
3977         {
3978             pBox->InsertEntry( aItems.getConstArray()[n], nP );
3979             if ( nP == 0xFFFF )
3980             {
3981                 OSL_ENSURE( false, "VCLXComboBox::addItems: too many entries!" );
3982                 // skip remaining entries, list cannot hold them, anyway
3983                 break;
3984             }
3985         }
3986     }
3987 }
3988 
3989 void VCLXComboBox::removeItems( sal_Int16 nPos, sal_Int16 nCount ) throw(::com::sun::star::uno::RuntimeException)
3990 {
3991     ::vos::OGuard aGuard( GetMutex() );
3992 
3993     ComboBox* pBox = (ComboBox*) GetWindow();
3994     if ( pBox )
3995     {
3996         for ( sal_uInt16 n = nCount; n; )
3997             pBox->RemoveEntry( nPos + (--n) );
3998     }
3999 }
4000 
4001 sal_Int16 VCLXComboBox::getItemCount() throw(::com::sun::star::uno::RuntimeException)
4002 {
4003     ::vos::OGuard aGuard( GetMutex() );
4004 
4005     ComboBox* pBox = (ComboBox*) GetWindow();
4006     return pBox ? pBox->GetEntryCount() : 0;
4007 }
4008 
4009 ::rtl::OUString VCLXComboBox::getItem( sal_Int16 nPos ) throw(::com::sun::star::uno::RuntimeException)
4010 {
4011     ::vos::OGuard aGuard( GetMutex() );
4012 
4013     ::rtl::OUString aItem;
4014     ComboBox* pBox = (ComboBox*) GetWindow();
4015     if ( pBox )
4016         aItem = pBox->GetEntry( nPos );
4017     return aItem;
4018 }
4019 
4020 ::com::sun::star::uno::Sequence< ::rtl::OUString> VCLXComboBox::getItems() throw(::com::sun::star::uno::RuntimeException)
4021 {
4022     ::vos::OGuard aGuard( GetMutex() );
4023 
4024     ::com::sun::star::uno::Sequence< ::rtl::OUString> aSeq;
4025     ComboBox* pBox = (ComboBox*) GetWindow();
4026     if ( pBox )
4027     {
4028         sal_uInt16 nEntries = pBox->GetEntryCount();
4029         aSeq = ::com::sun::star::uno::Sequence< ::rtl::OUString>( nEntries );
4030         for ( sal_uInt16 n = nEntries; n; )
4031         {
4032             --n;
4033             aSeq.getArray()[n] = pBox->GetEntry( n );
4034         }
4035     }
4036     return aSeq;
4037 }
4038 
4039 void VCLXComboBox::setDropDownLineCount( sal_Int16 nLines ) throw(::com::sun::star::uno::RuntimeException)
4040 {
4041     ::vos::OGuard aGuard( GetMutex() );
4042 
4043     ComboBox* pBox = (ComboBox*) GetWindow();
4044     if ( pBox )
4045         pBox->SetDropDownLineCount( nLines );
4046 }
4047 
4048 sal_Int16 VCLXComboBox::getDropDownLineCount() throw(::com::sun::star::uno::RuntimeException)
4049 {
4050     ::vos::OGuard aGuard( GetMutex() );
4051 
4052     sal_Int16 nLines = 0;
4053     ComboBox* pBox = (ComboBox*) GetWindow();
4054     if ( pBox )
4055         nLines = pBox->GetDropDownLineCount();
4056     return nLines;
4057 }
4058 
4059 void VCLXComboBox::setProperty( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Any& Value) throw(::com::sun::star::uno::RuntimeException)
4060 {
4061     ::vos::OGuard aGuard( GetMutex() );
4062 
4063     ComboBox* pComboBox = (ComboBox*)GetWindow();
4064     if ( pComboBox )
4065     {
4066         sal_uInt16 nPropType = GetPropertyId( PropertyName );
4067         switch ( nPropType )
4068         {
4069             case BASEPROPERTY_LINECOUNT:
4070             {
4071                 sal_Int16 n = sal_Int16();
4072                 if ( Value >>= n )
4073                     pComboBox->SetDropDownLineCount( n );
4074             }
4075             break;
4076             case BASEPROPERTY_AUTOCOMPLETE:
4077             {
4078                 sal_Int16 n = sal_Int16();
4079                 if ( Value >>= n )
4080                     pComboBox->EnableAutocomplete( n != 0 );
4081             }
4082             break;
4083             case BASEPROPERTY_STRINGITEMLIST:
4084             {
4085                 ::com::sun::star::uno::Sequence< ::rtl::OUString> aItems;
4086                 if ( Value >>= aItems )
4087                 {
4088                     pComboBox->Clear();
4089                     addItems( aItems, 0 );
4090                 }
4091             }
4092             break;
4093             default:
4094             {
4095                 VCLXEdit::setProperty( PropertyName, Value );
4096 
4097                 // #109385# SetBorderStyle is not virtual
4098                 if ( nPropType == BASEPROPERTY_BORDER )
4099                 {
4100                     sal_uInt16 nBorder = sal_uInt16();
4101                     if ( (Value >>= nBorder) && nBorder != 0 )
4102                         pComboBox->SetBorderStyle( nBorder );
4103                 }
4104             }
4105         }
4106     }
4107 }
4108 
4109 ::com::sun::star::uno::Any VCLXComboBox::getProperty( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::uno::RuntimeException)
4110 {
4111     ::vos::OGuard aGuard( GetMutex() );
4112 
4113     ::com::sun::star::uno::Any aProp;
4114     ComboBox* pComboBox = (ComboBox*)GetWindow();
4115     if ( pComboBox )
4116     {
4117         sal_uInt16 nPropType = GetPropertyId( PropertyName );
4118         switch ( nPropType )
4119         {
4120             case BASEPROPERTY_LINECOUNT:
4121             {
4122                 aProp <<= (sal_Int16)  pComboBox->GetDropDownLineCount();
4123             }
4124             break;
4125             case BASEPROPERTY_AUTOCOMPLETE:
4126             {
4127                 aProp <<= (sal_Bool) pComboBox->IsAutocompleteEnabled();
4128             }
4129             break;
4130             case BASEPROPERTY_STRINGITEMLIST:
4131             {
4132                 sal_uInt16 nItems = pComboBox->GetEntryCount();
4133                 ::com::sun::star::uno::Sequence< ::rtl::OUString> aSeq( nItems );
4134                 ::rtl::OUString* pStrings = aSeq.getArray();
4135                 for ( sal_uInt16 n = 0; n < nItems; n++ )
4136                     pStrings[n] = pComboBox->GetEntry( n );
4137                 aProp <<= aSeq;
4138 
4139             }
4140             break;
4141             default:
4142             {
4143                 aProp <<= VCLXEdit::getProperty( PropertyName );
4144             }
4145         }
4146     }
4147     return aProp;
4148 }
4149 
4150 void VCLXComboBox::ProcessWindowEvent( const VclWindowEvent& rVclWindowEvent )
4151 {
4152     ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindow > xKeepAlive( this );
4153         // since we call listeners below, there is a potential that we will be destroyed
4154         // during the listener call. To prevent the resulting crashs, we keep us
4155         // alive as long as we're here
4156         // #20178# - 2003-10-01 - fs@openoffice.org
4157 
4158     switch ( rVclWindowEvent.GetId() )
4159     {
4160         case VCLEVENT_COMBOBOX_SELECT:
4161             if ( maItemListeners.getLength() )
4162             {
4163                 ComboBox* pComboBox = (ComboBox*)GetWindow();
4164                 if( pComboBox )
4165                 {
4166                     if ( !pComboBox->IsTravelSelect() )
4167                     {
4168                         ::com::sun::star::awt::ItemEvent aEvent;
4169                         aEvent.Source = (::cppu::OWeakObject*)this;
4170                         aEvent.Highlighted = sal_False;
4171 
4172                         // Bei Mehrfachselektion 0xFFFF, sonst die ID
4173                         aEvent.Selected = pComboBox->GetEntryPos( pComboBox->GetText() );
4174 
4175                         maItemListeners.itemStateChanged( aEvent );
4176                     }
4177                 }
4178             }
4179             break;
4180 
4181         case VCLEVENT_COMBOBOX_DOUBLECLICK:
4182             if ( maActionListeners.getLength() )
4183             {
4184                 ::com::sun::star::awt::ActionEvent aEvent;
4185                 aEvent.Source = (::cppu::OWeakObject*)this;
4186 //              aEvent.ActionCommand = ...;
4187                 maActionListeners.actionPerformed( aEvent );
4188             }
4189             break;
4190 
4191         default:
4192             VCLXEdit::ProcessWindowEvent( rVclWindowEvent );
4193             break;
4194     }
4195 }
4196 
4197 ::com::sun::star::awt::Size VCLXComboBox::getMinimumSize(  ) throw(::com::sun::star::uno::RuntimeException)
4198 {
4199     ::vos::OGuard aGuard( GetMutex() );
4200 
4201     Size aSz;
4202     ComboBox* pComboBox = (ComboBox*) GetWindow();
4203     if ( pComboBox )
4204         aSz = pComboBox->CalcMinimumSize();
4205     return AWTSize(aSz);
4206 }
4207 
4208 ::com::sun::star::awt::Size VCLXComboBox::getPreferredSize(  ) throw(::com::sun::star::uno::RuntimeException)
4209 {
4210     ::vos::OGuard aGuard( GetMutex() );
4211 
4212     Size aSz;
4213     ComboBox* pComboBox = (ComboBox*) GetWindow();
4214     if ( pComboBox )
4215     {
4216         aSz = pComboBox->CalcMinimumSize();
4217         if ( pComboBox->GetStyle() & WB_DROPDOWN )
4218             aSz.Height() += 4;
4219     }
4220     return AWTSize(aSz);
4221 }
4222 
4223 ::com::sun::star::awt::Size VCLXComboBox::calcAdjustedSize( const ::com::sun::star::awt::Size& rNewSize ) throw(::com::sun::star::uno::RuntimeException)
4224 {
4225     ::vos::OGuard aGuard( GetMutex() );
4226 
4227     Size aSz = VCLSize(rNewSize);
4228     ComboBox* pComboBox = (ComboBox*) GetWindow();
4229     if ( pComboBox )
4230         aSz = pComboBox->CalcAdjustedSize( aSz );
4231     return AWTSize(aSz);
4232 }
4233 
4234 ::com::sun::star::awt::Size VCLXComboBox::getMinimumSize( sal_Int16 nCols, sal_Int16 nLines ) throw(::com::sun::star::uno::RuntimeException)
4235 {
4236     ::vos::OGuard aGuard( GetMutex() );
4237 
4238     Size aSz;
4239     ComboBox* pComboBox = (ComboBox*) GetWindow();
4240     if ( pComboBox )
4241         aSz = pComboBox->CalcSize( nCols, nLines );
4242     return AWTSize(aSz);
4243 }
4244 
4245 void VCLXComboBox::getColumnsAndLines( sal_Int16& nCols, sal_Int16& nLines ) throw(::com::sun::star::uno::RuntimeException)
4246 {
4247     ::vos::OGuard aGuard( GetMutex() );
4248 
4249     nCols = nLines = 0;
4250     ComboBox* pComboBox = (ComboBox*) GetWindow();
4251     if ( pComboBox )
4252     {
4253         sal_uInt16 nC, nL;
4254         pComboBox->GetMaxVisColumnsAndLines( nC, nL );
4255         nCols = nC;
4256         nLines = nL;
4257     }
4258 }
4259 void SAL_CALL VCLXComboBox::listItemInserted( const ItemListEvent& i_rEvent ) throw (RuntimeException)
4260 {
4261     ::vos::OGuard aGuard( GetMutex() );
4262 
4263     ComboBox* pComboBox = dynamic_cast< ComboBox* >( GetWindow() );
4264 
4265     ENSURE_OR_RETURN_VOID( pComboBox, "VCLXComboBox::listItemInserted: no ComboBox?!" );
4266     ENSURE_OR_RETURN_VOID( ( i_rEvent.ItemPosition >= 0 ) && ( i_rEvent.ItemPosition <= sal_Int32( pComboBox->GetEntryCount() ) ),
4267         "VCLXComboBox::listItemInserted: illegal (inconsistent) item position!" );
4268     pComboBox->InsertEntry(
4269         i_rEvent.ItemText.IsPresent ? i_rEvent.ItemText.Value : ::rtl::OUString(),
4270         i_rEvent.ItemImageURL.IsPresent ? lcl_getImageFromURL( i_rEvent.ItemImageURL.Value ) : Image(),
4271         i_rEvent.ItemPosition );
4272 }
4273 
4274 void SAL_CALL VCLXComboBox::listItemRemoved( const ItemListEvent& i_rEvent ) throw (RuntimeException)
4275 {
4276     ::vos::OGuard aGuard( GetMutex() );
4277 
4278     ComboBox* pComboBox = dynamic_cast< ComboBox* >( GetWindow() );
4279 
4280     ENSURE_OR_RETURN_VOID( pComboBox, "VCLXComboBox::listItemRemoved: no ComboBox?!" );
4281     ENSURE_OR_RETURN_VOID( ( i_rEvent.ItemPosition >= 0 ) && ( i_rEvent.ItemPosition < sal_Int32( pComboBox->GetEntryCount() ) ),
4282         "VCLXComboBox::listItemRemoved: illegal (inconsistent) item position!" );
4283 
4284     pComboBox->RemoveEntry( i_rEvent.ItemPosition );
4285 }
4286 
4287 void SAL_CALL VCLXComboBox::listItemModified( const ItemListEvent& i_rEvent ) throw (RuntimeException)
4288 {
4289     ::vos::OGuard aGuard( GetMutex() );
4290 
4291     ComboBox* pComboBox = dynamic_cast< ComboBox* >( GetWindow() );
4292 
4293     ENSURE_OR_RETURN_VOID( pComboBox, "VCLXComboBox::listItemModified: no ComboBox?!" );
4294     ENSURE_OR_RETURN_VOID( ( i_rEvent.ItemPosition >= 0 ) && ( i_rEvent.ItemPosition < sal_Int32( pComboBox->GetEntryCount() ) ),
4295         "VCLXComboBox::listItemModified: illegal (inconsistent) item position!" );
4296 
4297     // VCL's ComboBox does not support changing an entry's text or image, so remove and re-insert
4298 
4299     const ::rtl::OUString sNewText = i_rEvent.ItemText.IsPresent ? i_rEvent.ItemText.Value : ::rtl::OUString( pComboBox->GetEntry( i_rEvent.ItemPosition ) );
4300     const Image aNewImage( i_rEvent.ItemImageURL.IsPresent ? lcl_getImageFromURL( i_rEvent.ItemImageURL.Value ) : pComboBox->GetEntryImage( i_rEvent.ItemPosition  ) );
4301 
4302     pComboBox->RemoveEntry( i_rEvent.ItemPosition );
4303     pComboBox->InsertEntry( sNewText, aNewImage, i_rEvent.ItemPosition );
4304 }
4305 
4306 void SAL_CALL VCLXComboBox::allItemsRemoved( const EventObject& i_rEvent ) throw (RuntimeException)
4307 {
4308     ::vos::OGuard aGuard( GetMutex() );
4309 
4310     ComboBox* pComboBox = dynamic_cast< ComboBox* >( GetWindow() );
4311     ENSURE_OR_RETURN_VOID( pComboBox, "VCLXComboBox::listItemModified: no ComboBox?!" );
4312 
4313     pComboBox->Clear();
4314 
4315     (void)i_rEvent;
4316 }
4317 
4318 void SAL_CALL VCLXComboBox::itemListChanged( const EventObject& i_rEvent ) throw (RuntimeException)
4319 {
4320     ::vos::OGuard aGuard( GetMutex() );
4321 
4322     ComboBox* pComboBox = dynamic_cast< ComboBox* >( GetWindow() );
4323     ENSURE_OR_RETURN_VOID( pComboBox, "VCLXComboBox::listItemModified: no ComboBox?!" );
4324 
4325     pComboBox->Clear();
4326 
4327     uno::Reference< beans::XPropertySet > xPropSet( i_rEvent.Source, uno::UNO_QUERY_THROW );
4328     uno::Reference< beans::XPropertySetInfo > xPSI( xPropSet->getPropertySetInfo(), uno::UNO_QUERY_THROW );
4329     // bool localize = xPSI->hasPropertyByName( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ResourceResolver" ) ) );
4330     uno::Reference< resource::XStringResourceResolver > xStringResourceResolver;
4331     if ( xPSI->hasPropertyByName( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ResourceResolver" ) ) ) )
4332     {
4333         xStringResourceResolver.set(
4334             xPropSet->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ResourceResolver" ) ) ),
4335             uno::UNO_QUERY
4336         );
4337     }
4338 
4339 
4340     Reference< XItemList > xItemList( i_rEvent.Source, uno::UNO_QUERY_THROW );
4341     uno::Sequence< beans::Pair< ::rtl::OUString, ::rtl::OUString > > aItems = xItemList->getAllItems();
4342     for ( sal_Int32 i=0; i<aItems.getLength(); ++i )
4343     {
4344         ::rtl::OUString aLocalizationKey( aItems[i].First );
4345         if ( xStringResourceResolver.is() && aLocalizationKey.getLength() != 0 && aLocalizationKey[0] == '&' )
4346         {
4347             aLocalizationKey = xStringResourceResolver->resolveString(aLocalizationKey.copy( 1 ));
4348         }
4349         pComboBox->InsertEntry( aLocalizationKey, lcl_getImageFromURL( aItems[i].Second ) );
4350     }
4351 }
4352 void SAL_CALL VCLXComboBox::disposing( const EventObject& i_rEvent ) throw (RuntimeException)
4353 {
4354     // just disambiguate
4355     VCLXEdit::disposing( i_rEvent );
4356 }
4357 
4358 //  ----------------------------------------------------
4359 //  class VCLXFormattedSpinField
4360 //  ----------------------------------------------------
4361 void VCLXFormattedSpinField::ImplGetPropertyIds( std::list< sal_uInt16 > &rIds )
4362 {
4363     // Interestingly in the UnoControl API this is
4364     // - not derived from XEdit ultimately, (correct ?) - so cut this here ...
4365 //    VCLXSpinField::ImplGetPropertyIds( rIds );
4366     VCLXWindow::ImplGetPropertyIds( rIds );
4367 }
4368 
4369 VCLXFormattedSpinField::VCLXFormattedSpinField()
4370 {
4371 }
4372 
4373 VCLXFormattedSpinField::~VCLXFormattedSpinField()
4374 {
4375 }
4376 
4377 void VCLXFormattedSpinField::setStrictFormat( sal_Bool bStrict )
4378 {
4379     ::vos::OGuard aGuard( GetMutex() );
4380 
4381     FormatterBase* pFormatter = GetFormatter();
4382     if ( pFormatter )
4383         pFormatter->SetStrictFormat( bStrict );
4384 }
4385 
4386 sal_Bool VCLXFormattedSpinField::isStrictFormat()
4387 {
4388     FormatterBase* pFormatter = GetFormatter();
4389     return pFormatter ? pFormatter->IsStrictFormat() : sal_False;
4390 }
4391 
4392 
4393 void VCLXFormattedSpinField::setProperty( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Any& Value) throw(::com::sun::star::uno::RuntimeException)
4394 {
4395     ::vos::OGuard aGuard( GetMutex() );
4396 
4397     FormatterBase* pFormatter = GetFormatter();
4398     if ( pFormatter )
4399     {
4400         sal_uInt16 nPropType = GetPropertyId( PropertyName );
4401         switch ( nPropType )
4402         {
4403             case BASEPROPERTY_SPIN:
4404             {
4405                 sal_Bool b = sal_Bool();
4406                 if ( Value >>= b )
4407                 {
4408                     WinBits nStyle = GetWindow()->GetStyle() | WB_SPIN;
4409                     if ( !b )
4410                         nStyle &= ~WB_SPIN;
4411                     GetWindow()->SetStyle( nStyle );
4412                 }
4413             }
4414             break;
4415             case BASEPROPERTY_STRICTFORMAT:
4416             {
4417                 sal_Bool b = sal_Bool();
4418                 if ( Value >>= b )
4419                 {
4420                     pFormatter->SetStrictFormat( b );
4421                 }
4422             }
4423             break;
4424             default:
4425             {
4426                 VCLXSpinField::setProperty( PropertyName, Value );
4427             }
4428         }
4429     }
4430 }
4431 
4432 ::com::sun::star::uno::Any VCLXFormattedSpinField::getProperty( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::uno::RuntimeException)
4433 {
4434     ::vos::OGuard aGuard( GetMutex() );
4435 
4436     ::com::sun::star::uno::Any aProp;
4437     FormatterBase* pFormatter = GetFormatter();
4438     if ( pFormatter )
4439     {
4440         sal_uInt16 nPropType = GetPropertyId( PropertyName );
4441         switch ( nPropType )
4442         {
4443             case BASEPROPERTY_TABSTOP:
4444             {
4445                 aProp <<= (sal_Bool) ( ( GetWindow()->GetStyle() & WB_SPIN ) ? sal_True : sal_False );
4446             }
4447             break;
4448             case BASEPROPERTY_STRICTFORMAT:
4449             {
4450                 aProp <<= (sal_Bool) pFormatter->IsStrictFormat();
4451             }
4452             break;
4453             default:
4454             {
4455                 aProp <<= VCLXSpinField::getProperty( PropertyName );
4456             }
4457         }
4458     }
4459     return aProp;
4460 }
4461 
4462 
4463 //  ----------------------------------------------------
4464 //  class VCLXDateField
4465 //  ----------------------------------------------------
4466 
4467 void VCLXDateField::ImplGetPropertyIds( std::list< sal_uInt16 > &rIds )
4468 {
4469     PushPropertyIds( rIds,
4470                      BASEPROPERTY_ALIGN,
4471                      BASEPROPERTY_BACKGROUNDCOLOR,
4472                      BASEPROPERTY_BORDER,
4473                      BASEPROPERTY_BORDERCOLOR,
4474                      BASEPROPERTY_DATE,
4475                      BASEPROPERTY_DATEMAX,
4476                      BASEPROPERTY_DATEMIN,
4477                      BASEPROPERTY_DATESHOWCENTURY,
4478                      BASEPROPERTY_DEFAULTCONTROL,
4479                      BASEPROPERTY_DROPDOWN,
4480                      BASEPROPERTY_ENABLED,
4481                      BASEPROPERTY_ENABLEVISIBLE,
4482                      BASEPROPERTY_EXTDATEFORMAT,
4483                      BASEPROPERTY_FONTDESCRIPTOR,
4484                      BASEPROPERTY_HELPTEXT,
4485                      BASEPROPERTY_HELPURL,
4486                      BASEPROPERTY_PRINTABLE,
4487                      BASEPROPERTY_READONLY,
4488                      BASEPROPERTY_REPEAT,
4489                      BASEPROPERTY_REPEAT_DELAY,
4490                      BASEPROPERTY_SPIN,
4491                      BASEPROPERTY_STRICTFORMAT,
4492                      BASEPROPERTY_TABSTOP,
4493                      BASEPROPERTY_ENFORCE_FORMAT,
4494                      BASEPROPERTY_TEXT,
4495                      BASEPROPERTY_HIDEINACTIVESELECTION,
4496                      BASEPROPERTY_VERTICALALIGN,
4497                      BASEPROPERTY_WRITING_MODE,
4498                      BASEPROPERTY_CONTEXT_WRITING_MODE,
4499                      BASEPROPERTY_MOUSE_WHEEL_BEHAVIOUR,
4500                      0);
4501     VCLXFormattedSpinField::ImplGetPropertyIds( rIds );
4502 }
4503 
4504 VCLXDateField::VCLXDateField()
4505 {
4506 }
4507 
4508 VCLXDateField::~VCLXDateField()
4509 {
4510 }
4511 
4512 // ::com::sun::star::uno::XInterface
4513 ::com::sun::star::uno::Any VCLXDateField::queryInterface( const ::com::sun::star::uno::Type & rType ) throw(::com::sun::star::uno::RuntimeException)
4514 {
4515     ::com::sun::star::uno::Any aRet = ::cppu::queryInterface( rType,
4516                                         SAL_STATIC_CAST( ::com::sun::star::awt::XDateField*, this ) );
4517     return (aRet.hasValue() ? aRet : VCLXFormattedSpinField::queryInterface( rType ));
4518 }
4519 
4520 // ::com::sun::star::lang::XTypeProvider
4521 IMPL_XTYPEPROVIDER_START( VCLXDateField )
4522     getCppuType( ( ::com::sun::star::uno::Reference< ::com::sun::star::awt::XDateField>* ) NULL ),
4523     VCLXFormattedSpinField::getTypes()
4524 IMPL_XTYPEPROVIDER_END
4525 
4526 void VCLXDateField::setProperty( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Any& Value) throw(::com::sun::star::uno::RuntimeException)
4527 {
4528     ::vos::OGuard aGuard( GetMutex() );
4529 
4530     if ( GetWindow() )
4531     {
4532         sal_Bool bVoid = Value.getValueType().getTypeClass() == ::com::sun::star::uno::TypeClass_VOID;
4533 
4534         sal_uInt16 nPropType = GetPropertyId( PropertyName );
4535         switch ( nPropType )
4536         {
4537             case BASEPROPERTY_DATE:
4538             {
4539                 if ( bVoid )
4540                 {
4541                     ((DateField*)GetWindow())->EnableEmptyFieldValue( sal_True );
4542                     ((DateField*)GetWindow())->SetEmptyFieldValue();
4543                 }
4544                 else
4545                 {
4546                     sal_Int32 n = 0;
4547                     if ( Value >>= n )
4548                         setDate( n );
4549                 }
4550             }
4551             break;
4552             case BASEPROPERTY_DATEMIN:
4553             {
4554                 sal_Int32 n = 0;
4555                 if ( Value >>= n )
4556                     setMin( n );
4557             }
4558             break;
4559             case BASEPROPERTY_DATEMAX:
4560             {
4561                 sal_Int32 n = 0;
4562                 if ( Value >>= n )
4563                     setMax( n );
4564             }
4565             break;
4566             case BASEPROPERTY_EXTDATEFORMAT:
4567             {
4568                 sal_Int16 n = sal_Int16();
4569                 if ( Value >>= n )
4570                     ((DateField*)GetWindow())->SetExtDateFormat( (ExtDateFieldFormat) n );
4571             }
4572             break;
4573             case BASEPROPERTY_DATESHOWCENTURY:
4574             {
4575                 sal_Bool b = sal_Bool();
4576                 if ( Value >>= b )
4577                     ((DateField*)GetWindow())->SetShowDateCentury( b );
4578             }
4579             break;
4580             case BASEPROPERTY_ENFORCE_FORMAT:
4581             {
4582                 sal_Bool bEnforce( sal_True );
4583                 OSL_VERIFY( Value >>= bEnforce );
4584                 static_cast< DateField* >( GetWindow() )->EnforceValidValue( bEnforce );
4585             }
4586             break;
4587             default:
4588             {
4589                 VCLXFormattedSpinField::setProperty( PropertyName, Value );
4590             }
4591         }
4592     }
4593 }
4594 
4595 ::com::sun::star::uno::Any VCLXDateField::getProperty( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::uno::RuntimeException)
4596 {
4597     ::vos::OGuard aGuard( GetMutex() );
4598 
4599     ::com::sun::star::uno::Any aProp;
4600     FormatterBase* pFormatter = GetFormatter();
4601     if ( pFormatter )
4602     {
4603         sal_uInt16 nPropType = GetPropertyId( PropertyName );
4604         switch ( nPropType )
4605         {
4606             case BASEPROPERTY_DATE:
4607             {
4608                 aProp <<= (sal_Int32) getDate();
4609             }
4610             break;
4611             case BASEPROPERTY_DATEMIN:
4612             {
4613                 aProp <<= (sal_Int32) getMin();
4614             }
4615             break;
4616             case BASEPROPERTY_DATEMAX:
4617             {
4618                 aProp <<= (sal_Int32) getMax();
4619             }
4620             break;
4621             case BASEPROPERTY_DATESHOWCENTURY:
4622             {
4623                 aProp <<= ((DateField*)GetWindow())->IsShowDateCentury();
4624             }
4625             break;
4626             case BASEPROPERTY_ENFORCE_FORMAT:
4627             {
4628                 aProp <<= (sal_Bool)static_cast< DateField* >( GetWindow() )->IsEnforceValidValue( );
4629             }
4630             break;
4631             default:
4632             {
4633                 aProp <<= VCLXFormattedSpinField::getProperty( PropertyName );
4634             }
4635         }
4636     }
4637     return aProp;
4638 }
4639 
4640 
4641 void VCLXDateField::setDate( sal_Int32 nDate ) throw(::com::sun::star::uno::RuntimeException)
4642 {
4643     ::vos::OGuard aGuard( GetMutex() );
4644 
4645     DateField* pDateField = (DateField*) GetWindow();
4646     if ( pDateField )
4647     {
4648         pDateField->SetDate( nDate );
4649 
4650         // #107218# Call same listeners like VCL would do after user interaction
4651         SetSynthesizingVCLEvent( sal_True );
4652         pDateField->SetModifyFlag();
4653         pDateField->Modify();
4654         SetSynthesizingVCLEvent( sal_False );
4655     }
4656 }
4657 
4658 sal_Int32 VCLXDateField::getDate() throw(::com::sun::star::uno::RuntimeException)
4659 {
4660     ::vos::OGuard aGuard( GetMutex() );
4661 
4662     sal_Int32 nDate = 0;
4663     DateField* pDateField = (DateField*) GetWindow();
4664     if ( pDateField )
4665         nDate = pDateField->GetDate().GetDate();
4666 
4667     return nDate;
4668 }
4669 
4670 void VCLXDateField::setMin( sal_Int32 nDate ) throw(::com::sun::star::uno::RuntimeException)
4671 {
4672     ::vos::OGuard aGuard( GetMutex() );
4673 
4674     DateField* pDateField = (DateField*) GetWindow();
4675     if ( pDateField )
4676         pDateField->SetMin( nDate );
4677 }
4678 
4679 sal_Int32 VCLXDateField::getMin() throw(::com::sun::star::uno::RuntimeException)
4680 {
4681     ::vos::OGuard aGuard( GetMutex() );
4682 
4683     sal_Int32 nDate = 0;
4684     DateField* pDateField = (DateField*) GetWindow();
4685     if ( pDateField )
4686         nDate = pDateField->GetMin().GetDate();
4687 
4688     return nDate;
4689 }
4690 
4691 void VCLXDateField::setMax( sal_Int32 nDate ) throw(::com::sun::star::uno::RuntimeException)
4692 {
4693     ::vos::OGuard aGuard( GetMutex() );
4694 
4695     DateField* pDateField = (DateField*) GetWindow();
4696     if ( pDateField )
4697         pDateField->SetMax( nDate );
4698 }
4699 
4700 sal_Int32 VCLXDateField::getMax() throw(::com::sun::star::uno::RuntimeException)
4701 {
4702     ::vos::OGuard aGuard( GetMutex() );
4703 
4704     sal_Int32 nDate = 0;
4705     DateField* pDateField = (DateField*) GetWindow();
4706     if ( pDateField )
4707         nDate = pDateField->GetMax().GetDate();
4708 
4709     return nDate;
4710 }
4711 
4712 void VCLXDateField::setFirst( sal_Int32 nDate ) throw(::com::sun::star::uno::RuntimeException)
4713 {
4714     ::vos::OGuard aGuard( GetMutex() );
4715 
4716     DateField* pDateField = (DateField*) GetWindow();
4717     if ( pDateField )
4718         pDateField->SetFirst( nDate );
4719 }
4720 
4721 sal_Int32 VCLXDateField::getFirst() throw(::com::sun::star::uno::RuntimeException)
4722 {
4723     ::vos::OGuard aGuard( GetMutex() );
4724 
4725     sal_Int32 nDate = 0;
4726     DateField* pDateField = (DateField*) GetWindow();
4727     if ( pDateField )
4728         nDate = pDateField->GetFirst().GetDate();
4729 
4730     return nDate;
4731 }
4732 
4733 void VCLXDateField::setLast( sal_Int32 nDate ) throw(::com::sun::star::uno::RuntimeException)
4734 {
4735     ::vos::OGuard aGuard( GetMutex() );
4736 
4737     DateField* pDateField = (DateField*) GetWindow();
4738     if ( pDateField )
4739         pDateField->SetLast( nDate );
4740 }
4741 
4742 sal_Int32 VCLXDateField::getLast() throw(::com::sun::star::uno::RuntimeException)
4743 {
4744     ::vos::OGuard aGuard( GetMutex() );
4745 
4746     sal_Int32 nDate = 0;
4747     DateField* pDateField = (DateField*) GetWindow();
4748     if ( pDateField )
4749         nDate = pDateField->GetLast().GetDate();
4750 
4751     return nDate;
4752 }
4753 
4754 void VCLXDateField::setLongFormat( sal_Bool bLong ) throw(::com::sun::star::uno::RuntimeException)
4755 {
4756     ::vos::OGuard aGuard( GetMutex() );
4757 
4758     DateField* pDateField = (DateField*) GetWindow();
4759     if ( pDateField )
4760         pDateField->SetLongFormat( bLong );
4761 }
4762 
4763 sal_Bool VCLXDateField::isLongFormat() throw(::com::sun::star::uno::RuntimeException)
4764 {
4765     ::vos::OGuard aGuard( GetMutex() );
4766 
4767     DateField* pDateField = (DateField*) GetWindow();
4768     return pDateField ? pDateField->IsLongFormat() : sal_False;
4769 }
4770 
4771 void VCLXDateField::setEmpty() throw(::com::sun::star::uno::RuntimeException)
4772 {
4773     ::vos::OGuard aGuard( GetMutex() );
4774 
4775     DateField* pDateField = (DateField*) GetWindow();
4776     if ( pDateField )
4777     {
4778         pDateField->SetEmptyDate();
4779 
4780         // #107218# Call same listeners like VCL would do after user interaction
4781         SetSynthesizingVCLEvent( sal_True );
4782         pDateField->SetModifyFlag();
4783         pDateField->Modify();
4784         SetSynthesizingVCLEvent( sal_False );
4785     }
4786 }
4787 
4788 sal_Bool VCLXDateField::isEmpty() throw(::com::sun::star::uno::RuntimeException)
4789 {
4790     ::vos::OGuard aGuard( GetMutex() );
4791 
4792     DateField* pDateField = (DateField*) GetWindow();
4793     return pDateField ? pDateField->IsEmptyDate() : sal_False;
4794 }
4795 
4796 void VCLXDateField::setStrictFormat( sal_Bool bStrict ) throw(::com::sun::star::uno::RuntimeException)
4797 {
4798     VCLXFormattedSpinField::setStrictFormat( bStrict );
4799 }
4800 
4801 sal_Bool VCLXDateField::isStrictFormat() throw(::com::sun::star::uno::RuntimeException)
4802 {
4803     return VCLXFormattedSpinField::isStrictFormat();
4804 }
4805 
4806 
4807 //  ----------------------------------------------------
4808 //  class VCLXTimeField
4809 //  ----------------------------------------------------
4810 
4811 void VCLXTimeField::ImplGetPropertyIds( std::list< sal_uInt16 > &rIds )
4812 {
4813     PushPropertyIds( rIds,
4814                      BASEPROPERTY_ALIGN,
4815                      BASEPROPERTY_BACKGROUNDCOLOR,
4816                      BASEPROPERTY_BORDER,
4817                      BASEPROPERTY_BORDERCOLOR,
4818                      BASEPROPERTY_DEFAULTCONTROL,
4819                      BASEPROPERTY_ENABLED,
4820                      BASEPROPERTY_ENABLEVISIBLE,
4821                      BASEPROPERTY_EXTTIMEFORMAT,
4822                      BASEPROPERTY_FONTDESCRIPTOR,
4823                      BASEPROPERTY_HELPTEXT,
4824                      BASEPROPERTY_HELPURL,
4825                      BASEPROPERTY_PRINTABLE,
4826                      BASEPROPERTY_READONLY,
4827                      BASEPROPERTY_REPEAT,
4828                      BASEPROPERTY_REPEAT_DELAY,
4829                      BASEPROPERTY_SPIN,
4830                      BASEPROPERTY_STRICTFORMAT,
4831                      BASEPROPERTY_TABSTOP,
4832                      BASEPROPERTY_TIME,
4833                      BASEPROPERTY_TIMEMAX,
4834                      BASEPROPERTY_TIMEMIN,
4835                      BASEPROPERTY_ENFORCE_FORMAT,
4836                      BASEPROPERTY_TEXT,
4837                      BASEPROPERTY_HIDEINACTIVESELECTION,
4838                      BASEPROPERTY_VERTICALALIGN,
4839                      BASEPROPERTY_WRITING_MODE,
4840                      BASEPROPERTY_CONTEXT_WRITING_MODE,
4841                      BASEPROPERTY_MOUSE_WHEEL_BEHAVIOUR,
4842                      0);
4843     VCLXFormattedSpinField::ImplGetPropertyIds( rIds );
4844 }
4845 
4846 VCLXTimeField::VCLXTimeField()
4847 {
4848 }
4849 
4850 VCLXTimeField::~VCLXTimeField()
4851 {
4852 }
4853 
4854 // ::com::sun::star::uno::XInterface
4855 ::com::sun::star::uno::Any VCLXTimeField::queryInterface( const ::com::sun::star::uno::Type & rType ) throw(::com::sun::star::uno::RuntimeException)
4856 {
4857     ::com::sun::star::uno::Any aRet = ::cppu::queryInterface( rType,
4858                                         SAL_STATIC_CAST( ::com::sun::star::awt::XTimeField*, this ) );
4859     return (aRet.hasValue() ? aRet : VCLXFormattedSpinField::queryInterface( rType ));
4860 }
4861 
4862 // ::com::sun::star::lang::XTypeProvider
4863 IMPL_XTYPEPROVIDER_START( VCLXTimeField )
4864     getCppuType( ( ::com::sun::star::uno::Reference< ::com::sun::star::awt::XTimeField>* ) NULL ),
4865     VCLXFormattedSpinField::getTypes()
4866 IMPL_XTYPEPROVIDER_END
4867 
4868 void VCLXTimeField::setTime( sal_Int32 nTime ) throw(::com::sun::star::uno::RuntimeException)
4869 {
4870     ::vos::OGuard aGuard( GetMutex() );
4871 
4872     TimeField* pTimeField = (TimeField*) GetWindow();
4873     if ( pTimeField )
4874     {
4875         pTimeField->SetTime( nTime );
4876 
4877         // #107218# Call same listeners like VCL would do after user interaction
4878         SetSynthesizingVCLEvent( sal_True );
4879         pTimeField->SetModifyFlag();
4880         pTimeField->Modify();
4881         SetSynthesizingVCLEvent( sal_False );
4882     }
4883 }
4884 
4885 sal_Int32 VCLXTimeField::getTime() throw(::com::sun::star::uno::RuntimeException)
4886 {
4887     ::vos::OGuard aGuard( GetMutex() );
4888 
4889     sal_Int32 nTime = 0;
4890     TimeField* pTimeField = (TimeField*) GetWindow();
4891     if ( pTimeField )
4892         nTime = pTimeField->GetTime().GetTime();
4893 
4894     return nTime;
4895 }
4896 
4897 void VCLXTimeField::setMin( sal_Int32 nTime ) throw(::com::sun::star::uno::RuntimeException)
4898 {
4899     ::vos::OGuard aGuard( GetMutex() );
4900 
4901     TimeField* pTimeField = (TimeField*) GetWindow();
4902     if ( pTimeField )
4903         pTimeField->SetMin( nTime );
4904 }
4905 
4906 sal_Int32 VCLXTimeField::getMin() throw(::com::sun::star::uno::RuntimeException)
4907 {
4908     ::vos::OGuard aGuard( GetMutex() );
4909 
4910     sal_Int32 nTime = 0;
4911     TimeField* pTimeField = (TimeField*) GetWindow();
4912     if ( pTimeField )
4913         nTime = pTimeField->GetMin().GetTime();
4914 
4915     return nTime;
4916 }
4917 
4918 void VCLXTimeField::setMax( sal_Int32 nTime ) throw(::com::sun::star::uno::RuntimeException)
4919 {
4920     ::vos::OGuard aGuard( GetMutex() );
4921 
4922     TimeField* pTimeField = (TimeField*) GetWindow();
4923     if ( pTimeField )
4924         pTimeField->SetMax( nTime );
4925 }
4926 
4927 sal_Int32 VCLXTimeField::getMax() throw(::com::sun::star::uno::RuntimeException)
4928 {
4929     ::vos::OGuard aGuard( GetMutex() );
4930 
4931     sal_Int32 nTime = 0;
4932     TimeField* pTimeField = (TimeField*) GetWindow();
4933     if ( pTimeField )
4934         nTime = pTimeField->GetMax().GetTime();
4935 
4936     return nTime;
4937 }
4938 
4939 void VCLXTimeField::setFirst( sal_Int32 nTime ) throw(::com::sun::star::uno::RuntimeException)
4940 {
4941     ::vos::OGuard aGuard( GetMutex() );
4942 
4943     TimeField* pTimeField = (TimeField*) GetWindow();
4944     if ( pTimeField )
4945         pTimeField->SetFirst( nTime );
4946 }
4947 
4948 sal_Int32 VCLXTimeField::getFirst() throw(::com::sun::star::uno::RuntimeException)
4949 {
4950     ::vos::OGuard aGuard( GetMutex() );
4951 
4952     sal_Int32 nTime = 0;
4953     TimeField* pTimeField = (TimeField*) GetWindow();
4954     if ( pTimeField )
4955         nTime = pTimeField->GetFirst().GetTime();
4956 
4957     return nTime;
4958 }
4959 
4960 void VCLXTimeField::setLast( sal_Int32 nTime ) throw(::com::sun::star::uno::RuntimeException)
4961 {
4962     ::vos::OGuard aGuard( GetMutex() );
4963 
4964     TimeField* pTimeField = (TimeField*) GetWindow();
4965     if ( pTimeField )
4966         pTimeField->SetLast( nTime );
4967 }
4968 
4969 sal_Int32 VCLXTimeField::getLast() throw(::com::sun::star::uno::RuntimeException)
4970 {
4971     ::vos::OGuard aGuard( GetMutex() );
4972 
4973     sal_Int32 nTime = 0;
4974     TimeField* pTimeField = (TimeField*) GetWindow();
4975     if ( pTimeField )
4976         nTime = pTimeField->GetLast().GetTime();
4977 
4978     return nTime;
4979 }
4980 
4981 void VCLXTimeField::setEmpty() throw(::com::sun::star::uno::RuntimeException)
4982 {
4983     ::vos::OGuard aGuard( GetMutex() );
4984 
4985     TimeField* pTimeField = (TimeField*) GetWindow();
4986     if ( pTimeField )
4987         pTimeField->SetEmptyTime();
4988 }
4989 
4990 sal_Bool VCLXTimeField::isEmpty() throw(::com::sun::star::uno::RuntimeException)
4991 {
4992     ::vos::OGuard aGuard( GetMutex() );
4993 
4994     TimeField* pTimeField = (TimeField*) GetWindow();
4995     return pTimeField ? pTimeField->IsEmptyTime() : sal_False;
4996 }
4997 
4998 void VCLXTimeField::setStrictFormat( sal_Bool bStrict ) throw(::com::sun::star::uno::RuntimeException)
4999 {
5000     VCLXFormattedSpinField::setStrictFormat( bStrict );
5001 }
5002 
5003 sal_Bool VCLXTimeField::isStrictFormat() throw(::com::sun::star::uno::RuntimeException)
5004 {
5005     return VCLXFormattedSpinField::isStrictFormat();
5006 }
5007 
5008 
5009 void VCLXTimeField::setProperty( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Any& Value) throw(::com::sun::star::uno::RuntimeException)
5010 {
5011     ::vos::OGuard aGuard( GetMutex() );
5012 
5013     if ( GetWindow() )
5014     {
5015         sal_Bool bVoid = Value.getValueType().getTypeClass() == ::com::sun::star::uno::TypeClass_VOID;
5016 
5017         sal_uInt16 nPropType = GetPropertyId( PropertyName );
5018         switch ( nPropType )
5019         {
5020             case BASEPROPERTY_TIME:
5021             {
5022                 if ( bVoid )
5023                 {
5024                     ((TimeField*)GetWindow())->EnableEmptyFieldValue( sal_True );
5025                     ((TimeField*)GetWindow())->SetEmptyFieldValue();
5026                 }
5027                 else
5028                 {
5029                     sal_Int32 n = 0;
5030                     if ( Value >>= n )
5031                         setTime( n );
5032                 }
5033             }
5034             break;
5035             case BASEPROPERTY_TIMEMIN:
5036             {
5037                 sal_Int32 n = 0;
5038                 if ( Value >>= n )
5039                     setMin( n );
5040             }
5041             break;
5042             case BASEPROPERTY_TIMEMAX:
5043             {
5044                 sal_Int32 n = 0;
5045                 if ( Value >>= n )
5046                     setMax( n );
5047             }
5048             break;
5049             case BASEPROPERTY_EXTTIMEFORMAT:
5050             {
5051                 sal_Int16 n = sal_Int16();
5052                 if ( Value >>= n )
5053                     ((TimeField*)GetWindow())->SetExtFormat( (ExtTimeFieldFormat) n );
5054             }
5055             break;
5056             case BASEPROPERTY_ENFORCE_FORMAT:
5057             {
5058                 sal_Bool bEnforce( sal_True );
5059                 OSL_VERIFY( Value >>= bEnforce );
5060                 static_cast< TimeField* >( GetWindow() )->EnforceValidValue( bEnforce );
5061             }
5062             break;
5063             default:
5064             {
5065                 VCLXFormattedSpinField::setProperty( PropertyName, Value );
5066             }
5067         }
5068     }
5069 }
5070 
5071 ::com::sun::star::uno::Any VCLXTimeField::getProperty( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::uno::RuntimeException)
5072 {
5073     ::vos::OGuard aGuard( GetMutex() );
5074 
5075     ::com::sun::star::uno::Any aProp;
5076     if ( GetWindow() )
5077     {
5078         sal_uInt16 nPropType = GetPropertyId( PropertyName );
5079         switch ( nPropType )
5080         {
5081             case BASEPROPERTY_TIME:
5082             {
5083                 aProp <<= (sal_Int32) getTime();
5084             }
5085             break;
5086             case BASEPROPERTY_TIMEMIN:
5087             {
5088                 aProp <<= (sal_Int32) getMin();
5089             }
5090             break;
5091             case BASEPROPERTY_TIMEMAX:
5092             {
5093                 aProp <<= (sal_Int32) getMax();
5094             }
5095             break;
5096             case BASEPROPERTY_ENFORCE_FORMAT:
5097             {
5098                 aProp <<= (sal_Bool)static_cast< TimeField* >( GetWindow() )->IsEnforceValidValue( );
5099             }
5100             break;
5101             default:
5102             {
5103                 aProp <<= VCLXFormattedSpinField::getProperty( PropertyName );
5104             }
5105         }
5106     }
5107     return aProp;
5108 }
5109 
5110 //  ----------------------------------------------------
5111 //  class VCLXNumericField
5112 //  ----------------------------------------------------
5113 
5114 void VCLXNumericField::ImplGetPropertyIds( std::list< sal_uInt16 > &rIds )
5115 {
5116     PushPropertyIds( rIds,
5117                      BASEPROPERTY_ALIGN,
5118                      BASEPROPERTY_BACKGROUNDCOLOR,
5119                      BASEPROPERTY_BORDER,
5120                      BASEPROPERTY_BORDERCOLOR,
5121                      BASEPROPERTY_DECIMALACCURACY,
5122                      BASEPROPERTY_DEFAULTCONTROL,
5123                      BASEPROPERTY_ENABLED,
5124                      BASEPROPERTY_ENABLEVISIBLE,
5125                      BASEPROPERTY_FONTDESCRIPTOR,
5126                      BASEPROPERTY_HELPTEXT,
5127                      BASEPROPERTY_HELPURL,
5128                      BASEPROPERTY_NUMSHOWTHOUSANDSEP,
5129                      BASEPROPERTY_PRINTABLE,
5130                      BASEPROPERTY_READONLY,
5131                      BASEPROPERTY_REPEAT,
5132                      BASEPROPERTY_REPEAT_DELAY,
5133                      BASEPROPERTY_SPIN,
5134                      BASEPROPERTY_STRICTFORMAT,
5135                      BASEPROPERTY_TABSTOP,
5136                      BASEPROPERTY_VALUEMAX_DOUBLE,
5137                      BASEPROPERTY_VALUEMIN_DOUBLE,
5138                      BASEPROPERTY_VALUESTEP_DOUBLE,
5139                      BASEPROPERTY_VALUE_DOUBLE,
5140                      BASEPROPERTY_ENFORCE_FORMAT,
5141                      BASEPROPERTY_HIDEINACTIVESELECTION,
5142                      BASEPROPERTY_VERTICALALIGN,
5143                      BASEPROPERTY_WRITING_MODE,
5144                      BASEPROPERTY_CONTEXT_WRITING_MODE,
5145                      BASEPROPERTY_MOUSE_WHEEL_BEHAVIOUR,
5146                      0);
5147     VCLXFormattedSpinField::ImplGetPropertyIds( rIds );
5148 }
5149 
5150 VCLXNumericField::VCLXNumericField()
5151 {
5152 }
5153 
5154 VCLXNumericField::~VCLXNumericField()
5155 {
5156 }
5157 
5158 // ::com::sun::star::uno::XInterface
5159 ::com::sun::star::uno::Any VCLXNumericField::queryInterface( const ::com::sun::star::uno::Type & rType ) throw(::com::sun::star::uno::RuntimeException)
5160 {
5161     ::com::sun::star::uno::Any aRet = ::cppu::queryInterface( rType,
5162                                         SAL_STATIC_CAST( ::com::sun::star::awt::XNumericField*, this ) );
5163     return (aRet.hasValue() ? aRet : VCLXFormattedSpinField::queryInterface( rType ));
5164 }
5165 
5166 // ::com::sun::star::lang::XTypeProvider
5167 IMPL_XTYPEPROVIDER_START( VCLXNumericField )
5168     getCppuType( ( ::com::sun::star::uno::Reference< ::com::sun::star::awt::XNumericField>* ) NULL ),
5169     VCLXFormattedSpinField::getTypes()
5170 IMPL_XTYPEPROVIDER_END
5171 
5172 void VCLXNumericField::setValue( double Value ) throw(::com::sun::star::uno::RuntimeException)
5173 {
5174     ::vos::OGuard aGuard( GetMutex() );
5175 
5176     NumericFormatter* pNumericFormatter = (NumericFormatter*) GetFormatter();
5177     if ( pNumericFormatter )
5178     {
5179         // z.B. 105, 2 Digits => 1,05
5180         // ein float 1,05 muss also eine 105 einstellen...
5181         pNumericFormatter->SetValue(
5182             (long)ImplCalcLongValue( Value, pNumericFormatter->GetDecimalDigits() ) );
5183 
5184         // #107218# Call same listeners like VCL would do after user interaction
5185         Edit* pEdit = (Edit*)GetWindow();
5186         if ( pEdit )
5187         {
5188             SetSynthesizingVCLEvent( sal_True );
5189             pEdit->SetModifyFlag();
5190             pEdit->Modify();
5191             SetSynthesizingVCLEvent( sal_False );
5192         }
5193     }
5194 }
5195 
5196 double VCLXNumericField::getValue() throw(::com::sun::star::uno::RuntimeException)
5197 {
5198     ::vos::OGuard aGuard( GetMutex() );
5199 
5200     NumericFormatter* pNumericFormatter = (NumericFormatter*) GetFormatter();
5201     return pNumericFormatter
5202         ? ImplCalcDoubleValue( (double)pNumericFormatter->GetValue(), pNumericFormatter->GetDecimalDigits() )
5203         : 0;
5204 }
5205 
5206 void VCLXNumericField::setMin( double Value ) throw(::com::sun::star::uno::RuntimeException)
5207 {
5208     ::vos::OGuard aGuard( GetMutex() );
5209 
5210     NumericFormatter* pNumericFormatter = (NumericFormatter*) GetFormatter();
5211     if ( pNumericFormatter )
5212         pNumericFormatter->SetMin(
5213             (long)ImplCalcLongValue( Value, pNumericFormatter->GetDecimalDigits() ) );
5214 }
5215 
5216 double VCLXNumericField::getMin() throw(::com::sun::star::uno::RuntimeException)
5217 {
5218     ::vos::OGuard aGuard( GetMutex() );
5219 
5220     NumericFormatter* pNumericFormatter = (NumericFormatter*) GetFormatter();
5221     return pNumericFormatter
5222         ? ImplCalcDoubleValue( (double)pNumericFormatter->GetMin(), pNumericFormatter->GetDecimalDigits() )
5223         : 0;
5224 }
5225 
5226 void VCLXNumericField::setMax( double Value ) throw(::com::sun::star::uno::RuntimeException)
5227 {
5228     ::vos::OGuard aGuard( GetMutex() );
5229 
5230     NumericFormatter* pNumericFormatter = (NumericFormatter*) GetFormatter();
5231     if ( pNumericFormatter )
5232         pNumericFormatter->SetMax(
5233             (long)ImplCalcLongValue( Value, pNumericFormatter->GetDecimalDigits() ) );
5234 }
5235 
5236 double VCLXNumericField::getMax() throw(::com::sun::star::uno::RuntimeException)
5237 {
5238     ::vos::OGuard aGuard( GetMutex() );
5239 
5240     NumericFormatter* pNumericFormatter = (NumericFormatter*) GetFormatter();
5241     return pNumericFormatter
5242         ? ImplCalcDoubleValue( (double)pNumericFormatter->GetMax(), pNumericFormatter->GetDecimalDigits() )
5243         : 0;
5244 }
5245 
5246 void VCLXNumericField::setFirst( double Value ) throw(::com::sun::star::uno::RuntimeException)
5247 {
5248     ::vos::OGuard aGuard( GetMutex() );
5249 
5250     NumericField* pNumericField = (NumericField*) GetWindow();
5251     if ( pNumericField )
5252         pNumericField->SetFirst(
5253             (long)ImplCalcLongValue( Value, pNumericField->GetDecimalDigits() ) );
5254 }
5255 
5256 double VCLXNumericField::getFirst() throw(::com::sun::star::uno::RuntimeException)
5257 {
5258     ::vos::OGuard aGuard( GetMutex() );
5259 
5260     NumericField* pNumericField = (NumericField*) GetWindow();
5261     return pNumericField
5262         ? ImplCalcDoubleValue( (double)pNumericField->GetFirst(), pNumericField->GetDecimalDigits() )
5263         : 0;
5264 }
5265 
5266 void VCLXNumericField::setLast( double Value ) throw(::com::sun::star::uno::RuntimeException)
5267 {
5268     ::vos::OGuard aGuard( GetMutex() );
5269 
5270     NumericField* pNumericField = (NumericField*) GetWindow();
5271     if ( pNumericField )
5272         pNumericField->SetLast(
5273             (long)ImplCalcLongValue( Value, pNumericField->GetDecimalDigits() ) );
5274 }
5275 
5276 double VCLXNumericField::getLast() throw(::com::sun::star::uno::RuntimeException)
5277 {
5278     ::vos::OGuard aGuard( GetMutex() );
5279 
5280     NumericField* pNumericField = (NumericField*) GetWindow();
5281     return pNumericField
5282         ? ImplCalcDoubleValue( (double)pNumericField->GetLast(), pNumericField->GetDecimalDigits() )
5283         : 0;
5284 }
5285 
5286 void VCLXNumericField::setStrictFormat( sal_Bool bStrict ) throw(::com::sun::star::uno::RuntimeException)
5287 {
5288     VCLXFormattedSpinField::setStrictFormat( bStrict );
5289 }
5290 
5291 sal_Bool VCLXNumericField::isStrictFormat() throw(::com::sun::star::uno::RuntimeException)
5292 {
5293     return VCLXFormattedSpinField::isStrictFormat();
5294 }
5295 
5296 
5297 void VCLXNumericField::setSpinSize( double Value ) throw(::com::sun::star::uno::RuntimeException)
5298 {
5299     ::vos::OGuard aGuard( GetMutex() );
5300 
5301     NumericField* pNumericField = (NumericField*) GetWindow();
5302     if ( pNumericField )
5303         pNumericField->SetSpinSize(
5304             (long)ImplCalcLongValue( Value, pNumericField->GetDecimalDigits() ) );
5305 }
5306 
5307 double VCLXNumericField::getSpinSize() throw(::com::sun::star::uno::RuntimeException)
5308 {
5309     ::vos::OGuard aGuard( GetMutex() );
5310 
5311     NumericField* pNumericField = (NumericField*) GetWindow();
5312     return pNumericField
5313         ? ImplCalcDoubleValue( (double)pNumericField->GetSpinSize(), pNumericField->GetDecimalDigits() )
5314         : 0;
5315 }
5316 
5317 void VCLXNumericField::setDecimalDigits( sal_Int16 Value ) throw(::com::sun::star::uno::RuntimeException)
5318 {
5319     ::vos::OGuard aGuard( GetMutex() );
5320 
5321     NumericFormatter* pNumericFormatter = (NumericFormatter*) GetFormatter();
5322     if ( pNumericFormatter )
5323     {
5324         double n = getValue();
5325         pNumericFormatter->SetDecimalDigits( Value );
5326         setValue( n );
5327     }
5328 }
5329 
5330 sal_Int16 VCLXNumericField::getDecimalDigits() throw(::com::sun::star::uno::RuntimeException)
5331 {
5332     ::vos::OGuard aGuard( GetMutex() );
5333 
5334     NumericFormatter* pNumericFormatter = (NumericFormatter*) GetFormatter();
5335     return pNumericFormatter ? pNumericFormatter->GetDecimalDigits() : 0;
5336 }
5337 
5338 void VCLXNumericField::setProperty( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Any& Value) throw(::com::sun::star::uno::RuntimeException)
5339 {
5340     ::vos::OGuard aGuard( GetMutex() );
5341 
5342     if ( GetWindow() )
5343     {
5344         sal_Bool bVoid = Value.getValueType().getTypeClass() == ::com::sun::star::uno::TypeClass_VOID;
5345 
5346         sal_uInt16 nPropType = GetPropertyId( PropertyName );
5347         switch ( nPropType )
5348         {
5349             case BASEPROPERTY_VALUE_DOUBLE:
5350             {
5351                 if ( bVoid )
5352                 {
5353                     ((NumericField*)GetWindow())->EnableEmptyFieldValue( sal_True );
5354                     ((NumericField*)GetWindow())->SetEmptyFieldValue();
5355                 }
5356                 else
5357                 {
5358                     double d = 0;
5359                     if ( Value >>= d )
5360                         setValue( d );
5361                 }
5362             }
5363             break;
5364             case BASEPROPERTY_VALUEMIN_DOUBLE:
5365             {
5366                 double d = 0;
5367                 if ( Value >>= d )
5368                     setMin( d );
5369             }
5370             break;
5371             case BASEPROPERTY_VALUEMAX_DOUBLE:
5372             {
5373                 double d = 0;
5374                 if ( Value >>= d )
5375                     setMax( d );
5376             }
5377             break;
5378             case BASEPROPERTY_VALUESTEP_DOUBLE:
5379             {
5380                 double d = 0;
5381                 if ( Value >>= d )
5382                     setSpinSize( d );
5383             }
5384             break;
5385             case BASEPROPERTY_DECIMALACCURACY:
5386             {
5387                 sal_Int16 n = sal_Int16();
5388                 if ( Value >>= n )
5389                     setDecimalDigits( n );
5390             }
5391             break;
5392             case BASEPROPERTY_NUMSHOWTHOUSANDSEP:
5393             {
5394                 sal_Bool b = sal_Bool();
5395                 if ( Value >>= b )
5396                     ((NumericField*)GetWindow())->SetUseThousandSep( b );
5397             }
5398             break;
5399             default:
5400             {
5401                 VCLXFormattedSpinField::setProperty( PropertyName, Value );
5402             }
5403         }
5404     }
5405 }
5406 
5407 ::com::sun::star::uno::Any VCLXNumericField::getProperty( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::uno::RuntimeException)
5408 {
5409     ::vos::OGuard aGuard( GetMutex() );
5410 
5411     ::com::sun::star::uno::Any aProp;
5412     FormatterBase* pFormatter = GetFormatter();
5413     if ( pFormatter )
5414     {
5415         sal_uInt16 nPropType = GetPropertyId( PropertyName );
5416         switch ( nPropType )
5417         {
5418             case BASEPROPERTY_VALUE_DOUBLE:
5419             {
5420                 aProp <<= (double) getValue();
5421             }
5422             break;
5423             case BASEPROPERTY_VALUEMIN_DOUBLE:
5424             {
5425                 aProp <<= (double) getMin();
5426             }
5427             break;
5428             case BASEPROPERTY_VALUEMAX_DOUBLE:
5429             {
5430                 aProp <<= (double) getMax();
5431             }
5432             break;
5433             case BASEPROPERTY_VALUESTEP_DOUBLE:
5434             {
5435                 aProp <<= (double) getSpinSize();
5436             }
5437             break;
5438             case BASEPROPERTY_NUMSHOWTHOUSANDSEP:
5439             {
5440                 aProp <<= (sal_Bool) ((NumericField*)GetWindow())->IsUseThousandSep();
5441             }
5442             break;
5443             default:
5444             {
5445                 aProp <<= VCLXFormattedSpinField::getProperty( PropertyName );
5446             }
5447         }
5448     }
5449     return aProp;
5450 }
5451 
5452 
5453 //    ----------------------------------------------------
5454 //    class VCLXMetricField
5455 //    ----------------------------------------------------
5456 
5457 void VCLXMetricField::ImplGetPropertyIds( std::list< sal_uInt16 > &rIds )
5458 {
5459     PushPropertyIds( rIds,
5460                      BASEPROPERTY_ALIGN,
5461                      BASEPROPERTY_BACKGROUNDCOLOR,
5462                      BASEPROPERTY_BORDER,
5463                      BASEPROPERTY_BORDERCOLOR,
5464                      BASEPROPERTY_DECIMALACCURACY,
5465                      BASEPROPERTY_DEFAULTCONTROL,
5466                      BASEPROPERTY_ENABLED,
5467                      BASEPROPERTY_ENABLEVISIBLE,
5468                      BASEPROPERTY_FONTDESCRIPTOR,
5469                      BASEPROPERTY_HELPTEXT,
5470                      BASEPROPERTY_HELPURL,
5471                      BASEPROPERTY_NUMSHOWTHOUSANDSEP,
5472                      BASEPROPERTY_PRINTABLE,
5473                      BASEPROPERTY_READONLY,
5474                      BASEPROPERTY_REPEAT,
5475                      BASEPROPERTY_REPEAT_DELAY,
5476                      BASEPROPERTY_SPIN,
5477                      BASEPROPERTY_STRICTFORMAT,
5478                      BASEPROPERTY_TABSTOP,
5479                      BASEPROPERTY_ENFORCE_FORMAT,
5480                      BASEPROPERTY_HIDEINACTIVESELECTION,
5481                      BASEPROPERTY_UNIT,
5482                      BASEPROPERTY_CUSTOMUNITTEXT,
5483                      BASEPROPERTY_WRITING_MODE,
5484                      BASEPROPERTY_CONTEXT_WRITING_MODE,
5485                      BASEPROPERTY_MOUSE_WHEEL_BEHAVIOUR,
5486                      0);
5487     VCLXFormattedSpinField::ImplGetPropertyIds( rIds );
5488 }
5489 
5490 VCLXMetricField::VCLXMetricField()
5491 {
5492 }
5493 
5494 VCLXMetricField::~VCLXMetricField()
5495 {
5496 }
5497 
5498 MetricFormatter *VCLXMetricField::GetMetricFormatter() throw(::com::sun::star::uno::RuntimeException)
5499 {
5500     MetricFormatter *pFormatter = (MetricFormatter *) GetFormatter();
5501     if (!pFormatter)
5502         throw ::com::sun::star::uno::RuntimeException();
5503     return pFormatter;
5504 }
5505 
5506 MetricField *VCLXMetricField::GetMetricField() throw(::com::sun::star::uno::RuntimeException)
5507 {
5508     MetricField *pField = (MetricField *) GetWindow();
5509     if (!pField)
5510         throw ::com::sun::star::uno::RuntimeException();
5511     return pField;
5512 }
5513 
5514 // ::com::sun::star::uno::XInterface
5515 ::com::sun::star::uno::Any VCLXMetricField::queryInterface( const ::com::sun::star::uno::Type & rType ) throw(::com::sun::star::uno::RuntimeException)
5516 {
5517     ::com::sun::star::uno::Any aRet = ::cppu::queryInterface( rType,
5518                                                               SAL_STATIC_CAST( ::com::sun::star::awt::XMetricField*, this ) );
5519     return (aRet.hasValue() ? aRet : VCLXFormattedSpinField::queryInterface( rType ));
5520 }
5521 
5522 // ::com::sun::star::lang::XTypeProvider
5523 IMPL_XTYPEPROVIDER_START( VCLXMetricField )
5524     getCppuType( ( ::com::sun::star::uno::Reference< ::com::sun::star::awt::XMetricField>* ) NULL ),
5525     VCLXFormattedSpinField::getTypes()
5526 IMPL_XTYPEPROVIDER_END
5527 
5528 // FIXME: later ...
5529 #define MetricUnitUnoToVcl(a) ((FieldUnit)(a))
5530 
5531 #define METRIC_MAP_PAIR(method,parent) \
5532     sal_Int64 VCLXMetricField::get##method( sal_Int16 nUnit ) throw (::com::sun::star::uno::RuntimeException) \
5533     { \
5534         ::vos::OGuard aGuard( GetMutex() ); \
5535         return GetMetric##parent()->Get##method( MetricUnitUnoToVcl( nUnit ) ); \
5536     } \
5537     void VCLXMetricField::set##method( sal_Int64 nValue, sal_Int16 nUnit ) throw (::com::sun::star::uno::RuntimeException) \
5538     { \
5539         ::vos::OGuard aGuard( GetMutex() ); \
5540         GetMetric##parent()->Set##method( nValue, MetricUnitUnoToVcl( nUnit ) ); \
5541     }
5542 
5543 METRIC_MAP_PAIR(Min, Formatter)
5544 METRIC_MAP_PAIR(Max, Formatter)
5545 METRIC_MAP_PAIR(First, Field)
5546 METRIC_MAP_PAIR(Last,  Field)
5547 
5548 #undef METRIC_MAP_PAIR
5549 
5550 ::sal_Int64 VCLXMetricField::getValue( ::sal_Int16 nUnit ) throw (::com::sun::star::uno::RuntimeException)
5551 {
5552     ::vos::OGuard aGuard( GetMutex() );
5553     return GetMetricFormatter()->GetValue( MetricUnitUnoToVcl( nUnit ) );
5554 }
5555 
5556 ::sal_Int64 VCLXMetricField::getCorrectedValue( ::sal_Int16 nUnit ) throw (::com::sun::star::uno::RuntimeException)
5557 {
5558     ::vos::OGuard aGuard( GetMutex() );
5559     return GetMetricFormatter()->GetCorrectedValue( MetricUnitUnoToVcl( nUnit ) );
5560 }
5561 
5562 // FIXME: acute cut/paste evilness - move this to the parent Edit class ?
5563 void VCLXMetricField::CallListeners()
5564 {
5565     // #107218# Call same listeners like VCL would do after user interaction
5566     Edit* pEdit = (Edit*)GetWindow();
5567     if ( pEdit )
5568     {
5569         SetSynthesizingVCLEvent( sal_True );
5570         pEdit->SetModifyFlag();
5571         pEdit->Modify();
5572         SetSynthesizingVCLEvent( sal_False );
5573     }
5574 }
5575 
5576 void VCLXMetricField::setValue( ::sal_Int64 Value, ::sal_Int16 Unit ) throw (::com::sun::star::uno::RuntimeException)
5577 {
5578     ::vos::OGuard aGuard( GetMutex() );
5579     GetMetricFormatter()->SetValue( Value, MetricUnitUnoToVcl( Unit ) );
5580     CallListeners();
5581 }
5582 
5583 void VCLXMetricField::setUserValue( ::sal_Int64 Value, ::sal_Int16 Unit ) throw (::com::sun::star::uno::RuntimeException)
5584 {
5585     ::vos::OGuard aGuard( GetMutex() );
5586     GetMetricFormatter()->SetUserValue( Value, MetricUnitUnoToVcl( Unit ) );
5587     CallListeners();
5588 }
5589 
5590 void VCLXMetricField::setStrictFormat( sal_Bool bStrict ) throw(::com::sun::star::uno::RuntimeException)
5591 {
5592     VCLXFormattedSpinField::setStrictFormat( bStrict );
5593 }
5594 
5595 sal_Bool VCLXMetricField::isStrictFormat() throw(::com::sun::star::uno::RuntimeException)
5596 {
5597     return VCLXFormattedSpinField::isStrictFormat();
5598 }
5599 
5600 void VCLXMetricField::setSpinSize( sal_Int64 Value ) throw(::com::sun::star::uno::RuntimeException)
5601 {
5602     ::vos::OGuard aGuard( GetMutex() );
5603     GetMetricField()->SetSpinSize( Value );
5604 }
5605 
5606 sal_Int64 VCLXMetricField::getSpinSize() throw(::com::sun::star::uno::RuntimeException)
5607 {
5608     ::vos::OGuard aGuard( GetMutex() );
5609     return GetMetricField()->GetSpinSize();
5610 }
5611 
5612 void VCLXMetricField::setDecimalDigits( sal_Int16 Value ) throw(::com::sun::star::uno::RuntimeException)
5613 {
5614     ::vos::OGuard aGuard( GetMutex() );
5615     GetMetricFormatter()->SetDecimalDigits( Value );
5616 }
5617 
5618 sal_Int16 VCLXMetricField::getDecimalDigits() throw(::com::sun::star::uno::RuntimeException)
5619 {
5620     ::vos::OGuard aGuard( GetMutex() );
5621 
5622     NumericFormatter* pNumericFormatter = (NumericFormatter*) GetFormatter();
5623     return pNumericFormatter ? pNumericFormatter->GetDecimalDigits() : 0;
5624 }
5625 
5626 void VCLXMetricField::setProperty( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Any& Value) throw(::com::sun::star::uno::RuntimeException)
5627 {
5628     ::vos::OGuard aGuard( GetMutex() );
5629 
5630     if ( GetWindow() )
5631     {
5632         sal_uInt16 nPropType = GetPropertyId( PropertyName );
5633         switch ( nPropType )
5634         {
5635             case BASEPROPERTY_DECIMALACCURACY:
5636             {
5637                 sal_Int16 n = 0;
5638                 if ( Value >>= n )
5639                      setDecimalDigits( n );
5640                 break;
5641             }
5642             case BASEPROPERTY_NUMSHOWTHOUSANDSEP:
5643             {
5644                 sal_Bool b = sal_False;
5645                 if ( Value >>= b )
5646                      ((NumericField*)GetWindow())->SetUseThousandSep( b );
5647             }
5648             break;
5649             case BASEPROPERTY_UNIT:
5650             {
5651                 sal_uInt16 nVal = 0;
5652                 if ( Value >>= nVal )
5653                     ((MetricField*)GetWindow())->SetUnit( (FieldUnit) nVal );
5654                 break;
5655             }
5656             case BASEPROPERTY_CUSTOMUNITTEXT:
5657             {
5658                 rtl::OUString aStr;
5659                 if ( Value >>= aStr )
5660                     ((MetricField*)GetWindow())->SetCustomUnitText( aStr );
5661                 break;
5662             }
5663             default:
5664             {
5665                 VCLXFormattedSpinField::setProperty( PropertyName, Value );
5666                 break;
5667             }
5668         }
5669     }
5670 }
5671 
5672 ::com::sun::star::uno::Any VCLXMetricField::getProperty( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::uno::RuntimeException)
5673 {
5674     ::vos::OGuard aGuard( GetMutex() );
5675 
5676     ::com::sun::star::uno::Any aProp;
5677     FormatterBase* pFormatter = GetFormatter();
5678     if ( pFormatter )
5679     {
5680         sal_uInt16 nPropType = GetPropertyId( PropertyName );
5681         switch ( nPropType )
5682         {
5683             case BASEPROPERTY_NUMSHOWTHOUSANDSEP:
5684                 aProp <<= (sal_Bool) ((NumericField*)GetWindow())->IsUseThousandSep();
5685                 break;
5686             case BASEPROPERTY_UNIT:
5687                 aProp <<= (sal_uInt16) ((MetricField*)GetWindow())->GetUnit();
5688                 break;
5689             case BASEPROPERTY_CUSTOMUNITTEXT:
5690                 aProp <<= rtl::OUString (((MetricField*)GetWindow())->GetCustomUnitText());
5691                 break;
5692             default:
5693             {
5694                 aProp <<= VCLXFormattedSpinField::getProperty( PropertyName );
5695                 break;
5696             }
5697         }
5698     }
5699     return aProp;
5700 }
5701 
5702 
5703 //  ----------------------------------------------------
5704 //  class VCLXCurrencyField
5705 //  ----------------------------------------------------
5706 
5707 void VCLXCurrencyField::ImplGetPropertyIds( std::list< sal_uInt16 > &rIds )
5708 {
5709     PushPropertyIds( rIds,
5710                      BASEPROPERTY_ALIGN,
5711                      BASEPROPERTY_BACKGROUNDCOLOR,
5712                      BASEPROPERTY_BORDER,
5713                      BASEPROPERTY_BORDERCOLOR,
5714                      BASEPROPERTY_CURRENCYSYMBOL,
5715                      BASEPROPERTY_CURSYM_POSITION,
5716                      BASEPROPERTY_DECIMALACCURACY,
5717                      BASEPROPERTY_DEFAULTCONTROL,
5718                      BASEPROPERTY_ENABLED,
5719                      BASEPROPERTY_ENABLEVISIBLE,
5720                      BASEPROPERTY_FONTDESCRIPTOR,
5721                      BASEPROPERTY_HELPTEXT,
5722                      BASEPROPERTY_HELPURL,
5723                      BASEPROPERTY_NUMSHOWTHOUSANDSEP,
5724                      BASEPROPERTY_PRINTABLE,
5725                      BASEPROPERTY_READONLY,
5726                      BASEPROPERTY_REPEAT,
5727                      BASEPROPERTY_REPEAT_DELAY,
5728                      BASEPROPERTY_SPIN,
5729                      BASEPROPERTY_STRICTFORMAT,
5730                      BASEPROPERTY_TABSTOP,
5731                      BASEPROPERTY_VALUEMAX_DOUBLE,
5732                      BASEPROPERTY_VALUEMIN_DOUBLE,
5733                      BASEPROPERTY_VALUESTEP_DOUBLE,
5734                      BASEPROPERTY_VALUE_DOUBLE,
5735                      BASEPROPERTY_ENFORCE_FORMAT,
5736                      BASEPROPERTY_HIDEINACTIVESELECTION,
5737                      BASEPROPERTY_VERTICALALIGN,
5738                      BASEPROPERTY_WRITING_MODE,
5739                      BASEPROPERTY_CONTEXT_WRITING_MODE,
5740                      BASEPROPERTY_MOUSE_WHEEL_BEHAVIOUR,
5741                      0);
5742     VCLXFormattedSpinField::ImplGetPropertyIds( rIds );
5743 }
5744 
5745 VCLXCurrencyField::VCLXCurrencyField()
5746 {
5747 }
5748 
5749 VCLXCurrencyField::~VCLXCurrencyField()
5750 {
5751 }
5752 
5753 // ::com::sun::star::uno::XInterface
5754 ::com::sun::star::uno::Any VCLXCurrencyField::queryInterface( const ::com::sun::star::uno::Type & rType ) throw(::com::sun::star::uno::RuntimeException)
5755 {
5756     ::com::sun::star::uno::Any aRet = ::cppu::queryInterface( rType,
5757                                         SAL_STATIC_CAST( ::com::sun::star::awt::XCurrencyField*, this ) );
5758     return (aRet.hasValue() ? aRet : VCLXFormattedSpinField::queryInterface( rType ));
5759 }
5760 
5761 // ::com::sun::star::lang::XTypeProvider
5762 IMPL_XTYPEPROVIDER_START( VCLXCurrencyField )
5763     getCppuType( ( ::com::sun::star::uno::Reference< ::com::sun::star::awt::XCurrencyField>* ) NULL ),
5764     VCLXFormattedSpinField::getTypes()
5765 IMPL_XTYPEPROVIDER_END
5766 
5767 void VCLXCurrencyField::setValue( double Value ) throw(::com::sun::star::uno::RuntimeException)
5768 {
5769     ::vos::OGuard aGuard( GetMutex() );
5770 
5771     LongCurrencyFormatter* pCurrencyFormatter = (LongCurrencyFormatter*) GetFormatter();
5772     if ( pCurrencyFormatter )
5773     {
5774         // z.B. 105, 2 Digits => 1,05
5775         // ein float 1,05 muss also eine 105 einstellen...
5776         pCurrencyFormatter->SetValue(
5777             ImplCalcLongValue( Value, pCurrencyFormatter->GetDecimalDigits() ) );
5778 
5779         // #107218# Call same listeners like VCL would do after user interaction
5780         Edit* pEdit = (Edit*)GetWindow();
5781         if ( pEdit )
5782         {
5783             SetSynthesizingVCLEvent( sal_True );
5784             pEdit->SetModifyFlag();
5785             pEdit->Modify();
5786             SetSynthesizingVCLEvent( sal_False );
5787         }
5788     }
5789 }
5790 
5791 double VCLXCurrencyField::getValue() throw(::com::sun::star::uno::RuntimeException)
5792 {
5793     ::vos::OGuard aGuard( GetMutex() );
5794 
5795     LongCurrencyFormatter* pCurrencyFormatter = (LongCurrencyFormatter*) GetFormatter();
5796     return pCurrencyFormatter
5797         ? ImplCalcDoubleValue( (double)pCurrencyFormatter->GetValue(), pCurrencyFormatter->GetDecimalDigits() )
5798         : 0;
5799 }
5800 
5801 void VCLXCurrencyField::setMin( double Value ) throw(::com::sun::star::uno::RuntimeException)
5802 {
5803     ::vos::OGuard aGuard( GetMutex() );
5804 
5805     LongCurrencyFormatter* pCurrencyFormatter = (LongCurrencyFormatter*) GetFormatter();
5806     if ( pCurrencyFormatter )
5807         pCurrencyFormatter->SetMin(
5808             ImplCalcLongValue( Value, pCurrencyFormatter->GetDecimalDigits() ) );
5809 }
5810 
5811 double VCLXCurrencyField::getMin() throw(::com::sun::star::uno::RuntimeException)
5812 {
5813     ::vos::OGuard aGuard( GetMutex() );
5814 
5815     LongCurrencyFormatter* pCurrencyFormatter = (LongCurrencyFormatter*) GetFormatter();
5816     return pCurrencyFormatter
5817         ? ImplCalcDoubleValue( (double)pCurrencyFormatter->GetMin(), pCurrencyFormatter->GetDecimalDigits() )
5818         : 0;
5819 }
5820 
5821 void VCLXCurrencyField::setMax( double Value ) throw(::com::sun::star::uno::RuntimeException)
5822 {
5823     ::vos::OGuard aGuard( GetMutex() );
5824 
5825     LongCurrencyFormatter* pCurrencyFormatter = (LongCurrencyFormatter*) GetFormatter();
5826     if ( pCurrencyFormatter )
5827         pCurrencyFormatter->SetMax(
5828             ImplCalcLongValue( Value, pCurrencyFormatter->GetDecimalDigits() ) );
5829 }
5830 
5831 double VCLXCurrencyField::getMax() throw(::com::sun::star::uno::RuntimeException)
5832 {
5833     ::vos::OGuard aGuard( GetMutex() );
5834 
5835     LongCurrencyFormatter* pCurrencyFormatter = (LongCurrencyFormatter*) GetFormatter();
5836     return pCurrencyFormatter
5837         ? ImplCalcDoubleValue( (double)pCurrencyFormatter->GetMax(), pCurrencyFormatter->GetDecimalDigits() )
5838         : 0;
5839 }
5840 
5841 void VCLXCurrencyField::setFirst( double Value ) throw(::com::sun::star::uno::RuntimeException)
5842 {
5843     ::vos::OGuard aGuard( GetMutex() );
5844 
5845     LongCurrencyField* pCurrencyField = (LongCurrencyField*) GetWindow();
5846     if ( pCurrencyField )
5847         pCurrencyField->SetFirst(
5848             ImplCalcLongValue( Value, pCurrencyField->GetDecimalDigits() ) );
5849 }
5850 
5851 double VCLXCurrencyField::getFirst() throw(::com::sun::star::uno::RuntimeException)
5852 {
5853     ::vos::OGuard aGuard( GetMutex() );
5854 
5855     LongCurrencyField* pCurrencyField = (LongCurrencyField*) GetWindow();
5856     return pCurrencyField
5857         ? ImplCalcDoubleValue( (double)pCurrencyField->GetFirst(), pCurrencyField->GetDecimalDigits() )
5858         : 0;
5859 }
5860 
5861 void VCLXCurrencyField::setLast( double Value ) throw(::com::sun::star::uno::RuntimeException)
5862 {
5863     ::vos::OGuard aGuard( GetMutex() );
5864 
5865     LongCurrencyField* pCurrencyField = (LongCurrencyField*) GetWindow();
5866     if ( pCurrencyField )
5867         pCurrencyField->SetLast(
5868             ImplCalcLongValue( Value, pCurrencyField->GetDecimalDigits() ) );
5869 }
5870 
5871 double VCLXCurrencyField::getLast() throw(::com::sun::star::uno::RuntimeException)
5872 {
5873     ::vos::OGuard aGuard( GetMutex() );
5874 
5875     LongCurrencyField* pCurrencyField = (LongCurrencyField*) GetWindow();
5876     return pCurrencyField
5877         ? ImplCalcDoubleValue( (double)pCurrencyField->GetLast(), pCurrencyField->GetDecimalDigits() )
5878         : 0;
5879 }
5880 
5881 void VCLXCurrencyField::setSpinSize( double Value ) throw(::com::sun::star::uno::RuntimeException)
5882 {
5883     ::vos::OGuard aGuard( GetMutex() );
5884 
5885     LongCurrencyField* pCurrencyField = (LongCurrencyField*) GetWindow();
5886     if ( pCurrencyField )
5887         pCurrencyField->SetSpinSize(
5888             ImplCalcLongValue( Value, pCurrencyField->GetDecimalDigits() ) );
5889 }
5890 
5891 double VCLXCurrencyField::getSpinSize() throw(::com::sun::star::uno::RuntimeException)
5892 {
5893     ::vos::OGuard aGuard( GetMutex() );
5894 
5895     LongCurrencyField* pCurrencyField = (LongCurrencyField*) GetWindow();
5896     return pCurrencyField
5897         ? ImplCalcDoubleValue( (double)pCurrencyField->GetSpinSize(), pCurrencyField->GetDecimalDigits() )
5898         : 0;
5899 }
5900 
5901 void VCLXCurrencyField::setStrictFormat( sal_Bool bStrict ) throw(::com::sun::star::uno::RuntimeException)
5902 {
5903     VCLXFormattedSpinField::setStrictFormat( bStrict );
5904 }
5905 
5906 sal_Bool VCLXCurrencyField::isStrictFormat() throw(::com::sun::star::uno::RuntimeException)
5907 {
5908     return VCLXFormattedSpinField::isStrictFormat();
5909 }
5910 
5911 
5912 void VCLXCurrencyField::setDecimalDigits( sal_Int16 Value ) throw(::com::sun::star::uno::RuntimeException)
5913 {
5914     ::vos::OGuard aGuard( GetMutex() );
5915 
5916     LongCurrencyFormatter* pCurrencyFormatter = (LongCurrencyFormatter*) GetFormatter();
5917     if ( pCurrencyFormatter )
5918     {
5919         double n = getValue();
5920         pCurrencyFormatter->SetDecimalDigits( Value );
5921         setValue( n );
5922     }
5923 }
5924 
5925 sal_Int16 VCLXCurrencyField::getDecimalDigits() throw(::com::sun::star::uno::RuntimeException)
5926 {
5927     ::vos::OGuard aGuard( GetMutex() );
5928 
5929     LongCurrencyFormatter* pCurrencyFormatter = (LongCurrencyFormatter*) GetFormatter();
5930     return pCurrencyFormatter ? pCurrencyFormatter->GetDecimalDigits() : 0;
5931 }
5932 
5933 void VCLXCurrencyField::setProperty( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Any& Value) throw(::com::sun::star::uno::RuntimeException)
5934 {
5935     ::vos::OGuard aGuard( GetMutex() );
5936 
5937     if ( GetWindow() )
5938     {
5939         sal_Bool bVoid = Value.getValueType().getTypeClass() == ::com::sun::star::uno::TypeClass_VOID;
5940 
5941         sal_uInt16 nPropType = GetPropertyId( PropertyName );
5942         switch ( nPropType )
5943         {
5944             case BASEPROPERTY_VALUE_DOUBLE:
5945             {
5946                 if ( bVoid )
5947                 {
5948                     ((LongCurrencyField*)GetWindow())->EnableEmptyFieldValue( sal_True );
5949                     ((LongCurrencyField*)GetWindow())->SetEmptyFieldValue();
5950                 }
5951                 else
5952                 {
5953                     double d = 0;
5954                     if ( Value >>= d )
5955                         setValue( d );
5956                 }
5957             }
5958             break;
5959             case BASEPROPERTY_VALUEMIN_DOUBLE:
5960             {
5961                 double d = 0;
5962                 if ( Value >>= d )
5963                     setMin( d );
5964             }
5965             break;
5966             case BASEPROPERTY_VALUEMAX_DOUBLE:
5967             {
5968                 double d = 0;
5969                 if ( Value >>= d )
5970                     setMax( d );
5971             }
5972             break;
5973             case BASEPROPERTY_VALUESTEP_DOUBLE:
5974             {
5975                 double d = 0;
5976                 if ( Value >>= d )
5977                     setSpinSize( d );
5978             }
5979             break;
5980             case BASEPROPERTY_DECIMALACCURACY:
5981             {
5982                 sal_Int16 n = sal_Int16();
5983                 if ( Value >>= n )
5984                     setDecimalDigits( n );
5985             }
5986             break;
5987             case BASEPROPERTY_CURRENCYSYMBOL:
5988             {
5989                 ::rtl::OUString aString;
5990                 if ( Value >>= aString )
5991                     ((LongCurrencyField*)GetWindow())->SetCurrencySymbol( aString );
5992             }
5993             break;
5994             case BASEPROPERTY_NUMSHOWTHOUSANDSEP:
5995             {
5996                 sal_Bool b = sal_Bool();
5997                 if ( Value >>= b )
5998                     ((LongCurrencyField*)GetWindow())->SetUseThousandSep( b );
5999             }
6000             break;
6001             default:
6002             {
6003                 VCLXFormattedSpinField::setProperty( PropertyName, Value );
6004             }
6005         }
6006     }
6007 }
6008 
6009 ::com::sun::star::uno::Any VCLXCurrencyField::getProperty( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::uno::RuntimeException)
6010 {
6011     ::vos::OGuard aGuard( GetMutex() );
6012 
6013     ::com::sun::star::uno::Any aProp;
6014     FormatterBase* pFormatter = GetFormatter();
6015     if ( pFormatter )
6016     {
6017         sal_uInt16 nPropType = GetPropertyId( PropertyName );
6018         switch ( nPropType )
6019         {
6020             case BASEPROPERTY_VALUE_DOUBLE:
6021             {
6022                 aProp <<= (double) getValue();
6023             }
6024             break;
6025             case BASEPROPERTY_VALUEMIN_DOUBLE:
6026             {
6027                 aProp <<= (double) getMin();
6028             }
6029             break;
6030             case BASEPROPERTY_VALUEMAX_DOUBLE:
6031             {
6032                 aProp <<= (double) getMax();
6033             }
6034             break;
6035             case BASEPROPERTY_VALUESTEP_DOUBLE:
6036             {
6037                 aProp <<= (double) getSpinSize();
6038             }
6039             break;
6040             case BASEPROPERTY_CURRENCYSYMBOL:
6041             {
6042                 aProp <<= ::rtl::OUString( ((LongCurrencyField*)GetWindow())->GetCurrencySymbol() );
6043             }
6044             break;
6045             case BASEPROPERTY_NUMSHOWTHOUSANDSEP:
6046             {
6047                 aProp <<= (sal_Bool) ((LongCurrencyField*)GetWindow())->IsUseThousandSep();
6048             }
6049             break;
6050             default:
6051             {
6052                 aProp <<= VCLXFormattedSpinField::getProperty( PropertyName );
6053             }
6054         }
6055     }
6056     return aProp;
6057 }
6058 
6059 //  ----------------------------------------------------
6060 //  class VCLXPatternField
6061 //  ----------------------------------------------------
6062 
6063 void VCLXPatternField::ImplGetPropertyIds( std::list< sal_uInt16 > &rIds )
6064 {
6065     PushPropertyIds( rIds,
6066                      BASEPROPERTY_ALIGN,
6067                      BASEPROPERTY_BACKGROUNDCOLOR,
6068                      BASEPROPERTY_BORDER,
6069                      BASEPROPERTY_BORDERCOLOR,
6070                      BASEPROPERTY_DEFAULTCONTROL,
6071                      BASEPROPERTY_EDITMASK,
6072                      BASEPROPERTY_ENABLED,
6073                      BASEPROPERTY_ENABLEVISIBLE,
6074                      BASEPROPERTY_FONTDESCRIPTOR,
6075                      BASEPROPERTY_HELPTEXT,
6076                      BASEPROPERTY_HELPURL,
6077                      BASEPROPERTY_LITERALMASK,
6078                      BASEPROPERTY_MAXTEXTLEN,
6079                      BASEPROPERTY_PRINTABLE,
6080                      BASEPROPERTY_READONLY,
6081                      BASEPROPERTY_STRICTFORMAT,
6082                      BASEPROPERTY_TABSTOP,
6083                      BASEPROPERTY_TEXT,
6084                      BASEPROPERTY_HIDEINACTIVESELECTION,
6085                      BASEPROPERTY_VERTICALALIGN,
6086                      BASEPROPERTY_WRITING_MODE,
6087                      BASEPROPERTY_CONTEXT_WRITING_MODE,
6088                      BASEPROPERTY_MOUSE_WHEEL_BEHAVIOUR,
6089                      0);
6090     VCLXFormattedSpinField::ImplGetPropertyIds( rIds );
6091 }
6092 
6093 VCLXPatternField::VCLXPatternField()
6094 {
6095 }
6096 
6097 VCLXPatternField::~VCLXPatternField()
6098 {
6099 }
6100 
6101 // ::com::sun::star::uno::XInterface
6102 ::com::sun::star::uno::Any VCLXPatternField::queryInterface( const ::com::sun::star::uno::Type & rType ) throw(::com::sun::star::uno::RuntimeException)
6103 {
6104     ::com::sun::star::uno::Any aRet = ::cppu::queryInterface( rType,
6105                                         SAL_STATIC_CAST( ::com::sun::star::awt::XPatternField*, this ) );
6106     return (aRet.hasValue() ? aRet : VCLXFormattedSpinField::queryInterface( rType ));
6107 }
6108 
6109 // ::com::sun::star::lang::XTypeProvider
6110 IMPL_XTYPEPROVIDER_START( VCLXPatternField )
6111     getCppuType( ( ::com::sun::star::uno::Reference< ::com::sun::star::awt::XPatternField>* ) NULL ),
6112     VCLXFormattedSpinField::getTypes()
6113 IMPL_XTYPEPROVIDER_END
6114 
6115 void VCLXPatternField::setMasks( const ::rtl::OUString& EditMask, const ::rtl::OUString& LiteralMask ) throw(::com::sun::star::uno::RuntimeException)
6116 {
6117     ::vos::OGuard aGuard( GetMutex() );
6118 
6119     PatternField* pPatternField = (PatternField*) GetWindow();
6120     if ( pPatternField )
6121     {
6122         pPatternField->SetMask( ByteString( UniString( EditMask ), RTL_TEXTENCODING_ASCII_US ), LiteralMask );
6123     }
6124 }
6125 
6126 void VCLXPatternField::getMasks( ::rtl::OUString& EditMask, ::rtl::OUString& LiteralMask ) throw(::com::sun::star::uno::RuntimeException)
6127 {
6128     ::vos::OGuard aGuard( GetMutex() );
6129 
6130     PatternField* pPatternField = (PatternField*) GetWindow();
6131     if ( pPatternField )
6132     {
6133         EditMask = String( pPatternField->GetEditMask(), RTL_TEXTENCODING_ASCII_US );
6134         LiteralMask = pPatternField->GetLiteralMask();
6135     }
6136 }
6137 
6138 void VCLXPatternField::setString( const ::rtl::OUString& Str ) throw(::com::sun::star::uno::RuntimeException)
6139 {
6140     ::vos::OGuard aGuard( GetMutex() );
6141 
6142     PatternField* pPatternField = (PatternField*) GetWindow();
6143     if ( pPatternField )
6144     {
6145         pPatternField->SetString( Str );
6146     }
6147 }
6148 
6149 ::rtl::OUString VCLXPatternField::getString() throw(::com::sun::star::uno::RuntimeException)
6150 {
6151     ::vos::OGuard aGuard( GetMutex() );
6152 
6153     ::rtl::OUString aString;
6154     PatternField* pPatternField = (PatternField*) GetWindow();
6155     if ( pPatternField )
6156         aString = pPatternField->GetString();
6157     return aString;
6158 }
6159 
6160 void VCLXPatternField::setStrictFormat( sal_Bool bStrict ) throw(::com::sun::star::uno::RuntimeException)
6161 {
6162     VCLXFormattedSpinField::setStrictFormat( bStrict );
6163 }
6164 
6165 sal_Bool VCLXPatternField::isStrictFormat() throw(::com::sun::star::uno::RuntimeException)
6166 {
6167     return VCLXFormattedSpinField::isStrictFormat();
6168 }
6169 
6170 void VCLXPatternField::setProperty( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Any& Value) throw(::com::sun::star::uno::RuntimeException)
6171 {
6172     ::vos::OGuard aGuard( GetMutex() );
6173 
6174     if ( GetWindow() )
6175     {
6176         sal_uInt16 nPropType = GetPropertyId( PropertyName );
6177         switch ( nPropType )
6178         {
6179             case BASEPROPERTY_EDITMASK:
6180             case BASEPROPERTY_LITERALMASK:
6181             {
6182                 ::rtl::OUString aString;
6183                 if ( Value >>= aString )
6184                 {
6185                     ::rtl::OUString aEditMask, aLiteralMask;
6186                     getMasks( aEditMask, aLiteralMask );
6187                     if ( nPropType == BASEPROPERTY_EDITMASK )
6188                         aEditMask = aString;
6189                     else
6190                         aLiteralMask = aString;
6191                     setMasks( aEditMask, aLiteralMask );
6192                 }
6193             }
6194             break;
6195             default:
6196             {
6197                 VCLXFormattedSpinField::setProperty( PropertyName, Value );
6198             }
6199         }
6200     }
6201 }
6202 
6203 ::com::sun::star::uno::Any VCLXPatternField::getProperty( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::uno::RuntimeException)
6204 {
6205     ::vos::OGuard aGuard( GetMutex() );
6206 
6207     ::com::sun::star::uno::Any aProp;
6208     if ( GetWindow() )
6209     {
6210         sal_uInt16 nPropType = GetPropertyId( PropertyName );
6211         switch ( nPropType )
6212         {
6213             case BASEPROPERTY_EDITMASK:
6214             case BASEPROPERTY_LITERALMASK:
6215             {
6216                 ::rtl::OUString aEditMask, aLiteralMask;
6217                 getMasks( aEditMask, aLiteralMask );
6218                 if ( nPropType == BASEPROPERTY_EDITMASK )
6219                     aProp <<= aEditMask;
6220                 else
6221                     aProp <<= aLiteralMask;
6222             }
6223             break;
6224             default:
6225             {
6226                 aProp <<= VCLXFormattedSpinField::getProperty( PropertyName );
6227             }
6228         }
6229     }
6230     return aProp;
6231 }
6232 
6233 //  ----------------------------------------------------
6234 //  class VCLXToolBox
6235 //  ----------------------------------------------------
6236 VCLXToolBox::VCLXToolBox()
6237 {
6238 }
6239 
6240 VCLXToolBox::~VCLXToolBox()
6241 {
6242 }
6243 
6244 ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleContext > VCLXToolBox::CreateAccessibleContext()
6245 {
6246     return getAccessibleFactory().createAccessibleContext( this );
6247 }
6248 
6249