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 _SFX_FILEDLGIMPL_HXX
24 #define _SFX_FILEDLGIMPL_HXX
25 
26 #include <vcl/timer.hxx>
27 #include <vcl/graph.hxx>
28 #include <cppuhelper/implbase2.hxx>
29 #include <com/sun/star/beans/StringPair.hpp>
30 #include <com/sun/star/container/XNameAccess.hpp>
31 #include <com/sun/star/ui/dialogs/XFilePicker.hpp>
32 #include <com/sun/star/ui/dialogs/XFilePickerListener.hpp>
33 #include <com/sun/star/ui/dialogs/XDialogClosedListener.hpp>
34 #include <sfx2/fcontnr.hxx>
35 
36 #define _SVSTDARR_STRINGSDTOR
37 #include <svl/svstdarr.hxx>
38 
39 #include <sfx2/filedlghelper.hxx>
40 #include <comphelper/sequenceasvector.hxx>
41 
42 class SfxFilterMatcher;
43 class GraphicFilter;
44 class FileDialogHelper;
45 
46 namespace sfx2
47 {
48     typedef ::com::sun::star::beans::StringPair FilterPair;
49 
50     class FileDialogHelper_Impl :
51         public ::cppu::WeakImplHelper2<
52             ::com::sun::star::ui::dialogs::XFilePickerListener,
53             ::com::sun::star::ui::dialogs::XDialogClosedListener >
54 	{
55 		friend class FileDialogHelper;
56 
57 		::com::sun::star::uno::Reference < ::com::sun::star::ui::dialogs::XFilePicker >	mxFileDlg;
58 		::com::sun::star::uno::Reference < ::com::sun::star::container::XNameAccess >	mxFilterCFG;
59 
60 		std::vector< FilterPair >	maFilters;
61 
62 		SfxFilterMatcher*			mpMatcher;
63 		GraphicFilter*				mpGraphicFilter;
64 		FileDialogHelper*			mpAntiImpl;
65 		Window*						mpPreferredParentWindow;
66 
67         ::comphelper::SequenceAsVector< ::rtl::OUString > mlLastURLs;
68 
69 		::rtl::OUString				maPath;
70 		::rtl::OUString				maFileName;
71 		::rtl::OUString				maCurFilter;
72 		::rtl::OUString				maSelectFilter;
73 		::rtl::OUString				maButtonLabel;
74 
75 		Timer						maPreViewTimer;
76 		Graphic 					maGraphic;
77 
78 		const short 				m_nDialogType;
79 
80 		SfxFilterFlags				m_nMustFlags;
81 		SfxFilterFlags				m_nDontFlags;
82 
83 		sal_uIntPtr						mnPostUserEventId;
84 
85 		ErrCode 					mnError;
86 
87 		FileDialogHelper::Context	meContext;
88 
89 		sal_Bool					mbHasPassword			: 1;
90 		sal_Bool					mbIsPwdEnabled			: 1;
91 		sal_Bool					m_bHaveFilterOptions	: 1;
92 		sal_Bool					mbHasVersions			: 1;
93 		sal_Bool					mbHasAutoExt			: 1;
94 		sal_Bool					mbHasLink				: 1;
95 		sal_Bool					mbHasPreview			: 1;
96 		sal_Bool					mbShowPreview			: 1;
97 		sal_Bool					mbIsSaveDlg 			: 1;
98 		sal_Bool					mbExport	 			: 1;
99 
100 		sal_Bool					mbDeleteMatcher 		: 1;
101 		sal_Bool					mbInsert				: 1;
102 		sal_Bool					mbSystemPicker			: 1;
103 		sal_Bool					mbPwdCheckBoxState		: 1;
104 		sal_Bool					mbSelection				: 1;
105 		sal_Bool					mbSelectionEnabled   	: 1;
106 		sal_Bool                    mbHasSelectionBox       : 1;
107 		sal_Bool                    mbSelectionFltrEnabled  : 1;
108 
109 	private:
110 		void					addFilters( sal_Int64 nFlags,
111 											const String& rFactory,
112 											SfxFilterFlags nMust,
113 											SfxFilterFlags nDont );
114 		void					addFilter( const ::rtl::OUString& rFilterName,
115 										   const ::rtl::OUString& rExtension );
116 		void					addGraphicFilter();
117 		void					enablePasswordBox( sal_Bool bInit );
118 		void					updateFilterOptionsBox();
119 		void					updateExportButton();
120 		void					updateSelectionBox();
121 		void					updateVersions();
122 		void					updatePreviewState( sal_Bool _bUpdatePreviewWindow = sal_True );
123 		void					dispose();
124 
125 		void					loadConfig();
126 		void					saveConfig();
127 
128 		const SfxFilter*		getCurentSfxFilter();
129 		sal_Bool				updateExtendedControl( sal_Int16 _nExtendedControlId, sal_Bool _bEnable );
130 
131 		ErrCode 				getGraphic( const ::rtl::OUString& rURL, Graphic& rGraphic ) const;
132 		void					setDefaultValues();
133 
134 		void					preExecute();
135 		void					postExecute( sal_Int16 _nResult );
136         sal_Int16               implDoExecute();
137         void                    implStartExecute();
138 
139 		void					correctVirtualDialogType();
140 
141 		void					setControlHelpIds( const sal_Int16* _pControlId, const char** _pHelpId );
142 
143 		sal_Bool 				CheckFilterOptionsCapability( const SfxFilter* _pFilter );
144 
145 		sal_Bool				isInOpenMode() const;
146 		String					getCurrentFilterUIName() const;
147 
148 		void					LoadLastUsedFilter( const ::rtl::OUString& _rContextIdentifier );
149 		void					SaveLastUsedFilter( const ::rtl::OUString& _rContextIdentifier );
150 		void					SaveLastUsedFilter( void );
151 
152 		void					implInitializeFileName( );
153 
154         void                    implGetAndCacheFiles( const ::com::sun::star::uno::Reference< XInterface >& xPicker  ,
155                                                             SvStringsDtor*&               rpURLList,
156                                                       const SfxFilter*                    pFilter  );
157         String                  implEnsureURLExtension(const String& sURL      ,
158                                                        const String& sExtension);
159 
160 		DECL_LINK( TimeOutHdl_Impl, Timer* );
161 		DECL_LINK( HandleEvent, FileDialogHelper* );
162         DECL_LINK( InitControls, void* );
163 
164 	public:
165 		// XFilePickerListener methods
166 		virtual void SAL_CALL				fileSelectionChanged( const ::com::sun::star::ui::dialogs::FilePickerEvent& aEvent ) throw( ::com::sun::star::uno::RuntimeException );
167 		virtual void SAL_CALL				directoryChanged( const ::com::sun::star::ui::dialogs::FilePickerEvent& aEvent ) throw( ::com::sun::star::uno::RuntimeException );
168 		virtual ::rtl::OUString SAL_CALL	helpRequested( const ::com::sun::star::ui::dialogs::FilePickerEvent& aEvent ) throw( ::com::sun::star::uno::RuntimeException );
169 		virtual void SAL_CALL				controlStateChanged( const ::com::sun::star::ui::dialogs::FilePickerEvent& aEvent ) throw( ::com::sun::star::uno::RuntimeException );
170 		virtual void SAL_CALL				dialogSizeChanged() throw( ::com::sun::star::uno::RuntimeException );
171 
172         // XDialogClosedListener methods
173         virtual void SAL_CALL               dialogClosed( const ::com::sun::star::ui::dialogs::DialogClosedEvent& _rEvent ) throw (::com::sun::star::uno::RuntimeException);
174 
175         // XEventListener methods
176 		virtual void SAL_CALL		disposing( const ::com::sun::star::lang::EventObject& Source ) throw( ::com::sun::star::uno::RuntimeException );
177 
178 		// handle XFilePickerListener events
179 		void					handleFileSelectionChanged( const ::com::sun::star::ui::dialogs::FilePickerEvent& aEvent );
180 		void					handleDirectoryChanged( const ::com::sun::star::ui::dialogs::FilePickerEvent& aEvent );
181 		::rtl::OUString			handleHelpRequested( const ::com::sun::star::ui::dialogs::FilePickerEvent& aEvent );
182 		void					handleControlStateChanged( const ::com::sun::star::ui::dialogs::FilePickerEvent& aEvent );
183 		void					handleDialogSizeChanged();
184 
185         // Own methods
186 								FileDialogHelper_Impl(
187 									FileDialogHelper* _pAntiImpl,
188 									const short nDialogType,
189 									sal_Int64 nFlags,
190 									sal_Int16 nDialog = SFX2_IMPL_DIALOG_CONFIG,
191 									Window* _pPreferredParentWindow = NULL,
192 									const String& sStandardDir = String::CreateFromAscii( "" ),
193 									const ::com::sun::star::uno::Sequence< ::rtl::OUString >&	rBlackList = ::com::sun::star::uno::Sequence< ::rtl::OUString >()
194 								);
195 		virtual					~FileDialogHelper_Impl();
196 
197 		ErrCode 				execute( SvStringsDtor*& rpURLList,
198 										 SfxItemSet *&	 rpSet,
199 										 String&		 rFilter );
200 		ErrCode 				execute();
201 
202 		void					setFilter( const ::rtl::OUString& rFilter );
203 
204 		/** sets the directory which should be browsed
205 
206 			<p>If the given path does not point to a valid (existent and accessible) folder, the request
207 			is silently dropped</p>
208 		*/
209 		void					displayFolder( const ::rtl::OUString& rPath );
210 		void					setFileName( const ::rtl::OUString& _rFile );
211 
212 		::rtl::OUString			getPath() const;
213 		::rtl::OUString			getFilter() const;
214 		void					getRealFilter( String& _rFilter ) const;
215 
216 		ErrCode 				getGraphic( Graphic& rGraphic ) const;
217 		void 					createMatcher( const String& rFactory );
218 
219 		sal_Bool				isShowFilterExtensionEnabled() const;
220 		void					addFilterPair( const ::rtl::OUString& rFilter,
221 											   const ::rtl::OUString& rFilterWithExtension );
222 		::rtl::OUString			getFilterName( const ::rtl::OUString& rFilterWithExtension ) const;
223 		::rtl::OUString			getFilterWithExtension( const ::rtl::OUString& rFilter ) const;
224 
225 		void					SetContext( FileDialogHelper::Context _eNewContext );
226 
isSystemFilePicker() const227         inline sal_Bool         isSystemFilePicker() const { return mbSystemPicker; }
isPasswordEnabled() const228         inline sal_Bool         isPasswordEnabled() const { return mbIsPwdEnabled; }
229 	};
230 
231 }	// end of namespace sfx2
232 
233 #endif // _SFX_FILEDLGIMPL_HXX
234 
235