xref: /trunk/main/sfx2/source/dialog/filedlghelper.cxx (revision cf6516809c57e1bb0a940545cca99cdad54d4ce2)
1d119d52dSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3d119d52dSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4d119d52dSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5d119d52dSAndrew Rist  * distributed with this work for additional information
6d119d52dSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7d119d52dSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8d119d52dSAndrew Rist  * "License"); you may not use this file except in compliance
9d119d52dSAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
11d119d52dSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
13d119d52dSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14d119d52dSAndrew Rist  * software distributed under the License is distributed on an
15d119d52dSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16d119d52dSAndrew Rist  * KIND, either express or implied.  See the License for the
17d119d52dSAndrew Rist  * specific language governing permissions and limitations
18d119d52dSAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
20d119d52dSAndrew Rist  *************************************************************/
21d119d52dSAndrew Rist 
22cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
23cdf0e10cSrcweir #include "precompiled_sfx2.hxx"
2445fd3b9aSArmin Le Grand 
25cdf0e10cSrcweir #include <sfx2/filedlghelper.hxx>
26cdf0e10cSrcweir #include <sal/types.h>
27cdf0e10cSrcweir #include <com/sun/star/lang/XInitialization.hpp>
28cdf0e10cSrcweir #include <com/sun/star/ui/dialogs/CommonFilePickerElementIds.hpp>
29cdf0e10cSrcweir #include <com/sun/star/ui/dialogs/ExecutableDialogResults.hpp>
30cdf0e10cSrcweir #include <com/sun/star/ui/dialogs/ExtendedFilePickerElementIds.hpp>
31cdf0e10cSrcweir #include <com/sun/star/ui/dialogs/FilePreviewImageFormats.hpp>
32cdf0e10cSrcweir #include <com/sun/star/ui/dialogs/ControlActions.hpp>
33cdf0e10cSrcweir #include <com/sun/star/ui/dialogs/TemplateDescription.hpp>
34cdf0e10cSrcweir #include <com/sun/star/ui/dialogs/XControlInformation.hpp>
35cdf0e10cSrcweir #include <com/sun/star/ui/dialogs/XFilePickerControlAccess.hpp>
36cdf0e10cSrcweir #include <com/sun/star/ui/dialogs/XFilePickerNotifier.hpp>
37cdf0e10cSrcweir #include <com/sun/star/ui/dialogs/XFilePreview.hpp>
38cdf0e10cSrcweir #include <com/sun/star/ui/dialogs/XFilterManager.hpp>
39cdf0e10cSrcweir #include <com/sun/star/ui/dialogs/XFilterGroupManager.hpp>
40cdf0e10cSrcweir #include <com/sun/star/ui/dialogs/XFolderPicker.hpp>
41cdf0e10cSrcweir #include <com/sun/star/ui/dialogs/XFilePicker2.hpp>
42cdf0e10cSrcweir #include <com/sun/star/ui/dialogs/XAsynchronousExecutableDialog.hpp>
43cdf0e10cSrcweir #include <com/sun/star/lang/XServiceInfo.hpp>
44cdf0e10cSrcweir #include <com/sun/star/beans/XPropertySet.hpp>
45cdf0e10cSrcweir #include <com/sun/star/beans/NamedValue.hpp>
46cdf0e10cSrcweir #include <com/sun/star/embed/ElementModes.hpp>
47cdf0e10cSrcweir #include <com/sun/star/container/XEnumeration.hpp>
48cdf0e10cSrcweir #include <com/sun/star/container/XContainerQuery.hpp>
49cdf0e10cSrcweir #include <com/sun/star/task/XInteractionRequest.hpp>
50cdf0e10cSrcweir #include <com/sun/star/ucb/InteractiveAugmentedIOException.hpp>
51cdf0e10cSrcweir 
52cdf0e10cSrcweir #include <comphelper/processfactory.hxx>
53cdf0e10cSrcweir #include <comphelper/types.hxx>
54cdf0e10cSrcweir #include <comphelper/sequenceashashmap.hxx>
55cdf0e10cSrcweir #include <comphelper/stillreadwriteinteraction.hxx>
56cdf0e10cSrcweir #include <tools/urlobj.hxx>
57cdf0e10cSrcweir #include <vcl/help.hxx>
58cdf0e10cSrcweir #include <unotools/ucbstreamhelper.hxx>
59cdf0e10cSrcweir #include <unotools/ucbhelper.hxx>
60cdf0e10cSrcweir #include <unotools/localfilehelper.hxx>
61cdf0e10cSrcweir #include <vos/thread.hxx>
62cdf0e10cSrcweir #include <vos/mutex.hxx>
63cdf0e10cSrcweir #include <vos/security.hxx>
64cdf0e10cSrcweir #include <vcl/cvtgrf.hxx>
65cdf0e10cSrcweir #include <vcl/msgbox.hxx>
66cdf0e10cSrcweir #include <vcl/mnemonic.hxx>
67cdf0e10cSrcweir #include <unotools/pathoptions.hxx>
68cdf0e10cSrcweir #include <unotools/securityoptions.hxx>
69cdf0e10cSrcweir #include <svl/itemset.hxx>
70cdf0e10cSrcweir #include <svl/eitem.hxx>
71cdf0e10cSrcweir #include <svl/intitem.hxx>
72cdf0e10cSrcweir #include <svl/stritem.hxx>
73cdf0e10cSrcweir #include <svtools/filter.hxx>
74cdf0e10cSrcweir #include <unotools/viewoptions.hxx>
75cdf0e10cSrcweir #include <unotools/moduleoptions.hxx>
76cdf0e10cSrcweir #include <svtools/helpid.hrc>
77cdf0e10cSrcweir #include <comphelper/docpasswordrequest.hxx>
78cdf0e10cSrcweir #include <comphelper/docpasswordhelper.hxx>
79cdf0e10cSrcweir #include <ucbhelper/content.hxx>
80cdf0e10cSrcweir #include <ucbhelper/commandenvironment.hxx>
81cdf0e10cSrcweir #include <comphelper/storagehelper.hxx>
82cdf0e10cSrcweir #include <toolkit/helper/vclunohelper.hxx>
83cdf0e10cSrcweir #include <sfx2/app.hxx>
84cdf0e10cSrcweir #include <sfx2/frame.hxx>
85cdf0e10cSrcweir #include <sfx2/docfile.hxx>
86cdf0e10cSrcweir #include <sfx2/docfac.hxx>
87cdf0e10cSrcweir #include "openflag.hxx"
88cdf0e10cSrcweir #include <sfx2/passwd.hxx>
89cdf0e10cSrcweir #include "sfx2/sfxresid.hxx"
90cdf0e10cSrcweir #include <sfx2/sfxsids.hrc>
91cdf0e10cSrcweir #include "filedlghelper.hrc"
92cdf0e10cSrcweir #include "filtergrouping.hxx"
93cdf0e10cSrcweir #include <sfx2/request.hxx>
94cdf0e10cSrcweir #include "filedlgimpl.hxx"
95cdf0e10cSrcweir #include <helpid.hrc>
96cdf0e10cSrcweir #include <sfxlocal.hrc>
9745fd3b9aSArmin Le Grand #include <vcl/dibtools.hxx>
98cdf0e10cSrcweir 
99cdf0e10cSrcweir //-----------------------------------------------------------------------------
100cdf0e10cSrcweir 
101cdf0e10cSrcweir using namespace ::com::sun::star;
102cdf0e10cSrcweir using namespace ::com::sun::star::container;
103cdf0e10cSrcweir using namespace ::com::sun::star::lang;
104cdf0e10cSrcweir using namespace ::com::sun::star::ui::dialogs;
105cdf0e10cSrcweir using namespace ::com::sun::star::ui::dialogs::TemplateDescription;
106cdf0e10cSrcweir using namespace ::com::sun::star::uno;
107cdf0e10cSrcweir using namespace ::com::sun::star::beans;
108cdf0e10cSrcweir using namespace ::rtl;
109cdf0e10cSrcweir using namespace ::cppu;
110cdf0e10cSrcweir 
111cdf0e10cSrcweir //-----------------------------------------------------------------------------
112cdf0e10cSrcweir 
113cdf0e10cSrcweir #define IODLG_CONFIGNAME        String(DEFINE_CONST_UNICODE("FilePicker_Save"))
114cdf0e10cSrcweir #define IMPGRF_CONFIGNAME       String(DEFINE_CONST_UNICODE("FilePicker_Graph"))
115cdf0e10cSrcweir #define USERITEM_NAME           ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "UserItem" ))
116cdf0e10cSrcweir 
117cdf0e10cSrcweir //-----------------------------------------------------------------------------
118cdf0e10cSrcweir 
119cdf0e10cSrcweir namespace sfx2
120cdf0e10cSrcweir {
121cdf0e10cSrcweir 
GetLastFilterConfigId(FileDialogHelper::Context _eContext)122cdf0e10cSrcweir const OUString* GetLastFilterConfigId( FileDialogHelper::Context _eContext )
123cdf0e10cSrcweir {
124cdf0e10cSrcweir     static const OUString aSD_EXPORT_IDENTIFIER( RTL_CONSTASCII_USTRINGPARAM( "SdExportLastFilter" ) );
125cdf0e10cSrcweir     static const OUString aSI_EXPORT_IDENTIFIER( RTL_CONSTASCII_USTRINGPARAM( "SiExportLastFilter" ) );
126cdf0e10cSrcweir     static const OUString aSW_EXPORT_IDENTIFIER( RTL_CONSTASCII_USTRINGPARAM( "SwExportLastFilter" ) );
127cdf0e10cSrcweir 
128cdf0e10cSrcweir     const OUString* pRet = NULL;
129cdf0e10cSrcweir 
130cdf0e10cSrcweir     switch( _eContext )
131cdf0e10cSrcweir     {
132cdf0e10cSrcweir         case FileDialogHelper::SD_EXPORT: pRet = &aSD_EXPORT_IDENTIFIER; break;
133cdf0e10cSrcweir         case FileDialogHelper::SI_EXPORT: pRet = &aSI_EXPORT_IDENTIFIER; break;
134cdf0e10cSrcweir         case FileDialogHelper::SW_EXPORT: pRet = &aSW_EXPORT_IDENTIFIER; break;
135cdf0e10cSrcweir         default: break;
136cdf0e10cSrcweir     }
137cdf0e10cSrcweir 
138cdf0e10cSrcweir     return pRet;
139cdf0e10cSrcweir }
140cdf0e10cSrcweir 
141cdf0e10cSrcweir String EncodeSpaces_Impl( const String& rSource );
142cdf0e10cSrcweir String DecodeSpaces_Impl( const String& rSource );
143cdf0e10cSrcweir 
144cdf0e10cSrcweir // ------------------------------------------------------------------------
145cdf0e10cSrcweir // -----------      FileDialogHelper_Impl       ---------------------------
146cdf0e10cSrcweir // ------------------------------------------------------------------------
147cdf0e10cSrcweir 
148cdf0e10cSrcweir // ------------------------------------------------------------------------
149cdf0e10cSrcweir // XFilePickerListener Methods
150cdf0e10cSrcweir // ------------------------------------------------------------------------
fileSelectionChanged(const FilePickerEvent & aEvent)151cdf0e10cSrcweir void SAL_CALL FileDialogHelper_Impl::fileSelectionChanged( const FilePickerEvent& aEvent ) throw ( RuntimeException )
152cdf0e10cSrcweir {
153cdf0e10cSrcweir     ::vos::OGuard aGuard( Application::GetSolarMutex() );
154cdf0e10cSrcweir     mpAntiImpl->FileSelectionChanged( aEvent );
155cdf0e10cSrcweir }
156cdf0e10cSrcweir 
157cdf0e10cSrcweir // ------------------------------------------------------------------------
directoryChanged(const FilePickerEvent & aEvent)158cdf0e10cSrcweir void SAL_CALL FileDialogHelper_Impl::directoryChanged( const FilePickerEvent& aEvent ) throw ( RuntimeException )
159cdf0e10cSrcweir {
160cdf0e10cSrcweir     ::vos::OGuard aGuard( Application::GetSolarMutex() );
161cdf0e10cSrcweir     mpAntiImpl->DirectoryChanged( aEvent );
162cdf0e10cSrcweir }
163cdf0e10cSrcweir 
164cdf0e10cSrcweir // ------------------------------------------------------------------------
helpRequested(const FilePickerEvent & aEvent)165cdf0e10cSrcweir OUString SAL_CALL FileDialogHelper_Impl::helpRequested( const FilePickerEvent& aEvent ) throw ( RuntimeException )
166cdf0e10cSrcweir {
167cdf0e10cSrcweir     ::vos::OGuard aGuard( Application::GetSolarMutex() );
168cdf0e10cSrcweir     return mpAntiImpl->HelpRequested( aEvent );
169cdf0e10cSrcweir }
170cdf0e10cSrcweir 
171cdf0e10cSrcweir // ------------------------------------------------------------------------
controlStateChanged(const FilePickerEvent & aEvent)172cdf0e10cSrcweir void SAL_CALL FileDialogHelper_Impl::controlStateChanged( const FilePickerEvent& aEvent ) throw ( RuntimeException )
173cdf0e10cSrcweir {
174cdf0e10cSrcweir     ::vos::OGuard aGuard( Application::GetSolarMutex() );
175cdf0e10cSrcweir     mpAntiImpl->ControlStateChanged( aEvent );
176cdf0e10cSrcweir }
177cdf0e10cSrcweir 
178cdf0e10cSrcweir // ------------------------------------------------------------------------
dialogSizeChanged()179cdf0e10cSrcweir void SAL_CALL FileDialogHelper_Impl::dialogSizeChanged() throw ( RuntimeException )
180cdf0e10cSrcweir {
181cdf0e10cSrcweir     ::vos::OGuard aGuard( Application::GetSolarMutex() );
182cdf0e10cSrcweir     mpAntiImpl->DialogSizeChanged();
183cdf0e10cSrcweir }
184cdf0e10cSrcweir 
185cdf0e10cSrcweir // ------------------------------------------------------------------------
186cdf0e10cSrcweir // XDialogClosedListener Methods
187cdf0e10cSrcweir // ------------------------------------------------------------------------
dialogClosed(const DialogClosedEvent & _rEvent)188cdf0e10cSrcweir void SAL_CALL FileDialogHelper_Impl::dialogClosed( const DialogClosedEvent& _rEvent ) throw ( RuntimeException )
189cdf0e10cSrcweir {
190cdf0e10cSrcweir     ::vos::OGuard aGuard( Application::GetSolarMutex() );
191cdf0e10cSrcweir     mpAntiImpl->DialogClosed( _rEvent );
192cdf0e10cSrcweir     postExecute( _rEvent.DialogResult );
193cdf0e10cSrcweir }
194cdf0e10cSrcweir 
195cdf0e10cSrcweir // ------------------------------------------------------------------------
196cdf0e10cSrcweir // handle XFilePickerListener events
197cdf0e10cSrcweir // ------------------------------------------------------------------------
handleFileSelectionChanged(const FilePickerEvent &)198cdf0e10cSrcweir void FileDialogHelper_Impl::handleFileSelectionChanged( const FilePickerEvent& )
199cdf0e10cSrcweir {
200cdf0e10cSrcweir     if ( mbHasVersions )
201cdf0e10cSrcweir         updateVersions();
202cdf0e10cSrcweir 
203cdf0e10cSrcweir     if ( mbShowPreview )
204cdf0e10cSrcweir         maPreViewTimer.Start();
205cdf0e10cSrcweir }
206cdf0e10cSrcweir 
207cdf0e10cSrcweir // ------------------------------------------------------------------------
handleDirectoryChanged(const FilePickerEvent &)208cdf0e10cSrcweir void FileDialogHelper_Impl::handleDirectoryChanged( const FilePickerEvent& )
209cdf0e10cSrcweir {
210cdf0e10cSrcweir     if ( mbShowPreview )
211cdf0e10cSrcweir         TimeOutHdl_Impl( NULL );
212cdf0e10cSrcweir }
213cdf0e10cSrcweir 
214cdf0e10cSrcweir // ------------------------------------------------------------------------
handleHelpRequested(const FilePickerEvent & aEvent)215cdf0e10cSrcweir OUString FileDialogHelper_Impl::handleHelpRequested( const FilePickerEvent& aEvent )
216cdf0e10cSrcweir {
217cdf0e10cSrcweir     //!!! todo: cache the help strings (here or TRA)
218cdf0e10cSrcweir 
219cdf0e10cSrcweir     rtl::OString sHelpId;
220cdf0e10cSrcweir     // mapping from element id -> help id
221cdf0e10cSrcweir     switch ( aEvent.ElementId )
222cdf0e10cSrcweir     {
223cdf0e10cSrcweir         case ExtendedFilePickerElementIds::CHECKBOX_AUTOEXTENSION :
224cdf0e10cSrcweir             sHelpId = HID_FILESAVE_AUTOEXTENSION;
225cdf0e10cSrcweir             break;
226cdf0e10cSrcweir 
227cdf0e10cSrcweir         case ExtendedFilePickerElementIds::CHECKBOX_PASSWORD :
228cdf0e10cSrcweir             sHelpId = HID_FILESAVE_SAVEWITHPASSWORD;
229cdf0e10cSrcweir             break;
230cdf0e10cSrcweir 
231cdf0e10cSrcweir         case ExtendedFilePickerElementIds::CHECKBOX_FILTEROPTIONS :
232cdf0e10cSrcweir             sHelpId = HID_FILESAVE_CUSTOMIZEFILTER;
233cdf0e10cSrcweir             break;
234cdf0e10cSrcweir 
235cdf0e10cSrcweir         case ExtendedFilePickerElementIds::CHECKBOX_READONLY :
236cdf0e10cSrcweir             sHelpId = HID_FILEOPEN_READONLY;
237cdf0e10cSrcweir             break;
238cdf0e10cSrcweir 
239cdf0e10cSrcweir         case ExtendedFilePickerElementIds::CHECKBOX_LINK :
240cdf0e10cSrcweir             sHelpId = HID_FILEDLG_LINK_CB;
241cdf0e10cSrcweir             break;
242cdf0e10cSrcweir 
243cdf0e10cSrcweir         case ExtendedFilePickerElementIds::CHECKBOX_PREVIEW :
244cdf0e10cSrcweir             sHelpId = HID_FILEDLG_PREVIEW_CB;
245cdf0e10cSrcweir             break;
246cdf0e10cSrcweir 
247cdf0e10cSrcweir         case ExtendedFilePickerElementIds::PUSHBUTTON_PLAY :
248cdf0e10cSrcweir             sHelpId = HID_FILESAVE_DOPLAY;
249cdf0e10cSrcweir             break;
250cdf0e10cSrcweir 
251cdf0e10cSrcweir         case ExtendedFilePickerElementIds::LISTBOX_VERSION_LABEL :
252cdf0e10cSrcweir         case ExtendedFilePickerElementIds::LISTBOX_VERSION :
253cdf0e10cSrcweir             sHelpId = HID_FILEOPEN_VERSION;
254cdf0e10cSrcweir             break;
255cdf0e10cSrcweir 
256cdf0e10cSrcweir         case ExtendedFilePickerElementIds::LISTBOX_TEMPLATE_LABEL :
257cdf0e10cSrcweir         case ExtendedFilePickerElementIds::LISTBOX_TEMPLATE :
258cdf0e10cSrcweir             sHelpId = HID_FILESAVE_TEMPLATE;
259cdf0e10cSrcweir             break;
260cdf0e10cSrcweir 
261cdf0e10cSrcweir         case ExtendedFilePickerElementIds::LISTBOX_IMAGE_TEMPLATE_LABEL :
262cdf0e10cSrcweir         case ExtendedFilePickerElementIds::LISTBOX_IMAGE_TEMPLATE :
263cdf0e10cSrcweir             sHelpId = HID_FILEOPEN_IMAGE_TEMPLATE;
264cdf0e10cSrcweir             break;
265cdf0e10cSrcweir 
266cdf0e10cSrcweir         case ExtendedFilePickerElementIds::CHECKBOX_SELECTION :
267cdf0e10cSrcweir             sHelpId = HID_FILESAVE_SELECTION;
268cdf0e10cSrcweir             break;
269cdf0e10cSrcweir 
270cdf0e10cSrcweir         default:
271cdf0e10cSrcweir             DBG_ERRORFILE( "invalid element id" );
272cdf0e10cSrcweir     }
273cdf0e10cSrcweir 
274cdf0e10cSrcweir     OUString aHelpText;
275cdf0e10cSrcweir     Help* pHelp = Application::GetHelp();
276cdf0e10cSrcweir     if ( pHelp )
277cdf0e10cSrcweir         aHelpText = String( pHelp->GetHelpText( String( ByteString(sHelpId), RTL_TEXTENCODING_UTF8), NULL ) );
278cdf0e10cSrcweir     return aHelpText;
279cdf0e10cSrcweir }
280cdf0e10cSrcweir 
281cdf0e10cSrcweir // ------------------------------------------------------------------------
handleControlStateChanged(const FilePickerEvent & aEvent)282cdf0e10cSrcweir void FileDialogHelper_Impl::handleControlStateChanged( const FilePickerEvent& aEvent )
283cdf0e10cSrcweir {
284cdf0e10cSrcweir     switch ( aEvent.ElementId )
285cdf0e10cSrcweir     {
286cdf0e10cSrcweir         case CommonFilePickerElementIds::LISTBOX_FILTER:
287cdf0e10cSrcweir             updateFilterOptionsBox();
288cdf0e10cSrcweir             enablePasswordBox( sal_False );
289cdf0e10cSrcweir             updateSelectionBox();
290cdf0e10cSrcweir             // only use it for export and with our own dialog
291cdf0e10cSrcweir             if ( mbExport && !mbSystemPicker )
292cdf0e10cSrcweir                 updateExportButton();
293cdf0e10cSrcweir             break;
294cdf0e10cSrcweir 
295cdf0e10cSrcweir         case ExtendedFilePickerElementIds::CHECKBOX_PREVIEW:
296cdf0e10cSrcweir             updatePreviewState();
297cdf0e10cSrcweir             break;
298cdf0e10cSrcweir     }
299cdf0e10cSrcweir }
300cdf0e10cSrcweir 
301cdf0e10cSrcweir // ------------------------------------------------------------------------
handleDialogSizeChanged()302cdf0e10cSrcweir void FileDialogHelper_Impl::handleDialogSizeChanged()
303cdf0e10cSrcweir {
304cdf0e10cSrcweir     if ( mbShowPreview )
305cdf0e10cSrcweir         TimeOutHdl_Impl( NULL );
306cdf0e10cSrcweir }
307cdf0e10cSrcweir 
308cdf0e10cSrcweir // ------------------------------------------------------------------------
309cdf0e10cSrcweir // XEventListener Methods
310cdf0e10cSrcweir // ------------------------------------------------------------------------
disposing(const EventObject &)311cdf0e10cSrcweir void SAL_CALL FileDialogHelper_Impl::disposing( const EventObject& ) throw ( RuntimeException )
312cdf0e10cSrcweir {
313cdf0e10cSrcweir     ::vos::OGuard aGuard( Application::GetSolarMutex() );
314cdf0e10cSrcweir     dispose();
315cdf0e10cSrcweir }
316cdf0e10cSrcweir 
317cdf0e10cSrcweir // ------------------------------------------------------------------------
318cdf0e10cSrcweir // ------------------------------------------------------------------------
319cdf0e10cSrcweir // ------------------------------------------------------------------------
dispose()320cdf0e10cSrcweir void FileDialogHelper_Impl::dispose()
321cdf0e10cSrcweir {
322cdf0e10cSrcweir     if ( mxFileDlg.is() )
323cdf0e10cSrcweir     {
324cdf0e10cSrcweir         // remove the event listener
325cdf0e10cSrcweir         uno::Reference< XFilePickerNotifier > xNotifier( mxFileDlg, UNO_QUERY );
326cdf0e10cSrcweir         if ( xNotifier.is() )
327cdf0e10cSrcweir             xNotifier->removeFilePickerListener( this );
328cdf0e10cSrcweir 
329cdf0e10cSrcweir         ::comphelper::disposeComponent( mxFileDlg );
330cdf0e10cSrcweir         mxFileDlg.clear();
331cdf0e10cSrcweir     }
332cdf0e10cSrcweir }
333cdf0e10cSrcweir 
334cdf0e10cSrcweir // ------------------------------------------------------------------------
getCurrentFilterUIName() const335cdf0e10cSrcweir String FileDialogHelper_Impl::getCurrentFilterUIName() const
336cdf0e10cSrcweir {
337cdf0e10cSrcweir     String aFilterName;
338cdf0e10cSrcweir     uno::Reference< XFilterManager > xFltMgr( mxFileDlg, UNO_QUERY );
339cdf0e10cSrcweir 
340cdf0e10cSrcweir     if( xFltMgr.is() )
341cdf0e10cSrcweir     {
342cdf0e10cSrcweir         aFilterName = xFltMgr->getCurrentFilter();
343cdf0e10cSrcweir 
344cdf0e10cSrcweir         if ( aFilterName.Len() && isShowFilterExtensionEnabled() )
345cdf0e10cSrcweir             aFilterName = getFilterName( aFilterName );
346cdf0e10cSrcweir     }
347cdf0e10cSrcweir 
348cdf0e10cSrcweir     return aFilterName;
349cdf0e10cSrcweir }
350cdf0e10cSrcweir 
351cdf0e10cSrcweir // ------------------------------------------------------------------------
LoadLastUsedFilter(const OUString & _rContextIdentifier)352cdf0e10cSrcweir void FileDialogHelper_Impl::LoadLastUsedFilter( const OUString& _rContextIdentifier )
353cdf0e10cSrcweir {
354cdf0e10cSrcweir     SvtViewOptions aDlgOpt( E_DIALOG, IODLG_CONFIGNAME );
355cdf0e10cSrcweir 
356cdf0e10cSrcweir     if( aDlgOpt.Exists() )
357cdf0e10cSrcweir     {
358cdf0e10cSrcweir         OUString    aLastFilter;
359cdf0e10cSrcweir         if( aDlgOpt.GetUserItem( _rContextIdentifier ) >>= aLastFilter )
360cdf0e10cSrcweir             setFilter( aLastFilter );
361cdf0e10cSrcweir     }
362cdf0e10cSrcweir }
363cdf0e10cSrcweir 
364cdf0e10cSrcweir // ------------------------------------------------------------------------
SaveLastUsedFilter(const OUString & _rContextIdentifier)365cdf0e10cSrcweir void FileDialogHelper_Impl::SaveLastUsedFilter( const OUString& _rContextIdentifier )
366cdf0e10cSrcweir {
367cdf0e10cSrcweir     SvtViewOptions( E_DIALOG, IODLG_CONFIGNAME ).SetUserItem( _rContextIdentifier,
368cdf0e10cSrcweir                         makeAny( getFilterWithExtension( getFilter() ) ) );
369cdf0e10cSrcweir }
370cdf0e10cSrcweir 
371cdf0e10cSrcweir // ------------------------------------------------------------------------
SaveLastUsedFilter(void)372cdf0e10cSrcweir void FileDialogHelper_Impl::SaveLastUsedFilter( void )
373cdf0e10cSrcweir {
374cdf0e10cSrcweir     const OUString* pConfigId = GetLastFilterConfigId( meContext );
375cdf0e10cSrcweir     if( pConfigId )
376cdf0e10cSrcweir         SaveLastUsedFilter( *pConfigId );
377cdf0e10cSrcweir }
378cdf0e10cSrcweir 
379cdf0e10cSrcweir // ------------------------------------------------------------------------
getCurentSfxFilter()380cdf0e10cSrcweir const SfxFilter* FileDialogHelper_Impl::getCurentSfxFilter()
381cdf0e10cSrcweir {
382cdf0e10cSrcweir     String aFilterName = getCurrentFilterUIName();
383cdf0e10cSrcweir 
384cdf0e10cSrcweir     const SfxFilter* pFilter = NULL;
385cdf0e10cSrcweir     if ( mpMatcher && aFilterName.Len() )
386cdf0e10cSrcweir         pFilter = mpMatcher->GetFilter4UIName( aFilterName, m_nMustFlags, m_nDontFlags );
387cdf0e10cSrcweir 
388cdf0e10cSrcweir     return pFilter;
389cdf0e10cSrcweir }
390cdf0e10cSrcweir 
391cdf0e10cSrcweir // ------------------------------------------------------------------------
updateExtendedControl(sal_Int16 _nExtendedControlId,sal_Bool _bEnable)392cdf0e10cSrcweir sal_Bool FileDialogHelper_Impl::updateExtendedControl( sal_Int16 _nExtendedControlId, sal_Bool _bEnable )
393cdf0e10cSrcweir {
394cdf0e10cSrcweir     sal_Bool bIsEnabled = sal_False;
395cdf0e10cSrcweir 
396cdf0e10cSrcweir     uno::Reference < XFilePickerControlAccess > xCtrlAccess( mxFileDlg, UNO_QUERY );
397cdf0e10cSrcweir     if ( xCtrlAccess.is() )
398cdf0e10cSrcweir     {
399cdf0e10cSrcweir         try
400cdf0e10cSrcweir         {
401cdf0e10cSrcweir             xCtrlAccess->enableControl( _nExtendedControlId, _bEnable );
402cdf0e10cSrcweir             bIsEnabled = _bEnable;
403cdf0e10cSrcweir         }
404cdf0e10cSrcweir         catch( const IllegalArgumentException& )
405cdf0e10cSrcweir         {
406cdf0e10cSrcweir             DBG_ERROR( "FileDialogHelper_Impl::updateExtendedControl: caught an exception!" );
407cdf0e10cSrcweir         }
408cdf0e10cSrcweir     }
409cdf0e10cSrcweir     return bIsEnabled;
410cdf0e10cSrcweir }
411cdf0e10cSrcweir 
412cdf0e10cSrcweir // ------------------------------------------------------------------------
CheckFilterOptionsCapability(const SfxFilter * _pFilter)413cdf0e10cSrcweir sal_Bool FileDialogHelper_Impl::CheckFilterOptionsCapability( const SfxFilter* _pFilter )
414cdf0e10cSrcweir {
415cdf0e10cSrcweir     sal_Bool bResult = sal_False;
416cdf0e10cSrcweir 
417cdf0e10cSrcweir     if( mxFilterCFG.is() && _pFilter )
418cdf0e10cSrcweir     {
419cdf0e10cSrcweir         try {
420cdf0e10cSrcweir             Sequence < PropertyValue > aProps;
421cdf0e10cSrcweir             Any aAny = mxFilterCFG->getByName( _pFilter->GetName() );
422cdf0e10cSrcweir             if ( aAny >>= aProps )
423cdf0e10cSrcweir             {
424cdf0e10cSrcweir                 ::rtl::OUString aServiceName;
425cdf0e10cSrcweir                 sal_Int32 nPropertyCount = aProps.getLength();
426cdf0e10cSrcweir                 for( sal_Int32 nProperty=0; nProperty < nPropertyCount; ++nProperty )
427cdf0e10cSrcweir                 {
428cdf0e10cSrcweir                     if( aProps[nProperty].Name.equals( DEFINE_CONST_OUSTRING( "UIComponent") ) )
429cdf0e10cSrcweir                     {
430cdf0e10cSrcweir                         aProps[nProperty].Value >>= aServiceName;
431cdf0e10cSrcweir                         if( aServiceName.getLength() )
432cdf0e10cSrcweir                             bResult = sal_True;
433cdf0e10cSrcweir                     }
434cdf0e10cSrcweir                 }
435cdf0e10cSrcweir             }
436cdf0e10cSrcweir         }
437cdf0e10cSrcweir         catch( Exception& )
438cdf0e10cSrcweir         {
439cdf0e10cSrcweir         }
440cdf0e10cSrcweir     }
441cdf0e10cSrcweir 
442cdf0e10cSrcweir     return bResult;
443cdf0e10cSrcweir }
444cdf0e10cSrcweir 
445cdf0e10cSrcweir // ------------------------------------------------------------------------
isInOpenMode() const446cdf0e10cSrcweir sal_Bool FileDialogHelper_Impl::isInOpenMode() const
447cdf0e10cSrcweir {
448cdf0e10cSrcweir     sal_Bool bRet = sal_False;
449cdf0e10cSrcweir 
450cdf0e10cSrcweir     switch ( m_nDialogType )
451cdf0e10cSrcweir     {
452cdf0e10cSrcweir         case FILEOPEN_SIMPLE:
453cdf0e10cSrcweir         case FILEOPEN_LINK_PREVIEW_IMAGE_TEMPLATE:
454cdf0e10cSrcweir         case FILEOPEN_PLAY:
455cdf0e10cSrcweir         case FILEOPEN_READONLY_VERSION:
456cdf0e10cSrcweir         case FILEOPEN_LINK_PREVIEW:
457cdf0e10cSrcweir             bRet = sal_True;
458cdf0e10cSrcweir     }
459cdf0e10cSrcweir 
460cdf0e10cSrcweir     return bRet;
461cdf0e10cSrcweir }
462cdf0e10cSrcweir 
463cdf0e10cSrcweir // ------------------------------------------------------------------------
464cdf0e10cSrcweir 
updateFilterOptionsBox()465cdf0e10cSrcweir void FileDialogHelper_Impl::updateFilterOptionsBox()
466cdf0e10cSrcweir {
467cdf0e10cSrcweir     if ( !m_bHaveFilterOptions )
468cdf0e10cSrcweir         return;
469cdf0e10cSrcweir 
470cdf0e10cSrcweir     updateExtendedControl(
471cdf0e10cSrcweir         ExtendedFilePickerElementIds::CHECKBOX_FILTEROPTIONS,
472cdf0e10cSrcweir         CheckFilterOptionsCapability( getCurentSfxFilter() )
473cdf0e10cSrcweir     );
474cdf0e10cSrcweir }
475cdf0e10cSrcweir 
476cdf0e10cSrcweir // ------------------------------------------------------------------------
477cdf0e10cSrcweir 
updateExportButton()478cdf0e10cSrcweir void FileDialogHelper_Impl::updateExportButton()
479cdf0e10cSrcweir {
480cdf0e10cSrcweir     uno::Reference < XFilePickerControlAccess > xCtrlAccess( mxFileDlg, UNO_QUERY );
481cdf0e10cSrcweir     if ( xCtrlAccess.is() )
482cdf0e10cSrcweir     {
483cdf0e10cSrcweir         OUString sEllipses( RTL_CONSTASCII_USTRINGPARAM( "..." ) );
484cdf0e10cSrcweir         OUString sOldLabel( xCtrlAccess->getLabel( CommonFilePickerElementIds::PUSHBUTTON_OK ) );
485cdf0e10cSrcweir 
486cdf0e10cSrcweir         // initialize button label; we need the label with the mnemonic char
487cdf0e10cSrcweir         if ( !maButtonLabel.getLength() || maButtonLabel.indexOf( MNEMONIC_CHAR ) == -1 )
488cdf0e10cSrcweir         {
489cdf0e10cSrcweir             // cut the ellipses, if necessary
490cdf0e10cSrcweir             sal_Int32 nIndex = sOldLabel.indexOf( sEllipses );
491cdf0e10cSrcweir             if ( -1 == nIndex )
492cdf0e10cSrcweir                 nIndex = sOldLabel.getLength();
493cdf0e10cSrcweir             maButtonLabel = sOldLabel.copy( 0, nIndex );
494cdf0e10cSrcweir         }
495cdf0e10cSrcweir 
496cdf0e10cSrcweir         OUString sLabel = maButtonLabel;
497cdf0e10cSrcweir         // filter with options -> append ellipses on export button label
498cdf0e10cSrcweir         if ( CheckFilterOptionsCapability( getCurentSfxFilter() ) )
499cdf0e10cSrcweir             sLabel += OUString( RTL_CONSTASCII_USTRINGPARAM( "..." ) );
500cdf0e10cSrcweir 
501cdf0e10cSrcweir         if ( sOldLabel != sLabel )
502cdf0e10cSrcweir         {
503cdf0e10cSrcweir             try
504cdf0e10cSrcweir             {
505cdf0e10cSrcweir                 xCtrlAccess->setLabel( CommonFilePickerElementIds::PUSHBUTTON_OK, sLabel );
506cdf0e10cSrcweir             }
507cdf0e10cSrcweir             catch( const IllegalArgumentException& )
508cdf0e10cSrcweir             {
509cdf0e10cSrcweir                 DBG_ERRORFILE( "FileDialogHelper_Impl::updateExportButton: caught an exception!" );
510cdf0e10cSrcweir             }
511cdf0e10cSrcweir         }
512cdf0e10cSrcweir     }
513cdf0e10cSrcweir }
514cdf0e10cSrcweir 
515cdf0e10cSrcweir // ------------------------------------------------------------------------
updateSelectionBox()516cdf0e10cSrcweir void FileDialogHelper_Impl::updateSelectionBox()
517cdf0e10cSrcweir {
518cdf0e10cSrcweir     if ( !mbHasSelectionBox )
519cdf0e10cSrcweir         return;
520cdf0e10cSrcweir 
521cdf0e10cSrcweir     // Does the selection box exist?
522cdf0e10cSrcweir     sal_Bool bSelectionBoxFound = sal_False;
523cdf0e10cSrcweir     uno::Reference< XControlInformation > xCtrlInfo( mxFileDlg, UNO_QUERY );
524cdf0e10cSrcweir     if ( xCtrlInfo.is() )
525cdf0e10cSrcweir     {
526cdf0e10cSrcweir         Sequence< ::rtl::OUString > aCtrlList = xCtrlInfo->getSupportedControls();
527cdf0e10cSrcweir         sal_uInt32 nCount = aCtrlList.getLength();
528cdf0e10cSrcweir         for ( sal_uInt32 nCtrl = 0; nCtrl < nCount; ++nCtrl )
529cdf0e10cSrcweir             if ( aCtrlList[ nCtrl ].equalsAscii("SelectionBox") )
530cdf0e10cSrcweir             {
531cdf0e10cSrcweir                 bSelectionBoxFound = sal_False;
532cdf0e10cSrcweir                 break;
533cdf0e10cSrcweir             }
534cdf0e10cSrcweir     }
535cdf0e10cSrcweir 
536cdf0e10cSrcweir     if ( bSelectionBoxFound )
537cdf0e10cSrcweir     {
538cdf0e10cSrcweir         const SfxFilter* pFilter = getCurentSfxFilter();
539cdf0e10cSrcweir         mbSelectionFltrEnabled = updateExtendedControl(
540cdf0e10cSrcweir             ExtendedFilePickerElementIds::CHECKBOX_SELECTION,
541cdf0e10cSrcweir             ( mbSelectionEnabled && pFilter && ( pFilter->GetFilterFlags() & SFX_FILTER_SUPPORTSSELECTION ) != 0 ) );
542cdf0e10cSrcweir         uno::Reference< XFilePickerControlAccess > xCtrlAccess( mxFileDlg, UNO_QUERY );
543cdf0e10cSrcweir         xCtrlAccess->setValue( ExtendedFilePickerElementIds::CHECKBOX_SELECTION, 0, makeAny( (sal_Bool)mbSelection ) );
544cdf0e10cSrcweir     }
545cdf0e10cSrcweir }
546cdf0e10cSrcweir 
547cdf0e10cSrcweir // ------------------------------------------------------------------------
enablePasswordBox(sal_Bool bInit)548cdf0e10cSrcweir void FileDialogHelper_Impl::enablePasswordBox( sal_Bool bInit )
549cdf0e10cSrcweir {
550cdf0e10cSrcweir     if ( ! mbHasPassword )
551cdf0e10cSrcweir         return;
552cdf0e10cSrcweir 
553cdf0e10cSrcweir     sal_Bool bWasEnabled = mbIsPwdEnabled;
554cdf0e10cSrcweir 
555cdf0e10cSrcweir     const SfxFilter* pCurrentFilter = getCurentSfxFilter();
556cdf0e10cSrcweir     mbIsPwdEnabled = updateExtendedControl(
557cdf0e10cSrcweir         ExtendedFilePickerElementIds::CHECKBOX_PASSWORD,
558cdf0e10cSrcweir         pCurrentFilter && ( pCurrentFilter->GetFilterFlags() & SFX_FILTER_ENCRYPTION )
559cdf0e10cSrcweir     );
560cdf0e10cSrcweir 
561cdf0e10cSrcweir     if( bInit )
562cdf0e10cSrcweir     {
563b9340647SJohn Bampton         // in case of initialization previous state is not interesting
564cdf0e10cSrcweir         if( mbIsPwdEnabled )
565cdf0e10cSrcweir         {
566cdf0e10cSrcweir             uno::Reference< XFilePickerControlAccess > xCtrlAccess( mxFileDlg, UNO_QUERY );
567cdf0e10cSrcweir             if( mbPwdCheckBoxState )
568cdf0e10cSrcweir                 xCtrlAccess->setValue( ExtendedFilePickerElementIds::CHECKBOX_PASSWORD, 0, makeAny( sal_True ) );
569cdf0e10cSrcweir         }
570cdf0e10cSrcweir     }
571cdf0e10cSrcweir     else if( !bWasEnabled && mbIsPwdEnabled )
572cdf0e10cSrcweir     {
573cdf0e10cSrcweir         uno::Reference< XFilePickerControlAccess > xCtrlAccess( mxFileDlg, UNO_QUERY );
574cdf0e10cSrcweir         if( mbPwdCheckBoxState )
575cdf0e10cSrcweir             xCtrlAccess->setValue( ExtendedFilePickerElementIds::CHECKBOX_PASSWORD, 0, makeAny( sal_True ) );
576cdf0e10cSrcweir     }
577cdf0e10cSrcweir     else if( bWasEnabled && !mbIsPwdEnabled )
578cdf0e10cSrcweir     {
579cdf0e10cSrcweir         // remember user settings until checkbox is enabled
580cdf0e10cSrcweir         uno::Reference< XFilePickerControlAccess > xCtrlAccess( mxFileDlg, UNO_QUERY );
581cdf0e10cSrcweir         Any aValue = xCtrlAccess->getValue( ExtendedFilePickerElementIds::CHECKBOX_PASSWORD, 0 );
582cdf0e10cSrcweir         sal_Bool bPassWord = sal_False;
583cdf0e10cSrcweir         mbPwdCheckBoxState = ( aValue >>= bPassWord ) && bPassWord;
584cdf0e10cSrcweir         xCtrlAccess->setValue( ExtendedFilePickerElementIds::CHECKBOX_PASSWORD, 0, makeAny( sal_False ) );
585cdf0e10cSrcweir     }
586cdf0e10cSrcweir }
587cdf0e10cSrcweir 
588cdf0e10cSrcweir // ------------------------------------------------------------------------
updatePreviewState(sal_Bool _bUpdatePreviewWindow)589cdf0e10cSrcweir void FileDialogHelper_Impl::updatePreviewState( sal_Bool _bUpdatePreviewWindow )
590cdf0e10cSrcweir {
591cdf0e10cSrcweir     if ( mbHasPreview )
592cdf0e10cSrcweir     {
593cdf0e10cSrcweir         uno::Reference< XFilePickerControlAccess > xCtrlAccess( mxFileDlg, UNO_QUERY );
594cdf0e10cSrcweir 
59574cbd1f1SMatthias Seidel         // check, whether or not we have to display a preview
596cdf0e10cSrcweir         if ( xCtrlAccess.is() )
597cdf0e10cSrcweir         {
598cdf0e10cSrcweir             try
599cdf0e10cSrcweir             {
600cdf0e10cSrcweir                 Any aValue = xCtrlAccess->getValue( ExtendedFilePickerElementIds::CHECKBOX_PREVIEW, 0 );
601cdf0e10cSrcweir                 sal_Bool bShowPreview = sal_False;
602cdf0e10cSrcweir 
603cdf0e10cSrcweir                 if ( aValue >>= bShowPreview )
604cdf0e10cSrcweir                 {
605cdf0e10cSrcweir                     mbShowPreview = bShowPreview;
606cdf0e10cSrcweir 
607cdf0e10cSrcweir                     // #97633
608cdf0e10cSrcweir                     // setShowState has currently no effect for the
609cdf0e10cSrcweir                     // OpenOffice FilePicker (see svtools/source/filepicker/iodlg.cxx)
610cdf0e10cSrcweir                     uno::Reference< XFilePreview > xFilePreview( mxFileDlg, UNO_QUERY );
611cdf0e10cSrcweir                     if ( xFilePreview.is() )
612cdf0e10cSrcweir                         xFilePreview->setShowState( mbShowPreview );
613cdf0e10cSrcweir 
614cdf0e10cSrcweir                     if ( _bUpdatePreviewWindow )
615cdf0e10cSrcweir                         TimeOutHdl_Impl( NULL );
616cdf0e10cSrcweir                 }
617cdf0e10cSrcweir             }
618cdf0e10cSrcweir             catch( Exception )
619cdf0e10cSrcweir             {
620cdf0e10cSrcweir                 DBG_ERRORFILE( "FileDialogHelper_Impl::updatePreviewState: caught an exception!" );
621cdf0e10cSrcweir             }
622cdf0e10cSrcweir         }
623cdf0e10cSrcweir     }
624cdf0e10cSrcweir }
625cdf0e10cSrcweir 
626cdf0e10cSrcweir // ------------------------------------------------------------------------
updateVersions()627cdf0e10cSrcweir void FileDialogHelper_Impl::updateVersions()
628cdf0e10cSrcweir {
629cdf0e10cSrcweir     Sequence < OUString > aEntries;
630cdf0e10cSrcweir     Sequence < OUString > aPathSeq = mxFileDlg->getFiles();
631cdf0e10cSrcweir 
632cdf0e10cSrcweir     if ( aPathSeq.getLength() == 1 )
633cdf0e10cSrcweir     {
634cdf0e10cSrcweir         INetURLObject aObj( aPathSeq[0] );
635cdf0e10cSrcweir 
636cdf0e10cSrcweir         if ( ( aObj.GetProtocol() == INET_PROT_FILE ) &&
637cdf0e10cSrcweir             ( utl::UCBContentHelper::IsDocument( aObj.GetMainURL( INetURLObject::NO_DECODE ) ) ) )
638cdf0e10cSrcweir         {
639cdf0e10cSrcweir             try
640cdf0e10cSrcweir             {
641cdf0e10cSrcweir                 uno::Reference< embed::XStorage > xStorage = ::comphelper::OStorageHelper::GetStorageFromURL(
642cdf0e10cSrcweir                                                                 aObj.GetMainURL( INetURLObject::NO_DECODE ),
643cdf0e10cSrcweir                                                                 embed::ElementModes::READ );
644cdf0e10cSrcweir 
645cdf0e10cSrcweir                 DBG_ASSERT( xStorage.is(), "The method must return the storage or throw an exception!" );
646cdf0e10cSrcweir                 if ( !xStorage.is() )
647cdf0e10cSrcweir                     throw uno::RuntimeException();
648cdf0e10cSrcweir 
649cdf0e10cSrcweir                 uno::Sequence < util::RevisionTag > xVersions = SfxMedium::GetVersionList( xStorage );
650cdf0e10cSrcweir 
651cdf0e10cSrcweir                 aEntries.realloc( xVersions.getLength() + 1 );
652cdf0e10cSrcweir                 aEntries[0] = OUString( String ( SfxResId( STR_SFX_FILEDLG_ACTUALVERSION ) ) );
653cdf0e10cSrcweir 
654cdf0e10cSrcweir                 for ( sal_Int32 i=0; i<xVersions.getLength(); i++ )
655cdf0e10cSrcweir                     aEntries[ i + 1 ] = xVersions[i].Identifier;
656cdf0e10cSrcweir 
657cdf0e10cSrcweir                 // TODO/LATER: not sure that this information must be shown in future ( binfilter? )
658cdf0e10cSrcweir //REMOVE                    else
659cdf0e10cSrcweir //REMOVE                    {
660cdf0e10cSrcweir //REMOVE                        SfxFilterFlags nMust = SFX_FILTER_IMPORT | SFX_FILTER_OWN;
661cdf0e10cSrcweir //REMOVE                        SfxFilterFlags nDont = SFX_FILTER_NOTINSTALLED | SFX_FILTER_STARONEFILTER;
662cdf0e10cSrcweir //REMOVE                        if ( SFX_APP()->GetFilterMatcher().GetFilter4ClipBoardId( pStor->GetFormat(), nMust, nDont ) )
663cdf0e10cSrcweir //REMOVE                        {
664cdf0e10cSrcweir //REMOVE                            aEntries.realloc( 1 );
665cdf0e10cSrcweir //REMOVE                            aEntries[0] = OUString( String ( SfxResId( STR_SFX_FILEDLG_ACTUALVERSION ) ) );
666cdf0e10cSrcweir //REMOVE                        }
667cdf0e10cSrcweir //REMOVE                    }
668cdf0e10cSrcweir             }
669cdf0e10cSrcweir             catch( uno::Exception& )
670cdf0e10cSrcweir             {
671cdf0e10cSrcweir             }
672cdf0e10cSrcweir         }
673cdf0e10cSrcweir     }
674cdf0e10cSrcweir 
675cdf0e10cSrcweir     uno::Reference < XFilePickerControlAccess > xDlg( mxFileDlg, UNO_QUERY );
676cdf0e10cSrcweir     Any aValue;
677cdf0e10cSrcweir 
678cdf0e10cSrcweir     try
679cdf0e10cSrcweir     {
680cdf0e10cSrcweir         xDlg->setValue( ExtendedFilePickerElementIds::LISTBOX_VERSION,
681cdf0e10cSrcweir                         ControlActions::DELETE_ITEMS, aValue );
682cdf0e10cSrcweir     }
683cdf0e10cSrcweir     catch( IllegalArgumentException ){}
684cdf0e10cSrcweir 
685cdf0e10cSrcweir     sal_Int32 nCount = aEntries.getLength();
686cdf0e10cSrcweir 
687cdf0e10cSrcweir     if ( nCount )
688cdf0e10cSrcweir     {
689cdf0e10cSrcweir         try
690cdf0e10cSrcweir         {
691cdf0e10cSrcweir             aValue <<= aEntries;
692cdf0e10cSrcweir             xDlg->setValue( ExtendedFilePickerElementIds::LISTBOX_VERSION,
693cdf0e10cSrcweir                             ControlActions::ADD_ITEMS, aValue );
694cdf0e10cSrcweir 
695cdf0e10cSrcweir             Any aPos;
696cdf0e10cSrcweir             aPos <<= (sal_Int32) 0;
697cdf0e10cSrcweir             xDlg->setValue( ExtendedFilePickerElementIds::LISTBOX_VERSION,
698cdf0e10cSrcweir                             ControlActions::SET_SELECT_ITEM, aPos );
699cdf0e10cSrcweir         }
700cdf0e10cSrcweir         catch( IllegalArgumentException ){}
701cdf0e10cSrcweir     }
702cdf0e10cSrcweir }
703cdf0e10cSrcweir 
704cdf0e10cSrcweir // -----------------------------------------------------------------------
705cdf0e10cSrcweir class OReleaseSolarMutex
706cdf0e10cSrcweir {
707cdf0e10cSrcweir private:
708cdf0e10cSrcweir     const sal_Int32 m_nAquireCount;
709cdf0e10cSrcweir public:
OReleaseSolarMutex()710cdf0e10cSrcweir     OReleaseSolarMutex( )
711cdf0e10cSrcweir         :m_nAquireCount( Application::ReleaseSolarMutex() )
712cdf0e10cSrcweir     {
713cdf0e10cSrcweir     }
~OReleaseSolarMutex()714cdf0e10cSrcweir     ~OReleaseSolarMutex( )
715cdf0e10cSrcweir     {
716cdf0e10cSrcweir         Application::AcquireSolarMutex( m_nAquireCount );
717cdf0e10cSrcweir     }
718cdf0e10cSrcweir };
719cdf0e10cSrcweir 
720cdf0e10cSrcweir // -----------------------------------------------------------------------
IMPL_LINK(FileDialogHelper_Impl,TimeOutHdl_Impl,Timer *,EMPTYARG)721cdf0e10cSrcweir IMPL_LINK( FileDialogHelper_Impl, TimeOutHdl_Impl, Timer*, EMPTYARG )
722cdf0e10cSrcweir {
723cdf0e10cSrcweir     if ( !mbHasPreview )
724cdf0e10cSrcweir         return 0;
725cdf0e10cSrcweir 
726cdf0e10cSrcweir     maGraphic.Clear();
727cdf0e10cSrcweir 
728cdf0e10cSrcweir     Any aAny;
729cdf0e10cSrcweir     uno::Reference < XFilePreview > xFilePicker( mxFileDlg, UNO_QUERY );
730cdf0e10cSrcweir 
731cdf0e10cSrcweir     if ( ! xFilePicker.is() )
732cdf0e10cSrcweir         return 0;
733cdf0e10cSrcweir 
734cdf0e10cSrcweir     Sequence < OUString > aPathSeq = mxFileDlg->getFiles();
735cdf0e10cSrcweir 
736cdf0e10cSrcweir     if ( mbShowPreview && ( aPathSeq.getLength() == 1 ) )
737cdf0e10cSrcweir     {
738cdf0e10cSrcweir         OUString    aURL = aPathSeq[0];
739cdf0e10cSrcweir 
740cdf0e10cSrcweir         if ( ERRCODE_NONE == getGraphic( aURL, maGraphic ) )
741cdf0e10cSrcweir         {
742cdf0e10cSrcweir             // #89491
743cdf0e10cSrcweir             // changed the code slightly;
744cdf0e10cSrcweir             // before: the bitmap was scaled and
745cdf0e10cSrcweir             // surrounded a white frame
746cdf0e10cSrcweir             // now: the bitmap will only be scaled
747cdf0e10cSrcweir             // and the filepicker implementation
748cdf0e10cSrcweir             // is responsible for placing it at its
749cdf0e10cSrcweir             // proper position and painting a frame
750cdf0e10cSrcweir 
751cdf0e10cSrcweir             Bitmap aBmp = maGraphic.GetBitmap();
75227ac3209SAriel Constenla-Haile             if ( !aBmp.IsEmpty() )
75327ac3209SAriel Constenla-Haile             {
754cdf0e10cSrcweir                 // scale the bitmap to the correct size
755cdf0e10cSrcweir                 sal_Int32 nOutWidth  = xFilePicker->getAvailableWidth();
756cdf0e10cSrcweir                 sal_Int32 nOutHeight = xFilePicker->getAvailableHeight();
757cdf0e10cSrcweir                 sal_Int32 nBmpWidth  = aBmp.GetSizePixel().Width();
758cdf0e10cSrcweir                 sal_Int32 nBmpHeight = aBmp.GetSizePixel().Height();
759cdf0e10cSrcweir 
760cdf0e10cSrcweir                 double nXRatio = (double) nOutWidth / nBmpWidth;
761cdf0e10cSrcweir                 double nYRatio = (double) nOutHeight / nBmpHeight;
762cdf0e10cSrcweir 
763cdf0e10cSrcweir                 if ( nXRatio < nYRatio )
764cdf0e10cSrcweir                     aBmp.Scale( nXRatio, nXRatio );
765cdf0e10cSrcweir                 else
766cdf0e10cSrcweir                     aBmp.Scale( nYRatio, nYRatio );
767cdf0e10cSrcweir 
768cdf0e10cSrcweir                 // #94505# Convert to true color, to allow CopyPixel
769cdf0e10cSrcweir                 aBmp.Convert( BMP_CONVERSION_24BIT );
770cdf0e10cSrcweir 
771cdf0e10cSrcweir                 // and copy it into the Any
772cdf0e10cSrcweir                 SvMemoryStream aData;
773cdf0e10cSrcweir 
77445fd3b9aSArmin Le Grand                 WriteDIB(aBmp, aData, false, true);
775cdf0e10cSrcweir 
776cdf0e10cSrcweir                 const Sequence < sal_Int8 > aBuffer(
777cdf0e10cSrcweir                     static_cast< const sal_Int8* >(aData.GetData()),
778cdf0e10cSrcweir                     aData.GetEndOfData() );
779cdf0e10cSrcweir 
780cdf0e10cSrcweir                 aAny <<= aBuffer;
781cdf0e10cSrcweir             }
782cdf0e10cSrcweir         }
78327ac3209SAriel Constenla-Haile     }
784cdf0e10cSrcweir 
785cdf0e10cSrcweir     try
786cdf0e10cSrcweir     {
787cdf0e10cSrcweir         OReleaseSolarMutex aReleaseForCallback;
788cdf0e10cSrcweir         // clear the preview window
789cdf0e10cSrcweir         xFilePicker->setImage( FilePreviewImageFormats::BITMAP, aAny );
790cdf0e10cSrcweir     }
791cdf0e10cSrcweir     catch( IllegalArgumentException )
792cdf0e10cSrcweir     {
793cdf0e10cSrcweir     }
794cdf0e10cSrcweir 
795cdf0e10cSrcweir     return 0;
796cdf0e10cSrcweir }
797cdf0e10cSrcweir 
798cdf0e10cSrcweir // ------------------------------------------------------------------------
getGraphic(const OUString & rURL,Graphic & rGraphic) const799cdf0e10cSrcweir ErrCode FileDialogHelper_Impl::getGraphic( const OUString& rURL,
800cdf0e10cSrcweir                                            Graphic& rGraphic ) const
801cdf0e10cSrcweir {
802cdf0e10cSrcweir     if ( utl::UCBContentHelper::IsFolder( rURL ) )
803cdf0e10cSrcweir         return ERRCODE_IO_NOTAFILE;
804cdf0e10cSrcweir 
805cdf0e10cSrcweir     if ( !mpGraphicFilter )
806cdf0e10cSrcweir         return ERRCODE_IO_NOTSUPPORTED;
807cdf0e10cSrcweir 
808cdf0e10cSrcweir     // select graphic filter from dialog filter selection
809cdf0e10cSrcweir     OUString aCurFilter( getFilter() );
810cdf0e10cSrcweir 
811cdf0e10cSrcweir     sal_uInt16 nFilter = aCurFilter.getLength() && mpGraphicFilter->GetImportFormatCount()
812cdf0e10cSrcweir                     ? mpGraphicFilter->GetImportFormatNumber( aCurFilter )
813cdf0e10cSrcweir                     : GRFILTER_FORMAT_DONTKNOW;
814cdf0e10cSrcweir 
815cdf0e10cSrcweir     INetURLObject aURLObj( rURL );
816cdf0e10cSrcweir 
817cdf0e10cSrcweir     if ( aURLObj.HasError() || INET_PROT_NOT_VALID == aURLObj.GetProtocol() )
818cdf0e10cSrcweir     {
819cdf0e10cSrcweir         aURLObj.SetSmartProtocol( INET_PROT_FILE );
820cdf0e10cSrcweir         aURLObj.SetSmartURL( rURL );
821cdf0e10cSrcweir     }
822cdf0e10cSrcweir 
823cdf0e10cSrcweir     ErrCode nRet = ERRCODE_NONE;
824cdf0e10cSrcweir 
825cdf0e10cSrcweir     sal_uInt32 nFilterImportFlags = GRFILTER_I_FLAGS_SET_LOGSIZE_FOR_JPEG;
826cdf0e10cSrcweir     // non-local?
827cdf0e10cSrcweir     if ( INET_PROT_FILE != aURLObj.GetProtocol() )
828cdf0e10cSrcweir     {
829cdf0e10cSrcweir         SvStream* pStream = ::utl::UcbStreamHelper::CreateStream( rURL, STREAM_READ );
830cdf0e10cSrcweir 
831cdf0e10cSrcweir         if( pStream )
832cdf0e10cSrcweir             nRet = mpGraphicFilter->ImportGraphic( rGraphic, rURL, *pStream, nFilter, NULL, nFilterImportFlags );
833cdf0e10cSrcweir         else
834cdf0e10cSrcweir             nRet = mpGraphicFilter->ImportGraphic( rGraphic, aURLObj, nFilter, NULL, nFilterImportFlags );
835cdf0e10cSrcweir         delete pStream;
836cdf0e10cSrcweir     }
837cdf0e10cSrcweir     else
838cdf0e10cSrcweir     {
839cdf0e10cSrcweir         nRet = mpGraphicFilter->ImportGraphic( rGraphic, aURLObj, nFilter, NULL, nFilterImportFlags );
840cdf0e10cSrcweir     }
841cdf0e10cSrcweir 
842cdf0e10cSrcweir     return nRet;
843cdf0e10cSrcweir }
844cdf0e10cSrcweir 
845cdf0e10cSrcweir // ------------------------------------------------------------------------
getGraphic(Graphic & rGraphic) const846cdf0e10cSrcweir ErrCode FileDialogHelper_Impl::getGraphic( Graphic& rGraphic ) const
847cdf0e10cSrcweir {
848cdf0e10cSrcweir     ErrCode nRet = ERRCODE_NONE;
849cdf0e10cSrcweir 
850cdf0e10cSrcweir     if ( ! maGraphic )
851cdf0e10cSrcweir     {
852*50626f15Smseidel         OUString aPath;
853cdf0e10cSrcweir         Sequence < OUString > aPathSeq = mxFileDlg->getFiles();
854cdf0e10cSrcweir 
855cdf0e10cSrcweir         if ( aPathSeq.getLength() == 1 )
856cdf0e10cSrcweir         {
857cdf0e10cSrcweir             aPath = aPathSeq[0];
858cdf0e10cSrcweir         }
859cdf0e10cSrcweir 
860cdf0e10cSrcweir         if ( aPath.getLength() )
861cdf0e10cSrcweir             nRet = getGraphic( aPath, rGraphic );
862cdf0e10cSrcweir         else
863cdf0e10cSrcweir             nRet = ERRCODE_IO_GENERAL;
864cdf0e10cSrcweir     }
865cdf0e10cSrcweir     else
866cdf0e10cSrcweir         rGraphic = maGraphic;
867cdf0e10cSrcweir 
868cdf0e10cSrcweir     return nRet;
869cdf0e10cSrcweir }
870cdf0e10cSrcweir 
871cdf0e10cSrcweir // ------------------------------------------------------------------------
lcl_isSystemFilePicker(const uno::Reference<XFilePicker> & _rxFP)872cdf0e10cSrcweir sal_Bool lcl_isSystemFilePicker( const uno::Reference< XFilePicker >& _rxFP )
873cdf0e10cSrcweir {
874cdf0e10cSrcweir     try
875cdf0e10cSrcweir     {
876cdf0e10cSrcweir         uno::Reference< XServiceInfo > xSI( _rxFP, UNO_QUERY );
877cdf0e10cSrcweir         if ( xSI.is() && xSI->supportsService( DEFINE_CONST_OUSTRING( "com.sun.star.ui.dialogs.SystemFilePicker" ) ) )
878cdf0e10cSrcweir             return sal_True;
879cdf0e10cSrcweir     }
880cdf0e10cSrcweir     catch( const Exception& )
881cdf0e10cSrcweir     {
882cdf0e10cSrcweir     }
883cdf0e10cSrcweir     return sal_False;
884cdf0e10cSrcweir }
885cdf0e10cSrcweir 
886cdf0e10cSrcweir 
887cdf0e10cSrcweir // ------------------------------------------------------------------------
888cdf0e10cSrcweir // -----------      FileDialogHelper_Impl       ---------------------------
889cdf0e10cSrcweir // ------------------------------------------------------------------------
890cdf0e10cSrcweir 
FileDialogHelper_Impl(FileDialogHelper * _pAntiImpl,sal_Int16 nDialogType,sal_Int64 nFlags,sal_Int16 nDialog,Window * _pPreferredParentWindow,const String & sStandardDir,const::com::sun::star::uno::Sequence<::rtl::OUString> & rBlackList)891cdf0e10cSrcweir FileDialogHelper_Impl::FileDialogHelper_Impl(
892cdf0e10cSrcweir     FileDialogHelper* _pAntiImpl,
893cdf0e10cSrcweir     sal_Int16 nDialogType,
894cdf0e10cSrcweir     sal_Int64 nFlags,
895cdf0e10cSrcweir     sal_Int16 nDialog,
896cdf0e10cSrcweir     Window* _pPreferredParentWindow,
897cdf0e10cSrcweir     const String& sStandardDir,
898cdf0e10cSrcweir     const ::com::sun::star::uno::Sequence< ::rtl::OUString >& rBlackList
899cdf0e10cSrcweir     )
900cdf0e10cSrcweir     :m_nDialogType          ( nDialogType )
901cdf0e10cSrcweir     ,meContext              ( FileDialogHelper::UNKNOWN_CONTEXT )
902cdf0e10cSrcweir {
903cdf0e10cSrcweir     const char* pServiceName=0;
904cdf0e10cSrcweir     if ( nDialog == SFX2_IMPL_DIALOG_SYSTEM )
905cdf0e10cSrcweir         pServiceName = FILE_OPEN_SERVICE_NAME_OOO;
906cdf0e10cSrcweir     else if ( nDialog == SFX2_IMPL_DIALOG_OOO )
907cdf0e10cSrcweir         pServiceName = FILE_OPEN_SERVICE_NAME_OOO;
908cdf0e10cSrcweir     else
909cdf0e10cSrcweir         pServiceName = FILE_OPEN_SERVICE_NAME;
910cdf0e10cSrcweir     OUString aService = ::rtl::OUString::createFromAscii( pServiceName );
911cdf0e10cSrcweir 
912cdf0e10cSrcweir     uno::Reference< XMultiServiceFactory > xFactory( ::comphelper::getProcessServiceFactory() );
913cdf0e10cSrcweir 
914cdf0e10cSrcweir     // create the file open dialog
915cdf0e10cSrcweir     // the flags can be SFXWB_INSERT or SFXWB_MULTISELECTION
916cdf0e10cSrcweir 
917cdf0e10cSrcweir     mpPreferredParentWindow = _pPreferredParentWindow;
918cdf0e10cSrcweir     mpAntiImpl              = _pAntiImpl;
919cdf0e10cSrcweir     mnError                 = ERRCODE_NONE;
920cdf0e10cSrcweir     mbHasAutoExt            = sal_False;
921cdf0e10cSrcweir     mbHasPassword           = sal_False;
922cdf0e10cSrcweir     m_bHaveFilterOptions    = sal_False;
923cdf0e10cSrcweir     mbIsPwdEnabled          = sal_True;
924cdf0e10cSrcweir     mbHasVersions           = sal_False;
925cdf0e10cSrcweir     mbHasPreview            = sal_False;
926cdf0e10cSrcweir     mbShowPreview           = sal_False;
927cdf0e10cSrcweir     mbHasLink               = sal_False;
928cdf0e10cSrcweir     mbDeleteMatcher         = sal_False;
929cdf0e10cSrcweir     mbInsert                = SFXWB_INSERT == ( nFlags & SFXWB_INSERT );
930cdf0e10cSrcweir     mbExport                = SFXWB_EXPORT == ( nFlags & SFXWB_EXPORT );
931cdf0e10cSrcweir     mbIsSaveDlg             = sal_False;
932cdf0e10cSrcweir     mbPwdCheckBoxState      = sal_False;
933cdf0e10cSrcweir     mbSelection             = sal_False;
934cdf0e10cSrcweir     mbSelectionEnabled      = sal_True;
935cdf0e10cSrcweir     mbHasSelectionBox       = sal_False;
936cdf0e10cSrcweir     mbSelectionFltrEnabled  = sal_False;
937cdf0e10cSrcweir 
938cdf0e10cSrcweir     // default settings
939cdf0e10cSrcweir     m_nDontFlags = SFX_FILTER_INTERNAL | SFX_FILTER_NOTINFILEDLG | SFX_FILTER_NOTINSTALLED;
940cdf0e10cSrcweir     if( WB_OPEN == ( nFlags & WB_OPEN ) )
941cdf0e10cSrcweir         m_nMustFlags = SFX_FILTER_IMPORT;
942cdf0e10cSrcweir     else
943cdf0e10cSrcweir         m_nMustFlags = SFX_FILTER_EXPORT;
944cdf0e10cSrcweir 
945cdf0e10cSrcweir 
946cdf0e10cSrcweir     mpMatcher = NULL;
947cdf0e10cSrcweir     mpGraphicFilter = NULL;
948cdf0e10cSrcweir     mnPostUserEventId = 0;
949cdf0e10cSrcweir 
950cdf0e10cSrcweir     // create the picker component
951cdf0e10cSrcweir     mxFileDlg = mxFileDlg.query( xFactory->createInstance( aService ) );
952cdf0e10cSrcweir     mbSystemPicker = lcl_isSystemFilePicker( mxFileDlg );
953cdf0e10cSrcweir 
954cdf0e10cSrcweir     uno::Reference< XFilePickerNotifier > xNotifier( mxFileDlg, UNO_QUERY );
955cdf0e10cSrcweir     uno::Reference< XInitialization > xInit( mxFileDlg, UNO_QUERY );
956cdf0e10cSrcweir 
957cdf0e10cSrcweir     if ( ! mxFileDlg.is() || ! xNotifier.is() )
958cdf0e10cSrcweir     {
959cdf0e10cSrcweir         mnError = ERRCODE_ABORT;
960cdf0e10cSrcweir         return;
961cdf0e10cSrcweir     }
962cdf0e10cSrcweir 
963cdf0e10cSrcweir 
964cdf0e10cSrcweir     if ( xInit.is() )
965cdf0e10cSrcweir     {
966cdf0e10cSrcweir         sal_Int16 nTemplateDescription = TemplateDescription::FILEOPEN_SIMPLE;
967cdf0e10cSrcweir 
968cdf0e10cSrcweir         switch ( m_nDialogType )
969cdf0e10cSrcweir         {
970cdf0e10cSrcweir             case FILEOPEN_SIMPLE:
971cdf0e10cSrcweir                 nTemplateDescription = TemplateDescription::FILEOPEN_SIMPLE;
972cdf0e10cSrcweir                 break;
973cdf0e10cSrcweir 
974cdf0e10cSrcweir             case FILESAVE_SIMPLE:
975cdf0e10cSrcweir                 nTemplateDescription = TemplateDescription::FILESAVE_SIMPLE;
976cdf0e10cSrcweir                 mbIsSaveDlg = sal_True;
977cdf0e10cSrcweir                 break;
978cdf0e10cSrcweir 
979cdf0e10cSrcweir             case FILESAVE_AUTOEXTENSION_PASSWORD:
980cdf0e10cSrcweir                 nTemplateDescription = TemplateDescription::FILESAVE_AUTOEXTENSION_PASSWORD;
981cdf0e10cSrcweir                 mbHasPassword = sal_True;
982cdf0e10cSrcweir                 mbHasAutoExt = sal_True;
983cdf0e10cSrcweir                 mbIsSaveDlg = sal_True;
984cdf0e10cSrcweir                 break;
985cdf0e10cSrcweir 
986cdf0e10cSrcweir             case FILESAVE_AUTOEXTENSION_PASSWORD_FILTEROPTIONS:
987cdf0e10cSrcweir                 nTemplateDescription = TemplateDescription::FILESAVE_AUTOEXTENSION_PASSWORD_FILTEROPTIONS;
988cdf0e10cSrcweir                 mbHasPassword = sal_True;
989cdf0e10cSrcweir 
990cdf0e10cSrcweir                 m_bHaveFilterOptions = sal_True;
991cdf0e10cSrcweir                 if( xFactory.is() )
992cdf0e10cSrcweir                 {
993cdf0e10cSrcweir                     mxFilterCFG = uno::Reference< XNameAccess >(
994cdf0e10cSrcweir                         xFactory->createInstance( DEFINE_CONST_OUSTRING( "com.sun.star.document.FilterFactory" ) ),
995cdf0e10cSrcweir                         UNO_QUERY );
996cdf0e10cSrcweir                 }
997cdf0e10cSrcweir 
998cdf0e10cSrcweir                 mbHasAutoExt = sal_True;
999cdf0e10cSrcweir                 mbIsSaveDlg = sal_True;
1000cdf0e10cSrcweir                 break;
1001cdf0e10cSrcweir 
1002cdf0e10cSrcweir             case FILESAVE_AUTOEXTENSION_SELECTION:
1003cdf0e10cSrcweir                 nTemplateDescription = TemplateDescription::FILESAVE_AUTOEXTENSION_SELECTION;
1004cdf0e10cSrcweir                 mbHasAutoExt = sal_True;
1005cdf0e10cSrcweir                 mbIsSaveDlg = sal_True;
1006cdf0e10cSrcweir                 mbHasSelectionBox = sal_True;
1007cdf0e10cSrcweir                 if ( mbExport && !mxFilterCFG.is() && xFactory.is() )
1008cdf0e10cSrcweir                 {
1009cdf0e10cSrcweir                     mxFilterCFG = uno::Reference< XNameAccess >(
1010cdf0e10cSrcweir                         xFactory->createInstance( DEFINE_CONST_OUSTRING( "com.sun.star.document.FilterFactory" ) ),
1011cdf0e10cSrcweir                         UNO_QUERY );
1012cdf0e10cSrcweir                 }
1013cdf0e10cSrcweir                 break;
1014cdf0e10cSrcweir 
1015cdf0e10cSrcweir             case FILESAVE_AUTOEXTENSION_TEMPLATE:
1016cdf0e10cSrcweir                 nTemplateDescription = TemplateDescription::FILESAVE_AUTOEXTENSION_TEMPLATE;
1017cdf0e10cSrcweir                 mbHasAutoExt = sal_True;
1018cdf0e10cSrcweir                 mbIsSaveDlg = sal_True;
1019cdf0e10cSrcweir                 break;
1020cdf0e10cSrcweir 
1021cdf0e10cSrcweir             case FILEOPEN_LINK_PREVIEW_IMAGE_TEMPLATE:
1022cdf0e10cSrcweir                 nTemplateDescription = TemplateDescription::FILEOPEN_LINK_PREVIEW_IMAGE_TEMPLATE;
1023cdf0e10cSrcweir                 mbHasPreview = sal_True;
1024cdf0e10cSrcweir                 mbHasLink = sal_True;
1025cdf0e10cSrcweir 
1026cdf0e10cSrcweir                 // aPreviewTimer
1027cdf0e10cSrcweir                 maPreViewTimer.SetTimeout( 500 );
1028cdf0e10cSrcweir                 maPreViewTimer.SetTimeoutHdl( LINK( this, FileDialogHelper_Impl, TimeOutHdl_Impl ) );
1029cdf0e10cSrcweir                 break;
1030cdf0e10cSrcweir 
1031cdf0e10cSrcweir             case FILEOPEN_PLAY:
1032cdf0e10cSrcweir                 nTemplateDescription = TemplateDescription::FILEOPEN_PLAY;
1033cdf0e10cSrcweir                 break;
1034cdf0e10cSrcweir 
1035cdf0e10cSrcweir             case FILEOPEN_READONLY_VERSION:
1036cdf0e10cSrcweir                 nTemplateDescription = TemplateDescription::FILEOPEN_READONLY_VERSION;
1037cdf0e10cSrcweir                 mbHasVersions = sal_True;
1038cdf0e10cSrcweir                 break;
1039cdf0e10cSrcweir 
1040cdf0e10cSrcweir             case FILEOPEN_LINK_PREVIEW:
1041cdf0e10cSrcweir                 nTemplateDescription = TemplateDescription::FILEOPEN_LINK_PREVIEW;
1042cdf0e10cSrcweir                 mbHasPreview = sal_True;
1043cdf0e10cSrcweir                 mbHasLink = sal_True;
1044cdf0e10cSrcweir                 // aPreviewTimer
1045cdf0e10cSrcweir                 maPreViewTimer.SetTimeout( 500 );
1046cdf0e10cSrcweir                 maPreViewTimer.SetTimeoutHdl( LINK( this, FileDialogHelper_Impl, TimeOutHdl_Impl ) );
1047cdf0e10cSrcweir                 break;
1048cdf0e10cSrcweir 
1049cdf0e10cSrcweir             case FILESAVE_AUTOEXTENSION:
1050cdf0e10cSrcweir                 nTemplateDescription = TemplateDescription::FILESAVE_AUTOEXTENSION;
1051cdf0e10cSrcweir                 mbHasAutoExt = sal_True;
1052cdf0e10cSrcweir                 mbIsSaveDlg = sal_True;
1053cdf0e10cSrcweir                 break;
1054cdf0e10cSrcweir 
1055cdf0e10cSrcweir             default:
1056cdf0e10cSrcweir                 DBG_ERRORFILE( "FileDialogHelper::ctor with unknown type" );
1057cdf0e10cSrcweir                 break;
1058cdf0e10cSrcweir         }
1059cdf0e10cSrcweir 
1060cdf0e10cSrcweir 
1061cdf0e10cSrcweir 
1062cdf0e10cSrcweir         //Sequence < Any > aInitArguments( mbSystemPicker || !mpPreferredParentWindow ? 1 : 3 );
1063cdf0e10cSrcweir         Sequence < Any > aInitArguments( !mpPreferredParentWindow ? 3 : 4 );
1064cdf0e10cSrcweir 
1065cdf0e10cSrcweir         // This is a hack. We currently know that the internal file picker implementation
1066cdf0e10cSrcweir         // supports the extended arguments as specified below.
1067cdf0e10cSrcweir         // TODO:
1068cdf0e10cSrcweir         // a) adjust the service description so that it includes the TemplateDescription and ParentWindow args
1069cdf0e10cSrcweir         // b) adjust the implementation of the system file picker to that it recognizes it
1070cdf0e10cSrcweir         if ( mbSystemPicker )
1071cdf0e10cSrcweir         {
1072cdf0e10cSrcweir             aInitArguments[0] <<= nTemplateDescription;
1073cdf0e10cSrcweir         }
1074cdf0e10cSrcweir         else
1075cdf0e10cSrcweir         {
1076cdf0e10cSrcweir             aInitArguments[0] <<= NamedValue(
1077cdf0e10cSrcweir                                     ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "TemplateDescription" ) ),
1078cdf0e10cSrcweir                                     makeAny( nTemplateDescription )
1079cdf0e10cSrcweir                                 );
1080cdf0e10cSrcweir 
1081cdf0e10cSrcweir             ::rtl::OUString sStandardDirTemp = ::rtl::OUString( sStandardDir );
1082cdf0e10cSrcweir 
1083cdf0e10cSrcweir             aInitArguments[1] <<= NamedValue(
1084cdf0e10cSrcweir                                     ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "StandardDir" ) ),
1085cdf0e10cSrcweir                                     makeAny( sStandardDirTemp )
1086cdf0e10cSrcweir                                 );
1087cdf0e10cSrcweir 
1088cdf0e10cSrcweir             aInitArguments[2] <<= NamedValue(
1089cdf0e10cSrcweir                                     ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "BlackList" ) ),
1090cdf0e10cSrcweir                                     makeAny( rBlackList )
1091cdf0e10cSrcweir                                 );
1092cdf0e10cSrcweir 
1093cdf0e10cSrcweir 
1094cdf0e10cSrcweir             if ( mpPreferredParentWindow )
1095cdf0e10cSrcweir                 aInitArguments[3] <<= NamedValue(
1096cdf0e10cSrcweir                                         ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ParentWindow" ) ),
1097cdf0e10cSrcweir                                         makeAny( VCLUnoHelper::GetInterface( mpPreferredParentWindow ) )
1098cdf0e10cSrcweir                                     );
1099cdf0e10cSrcweir 
1100cdf0e10cSrcweir 
1101cdf0e10cSrcweir         }
1102cdf0e10cSrcweir 
1103cdf0e10cSrcweir         try
1104cdf0e10cSrcweir         {
1105cdf0e10cSrcweir             xInit->initialize( aInitArguments );
1106cdf0e10cSrcweir         }
1107cdf0e10cSrcweir         catch( const Exception& )
1108cdf0e10cSrcweir         {
1109cdf0e10cSrcweir             DBG_ERROR( "FileDialogHelper_Impl::FileDialogHelper_Impl: could not initialize the picker!" );
1110cdf0e10cSrcweir         }
1111cdf0e10cSrcweir     }
1112cdf0e10cSrcweir 
1113cdf0e10cSrcweir 
1114cdf0e10cSrcweir     // set multiselection mode
1115cdf0e10cSrcweir     if ( nFlags & SFXWB_MULTISELECTION )
1116cdf0e10cSrcweir         mxFileDlg->setMultiSelectionMode( sal_True );
1117cdf0e10cSrcweir 
1118cdf0e10cSrcweir     if ( mbHasLink )        // generate graphic filter only on demand
1119cdf0e10cSrcweir         addGraphicFilter();
1120cdf0e10cSrcweir 
1121cdf0e10cSrcweir     // Export dialog
1122cdf0e10cSrcweir     if ( mbExport )
1123cdf0e10cSrcweir     {
1124cdf0e10cSrcweir         mxFileDlg->setTitle( OUString( String( SfxResId( STR_SFX_EXPLORERFILE_EXPORT ) ) ) );
1125cdf0e10cSrcweir         try {
1126cdf0e10cSrcweir                 com::sun::star::uno::Reference < XFilePickerControlAccess > xCtrlAccess( mxFileDlg, UNO_QUERY_THROW );
1127cdf0e10cSrcweir                 xCtrlAccess->enableControl( ExtendedFilePickerElementIds::LISTBOX_FILTER_SELECTOR, sal_True );
1128cdf0e10cSrcweir         }
1129cdf0e10cSrcweir         catch( const Exception & ) { }
1130cdf0e10cSrcweir     }
1131cdf0e10cSrcweir 
1132cdf0e10cSrcweir     // the "insert file" dialog needs another title
1133cdf0e10cSrcweir     if ( mbInsert )
1134cdf0e10cSrcweir     {
1135cdf0e10cSrcweir         mxFileDlg->setTitle( OUString( String( SfxResId( STR_SFX_EXPLORERFILE_INSERT ) ) ) );
1136cdf0e10cSrcweir         uno::Reference < XFilePickerControlAccess > xExtDlg( mxFileDlg, UNO_QUERY );
1137cdf0e10cSrcweir         if ( xExtDlg.is() )
1138cdf0e10cSrcweir         {
1139cdf0e10cSrcweir             try
1140cdf0e10cSrcweir             {
1141cdf0e10cSrcweir                 xExtDlg->setLabel( CommonFilePickerElementIds::PUSHBUTTON_OK,
1142cdf0e10cSrcweir                                    OUString( String( SfxResId( STR_SFX_EXPLORERFILE_BUTTONINSERT ) ) ) );
1143cdf0e10cSrcweir             }
1144cdf0e10cSrcweir             catch( IllegalArgumentException ){}
1145cdf0e10cSrcweir         }
1146cdf0e10cSrcweir     }
1147cdf0e10cSrcweir 
1148cdf0e10cSrcweir     // add the event listener
1149cdf0e10cSrcweir     xNotifier->addFilePickerListener( this );
1150cdf0e10cSrcweir }
1151cdf0e10cSrcweir 
1152cdf0e10cSrcweir // ------------------------------------------------------------------------
~FileDialogHelper_Impl()1153cdf0e10cSrcweir FileDialogHelper_Impl::~FileDialogHelper_Impl()
1154cdf0e10cSrcweir {
1155cdf0e10cSrcweir     // Remove user event if we haven't received it yet
1156cdf0e10cSrcweir     if ( mnPostUserEventId )
1157cdf0e10cSrcweir         Application::RemoveUserEvent( mnPostUserEventId );
1158cdf0e10cSrcweir     mnPostUserEventId = 0;
1159cdf0e10cSrcweir 
1160cdf0e10cSrcweir     delete mpGraphicFilter;
1161cdf0e10cSrcweir 
1162cdf0e10cSrcweir     if ( mbDeleteMatcher )
1163cdf0e10cSrcweir         delete mpMatcher;
1164cdf0e10cSrcweir 
1165cdf0e10cSrcweir     maPreViewTimer.SetTimeoutHdl( Link() );
1166cdf0e10cSrcweir 
1167cdf0e10cSrcweir     ::comphelper::disposeComponent( mxFileDlg );
1168cdf0e10cSrcweir }
1169cdf0e10cSrcweir 
1170cdf0e10cSrcweir #define nMagic -1
1171cdf0e10cSrcweir 
1172cdf0e10cSrcweir class PickerThread_Impl : public ::vos::OThread
1173cdf0e10cSrcweir {
1174cdf0e10cSrcweir     uno::Reference < XFilePicker > mxPicker;
1175cdf0e10cSrcweir     ::vos::OMutex           maMutex;
1176cdf0e10cSrcweir     virtual void SAL_CALL   run();
1177cdf0e10cSrcweir     sal_Int16               mnRet;
1178cdf0e10cSrcweir public:
PickerThread_Impl(const uno::Reference<XFilePicker> & rPicker)1179cdf0e10cSrcweir                             PickerThread_Impl( const uno::Reference < XFilePicker >& rPicker )
1180cdf0e10cSrcweir                             : mxPicker( rPicker ), mnRet(nMagic) {}
1181cdf0e10cSrcweir 
GetReturnValue()1182cdf0e10cSrcweir     sal_Int16               GetReturnValue()
1183cdf0e10cSrcweir                             { ::vos::OGuard aGuard( maMutex ); return mnRet; }
1184cdf0e10cSrcweir 
SetReturnValue(sal_Int16 aRetValue)1185cdf0e10cSrcweir     void                    SetReturnValue( sal_Int16 aRetValue )
1186cdf0e10cSrcweir                             { ::vos::OGuard aGuard( maMutex ); mnRet = aRetValue; }
1187cdf0e10cSrcweir };
1188cdf0e10cSrcweir 
run()1189cdf0e10cSrcweir void SAL_CALL PickerThread_Impl::run()
1190cdf0e10cSrcweir {
1191cdf0e10cSrcweir     try
1192cdf0e10cSrcweir     {
1193cdf0e10cSrcweir         sal_Int16 n = mxPicker->execute();
1194cdf0e10cSrcweir         SetReturnValue( n );
1195cdf0e10cSrcweir     }
1196cdf0e10cSrcweir     catch( RuntimeException& )
1197cdf0e10cSrcweir     {
1198cdf0e10cSrcweir         SetReturnValue( ExecutableDialogResults::CANCEL );
1199cdf0e10cSrcweir         DBG_ERRORFILE( "RuntimeException caught" );
1200cdf0e10cSrcweir     }
1201cdf0e10cSrcweir }
1202cdf0e10cSrcweir 
1203cdf0e10cSrcweir // ------------------------------------------------------------------------
setControlHelpIds(const sal_Int16 * _pControlId,const char ** _pHelpId)1204cdf0e10cSrcweir void FileDialogHelper_Impl::setControlHelpIds( const sal_Int16* _pControlId, const char** _pHelpId )
1205cdf0e10cSrcweir {
1206cdf0e10cSrcweir     DBG_ASSERT( _pControlId && _pHelpId, "FileDialogHelper_Impl::setControlHelpIds: invalid array pointers!" );
1207cdf0e10cSrcweir     if ( !_pControlId || !_pHelpId )
1208cdf0e10cSrcweir         return;
1209cdf0e10cSrcweir 
1210cdf0e10cSrcweir     // forward these ids to the file picker
1211cdf0e10cSrcweir     try
1212cdf0e10cSrcweir     {
1213cdf0e10cSrcweir         const ::rtl::OUString sHelpIdPrefix( RTL_CONSTASCII_USTRINGPARAM( INET_HID_SCHEME ) );
1214cdf0e10cSrcweir         // the ids for the single controls
1215cdf0e10cSrcweir         uno::Reference< XFilePickerControlAccess > xControlAccess( mxFileDlg, UNO_QUERY );
1216cdf0e10cSrcweir         if ( xControlAccess.is() )
1217cdf0e10cSrcweir         {
1218cdf0e10cSrcweir             while ( *_pControlId )
1219cdf0e10cSrcweir             {
1220cdf0e10cSrcweir                 DBG_ASSERT( INetURLObject( rtl::OStringToOUString( *_pHelpId, RTL_TEXTENCODING_UTF8 ) ).GetProtocol() == INET_PROT_NOT_VALID, "Wrong HelpId!" );
1221cdf0e10cSrcweir                 ::rtl::OUString sId( sHelpIdPrefix );
1222cdf0e10cSrcweir                 sId += ::rtl::OUString( *_pHelpId, strlen( *_pHelpId ), RTL_TEXTENCODING_UTF8 );
1223cdf0e10cSrcweir                 xControlAccess->setValue( *_pControlId, ControlActions::SET_HELP_URL, makeAny( sId ) );
1224cdf0e10cSrcweir 
1225cdf0e10cSrcweir                 ++_pControlId; ++_pHelpId;
1226cdf0e10cSrcweir             }
1227cdf0e10cSrcweir         }
1228cdf0e10cSrcweir     }
1229cdf0e10cSrcweir     catch( const Exception& )
1230cdf0e10cSrcweir     {
1231cdf0e10cSrcweir         DBG_ERROR( "FileDialogHelper_Impl::setControlHelpIds: caught an exception while setting the help ids!" );
1232cdf0e10cSrcweir     }
1233cdf0e10cSrcweir }
1234cdf0e10cSrcweir 
1235cdf0e10cSrcweir // ------------------------------------------------------------------------
IMPL_LINK(FileDialogHelper_Impl,InitControls,void *,NOTINTERESTEDIN)1236cdf0e10cSrcweir IMPL_LINK( FileDialogHelper_Impl, InitControls, void*, NOTINTERESTEDIN )
1237cdf0e10cSrcweir {
1238cdf0e10cSrcweir     (void)NOTINTERESTEDIN;
1239cdf0e10cSrcweir     mnPostUserEventId = 0;
1240cdf0e10cSrcweir     enablePasswordBox( sal_True );
1241cdf0e10cSrcweir     updateFilterOptionsBox( );
1242cdf0e10cSrcweir     updateSelectionBox( );
1243cdf0e10cSrcweir 
1244cdf0e10cSrcweir     return 0L;
1245cdf0e10cSrcweir }
1246cdf0e10cSrcweir 
1247cdf0e10cSrcweir // ------------------------------------------------------------------------
preExecute()1248cdf0e10cSrcweir void FileDialogHelper_Impl::preExecute()
1249cdf0e10cSrcweir {
1250cdf0e10cSrcweir     loadConfig( );
1251cdf0e10cSrcweir     setDefaultValues( );
1252cdf0e10cSrcweir     updatePreviewState( sal_False );
1253cdf0e10cSrcweir 
1254cdf0e10cSrcweir     implInitializeFileName( );
1255cdf0e10cSrcweir     // #106079# / 2002-12-09 / fs@openoffice.org
1256cdf0e10cSrcweir 
1257cdf0e10cSrcweir #if !(defined(MACOSX) && defined(QUARTZ)) && !defined(WNT)
1258cdf0e10cSrcweir     // allow for dialog implementations which need to be executed before they return valid values for
1259cdf0e10cSrcweir     // current filter and such
1260cdf0e10cSrcweir 
1261cdf0e10cSrcweir     // On Vista (at least SP1) it's the same as on MacOSX, the modal dialog won't let message pass
1262cdf0e10cSrcweir     // through before it returns from execution
1263cdf0e10cSrcweir     mnPostUserEventId = Application::PostUserEvent( LINK( this, FileDialogHelper_Impl, InitControls ) );
1264cdf0e10cSrcweir #else
1265cdf0e10cSrcweir     // However, the Mac OS X implementation's pickers run modally in execute and so the event doesn't
1266cdf0e10cSrcweir     // get through in time... so we call the methods directly
1267cdf0e10cSrcweir     enablePasswordBox( sal_True );
1268cdf0e10cSrcweir     updateFilterOptionsBox( );
1269cdf0e10cSrcweir     updateSelectionBox( );
1270cdf0e10cSrcweir #endif
1271cdf0e10cSrcweir }
1272cdf0e10cSrcweir 
1273cdf0e10cSrcweir // ------------------------------------------------------------------------
postExecute(sal_Int16 _nResult)1274cdf0e10cSrcweir void FileDialogHelper_Impl::postExecute( sal_Int16 _nResult )
1275cdf0e10cSrcweir {
1276cdf0e10cSrcweir     if ( ExecutableDialogResults::CANCEL != _nResult )
1277cdf0e10cSrcweir         saveConfig();
1278cdf0e10cSrcweir }
1279cdf0e10cSrcweir 
1280cdf0e10cSrcweir // ------------------------------------------------------------------------
implInitializeFileName()1281cdf0e10cSrcweir void FileDialogHelper_Impl::implInitializeFileName( )
1282cdf0e10cSrcweir {
1283cdf0e10cSrcweir     if ( maFileName.getLength() )
1284cdf0e10cSrcweir     {
1285cdf0e10cSrcweir         INetURLObject aObj( maPath );
1286cdf0e10cSrcweir         aObj.Append( maFileName );
1287cdf0e10cSrcweir 
1288cdf0e10cSrcweir         // in case we're operating as save dialog, and "auto extension" is checked,
1289cdf0e10cSrcweir         // cut the extension from the name
1290cdf0e10cSrcweir         // #106079# / 2002-12-09 / fs@openoffice.org
1291cdf0e10cSrcweir         if ( mbIsSaveDlg && mbHasAutoExt )
1292cdf0e10cSrcweir         {
1293cdf0e10cSrcweir             try
1294cdf0e10cSrcweir             {
1295cdf0e10cSrcweir                 sal_Bool bAutoExtChecked = sal_False;
1296cdf0e10cSrcweir 
1297cdf0e10cSrcweir                 uno::Reference < XFilePickerControlAccess > xControlAccess( mxFileDlg, UNO_QUERY );
1298cdf0e10cSrcweir                 if  (   xControlAccess.is()
1299cdf0e10cSrcweir                     &&  (   xControlAccess->getValue( ExtendedFilePickerElementIds::CHECKBOX_AUTOEXTENSION, 0 )
1300cdf0e10cSrcweir                         >>= bAutoExtChecked
1301cdf0e10cSrcweir                         )
1302cdf0e10cSrcweir                     )
1303cdf0e10cSrcweir                 {
1304cdf0e10cSrcweir                     if ( bAutoExtChecked )
1305cdf0e10cSrcweir                     {   // cut the extension
1306cdf0e10cSrcweir                         aObj.removeExtension( );
1307cdf0e10cSrcweir                         mxFileDlg->setDefaultName( aObj.GetName( INetURLObject::DECODE_WITH_CHARSET ) );
1308cdf0e10cSrcweir                     }
1309cdf0e10cSrcweir                 }
1310cdf0e10cSrcweir             }
1311cdf0e10cSrcweir             catch( const Exception& )
1312cdf0e10cSrcweir             {
1313cdf0e10cSrcweir                 DBG_ERROR( "FileDialogHelper_Impl::implInitializeFileName: could not ask for the auto-extension current-value!" );
1314cdf0e10cSrcweir             }
1315cdf0e10cSrcweir         }
1316cdf0e10cSrcweir     }
1317cdf0e10cSrcweir }
1318cdf0e10cSrcweir 
1319cdf0e10cSrcweir // ------------------------------------------------------------------------
implDoExecute()1320cdf0e10cSrcweir sal_Int16 FileDialogHelper_Impl::implDoExecute()
1321cdf0e10cSrcweir {
1322cdf0e10cSrcweir     preExecute();
1323cdf0e10cSrcweir 
1324cdf0e10cSrcweir     sal_Int16 nRet = ExecutableDialogResults::CANCEL;
1325cdf0e10cSrcweir 
1326cdf0e10cSrcweir //On MacOSX the native file picker has to run in the primordial thread because of drawing issues
1327cdf0e10cSrcweir //On Linux the native gtk file picker, when backed by gnome-vfs2, needs to be run in the same
1328cdf0e10cSrcweir //primordial thread as the ucb gnome-vfs2 provider was initialized in.
1329cdf0e10cSrcweir /*
1330cdf0e10cSrcweir #ifdef WNT
1331cdf0e10cSrcweir     if ( mbSystemPicker )
1332cdf0e10cSrcweir     {
1333cdf0e10cSrcweir         PickerThread_Impl* pThread = new PickerThread_Impl( mxFileDlg );
1334cdf0e10cSrcweir         pThread->create();
1335cdf0e10cSrcweir         while ( pThread->GetReturnValue() == nMagic )
1336cdf0e10cSrcweir             Application::Yield();
1337cdf0e10cSrcweir         pThread->join();
1338cdf0e10cSrcweir         nRet = pThread->GetReturnValue();
1339cdf0e10cSrcweir         delete pThread;
1340cdf0e10cSrcweir     }
1341cdf0e10cSrcweir     else
1342cdf0e10cSrcweir #endif
1343cdf0e10cSrcweir */
1344cdf0e10cSrcweir     {
1345cdf0e10cSrcweir         try
1346cdf0e10cSrcweir         {
1347cdf0e10cSrcweir #ifdef WNT
1348cdf0e10cSrcweir             if ( mbSystemPicker )
1349cdf0e10cSrcweir             {
1350cdf0e10cSrcweir                 OReleaseSolarMutex aSolarMutex;
1351cdf0e10cSrcweir                 nRet = mxFileDlg->execute();
1352cdf0e10cSrcweir             }
1353cdf0e10cSrcweir             else
1354cdf0e10cSrcweir #endif
1355cdf0e10cSrcweir             nRet = mxFileDlg->execute();
1356cdf0e10cSrcweir         }
1357cdf0e10cSrcweir         catch( const Exception& )
1358cdf0e10cSrcweir         {
1359cdf0e10cSrcweir             DBG_ERRORFILE( "FileDialogHelper_Impl::implDoExecute: caught an exception!" );
1360cdf0e10cSrcweir         }
1361cdf0e10cSrcweir     }
1362cdf0e10cSrcweir 
1363cdf0e10cSrcweir     postExecute( nRet );
1364cdf0e10cSrcweir 
1365cdf0e10cSrcweir     return nRet;
1366cdf0e10cSrcweir }
1367cdf0e10cSrcweir 
1368cdf0e10cSrcweir // ------------------------------------------------------------------------
implStartExecute()1369cdf0e10cSrcweir void FileDialogHelper_Impl::implStartExecute()
1370cdf0e10cSrcweir {
1371cdf0e10cSrcweir     DBG_ASSERT( mxFileDlg.is(), "invalid file dialog" );
1372cdf0e10cSrcweir 
1373cdf0e10cSrcweir     preExecute();
1374cdf0e10cSrcweir 
1375cdf0e10cSrcweir     if ( mbSystemPicker )
1376cdf0e10cSrcweir     {
1377cdf0e10cSrcweir     }
1378cdf0e10cSrcweir     else
1379cdf0e10cSrcweir     {
1380cdf0e10cSrcweir         try
1381cdf0e10cSrcweir         {
1382cdf0e10cSrcweir             uno::Reference< XAsynchronousExecutableDialog > xAsyncDlg( mxFileDlg, UNO_QUERY );
1383cdf0e10cSrcweir             if ( xAsyncDlg.is() )
1384cdf0e10cSrcweir                 xAsyncDlg->startExecuteModal( this );
1385cdf0e10cSrcweir         }
1386cdf0e10cSrcweir         catch( const Exception& )
1387cdf0e10cSrcweir         {
1388cdf0e10cSrcweir             DBG_ERRORFILE( "FileDialogHelper_Impl::implDoExecute: caught an exception!" );
1389cdf0e10cSrcweir         }
1390cdf0e10cSrcweir     }
1391cdf0e10cSrcweir }
1392cdf0e10cSrcweir 
1393cdf0e10cSrcweir // ------------------------------------------------------------------------
implEnsureURLExtension(const String & sURL,const String &)1394cdf0e10cSrcweir String FileDialogHelper_Impl::implEnsureURLExtension(const String& sURL,
1395cdf0e10cSrcweir                                                      const String& /*sExtension*/)
1396cdf0e10cSrcweir {
1397cdf0e10cSrcweir     return sURL;
1398cdf0e10cSrcweir     /*
1399cdf0e10cSrcweir     // This feature must be active for file save/export only !
1400cdf0e10cSrcweir     if (
1401cdf0e10cSrcweir         (! mbIsSaveDlg) &&
1402cdf0e10cSrcweir         (! mbExport   )
1403cdf0e10cSrcweir         )
1404cdf0e10cSrcweir         return sURL;
1405cdf0e10cSrcweir 
1406cdf0e10cSrcweir     // no extension available (because "ALL *.*" was selected) ?
1407cdf0e10cSrcweir     // Nod idea what else should happen here .-)
1408cdf0e10cSrcweir     if (sExtension.Len() < 1)
1409cdf0e10cSrcweir         return sURL;
1410cdf0e10cSrcweir 
1411cdf0e10cSrcweir     // Some FilePicker implementations already add the right extension ...
1412cdf0e10cSrcweir     // or might be the user used the right one already ...
1413cdf0e10cSrcweir     // Dont create duplicate extension.
1414cdf0e10cSrcweir     INetURLObject aURL(sURL);
1415cdf0e10cSrcweir     if (aURL.getExtension().equals(sExtension))
1416cdf0e10cSrcweir         return sURL;
1417cdf0e10cSrcweir 
1418cdf0e10cSrcweir     // Ignore any other extension set by the user.
1419cdf0e10cSrcweir     // Make sure suitable extension is used always.
1420cdf0e10cSrcweir     // e.g. "test.bla.odt" for "ODT"
1421cdf0e10cSrcweir     ::rtl::OUStringBuffer sNewURL(256);
1422cdf0e10cSrcweir     sNewURL.append     (sURL      );
1423cdf0e10cSrcweir     sNewURL.appendAscii("."       );
1424cdf0e10cSrcweir     sNewURL.append     (sExtension);
1425cdf0e10cSrcweir     return sNewURL.makeStringAndClear();
1426cdf0e10cSrcweir     */
1427cdf0e10cSrcweir }
1428cdf0e10cSrcweir 
1429cdf0e10cSrcweir // ------------------------------------------------------------------------
lcl_saveLastURLs(SvStringsDtor * & rpURLList,::comphelper::SequenceAsVector<::rtl::OUString> & lLastURLs)1430cdf0e10cSrcweir void lcl_saveLastURLs(SvStringsDtor*&                                    rpURLList ,
1431cdf0e10cSrcweir                       ::comphelper::SequenceAsVector< ::rtl::OUString >& lLastURLs )
1432cdf0e10cSrcweir {
1433cdf0e10cSrcweir     lLastURLs.clear();
1434cdf0e10cSrcweir     sal_uInt16 c = rpURLList->Count();
1435cdf0e10cSrcweir     sal_uInt16 i = 0;
1436cdf0e10cSrcweir     for (i=0; i<c; ++i)
1437cdf0e10cSrcweir         lLastURLs.push_back(*(rpURLList->GetObject(i)));
1438cdf0e10cSrcweir }
1439cdf0e10cSrcweir 
1440cdf0e10cSrcweir // ------------------------------------------------------------------------
implGetAndCacheFiles(const uno::Reference<XInterface> & xPicker,SvStringsDtor * & rpURLList,const SfxFilter * pFilter)1441cdf0e10cSrcweir void FileDialogHelper_Impl::implGetAndCacheFiles(const uno::Reference< XInterface >& xPicker  ,
1442cdf0e10cSrcweir                                                        SvStringsDtor*&               rpURLList,
1443cdf0e10cSrcweir                                                  const SfxFilter*                    pFilter  )
1444cdf0e10cSrcweir {
1445cdf0e10cSrcweir     rpURLList = NULL;
1446cdf0e10cSrcweir 
1447cdf0e10cSrcweir     String sExtension;
1448cdf0e10cSrcweir     if (pFilter)
1449cdf0e10cSrcweir     {
1450cdf0e10cSrcweir         sExtension = pFilter->GetDefaultExtension ();
1451cdf0e10cSrcweir         sExtension.EraseAllChars( '*' );
1452cdf0e10cSrcweir         sExtension.EraseAllChars( '.' );
1453cdf0e10cSrcweir     }
1454cdf0e10cSrcweir 
1455cdf0e10cSrcweir     // a) the new way (optional!)
1456cdf0e10cSrcweir     uno::Reference< XFilePicker2 > xPickNew(xPicker, UNO_QUERY);
1457cdf0e10cSrcweir     if (xPickNew.is())
1458cdf0e10cSrcweir     {
1459cdf0e10cSrcweir                              rpURLList = new SvStringsDtor;
1460cdf0e10cSrcweir         Sequence< OUString > lFiles    = xPickNew->getSelectedFiles();
1461cdf0e10cSrcweir         ::sal_Int32          nFiles    = lFiles.getLength();
1462cdf0e10cSrcweir         for (::sal_Int32 i = 0; i < nFiles; i++)
1463cdf0e10cSrcweir         {
1464cdf0e10cSrcweir             String* pURL = new String(implEnsureURLExtension(lFiles[i], sExtension));
1465cdf0e10cSrcweir             rpURLList->Insert( pURL, rpURLList->Count() );
1466cdf0e10cSrcweir         }
1467cdf0e10cSrcweir     }
1468cdf0e10cSrcweir 
1469cdf0e10cSrcweir     // b) the olde way ... non optional.
1470cdf0e10cSrcweir     else
1471cdf0e10cSrcweir     {
1472cdf0e10cSrcweir         uno::Reference< XFilePicker > xPickOld(xPicker, UNO_QUERY_THROW);
1473cdf0e10cSrcweir         Sequence< OUString > lFiles = xPickOld->getFiles();
1474cdf0e10cSrcweir         ::sal_Int32          nFiles = lFiles.getLength();
1475cdf0e10cSrcweir         if ( nFiles == 1 )
1476cdf0e10cSrcweir         {
1477cdf0e10cSrcweir                     rpURLList = new SvStringsDtor;
1478cdf0e10cSrcweir             String* pURL      = new String(implEnsureURLExtension(lFiles[0], sExtension));
1479cdf0e10cSrcweir             rpURLList->Insert( pURL, 0 );
1480cdf0e10cSrcweir         }
1481cdf0e10cSrcweir         else
1482cdf0e10cSrcweir         if ( nFiles > 1 )
1483cdf0e10cSrcweir         {
1484cdf0e10cSrcweir             rpURLList = new SvStringsDtor;
1485cdf0e10cSrcweir 
1486cdf0e10cSrcweir             INetURLObject aPath( lFiles[0] );
1487cdf0e10cSrcweir             aPath.setFinalSlash();
1488cdf0e10cSrcweir 
1489cdf0e10cSrcweir             for (::sal_Int32 i = 1; i < nFiles; i++)
1490cdf0e10cSrcweir             {
1491cdf0e10cSrcweir                 if (i == 1)
1492cdf0e10cSrcweir                     aPath.Append( lFiles[i] );
1493cdf0e10cSrcweir                 else
1494cdf0e10cSrcweir                     aPath.setName( lFiles[i] );
1495cdf0e10cSrcweir 
1496cdf0e10cSrcweir                 String* pURL = new String(implEnsureURLExtension(aPath.GetMainURL( INetURLObject::NO_DECODE ), sExtension) );
1497cdf0e10cSrcweir                 rpURLList->Insert( pURL, rpURLList->Count() );
1498cdf0e10cSrcweir             }
1499cdf0e10cSrcweir         }
1500cdf0e10cSrcweir     }
1501cdf0e10cSrcweir 
1502cdf0e10cSrcweir     lcl_saveLastURLs(rpURLList, mlLastURLs);
1503cdf0e10cSrcweir }
1504cdf0e10cSrcweir 
1505cdf0e10cSrcweir // ------------------------------------------------------------------------
execute(SvStringsDtor * & rpURLList,SfxItemSet * & rpSet,String & rFilter)1506cdf0e10cSrcweir ErrCode FileDialogHelper_Impl::execute( SvStringsDtor*& rpURLList,
1507cdf0e10cSrcweir                                         SfxItemSet *&   rpSet,
1508cdf0e10cSrcweir                                         String&         rFilter )
1509cdf0e10cSrcweir {
1510cdf0e10cSrcweir     // rFilter is a pure output parameter, it shouldn't be used for anything else
1511cdf0e10cSrcweir     // changing this would surely break code
1512cdf0e10cSrcweir     // rpSet is in/out parameter, usually just a media-descriptor that can be changed by dialog
1513cdf0e10cSrcweir 
1514cdf0e10cSrcweir     uno::Reference< XFilePickerControlAccess > xCtrlAccess( mxFileDlg, UNO_QUERY );
1515cdf0e10cSrcweir 
1516cdf0e10cSrcweir     // retrieves parameters from rpSet
1517cdf0e10cSrcweir     // for now only Password is used
1518cdf0e10cSrcweir     if ( rpSet )
1519cdf0e10cSrcweir     {
1520cdf0e10cSrcweir         // check password checkbox if the document had password before
1521cdf0e10cSrcweir         if( mbHasPassword )
1522cdf0e10cSrcweir         {
1523cdf0e10cSrcweir             SFX_ITEMSET_ARG( rpSet, pPassItem, SfxBoolItem, SID_PASSWORDINTERACTION, sal_False );
1524cdf0e10cSrcweir             mbPwdCheckBoxState = ( pPassItem != NULL && pPassItem->GetValue() );
1525cdf0e10cSrcweir 
1526cdf0e10cSrcweir             // in case the document has password to modify, the dialog should be shown
1527cdf0e10cSrcweir             SFX_ITEMSET_ARG( rpSet, pPassToModifyItem, SfxUnoAnyItem, SID_MODIFYPASSWORDINFO, sal_False );
1528cdf0e10cSrcweir             mbPwdCheckBoxState |= ( pPassToModifyItem && pPassToModifyItem->GetValue().hasValue() );
1529cdf0e10cSrcweir         }
1530cdf0e10cSrcweir 
1531cdf0e10cSrcweir         SFX_ITEMSET_ARG( rpSet, pSelectItem, SfxBoolItem, SID_SELECTION, sal_False );
1532cdf0e10cSrcweir         if ( pSelectItem )
1533cdf0e10cSrcweir             mbSelection = pSelectItem->GetValue();
1534cdf0e10cSrcweir         else
1535cdf0e10cSrcweir             mbSelectionEnabled = sal_False;
1536cdf0e10cSrcweir 
1537cdf0e10cSrcweir         // the password will be set in case user decide so
1538cdf0e10cSrcweir         rpSet->ClearItem( SID_PASSWORDINTERACTION );
1539cdf0e10cSrcweir         rpSet->ClearItem( SID_PASSWORD );
1540cdf0e10cSrcweir         rpSet->ClearItem( SID_ENCRYPTIONDATA );
1541cdf0e10cSrcweir         rpSet->ClearItem( SID_RECOMMENDREADONLY );
1542cdf0e10cSrcweir         rpSet->ClearItem( SID_MODIFYPASSWORDINFO );
1543cdf0e10cSrcweir 
1544cdf0e10cSrcweir     }
1545cdf0e10cSrcweir 
1546cdf0e10cSrcweir     if ( mbHasPassword && !mbPwdCheckBoxState )
1547cdf0e10cSrcweir     {
1548cdf0e10cSrcweir         SvtSecurityOptions aSecOpt;
1549cdf0e10cSrcweir         mbPwdCheckBoxState = (
1550cdf0e10cSrcweir             aSecOpt.IsOptionSet( SvtSecurityOptions::E_DOCWARN_RECOMMENDPASSWORD ) );
1551cdf0e10cSrcweir     }
1552cdf0e10cSrcweir 
1553cdf0e10cSrcweir     rpURLList = NULL;
1554cdf0e10cSrcweir 
1555cdf0e10cSrcweir     if ( ! mxFileDlg.is() )
1556cdf0e10cSrcweir         return ERRCODE_ABORT;
1557cdf0e10cSrcweir 
1558cdf0e10cSrcweir     if ( ExecutableDialogResults::CANCEL != implDoExecute() )
1559cdf0e10cSrcweir     {
1560cdf0e10cSrcweir         // create an itemset if there is no
1561cdf0e10cSrcweir         if( !rpSet )
1562cdf0e10cSrcweir             rpSet = new SfxAllItemSet( SFX_APP()->GetPool() );
1563cdf0e10cSrcweir 
1564cdf0e10cSrcweir         // the item should remain only if it was set by the dialog
1565cdf0e10cSrcweir         rpSet->ClearItem( SID_SELECTION );
1566cdf0e10cSrcweir 
1567cdf0e10cSrcweir         if( mbExport && mbHasSelectionBox )
1568cdf0e10cSrcweir         {
1569cdf0e10cSrcweir             try
1570cdf0e10cSrcweir             {
1571cdf0e10cSrcweir                 Any aValue = xCtrlAccess->getValue( ExtendedFilePickerElementIds::CHECKBOX_SELECTION, 0 );
1572cdf0e10cSrcweir                 sal_Bool bSelection = sal_False;
1573cdf0e10cSrcweir                 if ( aValue >>= bSelection )
1574cdf0e10cSrcweir                     rpSet->Put( SfxBoolItem( SID_SELECTION, bSelection ) );
1575cdf0e10cSrcweir             }
1576cdf0e10cSrcweir             catch( IllegalArgumentException )
1577cdf0e10cSrcweir             {
1578cdf0e10cSrcweir                 DBG_ERROR( "FileDialogHelper_Impl::execute: caught an IllegalArgumentException!" );
1579cdf0e10cSrcweir             }
1580cdf0e10cSrcweir         }
1581cdf0e10cSrcweir 
1582cdf0e10cSrcweir 
1583cdf0e10cSrcweir         // set the read-only flag. When inserting a file, this flag is always set
1584cdf0e10cSrcweir         if ( mbInsert )
1585cdf0e10cSrcweir             rpSet->Put( SfxBoolItem( SID_DOC_READONLY, sal_True ) );
1586cdf0e10cSrcweir         else
1587cdf0e10cSrcweir         {
1588cdf0e10cSrcweir             if ( ( FILEOPEN_READONLY_VERSION == m_nDialogType ) && xCtrlAccess.is() )
1589cdf0e10cSrcweir             {
1590cdf0e10cSrcweir                 try
1591cdf0e10cSrcweir                 {
1592cdf0e10cSrcweir                     Any aValue = xCtrlAccess->getValue( ExtendedFilePickerElementIds::CHECKBOX_READONLY, 0 );
1593cdf0e10cSrcweir                     sal_Bool bReadOnly = sal_False;
1594cdf0e10cSrcweir                     if ( ( aValue >>= bReadOnly ) && bReadOnly )
1595cdf0e10cSrcweir                         rpSet->Put( SfxBoolItem( SID_DOC_READONLY, bReadOnly ) );
1596cdf0e10cSrcweir                 }
1597cdf0e10cSrcweir                 catch( IllegalArgumentException )
1598cdf0e10cSrcweir                 {
1599cdf0e10cSrcweir                     DBG_ERROR( "FileDialogHelper_Impl::execute: caught an IllegalArgumentException!" );
1600cdf0e10cSrcweir                 }
1601cdf0e10cSrcweir             }
1602cdf0e10cSrcweir         }
1603cdf0e10cSrcweir         if ( mbHasVersions && xCtrlAccess.is() )
1604cdf0e10cSrcweir         {
1605cdf0e10cSrcweir             try
1606cdf0e10cSrcweir             {
1607cdf0e10cSrcweir                 Any aValue = xCtrlAccess->getValue( ExtendedFilePickerElementIds::LISTBOX_VERSION,
1608cdf0e10cSrcweir                                                     ControlActions::GET_SELECTED_ITEM_INDEX );
1609cdf0e10cSrcweir                 sal_Int32 nVersion = 0;
1610cdf0e10cSrcweir                 if ( ( aValue >>= nVersion ) && nVersion > 0 )
1611cdf0e10cSrcweir                     // open a special version; 0 == current version
1612cdf0e10cSrcweir                     rpSet->Put( SfxInt16Item( SID_VERSION, (short)nVersion ) );
1613cdf0e10cSrcweir             }
1614cdf0e10cSrcweir             catch( IllegalArgumentException ){}
1615cdf0e10cSrcweir         }
1616cdf0e10cSrcweir 
1617cdf0e10cSrcweir         // set the filter
1618cdf0e10cSrcweir         getRealFilter( rFilter );
1619cdf0e10cSrcweir 
1620cdf0e10cSrcweir         const SfxFilter* pCurrentFilter = getCurentSfxFilter();
1621cdf0e10cSrcweir 
1622cdf0e10cSrcweir         // fill the rpURLList
1623cdf0e10cSrcweir         implGetAndCacheFiles( mxFileDlg, rpURLList, pCurrentFilter );
1624cdf0e10cSrcweir         if ( rpURLList == NULL || rpURLList->GetObject(0) == NULL )
1625cdf0e10cSrcweir             return ERRCODE_ABORT;
1626cdf0e10cSrcweir 
162774cbd1f1SMatthias Seidel         // check, whether or not we have to display a password box
1628cdf0e10cSrcweir         if ( pCurrentFilter && mbHasPassword && mbIsPwdEnabled && xCtrlAccess.is() )
1629cdf0e10cSrcweir         {
1630cdf0e10cSrcweir             try
1631cdf0e10cSrcweir             {
1632cdf0e10cSrcweir                 Any aValue = xCtrlAccess->getValue( ExtendedFilePickerElementIds::CHECKBOX_PASSWORD, 0 );
1633cdf0e10cSrcweir                 sal_Bool bPassWord = sal_False;
1634cdf0e10cSrcweir                 if ( ( aValue >>= bPassWord ) && bPassWord )
1635cdf0e10cSrcweir                 {
1636cdf0e10cSrcweir                     // ask for a password
1637cdf0e10cSrcweir                     uno::Reference < ::com::sun::star::task::XInteractionHandler > xInteractionHandler( ::comphelper::getProcessServiceFactory()->createInstance(::rtl::OUString::createFromAscii("com.sun.star.comp.uui.UUIInteractionHandler")), UNO_QUERY );
1638cdf0e10cSrcweir 
1639cdf0e10cSrcweir                     if( xInteractionHandler.is() )
1640cdf0e10cSrcweir                     {
1641cdf0e10cSrcweir                         // TODO: need a save way to distinguish MS filters from other filters
1642cdf0e10cSrcweir                         // for now MS-filters are the only alien filters that support encryption
1643cdf0e10cSrcweir                         sal_Bool bMSType = !pCurrentFilter->IsOwnFormat();
1644cdf0e10cSrcweir                         ::comphelper::DocPasswordRequestType eType = bMSType ?
1645cdf0e10cSrcweir                             ::comphelper::DocPasswordRequestType_MS :
1646cdf0e10cSrcweir                             ::comphelper::DocPasswordRequestType_STANDARD;
1647cdf0e10cSrcweir 
1648cdf0e10cSrcweir                         ::rtl::Reference< ::comphelper::DocPasswordRequest > pPasswordRequest( new ::comphelper::DocPasswordRequest( eType, ::com::sun::star::task::PasswordRequestMode_PASSWORD_CREATE, *(rpURLList->GetObject(0)), ( pCurrentFilter->GetFilterFlags() & SFX_FILTER_PASSWORDTOMODIFY ) != 0 ) );
1649cdf0e10cSrcweir 
1650cdf0e10cSrcweir                         uno::Reference< com::sun::star::task::XInteractionRequest > rRequest( pPasswordRequest.get() );
1651cdf0e10cSrcweir                         xInteractionHandler->handle( rRequest );
1652cdf0e10cSrcweir                         if ( pPasswordRequest->isPassword() )
1653cdf0e10cSrcweir                         {
1654cdf0e10cSrcweir                             if ( pPasswordRequest->getPassword().getLength() )
1655cdf0e10cSrcweir                             {
1656cdf0e10cSrcweir                                 // TODO/LATER: The filters should show the password dialog themself in future
1657cdf0e10cSrcweir                                 if ( bMSType )
1658cdf0e10cSrcweir                                 {
1659cdf0e10cSrcweir                                     // all the current MS-filters use MSCodec_Std97 implementation
1660cdf0e10cSrcweir                                     uno::Sequence< sal_Int8 > aUniqueID = ::comphelper::DocPasswordHelper::GenerateRandomByteSequence( 16 );
1661cdf0e10cSrcweir                                     uno::Sequence< sal_Int8 > aEncryptionKey = ::comphelper::DocPasswordHelper::GenerateStd97Key( pPasswordRequest->getPassword(), aUniqueID );
1662cdf0e10cSrcweir 
1663cdf0e10cSrcweir                                     if ( aEncryptionKey.getLength() )
1664cdf0e10cSrcweir                                     {
1665cdf0e10cSrcweir                                         ::comphelper::SequenceAsHashMap aHashData;
1666cdf0e10cSrcweir                                         aHashData[ ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "STD97EncryptionKey" ) ) ] <<= aEncryptionKey;
1667cdf0e10cSrcweir                                         aHashData[ ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "STD97UniqueID" ) ) ] <<= aUniqueID;
1668cdf0e10cSrcweir 
1669cdf0e10cSrcweir                                         rpSet->Put( SfxUnoAnyItem( SID_ENCRYPTIONDATA, uno::makeAny( aHashData.getAsConstNamedValueList() ) ) );
1670cdf0e10cSrcweir                                     }
1671cdf0e10cSrcweir                                     else
1672cdf0e10cSrcweir                                         return ERRCODE_IO_NOTSUPPORTED;
1673cdf0e10cSrcweir                                 }
1674cdf0e10cSrcweir                                 else
1675cdf0e10cSrcweir                                 {
1676cdf0e10cSrcweir                                     rpSet->Put( SfxUnoAnyItem( SID_ENCRYPTIONDATA, uno::makeAny( ::comphelper::OStorageHelper::CreatePackageEncryptionData( pPasswordRequest->getPassword() ) ) ) );
1677cdf0e10cSrcweir                                 }
1678cdf0e10cSrcweir                             }
1679cdf0e10cSrcweir 
1680cdf0e10cSrcweir                             if ( pPasswordRequest->getRecommendReadOnly() )
1681cdf0e10cSrcweir                                 rpSet->Put( SfxBoolItem( SID_RECOMMENDREADONLY, sal_True ) );
1682cdf0e10cSrcweir 
1683cdf0e10cSrcweir                             if ( bMSType )
1684cdf0e10cSrcweir                             {
1685cdf0e10cSrcweir                                 // the empty password has 0 as Hash
1686cdf0e10cSrcweir                                 sal_Int32 nHash = SfxMedium::CreatePasswordToModifyHash( pPasswordRequest->getPasswordToModify(), ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.text.TextDocument" ) ).equals( pCurrentFilter->GetServiceName() ) );
1687cdf0e10cSrcweir                                 if ( nHash )
1688cdf0e10cSrcweir                                     rpSet->Put( SfxUnoAnyItem( SID_MODIFYPASSWORDINFO, uno::makeAny( nHash ) ) );
1689cdf0e10cSrcweir                             }
1690cdf0e10cSrcweir                             else
1691cdf0e10cSrcweir                             {
1692cdf0e10cSrcweir                                 uno::Sequence< beans::PropertyValue > aModifyPasswordInfo = ::comphelper::DocPasswordHelper::GenerateNewModifyPasswordInfo( pPasswordRequest->getPasswordToModify() );
1693cdf0e10cSrcweir                                 if ( aModifyPasswordInfo.getLength() )
1694cdf0e10cSrcweir                                     rpSet->Put( SfxUnoAnyItem( SID_MODIFYPASSWORDINFO, uno::makeAny( aModifyPasswordInfo ) ) );
1695cdf0e10cSrcweir                             }
1696cdf0e10cSrcweir                         }
1697cdf0e10cSrcweir                         else
1698cdf0e10cSrcweir                             return ERRCODE_ABORT;
1699cdf0e10cSrcweir                     }
1700cdf0e10cSrcweir                 }
1701cdf0e10cSrcweir             }
1702cdf0e10cSrcweir             catch( IllegalArgumentException ){}
1703cdf0e10cSrcweir         }
1704cdf0e10cSrcweir 
1705cdf0e10cSrcweir         SaveLastUsedFilter();
1706cdf0e10cSrcweir         return ERRCODE_NONE;
1707cdf0e10cSrcweir     }
1708cdf0e10cSrcweir     else
1709cdf0e10cSrcweir         return ERRCODE_ABORT;
1710cdf0e10cSrcweir }
1711cdf0e10cSrcweir 
1712cdf0e10cSrcweir // ------------------------------------------------------------------------
execute()1713cdf0e10cSrcweir ErrCode FileDialogHelper_Impl::execute()
1714cdf0e10cSrcweir {
1715cdf0e10cSrcweir     if ( ! mxFileDlg.is() )
1716cdf0e10cSrcweir         return ERRCODE_ABORT;
1717cdf0e10cSrcweir 
1718cdf0e10cSrcweir     sal_Int16 nRet = implDoExecute();
1719cdf0e10cSrcweir 
1720cdf0e10cSrcweir     maPath = mxFileDlg->getDisplayDirectory();
1721cdf0e10cSrcweir 
1722cdf0e10cSrcweir     if ( ExecutableDialogResults::CANCEL == nRet )
1723cdf0e10cSrcweir         return ERRCODE_ABORT;
1724cdf0e10cSrcweir     else
1725cdf0e10cSrcweir     {
1726cdf0e10cSrcweir         return ERRCODE_NONE;
1727cdf0e10cSrcweir     }
1728cdf0e10cSrcweir }
1729cdf0e10cSrcweir 
1730cdf0e10cSrcweir // ------------------------------------------------------------------------
getPath() const1731cdf0e10cSrcweir OUString FileDialogHelper_Impl::getPath() const
1732cdf0e10cSrcweir {
1733cdf0e10cSrcweir     OUString aPath;
1734cdf0e10cSrcweir 
1735cdf0e10cSrcweir     if ( mxFileDlg.is() )
1736cdf0e10cSrcweir         aPath = mxFileDlg->getDisplayDirectory();
1737cdf0e10cSrcweir 
1738cdf0e10cSrcweir     if ( !aPath.getLength() )
1739cdf0e10cSrcweir         aPath = maPath;
1740cdf0e10cSrcweir 
1741cdf0e10cSrcweir     return aPath;
1742cdf0e10cSrcweir }
1743cdf0e10cSrcweir 
1744cdf0e10cSrcweir // ------------------------------------------------------------------------
getFilter() const1745cdf0e10cSrcweir OUString FileDialogHelper_Impl::getFilter() const
1746cdf0e10cSrcweir {
1747cdf0e10cSrcweir     String aFilter = getCurrentFilterUIName();
1748cdf0e10cSrcweir 
1749cdf0e10cSrcweir     if( !aFilter.Len() )
1750cdf0e10cSrcweir         aFilter = maCurFilter;
1751cdf0e10cSrcweir 
1752cdf0e10cSrcweir     return aFilter;
1753cdf0e10cSrcweir }
1754cdf0e10cSrcweir 
1755cdf0e10cSrcweir // ------------------------------------------------------------------------
getRealFilter(String & _rFilter) const1756cdf0e10cSrcweir void FileDialogHelper_Impl::getRealFilter( String& _rFilter ) const
1757cdf0e10cSrcweir {
1758cdf0e10cSrcweir     _rFilter = getCurrentFilterUIName();
1759cdf0e10cSrcweir 
1760cdf0e10cSrcweir     if ( !_rFilter.Len() )
1761cdf0e10cSrcweir         _rFilter = maCurFilter;
1762cdf0e10cSrcweir 
1763cdf0e10cSrcweir     if ( _rFilter.Len() && mpMatcher )
1764cdf0e10cSrcweir     {
1765cdf0e10cSrcweir         const SfxFilter* pFilter =
1766cdf0e10cSrcweir             mpMatcher->GetFilter4UIName( _rFilter, m_nMustFlags, m_nDontFlags );
1767cdf0e10cSrcweir         _rFilter = pFilter ? pFilter->GetFilterName() : _rFilter.Erase();
1768cdf0e10cSrcweir     }
1769cdf0e10cSrcweir }
1770cdf0e10cSrcweir 
1771cdf0e10cSrcweir // ------------------------------------------------------------------------
displayFolder(const::rtl::OUString & _rPath)1772cdf0e10cSrcweir void FileDialogHelper_Impl::displayFolder( const ::rtl::OUString& _rPath )
1773cdf0e10cSrcweir {
1774cdf0e10cSrcweir     if ( ! _rPath.getLength() )
1775cdf0e10cSrcweir         // nothing to do
1776cdf0e10cSrcweir         return;
1777cdf0e10cSrcweir 
1778cdf0e10cSrcweir     /*
1779cdf0e10cSrcweir     if ( !::utl::UCBContentHelper::IsFolder( _rPath ) )
1780cdf0e10cSrcweir         // only valid folders accepted here
1781cdf0e10cSrcweir         return;
1782cdf0e10cSrcweir     */
1783cdf0e10cSrcweir 
1784cdf0e10cSrcweir     maPath = _rPath;
1785cdf0e10cSrcweir     if ( mxFileDlg.is() )
1786cdf0e10cSrcweir     {
1787cdf0e10cSrcweir         try
1788cdf0e10cSrcweir         {
1789cdf0e10cSrcweir             mxFileDlg->setDisplayDirectory( maPath );
1790cdf0e10cSrcweir         }
1791cdf0e10cSrcweir         catch( const IllegalArgumentException& )
1792cdf0e10cSrcweir         {
1793cdf0e10cSrcweir             DBG_ERROR( "FileDialogHelper_Impl::displayFolder: caught an exception!" );
1794cdf0e10cSrcweir         }
1795cdf0e10cSrcweir     }
1796cdf0e10cSrcweir }
1797cdf0e10cSrcweir 
1798cdf0e10cSrcweir // ------------------------------------------------------------------------
setFileName(const::rtl::OUString & _rFile)1799cdf0e10cSrcweir void FileDialogHelper_Impl::setFileName( const ::rtl::OUString& _rFile )
1800cdf0e10cSrcweir {
1801cdf0e10cSrcweir     maFileName = _rFile;
1802cdf0e10cSrcweir     if ( mxFileDlg.is() )
1803cdf0e10cSrcweir     {
1804cdf0e10cSrcweir         try
1805cdf0e10cSrcweir         {
1806cdf0e10cSrcweir             mxFileDlg->setDefaultName( maFileName );
1807cdf0e10cSrcweir         }
1808cdf0e10cSrcweir         catch( const IllegalArgumentException& )
1809cdf0e10cSrcweir         {
1810cdf0e10cSrcweir             DBG_ERROR( "FileDialogHelper_Impl::setFileName: caught an exception!" );
1811cdf0e10cSrcweir         }
1812cdf0e10cSrcweir     }
1813cdf0e10cSrcweir }
1814cdf0e10cSrcweir 
1815cdf0e10cSrcweir // ------------------------------------------------------------------------
setFilter(const OUString & rFilter)1816cdf0e10cSrcweir void FileDialogHelper_Impl::setFilter( const OUString& rFilter )
1817cdf0e10cSrcweir {
1818cdf0e10cSrcweir     DBG_ASSERT( rFilter.indexOf(':') == -1, "Old filter name used!");
1819cdf0e10cSrcweir 
1820cdf0e10cSrcweir     maCurFilter = rFilter;
1821cdf0e10cSrcweir 
1822cdf0e10cSrcweir     if ( rFilter.getLength() && mpMatcher )
1823cdf0e10cSrcweir     {
1824cdf0e10cSrcweir         const SfxFilter* pFilter = mpMatcher->GetFilter4FilterName(
1825cdf0e10cSrcweir                                         rFilter, m_nMustFlags, m_nDontFlags );
1826cdf0e10cSrcweir         if ( pFilter )
1827cdf0e10cSrcweir             maCurFilter = pFilter->GetUIName();
1828cdf0e10cSrcweir     }
1829cdf0e10cSrcweir 
1830cdf0e10cSrcweir     uno::Reference< XFilterManager > xFltMgr( mxFileDlg, UNO_QUERY );
1831cdf0e10cSrcweir 
1832cdf0e10cSrcweir     if ( maCurFilter.getLength() && xFltMgr.is() )
1833cdf0e10cSrcweir     {
1834cdf0e10cSrcweir         try
1835cdf0e10cSrcweir         {
1836cdf0e10cSrcweir             xFltMgr->setCurrentFilter( maCurFilter );
1837cdf0e10cSrcweir         }
1838cdf0e10cSrcweir         catch( IllegalArgumentException ){}
1839cdf0e10cSrcweir     }
1840cdf0e10cSrcweir }
1841cdf0e10cSrcweir 
1842cdf0e10cSrcweir // ------------------------------------------------------------------------
createMatcher(const String & rFactory)1843cdf0e10cSrcweir void FileDialogHelper_Impl::createMatcher( const String& rFactory )
1844cdf0e10cSrcweir {
1845cdf0e10cSrcweir     mpMatcher = new SfxFilterMatcher( SfxObjectShell::GetServiceNameFromFactory(rFactory) );
1846cdf0e10cSrcweir     mbDeleteMatcher = sal_True;
1847cdf0e10cSrcweir }
1848cdf0e10cSrcweir 
1849cdf0e10cSrcweir // ------------------------------------------------------------------------
addFilters(sal_Int64 nFlags,const String & rFactory,SfxFilterFlags nMust,SfxFilterFlags nDont)1850cdf0e10cSrcweir void FileDialogHelper_Impl::addFilters( sal_Int64 nFlags,
1851cdf0e10cSrcweir                                         const String& rFactory,
1852cdf0e10cSrcweir                                         SfxFilterFlags nMust,
1853cdf0e10cSrcweir                                         SfxFilterFlags nDont )
1854cdf0e10cSrcweir {
1855cdf0e10cSrcweir     uno::Reference< XFilterManager > xFltMgr( mxFileDlg, UNO_QUERY );
1856cdf0e10cSrcweir 
1857cdf0e10cSrcweir     if ( ! xFltMgr.is() )
1858cdf0e10cSrcweir         return;
1859cdf0e10cSrcweir 
1860cdf0e10cSrcweir     // we still need a matcher to convert UI names to filter names
1861cdf0e10cSrcweir     if ( !rFactory.Len() )
1862cdf0e10cSrcweir     {
1863cdf0e10cSrcweir         SfxApplication *pSfxApp = SFX_APP();
1864cdf0e10cSrcweir         mpMatcher = &pSfxApp->GetFilterMatcher();
1865cdf0e10cSrcweir         mbDeleteMatcher = sal_False;
1866cdf0e10cSrcweir     }
1867cdf0e10cSrcweir     else
1868cdf0e10cSrcweir     {
1869cdf0e10cSrcweir         mpMatcher = new SfxFilterMatcher( rFactory );
1870cdf0e10cSrcweir         mbDeleteMatcher = sal_True;
1871cdf0e10cSrcweir     }
1872cdf0e10cSrcweir 
1873cdf0e10cSrcweir     uno::Reference< XMultiServiceFactory > xSMGR = ::comphelper::getProcessServiceFactory();
1874cdf0e10cSrcweir     uno::Reference< XContainerQuery > xFilterCont(
1875cdf0e10cSrcweir         xSMGR->createInstance(::rtl::OUString::createFromAscii("com.sun.star.document.FilterFactory")),
1876cdf0e10cSrcweir         UNO_QUERY);
1877cdf0e10cSrcweir     if ( ! xFilterCont.is() )
1878cdf0e10cSrcweir         return;
1879cdf0e10cSrcweir 
1880cdf0e10cSrcweir     m_nMustFlags |= nMust;
1881cdf0e10cSrcweir     m_nDontFlags |= nDont;
1882cdf0e10cSrcweir 
1883cdf0e10cSrcweir     // create the list of filters
1884cdf0e10cSrcweir     ::rtl::OUStringBuffer sQuery(256);
1885cdf0e10cSrcweir     sQuery.appendAscii("getSortedFilterList()");
1886cdf0e10cSrcweir     sQuery.appendAscii(":module="                                       );
1887cdf0e10cSrcweir     sQuery.append     (rFactory                                         ); // use long name here !
1888cdf0e10cSrcweir     sQuery.appendAscii(":iflags="                                       );
1889cdf0e10cSrcweir     sQuery.append     (::rtl::OUString::valueOf((sal_Int32)m_nMustFlags));
1890cdf0e10cSrcweir     sQuery.appendAscii(":eflags="                                       );
1891cdf0e10cSrcweir     sQuery.append     (::rtl::OUString::valueOf((sal_Int32)m_nDontFlags));
1892cdf0e10cSrcweir 
1893cdf0e10cSrcweir     uno::Reference< XEnumeration > xResult;
1894cdf0e10cSrcweir     try
1895cdf0e10cSrcweir     {
1896cdf0e10cSrcweir         xResult = xFilterCont->createSubSetEnumerationByQuery(sQuery.makeStringAndClear());
1897cdf0e10cSrcweir     }
1898cdf0e10cSrcweir     catch( uno::Exception& )
1899cdf0e10cSrcweir     {
1900cdf0e10cSrcweir         DBG_ERRORFILE( "Could not get filters from the configuration!" );
1901cdf0e10cSrcweir     }
1902cdf0e10cSrcweir 
1903cdf0e10cSrcweir     TSortedFilterList         aIter   (xResult);
1904cdf0e10cSrcweir 
1905cdf0e10cSrcweir     // no matcher any longer used ...
1906cdf0e10cSrcweir     mbDeleteMatcher = sal_False;
1907cdf0e10cSrcweir 
1908cdf0e10cSrcweir     // append the filters
1909cdf0e10cSrcweir     ::rtl::OUString sFirstFilter;
1910cdf0e10cSrcweir     if ( WB_OPEN == ( nFlags & WB_OPEN ) )
1911cdf0e10cSrcweir         ::sfx2::appendFiltersForOpen( aIter, xFltMgr, sFirstFilter, *this );
1912cdf0e10cSrcweir     else if ( mbExport )
1913cdf0e10cSrcweir         ::sfx2::appendExportFilters( aIter, xFltMgr, sFirstFilter, *this );
1914cdf0e10cSrcweir     else
1915cdf0e10cSrcweir         ::sfx2::appendFiltersForSave( aIter, xFltMgr, sFirstFilter, *this, rFactory );
1916cdf0e10cSrcweir 
1917cdf0e10cSrcweir     // set our initial selected filter (if we do not already have one)
1918cdf0e10cSrcweir     if ( !maSelectFilter.getLength() )
1919cdf0e10cSrcweir         maSelectFilter = sFirstFilter;
1920cdf0e10cSrcweir }
1921cdf0e10cSrcweir 
1922cdf0e10cSrcweir // ------------------------------------------------------------------------
addFilter(const OUString & rFilterName,const OUString & rExtension)1923cdf0e10cSrcweir void FileDialogHelper_Impl::addFilter( const OUString& rFilterName,
1924cdf0e10cSrcweir                                        const OUString& rExtension )
1925cdf0e10cSrcweir {
1926cdf0e10cSrcweir     uno::Reference< XFilterManager > xFltMgr( mxFileDlg, UNO_QUERY );
1927cdf0e10cSrcweir 
1928cdf0e10cSrcweir     if ( ! xFltMgr.is() )
1929cdf0e10cSrcweir         return;
1930cdf0e10cSrcweir 
1931cdf0e10cSrcweir     try
1932cdf0e10cSrcweir     {
1933cdf0e10cSrcweir         xFltMgr->appendFilter( rFilterName, rExtension );
1934cdf0e10cSrcweir 
1935cdf0e10cSrcweir         if ( !maSelectFilter.getLength() )
1936cdf0e10cSrcweir             maSelectFilter = rFilterName;
1937cdf0e10cSrcweir     }
1938cdf0e10cSrcweir     catch( IllegalArgumentException )
1939cdf0e10cSrcweir     {
1940cdf0e10cSrcweir #ifdef DBG_UTIL
1941cdf0e10cSrcweir         ByteString aMsg( "Could not append Filter" );
1942cdf0e10cSrcweir         aMsg += ByteString( String( rFilterName ), RTL_TEXTENCODING_UTF8 );
1943cdf0e10cSrcweir         DBG_ERRORFILE( aMsg.GetBuffer() );
1944cdf0e10cSrcweir #endif
1945cdf0e10cSrcweir     }
1946cdf0e10cSrcweir }
1947cdf0e10cSrcweir 
1948cdf0e10cSrcweir // ------------------------------------------------------------------------
addGraphicFilter()1949cdf0e10cSrcweir void FileDialogHelper_Impl::addGraphicFilter()
1950cdf0e10cSrcweir {
1951cdf0e10cSrcweir     uno::Reference< XFilterManager > xFltMgr( mxFileDlg, UNO_QUERY );
1952cdf0e10cSrcweir 
1953cdf0e10cSrcweir     if ( ! xFltMgr.is() )
1954cdf0e10cSrcweir         return;
1955cdf0e10cSrcweir 
1956cdf0e10cSrcweir     // create the list of filters
1957cdf0e10cSrcweir     mpGraphicFilter = new GraphicFilter;
1958cdf0e10cSrcweir     sal_uInt16 i, j, nCount = mpGraphicFilter->GetImportFormatCount();
1959cdf0e10cSrcweir 
1960cdf0e10cSrcweir     // compute the extension string for all known import filters
1961cdf0e10cSrcweir     String aExtensions;
1962cdf0e10cSrcweir 
1963cdf0e10cSrcweir     for ( i = 0; i < nCount; i++ )
1964cdf0e10cSrcweir     {
1965cdf0e10cSrcweir         j = 0;
1966cdf0e10cSrcweir         String sWildcard;
1967cdf0e10cSrcweir         while( sal_True )
1968cdf0e10cSrcweir         {
1969cdf0e10cSrcweir             sWildcard = mpGraphicFilter->GetImportWildcard( i, j++ );
1970cdf0e10cSrcweir             if ( !sWildcard.Len() )
1971cdf0e10cSrcweir                 break;
1972cdf0e10cSrcweir             if ( aExtensions.Search( sWildcard ) == STRING_NOTFOUND )
1973cdf0e10cSrcweir             {
1974cdf0e10cSrcweir                 if ( aExtensions.Len() )
1975cdf0e10cSrcweir                     aExtensions += sal_Unicode(';');
1976cdf0e10cSrcweir                 aExtensions += sWildcard;
1977cdf0e10cSrcweir             }
1978cdf0e10cSrcweir         }
1979cdf0e10cSrcweir     }
1980cdf0e10cSrcweir 
1981cdf0e10cSrcweir #if defined(WNT)
1982cdf0e10cSrcweir     if ( aExtensions.Len() > 240 )
1983cdf0e10cSrcweir         aExtensions = DEFINE_CONST_UNICODE( FILEDIALOG_FILTER_ALL );
1984cdf0e10cSrcweir #endif
1985cdf0e10cSrcweir     sal_Bool bIsInOpenMode = isInOpenMode();
1986cdf0e10cSrcweir 
1987cdf0e10cSrcweir     try
1988cdf0e10cSrcweir     {
1989cdf0e10cSrcweir         OUString aAllFilterName = String( SfxResId( STR_SFX_IMPORT_ALL ) );
1990cdf0e10cSrcweir         aAllFilterName = ::sfx2::addExtension( aAllFilterName, aExtensions, bIsInOpenMode, *this );
1991cdf0e10cSrcweir 
1992cdf0e10cSrcweir         xFltMgr->appendFilter( aAllFilterName, aExtensions );
1993cdf0e10cSrcweir         maSelectFilter = aAllFilterName;
1994cdf0e10cSrcweir     }
1995cdf0e10cSrcweir     catch( IllegalArgumentException )
1996cdf0e10cSrcweir     {
1997cdf0e10cSrcweir         DBG_ERRORFILE( "Could not append Filter" );
1998cdf0e10cSrcweir     }
1999cdf0e10cSrcweir 
2000cdf0e10cSrcweir     // Now add the filter
2001cdf0e10cSrcweir     for ( i = 0; i < nCount; i++ )
2002cdf0e10cSrcweir     {
2003cdf0e10cSrcweir         String aName = mpGraphicFilter->GetImportFormatName( i );
2004cdf0e10cSrcweir         String aExt;
2005cdf0e10cSrcweir         j = 0;
2006cdf0e10cSrcweir         String sWildcard;
2007cdf0e10cSrcweir         while( sal_True )
2008cdf0e10cSrcweir         {
2009cdf0e10cSrcweir             sWildcard = mpGraphicFilter->GetImportWildcard( i, j++ );
2010cdf0e10cSrcweir             if ( !sWildcard.Len() )
2011cdf0e10cSrcweir                 break;
2012cdf0e10cSrcweir             if ( aExt.Search( sWildcard ) == STRING_NOTFOUND )
2013cdf0e10cSrcweir             {
2014cdf0e10cSrcweir                 if ( aExt.Len() )
2015cdf0e10cSrcweir                     aExt += sal_Unicode(';');
2016cdf0e10cSrcweir                 aExt += sWildcard;
2017cdf0e10cSrcweir             }
2018cdf0e10cSrcweir         }
2019cdf0e10cSrcweir         aName = ::sfx2::addExtension( aName, aExt, bIsInOpenMode, *this );
2020cdf0e10cSrcweir         try
2021cdf0e10cSrcweir         {
2022cdf0e10cSrcweir             xFltMgr->appendFilter( aName, aExt );
2023cdf0e10cSrcweir         }
2024cdf0e10cSrcweir         catch( IllegalArgumentException )
2025cdf0e10cSrcweir         {
2026cdf0e10cSrcweir             DBG_ERRORFILE( "Could not append Filter" );
2027cdf0e10cSrcweir         }
2028cdf0e10cSrcweir     }
2029cdf0e10cSrcweir }
2030cdf0e10cSrcweir 
2031cdf0e10cSrcweir // ------------------------------------------------------------------------
2032cdf0e10cSrcweir #define GRF_CONFIG_STR      "   "
2033cdf0e10cSrcweir #define STD_CONFIG_STR      "1 "
2034cdf0e10cSrcweir 
saveConfig()2035cdf0e10cSrcweir void FileDialogHelper_Impl::saveConfig()
2036cdf0e10cSrcweir {
2037cdf0e10cSrcweir     uno::Reference < XFilePickerControlAccess > xDlg( mxFileDlg, UNO_QUERY );
2038cdf0e10cSrcweir     Any aValue;
2039cdf0e10cSrcweir 
2040cdf0e10cSrcweir     if ( ! xDlg.is() )
2041cdf0e10cSrcweir         return;
2042cdf0e10cSrcweir 
2043cdf0e10cSrcweir     if ( mbHasPreview )
2044cdf0e10cSrcweir     {
2045cdf0e10cSrcweir         SvtViewOptions aDlgOpt( E_DIALOG, IMPGRF_CONFIGNAME );
2046cdf0e10cSrcweir         String aUserData = DEFINE_CONST_UNICODE( GRF_CONFIG_STR );
2047cdf0e10cSrcweir 
2048cdf0e10cSrcweir         try
2049cdf0e10cSrcweir         {
2050cdf0e10cSrcweir             aValue = xDlg->getValue( ExtendedFilePickerElementIds::CHECKBOX_LINK, 0 );
2051cdf0e10cSrcweir             sal_Bool bValue = sal_False;
2052cdf0e10cSrcweir             aValue >>= bValue;
2053cdf0e10cSrcweir             aUserData.SetToken( 0, ' ', String::CreateFromInt32( (sal_Int32) bValue ) );
2054cdf0e10cSrcweir 
2055cdf0e10cSrcweir             aValue = xDlg->getValue( ExtendedFilePickerElementIds::CHECKBOX_PREVIEW, 0 );
2056cdf0e10cSrcweir             bValue = sal_False;
2057cdf0e10cSrcweir             aValue >>= bValue;
2058cdf0e10cSrcweir             aUserData.SetToken( 1, ' ', String::CreateFromInt32( (sal_Int32) bValue ) );
2059cdf0e10cSrcweir 
2060cdf0e10cSrcweir             INetURLObject aObj( getPath() );
2061cdf0e10cSrcweir 
2062cdf0e10cSrcweir             if ( aObj.GetProtocol() == INET_PROT_FILE )
2063cdf0e10cSrcweir                 aUserData.SetToken( 2, ' ', aObj.GetMainURL( INetURLObject::NO_DECODE ) );
2064cdf0e10cSrcweir 
2065cdf0e10cSrcweir             String aFilter = getFilter();
2066cdf0e10cSrcweir             aFilter = EncodeSpaces_Impl( aFilter );
2067cdf0e10cSrcweir             aUserData.SetToken( 3, ' ', aFilter );
2068cdf0e10cSrcweir 
2069cdf0e10cSrcweir             aDlgOpt.SetUserItem( USERITEM_NAME, makeAny( OUString( aUserData ) ) );
2070cdf0e10cSrcweir         }
2071cdf0e10cSrcweir         catch( IllegalArgumentException ){}
2072cdf0e10cSrcweir     }
2073cdf0e10cSrcweir     else
2074cdf0e10cSrcweir     {
2075cdf0e10cSrcweir         sal_Bool bWriteConfig = sal_False;
2076cdf0e10cSrcweir         SvtViewOptions aDlgOpt( E_DIALOG, IODLG_CONFIGNAME );
2077cdf0e10cSrcweir         String aUserData = DEFINE_CONST_UNICODE( STD_CONFIG_STR );
2078cdf0e10cSrcweir 
2079cdf0e10cSrcweir         if ( aDlgOpt.Exists() )
2080cdf0e10cSrcweir         {
2081cdf0e10cSrcweir             Any aUserItem = aDlgOpt.GetUserItem( USERITEM_NAME );
2082cdf0e10cSrcweir             OUString aTemp;
2083cdf0e10cSrcweir             if ( aUserItem >>= aTemp )
2084cdf0e10cSrcweir                 aUserData = String( aTemp );
2085cdf0e10cSrcweir         }
2086cdf0e10cSrcweir 
2087cdf0e10cSrcweir         if ( mbHasAutoExt )
2088cdf0e10cSrcweir         {
2089cdf0e10cSrcweir             try
2090cdf0e10cSrcweir             {
2091cdf0e10cSrcweir                 aValue = xDlg->getValue( ExtendedFilePickerElementIds::CHECKBOX_AUTOEXTENSION, 0 );
2092cdf0e10cSrcweir                 sal_Bool bAutoExt = sal_True;
2093cdf0e10cSrcweir                 aValue >>= bAutoExt;
2094cdf0e10cSrcweir                 aUserData.SetToken( 0, ' ', String::CreateFromInt32( (sal_Int32) bAutoExt ) );
2095cdf0e10cSrcweir                 bWriteConfig = sal_True;
2096cdf0e10cSrcweir             }
2097cdf0e10cSrcweir             catch( IllegalArgumentException ){}
2098cdf0e10cSrcweir         }
2099cdf0e10cSrcweir 
2100cdf0e10cSrcweir         if ( ! mbIsSaveDlg )
2101cdf0e10cSrcweir         {
2102cdf0e10cSrcweir             OUString aPath = getPath();
2103cdf0e10cSrcweir             if ( aPath.getLength() &&
2104cdf0e10cSrcweir                  utl::LocalFileHelper::IsLocalFile( aPath ) )
2105cdf0e10cSrcweir             {
2106cdf0e10cSrcweir                 aUserData.SetToken( 1, ' ', aPath );
2107cdf0e10cSrcweir                 bWriteConfig = sal_True;
2108cdf0e10cSrcweir             }
2109cdf0e10cSrcweir         }
2110cdf0e10cSrcweir 
2111cdf0e10cSrcweir         if( mbHasSelectionBox && mbSelectionFltrEnabled )
2112cdf0e10cSrcweir         {
2113cdf0e10cSrcweir             try
2114cdf0e10cSrcweir             {
2115cdf0e10cSrcweir                 aValue = xDlg->getValue( ExtendedFilePickerElementIds::CHECKBOX_SELECTION, 0 );
2116cdf0e10cSrcweir                 sal_Bool bSelection = sal_True;
2117cdf0e10cSrcweir                 aValue >>= bSelection;
2118cdf0e10cSrcweir                 if ( aUserData.GetTokenCount(' ') < 3 )
2119cdf0e10cSrcweir                     aUserData.Append(' ');
2120cdf0e10cSrcweir                 aUserData.SetToken( 2, ' ', String::CreateFromInt32( (sal_Int32) bSelection ) );
2121cdf0e10cSrcweir                 bWriteConfig = sal_True;
2122cdf0e10cSrcweir             }
2123cdf0e10cSrcweir             catch( IllegalArgumentException ){}
2124cdf0e10cSrcweir         }
2125cdf0e10cSrcweir 
2126cdf0e10cSrcweir         if ( bWriteConfig )
2127cdf0e10cSrcweir             aDlgOpt.SetUserItem( USERITEM_NAME, makeAny( OUString( aUserData ) ) );
2128cdf0e10cSrcweir     }
2129cdf0e10cSrcweir 
2130cdf0e10cSrcweir     SfxApplication *pSfxApp = SFX_APP();
2131cdf0e10cSrcweir     pSfxApp->SetLastDir_Impl( getPath() );
2132cdf0e10cSrcweir }
2133cdf0e10cSrcweir 
2134cdf0e10cSrcweir // ------------------------------------------------------------------------
2135cdf0e10cSrcweir namespace
2136cdf0e10cSrcweir {
getInitPath(const String & _rFallback,const xub_StrLen _nFallbackToken)2137cdf0e10cSrcweir     static ::rtl::OUString getInitPath( const String& _rFallback, const xub_StrLen _nFallbackToken )
2138cdf0e10cSrcweir     {
2139cdf0e10cSrcweir         SfxApplication *pSfxApp = SFX_APP();
2140cdf0e10cSrcweir         String sPath = pSfxApp->GetLastDir_Impl();
2141cdf0e10cSrcweir 
2142cdf0e10cSrcweir         if ( !sPath.Len() )
2143cdf0e10cSrcweir             sPath = _rFallback.GetToken( _nFallbackToken, ' ' );
2144cdf0e10cSrcweir 
2145cdf0e10cSrcweir         // check if the path points to a valid (accessible) directory
2146cdf0e10cSrcweir         sal_Bool bValid = sal_False;
2147cdf0e10cSrcweir         if ( sPath.Len() )
2148cdf0e10cSrcweir         {
2149cdf0e10cSrcweir             String sPathCheck( sPath );
2150cdf0e10cSrcweir             if ( sPathCheck.GetBuffer()[ sPathCheck.Len() - 1 ] != '/' )
2151cdf0e10cSrcweir                 sPathCheck += '/';
2152cdf0e10cSrcweir             sPathCheck += '.';
2153cdf0e10cSrcweir             try
2154cdf0e10cSrcweir             {
2155cdf0e10cSrcweir                 ::ucbhelper::Content aContent( sPathCheck, uno::Reference< ucb::XCommandEnvironment >() );
2156cdf0e10cSrcweir                 bValid = aContent.isFolder();
2157cdf0e10cSrcweir             }
2158cdf0e10cSrcweir             catch( Exception& ) {}
2159cdf0e10cSrcweir         }
2160cdf0e10cSrcweir 
2161cdf0e10cSrcweir         if ( !bValid )
2162cdf0e10cSrcweir             sPath.Erase();
2163cdf0e10cSrcweir 
2164cdf0e10cSrcweir         return sPath;
2165cdf0e10cSrcweir     }
2166cdf0e10cSrcweir }
2167cdf0e10cSrcweir 
2168cdf0e10cSrcweir // ------------------------------------------------------------------------
loadConfig()2169cdf0e10cSrcweir void FileDialogHelper_Impl::loadConfig()
2170cdf0e10cSrcweir {
2171cdf0e10cSrcweir     uno::Reference < XFilePickerControlAccess > xDlg( mxFileDlg, UNO_QUERY );
2172cdf0e10cSrcweir     Any aValue;
2173cdf0e10cSrcweir 
2174cdf0e10cSrcweir     if ( ! xDlg.is() )
2175cdf0e10cSrcweir         return;
2176cdf0e10cSrcweir 
2177cdf0e10cSrcweir     if ( mbHasPreview )
2178cdf0e10cSrcweir     {
2179cdf0e10cSrcweir         SvtViewOptions aViewOpt( E_DIALOG, IMPGRF_CONFIGNAME );
2180cdf0e10cSrcweir         String aUserData;
2181cdf0e10cSrcweir 
2182cdf0e10cSrcweir         if ( aViewOpt.Exists() )
2183cdf0e10cSrcweir         {
2184cdf0e10cSrcweir             Any aUserItem = aViewOpt.GetUserItem( USERITEM_NAME );
2185cdf0e10cSrcweir             OUString aTemp;
2186cdf0e10cSrcweir             if ( aUserItem >>= aTemp )
2187cdf0e10cSrcweir                 aUserData = String( aTemp );
2188cdf0e10cSrcweir         }
2189cdf0e10cSrcweir 
2190cdf0e10cSrcweir         if ( aUserData.Len() > 0 )
2191cdf0e10cSrcweir         {
2192cdf0e10cSrcweir             try
2193cdf0e10cSrcweir             {
2194cdf0e10cSrcweir                 // respect the last "insert as link" state
2195cdf0e10cSrcweir                 sal_Bool bLink = (sal_Bool) aUserData.GetToken( 0, ' ' ).ToInt32();
2196cdf0e10cSrcweir                 aValue <<= bLink;
2197cdf0e10cSrcweir                 xDlg->setValue( ExtendedFilePickerElementIds::CHECKBOX_LINK, 0, aValue );
2198cdf0e10cSrcweir 
2199cdf0e10cSrcweir                 // respect the last "show preview" state
2200cdf0e10cSrcweir                 sal_Bool bShowPreview = (sal_Bool) aUserData.GetToken( 1, ' ' ).ToInt32();
2201cdf0e10cSrcweir                 aValue <<= bShowPreview;
2202cdf0e10cSrcweir                 xDlg->setValue( ExtendedFilePickerElementIds::CHECKBOX_PREVIEW, 0, aValue );
2203cdf0e10cSrcweir 
2204cdf0e10cSrcweir                 if ( !maPath.getLength() )
2205cdf0e10cSrcweir                     displayFolder( getInitPath( aUserData, 2 ) );
2206cdf0e10cSrcweir 
2207cdf0e10cSrcweir                 if ( ! maCurFilter.getLength() )
2208cdf0e10cSrcweir                 {
2209cdf0e10cSrcweir                     String aFilter = aUserData.GetToken( 3, ' ' );
2210cdf0e10cSrcweir                     aFilter = DecodeSpaces_Impl( aFilter );
2211cdf0e10cSrcweir                     setFilter( aFilter );
2212cdf0e10cSrcweir                 }
2213cdf0e10cSrcweir 
2214cdf0e10cSrcweir                 // set the member so we know that we have to show the preview
2215cdf0e10cSrcweir                 mbShowPreview = bShowPreview;
2216cdf0e10cSrcweir             }
2217cdf0e10cSrcweir             catch( IllegalArgumentException ){}
2218cdf0e10cSrcweir         }
2219cdf0e10cSrcweir 
2220cdf0e10cSrcweir         if ( !maPath.getLength() )
2221cdf0e10cSrcweir             displayFolder( SvtPathOptions().GetGraphicPath() );
2222cdf0e10cSrcweir     }
2223cdf0e10cSrcweir     else
2224cdf0e10cSrcweir     {
2225cdf0e10cSrcweir         SvtViewOptions aViewOpt( E_DIALOG, IODLG_CONFIGNAME );
2226cdf0e10cSrcweir         String aUserData;
2227cdf0e10cSrcweir 
2228cdf0e10cSrcweir         if ( aViewOpt.Exists() )
2229cdf0e10cSrcweir         {
2230cdf0e10cSrcweir             Any aUserItem = aViewOpt.GetUserItem( USERITEM_NAME );
2231cdf0e10cSrcweir             OUString aTemp;
2232cdf0e10cSrcweir             if ( aUserItem >>= aTemp )
2233cdf0e10cSrcweir                 aUserData = String( aTemp );
2234cdf0e10cSrcweir         }
2235cdf0e10cSrcweir 
2236cdf0e10cSrcweir         if ( ! aUserData.Len() )
2237cdf0e10cSrcweir             aUserData = DEFINE_CONST_UNICODE( STD_CONFIG_STR );
2238cdf0e10cSrcweir 
2239cdf0e10cSrcweir         if ( ! maPath.getLength() )
2240cdf0e10cSrcweir             displayFolder( getInitPath( aUserData, 1 ) );
2241cdf0e10cSrcweir 
2242cdf0e10cSrcweir         if ( mbHasAutoExt )
2243cdf0e10cSrcweir         {
2244cdf0e10cSrcweir             sal_Int32 nFlag = aUserData.GetToken( 0, ' ' ).ToInt32();
2245cdf0e10cSrcweir             aValue <<= (sal_Bool) nFlag;
2246cdf0e10cSrcweir             try
2247cdf0e10cSrcweir             {
2248cdf0e10cSrcweir                 xDlg->setValue( ExtendedFilePickerElementIds::CHECKBOX_AUTOEXTENSION, 0, aValue );
2249cdf0e10cSrcweir             }
2250cdf0e10cSrcweir             catch( IllegalArgumentException ){}
2251cdf0e10cSrcweir         }
2252cdf0e10cSrcweir 
2253cdf0e10cSrcweir         if( mbHasSelectionBox )
2254cdf0e10cSrcweir         {
2255cdf0e10cSrcweir             sal_Int32 nFlag = aUserData.GetToken( 2, ' ' ).ToInt32();
2256cdf0e10cSrcweir             aValue <<= (sal_Bool) nFlag;
2257cdf0e10cSrcweir             try
2258cdf0e10cSrcweir             {
2259cdf0e10cSrcweir                 xDlg->setValue( ExtendedFilePickerElementIds::CHECKBOX_SELECTION, 0, aValue );
2260cdf0e10cSrcweir             }
2261cdf0e10cSrcweir             catch( IllegalArgumentException ){}
2262cdf0e10cSrcweir         }
2263cdf0e10cSrcweir 
2264cdf0e10cSrcweir         if ( !maPath.getLength() )
2265cdf0e10cSrcweir             displayFolder( SvtPathOptions().GetWorkPath() );
2266cdf0e10cSrcweir     }
2267cdf0e10cSrcweir }
2268cdf0e10cSrcweir 
2269cdf0e10cSrcweir // ------------------------------------------------------------------------
setDefaultValues()2270cdf0e10cSrcweir void FileDialogHelper_Impl::setDefaultValues()
2271cdf0e10cSrcweir {
2272cdf0e10cSrcweir     // when no filter is set, we set the curentFilter to <all>
2273cdf0e10cSrcweir     if ( !maCurFilter.getLength() && maSelectFilter.getLength() )
2274cdf0e10cSrcweir     {
2275cdf0e10cSrcweir         uno::Reference< XFilterManager > xFltMgr( mxFileDlg, UNO_QUERY );
2276cdf0e10cSrcweir         try
2277cdf0e10cSrcweir         {
2278cdf0e10cSrcweir             xFltMgr->setCurrentFilter( maSelectFilter );
2279cdf0e10cSrcweir         }
2280cdf0e10cSrcweir         catch( IllegalArgumentException )
2281cdf0e10cSrcweir         {}
2282cdf0e10cSrcweir     }
2283cdf0e10cSrcweir 
2284cdf0e10cSrcweir     // when no path is set, we use the standard 'work' folder
2285cdf0e10cSrcweir     if ( ! maPath.getLength() )
2286cdf0e10cSrcweir     {
2287cdf0e10cSrcweir         OUString aWorkFolder = SvtPathOptions().GetWorkPath();
2288cdf0e10cSrcweir         try
2289cdf0e10cSrcweir         {
2290cdf0e10cSrcweir             mxFileDlg->setDisplayDirectory( aWorkFolder );
2291cdf0e10cSrcweir         }
2292cdf0e10cSrcweir         catch( const Exception& )
2293cdf0e10cSrcweir         {
2294cdf0e10cSrcweir             DBG_ERROR( "FileDialogHelper_Impl::setDefaultValues: caught an exception while setting the display directory!" );
2295cdf0e10cSrcweir         }
2296cdf0e10cSrcweir 
2297cdf0e10cSrcweir         // INetURLObject aStdDirObj( SvtPathOptions().GetWorkPath() );
2298cdf0e10cSrcweir         //SetStandardDir( aStdDirObj.GetMainURL( INetURLObject::NO_DECODE ) );
2299cdf0e10cSrcweir     }
2300cdf0e10cSrcweir }
2301cdf0e10cSrcweir 
isShowFilterExtensionEnabled() const2302cdf0e10cSrcweir sal_Bool FileDialogHelper_Impl::isShowFilterExtensionEnabled() const
2303cdf0e10cSrcweir {
2304cdf0e10cSrcweir     return !maFilters.empty();
2305cdf0e10cSrcweir }
2306cdf0e10cSrcweir 
addFilterPair(const OUString & rFilter,const OUString & rFilterWithExtension)2307cdf0e10cSrcweir void FileDialogHelper_Impl::addFilterPair( const OUString& rFilter,
2308cdf0e10cSrcweir                                            const OUString& rFilterWithExtension )
2309cdf0e10cSrcweir {
2310cdf0e10cSrcweir     maFilters.push_back( FilterPair( rFilter, rFilterWithExtension ) );
2311cdf0e10cSrcweir 
2312cdf0e10cSrcweir }
2313cdf0e10cSrcweir 
getFilterName(const OUString & rFilterWithExtension) const2314cdf0e10cSrcweir OUString FileDialogHelper_Impl::getFilterName( const OUString& rFilterWithExtension ) const
2315cdf0e10cSrcweir {
2316cdf0e10cSrcweir     OUString sRet;
2317cdf0e10cSrcweir     for( ::std::vector< FilterPair >::const_iterator pIter = maFilters.begin(); pIter != maFilters.end(); ++pIter )
2318cdf0e10cSrcweir     {
2319cdf0e10cSrcweir         if ( (*pIter).Second == rFilterWithExtension )
2320cdf0e10cSrcweir         {
2321cdf0e10cSrcweir             sRet = (*pIter).First;
2322cdf0e10cSrcweir             break;
2323cdf0e10cSrcweir         }
2324cdf0e10cSrcweir     }
2325cdf0e10cSrcweir     return sRet;
2326cdf0e10cSrcweir }
2327cdf0e10cSrcweir 
getFilterWithExtension(const OUString & rFilter) const2328cdf0e10cSrcweir OUString FileDialogHelper_Impl::getFilterWithExtension( const OUString& rFilter ) const
2329cdf0e10cSrcweir {
2330cdf0e10cSrcweir     OUString sRet;
2331cdf0e10cSrcweir     for( ::std::vector< FilterPair >::const_iterator pIter = maFilters.begin(); pIter != maFilters.end(); ++pIter )
2332cdf0e10cSrcweir     {
2333cdf0e10cSrcweir         if ( (*pIter).First == rFilter )
2334cdf0e10cSrcweir         {
2335cdf0e10cSrcweir             sRet = (*pIter).Second;
2336cdf0e10cSrcweir             break;
2337cdf0e10cSrcweir         }
2338cdf0e10cSrcweir     }
2339cdf0e10cSrcweir     return sRet;
2340cdf0e10cSrcweir }
2341cdf0e10cSrcweir 
SetContext(FileDialogHelper::Context _eNewContext)2342cdf0e10cSrcweir void FileDialogHelper_Impl::SetContext( FileDialogHelper::Context _eNewContext )
2343cdf0e10cSrcweir {
2344cdf0e10cSrcweir     meContext = _eNewContext;
2345cdf0e10cSrcweir 
2346cdf0e10cSrcweir     sal_Int32       nNewHelpId = 0;
2347cdf0e10cSrcweir     OUString        aConfigId;
2348cdf0e10cSrcweir 
2349cdf0e10cSrcweir     switch( _eNewContext )
2350cdf0e10cSrcweir     {
2351cdf0e10cSrcweir // #104952# dependency to SVX not allowed! When used again, another solution has to be found
2352cdf0e10cSrcweir //      case FileDialogHelper::SW_INSERT_GRAPHIC:
2353cdf0e10cSrcweir //      case FileDialogHelper::SC_INSERT_GRAPHIC:
2354cdf0e10cSrcweir //      case FileDialogHelper::SD_INSERT_GRAPHIC:       nNewHelpId = SID_INSERT_GRAPHIC;        break;
2355cdf0e10cSrcweir         case FileDialogHelper::SW_INSERT_SOUND:
2356cdf0e10cSrcweir         case FileDialogHelper::SC_INSERT_SOUND:
2357cdf0e10cSrcweir         case FileDialogHelper::SD_INSERT_SOUND:         nNewHelpId = SID_INSERT_SOUND;          break;
2358cdf0e10cSrcweir         case FileDialogHelper::SW_INSERT_VIDEO:
2359cdf0e10cSrcweir         case FileDialogHelper::SC_INSERT_VIDEO:
2360cdf0e10cSrcweir         case FileDialogHelper::SD_INSERT_VIDEO:         nNewHelpId = SID_INSERT_VIDEO;          break;
2361cdf0e10cSrcweir               default: break;
2362cdf0e10cSrcweir     }
2363cdf0e10cSrcweir 
2364cdf0e10cSrcweir     const OUString* pConfigId = GetLastFilterConfigId( _eNewContext );
2365cdf0e10cSrcweir     if( pConfigId )
2366cdf0e10cSrcweir         LoadLastUsedFilter( *pConfigId );
2367cdf0e10cSrcweir }
2368cdf0e10cSrcweir 
2369cdf0e10cSrcweir // ------------------------------------------------------------------------
2370cdf0e10cSrcweir // -----------          FileDialogHelper        ---------------------------
2371cdf0e10cSrcweir // ------------------------------------------------------------------------
2372cdf0e10cSrcweir 
FileDialogHelper(sal_Int64 nFlags,const String & rFact,SfxFilterFlags nMust,SfxFilterFlags nDont)2373cdf0e10cSrcweir FileDialogHelper::FileDialogHelper(
2374cdf0e10cSrcweir     sal_Int64 nFlags,
2375cdf0e10cSrcweir     const String& rFact,
2376cdf0e10cSrcweir     SfxFilterFlags nMust,
2377cdf0e10cSrcweir     SfxFilterFlags nDont )
2378cdf0e10cSrcweir {
2379cdf0e10cSrcweir     mpImp = new FileDialogHelper_Impl( this, getDialogType( nFlags ), nFlags );
2380cdf0e10cSrcweir     mxImp = mpImp;
2381cdf0e10cSrcweir 
2382cdf0e10cSrcweir     // create the list of filters
2383cdf0e10cSrcweir     mpImp->addFilters( nFlags, SfxObjectShell::GetServiceNameFromFactory(rFact), nMust, nDont );
2384cdf0e10cSrcweir }
2385cdf0e10cSrcweir 
FileDialogHelper(sal_Int64 nFlags,const String & rFact,sal_Int16 nDialog,SfxFilterFlags nMust,SfxFilterFlags nDont,const String & rStandardDir,const::com::sun::star::uno::Sequence<::rtl::OUString> & rBlackList)2386cdf0e10cSrcweir FileDialogHelper::FileDialogHelper(
2387cdf0e10cSrcweir     sal_Int64 nFlags,
2388cdf0e10cSrcweir     const String& rFact,
2389cdf0e10cSrcweir     sal_Int16 nDialog,
2390cdf0e10cSrcweir     SfxFilterFlags nMust,
2391cdf0e10cSrcweir     SfxFilterFlags nDont,
2392cdf0e10cSrcweir     const String& rStandardDir,
2393cdf0e10cSrcweir     const ::com::sun::star::uno::Sequence< ::rtl::OUString >& rBlackList)
2394cdf0e10cSrcweir {
2395cdf0e10cSrcweir     mpImp = new FileDialogHelper_Impl( this, getDialogType( nFlags ), nFlags, nDialog, NULL , rStandardDir, rBlackList );
2396cdf0e10cSrcweir     mxImp = mpImp;
2397cdf0e10cSrcweir 
2398cdf0e10cSrcweir     // create the list of filters
2399cdf0e10cSrcweir     mpImp->addFilters( nFlags, SfxObjectShell::GetServiceNameFromFactory(rFact), nMust, nDont );
2400cdf0e10cSrcweir }
2401cdf0e10cSrcweir 
FileDialogHelper(sal_Int64 nFlags,const String & rFact,sal_Int16 nDialog,SfxFilterFlags nMust,SfxFilterFlags nDont)2402cdf0e10cSrcweir FileDialogHelper::FileDialogHelper(
2403cdf0e10cSrcweir     sal_Int64 nFlags,
2404cdf0e10cSrcweir     const String& rFact,
2405cdf0e10cSrcweir     sal_Int16 nDialog,
2406cdf0e10cSrcweir     SfxFilterFlags nMust,
2407cdf0e10cSrcweir     SfxFilterFlags nDont )
2408cdf0e10cSrcweir {
2409cdf0e10cSrcweir     mpImp = new FileDialogHelper_Impl( this, getDialogType( nFlags ), nFlags, nDialog );
2410cdf0e10cSrcweir     mxImp = mpImp;
2411cdf0e10cSrcweir 
2412cdf0e10cSrcweir     // create the list of filters
2413cdf0e10cSrcweir     mpImp->addFilters( nFlags, SfxObjectShell::GetServiceNameFromFactory(rFact), nMust, nDont );
2414cdf0e10cSrcweir }
2415cdf0e10cSrcweir 
2416cdf0e10cSrcweir // ------------------------------------------------------------------------
FileDialogHelper(sal_Int64 nFlags)2417cdf0e10cSrcweir FileDialogHelper::FileDialogHelper( sal_Int64 nFlags )
2418cdf0e10cSrcweir {
2419cdf0e10cSrcweir     sal_Int16 nDialogType = getDialogType( nFlags );
2420cdf0e10cSrcweir 
2421cdf0e10cSrcweir     mpImp = new FileDialogHelper_Impl( this, nDialogType, nFlags );
2422cdf0e10cSrcweir     mxImp = mpImp;
2423cdf0e10cSrcweir }
2424cdf0e10cSrcweir 
2425cdf0e10cSrcweir // ------------------------------------------------------------------------
FileDialogHelper(sal_Int16 nDialogType,sal_Int64 nFlags,const String & rFact,SfxFilterFlags nMust,SfxFilterFlags nDont)2426cdf0e10cSrcweir FileDialogHelper::FileDialogHelper(
2427cdf0e10cSrcweir     sal_Int16 nDialogType,
2428cdf0e10cSrcweir     sal_Int64 nFlags,
2429cdf0e10cSrcweir     const String& rFact,
2430cdf0e10cSrcweir     SfxFilterFlags nMust,
2431cdf0e10cSrcweir     SfxFilterFlags nDont )
2432cdf0e10cSrcweir {
2433cdf0e10cSrcweir     mpImp = new FileDialogHelper_Impl( this, nDialogType, nFlags );
2434cdf0e10cSrcweir     mxImp = mpImp;
2435cdf0e10cSrcweir 
2436cdf0e10cSrcweir     // create the list of filters
2437cdf0e10cSrcweir     mpImp->addFilters( nFlags, SfxObjectShell::GetServiceNameFromFactory(rFact), nMust, nDont );
2438cdf0e10cSrcweir }
2439cdf0e10cSrcweir 
2440cdf0e10cSrcweir // ------------------------------------------------------------------------
FileDialogHelper(sal_Int16 nDialogType,sal_Int64 nFlags,const String & rFact,sal_Int16 nDialog,SfxFilterFlags nMust,SfxFilterFlags nDont,const String & rStandardDir,const::com::sun::star::uno::Sequence<::rtl::OUString> & rBlackList)2441cdf0e10cSrcweir FileDialogHelper::FileDialogHelper(
2442cdf0e10cSrcweir     sal_Int16 nDialogType,
2443cdf0e10cSrcweir     sal_Int64 nFlags,
2444cdf0e10cSrcweir     const String& rFact,
2445cdf0e10cSrcweir     sal_Int16 nDialog,
2446cdf0e10cSrcweir     SfxFilterFlags nMust,
2447cdf0e10cSrcweir     SfxFilterFlags nDont,
2448cdf0e10cSrcweir     const String& rStandardDir,
2449cdf0e10cSrcweir     const ::com::sun::star::uno::Sequence< ::rtl::OUString >& rBlackList)
2450cdf0e10cSrcweir {
2451cdf0e10cSrcweir     mpImp = new FileDialogHelper_Impl( this, nDialogType, nFlags, nDialog, NULL, rStandardDir, rBlackList );
2452cdf0e10cSrcweir     mxImp = mpImp;
2453cdf0e10cSrcweir 
2454cdf0e10cSrcweir     // create the list of filters
2455cdf0e10cSrcweir     mpImp->addFilters( nFlags, SfxObjectShell::GetServiceNameFromFactory(rFact), nMust, nDont );
2456cdf0e10cSrcweir }
2457cdf0e10cSrcweir 
2458cdf0e10cSrcweir // ------------------------------------------------------------------------
FileDialogHelper(sal_Int16 nDialogType,sal_Int64 nFlags,Window * _pPreferredParent)2459cdf0e10cSrcweir FileDialogHelper::FileDialogHelper(
2460cdf0e10cSrcweir     sal_Int16 nDialogType,
2461cdf0e10cSrcweir     sal_Int64 nFlags,
2462cdf0e10cSrcweir     Window* _pPreferredParent )
2463cdf0e10cSrcweir {
2464cdf0e10cSrcweir     mpImp = new FileDialogHelper_Impl( this, nDialogType, nFlags, SFX2_IMPL_DIALOG_CONFIG, _pPreferredParent );
2465cdf0e10cSrcweir     mxImp = mpImp;
2466cdf0e10cSrcweir }
2467cdf0e10cSrcweir 
2468cdf0e10cSrcweir // ------------------------------------------------------------------------
FileDialogHelper(sal_Int16 nDialogType,sal_Int64 nFlags,const::rtl::OUString & aFilterUIName,const::rtl::OUString & aExtName,const::rtl::OUString & rStandardDir,const::com::sun::star::uno::Sequence<::rtl::OUString> & rBlackList,Window * _pPreferredParent)2469cdf0e10cSrcweir FileDialogHelper::FileDialogHelper(
2470cdf0e10cSrcweir     sal_Int16 nDialogType,
2471cdf0e10cSrcweir     sal_Int64 nFlags,
2472cdf0e10cSrcweir     const ::rtl::OUString& aFilterUIName,
2473cdf0e10cSrcweir     const ::rtl::OUString& aExtName,
2474cdf0e10cSrcweir     const ::rtl::OUString& rStandardDir,
2475cdf0e10cSrcweir     const ::com::sun::star::uno::Sequence< ::rtl::OUString >& rBlackList,
2476cdf0e10cSrcweir     Window* _pPreferredParent )
2477cdf0e10cSrcweir {
2478cdf0e10cSrcweir     mpImp = new FileDialogHelper_Impl( this, nDialogType, nFlags, SFX2_IMPL_DIALOG_CONFIG, _pPreferredParent,rStandardDir, rBlackList );
2479cdf0e10cSrcweir     mxImp = mpImp;
2480cdf0e10cSrcweir 
2481cdf0e10cSrcweir     // the wildcard here is expected in form "*.extension"
2482cdf0e10cSrcweir     ::rtl::OUString aWildcard;
2483cdf0e10cSrcweir     if ( aExtName.indexOf( (sal_Unicode)'*' ) != 0 )
2484cdf0e10cSrcweir     {
2485cdf0e10cSrcweir         if ( aExtName.getLength() && aExtName.indexOf( (sal_Unicode)'.' ) != 0 )
2486cdf0e10cSrcweir             aWildcard = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "*." ) );
2487cdf0e10cSrcweir         else
2488cdf0e10cSrcweir             aWildcard = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "*" ) );
2489cdf0e10cSrcweir     }
2490cdf0e10cSrcweir 
2491cdf0e10cSrcweir     aWildcard += aExtName;
2492cdf0e10cSrcweir 
2493cdf0e10cSrcweir     ::rtl::OUString aUIString =
2494cdf0e10cSrcweir         ::sfx2::addExtension( aFilterUIName, aWildcard, ( WB_OPEN == ( nFlags & WB_OPEN ) ), *mpImp );
2495cdf0e10cSrcweir     AddFilter( aUIString, aWildcard );
2496cdf0e10cSrcweir }
2497cdf0e10cSrcweir 
2498cdf0e10cSrcweir // ------------------------------------------------------------------------
~FileDialogHelper()2499cdf0e10cSrcweir FileDialogHelper::~FileDialogHelper()
2500cdf0e10cSrcweir {
2501cdf0e10cSrcweir     mpImp->dispose();
2502cdf0e10cSrcweir     mxImp.clear();
2503cdf0e10cSrcweir }
2504cdf0e10cSrcweir 
2505cdf0e10cSrcweir // ------------------------------------------------------------------------
CreateMatcher(const String & rFactory)2506cdf0e10cSrcweir void FileDialogHelper::CreateMatcher( const String& rFactory )
2507cdf0e10cSrcweir {
2508cdf0e10cSrcweir     mpImp->createMatcher( SfxObjectShell::GetServiceNameFromFactory(rFactory) );
2509cdf0e10cSrcweir }
2510cdf0e10cSrcweir 
2511cdf0e10cSrcweir // ------------------------------------------------------------------------
SetControlHelpIds(const sal_Int16 * _pControlId,const char ** _pHelpId)2512cdf0e10cSrcweir void FileDialogHelper::SetControlHelpIds( const sal_Int16* _pControlId, const char** _pHelpId )
2513cdf0e10cSrcweir {
2514cdf0e10cSrcweir     mpImp->setControlHelpIds( _pControlId, _pHelpId );
2515cdf0e10cSrcweir }
2516cdf0e10cSrcweir 
SetContext(Context _eNewContext)2517cdf0e10cSrcweir void FileDialogHelper::SetContext( Context _eNewContext )
2518cdf0e10cSrcweir {
2519cdf0e10cSrcweir     mpImp->SetContext( _eNewContext );
2520cdf0e10cSrcweir }
2521cdf0e10cSrcweir 
2522cdf0e10cSrcweir // ------------------------------------------------------------------------
IMPL_LINK(FileDialogHelper,ExecuteSystemFilePicker,void *,EMPTYARG)2523cdf0e10cSrcweir IMPL_LINK( FileDialogHelper, ExecuteSystemFilePicker, void*, EMPTYARG )
2524cdf0e10cSrcweir {
2525cdf0e10cSrcweir     m_nError = mpImp->execute();
2526cdf0e10cSrcweir     if ( m_aDialogClosedLink.IsSet() )
2527cdf0e10cSrcweir         m_aDialogClosedLink.Call( this );
2528cdf0e10cSrcweir 
2529cdf0e10cSrcweir     return 0L;
2530cdf0e10cSrcweir }
2531cdf0e10cSrcweir 
2532cdf0e10cSrcweir // ------------------------------------------------------------------------
2533cdf0e10cSrcweir // rDirPath has to be a directory
Execute(SvStringsDtor * & rpURLList,SfxItemSet * & rpSet,String & rFilter,const String & rDirPath)2534cdf0e10cSrcweir ErrCode FileDialogHelper::Execute( SvStringsDtor*& rpURLList,
2535cdf0e10cSrcweir                                    SfxItemSet *&   rpSet,
2536cdf0e10cSrcweir                                    String&         rFilter,
2537cdf0e10cSrcweir                                    const String&   rDirPath )
2538cdf0e10cSrcweir {
2539cdf0e10cSrcweir     SetDisplayFolder( rDirPath );
2540cdf0e10cSrcweir     return mpImp->execute( rpURLList, rpSet, rFilter );
2541cdf0e10cSrcweir }
2542cdf0e10cSrcweir 
2543cdf0e10cSrcweir 
2544cdf0e10cSrcweir // ------------------------------------------------------------------------
Execute()2545cdf0e10cSrcweir ErrCode FileDialogHelper::Execute()
2546cdf0e10cSrcweir {
2547cdf0e10cSrcweir     return mpImp->execute();
2548cdf0e10cSrcweir }
2549cdf0e10cSrcweir 
2550cdf0e10cSrcweir // ------------------------------------------------------------------------
Execute(SfxItemSet * & rpSet,String & rFilter)2551cdf0e10cSrcweir ErrCode FileDialogHelper::Execute( SfxItemSet *&   rpSet,
2552cdf0e10cSrcweir                                    String&         rFilter )
2553cdf0e10cSrcweir {
2554cdf0e10cSrcweir     ErrCode nRet;
2555cdf0e10cSrcweir     SvStringsDtor* pURLList;
2556cdf0e10cSrcweir 
2557cdf0e10cSrcweir     nRet = mpImp->execute( pURLList, rpSet, rFilter );
2558cdf0e10cSrcweir 
2559cdf0e10cSrcweir     delete pURLList;
2560cdf0e10cSrcweir 
2561cdf0e10cSrcweir     return nRet;
2562cdf0e10cSrcweir }
2563cdf0e10cSrcweir 
StartExecuteModal(const Link & rEndDialogHdl)2564cdf0e10cSrcweir void FileDialogHelper::StartExecuteModal( const Link& rEndDialogHdl )
2565cdf0e10cSrcweir {
2566cdf0e10cSrcweir     m_aDialogClosedLink = rEndDialogHdl;
2567cdf0e10cSrcweir     m_nError = ERRCODE_NONE;
2568cdf0e10cSrcweir     if ( mpImp->isSystemFilePicker() )
2569cdf0e10cSrcweir         Application::PostUserEvent( LINK( this, FileDialogHelper, ExecuteSystemFilePicker ) );
2570cdf0e10cSrcweir     else
2571cdf0e10cSrcweir         mpImp->implStartExecute();
2572cdf0e10cSrcweir }
2573cdf0e10cSrcweir 
2574cdf0e10cSrcweir // ------------------------------------------------------------------------
2575cdf0e10cSrcweir 
GetDialogType() const2576cdf0e10cSrcweir short FileDialogHelper::GetDialogType() const
2577cdf0e10cSrcweir {
2578cdf0e10cSrcweir     return mpImp ? mpImp->m_nDialogType : 0;
2579cdf0e10cSrcweir }
2580cdf0e10cSrcweir 
2581cdf0e10cSrcweir // ------------------------------------------------------------------------
2582cdf0e10cSrcweir 
IsPasswordEnabled() const2583cdf0e10cSrcweir sal_Bool FileDialogHelper::IsPasswordEnabled() const
2584cdf0e10cSrcweir {
2585cdf0e10cSrcweir     return mpImp ? mpImp->isPasswordEnabled() : sal_False;
2586cdf0e10cSrcweir }
2587cdf0e10cSrcweir 
2588cdf0e10cSrcweir // ------------------------------------------------------------------------
2589cdf0e10cSrcweir 
GetRealFilter() const2590cdf0e10cSrcweir String FileDialogHelper::GetRealFilter() const
2591cdf0e10cSrcweir {
2592cdf0e10cSrcweir     String sFilter;
2593cdf0e10cSrcweir     if ( mpImp )
2594cdf0e10cSrcweir         mpImp->getRealFilter( sFilter );
2595cdf0e10cSrcweir     return sFilter;
2596cdf0e10cSrcweir }
2597cdf0e10cSrcweir 
2598cdf0e10cSrcweir // ------------------------------------------------------------------------
SetTitle(const String & rNewTitle)2599cdf0e10cSrcweir void FileDialogHelper::SetTitle( const String& rNewTitle )
2600cdf0e10cSrcweir {
2601cdf0e10cSrcweir     if ( mpImp->mxFileDlg.is() )
2602cdf0e10cSrcweir         mpImp->mxFileDlg->setTitle( rNewTitle );
2603cdf0e10cSrcweir }
2604cdf0e10cSrcweir 
2605cdf0e10cSrcweir // ------------------------------------------------------------------------
GetPath() const2606cdf0e10cSrcweir String FileDialogHelper::GetPath() const
2607cdf0e10cSrcweir {
2608cdf0e10cSrcweir     OUString aPath;
2609cdf0e10cSrcweir 
2610cdf0e10cSrcweir     if ( mpImp->mlLastURLs.size() > 0)
2611cdf0e10cSrcweir         return mpImp->mlLastURLs[0];
2612cdf0e10cSrcweir 
2613cdf0e10cSrcweir     if ( mpImp->mxFileDlg.is() )
2614cdf0e10cSrcweir     {
2615cdf0e10cSrcweir         Sequence < OUString > aPathSeq = mpImp->mxFileDlg->getFiles();
2616cdf0e10cSrcweir 
2617cdf0e10cSrcweir         if ( aPathSeq.getLength() == 1 )
2618cdf0e10cSrcweir         {
2619cdf0e10cSrcweir             aPath = aPathSeq[0];
2620cdf0e10cSrcweir         }
2621cdf0e10cSrcweir     }
2622cdf0e10cSrcweir 
2623cdf0e10cSrcweir     return aPath;
2624cdf0e10cSrcweir }
2625cdf0e10cSrcweir 
2626cdf0e10cSrcweir // ------------------------------------------------------------------------
GetMPath() const2627cdf0e10cSrcweir Sequence < OUString > FileDialogHelper::GetMPath() const
2628cdf0e10cSrcweir {
2629cdf0e10cSrcweir     if ( mpImp->mlLastURLs.size() > 0)
2630cdf0e10cSrcweir         return mpImp->mlLastURLs.getAsConstList();
2631cdf0e10cSrcweir 
2632cdf0e10cSrcweir     if ( mpImp->mxFileDlg.is() )
2633cdf0e10cSrcweir         return mpImp->mxFileDlg->getFiles();
2634cdf0e10cSrcweir     else
2635cdf0e10cSrcweir     {
2636cdf0e10cSrcweir         Sequence < OUString > aEmpty;
2637cdf0e10cSrcweir         return aEmpty;
2638cdf0e10cSrcweir     }
2639cdf0e10cSrcweir }
2640cdf0e10cSrcweir 
2641cdf0e10cSrcweir // ------------------------------------------------------------------------
GetSelectedFiles() const2642cdf0e10cSrcweir Sequence< ::rtl::OUString > FileDialogHelper::GetSelectedFiles() const
2643cdf0e10cSrcweir {
2644cdf0e10cSrcweir     // a) the new way (optional!)
2645cdf0e10cSrcweir     uno::Sequence< ::rtl::OUString > aResultSeq;
2646cdf0e10cSrcweir     uno::Reference< XFilePicker2 > xPickNew(mpImp->mxFileDlg, UNO_QUERY);
2647cdf0e10cSrcweir     if (xPickNew.is())
2648cdf0e10cSrcweir     {
2649cdf0e10cSrcweir         aResultSeq = xPickNew->getSelectedFiles();
2650cdf0e10cSrcweir     }
2651cdf0e10cSrcweir     // b) the olde way ... non optional.
2652cdf0e10cSrcweir     else
2653cdf0e10cSrcweir     {
2654cdf0e10cSrcweir         uno::Reference< XFilePicker > xPickOld(mpImp->mxFileDlg, UNO_QUERY_THROW);
2655cdf0e10cSrcweir         Sequence< OUString > lFiles = xPickOld->getFiles();
2656cdf0e10cSrcweir         ::sal_Int32          nFiles = lFiles.getLength();
2657cdf0e10cSrcweir         if ( nFiles > 1 )
2658cdf0e10cSrcweir         {
2659cdf0e10cSrcweir             aResultSeq = Sequence< ::rtl::OUString >( nFiles-1 );
2660cdf0e10cSrcweir 
2661cdf0e10cSrcweir             INetURLObject aPath( lFiles[0] );
2662cdf0e10cSrcweir             aPath.setFinalSlash();
2663cdf0e10cSrcweir 
2664cdf0e10cSrcweir             for (::sal_Int32 i = 1; i < nFiles; i++)
2665cdf0e10cSrcweir             {
2666cdf0e10cSrcweir                 if (i == 1)
2667cdf0e10cSrcweir                     aPath.Append( lFiles[i] );
2668cdf0e10cSrcweir                 else
2669cdf0e10cSrcweir                     aPath.setName( lFiles[i] );
2670cdf0e10cSrcweir 
2671cdf0e10cSrcweir                 aResultSeq[i-1] = ::rtl::OUString(aPath.GetMainURL( INetURLObject::NO_DECODE ));
2672cdf0e10cSrcweir             }
2673cdf0e10cSrcweir         }
2674cdf0e10cSrcweir         else
2675cdf0e10cSrcweir             aResultSeq = lFiles;
2676cdf0e10cSrcweir     }
2677cdf0e10cSrcweir 
2678cdf0e10cSrcweir     return aResultSeq;
2679cdf0e10cSrcweir }
2680cdf0e10cSrcweir 
2681cdf0e10cSrcweir // ------------------------------------------------------------------------
GetDisplayDirectory() const2682cdf0e10cSrcweir String FileDialogHelper::GetDisplayDirectory() const
2683cdf0e10cSrcweir {
2684cdf0e10cSrcweir     return mpImp->getPath();
2685cdf0e10cSrcweir }
2686cdf0e10cSrcweir 
2687cdf0e10cSrcweir // ------------------------------------------------------------------------
GetCurrentFilter() const2688cdf0e10cSrcweir String FileDialogHelper::GetCurrentFilter() const
2689cdf0e10cSrcweir {
2690cdf0e10cSrcweir     return mpImp->getFilter();
2691cdf0e10cSrcweir }
2692cdf0e10cSrcweir 
2693cdf0e10cSrcweir // ------------------------------------------------------------------------
GetGraphic(Graphic & rGraphic) const2694cdf0e10cSrcweir ErrCode FileDialogHelper::GetGraphic( Graphic& rGraphic ) const
2695cdf0e10cSrcweir {
2696cdf0e10cSrcweir     return mpImp->getGraphic( rGraphic );
2697cdf0e10cSrcweir }
2698cdf0e10cSrcweir 
2699cdf0e10cSrcweir // ------------------------------------------------------------------------
impl_isFolder(const OUString & rPath)2700cdf0e10cSrcweir static int impl_isFolder( const OUString& rPath )
2701cdf0e10cSrcweir {
2702cdf0e10cSrcweir     uno::Reference< task::XInteractionHandler > xHandler;
2703cdf0e10cSrcweir     try
2704cdf0e10cSrcweir     {
2705cdf0e10cSrcweir         uno::Reference< lang::XMultiServiceFactory > xFactory( ::comphelper::getProcessServiceFactory(), uno::UNO_QUERY_THROW );
2706cdf0e10cSrcweir         xHandler.set( xFactory->createInstance( DEFINE_CONST_OUSTRING( "com.sun.star.task.InteractionHandler" ) ),
2707cdf0e10cSrcweir                       uno::UNO_QUERY_THROW );
2708cdf0e10cSrcweir     }
2709cdf0e10cSrcweir     catch ( Exception const & )
2710cdf0e10cSrcweir     {
2711cdf0e10cSrcweir     }
2712cdf0e10cSrcweir 
27139c0c1533SAndrea Pescetti     ::rtl::Reference< ::comphelper::StillReadWriteInteraction > aHandler = new ::comphelper::StillReadWriteInteraction( xHandler , uno::Reference< task::XInteractionHandler >());
2714cdf0e10cSrcweir 
2715cdf0e10cSrcweir     try
2716cdf0e10cSrcweir     {
2717cdf0e10cSrcweir         ::ucbhelper::Content aContent(
2718cdf0e10cSrcweir             rPath, new ::ucbhelper::CommandEnvironment( static_cast< task::XInteractionHandler* > ( aHandler.get() ), uno::Reference< ucb::XProgressHandler >() ) );
2719cdf0e10cSrcweir         if ( aContent.isFolder() )
2720cdf0e10cSrcweir             return 1;
2721cdf0e10cSrcweir 
2722cdf0e10cSrcweir         return 0;
2723cdf0e10cSrcweir     }
2724cdf0e10cSrcweir     catch ( Exception const & )
2725cdf0e10cSrcweir     {
2726cdf0e10cSrcweir     }
2727cdf0e10cSrcweir 
2728cdf0e10cSrcweir     return -1;
2729cdf0e10cSrcweir }
2730cdf0e10cSrcweir 
SetDisplayDirectory(const String & _rPath)2731cdf0e10cSrcweir void FileDialogHelper::SetDisplayDirectory( const String& _rPath )
2732cdf0e10cSrcweir {
2733cdf0e10cSrcweir     if ( !_rPath.Len() )
2734cdf0e10cSrcweir         return;
2735cdf0e10cSrcweir 
2736cdf0e10cSrcweir     // if the given path isn't a folder, we cut off the last part
2737cdf0e10cSrcweir     // and take it as filename and the rest of the path should be
2738cdf0e10cSrcweir     // the folder
2739cdf0e10cSrcweir 
2740cdf0e10cSrcweir     INetURLObject aObj( _rPath );
2741cdf0e10cSrcweir 
2742cdf0e10cSrcweir     ::rtl::OUString sFileName = aObj.GetName( INetURLObject::DECODE_WITH_CHARSET );
2743cdf0e10cSrcweir     aObj.removeSegment();
2744cdf0e10cSrcweir     ::rtl::OUString sPath = aObj.GetMainURL( INetURLObject::NO_DECODE );
2745cdf0e10cSrcweir 
2746cdf0e10cSrcweir     int nIsFolder = impl_isFolder( _rPath );
2747cdf0e10cSrcweir     if ( nIsFolder == 0 ||
2748cdf0e10cSrcweir          ( nIsFolder == -1 && impl_isFolder( sPath ) == 1 ) )
2749cdf0e10cSrcweir     {
2750cdf0e10cSrcweir         mpImp->setFileName( sFileName );
2751cdf0e10cSrcweir         mpImp->displayFolder( sPath );
2752cdf0e10cSrcweir     }
2753cdf0e10cSrcweir     else
2754cdf0e10cSrcweir     {
2755cdf0e10cSrcweir         INetURLObject aObjPathName( _rPath );
2756cdf0e10cSrcweir         ::rtl::OUString sFolder( aObjPathName.GetMainURL( INetURLObject::NO_DECODE ) );
2757cdf0e10cSrcweir         if ( sFolder.getLength() == 0 )
2758cdf0e10cSrcweir         {
2759cdf0e10cSrcweir             // _rPath is not a valid path -> fallback to home directory
2760cdf0e10cSrcweir             vos:: OSecurity  aSecurity;
2761cdf0e10cSrcweir             aSecurity.getHomeDir( sFolder );
2762cdf0e10cSrcweir         }
2763cdf0e10cSrcweir         mpImp->displayFolder( sFolder );
2764cdf0e10cSrcweir     }
2765cdf0e10cSrcweir }
2766cdf0e10cSrcweir 
2767cdf0e10cSrcweir // ------------------------------------------------------------------------
SetDisplayFolder(const String & _rURL)2768cdf0e10cSrcweir void FileDialogHelper::SetDisplayFolder( const String& _rURL )
2769cdf0e10cSrcweir {
2770cdf0e10cSrcweir     mpImp->displayFolder( _rURL );
2771cdf0e10cSrcweir }
2772cdf0e10cSrcweir 
2773cdf0e10cSrcweir // ------------------------------------------------------------------------
SetFileName(const String & _rFileName)2774cdf0e10cSrcweir void FileDialogHelper::SetFileName( const String& _rFileName )
2775cdf0e10cSrcweir {
2776cdf0e10cSrcweir     mpImp->setFileName( _rFileName );
2777cdf0e10cSrcweir }
2778cdf0e10cSrcweir 
2779cdf0e10cSrcweir // ------------------------------------------------------------------------
AddFilter(const String & rFilterName,const String & rExtension)2780cdf0e10cSrcweir void FileDialogHelper::AddFilter( const String& rFilterName,
2781cdf0e10cSrcweir                                   const String& rExtension )
2782cdf0e10cSrcweir {
2783cdf0e10cSrcweir     mpImp->addFilter( rFilterName, rExtension );
2784cdf0e10cSrcweir }
2785cdf0e10cSrcweir 
2786cdf0e10cSrcweir // ------------------------------------------------------------------------
SetCurrentFilter(const String & rFilter)2787cdf0e10cSrcweir void FileDialogHelper::SetCurrentFilter( const String& rFilter )
2788cdf0e10cSrcweir {
2789cdf0e10cSrcweir     String sFilter( rFilter );
2790cdf0e10cSrcweir     if ( mpImp->isShowFilterExtensionEnabled() )
2791cdf0e10cSrcweir         sFilter = mpImp->getFilterWithExtension( rFilter );
2792cdf0e10cSrcweir     mpImp->setFilter( sFilter );
2793cdf0e10cSrcweir }
2794cdf0e10cSrcweir 
2795cdf0e10cSrcweir // ------------------------------------------------------------------------
GetFilePicker() const2796cdf0e10cSrcweir uno::Reference < XFilePicker > FileDialogHelper::GetFilePicker() const
2797cdf0e10cSrcweir {
2798cdf0e10cSrcweir     return mpImp->mxFileDlg;
2799cdf0e10cSrcweir }
2800cdf0e10cSrcweir 
2801cdf0e10cSrcweir // ------------------------------------------------------------------------
getDialogType(sal_Int64 nFlags) const2802cdf0e10cSrcweir sal_Int16 FileDialogHelper::getDialogType( sal_Int64 nFlags ) const
2803cdf0e10cSrcweir {
2804cdf0e10cSrcweir     sal_Int16 nDialogType = FILEOPEN_SIMPLE;
2805cdf0e10cSrcweir 
2806cdf0e10cSrcweir     if ( nFlags & WB_SAVEAS )
2807cdf0e10cSrcweir     {
2808cdf0e10cSrcweir         if ( nFlags & SFXWB_PASSWORD )
2809cdf0e10cSrcweir             nDialogType = FILESAVE_AUTOEXTENSION_PASSWORD;
2810cdf0e10cSrcweir         else
2811cdf0e10cSrcweir             nDialogType = FILESAVE_SIMPLE;
2812cdf0e10cSrcweir     }
2813cdf0e10cSrcweir     else if ( nFlags & SFXWB_GRAPHIC )
2814cdf0e10cSrcweir     {
2815cdf0e10cSrcweir         if ( nFlags & SFXWB_SHOWSTYLES )
2816cdf0e10cSrcweir             nDialogType = FILEOPEN_LINK_PREVIEW_IMAGE_TEMPLATE;
2817cdf0e10cSrcweir         else
2818cdf0e10cSrcweir             nDialogType = FILEOPEN_LINK_PREVIEW;
2819cdf0e10cSrcweir     }
2820cdf0e10cSrcweir     else if ( SFXWB_INSERT != ( nFlags & SFXWB_INSERT ) )
2821cdf0e10cSrcweir         nDialogType = FILEOPEN_READONLY_VERSION;
2822cdf0e10cSrcweir 
2823cdf0e10cSrcweir     return nDialogType;
2824cdf0e10cSrcweir }
2825cdf0e10cSrcweir 
2826cdf0e10cSrcweir // ------------------------------------------------------------------------
2827cdf0e10cSrcweir // XFilePickerListener Methods
2828cdf0e10cSrcweir // ------------------------------------------------------------------------
FileSelectionChanged(const FilePickerEvent & aEvent)2829cdf0e10cSrcweir void SAL_CALL FileDialogHelper::FileSelectionChanged( const FilePickerEvent& aEvent )
2830cdf0e10cSrcweir {
2831cdf0e10cSrcweir     mpImp->handleFileSelectionChanged( aEvent );
2832cdf0e10cSrcweir }
2833cdf0e10cSrcweir 
2834cdf0e10cSrcweir // ------------------------------------------------------------------------
DirectoryChanged(const FilePickerEvent & aEvent)2835cdf0e10cSrcweir void SAL_CALL FileDialogHelper::DirectoryChanged( const FilePickerEvent& aEvent )
2836cdf0e10cSrcweir {
2837cdf0e10cSrcweir     mpImp->handleDirectoryChanged( aEvent );
2838cdf0e10cSrcweir }
2839cdf0e10cSrcweir 
2840cdf0e10cSrcweir // ------------------------------------------------------------------------
HelpRequested(const FilePickerEvent & aEvent)2841cdf0e10cSrcweir OUString SAL_CALL FileDialogHelper::HelpRequested( const FilePickerEvent& aEvent )
2842cdf0e10cSrcweir {
2843cdf0e10cSrcweir     return mpImp->handleHelpRequested( aEvent );
2844cdf0e10cSrcweir }
2845cdf0e10cSrcweir 
2846cdf0e10cSrcweir // ------------------------------------------------------------------------
ControlStateChanged(const FilePickerEvent & aEvent)2847cdf0e10cSrcweir void SAL_CALL FileDialogHelper::ControlStateChanged( const FilePickerEvent& aEvent )
2848cdf0e10cSrcweir {
2849cdf0e10cSrcweir     mpImp->handleControlStateChanged( aEvent );
2850cdf0e10cSrcweir }
2851cdf0e10cSrcweir 
2852cdf0e10cSrcweir // ------------------------------------------------------------------------
DialogSizeChanged()2853cdf0e10cSrcweir void SAL_CALL FileDialogHelper::DialogSizeChanged()
2854cdf0e10cSrcweir {
2855cdf0e10cSrcweir     mpImp->handleDialogSizeChanged();
2856cdf0e10cSrcweir }
2857cdf0e10cSrcweir 
2858cdf0e10cSrcweir // ------------------------------------------------------------------------
DialogClosed(const DialogClosedEvent & _rEvent)2859cdf0e10cSrcweir void SAL_CALL FileDialogHelper::DialogClosed( const DialogClosedEvent& _rEvent )
2860cdf0e10cSrcweir {
2861cdf0e10cSrcweir     m_nError = ( RET_OK == _rEvent.DialogResult ) ? ERRCODE_NONE : ERRCODE_ABORT;
2862cdf0e10cSrcweir     if ( m_aDialogClosedLink.IsSet() )
2863cdf0e10cSrcweir         m_aDialogClosedLink.Call( this );
2864cdf0e10cSrcweir }
2865cdf0e10cSrcweir 
2866cdf0e10cSrcweir // ------------------------------------------------------------------------
2867cdf0e10cSrcweir // ------------------------------------------------------------------------
2868cdf0e10cSrcweir // ------------------------------------------------------------------------
2869cdf0e10cSrcweir 
FileOpenDialog_Impl(sal_Int64 nFlags,const String & rFact,SvStringsDtor * & rpURLList,String & rFilter,SfxItemSet * & rpSet,const String * pPath,sal_Int16 nDialog,const String & rStandardDir,const::com::sun::star::uno::Sequence<::rtl::OUString> & rBlackList)2870cdf0e10cSrcweir ErrCode FileOpenDialog_Impl( sal_Int64 nFlags,
2871cdf0e10cSrcweir                              const String& rFact,
2872cdf0e10cSrcweir                              SvStringsDtor *& rpURLList,
2873cdf0e10cSrcweir                              String& rFilter,
2874cdf0e10cSrcweir                              SfxItemSet *& rpSet,
2875cdf0e10cSrcweir                              const String* pPath,
2876cdf0e10cSrcweir                              sal_Int16 nDialog,
2877cdf0e10cSrcweir                              const String& rStandardDir,
2878cdf0e10cSrcweir                              const ::com::sun::star::uno::Sequence< ::rtl::OUString >& rBlackList )
2879cdf0e10cSrcweir {
2880cdf0e10cSrcweir     ErrCode nRet;
2881cdf0e10cSrcweir     FileDialogHelper aDialog( nFlags, rFact, nDialog, 0, 0, rStandardDir, rBlackList );
2882cdf0e10cSrcweir 
2883cdf0e10cSrcweir     String aPath;
2884cdf0e10cSrcweir     if ( pPath )
2885cdf0e10cSrcweir         aPath = *pPath;
2886cdf0e10cSrcweir 
2887cdf0e10cSrcweir     nRet = aDialog.Execute( rpURLList, rpSet, rFilter, aPath );
2888cdf0e10cSrcweir     DBG_ASSERT( rFilter.SearchAscii(": ") == STRING_NOTFOUND, "Old filter name used!");
2889cdf0e10cSrcweir 
2890cdf0e10cSrcweir     return nRet;
2891cdf0e10cSrcweir }
2892cdf0e10cSrcweir 
2893cdf0e10cSrcweir 
2894cdf0e10cSrcweir // ------------------------------------------------------------------------
EncodeSpaces_Impl(const String & rSource)2895cdf0e10cSrcweir String EncodeSpaces_Impl( const String& rSource )
2896cdf0e10cSrcweir {
2897cdf0e10cSrcweir     String sRet( rSource );
2898cdf0e10cSrcweir     sRet.SearchAndReplaceAll( DEFINE_CONST_UNICODE( " " ), DEFINE_CONST_UNICODE( "%20" ) );
2899cdf0e10cSrcweir     return sRet;
2900cdf0e10cSrcweir }
2901cdf0e10cSrcweir 
2902cdf0e10cSrcweir // ------------------------------------------------------------------------
DecodeSpaces_Impl(const String & rSource)2903cdf0e10cSrcweir String DecodeSpaces_Impl( const String& rSource )
2904cdf0e10cSrcweir {
2905cdf0e10cSrcweir     String sRet( rSource );
2906cdf0e10cSrcweir     sRet.SearchAndReplaceAll( DEFINE_CONST_UNICODE( "%20" ), DEFINE_CONST_UNICODE( " " ) );
2907cdf0e10cSrcweir     return sRet;
2908cdf0e10cSrcweir }
2909cdf0e10cSrcweir 
2910cdf0e10cSrcweir // ------------------------------------------------------------------------
2911cdf0e10cSrcweir 
2912cdf0e10cSrcweir }   // end of namespace sfx2
2913