diff options
author | Jan-Marek Glogowski <jan-marek.glogowski@extern.cib.de> | 2019-11-21 17:16:28 +0100 |
---|---|---|
committer | Jan-Marek Glogowski <glogow@fbihome.de> | 2019-11-26 23:24:22 +0100 |
commit | ffa636ba74b04b3258ec9a696bc4eac33581fa24 (patch) | |
tree | 577a9ef9739e6ae7b1a470d08a5067b4aec5c340 /fpicker | |
parent | ec554ac30236fa7949e9866d01319d4e3e88c983 (diff) |
tdf#43021 WIN opt-out of OS recent folder usage
The Microsoft documentation for SetFolder explicitly mentiones
"In general, we do not recommended the use of this method. [...]
SetDefaultFolder is the better method." If SetDefaultFolder is
used the recently-used folder overwrites the value passed to
SetDefaultFolder, which is shared between all file pickers.
With this patch we rely on the LO internal mechanism to show the
last used directory in the file picker.
Regina's workaround basically does the same, as it just sets
oRegistryKeyContent.WorkPathChanged, which triggers the internal
path to use SetFolder instead of SetDefaultFolder.
If you're wondering about the GetFolder() handling, the MS API
docs have this: "Gets either the folder currently selected in the
dialog, or, if the dialog is not currently displayed, the folder
that is to be selected when the dialog is opened."
So the call to GetFolder(), after the dialog is closed, returns
the folder set by the SetFolder call, not the folder selected by
the user, in case of the save dialog at least.
Change-Id: Ia24f47848501df82727bfb2a99db723468bfe5b1
Reviewed-on: https://gerrit.libreoffice.org/83409
Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com>
Reviewed-by: Jan-Marek Glogowski <glogow@fbihome.de>
Tested-by: Jan-Marek Glogowski <glogow@fbihome.de>
Diffstat (limited to 'fpicker')
-rw-r--r-- | fpicker/source/win32/IVistaFilePickerInternalNotify.hxx | 2 | ||||
-rw-r--r-- | fpicker/source/win32/VistaFilePicker.cxx | 13 | ||||
-rw-r--r-- | fpicker/source/win32/VistaFilePickerEventHandler.cxx | 1 | ||||
-rw-r--r-- | fpicker/source/win32/VistaFilePickerImpl.cxx | 28 | ||||
-rw-r--r-- | fpicker/source/win32/VistaFilePickerImpl.hxx | 4 |
5 files changed, 20 insertions, 28 deletions
diff --git a/fpicker/source/win32/IVistaFilePickerInternalNotify.hxx b/fpicker/source/win32/IVistaFilePickerInternalNotify.hxx index 3501a37c94f9..57f995715719 100644 --- a/fpicker/source/win32/IVistaFilePickerInternalNotify.hxx +++ b/fpicker/source/win32/IVistaFilePickerInternalNotify.hxx @@ -46,6 +46,8 @@ class IVistaFilePickerInternalNotify virtual bool onFileTypeChanged( UINT nTypeIndex ) = 0; + virtual void onDirectoryChanged() = 0; + protected: ~IVistaFilePickerInternalNotify() {} }; diff --git a/fpicker/source/win32/VistaFilePicker.cxx b/fpicker/source/win32/VistaFilePicker.cxx index a7ded90f6d60..34b983c7ae51 100644 --- a/fpicker/source/win32/VistaFilePicker.cxx +++ b/fpicker/source/win32/VistaFilePicker.cxx @@ -169,22 +169,9 @@ void SAL_CALL VistaFilePicker::setDisplayDirectory(const OUString& sDirectory) { ensureInit(); - bool bChanged = officecfg::Office::Common::Path::Info::WorkPathChanged::get( - comphelper::getComponentContext(m_xSMGR)); - if (bChanged ) - { - std::shared_ptr< comphelper::ConfigurationChanges > batch( - comphelper::ConfigurationChanges::create( - comphelper::getComponentContext(m_xSMGR))); - officecfg::Office::Common::Path::Info::WorkPathChanged::set( - false, batch); - batch->commit(); - } - RequestRef rRequest(new Request()); rRequest->setRequest (VistaFilePickerImpl::E_SET_DIRECTORY); rRequest->setArgument(PROP_DIRECTORY, sDirectory); - rRequest->setArgument(PROP_FORCE, bChanged); m_aAsyncExecute.triggerRequestThreadAware(rRequest, AsyncRequests::NON_BLOCKED); } diff --git a/fpicker/source/win32/VistaFilePickerEventHandler.cxx b/fpicker/source/win32/VistaFilePickerEventHandler.cxx index e770bef25406..b9ac5a3d28b8 100644 --- a/fpicker/source/win32/VistaFilePickerEventHandler.cxx +++ b/fpicker/source/win32/VistaFilePickerEventHandler.cxx @@ -111,6 +111,7 @@ STDMETHODIMP VistaFilePickerEventHandler::OnFolderChanging(IFileDialog* /*pDialo STDMETHODIMP VistaFilePickerEventHandler::OnFolderChange(IFileDialog* /*pDialog*/) { impl_sendEvent(E_DIRECTORY_CHANGED, 0); + m_pInternalNotify->onDirectoryChanged(); return S_OK; } diff --git a/fpicker/source/win32/VistaFilePickerImpl.cxx b/fpicker/source/win32/VistaFilePickerImpl.cxx index ba20ef75e64f..b4829126a0f6 100644 --- a/fpicker/source/win32/VistaFilePickerImpl.cxx +++ b/fpicker/source/win32/VistaFilePickerImpl.cxx @@ -756,7 +756,6 @@ void VistaFilePickerImpl::impl_sta_SetFileName(const RequestRef& rRequest) void VistaFilePickerImpl::impl_sta_SetDirectory(const RequestRef& rRequest) { OUString sDirectory = rRequest->getArgumentOrDefault(PROP_DIRECTORY, OUString()); - bool bForce = rRequest->getArgumentOrDefault(PROP_FORCE, false); if( !m_bInExecute) { @@ -778,27 +777,25 @@ void VistaFilePickerImpl::impl_sta_SetDirectory(const RequestRef& rRequest) if ( !createFolderItem(sDirectory, pFolder) ) return; - if ( m_bInExecute || bForce ) - iDialog->SetFolder(pFolder); - else - { - // Use set default folder as Microsoft recommends in the IFileDialog documentation. - iDialog->SetDefaultFolder(pFolder); - } + iDialog->SetFolder(pFolder); } -void VistaFilePickerImpl::impl_sta_GetDirectory(const RequestRef& rRequest) +OUString VistaFilePickerImpl::GetDirectory() { TFileDialog iDialog = impl_getBaseDialogInterface(); ComPtr< IShellItem > pFolder; HRESULT hResult = iDialog->GetFolder( &pFolder ); if ( FAILED(hResult) ) - return; - OUString sFolder = lcl_getURLFromShellItem ( pFolder ); - if( sFolder.getLength()) - rRequest->setArgument( PROP_DIRECTORY, sFolder ); + return OUString(); + return lcl_getURLFromShellItem(pFolder); } +void VistaFilePickerImpl::impl_sta_GetDirectory(const RequestRef& rRequest) +{ + const OUString sFolder = m_sDirectory.isEmpty() ? GetDirectory() : m_sDirectory; + if (!sFolder.isEmpty()) + rRequest->setArgument(PROP_DIRECTORY, sFolder); +} void VistaFilePickerImpl::impl_sta_SetDefaultName(const RequestRef& rRequest) { @@ -1324,6 +1321,11 @@ bool VistaFilePickerImpl::onFileTypeChanged( UINT /*nTypeIndex*/ ) return true; } +void VistaFilePickerImpl::onDirectoryChanged() +{ + m_sDirectory = GetDirectory(); +} + } // namespace vista } // namespace win32 } // namespace fpicker diff --git a/fpicker/source/win32/VistaFilePickerImpl.hxx b/fpicker/source/win32/VistaFilePickerImpl.hxx index 9cce75b5714f..e5d2d88e4391 100644 --- a/fpicker/source/win32/VistaFilePickerImpl.hxx +++ b/fpicker/source/win32/VistaFilePickerImpl.hxx @@ -71,7 +71,6 @@ static const OUString PROP_FEATURES("features" ); // [sal_Int32] static const OUString PROP_TEMPLATE_DESCR("templatedescription"); // [sal_Int32] static const OUString PROP_FILTER_TITLE("filter_title" ); // [OUString] static const OUString PROP_FILTER_VALUE("filter_value" ); // [OUString] -static const OUString PROP_FORCE("force" ); // [sal_Bool] static const OUString PROP_FILTER_GROUP("filter-group" ); // [seq< css:beans::StringPair >] contains a group of filters static const OUString PROP_CONTROL_ID("control_id" ); // [sal_Int16] @@ -147,9 +146,10 @@ class VistaFilePickerImpl : private ::cppu::BaseMutex virtual void onAutoExtensionChanged (bool bChecked) override; virtual bool onFileTypeChanged( UINT nTypeIndex ) override; + virtual void onDirectoryChanged() override; private: - + OUString GetDirectory(); /// implementation of request E_ADD_FILEPICKER_LISTENER void impl_sta_addFilePickerListener(const RequestRef& rRequest); |