Files
libreoffice/svtools/source/java/javainteractionhandler.cxx
Caolán McNamara 6a4c464b49 weld native message dialogs
just the straight-forward MessageDialog cases first

a) remove border_width from message dialog .ui so as to take
the default border width
b) retain 12 as default message dialog border for vcl widget case
c) remove layour_style from message dialog button boxes so as to
take the default mode (a no-op for vcl widget case)
d) use gtk response ids (vcl builder will converts to vcl ones)

Change-Id: I7de281093a1b64f92f71ca11e7cbba42bb658154
Reviewed-on: https://gerrit.libreoffice.org/50143
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Tested-by: Caolán McNamara <caolanm@redhat.com>
2018-02-22 22:07:38 +01:00

255 lines
8.6 KiB
C++

/* -*- 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 .
*/
#include <svtools/strings.hrc>
#include <com/sun/star/task/XInteractionContinuation.hpp>
#include <com/sun/star/task/XInteractionAbort.hpp>
#include <com/sun/star/task/XInteractionRetry.hpp>
#include <com/sun/star/java/JavaNotFoundException.hpp>
#include <com/sun/star/java/InvalidJavaSettingsException.hpp>
#include <com/sun/star/java/JavaDisabledException.hpp>
#include <com/sun/star/java/JavaVMCreationFailureException.hpp>
#include <com/sun/star/java/RestartRequiredException.hpp>
#include <comphelper/processfactory.hxx>
#include <vcl/svapp.hxx>
#include <vcl/weld.hxx>
#include <jvmfwk/framework.hxx>
#include <svtools/restartdialog.hxx>
#include <svtools/svtresid.hxx>
#include <svtools/javainteractionhandler.hxx>
#include <svtools/javacontext.hxx>
using namespace com::sun::star::uno;
using namespace com::sun::star::task;
namespace
{
static struct JavaEvents {
bool bDisabledHandled : 1;
bool bInvalidSettingsHandled : 1;
bool bNotFoundHandled : 1;
bool bVMCreationFailureHandled : 1;
bool bRestartRequiredHandled : 1;
sal_uInt16 nResult_JavaDisabled = RET_NO;
JavaEvents()
: bDisabledHandled(false)
, bInvalidSettingsHandled(false)
, bNotFoundHandled(false)
, bVMCreationFailureHandled(false)
, bRestartRequiredHandled(false)
{}
} g_JavaEvents;
}
namespace svt
{
JavaInteractionHandler::JavaInteractionHandler() :
m_aRefCount(0)
{
}
JavaInteractionHandler::~JavaInteractionHandler()
{
}
Any SAL_CALL JavaInteractionHandler::queryInterface(const Type& aType )
{
if (aType == cppu::UnoType<XInterface>::get())
return Any( static_cast<XInterface*>(this), aType);
else if (aType == cppu::UnoType<XInteractionHandler>::get())
return Any( static_cast<XInteractionHandler*>(this), aType);
return Any();
}
void SAL_CALL JavaInteractionHandler::acquire( ) throw ()
{
osl_atomic_increment( &m_aRefCount );
}
void SAL_CALL JavaInteractionHandler::release( ) throw ()
{
if (! osl_atomic_decrement( &m_aRefCount ))
delete this;
}
void SAL_CALL JavaInteractionHandler::handle( const Reference< XInteractionRequest >& Request )
{
Any anyExc = Request->getRequest();
Sequence< Reference< XInteractionContinuation > > aSeqCont = Request->getContinuations();
Reference< XInteractionAbort > abort;
Reference< XInteractionRetry > retry;
sal_Int32 i;
for ( i = 0; i < aSeqCont.getLength(); i++ )
{
abort.set( aSeqCont[i], UNO_QUERY );
if ( abort.is() )
break;
}
for ( i= 0; i < aSeqCont.getLength(); i++)
{
retry.set( aSeqCont[i], UNO_QUERY );
if ( retry.is() )
break;
}
css::java::JavaNotFoundException e1;
css::java::InvalidJavaSettingsException e2;
css::java::JavaDisabledException e3;
css::java::JavaVMCreationFailureException e4;
css::java::RestartRequiredException e5;
// Try to recover the Exception type in the any and
// react accordingly.
sal_uInt16 nResult = RET_CANCEL;
if ( anyExc >>= e1 )
{
SolarMutexGuard aSolarGuard;
if( !g_JavaEvents.bNotFoundHandled )
{
// No suitable JRE found
g_JavaEvents.bNotFoundHandled = true;
#if defined( MACOSX )
std::unique_ptr<weld::MessageDialog> xWarningBox(Application::CreateMessageDialog(nullptr,
VclMessageType::Warning, VclButtonsType::Ok, SvtResId(STR_WARNING_JAVANOTFOUND_MAC)));
#elif defined( _WIN32 )
std::unique_ptr<weld::MessageDialog> xWarningBox(Application::CreateMessageDialog(nullptr,
VclMessageType::Warning, VclButtonsType::Ok, SvtResId(STR_WARNING_JAVANOTFOUND_WIN)));
OUString sPrimTex = xWarningBox->get_primary_text();
#if defined( _WIN64 )
xWarningBox->set_primary_text(sPrimTex.replaceAll( "%BITNESS", "64" ));
#else
xWarningBox->set_primary_text(sPrimTex.replaceAll( "%BITNESS", "32" ));
#endif
#else
std::unique_ptr<weld::MessageDialog> xWarningBox(Application::CreateMessageDialog(nullptr,
VclMessageType::Warning, VclButtonsType::Ok, SvtResId(STR_WARNING_JAVANOTFOUND)));
#endif
xWarningBox->set_title(SvtResId(STR_WARNING_JAVANOTFOUND_TITLE));
nResult = xWarningBox->run();
}
else
{
nResult = RET_OK;
}
}
else if ( anyExc >>= e2 )
{
SolarMutexGuard aSolarGuard;
if( !g_JavaEvents.bInvalidSettingsHandled )
{
// javavendors.xml was updated and Java has not been configured yet
g_JavaEvents.bInvalidSettingsHandled = true;
#ifdef MACOSX
OUString sWarning(SvtResId(STR_WARNING_INVALIDJAVASETTINGS_MAC));
#else
OUString sWarning(SvtResId(STR_WARNING_INVALIDJAVASETTINGS));
#endif
std::unique_ptr<weld::MessageDialog> xWarningBox(Application::CreateMessageDialog(nullptr,
VclMessageType::Warning, VclButtonsType::Ok, sWarning));
xWarningBox->set_title(SvtResId(STR_WARNING_INVALIDJAVASETTINGS_TITLE));
nResult = xWarningBox->run();
}
else
{
nResult = RET_OK;
}
}
else if ( anyExc >>= e3 )
{
SolarMutexGuard aSolarGuard;
if( !g_JavaEvents.bDisabledHandled )
{
g_JavaEvents.bDisabledHandled = true;
// Java disabled. Give user a chance to enable Java inside Office.
std::unique_ptr<weld::Builder> xBuilder(Application::CreateBuilder(nullptr, "svt/ui/javadisableddialog.ui"));
std::unique_ptr<weld::MessageDialog> xQueryBox(xBuilder->weld_message_dialog("JavaDisabledDialog"));
nResult = xQueryBox->run();
if ( nResult == RET_YES )
{
jfw_setEnabled(true);
}
g_JavaEvents.nResult_JavaDisabled = nResult;
}
else
{
nResult = g_JavaEvents.nResult_JavaDisabled;
}
}
else if ( anyExc >>= e4 )
{
SolarMutexGuard aSolarGuard;
if( !g_JavaEvents.bVMCreationFailureHandled )
{
// Java not correctly installed, or damaged
g_JavaEvents.bVMCreationFailureHandled = true;
#ifdef MACOSX
OUString sWarning(SvtResId(STR_ERROR_JVMCREATIONFAILED_MAC));
#else
OUString sWarning(SvtResId(STR_ERROR_JVMCREATIONFAILED));
#endif
std::unique_ptr<weld::MessageDialog> xErrorBox(Application::CreateMessageDialog(nullptr,
VclMessageType::Warning, VclButtonsType::Ok, sWarning));
xErrorBox->set_title(SvtResId(STR_ERROR_JVMCREATIONFAILED_TITLE));
nResult = xErrorBox->run();
}
else
{
nResult = RET_OK;
}
}
else if ( anyExc >>= e5 )
{
SolarMutexGuard aSolarGuard;
if( !g_JavaEvents.bRestartRequiredHandled )
{
// a new JRE was selected, but office needs to be restarted
//before it can be used.
g_JavaEvents.bRestartRequiredHandled = true;
svtools::executeRestartDialog(
comphelper::getProcessComponentContext(), nullptr,
svtools::RESTART_REASON_JAVA);
}
nResult = RET_OK;
}
if ( nResult == RET_CANCEL || nResult == RET_NO)
{
// Unknown exception type or user wants to cancel
if ( abort.is() )
abort->select();
}
else // nResult == RET_OK
{
// User selected OK => retry Java usage
if ( retry.is() )
retry->select();
}
}
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */