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 _IODLGIMP_HXX
24 #define _IODLGIMP_HXX
25 
26 #include <tools/string.hxx>
27 #include <vcl/fixed.hxx>
28 #include <vcl/lstbox.hxx>
29 #include <vcl/menubtn.hxx>
30 #include <vcl/timer.hxx>
31 #include <vcl/group.hxx>
32 
33 #include "svl/svarray.hxx"
34 
35 #include <vector>
36 
37 //*****************************************************************************
38 
39 class Accelerator;
40 class CheckBox;
41 class SvtFileDialog;
42 class SvStringsDtor;
43 class SvUShorts;
44 
45 //*****************************************************************************
46 
47 #define FILEDIALOG_DEF_EXTSEP		';'
48 #define FILEDIALOG_DEF_WILDCARD		'*'
49 #define FILEDIALOG_DEF_IMAGEBORDER	10
50 #define FILEDIALOG_DEF_TIMEOUT		250
51 
52 //*****************************************************************************
53 // SvtFileDialogFilter_Impl
54 //*****************************************************************************
55 
56 /*	[Beschreibung]
57 
58 	Instanzen dieser Klasse repr"asentieren einen Filter
59 */
60 
61 class SvtFileDialogFilter_Impl
62 {
63 private:
64 	String	m_aName;	// name of the entry
65 	String	m_aType;	// filter wildcard - if empty, the entry marks a group
66 
67 public:
68 	SvtFileDialogFilter_Impl( const String& rName, const String& rType );
69 	~SvtFileDialogFilter_Impl();
70 
GetName() const71 	const String&		GetName() const		{ return m_aName; }
GetType() const72 	const String&		GetType() const		{ return m_aType; }
GetExtension() const73     const String        GetExtension() const    { return m_aType.Copy( 2 ); }
74 
isGroupSeparator() const75 	sal_Bool			isGroupSeparator() const	{ return 0 == m_aType.Len(); }
76 };
77 
78 //*****************************************************************************
79 // SvtFileDialogFilterList_Impl
80 //*****************************************************************************
81 
82 SV_DECL_PTRARR_DEL( SvtFileDialogFilterList_Impl, SvtFileDialogFilter_Impl*, 3, 3 )
83 
84 //*****************************************************************************
85 // SvtFileDlgMode
86 //*****************************************************************************
87 
88 enum SvtFileDlgMode
89 {
90 	FILEDLG_MODE_OPEN = 0,
91 	FILEDLG_MODE_SAVE = 1
92 };
93 
94 //*****************************************************************************
95 // SvtFileDlgType
96 //*****************************************************************************
97 
98 enum SvtFileDlgType
99 {
100 	FILEDLG_TYPE_FILEDLG = 0,
101 	FILEDLG_TYPE_PATHDLG
102 };
103 
104 //*****************************************************************************
105 // SvtFileDialogURLSelector
106 //*****************************************************************************
107 class SvtFileDialogURLSelector : public MenuButton
108 {
109 private:
110 	SvtFileDialog*	    m_pParent;
111 	PopupMenu*			m_pMenu;
112 
113 protected:
GetDialogParent()114     inline        SvtFileDialog*  GetDialogParent()       { return m_pParent; }
115 
116 protected:
117 	        void    OpenURL( const String& rURL );
118 
119     virtual void    FillURLMenu( PopupMenu* _pMenu ) = 0;
120 
121 protected:
122 	SvtFileDialogURLSelector( SvtFileDialog* _pParent, const ResId& _rResId, sal_uInt16 _nButtonId );
123     ~SvtFileDialogURLSelector();
124 
125     virtual void		Activate();
126 };
127 
128 //*****************************************************************************
129 // SvtUpButton_Impl
130 //*****************************************************************************
131 
132 class SvtUpButton_Impl : public SvtFileDialogURLSelector
133 {
134 private:
135 	SvStringsDtor*		_pURLs;
136 
137 public:
138 	SvtUpButton_Impl( SvtFileDialog* pParent, const ResId& rResId );
139 	~SvtUpButton_Impl();
140 
141 protected:
142 	virtual void		FillURLMenu( PopupMenu* _pMenu );
143 	virtual void		Select();
144 	virtual void		Click();
145 };
146 
147 //*****************************************************************************
148 // SvtTravelButton_Impl
149 //*****************************************************************************
150 
151 class SvtTravelButton_Impl : public SvtFileDialogURLSelector
152 {
153 private:
154     ::std::vector< String > m_aFavourites;
155 
156 public:
157 	SvtTravelButton_Impl( SvtFileDialog* pParent, const ResId& rResId );
158 	~SvtTravelButton_Impl();
159 
160             void            SetFavouriteLocations( const ::std::vector< String >& _rLocations );
161 
162 protected:
163 	virtual void		FillURLMenu( PopupMenu* _pMenu );
164 	virtual void		Select();
165 	virtual void		Click();
166 };
167 
168 //*****************************************************************************
169 // SvtFileDlgState
170 //*****************************************************************************
171 
172 typedef sal_uInt8 SvtFileDlgState;
173 
174 #define FILEDLG_STATE_NONE        ((SvtFileDlgState)0x00)
175 #define FILEDLG_STATE_REMOTE      ((SvtFileDlgState)0x01)
176 
177 //*****************************************************************************
178 // SvtExpFileDlg_Impl
179 //*****************************************************************************
180 class SvtURLBox;
181 class SvtExpFileDlg_Impl
182 {
183 private:
184 	DECL_STATIC_LINK( SvtExpFileDlg_Impl, UnClickHdl, Button* );
185 
186 private:
187 	ListBox*						_pLbFilter;
188 
189 	const SvtFileDialogFilter_Impl*	_pCurFilter;
190 	String							m_sCurrentFilterDisplayName;	// may differ from _pCurFilter->GetName in case it is a cached entry
191 
192 	::com::sun::star::uno::Sequence< ::rtl::OUString > _aBlackList;
193 
194 public:
195 	SvtFileDialogFilterList_Impl*	_pFilter;
196 	SvtFileDialogFilter_Impl*		_pUserFilter;
197 
198 	FixedText*						_pFtFileName;
199 	SvtURLBox*						_pEdFileName;
200 
201 	FixedText*						_pFtFileVersion;
202 	ListBox*						_pLbFileVersion;
203 
204 	FixedText*						_pFtTemplates;
205 	ListBox*						_pLbTemplates;
206 
207 	FixedText*						_pFtImageTemplates;
208 	ListBox*						_pLbImageTemplates;
209 
210 	FixedText*						_pFtFileType;
211 	PushButton*						_pBtnFileOpen;
212 	PushButton*						_pBtnCancel;
213 	HelpButton*						_pBtnHelp;
214 	SvtUpButton_Impl*				_pBtnUp;
215 	ImageButton*					_pBtnNewFolder;
216 	SvtTravelButton_Impl*			_pBtnStandard;
217 	CheckBox*						_pCbPassword;
218 	FixedText*          			_pFtCurrentPath;
219 	CheckBox*						_pCbAutoExtension;
220 	CheckBox*						_pCbOptions;
221 
222 	SvtFileDlgMode					_eMode;
223 	SvtFileDlgType					_eDlgType;
224 	SvtFileDlgState					_nState;
225 	WinBits							_nStyle;
226 
227 	String							_aStdDir;
228 
229 	// beim traveln der Filterbox erst Zeitversetzt filtern
230 	Timer							_aFilterTimer;
231 
232 	// Zeigt der OpenHdl_Imp(), ob das Open durch einen Doppelclick ausgel"ost wurde
233 	sal_Bool						_bDoubleClick;
234 	sal_Bool						m_bNeedDelayedFilterExecute;
235 
236 	// Liste mit den 5 zuletzt genutzten Filtern
237 	// Defaultfilter fuer <Alle> oder <Alle ...>
238 	const SvtFileDialogFilter_Impl*	_pDefaultFilter;
239 
240 	// Multiselektion?
241 	sal_Bool						_bMultiSelection;
242 
243 	// Fixgr"ossen f"ur Resize merken
244 	long                			_nFixDeltaHeight;
245 	Size				        	_a6Size;
246 	Size							_aDlgSize;
247 	String					       	_aIniKey;
248 
249 	sal_Bool						_bFolderHasOpened;
250 
251 							SvtExpFileDlg_Impl( WinBits nBits );
252 							~SvtExpFileDlg_Impl();
253 
254 
SetBlackList(const::com::sun::star::uno::Sequence<::rtl::OUString> & rBlackList)255 	inline void			    SetBlackList( const ::com::sun::star::uno::Sequence< ::rtl::OUString >& rBlackList ) { _aBlackList = rBlackList; }
GetBlackList() const256 	inline const ::com::sun::star::uno::Sequence< ::rtl::OUString >& GetBlackList() const { return _aBlackList; }
257 	void					SetStandardDir( const String& _rDir );
GetStandardDir() const258 	inline const String&	GetStandardDir() const			{ return _aStdDir; }
DisableFilterBoxAutoWidth()259 	inline void				DisableFilterBoxAutoWidth() 	{ _pLbFilter->EnableDDAutoWidth( sal_False ); }
260 
261 	// ------------------------------------------
262 	// access to the filter listbox only as Control* - we want to maintain the entries/userdata ourself
GetFilterListControl()263 			Control*		GetFilterListControl()			{ return _pLbFilter; }
GetFilterListControl() const264 			const Control*	GetFilterListControl() const	{ return _pLbFilter; }
265 			void			CreateFilterListControl( Window* _pParent, const ResId& _rId );
266 	inline	void			SetFilterListSelectHdl( const Link& _rHandler );
267 
268 	// inits the listbox for the filters from the filter list (_pFilter)
269 			void			ClearFilterList( );
270 			void			InitFilterList( );
271 	inline	sal_Bool		HasFilterListEntry( const String& _rFilterName );
272 	inline	void			SelectFilterListEntry( const String& _rFilterName );
273 	inline	void			SetNoFilterListSelection( );
274 			void			InsertFilterListEntry( const SvtFileDialogFilter_Impl* _pFilterDesc );
275 								// _pFilterDesc must already have been added to _pFilter
276 	inline	SvtFileDialogFilter_Impl*	GetSelectedFilterEntry( String& /* [out] */ _rDisplayName ) const;
277 	inline	sal_Bool		IsFilterListTravelSelect() const;
278 
279 	// ------------------------------------------
280 	// access to the current filter via methods only - need to care for consistency between _pCurFilter and m_sCurrentFilterDisplayName
281 	inline		const SvtFileDialogFilter_Impl*		GetCurFilter( ) const;
282 	inline		const String&						GetCurFilterDisplayName() const;
283 				void								SetCurFilter( SvtFileDialogFilter_Impl* _pFilter, const String& _rDisplayName );
284 	inline		void								SetCurFilter( SvtFileDialogFilter_Impl* _pFilter );
285 };
286 
SetFilterListSelectHdl(const Link & _rHandler)287 inline void SvtExpFileDlg_Impl::SetFilterListSelectHdl( const Link& _rHandler )
288 {
289 	_pLbFilter->SetSelectHdl( _rHandler );
290 }
291 
HasFilterListEntry(const String & _rFilterName)292 inline sal_Bool SvtExpFileDlg_Impl::HasFilterListEntry( const String& _rFilterName )
293 {
294 	return ( LISTBOX_ENTRY_NOTFOUND != _pLbFilter->GetEntryPos( _rFilterName ) );
295 }
296 
SelectFilterListEntry(const String & _rFilterName)297 inline void SvtExpFileDlg_Impl::SelectFilterListEntry( const String& _rFilterName )
298 {
299 	_pLbFilter->SelectEntry( _rFilterName );
300 }
301 
SetNoFilterListSelection()302 inline	void SvtExpFileDlg_Impl::SetNoFilterListSelection( )
303 {
304 	_pLbFilter->SetNoSelection( );
305 }
306 
GetSelectedFilterEntry(String & _rDisplayName) const307 inline SvtFileDialogFilter_Impl* SvtExpFileDlg_Impl::GetSelectedFilterEntry( String& _rDisplayName ) const
308 {
309 	_rDisplayName = _pLbFilter->GetSelectEntry();
310 	return static_cast< SvtFileDialogFilter_Impl* >( _pLbFilter->GetEntryData ( _pLbFilter->GetSelectEntryPos() ) );
311 }
312 
IsFilterListTravelSelect() const313 inline sal_Bool SvtExpFileDlg_Impl::IsFilterListTravelSelect() const
314 {
315 	return _pLbFilter->IsTravelSelect();
316 }
317 
GetCurFilter() const318 inline const SvtFileDialogFilter_Impl* SvtExpFileDlg_Impl::GetCurFilter( ) const
319 {
320 	return _pCurFilter;
321 }
322 
GetCurFilterDisplayName() const323 inline const String& SvtExpFileDlg_Impl::GetCurFilterDisplayName() const
324 {
325 	return m_sCurrentFilterDisplayName;
326 }
327 
SetCurFilter(SvtFileDialogFilter_Impl * pFilter)328 inline	void SvtExpFileDlg_Impl::SetCurFilter( SvtFileDialogFilter_Impl* pFilter )
329 {
330 	SetCurFilter( pFilter, pFilter->GetName() );
331 }
332 
333 #endif // #ifndef _IODLGIMP_HXX
334 
335 
336