static/CustomTarget_emscripten_fs_image.mk | 1 uui/inc/strings.hrc | 7 uui/source/iahndl-locking.cxx | 15 - uui/source/openlocked.cxx | 63 +++++- uui/source/openlocked.hxx | 31 ++- vcl/UIConfig_vcl.mk | 1 vcl/uiconfig/ui/openlockedquerybox.ui | 270 +++++++++++++++++++++++++++++ 7 files changed, 354 insertions(+), 34 deletions(-)
New commits: commit ff9ff6018bea7c1a4524c8edca8ef554c74e4b3f Author: Siddhant Chaudhary <urss...@gmail.com> AuthorDate: Tue Mar 29 19:06:09 2022 +0530 Commit: Hossein <hoss...@libreoffice.org> CommitDate: Mon Jun 20 15:46:48 2022 +0200 tdf#141026 Put user and computer name into collapsed section This patch hides away the file name and the name of the user when the user tries to open a locked file. This improves privacy, as discussed in the bug report. The .ui file for the new dialog box is `vcl/uiconfig/ui/openlockedquerybox.ui`. The source files `openlocked.hxx` and `openlocked.cxx` have been changed to implement the new dialog. The old string template `STR_OPENLOCKED_MSG` has been deleted to hide away the private data, and a new string template `STR_OPENLOCKED_HIDDEN_DATA` has been added; the latter will be hidden inside the expander dialog. Finally, corresponding changes in the makefiles have been made to let the makefiles know about the UI file. Change-Id: I3cc9d2f6e2d9bc43857c80662e2a405aacd7fc70 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/132342 Tested-by: Jenkins Reviewed-by: Hossein <hoss...@libreoffice.org> diff --git a/static/CustomTarget_emscripten_fs_image.mk b/static/CustomTarget_emscripten_fs_image.mk index 8166802858e5..a82d51d94db5 100644 --- a/static/CustomTarget_emscripten_fs_image.mk +++ b/static/CustomTarget_emscripten_fs_image.mk @@ -1076,6 +1076,7 @@ gb_emscripten_fs_image_files := \ $(INSTROOT)/$(LIBO_SHARE_FOLDER)/config/soffice.cfg/vcl/ui/menutogglebutton3.ui \ $(INSTROOT)/$(LIBO_SHARE_FOLDER)/config/soffice.cfg/vcl/ui/menutogglebutton4.ui \ $(INSTROOT)/$(LIBO_SHARE_FOLDER)/config/soffice.cfg/vcl/ui/printdialog.ui \ + $(INSTROOT)/$(LIBO_SHARE_FOLDER)/config/soffice.cfg/vcl/ui/openlockedquerybox.ui \ $(INSTROOT)/$(LIBO_SHARE_FOLDER)/config/soffice.cfg/vcl/ui/printerdevicepage.ui \ $(INSTROOT)/$(LIBO_SHARE_FOLDER)/config/soffice.cfg/vcl/ui/printerpaperpage.ui \ $(INSTROOT)/$(LIBO_SHARE_FOLDER)/config/soffice.cfg/vcl/ui/printerpropertiesdialog.ui \ diff --git a/uui/inc/strings.hrc b/uui/inc/strings.hrc index e5af3465b557..98bd94ef8484 100644 --- a/uui/inc/strings.hrc +++ b/uui/inc/strings.hrc @@ -47,12 +47,7 @@ #define STR_LOCKFAILED_OPENREADONLY_BTN NC_("STR_LOCKFAILED_OPENREADONLY_BTN", "Open ~Read-Only") #define STR_LOCKFAILED_OPENREADONLY_NOTIFY_BTN NC_("STR_LOCKFAILED_OPENREADONLY_NOTIFY_BTN", "~Notify") -#define STR_OPENLOCKED_TITLE NC_("STR_OPENLOCKED_TITLE", "Document in Use") -#define STR_OPENLOCKED_MSG NC_("STR_OPENLOCKED_MSG", "Document file '$(ARG1)' is locked for editing by:\n\n$(ARG2)\n\nOpen document read-only or open a copy of the document for editing.\nSelect Notify to open read-only and get notified when the document becomes editable.$(ARG3)") -#define STR_OPENLOCKED_ALLOWIGNORE_MSG NC_("STR_OPENLOCKED_ALLOWIGNORE_MSG", "\nYou may also ignore the file locking and open the document for editing.") -#define STR_OPENLOCKED_OPENREADONLY_BTN NC_("STR_OPENLOCKED_OPENREADONLY_BTN", "Open ~Read-Only") -#define STR_OPENLOCKED_OPENREADONLY_NOTIFY_BTN NC_("STR_OPENLOCKED_OPENREADONLY_NOTIFY_BTN", "~Notify") -#define STR_OPENLOCKED_OPENCOPY_BTN NC_("STR_OPENLOCKED_OPENCOPY_BTN", "Open ~Copy") +#define STR_OPENLOCKED_HIDDEN_DATA NC_("STR_OPENLOCKED_HIDDEN_DATA", "Document Name: $(ARG1)\nUser Name: $(ARG2)") #define STR_UNKNOWNUSER NC_("STR_UNKNOWNUSER", "Unknown User") #define STR_FILECHANGED_TITLE NC_("STR_FILECHANGED_TITLE", "Document Has Been Changed by Others") diff --git a/uui/source/iahndl-locking.cxx b/uui/source/iahndl-locking.cxx index 64af0961d48a..b1f55dd85667 100644 --- a/uui/source/iahndl-locking.cxx +++ b/uui/source/iahndl-locking.cxx @@ -107,6 +107,7 @@ handleLockedDocumentRequest_( std::locale aResLocale = Translate::Create("uui"); OUString aMessage; + OUString aHiddenData; std::vector< OUString > aArguments { aDocumentURL }; bool bAllowOverride = xRetry.is() && officecfg::Office::Common::Misc::AllowOverrideLocking::get(); @@ -117,14 +118,12 @@ handleLockedDocumentRequest_( aArguments.push_back( !aInfo.isEmpty() ? aInfo : Translate::get( STR_UNKNOWNUSER, aResLocale) ); - aArguments.push_back( bAllowOverride - ? Translate::get( STR_OPENLOCKED_ALLOWIGNORE_MSG, aResLocale ) - : "" ); - aMessage = Translate::get(STR_OPENLOCKED_MSG, aResLocale); - aMessage = UUIInteractionHelper::replaceMessageWithArguments( - aMessage, aArguments ); - OpenLockedQueryBox aDialog(pParent, aResLocale, aMessage, bAllowOverride); + aHiddenData = Translate::get(STR_OPENLOCKED_HIDDEN_DATA, aResLocale); + aHiddenData = UUIInteractionHelper::replaceMessageWithArguments( + aHiddenData, aArguments ); + + vcl::OpenLockedQueryBox aDialog(pParent, aHiddenData, bAllowOverride); nResult = aDialog.run(); } else if ( nMode == UUI_DOC_SAVE_LOCK ) @@ -137,7 +136,7 @@ handleLockedDocumentRequest_( aResLocale); aMessage = UUIInteractionHelper::replaceMessageWithArguments( aMessage, aArguments ); - + TryLaterQueryBox aDialog(pParent, aResLocale, aMessage, bAllowOverride); nResult = aDialog.run(); } diff --git a/uui/source/openlocked.cxx b/uui/source/openlocked.cxx index a0284b194b14..453022b912ab 100644 --- a/uui/source/openlocked.cxx +++ b/uui/source/openlocked.cxx @@ -20,23 +20,60 @@ #include <strings.hrc> #include "openlocked.hxx" #include <officecfg/Office/Common.hxx> -#include <unotools/resmgr.hxx> -#include <vcl/stdtext.hxx> -#include <vcl/svapp.hxx> +#include <vcl/weldutils.hxx> -OpenLockedQueryBox::OpenLockedQueryBox(weld::Window* pParent, const std::locale& rResLocale, const OUString& rMessage, bool bEnableOverride) - : m_xQueryBox(Application::CreateMessageDialog(pParent, VclMessageType::Question, VclButtonsType::NONE, rMessage)) +using namespace vcl; + +IMPL_LINK(OpenLockedQueryBox, ClickHdl, weld::Button&, rButton, void) { - m_xQueryBox->set_title(Translate::get(STR_OPENLOCKED_TITLE, rResLocale)); - m_xQueryBox->add_button(Translate::get(STR_OPENLOCKED_OPENREADONLY_BTN, rResLocale), RET_YES); - m_xQueryBox->add_button(Translate::get(STR_OPENLOCKED_OPENREADONLY_NOTIFY_BTN, rResLocale), RET_RETRY); - m_xQueryBox->add_button(Translate::get(STR_OPENLOCKED_OPENCOPY_BTN, rResLocale), RET_NO); - if (bEnableOverride && officecfg::Office::Common::Misc::AllowOverrideLocking::get()) + if (&rButton == mxOpenReadOnlyBtn.get()) + { + if (mxNotifyBtn->get_active()) + m_xDialog->response(RET_RETRY); + else + m_xDialog->response(RET_YES); + } + else if (&rButton == mxOpenCopyBtn.get()) + { + m_xDialog->response(RET_NO); + } + else if (&rButton == mxOpenBtn.get()) + { + m_xDialog->response(RET_IGNORE); + } + else if (&rButton == mxCancelBtn.get()) { - // Present option to ignore the (stale?) lock file and open the document - m_xQueryBox->add_button(Translate::get(STR_ALREADYOPEN_OPEN_BTN, rResLocale), RET_IGNORE); + m_xDialog->response(RET_CANCEL); } - m_xQueryBox->add_button(GetStandardText(StandardButtonType::Cancel), RET_CANCEL); +} + +OpenLockedQueryBox::OpenLockedQueryBox(weld::Window* pParent, const OUString& rHiddenData, bool bEnableOverride) + : GenericDialogController(pParent, "vcl/ui/openlockedquerybox.ui", "OpenLockedQueryBox") + , mxQuestionMarkImage(m_xBuilder->weld_image("questionmark")) + , mxOpenReadOnlyBtn(m_xBuilder->weld_button("readonly")) + , mxOpenCopyBtn(m_xBuilder->weld_button("opencopy")) + , mxOpenBtn(m_xBuilder->weld_button("open")) + , mxCancelBtn(m_xBuilder->weld_button("cancel")) + , mxNotifyBtn(m_xBuilder->weld_check_button("notify")) + , mxHiddenText(m_xBuilder->weld_label("hiddentext")) +{ + //set up the image + mxQuestionMarkImage->set_from_icon_name(u"vcl/res/help.png"); + + //setup click hdl + mxOpenReadOnlyBtn->connect_clicked(LINK(this, OpenLockedQueryBox, ClickHdl)); + mxOpenCopyBtn->connect_clicked(LINK(this, OpenLockedQueryBox, ClickHdl)); + mxOpenBtn->connect_clicked(LINK(this, OpenLockedQueryBox, ClickHdl)); + mxCancelBtn->connect_clicked(LINK(this, OpenLockedQueryBox, ClickHdl)); + + if (!(bEnableOverride && officecfg::Office::Common::Misc::AllowOverrideLocking::get())) + { + //disable option to ignore the (stale?) lock file and open the document + mxOpenBtn->set_sensitive(false); + } + + mxHiddenText->set_label(rHiddenData); + m_xDialog->set_centered_on_parent(true); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/uui/source/openlocked.hxx b/uui/source/openlocked.hxx index 178269a62b35..90357651f30d 100644 --- a/uui/source/openlocked.hxx +++ b/uui/source/openlocked.hxx @@ -20,15 +20,32 @@ #include <vcl/weld.hxx> -class OpenLockedQueryBox +namespace vcl { -private: - std::unique_ptr<weld::MessageDialog> m_xQueryBox; +class OpenLockedQueryBox; +} +namespace vcl +{ +class OpenLockedQueryBox final : public weld::GenericDialogController +{ public: - OpenLockedQueryBox(weld::Window* pParent, const std::locale& rResLocale, - const OUString& rMessage, bool bEnableOverride); - short run() { return m_xQueryBox->run(); } -}; + OpenLockedQueryBox(weld::Window* pParent, const OUString& rHiddenData, bool bEnableOverride); + +private: + std::unique_ptr<weld::Image> mxQuestionMarkImage; + + std::unique_ptr<weld::Button> mxOpenReadOnlyBtn; + std::unique_ptr<weld::Button> mxOpenCopyBtn; + std::unique_ptr<weld::Button> mxOpenBtn; + std::unique_ptr<weld::Button> mxCancelBtn; + + std::unique_ptr<weld::CheckButton> mxNotifyBtn; + std::unique_ptr<weld::Label> mxHiddenText; + + DECL_LINK(ClickHdl, weld::Button&, void); + DECL_LINK(ToggleHdl, weld::Toggleable&, void); +}; +} /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/UIConfig_vcl.mk b/vcl/UIConfig_vcl.mk index 703cef1e6e1c..10a823cc87b2 100644 --- a/vcl/UIConfig_vcl.mk +++ b/vcl/UIConfig_vcl.mk @@ -29,6 +29,7 @@ $(eval $(call gb_UIConfig_add_uifiles,vcl,\ vcl/uiconfig/ui/querydialog \ vcl/uiconfig/ui/screenshotparent \ vcl/uiconfig/ui/wizard \ + vcl/uiconfig/ui/openlockedquerybox \ )) $(eval $(call gb_UIConfig_add_a11yerrors_uifiles,vcl,\ diff --git a/vcl/uiconfig/ui/openlockedquerybox.ui b/vcl/uiconfig/ui/openlockedquerybox.ui new file mode 100644 index 000000000000..6405faab53e3 --- /dev/null +++ b/vcl/uiconfig/ui/openlockedquerybox.ui @@ -0,0 +1,270 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.38.2 --> +<interface domain="vcl"> + <requires lib="gtk+" version="3.20"/> + <object class="GtkDialog" id="OpenLockedQueryBox"> + <property name="can-focus">False</property> + <property name="border-width">6</property> + <property name="title" translatable="yes" context="openlockedquerybox|OpenLockedQueryBox">Document in Use</property> + <property name="resizable">False</property> + <property name="modal">True</property> + <property name="destroy-with-parent">True</property> + <property name="type-hint">dialog</property> + <property name="urgency-hint">True</property> + <property name="gravity">north</property> + <child type="titlebar"> + <placeholder/> + </child> + <child internal-child="vbox"> + <object class="GtkBox" id="VerticalBox"> + <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="ButtonContainer"> + <property name="can-focus">False</property> + <property name="layout-style">end</property> + <child> + <object class="GtkButton" id="open"> + <property name="label" translatable="yes" context="stock">_Open</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="cancel"> + <property name="label" translatable="yes" context="stock">_Cancel</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">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack-type">end</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="MainPanel"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="spacing">24</property> + <child> + <object class="GtkImage" id="questionmark"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="halign">center</property> + <property name="valign">start</property> + <property name="margin-start">24</property> + <property name="margin-top">70</property> + <child internal-child="accessible"> + <object class="AtkObject" id="questionmark-atkobject"> + <property name="AtkObject::accessible-name" translatable="yes" context="openlockedquerybox|questionmark">Question mark image</property> + <property name="AtkObject::accessible-description" translatable="yes" context="openlockedquerybox|questionmark">Question mark icon for dialog box.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <!-- n-columns=2 n-rows=4 --> + <object class="GtkGrid"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-end">6</property> + <property name="margin-top">6</property> + <property name="row-spacing">18</property> + <property name="column-spacing">12</property> + <child> + <object class="GtkLabel" id="messagetext"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="openlockedquerybox|messagetext">This file has been locked by another user.</property> + <property name="width-chars">0</property> + <property name="max-width-chars">0</property> + <property name="xalign">0</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + <child internal-child="accessible"> + <object class="AtkObject" id="messagetext-atkobject"> + <property name="AtkObject::accessible-role">static</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">0</property> + <property name="width">2</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="ReadOnlyMessage"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="valign">start</property> + <property name="label" translatable="yes" context="openlockedquerybox|ReadOnlyMessage">You can open it read only and +receive a notification if ready.</property> + <property name="xalign">0</property> + <child internal-child="accessible"> + <object class="AtkObject" id="ReadOnlyMessage-atkobject"> + <property name="AtkObject::accessible-role">static</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">1</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="OpenCopyMessage"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="openlockedquerybox|OpenCopyMessage">You can open a copy on your +local system.</property> + <property name="xalign">0</property> + <child internal-child="accessible"> + <object class="AtkObject" id="OpenCopyMessage-atkobject"> + <property name="AtkObject::accessible-role">static</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">2</property> + </packing> + </child> + <child> + <object class="GtkExpander" id="moredetailsexpander"> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="resize-toplevel">True</property> + <child> + <object class="GtkLabel" id="hiddentext"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="margin-top">10</property> + <property name="xalign">0</property> + <child internal-child="accessible"> + <object class="AtkObject" id="hiddentext-atkobject"> + <property name="AtkObject::accessible-role">static</property> + </object> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="expandertext"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="label" translatable="yes" context="openlockedquerybox|expandertext">_More Details</property> + <property name="use-underline">True</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + </child> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">3</property> + <property name="width">2</property> + </packing> + </child> + <child> + <object class="GtkButton" id="opencopy"> + <property name="label" translatable="yes" context="stock">Open Co_py</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="left-attach">1</property> + <property name="top-attach">2</property> + </packing> + </child> + <child> + <object class="GtkBox"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="orientation">vertical</property> + <property name="spacing">3</property> + <child> + <object class="GtkButton" id="readonly"> + <property name="label" translatable="yes" context="stock">Open _R/O</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">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="notify"> + <property name="label" translatable="yes" context="stock">_Notify</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">False</property> + <property name="use-underline">True</property> + <property name="draw-indicator">True</property> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="left-attach">1</property> + <property name="top-attach">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + <child internal-child="accessible"> + <object class="AtkObject" id="OpenLockedQueryBox-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="openlockedquerybox|OpenLockedQueryBox">Displays information about locked files and further steps to take when opening a locked file.</property> + </object> + </child> + </object> +</interface>