20#include <com/sun/star/uno/XComponentContext.hpp>
21#include <com/sun/star/util/XCloseable.hpp>
22#include <com/sun/star/lang/DisposedException.hpp>
23#include <com/sun/star/lang/IllegalArgumentException.hpp>
24#include <com/sun/star/lang/XComponent.hpp>
25#include <com/sun/star/lang/XServiceInfo.hpp>
26#include <com/sun/star/frame/XFrame.hpp>
27#include <com/sun/star/awt/XVclWindowPeer.hpp>
44class ODocumentCloser :
public ::cppu::WeakImplHelper< css::lang::XComponent,
45 css::lang::XServiceInfo >
48 css::uno::Reference< css::frame::XFrame >
m_xFrame;
54 explicit ODocumentCloser(
const css::uno::Sequence< css::uno::Any >& aArguments);
57 virtual void SAL_CALL
dispose()
override;
58 virtual void SAL_CALL addEventListener(
const css::uno::Reference< css::lang::XEventListener >& xListener )
override;
59 virtual void SAL_CALL removeEventListener(
const css::uno::Reference< css::lang::XEventListener >& aListener )
override;
67class MainThreadFrameCloserRequest
69 uno::Reference< frame::XFrame >
m_xFrame;
72 explicit MainThreadFrameCloserRequest( uno::Reference< frame::XFrame > xFrame )
78 static void Start( MainThreadFrameCloserRequest* pRequest );
82void MainThreadFrameCloserRequest::Start( MainThreadFrameCloserRequest* pMTRequest )
89 worker(
nullptr, pMTRequest );
99 MainThreadFrameCloserRequest* pMTRequest =
static_cast<MainThreadFrameCloserRequest*
>(
p);
103 if ( pMTRequest->m_xFrame.is() )
110 uno::Reference< awt::XWindow > xWindow = pMTRequest->m_xFrame->getContainerWindow();
111 uno::Reference< awt::XVclWindowPeer > xWinPeer( xWindow, uno::UNO_QUERY_THROW );
113 xWindow->setVisible(
false );
116 xWinPeer->setProperty(
"PluginParent",
uno::Any( sal_Int64(0) ) );
122 catch( uno::Exception& )
129 uno::Reference< util::XCloseable > xCloseable( pMTRequest->m_xFrame, uno::UNO_QUERY_THROW );
130 xCloseable->close(
true );
132 catch( uno::Exception& )
141ODocumentCloser::ODocumentCloser(
const css::uno::Sequence< css::uno::Any >& aArguments)
144 std::unique_lock aGuard( m_aMutex );
146 throw uno::RuntimeException();
150 throw lang::IllegalArgumentException(
151 "Wrong count of parameters!",
152 uno::Reference< uno::XInterface >(),
155 if ( !( aArguments[0] >>= m_xFrame ) || !
m_xFrame.is() )
156 throw lang::IllegalArgumentException(
157 "Nonempty reference is expected as the first argument!",
158 uno::Reference< uno::XInterface >(),
165void SAL_CALL ODocumentCloser::dispose()
167 std::unique_lock aGuard( m_aMutex );
173 m_aListenersContainer.disposeAndClear( aGuard, aSource );
179 MainThreadFrameCloserRequest* pCloser =
new MainThreadFrameCloserRequest( m_xFrame );
180 MainThreadFrameCloserRequest::Start( pCloser );
187void SAL_CALL ODocumentCloser::addEventListener(
const uno::Reference< lang::XEventListener >& xListener )
189 std::unique_lock aGuard( m_aMutex );
191 throw lang::DisposedException();
193 m_aListenersContainer.addInterface( aGuard, xListener );
197void SAL_CALL ODocumentCloser::removeEventListener(
const uno::Reference< lang::XEventListener >& xListener )
199 std::unique_lock aGuard( m_aMutex );
200 m_aListenersContainer.removeInterface( aGuard, xListener );
204OUString SAL_CALL ODocumentCloser::getImplementationName( )
206 return "com.sun.star.comp.embed.DocumentCloser";
209sal_Bool SAL_CALL ODocumentCloser::supportsService(
const OUString& ServiceName )
214uno::Sequence< OUString > SAL_CALL ODocumentCloser::getSupportedServiceNames()
216 return {
"com.sun.star.embed.DocumentCloser" };
221extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface *
223 SAL_UNUSED_PARAMETER css::uno::XComponentContext *,
224 css::uno::Sequence<css::uno::Any>
const &arguments)
226 return cppu::acquire(
new ODocumentCloser(arguments));
css::uno::Reference< css::lang::XComponent > m_xFrame
static bool IsMainThread()
static ImplSVEvent * PostUserEvent(const Link< void *, void > &rLink, void *pCaller=nullptr, bool bReferenceLink=false)
static vcl::Window * GetWindow(const css::uno::Reference< css::awt::XWindow > &rxWindow)
SAL_DLLPUBLIC_EXPORT css::uno::XInterface * com_sun_star_comp_embed_DocumentCloser_get_implementation(SAL_UNUSED_PARAMETER css::uno::XComponentContext *, css::uno::Sequence< css::uno::Any > const &arguments)
Sequence< PropertyValue > aArguments
#define LINK(Instance, Class, Member)
#define DECL_STATIC_LINK(Class, Member, ArgType, RetType)
css::uno::Sequence< OUString > getSupportedServiceNames()
OUString getImplementationName()
bool CPPUHELPER_DLLPUBLIC supportsService(css::lang::XServiceInfo *implementation, rtl::OUString const &name)
void EndAllDialogs(vcl::Window const *pParent)
Reference< XFrame > xFrame