Show dialog when starting in safe mode

Change-Id: Ie4b5f5b7309735dfa844bbaba9cb2763a3de3dc1
This commit is contained in:
Samuel Mehrbrodt 2016-10-07 18:19:25 +02:00
parent 8ac6b51cc4
commit f9a427680f
8 changed files with 384 additions and 0 deletions

View file

@ -1056,6 +1056,22 @@ void handleCrashReport()
}
#endif
void handleSafeMode()
{
static const char SERVICENAME_SAFEMODE[] = "com.sun.star.comp.svx.SafeModeUI";
css::uno::Reference< css::uno::XComponentContext > xContext = ::comphelper::getProcessComponentContext();
Reference< css::frame::XSynchronousDispatch > xSafeModeUI(
xContext->getServiceManager()->createInstanceWithContext(SERVICENAME_SAFEMODE, xContext),
css::uno::UNO_QUERY_THROW);
css::util::URL aURL;
css::uno::Any aRet = xSafeModeUI->dispatchWithReturnValue(aURL, css::uno::Sequence< css::beans::PropertyValue >());
bool bRet = false;
aRet >>= bRet;
}
/** @short check if recovery must be started or not.
@param bCrashed [boolean ... out!]
@ -2029,6 +2045,11 @@ void Desktop::OpenClients()
// need some time, where the user won't see any results and wait for finishing the office startup...
bool bAllowRecoveryAndSessionManagement = ( !rArgs.IsNoRestore() ) && ( !rArgs.IsHeadless() );
// Enter safe mode if requested
if (rArgs.IsSafeMode())
handleSafeMode();
#if HAVE_FEATURE_BREAKPAD
if (crashReportInfoExists())
handleCrashReport();

View file

@ -146,6 +146,8 @@ $(eval $(call gb_Library_add_exception_objects,svx,\
svx/source/dialog/rlrcitem \
svx/source/dialog/rubydialog \
svx/source/dialog/rulritem \
svx/source/dialog/SafeModeDialog \
svx/source/dialog/SafeModeUI \
svx/source/dialog/SpellDialogChildWindow \
svx/source/dialog/srchctrl \
svx/source/dialog/srchdlg \

View file

@ -64,6 +64,7 @@ $(eval $(call gb_UIConfig_add_uifiles,svx,\
svx/uiconfig/ui/redlinecontrol \
svx/uiconfig/ui/redlinefilterpage \
svx/uiconfig/ui/redlineviewpage \
svx/uiconfig/ui/safemodedialog \
svx/uiconfig/ui/savemodifieddialog \
svx/uiconfig/ui/sidebararea \
svx/uiconfig/ui/sidebarshadow \

View file

@ -0,0 +1,65 @@
/* -*- 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/.
*/
#include "SafeModeDialog.hxx"
#include <config_folders.h>
#include <rtl/bootstrap.hxx>
#include <osl/file.hxx>
SafeModeDialog::SafeModeDialog(vcl::Window* pParent):
Dialog(pParent, "SafeModeDialog", "svx/ui/safemodedialog.ui")
{
get(mpBtnContinue, "btn_continue");
get(mpBtnQuit, "btn_quit");
get(mpBtnRestart, "btn_restart");
get(mpCBCustomizations, "check_customizations");
get(mpCBExtensions, "check_extensions");
get(mpCBFull, "check_full");
mpBtnContinue->SetClickHdl(LINK(this, SafeModeDialog, BtnHdl));
mpBtnQuit->SetClickHdl(LINK(this, SafeModeDialog, BtnHdl));
mpBtnRestart->SetClickHdl(LINK(this, SafeModeDialog, BtnHdl));
}
SafeModeDialog::~SafeModeDialog()
{
disposeOnce();
}
void SafeModeDialog::dispose()
{
mpBtnContinue.clear();
mpBtnQuit.clear();
mpBtnRestart.clear();
mpCBCustomizations.clear();
mpCBExtensions.clear();
mpCBFull.clear();
Dialog::dispose();
}
IMPL_LINK(SafeModeDialog, BtnHdl, Button*, pBtn, void)
{
if (pBtn == mpBtnContinue.get())
{
Close();
}
else if (pBtn == mpBtnQuit.get())
{
Close();
}
else if (pBtn == mpBtnRestart.get())
{
Close();
}
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */

View file

@ -0,0 +1,44 @@
/* -*- 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/.
*/
#ifndef INCLUDED_SVX_SOURCE_DIALOG_SAFEMODEDIALOG_HXX
#define INCLUDED_SVX_SOURCE_DIALOG_SAFEMODEDIALOG_HXX
#include <vcl/dialog.hxx>
#include <vcl/button.hxx>
#include <vcl/fixed.hxx>
#include <vcl/edit.hxx>
#include <vcl/vclmedit.hxx>
class SafeModeDialog : public Dialog
{
public:
explicit SafeModeDialog(vcl::Window* pParent);
virtual ~SafeModeDialog() override;
virtual void dispose() override;
private:
VclPtr<Button> mpBtnContinue;
VclPtr<Button> mpBtnQuit;
VclPtr<Button> mpBtnRestart;
VclPtr<CheckBox> mpCBExtensions;
VclPtr<CheckBox> mpCBCustomizations;
VclPtr<CheckBox> mpCBFull;
DECL_LINK(BtnHdl, Button*, void);
};
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */

View file

@ -0,0 +1,99 @@
/* -*- 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/.
*/
#include <cppuhelper/implbase.hxx>
#include <com/sun/star/frame/XSynchronousDispatch.hpp>
#include <com/sun/star/lang/XServiceInfo.hpp>
#include <comphelper/processfactory.hxx>
#include <cppuhelper/supportsservice.hxx>
#include <vcl/svapp.hxx>
#include "SafeModeDialog.hxx"
namespace {
class SafeModeUI : public ::cppu::WeakImplHelper< css::lang::XServiceInfo,
css::frame::XSynchronousDispatch > // => XDispatch!
{
public:
explicit SafeModeUI(const css::uno::Reference< css::uno::XComponentContext >& xContext);
virtual ~SafeModeUI() override;
// css.lang.XServiceInfo
virtual OUString SAL_CALL getImplementationName()
throw(css::uno::RuntimeException, std::exception) override;
virtual sal_Bool SAL_CALL supportsService(const OUString& sServiceName)
throw(css::uno::RuntimeException, std::exception) override;
virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames()
throw(css::uno::RuntimeException, std::exception) override;
virtual css::uno::Any SAL_CALL dispatchWithReturnValue(const css::util::URL& aURL,
const css::uno::Sequence< css::beans::PropertyValue >& lArguments )
throw(css::uno::RuntimeException, std::exception) override;
private:
css::uno::Reference< css::uno::XComponentContext > mxContext;
};
SafeModeUI::SafeModeUI(const css::uno::Reference<css::uno::XComponentContext>& xContext):
mxContext(xContext)
{
}
SafeModeUI::~SafeModeUI()
{
}
OUString SAL_CALL SafeModeUI::getImplementationName()
throw(css::uno::RuntimeException, std::exception)
{
return OUString("com.sun.star.comp.svx.SafeModeUI");
}
sal_Bool SAL_CALL SafeModeUI::supportsService(const OUString& sServiceName)
throw(css::uno::RuntimeException, std::exception)
{
return cppu::supportsService(this, sServiceName);
}
css::uno::Sequence< OUString > SAL_CALL SafeModeUI::getSupportedServiceNames()
throw(css::uno::RuntimeException, std::exception)
{
css::uno::Sequence< OUString > lServiceNames { "com.sun.star.dialog.SafeModeUI" };
return lServiceNames;
}
css::uno::Any SAL_CALL SafeModeUI::dispatchWithReturnValue(const css::util::URL&,
const css::uno::Sequence< css::beans::PropertyValue >& )
throw(css::uno::RuntimeException, std::exception)
{
SolarMutexGuard aGuard;
css::uno::Any aRet;
ScopedVclPtrInstance<SafeModeDialog> xDialog(nullptr);
xDialog->Execute();
return aRet;
}
}
extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface * SAL_CALL
com_sun_star_comp_svx_SafeModeUI_get_implementation(
css::uno::XComponentContext *context,
css::uno::Sequence<css::uno::Any> const &)
{
return cppu::acquire(new SafeModeUI(context));
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */

View file

@ -0,0 +1,148 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.18.3 -->
<interface>
<requires lib="gtk+" version="3.12"/>
<object class="GtkDialog" id="SafeModeDialog">
<property name="can_focus">False</property>
<property name="border_width">6</property>
<property name="title" translatable="yes">Safe Mode</property>
<property name="resizable">False</property>
<property name="type_hint">dialog</property>
<child internal-child="vbox">
<object class="GtkBox" id="dialog-vbox1">
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">12</property>
<child internal-child="action_area">
<object class="GtkButtonBox" id="dialog-action_area1">
<property name="can_focus">False</property>
<property name="layout_style">end</property>
<child>
<object class="GtkButton" id="btn_continue">
<property name="label" translatable="yes">_Continue in Safe Mode</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="has_default">True</property>
<property name="receives_default">True</property>
<property name="use_underline">True</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="btn_quit">
<property name="label" translatable="yes">_Quit</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_underline">True</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkButton" id="btn_restart">
<property name="label" translatable="yes">_Make Changes and Restart</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_underline">True</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">3</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">4</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">%PRODUCTNAME is now running in Safe Mode, which temporarily disables your custom settings and extensions.
You can make some or all these changes permanent:</property>
<property name="wrap">True</property>
<property name="xalign">0</property>
<property name="yalign">0</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkBox" id="box1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkCheckButton" id="check_extensions">
<property name="label" translatable="yes">Disable all extensions</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="xalign">0</property>
<property name="draw_indicator">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkCheckButton" id="check_customizations">
<property name="label" translatable="yes">Reset customizations (Settings and User Interface modifications)</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="xalign">0</property>
<property name="draw_indicator">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkCheckButton" id="check_full">
<property name="label" translatable="yes">Reset the whole User Profile</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="xalign">0</property>
<property name="draw_indicator">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">3</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
<object class="GtkActionGroup" id="actiongroup1"/>
</interface>

View file

@ -36,6 +36,10 @@
constructor="com_sun_star_comp_svx_CrashReportUI_get_implementation">
<service name="com.sun.star.dialog.CrashReportUI"/>
</implementation>
<implementation name="com.sun.star.comp.svx.SafeModeUI"
constructor="com_sun_star_comp_svx_SafeModeUI_get_implementation">
<service name="com.sun.star.dialog.SafeModeUI"/>
</implementation>
<implementation name="com.sun.star.drawing.EnhancedCustomShapeEngine"
constructor="com_sun_star_drawing_EnhancedCustomShapeEngine_get_implementation">
<service name="com.sun.star.drawing.CustomShapeEngine"/>