xref: /trunk/main/fpicker/source/office/iodlg.hxx (revision 10ce8018)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 #ifndef _IODLGIMPL_HXX
24 #define _IODLGIMPL_HXX
25 
26 #ifndef _VCL_DIALOG_HXX
27 #include <vcl/dialog.hxx>
28 #endif
29 #ifndef _SV_BUTTON_HXX
30 #include <vcl/button.hxx>
31 #endif
32 #include <vcl/fixed.hxx>
33 #include <vcl/edit.hxx>
34 #include <vcl/combobox.hxx>
35 #include <vcl/lstbox.hxx>
36 #include <com/sun/star/beans/StringPair.hpp>
37 #include <com/sun/star/uno/Any.hxx>
38 #include <com/sun/star/uno/Sequence.hxx>
39 #include <com/sun/star/ucb/IOErrorCode.hpp>
40 #include <com/sun/star/ui/dialogs/XDialogClosedListener.hpp>
41 #include <unotools/confignode.hxx>
42 #include "svl/inettype.hxx"
43 #include "svl/urlfilter.hxx"
44 #include <svl/restrictedpaths.hxx>
45 #include "asyncfilepicker.hxx"
46 #include "OfficeControlAccess.hxx"
47 #include "fpsmartcontent.hxx"
48 
49 #include <set>
50 
51 // @@@ using namespace com::sun::star::ucb;
52 
53 //*****************************************************************************
54 
55 class SvTabListBox;
56 class SvStringsDtor;
57 class SvtFileView;
58 struct ControlChain_Impl;
59 class SvtFileDialogFilter_Impl;
60 
61 //*****************************************************************************
62 
63 #define SFXWB_INSERT			( 0x04000000L | WB_OPEN )
64 #define SFXWB_PASSWORD			WB_PASSWORD
65 #define SFXWB_READONLY			WB_READONLY
66 #define SFXWB_PATHDIALOG		WB_PATH
67 #define SFXWB_CLASSPATH			( 0x08000000L | SFXWB_PATHDIALOG )
68 #define SFXWB_SHOWALLFOLDER		0x10000000L		// alle Ordner auch Mail/News/...
69 #define SFXWB_MULTISELECTION	0x20000000L		// Multiselection an
70 #define SFXWB_NOREMOTE          0x40000000L
71 #define SFXWB_SHOWVERSIONS		0x80000000L  	// Versionsauswahl anzeigen
72 
73 #define SFX_EXTRA_AUTOEXTENSION     0x00000001L
74 #define SFX_EXTRA_FILTEROPTIONS     0x00000002L
75 #define SFX_EXTRA_SHOWVERSIONS      0x00000004L
76 #define SFX_EXTRA_INSERTASLINK      0x00000008L
77 #define SFX_EXTRA_SHOWPREVIEW       0x00000010L
78 #define SFX_EXTRA_TEMPLATES         0x00000020L
79 #define SFX_EXTRA_PLAYBUTTON        0x00000040L
80 #define SFX_EXTRA_SELECTION         0x00000080L
81 #define SFX_EXTRA_IMAGE_TEMPLATE    0x00000100L
82 
83 #define RET_MANAGER				100
84 
85 #define FILEDIALOG_FILTER_ALL	"*.*"
86 
87 //*****************************************************************************
88 // SvtFileDialog
89 //*****************************************************************************
90 
91 class SvtExpFileDlg_Impl;
92 class SvtFileDialog : public ModalDialog, public ::svt::IFilePickerController
93 {
94 private:
95     // originally from VclFileDialog
96 	ControlChain_Impl*			_pUserControls;
97 
98 	CheckBox*					_pCbReadOnly;
99 	CheckBox*                   _pCbLinkBox;
100 	CheckBox*                   _pCbPreviewBox;
101 	CheckBox*                   _pCbSelection;
102     PushButton*                 _pPbPlay;
103 	Window*                     _pPrevWin;
104 	FixedBitmap*                _pPrevBmp;
105 	SvtFileView*				_pFileView;
106 	::svt::IFilePickerListener*	_pFileNotifier;
107 	SvtExpFileDlg_Impl*			_pImp;
108     WinBits						_nExtraBits;
109     sal_Bool                        _bIsInExecute   :	1;
110 
111 	ImageList					m_aImages;
112     ::svt::SmartContent			m_aContent;
113 
114     ::svt::RestrictedPaths      m_aURLFilter;
115     ::std::set< Control* >      m_aDisabledControls;
116 
117     ::utl::OConfigurationNode   m_aConfiguration;
118     ::rtl::Reference< ::svt::AsyncPickerAction >
119                                 m_pCurrentAsyncAction;
120     ::com::sun::star::uno::Reference<
121         ::com::sun::star::ui::dialogs::XDialogClosedListener >
122                                 m_xListener;
123     bool                        m_bInExecuteAsync;
124 	bool						m_bHasFilename;
125 
126 	DECL_STATIC_LINK( SvtFileDialog, FilterSelectHdl_Impl, ListBox* );
127 	DECL_STATIC_LINK( SvtFileDialog, NewFolderHdl_Impl, PushButton* );
128 	DECL_STATIC_LINK( SvtFileDialog, ViewHdl_Impl, ImageButton* );
129 	DECL_STATIC_LINK( SvtFileDialog, OpenHdl_Impl, void* );
130 	DECL_LINK       (                CancelHdl_Impl, void* );
131 	DECL_STATIC_LINK( SvtFileDialog, FileNameGetFocusHdl_Impl, void* );
132 	DECL_STATIC_LINK( SvtFileDialog, FileNameModifiedHdl_Impl, void* );
133 
134 	void						Init_Impl( WinBits nBits );
135 	/** find a filter with the given wildcard
136 	@param _rFilter
137 		the wildcard pattern to look for in the filter list
138 	@param _bMultiExt
139 		allow for filters with more than one extension pattern
140 	@param _rFilterChanged
141 		set to <TRUE/> if the filter changed
142 	@return
143 		the filter which has been found
144 	*/
145 	SvtFileDialogFilter_Impl*	FindFilter_Impl( const String& _rFilter,
146 												 sal_Bool _bMultiExt,
147 												 sal_Bool& _rFilterChanged
148 												 );
149 	void						ExecuteFilter();
150 	void						OpenMultiSelection_Impl();
151     void                        AddControls_Impl( );
152 
153 	DECL_LINK( SelectHdl_Impl, SvTabListBox* );
154 	DECL_LINK( DblClickHdl_Impl, SvTabListBox* );
155 	DECL_LINK( EntrySelectHdl_Impl, ComboBox* );
156 	DECL_LINK( OpenDoneHdl_Impl, SvtFileView* );
157 	DECL_LINK( AutoExtensionHdl_Impl, CheckBox* );
158 	DECL_LINK( ClickHdl_Impl, CheckBox* );
159 	DECL_LINK( PlayButtonHdl_Impl, PushButton* );
160 
161     // entfernt einen Filter mit Wildcards aus dem Path und gibt in zurueck
162 	sal_Bool IsolateFilterFromPath_Impl( String& rPath, String& rFilter );
163 
164 	void	implArrangeControls();
165 	void	implUpdateImages( );
166 
167 protected:
168 	virtual long				Notify( NotifyEvent& rNEvt );
169 	void						EnableInternet( sal_Bool bInternet );
170 
171     // originally from VclFileDialog
172 	Link						_aOKHdl;
173 	Link						_aFileSelectHdl;
174 	Link						_aFilterSelectHdl;
175 
176 	String						_aPath;
177 	String						_aDefExt;
178 
179 	void						ReleaseOwnerShip( Window* pUserControl );
180 
181     /** enables or disables the complete UI of the file picker, with only offering a
182         cancel button
183 
184         This method preserves the "enabled" state of its controls in the following sense:
185         If you disable a certain control, then disable the dialog UI, then enable the dialog
186         UI, the control will still be disabled.
187         This is under the assumption that you'll use EnableControl. Direct access to the control
188         (such as pControl->Enable()) will break this.
189     */
190     void                        EnableUI( sal_Bool _bEnable );
191 
192     /** enables or disables a control
193 
194         You are strongly encouraged to prefer this method over pControl->Enable( _bEnable ). See
195         <member>EnableUI</member> for details.
196     */
197     void                        EnableControl( Control* _pControl, sal_Bool _bEnable );
198     short                       PrepareExecute();
199 
200 public:
201 								SvtFileDialog( Window* _pParent, WinBits nBits, WinBits nExtraBits );
202 								SvtFileDialog( Window* _pParent, WinBits nBits );
203 								~SvtFileDialog();
204 
205 	virtual long				OK();
206 	virtual short				Execute();
207     virtual void                StartExecuteModal( const Link& rEndDialogHdl );
208 
209 			void				FileSelect();
210 			void				FilterSelect();
211 
212 	void						SetBlackList( const ::com::sun::star::uno::Sequence< ::rtl::OUString >& rBlackList );
213 	const ::com::sun::star::uno::Sequence< ::rtl::OUString >& GetBlackList() const;
214 	void						SetStandardDir( const String& rStdDir );
215 	const String&				GetStandardDir() const;
216 	SvStringsDtor*				GetPathList() const;		// bei MultiSelektion
217 
218 			void				AddFilter( const String& rFilter,
219 										   const String& rType );
220 
221 			void				AddFilterGroup(
222 				const String& _rFilter,
223 				const com::sun::star::uno::Sequence< com::sun::star::beans::StringPair >& rFilters );
224 
225 			void				SetCurFilter( const String& rFilter );
226 			String				GetCurFilter() const;
227 			sal_uInt16				GetFilterCount() const;
228 			const String&		GetFilterName( sal_uInt16 nPos ) const;
229 
230 	virtual	void				Resize();
231     virtual void				DataChanged( const DataChangedEvent& _rDCEvt );
232 
233 	void						PrevLevel_Impl();
234 	void						OpenURL_Impl( const String& rURL );
235 
236 	inline SvtFileView*			GetView() const;
237 
238 	void						DisableSaveLastDirectory();
239 	void                        InitSize();
240 	void						UpdateControls( const String& rURL );
241     void                        EnableAutocompletion( sal_Bool _bEnable = sal_True );
242 
SetFileCallback(::svt::IFilePickerListener * pNotifier)243 	void						SetFileCallback( ::svt::IFilePickerListener *pNotifier ) { _pFileNotifier = pNotifier; }
244 
245     sal_Int32                   getTargetColorDepth();
246     sal_Int32                   getAvailableWidth();
247     sal_Int32                   getAvailableHeight();
248     void                        setImage( sal_Int16 aImageFormat, const ::com::sun::star::uno::Any& rImage );
249     sal_Bool                    setShowState( sal_Bool bShowState );
250     sal_Bool                    getShowState();
251 	sal_Bool					isAutoExtensionEnabled();
252 
253 	String						getCurrentFileText( ) const;
254 	void						setCurrentFileText( const String& _rText, bool _bSelectAll = false );
255 
256     void                        onAsyncOperationStarted();
257     void                        onAsyncOperationFinished();
258 
259     void                        displayIOException( const String& _rURL, ::com::sun::star::ucb::IOErrorCode _eCode );
simulateAccessDenied(const String & _rURL)260     void                        simulateAccessDenied( const String& _rURL )
261     {
262         displayIOException( _rURL, ::com::sun::star::ucb::IOErrorCode_ACCESS_DENIED );
263     }
264 
265     // originally from VclFileDialog
266 	virtual sal_Bool				AddControl( Window* pControl, sal_Bool bNewLine = sal_False );
267 
268 	// inline
269 	inline void					SetPath( const String& rNewURL );
270 	inline void                 SetHasFilename( bool bHasFilename );
271 	inline const String&		GetPath() const;
272 	inline void					SetDefaultExt( const String& rExt );
273 	inline void					EraseDefaultExt( xub_StrLen _nIndex = 0 );
274 	inline const String&		GetDefaultExt() const;
275 	inline void					SetOKHdl( const Link& rLink );
276 	inline const Link&			GetOKHdl() const;
277 	inline void					SetFileSelectHdl( const Link& rLink );
278 	inline const Link&			GetFileSelectHdl() const;
279 	inline void					SetFilterSelectHdl( const Link& rLink );
280 	inline const Link&			GetFilterSelectHdl() const;
281 
GetButtonImage(sal_uInt16 _nButtonId) const282 	inline Image				GetButtonImage( sal_uInt16 _nButtonId ) const { return m_aImages.GetImage( _nButtonId ); }
283 
ContentIsFolder(const rtl::OUString & rURL)284 	sal_Bool					ContentIsFolder( const rtl::OUString& rURL ) { return m_aContent.isFolder( rURL ) && m_aContent.isValid(); }
285 	sal_Bool					ContentHasParentFolder( const rtl::OUString& rURL );
286 	sal_Bool					ContentCanMakeFolder( const rtl::OUString& rURL );
287 	sal_Bool					ContentGetTitle( const rtl::OUString& rURL, String& rTitle );
288 
289     /** updates the sizes of the listboxes in the bottom area of the dialog, and of their labels,
290         according to the space occupied by the current label texts
291 
292         @since #i42824#
293     */
294     void                        updateListboxLabelSizes();
295 
296     /** checks URL access permissions
297 
298         <p>with the "restriction" feature we have in the file dialog, it's possible that
299         only certain URLs can be browsed. This method checks whether a given URL belongs
300         to this set of permitted URLs.</p>
301 
302         <p>If no "access restriction" is effective, this method always returns <TRUE/>.</p>
303     */
isUrlAllowed(const String & _rURL) const304     inline bool isUrlAllowed( const String& _rURL ) const { return m_aURLFilter.isUrlAllowed( _rURL ); }
305 
306 private:
307 	SvtFileDialogFilter_Impl*	implAddFilter( const String& _rFilter, const String& _rType );
308 
309 	/** updates _pUserFilter with a new filter
310 		<p>No checks for necessity are made.</p>
311 		@param _bAllowUserDefExt
312 			set to <TRUE/> if a filter like "*.txt" should reset the DefaultExtension to doc.
313 			<p>
314 			In a file-save-dialog this would have the following effect:<br/>
315 			Say that auto-extension is checked, and the user enters *.txt, while a non-txt filter is selected.<br/>
316 			If _bAllowUserDefExt is set to <TRUE/>, then a user input of "foo" would save a foo.txt, but in a format
317 			which is determined by the filter selected (which is no txt file as said above).<br/>
318 			If _bAllowUserDefExt is set to <FALSE/>, the default extension will be the one of the selected filter, means
319 			in the above scenario a file "foo.<ext>" will be saved where ext is the extension of the selected filter.
320 			</p>
321 		@return <TRUE/> if the new filter is "*.*"
322 	*/
323 	sal_Bool					createNewUserFilter( const String& _rNewFilter, sal_Bool _bAllowUserDefExt );
324 
325 	sal_uInt16					adjustFilter( const String& _rFilter );
326 
327 	// IFilePickerController, needed by OControlAccess
328     virtual Control*            getControl( sal_Int16 _nControlId, sal_Bool _bLabelControl = sal_False ) const;
329     virtual void                enableControl( sal_Int16 _nControlId, sal_Bool _bEnable );
330     virtual String              getCurFilter( ) const;
331 
332 	String						implGetInitialURL( const String& _rPath, const String& _rFallback );
333 
334     /// initializes the special URL lists, such as our favourites and our restricted paths
335     void                        implInitializeSpecialURLLists( );
336 
337     /// executes a certain FileView action asynchronously
338     void                        executeAsync(
339                                     ::svt::AsyncPickerAction::Action _eAction,
340                                     const String& _rURL,
341                                     const String& _rFilter
342                                 );
343 
344     /** helper function to check and append the default filter extension if
345         necessary.
346         The function checks if the specified filename already contains one of
347         the valid extensions of the specified filter. If not the filter default
348         extension is appended to the filename.
349 
350 		@param _rFileName the filename which is checked and extended if necessary.
351 		@param _rFilterDefaultExtension the default extension of the used filter.
352 		@param _rFilterExtensions a list of one or more valid filter extensions
353                of the used filter.
354 
355      */
356     static void                 appendDefaultExtension(
357                                         String& _rFileName,
358                                         const String& _rFilterDefaultExtension,
359                                         const String& _rFilterExtensions);
360 };
361 
362 //***************************************************************************
363 
SetPath(const String & rNewURL)364 inline void SvtFileDialog::SetPath( const String& rNewURL )
365 {
366 	_aPath = rNewURL;
367 }
368 
369 //***************************************************************************
370 
SetHasFilename(bool bHasFilename)371 inline void SvtFileDialog::SetHasFilename( bool bHasFilename )
372 {
373 	m_bHasFilename = bHasFilename;
374 }
375 
376 //***************************************************************************
377 
GetPath() const378 inline const String& SvtFileDialog::GetPath() const
379 {
380 	return _aPath;
381 }
382 
383 //***************************************************************************
384 
SetDefaultExt(const String & rExt)385 inline void SvtFileDialog::SetDefaultExt( const String& rExt )
386 {
387 	_aDefExt = rExt;
388 }
389 
EraseDefaultExt(xub_StrLen _nIndex)390 inline void SvtFileDialog::EraseDefaultExt( xub_StrLen _nIndex )
391 {
392 	_aDefExt.Erase( _nIndex );
393 }
394 
GetDefaultExt() const395 inline const String& SvtFileDialog::GetDefaultExt() const
396 {
397 	return _aDefExt;
398 }
399 
400 //*****************************************************************************
401 
SetOKHdl(const Link & rLink)402 inline void SvtFileDialog::SetOKHdl
403 (
404 	const Link& rLink
405 )
406 {
407 	_aOKHdl = rLink;
408 }
409 
410 //*****************************************************************************
411 
GetOKHdl() const412 inline const Link& SvtFileDialog::GetOKHdl() const
413 {
414 	return _aOKHdl;
415 }
416 
417 //*****************************************************************************
418 
SetFileSelectHdl(const Link & rLink)419 inline void SvtFileDialog::SetFileSelectHdl
420 (
421 	const Link& rLink
422 )
423 {
424 	_aFileSelectHdl = rLink;
425 }
426 
427 //*****************************************************************************
428 
GetFileSelectHdl() const429 inline const Link& SvtFileDialog::GetFileSelectHdl() const
430 {
431 	return _aFileSelectHdl;
432 }
433 
434 //*****************************************************************************
435 
SetFilterSelectHdl(const Link & rLink)436 inline void SvtFileDialog::SetFilterSelectHdl
437 (
438 	const Link& rLink
439 )
440 {
441 	_aFilterSelectHdl = rLink;
442 }
443 
444 //*****************************************************************************
445 
GetFilterSelectHdl() const446 inline const Link& SvtFileDialog::GetFilterSelectHdl() const
447 {
448 	return _aFilterSelectHdl;
449 }
450 
451 //*****************************************************************************
452 
GetView() const453 inline SvtFileView* SvtFileDialog::GetView() const
454 {
455 	return _pFileView;
456 }
457 
458 //*****************************************************************************
459 //*****************************************************************************
460 //*****************************************************************************
461 
462 class SvtFilePicker;
463 
464 #define FILE_SELECTION_CHANGED	1
465 #define DIRECTORY_CHANGED		2
466 #define HELP_REQUESTED			3
467 #define CTRL_STATE_CHANGED		4
468 #define DIALOG_SIZE_CHANGED		5
469 
470 
471 #endif // #ifndef _IODLG_HXX
472