/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * This file is part of the LibreOffice project. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * This file incorporates work covered by the following license notice: * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed * with this work for additional information regarding copyright * ownership. The ASF licenses this file to you under the Apache * License, Version 2.0 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
if ( bDialogDying || bParentDying )
{
stopWindowListening();
SAL_WARN_IF(bDialogDying && m_bExecuting, "fpicker.office", "unexpected disposing before response" );
// it's the parent which is dying -> delete the dialog
{
::osl::MutexGuard aOwnGuard(m_aMutex); if (m_bExecuting && m_xDlg)
m_xDlg->response(RET_CANCEL);
}
m_xDlg.reset();
m_xWindow = nullptr;
m_xDialogParent = nullptr;
} else
{
OSL_FAIL( "OCommonPicker::disposing: where did this come from?" );
}
}
// if the HelpURL changed, forward this to the dialog if (PROPERTY_ID_HELPURL == nHandle && m_xDlg)
{
::svt::OControlAccess aAccess(m_xDlg.get(), m_xDlg->GetView());
aAccess.setHelpURL(m_xDlg->getDialog(), m_sHelpURL);
}
}
if ( m_xDlg )
{
weld::Dialog* pDlg = m_xDlg->getDialog();
::svt::OControlAccess aAccess(m_xDlg.get(), m_xDlg->GetView()); // synchronize the help id of the dialog without help URL property if ( !m_sHelpURL.isEmpty() )
{ // somebody already set the help URL while we had no dialog yet
aAccess.setHelpURL(pDlg, m_sHelpURL);
} else
{
m_sHelpURL = aAccess.getHelpURL(pDlg);
}
m_xWindow = pDlg->GetXWindow();
// add as event listener to the window
OSL_ENSURE( m_xWindow.is(), "OCommonPicker::createFileDialog: invalid window component!" ); if ( m_xWindow.is() )
{
m_xWindowListenerAdapter = new OWeakEventListenerAdapter( this, m_xWindow ); // the adapter will add itself as listener, and forward notifications
}
VclPtr<vcl::Window> xVclDialog(VCLUnoHelper::GetWindow(m_xWindow)); if (xVclDialog) // this block is quite possibly unnecessary by now
{ // _and_ add as event listener to the parent - in case the parent is destroyed // before we are disposed, our disposal would access dead VCL windows then...
m_xDialogParent = VCLUnoHelper::GetInterface(xVclDialog->GetParent());
OSL_ENSURE(m_xDialogParent.is() || !xVclDialog->GetParent(), "OCommonPicker::createFileDialog: invalid window component (the parent this time)!");
} if ( m_xDialogParent.is() )
{
m_xParentListenerAdapter = new OWeakEventListenerAdapter( this, m_xDialogParent ); // the adapter will add itself as listener, and forward notifications
}
}
}
void SAL_CALL OCommonPicker::cancel( )
{
{
::osl::MutexGuard aGuard( m_aMutex ); if ( m_nCancelEvent ) // nothing to do - the event for cancelling the dialog is already on the way return;
}
// The thread which executes our dialog has locked the solar mutex for // sure. Cancelling the dialog should be done with a locked solar mutex, too. // Thus we post ourself a message for cancelling the dialog. This way, the message // is either handled in the thread which opened the dialog (which may even be // this thread here), or, if no dialog is open, in the thread doing scheduling // currently. Both is okay for us...
// Note that we could do check if we are really executing the dialog currently. // but the information would be potentially obsolete at the moment our event // arrives, so we need to check it there, anyway...
m_nCancelEvent = Application::PostUserEvent( LINK( this, OCommonPicker, OnCancelPicker ) );
}
IMPL_LINK_NOARG(OCommonPicker, OnCancelPicker, void*, void)
{ // By definition, the solar mutex is locked when we arrive here. Note that this // is important, as for instance the consistency of m_xDlg depends on this mutex.
::osl::MutexGuard aGuard( m_aMutex );
m_nCancelEvent = nullptr;
if ( !m_bExecuting ) // nothing to do. This may be because the dialog was canceled after our cancel method // posted this async event, or because somebody called cancel without the dialog // being executed at this time. return;
OSL_ENSURE( m_xDlg, "OCommonPicker::OnCancelPicker: executing, but no dialog!" ); if (m_xDlg)
m_xDlg->response(RET_CANCEL);
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.