desktop/qa/desktop_lib/test_desktop_lib.cxx | 58 +++++++++++++++++++++-- filter/CppunitTest_filter_priority.mk | 1 filter/source/config/cache/typedetection.cxx | 12 +++- filter/source/config/cache/typedetection.hxx | 41 +++++++++++++++- framework/Library_fwe.mk | 2 framework/source/dispatch/closedispatcher.cxx | 2 framework/source/loadenv/loadenv.cxx | 36 +++++++++++--- include/comphelper/propertysequence.hxx | 18 +++++++ include/tools/errinf.hxx | 5 + include/vcl/dialog.hxx | 2 sfx2/Library_sfx.mk | 1 sfx2/inc/preventduplicateinteraction.hxx | 21 ++++---- sfx2/source/appl/appopen.cxx | 6 +- sfx2/source/appl/preventduplicateinteraction.cxx | 25 +++++++-- sw/source/core/frmedt/fetab.cxx | 20 +++---- tools/source/ref/errinf.cxx | 7 +- uui/source/iahndl.cxx | 10 ++- vcl/source/window/dialog.cxx | 2 vcl/source/window/msgbox.cxx | 4 - 19 files changed, 212 insertions(+), 61 deletions(-)
New commits: commit 6709e2d08a7bf9f8e3956e1e16a56149e78b995c Author: Samuel Mehrbrodt <samuel.mehrbr...@cib.de> Date: Tue Dec 5 15:46:22 2017 +0100 Rename InitAnySequence -> InitAnyPropertySequence partial cherry-pick of c23cc5d7551a0ed0e3dad2d33dd00b38643456a1 Change-Id: Idb266d42c5f9fb09f04b13e78c037f5df9c32079 diff --git a/include/comphelper/propertysequence.hxx b/include/comphelper/propertysequence.hxx index 6af3bb389929..d6c00775a968 100644 --- a/include/comphelper/propertysequence.hxx +++ b/include/comphelper/propertysequence.hxx @@ -14,7 +14,6 @@ #include <initializer_list> #include <com/sun/star/uno/Any.hxx> #include <com/sun/star/uno/Sequence.hxx> -#include <com/sun/star/beans/NamedValue.hpp> #include <com/sun/star/beans/PropertyValue.hpp> namespace comphelper @@ -40,14 +39,14 @@ namespace comphelper /// /// This is particularly useful for creation of sequences that are later /// unwrapped using comphelper::SequenceAsHashMap. - inline css::uno::Sequence< css::uno::Any > InitAnySequence( + inline css::uno::Sequence< css::uno::Any > InitAnyPropertySequence( ::std::initializer_list< ::std::pair< OUString, css::uno::Any > > vInit) { css::uno::Sequence<css::uno::Any> vResult{static_cast<sal_Int32>(vInit.size())}; size_t nCount{0}; for(const auto& aEntry : vInit) { - vResult[nCount] <<= css::beans::NamedValue(aEntry.first, aEntry.second); + vResult[nCount] <<= css::beans::PropertyValue(aEntry.first, -1, aEntry.second, css::beans::PropertyState_DIRECT_VALUE); ++nCount; } return vResult; commit 8c3d3507a0a630925b5b0ccb8bee57790aab208d Author: Jan Holesovsky <ke...@collabora.com> Date: Wed Jul 19 08:35:26 2017 +0200 comphelper: Allow initializer lists for Sequences of NamedValues. This is particularly useful for creation of sequences that are later unwrapped using comphelper::SequenceAsHashMap. Eg. uno::Sequence<uno::Any> aArguments(comphelper::InitAnySequence( { {"SomethingNamed", uno::makeAny(true)}, })); Reference<XExporter> xExporter(aFactory->createInstanceWithArguments(..., aArguments), UNO_QUERY); and in the implementation where the arguments are consumed: comphelper::SequenceAsHashMap aArgumentsMap(rArguments); mbSomething = aArgumentsMap.getUnpackedValueOrDefault("SomethingNamed", false); Change-Id: Ib1135078a99ca08f50bf51184f2ec7d13f5e6b4d Reviewed-on: https://gerrit.libreoffice.org/40201 Reviewed-by: Jan Holesovsky <ke...@collabora.com> Tested-by: Jan Holesovsky <ke...@collabora.com> diff --git a/include/comphelper/propertysequence.hxx b/include/comphelper/propertysequence.hxx index 28561a6904d7..6af3bb389929 100644 --- a/include/comphelper/propertysequence.hxx +++ b/include/comphelper/propertysequence.hxx @@ -14,10 +14,12 @@ #include <initializer_list> #include <com/sun/star/uno/Any.hxx> #include <com/sun/star/uno/Sequence.hxx> +#include <com/sun/star/beans/NamedValue.hpp> #include <com/sun/star/beans/PropertyValue.hpp> namespace comphelper { + /// Init list for property sequences. inline css::uno::Sequence< css::beans::PropertyValue > InitPropertySequence( ::std::initializer_list< ::std::pair< OUString, css::uno::Any > > vInit) { @@ -33,6 +35,23 @@ namespace comphelper } return vResult; } + + /// Init list for property sequences that wrap the NamedValues in Anys. + /// + /// This is particularly useful for creation of sequences that are later + /// unwrapped using comphelper::SequenceAsHashMap. + inline css::uno::Sequence< css::uno::Any > InitAnySequence( + ::std::initializer_list< ::std::pair< OUString, css::uno::Any > > vInit) + { + css::uno::Sequence<css::uno::Any> vResult{static_cast<sal_Int32>(vInit.size())}; + size_t nCount{0}; + for(const auto& aEntry : vInit) + { + vResult[nCount] <<= css::beans::NamedValue(aEntry.first, aEntry.second); + ++nCount; + } + return vResult; + } } // namespace comphelper commit e438b6f7db20854463849366045d4da79adeb201 Author: Caolán McNamara <caol...@redhat.com> Date: Thu Nov 23 14:05:26 2017 +0000 set new document window as parent for dialogs during load and exit typedetection early and completely if application quits while detecting During typedetection, before loading proper, we have the hidden window as parent so warnings are not modal to existing windows and they are cancelled on exit. Once we do have a window, then reinit interaction handler to have that window as the parent for any further dialogs. Change-Id: I5c6711557266bf7d1eb9291f1c454cbfaf766886 Reviewed-on: https://gerrit.libreoffice.org/45148 Tested-by: Jenkins <c...@libreoffice.org> Reviewed-by: Caolán McNamara <caol...@redhat.com> Tested-by: Caolán McNamara <caol...@redhat.com> diff --git a/filter/CppunitTest_filter_priority.mk b/filter/CppunitTest_filter_priority.mk index e5046ac0e3a2..d412b922e7ea 100644 --- a/filter/CppunitTest_filter_priority.mk +++ b/filter/CppunitTest_filter_priority.mk @@ -11,6 +11,7 @@ $(eval $(call gb_CppunitTest_CppunitTest,filter_priority)) $(eval $(call gb_CppunitTest_use_sdk_api,filter_priority)) $(eval $(call gb_CppunitTest_use_ure,filter_priority)) +$(eval $(call gb_CppunitTest_use_vcl,filter_priority)) $(eval $(call gb_CppunitTest_use_configuration,filter_priority)) diff --git a/filter/source/config/cache/typedetection.cxx b/filter/source/config/cache/typedetection.cxx index 278115c8af6c..74b0b978f5f6 100644 --- a/filter/source/config/cache/typedetection.cxx +++ b/filter/source/config/cache/typedetection.cxx @@ -21,6 +21,7 @@ #include "constant.hxx" #include <com/sun/star/document/XExtendedFilterDetection.hpp> +#include <com/sun/star/frame/Desktop.hpp> #include <com/sun/star/util/URLTransformer.hpp> #include <com/sun/star/util/XURLTransformer.hpp> @@ -50,7 +51,10 @@ namespace filter{ TypeDetection::TypeDetection(const css::uno::Reference< css::uno::XComponentContext >& rxContext) : m_xContext(rxContext) + , m_xTerminateListener(new TerminateDetection(this)) + , m_bCancel(false) { + css::frame::Desktop::create(m_xContext)->addTerminateListener(m_xTerminateListener.get()); BaseContainer::init(rxContext , TypeDetection::impl_getImplementationName() , TypeDetection::impl_getSupportedServiceNames(), @@ -60,6 +64,7 @@ TypeDetection::TypeDetection(const css::uno::Reference< css::uno::XComponentCont TypeDetection::~TypeDetection() { + css::frame::Desktop::create(m_xContext)->removeTerminateListener(m_xTerminateListener.get()); } @@ -426,18 +431,17 @@ OUString SAL_CALL TypeDetection::queryTypeByDescriptor(css::uno::Sequence< css:: if (lFlatTypes.size()>0) sType = impl_detectTypeFlatAndDeep(stlDescriptor, lFlatTypes, bAllowDeep, lUsedDetectors, sLastChance); - // flat detection failed // pure deep detection failed // => ask might existing InteractionHandler // means: ask user for its decision - if (sType.isEmpty()) + if (sType.isEmpty() && !m_bCancel) sType = impl_askUserForTypeAndFilterIfAllowed(stlDescriptor); // no real detected type - but a might valid one. // update descriptor and set last chance for return. - if (sType.isEmpty() && !sLastChance.isEmpty()) + if (sType.isEmpty() && !sLastChance.isEmpty() && !m_bCancel) { OSL_FAIL("set first flat detected type without a registered deep detection service as \"last chance\" ... nevertheless some other deep detections said \"NO\". I TRY IT!"); sType = sLastChance; @@ -898,7 +902,7 @@ OUString TypeDetection::impl_detectTypeFlatAndDeep( utl::MediaDescriptor& r // obtained from the cache => ignore it, and continue with search for (FlatDetection::const_iterator pFlatIt = lFlatTypes.begin(); - pFlatIt != lFlatTypes.end() ; + pFlatIt != lFlatTypes.end() && !m_bCancel; ++pFlatIt ) { const FlatDetectionInfo& aFlatTypeInfo = *pFlatIt; diff --git a/filter/source/config/cache/typedetection.hxx b/filter/source/config/cache/typedetection.hxx index 548a14343925..f948e6522697 100644 --- a/filter/source/config/cache/typedetection.hxx +++ b/filter/source/config/cache/typedetection.hxx @@ -21,14 +21,16 @@ #include "basecontainer.hxx" #include <com/sun/star/document/XTypeDetection.hpp> +#include <com/sun/star/frame/XTerminateListener.hpp> #include <com/sun/star/lang/XSingleServiceFactory.hpp> #include <com/sun/star/lang/XMultiServiceFactory.hpp> #include <unotools/mediadescriptor.hxx> +#include <cppuhelper/compbase.hxx> #include <cppuhelper/implbase.hxx> - namespace filter{ namespace config { +class TerminateDetection; /** @short implements the service <type scope="com.sun.star.document">TypeDetection</type>. */ @@ -39,6 +41,8 @@ class TypeDetection : public ::cppu::ImplInheritanceHelper< BaseContainer // native interface css::uno::Reference< css::uno::XComponentContext > m_xContext; + rtl::Reference<TerminateDetection> m_xTerminateListener; + bool m_bCancel; public: @@ -53,6 +57,11 @@ public: */ explicit TypeDetection(const css::uno::Reference< css::uno::XComponentContext >& rxContext); + void cancel() + { + m_bCancel = true; + } + /** @short standard dtor. */ @@ -365,6 +374,36 @@ public: static css::uno::Reference< css::uno::XInterface > impl_createInstance(const css::uno::Reference< css::lang::XMultiServiceFactory >& xSMGR); }; +class TerminateDetection : public cppu::WeakComponentImplHelper<css::frame::XTerminateListener> +{ +private: + osl::Mutex m_aLock; + TypeDetection* m_pTypeDetection; + +public: + + using cppu::WeakComponentImplHelperBase::disposing; + virtual void SAL_CALL disposing(const css::lang::EventObject&) override + { + } + + // XTerminateListener + virtual void SAL_CALL queryTermination(const css::lang::EventObject&) override + { + m_pTypeDetection->cancel(); + } + + virtual void SAL_CALL notifyTermination(const css::lang::EventObject&) override + { + } + + TerminateDetection(TypeDetection* pTypeDetection) + : cppu::WeakComponentImplHelper<css::frame::XTerminateListener>(m_aLock) + , m_pTypeDetection(pTypeDetection) + { + } +}; + }} #endif // INCLUDED_FILTER_SOURCE_CONFIG_CACHE_TYPEDETECTION_HXX diff --git a/framework/source/loadenv/loadenv.cxx b/framework/source/loadenv/loadenv.cxx index 5e51c42bee83..5961c57596ab 100644 --- a/framework/source/loadenv/loadenv.cxx +++ b/framework/source/loadenv/loadenv.cxx @@ -28,6 +28,7 @@ #include <services.h> #include <comphelper/interaction.hxx> #include <comphelper/lok.hxx> +#include <comphelper/propertysequence.hxx> #include <framework/interaction.hxx> #include <comphelper/processfactory.hxx> #include <comphelper/configuration.hxx> @@ -55,6 +56,7 @@ #include <com/sun/star/frame/FrameSearchFlag.hpp> #include <com/sun/star/frame/XDispatchProvider.hpp> #include <com/sun/star/lang/XComponent.hpp> +#include <com/sun/star/lang/XInitialization.hpp> #include <com/sun/star/lang/XServiceInfo.hpp> #include <com/sun/star/lang/DisposedException.hpp> #include <com/sun/star/io/XInputStream.hpp> @@ -1071,15 +1073,35 @@ bool LoadEnv::impl_loadContent() bool bPreview = m_lMediaDescriptor.getUnpackedValueOrDefault(utl::MediaDescriptor::PROP_PREVIEW(), false); css::uno::Reference< css::task::XStatusIndicator > xProgress = m_lMediaDescriptor.getUnpackedValueOrDefault(utl::MediaDescriptor::PROP_STATUSINDICATOR(), css::uno::Reference< css::task::XStatusIndicator >()); - if (!bHidden && !bMinimized && !bPreview && !xProgress.is()) + if (!bHidden && !bMinimized && !bPreview) { - // Note: it's an optional interface! - css::uno::Reference< css::task::XStatusIndicatorFactory > xProgressFactory(xTargetFrame, css::uno::UNO_QUERY); - if (xProgressFactory.is()) + if (!xProgress.is()) { - xProgress = xProgressFactory->createStatusIndicator(); - if (xProgress.is()) - m_lMediaDescriptor[utl::MediaDescriptor::PROP_STATUSINDICATOR()] <<= xProgress; + // Note: it's an optional interface! + css::uno::Reference< css::task::XStatusIndicatorFactory > xProgressFactory(xTargetFrame, css::uno::UNO_QUERY); + if (xProgressFactory.is()) + { + xProgress = xProgressFactory->createStatusIndicator(); + if (xProgress.is()) + m_lMediaDescriptor[utl::MediaDescriptor::PROP_STATUSINDICATOR()] <<= xProgress; + } + } + + // Now that we have a target window into which we can load, reinit the interaction handler to have this + // window as its parent for modal dialogs and ensure the window is visible + css::uno::Reference< css::task::XInteractionHandler > xInteraction = m_lMediaDescriptor.getUnpackedValueOrDefault( + utl::MediaDescriptor::PROP_INTERACTIONHANDLER(), + css::uno::Reference< css::task::XInteractionHandler >()); + css::uno::Reference<css::lang::XInitialization> xHandler(xInteraction, css::uno::UNO_QUERY); + if (xHandler.is()) + { + css::uno::Reference<css::awt::XWindow> xWindow = xTargetFrame->getContainerWindow(); + uno::Sequence<uno::Any> aArguments(comphelper::InitAnyPropertySequence( + { + {"Parent", uno::Any(xWindow)} + })); + xHandler->initialize(aArguments); + impl_makeFrameWindowVisible(xWindow, false); } } diff --git a/sfx2/inc/preventduplicateinteraction.hxx b/sfx2/inc/preventduplicateinteraction.hxx index a7d1b097134f..f9097576e480 100644 --- a/sfx2/inc/preventduplicateinteraction.hxx +++ b/sfx2/inc/preventduplicateinteraction.hxx @@ -22,17 +22,128 @@ #include <vector> +#include <com/sun/star/frame/Desktop.hpp> +#include <com/sun/star/frame/TerminationVetoException.hpp> +#include <com/sun/star/frame/XTerminateListener2.hpp> +#include <com/sun/star/lang/XInitialization.hpp> #include <com/sun/star/task/XInteractionHandler2.hpp> #include <com/sun/star/task/XInteractionRequest.hpp> +#include <cppuhelper/compbase.hxx> #include <cppuhelper/implbase.hxx> +#include <sfx2/app.hxx> +#include <toolkit/helper/vclunohelper.hxx> +#include <vcl/dialog.hxx> +#include <vcl/svapp.hxx> +#include <vcl/wrkwin.hxx> + namespace com { namespace sun { namespace star { namespace uno { class XComponentContext; } } } } namespace sfx2 { +inline void closedialogs(SystemWindow& rTopLevel, bool bCloseRoot) +{ + for (vcl::Window *pChild = rTopLevel.GetWindow(GetWindowType::FirstTopWindowChild); pChild; pChild = rTopLevel.GetWindow(GetWindowType::NextTopWindowSibling)) + closedialogs(dynamic_cast<SystemWindow&>(*pChild), true); + if (bCloseRoot) + rTopLevel.Close(); +} + +// This is intended to be the parent for any warning dialogs launched +// during the load of a document so that those dialogs are modal to +// this window and don't block any existing windows. +// +// If there are dialog children open on exit then veto termination, +// close the topmost dialog and retry termination. +class WarningDialogsParent : + public cppu::WeakComponentImplHelper<css::frame::XTerminateListener> +{ +private: + osl::Mutex m_aLock; + VclPtr<WorkWindow> m_xWin; + css::uno::Reference<css::awt::XWindow> m_xInterface; + +private: + + DECL_STATIC_LINK_TYPED(WarningDialogsParent, TerminateDesktop, void*, void); + + void closewarningdialogs() + { + if (!m_xWin) + return; + SolarMutexGuard aSolarGuard; + closedialogs(dynamic_cast<SystemWindow&>(*m_xWin), false); + } + +public: + + using cppu::WeakComponentImplHelperBase::disposing; + virtual void SAL_CALL disposing(const css::lang::EventObject&) override + { + } + + // XTerminateListener + virtual void SAL_CALL queryTermination(const css::lang::EventObject&) override + { + closewarningdialogs(); + Application::PostUserEvent(LINK(this, WarningDialogsParent, TerminateDesktop)); + throw css::frame::TerminationVetoException(); + } + + virtual void SAL_CALL notifyTermination(const css::lang::EventObject&) override + { + } + +public: + WarningDialogsParent() + : cppu::WeakComponentImplHelper<css::frame::XTerminateListener>(m_aLock) + { + SolarMutexGuard aSolarGuard; + m_xWin = VclPtr<WorkWindow>::Create(nullptr, WB_STDWORK); + m_xWin->SetText("dialog parent for warning dialogs during load"); + m_xInterface = VCLUnoHelper::GetInterface(m_xWin); + } + + virtual ~WarningDialogsParent() override + { + closewarningdialogs(); + m_xWin.disposeAndClear(); + } + + const css::uno::Reference<css::awt::XWindow>& GetDialogParent() const + { + return m_xInterface; + } +}; + +class WarningDialogsParentScope +{ +private: + css::uno::Reference<css::frame::XDesktop> m_xDesktop; + rtl::Reference<WarningDialogsParent> m_xListener; + +public: + WarningDialogsParentScope(const css::uno::Reference<css::uno::XComponentContext>& rContext) + : m_xDesktop(css::frame::Desktop::create(rContext), css::uno::UNO_QUERY_THROW) + , m_xListener(new WarningDialogsParent) + { + m_xDesktop->addTerminateListener(m_xListener.get()); + } + + const css::uno::Reference<css::awt::XWindow>& GetDialogParent() const + { + return m_xListener->GetDialogParent(); + } + + ~WarningDialogsParentScope() + { + m_xDesktop->removeTerminateListener(m_xListener.get()); + } +}; + /** @short Prevent us from showing the same interaction more than once during the same transaction. @@ -50,7 +161,7 @@ struct ThreadHelpBase2 }; class PreventDuplicateInteraction : private ThreadHelpBase2 - ,public ::cppu::WeakImplHelper< css::task::XInteractionHandler2 > + , public ::cppu::WeakImplHelper<css::lang::XInitialization, css::task::XInteractionHandler2> { // structs, types etc. @@ -99,6 +210,8 @@ class PreventDuplicateInteraction : private ThreadHelpBase2 if it's not blocked. */ css::uno::Reference< css::task::XInteractionHandler > m_xHandler; + std::unique_ptr<WarningDialogsParentScope> m_xWarningDialogsParent; + /** This list describe which and how incoming interactions must be handled. Further it contains all collected information after this interaction object was used.*/ @@ -108,6 +221,7 @@ class PreventDuplicateInteraction : private ThreadHelpBase2 // uno interface public: + virtual void SAL_CALL initialize(const css::uno::Sequence<css::uno::Any>& rArguments) override; /** @interface XInteractionHandler @@ -147,6 +261,7 @@ class PreventDuplicateInteraction : private ThreadHelpBase2 virtual css::uno::Any SAL_CALL queryInterface( const css::uno::Type& aType ) throw (css::uno::RuntimeException, std::exception) override; + // c++ interface public: @@ -167,7 +282,7 @@ class PreventDuplicateInteraction : private ThreadHelpBase2 /** @short dtor to free used memory. */ - virtual ~PreventDuplicateInteraction(); + virtual ~PreventDuplicateInteraction() override; /** diff --git a/sfx2/source/appl/preventduplicateinteraction.cxx b/sfx2/source/appl/preventduplicateinteraction.cxx index fdbf43ac1ad0..7ef25e70e82d 100644 --- a/sfx2/source/appl/preventduplicateinteraction.cxx +++ b/sfx2/source/appl/preventduplicateinteraction.cxx @@ -20,6 +20,7 @@ #include <preventduplicateinteraction.hxx> #include <osl/diagnose.h> +#include <comphelper/processfactory.hxx> #include <com/sun/star/task/InteractionHandler.hpp> #include <com/sun/star/task/XInteractionAbort.hpp> @@ -41,6 +42,7 @@ void PreventDuplicateInteraction::setHandler(const css::uno::Reference< css::tas { // SAFE -> ::osl::ResettableMutexGuard aLock(m_aLock); + m_xWarningDialogsParent.reset(); m_xHandler = xHandler; aLock.clear(); // <- SAFE @@ -53,7 +55,11 @@ void PreventDuplicateInteraction::useDefaultUUIHandler() aLock.clear(); // <- SAFE - css::uno::Reference< css::task::XInteractionHandler > xHandler( css::task::InteractionHandler::createWithParent( m_xContext, nullptr ), css::uno::UNO_QUERY_THROW ); + //if we use the default handler, set the parent to a window belonging to this object so that the dialogs + //don't block unrelated windows. + m_xWarningDialogsParent.reset(new WarningDialogsParentScope(m_xContext)); + css::uno::Reference<css::task::XInteractionHandler> xHandler(css::task::InteractionHandler::createWithParent( + m_xContext, m_xWarningDialogsParent->GetDialogParent()), css::uno::UNO_QUERY_THROW); // SAFE -> aLock.reset(); @@ -72,7 +78,7 @@ css::uno::Any SAL_CALL PreventDuplicateInteraction::queryInterface( const css::u if ( !xHandler.is() ) return css::uno::Any(); } - return ::cppu::WeakImplHelper< css::task::XInteractionHandler2 >::queryInterface( aType ); + return ::cppu::WeakImplHelper<css::lang::XInitialization, css::task::XInteractionHandler2>::queryInterface(aType); } void SAL_CALL PreventDuplicateInteraction::handle(const css::uno::Reference< css::task::XInteractionRequest >& xRequest) @@ -236,6 +242,18 @@ bool PreventDuplicateInteraction::getInteractionInfo(const css::uno::Type& return false; } +void SAL_CALL PreventDuplicateInteraction::initialize(const css::uno::Sequence<css::uno::Any>& rArguments) +{ + // If we're re-initialized to set a specific new window as a parent then drop our temporary + // dialog parent + css::uno::Reference<css::lang::XInitialization> xHandler(m_xHandler, css::uno::UNO_QUERY); + if (xHandler.is()) + { + m_xWarningDialogsParent.reset(); + xHandler->initialize(rArguments); + } +} + IMPL_STATIC_LINK_NOARG_TYPED(WarningDialogsParent, TerminateDesktop, void*, void) { css::frame::Desktop::create(comphelper::getProcessComponentContext())->terminate(); diff --git a/uui/source/iahndl.cxx b/uui/source/iahndl.cxx index 914d024cee0e..eff873f58ee8 100644 --- a/uui/source/iahndl.cxx +++ b/uui/source/iahndl.cxx @@ -1001,9 +1001,8 @@ executeMessageBox( WinBits nButtonMask) { SolarMutexGuard aGuard; - WinBits nStyle(0); - ScopedVclPtrInstance< MessBox > xBox(pParent, nButtonMask, nStyle, rTitle, rMessage); + ScopedVclPtrInstance< MessBox > xBox(pParent, nButtonMask, rTitle, rMessage); sal_uInt16 aResult = xBox->Execute(); switch( aResult ) commit 11ea1b0751378e20ee5be8e708b58a5270524716 Author: Caolán McNamara <caol...@redhat.com> Date: Tue Nov 21 16:25:55 2017 +0000 Related: tdf#113160 set a temporary dialog parent during type detection to get warning dialogs that don't block the existing windows but whose lifecycle can be controlled to avoid crashes during exit Change-Id: I57965301c3d8a031acb33e83bf7715fe132385d0 Reviewed-on: https://gerrit.libreoffice.org/45044 Reviewed-by: Caolán McNamara <caol...@redhat.com> Tested-by: Caolán McNamara <caol...@redhat.com> diff --git a/framework/source/loadenv/loadenv.cxx b/framework/source/loadenv/loadenv.cxx index e317dcb6dcfd..5e51c42bee83 100644 --- a/framework/source/loadenv/loadenv.cxx +++ b/framework/source/loadenv/loadenv.cxx @@ -1069,32 +1069,17 @@ bool LoadEnv::impl_loadContent() bool bHidden = m_lMediaDescriptor.getUnpackedValueOrDefault(utl::MediaDescriptor::PROP_HIDDEN(), false); bool bMinimized = m_lMediaDescriptor.getUnpackedValueOrDefault(utl::MediaDescriptor::PROP_MINIMIZED(), false); bool bPreview = m_lMediaDescriptor.getUnpackedValueOrDefault(utl::MediaDescriptor::PROP_PREVIEW(), false); + css::uno::Reference< css::task::XStatusIndicator > xProgress = m_lMediaDescriptor.getUnpackedValueOrDefault(utl::MediaDescriptor::PROP_STATUSINDICATOR(), css::uno::Reference< css::task::XStatusIndicator >()); - if (!bHidden && !bMinimized && !bPreview) + if (!bHidden && !bMinimized && !bPreview && !xProgress.is()) { - css::uno::Reference< css::task::XStatusIndicator > xProgress = m_lMediaDescriptor.getUnpackedValueOrDefault(utl::MediaDescriptor::PROP_STATUSINDICATOR(), css::uno::Reference< css::task::XStatusIndicator >()); - if (!xProgress.is()) + // Note: it's an optional interface! + css::uno::Reference< css::task::XStatusIndicatorFactory > xProgressFactory(xTargetFrame, css::uno::UNO_QUERY); + if (xProgressFactory.is()) { - // Note: it's an optional interface! - css::uno::Reference< css::task::XStatusIndicatorFactory > xProgressFactory(xTargetFrame, css::uno::UNO_QUERY); - if (xProgressFactory.is()) - { - xProgress = xProgressFactory->createStatusIndicator(); - if (xProgress.is()) - m_lMediaDescriptor[utl::MediaDescriptor::PROP_STATUSINDICATOR()] <<= xProgress; - } - } - if (!comphelper::LibreOfficeKit::isActive()) - { - //now that we have a window, set things up so that warnings dialogs are relative to that window - css::uno::Reference<css::task::XInteractionHandler> xInteractionHandler( - task::InteractionHandler::createWithParent(m_xContext, xTargetFrame->getContainerWindow()), - css::uno::UNO_QUERY); - if (xInteractionHandler.is()) - { - m_lMediaDescriptor[utl::MediaDescriptor::PROP_INTERACTIONHANDLER()] <<= xInteractionHandler; - m_lMediaDescriptor[utl::MediaDescriptor::PROP_AUTHENTICATIONHANDLER()] <<= xInteractionHandler; - } + xProgress = xProgressFactory->createStatusIndicator(); + if (xProgress.is()) + m_lMediaDescriptor[utl::MediaDescriptor::PROP_STATUSINDICATOR()] <<= xProgress; } } commit 0b8eae07eb1e7bd769b33e26064a0426558a744c Author: Caolán McNamara <caol...@redhat.com> Date: Wed Nov 22 15:15:08 2017 +0000 move preventduplicateinteraction from framework to sfx2 consumer Change-Id: I1388a88ba20b5cde65cd1d88694775b071a0dff6 Reviewed-on: https://gerrit.libreoffice.org/45099 Reviewed-by: Caolán McNamara <caol...@redhat.com> Tested-by: Caolán McNamara <caol...@redhat.com> diff --git a/framework/Library_fwe.mk b/framework/Library_fwe.mk index 0559236b2bad..72cf5f098a4d 100644 --- a/framework/Library_fwe.mk +++ b/framework/Library_fwe.mk @@ -70,7 +70,6 @@ $(eval $(call gb_Library_add_exception_objects,fwe,\ framework/source/fwe/helper/titlehelper \ framework/source/fwe/helper/documentundoguard \ framework/source/fwe/helper/undomanagerhelper \ - framework/source/fwe/interaction/preventduplicateinteraction \ framework/source/fwe/xml/menuconfiguration \ framework/source/fwe/xml/menudocumenthandler \ framework/source/fwe/xml/saxnamespacefilter \ diff --git a/sfx2/Library_sfx.mk b/sfx2/Library_sfx.mk index 9aca9d7f058c..619c33485de9 100644 --- a/sfx2/Library_sfx.mk +++ b/sfx2/Library_sfx.mk @@ -115,6 +115,7 @@ $(eval $(call gb_Library_add_exception_objects,sfx,\ sfx2/source/appl/newhelp \ sfx2/source/appl/opengrf \ sfx2/source/appl/openuriexternally \ + sfx2/source/appl/preventduplicateinteraction \ sfx2/source/appl/sfxhelp \ sfx2/source/appl/sfxpicklist \ sfx2/source/appl/shellimpl \ diff --git a/include/framework/preventduplicateinteraction.hxx b/sfx2/inc/preventduplicateinteraction.hxx similarity index 98% rename from include/framework/preventduplicateinteraction.hxx rename to sfx2/inc/preventduplicateinteraction.hxx index cf6ac0058eda..a7d1b097134f 100644 --- a/include/framework/preventduplicateinteraction.hxx +++ b/sfx2/inc/preventduplicateinteraction.hxx @@ -20,8 +20,6 @@ #ifndef INCLUDED_FRAMEWORK_PREVENTDUPLICATEINTERACTION_HXX #define INCLUDED_FRAMEWORK_PREVENTDUPLICATEINTERACTION_HXX -#include <framework/fwedllapi.h> - #include <vector> #include <com/sun/star/task/XInteractionHandler2.hpp> @@ -33,7 +31,7 @@ namespace com { namespace sun { namespace star { namespace uno { class XComponentContext; } } } } -namespace framework{ +namespace sfx2 { /** @short Prevent us from showing the same interaction more than once during @@ -51,7 +49,7 @@ struct ThreadHelpBase2 mutable ::osl::Mutex m_aLock; }; -class FWE_DLLPUBLIC PreventDuplicateInteraction : private ThreadHelpBase2 +class PreventDuplicateInteraction : private ThreadHelpBase2 ,public ::cppu::WeakImplHelper< css::task::XInteractionHandler2 > { @@ -233,7 +231,7 @@ class FWE_DLLPUBLIC PreventDuplicateInteraction : private ThreadHelpBase2 PreventDuplicateInteraction::InteractionInfo* pReturn ) const; }; -} // namespace framework +} // namespace sfx2 #endif // INCLUDED_FRAMEWORK_PREVENTDUPLICATEINTERACTION_HXX diff --git a/sfx2/source/appl/appopen.cxx b/sfx2/source/appl/appopen.cxx index e5ff943baa32..5f8bdaa46640 100644 --- a/sfx2/source/appl/appopen.cxx +++ b/sfx2/source/appl/appopen.cxx @@ -56,7 +56,7 @@ #include <svl/eitem.hxx> #include <sfx2/doctempl.hxx> #include <svtools/sfxecode.hxx> -#include <framework/preventduplicateinteraction.hxx> +#include <preventduplicateinteraction.hxx> #include <svtools/ehdl.hxx> #include <basic/sbxobj.hxx> #include <svl/urihelper.hxx> @@ -665,7 +665,7 @@ void SfxApplication::OpenDocExec_Impl( SfxRequest& rReq ) // intercept all incoming interactions and provide useful information // later if the following transaction was finished. - ::framework::PreventDuplicateInteraction* pHandler = new ::framework::PreventDuplicateInteraction(::comphelper::getProcessComponentContext()); + ::sfx2::PreventDuplicateInteraction* pHandler = new ::sfx2::PreventDuplicateInteraction(::comphelper::getProcessComponentContext()); css::uno::Reference< css::task::XInteractionHandler > xHandler (static_cast< css::task::XInteractionHandler* >(pHandler), css::uno::UNO_QUERY); css::uno::Reference< css::task::XInteractionHandler > xWrappedHandler; @@ -684,7 +684,7 @@ void SfxApplication::OpenDocExec_Impl( SfxRequest& rReq ) // define rules for this handler css::uno::Type aInteraction = ::cppu::UnoType<css::task::ErrorCodeRequest>::get(); - ::framework::PreventDuplicateInteraction::InteractionInfo aRule (aInteraction, 1); + ::sfx2::PreventDuplicateInteraction::InteractionInfo aRule (aInteraction, 1); pHandler->addInteractionRule(aRule); if (!aDocService.isEmpty()) diff --git a/framework/source/fwe/interaction/preventduplicateinteraction.cxx b/sfx2/source/appl/preventduplicateinteraction.cxx similarity index 96% rename from framework/source/fwe/interaction/preventduplicateinteraction.cxx rename to sfx2/source/appl/preventduplicateinteraction.cxx index 818fdfe2122a..fdbf43ac1ad0 100644 --- a/framework/source/fwe/interaction/preventduplicateinteraction.cxx +++ b/sfx2/source/appl/preventduplicateinteraction.cxx @@ -17,7 +17,7 @@ * the License at http://www.apache.org/licenses/LICENSE-2.0 . */ -#include <framework/preventduplicateinteraction.hxx> +#include <preventduplicateinteraction.hxx> #include <osl/diagnose.h> @@ -25,7 +25,7 @@ #include <com/sun/star/task/XInteractionAbort.hpp> #include <com/sun/star/task/XInteractionRetry.hpp> -namespace framework{ +namespace sfx2 { PreventDuplicateInteraction::PreventDuplicateInteraction(const css::uno::Reference< css::uno::XComponentContext >& rxContext) : ThreadHelpBase2() @@ -236,6 +236,11 @@ bool PreventDuplicateInteraction::getInteractionInfo(const css::uno::Type& return false; } -} // namespace framework +IMPL_STATIC_LINK_NOARG_TYPED(WarningDialogsParent, TerminateDesktop, void*, void) +{ + css::frame::Desktop::create(comphelper::getProcessComponentContext())->terminate(); +} + +} // namespace sfx2 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ commit b36eaa30fa712b558ecb1e1500577d1352a36d18 Author: Caolán McNamara <caol...@redhat.com> Date: Fri Nov 3 15:27:35 2017 +0000 Related: tdf#113160 set parent of warning dialogs during load to the new window frame being constructed that (may) contain the progress bar, that way such modal dialogs affect the loading document window and not whatever window happens to be active Change-Id: I1c7d3185e47fa316eef003b80d18b31d341b79d6 Reviewed-on: https://gerrit.libreoffice.org/44269 Tested-by: Jenkins <c...@libreoffice.org> Reviewed-by: Caolán McNamara <caol...@redhat.com> Tested-by: Caolán McNamara <caol...@redhat.com> diff --git a/desktop/qa/desktop_lib/test_desktop_lib.cxx b/desktop/qa/desktop_lib/test_desktop_lib.cxx index ab15395be043..2b538c936a1b 100644 --- a/desktop/qa/desktop_lib/test_desktop_lib.cxx +++ b/desktop/qa/desktop_lib/test_desktop_lib.cxx @@ -238,6 +238,7 @@ void DesktopLOKTest::callbackImpl(int nType, const char* pPayload) void DesktopLOKTest::testGetStyles() { + comphelper::LibreOfficeKit::setActive(); LibLODocument_Impl* pDocument = loadDoc("blank_text.odt"); boost::property_tree::ptree aTree; char* pJSON = pDocument->m_pDocumentClass->getCommandValues(pDocument, ".uno:StyleApply"); @@ -267,6 +268,7 @@ void DesktopLOKTest::testGetStyles() CPPUNIT_FAIL("Unknown style family: " + rPair.first); } } + comphelper::LibreOfficeKit::setActive(false); } void DesktopLOKTest::testGetFonts() @@ -290,6 +292,7 @@ void DesktopLOKTest::testGetFonts() void DesktopLOKTest::testCreateView() { + comphelper::LibreOfficeKit::setActive(); LibLODocument_Impl* pDocument = loadDoc("blank_text.odt"); CPPUNIT_ASSERT_EQUAL(1, pDocument->m_pDocumentClass->getViews(pDocument)); @@ -304,10 +307,12 @@ void DesktopLOKTest::testCreateView() pDocument->m_pDocumentClass->destroyView(pDocument, nId); CPPUNIT_ASSERT_EQUAL(1, pDocument->m_pDocumentClass->getViews(pDocument)); + comphelper::LibreOfficeKit::setActive(false); } void DesktopLOKTest::testGetPartPageRectangles() { + comphelper::LibreOfficeKit::setActive(); // Test that we get as many page rectangles as expected: blank document is // one page. LibLODocument_Impl* pDocument = loadDoc("blank_text.odt"); @@ -326,10 +331,12 @@ void DesktopLOKTest::testGetPartPageRectangles() CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), aRectangles.size()); free(pRectangles); + comphelper::LibreOfficeKit::setActive(false); } void DesktopLOKTest::testGetFilterTypes() { + comphelper::LibreOfficeKit::setActive(); LibLibreOffice_Impl aOffice; char* pJSON = aOffice.m_pOfficeClass->getFilterTypes(&aOffice); @@ -340,12 +347,14 @@ void DesktopLOKTest::testGetFilterTypes() CPPUNIT_ASSERT(aTree.size() > 0); CPPUNIT_ASSERT_EQUAL(std::string("application/vnd.oasis.opendocument.text"), aTree.get_child("writer8").get_child("MediaType").get_value<std::string>()); free(pJSON); + comphelper::LibreOfficeKit::setActive(false); } void DesktopLOKTest::testSearchCalc() { - LibLibreOffice_Impl aOffice; comphelper::LibreOfficeKit::setActive(); + + LibLibreOffice_Impl aOffice; LibLODocument_Impl* pDocument = loadDoc("search.ods"); pDocument->pClass->initializeForRendering(pDocument, nullptr); pDocument->pClass->registerCallback(pDocument, &DesktopLOKTest::callback, this); @@ -378,8 +387,9 @@ void DesktopLOKTest::testSearchCalc() void DesktopLOKTest::testSearchAllNotificationsCalc() { - LibLibreOffice_Impl aOffice; comphelper::LibreOfficeKit::setActive(); + + LibLibreOffice_Impl aOffice; LibLODocument_Impl* pDocument = loadDoc("search.ods"); pDocument->pClass->initializeForRendering(pDocument, nullptr); pDocument->pClass->registerCallback(pDocument, &DesktopLOKTest::callback, this); @@ -403,6 +413,8 @@ void DesktopLOKTest::testSearchAllNotificationsCalc() void DesktopLOKTest::testPaintTile() { + comphelper::LibreOfficeKit::setActive(); + LibLODocument_Impl* pDocument = loadDoc("blank_text.odt"); int nCanvasWidth = 100; int nCanvasHeight = 300; @@ -425,27 +437,38 @@ void DesktopLOKTest::testPaintTile() nTileHeight = 4000; aBuffer.resize(nCanvasWidth * nCanvasHeight * 4); pDocument->pClass->paintTile(pDocument, aBuffer.data(), nCanvasWidth, nCanvasHeight, nTilePosX, nTilePosY, nTileWidth, nTileHeight); + + comphelper::LibreOfficeKit::setActive(false); } void DesktopLOKTest::testSaveAs() { + comphelper::LibreOfficeKit::setActive(); + LibLODocument_Impl* pDocument = loadDoc("blank_text.odt"); utl::TempFile aTempFile; aTempFile.EnableKillingFile(); CPPUNIT_ASSERT(pDocument->pClass->saveAs(pDocument, aTempFile.GetURL().toUtf8().getStr(), "png", nullptr)); + + comphelper::LibreOfficeKit::setActive(false); } void DesktopLOKTest::testSaveAsCalc() { + comphelper::LibreOfficeKit::setActive(); + LibLODocument_Impl* pDocument = loadDoc("search.ods"); utl::TempFile aTempFile; aTempFile.EnableKillingFile(); CPPUNIT_ASSERT(pDocument->pClass->saveAs(pDocument, aTempFile.GetURL().toUtf8().getStr(), "png", nullptr)); + + comphelper::LibreOfficeKit::setActive(false); } void DesktopLOKTest::testPasteWriter() { comphelper::LibreOfficeKit::setActive(); + LibLODocument_Impl* pDocument = loadDoc("blank_text.odt"); OString aText("hello"); @@ -467,6 +490,7 @@ void DesktopLOKTest::testPasteWriter() void DesktopLOKTest::testPasteWriterJPEG() { comphelper::LibreOfficeKit::setActive(); + LibLODocument_Impl* pDocument = loadDoc("blank_text.odt"); OUString aFileURL; @@ -530,6 +554,8 @@ void DesktopLOKTest::testRowColumnHeaders() * "size" defines the bottom/right boundary of a row/column in twips (size between 0 and boundary) * "text" has the header label in UTF-8 */ + comphelper::LibreOfficeKit::setActive(); + LibLODocument_Impl* pDocument = loadDoc("search.ods"); pDocument->pClass->initializeForRendering(pDocument, nullptr); @@ -574,10 +600,14 @@ void DesktopLOKTest::testRowColumnHeaders() } nPrevious = nSize; } + + comphelper::LibreOfficeKit::setActive(false); } void DesktopLOKTest::testHiddenRowHeaders() { + comphelper::LibreOfficeKit::setActive(); + LibLODocument_Impl* pDocument = loadDoc("hidden-row.ods"); pDocument->pClass->initializeForRendering(pDocument, nullptr); @@ -607,10 +637,13 @@ void DesktopLOKTest::testHiddenRowHeaders() nPrevious = nSize; } + comphelper::LibreOfficeKit::setActive(false); } void DesktopLOKTest::testCellCursor() { + comphelper::LibreOfficeKit::setActive(); + LibLODocument_Impl* pDocument = loadDoc("search.ods"); boost::property_tree::ptree aTree; @@ -624,11 +657,14 @@ void DesktopLOKTest::testCellCursor() boost::property_tree::read_json(aStream, aTree); OString aRectangle(aTree.get<std::string>("commandValues").c_str()); - CPPUNIT_ASSERT_EQUAL(aRectangle, OString("0, 0, 1278, 254")); + + comphelper::LibreOfficeKit::setActive(false); } void DesktopLOKTest::testCommandResult() { + comphelper::LibreOfficeKit::setActive(); + LibLODocument_Impl* pDocument = loadDoc("blank_text.odt"); // the postUnoCommand() is supposed to be async, let's test it safely @@ -659,11 +695,14 @@ void DesktopLOKTest::testCommandResult() CPPUNIT_ASSERT_EQUAL(aTree.get_child("commandName").get_value<std::string>(), std::string(".uno:Bold")); CPPUNIT_ASSERT_EQUAL(aTree.get_child("success").get_value<bool>(), true); + + comphelper::LibreOfficeKit::setActive(false); } void DesktopLOKTest::testWriterComments() { comphelper::LibreOfficeKit::setActive(); + LibLODocument_Impl* pDocument = loadDoc("blank_text.odt"); pDocument->pClass->registerCallback(pDocument, &DesktopLOKTest::callback, this); uno::Reference<awt::XReschedule> xToolkit(com::sun::star::awt::Toolkit::create(comphelper::getProcessComponentContext()), uno::UNO_QUERY); @@ -704,8 +743,10 @@ void DesktopLOKTest::testWriterComments() void DesktopLOKTest::testModifiedStatus() { - LibLibreOffice_Impl aOffice; comphelper::LibreOfficeKit::setActive(); + + // Load a document and create two views. + LibLibreOffice_Impl aOffice; LibLODocument_Impl* pDocument = loadDoc("blank_text.odt"); pDocument->pClass->initializeForRendering(pDocument, nullptr); pDocument->pClass->registerCallback(pDocument, &DesktopLOKTest::callback, this); @@ -765,6 +806,7 @@ void DesktopLOKTest::testModifiedStatus() void DesktopLOKTest::testSheetOperations() { comphelper::LibreOfficeKit::setActive(); + LibLODocument_Impl* pDocument = loadDoc("sheets.ods"); // insert the last sheet @@ -797,6 +839,7 @@ void DesktopLOKTest::testSheetOperations() void DesktopLOKTest::testSheetSelections() { comphelper::LibreOfficeKit::setActive(); + LibLODocument_Impl* pDocument = loadDoc("sheets.ods", LOK_DOCTYPE_SPREADSHEET); pDocument->pClass->initializeForRendering(pDocument, nullptr); pDocument->pClass->registerCallback(pDocument, &DesktopLOKTest::callback, this); @@ -977,6 +1020,7 @@ namespace { void DesktopLOKTest::testContextMenuCalc() { comphelper::LibreOfficeKit::setActive(); + LibLODocument_Impl* pDocument = loadDoc("sheet_with_image.ods", LOK_DOCTYPE_SPREADSHEET); pDocument->pClass->initializeForRendering(pDocument, nullptr); pDocument->pClass->registerCallback(pDocument, &DesktopLOKTest::callback, this); @@ -1088,6 +1132,7 @@ void DesktopLOKTest::testContextMenuCalc() void DesktopLOKTest::testContextMenuWriter() { comphelper::LibreOfficeKit::setActive(); + LibLODocument_Impl* pDocument = loadDoc("blank_text.odt"); pDocument->pClass->initializeForRendering(pDocument, nullptr); pDocument->pClass->registerCallback(pDocument, &DesktopLOKTest::callback, this); @@ -1144,6 +1189,7 @@ void DesktopLOKTest::testContextMenuWriter() void DesktopLOKTest::testContextMenuImpress() { comphelper::LibreOfficeKit::setActive(); + LibLODocument_Impl* pDocument = loadDoc("blank_presentation.odp", LOK_DOCTYPE_PRESENTATION); pDocument->pClass->initializeForRendering(pDocument, nullptr); pDocument->pClass->registerCallback(pDocument, &DesktopLOKTest::callback, this); @@ -1275,6 +1321,8 @@ static void callbackCompressionTest(const int type, const char* payload, void* d void DesktopLOKTest::testNotificationCompression() { + comphelper::LibreOfficeKit::setActive(); + std::vector<std::tuple<int, std::string>> notifs; std::unique_ptr<CallbackFlushHandler> handler(new CallbackFlushHandler(callbackCompressionTest, ¬ifs)); @@ -1351,6 +1399,8 @@ void DesktopLOKTest::testNotificationCompression() CPPUNIT_ASSERT_EQUAL((int)LOK_CALLBACK_SET_PART, (int)std::get<0>(notifs[i])); CPPUNIT_ASSERT_EQUAL(std::string("1"), std::get<1>(notifs[i++])); + + comphelper::LibreOfficeKit::setActive(false); } CPPUNIT_TEST_SUITE_REGISTRATION(DesktopLOKTest); diff --git a/framework/source/loadenv/loadenv.cxx b/framework/source/loadenv/loadenv.cxx index b6f6f4c92178..e317dcb6dcfd 100644 --- a/framework/source/loadenv/loadenv.cxx +++ b/framework/source/loadenv/loadenv.cxx @@ -1069,17 +1069,32 @@ bool LoadEnv::impl_loadContent() bool bHidden = m_lMediaDescriptor.getUnpackedValueOrDefault(utl::MediaDescriptor::PROP_HIDDEN(), false); bool bMinimized = m_lMediaDescriptor.getUnpackedValueOrDefault(utl::MediaDescriptor::PROP_MINIMIZED(), false); bool bPreview = m_lMediaDescriptor.getUnpackedValueOrDefault(utl::MediaDescriptor::PROP_PREVIEW(), false); - css::uno::Reference< css::task::XStatusIndicator > xProgress = m_lMediaDescriptor.getUnpackedValueOrDefault(utl::MediaDescriptor::PROP_STATUSINDICATOR(), css::uno::Reference< css::task::XStatusIndicator >()); - if (!bHidden && !bMinimized && !bPreview && !xProgress.is()) + if (!bHidden && !bMinimized && !bPreview) { - // Note: its an optional interface! - css::uno::Reference< css::task::XStatusIndicatorFactory > xProgressFactory(xTargetFrame, css::uno::UNO_QUERY); - if (xProgressFactory.is()) + css::uno::Reference< css::task::XStatusIndicator > xProgress = m_lMediaDescriptor.getUnpackedValueOrDefault(utl::MediaDescriptor::PROP_STATUSINDICATOR(), css::uno::Reference< css::task::XStatusIndicator >()); + if (!xProgress.is()) { - xProgress = xProgressFactory->createStatusIndicator(); - if (xProgress.is()) - m_lMediaDescriptor[utl::MediaDescriptor::PROP_STATUSINDICATOR()] <<= xProgress; + // Note: it's an optional interface! + css::uno::Reference< css::task::XStatusIndicatorFactory > xProgressFactory(xTargetFrame, css::uno::UNO_QUERY); + if (xProgressFactory.is()) + { + xProgress = xProgressFactory->createStatusIndicator(); + if (xProgress.is()) + m_lMediaDescriptor[utl::MediaDescriptor::PROP_STATUSINDICATOR()] <<= xProgress; + } + } + if (!comphelper::LibreOfficeKit::isActive()) + { + //now that we have a window, set things up so that warnings dialogs are relative to that window + css::uno::Reference<css::task::XInteractionHandler> xInteractionHandler( + task::InteractionHandler::createWithParent(m_xContext, xTargetFrame->getContainerWindow()), + css::uno::UNO_QUERY); + if (xInteractionHandler.is()) + { + m_lMediaDescriptor[utl::MediaDescriptor::PROP_INTERACTIONHANDLER()] <<= xInteractionHandler; + m_lMediaDescriptor[utl::MediaDescriptor::PROP_AUTHENTICATIONHANDLER()] <<= xInteractionHandler; + } } } diff --git a/include/tools/errinf.hxx b/include/tools/errinf.hxx index 18822c9542cf..203745c4b5a7 100644 --- a/include/tools/errinf.hxx +++ b/include/tools/errinf.hxx @@ -131,7 +131,8 @@ private: static sal_uInt16 HandleError_Impl( sal_uIntPtr lId, sal_uInt16 nFlags, bool bJustCreateString, - OUString & rError); + OUString & rError, + vcl::Window* pParent = nullptr); protected: virtual bool CreateString( const ErrorInfo *, OUString &, sal_uInt16& nMask ) const = 0; @@ -140,7 +141,7 @@ public: ErrorHandler(); virtual ~ErrorHandler(); - static sal_uInt16 HandleError ( sal_uIntPtr lId, sal_uInt16 nMask = USHRT_MAX ); + static sal_uInt16 HandleError ( sal_uIntPtr lId, vcl::Window* pParent = nullptr, sal_uInt16 nMask = USHRT_MAX ); static bool GetErrorString( sal_uIntPtr lId, OUString& rStr ); static void RegisterDisplay( BasicDisplayErrorFunc* ); diff --git a/sw/source/core/frmedt/fetab.cxx b/sw/source/core/frmedt/fetab.cxx index fc6108bb6ad9..d7cdcec740b0 100644 --- a/sw/source/core/frmedt/fetab.cxx +++ b/sw/source/core/frmedt/fetab.cxx @@ -187,7 +187,7 @@ bool SwFEShell::InsertRow( sal_uInt16 nCnt, bool bBehind ) if( dynamic_cast< const SwDDETable* >(pFrame->ImplFindTabFrame()->GetTable()) != nullptr ) { - ErrorHandler::HandleError( ERR_TBLDDECHG_ERROR, + ErrorHandler::HandleError( ERR_TBLDDECHG_ERROR, GetWin(), ERRCODE_MSG_INFO | ERRCODE_BUTTON_DEF_OK ); return false; } @@ -228,7 +228,7 @@ bool SwFEShell::InsertCol( sal_uInt16 nCnt, bool bBehind ) if( dynamic_cast< const SwDDETable* >(pFrame->ImplFindTabFrame()->GetTable()) != nullptr ) { - ErrorHandler::HandleError( ERR_TBLDDECHG_ERROR, + ErrorHandler::HandleError( ERR_TBLDDECHG_ERROR, GetWin(), ERRCODE_MSG_INFO | ERRCODE_BUTTON_DEF_OK ); return false; } @@ -237,7 +237,7 @@ bool SwFEShell::InsertCol( sal_uInt16 nCnt, bool bBehind ) if( !CheckSplitCells( *this, nCnt + 1, nsSwTableSearchType::TBLSEARCH_COL ) ) { - ErrorHandler::HandleError( ERR_TBLINSCOL_ERROR, + ErrorHandler::HandleError( ERR_TBLINSCOL_ERROR, GetWin(), ERRCODE_MSG_INFO | ERRCODE_BUTTON_DEF_OK ); return false; } @@ -283,7 +283,7 @@ bool SwFEShell::DeleteCol() if( dynamic_cast< const SwDDETable* >(pFrame->ImplFindTabFrame()->GetTable()) != nullptr ) { - ErrorHandler::HandleError( ERR_TBLDDECHG_ERROR, + ErrorHandler::HandleError( ERR_TBLDDECHG_ERROR, GetWin(), ERRCODE_MSG_INFO | ERRCODE_BUTTON_DEF_OK ); return false; } @@ -334,7 +334,7 @@ bool SwFEShell::DeleteRow(bool bCompleteTable) if( dynamic_cast< const SwDDETable* >(pFrame->ImplFindTabFrame()->GetTable()) != nullptr ) { - ErrorHandler::HandleError( ERR_TBLDDECHG_ERROR, + ErrorHandler::HandleError( ERR_TBLDDECHG_ERROR, GetWin(), ERRCODE_MSG_INFO | ERRCODE_BUTTON_DEF_OK ); return false; } @@ -453,7 +453,7 @@ sal_uInt16 SwFEShell::MergeTab() const SwTableNode* pTableNd = pTableCursor->GetNode().FindTableNode(); if( dynamic_cast< const SwDDETable* >(&pTableNd->GetTable()) != nullptr ) { - ErrorHandler::HandleError( ERR_TBLDDECHG_ERROR, + ErrorHandler::HandleError( ERR_TBLDDECHG_ERROR, GetWin(), ERRCODE_MSG_INFO | ERRCODE_BUTTON_DEF_OK ); } else @@ -484,7 +484,7 @@ bool SwFEShell::SplitTab( bool bVert, sal_uInt16 nCnt, bool bSameHeight ) if( dynamic_cast< const SwDDETable* >(pFrame->ImplFindTabFrame()->GetTable()) != nullptr ) { - ErrorHandler::HandleError( ERR_TBLDDECHG_ERROR, + ErrorHandler::HandleError( ERR_TBLDDECHG_ERROR, GetWin(), ERRCODE_MSG_INFO | ERRCODE_BUTTON_DEF_OK ); return false; } @@ -493,7 +493,7 @@ bool SwFEShell::SplitTab( bool bVert, sal_uInt16 nCnt, bool bSameHeight ) if( bVert && !CheckSplitCells( *this, nCnt + 1 ) ) { - ErrorHandler::HandleError( ERR_TBLSPLIT_ERROR, + ErrorHandler::HandleError( ERR_TBLSPLIT_ERROR, GetWin(), ERRCODE_MSG_INFO | ERRCODE_BUTTON_DEF_OK ); return false; } @@ -1276,7 +1276,7 @@ bool SwFEShell::DeleteTableSel() if( dynamic_cast< const SwDDETable* >(pFrame->ImplFindTabFrame()->GetTable()) != nullptr ) { - ErrorHandler::HandleError( ERR_TBLDDECHG_ERROR, + ErrorHandler::HandleError( ERR_TBLDDECHG_ERROR, GetWin(), ERRCODE_MSG_INFO | ERRCODE_BUTTON_DEF_OK ); return false; } @@ -2137,7 +2137,7 @@ bool SwFEShell::SetColRowWidthHeight( sal_uInt16 eType, sal_uInt16 nDiff ) if( nsTableChgWidthHeightType::WH_FLAG_INSDEL & eType && dynamic_cast< const SwDDETable* >(pFrame->ImplFindTabFrame()->GetTable()) != nullptr ) { - ErrorHandler::HandleError( ERR_TBLDDECHG_ERROR, + ErrorHandler::HandleError( ERR_TBLDDECHG_ERROR, GetWin(), ERRCODE_MSG_INFO | ERRCODE_BUTTON_DEF_OK ); return false; } diff --git a/tools/source/ref/errinf.cxx b/tools/source/ref/errinf.cxx index 40e7b697c8e2..c287b0731096 100644 --- a/tools/source/ref/errinf.cxx +++ b/tools/source/ref/errinf.cxx @@ -237,14 +237,13 @@ void ErrorHandler::RegisterDisplay(BasicDisplayErrorFunc *aDsp) @return ??? */ sal_uInt16 ErrorHandler::HandleError_Impl( - sal_uIntPtr lId, sal_uInt16 nFlags, bool bJustCreateString, OUString & rError) + sal_uIntPtr lId, sal_uInt16 nFlags, bool bJustCreateString, OUString & rError, vcl::Window* pParent) { OUString aErr; OUString aAction; if(!lId || lId == ERRCODE_ABORT) return 0; EDcrData &rData = TheEDcrData::get(); - vcl::Window *pParent = nullptr; ErrorInfo *pInfo = ErrorInfo::GetErrorInfo(lId); if (!rData.contexts.empty()) { @@ -332,10 +331,10 @@ bool ErrorHandler::GetErrorString(sal_uIntPtr lId, OUString& rStr) @see ErrorHandler::HandleError_Impl */ -sal_uInt16 ErrorHandler::HandleError(sal_uIntPtr lId, sal_uInt16 nFlags) +sal_uInt16 ErrorHandler::HandleError(sal_uIntPtr lId, vcl::Window *pParent, sal_uInt16 nFlags) { OUString aDummy; - return HandleError_Impl( lId, nFlags, false, aDummy ); + return HandleError_Impl( lId, nFlags, false, aDummy, pParent ); } bool ErrorHandler_Impl::CreateString( const ErrorInfo* pInfo, OUString& pStr, diff --git a/uui/source/iahndl.cxx b/uui/source/iahndl.cxx index 5abc43a88368..914d024cee0e 100644 --- a/uui/source/iahndl.cxx +++ b/uui/source/iahndl.cxx @@ -1158,7 +1158,7 @@ UUIInteractionHelper::handleGenericErrorRequest( getParentProperty(), aTitle, aErrorString, WB_OK); } else - ErrorHandler::HandleError(nErrorCode); + ErrorHandler::HandleError(nErrorCode, getParentProperty()); if (xApprove.is() && bWarning) xApprove->select(); commit 258b4b1ef60e5153c1c33444010c1385f46475d6 Author: Samuel Mehrbrodt <samuel.mehrbr...@cib.de> Date: Thu Dec 7 09:32:48 2017 +0100 Resolves: tdf#113160 changing all warning dialogs to non-modal is unsafe existing code doesn't expect that so stuff crashes partial revert of... commit db6b703d391838c481fd090065f6d329edcd4efa Date: Thu Aug 24 18:32:38 2017 +0200 Allow non-modal Dialogs during FileImport/Load Reviewed-on: https://gerrit.libreoffice.org/44227 Reviewed-by: Caolán McNamara <caol...@redhat.com> Tested-by: Caolán McNamara <caol...@redhat.com> Conflicts: framework/source/dispatch/closedispatcher.cxx include/vcl/dialog.hxx include/vcl/msgbox.hxx uui/source/iahndl.cxx vcl/source/window/msgbox.cxx Change-Id: I152feb849186cf035664a700d3f94ee049cdf6d3 diff --git a/framework/source/dispatch/closedispatcher.cxx b/framework/source/dispatch/closedispatcher.cxx index 9aa25190a544..d63938e9a77b 100644 --- a/framework/source/dispatch/closedispatcher.cxx +++ b/framework/source/dispatch/closedispatcher.cxx @@ -363,14 +363,6 @@ IMPL_LINK_NOARG_TYPED(CloseDispatcher, impl_asyncCallback, LinkParamNone*, void) } } - // if we still have dialogs open, temporary suppress termination - if (bTerminateApp && Dialog::AreDialogsOpen()) - { - Application::SetShutdownDelayed(); - bCloseFrame = true; - bTerminateApp = false; - } - // Do it now ... bool bSuccess = false; if (bCloseFrame) diff --git a/framework/source/loadenv/loadenv.cxx b/framework/source/loadenv/loadenv.cxx index c789f4d6e957..b6f6f4c92178 100644 --- a/framework/source/loadenv/loadenv.cxx +++ b/framework/source/loadenv/loadenv.cxx @@ -378,10 +378,6 @@ void LoadEnv::startLoading() if (!bStarted) bStarted = impl_loadContent(); - // This may have triggered Dialogs (error cases) that may have - // delayed the shutdown, so give delayed shutdown a chance - Application::TriggerShutdownDelayed(); - // not started => general error // We can't say - what was the reason for. if (!bStarted) diff --git a/include/vcl/dialog.hxx b/include/vcl/dialog.hxx index 87588d50c85d..add141adea28 100644 --- a/include/vcl/dialog.hxx +++ b/include/vcl/dialog.hxx @@ -38,11 +38,8 @@ public: /** Use given parent or get a default one using GetDefaultParent(...) */ Default, - /** Suppress Parent so that Parent is not blocked (kind of modal mode) */ - NoParent, - - /** Suppress Parent (no modal, see above) and additionally center on default parent */ - NoParentCentered + /** No Parent */ + NoParent }; private: @@ -125,7 +122,6 @@ public: void EndDialog( long nResult = 0 ); static void EndAllDialogs( vcl::Window* pParent=nullptr ); - static bool AreDialogsOpen(); void GetDrawWindowBorder( sal_Int32& rLeftBorder, sal_Int32& rTopBorder, sal_Int32& rRightBorder, sal_Int32& rBottomBorder ) const; diff --git a/include/vcl/msgbox.hxx b/include/vcl/msgbox.hxx index 0f526f618fe6..f3351664574c 100644 --- a/include/vcl/msgbox.hxx +++ b/include/vcl/msgbox.hxx @@ -47,8 +47,7 @@ protected: public: MessBox( vcl::Window* pParent, WinBits nStyle, - const OUString& rTitle, const OUString& rMessage, - Dialog::InitFlag eInitFlag = Dialog::InitFlag::NoParentCentered); + const OUString& rTitle, const OUString& rMessage); virtual ~MessBox(); virtual void dispose() override; diff --git a/include/vcl/svapp.hxx b/include/vcl/svapp.hxx index 2be63c268198..34b659fa7f33 100644 --- a/include/vcl/svapp.hxx +++ b/include/vcl/svapp.hxx @@ -1451,12 +1451,6 @@ public: // For vclbootstrapprotector: static void setDeInitHook(Link<LinkParamNone*,void> const & hook); - // for delayed shutdown: set using SetShutdownDelayed, then - // trigger using TriggerShutdownDelayed which may actually shutdown - // when SetShutdownDelayed is set - static void SetShutdownDelayed(); - static void TriggerShutdownDelayed(); - private: DECL_STATIC_LINK_TYPED( Application, PostEventHandler, void*, void ); }; diff --git a/uui/source/iahndl.cxx b/uui/source/iahndl.cxx index b53f5b474323..5abc43a88368 100644 --- a/uui/source/iahndl.cxx +++ b/uui/source/iahndl.cxx @@ -998,33 +998,12 @@ executeMessageBox( vcl::Window * pParent, OUString const & rTitle, OUString const & rMessage, - WinBits nButtonMask, - Dialog::InitFlag eInitFlag) + WinBits nButtonMask) { SolarMutexGuard aGuard; - ScopedVclPtrInstance< MessBox > xBox(pParent, nButtonMask, rTitle, rMessage, eInitFlag); + WinBits nStyle(0); - if (Dialog::InitFlag::NoParentCentered == eInitFlag) - { - vcl::Window* pDefaultParent = Dialog::GetDefaultParent(nButtonMask); - - if (pDefaultParent) - { - // need to 'Show' to have the following tasks do someting, does - // not work without and may even stumble on nullptrs/errors - xBox->Show(); - - // center on parent window - const Point aP(pDefaultParent->GetPosPixel()); - const Size aS(pDefaultParent->GetSizePixel()); - const Size aMySize(xBox->GetSizePixel()); - - xBox->SetPosPixel( - Point( - aP.X() + ((aS.Width() - aMySize.Width()) >> 1), - aP.Y() + ((aS.Height() - aMySize.Height()) >> 1))); - } - } + ScopedVclPtrInstance< MessBox > xBox(pParent, nButtonMask, nStyle, rTitle, rMessage); sal_uInt16 aResult = xBox->Execute(); switch( aResult ) @@ -1176,7 +1155,7 @@ UUIInteractionHelper::handleGenericErrorRequest( aTitle += aErrTitle; executeMessageBox( - getParentProperty(), aTitle, aErrorString, WB_OK, Dialog::InitFlag::NoParentCentered); + getParentProperty(), aTitle, aErrorString, WB_OK); } else ErrorHandler::HandleError(nErrorCode); @@ -1299,8 +1278,7 @@ UUIInteractionHelper::handleBrokenPackageRequest( " " + utl::ConfigManager::getProductVersion() ); - switch ( - executeMessageBox( getParentProperty(), title, aMessage, nButtonMask, Dialog::InitFlag::NoParentCentered) ) + switch (executeMessageBox(getParentProperty(), title, aMessage, nButtonMask)) { case ERRCODE_BUTTON_OK: OSL_ENSURE( xAbort.is(), "unexpected situation" ); diff --git a/vcl/source/app/svapp.cxx b/vcl/source/app/svapp.cxx index fc6fefc7d958..6af3c7c1c7cf 100644 --- a/vcl/source/app/svapp.cxx +++ b/vcl/source/app/svapp.cxx @@ -1816,20 +1816,4 @@ void Application::setDeInitHook(Link<LinkParamNone*,void> const & hook) { pSVData->maAppData.mbInAppMain = true; } -void Application::SetShutdownDelayed() -{ - ImplSVData * pSVData = ImplGetSVData(); - pSVData->maAppData.mbShutdownDelayed = true; -} - -void Application::TriggerShutdownDelayed() -{ - ImplSVData * pSVData = ImplGetSVData(); - - if (pSVData->maAppData.mbShutdownDelayed && !Dialog::AreDialogsOpen()) - { - Application::PostUserEvent(LINK(nullptr, ImplSVAppData, ImplPrepareExitMsg)); - } -} - /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/source/window/dialog.cxx b/vcl/source/window/dialog.cxx index 95fed10ab0a6..6dbad6496184 100644 --- a/vcl/source/window/dialog.cxx +++ b/vcl/source/window/dialog.cxx @@ -406,7 +406,7 @@ void Dialog::ImplInit( vcl::Window* pParent, WinBits nStyle, InitFlag eFlag ) // Now, all Dialogs are per default system windows !!! nStyle |= WB_SYSTEMWINDOW; - if (InitFlag::NoParent == eFlag || InitFlag::NoParentCentered == eFlag) + if (InitFlag::NoParent == eFlag) { pParent = nullptr; } @@ -1009,14 +1009,6 @@ void Dialog::EndAllDialogs( vcl::Window* pParent ) } } -bool Dialog::AreDialogsOpen() -{ - ImplSVData* pSVData = ImplGetSVData(); - Dialog* pModDialog = pSVData->maWinData.mpLastExecuteDlg; - - return (nullptr != pModDialog); -} - void Dialog::SetModalInputMode( bool bModal ) { if ( bModal == mbModalMode ) diff --git a/vcl/source/window/msgbox.cxx b/vcl/source/window/msgbox.cxx index f6fd26773624..9cd2ae08a8ce 100644 --- a/vcl/source/window/msgbox.cxx +++ b/vcl/source/window/msgbox.cxx @@ -138,12 +138,12 @@ void MessBox::ImplInitButtons() } MessBox::MessBox( vcl::Window* pParent, WinBits nStyle, - const OUString& rTitle, const OUString& rMessage, Dialog::InitFlag eInitFlag) : + const OUString& rTitle, const OUString& rMessage) : ButtonDialog( WINDOW_MESSBOX ), maMessText( rMessage ) { ImplInitMessBoxData(); - ImplInit( pParent, nStyle | WB_MOVEABLE | WB_HORZ | WB_CENTER, eInitFlag); + ImplInit( pParent, nStyle | WB_MOVEABLE | WB_HORZ | WB_CENTER); ImplInitButtons(); if ( !rTitle.isEmpty() ) commit 64d2902a61f6aa90554bc76fe70aee78bba6b3dd Author: Samuel Mehrbrodt <samuel.mehrbr...@cib.de> Date: Thu Dec 7 14:26:16 2017 +0100 Revert "Resolves: tdf#113160 changing all warning dialogs to non-modal is unsafe" This reverts commit e0dc344395393c8a9364952a5d241c12fa8b8f54. Had to redo this because some commits before and after were missing. diff --git a/framework/Library_fwe.mk b/framework/Library_fwe.mk index d94cb100a975..0559236b2bad 100644 --- a/framework/Library_fwe.mk +++ b/framework/Library_fwe.mk @@ -46,7 +46,6 @@ $(eval $(call gb_Library_use_libraries,fwe,\ svl \ svt \ tl \ - tk \ utl \ vcl \ $(gb_UWINAPI) \ diff --git a/framework/source/dispatch/closedispatcher.cxx b/framework/source/dispatch/closedispatcher.cxx index 96df4fe9d9e5..9aa25190a544 100644 --- a/framework/source/dispatch/closedispatcher.cxx +++ b/framework/source/dispatch/closedispatcher.cxx @@ -36,6 +36,8 @@ #include <vcl/window.hxx> #include <vcl/svapp.hxx> #include <vcl/syswin.hxx> +#include <osl/mutex.hxx> +#include <vcl/dialog.hxx> #include <unotools/moduleoptions.hxx> #include <comphelper/processfactory.hxx> @@ -361,6 +363,14 @@ IMPL_LINK_NOARG_TYPED(CloseDispatcher, impl_asyncCallback, LinkParamNone*, void) } } + // if we still have dialogs open, temporary suppress termination + if (bTerminateApp && Dialog::AreDialogsOpen()) + { + Application::SetShutdownDelayed(); + bCloseFrame = true; + bTerminateApp = false; + } + // Do it now ... bool bSuccess = false; if (bCloseFrame) diff --git a/framework/source/fwe/interaction/preventduplicateinteraction.cxx b/framework/source/fwe/interaction/preventduplicateinteraction.cxx index 9e43e1b1d44f..818fdfe2122a 100644 --- a/framework/source/fwe/interaction/preventduplicateinteraction.cxx +++ b/framework/source/fwe/interaction/preventduplicateinteraction.cxx @@ -19,7 +19,6 @@ #include <framework/preventduplicateinteraction.hxx> -#include <comphelper/processfactory.hxx> #include <osl/diagnose.h> #include <com/sun/star/task/InteractionHandler.hpp> @@ -54,9 +53,7 @@ void PreventDuplicateInteraction::useDefaultUUIHandler() aLock.clear(); // <- SAFE - m_xWarningDialogsParent.reset(new WarningDialogsParentScope(m_xContext)); - css::uno::Reference<css::task::XInteractionHandler> xHandler(css::task::InteractionHandler::createWithParent( - m_xContext, m_xWarningDialogsParent->GetDialogParent()), css::uno::UNO_QUERY_THROW); + css::uno::Reference< css::task::XInteractionHandler > xHandler( css::task::InteractionHandler::createWithParent( m_xContext, nullptr ), css::uno::UNO_QUERY_THROW ); // SAFE -> aLock.reset(); @@ -239,11 +236,6 @@ bool PreventDuplicateInteraction::getInteractionInfo(const css::uno::Type& return false; } -IMPL_STATIC_LINK_NOARG_TYPED(WarningDialogsParent, TerminateDesktop, void*, void) -{ - css::frame::Desktop::create(comphelper::getProcessComponentContext())->terminate(); -} - } // namespace framework /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/framework/source/loadenv/loadenv.cxx b/framework/source/loadenv/loadenv.cxx index 5e51c42bee83..c789f4d6e957 100644 --- a/framework/source/loadenv/loadenv.cxx +++ b/framework/source/loadenv/loadenv.cxx @@ -378,6 +378,10 @@ void LoadEnv::startLoading() if (!bStarted) bStarted = impl_loadContent(); + // This may have triggered Dialogs (error cases) that may have + // delayed the shutdown, so give delayed shutdown a chance + Application::TriggerShutdownDelayed(); + // not started => general error // We can't say - what was the reason for. if (!bStarted) @@ -1073,7 +1077,7 @@ bool LoadEnv::impl_loadContent() if (!bHidden && !bMinimized && !bPreview && !xProgress.is()) { - // Note: it's an optional interface! + // Note: its an optional interface! css::uno::Reference< css::task::XStatusIndicatorFactory > xProgressFactory(xTargetFrame, css::uno::UNO_QUERY); if (xProgressFactory.is()) { diff --git a/include/framework/preventduplicateinteraction.hxx b/include/framework/preventduplicateinteraction.hxx index 00c76089da2a..cf6ac0058eda 100644 --- a/include/framework/preventduplicateinteraction.hxx +++ b/include/framework/preventduplicateinteraction.hxx @@ -24,127 +24,17 @@ #include <vector> -#include <com/sun/star/frame/Desktop.hpp> -#include <com/sun/star/frame/TerminationVetoException.hpp> -#include <com/sun/star/frame/XTerminateListener2.hpp> #include <com/sun/star/task/XInteractionHandler2.hpp> #include <com/sun/star/task/XInteractionRequest.hpp> -#include <cppuhelper/compbase.hxx> #include <cppuhelper/implbase.hxx> -#include <sfx2/app.hxx> -#include <toolkit/helper/vclunohelper.hxx> -#include <vcl/dialog.hxx> -#include <vcl/svapp.hxx> -#include <vcl/wrkwin.hxx> - namespace com { namespace sun { namespace star { namespace uno { class XComponentContext; } } } } namespace framework{ -inline void closedialogs(SystemWindow& rTopLevel, bool bCloseRoot) -{ - for (vcl::Window *pChild = rTopLevel.GetWindow(GetWindowType::FirstTopWindowChild); pChild; pChild = rTopLevel.GetWindow(GetWindowType::NextTopWindowSibling)) - closedialogs(dynamic_cast<SystemWindow&>(*pChild), true); - if (bCloseRoot) - rTopLevel.Close(); -} - -// This is intended to be the parent for any warning dialogs launched -// during the load of a document so that those dialogs are modal to -// this window and don't block any existing windows. -// -// If there are dialog children open on exit then veto termination, -// close the topmost dialog and retry termination. -class WarningDialogsParent : - public cppu::WeakComponentImplHelper<css::frame::XTerminateListener> -{ -private: - osl::Mutex m_aLock; - VclPtr<WorkWindow> m_xWin; - css::uno::Reference<css::awt::XWindow> m_xInterface; - -private: - - DECL_STATIC_LINK_TYPED(WarningDialogsParent, TerminateDesktop, void*, void); - - void closewarningdialogs() - { - if (!m_xWin) - return; - SolarMutexGuard aSolarGuard; - closedialogs(dynamic_cast<SystemWindow&>(*m_xWin), false); - } - -public: - - using cppu::WeakComponentImplHelperBase::disposing; - virtual void SAL_CALL disposing(const css::lang::EventObject&) throw (::css::uno::RuntimeException, ::std::exception) override - { - } - - // XTerminateListener - virtual void SAL_CALL queryTermination(const css::lang::EventObject&) throw (::css::frame::TerminationVetoException, ::css::uno::RuntimeException, ::std::exception) override - { - closewarningdialogs(); - Application::PostUserEvent(LINK(this, WarningDialogsParent, TerminateDesktop)); - throw css::frame::TerminationVetoException(); - } - - virtual void SAL_CALL notifyTermination(const css::lang::EventObject&) throw (::css::uno::RuntimeException, ::std::exception) override - { - } - -public: - WarningDialogsParent() - : cppu::WeakComponentImplHelper<css::frame::XTerminateListener>(m_aLock) - { - SolarMutexGuard aSolarGuard; - m_xWin = VclPtr<WorkWindow>::Create(nullptr, WB_STDWORK); - m_xWin->SetText("dialog parent for warning dialogs during load"); - m_xInterface = VCLUnoHelper::GetInterface(m_xWin); - } - - virtual ~WarningDialogsParent() override - { - closewarningdialogs(); - m_xWin.disposeAndClear(); - } - - const css::uno::Reference<css::awt::XWindow>& GetDialogParent() const - { - return m_xInterface; - } -}; - -class WarningDialogsParentScope -{ -private: - css::uno::Reference<css::frame::XDesktop> m_xDesktop; - rtl::Reference<WarningDialogsParent> m_xListener; - -public: - WarningDialogsParentScope(const css::uno::Reference<css::uno::XComponentContext>& rContext) - : m_xDesktop(css::frame::Desktop::create(rContext), css::uno::UNO_QUERY_THROW) - , m_xListener(new WarningDialogsParent) - { - m_xDesktop->addTerminateListener(m_xListener.get()); - } - - const css::uno::Reference<css::awt::XWindow>& GetDialogParent() const - { - return m_xListener->GetDialogParent(); - } - - ~WarningDialogsParentScope() - { - m_xDesktop->removeTerminateListener(m_xListener.get()); - } -}; - /** @short Prevent us from showing the same interaction more than once during the same transaction. @@ -211,8 +101,6 @@ class FWE_DLLPUBLIC PreventDuplicateInteraction : private ThreadHelpBase2 if it's not blocked. */ css::uno::Reference< css::task::XInteractionHandler > m_xHandler; - std::unique_ptr<WarningDialogsParentScope> m_xWarningDialogsParent; - /** This list describe which and how incoming interactions must be handled. Further it contains all collected information after this interaction object was used.*/ diff --git a/include/vcl/dialog.hxx b/include/vcl/dialog.hxx index 34e03fc03a99..87588d50c85d 100644 --- a/include/vcl/dialog.hxx +++ b/include/vcl/dialog.hxx @@ -38,8 +38,11 @@ public: /** Use given parent or get a default one using GetDefaultParent(...) */ Default, - /** No Parent */ - NoParent + /** Suppress Parent so that Parent is not blocked (kind of modal mode) */ + NoParent, + + /** Suppress Parent (no modal, see above) and additionally center on default parent */ + NoParentCentered }; private: @@ -121,7 +124,8 @@ public: void EndDialog( long nResult = 0 ); - static void EndAllDialogs( vcl::Window const * pParent ); + static void EndAllDialogs( vcl::Window* pParent=nullptr ); + static bool AreDialogsOpen(); void GetDrawWindowBorder( sal_Int32& rLeftBorder, sal_Int32& rTopBorder, sal_Int32& rRightBorder, sal_Int32& rBottomBorder ) const; diff --git a/include/vcl/msgbox.hxx b/include/vcl/msgbox.hxx index f3351664574c..0f526f618fe6 100644 --- a/include/vcl/msgbox.hxx +++ b/include/vcl/msgbox.hxx @@ -47,7 +47,8 @@ protected: public: MessBox( vcl::Window* pParent, WinBits nStyle, - const OUString& rTitle, const OUString& rMessage); + const OUString& rTitle, const OUString& rMessage, + Dialog::InitFlag eInitFlag = Dialog::InitFlag::NoParentCentered); virtual ~MessBox(); virtual void dispose() override; diff --git a/include/vcl/svapp.hxx b/include/vcl/svapp.hxx index 34b659fa7f33..2be63c268198 100644 --- a/include/vcl/svapp.hxx +++ b/include/vcl/svapp.hxx @@ -1451,6 +1451,12 @@ public: // For vclbootstrapprotector: static void setDeInitHook(Link<LinkParamNone*,void> const & hook); + // for delayed shutdown: set using SetShutdownDelayed, then + // trigger using TriggerShutdownDelayed which may actually shutdown + // when SetShutdownDelayed is set + static void SetShutdownDelayed(); + static void TriggerShutdownDelayed(); + private: DECL_STATIC_LINK_TYPED( Application, PostEventHandler, void*, void ); }; diff --git a/uui/source/iahndl.cxx b/uui/source/iahndl.cxx index e94947ecc233..b53f5b474323 100644 --- a/uui/source/iahndl.cxx +++ b/uui/source/iahndl.cxx @@ -998,10 +998,33 @@ executeMessageBox( vcl::Window * pParent, OUString const & rTitle, OUString const & rMessage, - WinBits nStyle) + WinBits nButtonMask, + Dialog::InitFlag eInitFlag) { SolarMutexGuard aGuard; - ScopedVclPtrInstance< MessBox > xBox(pParent, nStyle, rTitle, rMessage); + ScopedVclPtrInstance< MessBox > xBox(pParent, nButtonMask, rTitle, rMessage, eInitFlag); + + if (Dialog::InitFlag::NoParentCentered == eInitFlag) + { + vcl::Window* pDefaultParent = Dialog::GetDefaultParent(nButtonMask); + + if (pDefaultParent) + { + // need to 'Show' to have the following tasks do someting, does + // not work without and may even stumble on nullptrs/errors + xBox->Show(); + + // center on parent window + const Point aP(pDefaultParent->GetPosPixel()); + const Size aS(pDefaultParent->GetSizePixel()); + const Size aMySize(xBox->GetSizePixel()); + + xBox->SetPosPixel( + Point( + aP.X() + ((aS.Width() - aMySize.Width()) >> 1), + aP.Y() + ((aS.Height() - aMySize.Height()) >> 1))); + } + } sal_uInt16 aResult = xBox->Execute(); switch( aResult ) @@ -1152,7 +1175,8 @@ UUIInteractionHelper::handleGenericErrorRequest( aTitle += " - " ; aTitle += aErrTitle; - executeMessageBox(getParentProperty(), aTitle, aErrorString, WB_OK); + executeMessageBox( + getParentProperty(), aTitle, aErrorString, WB_OK, Dialog::InitFlag::NoParentCentered); } else ErrorHandler::HandleError(nErrorCode); @@ -1275,7 +1299,8 @@ UUIInteractionHelper::handleBrokenPackageRequest( " " + utl::ConfigManager::getProductVersion() ); - switch (executeMessageBox(getParentProperty(), title, aMessage, nButtonMask)) + switch ( + executeMessageBox( getParentProperty(), title, aMessage, nButtonMask, Dialog::InitFlag::NoParentCentered) ) { case ERRCODE_BUTTON_OK: OSL_ENSURE( xAbort.is(), "unexpected situation" ); diff --git a/vcl/source/app/svapp.cxx b/vcl/source/app/svapp.cxx index 6af3c7c1c7cf..fc6fefc7d958 100644 --- a/vcl/source/app/svapp.cxx +++ b/vcl/source/app/svapp.cxx @@ -1816,4 +1816,20 @@ void Application::setDeInitHook(Link<LinkParamNone*,void> const & hook) { pSVData->maAppData.mbInAppMain = true; } +void Application::SetShutdownDelayed() +{ + ImplSVData * pSVData = ImplGetSVData(); + pSVData->maAppData.mbShutdownDelayed = true; +} + +void Application::TriggerShutdownDelayed() +{ + ImplSVData * pSVData = ImplGetSVData(); + + if (pSVData->maAppData.mbShutdownDelayed && !Dialog::AreDialogsOpen()) + { + Application::PostUserEvent(LINK(nullptr, ImplSVAppData, ImplPrepareExitMsg)); + } +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/source/window/dialog.cxx b/vcl/source/window/dialog.cxx index d0aa084e777e..95fed10ab0a6 100644 --- a/vcl/source/window/dialog.cxx +++ b/vcl/source/window/dialog.cxx @@ -406,7 +406,7 @@ void Dialog::ImplInit( vcl::Window* pParent, WinBits nStyle, InitFlag eFlag ) // Now, all Dialogs are per default system windows !!! nStyle |= WB_SYSTEMWINDOW; - if (InitFlag::NoParent == eFlag) + if (InitFlag::NoParent == eFlag || InitFlag::NoParentCentered == eFlag) { pParent = nullptr; } @@ -992,7 +992,7 @@ long Dialog::GetResult() const return mpDialogImpl->mnResult; } -void Dialog::EndAllDialogs( vcl::Window const * pParent ) +void Dialog::EndAllDialogs( vcl::Window* pParent ) { ImplSVData* pSVData = ImplGetSVData(); Dialog* pTempModDialog; @@ -1009,6 +1009,14 @@ void Dialog::EndAllDialogs( vcl::Window const * pParent ) } } +bool Dialog::AreDialogsOpen() +{ + ImplSVData* pSVData = ImplGetSVData(); + Dialog* pModDialog = pSVData->maWinData.mpLastExecuteDlg; + + return (nullptr != pModDialog); +} + void Dialog::SetModalInputMode( bool bModal ) { if ( bModal == mbModalMode ) diff --git a/vcl/source/window/msgbox.cxx b/vcl/source/window/msgbox.cxx index 172c9870889c..f6fd26773624 100644 --- a/vcl/source/window/msgbox.cxx +++ b/vcl/source/window/msgbox.cxx @@ -138,14 +138,12 @@ void MessBox::ImplInitButtons() } MessBox::MessBox( vcl::Window* pParent, WinBits nStyle, - const OUString& rTitle, const OUString& rMessage) : + const OUString& rTitle, const OUString& rMessage, Dialog::InitFlag eInitFlag) : ButtonDialog( WINDOW_MESSBOX ), - maMessText( rMessage ), - mbHelpBtn( false ), - mbCheck( false ) + maMessText( rMessage ) { ImplInitMessBoxData(); - ImplInit( pParent, nStyle | WB_MOVEABLE | WB_HORZ | WB_CENTER); + ImplInit( pParent, nStyle | WB_MOVEABLE | WB_HORZ | WB_CENTER, eInitFlag); ImplInitButtons(); if ( !rTitle.isEmpty() )
_______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits