fix for fdo#61801

... "crash on Tools - Options - LibreOffice - Personalization - Select Background Image"

The root cause of this is my conversion of the UNO code to use the
new-style FilePicker service constructor in commit
4b51374a70

Unfortunately, the new-style service constructor will always call
initialize(Sequence<Any>), which the old code did not do.
And initialize does not like being called without any arguments.

The cleanest fix for this is to simply remove the createDefault()
service constructor method and make all the call sites explicitly
choose the style of FilePicker dialog they want.

As a bonus, this simplifies some of the call sites.

Change-Id: I75f5e03cff4e39abe22cd9650a079ec78ab636c4
Reviewed-on: https://gerrit.libreoffice.org/2553
Reviewed-by: Kohei Yoshida <kohei.yoshida@gmail.com>
Reviewed-by: Stephan Bergmann <sbergman@redhat.com>
Tested-by: Stephan Bergmann <sbergman@redhat.com>
This commit is contained in:
Noel Grandin 2013-03-05 11:34:53 +02:00 committed by Stephan Bergmann
parent b3876e1dc9
commit 3554b36530
5 changed files with 17 additions and 23 deletions

View file

@ -25,6 +25,7 @@
#include <com/sun/star/ui/dialogs/ExecutableDialogResults.hpp>
#include <com/sun/star/ui/dialogs/ExtendedFilePickerElementIds.hpp>
#include <com/sun/star/ui/dialogs/FilePicker.hpp>
#include <com/sun/star/ui/dialogs/TemplateDescription.hpp>
#include <com/sun/star/ui/dialogs/XFilePickerControlAccess.hpp>
#include <com/sun/star/ui/dialogs/XFilterManager.hpp>
@ -211,7 +212,7 @@ IMPL_LINK( SvxPersonalizationTabPage, SelectBackground, PushButton*, /*pButton*/
{
uno::Reference< uno::XComponentContext > xContext( ::comphelper::getProcessComponentContext() );
uno::Reference< ui::dialogs::XFilePicker3 > xFilePicker = ui::dialogs::FilePicker::createDefault(xContext);
uno::Reference< ui::dialogs::XFilePicker3 > xFilePicker = ui::dialogs::FilePicker::createWithMode(xContext, ui::dialogs::TemplateDescription::FILEOPEN_SIMPLE);
xFilePicker->setMultiSelectionMode( false );

View file

@ -38,7 +38,6 @@ module com { module sun { module star { module ui { module dialogs {
published service FilePicker : XFilePicker3
{
createDefault();
/** Provides the ability to choose between different custom templates that
do extend the subset of common controls a FilePicker usually supports.

View file

@ -27,6 +27,7 @@
#include <com/sun/star/lang/XMultiServiceFactory.hpp>
#include <com/sun/star/ui/dialogs/FilePicker.hpp>
#include <com/sun/star/ui/dialogs/ExecutableDialogResults.hpp>
#include <com/sun/star/ui/dialogs/TemplateDescription.hpp>
using namespace com::sun::star;
@ -177,7 +178,7 @@ void ScXMLSourceDlg::SelectSourceFile()
if (!xServiceMgr.is())
return;
uno::Reference<ui::dialogs::XFilePicker3> xFilePicker = ui::dialogs::FilePicker::createDefault( comphelper::getComponentContext(xServiceMgr) );
uno::Reference<ui::dialogs::XFilePicker3> xFilePicker = ui::dialogs::FilePicker::createWithMode( comphelper::getComponentContext(xServiceMgr), ui::dialogs::TemplateDescription::FILEOPEN_SIMPLE );
if (maSrcPath.isEmpty())
// Use default path.

View file

@ -21,6 +21,7 @@
// this file contains code from filectrl.cxx which needs to be compiled with enabled exception hanling
#include <svtools/filectrl.hxx>
#include <com/sun/star/ui/dialogs/FilePicker.hpp>
#include <com/sun/star/ui/dialogs/TemplateDescription.hpp>
#include <comphelper/processfactory.hxx>
#include <tools/urlobj.hxx>
#include <osl/file.h>
@ -37,7 +38,7 @@ void FileControl::ImplBrowseFile( )
XubString aNewText;
Reference< XComponentContext > xContext = comphelper::getProcessComponentContext();
Reference < dialogs::XFilePicker3 > xFilePicker = dialogs::FilePicker::createDefault( xContext );
Reference < dialogs::XFilePicker3 > xFilePicker = dialogs::FilePicker::createWithMode( xContext, dialogs::TemplateDescription::FILEOPEN_SIMPLE );
// transform the system notation text into a file URL
::rtl::OUString sSystemNotation = GetText(), sFileURL;
oslFileError nError = osl_getFileURLFromSystemPath( sSystemNotation.pData, &sFileURL.pData );

View file

@ -1601,27 +1601,19 @@ sal_Bool WinSalPrinter::StartJob( const rtl::OUString* pFileName,
{
uno::Reference< uno::XComponentContext > xContext( ::comphelper::getProcessComponentContext() );
uno::Reference< XFilePicker3 > xFilePicker = FilePicker::createDefault(xContext);
uno::Reference< XFilePicker3 > xFilePicker = FilePicker::createWithMode(xContext, TemplateDescription::FILESAVE_SIMPLE);
uno::Reference< XInitialization > xInit( xFilePicker, UNO_QUERY );
uno::Reference< XFilterManager > xFilterMgr( xFilePicker, UNO_QUERY );
if( xInit.is() && xFilePicker.is() && xFilterMgr.is() )
if( xFilePicker->execute() == ExecutableDialogResults::OK )
{
Sequence< Any > aServiceType( 1 );
aServiceType[0] <<= TemplateDescription::FILESAVE_SIMPLE;
xInit->initialize( aServiceType );
if( xFilePicker->execute() == ExecutableDialogResults::OK )
{
Sequence< OUString > aPathSeq( xFilePicker->getFiles() );
INetURLObject aObj( aPathSeq[0] );
// we're using ansi calls (StartDocA) so convert the string
aOutFileName = aObj.PathToFileName();
}
else
{
mnError = SAL_PRINTER_ERROR_ABORT;
return FALSE;
}
Sequence< OUString > aPathSeq( xFilePicker->getFiles() );
INetURLObject aObj( aPathSeq[0] );
// we're using ansi calls (StartDocA) so convert the string
aOutFileName = aObj.PathToFileName();
}
else
{
mnError = SAL_PRINTER_ERROR_ABORT;
return FALSE;
}
}