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