summaryrefslogtreecommitdiff
path: root/fpicker
diff options
context:
space:
mode:
authorJan-Marek Glogowski <jan-marek.glogowski@extern.cib.de>2019-11-21 17:16:28 +0100
committerJan-Marek Glogowski <glogow@fbihome.de>2019-11-27 21:51:31 +0100
commita20e061d0a54e027a9cf3702fdc88b94e9ec8c18 (patch)
treeacb41b4fbd805b92c4deeab2ac4e0fffed294094 /fpicker
parenta83759f4909190974ed07291c6a3a9ef837e834d (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> (cherry picked from commit ffa636ba74b04b3258ec9a696bc4eac33581fa24) Reviewed-on: https://gerrit.libreoffice.org/83839 Tested-by: Jenkins
Diffstat (limited to 'fpicker')
-rw-r--r--fpicker/source/win32/IVistaFilePickerInternalNotify.hxx2
-rw-r--r--fpicker/source/win32/VistaFilePicker.cxx13
-rw-r--r--fpicker/source/win32/VistaFilePickerEventHandler.cxx1
-rw-r--r--fpicker/source/win32/VistaFilePickerImpl.cxx28
-rw-r--r--fpicker/source/win32/VistaFilePickerImpl.hxx4
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 1899f6addfc9..3c3286fe2f14 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);