profilesafe: Adapted to UI
Adaptions to UI, added more modes what the user can do in SafeMode. Adapted locations to write pack information and added places where to enter SafeMode. Implemented basically all five possible user choices Change-Id: Ic5324a8f77ab434309e840949c3803e65a75c538 Reviewed-on: https://gerrit.libreoffice.org/29785 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Armin Le Grand <Armin.Le.Grand@cib.de>
This commit is contained in:
@@ -225,6 +225,18 @@ namespace
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool dirExists(const OUString& rDirURL)
|
||||||
|
{
|
||||||
|
if (!rDirURL.isEmpty())
|
||||||
|
{
|
||||||
|
osl::Directory aDirectory(rDirURL);
|
||||||
|
|
||||||
|
return (osl::FileBase::E_None == aDirectory.open());
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
void scanDirsAndFiles(
|
void scanDirsAndFiles(
|
||||||
const OUString& rDirURL,
|
const OUString& rDirURL,
|
||||||
std::set< OUString >& rDirs,
|
std::set< OUString >& rDirs,
|
||||||
@@ -269,6 +281,39 @@ namespace
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool deleteDirRecursively(const OUString& rDirURL)
|
||||||
|
{
|
||||||
|
std::set< OUString > aDirs;
|
||||||
|
std::set< std::pair< OUString, OUString > > aFiles;
|
||||||
|
|
||||||
|
scanDirsAndFiles(
|
||||||
|
rDirURL,
|
||||||
|
aDirs,
|
||||||
|
aFiles);
|
||||||
|
|
||||||
|
for (const auto& dir : aDirs)
|
||||||
|
{
|
||||||
|
const OUString aNewDirURL(rDirURL + "/" + dir);
|
||||||
|
|
||||||
|
deleteDirRecursively(aNewDirURL);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const auto& file : aFiles)
|
||||||
|
{
|
||||||
|
OUString aNewFileURL(rDirURL + "/" + file.first);
|
||||||
|
|
||||||
|
if (!file.second.isEmpty())
|
||||||
|
{
|
||||||
|
aNewFileURL += ".";
|
||||||
|
aNewFileURL += file.second;
|
||||||
|
}
|
||||||
|
|
||||||
|
osl::File::remove(aNewFileURL);
|
||||||
|
}
|
||||||
|
|
||||||
|
return osl::FileBase::E_None == osl::Directory::remove(rDirURL);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace
|
namespace
|
||||||
@@ -434,6 +479,11 @@ namespace
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool isEnabled() const
|
||||||
|
{
|
||||||
|
return REGISTERED == meState;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef ::std::vector< ExtensionInfoEntry > ExtensionInfoEntryVector;
|
typedef ::std::vector< ExtensionInfoEntry > ExtensionInfoEntryVector;
|
||||||
@@ -578,6 +628,91 @@ namespace
|
|||||||
|
|
||||||
return bRetval;
|
return bRetval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool areThereEnabledExtensions() const
|
||||||
|
{
|
||||||
|
for (const auto& a : maEntries)
|
||||||
|
{
|
||||||
|
if (a.isEnabled())
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void disableAll()
|
||||||
|
{
|
||||||
|
// create content from current extension configuration
|
||||||
|
uno::Sequence< uno::Sequence< uno::Reference< deployment::XPackage > > > xAllPackages;
|
||||||
|
uno::Reference< uno::XComponentContext > xContext = ::comphelper::getProcessComponentContext();
|
||||||
|
uno::Reference< deployment::XExtensionManager > m_xExtensionManager = deployment::ExtensionManager::get(xContext);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
xAllPackages = m_xExtensionManager->getAllExtensions(uno::Reference< task::XAbortChannel >(),
|
||||||
|
uno::Reference< ucb::XCommandEnvironment >());
|
||||||
|
}
|
||||||
|
catch (const deployment::DeploymentException &)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
catch (const ucb::CommandFailedException &)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
catch (const ucb::CommandAbortedException &)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
catch (const lang::IllegalArgumentException & e)
|
||||||
|
{
|
||||||
|
throw uno::RuntimeException(e.Message, e.Context);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (sal_Int32 i = 0; i < xAllPackages.getLength(); ++i)
|
||||||
|
{
|
||||||
|
uno::Sequence< uno::Reference< deployment::XPackage > > xPackageList = xAllPackages[i];
|
||||||
|
|
||||||
|
for (sal_Int32 j = 0; j < xPackageList.getLength(); ++j)
|
||||||
|
{
|
||||||
|
uno::Reference< deployment::XPackage > xPackage = xPackageList[j];
|
||||||
|
|
||||||
|
if (xPackage.is())
|
||||||
|
{
|
||||||
|
const beans::Optional< beans::Ambiguous< sal_Bool > > option(
|
||||||
|
xPackage->isRegistered(uno::Reference< task::XAbortChannel >(),
|
||||||
|
uno::Reference< ucb::XCommandEnvironment >()));
|
||||||
|
bool bEnabled(false);
|
||||||
|
|
||||||
|
if (option.IsPresent)
|
||||||
|
{
|
||||||
|
::beans::Ambiguous< sal_Bool > const& reg = option.Value;
|
||||||
|
|
||||||
|
if (!reg.IsAmbiguous)
|
||||||
|
{
|
||||||
|
bEnabled = reg.Value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bEnabled)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
m_xExtensionManager->disableExtension(
|
||||||
|
xPackage,
|
||||||
|
uno::Reference< task::XAbortChannel >(),
|
||||||
|
uno::Reference< ucb::XCommandEnvironment >());
|
||||||
|
}
|
||||||
|
catch (const ::ucb::CommandAbortedException &)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1272,7 +1407,7 @@ namespace comphelper
|
|||||||
maDirs(),
|
maDirs(),
|
||||||
maFiles(),
|
maFiles(),
|
||||||
mnNumBackups(2),
|
mnNumBackups(2),
|
||||||
mnMode(0),
|
mnMode(1),
|
||||||
mbActive(false),
|
mbActive(false),
|
||||||
mbExtensions(true),
|
mbExtensions(true),
|
||||||
mbCompress(true)
|
mbCompress(true)
|
||||||
@@ -1386,12 +1521,20 @@ namespace comphelper
|
|||||||
maUserConfigBaseURL,
|
maUserConfigBaseURL,
|
||||||
aPackURL);
|
aPackURL);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Try Push of ExtensionInfo
|
return bDidPush;
|
||||||
if (mbExtensions)
|
}
|
||||||
{
|
|
||||||
bDidPush |= tryPush_extensionInfo(aPackURL);
|
bool BackupFileHelper::tryPushExtensionInfo()
|
||||||
}
|
{
|
||||||
|
bool bDidPush(false);
|
||||||
|
|
||||||
|
if (mbActive && mbExtensions)
|
||||||
|
{
|
||||||
|
const OUString aPackURL(getPackURL());
|
||||||
|
|
||||||
|
bDidPush = tryPush_extensionInfo(aPackURL);
|
||||||
}
|
}
|
||||||
|
|
||||||
return bDidPush;
|
return bDidPush;
|
||||||
@@ -1417,12 +1560,20 @@ namespace comphelper
|
|||||||
maUserConfigBaseURL,
|
maUserConfigBaseURL,
|
||||||
aPackURL);
|
aPackURL);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// try for ExtensionInfo
|
return bPopPossible;
|
||||||
if (mbExtensions)
|
}
|
||||||
{
|
|
||||||
bPopPossible |= isPopPossible_extensionInfo(aPackURL);
|
bool BackupFileHelper::isPopPossibleExtensionInfo()
|
||||||
}
|
{
|
||||||
|
bool bPopPossible(false);
|
||||||
|
|
||||||
|
if (mbActive && mbExtensions)
|
||||||
|
{
|
||||||
|
const OUString aPackURL(getPackURL());
|
||||||
|
|
||||||
|
bPopPossible = isPopPossible_extensionInfo(aPackURL);
|
||||||
}
|
}
|
||||||
|
|
||||||
return bPopPossible;
|
return bPopPossible;
|
||||||
@@ -1449,11 +1600,25 @@ namespace comphelper
|
|||||||
aPackURL);
|
aPackURL);
|
||||||
}
|
}
|
||||||
|
|
||||||
// try for ExtensionInfo
|
if (bDidPop)
|
||||||
if (mbExtensions)
|
|
||||||
{
|
{
|
||||||
bDidPop |= tryPop_extensionInfo(aPackURL);
|
// try removal of evtl. empty directory
|
||||||
|
osl::Directory::remove(aPackURL);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return bDidPop;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool BackupFileHelper::tryPopExtensionInfo()
|
||||||
|
{
|
||||||
|
bool bDidPop(false);
|
||||||
|
|
||||||
|
if (mbActive && mbExtensions)
|
||||||
|
{
|
||||||
|
const OUString aPackURL(getPackURL());
|
||||||
|
|
||||||
|
bDidPop = tryPop_extensionInfo(aPackURL);
|
||||||
|
|
||||||
if (bDidPop)
|
if (bDidPop)
|
||||||
{
|
{
|
||||||
@@ -1465,6 +1630,53 @@ namespace comphelper
|
|||||||
return bDidPop;
|
return bDidPop;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool BackupFileHelper::isTryDisableAllExtensionsPossible()
|
||||||
|
{
|
||||||
|
// return true if there is an eabled extension that can be disabled
|
||||||
|
ExtensionInfo aCurrentExtensionInfo;
|
||||||
|
|
||||||
|
aCurrentExtensionInfo.createCurrent();
|
||||||
|
return aCurrentExtensionInfo.areThereEnabledExtensions();
|
||||||
|
}
|
||||||
|
|
||||||
|
void BackupFileHelper::tryDisableAllExtensions()
|
||||||
|
{
|
||||||
|
// disable all still enabled extensions. No need to
|
||||||
|
// createCurrent() again, just do it now
|
||||||
|
ExtensionInfo::disableAll();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool BackupFileHelper::isTryResetCustomizationsPossible()
|
||||||
|
{
|
||||||
|
// return true if not all of the customization selection dirs are deleted
|
||||||
|
return
|
||||||
|
dirExists(maUserConfigBaseURL + "/config") || // UI config stuff
|
||||||
|
dirExists(maUserConfigBaseURL + "/registry") || // most of the registry stuff
|
||||||
|
dirExists(maUserConfigBaseURL + "/psprint") || // not really needed, can be abandoned
|
||||||
|
dirExists(maUserConfigBaseURL + "/store") || // not really needed, can be abandoned
|
||||||
|
dirExists(maUserConfigBaseURL + "/temp") || // not really needed, can be abandoned
|
||||||
|
dirExists(maUserConfigBaseURL + "/pack") || // own backup dir
|
||||||
|
fileExists(maUserConfigBaseURL + "/registrymodifications.xcu"); // personal registry stuff
|
||||||
|
}
|
||||||
|
|
||||||
|
void BackupFileHelper::tryResetCustomizations()
|
||||||
|
{
|
||||||
|
// delete all of the customization selection dirs
|
||||||
|
deleteDirRecursively(maUserConfigBaseURL + "/config");
|
||||||
|
deleteDirRecursively(maUserConfigBaseURL + "/registry");
|
||||||
|
deleteDirRecursively(maUserConfigBaseURL + "/psprint");
|
||||||
|
deleteDirRecursively(maUserConfigBaseURL + "/store");
|
||||||
|
deleteDirRecursively(maUserConfigBaseURL + "/temp");
|
||||||
|
deleteDirRecursively(maUserConfigBaseURL + "/pack");
|
||||||
|
osl::File::remove(maUserConfigBaseURL + "/registrymodifications.xcu");
|
||||||
|
}
|
||||||
|
|
||||||
|
void BackupFileHelper::tryResetUserProfile()
|
||||||
|
{
|
||||||
|
// completely delete the current UserProfile
|
||||||
|
deleteDirRecursively(maUserConfigBaseURL);
|
||||||
|
}
|
||||||
|
|
||||||
/////////////////// helpers ///////////////////////
|
/////////////////// helpers ///////////////////////
|
||||||
|
|
||||||
const rtl::OUString BackupFileHelper::getPackURL() const
|
const rtl::OUString BackupFileHelper::getPackURL() const
|
||||||
@@ -1839,25 +2051,29 @@ namespace comphelper
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Information about the configuration and the role/purpose of directories in
|
||||||
|
// the UserConfiguration is taken from: https://wiki.documentfoundation.org/UserProfile
|
||||||
|
|
||||||
// fill dir and file info list to work with dependent on work mode
|
// fill dir and file info list to work with dependent on work mode
|
||||||
switch (mnMode)
|
switch (mnMode)
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
{
|
{
|
||||||
// add registrymodifications (the orig file in maInitialBaseURL)
|
// simple mode: add just registrymodifications
|
||||||
|
// (the orig file in maInitialBaseURL)
|
||||||
maFiles.insert(std::pair< OUString, OUString >(maRegModName, maExt));
|
maFiles.insert(std::pair< OUString, OUString >(maRegModName, maExt));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 1:
|
case 1:
|
||||||
{
|
{
|
||||||
// add registrymodifications (the orig file in maInitialBaseURL)
|
// defined mode: Add a selection of dirs containing User-Defined and thus
|
||||||
maFiles.insert(std::pair< OUString, OUString >(maRegModName, maExt));
|
// valuable configuration information.
|
||||||
|
|
||||||
// Add a selection of dirs containing User-Defined and thus
|
|
||||||
// valuable configuration information (see https://wiki.documentfoundation.org/UserProfile).
|
|
||||||
// This is clearly discussable in every single point and may be adapted/corrected
|
// This is clearly discussable in every single point and may be adapted/corrected
|
||||||
// over time. Main focus is to secure User-Defined/adapted values
|
// over time. Main focus is to secure User-Defined/adapted values
|
||||||
|
|
||||||
|
// add registrymodifications (the orig file in maInitialBaseURL)
|
||||||
|
maFiles.insert(std::pair< OUString, OUString >(maRegModName, maExt));
|
||||||
|
|
||||||
// User-defined substitution table (Tools/AutoCorrect)
|
// User-defined substitution table (Tools/AutoCorrect)
|
||||||
maDirs.insert("autocorr");
|
maDirs.insert("autocorr");
|
||||||
|
|
||||||
@@ -1891,6 +2107,7 @@ namespace comphelper
|
|||||||
// Questionable - where and how is Extension stuff held and how
|
// Questionable - where and how is Extension stuff held and how
|
||||||
// does this interact with enabled/disabled states which are extra handled?
|
// does this interact with enabled/disabled states which are extra handled?
|
||||||
// Keep out of business until deeper evaluated
|
// Keep out of business until deeper evaluated
|
||||||
|
//
|
||||||
// maDirs.insert("extensions");
|
// maDirs.insert("extensions");
|
||||||
// maDirs.insert("uno-packages");
|
// maDirs.insert("uno-packages");
|
||||||
break;
|
break;
|
||||||
@@ -1913,6 +2130,10 @@ namespace comphelper
|
|||||||
|
|
||||||
// not really needed, can be abandoned
|
// not really needed, can be abandoned
|
||||||
maDirs.erase("temp");
|
maDirs.erase("temp");
|
||||||
|
|
||||||
|
// exclude own backup dir to avoid recursion
|
||||||
|
maDirs.erase("pack");
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -951,64 +951,23 @@ void Desktop::HandleBootstrapErrors(
|
|||||||
}
|
}
|
||||||
else if ( aBootstrapError == BE_OFFICECONFIG_BROKEN )
|
else if ( aBootstrapError == BE_OFFICECONFIG_BROKEN )
|
||||||
{
|
{
|
||||||
bool bFireOriginalError(true);
|
|
||||||
comphelper::BackupFileHelper aBackupFileHelper;
|
|
||||||
|
|
||||||
// crerate BackupFileHelper and check if active and if pop is possible
|
|
||||||
if (aBackupFileHelper.isPopPossible())
|
|
||||||
{
|
|
||||||
// for linux (and probably others?) we need to instantiate XDesktop2
|
|
||||||
// to be able to open a *.ui-file based dialog, so do this here locally.
|
|
||||||
// does no harm on win, so better always do this (in error case only anyways)
|
|
||||||
Reference< XComponentContext > xLocalContext = ::comphelper::getProcessComponentContext();
|
|
||||||
Reference< XDesktop2 > xDesktop = css::frame::Desktop::create(xLocalContext);
|
|
||||||
|
|
||||||
ScopedVclPtrInstance< MessageDialog > aQueryShouldRestore(
|
|
||||||
Application::GetDefDialogParent(),
|
|
||||||
"QueryTryToRestoreConfigurationDialog",
|
|
||||||
"desktop/ui/querytrytorestoreconfigurationdialog.ui");
|
|
||||||
|
|
||||||
if (aQueryShouldRestore.get())
|
|
||||||
{
|
|
||||||
if (!aErrorMessage.isEmpty())
|
|
||||||
{
|
|
||||||
OUString aPrimaryText(aQueryShouldRestore->get_primary_text());
|
|
||||||
|
|
||||||
aPrimaryText += "\n(\"" + aErrorMessage + "\")";
|
|
||||||
aQueryShouldRestore->set_primary_text(aPrimaryText);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (RET_YES == aQueryShouldRestore->Execute())
|
|
||||||
{
|
|
||||||
aBackupFileHelper.tryPop();
|
|
||||||
bFireOriginalError = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// set flag at BackupFileHelper to be able to know if _exit was called and
|
// set flag at BackupFileHelper to be able to know if _exit was called and
|
||||||
// actions are executed after this. This method we are in will not return,
|
// actions are executed after this. This method we are in will not return,
|
||||||
// but end up in a _exit() call
|
// but end up in a _exit() call
|
||||||
comphelper::BackupFileHelper::setExitWasCalled();
|
comphelper::BackupFileHelper::setExitWasCalled();
|
||||||
|
|
||||||
if (bFireOriginalError)
|
// enter safe mode, too
|
||||||
{
|
sfx2::SafeMode::putFlag();
|
||||||
OUString msg(
|
|
||||||
GetMsgString(
|
OUString msg(
|
||||||
STR_CONFIG_ERR_ACCESS_GENERAL,
|
GetMsgString(
|
||||||
("A general error occurred while accessing your central"
|
STR_CONFIG_ERR_ACCESS_GENERAL,
|
||||||
" configuration.")));
|
("A general error occurred while accessing your central"
|
||||||
if (!aErrorMessage.isEmpty()) {
|
" configuration. SafeMode is initiated.")));
|
||||||
msg += "\n(\"" + aErrorMessage + "\")";
|
if (!aErrorMessage.isEmpty()) {
|
||||||
}
|
msg += "\n(\"" + aErrorMessage + "\")";
|
||||||
FatalError(MakeStartupErrorMessage(msg));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Already presented all information to the user.
|
|
||||||
// just do what FatalError does at it's end
|
|
||||||
_exit(EXITHELPER_FATAL_ERROR);
|
|
||||||
}
|
}
|
||||||
|
FatalError(MakeStartupErrorMessage(msg));
|
||||||
}
|
}
|
||||||
else if ( aBootstrapError == BE_USERINSTALL_FAILED )
|
else if ( aBootstrapError == BE_USERINSTALL_FAILED )
|
||||||
{
|
{
|
||||||
@@ -1824,6 +1783,7 @@ int Desktop::doShutdown()
|
|||||||
comphelper::BackupFileHelper aBackupFileHelper;
|
comphelper::BackupFileHelper aBackupFileHelper;
|
||||||
|
|
||||||
aBackupFileHelper.tryPush();
|
aBackupFileHelper.tryPush();
|
||||||
|
aBackupFileHelper.tryPushExtensionInfo();
|
||||||
}
|
}
|
||||||
|
|
||||||
// The acceptors in the AcceptorMap must be released (in DeregisterServices)
|
// The acceptors in the AcceptorMap must be released (in DeregisterServices)
|
||||||
|
@@ -1,37 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<interface>
|
|
||||||
<!-- interface-requires gtk+ 3.0 -->
|
|
||||||
<object class="GtkMessageDialog" id="QueryTryToRestoreConfigurationDialog">
|
|
||||||
<property name="can_focus">False</property>
|
|
||||||
<property name="border_width">6</property>
|
|
||||||
<property name="title" translatable="yes">LibreOffice Startup: General Configuration Error</property>
|
|
||||||
<property name="resizable">False</property>
|
|
||||||
<property name="type_hint">dialog</property>
|
|
||||||
<property name="skip_taskbar_hint">True</property>
|
|
||||||
<property name="message_type">question</property>
|
|
||||||
<property name="buttons">yes-no</property>
|
|
||||||
<property name="text" translatable="yes">A general error occurred during startup while accessing the central configuration.</property>
|
|
||||||
<property name="secondary_text" translatable="yes">A Backup of your configuration was detected. Restoring the configuration might solve this problem, but is not guaranteed to work. A restart of the Program is needed.
|
|
||||||
|
|
||||||
Do you want to restore the configuration?</property>
|
|
||||||
<child internal-child="vbox">
|
|
||||||
<object class="GtkBox" id="messagedialog-vbox5">
|
|
||||||
<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="messagedialog-action_area5">
|
|
||||||
<property name="can_focus">False</property>
|
|
||||||
<property name="layout_style">end</property>
|
|
||||||
</object>
|
|
||||||
<packing>
|
|
||||||
<property name="expand">False</property>
|
|
||||||
<property name="fill">True</property>
|
|
||||||
<property name="pack_type">end</property>
|
|
||||||
<property name="position">0</property>
|
|
||||||
</packing>
|
|
||||||
</child>
|
|
||||||
</object>
|
|
||||||
</child>
|
|
||||||
</object>
|
|
||||||
</interface>
|
|
@@ -106,15 +106,21 @@ namespace comphelper
|
|||||||
*
|
*
|
||||||
* @return bool
|
* @return bool
|
||||||
* returns true if a new backup was actually created
|
* returns true if a new backup was actually created
|
||||||
|
*
|
||||||
|
* tryPushExtensionInfo is the specialized version for ExtensionInfo
|
||||||
*/
|
*/
|
||||||
bool tryPush();
|
bool tryPush();
|
||||||
|
bool tryPushExtensionInfo();
|
||||||
|
|
||||||
/** finds out if a restore is possible
|
/** finds out if a restore is possible
|
||||||
*
|
*
|
||||||
* @return bool
|
* @return bool
|
||||||
* returns true if a restore to an older backup is possible
|
* returns true if a restore to an older backup is possible
|
||||||
|
*
|
||||||
|
* isPopPossibleExtensionInfo is the specialized version for ExtensionInfo
|
||||||
*/
|
*/
|
||||||
bool isPopPossible();
|
bool isPopPossible();
|
||||||
|
bool isPopPossibleExtensionInfo();
|
||||||
|
|
||||||
/** tries to execute a restore. Will overwrite the base file
|
/** tries to execute a restore. Will overwrite the base file
|
||||||
* in that case and take one version off the 'stack' of copies.
|
* in that case and take one version off the 'stack' of copies.
|
||||||
@@ -123,8 +129,25 @@ namespace comphelper
|
|||||||
*
|
*
|
||||||
* @return bool
|
* @return bool
|
||||||
* returns true if a restore was actually created
|
* returns true if a restore was actually created
|
||||||
|
*
|
||||||
|
* tryPopExtensionInfo is the specialized version for ExtensionInfo
|
||||||
*/
|
*/
|
||||||
bool tryPop();
|
bool tryPop();
|
||||||
|
bool tryPopExtensionInfo();
|
||||||
|
|
||||||
|
/** tries to iterate the extensions and to disable all of them
|
||||||
|
*/
|
||||||
|
static bool isTryDisableAllExtensionsPossible();
|
||||||
|
static void tryDisableAllExtensions();
|
||||||
|
|
||||||
|
/** resets User-Customizations like Settings and UserInterface modifications
|
||||||
|
*/
|
||||||
|
bool isTryResetCustomizationsPossible();
|
||||||
|
void tryResetCustomizations();
|
||||||
|
|
||||||
|
/** resets the whole UserProfile
|
||||||
|
*/
|
||||||
|
void tryResetUserProfile();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// internal helper methods
|
// internal helper methods
|
||||||
|
@@ -108,7 +108,7 @@ $(call gb_CustomTarget_get_workdir,instsetoo_native/setup)/$(call gb_Helper_get_
|
|||||||
# SecureUserConfig : boolean - switches securing on/off - default false
|
# SecureUserConfig : boolean - switches securing on/off - default false
|
||||||
# SecureUserConfigCompress : boolean - defines if backup data will be compressed - default true
|
# SecureUserConfigCompress : boolean - defines if backup data will be compressed - default true
|
||||||
# SecureUserConfigNumCopies : integer - defines how many compressed copies of saved content will be kept - default 2
|
# SecureUserConfigNumCopies : integer - defines how many compressed copies of saved content will be kept - default 2
|
||||||
# SecureUserConfigMode: integer - defines what to secure, default is 0
|
# SecureUserConfigMode: integer - defines what to secure, default is 1
|
||||||
# 0 : only registrymodifications.xcu
|
# 0 : only registrymodifications.xcu
|
||||||
# 1 : a selected amount of user-defined configs
|
# 1 : a selected amount of user-defined configs
|
||||||
# 2 : everything in the user config directory
|
# 2 : everything in the user config directory
|
||||||
@@ -131,7 +131,7 @@ $(call gb_CustomTarget_get_workdir,instsetoo_native/setup)/$(call gb_Helper_get_
|
|||||||
&& echo 'SecureUserConfig=true' \
|
&& echo 'SecureUserConfig=true' \
|
||||||
&& echo 'SecureUserConfigCompress=true' \
|
&& echo 'SecureUserConfigCompress=true' \
|
||||||
&& echo 'SecureUserConfigNumCopies=2' \
|
&& echo 'SecureUserConfigNumCopies=2' \
|
||||||
&& echo 'SecureUserConfigMode=0' \
|
&& echo 'SecureUserConfigMode=1' \
|
||||||
&& echo 'SecureUserConfigExtensions=true' \
|
&& echo 'SecureUserConfigExtensions=true' \
|
||||||
) > $@
|
) > $@
|
||||||
|
|
||||||
|
@@ -22,26 +22,63 @@
|
|||||||
|
|
||||||
using namespace css;
|
using namespace css;
|
||||||
|
|
||||||
SafeModeDialog::SafeModeDialog(vcl::Window* pParent):
|
SafeModeDialog::SafeModeDialog(vcl::Window* pParent)
|
||||||
Dialog(pParent, "SafeModeDialog", "svx/ui/safemodedialog.ui")
|
: Dialog(pParent, "SafeModeDialog", "svx/ui/safemodedialog.ui"),
|
||||||
|
|
||||||
|
mpBtnContinue(),
|
||||||
|
mpBtnQuit(),
|
||||||
|
mpBtnRestart(),
|
||||||
|
|
||||||
|
mpCBCheckProfilesafeConfig(),
|
||||||
|
mpCBCheckProfilesafeExtensions(),
|
||||||
|
mpCBDisableAllExtensions(),
|
||||||
|
mpCBResetCustomizations(),
|
||||||
|
mpCBResetWholeUserProfile(),
|
||||||
|
|
||||||
|
maBackupFileHelper()
|
||||||
{
|
{
|
||||||
get(mpBtnContinue, "btn_continue");
|
get(mpBtnContinue, "btn_continue");
|
||||||
get(mpBtnQuit, "btn_quit");
|
get(mpBtnQuit, "btn_quit");
|
||||||
get(mpBtnRestart, "btn_restart");
|
get(mpBtnRestart, "btn_restart");
|
||||||
get(mpCBCustomizations, "check_customizations");
|
|
||||||
get(mpCBExtensions, "check_extensions");
|
get(mpCBCheckProfilesafeConfig, "check_profilesafe_config");
|
||||||
get(mpCBFull, "check_full");
|
get(mpCBCheckProfilesafeExtensions, "check_profilesafe_extensions");
|
||||||
|
get(mpCBDisableAllExtensions, "check_disable_all_extensions");
|
||||||
|
get(mpCBResetCustomizations, "check_reset_customizations");
|
||||||
|
get(mpCBResetWholeUserProfile, "check_reset_whole_userprofile");
|
||||||
|
|
||||||
mpBtnContinue->SetClickHdl(LINK(this, SafeModeDialog, BtnHdl));
|
mpBtnContinue->SetClickHdl(LINK(this, SafeModeDialog, BtnHdl));
|
||||||
mpBtnQuit->SetClickHdl(LINK(this, SafeModeDialog, BtnHdl));
|
mpBtnQuit->SetClickHdl(LINK(this, SafeModeDialog, BtnHdl));
|
||||||
mpBtnRestart->SetClickHdl(LINK(this, SafeModeDialog, BtnHdl));
|
mpBtnRestart->SetClickHdl(LINK(this, SafeModeDialog, BtnHdl));
|
||||||
|
|
||||||
mpCBCustomizations->SetToggleHdl(LINK(this, SafeModeDialog, CheckBoxHdl));
|
mpCBCheckProfilesafeConfig->SetToggleHdl(LINK(this, SafeModeDialog, CheckBoxHdl));
|
||||||
mpCBExtensions->SetToggleHdl(LINK(this, SafeModeDialog, CheckBoxHdl));
|
mpCBCheckProfilesafeExtensions->SetToggleHdl(LINK(this, SafeModeDialog, CheckBoxHdl));
|
||||||
mpCBFull->SetToggleHdl(LINK(this, SafeModeDialog, CheckBoxHdl));
|
mpCBDisableAllExtensions->SetToggleHdl(LINK(this, SafeModeDialog, CheckBoxHdl));
|
||||||
|
mpCBResetCustomizations->SetToggleHdl(LINK(this, SafeModeDialog, CheckBoxHdl));
|
||||||
|
mpCBResetWholeUserProfile->SetToggleHdl(LINK(this, SafeModeDialog, CheckBoxHdl));
|
||||||
|
|
||||||
// Disable restart btn until some checkbox is active
|
// Disable restart btn until some checkbox is active
|
||||||
mpBtnRestart->Disable();
|
mpBtnRestart->Disable();
|
||||||
|
|
||||||
|
if (!maBackupFileHelper.isPopPossible())
|
||||||
|
{
|
||||||
|
mpCBCheckProfilesafeConfig->Disable();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!maBackupFileHelper.isPopPossibleExtensionInfo())
|
||||||
|
{
|
||||||
|
mpCBCheckProfilesafeExtensions->Disable();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (comphelper::BackupFileHelper::isTryDisableAllExtensionsPossible())
|
||||||
|
{
|
||||||
|
mpCBDisableAllExtensions->Disable();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (maBackupFileHelper.isTryResetCustomizationsPossible())
|
||||||
|
{
|
||||||
|
mpCBResetCustomizations->Disable();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SafeModeDialog::~SafeModeDialog()
|
SafeModeDialog::~SafeModeDialog()
|
||||||
@@ -54,9 +91,12 @@ void SafeModeDialog::dispose()
|
|||||||
mpBtnContinue.clear();
|
mpBtnContinue.clear();
|
||||||
mpBtnQuit.clear();
|
mpBtnQuit.clear();
|
||||||
mpBtnRestart.clear();
|
mpBtnRestart.clear();
|
||||||
mpCBCustomizations.clear();
|
|
||||||
mpCBExtensions.clear();
|
mpCBCheckProfilesafeConfig.clear();
|
||||||
mpCBFull.clear();
|
mpCBCheckProfilesafeExtensions.clear();
|
||||||
|
mpCBDisableAllExtensions.clear();
|
||||||
|
mpCBResetCustomizations.clear();
|
||||||
|
mpCBResetWholeUserProfile.clear();
|
||||||
|
|
||||||
Dialog::dispose();
|
Dialog::dispose();
|
||||||
}
|
}
|
||||||
@@ -80,7 +120,37 @@ void SafeModeDialog::terminateOffice()
|
|||||||
|
|
||||||
void SafeModeDialog::applyChanges()
|
void SafeModeDialog::applyChanges()
|
||||||
{
|
{
|
||||||
// TODO: Apply apply changes
|
if (mpCBCheckProfilesafeConfig->IsChecked())
|
||||||
|
{
|
||||||
|
// reset UserConfiguration to last known working state
|
||||||
|
// ProfileSafeMode/BackupFileHelper
|
||||||
|
maBackupFileHelper.tryPop();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mpCBCheckProfilesafeExtensions->IsChecked())
|
||||||
|
{
|
||||||
|
// reset State of installed Extensions to last known working state
|
||||||
|
// ProfileSafeMode/BackupFileHelper
|
||||||
|
maBackupFileHelper.tryPopExtensionInfo();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mpCBDisableAllExtensions->IsChecked())
|
||||||
|
{
|
||||||
|
// Disable all extensions
|
||||||
|
comphelper::BackupFileHelper::tryDisableAllExtensions();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mpCBResetCustomizations->IsChecked())
|
||||||
|
{
|
||||||
|
// Reset customizations (Settings and UserInterface modifications)
|
||||||
|
maBackupFileHelper.tryResetCustomizations();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mpCBResetWholeUserProfile->IsChecked())
|
||||||
|
{
|
||||||
|
// Reset the whole UserProfile
|
||||||
|
maBackupFileHelper.tryResetUserProfile();
|
||||||
|
}
|
||||||
|
|
||||||
// Then restart
|
// Then restart
|
||||||
css::task::OfficeRestartManager::get(comphelper::getProcessComponentContext())->requestRestart(
|
css::task::OfficeRestartManager::get(comphelper::getProcessComponentContext())->requestRestart(
|
||||||
@@ -106,7 +176,13 @@ IMPL_LINK(SafeModeDialog, BtnHdl, Button*, pBtn, void)
|
|||||||
|
|
||||||
IMPL_LINK(SafeModeDialog, CheckBoxHdl, CheckBox&, /*pCheckBox*/, void)
|
IMPL_LINK(SafeModeDialog, CheckBoxHdl, CheckBox&, /*pCheckBox*/, void)
|
||||||
{
|
{
|
||||||
bool bEnable = mpCBCustomizations->IsChecked() || mpCBExtensions->IsChecked() || mpCBFull->IsChecked();
|
const bool bEnable(
|
||||||
|
mpCBCheckProfilesafeConfig->IsChecked() ||
|
||||||
|
mpCBCheckProfilesafeExtensions->IsChecked() ||
|
||||||
|
mpCBDisableAllExtensions->IsChecked() ||
|
||||||
|
mpCBResetCustomizations->IsChecked() ||
|
||||||
|
mpCBResetWholeUserProfile->IsChecked());
|
||||||
|
|
||||||
mpBtnRestart->Enable(bEnable);
|
mpBtnRestart->Enable(bEnable);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -15,6 +15,7 @@
|
|||||||
#include <vcl/fixed.hxx>
|
#include <vcl/fixed.hxx>
|
||||||
#include <vcl/edit.hxx>
|
#include <vcl/edit.hxx>
|
||||||
#include <vcl/vclmedit.hxx>
|
#include <vcl/vclmedit.hxx>
|
||||||
|
#include <comphelper/backupfilehelper.hxx>
|
||||||
|
|
||||||
class SafeModeDialog : public Dialog
|
class SafeModeDialog : public Dialog
|
||||||
{
|
{
|
||||||
@@ -34,12 +35,17 @@ private:
|
|||||||
VclPtr<Button> mpBtnQuit;
|
VclPtr<Button> mpBtnQuit;
|
||||||
VclPtr<Button> mpBtnRestart;
|
VclPtr<Button> mpBtnRestart;
|
||||||
|
|
||||||
VclPtr<CheckBox> mpCBExtensions;
|
VclPtr<CheckBox> mpCBCheckProfilesafeConfig;
|
||||||
VclPtr<CheckBox> mpCBCustomizations;
|
VclPtr<CheckBox> mpCBCheckProfilesafeExtensions;
|
||||||
VclPtr<CheckBox> mpCBFull;
|
VclPtr<CheckBox> mpCBDisableAllExtensions;
|
||||||
|
VclPtr<CheckBox> mpCBResetCustomizations;
|
||||||
|
VclPtr<CheckBox> mpCBResetWholeUserProfile;
|
||||||
|
|
||||||
|
// local BackupFileHelper for handling possible restores
|
||||||
|
comphelper::BackupFileHelper maBackupFileHelper;
|
||||||
|
|
||||||
static void terminateOffice();
|
static void terminateOffice();
|
||||||
static void applyChanges();
|
void applyChanges();
|
||||||
|
|
||||||
DECL_LINK(CheckBoxHdl, CheckBox&, void);
|
DECL_LINK(CheckBoxHdl, CheckBox&, void);
|
||||||
DECL_LINK(BtnHdl, Button*, void);
|
DECL_LINK(BtnHdl, Button*, void);
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!-- Generated with glade 3.18.3 -->
|
<!-- Generated with glade 3.16.1 -->
|
||||||
<interface>
|
<interface>
|
||||||
<requires lib="gtk+" version="3.12"/>
|
<requires lib="gtk+" version="3.12"/>
|
||||||
<object class="GtkDialog" id="SafeModeDialog">
|
<object class="GtkDialog" id="SafeModeDialog">
|
||||||
@@ -13,6 +13,110 @@
|
|||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
<property name="orientation">vertical</property>
|
<property name="orientation">vertical</property>
|
||||||
<property name="spacing">12</property>
|
<property name="spacing">12</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel" id="label1">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="xalign">0</property>
|
||||||
|
<property name="yalign">0</property>
|
||||||
|
<property name="label" translatable="yes">%PRODUCTNAME is now running in Safe Mode. You can make one or more of the following changes to return to a working state.
|
||||||
|
|
||||||
|
The offered possible changes get more radical from top to bottom, so it is recommended to try them thoroughly one after the other.</property>
|
||||||
|
<property name="wrap">True</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_profilesafe_config">
|
||||||
|
<property name="label" translatable="yes">Reset UserConfiguration to last known working state</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_profilesafe_extensions">
|
||||||
|
<property name="label" translatable="yes">Reset State of installed Extensions to last known working state</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_disable_all_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">2</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkCheckButton" id="check_reset_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">3</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkCheckButton" id="check_reset_whole_userprofile">
|
||||||
|
<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">4</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">True</property>
|
||||||
|
<property name="position">1</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
<child internal-child="action_area">
|
<child internal-child="action_area">
|
||||||
<object class="GtkButtonBox" id="dialog-action_area1">
|
<object class="GtkButtonBox" id="dialog-action_area1">
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
@@ -64,83 +168,10 @@
|
|||||||
<packing>
|
<packing>
|
||||||
<property name="expand">False</property>
|
<property name="expand">False</property>
|
||||||
<property name="fill">False</property>
|
<property name="fill">False</property>
|
||||||
|
<property name="pack_type">end</property>
|
||||||
<property name="position">4</property>
|
<property name="position">4</property>
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</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>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
|
Reference in New Issue
Block a user