29#include <config_features.h>
30#include <com/sun/star/awt/WindowAttribute.hpp>
31#include <com/sun/star/awt/VclWindowPeerAttribute.hpp>
32#include <com/sun/star/awt/WindowClass.hpp>
33#include <com/sun/star/awt/MessageBoxButtons.hpp>
34#include <com/sun/star/lang/XMultiServiceFactory.hpp>
35#include <com/sun/star/lang/SystemDependent.hpp>
36#include <com/sun/star/awt/FocusEvent.hpp>
37#include <com/sun/star/awt/KeyEvent.hpp>
38#include <com/sun/star/awt/KeyModifier.hpp>
39#include <com/sun/star/lang/EventObject.hpp>
40#include <com/sun/star/uno/Reference.hxx>
41#include <com/sun/star/uno/Sequence.hxx>
42#include <com/sun/star/uno/XComponentContext.hpp>
43#include <com/sun/star/uno/XInterface.hpp>
44#include <com/sun/star/beans/NamedValue.hpp>
45#include <com/sun/star/beans/XPropertyChangeListener.hpp>
46#include <com/sun/star/beans/XPropertySet.hpp>
47#include <com/sun/star/datatransfer/clipboard/SystemClipboard.hpp>
48#include <com/sun/star/lang/XServiceInfo.hpp>
49#include <com/sun/star/awt/XToolkitExperimental.hpp>
50#include <com/sun/star/awt/XToolkitRobot.hpp>
57#include <osl/conditn.hxx>
58#include <osl/module.h>
59#include <osl/thread.hxx>
60#include <osl/mutex.hxx>
62#include <rtl/process.h>
69#include <Cocoa/Cocoa.h>
79#include <awt/vclxwindows.hxx>
88#include <helper/property.hxx>
96#include <vcl/toolkit/calendar.hxx>
131#include <vcl/toolkit/spin.hxx>
134#if HAVE_FEATURE_OPENGL
149#define SYSTEM_DEPENDENT_TYPE css::lang::SystemDependent::SYSTEM_WIN32
151#define SYSTEM_DEPENDENT_TYPE css::lang::SystemDependent::SYSTEM_MAC
153#define SYSTEM_DEPENDENT_TYPE css::lang::SystemDependent::SYSTEM_XWINDOW
233 const OUString& rTitle, OUString aMessage) :
236 mnMessBoxStyle( nMessBoxStyle ),
237 maMessText(
std::move( aMessage ))
243 if ( !rTitle.isEmpty() )
290 DrawTextFlags nTextStyle = DrawTextFlags::MultiLine | DrawTextFlags::Top | DrawTextFlags::Left;
296 OUString aMessText(
maMessText.replaceAll(
"\t",
" "));
309 if ( aImageSize.
Width() )
326 aFormatRect =
GetTextRect( aRect, aMessText, nTextStyle, &aTextInfo );
327 nMaxLineWidth = aFormatRect.
GetWidth();
328 nTextStyle |= DrawTextFlags::WordBreak;
331 if ( nMaxLineWidth > 450 )
333 else if ( nMaxLineWidth > 300 )
334 nWidth = nMaxLineWidth+5;
340 if ( nButtonSize > nWidth )
342 if ( nWidth > nMaxWidth )
346 aFormatRect =
GetTextRect( aRect, aMessText, nTextStyle, &aTextInfo );
351 aFormatRect =
GetTextRect( aRect, aMessText, nTextStyle, &aTextInfo );
369 if ( aImageSize.
Width() )
377 if ( aPageSize.
Width() < nTitleWidth )
391 if (
nType == StateChangedType::InitShow )
401 return Size( 250, 100 );
410 explicit Pause(sal_Int32 nPauseMilliseconds) :
412 m_nPauseMilliseconds(nPauseMilliseconds)
418 virtual void Invoke()
override
421 std::this_thread::sleep_for(std::chrono::milliseconds(m_nPauseMilliseconds));
426 sal_Int32 m_nPauseMilliseconds;
430 public cppu::WeakComponentImplHelper<
431 css::awt::XToolkitExperimental,
432 css::awt::XToolkitRobot,
433 css::lang::XServiceInfo >
435 css::uno::Reference< css::datatransfer::clipboard::XClipboard > mxClipboard;
436 css::uno::Reference< css::datatransfer::clipboard::XClipboard > mxSelection;
443 bool m_bEventListener;
450 void callTopWindowListeners(
452 void (SAL_CALL css::awt::XTopWindowListener::* pFn)(
453 css::lang::EventObject
const &));
460 ::osl::Mutex& GetMutex() {
return m_aMutex; }
462 virtual void SAL_CALL disposing()
override;
466 css::uno::Reference< css::awt::XWindowPeer > ImplCreateWindow(
const css::awt::WindowDescriptor& Descriptor,
474 virtual void SAL_CALL processEventsToIdle()
override;
476 virtual sal_Int64 SAL_CALL getOpenGLBufferSwapCounter()
override;
478 virtual void SAL_CALL setDeterministicScheduling(
sal_Bool bDeterministicMode)
override;
480 virtual void SAL_CALL pause(sal_Int32 nMilliseconds)
override;
482 virtual void SAL_CALL startRecording()
override;
484 virtual void SAL_CALL stopRecording()
override;
486 css::uno::Sequence< OUString > SAL_CALL getRecordingAndClear()
override;
489 css::uno::Reference< css::awt::XWindowPeer > SAL_CALL getDesktopWindow( )
override;
490 css::awt::Rectangle SAL_CALL getWorkArea( )
override;
491 css::uno::Reference< css::awt::XWindowPeer > SAL_CALL createWindow(
const css::awt::WindowDescriptor& Descriptor )
override;
492 css::uno::Sequence< css::uno::Reference< css::awt::XWindowPeer > > SAL_CALL createWindows(
const css::uno::Sequence< css::awt::WindowDescriptor >& Descriptors )
override;
493 css::uno::Reference< css::awt::XDevice > SAL_CALL createScreenCompatibleDevice( sal_Int32 Width, sal_Int32 Height )
override;
494 css::uno::Reference< css::awt::XRegion > SAL_CALL createRegion( )
override;
497 css::uno::Reference< css::awt::XWindowPeer > SAL_CALL createSystemChild(
const css::uno::Any& Parent,
const css::uno::Sequence< sal_Int8 >& ProcessId, sal_Int16 SystemType )
override;
500 virtual css::uno::Reference< css::awt::XMessageBox > SAL_CALL createMessageBox(
const css::uno::Reference< css::awt::XWindowPeer >& aParent, css::awt::MessageBoxType eType, ::sal_Int32 aButtons,
const OUString& aTitle,
const OUString& aMessage )
override;
503 css::uno::Reference< css::datatransfer::dnd::XDragGestureRecognizer > SAL_CALL getDragGestureRecognizer(
const css::uno::Reference< css::awt::XWindow >& window )
override;
504 css::uno::Reference< css::datatransfer::dnd::XDragSource > SAL_CALL getDragSource(
const css::uno::Reference< css::awt::XWindow >& window )
override;
505 css::uno::Reference< css::datatransfer::dnd::XDropTarget > SAL_CALL getDropTarget(
const css::uno::Reference< css::awt::XWindow >& window )
override;
506 css::uno::Reference< css::datatransfer::clipboard::XClipboard > SAL_CALL getClipboard(
const OUString& clipboardName )
override;
515 virtual ::sal_Int32 SAL_CALL getTopWindowCount()
override;
517 virtual css::uno::Reference< css::awt::XTopWindow >
518 SAL_CALL getTopWindow(::sal_Int32 nIndex)
override;
520 virtual css::uno::Reference< css::awt::XTopWindow >
521 SAL_CALL getActiveTopWindow()
override;
523 virtual void SAL_CALL addTopWindowListener(
525 css::awt::XTopWindowListener >
const & rListener)
override;
527 virtual void SAL_CALL removeTopWindowListener(
529 css::awt::XTopWindowListener >
const & rListener)
override;
531 virtual void SAL_CALL addKeyHandler(
533 css::awt::XKeyHandler >
const & rHandler)
override;
535 virtual void SAL_CALL removeKeyHandler(
537 css::awt::XKeyHandler >
const & rHandler)
override;
539 virtual void SAL_CALL addFocusListener(
541 css::awt::XFocusListener >
const & rListener)
override;
543 virtual void SAL_CALL removeFocusListener(
545 css::awt::XFocusListener >
const & rListener)
override;
547 virtual void SAL_CALL fireFocusGained(
549 css::uno::XInterface >
const & source)
override;
551 virtual void SAL_CALL fireFocusLost(
553 css::uno::XInterface >
const & source)
override;
556 virtual void SAL_CALL reschedule()
override;
559 virtual void SAL_CALL startTrackingFontMappingUse()
override;
561 virtual css::uno::Sequence<css::awt::XFontMappingUseItem> SAL_CALL finishTrackingFontMappingUse()
override;
564 virtual void SAL_CALL keyPress(
const css::awt::KeyEvent & aKeyEvent )
override;
566 virtual void SAL_CALL keyRelease(
const css::awt::KeyEvent & aKeyEvent )
override;
568 virtual void SAL_CALL mousePress(
const css::awt::MouseEvent & aMouseEvent )
override;
570 virtual void SAL_CALL mouseRelease(
const css::awt::MouseEvent & aMouseEvent )
override;
572 virtual void SAL_CALL mouseMove(
const css::awt::MouseEvent & aMouseEvent )
override;
576std::pair<WinBits,MessBoxStyle> ImplGetWinBits( sal_uInt32 nComponentAttribs,
WindowType nCompType )
581 bool bMessBox =
false;
582 if ( ( nCompType == WindowType::INFOBOX ) ||
583 ( nCompType == WindowType::MESSBOX ) ||
584 ( nCompType == WindowType::QUERYBOX ) ||
585 ( nCompType == WindowType::WARNINGBOX ) ||
586 ( nCompType == WindowType::ERRORBOX ) )
591 bool bDecoratedWindow =
false;
593 || ( nCompType == WindowType::DIALOG )
594 || ( nCompType == WindowType::MODELESSDIALOG )
595 || ( nCompType == WindowType::DOCKINGWINDOW )
596 || ( nCompType == WindowType::TABDIALOG )
597 || ( nCompType == WindowType::BUTTONDIALOG )
598 || ( nCompType == WindowType::SYSTEMCHILDWINDOW )
601 bDecoratedWindow =
true;
604 if( nComponentAttribs & css::awt::WindowAttribute::BORDER )
606 if( nComponentAttribs & css::awt::VclWindowPeerAttribute::NOBORDER )
608 if( nComponentAttribs & css::awt::WindowAttribute::SIZEABLE )
610 if( nComponentAttribs & css::awt::WindowAttribute::MOVEABLE )
612 if( nComponentAttribs & css::awt::WindowAttribute::CLOSEABLE )
614 if( nComponentAttribs & css::awt::VclWindowPeerAttribute::HSCROLL )
616 if( nComponentAttribs & css::awt::VclWindowPeerAttribute::VSCROLL )
618 if( nComponentAttribs & css::awt::VclWindowPeerAttribute::LEFT )
620 if( nComponentAttribs & css::awt::VclWindowPeerAttribute::CENTER )
622 if( nComponentAttribs & css::awt::VclWindowPeerAttribute::RIGHT )
624 if( nComponentAttribs & css::awt::VclWindowPeerAttribute::SPIN )
626 if( nComponentAttribs & css::awt::VclWindowPeerAttribute::SORT )
628 if( nComponentAttribs & css::awt::VclWindowPeerAttribute::DROPDOWN )
630 if( nComponentAttribs & css::awt::VclWindowPeerAttribute::DEFBUTTON )
632 if( nComponentAttribs & css::awt::VclWindowPeerAttribute::READONLY )
634 if( nComponentAttribs & css::awt::VclWindowPeerAttribute::CLIPCHILDREN )
636 if( nComponentAttribs & css::awt::VclWindowPeerAttribute::GROUP )
638 if( nComponentAttribs & css::awt::VclWindowPeerAttribute::NOLABEL )
644 if( nComponentAttribs & css::awt::VclWindowPeerAttribute::OK )
645 nStyle |= MessBoxStyle::Ok;
646 if( nComponentAttribs & css::awt::VclWindowPeerAttribute::OK_CANCEL )
647 nStyle |= MessBoxStyle::OkCancel;
648 if( nComponentAttribs & css::awt::VclWindowPeerAttribute::YES_NO )
649 nStyle |= MessBoxStyle::YesNo;
650 if( nComponentAttribs & css::awt::VclWindowPeerAttribute::YES_NO_CANCEL )
651 nStyle |= MessBoxStyle::YesNoCancel;
652 if( nComponentAttribs & css::awt::VclWindowPeerAttribute::RETRY_CANCEL )
653 nStyle |= MessBoxStyle::RetryCancel;
654 if( nComponentAttribs & css::awt::VclWindowPeerAttribute::DEF_OK )
655 nStyle |= MessBoxStyle::DefaultOk;
656 if( nComponentAttribs & css::awt::VclWindowPeerAttribute::DEF_CANCEL )
657 nStyle |= MessBoxStyle::DefaultCancel;
658 if( nComponentAttribs & css::awt::VclWindowPeerAttribute::DEF_RETRY )
659 nStyle |= MessBoxStyle::DefaultRetry;
660 if( nComponentAttribs & css::awt::VclWindowPeerAttribute::DEF_YES )
661 nStyle |= MessBoxStyle::DefaultYes;
662 if( nComponentAttribs & css::awt::VclWindowPeerAttribute::DEF_NO )
663 nStyle |= MessBoxStyle::DefaultNo;
665 if ( nCompType == WindowType::MULTILINEEDIT || nCompType == WindowType::DIALOG
666 || nCompType == WindowType::GROUPBOX || nCompType == WindowType::TABPAGE )
668 if( nComponentAttribs & css::awt::VclWindowPeerAttribute::AUTOHSCROLL )
670 if( nComponentAttribs & css::awt::VclWindowPeerAttribute::AUTOVSCROLL )
675 if ( bDecoratedWindow )
677 if( nComponentAttribs & css::awt::WindowAttribute::NODECORATION )
681 nWinBits &= ~WB_BORDER;
682 nWinBits &= ~WB_SIZEABLE;
683 nWinBits &= ~WB_MOVEABLE;
684 nWinBits &= ~WB_CLOSEABLE;
689 return { nWinBits, nStyle };
694 std::u16string_view
sName;
698ComponentInfo
const aComponentInfos [] =
700 { std::u16string_view(u
"animatedimages"), WindowType::CONTROL },
701 { std::u16string_view(u
"buttondialog"), WindowType::BUTTONDIALOG },
702 { std::u16string_view(u
"cancelbutton"), WindowType::CANCELBUTTON },
703 { std::u16string_view(u
"checkbox"), WindowType::CHECKBOX },
704 { std::u16string_view(u
"combobox"), WindowType::COMBOBOX },
705 { std::u16string_view(u
"control"), WindowType::CONTROL },
706 { std::u16string_view(u
"currencybox"), WindowType::CURRENCYBOX },
707 { std::u16string_view(u
"currencyfield"), WindowType::CURRENCYFIELD },
708 { std::u16string_view(u
"datebox"), WindowType::DATEBOX },
709 { std::u16string_view(u
"datefield"), WindowType::CONTROL },
710 { std::u16string_view(u
"dialog"), WindowType::DIALOG },
711 { std::u16string_view(u
"dockingarea"), WindowType::DOCKINGAREA },
712 { std::u16string_view(u
"dockingwindow"), WindowType::DOCKINGWINDOW },
713 { std::u16string_view(u
"edit"), WindowType::EDIT },
714 { std::u16string_view(u
"errorbox"), WindowType::ERRORBOX },
715 { std::u16string_view(u
"filecontrol"), WindowType::CONTROL },
716 { std::u16string_view(u
"fixedbitmap"), WindowType::FIXEDBITMAP },
717 { std::u16string_view(u
"fixedhyperlink"), WindowType::CONTROL },
718 { std::u16string_view(u
"fixedimage"), WindowType::FIXEDIMAGE },
719 { std::u16string_view(u
"fixedline"), WindowType::FIXEDLINE },
720 { std::u16string_view(u
"fixedtext"), WindowType::FIXEDTEXT },
721 { std::u16string_view(u
"floatingwindow"), WindowType::FLOATINGWINDOW },
722 { std::u16string_view(u
"formattedfield"), WindowType::CONTROL },
723 { std::u16string_view(u
"frame"), WindowType::GROUPBOX },
724 { std::u16string_view(u
"framewindow"), WindowType::TOOLKIT_FRAMEWINDOW },
725 { std::u16string_view(u
"grid"), WindowType::CONTROL },
726 { std::u16string_view(u
"groupbox"), WindowType::GROUPBOX },
727 { std::u16string_view(u
"helpbutton"), WindowType::HELPBUTTON },
728 { std::u16string_view(u
"imagebutton"), WindowType::IMAGEBUTTON },
729 { std::u16string_view(u
"infobox"), WindowType::INFOBOX },
730 { std::u16string_view(u
"listbox"), WindowType::LISTBOX },
731 { std::u16string_view(u
"longcurrencybox"), WindowType::LONGCURRENCYBOX },
732 { std::u16string_view(u
"longcurrencyfield"), WindowType::CONTROL },
733 { std::u16string_view(u
"menubutton"), WindowType::MENUBUTTON },
734 { std::u16string_view(u
"messbox"), WindowType::MESSBOX },
735 { std::u16string_view(u
"metricbox"), WindowType::METRICBOX },
736 { std::u16string_view(u
"metricfield"), WindowType::METRICFIELD },
737 { std::u16string_view(u
"modelessdialog"), WindowType::MODELESSDIALOG },
738 { std::u16string_view(u
"morebutton"), WindowType::MOREBUTTON },
739 { std::u16string_view(u
"multilineedit"), WindowType::MULTILINEEDIT },
740 { std::u16string_view(u
"multilistbox"), WindowType::MULTILISTBOX },
741 { std::u16string_view(u
"numericbox"), WindowType::NUMERICBOX },
742 { std::u16string_view(u
"numericfield"), WindowType::CONTROL },
743 { std::u16string_view(u
"okbutton"), WindowType::OKBUTTON },
744 { std::u16string_view(u
"patternbox"), WindowType::PATTERNBOX },
745 { std::u16string_view(u
"patternfield"), WindowType::PATTERNFIELD },
746 { std::u16string_view(u
"progressbar"), WindowType::CONTROL },
747 { std::u16string_view(u
"pushbutton"), WindowType::PUSHBUTTON },
748 { std::u16string_view(u
"querybox"), WindowType::QUERYBOX },
749 { std::u16string_view(u
"radiobutton"), WindowType::RADIOBUTTON },
750 { std::u16string_view(u
"roadmap"), WindowType::CONTROL },
751 { std::u16string_view(u
"scrollbar"), WindowType::SCROLLBAR },
752 { std::u16string_view(u
"scrollbarbox"), WindowType::SCROLLBARBOX },
753 { std::u16string_view(u
"spinbutton"), WindowType::SPINBUTTON },
754 { std::u16string_view(u
"spinfield"), WindowType::SPINFIELD },
755 { std::u16string_view(u
"splitter"), WindowType::SPLITTER },
756 { std::u16string_view(u
"splitwindow"), WindowType::SPLITWINDOW },
757 { std::u16string_view(u
"statusbar"), WindowType::STATUSBAR },
758 { std::u16string_view(u
"systemchildwindow"), WindowType::TOOLKIT_SYSTEMCHILDWINDOW },
759 { std::u16string_view(u
"tabcontrol"), WindowType::TABCONTROL },
760 { std::u16string_view(u
"tabdialog"), WindowType::TABDIALOG },
761 { std::u16string_view(u
"tabpage"), WindowType::TABPAGE },
762 { std::u16string_view(u
"tabpagecontainer"), WindowType::CONTROL },
763 { std::u16string_view(u
"tabpagemodel"), WindowType::TABPAGE },
764 { std::u16string_view(u
"timebox"), WindowType::TIMEBOX },
765 { std::u16string_view(u
"timefield"), WindowType::TIMEFIELD },
766 { std::u16string_view(u
"toolbox"), WindowType::TOOLBOX },
767 { std::u16string_view(u
"tree"), WindowType::CONTROL },
768 { std::u16string_view(u
"tristatebox"), WindowType::TRISTATEBOX },
769 { std::u16string_view(u
"warningbox"), WindowType::WARNINGBOX },
770 { std::u16string_view(u
"window"), WindowType::WINDOW },
771 { std::u16string_view(u
"workwindow"), WindowType::WORKWINDOW }
774bool ComponentInfoFindCompare(
const ComponentInfo & lhs,
const OUString & s)
776 return rtl_ustr_compareIgnoreAsciiCase_WithLength(s.pData->buffer, s.pData->length,
777 lhs.sName.data(), lhs.sName.size()) > 0;
780WindowType ImplGetComponentType(
const OUString& rServiceName )
782 static bool bSorted =
false;
785 assert( std::is_sorted( std::begin(aComponentInfos), std::end(aComponentInfos),
786 [](
const ComponentInfo & lhs,
const ComponentInfo & rhs) {
788 rtl_ustr_compare_WithLength(
789 lhs.sName.data(), lhs.sName.size(), rhs.sName.data(),
797 if ( !rServiceName.isEmpty() )
798 sSearch = rServiceName;
802 auto it = std::lower_bound( std::begin(aComponentInfos), std::end(aComponentInfos), sSearch,
803 ComponentInfoFindCompare );
804 if (it != std::end(aComponentInfos) &&
805 rtl_ustr_compareIgnoreAsciiCase_WithLength(sSearch.pData->buffer, sSearch.pData->length, it->sName.data(), it->sName.size()) == 0)
807 return WindowType::NONE;
810struct MessageBoxTypeInfo
812 css::awt::MessageBoxType
eType;
817const MessageBoxTypeInfo aMessageBoxTypeInfo[] =
819 { css::awt::MessageBoxType_MESSAGEBOX, RTL_CONSTASCII_STRINGPARAM(
"messbox") },
820 { css::awt::MessageBoxType_INFOBOX, RTL_CONSTASCII_STRINGPARAM(
"infobox") },
821 { css::awt::MessageBoxType_WARNINGBOX, RTL_CONSTASCII_STRINGPARAM(
"warningbox") },
822 { css::awt::MessageBoxType_ERRORBOX, RTL_CONSTASCII_STRINGPARAM(
"errorbox") },
823 { css::awt::MessageBoxType_QUERYBOX, RTL_CONSTASCII_STRINGPARAM(
"querybox") },
824 { css::awt::MessageBoxType::MessageBoxType_MAKE_FIXED_SIZE,
nullptr, 0 }
827bool lcl_convertMessageBoxType(
829 css::awt::MessageBoxType eType )
831 const MessageBoxTypeInfo *pMap = aMessageBoxTypeInfo;
832 css::awt::MessageBoxType eVal = css::awt::MessageBoxType::MessageBoxType_MAKE_FIXED_SIZE;
834 while ( pMap->pName )
836 if ( pMap->eType == eType )
839 sType = OUString( pMap->pName, pMap->nLen, RTL_TEXTENCODING_ASCII_US );
845 return ( eVal != css::awt::MessageBoxType::MessageBoxType_MAKE_FIXED_SIZE );
850sal_Int32 nVCLToolkitInstanceCount = 0;
851bool bInitedByVCLToolkit =
false;
853osl::Mutex & getInitMutex()
859osl::Condition & getInitCondition()
861 static osl::Condition aCondition;
867static void ToolkitWorkerFunction(
void* pArgs )
869 osl_setThreadName(
"VCLXToolkit VCL main thread");
871 css::uno::Reference<css::lang::XMultiServiceFactory> xServiceManager;
874 xServiceManager = ::comphelper::getProcessServiceFactory();
876 catch (
const css::uno::DeploymentException&)
879 if (!xServiceManager.is())
881 css::uno::Reference<css::uno::XComponentContext> xContext =
882 ::cppu::defaultBootstrap_InitialComponentContext();
884 xServiceManager.set( xContext->getServiceManager(), css::uno::UNO_QUERY_THROW );
886 ::comphelper::setProcessServiceFactory( xServiceManager );
889 VCLXToolkit * pTk =
static_cast<VCLXToolkit *
>(pArgs);
891 if( bInitedByVCLToolkit )
896 getInitCondition().set();
897 if( bInitedByVCLToolkit )
907 catch( css::uno::Exception & )
923VCLXToolkit::VCLXToolkit():
924 cppu::WeakComponentImplHelper<
925 css::awt::XToolkitExperimental,
926 css::awt::XToolkitRobot,
927 css::lang::XServiceInfo>( GetMutex() ),
928 m_aTopWindowListeners(rBHelper.rMutex),
929 m_aKeyHandlers(rBHelper.rMutex),
930 m_aFocusListeners(rBHelper.rMutex),
931 m_aEventListenerLink(
LINK(this, VCLXToolkit, eventListenerHandler)),
932 m_aKeyListenerLink(
LINK(this, VCLXToolkit, keyListenerHandler)),
933 m_bEventListener(false),
934 m_bKeyListener(false)
937 osl::Guard< osl::Mutex > aGuard( getInitMutex() );
938 nVCLToolkitInstanceCount++;
943 getInitCondition().wait();
948void SAL_CALL VCLXToolkit::disposing()
952 osl::Guard< osl::Mutex > aGuard( getInitMutex() );
953 if( --nVCLToolkitInstanceCount == 0 )
955 if( bInitedByVCLToolkit )
959 bInitedByVCLToolkit =
false;
964 if (m_bEventListener)
967 m_bEventListener =
false;
972 m_bKeyListener =
false;
974 css::lang::EventObject
aEvent(
982css::uno::Reference< css::awt::XWindowPeer > VCLXToolkit::getDesktopWindow( )
984 css::uno::Reference< css::awt::XWindowPeer > xRef;
989css::awt::Rectangle VCLXToolkit::getWorkArea( )
993 css::awt::Rectangle aNotherRect;
994 aNotherRect.X = aWorkRect.
Left();
995 aNotherRect.Y = aWorkRect.
Top();
1001css::uno::Reference< css::awt::XWindowPeer > VCLXToolkit::createWindow(
const css::awt::WindowDescriptor& rDescriptor )
1003 return ImplCreateWindow( rDescriptor, MessBoxStyle::NONE );
1006css::uno::Reference< css::awt::XDevice > VCLXToolkit::createScreenCompatibleDevice( sal_Int32 Width, sal_Int32 Height )
1008 ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
1015 pV->SetOutputSizePixel(
Size( Width, Height ) );
1016 pVDev->SetVirtualDevice( pV );
1021css::uno::Reference< css::awt::XRegion > VCLXToolkit::createRegion( )
1023 ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
1025 css::uno::Reference< css::awt::XRegion > xRef =
new VCLXRegion;
1032 InfoBox(
vcl::Window* pParent,
const OUString& rMessage)
1042class ErrorBox :
public MessBox
1046 :
MessBox(pParent, nStyle, nWinBits, OUString(), rMessage)
1055class QueryBox :
public MessBox
1059 :
MessBox(pParent, nStyle, nWinBits, OUString(), rMessage)
1068class WarningBox :
public MessBox
1072 :
MessBox(pParent, nStyle, nWinBits, OUString(), rMessage)
1090 , css::container::XContainerListener
1091 , css::beans::XPropertyChangeListener
1092 , css::awt::XItemEventBroadcaster
1099 void SAL_CALL disposing(
const css::lang::EventObject& Source )
override {
VCLXWindow::disposing( Source ); }
1102 void SAL_CALL setProperty(
const OUString& PropertyName,
const css::uno::Any& Value )
override;
1104 css::uno::Any SAL_CALL
getProperty(
const OUString& PropertyName )
override;
1107 void SAL_CALL
elementInserted(
const css::container::ContainerEvent& rEvent )
override;
1108 void SAL_CALL
elementRemoved(
const css::container::ContainerEvent& rEvent )
override;
1109 void SAL_CALL
elementReplaced(
const css::container::ContainerEvent& rEvent )
override;
1112 virtual void SAL_CALL addItemListener(
const css::uno::Reference< css::awt::XItemListener >& l )
override;
1113 virtual void SAL_CALL removeItemListener(
const css::uno::Reference< css::awt::XItemListener >& l )
override;
1116 virtual void SAL_CALL propertyChange(
const css::beans::PropertyChangeEvent& evt )
override;
1121 virtual void ImplSetNewImage()
override;
1123 static void ImplGetPropertyIds( std::vector< sal_uInt16 > &aIds );
1124 virtual void GetPropertyIds( std::vector< sal_uInt16 > &aIds )
override {
return ImplGetPropertyIds( aIds ); }
1126 static RMItemData GetRMItemData(
const css::container::ContainerEvent& _rEvent );
1128 virtual void ProcessWindowEvent(
const VclWindowEvent& rVclWindowEvent )
override;
1130 virtual ~SVTXRoadmap()
override;
1132 ItemListenerMultiplexer maItemListeners;
1138SVTXRoadmap::SVTXRoadmap() : maItemListeners( *this )
1142SVTXRoadmap::~SVTXRoadmap()
1146void SVTXRoadmap::ProcessWindowEvent(
const VclWindowEvent& rVclWindowEvent )
1148 switch ( rVclWindowEvent.
GetId() )
1150 case VclEventId::RoadmapItemSelected:
1156 sal_Int16 CurItemID = pField->GetCurrentRoadmapItemID();
1157 css::awt::ItemEvent
aEvent;
1158 aEvent.Selected = CurItemID;
1159 aEvent.Highlighted = CurItemID;
1160 aEvent.ItemId = CurItemID;
1161 maItemListeners.itemStateChanged( aEvent );
1166 SVTXRoadmap_Base::ProcessWindowEvent( rVclWindowEvent );
1171void SVTXRoadmap::propertyChange(
const css::beans::PropertyChangeEvent& evt )
1178 css::uno::Reference< css::uno::XInterface > xRoadmapItem = evt.Source;
1180 css::uno::Reference< css::beans::XPropertySet > xPropertySet( xRoadmapItem, css::uno::UNO_QUERY );
1181 css::uno::Any aValue = xPropertySet->getPropertyValue(
"ID");
1184 OUString sPropertyName = evt.PropertyName;
1185 if ( sPropertyName ==
"Enabled" )
1187 bool bEnable =
false;
1188 evt.NewValue >>= bEnable;
1191 else if ( sPropertyName ==
"Label" )
1194 evt.NewValue >>= sLabel;
1197 else if ( sPropertyName ==
"ID" )
1199 sal_Int32 nNewID = 0;
1200 evt.NewValue >>= nNewID;
1201 evt.OldValue >>= nID;
1208void SVTXRoadmap::addItemListener(
const css::uno::Reference< css::awt::XItemListener >& l )
1210 maItemListeners.addInterface( l );
1213void SVTXRoadmap::removeItemListener(
const css::uno::Reference< css::awt::XItemListener >& l )
1215 maItemListeners.removeInterface( l );
1218RMItemData SVTXRoadmap::GetRMItemData(
const css::container::ContainerEvent& _rEvent )
1220 RMItemData aCurRMItemData;
1221 css::uno::Reference< css::uno::XInterface > xRoadmapItem;
1222 _rEvent.Element >>= xRoadmapItem;
1223 css::uno::Reference< css::beans::XPropertySet > xPropertySet( xRoadmapItem, css::uno::UNO_QUERY );
1224 if ( xPropertySet.is() )
1226 css::uno::Any aValue = xPropertySet->getPropertyValue(
"Label");
1227 aValue >>= aCurRMItemData.Label;
1228 aValue = xPropertySet->getPropertyValue(
"ID");
1229 aValue >>= aCurRMItemData.n_ID;
1230 aValue = xPropertySet->getPropertyValue(
"Enabled");
1231 aValue >>= aCurRMItemData.b_Enabled;
1235 aCurRMItemData.b_Enabled =
false;
1236 aCurRMItemData.n_ID = 0;
1238 return aCurRMItemData;
1247 RMItemData CurItemData = GetRMItemData( _rEvent );
1248 sal_Int32 InsertIndex = 0;
1249 _rEvent.Accessor >>= InsertIndex;
1250 pField->InsertRoadmapItem( InsertIndex, CurItemData.Label,
static_cast<vcl::RoadmapTypes::ItemId>(CurItemData.n_ID), CurItemData.b_Enabled );
1260 sal_Int32 DelIndex = 0;
1261 _rEvent.Accessor >>= DelIndex;
1262 pField->DeleteRoadmapItem(DelIndex);
1272 RMItemData CurItemData = GetRMItemData( _rEvent );
1273 sal_Int32 ReplaceIndex = 0;
1274 _rEvent.Accessor >>= ReplaceIndex;
1275 pField->ReplaceRoadmapItem( ReplaceIndex, CurItemData.Label,
static_cast<vcl::RoadmapTypes::ItemId>(CurItemData.n_ID), CurItemData.b_Enabled );
1279void SVTXRoadmap::setProperty(
const OUString& PropertyName,
const css::uno::Any& Value)
1293 pField->SetRoadmapComplete( b);
1301 pField->SetRoadmapInteractive( b);
1317 pField->SetText( aStr );
1318 pField->Invalidate();
1323 SVTXRoadmap_Base::setProperty( PropertyName, Value );
1329 SVTXRoadmap_Base::setProperty( PropertyName, Value );
1333css::uno::Any SVTXRoadmap::getProperty(
const OUString& PropertyName )
1337 css::uno::Any aReturn;
1346 aReturn <<= pField->IsRoadmapComplete();
1349 aReturn <<= pField->IsRoadmapInteractive();
1352 aReturn <<= pField->GetCurrentRoadmapItemID();
1355 aReturn = SVTXRoadmap_Base::getProperty(PropertyName);
1362void SVTXRoadmap::ImplSetNewImage()
1364 OSL_PRECOND( GetWindow(),
"SVTXRoadmap::ImplSetNewImage: window is required to be not-NULL!" );
1366 pButton->SetRoadmapBitmap( GetImage().
GetBitmapEx() );
1369void SVTXRoadmap::ImplGetPropertyIds( std::vector< sal_uInt16 > &rIds )
1371 PushPropertyIds( rIds,
1382 const css::awt::WindowDescriptor& rDescriptor,
1385 OUString aServiceName = rDescriptor.WindowServiceName.toAsciiLowerCase();
1389 bool bFrameControl =
false;
1390 if ( aServiceName ==
"frame" )
1391 bFrameControl =
true;
1392 if ( aServiceName ==
"tabcontrolnotabs" )
1395 nType = ImplGetComponentType(
"tabcontrol" );
1401 bool bException =
true;
1402 if ( ( nType == WindowType::DIALOG )
1403 || ( nType == WindowType::MODELESSDIALOG )
1404 || ( nType == WindowType::MESSBOX )
1405 || ( nType == WindowType::INFOBOX )
1406 || ( nType == WindowType::WARNINGBOX )
1407 || ( nType == WindowType::ERRORBOX )
1408 || ( nType == WindowType::QUERYBOX )
1411 else if ( ( nType == WindowType::WINDOW ) ||
1412 ( nType == WindowType::WORKWINDOW ) ||
1413 ( nType == WindowType::TOOLKIT_FRAMEWINDOW ) )
1415 if ( rDescriptor.Type == css::awt::WindowClass_TOP )
1421 *ppNewComp =
nullptr;
1426 if ( nType != WindowType::NONE )
1431 case WindowType::CANCELBUTTON:
1435 case WindowType::CHECKBOX:
1439 case WindowType::COMBOBOX:
1441 static_cast<ComboBox*
>(pNewWindow.
get())->EnableAutoSize(
false );
1444 case WindowType::CURRENCYBOX:
1447 case WindowType::CURRENCYFIELD:
1449 static_cast<CurrencyField*
>(pNewWindow.
get())->EnableEmptyFieldValue(
true );
1453 case WindowType::DATEBOX:
1456 case WindowType::DOCKINGAREA:
1459 case WindowType::MULTILINEEDIT:
1464 case WindowType::EDIT:
1468 case WindowType::ERRORBOX:
1472 case WindowType::FIXEDBITMAP:
1475 case WindowType::FIXEDIMAGE:
1479 case WindowType::FIXEDLINE:
1482 case WindowType::FIXEDTEXT:
1486 case WindowType::FLOATINGWINDOW:
1489 case WindowType::GROUPBOX:
1491 if ( bFrameControl )
1493 GroupBox* pGroupBox =
static_cast< GroupBox*
>( pNewWindow.
get() );
1497 pGroupBox->SetMouseTransparent(
false );
1500 case WindowType::HELPBUTTON:
1504 case WindowType::IMAGEBUTTON:
1508 case WindowType::INFOBOX:
1512 case WindowType::LISTBOX:
1514 static_cast<ListBox*
>(pNewWindow.
get())->EnableAutoSize(
false );
1517 case WindowType::LONGCURRENCYBOX:
1520 case WindowType::MENUBUTTON:
1524 case WindowType::MESSBOX:
1528 case WindowType::METRICBOX:
1531 case WindowType::METRICFIELD:
1536 case WindowType::DIALOG:
1537 case WindowType::MODELESSDIALOG:
1540 if ( (pParent ==
nullptr ) && ( rDescriptor.ParentIndex == -1 ) )
1547 css::uno::Reference< css::awt::XWindowPeer > xWinPeer = pNewWindow->GetComponentInterface(
false );
1548 if ( xWinPeer.is() )
1549 *ppNewComp =
dynamic_cast< VCLXDialog*
>( xWinPeer.get() );
1554 case WindowType::MOREBUTTON:
1558 case WindowType::MULTILISTBOX:
1562 case WindowType::NUMERICBOX:
1565 case WindowType::OKBUTTON:
1569 case WindowType::PATTERNBOX:
1572 case WindowType::PATTERNFIELD:
1577 case WindowType::PUSHBUTTON:
1581 case WindowType::QUERYBOX:
1585 case WindowType::RADIOBUTTON:
1598 static_cast<RadioButton*
>(pNewWindow.
get())->EnableRadioCheck(
false );
1600 case WindowType::SCROLLBAR:
1604 case WindowType::SCROLLBARBOX:
1607 case WindowType::SPINBUTTON:
1609 *ppNewComp = new ::toolkit::VCLXSpinButton;
1611 case WindowType::SPINFIELD:
1615 case WindowType::SPLITTER:
1618 case WindowType::SPLITWINDOW:
1621 case WindowType::STATUSBAR:
1624 case WindowType::TOOLKIT_SYSTEMCHILDWINDOW:
1628 case WindowType::TABCONTROL:
1632 case WindowType::TABDIALOG:
1635 case WindowType::TABPAGE:
1641 case WindowType::TIMEBOX:
1644 case WindowType::TIMEFIELD:
1646 static_cast<TimeField*
>(pNewWindow.
get())->EnableEmptyFieldValue(
true );
1650 case WindowType::TOOLBOX:
1654 case WindowType::TRISTATEBOX:
1656 static_cast<CheckBox*
>(pNewWindow.
get())->EnableTriState(
true);
1658 case WindowType::WARNINGBOX:
1662 case WindowType::WORKWINDOW:
1663 case WindowType::WINDOW:
1664 case WindowType::TOOLKIT_FRAMEWINDOW:
1665 case WindowType::DOCKINGWINDOW:
1666 if ( rDescriptor.Type == css::awt::WindowClass_TOP )
1668 if (nType == WindowType::DOCKINGWINDOW )
1672 if ((pParent ==
nullptr) && rDescriptor.Parent.is())
1675 css::uno::Reference< css::awt::XSystemDependentWindowPeer > xSystemDepParent(rDescriptor.Parent, css::uno::UNO_QUERY);
1677 if (xSystemDepParent.is())
1681 rtl_getGlobalProcessId(
reinterpret_cast<sal_uInt8*
>(processID) );
1684 css::uno::Sequence<sal_Int8> processIdSeq(processID, 16);
1690 sal_Int64 nWindowHandle = 0;
1691 bool bXEmbed =
false;
1693 bool bUseParentData =
true;
1694 if( ! (anyHandle >>= nWindowHandle) )
1696 css::uno::Sequence< css::beans::NamedValue > aProps;
1697 if( anyHandle >>= aProps )
1699 for(
const css::beans::NamedValue& rProp : std::as_const(aProps) )
1701 if ( rProp.Name ==
"WINDOW" )
1702 rProp.Value >>= nWindowHandle;
1703 else if ( rProp.Name ==
"XEMBED" )
1704 rProp.Value >>= bXEmbed;
1708 bUseParentData =
false;
1711 if( bUseParentData )
1714 aParentData.
nSize =
sizeof( aParentData );
1716 aParentData.pView =
reinterpret_cast<NSView*
>(nWindowHandle);
1717 #elif defined ANDROID
1722 aParentData.
aWindow = nWindowHandle;
1724 #elif defined _WIN32
1725 aParentData.hWnd =
reinterpret_cast<HWND
>(nWindowHandle);
1738 else if ( rDescriptor.Type == css::awt::WindowClass_CONTAINER )
1740 if (nType == WindowType::DOCKINGWINDOW )
1748 if (nType == WindowType::DOCKINGWINDOW )
1755 case WindowType::CONTROL:
1756 if ( aServiceName ==
"tabpagecontainer" )
1764 else if ( aServiceName ==
"animatedimages" )
1767 *ppNewComp = new ::toolkit::AnimatedImagesPeer;
1769 else if (aServiceName ==
"roadmap")
1772 *ppNewComp =
new SVTXRoadmap;
1774 else if (aServiceName ==
"fixedhyperlink")
1779 else if (aServiceName ==
"progressbar")
1784 else if (aServiceName ==
"filecontrol")
1789 else if (aServiceName ==
"tree")
1793 pNewWindow = pPeer->createVclControl( pParent, nWinBits );
1795 else if (aServiceName ==
"formattedfield")
1800 else if (aServiceName ==
"numericfield")
1805 else if (aServiceName ==
"longcurrencyfield")
1810 else if (aServiceName ==
"datefield")
1815 static_cast<CalendarField*
>(pNewWindow.
get())->EnableEmptyFieldValue(
true );
1817 *ppNewComp = newComp;
1820 else if (aServiceName ==
"grid")
1827 OSL_ENSURE(
false,
"VCLXToolkit::ImplCreateWindow: unknown window type!" );
1834 pControl->SetShowAccelerator(
true);
1838css::uno::Reference< css::awt::XWindowPeer > VCLXToolkit::ImplCreateWindow(
1839 const css::awt::WindowDescriptor& rDescriptor,
1842 ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
1846 css::uno::Reference< css::awt::XVclWindowPeer > xRef;
1849 if ( rDescriptor.Parent.is() )
1856 if ( pParentComponent )
1857 pParent = pParentComponent->
GetWindow();
1859 std::pair<WinBits, MessBoxStyle> aPair = ImplGetWinBits( rDescriptor.WindowAttributes,
1860 ImplGetComponentType( rDescriptor.WindowServiceName ) );
1861 WinBits nWinBits = aPair.first;
1862 aPair.second |= nForceMessBoxStyle;
1866 vcl::Window* pNewWindow = ImplCreateWindow( &pNewComp, rDescriptor, pParent, nWinBits, aPair.second );
1868 DBG_ASSERT( pNewWindow,
"createWindow: Unknown Component!" );
1869 SAL_INFO_IF( !pNewComp,
"toolkit",
"createWindow: No special Interface!" );
1876 if ( rDescriptor.WindowAttributes & css::awt::WindowAttribute::MINSIZE )
1880 else if ( rDescriptor.WindowAttributes & css::awt::WindowAttribute::FULLSIZE )
1883 pNewWindow->
SetSizePixel( pParent->GetOutputSizePixel() );
1902 "VCLXToolkit::createWindow: did #133706# resurge?" );
1904 if ( rDescriptor.WindowAttributes & css::awt::WindowAttribute::SHOW )
1911css::uno::Sequence< css::uno::Reference< css::awt::XWindowPeer > > VCLXToolkit::createWindows(
const css::uno::Sequence< css::awt::WindowDescriptor >& rDescriptors )
1913 ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
1915 sal_uInt32 nComponents = rDescriptors.getLength();
1916 css::uno::Sequence< css::uno::Reference< css::awt::XWindowPeer > >
aSeq( nComponents );
1917 for ( sal_uInt32 n = 0;
n < nComponents;
n++ )
1919 css::awt::WindowDescriptor aDescr = rDescriptors.getConstArray()[
n];
1921 if ( aDescr.ParentIndex == -1 )
1922 aDescr.Parent =
nullptr;
1923 else if ( ( aDescr.ParentIndex >= 0 ) && (
o3tl::make_unsigned(aDescr.ParentIndex) < n ) )
1924 aDescr.Parent =
aSeq.getConstArray()[aDescr.ParentIndex];
1925 aSeq.getArray()[
n] = createWindow( aDescr );
1931css::uno::Reference< css::awt::XWindowPeer > VCLXToolkit::createSystemChild(
const css::uno::Any& Parent,
const css::uno::Sequence< sal_Int8 >& , sal_Int16 nSystemType )
1938 sal_Int64 nWindowHandle = 0;
1939 bool bXEmbed =
false;
1941 bool bUseParentData =
true;
1942 if( ! (Parent >>= nWindowHandle) )
1944 css::uno::Sequence< css::beans::NamedValue > aProps;
1945 if( Parent >>= aProps )
1947 for(
const css::beans::NamedValue& rProp : std::as_const(aProps) )
1949 if ( rProp.Name ==
"WINDOW" )
1950 rProp.Value >>= nWindowHandle;
1951 else if ( rProp.Name ==
"XEMBED" )
1952 rProp.Value >>= bXEmbed;
1956 bUseParentData =
false;
1959 if( bUseParentData )
1962 aParentData.
nSize =
sizeof( aParentData );
1964 aParentData.pView =
reinterpret_cast<NSView*
>(nWindowHandle);
1965 #elif defined ANDROID
1970 aParentData.
aWindow = nWindowHandle;
1972 #elif defined _WIN32
1973 aParentData.hWnd =
reinterpret_cast<HWND
>(nWindowHandle);
1980 catch (
const css::uno::RuntimeException & )
1984 pChildWindow.
clear();
1988 else if (nSystemType == css::lang::SystemDependent::SYSTEM_JAVA)
1994 css::uno::Reference< css::awt::XVclWindowPeer > xPeer;
1999 pPeer->SetWindow( pChildWindow );
2001 pChildWindow->SetWindowPeer(xPeer, pPeer.get());
2008css::uno::Reference< css::awt::XMessageBox > SAL_CALL VCLXToolkit::createMessageBox(
2009 const css::uno::Reference< css::awt::XWindowPeer >& aParent,
2010 css::awt::MessageBoxType eType,
2011 ::sal_Int32 aButtons,
2012 const OUString& aTitle,
2013 const OUString& aMessage )
2015 css::awt::WindowDescriptor aDescriptor;
2017 sal_Int32 nWindowAttributes = css::awt::WindowAttribute::BORDER|css::awt::WindowAttribute::MOVEABLE|css::awt::WindowAttribute::CLOSEABLE;
2020 if (( aButtons & 0x0000ffffL ) == css::awt::MessageBoxButtons::BUTTONS_OK )
2021 nWindowAttributes |= css::awt::VclWindowPeerAttribute::OK;
2022 else if (( aButtons & 0x0000ffffL ) == css::awt::MessageBoxButtons::BUTTONS_OK_CANCEL )
2023 nWindowAttributes |= css::awt::VclWindowPeerAttribute::OK_CANCEL;
2024 else if (( aButtons & 0x0000ffffL ) == css::awt::MessageBoxButtons::BUTTONS_YES_NO )
2025 nWindowAttributes |= css::awt::VclWindowPeerAttribute::YES_NO;
2026 else if (( aButtons & 0x0000ffffL ) == css::awt::MessageBoxButtons::BUTTONS_YES_NO_CANCEL )
2027 nWindowAttributes |= css::awt::VclWindowPeerAttribute::YES_NO_CANCEL;
2028 else if (( aButtons & 0x0000ffffL ) == css::awt::MessageBoxButtons::BUTTONS_RETRY_CANCEL )
2029 nWindowAttributes |= css::awt::VclWindowPeerAttribute::RETRY_CANCEL;
2032 if (sal_Int32( aButtons & 0xffff0000L ) == css::awt::MessageBoxButtons::DEFAULT_BUTTON_OK )
2033 nWindowAttributes |= css::awt::VclWindowPeerAttribute::DEF_OK;
2034 else if (sal_Int32( aButtons & 0xffff0000L ) == css::awt::MessageBoxButtons::DEFAULT_BUTTON_CANCEL )
2035 nWindowAttributes |= css::awt::VclWindowPeerAttribute::DEF_CANCEL;
2036 else if (sal_Int32( aButtons & 0xffff0000L ) == css::awt::MessageBoxButtons::DEFAULT_BUTTON_YES )
2037 nWindowAttributes |= css::awt::VclWindowPeerAttribute::DEF_YES;
2038 else if (sal_Int32( aButtons & 0xffff0000L ) == css::awt::MessageBoxButtons::DEFAULT_BUTTON_NO )
2039 nWindowAttributes |= css::awt::VclWindowPeerAttribute::DEF_NO;
2040 else if (sal_Int32( aButtons & 0xffff0000L ) == css::awt::MessageBoxButtons::DEFAULT_BUTTON_RETRY )
2041 nWindowAttributes |= css::awt::VclWindowPeerAttribute::DEF_RETRY;
2046 if (( aButtons & 0x0000ffffL ) == css::awt::MessageBoxButtons::BUTTONS_ABORT_IGNORE_RETRY )
2047 nAddWinBits |= MessBoxStyle::AbortRetryIgnore;
2048 if ( sal_Int32( aButtons & 0xffff0000L ) == css::awt::MessageBoxButtons::DEFAULT_BUTTON_IGNORE )
2049 nAddWinBits |= MessBoxStyle::DefaultIgnore;
2052 lcl_convertMessageBoxType( aType, eType );
2054 aDescriptor.Type = css::awt::WindowClass_MODALTOP;
2055 aDescriptor.WindowServiceName = aType;
2056 aDescriptor.ParentIndex = -1;
2057 aDescriptor.Parent = aParent;
2058 aDescriptor.WindowAttributes = nWindowAttributes;
2059 css::uno::Reference< css::awt::XMessageBox > xMsgBox(
2060 ImplCreateWindow( aDescriptor, nAddWinBits ), css::uno::UNO_QUERY );
2061 css::uno::Reference< css::awt::XWindow > xWindow( xMsgBox, css::uno::UNO_QUERY );
2062 if ( xMsgBox.is() && xWindow.is() )
2068 xMsgBox->setCaptionText( aTitle );
2069 xMsgBox->setMessageText( aMessage );
2076css::uno::Reference< css::datatransfer::dnd::XDragGestureRecognizer > SAL_CALL VCLXToolkit::getDragGestureRecognizer(
const css::uno::Reference< css::awt::XWindow >& window )
2083 return pWindow->GetDragGestureRecognizer();
2085 return css::uno::Reference< css::datatransfer::dnd::XDragGestureRecognizer >();
2088css::uno::Reference< css::datatransfer::dnd::XDragSource > SAL_CALL VCLXToolkit::getDragSource(
const css::uno::Reference< css::awt::XWindow >& window )
2095 return pWindow->GetDragSource();
2097 return css::uno::Reference< css::datatransfer::dnd::XDragSource >();
2100css::uno::Reference< css::datatransfer::dnd::XDropTarget > SAL_CALL VCLXToolkit::getDropTarget(
const css::uno::Reference< css::awt::XWindow >& window )
2107 return pWindow->GetDropTarget();
2109 return css::uno::Reference< css::datatransfer::dnd::XDropTarget >();
2112css::uno::Reference< css::datatransfer::clipboard::XClipboard > SAL_CALL VCLXToolkit::getClipboard(
const OUString& clipboardName )
2114 if( clipboardName.isEmpty() )
2116 if( !mxClipboard.is() )
2119 mxClipboard = css::datatransfer::clipboard::SystemClipboard::create(
2126 else if( clipboardName ==
"Selection" )
2131 return css::uno::Reference< css::datatransfer::clipboard::XClipboard >();
2135OUString VCLXToolkit::getImplementationName()
2137 return "stardiv.Toolkit.VCLXToolkit";
2140sal_Bool VCLXToolkit::supportsService(
const OUString& rServiceName )
2145css::uno::Sequence< OUString > VCLXToolkit::getSupportedServiceNames()
2147 return css::uno::Sequence<OUString>{
2148 "com.sun.star.awt.Toolkit",
"stardiv.vcl.VclToolkit"};
2154::sal_Int32 SAL_CALL VCLXToolkit::getTopWindowCount()
2161css::uno::Reference< css::awt::XTopWindow > SAL_CALL
2162VCLXToolkit::getTopWindow(::sal_Int32 nIndex)
2166 return css::uno::Reference< css::awt::XTopWindow >(
2167 p ==
nullptr ?
nullptr :
static_cast< css::awt::XWindow *
>(
p->GetWindowPeer()),
2168 css::uno::UNO_QUERY);
2172css::uno::Reference< css::awt::XTopWindow > SAL_CALL
2173VCLXToolkit::getActiveTopWindow()
2176 return css::uno::Reference< css::awt::XTopWindow >(
2177 p ==
nullptr ?
nullptr :
static_cast< css::awt::XWindow *
>(
p->GetWindowPeer()),
2178 css::uno::UNO_QUERY);
2182void SAL_CALL VCLXToolkit::addTopWindowListener(
2183 css::uno::Reference< css::awt::XTopWindowListener >
const & rListener)
2185 OSL_ENSURE(rListener.is(),
"Null rListener");
2186 ::osl::ClearableMutexGuard aGuard(rBHelper.rMutex);
2187 if (rBHelper.bDisposed || rBHelper.bInDispose)
2190 rListener->disposing(
2191 css::lang::EventObject(
2194 else if (m_aTopWindowListeners.
addInterface(rListener) == 1
2195 && !m_bEventListener)
2197 m_bEventListener =
true;
2203void SAL_CALL VCLXToolkit::removeTopWindowListener(
2204 css::uno::Reference< css::awt::XTopWindowListener >
const & rListener)
2206 ::osl::MutexGuard aGuard(rBHelper.rMutex);
2207 if (!(rBHelper.bDisposed || rBHelper.bInDispose)
2209 && m_aFocusListeners.
getLength() == 0 && m_bEventListener)
2212 m_bEventListener =
false;
2217void SAL_CALL VCLXToolkit::addKeyHandler(
2218 css::uno::Reference< css::awt::XKeyHandler >
const & rHandler)
2220 OSL_ENSURE(rHandler.is(),
"Null rHandler");
2221 ::osl::ClearableMutexGuard aGuard(rBHelper.rMutex);
2222 if (rBHelper.bDisposed || rBHelper.bInDispose)
2225 rHandler->disposing(
2226 css::lang::EventObject(
2229 else if (m_aKeyHandlers.
addInterface(rHandler) == 1 && !m_bKeyListener)
2231 m_bKeyListener =
true;
2237void SAL_CALL VCLXToolkit::removeKeyHandler(
2238 css::uno::Reference< css::awt::XKeyHandler >
const & rHandler)
2240 ::osl::MutexGuard aGuard(rBHelper.rMutex);
2241 if (!(rBHelper.bDisposed || rBHelper.bInDispose)
2245 m_bKeyListener =
false;
2250void SAL_CALL VCLXToolkit::addFocusListener(
2251 css::uno::Reference< css::awt::XFocusListener >
const & rListener)
2253 OSL_ENSURE(rListener.is(),
"Null rListener");
2254 ::osl::ClearableMutexGuard aGuard(rBHelper.rMutex);
2255 if (rBHelper.bDisposed || rBHelper.bInDispose)
2258 rListener->disposing(
2259 css::lang::EventObject(
2262 else if (m_aFocusListeners.
addInterface(rListener) == 1
2263 && !m_bEventListener)
2265 m_bEventListener =
true;
2271void SAL_CALL VCLXToolkit::removeFocusListener(
2272 css::uno::Reference< css::awt::XFocusListener >
const & rListener)
2274 ::osl::MutexGuard aGuard(rBHelper.rMutex);
2275 if (!(rBHelper.bDisposed || rBHelper.bInDispose)
2277 && m_aTopWindowListeners.
getLength() == 0 && m_bEventListener)
2280 m_bEventListener =
false;
2285void SAL_CALL VCLXToolkit::fireFocusGained(
2286 css::uno::Reference<
2287 css::uno::XInterface >
const &)
2292void SAL_CALL VCLXToolkit::fireFocusLost(
2293 css::uno::Reference<
2294 css::uno::XInterface >
const &)
2301 switch (rEvent.GetId())
2303 case VclEventId::WindowShow:
2304 callTopWindowListeners(
2307 case VclEventId::WindowHide:
2308 callTopWindowListeners(
2311 case VclEventId::WindowActivate:
2312 callTopWindowListeners(
2315 case VclEventId::WindowDeactivate:
2316 callTopWindowListeners(
2319 case VclEventId::WindowClose:
2320 callTopWindowListeners(
2323 case VclEventId::WindowGetFocus:
2324 callFocusListeners(&rEvent,
true);
2326 case VclEventId::WindowLoseFocus:
2327 callFocusListeners(&rEvent,
false);
2329 case VclEventId::WindowMinimize:
2330 callTopWindowListeners(
2333 case VclEventId::WindowNormalize:
2334 callTopWindowListeners(
2343 switch (rEvent.GetId())
2345 case VclEventId::WindowKeyInput:
2346 return callKeyHandlers(&rEvent,
true);
2347 case VclEventId::WindowKeyUp:
2348 return callKeyHandlers(&rEvent,
false);
2354void VCLXToolkit::callTopWindowListeners(
2356 void (SAL_CALL css::awt::XTopWindowListener::* pFn)(
2357 css::lang::EventObject
const &))
2364 std::vector< css::uno::Reference< css::awt::XTopWindowListener > >
2369 css::lang::EventObject aAwtEvent(
2370 static_cast< css::awt::XWindow *
>(pWindow->
GetWindowPeer()));
2371 for (
const css::uno::Reference<css::awt::XTopWindowListener> & xListener : aListeners)
2375 (xListener.get()->*pFn)(aAwtEvent);
2377 catch (
const css::uno::RuntimeException &)
2387 std::vector< css::uno::Reference< css::awt::XKeyHandler > >
2390 if (!aHandlers.empty())
2397 css::awt::KeyEvent aAwtEvent(
2398 static_cast< css::awt::XWindow *
>(pWindow->
GetWindowPeer()),
2400 ? css::awt::KeyModifier::SHIFT : 0)
2402 ? css::awt::KeyModifier::MOD1 : 0)
2404 ? css::awt::KeyModifier::MOD2 : 0)
2406 ? css::awt::KeyModifier::MOD3 : 0),
2408 sal::static_int_cast< sal_Int16 >(
2410 for (
const css::uno::Reference<css::awt::XKeyHandler> & xHandler : aHandlers)
2414 if (bPressed ? xHandler->keyPressed(aAwtEvent)
2415 : xHandler->keyReleased(aAwtEvent))
2418 catch (
const css::uno::RuntimeException &)
2435 std::vector< css::uno::Reference< css::awt::XFocusListener > >
2443 css::uno::Reference< css::uno::XInterface > xNext;
2446 if (!
p->IsCompoundControl())
2451 if (pFocus !=
nullptr)
2453 css::awt::FocusEvent aAwtEvent(
2454 static_cast< css::awt::XWindow *
>(pWindow->
GetWindowPeer()),
2457 for (
const css::uno::Reference<css::awt::XFocusListener> & xListener : aListeners)
2461 bGained ? xListener->focusGained(aAwtEvent)
2462 : xListener->focusLost(aAwtEvent);
2464 catch (
const css::uno::RuntimeException &)
2473void SAL_CALL VCLXToolkit::reschedule()
2480void SAL_CALL VCLXToolkit::startTrackingFontMappingUse()
2486css::uno::Sequence<css::awt::XFontMappingUseItem>
2487SAL_CALL VCLXToolkit::finishTrackingFontMappingUse()
2491 css::uno::Sequence<css::awt::XFontMappingUseItem> ret( data.size());
2492 css::awt::XFontMappingUseItem* retData = ret.getArray();
2493 for(
size_t i = 0;
i < data.size(); ++
i )
2495 retData[
i ].originalFont = data[
i ].mOriginalFont;
2496 retData[
i ].usedFonts = comphelper::arrayToSequence<OUString,OUString>
2497 (data[ i ].mUsedFonts.data(), data[ i ].mUsedFonts.size());
2498 retData[
i ].count = data[
i ].mCount;
2505void SAL_CALL VCLXToolkit::processEventsToIdle()
2512sal_Int64 SAL_CALL VCLXToolkit::getOpenGLBufferSwapCounter()
2514#if HAVE_FEATURE_OPENGL
2515 return OpenGLWrapper::getBufferSwapCounter();
2521void SAL_CALL VCLXToolkit::setDeterministicScheduling(
sal_Bool bDeterministicMode)
2527void SAL_CALL VCLXToolkit::pause(sal_Int32 nMilliseconds)
2529 new Pause(nMilliseconds);
2532void SAL_CALL VCLXToolkit::startRecording()
2537void SAL_CALL VCLXToolkit::stopRecording()
2542css::uno::Sequence< OUString > VCLXToolkit::getRecordingAndClear()
2549void SAL_CALL VCLXToolkit::keyPress(
const css::awt::KeyEvent & aKeyEvent )
2551 css::uno::Reference<css::awt::XWindow> xWindow ( aKeyEvent.Source, css::uno::UNO_QUERY_THROW );
2554 throw css::uno::RuntimeException(
"invalid event source" );
2560void SAL_CALL VCLXToolkit::keyRelease(
const css::awt::KeyEvent & aKeyEvent )
2562 css::uno::Reference<css::awt::XWindow> xWindow ( aKeyEvent.Source, css::uno::UNO_QUERY_THROW );
2565 throw css::uno::RuntimeException(
"invalid event source" );
2572void SAL_CALL VCLXToolkit::mousePress(
const css::awt::MouseEvent & aMouseEvent )
2574 css::uno::Reference<css::awt::XWindow> xWindow ( aMouseEvent.Source, css::uno::UNO_QUERY_THROW );
2577 throw css::uno::RuntimeException(
"invalid event source" );
2583void SAL_CALL VCLXToolkit::mouseRelease(
const css::awt::MouseEvent & aMouseEvent )
2585 css::uno::Reference<css::awt::XWindow> xWindow ( aMouseEvent.Source, css::uno::UNO_QUERY_THROW );
2588 throw css::uno::RuntimeException(
"invalid event source" );
2594void SAL_CALL VCLXToolkit::mouseMove(
const css::awt::MouseEvent & aMouseEvent )
2596 css::uno::Reference<css::awt::XWindow> xWindow ( aMouseEvent.Source, css::uno::UNO_QUERY_THROW );
2599 throw css::uno::RuntimeException(
"invalid event source" );
2608extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface *
2610 css::uno::XComponentContext *,
2611 css::uno::Sequence<css::uno::Any>
const &)
2613 return cppu::acquire(
new VCLXToolkit());
static void AddEventListener(const Link< VclSimpleEvent &, void > &rEventListener)
static tools::Long GetTopWindowCount()
static unsigned int GetDisplayBuiltInScreen()
static vcl::Window * GetTopWindow(tools::Long nIndex)
static ImplSVEvent * PostKeyEvent(VclEventId nEvent, vcl::Window *pWin, KeyEvent const *pKeyEvent)
static ImplSVEvent * PostMouseEvent(VclEventId nEvent, vcl::Window *pWin, MouseEvent const *pMouseEvent)
static void RemoveKeyListener(const Link< VclWindowEvent &, bool > &rKeyListener)
static bool Reschedule(bool bHandleAllCurrentEvents=false)
static vcl::Window * GetFocusWindow()
static tools::Rectangle GetScreenPosSizePixel(unsigned int nScreen)
static void RemoveEventListener(const Link< VclSimpleEvent &, void > &rEventListener)
static vcl::Window * GetActiveTopWindow()
static void AddKeyListener(const Link< VclWindowEvent &, bool > &rKeyListener)
void ImplInitDialog(vcl::Window *pParent, WinBits nStyle, InitFlag eFlag=InitFlag::Default)
void ImplLOKNotifier(vcl::Window *pParent)
virtual void Start(bool bStartTimer=true) override
Size GetSizePixel() const
sal_Unicode GetCharCode() const
const vcl::KeyCode & GetKeyCode() const
virtual void dispose() override
virtual ~MessBox() override
virtual Size GetOptimalSize() const override
VclPtr< FixedImage > mpFixedImage
MessBoxStyle mnMessBoxStyle
virtual void StateChanged(StateChangedType nStateChange) override
void SetImage(const Image &rImage)
VclPtr< VclMultiLineEdit > mpVCLMultiLineEdit
std::vector< FontMappingUseItem > FontMappingUseData
static FontMappingUseData FinishTrackingFontMappingUse()
static void StartTrackingFontMappingUse()
tools::Long AdjustX(tools::Long nHorzMove)
constexpr tools::Long X() const
static void SetDeterministicMode(bool bDeterministic)
static void ProcessEventsToIdle()
constexpr tools::Long Height() const
tools::Long AdjustHeight(tools::Long n)
void setWidth(tools::Long nWidth)
tools::Long AdjustWidth(tools::Long n)
void setHeight(tools::Long nHeight)
constexpr tools::Long Width() const
virtual OUString GetText() const override
virtual void SetText(const OUString &rStr) override
void SetPriority(TaskPriority ePriority)
tools::Long GetMaxLineWidth() const
virtual void Invoke() override
static void SetUnoWrapper(UnoWrapperBase *pWrapper)
::KeyEvent createVCLKeyEvent(const css::awt::KeyEvent &_rAwtEvent)
static bool IsZero(const css::awt::Rectangle &rRect)
::MouseEvent createVCLMouseEvent(const css::awt::MouseEvent &_rAwtEvent)
static vcl::Window * GetWindow(const css::uno::Reference< css::awt::XWindow > &rxWindow)
static void ImplGetPropertyIds(std::vector< sal_uInt16 > &aIds)
vcl::Window * GetWindow() const
static void ImplGetPropertyIds(std::vector< sal_uInt16 > &aIds, bool bWithDefaults=false)
virtual void SAL_CALL disposing(const css::lang::EventObject &Source) override
void reset(reference_type *pBody)
reference_type * get() const
static VclPtr< reference_type > Create(Arg &&... arg)
sal_Int32 addInterface(const css::uno::Reference< ListenerT > &rxIFace)
std::vector< css::uno::Reference< ListenerT > > getElements() const
void disposeAndClear(const css::lang::EventObject &rEvt)
sal_Int32 getLength() const
sal_Int32 removeInterface(const css::uno::Reference< ListenerT > &rxIFace)
static void stopRecording()
static css::uno::Sequence< OUString > getRecordingAndClear()
static void startRecording()
mutable::osl::Mutex m_aMutex
sal_uInt16 GetCode() const
KeyFuncType GetFunction() const
tools::Rectangle GetTextRect(const tools::Rectangle &rRect, const OUString &rStr, DrawTextFlags nStyle=DrawTextFlags::WordBreak, TextRectInfo *pInfo=nullptr, const vcl::ITextLayout *_pTextLayout=nullptr) const
float GetDPIScaleFactor() const
GetFocusFlags GetGetFocusFlags() const
VCLXWindow * GetWindowPeer() const
virtual void SetSizePixel(const Size &rNewSize)
void Show(bool bVisible=true, ShowFlags nFlags=ShowFlags::NONE)
const OUString & GetHelpId() const
tools::Long CalcTitleWidth() const
virtual css::uno::Reference< css::awt::XVclWindowPeer > GetComponentInterface(bool bCreate=true)
void SetCreatedWithToolkit(bool b)
void SetComponentInterface(css::uno::Reference< css::awt::XVclWindowPeer > const &xIFace)
virtual void SetPosSizePixel(const Point &rNewPos, const Size &rNewSize)
friend friend class MessBox
inline ::tools::Rectangle VCLRectangle(const css::awt::Rectangle &rAWTRect)
#define DBG_ASSERT(sCon, aError)
#define DBG_UNHANDLED_EXCEPTION(...)
DECL_LINK(CheckNameHdl, SvxNameDialog &, bool)
#define LINK(Instance, Class, Member)
void SAL_CALL windowClosed(const css::lang::EventObject &e) override
void SAL_CALL windowMinimized(const css::lang::EventObject &e) override
void SAL_CALL windowDeactivated(const css::lang::EventObject &e) override
void SAL_CALL windowActivated(const css::lang::EventObject &e) override
void SAL_CALL elementReplaced(const css::container::ContainerEvent &Event) override
void SAL_CALL elementRemoved(const css::container::ContainerEvent &Event) override
DECL_LISTENERMULTIPLEXER_END void SAL_CALL windowOpened(const css::lang::EventObject &e) override
void SAL_CALL windowClosing(const css::lang::EventObject &e) override
DECL_LISTENERMULTIPLEXER_END void SAL_CALL elementInserted(const css::container::ContainerEvent &Event) override
void SAL_CALL windowNormalized(const css::lang::EventObject &e) override
Sequence< sal_Int8 > aSeq
#define SAL_INFO_IF(condition, area, stream)
Reference< XComponentContext > getProcessComponentContext()
css::uno::Sequence< OUString > getSupportedServiceNames()
OUString getImplementationName()
bool CPPUHELPER_DLLPUBLIC supportsService(css::lang::XServiceInfo *implementation, rtl::OUString const &name)
constexpr std::enable_if_t< std::is_signed_v< T >, std::make_unsigned_t< T > > make_unsigned(T value)
SVX_DLLPUBLIC OUString getProperty(css::uno::Reference< css::beans::XPropertyContainer > const &rxPropertyContainer, OUString const &rName)
BitmapEx GetBitmapEx(BitmapEx const &rBitmapEx, DrawModeFlags nDrawMode)
sal_uInt16 GetPropertyId(const OUString &rPropertyName)
#define BASEPROPERTY_COMPLETE
#define BASEPROPERTY_CURRENTITEMID
#define BASEPROPERTY_TEXT
#define BASEPROPERTY_ACTIVATED
VCL_DLLPUBLIC Image const & GetStandardErrorBoxImage()
VCL_DLLPUBLIC OUString GetStandardQueryBoxText()
VCL_DLLPUBLIC OUString GetStandardWarningBoxText()
VCL_DLLPUBLIC OUString GetStandardInfoBoxText()
VCL_DLLPUBLIC Image const & GetStandardQueryBoxImage()
VCL_DLLPUBLIC Image const & GetStandardWarningBoxImage()
VCL_DLLPUBLIC OUString GetStandardErrorBoxText()
VCL_DLLPUBLIC Image const & GetStandardInfoBoxImage()
VCL_DLLPUBLIC bool InitVCL()
VCL_DLLPUBLIC void CreateMainLoopThread(oslWorkerFunction pWorker, void *pThreadData)
VCL_DLLPUBLIC void DeInitVCL()
VCL_DLLPUBLIC void JoinMainLoopThread()
VCL_DLLPUBLIC bool IsVCLInit()
#define IMPL_MSGBOX_OFFSET_EXTRA_Y
#define IMPL_MSGBOX_OFFSET_EXTRA_X
#define IMPL_MINSIZE_MSGBOX_WIDTH
#define IMPL_SEP_MSGBOX_IMAGE
#define IMPL_DIALOG_OFFSET
WinBits const WB_CLOSEABLE
WinBits const WB_MOVEABLE
WinBits const WB_DROPDOWN
WinBits const WB_SIZEABLE
WinBits const WB_AUTOVSCROLL
WinBits const WB_AUTOHSCROLL
WinBits const WB_DEFBUTTON
WinBits const WB_READONLY
WinBits const WB_CLIPCHILDREN
WinBits const WB_NOBORDER