diff options
author | Mike Kaganski <mike.kaganski@collabora.com> | 2019-11-15 12:14:31 +0300 |
---|---|---|
committer | Mike Kaganski <mike.kaganski@collabora.com> | 2019-11-16 13:00:51 +0100 |
commit | ae71570ee7db0a4a9d237424ed2cc3204e86f136 (patch) | |
tree | 4adc7fc61b3d98fa873414f566a20d89cc99a301 /cui | |
parent | 03feda2465c7a18d6bac5781510ace2eabc40379 (diff) |
tdf#44462: add a link to Windows Default apps settings applet
Add "Windows Default apps" button to Options->General to run system applet
to control file associations, in accordance to recommendation from MS [1].
On Windows 10, though, the call to LaunchAdvancedAssociationUI would only
bring a system-modal infobanner suggesting the user to go to Settings >
Apps > Default apps, as documented at [2]. Since this is what MS considers
the correct way to manage application associations, the infobanner should
be enough.
[1] https://docs.microsoft.com/en-us/windows/win32/shell/default-programs
[2] https://docs.microsoft.com/en-us/windows/win32/api/shobjidl/nf-shobjidl-iapplicationassociationregistrationui-launchadvancedassociationui
Change-Id: I79cccdd00afac998c028b8e151db66bbd75be985
Reviewed-on: https://gerrit.libreoffice.org/82777
Tested-by: Jenkins
Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com>
Diffstat (limited to 'cui')
-rw-r--r-- | cui/Library_cui.mk | 1 | ||||
-rw-r--r-- | cui/source/options/optgdlg.cxx | 39 | ||||
-rw-r--r-- | cui/source/options/optgdlg.hxx | 7 | ||||
-rw-r--r-- | cui/uiconfig/ui/optgeneralpage.ui | 51 |
4 files changed, 98 insertions, 0 deletions
diff --git a/cui/Library_cui.mk b/cui/Library_cui.mk index e45e35a8f0e3..27d89ec1c3b6 100644 --- a/cui/Library_cui.mk +++ b/cui/Library_cui.mk @@ -87,6 +87,7 @@ ifeq ($(OS),WNT) $(eval $(call gb_Library_use_system_win32_libs,cui,\ advapi32 \ shlwapi \ + ole32 \ )) endif diff --git a/cui/source/options/optgdlg.cxx b/cui/source/options/optgdlg.cxx index 3079b2c92c2c..597d75358d1c 100644 --- a/cui/source/options/optgdlg.cxx +++ b/cui/source/options/optgdlg.cxx @@ -81,6 +81,12 @@ #include <svtools/restartdialog.hxx> #include <svtools/imgdef.hxx> +#if defined(_WIN32) +#include <o3tl/char16_t2wchar_t.hxx> +#include <prewin.h> +#include <shobjidl.h> +#include <postwin.h> +#endif using namespace ::com::sun::star::uno; using namespace ::com::sun::star::lang; using namespace ::com::sun::star::beans; @@ -248,6 +254,10 @@ OfaMiscTabPage::OfaMiscTabPage(weld::Container* pPage, weld::DialogController* p #else , m_xQuickLaunchCB(m_xBuilder->weld_check_button("quicklaunch")) #endif +#if defined(_WIN32) + , m_xFileAssocFrame(m_xBuilder->weld_widget("fileassoc")) + , m_xFileAssocBtn(m_xBuilder->weld_button("assocfiles")) +#endif { if (!lcl_HasSystemFilePicker()) m_xFileDlgFrame->hide(); @@ -273,6 +283,11 @@ OfaMiscTabPage::OfaMiscTabPage(weld::Container* pPage, weld::DialogController* p m_xQuickStarterFrame->hide(); #endif +#if defined(_WIN32) + m_xFileAssocFrame->show(); + m_xFileAssocBtn->connect_clicked(LINK(this, OfaMiscTabPage, FileAssocClick)); +#endif + m_aStrDateInfo = m_xToYearFT->get_label(); m_xYearValueField->connect_value_changed( LINK( this, OfaMiscTabPage, TwoFigureHdl ) ); @@ -427,6 +442,30 @@ IMPL_LINK_NOARG( OfaMiscTabPage, TwoFigureHdl, weld::SpinButton&, void ) m_xToYearFT->set_label( aOutput ); } +#if defined(_WIN32) +IMPL_LINK_NOARG(OfaMiscTabPage, FileAssocClick, weld::Button&, void) +{ + const bool bUninit = SUCCEEDED(CoInitialize(nullptr)); + IApplicationAssociationRegistrationUI* pIf = nullptr; + HRESULT res = CoCreateInstance(CLSID_ApplicationAssociationRegistrationUI, 0, + CLSCTX_INPROC_SERVER, IID_IApplicationAssociationRegistrationUI, + reinterpret_cast<LPVOID*>(&pIf)); + + if (SUCCEEDED(res) && pIf) + { + // LaunchAdvancedAssociationUI only works for applications registered under + // Software\RegisteredApplications. See scp2/source/ooo/registryitem_ooo.scp + const OUString expanded = Translate::ExpandVariables("%PRODUCTNAME %PRODUCTVERSION"); + // This will only show "To change your default apps, go to Settings > Apps > Default apps" + // on Win10; this is expected. At least this will self-document it to users. + pIf->LaunchAdvancedAssociationUI(o3tl::toW(expanded.getStr())); + pIf->Release(); + } + if (bUninit) + CoUninitialize(); +} +#endif + class CanvasSettings { public: diff --git a/cui/source/options/optgdlg.hxx b/cui/source/options/optgdlg.hxx index 5c591e7c876f..392554f6e8dd 100644 --- a/cui/source/options/optgdlg.hxx +++ b/cui/source/options/optgdlg.hxx @@ -54,8 +54,15 @@ private: std::unique_ptr<weld::CheckButton> m_xCrashReport; std::unique_ptr<weld::Widget> m_xQuickStarterFrame; std::unique_ptr<weld::CheckButton> m_xQuickLaunchCB; +#if defined(_WIN32) + std::unique_ptr<weld::Widget> m_xFileAssocFrame; + std::unique_ptr<weld::Button> m_xFileAssocBtn; +#endif DECL_LINK(TwoFigureHdl, weld::SpinButton&, void); +#if defined(_WIN32) + DECL_LINK(FileAssocClick, weld::Button&, void); +#endif protected: virtual DeactivateRC DeactivatePage( SfxItemSet* pSet ) override; diff --git a/cui/uiconfig/ui/optgeneralpage.ui b/cui/uiconfig/ui/optgeneralpage.ui index dc1fa2231ecf..87ff247ffdf1 100644 --- a/cui/uiconfig/ui/optgeneralpage.ui +++ b/cui/uiconfig/ui/optgeneralpage.ui @@ -450,5 +450,56 @@ <property name="top_attach">6</property> </packing> </child> + <child> + <object class="GtkFrame" id="fileassoc"> + <property name="can_focus">False</property> + <property name="label_xalign">0</property> + <property name="shadow_type">none</property> + <child> + <object class="GtkAlignment" id="alignment8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="top_padding">6</property> + <property name="left_padding">12</property> + <child> + <object class="GtkGrid" id="grid8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="row_spacing">6</property> + <child> + <object class="GtkButton" id="assocfiles"> + <property name="visible">True</property> + <property name="label" translatable="yes" context="optgeneralpage|fileassoc">Windows Default apps</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="no_show_all">True</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + </object> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="label9"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes" context="optgeneralpage|fileassoc">%PRODUCTNAME File Associations</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> + </object> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">7</property> + </packing> + </child> </object> </interface> |