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>
This commit is contained in:
committed by
Jan-Marek Glogowski
parent
ec554ac302
commit
ffa636ba74
@@ -449,14 +449,6 @@ void SvxPathTabPage::ChangeCurrentEntry( const OUString& _rFolder )
|
||||
// Reset also last used dir in the sfx application instance
|
||||
SfxApplication *pSfxApp = SfxGetpApp();
|
||||
pSfxApp->ResetLastDir();
|
||||
|
||||
// Set configuration flag to notify file picker that it's necessary
|
||||
// to take over the path provided.
|
||||
std::shared_ptr< comphelper::ConfigurationChanges > batch(
|
||||
comphelper::ConfigurationChanges::create());
|
||||
officecfg::Office::Common::Path::Info::WorkPathChanged::set(
|
||||
true, batch);
|
||||
batch->commit();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -46,6 +46,8 @@ class IVistaFilePickerInternalNotify
|
||||
|
||||
virtual bool onFileTypeChanged( UINT nTypeIndex ) = 0;
|
||||
|
||||
virtual void onDirectoryChanged() = 0;
|
||||
|
||||
protected:
|
||||
~IVistaFilePickerInternalNotify() {}
|
||||
};
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -1560,18 +1560,6 @@
|
||||
<desc>Contains the current and default path settings used by the
|
||||
Office.</desc>
|
||||
</info>
|
||||
<group oor:name="Info">
|
||||
<info>
|
||||
<desc>Contains various properties information purpose only.</desc>
|
||||
</info>
|
||||
<prop oor:name="WorkPathChanged" oor:type="xs:boolean" oor:nillable="false">
|
||||
<info>
|
||||
<desc>A flag which is set by the tools options dialog whenever a
|
||||
user changed the work path.</desc>
|
||||
</info>
|
||||
<value>true</value>
|
||||
</prop>
|
||||
</group>
|
||||
<group oor:name="Current">
|
||||
<info>
|
||||
<desc>Contains the global path settings, mainly those of the Options
|
||||
|
||||
Reference in New Issue
Block a user