xref: /trunk/main/toolkit/source/awt/vclxtoolkit.cxx (revision e821fb775461661376ebfba8080da6be9e5b7c3f)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_toolkit.hxx"
26 #include <com/sun/star/beans/PropertyAttribute.hpp>
27 
28 #ifndef _SVWIN_HXX
29 #include <tools/svwin.h>
30 #endif
31 #include <stdio.h>
32 #include <com/sun/star/awt/ImageScaleMode.hpp>
33 #include <com/sun/star/awt/WindowAttribute.hpp>
34 #include <com/sun/star/awt/VclWindowPeerAttribute.hpp>
35 #include <com/sun/star/awt/WindowClass.hpp>
36 #include <com/sun/star/awt/MessageBoxButtons.hpp>
37 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
38 #include <com/sun/star/lang/SystemDependent.hpp>
39 #include <com/sun/star/awt/FocusEvent.hpp>
40 #include <com/sun/star/awt/KeyEvent.hpp>
41 #include <com/sun/star/awt/KeyModifier.hpp>
42 #include <com/sun/star/lang/EventObject.hpp>
43 #include <com/sun/star/uno/Reference.hxx>
44 #include <com/sun/star/uno/Sequence.hxx>
45 #include <com/sun/star/uno/XInterface.hpp>
46 #include <com/sun/star/beans/NamedValue.hpp>
47 #include <cppuhelper/typeprovider.hxx>
48 #include <osl/conditn.hxx>
49 #include <rtl/memory.h>
50 #include <rtl/uuid.h>
51 #include <rtl/process.h>
52 
53 #ifdef WNT
54 #include <tools/prewin.h>
55 #include <windows.h>
56 #include <tools/postwin.h>
57 #elif defined ( OS2 )
58 #include <svpm.h>
59 #elif (defined QUARTZ)
60 #include "premac.h"
61 #include <Cocoa/Cocoa.h>
62 #include "postmac.h"
63 #endif
64 #include <vcl/sysdata.hxx>
65 
66 #include <toolkit/awt/vclxwindows.hxx>
67 #include <toolkit/awt/vclxsystemdependentwindow.hxx>
68 #include <toolkit/awt/vclxregion.hxx>
69 #include <toolkit/awt/vclxtoolkit.hxx>
70 #include <toolkit/awt/vclxtabpagecontainer.hxx>
71 #include <toolkit/awt/vclxtabpagemodel.hxx>
72 
73 #include <toolkit/awt/animatedimagespeer.hxx>
74 #include <toolkit/awt/vclxtopwindow.hxx>
75 #include <toolkit/awt/vclxwindow.hxx>
76 #include <toolkit/helper/vclunohelper.hxx>
77 #include <toolkit/helper/unowrapper.hxx>
78 #include <toolkit/helper/servicenames.hxx>
79 
80 
81 #include <toolkit/helper/macros.hxx>
82 #include <toolkit/helper/convert.hxx>
83 #include <vcl/unohelp.hxx>
84 #include <vcl/btndlg.hxx>
85 #ifndef _SV_BUTTON_HXX
86 #include <vcl/button.hxx>
87 #endif
88 #include <vcl/combobox.hxx>
89 #include <vcl/ctrl.hxx>
90 #include <vcl/dialog.hxx>
91 #include <vcl/dockingarea.hxx>
92 #include <vcl/dockwin.hxx>
93 #include <vcl/edit.hxx>
94 #include <vcl/field.hxx>
95 #include <vcl/fixed.hxx>
96 #include <vcl/floatwin.hxx>
97 #include <vcl/group.hxx>
98 #include <vcl/imgctrl.hxx>
99 #include <vcl/longcurr.hxx>
100 #include <vcl/lstbox.hxx>
101 #include <vcl/menubtn.hxx>
102 #include <vcl/morebtn.hxx>
103 #include <vcl/msgbox.hxx>
104 #include <vcl/scrbar.hxx>
105 #include <vcl/spin.hxx>
106 #include <vcl/split.hxx>
107 #include <vcl/splitwin.hxx>
108 #include <vcl/status.hxx>
109 #include <vcl/svapp.hxx>
110 #include <vcl/syschild.hxx>
111 #include <vcl/tabctrl.hxx>
112 #include <vcl/tabdlg.hxx>
113 #include <vcl/tabpage.hxx>
114 #include <vcl/toolbox.hxx>
115 #include <vcl/virdev.hxx>
116 #include <vcl/window.hxx>
117 #include <vcl/wrkwin.hxx>
118 #include <vcl/throbber.hxx>
119 #include "toolkit/awt/vclxspinbutton.hxx"
120 
121 #include <tools/debug.hxx>
122 #include <comphelper/processfactory.hxx>
123 
124 namespace css = ::com::sun::star;
125 
126 #define VCLWINDOW_FRAMEWINDOW               0x1000
127 #define VCLWINDOW_SYSTEMCHILDWINDOW         0x1001
128 
129 #if (defined WNT)
130 #define SYSTEM_DEPENDENT_TYPE ::com::sun::star::lang::SystemDependent::SYSTEM_WIN32
131 #elif (defined OS2)
132 #define SYSTEM_DEPENDENT_TYPE ::com::sun::star::lang::SystemDependent::SYSTEM_OS2
133 #elif (defined QUARTZ)
134 #define SYSTEM_DEPENDENT_TYPE ::com::sun::star::lang::SystemDependent::SYSTEM_MAC
135 #elif (defined UNX)
136 #define SYSTEM_DEPENDENT_TYPE ::com::sun::star::lang::SystemDependent::SYSTEM_XWINDOW
137 #endif
138 
139 TOOLKIT_DLLPUBLIC WinBits ImplGetWinBits( sal_uInt32 nComponentAttribs, sal_uInt16 nCompType )
140 {
141     WinBits nWinBits = 0;
142 
143     sal_Bool bMessBox = sal_False;
144     if ( ( nCompType == WINDOW_INFOBOX ) ||
145          ( nCompType == WINDOW_MESSBOX ) ||
146          ( nCompType == WINDOW_QUERYBOX ) ||
147          ( nCompType == WINDOW_WARNINGBOX ) ||
148          ( nCompType == WINDOW_ERRORBOX ) )
149     {
150         bMessBox = sal_True;
151     }
152 
153     bool bDecoratedWindow = false;
154     if  (   bMessBox
155         ||  ( nCompType == WINDOW_DIALOG )
156         ||  ( nCompType == WINDOW_MODELESSDIALOG )
157         ||  ( nCompType == WINDOW_MODALDIALOG )
158         ||  ( nCompType == WINDOW_SYSTEMDIALOG )
159         ||  ( nCompType == WINDOW_PATHDIALOG )
160         ||  ( nCompType == WINDOW_FILEDIALOG )
161         ||  ( nCompType == WINDOW_PRINTERSETUPDIALOG )
162         ||  ( nCompType == WINDOW_PRINTDIALOG )
163         ||  ( nCompType == WINDOW_COLORDIALOG )
164         ||  ( nCompType == WINDOW_FONTDIALOG )
165         ||  ( nCompType == WINDOW_DOCKINGWINDOW )
166         ||  ( nCompType == WINDOW_TABDIALOG )
167         ||  ( nCompType == WINDOW_BUTTONDIALOG )
168         ||  ( nCompType == WINDOW_SYSTEMCHILDWINDOW )
169         )
170     {
171         bDecoratedWindow = true;
172     }
173 
174     if( nComponentAttribs & ::com::sun::star::awt::WindowAttribute::BORDER )
175         nWinBits |= WB_BORDER;
176     if( nComponentAttribs & ::com::sun::star::awt::VclWindowPeerAttribute::NOBORDER )
177         nWinBits |= WB_NOBORDER;
178     if( nComponentAttribs & ::com::sun::star::awt::WindowAttribute::SIZEABLE )
179         nWinBits |= WB_SIZEABLE;
180     if( nComponentAttribs & ::com::sun::star::awt::WindowAttribute::MOVEABLE )
181         nWinBits |= WB_MOVEABLE;
182     if( nComponentAttribs & ::com::sun::star::awt::WindowAttribute::CLOSEABLE )
183         nWinBits |= WB_CLOSEABLE;
184     if( nComponentAttribs & ::com::sun::star::awt::VclWindowPeerAttribute::HSCROLL )
185         nWinBits |= WB_HSCROLL;
186     if( nComponentAttribs & ::com::sun::star::awt::VclWindowPeerAttribute::VSCROLL )
187         nWinBits |= WB_VSCROLL;
188     if( nComponentAttribs & ::com::sun::star::awt::VclWindowPeerAttribute::LEFT )
189         nWinBits |= WB_LEFT;
190     if( nComponentAttribs & ::com::sun::star::awt::VclWindowPeerAttribute::CENTER )
191         nWinBits |= WB_CENTER;
192     if( nComponentAttribs & ::com::sun::star::awt::VclWindowPeerAttribute::RIGHT )
193         nWinBits |= WB_RIGHT;
194     if( nComponentAttribs & ::com::sun::star::awt::VclWindowPeerAttribute::SPIN )
195         nWinBits |= WB_SPIN;
196     if( nComponentAttribs & ::com::sun::star::awt::VclWindowPeerAttribute::SORT )
197         nWinBits |= WB_SORT;
198     if( nComponentAttribs & ::com::sun::star::awt::VclWindowPeerAttribute::DROPDOWN )
199         nWinBits |= WB_DROPDOWN;
200     if( nComponentAttribs & ::com::sun::star::awt::VclWindowPeerAttribute::DEFBUTTON )
201         nWinBits |= WB_DEFBUTTON;
202     if( nComponentAttribs & ::com::sun::star::awt::VclWindowPeerAttribute::READONLY )
203         nWinBits |= WB_READONLY;
204     if( nComponentAttribs & ::com::sun::star::awt::VclWindowPeerAttribute::CLIPCHILDREN )
205         nWinBits |= WB_CLIPCHILDREN;
206     if( nComponentAttribs & ::com::sun::star::awt::VclWindowPeerAttribute::GROUP )
207         nWinBits |= WB_GROUP;
208     if( nComponentAttribs & ::com::sun::star::awt::VclWindowPeerAttribute::NOLABEL ) //added for issue79712
209         nWinBits |= WB_NOLABEL;
210 
211     // These bits are not uniqe
212     if ( bMessBox )
213     {
214         if( nComponentAttribs & ::com::sun::star::awt::VclWindowPeerAttribute::OK )
215             nWinBits |= WB_OK;
216         if( nComponentAttribs & ::com::sun::star::awt::VclWindowPeerAttribute::OK_CANCEL )
217             nWinBits |= WB_OK_CANCEL;
218         if( nComponentAttribs & ::com::sun::star::awt::VclWindowPeerAttribute::YES_NO )
219             nWinBits |= WB_YES_NO;
220         if( nComponentAttribs & ::com::sun::star::awt::VclWindowPeerAttribute::YES_NO_CANCEL )
221             nWinBits |= WB_YES_NO_CANCEL;
222         if( nComponentAttribs & ::com::sun::star::awt::VclWindowPeerAttribute::RETRY_CANCEL )
223             nWinBits |= WB_RETRY_CANCEL;
224         if( nComponentAttribs & ::com::sun::star::awt::VclWindowPeerAttribute::DEF_OK )
225             nWinBits |= WB_DEF_OK;
226         if( nComponentAttribs & ::com::sun::star::awt::VclWindowPeerAttribute::DEF_CANCEL )
227             nWinBits |= WB_DEF_CANCEL;
228         if( nComponentAttribs & ::com::sun::star::awt::VclWindowPeerAttribute::DEF_RETRY )
229             nWinBits |= WB_DEF_RETRY;
230         if( nComponentAttribs & ::com::sun::star::awt::VclWindowPeerAttribute::DEF_YES )
231             nWinBits |= WB_DEF_YES;
232         if( nComponentAttribs & ::com::sun::star::awt::VclWindowPeerAttribute::DEF_NO )
233             nWinBits |= WB_DEF_NO;
234     }
235     if ( nCompType == WINDOW_MULTILINEEDIT )
236     {
237         if( nComponentAttribs & ::com::sun::star::awt::VclWindowPeerAttribute::AUTOHSCROLL )
238             nWinBits |= WB_AUTOHSCROLL;
239         if( nComponentAttribs & ::com::sun::star::awt::VclWindowPeerAttribute::AUTOVSCROLL )
240             nWinBits |= WB_AUTOVSCROLL;
241     }
242 
243 
244     if ( bDecoratedWindow )
245     {
246         if( nComponentAttribs & ::com::sun::star::awt::WindowAttribute::NODECORATION )
247         {
248             // No decoration removes several window attributes and must
249             // set WB_NOBORDER!
250             nWinBits &= ~WB_BORDER;
251             nWinBits &= ~WB_SIZEABLE;
252             nWinBits &= ~WB_MOVEABLE;
253             nWinBits &= ~WB_CLOSEABLE;
254             nWinBits |= WB_NOBORDER;
255         }
256     }
257 
258     return nWinBits;
259 }
260 
261 struct ComponentInfo
262 {
263     const char*     pName;
264     WindowType      nWinType;
265 };
266 
267 static ComponentInfo __FAR_DATA aComponentInfos [] =
268 {
269     { "buttondialog",       WINDOW_BUTTONDIALOG },
270     { "cancelbutton",       WINDOW_CANCELBUTTON },
271     { "checkbox",           WINDOW_CHECKBOX },
272     { "combobox",           WINDOW_COMBOBOX },
273     { "control",            WINDOW_CONTROL },
274     { "currencybox",        WINDOW_CURRENCYBOX },
275     { "currencyfield",      WINDOW_CURRENCYFIELD },
276     { "datebox",            WINDOW_DATEBOX },
277     { "datefield",          WINDOW_DATEFIELD },
278     { "dialog",             WINDOW_DIALOG },
279     { "dockingarea",        WINDOW_DOCKINGAREA },
280     { "dockingwindow",      WINDOW_DOCKINGWINDOW },
281     { "edit",               WINDOW_EDIT },
282     { "errorbox",           WINDOW_ERRORBOX },
283     { "fixedbitmap",        WINDOW_FIXEDBITMAP },
284     { "fixedimage",         WINDOW_FIXEDIMAGE },
285     { "fixedline",          WINDOW_FIXEDLINE },
286     { "fixedtext",          WINDOW_FIXEDTEXT },
287     { "floatingwindow",     WINDOW_FLOATINGWINDOW },
288     { "framewindow",        VCLWINDOW_FRAMEWINDOW },
289     { "groupbox",           WINDOW_GROUPBOX },
290     { "helpbutton",         WINDOW_HELPBUTTON },
291     { "imagebutton",        WINDOW_IMAGEBUTTON },
292     { "imageradiobutton",   WINDOW_IMAGERADIOBUTTON },
293     { "infobox",            WINDOW_INFOBOX },
294     { "listbox",            WINDOW_LISTBOX },
295     { "longcurrencybox",    WINDOW_LONGCURRENCYBOX },
296     { "longcurrencyfield",  WINDOW_LONGCURRENCYFIELD },
297     { "menubutton",         WINDOW_MENUBUTTON },
298     { "messbox",            WINDOW_MESSBOX },
299     { "metricbox",          WINDOW_METRICBOX },
300     { "metricfield",        WINDOW_METRICFIELD },
301     { "modaldialog",        WINDOW_MODALDIALOG },
302     { "modelessdialog",     WINDOW_MODELESSDIALOG },
303     { "morebutton",         WINDOW_MOREBUTTON },
304     { "multilineedit",      WINDOW_MULTILINEEDIT },
305     { "multilistbox",       WINDOW_MULTILISTBOX },
306     { "numericbox",         WINDOW_NUMERICBOX },
307     { "numericfield",       WINDOW_NUMERICFIELD },
308     { "okbutton",           WINDOW_OKBUTTON },
309     { "patternbox",         WINDOW_PATTERNBOX },
310     { "patternfield",       WINDOW_PATTERNFIELD },
311     { "pushbutton",         WINDOW_PUSHBUTTON },
312     { "querybox",           WINDOW_QUERYBOX },
313     { "radiobutton",        WINDOW_RADIOBUTTON },
314     { "scrollbar",          WINDOW_SCROLLBAR },
315     { "scrollbarbox",       WINDOW_SCROLLBARBOX },
316     { "animatedimages",     WINDOW_CONTROL },
317     { "spinbutton",         WINDOW_SPINBUTTON },
318     { "spinfield",          WINDOW_SPINFIELD },
319     { "splitter",           WINDOW_SPLITTER },
320     { "splitwindow",        WINDOW_SPLITWINDOW },
321     { "statusbar",          WINDOW_STATUSBAR },
322     { "systemchildwindow",  VCLWINDOW_SYSTEMCHILDWINDOW },
323     { "tabcontrol",         WINDOW_TABCONTROL },
324     { "tabdialog",          WINDOW_TABDIALOG },
325     { "tabpage",            WINDOW_TABPAGE },
326     { "timebox",            WINDOW_TIMEBOX },
327     { "timefield",          WINDOW_TIMEFIELD },
328     { "toolbox",            WINDOW_TOOLBOX },
329     { "tristatebox",        WINDOW_TRISTATEBOX },
330     { "warningbox",         WINDOW_WARNINGBOX },
331     { "window",             WINDOW_WINDOW },
332     { "workwindow",         WINDOW_WORKWINDOW },
333     { "tabpagecontainer",   WINDOW_CONTROL },
334     { "tabpagemodel",       WINDOW_TABPAGE }
335 };
336 
337 extern "C"
338 {
339 static int
340 #if defined( WNT )
341  __cdecl
342 #endif
343 #if defined( ICC ) && defined( OS2 )
344 _Optlink
345 #endif
346     ComponentInfoCompare( const void* pFirst, const void* pSecond)
347 {
348     return( strcmp( ((ComponentInfo*)pFirst)->pName,
349                     ((ComponentInfo*)pSecond)->pName ) );
350 }
351 }
352 
353 sal_uInt16 ImplGetComponentType( const String& rServiceName )
354 {
355     static sal_Bool bSorted = sal_False;
356     if( !bSorted )
357     {
358         qsort(  (void*) aComponentInfos,
359                 sizeof( aComponentInfos ) / sizeof( ComponentInfo ),
360                 sizeof( ComponentInfo ),
361                 ComponentInfoCompare );
362         bSorted = sal_True;
363     }
364 
365 
366     ComponentInfo aSearch;
367     ByteString aServiceName( rServiceName, gsl_getSystemTextEncoding() );
368     aServiceName.ToLowerAscii();
369     if ( aServiceName.Len() )
370         aSearch.pName = aServiceName.GetBuffer();
371     else
372         aSearch.pName = "window";
373 
374     ComponentInfo* pInf = (ComponentInfo*) bsearch( &aSearch,
375                         (void*) aComponentInfos,
376                         sizeof( aComponentInfos ) / sizeof( ComponentInfo ),
377                         sizeof( ComponentInfo ),
378                         ComponentInfoCompare );
379 
380     return pInf ? pInf->nWinType : 0;
381 }
382 
383 
384 //  ----------------------------------------------------
385 //  class VCLXToolkit
386 //  ----------------------------------------------------
387 
388 static sal_Int32                            nVCLToolkitInstanceCount = 0;
389 static sal_Bool                                 bInitedByVCLToolkit = sal_False;
390 //static cppu::OInterfaceContainerHelper *  pToolkits = 0;
391 
392 static osl::Mutex & getInitMutex()
393 {
394     static osl::Mutex * pM;
395     if( !pM )
396     {
397         osl::Guard< osl::Mutex > aGuard( osl::Mutex::getGlobalMutex() );
398         if( !pM )
399         {
400             static osl::Mutex aMutex;
401             pM = &aMutex;
402         }
403     }
404     return *pM;
405 }
406 
407 static osl::Condition & getInitCondition()
408 {
409     static osl::Condition * pC = 0;
410     if( !pC )
411     {
412         osl::Guard< osl::Mutex > aGuard( osl::Mutex::getGlobalMutex() );
413         if( !pC )
414         {
415             static osl::Condition aCondition;
416             pC = &aCondition;
417         }
418     }
419     return *pC;
420 }
421 
422 struct ToolkitThreadData
423 {
424     VCLXToolkit * pTk;
425     ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > xSMgr;
426 
427     ToolkitThreadData( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > & rSMgr, VCLXToolkit * pTk_ )
428         : pTk( pTk_ )
429         , xSMgr( rSMgr )
430     {
431     }
432 };
433 
434 extern "C"
435 {
436 static void SAL_CALL ToolkitWorkerFunction( void* pArgs )
437 {
438     ToolkitThreadData * pTTD = (ToolkitThreadData *)pArgs;
439     bInitedByVCLToolkit = InitVCL( pTTD->xSMgr );
440     if( bInitedByVCLToolkit )
441     {
442         UnoWrapper* pUnoWrapper = new UnoWrapper( pTTD->pTk );
443         Application::SetUnoWrapper( pUnoWrapper );
444     }
445     getInitCondition().set();
446     if( bInitedByVCLToolkit )
447     {
448         {
449         osl::Guard< vos::IMutex > aGuard( Application::GetSolarMutex() );
450         Application::Execute();
451         }
452         try
453         {
454             pTTD->pTk->dispose();
455         }
456         catch( com::sun::star::uno::Exception & )
457         {
458         }
459         /*
460         if( pToolkits )
461         {
462             cppu::OInterfaceIteratorHelper aIt( *pToolkits );
463             ::com::sun::star::uno::XInterface * pI;
464             while( pI = aIt.next() )
465                 ((::com::sun::star::lang::XComponent *)pI)->dispose();
466 
467             // delete toolkit container
468             osl::Guard< osl::Mutex > aGuard( getInitMutex() );
469             delete pToolkits;
470             pToolkits = 0;
471         }
472         */
473         DeInitVCL();
474     }
475     else
476     {
477         JoinMainLoopThread();
478     }
479     delete pTTD;
480 }
481 }
482 
483 // contructor, which might initialize VCL
484 VCLXToolkit::VCLXToolkit( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > & rSMgr ):
485     cppu::WeakComponentImplHelper7<
486     ::com::sun::star::awt::XToolkit,
487     ::com::sun::star::lang::XServiceInfo,
488     ::com::sun::star::awt::XSystemChildFactory,
489     ::com::sun::star::awt::XMessageBoxFactory,
490     ::com::sun::star::awt::XDataTransferProviderAccess,
491     ::com::sun::star::awt::XExtendedToolkit,
492     ::com::sun::star::awt::XReschedule>( GetMutex() ),
493     m_aTopWindowListeners(rBHelper.rMutex),
494     m_aKeyHandlers(rBHelper.rMutex),
495     m_aFocusListeners(rBHelper.rMutex),
496     m_aEventListenerLink(LINK(this, VCLXToolkit, eventListenerHandler)),
497     m_aKeyListenerLink(LINK(this, VCLXToolkit, keyListenerHandler)),
498     m_bEventListener(false),
499     m_bKeyListener(false)
500 {
501     hSvToolsLib = NULL;
502     fnSvtCreateWindow = NULL;
503 
504     osl::Guard< osl::Mutex > aGuard( getInitMutex() );
505     nVCLToolkitInstanceCount++;
506     if( ( nVCLToolkitInstanceCount == 1 ) && ( !Application::IsInMain() ) )
507     {
508         // setup execute thread
509         CreateMainLoopThread( ToolkitWorkerFunction, new ToolkitThreadData( rSMgr, this ) );
510         getInitCondition().wait();
511         /*
512         if( bInitedByVCLToolkit )
513         {
514             // insert in disposing list
515             if( !pToolkits )
516                 pToolkits = new cppu::OInterfaceContainerHelper( getInitMutex() );
517             pToolkits->addInterface( (::com::sun::star::lang::XComponent *)this );
518         }
519         */
520     }
521 }
522 
523 VCLXToolkit::~VCLXToolkit()
524 {
525 }
526 
527 
528 void SAL_CALL VCLXToolkit::disposing()
529 {
530     if ( hSvToolsLib )
531     {
532         osl_unloadModule( hSvToolsLib );
533         hSvToolsLib = NULL;
534         fnSvtCreateWindow = NULL;
535     }
536 
537     {
538         osl::Guard< osl::Mutex > aGuard( getInitMutex() );
539         if( --nVCLToolkitInstanceCount == 0 )
540         {
541             if( bInitedByVCLToolkit )
542             {
543                 Application::Quit();
544                 JoinMainLoopThread();
545                 bInitedByVCLToolkit = sal_False;
546             }
547         }
548     }
549 
550     if (m_bEventListener)
551     {
552         ::Application::RemoveEventListener(m_aEventListenerLink);
553         m_bEventListener = false;
554     }
555     if (m_bKeyListener)
556     {
557         ::Application::RemoveKeyListener(m_aKeyListenerLink);
558         m_bKeyListener = false;
559     }
560     ::css::lang::EventObject aEvent(
561         static_cast< ::cppu::OWeakObject * >(this));
562     m_aTopWindowListeners.disposeAndClear(aEvent);
563     m_aKeyHandlers.disposeAndClear(aEvent);
564     m_aFocusListeners.disposeAndClear(aEvent);
565 
566 /*
567     osl::Guard< osl::Mutex > aGuard( getInitMutex() );
568     // insert in disposing list
569     if( pToolkits )
570     {
571         // remove from the disposing list
572         pToolkits->removeInterface( (::com::sun::star::lang::XComponent *)this );
573     }
574 */
575 }
576 
577 
578 ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindowPeer > VCLXToolkit::getDesktopWindow(  ) throw(::com::sun::star::uno::RuntimeException)
579 {
580     ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindowPeer > xRef;
581     // 07/00: AppWindow doesn't exist anymore...
582     return xRef;
583 }
584 
585 ::com::sun::star::awt::Rectangle VCLXToolkit::getWorkArea(  ) throw(::com::sun::star::uno::RuntimeException)
586 {
587     ::com::sun::star::awt::Rectangle aRect;
588     // 07/00: AppWindow doesn't exist anymore...
589     return aRect;
590 }
591 
592 ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindowPeer > VCLXToolkit::createWindow( const ::com::sun::star::awt::WindowDescriptor& rDescriptor ) throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException)
593 {
594     return ImplCreateWindow( rDescriptor, WinBits(0) );
595 }
596 
597 ::com::sun::star::uno::Reference< ::com::sun::star::awt::XDevice > VCLXToolkit::createScreenCompatibleDevice( sal_Int32 Width, sal_Int32 Height ) throw(::com::sun::star::uno::RuntimeException)
598 {
599     ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
600 
601     ::com::sun::star::uno::Reference< ::com::sun::star::awt::XDevice > xRef;
602     VCLXVirtualDevice* pVDev = new VCLXVirtualDevice;
603 
604     osl::Guard< vos::IMutex > aSolarGuard( Application::GetSolarMutex() );
605 
606     VirtualDevice* pV = new VirtualDevice;
607     pV->SetOutputSizePixel( Size( Width, Height ) );
608     pVDev->SetVirtualDevice( pV );
609 
610     xRef = pVDev;
611     return xRef;
612 }
613 
614 ::com::sun::star::uno::Reference< ::com::sun::star::awt::XRegion > VCLXToolkit::createRegion(  ) throw(::com::sun::star::uno::RuntimeException)
615 {
616     ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
617 
618     ::com::sun::star::uno::Reference< ::com::sun::star::awt::XRegion >  xRef = new VCLXRegion;
619     return xRef;
620 }
621 
622 Window* VCLXToolkit::ImplCreateWindow( VCLXWindow** ppNewComp,
623     const ::com::sun::star::awt::WindowDescriptor& rDescriptor,
624     Window* pParent, WinBits nWinBits )
625 {
626     String aServiceName( rDescriptor.WindowServiceName );
627     aServiceName.ToLowerAscii();
628 
629     Window* pNewWindow = NULL;
630     sal_uInt16 nType = ImplGetComponentType( aServiceName );
631 
632     if ( !pParent )
633     {
634         // Wenn die Component einen Parent braucht, dann NULL zurueckgeben,
635         // spaeter mal ::com::sun::star::uno::Exception...
636         sal_Bool bException = sal_True;
637         if  (   ( nType == WINDOW_DIALOG )
638             ||  ( nType == WINDOW_MODALDIALOG )
639             ||  ( nType == WINDOW_MODELESSDIALOG )
640             ||  ( nType == WINDOW_MESSBOX )
641             ||  ( nType == WINDOW_INFOBOX )
642             ||  ( nType == WINDOW_WARNINGBOX )
643             ||  ( nType == WINDOW_ERRORBOX )
644             ||  ( nType == WINDOW_QUERYBOX )
645             )
646             bException = sal_False;
647         else if ( ( nType == WINDOW_WINDOW ) ||
648                   ( nType == WINDOW_WORKWINDOW ) ||
649                   ( nType == VCLWINDOW_FRAMEWINDOW ) )
650         {
651             if ( rDescriptor.Type == ::com::sun::star::awt::WindowClass_TOP )
652                 bException = sal_False;
653         }
654 
655         if ( bException )
656         {
657             *ppNewComp = NULL;
658             return NULL;
659         }
660     }
661 
662     if ( nType )
663     {
664         vos::OGuard aVclGuard( Application::GetSolarMutex()  );
665         switch ( (WindowType)nType )
666         {
667             case WINDOW_CANCELBUTTON:
668                 pNewWindow = new CancelButton( pParent, nWinBits );
669                 *ppNewComp = new VCLXButton;
670             break;
671             case WINDOW_CHECKBOX:
672                 pNewWindow = new CheckBox( pParent, nWinBits );
673                 *ppNewComp = new VCLXCheckBox;
674             break;
675             case WINDOW_COMBOBOX:
676                 pNewWindow = new ComboBox( pParent, nWinBits|WB_AUTOHSCROLL );
677                 ((ComboBox*)pNewWindow)->EnableAutoSize( sal_False );
678                 *ppNewComp = new VCLXComboBox;
679             break;
680             case WINDOW_CURRENCYBOX:
681                 pNewWindow = new CurrencyBox( pParent, nWinBits );
682             break;
683             case WINDOW_CURRENCYFIELD:
684                 pNewWindow = new CurrencyField( pParent, nWinBits );
685                 static_cast<CurrencyField*>(pNewWindow)->EnableEmptyFieldValue( sal_True );
686                 *ppNewComp = new VCLXNumericField;
687                 ((VCLXFormattedSpinField*)*ppNewComp)->SetFormatter( (FormatterBase*)(CurrencyField*)pNewWindow );
688             break;
689             case WINDOW_DATEBOX:
690                 pNewWindow = new DateBox( pParent, nWinBits );
691             break;
692             case WINDOW_DATEFIELD:
693                 pNewWindow = new DateField( pParent, nWinBits );
694                 static_cast<DateField*>(pNewWindow)->EnableEmptyFieldValue( sal_True );
695                 *ppNewComp = new VCLXDateField;
696                 ((VCLXFormattedSpinField*)*ppNewComp)->SetFormatter( (FormatterBase*)(DateField*)pNewWindow );
697             break;
698             case WINDOW_DOCKINGAREA:
699                 pNewWindow = new DockingAreaWindow( pParent );
700             break;
701             case WINDOW_MULTILINEEDIT:
702             case WINDOW_EDIT:
703                 pNewWindow = new Edit( pParent, nWinBits );
704                 *ppNewComp = new VCLXEdit;
705             break;
706             case WINDOW_ERRORBOX:
707                 pNewWindow = new ErrorBox( pParent, nWinBits, String() );
708                 *ppNewComp = new VCLXMessageBox;
709             break;
710             case WINDOW_FIXEDBITMAP:
711                 pNewWindow = new FixedBitmap( pParent, nWinBits );
712             break;
713             case WINDOW_FIXEDIMAGE:
714                 pNewWindow = new ImageControl( pParent, nWinBits );
715                 *ppNewComp = new VCLXImageControl;
716             break;
717             case WINDOW_FIXEDLINE:
718                 pNewWindow = new FixedLine( pParent, nWinBits );
719             break;
720             case WINDOW_FIXEDTEXT:
721                 pNewWindow = new FixedText( pParent, nWinBits );
722                 *ppNewComp = new VCLXFixedText;
723             break;
724             case WINDOW_FLOATINGWINDOW:
725                 pNewWindow = new FloatingWindow( pParent, nWinBits );
726             break;
727             case WINDOW_GROUPBOX:
728                 pNewWindow = new GroupBox( pParent, nWinBits );
729             break;
730             case WINDOW_HELPBUTTON:
731                 pNewWindow = new HelpButton( pParent, nWinBits );
732                 *ppNewComp = new VCLXButton;
733             break;
734             case WINDOW_IMAGEBUTTON:
735                 pNewWindow = new ImageButton( pParent, nWinBits );
736                 *ppNewComp = new VCLXButton;
737             break;
738             case WINDOW_IMAGERADIOBUTTON:
739                 pNewWindow = new ImageRadioButton( pParent, nWinBits );
740                 *ppNewComp = new VCLXButton;
741             break;
742             case WINDOW_INFOBOX:
743                 pNewWindow = new InfoBox( pParent, String() );
744                 *ppNewComp = new VCLXMessageBox;
745             break;
746             case WINDOW_LISTBOX:
747                 pNewWindow = new ListBox( pParent, nWinBits|WB_SIMPLEMODE|WB_AUTOHSCROLL );
748                 ((ListBox*)pNewWindow)->EnableAutoSize( sal_False );
749                 *ppNewComp = new VCLXListBox;
750             break;
751             case WINDOW_LONGCURRENCYBOX:
752                 pNewWindow = new LongCurrencyBox( pParent, nWinBits );
753             break;
754             case WINDOW_LONGCURRENCYFIELD:
755                 pNewWindow = new LongCurrencyField( pParent, nWinBits );
756                 *ppNewComp = new VCLXCurrencyField;
757                 ((VCLXFormattedSpinField*)*ppNewComp)->SetFormatter( (FormatterBase*)(LongCurrencyField*)pNewWindow );
758             break;
759             case WINDOW_MENUBUTTON:
760                 pNewWindow = new MenuButton( pParent, nWinBits );
761                 *ppNewComp = new VCLXButton;
762             break;
763             case WINDOW_MESSBOX:
764                 pNewWindow = new MessBox( pParent, nWinBits, String(), String() );
765                 *ppNewComp = new VCLXMessageBox;
766             break;
767             case WINDOW_METRICBOX:
768                 pNewWindow = new MetricBox( pParent, nWinBits );
769             break;
770             case WINDOW_METRICFIELD:
771                 pNewWindow = new MetricField( pParent, nWinBits );
772                 *ppNewComp = new VCLXMetricField;
773                 ((VCLXFormattedSpinField*)*ppNewComp)->SetFormatter( (FormatterBase*)(MetricField*)pNewWindow );
774             break;
775             case WINDOW_DIALOG:
776             case WINDOW_MODALDIALOG:
777             case WINDOW_MODELESSDIALOG:
778             {
779                 // Modal/Modeless nur durch Show/Execute
780                 if ( (pParent == NULL ) && ( rDescriptor.ParentIndex == -1 ) )
781                     pParent = DIALOG_NO_PARENT;
782                 pNewWindow = new Dialog( pParent, nWinBits );
783                 // #i70217# Don't always create a new component object. It's possible that VCL has called
784                 // GetComponentInterface( sal_True ) in the Dialog ctor itself (see Window::IsTopWindow() )
785                 // which creates a component object.
786                 css::uno::Reference< css::awt::XWindowPeer > xWinPeer = pNewWindow->GetComponentInterface( sal_False );
787                 if ( xWinPeer.is() )
788                     *ppNewComp = dynamic_cast< VCLXDialog* >( xWinPeer.get() );
789                 else
790                     *ppNewComp = new VCLXDialog;
791             }
792             break;
793             case WINDOW_MOREBUTTON:
794                 pNewWindow = new MoreButton( pParent, nWinBits );
795                 *ppNewComp = new VCLXButton;
796             break;
797             case WINDOW_MULTILISTBOX:
798                 pNewWindow = new MultiListBox( pParent, nWinBits );
799                 *ppNewComp = new VCLXListBox;
800             break;
801             case WINDOW_NUMERICBOX:
802                 pNewWindow = new NumericBox( pParent, nWinBits );
803             break;
804             case WINDOW_NUMERICFIELD:
805                 pNewWindow = new NumericField( pParent, nWinBits );
806                 static_cast<NumericField*>(pNewWindow)->EnableEmptyFieldValue( sal_True );
807                 *ppNewComp = new VCLXNumericField;
808                 ((VCLXFormattedSpinField*)*ppNewComp)->SetFormatter( (FormatterBase*)(NumericField*)pNewWindow );
809             break;
810             case WINDOW_OKBUTTON:
811                 pNewWindow = new OKButton( pParent, nWinBits );
812                 *ppNewComp = new VCLXButton;
813             break;
814             case WINDOW_PATTERNBOX:
815                 pNewWindow = new PatternBox( pParent, nWinBits );
816             break;
817             case WINDOW_PATTERNFIELD:
818                 pNewWindow = new PatternField( pParent, nWinBits );
819                 *ppNewComp = new VCLXPatternField;
820                 ((VCLXFormattedSpinField*)*ppNewComp)->SetFormatter( (FormatterBase*)(PatternField*)pNewWindow );
821             break;
822             case WINDOW_PUSHBUTTON:
823                 pNewWindow = new PushButton( pParent, nWinBits );
824                 *ppNewComp = new VCLXButton;
825             break;
826             case WINDOW_QUERYBOX:
827                 pNewWindow = new QueryBox( pParent, nWinBits, String() );
828                 *ppNewComp = new VCLXMessageBox;
829             break;
830             case WINDOW_RADIOBUTTON:
831                 pNewWindow = new RadioButton( pParent, nWinBits );
832                 *ppNewComp = new VCLXRadioButton;
833 
834                 // by default, disable RadioCheck
835                 // Since the VCLXRadioButton really cares for it's RadioCheck settings, this is important:
836                 // if we enable it, the VCLXRadioButton will use RadioButton::Check instead of RadioButton::SetState
837                 // This leads to a strange behaviour if the control is newly created: when settings the initial
838                 // state to "checked", the RadioButton::Check (called because RadioCheck=sal_True) will uncheck
839                 // _all_other_ radio buttons in the same group. However, at this moment the grouping of the controls
840                 // is not really valid: the controls are grouped after they have been created, but we're still in
841                 // the creation process, so the RadioButton::Check relies on invalid grouping information.
842                 // 07.08.2001 - #87254# - frank.schoenheit@sun.com
843                 static_cast<RadioButton*>(pNewWindow)->EnableRadioCheck( sal_False );
844             break;
845             case WINDOW_SCROLLBAR:
846                 pNewWindow = new ScrollBar( pParent, nWinBits );
847                 *ppNewComp = new VCLXScrollBar;
848             break;
849             case WINDOW_SCROLLBARBOX:
850                 pNewWindow = new ScrollBarBox( pParent, nWinBits );
851             break;
852             case WINDOW_SPINBUTTON:
853                 pNewWindow = new SpinButton( pParent, nWinBits );
854                 *ppNewComp = new ::toolkit::VCLXSpinButton;
855             break;
856             case WINDOW_SPINFIELD:
857                 pNewWindow = new SpinField( pParent, nWinBits );
858                 *ppNewComp = new VCLXNumericField;
859             break;
860             case WINDOW_SPLITTER:
861                 pNewWindow = new Splitter( pParent, nWinBits );
862             break;
863             case WINDOW_SPLITWINDOW:
864                 pNewWindow = new SplitWindow( pParent, nWinBits );
865             break;
866             case WINDOW_STATUSBAR:
867                 pNewWindow = new StatusBar( pParent, nWinBits );
868             break;
869             case VCLWINDOW_SYSTEMCHILDWINDOW:
870                 pNewWindow = new SystemChildWindow( pParent, nWinBits );
871                 *ppNewComp = new VCLXSystemDependentWindow();
872             break;
873             case WINDOW_TABCONTROL:
874                 pNewWindow = new TabControl( pParent, nWinBits );
875                 *ppNewComp = new VCLXTabPageContainer;
876             break;
877             case WINDOW_TABDIALOG:
878                 pNewWindow = new TabDialog( pParent, nWinBits );
879             break;
880             case WINDOW_TABPAGE:
881                 /*
882                 if ( rDescriptor.WindowServiceName.equalsIgnoreAsciiCase(
883                         ::rtl::OUString::createFromAscii("tabpagemodel") ) )
884                 {
885                     pNewWindow = new TabControl( pParent, nWinBits );
886                     *ppNewComp = new VCLXTabPageContainer;
887                 }
888                 else
889                 */
890                 {
891                     pNewWindow = new TabPage( pParent, nWinBits );
892                     *ppNewComp = new VCLXTabPage;
893                 }
894             break;
895             case WINDOW_TIMEBOX:
896                 pNewWindow = new TimeBox( pParent, nWinBits );
897             break;
898             case WINDOW_TIMEFIELD:
899                 pNewWindow = new TimeField( pParent, nWinBits );
900                 static_cast<TimeField*>(pNewWindow)->EnableEmptyFieldValue( sal_True );
901                 *ppNewComp = new VCLXTimeField;
902                 ((VCLXFormattedSpinField*)*ppNewComp)->SetFormatter( (FormatterBase*)(TimeField*)pNewWindow );
903             break;
904             case WINDOW_TOOLBOX:
905                 pNewWindow = new ToolBox( pParent, nWinBits );
906                 *ppNewComp = new VCLXToolBox;
907             break;
908             case WINDOW_TRISTATEBOX:
909                 pNewWindow = new TriStateBox( pParent, nWinBits );
910             break;
911             case WINDOW_WARNINGBOX:
912                 pNewWindow = new WarningBox( pParent, nWinBits, String() );
913                 *ppNewComp = new VCLXMessageBox;
914             break;
915             case WINDOW_WORKWINDOW:
916             case WINDOW_WINDOW:
917             case VCLWINDOW_FRAMEWINDOW:
918             case WINDOW_DOCKINGWINDOW:
919                 if ( rDescriptor.Type == ::com::sun::star::awt::WindowClass_TOP )
920                 {
921                     if (nType == WINDOW_DOCKINGWINDOW )
922                         pNewWindow = new DockingWindow( pParent, nWinBits );
923                     else
924                     {
925                         if ((pParent == NULL) && rDescriptor.Parent.is())
926                         {
927                             // try to get a system dependent window handle
928                             ::com::sun::star::uno::Reference< ::com::sun::star::awt::XSystemDependentWindowPeer > xSystemDepParent(rDescriptor.Parent, ::com::sun::star::uno::UNO_QUERY);
929 
930                             if (xSystemDepParent.is())
931                             {
932                                 sal_Int8 processID[16];
933 
934                                 rtl_getGlobalProcessId( (sal_uInt8*)processID );
935 
936                                 ::com::sun::star::uno::Sequence<sal_Int8> processIdSeq(processID, 16);
937 
938                                 ::com::sun::star::uno::Any anyHandle = xSystemDepParent->getWindowHandle(processIdSeq, SYSTEM_DEPENDENT_TYPE);
939 
940                                 // use sal_Int64 here to accomodate all int types
941                                 // uno::Any shift operator whill upcast if necessary
942                                 sal_Int64 nWindowHandle = 0;
943                                 sal_Bool bXEmbed = sal_False;
944 
945                                 bool bUseParentData = true;
946                                 if( ! (anyHandle >>= nWindowHandle) )
947                                 {
948                                     css::uno::Sequence< css::beans::NamedValue > aProps;
949                                     if( anyHandle >>= aProps )
950                                     {
951                                         const int nProps = aProps.getLength();
952                                         const css::beans::NamedValue* pProps = aProps.getConstArray();
953                                         for( int i = 0; i < nProps; i++ )
954                                         {
955                                             if( pProps[i].Name.equalsAscii( "WINDOW" ) )
956                                                 pProps[i].Value >>= nWindowHandle;
957                                             else if( pProps[i].Name.equalsAscii( "XEMBED" ) )
958                                                 pProps[i].Value >>= bXEmbed;
959                                         }
960                                     }
961                                     else
962                                         bUseParentData = false;
963                                 }
964 
965                                 if( bUseParentData )
966                                 {
967                                     SystemParentData aParentData;
968                                     aParentData.nSize   = sizeof( aParentData );
969                                     #if defined QUARTZ
970                                     aParentData.pView   = reinterpret_cast<NSView*>(nWindowHandle);
971                                     #elif defined UNX
972                                     aParentData.aWindow = nWindowHandle;
973                                     aParentData.bXEmbedSupport = bXEmbed;
974                                     #elif defined WNT
975                                     aParentData.hWnd = reinterpret_cast<HWND>(nWindowHandle);
976                                     #elif defined OS2
977                                     aParentData.hWnd = (HWND)nWindowHandle;
978                                     #endif
979                                     pNewWindow = new WorkWindow( &aParentData );
980                                 }
981                             }
982                         }
983 
984                         if (!pNewWindow)
985                             pNewWindow = new WorkWindow( pParent, nWinBits );
986                     }
987 
988                     *ppNewComp = new VCLXTopWindow( pNewWindow->GetType() == WINDOW_WORKWINDOW );
989                 }
990                 else if ( rDescriptor.Type == ::com::sun::star::awt::WindowClass_CONTAINER )
991                 {
992                     if (nType == WINDOW_DOCKINGWINDOW )
993                         pNewWindow = new DockingWindow( pParent, nWinBits );
994                     else
995                         pNewWindow = new Window( pParent, nWinBits );
996                     *ppNewComp = new VCLXContainer;
997                 }
998                 else
999                 {
1000                     if (nType == WINDOW_DOCKINGWINDOW )
1001                         pNewWindow = new DockingWindow( pParent, nWinBits );
1002                     else
1003                         pNewWindow = new Window( pParent, nWinBits );
1004                     *ppNewComp = new VCLXWindow;
1005                 }
1006             break;
1007             case WINDOW_CONTROL:
1008                 if ( rDescriptor.WindowServiceName.equalsIgnoreAsciiCase(
1009                         ::rtl::OUString::createFromAscii("tabpagecontainer") ) )
1010                 {
1011                     pNewWindow = new TabControl( pParent, nWinBits );
1012                     *ppNewComp = new VCLXTabPageContainer;
1013                 }
1014                 else if ( aServiceName.EqualsAscii( "animatedimages" ) )
1015                 {
1016                     pNewWindow = new Throbber( pParent, nWinBits );
1017                     *ppNewComp = new ::toolkit::AnimatedImagesPeer;
1018                 }
1019             break;
1020             default:
1021                 OSL_ENSURE( false, "VCLXToolkit::ImplCreateWindow: unknown window type!" );
1022                 break;
1023         }
1024     }
1025 
1026     return pNewWindow;
1027 }
1028 
1029 extern "C" { static void SAL_CALL thisModule() {} }
1030 
1031 css::uno::Reference< css::awt::XWindowPeer > VCLXToolkit::ImplCreateWindow(
1032     const css::awt::WindowDescriptor& rDescriptor,
1033     WinBits nForceWinBits )
1034 {
1035     ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
1036 
1037     osl::Guard< vos::IMutex > aSolarGuard( Application::GetSolarMutex() );
1038 
1039     ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindowPeer > xRef;
1040 
1041     Window* pParent = NULL;
1042     if ( rDescriptor.Parent.is() )
1043     {
1044         VCLXWindow* pParentComponent = VCLXWindow::GetImplementation( rDescriptor.Parent );
1045 
1046         // #103939# Don't through assertion, may be it's a system dependend window, used in ImplCreateWindow.
1047         // DBG_ASSERT( pParentComponent, "ParentComponent not valid" );
1048 
1049         if ( pParentComponent )
1050             pParent = pParentComponent->GetWindow();
1051     }
1052 
1053     WinBits nWinBits = ImplGetWinBits( rDescriptor.WindowAttributes,
1054         ImplGetComponentType( rDescriptor.WindowServiceName ) );
1055     nWinBits |= nForceWinBits;
1056 
1057     VCLXWindow* pNewComp = NULL;
1058 
1059     Window* pNewWindow = NULL;
1060     // Try to create the window with SvTools
1061     // (do this _before_ creating it on our own: The old mechanism (extended toolkit in SvTools) did it this way,
1062     // and we need to stay compatible)
1063     // try to load the lib
1064     if ( !fnSvtCreateWindow && !hSvToolsLib )
1065     {
1066         ::rtl::OUString aLibName = ::vcl::unohelper::CreateLibraryName( "svt", sal_True );
1067         hSvToolsLib = osl_loadModuleRelative(
1068             &thisModule, aLibName.pData, SAL_LOADMODULE_DEFAULT );
1069         if ( hSvToolsLib )
1070         {
1071             ::rtl::OUString aFunctionName( RTL_CONSTASCII_USTRINGPARAM( "CreateWindow" ) );
1072             fnSvtCreateWindow = (FN_SvtCreateWindow)osl_getFunctionSymbol( hSvToolsLib, aFunctionName.pData );
1073         }
1074     }
1075     // ask the SvTool creation function
1076     if ( fnSvtCreateWindow )
1077         pNewWindow = fnSvtCreateWindow( &pNewComp, &rDescriptor, pParent, nWinBits );
1078 
1079     // if SvTools could not provide a window, create it ourself
1080     if ( !pNewWindow )
1081         pNewWindow = ImplCreateWindow( &pNewComp, rDescriptor, pParent, nWinBits );
1082 
1083     DBG_ASSERT( pNewWindow, "createWindow: Unknown Component!" );
1084     DBG_ASSERTWARNING( pNewComp, "createWindow: No special Interface!" );
1085 
1086     if ( pNewWindow )
1087     {
1088         pNewWindow->SetCreatedWithToolkit( sal_True );
1089         //pNewWindow->SetPosPixel( Point() ); // do not force (0,0) position, keep default pos instead
1090 
1091         if ( rDescriptor.WindowAttributes & ::com::sun::star::awt::WindowAttribute::MINSIZE )
1092         {
1093             pNewWindow->SetSizePixel( Size() );
1094         }
1095         else if ( rDescriptor.WindowAttributes & ::com::sun::star::awt::WindowAttribute::FULLSIZE )
1096         {
1097             if ( pParent )
1098                 pNewWindow->SetSizePixel( pParent->GetOutputSizePixel() );
1099         }
1100         else if ( !VCLUnoHelper::IsZero( rDescriptor.Bounds ) )
1101         {
1102             Rectangle aRect = VCLRectangle( rDescriptor.Bounds );
1103             pNewWindow->SetPosSizePixel( aRect.TopLeft(), aRect.GetSize() );
1104         }
1105 
1106         if ( !pNewComp )
1107         {
1108             // Default-Interface
1109             xRef = pNewWindow->GetComponentInterface( sal_True );
1110         }
1111         else
1112         {
1113             pNewComp->SetCreatedWithToolkit( sal_True );
1114             xRef = pNewComp;
1115             pNewWindow->SetComponentInterface( xRef );
1116         }
1117         DBG_ASSERT( pNewWindow->GetComponentInterface( sal_False ) == xRef,
1118             "VCLXToolkit::createWindow: did #133706# resurge?" );
1119 
1120         if ( rDescriptor.WindowAttributes & ::com::sun::star::awt::WindowAttribute::SHOW )
1121             pNewWindow->Show();
1122     }
1123 
1124     return xRef;
1125 }
1126 
1127 ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindowPeer > > VCLXToolkit::createWindows( const ::com::sun::star::uno::Sequence< ::com::sun::star::awt::WindowDescriptor >& rDescriptors ) throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException)
1128 {
1129     ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
1130 
1131     sal_uInt32 nComponents = rDescriptors.getLength();
1132     ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindowPeer > > aSeq( nComponents );
1133     for ( sal_uInt32 n = 0; n < nComponents; n++ )
1134     {
1135         ::com::sun::star::awt::WindowDescriptor aDescr = rDescriptors.getConstArray()[n];
1136 
1137         if ( aDescr.ParentIndex == (-1) )
1138             aDescr.Parent = NULL;
1139         else if ( ( aDescr.ParentIndex >= 0 ) && ( aDescr.ParentIndex < (short)n ) )
1140             aDescr.Parent = aSeq.getConstArray()[aDescr.ParentIndex];
1141         aSeq.getArray()[n] = createWindow( aDescr );
1142     }
1143     return aSeq;
1144 }
1145 
1146 // ::com::sun::star::awt::XSystemChildFactory
1147 ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindowPeer > VCLXToolkit::createSystemChild( const ::com::sun::star::uno::Any& Parent, const ::com::sun::star::uno::Sequence< sal_Int8 >& /*ProcessId*/, sal_Int16 nSystemType ) throw(::com::sun::star::uno::RuntimeException)
1148 {
1149     Window* pChildWindow = NULL;
1150     if ( nSystemType == SYSTEM_DEPENDENT_TYPE )
1151     {
1152         // use sal_Int64 here to accomodate all int types
1153         // uno::Any shift operator whill upcast if necessary
1154         sal_Int64 nWindowHandle = 0;
1155         sal_Bool bXEmbed = sal_False;
1156 
1157         bool bUseParentData = true;
1158         if( ! (Parent >>= nWindowHandle) )
1159         {
1160             css::uno::Sequence< css::beans::NamedValue > aProps;
1161             if( Parent >>= aProps )
1162             {
1163                 const int nProps = aProps.getLength();
1164                 const css::beans::NamedValue* pProps = aProps.getConstArray();
1165                 for( int i = 0; i < nProps; i++ )
1166                 {
1167                     if( pProps[i].Name.equalsAscii( "WINDOW" ) )
1168                         pProps[i].Value >>= nWindowHandle;
1169                     else if( pProps[i].Name.equalsAscii( "XEMBED" ) )
1170                         pProps[i].Value >>= bXEmbed;
1171                 }
1172             }
1173             else
1174                 bUseParentData = false;
1175         }
1176 
1177         if( bUseParentData )
1178         {
1179             SystemParentData aParentData;
1180             aParentData.nSize   = sizeof( aParentData );
1181             #if defined QUARTZ
1182             aParentData.pView   = reinterpret_cast<NSView*>(nWindowHandle);
1183             #elif defined UNX
1184             aParentData.aWindow = nWindowHandle;
1185             aParentData.bXEmbedSupport = bXEmbed;
1186             #elif defined WNT
1187             aParentData.hWnd = reinterpret_cast<HWND>(nWindowHandle);
1188             #elif defined OS2
1189             aParentData.hWnd = (HWND)nWindowHandle;
1190             #endif
1191             osl::Guard< vos::IMutex > aGuard( Application::GetSolarMutex() );
1192             try
1193             {
1194                 pChildWindow = new WorkWindow( &aParentData );
1195             }
1196             catch ( ::com::sun::star::uno::RuntimeException & rEx )
1197             {
1198                 // system child window could not be created
1199                 OSL_TRACE(
1200                     "VCLXToolkit::createSystemChild: caught %s\n",
1201                     ::rtl::OUStringToOString(
1202                         rEx.Message, RTL_TEXTENCODING_UTF8).getStr());
1203                 pChildWindow = NULL;
1204             }
1205         }
1206     }
1207     else if (nSystemType == com::sun::star::lang::SystemDependent::SYSTEM_JAVA)
1208     {
1209         osl::Guard< vos::IMutex > aGuard(Application::GetSolarMutex());
1210         pChildWindow = new WorkWindow(0, Parent);
1211     }
1212 
1213     ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindowPeer > xPeer;
1214     if ( pChildWindow )
1215     {
1216         VCLXTopWindow* pPeer = new VCLXTopWindow(true);
1217         osl::Guard< vos::IMutex > aGuard( Application::GetSolarMutex() );
1218         pPeer->SetWindow( pChildWindow );
1219         xPeer = pPeer;
1220     }
1221 
1222     return xPeer;
1223 }
1224 
1225 // ::com::sun::star::awt::XMessageBoxFactory
1226 ::com::sun::star::uno::Reference< ::com::sun::star::awt::XMessageBox > SAL_CALL VCLXToolkit::createMessageBox(
1227     const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindowPeer >& aParent,
1228     const ::com::sun::star::awt::Rectangle& aPosSize,
1229     const ::rtl::OUString& aType,
1230     ::sal_Int32 aButtons,
1231     const ::rtl::OUString& aTitle,
1232     const ::rtl::OUString& aMessage ) throw (::com::sun::star::uno::RuntimeException)
1233 {
1234     ::com::sun::star::awt::WindowDescriptor aDescriptor;
1235 
1236     sal_Int32 nWindowAttributes = css::awt::WindowAttribute::BORDER|css::awt::WindowAttribute::MOVEABLE|css::awt::WindowAttribute::CLOSEABLE;
1237 
1238     // Map button definitions to window attributes
1239     if (( aButtons & 0x0000ffffL ) == css::awt::MessageBoxButtons::BUTTONS_OK )
1240         nWindowAttributes |= css::awt::VclWindowPeerAttribute::OK;
1241     else if (( aButtons & 0x0000ffffL ) == css::awt::MessageBoxButtons::BUTTONS_OK_CANCEL )
1242         nWindowAttributes |= css::awt::VclWindowPeerAttribute::OK_CANCEL;
1243     else if (( aButtons & 0x0000ffffL ) == css::awt::MessageBoxButtons::BUTTONS_YES_NO )
1244         nWindowAttributes |= css::awt::VclWindowPeerAttribute::YES_NO;
1245     else if (( aButtons & 0x0000ffffL ) == css::awt::MessageBoxButtons::BUTTONS_YES_NO_CANCEL )
1246         nWindowAttributes |= css::awt::VclWindowPeerAttribute::YES_NO_CANCEL;
1247     else if (( aButtons & 0x0000ffffL ) == css::awt::MessageBoxButtons::BUTTONS_RETRY_CANCEL )
1248         nWindowAttributes |= css::awt::VclWindowPeerAttribute::RETRY_CANCEL;
1249 
1250     // Map default button definitions to window attributes
1251     if (sal_Int32( aButtons & 0xffff0000L ) == css::awt::MessageBoxButtons::DEFAULT_BUTTON_OK )
1252         nWindowAttributes |= css::awt::VclWindowPeerAttribute::DEF_OK;
1253     else if (sal_Int32( aButtons & 0xffff0000L ) == css::awt::MessageBoxButtons::DEFAULT_BUTTON_CANCEL )
1254         nWindowAttributes |= css::awt::VclWindowPeerAttribute::DEF_CANCEL;
1255     else if (sal_Int32( aButtons & 0xffff0000L ) == css::awt::MessageBoxButtons::DEFAULT_BUTTON_YES )
1256         nWindowAttributes |= css::awt::VclWindowPeerAttribute::DEF_YES;
1257     else if (sal_Int32( aButtons & 0xffff0000L ) == css::awt::MessageBoxButtons::DEFAULT_BUTTON_NO )
1258         nWindowAttributes |= css::awt::VclWindowPeerAttribute::DEF_NO;
1259     else if (sal_Int32( aButtons & 0xffff0000L ) == css::awt::MessageBoxButtons::DEFAULT_BUTTON_RETRY )
1260         nWindowAttributes |= css::awt::VclWindowPeerAttribute::DEF_RETRY;
1261 
1262     // No more bits for VclWindowPeerAttribute possible. Mapping must be
1263     // done explicitly using VCL methods
1264     WinBits nAddWinBits( 0 );
1265     if (( aButtons & 0x0000ffffL ) == css::awt::MessageBoxButtons::BUTTONS_ABORT_IGNORE_RETRY )
1266         nAddWinBits |= WB_ABORT_RETRY_IGNORE;
1267     if ( sal_Int32( aButtons & 0xffff0000L ) == css::awt::MessageBoxButtons::DEFAULT_BUTTON_IGNORE )
1268         nAddWinBits |= WB_DEF_IGNORE;
1269 
1270     aDescriptor.Type              = css::awt::WindowClass_MODALTOP;
1271     aDescriptor.WindowServiceName = aType;
1272     aDescriptor.ParentIndex       = -1;
1273     aDescriptor.Parent            = aParent;
1274     aDescriptor.Bounds            = aPosSize;
1275     aDescriptor.WindowAttributes  = nWindowAttributes;
1276     ::com::sun::star::uno::Reference< ::com::sun::star::awt::XMessageBox > xMsgBox(
1277         ImplCreateWindow( aDescriptor, nAddWinBits ), css::uno::UNO_QUERY );
1278     css::uno::Reference< css::awt::XWindow > xWindow( xMsgBox, css::uno::UNO_QUERY );
1279     if ( xMsgBox.is() && xWindow.is() )
1280     {
1281         Window * pWindow = VCLUnoHelper::GetWindow( xWindow );
1282         if ( pWindow )
1283         {
1284             osl::Guard< vos::IMutex > aGuard(Application::GetSolarMutex());
1285             xMsgBox->setCaptionText( aTitle );
1286             xMsgBox->setMessageText( aMessage );
1287         }
1288     }
1289 
1290     return xMsgBox;
1291 }
1292 
1293 ::com::sun::star::uno::Reference< ::com::sun::star::datatransfer::dnd::XDragGestureRecognizer > SAL_CALL VCLXToolkit::getDragGestureRecognizer( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindow >& window ) throw(::com::sun::star::uno::RuntimeException)
1294 {
1295     Window * pWindow = VCLUnoHelper::GetWindow( window );
1296 
1297     if( pWindow )
1298         return pWindow->GetDragGestureRecognizer();
1299 
1300     return ::com::sun::star::uno::Reference< ::com::sun::star::datatransfer::dnd::XDragGestureRecognizer >();
1301 }
1302 
1303 ::com::sun::star::uno::Reference< ::com::sun::star::datatransfer::dnd::XDragSource > SAL_CALL VCLXToolkit::getDragSource( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindow >& window ) throw(::com::sun::star::uno::RuntimeException)
1304 {
1305     Window * pWindow = VCLUnoHelper::GetWindow( window );
1306 
1307     if( pWindow )
1308         return pWindow->GetDragSource();
1309 
1310     return ::com::sun::star::uno::Reference< ::com::sun::star::datatransfer::dnd::XDragSource >();
1311 }
1312 
1313 ::com::sun::star::uno::Reference< ::com::sun::star::datatransfer::dnd::XDropTarget > SAL_CALL VCLXToolkit::getDropTarget( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindow >& window ) throw(::com::sun::star::uno::RuntimeException)
1314 {
1315     Window * pWindow = VCLUnoHelper::GetWindow( window );
1316 
1317     if( pWindow )
1318         return pWindow->GetDropTarget();
1319 
1320     return ::com::sun::star::uno::Reference< ::com::sun::star::datatransfer::dnd::XDropTarget >();
1321 }
1322 
1323 ::com::sun::star::uno::Reference< ::com::sun::star::datatransfer::clipboard::XClipboard > SAL_CALL VCLXToolkit::getClipboard( const ::rtl::OUString& clipboardName ) throw(::com::sun::star::uno::RuntimeException)
1324 {
1325     if( clipboardName.getLength() == 0 )
1326     {
1327         if( !mxClipboard.is() )
1328         {
1329             ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > xFactory = ::comphelper::getProcessServiceFactory();
1330             if ( xFactory.is() )
1331             {
1332                 // remember clipboard here
1333                 mxClipboard = ::com::sun::star::uno::Reference< ::com::sun::star::datatransfer::clipboard::XClipboard > (
1334                     xFactory->createInstance( ::rtl::OUString::createFromAscii( "com.sun.star.datatransfer.clipboard.SystemClipboard" ) ), ::com::sun::star::uno::UNO_QUERY );
1335             }
1336         }
1337 
1338         return mxClipboard;
1339     }
1340 
1341     else if( clipboardName.equals( ::rtl::OUString::createFromAscii("Selection") ) )
1342     {
1343         return mxSelection;
1344     }
1345 
1346     return ::com::sun::star::uno::Reference< ::com::sun::star::datatransfer::clipboard::XClipboard >();
1347 }
1348 
1349 // XServiceInfo
1350 ::rtl::OUString VCLXToolkit::getImplementationName() throw(::com::sun::star::uno::RuntimeException)
1351 {
1352     return rtl::OUString::createFromAscii( "stardiv.Toolkit.VCLXToolkit" );
1353 }
1354 
1355 sal_Bool VCLXToolkit::supportsService( const ::rtl::OUString& rServiceName ) throw(::com::sun::star::uno::RuntimeException)
1356 {
1357     ::osl::MutexGuard aGuard( GetMutex() );
1358 
1359     ::com::sun::star::uno::Sequence< ::rtl::OUString > aSNL = getSupportedServiceNames();
1360     const ::rtl::OUString* pArray = aSNL.getConstArray();
1361     const ::rtl::OUString* pArrayEnd = aSNL.getConstArray();
1362     for (; pArray != pArrayEnd; ++pArray )
1363         if( *pArray == rServiceName )
1364             break;
1365 
1366     return pArray != pArrayEnd;
1367 }
1368 
1369 ::com::sun::star::uno::Sequence< ::rtl::OUString > VCLXToolkit::getSupportedServiceNames() throw(::com::sun::star::uno::RuntimeException)
1370 {
1371     ::rtl::OUString aServiceName( ::rtl::OUString::createFromAscii( szServiceName2_Toolkit ) );
1372     return ::com::sun::star::uno::Sequence< ::rtl::OUString >( &aServiceName, 1);
1373 }
1374 
1375 // css::awt::XExtendedToolkit:
1376 
1377 // virtual
1378 ::sal_Int32 SAL_CALL VCLXToolkit::getTopWindowCount()
1379     throw (::css::uno::RuntimeException)
1380 {
1381     return static_cast< ::sal_Int32 >(::Application::GetTopWindowCount());
1382         // XXX  numeric overflow
1383 }
1384 
1385 // virtual
1386 ::css::uno::Reference< ::css::awt::XTopWindow > SAL_CALL
1387 VCLXToolkit::getTopWindow(::sal_Int32 nIndex)
1388     throw (::css::uno::RuntimeException)
1389 {
1390     ::Window * p = ::Application::GetTopWindow(static_cast< long >(nIndex));
1391         // XXX  numeric overflow
1392     return ::css::uno::Reference< ::css::awt::XTopWindow >(
1393         p == 0 ? 0 : static_cast< ::css::awt::XWindow * >(p->GetWindowPeer()),
1394         ::css::uno::UNO_QUERY);
1395 }
1396 
1397 // virtual
1398 ::css::uno::Reference< ::css::awt::XTopWindow > SAL_CALL
1399 VCLXToolkit::getActiveTopWindow() throw (::css::uno::RuntimeException)
1400 {
1401     ::Window * p = ::Application::GetActiveTopWindow();
1402     return ::css::uno::Reference< ::css::awt::XTopWindow >(
1403         p == 0 ? 0 : static_cast< ::css::awt::XWindow * >(p->GetWindowPeer()),
1404         ::css::uno::UNO_QUERY);
1405 }
1406 
1407 // virtual
1408 void SAL_CALL VCLXToolkit::addTopWindowListener(
1409     ::css::uno::Reference< ::css::awt::XTopWindowListener > const & rListener)
1410     throw (::css::uno::RuntimeException)
1411 {
1412     OSL_ENSURE(rListener.is(), "Null rListener");
1413     ::osl::ClearableMutexGuard aGuard(rBHelper.rMutex);
1414     if (rBHelper.bDisposed || rBHelper.bInDispose)
1415     {
1416         aGuard.clear();
1417         rListener->disposing(
1418             ::css::lang::EventObject(
1419                 static_cast< ::cppu::OWeakObject * >(this)));
1420     }
1421     else if (m_aTopWindowListeners.addInterface(rListener) == 1
1422              && !m_bEventListener)
1423     {
1424         m_bEventListener = true;
1425         ::Application::AddEventListener(m_aEventListenerLink);
1426     }
1427 }
1428 
1429 // virtual
1430 void SAL_CALL VCLXToolkit::removeTopWindowListener(
1431     ::css::uno::Reference< ::css::awt::XTopWindowListener > const & rListener)
1432     throw (::css::uno::RuntimeException)
1433 {
1434     ::osl::MutexGuard aGuard(rBHelper.rMutex);
1435     if (!(rBHelper.bDisposed || rBHelper.bInDispose)
1436         && m_aTopWindowListeners.removeInterface(rListener) == 0
1437         && m_aFocusListeners.getLength() == 0 && m_bEventListener)
1438     {
1439         ::Application::RemoveEventListener(m_aEventListenerLink);
1440         m_bEventListener = false;
1441     }
1442 }
1443 
1444 // virtual
1445 void SAL_CALL VCLXToolkit::addKeyHandler(
1446     ::css::uno::Reference< ::css::awt::XKeyHandler > const & rHandler)
1447     throw (::css::uno::RuntimeException)
1448 {
1449     OSL_ENSURE(rHandler.is(), "Null rHandler");
1450     ::osl::ClearableMutexGuard aGuard(rBHelper.rMutex);
1451     if (rBHelper.bDisposed || rBHelper.bInDispose)
1452     {
1453         aGuard.clear();
1454         rHandler->disposing(
1455             ::css::lang::EventObject(
1456                 static_cast< ::cppu::OWeakObject * >(this)));
1457     }
1458     else if (m_aKeyHandlers.addInterface(rHandler) == 1 && !m_bKeyListener)
1459     {
1460         m_bKeyListener = true;
1461         ::Application::AddKeyListener(m_aKeyListenerLink);
1462     }
1463 }
1464 
1465 // virtual
1466 void SAL_CALL VCLXToolkit::removeKeyHandler(
1467     ::css::uno::Reference< ::css::awt::XKeyHandler > const & rHandler)
1468     throw (::css::uno::RuntimeException)
1469 {
1470     ::osl::MutexGuard aGuard(rBHelper.rMutex);
1471     if (!(rBHelper.bDisposed || rBHelper.bInDispose)
1472         && m_aKeyHandlers.removeInterface(rHandler) == 0 && m_bKeyListener)
1473     {
1474         ::Application::RemoveKeyListener(m_aKeyListenerLink);
1475         m_bKeyListener = false;
1476     }
1477 }
1478 
1479 // virtual
1480 void SAL_CALL VCLXToolkit::addFocusListener(
1481     ::css::uno::Reference< ::css::awt::XFocusListener > const & rListener)
1482     throw (::css::uno::RuntimeException)
1483 {
1484     OSL_ENSURE(rListener.is(), "Null rListener");
1485     ::osl::ClearableMutexGuard aGuard(rBHelper.rMutex);
1486     if (rBHelper.bDisposed || rBHelper.bInDispose)
1487     {
1488         aGuard.clear();
1489         rListener->disposing(
1490             ::css::lang::EventObject(
1491                 static_cast< ::cppu::OWeakObject * >(this)));
1492     }
1493     else if (m_aFocusListeners.addInterface(rListener) == 1
1494              && !m_bEventListener)
1495     {
1496         m_bEventListener = true;
1497         ::Application::AddEventListener(m_aEventListenerLink);
1498     }
1499 }
1500 
1501 // virtual
1502 void SAL_CALL VCLXToolkit::removeFocusListener(
1503     ::css::uno::Reference< ::css::awt::XFocusListener > const & rListener)
1504     throw (::css::uno::RuntimeException)
1505 {
1506     ::osl::MutexGuard aGuard(rBHelper.rMutex);
1507     if (!(rBHelper.bDisposed || rBHelper.bInDispose)
1508         && m_aFocusListeners.removeInterface(rListener) == 0
1509         && m_aTopWindowListeners.getLength() == 0 && m_bEventListener)
1510     {
1511         ::Application::RemoveEventListener(m_aEventListenerLink);
1512         m_bEventListener = false;
1513     }
1514 }
1515 
1516 // virtual
1517 void SAL_CALL VCLXToolkit::fireFocusGained(
1518     ::com::sun::star::uno::Reference<
1519     ::com::sun::star::uno::XInterface > const &)
1520     throw (::com::sun::star::uno::RuntimeException)
1521 {
1522 }
1523 
1524 // virtual
1525 void SAL_CALL VCLXToolkit::fireFocusLost(
1526     ::com::sun::star::uno::Reference<
1527     ::com::sun::star::uno::XInterface > const &)
1528     throw (::com::sun::star::uno::RuntimeException)
1529 {
1530 }
1531 
1532 
1533 IMPL_LINK(VCLXToolkit, eventListenerHandler, ::VclSimpleEvent const *, pEvent)
1534 {
1535     switch (pEvent->GetId())
1536     {
1537     case VCLEVENT_WINDOW_SHOW:
1538         callTopWindowListeners(
1539             pEvent, &::css::awt::XTopWindowListener::windowOpened);
1540         break;
1541     case VCLEVENT_WINDOW_HIDE:
1542         callTopWindowListeners(
1543             pEvent, &::css::awt::XTopWindowListener::windowClosed);
1544         break;
1545     case VCLEVENT_WINDOW_ACTIVATE:
1546         callTopWindowListeners(
1547             pEvent, &::css::awt::XTopWindowListener::windowActivated);
1548         break;
1549     case VCLEVENT_WINDOW_DEACTIVATE:
1550         callTopWindowListeners(
1551             pEvent, &::css::awt::XTopWindowListener::windowDeactivated);
1552         break;
1553     case VCLEVENT_WINDOW_CLOSE:
1554         callTopWindowListeners(
1555             pEvent, &::css::awt::XTopWindowListener::windowClosing);
1556         break;
1557     case VCLEVENT_WINDOW_GETFOCUS:
1558         callFocusListeners(pEvent, true);
1559         break;
1560     case VCLEVENT_WINDOW_LOSEFOCUS:
1561         callFocusListeners(pEvent, false);
1562         break;
1563     case VCLEVENT_WINDOW_MINIMIZE:
1564         callTopWindowListeners(
1565             pEvent, &::css::awt::XTopWindowListener::windowMinimized);
1566         break;
1567     case VCLEVENT_WINDOW_NORMALIZE:
1568         callTopWindowListeners(
1569             pEvent, &::css::awt::XTopWindowListener::windowNormalized);
1570         break;
1571     }
1572     return 0;
1573 }
1574 
1575 IMPL_LINK(VCLXToolkit, keyListenerHandler, ::VclSimpleEvent const *, pEvent)
1576 {
1577     switch (pEvent->GetId())
1578     {
1579     case VCLEVENT_WINDOW_KEYINPUT:
1580         return callKeyHandlers(pEvent, true);
1581     case VCLEVENT_WINDOW_KEYUP:
1582         return callKeyHandlers(pEvent, false);
1583     }
1584     return 0;
1585 }
1586 
1587 void VCLXToolkit::callTopWindowListeners(
1588     ::VclSimpleEvent const * pEvent,
1589     void (SAL_CALL ::css::awt::XTopWindowListener::* pFn)(
1590         ::css::lang::EventObject const &))
1591 {
1592     ::Window * pWindow
1593           = static_cast< ::VclWindowEvent const * >(pEvent)->GetWindow();
1594     if (pWindow->IsTopWindow())
1595     {
1596         ::css::uno::Sequence< ::css::uno::Reference< ::css::uno::XInterface > >
1597               aListeners(m_aTopWindowListeners.getElements());
1598         if (aListeners.hasElements())
1599         {
1600             ::css::lang::EventObject aAwtEvent(
1601                 static_cast< ::css::awt::XWindow * >(pWindow->GetWindowPeer()));
1602             for (::sal_Int32 i = 0; i < aListeners.getLength(); ++i)
1603             {
1604                 ::css::uno::Reference< ::css::awt::XTopWindowListener >
1605                       xListener(aListeners[i], ::css::uno::UNO_QUERY);
1606                 try
1607                 {
1608                     (xListener.get()->*pFn)(aAwtEvent);
1609                 }
1610                 catch (::css::uno::RuntimeException & rEx)
1611                 {
1612                     OSL_TRACE(
1613                         "VCLXToolkit::callTopWindowListeners: caught %s\n",
1614                         ::rtl::OUStringToOString(
1615                             rEx.Message, RTL_TEXTENCODING_UTF8).getStr());
1616                 }
1617             }
1618         }
1619     }
1620 }
1621 
1622 long VCLXToolkit::callKeyHandlers(::VclSimpleEvent const * pEvent,
1623                                   bool bPressed)
1624 {
1625     ::css::uno::Sequence< ::css::uno::Reference< ::css::uno::XInterface > >
1626           aHandlers(m_aKeyHandlers.getElements());
1627 
1628     if (aHandlers.hasElements())
1629     {
1630         ::Window * pWindow = static_cast< ::VclWindowEvent const * >(pEvent)->GetWindow();
1631 
1632         // See implementation in vclxwindow.cxx for mapping between VCL and UNO AWT event
1633         ::KeyEvent * pKeyEvent = static_cast< ::KeyEvent * >(
1634             static_cast< ::VclWindowEvent const * >(pEvent)->GetData());
1635         ::css::awt::KeyEvent aAwtEvent(
1636             static_cast< ::css::awt::XWindow * >(pWindow->GetWindowPeer()),
1637             (pKeyEvent->GetKeyCode().IsShift()
1638              ? ::css::awt::KeyModifier::SHIFT : 0)
1639             | (pKeyEvent->GetKeyCode().IsMod1()
1640                ? ::css::awt::KeyModifier::MOD1 : 0)
1641             | (pKeyEvent->GetKeyCode().IsMod2()
1642                ? ::css::awt::KeyModifier::MOD2 : 0)
1643             | (pKeyEvent->GetKeyCode().IsMod3()
1644                ? ::css::awt::KeyModifier::MOD3 : 0),
1645             pKeyEvent->GetKeyCode().GetCode(), pKeyEvent->GetCharCode(),
1646             sal::static_int_cast< sal_Int16 >(
1647                 pKeyEvent->GetKeyCode().GetFunction()));
1648         for (::sal_Int32 i = 0; i < aHandlers.getLength(); ++i)
1649         {
1650             ::css::uno::Reference< ::css::awt::XKeyHandler > xHandler(
1651                 aHandlers[i], ::css::uno::UNO_QUERY);
1652             try
1653             {
1654                 if ((bPressed ? xHandler->keyPressed(aAwtEvent)
1655                       : xHandler->keyReleased(aAwtEvent)))
1656                     return 1;
1657             }
1658             catch (::css::uno::RuntimeException & rEx)
1659             {
1660                 OSL_TRACE(
1661                     "VCLXToolkit::callKeyHandlers: caught %s\n",
1662                     ::rtl::OUStringToOString(
1663                        rEx.Message, RTL_TEXTENCODING_UTF8).getStr());
1664             }
1665         }
1666     }
1667     return 0;
1668 }
1669 
1670 void VCLXToolkit::callFocusListeners(::VclSimpleEvent const * pEvent,
1671                                      bool bGained)
1672 {
1673     ::Window * pWindow
1674           = static_cast< ::VclWindowEvent const * >(pEvent)->GetWindow();
1675     if (pWindow->IsTopWindow())
1676     {
1677         ::css::uno::Sequence< ::css::uno::Reference< ::css::uno::XInterface > >
1678               aListeners(m_aFocusListeners.getElements());
1679         if (aListeners.hasElements())
1680         {
1681             // Ignore the interior of compound controls when determining the
1682             // window that gets the focus next (see implementation in
1683             // vclxwindow.cxx for mapping between VCL and UNO AWT event):
1684             ::css::uno::Reference< css::uno::XInterface > xNext;
1685             ::Window * pFocus = ::Application::GetFocusWindow();
1686             for (::Window * p = pFocus; p != 0; p = p->GetParent())
1687                 if (!p->IsCompoundControl())
1688                 {
1689                     pFocus = p;
1690                     break;
1691                 }
1692             if (pFocus != 0)
1693                 xNext = pFocus->GetComponentInterface(true);
1694             ::css::awt::FocusEvent aAwtEvent(
1695                 static_cast< ::css::awt::XWindow * >(pWindow->GetWindowPeer()),
1696                 pWindow->GetGetFocusFlags(), xNext, false);
1697             for (::sal_Int32 i = 0; i < aListeners.getLength(); ++i)
1698             {
1699                 ::css::uno::Reference< ::css::awt::XFocusListener > xListener(
1700                     aListeners[i], ::css::uno::UNO_QUERY);
1701                 try
1702                 {
1703                     bGained ? xListener->focusGained(aAwtEvent)
1704                         : xListener->focusLost(aAwtEvent);
1705                 }
1706                 catch (::css::uno::RuntimeException & rEx)
1707                 {
1708                     OSL_TRACE(
1709                         "VCLXToolkit::callFocusListeners: caught %s\n",
1710                         ::rtl::OUStringToOString(
1711                             rEx.Message, RTL_TEXTENCODING_UTF8).getStr());
1712                 }
1713             }
1714         }
1715     }
1716 }
1717 
1718 // css::awt::XReschedule:
1719 
1720 void SAL_CALL VCLXToolkit::reschedule()
1721     throw (::com::sun::star::uno::RuntimeException)
1722 {
1723     Application::Reschedule(true);
1724 }
1725 
1726