xref: /aoo4110/main/fpicker/source/office/iodlg.cxx (revision b1cdbd2c)
1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
23*b1cdbd2cSJim Jagielski #include "precompiled_fpicker.hxx"
24*b1cdbd2cSJim Jagielski 
25*b1cdbd2cSJim Jagielski // includes --------------------------------------------------------------
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include "iodlg.hxx"
28*b1cdbd2cSJim Jagielski #include <tools/stream.hxx>
29*b1cdbd2cSJim Jagielski #include <tools/urlobj.hxx>
30*b1cdbd2cSJim Jagielski #include <vcl/fixed.hxx>
31*b1cdbd2cSJim Jagielski #include <vcl/lstbox.hxx>
32*b1cdbd2cSJim Jagielski #include <vcl/msgbox.hxx>
33*b1cdbd2cSJim Jagielski #include <vcl/svapp.hxx>
34*b1cdbd2cSJim Jagielski #include <vcl/timer.hxx>
35*b1cdbd2cSJim Jagielski #include <unotools/ucbhelper.hxx>
36*b1cdbd2cSJim Jagielski #include <ucbhelper/contentbroker.hxx>
37*b1cdbd2cSJim Jagielski #include "svtools/ehdl.hxx"
38*b1cdbd2cSJim Jagielski #include "svl/urihelper.hxx"
39*b1cdbd2cSJim Jagielski #include "unotools/pathoptions.hxx"
40*b1cdbd2cSJim Jagielski #include "unotools/viewoptions.hxx"
41*b1cdbd2cSJim Jagielski #include "svtools/fileview.hxx"
42*b1cdbd2cSJim Jagielski #include "unotools/inetoptions.hxx"
43*b1cdbd2cSJim Jagielski #include "svtools/sfxecode.hxx"
44*b1cdbd2cSJim Jagielski #include "svl/svarray.hxx"
45*b1cdbd2cSJim Jagielski #include "svtools/svtabbx.hxx"
46*b1cdbd2cSJim Jagielski 
47*b1cdbd2cSJim Jagielski #define _SVSTDARR_USHORTS
48*b1cdbd2cSJim Jagielski #define _SVSTDARR_STRINGSDTOR
49*b1cdbd2cSJim Jagielski #include "svl/svstdarr.hxx"
50*b1cdbd2cSJim Jagielski #include <toolkit/helper/vclunohelper.hxx>
51*b1cdbd2cSJim Jagielski #include <unotools/localfilehelper.hxx>
52*b1cdbd2cSJim Jagielski 
53*b1cdbd2cSJim Jagielski #ifndef _SVTOOLS_HRC
54*b1cdbd2cSJim Jagielski #include "svtools/svtools.hrc"
55*b1cdbd2cSJim Jagielski #endif
56*b1cdbd2cSJim Jagielski #ifndef _SVT_HELPID_HRC
57*b1cdbd2cSJim Jagielski #include "svtools/helpid.hrc"
58*b1cdbd2cSJim Jagielski #endif
59*b1cdbd2cSJim Jagielski #ifndef _SVTOOLS_IODLGIMPL_HRC
60*b1cdbd2cSJim Jagielski #include "iodlg.hrc"
61*b1cdbd2cSJim Jagielski #endif
62*b1cdbd2cSJim Jagielski #include "rtl/instance.hxx"
63*b1cdbd2cSJim Jagielski #include "asyncfilepicker.hxx"
64*b1cdbd2cSJim Jagielski #include "iodlgimp.hxx"
65*b1cdbd2cSJim Jagielski #include "svtools/inettbc.hxx"
66*b1cdbd2cSJim Jagielski #include "unotools/syslocale.hxx"
67*b1cdbd2cSJim Jagielski #include "svtools/QueryFolderName.hxx"
68*b1cdbd2cSJim Jagielski #ifndef  _RTL_USTRING_HXX
69*b1cdbd2cSJim Jagielski #include <rtl/ustring.hxx>
70*b1cdbd2cSJim Jagielski #endif
71*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XMultiServiceFactory.hpp>
72*b1cdbd2cSJim Jagielski #include <com/sun/star/ucb/XContentProviderManager.hpp>
73*b1cdbd2cSJim Jagielski #include <com/sun/star/ui/dialogs/CommonFilePickerElementIds.hpp>
74*b1cdbd2cSJim Jagielski #include <com/sun/star/ui/dialogs/ExtendedFilePickerElementIds.hpp>
75*b1cdbd2cSJim Jagielski #include <com/sun/star/ui/dialogs/ControlActions.hpp>
76*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/PropertyValue.hpp>
77*b1cdbd2cSJim Jagielski #include <com/sun/star/sdbc/XResultSet.hpp>
78*b1cdbd2cSJim Jagielski #include <com/sun/star/sdbc/XRow.hpp>
79*b1cdbd2cSJim Jagielski #include <com/sun/star/util/URL.hpp>
80*b1cdbd2cSJim Jagielski #include <com/sun/star/uno/Exception.hpp>
81*b1cdbd2cSJim Jagielski #include <com/sun/star/uno/Reference.hxx>
82*b1cdbd2cSJim Jagielski #include <com/sun/star/util/XURLTransformer.hpp>
83*b1cdbd2cSJim Jagielski #include <com/sun/star/uno/RuntimeException.hpp>
84*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/XPropertySet.hpp>
85*b1cdbd2cSJim Jagielski 
86*b1cdbd2cSJim Jagielski #ifndef _UNOTOOLS_PROCESSFACTORY_HXX
87*b1cdbd2cSJim Jagielski #include <comphelper/processfactory.hxx>
88*b1cdbd2cSJim Jagielski #endif
89*b1cdbd2cSJim Jagielski #include <osl/file.h>
90*b1cdbd2cSJim Jagielski #include <vcl/waitobj.hxx>
91*b1cdbd2cSJim Jagielski 
92*b1cdbd2cSJim Jagielski // #97148# ------------------------------------
93*b1cdbd2cSJim Jagielski #include <com/sun/star/task/XInteractionHandler.hpp>
94*b1cdbd2cSJim Jagielski #include "com/sun/star/ucb/InteractiveAugmentedIOException.hpp"
95*b1cdbd2cSJim Jagielski #include "fpinteraction.hxx"
96*b1cdbd2cSJim Jagielski #include <osl/process.h>
97*b1cdbd2cSJim Jagielski #include <comphelper/interaction.hxx>
98*b1cdbd2cSJim Jagielski #include <vcl/dibtools.hxx>
99*b1cdbd2cSJim Jagielski 
100*b1cdbd2cSJim Jagielski #include <algorithm>
101*b1cdbd2cSJim Jagielski #include <functional>
102*b1cdbd2cSJim Jagielski 
103*b1cdbd2cSJim Jagielski //#define AUTOSELECT_USERFILTER
104*b1cdbd2cSJim Jagielski 	// define this for the experimental feature of user-filter auto selection
105*b1cdbd2cSJim Jagielski 	// means if the user enters e.g. *.doc<enter>, and there is a filter which is responsible for *.doc files (only),
106*b1cdbd2cSJim Jagielski 	// then this filter is selected automatically
107*b1cdbd2cSJim Jagielski 
108*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::beans;
109*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::frame;
110*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::ui::dialogs;
111*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::uno;
112*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::lang;
113*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::ucb;
114*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::container;
115*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::task;
116*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::sdbc;
117*b1cdbd2cSJim Jagielski using namespace ::utl;
118*b1cdbd2cSJim Jagielski using namespace ::svt;
119*b1cdbd2cSJim Jagielski 
120*b1cdbd2cSJim Jagielski using namespace ExtendedFilePickerElementIds;
121*b1cdbd2cSJim Jagielski using namespace CommonFilePickerElementIds;
122*b1cdbd2cSJim Jagielski using namespace InternalFilePickerElementIds;
123*b1cdbd2cSJim Jagielski 
124*b1cdbd2cSJim Jagielski #define IODLG_CONFIGNAME		String(RTL_CONSTASCII_USTRINGPARAM("FileDialog"))
125*b1cdbd2cSJim Jagielski #define IMPGRF_CONFIGNAME		String(RTL_CONSTASCII_USTRINGPARAM("ImportGraphicDialog"))
126*b1cdbd2cSJim Jagielski 
127*b1cdbd2cSJim Jagielski #define GET_DECODED_NAME(aObj) \
128*b1cdbd2cSJim Jagielski 	aObj.getName( INetURLObject::LAST_SEGMENT, true, INetURLObject::DECODE_WITH_CHARSET )
129*b1cdbd2cSJim Jagielski 
130*b1cdbd2cSJim Jagielski // Zeit die beim Traveln in der Filterbox gewartet wird,
131*b1cdbd2cSJim Jagielski // bis in der Browsebox gefiltert wird ( in ms ).
132*b1cdbd2cSJim Jagielski #define TRAVELFILTER_TIMEOUT	750
133*b1cdbd2cSJim Jagielski 
134*b1cdbd2cSJim Jagielski #define WIDTH_ADDITION	15
135*b1cdbd2cSJim Jagielski 
136*b1cdbd2cSJim Jagielski // functions -------------------------------------------------------------
137*b1cdbd2cSJim Jagielski 
138*b1cdbd2cSJim Jagielski namespace
139*b1cdbd2cSJim Jagielski {
140*b1cdbd2cSJim Jagielski 
141*b1cdbd2cSJim Jagielski 	//-----------------------------------------------------------------------------
getMostCurrentFilter(SvtExpFileDlg_Impl * pImpl)142*b1cdbd2cSJim Jagielski 	String getMostCurrentFilter( SvtExpFileDlg_Impl* pImpl )
143*b1cdbd2cSJim Jagielski 	{
144*b1cdbd2cSJim Jagielski 		DBG_ASSERT( pImpl, "invalid impl pointer" );
145*b1cdbd2cSJim Jagielski 		const SvtFileDialogFilter_Impl* pFilter = pImpl->_pUserFilter;
146*b1cdbd2cSJim Jagielski 
147*b1cdbd2cSJim Jagielski 		if ( !pFilter )
148*b1cdbd2cSJim Jagielski 			pFilter = pImpl->GetCurFilter();
149*b1cdbd2cSJim Jagielski 
150*b1cdbd2cSJim Jagielski 		// Filtern.
151*b1cdbd2cSJim Jagielski 		if ( !pFilter )
152*b1cdbd2cSJim Jagielski 			return String();
153*b1cdbd2cSJim Jagielski 
154*b1cdbd2cSJim Jagielski 		return pFilter->GetType();
155*b1cdbd2cSJim Jagielski 	}
156*b1cdbd2cSJim Jagielski 
157*b1cdbd2cSJim Jagielski 	//-----------------------------------------------------------------------------
restoreCurrentFilter(SvtExpFileDlg_Impl * _pImpl)158*b1cdbd2cSJim Jagielski 	sal_Bool restoreCurrentFilter( SvtExpFileDlg_Impl* _pImpl )
159*b1cdbd2cSJim Jagielski 	{
160*b1cdbd2cSJim Jagielski 		DBG_ASSERT( _pImpl->GetCurFilter(), "restoreCurrentFilter: no current filter!" );
161*b1cdbd2cSJim Jagielski 		DBG_ASSERT( _pImpl->GetCurFilterDisplayName().Len(), "restoreCurrentFilter: no current filter (no display name)!" );
162*b1cdbd2cSJim Jagielski 
163*b1cdbd2cSJim Jagielski 		_pImpl->SelectFilterListEntry( _pImpl->GetCurFilterDisplayName() );
164*b1cdbd2cSJim Jagielski 
165*b1cdbd2cSJim Jagielski #ifdef DBG_UTIL
166*b1cdbd2cSJim Jagielski 		String sSelectedDisplayName;
167*b1cdbd2cSJim Jagielski 		DBG_ASSERT(	( _pImpl->GetSelectedFilterEntry( sSelectedDisplayName ) == _pImpl->GetCurFilter() )
168*b1cdbd2cSJim Jagielski 				&&	( sSelectedDisplayName == _pImpl->GetCurFilterDisplayName() ),
169*b1cdbd2cSJim Jagielski 			"restoreCurrentFilter: inconsistence!" );
170*b1cdbd2cSJim Jagielski #endif
171*b1cdbd2cSJim Jagielski 		return _pImpl->m_bNeedDelayedFilterExecute;
172*b1cdbd2cSJim Jagielski 	}
173*b1cdbd2cSJim Jagielski 
174*b1cdbd2cSJim Jagielski 	//-----------------------------------------------------------------------------
GetFsysExtension_Impl(const String & rFile,const String & rLastFilterExt)175*b1cdbd2cSJim Jagielski     String GetFsysExtension_Impl( const String& rFile, const String& rLastFilterExt )
176*b1cdbd2cSJim Jagielski 	{
177*b1cdbd2cSJim Jagielski         xub_StrLen nDotPos = rFile.SearchBackward( '.' );
178*b1cdbd2cSJim Jagielski         if ( nDotPos != STRING_NOTFOUND )
179*b1cdbd2cSJim Jagielski         {
180*b1cdbd2cSJim Jagielski             if ( rLastFilterExt.Len() )
181*b1cdbd2cSJim Jagielski             {
182*b1cdbd2cSJim Jagielski                 if ( rFile.Copy( nDotPos + 1 ).EqualsIgnoreCaseAscii( rLastFilterExt ) )
183*b1cdbd2cSJim Jagielski                     return String( rLastFilterExt );
184*b1cdbd2cSJim Jagielski             }
185*b1cdbd2cSJim Jagielski             else
186*b1cdbd2cSJim Jagielski                 return String( rFile.Copy( nDotPos ) );
187*b1cdbd2cSJim Jagielski         }
188*b1cdbd2cSJim Jagielski 		return String();
189*b1cdbd2cSJim Jagielski 	}
190*b1cdbd2cSJim Jagielski 
191*b1cdbd2cSJim Jagielski 	//-----------------------------------------------------------------------------
SetFsysExtension_Impl(String & rFile,const String & rExtension)192*b1cdbd2cSJim Jagielski 	void SetFsysExtension_Impl( String& rFile, const String& rExtension )
193*b1cdbd2cSJim Jagielski 	{
194*b1cdbd2cSJim Jagielski 		const sal_Unicode* p0 = rFile.GetBuffer();
195*b1cdbd2cSJim Jagielski 		const sal_Unicode* p1 = p0 + rFile.Len() - 1;
196*b1cdbd2cSJim Jagielski 		while ( p1 >= p0 && *p1 != sal_Unicode( '.' ) )
197*b1cdbd2cSJim Jagielski 			p1--;
198*b1cdbd2cSJim Jagielski 		if ( p1 >= p0 )
199*b1cdbd2cSJim Jagielski 			// remove old extension
200*b1cdbd2cSJim Jagielski 			rFile.Erase(
201*b1cdbd2cSJim Jagielski                 sal::static_int_cast< xub_StrLen >(
202*b1cdbd2cSJim Jagielski                     p1 - p0 + 1 - ( rExtension.Len() > 0 ? 0 : 1 ) ) );
203*b1cdbd2cSJim Jagielski 		else if ( rExtension.Len() )
204*b1cdbd2cSJim Jagielski 			// no old extension
205*b1cdbd2cSJim Jagielski 			rFile += sal_Unicode( '.' );
206*b1cdbd2cSJim Jagielski 		rFile += rExtension;
207*b1cdbd2cSJim Jagielski 	}
208*b1cdbd2cSJim Jagielski 
209*b1cdbd2cSJim Jagielski 	//-----------------------------------------------------------------------------
210*b1cdbd2cSJim Jagielski 	// move the control with the given offset
lcl_MoveControl(Control * _pControl,sal_Int32 _nDeltaX,sal_Int32 _nDeltaY,sal_Int32 * _pMaxY=NULL)211*b1cdbd2cSJim Jagielski 	void lcl_MoveControl( Control* _pControl, sal_Int32 _nDeltaX, sal_Int32 _nDeltaY, sal_Int32* _pMaxY = NULL )
212*b1cdbd2cSJim Jagielski 	{
213*b1cdbd2cSJim Jagielski 		if ( _pControl )
214*b1cdbd2cSJim Jagielski 		{
215*b1cdbd2cSJim Jagielski 			Point aNewPos = _pControl->GetPosPixel();
216*b1cdbd2cSJim Jagielski 
217*b1cdbd2cSJim Jagielski 			// adjust the vertical position
218*b1cdbd2cSJim Jagielski 			aNewPos.Y() += _nDeltaY;
219*b1cdbd2cSJim Jagielski 			if ( _pMaxY && ( aNewPos.Y() > *_pMaxY ) )
220*b1cdbd2cSJim Jagielski 				*_pMaxY = aNewPos.Y();
221*b1cdbd2cSJim Jagielski 
222*b1cdbd2cSJim Jagielski 			// adjust the horizontal position
223*b1cdbd2cSJim Jagielski 			aNewPos.X() += _nDeltaX;
224*b1cdbd2cSJim Jagielski 
225*b1cdbd2cSJim Jagielski 			_pControl->SetPosPixel( aNewPos );
226*b1cdbd2cSJim Jagielski 		}
227*b1cdbd2cSJim Jagielski 	}
228*b1cdbd2cSJim Jagielski 
229*b1cdbd2cSJim Jagielski     //-------------------------------------------------------------------------
lcl_autoUpdateFileExtension(SvtFileDialog * _pDialog,const String & _rLastFilterExt)230*b1cdbd2cSJim Jagielski     void lcl_autoUpdateFileExtension( SvtFileDialog* _pDialog, const String& _rLastFilterExt )
231*b1cdbd2cSJim Jagielski 	{
232*b1cdbd2cSJim Jagielski 		// if auto extension is enabled ....
233*b1cdbd2cSJim Jagielski 		if ( _pDialog->isAutoExtensionEnabled() )
234*b1cdbd2cSJim Jagielski 		{
235*b1cdbd2cSJim Jagielski 			// automatically switch to the extension of the (maybe just newly selected) extension
236*b1cdbd2cSJim Jagielski 			String aNewFile = _pDialog->getCurrentFileText( );
237*b1cdbd2cSJim Jagielski             String aExt = GetFsysExtension_Impl( aNewFile, _rLastFilterExt );
238*b1cdbd2cSJim Jagielski 
239*b1cdbd2cSJim Jagielski 			// but only if there already is an extension
240*b1cdbd2cSJim Jagielski 			if ( aExt.Len() )
241*b1cdbd2cSJim Jagielski 			{
242*b1cdbd2cSJim Jagielski 				// check if it is a real file extension, and not only the "post-dot" part in
243*b1cdbd2cSJim Jagielski 				// a directory name
244*b1cdbd2cSJim Jagielski 				// 28.03.2002 - 98337 - fs@openoffice.org
245*b1cdbd2cSJim Jagielski 				sal_Bool bRealExtensions = sal_True;
246*b1cdbd2cSJim Jagielski 				if ( STRING_NOTFOUND != aExt.Search( '/' ) )
247*b1cdbd2cSJim Jagielski 					bRealExtensions = sal_False;
248*b1cdbd2cSJim Jagielski 				else if ( STRING_NOTFOUND != aExt.Search( '\\' ) )
249*b1cdbd2cSJim Jagielski 					bRealExtensions = sal_False;
250*b1cdbd2cSJim Jagielski 				else
251*b1cdbd2cSJim Jagielski 				{
252*b1cdbd2cSJim Jagielski 					// no easy way to tell, because the part containing the dot already is the last
253*b1cdbd2cSJim Jagielski 					// segment of the complete file name
254*b1cdbd2cSJim Jagielski 					// So we have to check if the file name denotes a folder or a file.
255*b1cdbd2cSJim Jagielski 					// For performance reasons, we do this for file urls only
256*b1cdbd2cSJim Jagielski 					INetURLObject aURL( aNewFile );
257*b1cdbd2cSJim Jagielski 					if ( INET_PROT_NOT_VALID == aURL.GetProtocol() )
258*b1cdbd2cSJim Jagielski 					{
259*b1cdbd2cSJim Jagielski 						String sURL;
260*b1cdbd2cSJim Jagielski 						if ( ::utl::LocalFileHelper::ConvertPhysicalNameToURL( aNewFile, sURL ) )
261*b1cdbd2cSJim Jagielski 							aURL = INetURLObject( sURL );
262*b1cdbd2cSJim Jagielski 					}
263*b1cdbd2cSJim Jagielski 					if ( INET_PROT_FILE == aURL.GetProtocol() )
264*b1cdbd2cSJim Jagielski 					{
265*b1cdbd2cSJim Jagielski 						// #97148# & #102204# -----
266*b1cdbd2cSJim Jagielski 						try
267*b1cdbd2cSJim Jagielski 						{
268*b1cdbd2cSJim Jagielski 							bRealExtensions = !_pDialog->ContentIsFolder( aURL.GetMainURL( INetURLObject::NO_DECODE ) );
269*b1cdbd2cSJim Jagielski 						}
270*b1cdbd2cSJim Jagielski 						catch( ::com::sun::star::uno::Exception& )
271*b1cdbd2cSJim Jagielski 						{
272*b1cdbd2cSJim Jagielski 							DBG_WARNING( "Exception in lcl_autoUpdateFileExtension" );
273*b1cdbd2cSJim Jagielski 						}
274*b1cdbd2cSJim Jagielski 					}
275*b1cdbd2cSJim Jagielski 				}
276*b1cdbd2cSJim Jagielski 
277*b1cdbd2cSJim Jagielski 				if ( bRealExtensions )
278*b1cdbd2cSJim Jagielski 				{
279*b1cdbd2cSJim Jagielski 					SetFsysExtension_Impl( aNewFile, _pDialog->GetDefaultExt() );
280*b1cdbd2cSJim Jagielski 					_pDialog->setCurrentFileText( aNewFile );
281*b1cdbd2cSJim Jagielski 				}
282*b1cdbd2cSJim Jagielski 			}
283*b1cdbd2cSJim Jagielski 		}
284*b1cdbd2cSJim Jagielski 	}
285*b1cdbd2cSJim Jagielski 
286*b1cdbd2cSJim Jagielski 	//-------------------------------------------------------------------------
lcl_getHomeDirectory(const String & _rForURL,String & _rHomeDir)287*b1cdbd2cSJim Jagielski 	sal_Bool lcl_getHomeDirectory( const String& _rForURL, String& /* [out] */ _rHomeDir )
288*b1cdbd2cSJim Jagielski 	{
289*b1cdbd2cSJim Jagielski 		_rHomeDir.Erase();
290*b1cdbd2cSJim Jagielski 
291*b1cdbd2cSJim Jagielski 		// now ask the content broker for a provider for this scheme
292*b1cdbd2cSJim Jagielski         //=================================================================
293*b1cdbd2cSJim Jagielski 		try
294*b1cdbd2cSJim Jagielski 		{
295*b1cdbd2cSJim Jagielski 			// get the content provider manager
296*b1cdbd2cSJim Jagielski 			::ucbhelper::ContentBroker* pBroker = ::ucbhelper::ContentBroker::get();
297*b1cdbd2cSJim Jagielski 			Reference< XContentProviderManager > xProviderManager;
298*b1cdbd2cSJim Jagielski 			if ( pBroker )
299*b1cdbd2cSJim Jagielski 				xProviderManager = pBroker->getContentProviderManagerInterface();
300*b1cdbd2cSJim Jagielski 
301*b1cdbd2cSJim Jagielski             //=================================================================
302*b1cdbd2cSJim Jagielski 			// get the provider for the current scheme
303*b1cdbd2cSJim Jagielski 			Reference< XContentProvider > xProvider;
304*b1cdbd2cSJim Jagielski 			if ( xProviderManager.is() )
305*b1cdbd2cSJim Jagielski 				xProvider = xProviderManager->queryContentProvider( _rForURL );
306*b1cdbd2cSJim Jagielski 
307*b1cdbd2cSJim Jagielski 			DBG_ASSERT( xProvider.is(), "lcl_getHomeDirectory: could not find a (valid) content provider for the current URL!" );
308*b1cdbd2cSJim Jagielski 			Reference< XPropertySet > xProviderProps( xProvider, UNO_QUERY );
309*b1cdbd2cSJim Jagielski 			if ( xProviderProps.is() )
310*b1cdbd2cSJim Jagielski 			{
311*b1cdbd2cSJim Jagielski 				Reference< XPropertySetInfo > xPropInfo = xProviderProps->getPropertySetInfo();
312*b1cdbd2cSJim Jagielski 				const ::rtl::OUString sHomeDirPropertyName( RTL_CONSTASCII_USTRINGPARAM( "HomeDirectory" ) );
313*b1cdbd2cSJim Jagielski 				if ( !xPropInfo.is() || xPropInfo->hasPropertyByName( sHomeDirPropertyName ) )
314*b1cdbd2cSJim Jagielski 				{
315*b1cdbd2cSJim Jagielski 					::rtl::OUString sHomeDirectory;
316*b1cdbd2cSJim Jagielski 					xProviderProps->getPropertyValue( sHomeDirPropertyName ) >>= sHomeDirectory;
317*b1cdbd2cSJim Jagielski 					_rHomeDir = sHomeDirectory;
318*b1cdbd2cSJim Jagielski 				}
319*b1cdbd2cSJim Jagielski 			}
320*b1cdbd2cSJim Jagielski 		}
321*b1cdbd2cSJim Jagielski 		catch( const Exception& )
322*b1cdbd2cSJim Jagielski 		{
323*b1cdbd2cSJim Jagielski 			DBG_ERROR( "lcl_getHomeDirectory: caught an exception!" );
324*b1cdbd2cSJim Jagielski 		}
325*b1cdbd2cSJim Jagielski 		return 0 < _rHomeDir.Len();
326*b1cdbd2cSJim Jagielski 	}
327*b1cdbd2cSJim Jagielski 
328*b1cdbd2cSJim Jagielski     //---------------------------------------------------------------------
lcl_ensureFinalSlash(const String & _rDir)329*b1cdbd2cSJim Jagielski 	static String lcl_ensureFinalSlash( const String& _rDir )
330*b1cdbd2cSJim Jagielski 	{
331*b1cdbd2cSJim Jagielski 		INetURLObject aWorkPathObj( _rDir, INET_PROT_FILE );
332*b1cdbd2cSJim Jagielski 		aWorkPathObj.setFinalSlash();
333*b1cdbd2cSJim Jagielski 		return  aWorkPathObj.GetMainURL( INetURLObject::NO_DECODE );
334*b1cdbd2cSJim Jagielski 	}
335*b1cdbd2cSJim Jagielski 
336*b1cdbd2cSJim Jagielski     //---------------------------------------------------------------------
convertStringListToUrls(const String & _rColonSeparatedList,::std::vector<String> & _rTokens,bool _bFinalSlash)337*b1cdbd2cSJim Jagielski     void    convertStringListToUrls( const String& _rColonSeparatedList, ::std::vector< String >& _rTokens, bool _bFinalSlash )
338*b1cdbd2cSJim Jagielski     {
339*b1cdbd2cSJim Jagielski         const sal_Unicode s_cSeparator =
340*b1cdbd2cSJim Jagielski #if defined(WNT) || defined(OS2)
341*b1cdbd2cSJim Jagielski             ';'
342*b1cdbd2cSJim Jagielski #else
343*b1cdbd2cSJim Jagielski             ':'
344*b1cdbd2cSJim Jagielski #endif
345*b1cdbd2cSJim Jagielski             ;
346*b1cdbd2cSJim Jagielski         xub_StrLen nTokens = _rColonSeparatedList.GetTokenCount( s_cSeparator );
347*b1cdbd2cSJim Jagielski         _rTokens.resize( 0 ); _rTokens.reserve( nTokens );
348*b1cdbd2cSJim Jagielski         for ( xub_StrLen i=0; i<nTokens; ++i )
349*b1cdbd2cSJim Jagielski         {
350*b1cdbd2cSJim Jagielski             // the current token in the list
351*b1cdbd2cSJim Jagielski             String sCurrentToken = _rColonSeparatedList.GetToken( i, s_cSeparator );
352*b1cdbd2cSJim Jagielski             if ( !sCurrentToken.Len() )
353*b1cdbd2cSJim Jagielski                 continue;
354*b1cdbd2cSJim Jagielski 
355*b1cdbd2cSJim Jagielski             INetURLObject aCurrentURL;
356*b1cdbd2cSJim Jagielski 
357*b1cdbd2cSJim Jagielski             String sURL;
358*b1cdbd2cSJim Jagielski             if ( ::utl::LocalFileHelper::ConvertPhysicalNameToURL( sCurrentToken, sURL ) )
359*b1cdbd2cSJim Jagielski                 aCurrentURL = INetURLObject( sURL );
360*b1cdbd2cSJim Jagielski             else
361*b1cdbd2cSJim Jagielski             {
362*b1cdbd2cSJim Jagielski                 // smart URL parsing, assuming FILE protocol
363*b1cdbd2cSJim Jagielski                 aCurrentURL = INetURLObject( sCurrentToken, INET_PROT_FILE );
364*b1cdbd2cSJim Jagielski             }
365*b1cdbd2cSJim Jagielski 
366*b1cdbd2cSJim Jagielski             if ( _bFinalSlash )
367*b1cdbd2cSJim Jagielski                 aCurrentURL.setFinalSlash( );
368*b1cdbd2cSJim Jagielski             else
369*b1cdbd2cSJim Jagielski                 aCurrentURL.removeFinalSlash( );
370*b1cdbd2cSJim Jagielski             _rTokens.push_back( aCurrentURL.GetMainURL( INetURLObject::NO_DECODE ) );
371*b1cdbd2cSJim Jagielski         }
372*b1cdbd2cSJim Jagielski     }
373*b1cdbd2cSJim Jagielski 
374*b1cdbd2cSJim Jagielski     //---------------------------------------------------------------------
375*b1cdbd2cSJim Jagielski     struct RemoveFinalSlash : public ::std::unary_function< String, void >
376*b1cdbd2cSJim Jagielski     {
operator ()__anona945f79d0111::RemoveFinalSlash377*b1cdbd2cSJim Jagielski         void operator()( String& _rURL )
378*b1cdbd2cSJim Jagielski         {
379*b1cdbd2cSJim Jagielski             INetURLObject aURL( _rURL );
380*b1cdbd2cSJim Jagielski #if defined(WNT) || defined(OS2)
381*b1cdbd2cSJim Jagielski             if ( aURL.getSegmentCount() > 1 )
382*b1cdbd2cSJim Jagielski #endif
383*b1cdbd2cSJim Jagielski                 aURL.removeFinalSlash( );
384*b1cdbd2cSJim Jagielski             _rURL = aURL.GetMainURL( INetURLObject::NO_DECODE );
385*b1cdbd2cSJim Jagielski         }
386*b1cdbd2cSJim Jagielski     };
387*b1cdbd2cSJim Jagielski 
388*b1cdbd2cSJim Jagielski     // -----------------------------------------------------------------------
389*b1cdbd2cSJim Jagielski     /** retrieves the value of an environment variable
390*b1cdbd2cSJim Jagielski         @return <TRUE/> if and only if the retrieved string value is not empty
391*b1cdbd2cSJim Jagielski     */
getEnvironmentValue(const sal_Char * _pAsciiEnvName,::rtl::OUString & _rValue)392*b1cdbd2cSJim Jagielski     bool getEnvironmentValue( const sal_Char* _pAsciiEnvName, ::rtl::OUString& _rValue )
393*b1cdbd2cSJim Jagielski     {
394*b1cdbd2cSJim Jagielski         _rValue = ::rtl::OUString();
395*b1cdbd2cSJim Jagielski         ::rtl::OUString sEnvName = ::rtl::OUString::createFromAscii( _pAsciiEnvName );
396*b1cdbd2cSJim Jagielski         osl_getEnvironment( sEnvName.pData, &_rValue.pData );
397*b1cdbd2cSJim Jagielski         return _rValue.getLength() != 0;
398*b1cdbd2cSJim Jagielski     }
399*b1cdbd2cSJim Jagielski }
400*b1cdbd2cSJim Jagielski 
401*b1cdbd2cSJim Jagielski //***************************************************************************
402*b1cdbd2cSJim Jagielski // ControlChain_Impl
403*b1cdbd2cSJim Jagielski //***************************************************************************
404*b1cdbd2cSJim Jagielski 
405*b1cdbd2cSJim Jagielski struct ControlChain_Impl
406*b1cdbd2cSJim Jagielski {
407*b1cdbd2cSJim Jagielski 	Window* 		   _pControl;
408*b1cdbd2cSJim Jagielski 	ControlChain_Impl* _pNext;
409*b1cdbd2cSJim Jagielski 	sal_Bool			   _bHasOwnerShip;
410*b1cdbd2cSJim Jagielski 
411*b1cdbd2cSJim Jagielski 	ControlChain_Impl( Window* pControl, ControlChain_Impl* pNext );
412*b1cdbd2cSJim Jagielski 	~ControlChain_Impl();
413*b1cdbd2cSJim Jagielski };
414*b1cdbd2cSJim Jagielski 
415*b1cdbd2cSJim Jagielski //***************************************************************************
416*b1cdbd2cSJim Jagielski 
ControlChain_Impl(Window * pControl,ControlChain_Impl * pNext)417*b1cdbd2cSJim Jagielski ControlChain_Impl::ControlChain_Impl
418*b1cdbd2cSJim Jagielski (
419*b1cdbd2cSJim Jagielski 	Window* pControl,
420*b1cdbd2cSJim Jagielski 	ControlChain_Impl* pNext
421*b1cdbd2cSJim Jagielski )
422*b1cdbd2cSJim Jagielski 	: _pControl( pControl ),
423*b1cdbd2cSJim Jagielski 	  _pNext( pNext ),
424*b1cdbd2cSJim Jagielski 	  _bHasOwnerShip( sal_True )
425*b1cdbd2cSJim Jagielski {
426*b1cdbd2cSJim Jagielski }
427*b1cdbd2cSJim Jagielski 
428*b1cdbd2cSJim Jagielski //***************************************************************************
429*b1cdbd2cSJim Jagielski 
~ControlChain_Impl()430*b1cdbd2cSJim Jagielski ControlChain_Impl::~ControlChain_Impl()
431*b1cdbd2cSJim Jagielski {
432*b1cdbd2cSJim Jagielski 	if ( _bHasOwnerShip )
433*b1cdbd2cSJim Jagielski 	{
434*b1cdbd2cSJim Jagielski 		delete _pControl;
435*b1cdbd2cSJim Jagielski 	}
436*b1cdbd2cSJim Jagielski 	delete _pNext;
437*b1cdbd2cSJim Jagielski }
438*b1cdbd2cSJim Jagielski 
439*b1cdbd2cSJim Jagielski //*****************************************************************************
440*b1cdbd2cSJim Jagielski // ResMgrHolder
441*b1cdbd2cSJim Jagielski //*****************************************************************************
442*b1cdbd2cSJim Jagielski namespace
443*b1cdbd2cSJim Jagielski {
444*b1cdbd2cSJim Jagielski 	struct ResMgrHolder
445*b1cdbd2cSJim Jagielski 	{
operator ()__anona945f79d0211::ResMgrHolder446*b1cdbd2cSJim Jagielski 		ResMgr * operator ()()
447*b1cdbd2cSJim Jagielski 		{
448*b1cdbd2cSJim Jagielski 			return ResMgr::CreateResMgr (CREATEVERSIONRESMGR_NAME(fps_office));
449*b1cdbd2cSJim Jagielski 		}
450*b1cdbd2cSJim Jagielski 
getOrCreate__anona945f79d0211::ResMgrHolder451*b1cdbd2cSJim Jagielski 		static ResMgr * getOrCreate()
452*b1cdbd2cSJim Jagielski 		{
453*b1cdbd2cSJim Jagielski 			return rtl_Instance<
454*b1cdbd2cSJim Jagielski 				ResMgr, ResMgrHolder,
455*b1cdbd2cSJim Jagielski 				osl::MutexGuard, osl::GetGlobalMutex >::create (
456*b1cdbd2cSJim Jagielski 					ResMgrHolder(), osl::GetGlobalMutex());
457*b1cdbd2cSJim Jagielski 		}
458*b1cdbd2cSJim Jagielski 	};
459*b1cdbd2cSJim Jagielski 
460*b1cdbd2cSJim Jagielski 	struct SvtResId : public ResId
461*b1cdbd2cSJim Jagielski 	{
SvtResId__anona945f79d0211::SvtResId462*b1cdbd2cSJim Jagielski 		SvtResId (sal_uInt16 nId) : ResId (nId, *ResMgrHolder::getOrCreate()) {}
463*b1cdbd2cSJim Jagielski 	};
464*b1cdbd2cSJim Jagielski }
465*b1cdbd2cSJim Jagielski 
466*b1cdbd2cSJim Jagielski //*****************************************************************************
467*b1cdbd2cSJim Jagielski // SvtFileDialog
468*b1cdbd2cSJim Jagielski //*****************************************************************************
SvtFileDialog(Window * _pParent,WinBits nBits,WinBits nExtraBits)469*b1cdbd2cSJim Jagielski SvtFileDialog::SvtFileDialog
470*b1cdbd2cSJim Jagielski (
471*b1cdbd2cSJim Jagielski 	Window* _pParent,
472*b1cdbd2cSJim Jagielski 	WinBits nBits,
473*b1cdbd2cSJim Jagielski 	WinBits nExtraBits
474*b1cdbd2cSJim Jagielski ) :
475*b1cdbd2cSJim Jagielski 	ModalDialog( _pParent, SvtResId( DLG_SVT_EXPLORERFILE ) )
476*b1cdbd2cSJim Jagielski 
477*b1cdbd2cSJim Jagielski     ,_pUserControls( NULL )
478*b1cdbd2cSJim Jagielski     ,_pCbReadOnly( NULL )
479*b1cdbd2cSJim Jagielski 	,_pCbLinkBox( NULL)
480*b1cdbd2cSJim Jagielski     ,_pCbPreviewBox( NULL )
481*b1cdbd2cSJim Jagielski     ,_pCbSelection( NULL )
482*b1cdbd2cSJim Jagielski     ,_pPbPlay( NULL )
483*b1cdbd2cSJim Jagielski     ,_pPrevWin( NULL )
484*b1cdbd2cSJim Jagielski     ,_pPrevBmp( NULL )
485*b1cdbd2cSJim Jagielski     ,_pFileView( NULL )
486*b1cdbd2cSJim Jagielski     ,_pFileNotifier( NULL )
487*b1cdbd2cSJim Jagielski     ,_pImp( new SvtExpFileDlg_Impl( nBits ) )
488*b1cdbd2cSJim Jagielski     ,_nExtraBits( nExtraBits )
489*b1cdbd2cSJim Jagielski     ,_bIsInExecute( sal_False )
490*b1cdbd2cSJim Jagielski     ,m_bInExecuteAsync( false )
491*b1cdbd2cSJim Jagielski 	,m_bHasFilename( false )
492*b1cdbd2cSJim Jagielski {
493*b1cdbd2cSJim Jagielski 	Init_Impl( nBits );
494*b1cdbd2cSJim Jagielski }
495*b1cdbd2cSJim Jagielski 
496*b1cdbd2cSJim Jagielski //*****************************************************************************
497*b1cdbd2cSJim Jagielski 
SvtFileDialog(Window * _pParent,WinBits nBits)498*b1cdbd2cSJim Jagielski SvtFileDialog::SvtFileDialog ( Window* _pParent, WinBits nBits )
499*b1cdbd2cSJim Jagielski     :ModalDialog( _pParent, SvtResId( DLG_SVT_EXPLORERFILE ) )
500*b1cdbd2cSJim Jagielski     ,_pUserControls( NULL )
501*b1cdbd2cSJim Jagielski     ,_pCbReadOnly( NULL )
502*b1cdbd2cSJim Jagielski 	,_pCbLinkBox( NULL)
503*b1cdbd2cSJim Jagielski     ,_pCbPreviewBox( NULL )
504*b1cdbd2cSJim Jagielski     ,_pCbSelection( NULL )
505*b1cdbd2cSJim Jagielski     ,_pPbPlay( NULL )
506*b1cdbd2cSJim Jagielski     ,_pPrevWin( NULL )
507*b1cdbd2cSJim Jagielski     ,_pPrevBmp( NULL )
508*b1cdbd2cSJim Jagielski     ,_pFileView( NULL )
509*b1cdbd2cSJim Jagielski     ,_pFileNotifier( NULL )
510*b1cdbd2cSJim Jagielski     ,_pImp( new SvtExpFileDlg_Impl( nBits ) )
511*b1cdbd2cSJim Jagielski     ,_nExtraBits( 0L )
512*b1cdbd2cSJim Jagielski     ,_bIsInExecute( sal_False )
513*b1cdbd2cSJim Jagielski 	,m_bHasFilename( false )
514*b1cdbd2cSJim Jagielski {
515*b1cdbd2cSJim Jagielski 	Init_Impl( nBits );
516*b1cdbd2cSJim Jagielski }
517*b1cdbd2cSJim Jagielski 
518*b1cdbd2cSJim Jagielski //*****************************************************************************
519*b1cdbd2cSJim Jagielski 
~SvtFileDialog()520*b1cdbd2cSJim Jagielski SvtFileDialog::~SvtFileDialog()
521*b1cdbd2cSJim Jagielski {
522*b1cdbd2cSJim Jagielski 	if ( _pImp->_aIniKey.Len() )
523*b1cdbd2cSJim Jagielski 	{
524*b1cdbd2cSJim Jagielski 		// save window state
525*b1cdbd2cSJim Jagielski 		SvtViewOptions aDlgOpt( E_DIALOG, _pImp->_aIniKey );
526*b1cdbd2cSJim Jagielski         aDlgOpt.SetWindowState( String( GetWindowState(), osl_getThreadTextEncoding() ) );
527*b1cdbd2cSJim Jagielski 		String sUserData = _pFileView->GetConfigString();
528*b1cdbd2cSJim Jagielski 		aDlgOpt.SetUserItem( ::rtl::OUString::createFromAscii( "UserData" ),
529*b1cdbd2cSJim Jagielski 							 makeAny( ::rtl::OUString( sUserData ) ) );
530*b1cdbd2cSJim Jagielski 	}
531*b1cdbd2cSJim Jagielski 
532*b1cdbd2cSJim Jagielski 	_pFileView->SetSelectHdl( Link() );
533*b1cdbd2cSJim Jagielski 
534*b1cdbd2cSJim Jagielski 	delete _pImp;
535*b1cdbd2cSJim Jagielski 	delete _pFileView;
536*b1cdbd2cSJim Jagielski 
537*b1cdbd2cSJim Jagielski 	delete _pCbReadOnly;
538*b1cdbd2cSJim Jagielski 	delete _pCbLinkBox;
539*b1cdbd2cSJim Jagielski     delete _pCbPreviewBox;
540*b1cdbd2cSJim Jagielski     delete _pCbSelection;
541*b1cdbd2cSJim Jagielski     delete _pPbPlay;
542*b1cdbd2cSJim Jagielski     delete _pPrevWin;
543*b1cdbd2cSJim Jagielski     delete _pPrevBmp;
544*b1cdbd2cSJim Jagielski 
545*b1cdbd2cSJim Jagielski 	delete _pUserControls;
546*b1cdbd2cSJim Jagielski }
547*b1cdbd2cSJim Jagielski 
548*b1cdbd2cSJim Jagielski //*****************************************************************************
549*b1cdbd2cSJim Jagielski 
Init_Impl(WinBits nStyle)550*b1cdbd2cSJim Jagielski void SvtFileDialog::Init_Impl
551*b1cdbd2cSJim Jagielski (
552*b1cdbd2cSJim Jagielski 	WinBits nStyle
553*b1cdbd2cSJim Jagielski )
554*b1cdbd2cSJim Jagielski {
555*b1cdbd2cSJim Jagielski 	sal_Bool bIsHighContrast = GetSettings().GetStyleSettings().GetHighContrastMode();
556*b1cdbd2cSJim Jagielski 	m_aImages = ImageList( SvtResId( bIsHighContrast ? RID_FILEPICKER_IMAGES_HC : RID_FILEPICKER_IMAGES ) );
557*b1cdbd2cSJim Jagielski 
558*b1cdbd2cSJim Jagielski 	_pImp->_nStyle = nStyle;
559*b1cdbd2cSJim Jagielski 	_pImp->_a6Size = LogicToPixel( Size( 6, 6 ), MAP_APPFONT );
560*b1cdbd2cSJim Jagielski 	_pImp->_eMode = ( nStyle & WB_SAVEAS ) ? FILEDLG_MODE_SAVE : FILEDLG_MODE_OPEN;
561*b1cdbd2cSJim Jagielski 	_pImp->_eDlgType = FILEDLG_TYPE_FILEDLG;
562*b1cdbd2cSJim Jagielski 
563*b1cdbd2cSJim Jagielski 	if ( ( nStyle & SFXWB_PATHDIALOG ) == SFXWB_PATHDIALOG )
564*b1cdbd2cSJim Jagielski 		_pImp->_eDlgType = FILEDLG_TYPE_PATHDLG;
565*b1cdbd2cSJim Jagielski 
566*b1cdbd2cSJim Jagielski 	// Set the directory for the "back to the default dir" button
567*b1cdbd2cSJim Jagielski 	INetURLObject aStdDirObj( SvtPathOptions().GetWorkPath() );
568*b1cdbd2cSJim Jagielski 	SetStandardDir( aStdDirObj.GetMainURL( INetURLObject::NO_DECODE ) );
569*b1cdbd2cSJim Jagielski 
570*b1cdbd2cSJim Jagielski 	// Reichweite bestimmen.
571*b1cdbd2cSJim Jagielski 	if ( !( nStyle & SFXWB_NOREMOTE ) )
572*b1cdbd2cSJim Jagielski 	{
573*b1cdbd2cSJim Jagielski 		_pImp->_nState |= FILEDLG_STATE_REMOTE;
574*b1cdbd2cSJim Jagielski 	}
575*b1cdbd2cSJim Jagielski 
576*b1cdbd2cSJim Jagielski 	// Kontrollelement erzeugen, wobei die Reihenfolge die Tab-Steuerung
577*b1cdbd2cSJim Jagielski 	// bestimmt.
578*b1cdbd2cSJim Jagielski 	_pImp->_pFtFileName = new FixedText( this, SvtResId( FT_EXPLORERFILE_FILENAME ) );
579*b1cdbd2cSJim Jagielski 
580*b1cdbd2cSJim Jagielski     SvtURLBox* pURLBox = new SvtURLBox( this );
581*b1cdbd2cSJim Jagielski     pURLBox->SetUrlFilter( &m_aURLFilter );
582*b1cdbd2cSJim Jagielski     _pImp->_pEdFileName = pURLBox;
583*b1cdbd2cSJim Jagielski 
584*b1cdbd2cSJim Jagielski     Edit aDummy( this, SvtResId( ED_EXPLORERFILE_FILENAME ) );
585*b1cdbd2cSJim Jagielski     _pImp->_pEdFileName->SetPosSizePixel( aDummy.GetPosPixel(), aDummy.GetSizePixel() );
586*b1cdbd2cSJim Jagielski     _pImp->_pEdFileName->Show();
587*b1cdbd2cSJim Jagielski     pURLBox->SetSelectHdl( LINK( this, SvtFileDialog, EntrySelectHdl_Impl ) );
588*b1cdbd2cSJim Jagielski     pURLBox->SetOpenHdl( STATIC_LINK( this, SvtFileDialog, OpenHdl_Impl ) );
589*b1cdbd2cSJim Jagielski 
590*b1cdbd2cSJim Jagielski     // in folder picker mode, only auto-complete directories (no files)
591*b1cdbd2cSJim Jagielski     bool bIsFolderPicker = ( _pImp->_eDlgType == FILEDLG_TYPE_PATHDLG );
592*b1cdbd2cSJim Jagielski     pURLBox->SetOnlyDirectories( bIsFolderPicker );
593*b1cdbd2cSJim Jagielski 
594*b1cdbd2cSJim Jagielski     // in save mode, don't use the autocompletion as selection in the edit part
595*b1cdbd2cSJim Jagielski     bool bSaveMode = ( FILEDLG_MODE_SAVE == _pImp->_eMode );
596*b1cdbd2cSJim Jagielski     pURLBox->SetNoURLSelection( bSaveMode );
597*b1cdbd2cSJim Jagielski 
598*b1cdbd2cSJim Jagielski     _pImp->_pEdFileName->SetHelpId( HID_FILEDLG_AUTOCOMPLETEBOX );
599*b1cdbd2cSJim Jagielski 
600*b1cdbd2cSJim Jagielski     _pImp->_pFtFileType = new FixedText( this, SvtResId( FT_EXPLORERFILE_FILETYPE ) );
601*b1cdbd2cSJim Jagielski 	_pImp->CreateFilterListControl( this, SvtResId( LB_EXPLORERFILE_FILETYPE ) );
602*b1cdbd2cSJim Jagielski 
603*b1cdbd2cSJim Jagielski 	// move the filter listbox to the space occupied by the version listbox
604*b1cdbd2cSJim Jagielski     // if that box isn't needed
605*b1cdbd2cSJim Jagielski     if ( !( _nExtraBits & SFX_EXTRA_SHOWVERSIONS ) &&
606*b1cdbd2cSJim Jagielski          !( _nExtraBits & SFX_EXTRA_TEMPLATES ) &&
607*b1cdbd2cSJim Jagielski          !( _nExtraBits & SFX_EXTRA_IMAGE_TEMPLATE ) )
608*b1cdbd2cSJim Jagielski 	{
609*b1cdbd2cSJim Jagielski 		{
610*b1cdbd2cSJim Jagielski 			FixedText aSharedListBoxLabel( this, SvtResId( FT_EXPLORERFILE_SHARED_LISTBOX ) );
611*b1cdbd2cSJim Jagielski 			_pImp->_pFtFileType->SetPosPixel( aSharedListBoxLabel.GetPosPixel() );
612*b1cdbd2cSJim Jagielski 		}
613*b1cdbd2cSJim Jagielski 
614*b1cdbd2cSJim Jagielski 		{
615*b1cdbd2cSJim Jagielski 			ListBox aSharedListBox( this, SvtResId( LB_EXPLORERFILE_SHARED_LISTBOX ) );
616*b1cdbd2cSJim Jagielski 			_pImp->GetFilterListControl()->SetPosPixel( aSharedListBox.GetPosPixel() );
617*b1cdbd2cSJim Jagielski 		}
618*b1cdbd2cSJim Jagielski 	}
619*b1cdbd2cSJim Jagielski 
620*b1cdbd2cSJim Jagielski 	_pImp->_pFtCurrentPath = new FixedText( this, SvtResId( FT_EXPLORERFILE_CURRENTPATH ) );
621*b1cdbd2cSJim Jagielski     WinBits nTmpStyle = _pImp->_pFtCurrentPath->GetStyle();
622*b1cdbd2cSJim Jagielski     nTmpStyle |= WB_PATHELLIPSIS;
623*b1cdbd2cSJim Jagielski     _pImp->_pFtCurrentPath->SetStyle( nTmpStyle );
624*b1cdbd2cSJim Jagielski 
625*b1cdbd2cSJim Jagielski     _pImp->_pBtnFileOpen = new PushButton( this, SvtResId( BTN_EXPLORERFILE_OPEN ) );
626*b1cdbd2cSJim Jagielski 	_pImp->_pBtnCancel = new CancelButton( this, SvtResId( BTN_EXPLORERFILE_CANCEL ) );
627*b1cdbd2cSJim Jagielski 	_pImp->_pBtnHelp = new HelpButton( this, SvtResId( BTN_EXPLORERFILE_HELP ) );
628*b1cdbd2cSJim Jagielski 
629*b1cdbd2cSJim Jagielski 	_pImp->_pBtnUp = new SvtUpButton_Impl( this, SvtResId( BTN_EXPLORERFILE_UP ) );
630*b1cdbd2cSJim Jagielski 	_pImp->_pBtnNewFolder = new ImageButton( this, SvtResId( BTN_EXPLORERFILE_NEWFOLDER ) );
631*b1cdbd2cSJim Jagielski 	_pImp->_pBtnNewFolder->SetStyle( _pImp->_pBtnNewFolder->GetStyle() | WB_NOPOINTERFOCUS );
632*b1cdbd2cSJim Jagielski     _pImp->_pBtnStandard = new SvtTravelButton_Impl( this, SvtResId( BTN_EXPLORERFILE_STANDARD ) );
633*b1cdbd2cSJim Jagielski 
634*b1cdbd2cSJim Jagielski 	_pImp->_pBtnUp->SetAccessibleName( _pImp->_pBtnUp->GetQuickHelpText() );
635*b1cdbd2cSJim Jagielski 	_pImp->_pBtnNewFolder->SetAccessibleName( _pImp->_pBtnNewFolder->GetQuickHelpText() );
636*b1cdbd2cSJim Jagielski 	_pImp->_pBtnStandard->SetAccessibleName( _pImp->_pBtnStandard->GetQuickHelpText() );
637*b1cdbd2cSJim Jagielski 
638*b1cdbd2cSJim Jagielski 	if ( ( nStyle & SFXWB_MULTISELECTION ) == SFXWB_MULTISELECTION )
639*b1cdbd2cSJim Jagielski 		_pImp->_bMultiSelection = sal_True;
640*b1cdbd2cSJim Jagielski 
641*b1cdbd2cSJim Jagielski 	_pFileView = new SvtFileView( this, SvtResId( CTL_EXPLORERFILE_FILELIST ),
642*b1cdbd2cSJim Jagielski 									   FILEDLG_TYPE_PATHDLG == _pImp->_eDlgType,
643*b1cdbd2cSJim Jagielski 									   _pImp->_bMultiSelection );
644*b1cdbd2cSJim Jagielski     _pFileView->SetUrlFilter( &m_aURLFilter );
645*b1cdbd2cSJim Jagielski 	_pFileView->EnableAutoResize();
646*b1cdbd2cSJim Jagielski 
647*b1cdbd2cSJim Jagielski 	_pFileView->SetHelpId( HID_FILEDLG_STANDARD );
648*b1cdbd2cSJim Jagielski 	_pFileView->SetStyle( _pFileView->GetStyle() | WB_TABSTOP );
649*b1cdbd2cSJim Jagielski 
650*b1cdbd2cSJim Jagielski 	// Positionen und Groessen der Knoepfe bestimmen.
651*b1cdbd2cSJim Jagielski 	Image aNewFolderImg( GetButtonImage( IMG_FILEDLG_CREATEFOLDER ) );
652*b1cdbd2cSJim Jagielski 	_pImp->_pBtnNewFolder->SetModeImage( aNewFolderImg );
653*b1cdbd2cSJim Jagielski 
654*b1cdbd2cSJim Jagielski 	Size aSize( aNewFolderImg.GetSizePixel() );
655*b1cdbd2cSJim Jagielski 	aSize.Width() += FILEDIALOG_DEF_IMAGEBORDER;
656*b1cdbd2cSJim Jagielski 	aSize.Height() += FILEDIALOG_DEF_IMAGEBORDER;
657*b1cdbd2cSJim Jagielski 	_pImp->_pBtnNewFolder->SetSizePixel( aSize );
658*b1cdbd2cSJim Jagielski 	_pImp->_pBtnUp->SetSizePixel( aSize );
659*b1cdbd2cSJim Jagielski 	_pImp->_pBtnStandard->SetSizePixel( aSize );
660*b1cdbd2cSJim Jagielski 
661*b1cdbd2cSJim Jagielski 	Size aDlgSize = GetOutputSizePixel();
662*b1cdbd2cSJim Jagielski 	long n6AppFontInPixel =
663*b1cdbd2cSJim Jagielski 			LogicToPixel( Size( 6, 0 ), MAP_APPFONT ).Width();
664*b1cdbd2cSJim Jagielski 	long n3AppFontInPixel =
665*b1cdbd2cSJim Jagielski 			LogicToPixel( Size( 3, 0 ), MAP_APPFONT ).Width();
666*b1cdbd2cSJim Jagielski 
667*b1cdbd2cSJim Jagielski     // calculate the length of all buttons
668*b1cdbd2cSJim Jagielski 	const sal_uInt16 nBtnCount = 3; // "previous level", "new folder" and "standard dir"
669*b1cdbd2cSJim Jagielski 	long nDelta = n6AppFontInPixel; // right border
670*b1cdbd2cSJim Jagielski 	nDelta += ( nBtnCount * aSize.Width() ); // button count * button width
671*b1cdbd2cSJim Jagielski 	nDelta += ( n3AppFontInPixel + n3AppFontInPixel / 2 ); // spacing 1*big 1*small
672*b1cdbd2cSJim Jagielski 
673*b1cdbd2cSJim Jagielski     Point aPos(
674*b1cdbd2cSJim Jagielski         aDlgSize.Width() - nDelta,
675*b1cdbd2cSJim Jagielski         _pImp->_pBtnUp->GetPosPixel().Y()
676*b1cdbd2cSJim Jagielski     );
677*b1cdbd2cSJim Jagielski     Size aCurPathSize(
678*b1cdbd2cSJim Jagielski         aPos.X() - n6AppFontInPixel,
679*b1cdbd2cSJim Jagielski         _pImp->_pFtCurrentPath->GetOutputSizePixel().Height()
680*b1cdbd2cSJim Jagielski     );
681*b1cdbd2cSJim Jagielski 	_pImp->_pFtCurrentPath->SetOutputSizePixel( aCurPathSize );
682*b1cdbd2cSJim Jagielski 	_pImp->_pBtnUp->SetPosPixel( aPos );
683*b1cdbd2cSJim Jagielski 	aPos.X() += aSize.Width();
684*b1cdbd2cSJim Jagielski 	aPos.X() += n3AppFontInPixel;
685*b1cdbd2cSJim Jagielski 	_pImp->_pBtnNewFolder->SetPosPixel( aPos );
686*b1cdbd2cSJim Jagielski 	aPos.X() += aSize.Width();
687*b1cdbd2cSJim Jagielski 	aPos.X() += n3AppFontInPixel / 2;
688*b1cdbd2cSJim Jagielski 	_pImp->_pBtnStandard->SetPosPixel( aPos );
689*b1cdbd2cSJim Jagielski 	nDelta = aSize.Height();
690*b1cdbd2cSJim Jagielski 	nDelta -= aCurPathSize.Height();
691*b1cdbd2cSJim Jagielski 	nDelta /= 2;
692*b1cdbd2cSJim Jagielski 	Point aCurPathPos = _pImp->_pFtCurrentPath->GetPosPixel();
693*b1cdbd2cSJim Jagielski 	aCurPathPos.Y() += nDelta;
694*b1cdbd2cSJim Jagielski 	_pImp->_pFtCurrentPath->SetPosPixel( aCurPathPos );
695*b1cdbd2cSJim Jagielski 
696*b1cdbd2cSJim Jagielski     if ( nStyle & SFXWB_READONLY )
697*b1cdbd2cSJim Jagielski     {
698*b1cdbd2cSJim Jagielski         _pCbReadOnly = new CheckBox( this, SvtResId( CB_EXPLORERFILE_READONLY ) );
699*b1cdbd2cSJim Jagielski         _pCbReadOnly->SetHelpId( HID_FILEOPEN_READONLY );
700*b1cdbd2cSJim Jagielski         _pCbReadOnly->SetText( SvtResId( STR_SVT_FILEPICKER_READONLY ) );
701*b1cdbd2cSJim Jagielski         AddControl( _pCbReadOnly );
702*b1cdbd2cSJim Jagielski         ReleaseOwnerShip( _pCbReadOnly );
703*b1cdbd2cSJim Jagielski         _pCbReadOnly->SetClickHdl( LINK( this, SvtFileDialog, ClickHdl_Impl ) );
704*b1cdbd2cSJim Jagielski     }
705*b1cdbd2cSJim Jagielski 
706*b1cdbd2cSJim Jagielski     if ( nStyle & SFXWB_PASSWORD )
707*b1cdbd2cSJim Jagielski     {
708*b1cdbd2cSJim Jagielski         _pImp->_pCbPassword = new CheckBox( this, SvtResId( CB_EXPLORERFILE_PASSWORD ) );
709*b1cdbd2cSJim Jagielski         _pImp->_pCbPassword->SetText( SvtResId( STR_SVT_FILEPICKER_PASSWORD ) );
710*b1cdbd2cSJim Jagielski         AddControl( _pImp->_pCbPassword );
711*b1cdbd2cSJim Jagielski         ReleaseOwnerShip( _pImp->_pCbPassword );
712*b1cdbd2cSJim Jagielski         _pImp->_pCbPassword->SetClickHdl( LINK( this, SvtFileDialog, ClickHdl_Impl ) );
713*b1cdbd2cSJim Jagielski     }
714*b1cdbd2cSJim Jagielski 
715*b1cdbd2cSJim Jagielski     // set the ini file for extracting the size
716*b1cdbd2cSJim Jagielski     _pImp->_aIniKey = IODLG_CONFIGNAME;
717*b1cdbd2cSJim Jagielski 
718*b1cdbd2cSJim Jagielski     AddControls_Impl( );
719*b1cdbd2cSJim Jagielski 
720*b1cdbd2cSJim Jagielski 	// Zahl der Pixel bestimmen, um die die anderen Elemente in der Position
721*b1cdbd2cSJim Jagielski 	// Angepasst werden muessen.
722*b1cdbd2cSJim Jagielski 	aPos.Y() += aSize.Height();
723*b1cdbd2cSJim Jagielski 	aPos.Y() += LogicToPixel( Size( 0, 6 ), MAP_APPFONT ).Height();
724*b1cdbd2cSJim Jagielski 	long nYOffset = aPos.Y();
725*b1cdbd2cSJim Jagielski 	aPos = _pFileView->GetPosPixel();
726*b1cdbd2cSJim Jagielski 	nYOffset -= aPos.Y();
727*b1cdbd2cSJim Jagielski 
728*b1cdbd2cSJim Jagielski 	// Positionen der uebrigen Elemente anpassen.
729*b1cdbd2cSJim Jagielski 	aPos.Y() += nYOffset;
730*b1cdbd2cSJim Jagielski 	_pFileView->SetPosPixel( aPos );
731*b1cdbd2cSJim Jagielski 
732*b1cdbd2cSJim Jagielski 	lcl_MoveControl( _pImp->_pFtFileName, 0, nYOffset );
733*b1cdbd2cSJim Jagielski 	lcl_MoveControl( _pImp->_pEdFileName, 0, nYOffset );
734*b1cdbd2cSJim Jagielski 
735*b1cdbd2cSJim Jagielski 	lcl_MoveControl( _pImp->_pFtFileVersion, 0, nYOffset );
736*b1cdbd2cSJim Jagielski 	lcl_MoveControl( _pImp->_pLbFileVersion, 0, nYOffset );
737*b1cdbd2cSJim Jagielski 
738*b1cdbd2cSJim Jagielski 	lcl_MoveControl( _pImp->_pFtTemplates, 0, nYOffset );
739*b1cdbd2cSJim Jagielski 	lcl_MoveControl( _pImp->_pLbTemplates, 0, nYOffset );
740*b1cdbd2cSJim Jagielski 
741*b1cdbd2cSJim Jagielski 	lcl_MoveControl( _pImp->_pFtImageTemplates, 0, nYOffset );
742*b1cdbd2cSJim Jagielski 	lcl_MoveControl( _pImp->_pLbImageTemplates, 0, nYOffset );
743*b1cdbd2cSJim Jagielski 
744*b1cdbd2cSJim Jagielski 	lcl_MoveControl( _pImp->_pFtFileType, 0, nYOffset );
745*b1cdbd2cSJim Jagielski 	lcl_MoveControl( _pImp->GetFilterListControl(), 0, nYOffset );
746*b1cdbd2cSJim Jagielski 
747*b1cdbd2cSJim Jagielski 	lcl_MoveControl( _pImp->_pBtnFileOpen, 0, nYOffset );
748*b1cdbd2cSJim Jagielski 	lcl_MoveControl( _pImp->_pBtnCancel, 0, nYOffset );
749*b1cdbd2cSJim Jagielski 
750*b1cdbd2cSJim Jagielski 	lcl_MoveControl( _pImp->_pBtnHelp, 0, nYOffset + 3 );
751*b1cdbd2cSJim Jagielski 		// a little more spacing between Cancel- and HelpButton
752*b1cdbd2cSJim Jagielski 
753*b1cdbd2cSJim Jagielski 	// Groesse des Dialoges anpassen.
754*b1cdbd2cSJim Jagielski 	aSize = GetSizePixel();
755*b1cdbd2cSJim Jagielski 	aSize.Height() += nYOffset;
756*b1cdbd2cSJim Jagielski 	SetSizePixel( aSize );
757*b1cdbd2cSJim Jagielski 
758*b1cdbd2cSJim Jagielski 	// Beschriftungen dem Modus anpassen.
759*b1cdbd2cSJim Jagielski 	sal_uInt16 nResId = STR_EXPLORERFILE_OPEN;
760*b1cdbd2cSJim Jagielski 	sal_uInt16 nButtonResId = 0;
761*b1cdbd2cSJim Jagielski 
762*b1cdbd2cSJim Jagielski 	if ( nStyle & WB_SAVEAS )
763*b1cdbd2cSJim Jagielski 	{
764*b1cdbd2cSJim Jagielski 		nResId = STR_EXPLORERFILE_SAVE;
765*b1cdbd2cSJim Jagielski 		nButtonResId = STR_EXPLORERFILE_BUTTONSAVE;
766*b1cdbd2cSJim Jagielski 	}
767*b1cdbd2cSJim Jagielski 
768*b1cdbd2cSJim Jagielski 	if ( ( nStyle & SFXWB_PATHDIALOG ) == SFXWB_PATHDIALOG )
769*b1cdbd2cSJim Jagielski 	{
770*b1cdbd2cSJim Jagielski 		_pImp->_pFtFileName->SetText( SvtResId( STR_PATHNAME ) );
771*b1cdbd2cSJim Jagielski 		nResId = STR_PATHSELECT;
772*b1cdbd2cSJim Jagielski 		nButtonResId = STR_BUTTONSELECT;
773*b1cdbd2cSJim Jagielski 	}
774*b1cdbd2cSJim Jagielski 
775*b1cdbd2cSJim Jagielski 	SetText( SvtResId( nResId ) );
776*b1cdbd2cSJim Jagielski 
777*b1cdbd2cSJim Jagielski 	if ( nButtonResId )
778*b1cdbd2cSJim Jagielski 		_pImp->_pBtnFileOpen->SetText( SvtResId( nButtonResId ) );
779*b1cdbd2cSJim Jagielski 
780*b1cdbd2cSJim Jagielski 	if ( FILEDLG_TYPE_FILEDLG != _pImp->_eDlgType )
781*b1cdbd2cSJim Jagielski 	{
782*b1cdbd2cSJim Jagielski 		_pImp->_pFtFileType->Hide();
783*b1cdbd2cSJim Jagielski 		_pImp->GetFilterListControl()->Hide();
784*b1cdbd2cSJim Jagielski 	}
785*b1cdbd2cSJim Jagielski 
786*b1cdbd2cSJim Jagielski 	// Einstellungen der Steuerelemente vornehmen.
787*b1cdbd2cSJim Jagielski 	_pImp->_pBtnNewFolder->SetClickHdl( STATIC_LINK( this, SvtFileDialog, NewFolderHdl_Impl ) );
788*b1cdbd2cSJim Jagielski 	_pImp->_pBtnFileOpen->SetClickHdl( STATIC_LINK( this, SvtFileDialog, OpenHdl_Impl ) );
789*b1cdbd2cSJim Jagielski 	_pImp->_pBtnCancel->SetClickHdl( LINK( this, SvtFileDialog, CancelHdl_Impl ) );
790*b1cdbd2cSJim Jagielski 	_pImp->SetFilterListSelectHdl( STATIC_LINK( this, SvtFileDialog, FilterSelectHdl_Impl ) );
791*b1cdbd2cSJim Jagielski 	_pImp->_pEdFileName->SetGetFocusHdl( STATIC_LINK( this, SvtFileDialog, FileNameGetFocusHdl_Impl ) );
792*b1cdbd2cSJim Jagielski 	_pImp->_pEdFileName->SetModifyHdl( STATIC_LINK( this, SvtFileDialog, FileNameModifiedHdl_Impl ) );
793*b1cdbd2cSJim Jagielski 	_pFileView->SetSelectHdl( LINK( this, SvtFileDialog, SelectHdl_Impl ) );
794*b1cdbd2cSJim Jagielski 	_pFileView->SetDoubleClickHdl( LINK( this, SvtFileDialog, DblClickHdl_Impl ) );
795*b1cdbd2cSJim Jagielski 	_pFileView->SetOpenDoneHdl( LINK( this, SvtFileDialog, OpenDoneHdl_Impl ) );
796*b1cdbd2cSJim Jagielski 
797*b1cdbd2cSJim Jagielski 	// Resourcen freigeben.
798*b1cdbd2cSJim Jagielski 	FreeResource();
799*b1cdbd2cSJim Jagielski 
800*b1cdbd2cSJim Jagielski 	// Timer fuer Filterbox Travel setzen
801*b1cdbd2cSJim Jagielski 	_pImp->_aFilterTimer.SetTimeout( TRAVELFILTER_TIMEOUT );
802*b1cdbd2cSJim Jagielski 	_pImp->_aFilterTimer.SetTimeoutHdl( STATIC_LINK( this, SvtFileDialog, FilterSelectHdl_Impl ) );
803*b1cdbd2cSJim Jagielski 
804*b1cdbd2cSJim Jagielski 	if ( WB_SAVEAS & nStyle )
805*b1cdbd2cSJim Jagielski 	{
806*b1cdbd2cSJim Jagielski 		// different help ids if in save-as mode
807*b1cdbd2cSJim Jagielski 		// 90744 - 09.08.2001 - frank.schoenheit@sun.com
808*b1cdbd2cSJim Jagielski 		SetHelpId( HID_FILESAVE_DIALOG );
809*b1cdbd2cSJim Jagielski 
810*b1cdbd2cSJim Jagielski 		_pImp->_pEdFileName->SetHelpId( HID_FILESAVE_FILEURL );
811*b1cdbd2cSJim Jagielski 		_pImp->_pBtnFileOpen->SetHelpId( HID_FILESAVE_DOSAVE );
812*b1cdbd2cSJim Jagielski 		_pImp->_pBtnNewFolder->SetHelpId( HID_FILESAVE_CREATEDIRECTORY );
813*b1cdbd2cSJim Jagielski 		_pImp->_pBtnStandard->SetHelpId( HID_FILESAVE_DEFAULTDIRECTORY );
814*b1cdbd2cSJim Jagielski 		_pImp->_pBtnUp->SetHelpId( HID_FILESAVE_LEVELUP );
815*b1cdbd2cSJim Jagielski 		_pImp->GetFilterListControl()->SetHelpId( HID_FILESAVE_FILETYPE );
816*b1cdbd2cSJim Jagielski 		_pFileView->SetHelpId( HID_FILESAVE_FILEVIEW );
817*b1cdbd2cSJim Jagielski 
818*b1cdbd2cSJim Jagielski 		// formerly, there was only _pLbFileVersion, which was used for 3 different
819*b1cdbd2cSJim Jagielski 		// use cases. For reasons of maintainability, I introduced extra members (_pLbTemplates, _pLbImageTemplates)
820*b1cdbd2cSJim Jagielski 		// for the extra use cases, and separated _pLbFileVersion
821*b1cdbd2cSJim Jagielski 		// I did not find out in which cases the help ID is really needed HID_FILESAVE_TEMPLATE - all
822*b1cdbd2cSJim Jagielski 		// tests I made lead to a dialog where _no_ of the three list boxes was present.
823*b1cdbd2cSJim Jagielski 		// 96930 - 15.08.2002 - fs@openoffice.org
824*b1cdbd2cSJim Jagielski 		if ( _pImp->_pLbFileVersion )
825*b1cdbd2cSJim Jagielski 			_pImp->_pLbFileVersion->SetHelpId( HID_FILESAVE_TEMPLATE );
826*b1cdbd2cSJim Jagielski 		if ( _pImp->_pLbTemplates )
827*b1cdbd2cSJim Jagielski 			_pImp->_pLbTemplates->SetHelpId( HID_FILESAVE_TEMPLATE );
828*b1cdbd2cSJim Jagielski 		if ( _pImp->_pLbImageTemplates )
829*b1cdbd2cSJim Jagielski 			_pImp->_pLbImageTemplates->SetHelpId( HID_FILESAVE_TEMPLATE );
830*b1cdbd2cSJim Jagielski 
831*b1cdbd2cSJim Jagielski 		if ( _pImp->_pCbPassword ) _pImp->_pCbPassword->SetHelpId( HID_FILESAVE_SAVEWITHPASSWORD );
832*b1cdbd2cSJim Jagielski 		if ( _pImp->_pCbAutoExtension ) _pImp->_pCbAutoExtension->SetHelpId( HID_FILESAVE_AUTOEXTENSION );
833*b1cdbd2cSJim Jagielski 		if ( _pImp->_pCbOptions ) _pImp->_pCbOptions->SetHelpId( HID_FILESAVE_CUSTOMIZEFILTER );
834*b1cdbd2cSJim Jagielski 		if ( _pCbSelection ) _pCbSelection->SetHelpId( HID_FILESAVE_SELECTION );
835*b1cdbd2cSJim Jagielski 	}
836*b1cdbd2cSJim Jagielski 
837*b1cdbd2cSJim Jagielski 	// correct the z-order of the controls
838*b1cdbd2cSJim Jagielski 	implArrangeControls();
839*b1cdbd2cSJim Jagielski 
840*b1cdbd2cSJim Jagielski     // special URLs, such as favourites and "restricted" paths
841*b1cdbd2cSJim Jagielski     implInitializeSpecialURLLists( );
842*b1cdbd2cSJim Jagielski 
843*b1cdbd2cSJim Jagielski     /// read our settings from the configuration
844*b1cdbd2cSJim Jagielski     m_aConfiguration = OConfigurationTreeRoot::createWithServiceFactory(
845*b1cdbd2cSJim Jagielski         ::comphelper::getProcessServiceFactory(),
846*b1cdbd2cSJim Jagielski         ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "/org.openoffice.Office.UI/FilePicker" ) )
847*b1cdbd2cSJim Jagielski     );
848*b1cdbd2cSJim Jagielski }
849*b1cdbd2cSJim Jagielski 
850*b1cdbd2cSJim Jagielski //*****************************************************************************
851*b1cdbd2cSJim Jagielski 
IMPL_STATIC_LINK(SvtFileDialog,NewFolderHdl_Impl,PushButton *,EMPTYARG)852*b1cdbd2cSJim Jagielski IMPL_STATIC_LINK( SvtFileDialog, NewFolderHdl_Impl, PushButton*, EMPTYARG )
853*b1cdbd2cSJim Jagielski {
854*b1cdbd2cSJim Jagielski     pThis->_pFileView->EndInplaceEditing( false );
855*b1cdbd2cSJim Jagielski 
856*b1cdbd2cSJim Jagielski     INetURLObject aObj( pThis->_pFileView->GetViewURL() );
857*b1cdbd2cSJim Jagielski 	String sFolderName = aObj.getName( INetURLObject::LAST_SEGMENT, true, INetURLObject::DECODE_WITH_CHARSET, RTL_TEXTENCODING_UTF8 );
858*b1cdbd2cSJim Jagielski     svtools::QueryFolderNameDialog aDlg( pThis, sFolderName, String( SvtResId( STR_SVT_NEW_FOLDER ) ) );
859*b1cdbd2cSJim Jagielski     sal_Bool bHandled = sal_False;
860*b1cdbd2cSJim Jagielski 
861*b1cdbd2cSJim Jagielski 	while ( !bHandled )
862*b1cdbd2cSJim Jagielski 	{
863*b1cdbd2cSJim Jagielski 		if ( aDlg.Execute() == RET_OK )
864*b1cdbd2cSJim Jagielski 			bHandled = pThis->_pFileView->CreateNewFolder( aDlg.GetName() );
865*b1cdbd2cSJim Jagielski 		else
866*b1cdbd2cSJim Jagielski 			bHandled = sal_True;
867*b1cdbd2cSJim Jagielski 	}
868*b1cdbd2cSJim Jagielski 
869*b1cdbd2cSJim Jagielski 	return 0;
870*b1cdbd2cSJim Jagielski }
871*b1cdbd2cSJim Jagielski 
872*b1cdbd2cSJim Jagielski //*****************************************************************************
873*b1cdbd2cSJim Jagielski 
IMPL_STATIC_LINK_NOINSTANCE(SvtFileDialog,ViewHdl_Impl,ImageButton *,EMPTYARG)874*b1cdbd2cSJim Jagielski IMPL_STATIC_LINK_NOINSTANCE( SvtFileDialog, ViewHdl_Impl, ImageButton*, EMPTYARG )
875*b1cdbd2cSJim Jagielski {
876*b1cdbd2cSJim Jagielski 	return 0;
877*b1cdbd2cSJim Jagielski }
878*b1cdbd2cSJim Jagielski 
879*b1cdbd2cSJim Jagielski //*****************************************************************************
880*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
createNewUserFilter(const String & _rNewFilter,sal_Bool _bAllowUserDefExt)881*b1cdbd2cSJim Jagielski sal_Bool SvtFileDialog::createNewUserFilter( const String& _rNewFilter, sal_Bool _bAllowUserDefExt )
882*b1cdbd2cSJim Jagielski {
883*b1cdbd2cSJim Jagielski 	// delete the old user filter and create a new one
884*b1cdbd2cSJim Jagielski 	DELETEZ( _pImp->_pUserFilter );
885*b1cdbd2cSJim Jagielski 	_pImp->_pUserFilter = new SvtFileDialogFilter_Impl( _rNewFilter, _rNewFilter );
886*b1cdbd2cSJim Jagielski 
887*b1cdbd2cSJim Jagielski 	// remember the extension
888*b1cdbd2cSJim Jagielski 	sal_Bool bIsAllFiles = _rNewFilter.EqualsAscii( FILEDIALOG_FILTER_ALL );
889*b1cdbd2cSJim Jagielski 	if ( bIsAllFiles )
890*b1cdbd2cSJim Jagielski 		EraseDefaultExt();
891*b1cdbd2cSJim Jagielski 	else
892*b1cdbd2cSJim Jagielski 		SetDefaultExt( _rNewFilter.Copy( 2 ) );
893*b1cdbd2cSJim Jagielski 		// TODO: this is nonsense. In the whole file there are a lotta places where we assume that a user filter
894*b1cdbd2cSJim Jagielski 		// is always "*.<something>". But changing this would take some more time than I have now ...
895*b1cdbd2cSJim Jagielski 		// 05.12.2001 - 95486 - fs@openoffice.org
896*b1cdbd2cSJim Jagielski 
897*b1cdbd2cSJim Jagielski 	// now, the default extension is set to the one of the user filter (or empty)
898*b1cdbd2cSJim Jagielski 	// if the former is not allowed (_bAllowUserDefExt = <FALSE/>), we have to use the ext of the current filter
899*b1cdbd2cSJim Jagielski 	// (if possible)
900*b1cdbd2cSJim Jagielski 	sal_Bool bUseCurFilterExt = sal_True;
901*b1cdbd2cSJim Jagielski 	String sUserFilter = _pImp->_pUserFilter->GetType();
902*b1cdbd2cSJim Jagielski 	xub_StrLen nSepPos = sUserFilter.SearchBackward( '.' );
903*b1cdbd2cSJim Jagielski 	if ( STRING_NOTFOUND != nSepPos )
904*b1cdbd2cSJim Jagielski 	{
905*b1cdbd2cSJim Jagielski 		String sUserExt = sUserFilter.Copy( nSepPos + 1 );
906*b1cdbd2cSJim Jagielski 		if	(	( STRING_NOTFOUND == sUserExt.Search( '*' ) )
907*b1cdbd2cSJim Jagielski 			&&	( STRING_NOTFOUND == sUserExt.Search( '?' ) )
908*b1cdbd2cSJim Jagielski 			)
909*b1cdbd2cSJim Jagielski 			bUseCurFilterExt = sal_False;
910*b1cdbd2cSJim Jagielski 	}
911*b1cdbd2cSJim Jagielski 
912*b1cdbd2cSJim Jagielski 	if ( !_bAllowUserDefExt || bUseCurFilterExt )
913*b1cdbd2cSJim Jagielski 	{
914*b1cdbd2cSJim Jagielski 		if ( _pImp->GetCurFilter( ) )
915*b1cdbd2cSJim Jagielski             SetDefaultExt( _pImp->GetCurFilter( )->GetExtension() );
916*b1cdbd2cSJim Jagielski 		else
917*b1cdbd2cSJim Jagielski 			EraseDefaultExt();
918*b1cdbd2cSJim Jagielski 	}
919*b1cdbd2cSJim Jagielski 
920*b1cdbd2cSJim Jagielski 	// outta here
921*b1cdbd2cSJim Jagielski 	return bIsAllFiles;
922*b1cdbd2cSJim Jagielski }
923*b1cdbd2cSJim Jagielski 
924*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
925*b1cdbd2cSJim Jagielski #define FLT_NONEMPTY		0x0001
926*b1cdbd2cSJim Jagielski #define FLT_CHANGED			0x0002
927*b1cdbd2cSJim Jagielski #define FLT_USERFILTER		0x0004
928*b1cdbd2cSJim Jagielski #define FLT_ALLFILESFILTER	0x0008
929*b1cdbd2cSJim Jagielski 
930*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
adjustFilter(const String & _rFilter)931*b1cdbd2cSJim Jagielski sal_uInt16 SvtFileDialog::adjustFilter( const String& _rFilter )
932*b1cdbd2cSJim Jagielski {
933*b1cdbd2cSJim Jagielski 	sal_uInt16 nReturn = 0;
934*b1cdbd2cSJim Jagielski 
935*b1cdbd2cSJim Jagielski 	const sal_Bool bNonEmpty = ( _rFilter.Len() != 0 );
936*b1cdbd2cSJim Jagielski 	if ( bNonEmpty )
937*b1cdbd2cSJim Jagielski 	{
938*b1cdbd2cSJim Jagielski 		nReturn |= FLT_NONEMPTY;
939*b1cdbd2cSJim Jagielski 
940*b1cdbd2cSJim Jagielski 		sal_Bool bFilterChanged = sal_True;
941*b1cdbd2cSJim Jagielski 
942*b1cdbd2cSJim Jagielski 		// search for a corresponding filter
943*b1cdbd2cSJim Jagielski 		SvtFileDialogFilter_Impl* pFilter = FindFilter_Impl( _rFilter, sal_False, bFilterChanged );
944*b1cdbd2cSJim Jagielski 
945*b1cdbd2cSJim Jagielski #ifdef AUTOSELECT_USERFILTER
946*b1cdbd2cSJim Jagielski 		// if we found a filter which without allowing multi-extensions -> select it
947*b1cdbd2cSJim Jagielski 		if ( pFilter )
948*b1cdbd2cSJim Jagielski 		{
949*b1cdbd2cSJim Jagielski 			_pImp->SelectFilterListEntry( pFilter->GetName() );
950*b1cdbd2cSJim Jagielski 			_pImp->SetCurFilter( pFilter );
951*b1cdbd2cSJim Jagielski 		}
952*b1cdbd2cSJim Jagielski #endif // AUTOSELECT_USERFILTER
953*b1cdbd2cSJim Jagielski 
954*b1cdbd2cSJim Jagielski 		// look for multi-ext filters if necessary
955*b1cdbd2cSJim Jagielski 		if ( !pFilter )
956*b1cdbd2cSJim Jagielski 			pFilter = FindFilter_Impl( _rFilter, sal_True, bFilterChanged );
957*b1cdbd2cSJim Jagielski 
958*b1cdbd2cSJim Jagielski 		if ( bFilterChanged )
959*b1cdbd2cSJim Jagielski 			nReturn |= FLT_CHANGED;
960*b1cdbd2cSJim Jagielski 
961*b1cdbd2cSJim Jagielski 		if ( !pFilter )
962*b1cdbd2cSJim Jagielski 		{
963*b1cdbd2cSJim Jagielski 			nReturn |= FLT_USERFILTER;
964*b1cdbd2cSJim Jagielski 			// no filter found : use it as user defined filter
965*b1cdbd2cSJim Jagielski #ifdef AUTOSELECT_USERFILTER
966*b1cdbd2cSJim Jagielski 			if ( createNewUserFilter( _rFilter, sal_True ) )
967*b1cdbd2cSJim Jagielski #else
968*b1cdbd2cSJim Jagielski 			if ( createNewUserFilter( _rFilter, sal_False ) )
969*b1cdbd2cSJim Jagielski #endif
970*b1cdbd2cSJim Jagielski 			{	// it's the "all files" filter
971*b1cdbd2cSJim Jagielski 				nReturn |= FLT_ALLFILESFILTER;
972*b1cdbd2cSJim Jagielski 
973*b1cdbd2cSJim Jagielski #ifdef AUTOSELECT_USERFILTER
974*b1cdbd2cSJim Jagielski 				// select the "all files" entry
975*b1cdbd2cSJim Jagielski 				String sAllFilesFilter( SvtResId( STR_FILTERNAME_ALL ) );
976*b1cdbd2cSJim Jagielski 				if ( _pImp->HasFilterListEntry( sAllFilesFilter ) )
977*b1cdbd2cSJim Jagielski 				{
978*b1cdbd2cSJim Jagielski 					_pImp->SelectFilterListEntry( sAllFilesFilter );
979*b1cdbd2cSJim Jagielski 					_pImp->SetCurFilter( _pImp->GetSelectedFilterEntry( sAllFilesFilter ) );
980*b1cdbd2cSJim Jagielski 				}
981*b1cdbd2cSJim Jagielski 				else
982*b1cdbd2cSJim Jagielski 					_pImp->SetNoFilterListSelection( );	// there is no "all files" entry
983*b1cdbd2cSJim Jagielski #endif // AUTOSELECT_USERFILTER
984*b1cdbd2cSJim Jagielski 			}
985*b1cdbd2cSJim Jagielski #ifdef AUTOSELECT_USERFILTER
986*b1cdbd2cSJim Jagielski 			else
987*b1cdbd2cSJim Jagielski 				_pImp->SetNoFilterListSelection( );
988*b1cdbd2cSJim Jagielski #endif // AUTOSELECT_USERFILTER
989*b1cdbd2cSJim Jagielski 		}
990*b1cdbd2cSJim Jagielski 	}
991*b1cdbd2cSJim Jagielski 
992*b1cdbd2cSJim Jagielski 	return nReturn;
993*b1cdbd2cSJim Jagielski }
994*b1cdbd2cSJim Jagielski 
995*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
IMPL_LINK(SvtFileDialog,CancelHdl_Impl,void *,EMPTYARG)996*b1cdbd2cSJim Jagielski IMPL_LINK( SvtFileDialog, CancelHdl_Impl, void*, EMPTYARG )
997*b1cdbd2cSJim Jagielski {
998*b1cdbd2cSJim Jagielski     if ( m_pCurrentAsyncAction.is() )
999*b1cdbd2cSJim Jagielski     {
1000*b1cdbd2cSJim Jagielski         m_pCurrentAsyncAction->cancel();
1001*b1cdbd2cSJim Jagielski         onAsyncOperationFinished();
1002*b1cdbd2cSJim Jagielski     }
1003*b1cdbd2cSJim Jagielski     else
1004*b1cdbd2cSJim Jagielski     {
1005*b1cdbd2cSJim Jagielski         EndDialog( sal_False );
1006*b1cdbd2cSJim Jagielski     }
1007*b1cdbd2cSJim Jagielski     return 1L;
1008*b1cdbd2cSJim Jagielski }
1009*b1cdbd2cSJim Jagielski 
1010*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
IMPL_STATIC_LINK(SvtFileDialog,OpenHdl_Impl,void *,pVoid)1011*b1cdbd2cSJim Jagielski IMPL_STATIC_LINK( SvtFileDialog, OpenHdl_Impl, void*, pVoid )
1012*b1cdbd2cSJim Jagielski {
1013*b1cdbd2cSJim Jagielski 	if ( pThis->_pImp->_bMultiSelection && pThis->_pFileView->GetSelectionCount() > 1 )
1014*b1cdbd2cSJim Jagielski 	{
1015*b1cdbd2cSJim Jagielski 		// bei Multiselektion spezielles Open
1016*b1cdbd2cSJim Jagielski 		pThis->OpenMultiSelection_Impl();
1017*b1cdbd2cSJim Jagielski 		return 0;
1018*b1cdbd2cSJim Jagielski 	}
1019*b1cdbd2cSJim Jagielski 
1020*b1cdbd2cSJim Jagielski 	String aFileName;
1021*b1cdbd2cSJim Jagielski     String aOldPath( pThis->_pFileView->GetViewURL() );
1022*b1cdbd2cSJim Jagielski 	if ( pThis->_pImp->_bDoubleClick || pThis->_pFileView->HasChildPathFocus() )
1023*b1cdbd2cSJim Jagielski 		// Selection done by doubleclicking in the view, get filename from the view
1024*b1cdbd2cSJim Jagielski 		aFileName = pThis->_pFileView->GetCurrentURL();
1025*b1cdbd2cSJim Jagielski 
1026*b1cdbd2cSJim Jagielski 	if ( !aFileName.Len() )
1027*b1cdbd2cSJim Jagielski 	{
1028*b1cdbd2cSJim Jagielski 		// if an entry is selected in the view ....
1029*b1cdbd2cSJim Jagielski 		if ( pThis->_pFileView->GetSelectionCount() )
1030*b1cdbd2cSJim Jagielski 		{	// -> use this one. This will allow us to step down this folder
1031*b1cdbd2cSJim Jagielski 			// #i8928# - 2002-12-20 - fs@openoffice.org
1032*b1cdbd2cSJim Jagielski 			aFileName = pThis->_pFileView->GetCurrentURL();
1033*b1cdbd2cSJim Jagielski 		}
1034*b1cdbd2cSJim Jagielski 	}
1035*b1cdbd2cSJim Jagielski 
1036*b1cdbd2cSJim Jagielski 	if ( !aFileName.Len() )
1037*b1cdbd2cSJim Jagielski 	{
1038*b1cdbd2cSJim Jagielski 		if ( pThis->_pImp->_eMode == FILEDLG_MODE_OPEN && pThis->_pImp->_pEdFileName->IsTravelSelect() )
1039*b1cdbd2cSJim Jagielski 			// OpenHdl called from URLBox; travelling through the list of URLs should not cause an opening
1040*b1cdbd2cSJim Jagielski 			return 0;		            // MBA->PB: seems to be called never ?!
1041*b1cdbd2cSJim Jagielski 
1042*b1cdbd2cSJim Jagielski 		// get the URL from from the edit field ( if not empty )
1043*b1cdbd2cSJim Jagielski 		if ( pThis->_pImp->_pEdFileName->GetText().Len() )
1044*b1cdbd2cSJim Jagielski 		{
1045*b1cdbd2cSJim Jagielski 			String aText = pThis->_pImp->_pEdFileName->GetText();
1046*b1cdbd2cSJim Jagielski 
1047*b1cdbd2cSJim Jagielski 			// did we reach the root?
1048*b1cdbd2cSJim Jagielski 			if ( !INetURLObject( aOldPath ).getSegmentCount() )
1049*b1cdbd2cSJim Jagielski 			{
1050*b1cdbd2cSJim Jagielski 				if ( ( aText.Len() == 2 && aText.EqualsAscii( ".." ) ) ||
1051*b1cdbd2cSJim Jagielski 					 ( aText.Len() == 3 && ( aText.EqualsAscii( "..\\" ) || aText.EqualsAscii( "../" ) ) ) )
1052*b1cdbd2cSJim Jagielski 					// don't go higher than the root
1053*b1cdbd2cSJim Jagielski 					return 0;
1054*b1cdbd2cSJim Jagielski 			}
1055*b1cdbd2cSJim Jagielski 
1056*b1cdbd2cSJim Jagielski #if defined( UNX ) || defined( FS_PRIV_DEBUG )
1057*b1cdbd2cSJim Jagielski 			if ( ( 1 == aText.Len() ) && ( '~' == aText.GetBuffer()[0] ) )
1058*b1cdbd2cSJim Jagielski 			{
1059*b1cdbd2cSJim Jagielski 				// go to the home directory
1060*b1cdbd2cSJim Jagielski 				if ( lcl_getHomeDirectory( pThis->_pFileView->GetViewURL(), aFileName ) )
1061*b1cdbd2cSJim Jagielski 					// in case we got a home dir, reset the text of the edit
1062*b1cdbd2cSJim Jagielski 					pThis->_pImp->_pEdFileName->SetText( String() );
1063*b1cdbd2cSJim Jagielski 			}
1064*b1cdbd2cSJim Jagielski 			if ( !aFileName.Len() )
1065*b1cdbd2cSJim Jagielski #endif
1066*b1cdbd2cSJim Jagielski 			{
1067*b1cdbd2cSJim Jagielski 				// get url from autocomplete edit
1068*b1cdbd2cSJim Jagielski         		aFileName = pThis->_pImp->_pEdFileName->GetURL();
1069*b1cdbd2cSJim Jagielski 			}
1070*b1cdbd2cSJim Jagielski 		}
1071*b1cdbd2cSJim Jagielski 		else if ( pVoid == pThis->_pImp->_pBtnFileOpen )
1072*b1cdbd2cSJim Jagielski 			// OpenHdl was called for the "Open" Button; if edit field is empty, use selected element in the view
1073*b1cdbd2cSJim Jagielski 			aFileName = pThis->_pFileView->GetCurrentURL();
1074*b1cdbd2cSJim Jagielski 	}
1075*b1cdbd2cSJim Jagielski 
1076*b1cdbd2cSJim Jagielski 	// MBA->PB: ?!
1077*b1cdbd2cSJim Jagielski 	if ( !aFileName.Len() && pVoid == pThis->_pImp->_pEdFileName && pThis->_pImp->_pUserFilter )
1078*b1cdbd2cSJim Jagielski 	{
1079*b1cdbd2cSJim Jagielski 		DELETEZ( pThis->_pImp->_pUserFilter );
1080*b1cdbd2cSJim Jagielski 		return 0;
1081*b1cdbd2cSJim Jagielski 	}
1082*b1cdbd2cSJim Jagielski 
1083*b1cdbd2cSJim Jagielski 	sal_uInt16 nLen = aFileName.Len();
1084*b1cdbd2cSJim Jagielski 	if ( !nLen )
1085*b1cdbd2cSJim Jagielski 	{
1086*b1cdbd2cSJim Jagielski 		// if the dialog was opened to select a folder, the last selected folder should be selected
1087*b1cdbd2cSJim Jagielski 		if( pThis->_pImp->_eDlgType == FILEDLG_TYPE_PATHDLG )
1088*b1cdbd2cSJim Jagielski 		{
1089*b1cdbd2cSJim Jagielski 			aFileName =	pThis->_pImp->_pFtCurrentPath->GetText();
1090*b1cdbd2cSJim Jagielski 			nLen = aFileName.Len();
1091*b1cdbd2cSJim Jagielski 		}
1092*b1cdbd2cSJim Jagielski 		else
1093*b1cdbd2cSJim Jagielski 			// no file selected !
1094*b1cdbd2cSJim Jagielski 			return 0;
1095*b1cdbd2cSJim Jagielski 	}
1096*b1cdbd2cSJim Jagielski 
1097*b1cdbd2cSJim Jagielski 	// mark input as selected
1098*b1cdbd2cSJim Jagielski 	pThis->_pImp->_pEdFileName->SetSelection( Selection( 0, nLen ) );
1099*b1cdbd2cSJim Jagielski 
1100*b1cdbd2cSJim Jagielski 	// if a path with wildcards is given, divide the string into path and wildcards
1101*b1cdbd2cSJim Jagielski 	String aFilter;
1102*b1cdbd2cSJim Jagielski 	if ( !pThis->IsolateFilterFromPath_Impl( aFileName, aFilter ) )
1103*b1cdbd2cSJim Jagielski 		return 0;
1104*b1cdbd2cSJim Jagielski 
1105*b1cdbd2cSJim Jagielski 	// if a filter was retrieved, there were wildcards !
1106*b1cdbd2cSJim Jagielski 	sal_uInt16 nNewFilterFlags = pThis->adjustFilter( aFilter );
1107*b1cdbd2cSJim Jagielski 	if ( nNewFilterFlags & FLT_CHANGED )
1108*b1cdbd2cSJim Jagielski 	{
1109*b1cdbd2cSJim Jagielski 		// cut off all text before wildcard in edit and select wildcard
1110*b1cdbd2cSJim Jagielski 		pThis->_pImp->_pEdFileName->SetText( aFilter );
1111*b1cdbd2cSJim Jagielski 		pThis->_pImp->_pEdFileName->SetSelection( Selection( 0, aFilter.Len() ) );
1112*b1cdbd2cSJim Jagielski 	}
1113*b1cdbd2cSJim Jagielski 
1114*b1cdbd2cSJim Jagielski     {
1115*b1cdbd2cSJim Jagielski 	    INetURLObject aFileObject( aFileName );
1116*b1cdbd2cSJim Jagielski 	    if ( ( aFileObject.GetProtocol() == INET_PROT_NOT_VALID ) && aFileName.Len() )
1117*b1cdbd2cSJim Jagielski 	    {
1118*b1cdbd2cSJim Jagielski 		    String sCompleted = SvtURLBox::ParseSmart( aFileName, pThis->_pFileView->GetViewURL(), SvtPathOptions().GetWorkPath() );
1119*b1cdbd2cSJim Jagielski 		    if ( sCompleted.Len() )
1120*b1cdbd2cSJim Jagielski 			    aFileName = sCompleted;
1121*b1cdbd2cSJim Jagielski 	    }
1122*b1cdbd2cSJim Jagielski     }
1123*b1cdbd2cSJim Jagielski 
1124*b1cdbd2cSJim Jagielski 	// Pr"ufen, ob es sich um einen Ordner handelt.
1125*b1cdbd2cSJim Jagielski     sal_Bool bIsFolder = sal_False;
1126*b1cdbd2cSJim Jagielski 
1127*b1cdbd2cSJim Jagielski     // first thing before doing anyhing with the content: Reset it. When the user presses "open" (or "save" or "export",
1128*b1cdbd2cSJim Jagielski     // for that matter), s/he wants the complete handling, including all possible error messages, even if s/he
1129*b1cdbd2cSJim Jagielski     // does the same thing for the same content twice, s/he wants both fails to be displayed.
1130*b1cdbd2cSJim Jagielski     // Without the reset, it could be that the content cached all relevant information, and will not display any
1131*b1cdbd2cSJim Jagielski     // error messages for the same content a second time ....
1132*b1cdbd2cSJim Jagielski     pThis->m_aContent.bindTo( ::rtl::OUString( ) );
1133*b1cdbd2cSJim Jagielski 
1134*b1cdbd2cSJim Jagielski     // #97148# & #102204# ---------
1135*b1cdbd2cSJim Jagielski 	if ( aFileName.Len() )
1136*b1cdbd2cSJim Jagielski 	{
1137*b1cdbd2cSJim Jagielski         // Make sure we have own Interaction Handler in place. We do not need
1138*b1cdbd2cSJim Jagielski         // to intercept interactions here, but to record the fact that there
1139*b1cdbd2cSJim Jagielski         // was an interaction.
1140*b1cdbd2cSJim Jagielski         SmartContent::InteractionHandlerType eInterActionHandlerType
1141*b1cdbd2cSJim Jagielski             = pThis->m_aContent.queryCurrentInteractionHandler();
1142*b1cdbd2cSJim Jagielski         if ( ( eInterActionHandlerType == SmartContent::IHT_NONE ) ||
1143*b1cdbd2cSJim Jagielski              ( eInterActionHandlerType == SmartContent::IHT_DEFAULT ) )
1144*b1cdbd2cSJim Jagielski             pThis->m_aContent.enableOwnInteractionHandler(
1145*b1cdbd2cSJim Jagielski                 OFilePickerInteractionHandler::E_NOINTERCEPTION );
1146*b1cdbd2cSJim Jagielski 
1147*b1cdbd2cSJim Jagielski 		bIsFolder = pThis->m_aContent.isFolder( aFileName );
1148*b1cdbd2cSJim Jagielski 
1149*b1cdbd2cSJim Jagielski         // access denied to the given resource - and interaction was already
1150*b1cdbd2cSJim Jagielski         // used => break following operations
1151*b1cdbd2cSJim Jagielski         OFilePickerInteractionHandler* pHandler
1152*b1cdbd2cSJim Jagielski             = pThis->m_aContent.getOwnInteractionHandler();
1153*b1cdbd2cSJim Jagielski 
1154*b1cdbd2cSJim Jagielski         OSL_ENSURE( pHandler, "Got no Interaction Handler!!!" );
1155*b1cdbd2cSJim Jagielski 
1156*b1cdbd2cSJim Jagielski         if ( pHandler->wasAccessDenied() )
1157*b1cdbd2cSJim Jagielski             return 0;
1158*b1cdbd2cSJim Jagielski 
1159*b1cdbd2cSJim Jagielski 		if ( pThis->m_aContent.isInvalid() &&
1160*b1cdbd2cSJim Jagielski              ( pThis->_pImp->_eMode == FILEDLG_MODE_OPEN ) )
1161*b1cdbd2cSJim Jagielski         {
1162*b1cdbd2cSJim Jagielski             if ( !pHandler->wasUsed() )
1163*b1cdbd2cSJim Jagielski                 ErrorHandler::HandleError( ERRCODE_IO_NOTEXISTS );
1164*b1cdbd2cSJim Jagielski 
1165*b1cdbd2cSJim Jagielski 			return 0;
1166*b1cdbd2cSJim Jagielski         }
1167*b1cdbd2cSJim Jagielski 
1168*b1cdbd2cSJim Jagielski         // restore previous Interaction Handler
1169*b1cdbd2cSJim Jagielski         if ( eInterActionHandlerType == SmartContent::IHT_NONE )
1170*b1cdbd2cSJim Jagielski             pThis->m_aContent.disableInteractionHandler();
1171*b1cdbd2cSJim Jagielski         else if ( eInterActionHandlerType == SmartContent::IHT_DEFAULT )
1172*b1cdbd2cSJim Jagielski             pThis->m_aContent.enableDefaultInteractionHandler();
1173*b1cdbd2cSJim Jagielski  	}
1174*b1cdbd2cSJim Jagielski 
1175*b1cdbd2cSJim Jagielski     if  (   !bIsFolder                                      // no existent folder
1176*b1cdbd2cSJim Jagielski 		&&	pThis->_pImp->_pCbAutoExtension					// auto extension is enabled in general
1177*b1cdbd2cSJim Jagielski 		&&	pThis->_pImp->_pCbAutoExtension->IsChecked()	// auto extension is really to be used
1178*b1cdbd2cSJim Jagielski 		&&	pThis->GetDefaultExt().Len()					// there is a default extension
1179*b1cdbd2cSJim Jagielski 		&&	pThis->GetDefaultExt() != '*'					// the default extension is not "all"
1180*b1cdbd2cSJim Jagielski         && !(   FILEDLG_MODE_SAVE == pThis->_pImp->_eMode       // we're saving a file
1181*b1cdbd2cSJim Jagielski             &&  pThis->_pFileView->GetSelectionCount()          // there is a selected file in the file view -> it will later on
1182*b1cdbd2cSJim Jagielski             )                                                   //    (in SvtFileDialog::GetPathList) be taken as file to save to
1183*b1cdbd2cSJim Jagielski                                                                 // (#114818# - 2004-03-17 - fs@openoffice.org)
1184*b1cdbd2cSJim Jagielski         && FILEDLG_MODE_OPEN != pThis->_pImp->_eMode // pb: #i83408# don't append extension on open
1185*b1cdbd2cSJim Jagielski         )
1186*b1cdbd2cSJim Jagielski 	{
1187*b1cdbd2cSJim Jagielski         // check extension and append the default extension if necessary
1188*b1cdbd2cSJim Jagielski         appendDefaultExtension(aFileName,
1189*b1cdbd2cSJim Jagielski                                pThis->GetDefaultExt(),
1190*b1cdbd2cSJim Jagielski                                pThis->_pImp->GetCurFilter()->GetType());
1191*b1cdbd2cSJim Jagielski 	}
1192*b1cdbd2cSJim Jagielski 
1193*b1cdbd2cSJim Jagielski 	sal_Bool bOpenFolder = ( FILEDLG_TYPE_PATHDLG == pThis->_pImp->_eDlgType ) &&
1194*b1cdbd2cSJim Jagielski 					   !pThis->_pImp->_bDoubleClick && pVoid != pThis->_pImp->_pEdFileName;
1195*b1cdbd2cSJim Jagielski 	if ( bIsFolder )
1196*b1cdbd2cSJim Jagielski 	{
1197*b1cdbd2cSJim Jagielski 		if ( bOpenFolder )
1198*b1cdbd2cSJim Jagielski 		{
1199*b1cdbd2cSJim Jagielski 			pThis->_aPath = aFileName;
1200*b1cdbd2cSJim Jagielski 		}
1201*b1cdbd2cSJim Jagielski         else
1202*b1cdbd2cSJim Jagielski         {
1203*b1cdbd2cSJim Jagielski 		    if ( aFileName != pThis->_pFileView->GetViewURL() )
1204*b1cdbd2cSJim Jagielski 		    {
1205*b1cdbd2cSJim Jagielski                 if ( !pThis->m_aURLFilter.isUrlAllowed( aFileName ) )
1206*b1cdbd2cSJim Jagielski                 {
1207*b1cdbd2cSJim Jagielski                     pThis->simulateAccessDenied( aFileName );
1208*b1cdbd2cSJim Jagielski     			    return 0;
1209*b1cdbd2cSJim Jagielski                 }
1210*b1cdbd2cSJim Jagielski 
1211*b1cdbd2cSJim Jagielski                 pThis->OpenURL_Impl( aFileName );
1212*b1cdbd2cSJim Jagielski 		    }
1213*b1cdbd2cSJim Jagielski 		    else
1214*b1cdbd2cSJim Jagielski             {
1215*b1cdbd2cSJim Jagielski                 if ( nNewFilterFlags & FLT_CHANGED )
1216*b1cdbd2cSJim Jagielski                     pThis->ExecuteFilter();
1217*b1cdbd2cSJim Jagielski             }
1218*b1cdbd2cSJim Jagielski 
1219*b1cdbd2cSJim Jagielski             return 0;
1220*b1cdbd2cSJim Jagielski         }
1221*b1cdbd2cSJim Jagielski 	}
1222*b1cdbd2cSJim Jagielski     else if ( !( nNewFilterFlags & FLT_NONEMPTY ) )
1223*b1cdbd2cSJim Jagielski 	{
1224*b1cdbd2cSJim Jagielski 		// Ggf. URL speichern.
1225*b1cdbd2cSJim Jagielski         pThis->_aPath = aFileName;
1226*b1cdbd2cSJim Jagielski 	}
1227*b1cdbd2cSJim Jagielski 	else
1228*b1cdbd2cSJim Jagielski 	{
1229*b1cdbd2cSJim Jagielski 		// Ggf. neu filtern.
1230*b1cdbd2cSJim Jagielski 		if ( nNewFilterFlags & FLT_CHANGED )
1231*b1cdbd2cSJim Jagielski 			pThis->ExecuteFilter();
1232*b1cdbd2cSJim Jagielski 		return 0;
1233*b1cdbd2cSJim Jagielski 	}
1234*b1cdbd2cSJim Jagielski 
1235*b1cdbd2cSJim Jagielski     INetURLObject aFileObj( aFileName );
1236*b1cdbd2cSJim Jagielski     if ( aFileObj.HasError() )
1237*b1cdbd2cSJim Jagielski     {
1238*b1cdbd2cSJim Jagielski         ErrorHandler::HandleError( ERRCODE_IO_GENERAL );
1239*b1cdbd2cSJim Jagielski         return 0;
1240*b1cdbd2cSJim Jagielski     }
1241*b1cdbd2cSJim Jagielski 
1242*b1cdbd2cSJim Jagielski     // if restrictions for the allowed folders are in place, we need to do a check here
1243*b1cdbd2cSJim Jagielski     if ( !pThis->m_aURLFilter.isUrlAllowed( aFileObj.GetMainURL( INetURLObject::NO_DECODE ) ) )
1244*b1cdbd2cSJim Jagielski     {
1245*b1cdbd2cSJim Jagielski         pThis->simulateAccessDenied( aFileName );
1246*b1cdbd2cSJim Jagielski         return 0;
1247*b1cdbd2cSJim Jagielski     }
1248*b1cdbd2cSJim Jagielski 
1249*b1cdbd2cSJim Jagielski 	switch ( pThis->_pImp->_eMode )
1250*b1cdbd2cSJim Jagielski 	{
1251*b1cdbd2cSJim Jagielski 		case FILEDLG_MODE_SAVE:
1252*b1cdbd2cSJim Jagielski 		{
1253*b1cdbd2cSJim Jagielski 			if ( ::utl::UCBContentHelper::Exists( aFileObj.GetMainURL( INetURLObject::NO_DECODE ) ) )
1254*b1cdbd2cSJim Jagielski 			{
1255*b1cdbd2cSJim Jagielski 				QueryBox aBox( pThis, WB_YES_NO, SvtResId( STR_SVT_ALREADYEXISTOVERWRITE ) );
1256*b1cdbd2cSJim Jagielski 				if ( aBox.Execute() != RET_YES )
1257*b1cdbd2cSJim Jagielski 					return 0;
1258*b1cdbd2cSJim Jagielski 			}
1259*b1cdbd2cSJim Jagielski 			else
1260*b1cdbd2cSJim Jagielski 			{
1261*b1cdbd2cSJim Jagielski 				String aCurPath;
1262*b1cdbd2cSJim Jagielski 				if ( ::utl::LocalFileHelper::ConvertURLToSystemPath( aFileName, aCurPath ) )
1263*b1cdbd2cSJim Jagielski 				{
1264*b1cdbd2cSJim Jagielski 					// if content does not exist: at least its path must exist
1265*b1cdbd2cSJim Jagielski 					INetURLObject aPathObj = aFileObj;
1266*b1cdbd2cSJim Jagielski 					aPathObj.removeSegment();
1267*b1cdbd2cSJim Jagielski 					// #97148# & #102204# ------------
1268*b1cdbd2cSJim Jagielski 					sal_Bool bFolder = pThis->m_aContent.isFolder( aPathObj.GetMainURL( INetURLObject::NO_DECODE ) );
1269*b1cdbd2cSJim Jagielski 					if ( !bFolder )
1270*b1cdbd2cSJim Jagielski 					{
1271*b1cdbd2cSJim Jagielski 						ErrorHandler::HandleError( ERRCODE_IO_NOTEXISTSPATH );
1272*b1cdbd2cSJim Jagielski 						return 0;
1273*b1cdbd2cSJim Jagielski 					}
1274*b1cdbd2cSJim Jagielski 				}
1275*b1cdbd2cSJim Jagielski 			}
1276*b1cdbd2cSJim Jagielski 		}
1277*b1cdbd2cSJim Jagielski 		break;
1278*b1cdbd2cSJim Jagielski 
1279*b1cdbd2cSJim Jagielski 		case FILEDLG_MODE_OPEN:
1280*b1cdbd2cSJim Jagielski 		{
1281*b1cdbd2cSJim Jagielski 			// do an existence check herein, again
1282*b1cdbd2cSJim Jagielski 			// 16.11.2001 - 93107 - frank.schoenheit@sun.com
1283*b1cdbd2cSJim Jagielski 
1284*b1cdbd2cSJim Jagielski 			if ( INET_PROT_FILE == aFileObj.GetProtocol( ) )
1285*b1cdbd2cSJim Jagielski 			{
1286*b1cdbd2cSJim Jagielski 				sal_Bool bExists = sal_False;
1287*b1cdbd2cSJim Jagielski 				// #102204# --------------
1288*b1cdbd2cSJim Jagielski 				bExists = pThis->m_aContent.is( aFileObj.GetMainURL( INetURLObject::NO_DECODE ) );
1289*b1cdbd2cSJim Jagielski 
1290*b1cdbd2cSJim Jagielski 
1291*b1cdbd2cSJim Jagielski 				if ( !bExists )
1292*b1cdbd2cSJim Jagielski 				{
1293*b1cdbd2cSJim Jagielski 					String sError( SvtResId( RID_FILEOPEN_NOTEXISTENTFILE ) );
1294*b1cdbd2cSJim Jagielski 
1295*b1cdbd2cSJim Jagielski 					String sInvalidFile( aFileObj.GetMainURL( INetURLObject::DECODE_TO_IURI ) );
1296*b1cdbd2cSJim Jagielski 					if ( INET_PROT_FILE == aFileObj.GetProtocol() )
1297*b1cdbd2cSJim Jagielski 					{	// if it's a file URL, transform the URL into system notation
1298*b1cdbd2cSJim Jagielski 						::rtl::OUString sURL( sInvalidFile );
1299*b1cdbd2cSJim Jagielski 						::rtl::OUString sSystem;
1300*b1cdbd2cSJim Jagielski 						osl_getSystemPathFromFileURL( sURL.pData, &sSystem.pData );
1301*b1cdbd2cSJim Jagielski 						sInvalidFile = sSystem;
1302*b1cdbd2cSJim Jagielski 					}
1303*b1cdbd2cSJim Jagielski 					sError.SearchAndReplaceAscii( "$name$", sInvalidFile );
1304*b1cdbd2cSJim Jagielski 
1305*b1cdbd2cSJim Jagielski 					ErrorBox aError( pThis, WB_OK, sError );
1306*b1cdbd2cSJim Jagielski 					aError.Execute();
1307*b1cdbd2cSJim Jagielski 					return 0;
1308*b1cdbd2cSJim Jagielski 				}
1309*b1cdbd2cSJim Jagielski 			}
1310*b1cdbd2cSJim Jagielski 		}
1311*b1cdbd2cSJim Jagielski 		break;
1312*b1cdbd2cSJim Jagielski 
1313*b1cdbd2cSJim Jagielski 		default:
1314*b1cdbd2cSJim Jagielski 			DBG_ERROR("SvtFileDialog, OpenHdl_Impl: invalid mode!");
1315*b1cdbd2cSJim Jagielski 	}
1316*b1cdbd2cSJim Jagielski 
1317*b1cdbd2cSJim Jagielski 	// Interessenten benachrichtigen.
1318*b1cdbd2cSJim Jagielski 	long nRet;
1319*b1cdbd2cSJim Jagielski 
1320*b1cdbd2cSJim Jagielski 	if ( pThis->_aOKHdl.IsSet() )
1321*b1cdbd2cSJim Jagielski 		nRet = pThis->_aOKHdl.Call( pThis );
1322*b1cdbd2cSJim Jagielski 	else
1323*b1cdbd2cSJim Jagielski 		nRet = pThis->OK();
1324*b1cdbd2cSJim Jagielski 
1325*b1cdbd2cSJim Jagielski 	if ( nRet )
1326*b1cdbd2cSJim Jagielski 	{
1327*b1cdbd2cSJim Jagielski 		pThis->EndDialog( sal_True );
1328*b1cdbd2cSJim Jagielski 	}
1329*b1cdbd2cSJim Jagielski 
1330*b1cdbd2cSJim Jagielski 	return nRet;
1331*b1cdbd2cSJim Jagielski }
1332*b1cdbd2cSJim Jagielski 
1333*b1cdbd2cSJim Jagielski //*****************************************************************************
1334*b1cdbd2cSJim Jagielski 
EnableAutocompletion(sal_Bool _bEnable)1335*b1cdbd2cSJim Jagielski void SvtFileDialog::EnableAutocompletion( sal_Bool _bEnable )
1336*b1cdbd2cSJim Jagielski {
1337*b1cdbd2cSJim Jagielski     _pImp->_pEdFileName->EnableAutocompletion( _bEnable );
1338*b1cdbd2cSJim Jagielski }
1339*b1cdbd2cSJim Jagielski 
1340*b1cdbd2cSJim Jagielski //*****************************************************************************
1341*b1cdbd2cSJim Jagielski 
IMPL_STATIC_LINK(SvtFileDialog,FilterSelectHdl_Impl,ListBox *,pBox)1342*b1cdbd2cSJim Jagielski IMPL_STATIC_LINK( SvtFileDialog, FilterSelectHdl_Impl, ListBox*, pBox )
1343*b1cdbd2cSJim Jagielski {
1344*b1cdbd2cSJim Jagielski 	DBG_ASSERT( pBox, "SvtFileDialog:keine Instanz" );
1345*b1cdbd2cSJim Jagielski 
1346*b1cdbd2cSJim Jagielski 	// wurde der Handler vom Travel-Timer gefeuert?
1347*b1cdbd2cSJim Jagielski 	if ( pBox == (ListBox*)&pThis->_pImp->_aFilterTimer )
1348*b1cdbd2cSJim Jagielski 	{
1349*b1cdbd2cSJim Jagielski 		// Anzeige erneut filtern.
1350*b1cdbd2cSJim Jagielski 		pThis->ExecuteFilter();
1351*b1cdbd2cSJim Jagielski 		return 0;
1352*b1cdbd2cSJim Jagielski 	}
1353*b1cdbd2cSJim Jagielski 
1354*b1cdbd2cSJim Jagielski 	String sSelectedFilterDisplayName;
1355*b1cdbd2cSJim Jagielski 	SvtFileDialogFilter_Impl* pSelectedFilter = pThis->_pImp->GetSelectedFilterEntry( sSelectedFilterDisplayName );
1356*b1cdbd2cSJim Jagielski 	if ( !pSelectedFilter )
1357*b1cdbd2cSJim Jagielski 	{	// there is no current selection. This happens if for instance the user selects a group separator using
1358*b1cdbd2cSJim Jagielski 		// the keyboard, and then presses enter: When the selection happens, we immediately deselect the entry,
1359*b1cdbd2cSJim Jagielski 		// so in this situation there is no current selection.
1360*b1cdbd2cSJim Jagielski 		if ( restoreCurrentFilter( pThis->_pImp ) )
1361*b1cdbd2cSJim Jagielski 			pThis->ExecuteFilter();
1362*b1cdbd2cSJim Jagielski 	}
1363*b1cdbd2cSJim Jagielski 	else
1364*b1cdbd2cSJim Jagielski 	{
1365*b1cdbd2cSJim Jagielski 		if ( pSelectedFilter->isGroupSeparator() )
1366*b1cdbd2cSJim Jagielski 		{	// group separators can't be selected
1367*b1cdbd2cSJim Jagielski 			// return to the previously selected entry
1368*b1cdbd2cSJim Jagielski 			if ( pThis->_pImp->IsFilterListTravelSelect() )
1369*b1cdbd2cSJim Jagielski 			{
1370*b1cdbd2cSJim Jagielski 				pThis->_pImp->SetNoFilterListSelection( );
1371*b1cdbd2cSJim Jagielski 
1372*b1cdbd2cSJim Jagielski 				// stop the timer for executing the filter
1373*b1cdbd2cSJim Jagielski 				if ( pThis->_pImp->_aFilterTimer.IsActive() )
1374*b1cdbd2cSJim Jagielski 					pThis->_pImp->m_bNeedDelayedFilterExecute = sal_True;
1375*b1cdbd2cSJim Jagielski 				pThis->_pImp->_aFilterTimer.Stop();
1376*b1cdbd2cSJim Jagielski 			}
1377*b1cdbd2cSJim Jagielski 			else
1378*b1cdbd2cSJim Jagielski 			{
1379*b1cdbd2cSJim Jagielski 				if ( restoreCurrentFilter( pThis->_pImp ) )
1380*b1cdbd2cSJim Jagielski 					pThis->ExecuteFilter();
1381*b1cdbd2cSJim Jagielski 			}
1382*b1cdbd2cSJim Jagielski 		}
1383*b1cdbd2cSJim Jagielski 		else if	(	( pSelectedFilter != pThis->_pImp->GetCurFilter() )
1384*b1cdbd2cSJim Jagielski 				||	pThis->_pImp->_pUserFilter
1385*b1cdbd2cSJim Jagielski 				)
1386*b1cdbd2cSJim Jagielski 		{
1387*b1cdbd2cSJim Jagielski             // Store the old filter for the auto extension handling
1388*b1cdbd2cSJim Jagielski             String sLastFilterExt = pThis->_pImp->GetCurFilter()->GetExtension();
1389*b1cdbd2cSJim Jagielski 			DELETEZ( pThis->_pImp->_pUserFilter );
1390*b1cdbd2cSJim Jagielski 
1391*b1cdbd2cSJim Jagielski             // Ggf. Filter des Benutzers entfernen.
1392*b1cdbd2cSJim Jagielski 			pThis->_pImp->SetCurFilter( pSelectedFilter, sSelectedFilterDisplayName );
1393*b1cdbd2cSJim Jagielski 
1394*b1cdbd2cSJim Jagielski 			// Ggf. Endung anzeigen.
1395*b1cdbd2cSJim Jagielski             pThis->SetDefaultExt( pSelectedFilter->GetExtension() );
1396*b1cdbd2cSJim Jagielski 			sal_uInt16 nSepPos = pThis->GetDefaultExt().Search( FILEDIALOG_DEF_EXTSEP );
1397*b1cdbd2cSJim Jagielski 
1398*b1cdbd2cSJim Jagielski 			if ( nSepPos != STRING_NOTFOUND )
1399*b1cdbd2cSJim Jagielski 				pThis->EraseDefaultExt( nSepPos );
1400*b1cdbd2cSJim Jagielski 
1401*b1cdbd2cSJim Jagielski 			// update the extension of the current file if necessary
1402*b1cdbd2cSJim Jagielski             lcl_autoUpdateFileExtension( pThis, sLastFilterExt );
1403*b1cdbd2cSJim Jagielski 
1404*b1cdbd2cSJim Jagielski 			// wenn der Benutzer schnell durch die Filterbox
1405*b1cdbd2cSJim Jagielski 			// travelt, nicht sofort Filtern
1406*b1cdbd2cSJim Jagielski 			if ( pThis->_pImp->IsFilterListTravelSelect() )
1407*b1cdbd2cSJim Jagielski 			{
1408*b1cdbd2cSJim Jagielski 				// FilterSelectHdl_Impl soll in
1409*b1cdbd2cSJim Jagielski 				// TRAVELFILTER_TIMEOUT ms neu gefeuert werden
1410*b1cdbd2cSJim Jagielski 				pThis->_pImp->_aFilterTimer.Start();
1411*b1cdbd2cSJim Jagielski 			}
1412*b1cdbd2cSJim Jagielski 			else
1413*b1cdbd2cSJim Jagielski 			{
1414*b1cdbd2cSJim Jagielski 				// evtl. vorher gestarteten Timer stoppen
1415*b1cdbd2cSJim Jagielski 				pThis->_pImp->_aFilterTimer.Stop();
1416*b1cdbd2cSJim Jagielski 
1417*b1cdbd2cSJim Jagielski 				// Anzeige erneut filtern.
1418*b1cdbd2cSJim Jagielski 				pThis->ExecuteFilter();
1419*b1cdbd2cSJim Jagielski 			}
1420*b1cdbd2cSJim Jagielski 		}
1421*b1cdbd2cSJim Jagielski 	}
1422*b1cdbd2cSJim Jagielski 
1423*b1cdbd2cSJim Jagielski 	return 0;
1424*b1cdbd2cSJim Jagielski }
1425*b1cdbd2cSJim Jagielski 
1426*b1cdbd2cSJim Jagielski //*****************************************************************************
1427*b1cdbd2cSJim Jagielski 
IMPL_STATIC_LINK(SvtFileDialog,FileNameGetFocusHdl_Impl,void *,EMPTYARG)1428*b1cdbd2cSJim Jagielski IMPL_STATIC_LINK( SvtFileDialog, FileNameGetFocusHdl_Impl, void*, EMPTYARG )
1429*b1cdbd2cSJim Jagielski {
1430*b1cdbd2cSJim Jagielski 	pThis->_pFileView->SetNoSelection();
1431*b1cdbd2cSJim Jagielski 	pThis->_pFileView->Update();
1432*b1cdbd2cSJim Jagielski 	return 0;
1433*b1cdbd2cSJim Jagielski }
1434*b1cdbd2cSJim Jagielski 
1435*b1cdbd2cSJim Jagielski //*****************************************************************************
1436*b1cdbd2cSJim Jagielski 
IMPL_STATIC_LINK(SvtFileDialog,FileNameModifiedHdl_Impl,void *,EMPTYARG)1437*b1cdbd2cSJim Jagielski IMPL_STATIC_LINK( SvtFileDialog, FileNameModifiedHdl_Impl, void*, EMPTYARG )
1438*b1cdbd2cSJim Jagielski {
1439*b1cdbd2cSJim Jagielski 	FileNameGetFocusHdl_Impl( pThis, NULL );
1440*b1cdbd2cSJim Jagielski 	return 0;
1441*b1cdbd2cSJim Jagielski }
1442*b1cdbd2cSJim Jagielski 
1443*b1cdbd2cSJim Jagielski //*****************************************************************************
1444*b1cdbd2cSJim Jagielski 
FindFilter_Impl(const String & _rFilter,sal_Bool _bMultiExt,sal_Bool & _rFilterChanged)1445*b1cdbd2cSJim Jagielski SvtFileDialogFilter_Impl* SvtFileDialog::FindFilter_Impl
1446*b1cdbd2cSJim Jagielski (
1447*b1cdbd2cSJim Jagielski 	const String& _rFilter,
1448*b1cdbd2cSJim Jagielski 	sal_Bool _bMultiExt,/*	sal_True - auch Filter mit mehreren Endungen
1449*b1cdbd2cSJim Jagielski 							beruecksichtigen
1450*b1cdbd2cSJim Jagielski 							sal_False - keine ...
1451*b1cdbd2cSJim Jagielski 						*/
1452*b1cdbd2cSJim Jagielski 	sal_Bool& _rFilterChanged
1453*b1cdbd2cSJim Jagielski )
1454*b1cdbd2cSJim Jagielski 
1455*b1cdbd2cSJim Jagielski /*	[Beschreibung]
1456*b1cdbd2cSJim Jagielski 
1457*b1cdbd2cSJim Jagielski 	Die Methode sucht in den eingef"ugten Filtern nach der
1458*b1cdbd2cSJim Jagielski 	spezifizierten Endung.
1459*b1cdbd2cSJim Jagielski */
1460*b1cdbd2cSJim Jagielski 
1461*b1cdbd2cSJim Jagielski {
1462*b1cdbd2cSJim Jagielski 	SvtFileDialogFilter_Impl* pFoundFilter = NULL;
1463*b1cdbd2cSJim Jagielski 	SvtFileDialogFilterList_Impl* pList = _pImp->_pFilter;
1464*b1cdbd2cSJim Jagielski 	sal_uInt16 nFilter = pList->Count();
1465*b1cdbd2cSJim Jagielski 
1466*b1cdbd2cSJim Jagielski 	while ( nFilter-- )
1467*b1cdbd2cSJim Jagielski 	{
1468*b1cdbd2cSJim Jagielski 		SvtFileDialogFilter_Impl* pFilter = pList->GetObject( nFilter );
1469*b1cdbd2cSJim Jagielski 		const String& rType = pFilter->GetType();
1470*b1cdbd2cSJim Jagielski 		String aSingleType = rType;
1471*b1cdbd2cSJim Jagielski 
1472*b1cdbd2cSJim Jagielski 		if ( _bMultiExt )
1473*b1cdbd2cSJim Jagielski 		{
1474*b1cdbd2cSJim Jagielski 			sal_uInt16 nIdx = 0;
1475*b1cdbd2cSJim Jagielski 			while ( !pFoundFilter && nIdx != STRING_NOTFOUND )
1476*b1cdbd2cSJim Jagielski 			{
1477*b1cdbd2cSJim Jagielski 				aSingleType = rType.GetToken( 0, FILEDIALOG_DEF_EXTSEP, nIdx );
1478*b1cdbd2cSJim Jagielski #ifdef UNX
1479*b1cdbd2cSJim Jagielski 				if ( aSingleType.CompareTo( _rFilter ) == COMPARE_EQUAL )
1480*b1cdbd2cSJim Jagielski #else
1481*b1cdbd2cSJim Jagielski 				if ( aSingleType.CompareIgnoreCaseToAscii( _rFilter ) == COMPARE_EQUAL )
1482*b1cdbd2cSJim Jagielski #endif
1483*b1cdbd2cSJim Jagielski 					pFoundFilter = pFilter;
1484*b1cdbd2cSJim Jagielski 			}
1485*b1cdbd2cSJim Jagielski 		}
1486*b1cdbd2cSJim Jagielski #ifdef UNX
1487*b1cdbd2cSJim Jagielski 		else if ( rType.CompareTo( _rFilter ) == COMPARE_EQUAL )
1488*b1cdbd2cSJim Jagielski #else
1489*b1cdbd2cSJim Jagielski 		else if ( rType.CompareIgnoreCaseToAscii( _rFilter ) == COMPARE_EQUAL )
1490*b1cdbd2cSJim Jagielski #endif
1491*b1cdbd2cSJim Jagielski 			pFoundFilter = pFilter;
1492*b1cdbd2cSJim Jagielski 
1493*b1cdbd2cSJim Jagielski 		if ( pFoundFilter )
1494*b1cdbd2cSJim Jagielski 		{
1495*b1cdbd2cSJim Jagielski 			// Filter aktivieren.
1496*b1cdbd2cSJim Jagielski 			_rFilterChanged = _pImp->_pUserFilter || ( _pImp->GetCurFilter() != pFilter );
1497*b1cdbd2cSJim Jagielski 
1498*b1cdbd2cSJim Jagielski 			createNewUserFilter( _rFilter, sal_False );
1499*b1cdbd2cSJim Jagielski 
1500*b1cdbd2cSJim Jagielski 			break;
1501*b1cdbd2cSJim Jagielski 		}
1502*b1cdbd2cSJim Jagielski 	}
1503*b1cdbd2cSJim Jagielski 	return pFoundFilter;
1504*b1cdbd2cSJim Jagielski }
1505*b1cdbd2cSJim Jagielski 
1506*b1cdbd2cSJim Jagielski //*****************************************************************************
1507*b1cdbd2cSJim Jagielski 
ExecuteFilter()1508*b1cdbd2cSJim Jagielski void SvtFileDialog::ExecuteFilter()
1509*b1cdbd2cSJim Jagielski {
1510*b1cdbd2cSJim Jagielski 	_pImp->m_bNeedDelayedFilterExecute = sal_False;
1511*b1cdbd2cSJim Jagielski     executeAsync( AsyncPickerAction::eExecuteFilter, String(), getMostCurrentFilter( _pImp ) );
1512*b1cdbd2cSJim Jagielski }
1513*b1cdbd2cSJim Jagielski 
1514*b1cdbd2cSJim Jagielski //*****************************************************************************
1515*b1cdbd2cSJim Jagielski 
OpenMultiSelection_Impl()1516*b1cdbd2cSJim Jagielski void SvtFileDialog::OpenMultiSelection_Impl()
1517*b1cdbd2cSJim Jagielski 
1518*b1cdbd2cSJim Jagielski /*	[Beschreibung]
1519*b1cdbd2cSJim Jagielski 
1520*b1cdbd2cSJim Jagielski 	OpenHandler f"ur MultiSelektion
1521*b1cdbd2cSJim Jagielski */
1522*b1cdbd2cSJim Jagielski 
1523*b1cdbd2cSJim Jagielski {
1524*b1cdbd2cSJim Jagielski 	String aPath;
1525*b1cdbd2cSJim Jagielski 	sal_uLong nCount = _pFileView->GetSelectionCount();
1526*b1cdbd2cSJim Jagielski 	SvLBoxEntry* pEntry = nCount ? _pFileView->FirstSelected() : NULL;
1527*b1cdbd2cSJim Jagielski 
1528*b1cdbd2cSJim Jagielski 	if ( nCount && pEntry )
1529*b1cdbd2cSJim Jagielski 		_aPath = _pFileView->GetURL( pEntry );
1530*b1cdbd2cSJim Jagielski 
1531*b1cdbd2cSJim Jagielski 	// Interessenten benachrichtigen.
1532*b1cdbd2cSJim Jagielski 	long nRet;
1533*b1cdbd2cSJim Jagielski 
1534*b1cdbd2cSJim Jagielski 	if ( _aOKHdl.IsSet() )
1535*b1cdbd2cSJim Jagielski 		nRet = _aOKHdl.Call( this );
1536*b1cdbd2cSJim Jagielski 	else
1537*b1cdbd2cSJim Jagielski 		nRet = OK();
1538*b1cdbd2cSJim Jagielski 
1539*b1cdbd2cSJim Jagielski 	if ( nRet )
1540*b1cdbd2cSJim Jagielski 		EndDialog( sal_True );
1541*b1cdbd2cSJim Jagielski }
1542*b1cdbd2cSJim Jagielski 
1543*b1cdbd2cSJim Jagielski //*****************************************************************************
1544*b1cdbd2cSJim Jagielski 
UpdateControls(const String & rURL)1545*b1cdbd2cSJim Jagielski void SvtFileDialog::UpdateControls( const String& rURL )
1546*b1cdbd2cSJim Jagielski {
1547*b1cdbd2cSJim Jagielski    	_pImp->_pEdFileName->SetBaseURL( rURL );
1548*b1cdbd2cSJim Jagielski 
1549*b1cdbd2cSJim Jagielski 	INetURLObject aObj( rURL );
1550*b1cdbd2cSJim Jagielski 
1551*b1cdbd2cSJim Jagielski     //=========================================================================
1552*b1cdbd2cSJim Jagielski 	{
1553*b1cdbd2cSJim Jagielski 		String sText;
1554*b1cdbd2cSJim Jagielski 		DBG_ASSERT( INET_PROT_NOT_VALID != aObj.GetProtocol(), "SvtFileDialog::UpdateControls: Invalid URL!" );
1555*b1cdbd2cSJim Jagielski 
1556*b1cdbd2cSJim Jagielski 		if ( aObj.getSegmentCount() )
1557*b1cdbd2cSJim Jagielski 		{
1558*b1cdbd2cSJim Jagielski 			::utl::LocalFileHelper::ConvertURLToSystemPath( rURL, sText );
1559*b1cdbd2cSJim Jagielski 			if ( sText.Len() )
1560*b1cdbd2cSJim Jagielski 			{
1561*b1cdbd2cSJim Jagielski 				// no Fsys path for server file system ( only UCB has mountpoints! )
1562*b1cdbd2cSJim Jagielski 				if ( INET_PROT_FILE != aObj.GetProtocol() )
1563*b1cdbd2cSJim Jagielski                     sText = rURL.Copy( static_cast< sal_uInt16 >(
1564*b1cdbd2cSJim Jagielski                         INetURLObject::GetScheme( aObj.GetProtocol() ).getLength() ) );
1565*b1cdbd2cSJim Jagielski 			}
1566*b1cdbd2cSJim Jagielski 
1567*b1cdbd2cSJim Jagielski 			if ( !sText.Len() && aObj.getSegmentCount() )
1568*b1cdbd2cSJim Jagielski 				sText = rURL;
1569*b1cdbd2cSJim Jagielski 		}
1570*b1cdbd2cSJim Jagielski 
1571*b1cdbd2cSJim Jagielski 		// path mode ?
1572*b1cdbd2cSJim Jagielski 		if ( FILEDLG_TYPE_PATHDLG == _pImp->_eDlgType )
1573*b1cdbd2cSJim Jagielski 			// -> set new path in the edit field
1574*b1cdbd2cSJim Jagielski 			_pImp->_pEdFileName->SetText( sText );
1575*b1cdbd2cSJim Jagielski 
1576*b1cdbd2cSJim Jagielski 		// in the "current path" field, truncate the trailing slash
1577*b1cdbd2cSJim Jagielski 		if ( aObj.hasFinalSlash() )
1578*b1cdbd2cSJim Jagielski 		{
1579*b1cdbd2cSJim Jagielski 			aObj.removeFinalSlash();
1580*b1cdbd2cSJim Jagielski 			String sURL( aObj.GetMainURL( INetURLObject::NO_DECODE ) );
1581*b1cdbd2cSJim Jagielski 			if ( !::utl::LocalFileHelper::ConvertURLToSystemPath( sURL, sText ) )
1582*b1cdbd2cSJim Jagielski 				sText = sURL;
1583*b1cdbd2cSJim Jagielski 		}
1584*b1cdbd2cSJim Jagielski 
1585*b1cdbd2cSJim Jagielski         if ( !sText.Len() && rURL.Len() )
1586*b1cdbd2cSJim Jagielski             // happens, for instance, for URLs which the INetURLObject does not know to belong to a hierarchical scheme
1587*b1cdbd2cSJim Jagielski             sText = rURL;
1588*b1cdbd2cSJim Jagielski 		_pImp->_pFtCurrentPath->SetText( sText );
1589*b1cdbd2cSJim Jagielski 	}
1590*b1cdbd2cSJim Jagielski 
1591*b1cdbd2cSJim Jagielski     //=========================================================================
1592*b1cdbd2cSJim Jagielski     _aPath = rURL;
1593*b1cdbd2cSJim Jagielski     if ( _pFileNotifier )
1594*b1cdbd2cSJim Jagielski 		_pFileNotifier->notify( DIRECTORY_CHANGED, 0 );
1595*b1cdbd2cSJim Jagielski }
1596*b1cdbd2cSJim Jagielski 
1597*b1cdbd2cSJim Jagielski //*****************************************************************************
1598*b1cdbd2cSJim Jagielski 
IMPL_LINK(SvtFileDialog,SelectHdl_Impl,SvTabListBox *,pBox)1599*b1cdbd2cSJim Jagielski IMPL_LINK( SvtFileDialog, SelectHdl_Impl, SvTabListBox*, pBox )
1600*b1cdbd2cSJim Jagielski {
1601*b1cdbd2cSJim Jagielski 	SvLBoxEntry* pEntry = pBox->FirstSelected();
1602*b1cdbd2cSJim Jagielski 	DBG_ASSERT( pEntry, "SelectHandler without selected entry" );
1603*b1cdbd2cSJim Jagielski 	SvtContentEntry* pUserData = (SvtContentEntry*)pEntry->GetUserData();
1604*b1cdbd2cSJim Jagielski 
1605*b1cdbd2cSJim Jagielski 	if ( pUserData )
1606*b1cdbd2cSJim Jagielski 	{
1607*b1cdbd2cSJim Jagielski 		INetURLObject aObj( pUserData->maURL );
1608*b1cdbd2cSJim Jagielski 		if ( FILEDLG_TYPE_PATHDLG == _pImp->_eDlgType )
1609*b1cdbd2cSJim Jagielski 		{
1610*b1cdbd2cSJim Jagielski 			if ( aObj.GetProtocol() == INET_PROT_FILE )
1611*b1cdbd2cSJim Jagielski 			{
1612*b1cdbd2cSJim Jagielski 				if ( !pUserData->mbIsFolder )
1613*b1cdbd2cSJim Jagielski 					aObj.removeSegment();
1614*b1cdbd2cSJim Jagielski 				String aName = aObj.getFSysPath( (INetURLObject::FSysStyle)(INetURLObject::FSYS_DETECT & ~INetURLObject::FSYS_VOS) );
1615*b1cdbd2cSJim Jagielski 				_pImp->_pEdFileName->SetText( aName );
1616*b1cdbd2cSJim Jagielski 				_pImp->_pEdFileName->SetSelection( Selection( 0, aName.Len() ) );
1617*b1cdbd2cSJim Jagielski 				_aPath = pUserData->maURL;
1618*b1cdbd2cSJim Jagielski 			}
1619*b1cdbd2cSJim Jagielski 			else if ( !pUserData->mbIsFolder )
1620*b1cdbd2cSJim Jagielski 			{
1621*b1cdbd2cSJim Jagielski 				_pImp->_pEdFileName->SetText( pUserData->maURL );
1622*b1cdbd2cSJim Jagielski 				_pImp->_pEdFileName->SetSelection( Selection( 0, pUserData->maURL.Len() ) );
1623*b1cdbd2cSJim Jagielski 				_aPath = pUserData->maURL;
1624*b1cdbd2cSJim Jagielski 			}
1625*b1cdbd2cSJim Jagielski 			else
1626*b1cdbd2cSJim Jagielski 				_pImp->_pEdFileName->SetText( UniString() );
1627*b1cdbd2cSJim Jagielski 		}
1628*b1cdbd2cSJim Jagielski 		else
1629*b1cdbd2cSJim Jagielski 		{
1630*b1cdbd2cSJim Jagielski 			if ( !pUserData->mbIsFolder )
1631*b1cdbd2cSJim Jagielski 			{
1632*b1cdbd2cSJim Jagielski 				String aName = pBox->GetEntryText( pEntry, 0 );
1633*b1cdbd2cSJim Jagielski 				_pImp->_pEdFileName->SetText( aName );
1634*b1cdbd2cSJim Jagielski 				_pImp->_pEdFileName->SetSelection( Selection( 0, aName.Len() ) );
1635*b1cdbd2cSJim Jagielski 				_aPath = pUserData->maURL;
1636*b1cdbd2cSJim Jagielski 			}
1637*b1cdbd2cSJim Jagielski 		}
1638*b1cdbd2cSJim Jagielski 	}
1639*b1cdbd2cSJim Jagielski 
1640*b1cdbd2cSJim Jagielski 	if ( _pImp->_bMultiSelection && _pFileView->GetSelectionCount() > 1 )
1641*b1cdbd2cSJim Jagielski 	{
1642*b1cdbd2cSJim Jagielski 		// bei Multiselektion den Datei-Edit leeren
1643*b1cdbd2cSJim Jagielski 		_pImp->_pEdFileName->SetText( String() );
1644*b1cdbd2cSJim Jagielski 	}
1645*b1cdbd2cSJim Jagielski 
1646*b1cdbd2cSJim Jagielski 	FileSelect();
1647*b1cdbd2cSJim Jagielski 
1648*b1cdbd2cSJim Jagielski 	return 0;
1649*b1cdbd2cSJim Jagielski }
1650*b1cdbd2cSJim Jagielski 
1651*b1cdbd2cSJim Jagielski //*****************************************************************************
1652*b1cdbd2cSJim Jagielski 
IMPL_LINK(SvtFileDialog,DblClickHdl_Impl,SvTabListBox *,EMPTYARG)1653*b1cdbd2cSJim Jagielski IMPL_LINK( SvtFileDialog, DblClickHdl_Impl, SvTabListBox*, EMPTYARG )
1654*b1cdbd2cSJim Jagielski {
1655*b1cdbd2cSJim Jagielski 	_pImp->_bDoubleClick = sal_True;
1656*b1cdbd2cSJim Jagielski 	OpenHdl_Impl( this, NULL );
1657*b1cdbd2cSJim Jagielski 	_pImp->_bDoubleClick = sal_False;
1658*b1cdbd2cSJim Jagielski 
1659*b1cdbd2cSJim Jagielski 	return 0;
1660*b1cdbd2cSJim Jagielski }
1661*b1cdbd2cSJim Jagielski 
1662*b1cdbd2cSJim Jagielski //*****************************************************************************
1663*b1cdbd2cSJim Jagielski 
IMPL_LINK(SvtFileDialog,EntrySelectHdl_Impl,ComboBox *,EMPTYARG)1664*b1cdbd2cSJim Jagielski IMPL_LINK( SvtFileDialog, EntrySelectHdl_Impl, ComboBox*, EMPTYARG )
1665*b1cdbd2cSJim Jagielski {
1666*b1cdbd2cSJim Jagielski 	FileSelect();
1667*b1cdbd2cSJim Jagielski 
1668*b1cdbd2cSJim Jagielski     return 0;
1669*b1cdbd2cSJim Jagielski }
1670*b1cdbd2cSJim Jagielski 
1671*b1cdbd2cSJim Jagielski //*****************************************************************************
1672*b1cdbd2cSJim Jagielski 
IMPL_LINK(SvtFileDialog,OpenDoneHdl_Impl,SvtFileView *,pView)1673*b1cdbd2cSJim Jagielski IMPL_LINK( SvtFileDialog, OpenDoneHdl_Impl, SvtFileView*, pView )
1674*b1cdbd2cSJim Jagielski {
1675*b1cdbd2cSJim Jagielski     String sCurrentFolder( pView->GetViewURL() );
1676*b1cdbd2cSJim Jagielski     // check if we can create new folders
1677*b1cdbd2cSJim Jagielski     EnableControl( _pImp->_pBtnNewFolder, ContentCanMakeFolder( sCurrentFolder ) && m_aURLFilter.isUrlAllowed( sCurrentFolder, false ) );
1678*b1cdbd2cSJim Jagielski 
1679*b1cdbd2cSJim Jagielski     // check if we can travel one level up
1680*b1cdbd2cSJim Jagielski     bool bCanTravelUp = ContentHasParentFolder( pView->GetViewURL() );
1681*b1cdbd2cSJim Jagielski     if ( bCanTravelUp )
1682*b1cdbd2cSJim Jagielski     {
1683*b1cdbd2cSJim Jagielski         // additional check: the parent folder should not be prohibited
1684*b1cdbd2cSJim Jagielski         INetURLObject aCurrentFolder( sCurrentFolder );
1685*b1cdbd2cSJim Jagielski         DBG_ASSERT( INET_PROT_NOT_VALID != aCurrentFolder.GetProtocol(),
1686*b1cdbd2cSJim Jagielski             "SvtFileDialog::OpenDoneHdl_Impl: invalid current URL!" );
1687*b1cdbd2cSJim Jagielski 
1688*b1cdbd2cSJim Jagielski         aCurrentFolder.removeSegment();
1689*b1cdbd2cSJim Jagielski         bCanTravelUp &= m_aURLFilter.isUrlAllowed( aCurrentFolder.GetMainURL( INetURLObject::NO_DECODE ) );
1690*b1cdbd2cSJim Jagielski     }
1691*b1cdbd2cSJim Jagielski     EnableControl( _pImp->_pBtnUp, bCanTravelUp );
1692*b1cdbd2cSJim Jagielski 
1693*b1cdbd2cSJim Jagielski 	return 0;
1694*b1cdbd2cSJim Jagielski }
1695*b1cdbd2cSJim Jagielski 
1696*b1cdbd2cSJim Jagielski //*****************************************************************************
1697*b1cdbd2cSJim Jagielski 
IMPL_LINK(SvtFileDialog,AutoExtensionHdl_Impl,CheckBox *,EMPTYARG)1698*b1cdbd2cSJim Jagielski IMPL_LINK( SvtFileDialog, AutoExtensionHdl_Impl, CheckBox*, EMPTYARG )
1699*b1cdbd2cSJim Jagielski {
1700*b1cdbd2cSJim Jagielski 	if ( _pFileNotifier )
1701*b1cdbd2cSJim Jagielski 		_pFileNotifier->notify( CTRL_STATE_CHANGED,
1702*b1cdbd2cSJim Jagielski                                 CHECKBOX_AUTOEXTENSION );
1703*b1cdbd2cSJim Jagielski 
1704*b1cdbd2cSJim Jagielski 	// update the extension of the current file if necessary
1705*b1cdbd2cSJim Jagielski     lcl_autoUpdateFileExtension( this, _pImp->GetCurFilter()->GetExtension() );
1706*b1cdbd2cSJim Jagielski 
1707*b1cdbd2cSJim Jagielski     return 0;
1708*b1cdbd2cSJim Jagielski }
1709*b1cdbd2cSJim Jagielski 
1710*b1cdbd2cSJim Jagielski //*****************************************************************************
1711*b1cdbd2cSJim Jagielski 
IMPL_LINK(SvtFileDialog,ClickHdl_Impl,CheckBox *,pCheckBox)1712*b1cdbd2cSJim Jagielski IMPL_LINK( SvtFileDialog, ClickHdl_Impl, CheckBox*, pCheckBox )
1713*b1cdbd2cSJim Jagielski {
1714*b1cdbd2cSJim Jagielski     if ( ! _pFileNotifier )
1715*b1cdbd2cSJim Jagielski         return 0;
1716*b1cdbd2cSJim Jagielski 
1717*b1cdbd2cSJim Jagielski     sal_Int16 nId = -1;
1718*b1cdbd2cSJim Jagielski 
1719*b1cdbd2cSJim Jagielski     if ( pCheckBox == _pImp->_pCbOptions )
1720*b1cdbd2cSJim Jagielski         nId = CHECKBOX_FILTEROPTIONS;
1721*b1cdbd2cSJim Jagielski     else if ( pCheckBox == _pCbSelection )
1722*b1cdbd2cSJim Jagielski         nId = CHECKBOX_SELECTION;
1723*b1cdbd2cSJim Jagielski     else if ( pCheckBox == _pCbReadOnly )
1724*b1cdbd2cSJim Jagielski         nId = CHECKBOX_READONLY;
1725*b1cdbd2cSJim Jagielski     else if ( pCheckBox == _pImp->_pCbPassword )
1726*b1cdbd2cSJim Jagielski         nId = CHECKBOX_PASSWORD;
1727*b1cdbd2cSJim Jagielski     else if ( pCheckBox == _pCbLinkBox )
1728*b1cdbd2cSJim Jagielski         nId = CHECKBOX_LINK;
1729*b1cdbd2cSJim Jagielski     else if ( pCheckBox == _pCbPreviewBox )
1730*b1cdbd2cSJim Jagielski         nId = CHECKBOX_PREVIEW;
1731*b1cdbd2cSJim Jagielski 
1732*b1cdbd2cSJim Jagielski 	if ( nId != -1 )
1733*b1cdbd2cSJim Jagielski         _pFileNotifier->notify( CTRL_STATE_CHANGED, nId );
1734*b1cdbd2cSJim Jagielski 
1735*b1cdbd2cSJim Jagielski     return 0;
1736*b1cdbd2cSJim Jagielski }
1737*b1cdbd2cSJim Jagielski 
1738*b1cdbd2cSJim Jagielski //*****************************************************************************
1739*b1cdbd2cSJim Jagielski 
IMPL_LINK(SvtFileDialog,PlayButtonHdl_Impl,PushButton *,EMPTYARG)1740*b1cdbd2cSJim Jagielski IMPL_LINK( SvtFileDialog, PlayButtonHdl_Impl, PushButton*, EMPTYARG )
1741*b1cdbd2cSJim Jagielski {
1742*b1cdbd2cSJim Jagielski     if ( _pFileNotifier )
1743*b1cdbd2cSJim Jagielski         _pFileNotifier->notify( CTRL_STATE_CHANGED,
1744*b1cdbd2cSJim Jagielski                                 PUSHBUTTON_PLAY );
1745*b1cdbd2cSJim Jagielski 
1746*b1cdbd2cSJim Jagielski     return 0;
1747*b1cdbd2cSJim Jagielski }
1748*b1cdbd2cSJim Jagielski 
1749*b1cdbd2cSJim Jagielski //*****************************************************************************
1750*b1cdbd2cSJim Jagielski 
Notify(NotifyEvent & rNEvt)1751*b1cdbd2cSJim Jagielski long SvtFileDialog::Notify( NotifyEvent& rNEvt )
1752*b1cdbd2cSJim Jagielski 
1753*b1cdbd2cSJim Jagielski /*	[Beschreibung]
1754*b1cdbd2cSJim Jagielski 
1755*b1cdbd2cSJim Jagielski 	Die Methode wird gerufen, <BACKSPACE> abzufangen.
1756*b1cdbd2cSJim Jagielski */
1757*b1cdbd2cSJim Jagielski 
1758*b1cdbd2cSJim Jagielski {
1759*b1cdbd2cSJim Jagielski 	sal_uInt16 nType = rNEvt.GetType();
1760*b1cdbd2cSJim Jagielski 	long nRet = 0;
1761*b1cdbd2cSJim Jagielski 
1762*b1cdbd2cSJim Jagielski 	if ( EVENT_KEYINPUT == nType && rNEvt.GetKeyEvent() )
1763*b1cdbd2cSJim Jagielski 	{
1764*b1cdbd2cSJim Jagielski 		const KeyCode& rKeyCode = rNEvt.GetKeyEvent()->GetKeyCode();
1765*b1cdbd2cSJim Jagielski 		sal_uInt16 nCode = rKeyCode.GetCode();
1766*b1cdbd2cSJim Jagielski 
1767*b1cdbd2cSJim Jagielski 		if ( !rKeyCode.GetModifier() &&
1768*b1cdbd2cSJim Jagielski 			 KEY_BACKSPACE == nCode && !_pImp->_pEdFileName->HasChildPathFocus() )
1769*b1cdbd2cSJim Jagielski 		{
1770*b1cdbd2cSJim Jagielski 			nRet = 0; //! (long)_pFileView->DoBeamerKeyInput( *rNEvt.GetKeyEvent() );
1771*b1cdbd2cSJim Jagielski 
1772*b1cdbd2cSJim Jagielski 			if ( !nRet && _pImp->_pBtnUp->IsEnabled() )
1773*b1cdbd2cSJim Jagielski 			{
1774*b1cdbd2cSJim Jagielski 				PrevLevel_Impl();
1775*b1cdbd2cSJim Jagielski 				nRet = 1;
1776*b1cdbd2cSJim Jagielski 			}
1777*b1cdbd2cSJim Jagielski 		}
1778*b1cdbd2cSJim Jagielski //		else if ( rKeyCode.IsMod1() && ( KEY_C == nCode || KEY_V == nCode || KEY_X == nCode ) )
1779*b1cdbd2cSJim Jagielski //		{
1780*b1cdbd2cSJim Jagielski /* (mhu)
1781*b1cdbd2cSJim Jagielski 			String aVerb = KEY_C == nCode ? UniString(RTL_CONSTASCII_USTRINGPARAM(SVT_MENUPART_VERB_COPY)) :
1782*b1cdbd2cSJim Jagielski 				( KEY_V == nCode ? UniString(RTL_CONSTASCII_USTRINGPARAM(SVT_MENUPART_VERB_PASTE)) : UniString(RTL_CONSTASCII_USTRINGPARAM(SVT_MENUPART_VERB_CUT)) );
1783*b1cdbd2cSJim Jagielski //(dv)			if ( !CntPopupMenu::DoVerbCommand( aVerb, _pFileView->GetView() ) )
1784*b1cdbd2cSJim Jagielski //(dv)				Sound::Beep();
1785*b1cdbd2cSJim Jagielski */
1786*b1cdbd2cSJim Jagielski //		}
1787*b1cdbd2cSJim Jagielski 	}
1788*b1cdbd2cSJim Jagielski 	return nRet ? nRet : ModalDialog::Notify( rNEvt );
1789*b1cdbd2cSJim Jagielski }
1790*b1cdbd2cSJim Jagielski 
1791*b1cdbd2cSJim Jagielski //*****************************************************************************
1792*b1cdbd2cSJim Jagielski 
OK()1793*b1cdbd2cSJim Jagielski long SvtFileDialog::OK()
1794*b1cdbd2cSJim Jagielski {
1795*b1cdbd2cSJim Jagielski 	return sal_True;
1796*b1cdbd2cSJim Jagielski }
1797*b1cdbd2cSJim Jagielski 
1798*b1cdbd2cSJim Jagielski //*****************************************************************************
1799*b1cdbd2cSJim Jagielski 
1800*b1cdbd2cSJim Jagielski class SvtDefModalDialogParent_Impl
1801*b1cdbd2cSJim Jagielski {
1802*b1cdbd2cSJim Jagielski private:
1803*b1cdbd2cSJim Jagielski 	Window*	_pOld;
1804*b1cdbd2cSJim Jagielski 
1805*b1cdbd2cSJim Jagielski public:
SvtDefModalDialogParent_Impl(Window * pNew)1806*b1cdbd2cSJim Jagielski 	SvtDefModalDialogParent_Impl( Window *pNew ) :
1807*b1cdbd2cSJim Jagielski 		_pOld( Application::GetDefDialogParent() )
1808*b1cdbd2cSJim Jagielski 		{ Application::SetDefDialogParent( pNew ); }
1809*b1cdbd2cSJim Jagielski 
~SvtDefModalDialogParent_Impl()1810*b1cdbd2cSJim Jagielski 	~SvtDefModalDialogParent_Impl() { Application::SetDefDialogParent( _pOld ); }
1811*b1cdbd2cSJim Jagielski };
1812*b1cdbd2cSJim Jagielski 
1813*b1cdbd2cSJim Jagielski //*****************************************************************************
1814*b1cdbd2cSJim Jagielski 
1815*b1cdbd2cSJim Jagielski //---------------------------------------------------------------------
updateListboxLabelSizes()1816*b1cdbd2cSJim Jagielski void SvtFileDialog::updateListboxLabelSizes()
1817*b1cdbd2cSJim Jagielski {
1818*b1cdbd2cSJim Jagielski     sal_Int16 nLineControlId[5] = {
1819*b1cdbd2cSJim Jagielski         LISTBOX_VERSION, LISTBOX_TEMPLATE, LISTBOX_IMAGE_TEMPLATE, LISTBOX_FILTER, EDIT_FILEURL
1820*b1cdbd2cSJim Jagielski     };
1821*b1cdbd2cSJim Jagielski 
1822*b1cdbd2cSJim Jagielski     // determine the maximum width needed for the listbox labels
1823*b1cdbd2cSJim Jagielski     long nMaxWidth = 0;
1824*b1cdbd2cSJim Jagielski     for ( sal_Int32 i=0; i<5; ++i )
1825*b1cdbd2cSJim Jagielski     {
1826*b1cdbd2cSJim Jagielski         FixedText* pLabel = static_cast< FixedText* >( getControl( nLineControlId[i], sal_True ) );
1827*b1cdbd2cSJim Jagielski         if ( !pLabel )
1828*b1cdbd2cSJim Jagielski             continue;
1829*b1cdbd2cSJim Jagielski         nMaxWidth = ::std::max( pLabel->GetTextWidth( pLabel->GetText() ), nMaxWidth );
1830*b1cdbd2cSJim Jagielski     }
1831*b1cdbd2cSJim Jagielski 
1832*b1cdbd2cSJim Jagielski     // ensure that all labels are wide enough
1833*b1cdbd2cSJim Jagielski     for ( sal_Int32 i=0; i<5; ++i )
1834*b1cdbd2cSJim Jagielski     {
1835*b1cdbd2cSJim Jagielski         FixedText* pLabel = static_cast< FixedText* >( getControl( nLineControlId[i], sal_True ) );
1836*b1cdbd2cSJim Jagielski         ListBox* pListbox = static_cast< ListBox* >( getControl( nLineControlId[i], sal_False ) );
1837*b1cdbd2cSJim Jagielski         if ( !pLabel || !pListbox )
1838*b1cdbd2cSJim Jagielski             continue;
1839*b1cdbd2cSJim Jagielski         Size aCurrentSize( pLabel->GetSizePixel() );
1840*b1cdbd2cSJim Jagielski         if ( aCurrentSize.Width() >= nMaxWidth )
1841*b1cdbd2cSJim Jagielski             continue;
1842*b1cdbd2cSJim Jagielski 
1843*b1cdbd2cSJim Jagielski         long nChange = nMaxWidth - aCurrentSize.Width();
1844*b1cdbd2cSJim Jagielski         pLabel->SetSizePixel( Size( nMaxWidth, aCurrentSize.Height() ) );
1845*b1cdbd2cSJim Jagielski 
1846*b1cdbd2cSJim Jagielski         aCurrentSize = pListbox->GetSizePixel();
1847*b1cdbd2cSJim Jagielski         pListbox->SetSizePixel( Size( aCurrentSize.Width() - nChange, aCurrentSize.Height() ) );
1848*b1cdbd2cSJim Jagielski         lcl_MoveControl( pListbox, nChange, 0 );
1849*b1cdbd2cSJim Jagielski     }
1850*b1cdbd2cSJim Jagielski }
1851*b1cdbd2cSJim Jagielski 
1852*b1cdbd2cSJim Jagielski namespace
1853*b1cdbd2cSJim Jagielski {
1854*b1cdbd2cSJim Jagielski 
implIsInvalid(const String & rURL)1855*b1cdbd2cSJim Jagielski bool implIsInvalid( const String & rURL )
1856*b1cdbd2cSJim Jagielski {
1857*b1cdbd2cSJim Jagielski 	SmartContent aContent( rURL );
1858*b1cdbd2cSJim Jagielski 	aContent.enableOwnInteractionHandler( ::svt::OFilePickerInteractionHandler::E_DOESNOTEXIST );
1859*b1cdbd2cSJim Jagielski 	aContent.isFolder();	// do this _before_ asking isInvalid! Otherwise result might be wrong.
1860*b1cdbd2cSJim Jagielski 	return aContent.isInvalid();
1861*b1cdbd2cSJim Jagielski }
1862*b1cdbd2cSJim Jagielski 
1863*b1cdbd2cSJim Jagielski }
1864*b1cdbd2cSJim Jagielski 
1865*b1cdbd2cSJim Jagielski //---------------------------------------------------------------------
implGetInitialURL(const String & _rPath,const String & _rFallback)1866*b1cdbd2cSJim Jagielski String SvtFileDialog::implGetInitialURL( const String& _rPath, const String& _rFallback )
1867*b1cdbd2cSJim Jagielski {
1868*b1cdbd2cSJim Jagielski 	// an URL parser for the fallback
1869*b1cdbd2cSJim Jagielski 	INetURLObject aURLParser;
1870*b1cdbd2cSJim Jagielski 
1871*b1cdbd2cSJim Jagielski 	// set the path
1872*b1cdbd2cSJim Jagielski 	bool bWasAbsolute = sal_False;
1873*b1cdbd2cSJim Jagielski 	aURLParser = aURLParser.smartRel2Abs( _rPath, bWasAbsolute );
1874*b1cdbd2cSJim Jagielski 
1875*b1cdbd2cSJim Jagielski 	// is it a valid folder?
1876*b1cdbd2cSJim Jagielski 	m_aContent.bindTo( aURLParser.GetMainURL( INetURLObject::NO_DECODE ) );
1877*b1cdbd2cSJim Jagielski 	sal_Bool bIsFolder = m_aContent.isFolder( );	// do this _before_ asking isInvalid!
1878*b1cdbd2cSJim Jagielski 	sal_Bool bIsInvalid = m_aContent.isInvalid();
1879*b1cdbd2cSJim Jagielski 
1880*b1cdbd2cSJim Jagielski 	if ( bIsInvalid && m_bHasFilename && !aURLParser.hasFinalSlash() )
1881*b1cdbd2cSJim Jagielski 	{	// check if the parent folder exists
1882*b1cdbd2cSJim Jagielski 		// #108429# - 2003-03-26 - fs@openoffice.org
1883*b1cdbd2cSJim Jagielski 		INetURLObject aParent( aURLParser );
1884*b1cdbd2cSJim Jagielski 		aParent.removeSegment( );
1885*b1cdbd2cSJim Jagielski 		aParent.setFinalSlash( );
1886*b1cdbd2cSJim Jagielski 		bIsInvalid = implIsInvalid( aParent.GetMainURL( INetURLObject::NO_DECODE ) );
1887*b1cdbd2cSJim Jagielski 	}
1888*b1cdbd2cSJim Jagielski 
1889*b1cdbd2cSJim Jagielski 	if ( bIsInvalid )
1890*b1cdbd2cSJim Jagielski 	{
1891*b1cdbd2cSJim Jagielski 		INetURLObject aFallback( _rFallback );
1892*b1cdbd2cSJim Jagielski 		bIsInvalid = implIsInvalid( aFallback.GetMainURL( INetURLObject::NO_DECODE ) );
1893*b1cdbd2cSJim Jagielski 
1894*b1cdbd2cSJim Jagielski 	    if ( !bIsInvalid )
1895*b1cdbd2cSJim Jagielski 			aURLParser = aFallback;
1896*b1cdbd2cSJim Jagielski 	}
1897*b1cdbd2cSJim Jagielski 
1898*b1cdbd2cSJim Jagielski     if ( bIsInvalid )
1899*b1cdbd2cSJim Jagielski 	{
1900*b1cdbd2cSJim Jagielski 		INetURLObject aParent( aURLParser );
1901*b1cdbd2cSJim Jagielski 		while ( bIsInvalid && aParent.removeSegment() )
1902*b1cdbd2cSJim Jagielski 		{
1903*b1cdbd2cSJim Jagielski 			aParent.setFinalSlash( );
1904*b1cdbd2cSJim Jagielski 			bIsInvalid = implIsInvalid( aParent.GetMainURL( INetURLObject::NO_DECODE ) );
1905*b1cdbd2cSJim Jagielski 		}
1906*b1cdbd2cSJim Jagielski 
1907*b1cdbd2cSJim Jagielski 	    if ( !bIsInvalid )
1908*b1cdbd2cSJim Jagielski 			aURLParser = aParent;
1909*b1cdbd2cSJim Jagielski 	}
1910*b1cdbd2cSJim Jagielski 
1911*b1cdbd2cSJim Jagielski 	if ( !bIsInvalid && bIsFolder )
1912*b1cdbd2cSJim Jagielski 	{
1913*b1cdbd2cSJim Jagielski 		aURLParser.setFinalSlash();
1914*b1cdbd2cSJim Jagielski 	}
1915*b1cdbd2cSJim Jagielski 	return aURLParser.GetMainURL( INetURLObject::NO_DECODE );
1916*b1cdbd2cSJim Jagielski }
1917*b1cdbd2cSJim Jagielski 
1918*b1cdbd2cSJim Jagielski //---------------------------------------------------------------------
Execute()1919*b1cdbd2cSJim Jagielski short SvtFileDialog::Execute()
1920*b1cdbd2cSJim Jagielski {
1921*b1cdbd2cSJim Jagielski     if ( !PrepareExecute() )
1922*b1cdbd2cSJim Jagielski         return 0;
1923*b1cdbd2cSJim Jagielski 
1924*b1cdbd2cSJim Jagielski 	// Start des Dialogs.
1925*b1cdbd2cSJim Jagielski     _bIsInExecute = sal_True;
1926*b1cdbd2cSJim Jagielski 	short nResult = ModalDialog::Execute();
1927*b1cdbd2cSJim Jagielski     _bIsInExecute = sal_False;
1928*b1cdbd2cSJim Jagielski 
1929*b1cdbd2cSJim Jagielski     DBG_ASSERT( !m_pCurrentAsyncAction.is(), "SvtFilePicker::Execute: still running an async action!" );
1930*b1cdbd2cSJim Jagielski         // the dialog should not be cancellable while an async action is running - firs, the action
1931*b1cdbd2cSJim Jagielski         // needs to be cancelled
1932*b1cdbd2cSJim Jagielski 
1933*b1cdbd2cSJim Jagielski 	// letztes Verzeichnis merken
1934*b1cdbd2cSJim Jagielski 	if ( RET_OK == nResult )
1935*b1cdbd2cSJim Jagielski 	{
1936*b1cdbd2cSJim Jagielski 		INetURLObject aURL( _aPath );
1937*b1cdbd2cSJim Jagielski 		if ( aURL.GetProtocol() == INET_PROT_FILE )
1938*b1cdbd2cSJim Jagielski 		{
1939*b1cdbd2cSJim Jagielski 			// nur bei File-URL's und nicht bei virtuelle Folder
1940*b1cdbd2cSJim Jagielski 			// das ausgew"ahlte Verzeichnis merken
1941*b1cdbd2cSJim Jagielski 			sal_Int32 nLevel = aURL.getSegmentCount();
1942*b1cdbd2cSJim Jagielski 			// #97148# & #102204# ------
1943*b1cdbd2cSJim Jagielski 			sal_Bool bDir = m_aContent.isFolder( aURL.GetMainURL( INetURLObject::NO_DECODE ) );
1944*b1cdbd2cSJim Jagielski             // sal_Bool bClassPath = ( ( _pImp->_nStyle & SFXWB_CLASSPATH ) == SFXWB_CLASSPATH );
1945*b1cdbd2cSJim Jagielski 			if ( nLevel > 1 && ( FILEDLG_TYPE_FILEDLG == _pImp->_eDlgType || !bDir ) )
1946*b1cdbd2cSJim Jagielski 				aURL.removeSegment();
1947*b1cdbd2cSJim Jagielski 		}
1948*b1cdbd2cSJim Jagielski 	}
1949*b1cdbd2cSJim Jagielski 
1950*b1cdbd2cSJim Jagielski     return nResult;
1951*b1cdbd2cSJim Jagielski }
1952*b1cdbd2cSJim Jagielski 
1953*b1cdbd2cSJim Jagielski //---------------------------------------------------------------------
StartExecuteModal(const Link & rEndDialogHdl)1954*b1cdbd2cSJim Jagielski void SvtFileDialog::StartExecuteModal( const Link& rEndDialogHdl )
1955*b1cdbd2cSJim Jagielski {
1956*b1cdbd2cSJim Jagielski     PrepareExecute();
1957*b1cdbd2cSJim Jagielski 
1958*b1cdbd2cSJim Jagielski     // Start des Dialogs.
1959*b1cdbd2cSJim Jagielski //    _bIsInExecute = sal_True;
1960*b1cdbd2cSJim Jagielski     ModalDialog::StartExecuteModal( rEndDialogHdl );
1961*b1cdbd2cSJim Jagielski }
1962*b1cdbd2cSJim Jagielski 
1963*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
onAsyncOperationStarted()1964*b1cdbd2cSJim Jagielski void SvtFileDialog::onAsyncOperationStarted()
1965*b1cdbd2cSJim Jagielski {
1966*b1cdbd2cSJim Jagielski     EnableUI( sal_False );
1967*b1cdbd2cSJim Jagielski     // the cancel button must be always enabled
1968*b1cdbd2cSJim Jagielski     _pImp->_pBtnCancel->Enable( sal_True );
1969*b1cdbd2cSJim Jagielski     _pImp->_pBtnCancel->GrabFocus();
1970*b1cdbd2cSJim Jagielski }
1971*b1cdbd2cSJim Jagielski 
1972*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
onAsyncOperationFinished()1973*b1cdbd2cSJim Jagielski void SvtFileDialog::onAsyncOperationFinished()
1974*b1cdbd2cSJim Jagielski {
1975*b1cdbd2cSJim Jagielski     EnableUI( sal_True );
1976*b1cdbd2cSJim Jagielski     m_pCurrentAsyncAction = NULL;
1977*b1cdbd2cSJim Jagielski     if ( !m_bInExecuteAsync )
1978*b1cdbd2cSJim Jagielski         _pImp->_pEdFileName->GrabFocus();
1979*b1cdbd2cSJim Jagielski         // (if m_bInExecuteAsync is true, then the operation was finished within the minium wait time,
1980*b1cdbd2cSJim Jagielski         // and to the user, the operation appears to be synchronous)
1981*b1cdbd2cSJim Jagielski }
1982*b1cdbd2cSJim Jagielski 
1983*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------------
displayIOException(const String & _rURL,IOErrorCode _eCode)1984*b1cdbd2cSJim Jagielski void SvtFileDialog::displayIOException( const String& _rURL, IOErrorCode _eCode )
1985*b1cdbd2cSJim Jagielski {
1986*b1cdbd2cSJim Jagielski     try
1987*b1cdbd2cSJim Jagielski     {
1988*b1cdbd2cSJim Jagielski         // create make a human-readable string from the URL
1989*b1cdbd2cSJim Jagielski         String sDisplayPath( _rURL );
1990*b1cdbd2cSJim Jagielski         ::utl::LocalFileHelper::ConvertURLToSystemPath( _rURL, sDisplayPath );
1991*b1cdbd2cSJim Jagielski 
1992*b1cdbd2cSJim Jagielski         // build an own exception which tells "access denied"
1993*b1cdbd2cSJim Jagielski         InteractiveAugmentedIOException aException;
1994*b1cdbd2cSJim Jagielski         aException.Arguments.realloc( 2 );
1995*b1cdbd2cSJim Jagielski         aException.Arguments[ 0 ] <<= ::rtl::OUString( sDisplayPath );
1996*b1cdbd2cSJim Jagielski         aException.Arguments[ 1 ] <<= PropertyValue(
1997*b1cdbd2cSJim Jagielski             ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Uri" ) ),
1998*b1cdbd2cSJim Jagielski             -1, aException.Arguments[ 0 ], PropertyState_DIRECT_VALUE
1999*b1cdbd2cSJim Jagielski         );
2000*b1cdbd2cSJim Jagielski             // (formerly, it was sufficient to put the URL first parameter. Nowadays,
2001*b1cdbd2cSJim Jagielski             // the services expects the URL in a PropertyValue named "Uri" ...)
2002*b1cdbd2cSJim Jagielski         aException.Code = _eCode;
2003*b1cdbd2cSJim Jagielski         aException.Classification = InteractionClassification_ERROR;
2004*b1cdbd2cSJim Jagielski 
2005*b1cdbd2cSJim Jagielski         // let and interaction handler handle this exception
2006*b1cdbd2cSJim Jagielski         ::comphelper::OInteractionRequest* pRequest = NULL;
2007*b1cdbd2cSJim Jagielski         Reference< ::com::sun::star::task::XInteractionRequest > xRequest = pRequest =
2008*b1cdbd2cSJim Jagielski             new ::comphelper::OInteractionRequest( makeAny( aException ) );
2009*b1cdbd2cSJim Jagielski         pRequest->addContinuation( new ::comphelper::OInteractionAbort( ) );
2010*b1cdbd2cSJim Jagielski 
2011*b1cdbd2cSJim Jagielski         Reference< XInteractionHandler > xHandler(
2012*b1cdbd2cSJim Jagielski             ::comphelper::getProcessServiceFactory()->createInstance(
2013*b1cdbd2cSJim Jagielski                 ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.task.InteractionHandler") )
2014*b1cdbd2cSJim Jagielski             ),
2015*b1cdbd2cSJim Jagielski             UNO_QUERY
2016*b1cdbd2cSJim Jagielski         );
2017*b1cdbd2cSJim Jagielski         if ( xHandler.is() )
2018*b1cdbd2cSJim Jagielski             xHandler->handle( xRequest );
2019*b1cdbd2cSJim Jagielski     }
2020*b1cdbd2cSJim Jagielski     catch( const Exception& )
2021*b1cdbd2cSJim Jagielski     {
2022*b1cdbd2cSJim Jagielski         DBG_ERROR( "iodlg::displayIOException: caught an exception!" );
2023*b1cdbd2cSJim Jagielski     }
2024*b1cdbd2cSJim Jagielski }
2025*b1cdbd2cSJim Jagielski 
2026*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
EnableUI(sal_Bool _bEnable)2027*b1cdbd2cSJim Jagielski void SvtFileDialog::EnableUI( sal_Bool _bEnable )
2028*b1cdbd2cSJim Jagielski {
2029*b1cdbd2cSJim Jagielski     Enable( _bEnable );
2030*b1cdbd2cSJim Jagielski 
2031*b1cdbd2cSJim Jagielski     if ( _bEnable )
2032*b1cdbd2cSJim Jagielski     {
2033*b1cdbd2cSJim Jagielski         for ( ::std::set< Control* >::iterator aLoop = m_aDisabledControls.begin();
2034*b1cdbd2cSJim Jagielski               aLoop != m_aDisabledControls.end();
2035*b1cdbd2cSJim Jagielski               ++aLoop
2036*b1cdbd2cSJim Jagielski             )
2037*b1cdbd2cSJim Jagielski         {
2038*b1cdbd2cSJim Jagielski             (*aLoop)->Enable( sal_False );
2039*b1cdbd2cSJim Jagielski         }
2040*b1cdbd2cSJim Jagielski     }
2041*b1cdbd2cSJim Jagielski }
2042*b1cdbd2cSJim Jagielski 
2043*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
EnableControl(Control * _pControl,sal_Bool _bEnable)2044*b1cdbd2cSJim Jagielski void SvtFileDialog::EnableControl( Control* _pControl, sal_Bool _bEnable )
2045*b1cdbd2cSJim Jagielski {
2046*b1cdbd2cSJim Jagielski     if ( !_pControl )
2047*b1cdbd2cSJim Jagielski     {
2048*b1cdbd2cSJim Jagielski         DBG_ERRORFILE( "SvtFileDialog::EnableControl: invalid control!" );
2049*b1cdbd2cSJim Jagielski         return;
2050*b1cdbd2cSJim Jagielski     }
2051*b1cdbd2cSJim Jagielski 
2052*b1cdbd2cSJim Jagielski     _pControl->Enable( _bEnable );
2053*b1cdbd2cSJim Jagielski 
2054*b1cdbd2cSJim Jagielski     if ( _bEnable )
2055*b1cdbd2cSJim Jagielski     {
2056*b1cdbd2cSJim Jagielski         ::std::set< Control* >::iterator aPos = m_aDisabledControls.find( _pControl );
2057*b1cdbd2cSJim Jagielski         if ( m_aDisabledControls.end() != aPos )
2058*b1cdbd2cSJim Jagielski             m_aDisabledControls.erase( aPos );
2059*b1cdbd2cSJim Jagielski     }
2060*b1cdbd2cSJim Jagielski     else
2061*b1cdbd2cSJim Jagielski         m_aDisabledControls.insert( _pControl );
2062*b1cdbd2cSJim Jagielski }
2063*b1cdbd2cSJim Jagielski 
2064*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
2065*b1cdbd2cSJim Jagielski 
PrepareExecute()2066*b1cdbd2cSJim Jagielski short SvtFileDialog::PrepareExecute()
2067*b1cdbd2cSJim Jagielski {
2068*b1cdbd2cSJim Jagielski     rtl::OUString aEnvValue;
2069*b1cdbd2cSJim Jagielski     if ( getEnvironmentValue( "WorkDirMustContainRemovableMedia", aEnvValue ) &&
2070*b1cdbd2cSJim Jagielski          aEnvValue.equalsAscii( "1" ) )
2071*b1cdbd2cSJim Jagielski     {
2072*b1cdbd2cSJim Jagielski         try
2073*b1cdbd2cSJim Jagielski         {
2074*b1cdbd2cSJim Jagielski             INetURLObject aStdDir( GetStandardDir() );
2075*b1cdbd2cSJim Jagielski             ::ucbhelper::Content aCnt( rtl::OUString( aStdDir.GetMainURL(
2076*b1cdbd2cSJim Jagielski                                                     INetURLObject::NO_DECODE ) ),
2077*b1cdbd2cSJim Jagielski                                  Reference< XCommandEnvironment >() );
2078*b1cdbd2cSJim Jagielski             Sequence< rtl::OUString > aProps(2);
2079*b1cdbd2cSJim Jagielski             aProps[0] = rtl::OUString::createFromAscii( "IsVolume" );
2080*b1cdbd2cSJim Jagielski             aProps[1] = rtl::OUString::createFromAscii( "IsRemoveable" );
2081*b1cdbd2cSJim Jagielski 
2082*b1cdbd2cSJim Jagielski             Reference< XResultSet > xResultSet
2083*b1cdbd2cSJim Jagielski                 = aCnt.createCursor( aProps, ::ucbhelper::INCLUDE_FOLDERS_ONLY );
2084*b1cdbd2cSJim Jagielski             if ( xResultSet.is() )
2085*b1cdbd2cSJim Jagielski             {
2086*b1cdbd2cSJim Jagielski                 Reference< XRow > xRow( xResultSet, UNO_QUERY );
2087*b1cdbd2cSJim Jagielski 
2088*b1cdbd2cSJim Jagielski                 bool bEmpty = true;
2089*b1cdbd2cSJim Jagielski                 if ( !xResultSet->next() )
2090*b1cdbd2cSJim Jagielski                 {
2091*b1cdbd2cSJim Jagielski                     // folder is empty
2092*b1cdbd2cSJim Jagielski                     bEmpty = true;
2093*b1cdbd2cSJim Jagielski                 }
2094*b1cdbd2cSJim Jagielski                 else
2095*b1cdbd2cSJim Jagielski                 {
2096*b1cdbd2cSJim Jagielski // @@@ KSO 05/18/2006: support for removable media currently hardcoded/incomplete in OSL
2097*b1cdbd2cSJim Jagielski //
2098*b1cdbd2cSJim Jagielski //                    do
2099*b1cdbd2cSJim Jagielski //                    {
2100*b1cdbd2cSJim Jagielski //                        // check, whether child is a removable volume
2101*b1cdbd2cSJim Jagielski //                        if ( xRow->getBoolean( 1 ) && !xRow->wasNull() )
2102*b1cdbd2cSJim Jagielski //                        {
2103*b1cdbd2cSJim Jagielski //                            if ( xRow->getBoolean( 2 ) && !xRow->wasNull() )
2104*b1cdbd2cSJim Jagielski //                            {
2105*b1cdbd2cSJim Jagielski                                 bEmpty = false;
2106*b1cdbd2cSJim Jagielski //                                break;
2107*b1cdbd2cSJim Jagielski //                            }
2108*b1cdbd2cSJim Jagielski //                        }
2109*b1cdbd2cSJim Jagielski //                    }
2110*b1cdbd2cSJim Jagielski //                    while ( xResultSet->next() );
2111*b1cdbd2cSJim Jagielski                 }
2112*b1cdbd2cSJim Jagielski 
2113*b1cdbd2cSJim Jagielski                 if ( bEmpty )
2114*b1cdbd2cSJim Jagielski                 {
2115*b1cdbd2cSJim Jagielski                     ErrorBox aBox( this, WB_OK, SvtResId( STR_SVT_NOREMOVABLEDEVICE ) );
2116*b1cdbd2cSJim Jagielski                     aBox.Execute();
2117*b1cdbd2cSJim Jagielski                     return 0;
2118*b1cdbd2cSJim Jagielski                 }
2119*b1cdbd2cSJim Jagielski             }
2120*b1cdbd2cSJim Jagielski         }
2121*b1cdbd2cSJim Jagielski         catch ( ContentCreationException const & )
2122*b1cdbd2cSJim Jagielski         {
2123*b1cdbd2cSJim Jagielski         }
2124*b1cdbd2cSJim Jagielski         catch ( CommandAbortedException const & )
2125*b1cdbd2cSJim Jagielski         {
2126*b1cdbd2cSJim Jagielski         }
2127*b1cdbd2cSJim Jagielski     }
2128*b1cdbd2cSJim Jagielski 
2129*b1cdbd2cSJim Jagielski     // #102204# ---------------
2130*b1cdbd2cSJim Jagielski 	if ( ( _pImp->_nStyle & WB_SAVEAS ) && m_bHasFilename )
2131*b1cdbd2cSJim Jagielski 		// when doing a save-as, we do not want the handler to handle "this file does not exist" messages
2132*b1cdbd2cSJim Jagielski 		// - finally we're going to save that file, aren't we?
2133*b1cdbd2cSJim Jagielski 		// #105812# - 2002-12-02 - fs@openoffice.org
2134*b1cdbd2cSJim Jagielski         m_aContent.enableOwnInteractionHandler(::svt::OFilePickerInteractionHandler::E_DOESNOTEXIST);
2135*b1cdbd2cSJim Jagielski     else
2136*b1cdbd2cSJim Jagielski         m_aContent.enableDefaultInteractionHandler();
2137*b1cdbd2cSJim Jagielski 
2138*b1cdbd2cSJim Jagielski 	// #53016# evtl. nur ein Filename ohne Pfad?
2139*b1cdbd2cSJim Jagielski 	String aFileNameOnly;
2140*b1cdbd2cSJim Jagielski 	if( _aPath.Len() && (_pImp->_eMode == FILEDLG_MODE_SAVE)
2141*b1cdbd2cSJim Jagielski 					 && (_aPath.Search(':') == STRING_NOTFOUND)
2142*b1cdbd2cSJim Jagielski 					 && (_aPath.Search('\\') == STRING_NOTFOUND)
2143*b1cdbd2cSJim Jagielski 					 && (_aPath.Search('/') == STRING_NOTFOUND))
2144*b1cdbd2cSJim Jagielski 	{
2145*b1cdbd2cSJim Jagielski 		aFileNameOnly = _aPath;
2146*b1cdbd2cSJim Jagielski 		_aPath.Erase();
2147*b1cdbd2cSJim Jagielski 	}
2148*b1cdbd2cSJim Jagielski 
2149*b1cdbd2cSJim Jagielski 	// kein Startpfad angegeben?
2150*b1cdbd2cSJim Jagielski 	if ( !_aPath.Len() )
2151*b1cdbd2cSJim Jagielski 	{
2152*b1cdbd2cSJim Jagielski 		// dann das Standard-Dir verwenden
2153*b1cdbd2cSJim Jagielski 		_aPath = lcl_ensureFinalSlash( _pImp->GetStandardDir() );
2154*b1cdbd2cSJim Jagielski 
2155*b1cdbd2cSJim Jagielski 		// #53016# vorgegebener Dateiname an Pfad anh"angen
2156*b1cdbd2cSJim Jagielski 		if ( aFileNameOnly.Len() )
2157*b1cdbd2cSJim Jagielski 			_aPath += aFileNameOnly;
2158*b1cdbd2cSJim Jagielski 	}
2159*b1cdbd2cSJim Jagielski 
2160*b1cdbd2cSJim Jagielski 	//.....................................................................
2161*b1cdbd2cSJim Jagielski 	_aPath = implGetInitialURL( _aPath, GetStandardDir() );
2162*b1cdbd2cSJim Jagielski 
2163*b1cdbd2cSJim Jagielski 	if ( _pImp->_nStyle & WB_SAVEAS && !m_bHasFilename )
2164*b1cdbd2cSJim Jagielski 		// when doing a save-as, we do not want the handler to handle "this file does not exist" messages
2165*b1cdbd2cSJim Jagielski 		// - finally we're going to save that file, aren't we?
2166*b1cdbd2cSJim Jagielski         m_aContent.enableOwnInteractionHandler(::svt::OFilePickerInteractionHandler::E_DOESNOTEXIST);
2167*b1cdbd2cSJim Jagielski 
2168*b1cdbd2cSJim Jagielski 	//.....................................................................
2169*b1cdbd2cSJim Jagielski 	// care for possible restrictions on the paths we're allowed to show
2170*b1cdbd2cSJim Jagielski     if ( !m_aURLFilter.isUrlAllowed( _aPath ) )
2171*b1cdbd2cSJim Jagielski         _aPath = m_aURLFilter.getFilter()[0];
2172*b1cdbd2cSJim Jagielski 
2173*b1cdbd2cSJim Jagielski 	// Ggf. Filter anzeigen.
2174*b1cdbd2cSJim Jagielski 	_pImp->InitFilterList();
2175*b1cdbd2cSJim Jagielski 
2176*b1cdbd2cSJim Jagielski 	// Initialen Filter einstellen.
2177*b1cdbd2cSJim Jagielski 	sal_uInt16 nFilterCount = GetFilterCount();
2178*b1cdbd2cSJim Jagielski 	String aAll( SvtResId( STR_FILTERNAME_ALL ) );
2179*b1cdbd2cSJim Jagielski 	sal_Bool bHasAll = _pImp->HasFilterListEntry( aAll );
2180*b1cdbd2cSJim Jagielski 	if ( _pImp->GetCurFilter() || nFilterCount == 1 || ( nFilterCount == 2 && bHasAll ) )
2181*b1cdbd2cSJim Jagielski 	{
2182*b1cdbd2cSJim Jagielski 		// Ggf. einzigen Filter als aktuellen Filter setzen oder den einzigen
2183*b1cdbd2cSJim Jagielski 		// Filter, der nicht auf alle Dateien verweist.
2184*b1cdbd2cSJim Jagielski 		if ( !_pImp->GetCurFilter() )
2185*b1cdbd2cSJim Jagielski 		{
2186*b1cdbd2cSJim Jagielski 			sal_uInt16 nPos = 0;
2187*b1cdbd2cSJim Jagielski 			if ( 2 == nFilterCount && bHasAll )
2188*b1cdbd2cSJim Jagielski 			{
2189*b1cdbd2cSJim Jagielski 				nPos = nFilterCount;
2190*b1cdbd2cSJim Jagielski 				while ( nPos-- )
2191*b1cdbd2cSJim Jagielski 				{
2192*b1cdbd2cSJim Jagielski 					if ( GetFilterName( nPos ) != aAll )
2193*b1cdbd2cSJim Jagielski 						break;
2194*b1cdbd2cSJim Jagielski 				}
2195*b1cdbd2cSJim Jagielski 			}
2196*b1cdbd2cSJim Jagielski 			SvtFileDialogFilter_Impl* pNewCurFilter = _pImp->_pFilter->GetObject( nPos );
2197*b1cdbd2cSJim Jagielski 			DBG_ASSERT( pNewCurFilter, "SvtFileDialog::Execute: invalid filter pos!" );
2198*b1cdbd2cSJim Jagielski 			_pImp->SetCurFilter( pNewCurFilter, pNewCurFilter->GetName() );
2199*b1cdbd2cSJim Jagielski 		}
2200*b1cdbd2cSJim Jagielski 
2201*b1cdbd2cSJim Jagielski 		// Anzeige anpassen.
2202*b1cdbd2cSJim Jagielski 		_pImp->SelectFilterListEntry( _pImp->GetCurFilter()->GetName() );
2203*b1cdbd2cSJim Jagielski         SetDefaultExt( _pImp->GetCurFilter()->GetExtension() );
2204*b1cdbd2cSJim Jagielski 		sal_uInt16 nSepPos = GetDefaultExt().Search( FILEDIALOG_DEF_EXTSEP );
2205*b1cdbd2cSJim Jagielski 		if ( nSepPos != STRING_NOTFOUND )
2206*b1cdbd2cSJim Jagielski 			EraseDefaultExt( nSepPos );
2207*b1cdbd2cSJim Jagielski 	}
2208*b1cdbd2cSJim Jagielski 	else
2209*b1cdbd2cSJim Jagielski 	{
2210*b1cdbd2cSJim Jagielski 		// Ggf. Filter fuer alle Dateien setzen bzw. erzeugen.
2211*b1cdbd2cSJim Jagielski 		if ( !bHasAll )
2212*b1cdbd2cSJim Jagielski 		{
2213*b1cdbd2cSJim Jagielski 			SvtFileDialogFilter_Impl* pAllFilter = implAddFilter( aAll, UniString(RTL_CONSTASCII_USTRINGPARAM(FILEDIALOG_FILTER_ALL)) );
2214*b1cdbd2cSJim Jagielski 			_pImp->InsertFilterListEntry( pAllFilter );
2215*b1cdbd2cSJim Jagielski 			_pImp->SetCurFilter( pAllFilter, aAll );
2216*b1cdbd2cSJim Jagielski 		}
2217*b1cdbd2cSJim Jagielski 		_pImp->SelectFilterListEntry( aAll );
2218*b1cdbd2cSJim Jagielski 	}
2219*b1cdbd2cSJim Jagielski 
2220*b1cdbd2cSJim Jagielski 	_pImp->_pDefaultFilter = _pImp->GetCurFilter();
2221*b1cdbd2cSJim Jagielski 
2222*b1cdbd2cSJim Jagielski 	// HACK #50065#
2223*b1cdbd2cSJim Jagielski 	// ggf. Filter isolieren.
2224*b1cdbd2cSJim Jagielski 	String aFilter;
2225*b1cdbd2cSJim Jagielski 
2226*b1cdbd2cSJim Jagielski 	if ( !IsolateFilterFromPath_Impl( _aPath, aFilter ) )
2227*b1cdbd2cSJim Jagielski 		return 0;
2228*b1cdbd2cSJim Jagielski 
2229*b1cdbd2cSJim Jagielski 	sal_uInt16 nNewFilterFlags = adjustFilter( aFilter );
2230*b1cdbd2cSJim Jagielski 	if ( nNewFilterFlags & ( FLT_NONEMPTY | FLT_USERFILTER ) )
2231*b1cdbd2cSJim Jagielski 	{
2232*b1cdbd2cSJim Jagielski 		_pImp->_pEdFileName->SetText( aFilter );
2233*b1cdbd2cSJim Jagielski 	}
2234*b1cdbd2cSJim Jagielski 	// HACK #50065#
2235*b1cdbd2cSJim Jagielski 
2236*b1cdbd2cSJim Jagielski 	// Instanz fuer den gesetzten Pfad erzeugen und anzeigen.
2237*b1cdbd2cSJim Jagielski 	INetURLObject aFolderURL( _aPath );
2238*b1cdbd2cSJim Jagielski 	String aFileName( aFolderURL.getName( INetURLObject::LAST_SEGMENT, false ) );
2239*b1cdbd2cSJim Jagielski 	xub_StrLen nFileNameLen = aFileName.Len();
2240*b1cdbd2cSJim Jagielski 	bool bFileToSelect = nFileNameLen != 0;
2241*b1cdbd2cSJim Jagielski 	if ( bFileToSelect && aFileName.GetChar( nFileNameLen - 1 ) != INET_PATH_TOKEN )
2242*b1cdbd2cSJim Jagielski 	{
2243*b1cdbd2cSJim Jagielski 		_pImp->_pEdFileName->SetText( GET_DECODED_NAME( aFolderURL ) );
2244*b1cdbd2cSJim Jagielski 		aFolderURL.removeSegment();
2245*b1cdbd2cSJim Jagielski 	}
2246*b1cdbd2cSJim Jagielski 
2247*b1cdbd2cSJim Jagielski 	INetURLObject aObj = aFolderURL;
2248*b1cdbd2cSJim Jagielski 	if ( aObj.GetProtocol() == INET_PROT_FILE )
2249*b1cdbd2cSJim Jagielski 	{
2250*b1cdbd2cSJim Jagielski 		// Ordner als aktuelles Verzeichnis setzen.
2251*b1cdbd2cSJim Jagielski 		aObj.setFinalSlash();
2252*b1cdbd2cSJim Jagielski 	}
2253*b1cdbd2cSJim Jagielski 
2254*b1cdbd2cSJim Jagielski 	UpdateControls( aObj.GetMainURL( INetURLObject::NO_DECODE ) );
2255*b1cdbd2cSJim Jagielski 
2256*b1cdbd2cSJim Jagielski     // Somebody might want to enable some controls acording to the current filter
2257*b1cdbd2cSJim Jagielski     FilterSelect();
2258*b1cdbd2cSJim Jagielski 
2259*b1cdbd2cSJim Jagielski 	// Zustand der Steuerelemente anpassen.
2260*b1cdbd2cSJim Jagielski //	EndListeningAll();
2261*b1cdbd2cSJim Jagielski 
2262*b1cdbd2cSJim Jagielski     ViewHdl_Impl( this, NULL );
2263*b1cdbd2cSJim Jagielski     OpenURL_Impl( aObj.GetMainURL( INetURLObject::NO_DECODE ) );
2264*b1cdbd2cSJim Jagielski 
2265*b1cdbd2cSJim Jagielski 	_pFileView->Show();
2266*b1cdbd2cSJim Jagielski 	SvtDefModalDialogParent_Impl aDefParent( this );
2267*b1cdbd2cSJim Jagielski 
2268*b1cdbd2cSJim Jagielski 	// ggf. Gr"osse aus Ini lesen und setzen
2269*b1cdbd2cSJim Jagielski 	InitSize();
2270*b1cdbd2cSJim Jagielski 
2271*b1cdbd2cSJim Jagielski     return 1;
2272*b1cdbd2cSJim Jagielski }
2273*b1cdbd2cSJim Jagielski 
2274*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
implInitializeSpecialURLLists()2275*b1cdbd2cSJim Jagielski void SvtFileDialog::implInitializeSpecialURLLists( )
2276*b1cdbd2cSJim Jagielski {
2277*b1cdbd2cSJim Jagielski     m_aURLFilter = ::svt::RestrictedPaths();
2278*b1cdbd2cSJim Jagielski 
2279*b1cdbd2cSJim Jagielski     ::std::vector< String > aFavourites;
2280*b1cdbd2cSJim Jagielski     if ( m_aURLFilter.hasFilter() )
2281*b1cdbd2cSJim Jagielski     {
2282*b1cdbd2cSJim Jagielski         // if we have restrictions, then the "favourites" are the restricted folders only
2283*b1cdbd2cSJim Jagielski         aFavourites = m_aURLFilter.getFilter();
2284*b1cdbd2cSJim Jagielski         // for approved URLs, we needed the final slashes, for
2285*b1cdbd2cSJim Jagielski         // favourites, we do not want to have them
2286*b1cdbd2cSJim Jagielski         ::std::for_each( aFavourites.begin(), aFavourites.end(), RemoveFinalSlash() );
2287*b1cdbd2cSJim Jagielski     }
2288*b1cdbd2cSJim Jagielski     else
2289*b1cdbd2cSJim Jagielski     {
2290*b1cdbd2cSJim Jagielski         ::rtl::OUString sFavouritesList;
2291*b1cdbd2cSJim Jagielski         if ( getEnvironmentValue( "PathFavourites", sFavouritesList ) )
2292*b1cdbd2cSJim Jagielski             convertStringListToUrls( sFavouritesList, aFavourites, false );
2293*b1cdbd2cSJim Jagielski     }
2294*b1cdbd2cSJim Jagielski 
2295*b1cdbd2cSJim Jagielski     DBG_ASSERT( _pImp->_pBtnStandard, "SvtFileDialog::implInitializeSpecialURLLists: how this?" );
2296*b1cdbd2cSJim Jagielski     if ( _pImp->_pBtnStandard )
2297*b1cdbd2cSJim Jagielski         _pImp->_pBtnStandard->SetFavouriteLocations( aFavourites );
2298*b1cdbd2cSJim Jagielski }
2299*b1cdbd2cSJim Jagielski 
2300*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
executeAsync(::svt::AsyncPickerAction::Action _eAction,const String & _rURL,const String & _rFilter)2301*b1cdbd2cSJim Jagielski void SvtFileDialog::executeAsync( ::svt::AsyncPickerAction::Action _eAction,
2302*b1cdbd2cSJim Jagielski                                     const String& _rURL, const String& _rFilter )
2303*b1cdbd2cSJim Jagielski {
2304*b1cdbd2cSJim Jagielski     DBG_ASSERT( !m_pCurrentAsyncAction.is(), "SvtFileDialog::executeAsync: previous async action not yet finished!" );
2305*b1cdbd2cSJim Jagielski 
2306*b1cdbd2cSJim Jagielski     m_pCurrentAsyncAction = new AsyncPickerAction( this, _pFileView, _eAction );
2307*b1cdbd2cSJim Jagielski 
2308*b1cdbd2cSJim Jagielski     bool bReallyAsync = true;
2309*b1cdbd2cSJim Jagielski     m_aConfiguration.getNodeValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "FillAsynchronously" ) ) ) >>= bReallyAsync;
2310*b1cdbd2cSJim Jagielski 
2311*b1cdbd2cSJim Jagielski     sal_Int32 nMinTimeout = 0;
2312*b1cdbd2cSJim Jagielski     m_aConfiguration.getNodeValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Timeout/Min" ) ) ) >>= nMinTimeout;
2313*b1cdbd2cSJim Jagielski     sal_Int32 nMaxTimeout = 0;
2314*b1cdbd2cSJim Jagielski     m_aConfiguration.getNodeValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Timeout/Max" ) ) ) >>= nMaxTimeout;
2315*b1cdbd2cSJim Jagielski 
2316*b1cdbd2cSJim Jagielski     m_bInExecuteAsync = true;
2317*b1cdbd2cSJim Jagielski     m_pCurrentAsyncAction->execute( _rURL, _rFilter, bReallyAsync ? nMinTimeout : -1, nMaxTimeout, GetBlackList() );
2318*b1cdbd2cSJim Jagielski     m_bInExecuteAsync = false;
2319*b1cdbd2cSJim Jagielski }
2320*b1cdbd2cSJim Jagielski 
2321*b1cdbd2cSJim Jagielski //*****************************************************************************
2322*b1cdbd2cSJim Jagielski 
FileSelect()2323*b1cdbd2cSJim Jagielski void SvtFileDialog::FileSelect()
2324*b1cdbd2cSJim Jagielski {
2325*b1cdbd2cSJim Jagielski 	if ( _pFileNotifier )
2326*b1cdbd2cSJim Jagielski 		_pFileNotifier->notify( FILE_SELECTION_CHANGED, 0 );
2327*b1cdbd2cSJim Jagielski }
2328*b1cdbd2cSJim Jagielski 
2329*b1cdbd2cSJim Jagielski //*****************************************************************************
2330*b1cdbd2cSJim Jagielski 
FilterSelect()2331*b1cdbd2cSJim Jagielski void SvtFileDialog::FilterSelect()
2332*b1cdbd2cSJim Jagielski {
2333*b1cdbd2cSJim Jagielski 	if ( _pFileNotifier )
2334*b1cdbd2cSJim Jagielski 		_pFileNotifier->notify( CTRL_STATE_CHANGED,
2335*b1cdbd2cSJim Jagielski                                 LISTBOX_FILTER );
2336*b1cdbd2cSJim Jagielski }
2337*b1cdbd2cSJim Jagielski 
2338*b1cdbd2cSJim Jagielski //*****************************************************************************
2339*b1cdbd2cSJim Jagielski 
SetStandardDir(const String & rStdDir)2340*b1cdbd2cSJim Jagielski void SvtFileDialog::SetStandardDir( const String& rStdDir )
2341*b1cdbd2cSJim Jagielski 
2342*b1cdbd2cSJim Jagielski /*	[Beschreibung]
2343*b1cdbd2cSJim Jagielski 
2344*b1cdbd2cSJim Jagielski 	Die Methode setzt den Pfad f"ur den Standardknopf.
2345*b1cdbd2cSJim Jagielski */
2346*b1cdbd2cSJim Jagielski 
2347*b1cdbd2cSJim Jagielski {
2348*b1cdbd2cSJim Jagielski     INetURLObject aObj( rStdDir );
2349*b1cdbd2cSJim Jagielski     DBG_ASSERT( aObj.GetProtocol() != INET_PROT_NOT_VALID, "Invalid protocol!" );
2350*b1cdbd2cSJim Jagielski 	aObj.setFinalSlash();
2351*b1cdbd2cSJim Jagielski 	_pImp->SetStandardDir( aObj.GetMainURL( INetURLObject::NO_DECODE ) );
2352*b1cdbd2cSJim Jagielski }
2353*b1cdbd2cSJim Jagielski 
SetBlackList(const::com::sun::star::uno::Sequence<::rtl::OUString> & rBlackList)2354*b1cdbd2cSJim Jagielski void SvtFileDialog::SetBlackList( const ::com::sun::star::uno::Sequence< ::rtl::OUString >& rBlackList )
2355*b1cdbd2cSJim Jagielski {
2356*b1cdbd2cSJim Jagielski 	_pImp->SetBlackList( rBlackList );
2357*b1cdbd2cSJim Jagielski }
2358*b1cdbd2cSJim Jagielski 
2359*b1cdbd2cSJim Jagielski //*****************************************************************************
2360*b1cdbd2cSJim Jagielski 
GetBlackList() const2361*b1cdbd2cSJim Jagielski const ::com::sun::star::uno::Sequence< ::rtl::OUString >& SvtFileDialog::GetBlackList() const
2362*b1cdbd2cSJim Jagielski {
2363*b1cdbd2cSJim Jagielski 	return _pImp->GetBlackList();
2364*b1cdbd2cSJim Jagielski }
2365*b1cdbd2cSJim Jagielski //*****************************************************************************
2366*b1cdbd2cSJim Jagielski 
GetStandardDir() const2367*b1cdbd2cSJim Jagielski const String& SvtFileDialog::GetStandardDir() const
2368*b1cdbd2cSJim Jagielski 
2369*b1cdbd2cSJim Jagielski /*	[Beschreibung]
2370*b1cdbd2cSJim Jagielski 
2371*b1cdbd2cSJim Jagielski 	Diese Methode gibt den eingestellten Standardpfad zur"uck.
2372*b1cdbd2cSJim Jagielski */
2373*b1cdbd2cSJim Jagielski 
2374*b1cdbd2cSJim Jagielski {
2375*b1cdbd2cSJim Jagielski 	return _pImp->GetStandardDir();
2376*b1cdbd2cSJim Jagielski }
2377*b1cdbd2cSJim Jagielski 
2378*b1cdbd2cSJim Jagielski //*****************************************************************************
2379*b1cdbd2cSJim Jagielski 
PrevLevel_Impl()2380*b1cdbd2cSJim Jagielski void SvtFileDialog::PrevLevel_Impl()
2381*b1cdbd2cSJim Jagielski {
2382*b1cdbd2cSJim Jagielski     _pFileView->EndInplaceEditing( false );
2383*b1cdbd2cSJim Jagielski 
2384*b1cdbd2cSJim Jagielski     String sDummy;
2385*b1cdbd2cSJim Jagielski     executeAsync( AsyncPickerAction::ePrevLevel, sDummy, sDummy );
2386*b1cdbd2cSJim Jagielski }
2387*b1cdbd2cSJim Jagielski 
2388*b1cdbd2cSJim Jagielski //*****************************************************************************
2389*b1cdbd2cSJim Jagielski 
OpenURL_Impl(const String & _rURL)2390*b1cdbd2cSJim Jagielski void SvtFileDialog::OpenURL_Impl( const String& _rURL )
2391*b1cdbd2cSJim Jagielski {
2392*b1cdbd2cSJim Jagielski     _pFileView->EndInplaceEditing( false );
2393*b1cdbd2cSJim Jagielski 
2394*b1cdbd2cSJim Jagielski     DBG_ASSERT( m_aURLFilter.isUrlAllowed( _rURL ), "SvtFileDialog::OpenURL_Impl: forbidden URL! Should have been handled by the caller!" );
2395*b1cdbd2cSJim Jagielski     executeAsync( AsyncPickerAction::eOpenURL, _rURL, getMostCurrentFilter( _pImp ) );
2396*b1cdbd2cSJim Jagielski }
2397*b1cdbd2cSJim Jagielski 
2398*b1cdbd2cSJim Jagielski //*****************************************************************************
implAddFilter(const String & _rFilter,const String & _rType)2399*b1cdbd2cSJim Jagielski SvtFileDialogFilter_Impl* SvtFileDialog::implAddFilter( const String& _rFilter, const String& _rType )
2400*b1cdbd2cSJim Jagielski {
2401*b1cdbd2cSJim Jagielski 	SvtFileDialogFilter_Impl* pNewFilter = new SvtFileDialogFilter_Impl( _rFilter, _rType );
2402*b1cdbd2cSJim Jagielski 	_pImp->_pFilter->C40_INSERT( SvtFileDialogFilter_Impl, pNewFilter, (sal_uInt16)0 );
2403*b1cdbd2cSJim Jagielski 
2404*b1cdbd2cSJim Jagielski 	if ( !_pImp->GetCurFilter() )
2405*b1cdbd2cSJim Jagielski 		_pImp->SetCurFilter( pNewFilter, _rFilter );
2406*b1cdbd2cSJim Jagielski 
2407*b1cdbd2cSJim Jagielski 	return pNewFilter;
2408*b1cdbd2cSJim Jagielski }
2409*b1cdbd2cSJim Jagielski 
2410*b1cdbd2cSJim Jagielski //*****************************************************************************
2411*b1cdbd2cSJim Jagielski 
AddFilter(const String & _rFilter,const String & _rType)2412*b1cdbd2cSJim Jagielski void SvtFileDialog::AddFilter( const String& _rFilter, const String& _rType )
2413*b1cdbd2cSJim Jagielski {
2414*b1cdbd2cSJim Jagielski 	DBG_ASSERT( !IsInExecute(), "SvtFileDialog::AddFilter: currently executing!" );
2415*b1cdbd2cSJim Jagielski 	implAddFilter ( _rFilter, _rType );
2416*b1cdbd2cSJim Jagielski }
2417*b1cdbd2cSJim Jagielski 
2418*b1cdbd2cSJim Jagielski //*****************************************************************************
AddFilterGroup(const String & _rFilter,const Sequence<StringPair> & _rFilters)2419*b1cdbd2cSJim Jagielski void SvtFileDialog::AddFilterGroup( const String& _rFilter, const Sequence< StringPair >& _rFilters )
2420*b1cdbd2cSJim Jagielski {
2421*b1cdbd2cSJim Jagielski 	DBG_ASSERT( !IsInExecute(), "SvtFileDialog::AddFilter: currently executing!" );
2422*b1cdbd2cSJim Jagielski 
2423*b1cdbd2cSJim Jagielski 	implAddFilter( _rFilter, String() );
2424*b1cdbd2cSJim Jagielski 	const StringPair* pSubFilters		=				_rFilters.getConstArray();
2425*b1cdbd2cSJim Jagielski 	const StringPair* pSubFiltersEnd	= pSubFilters +	_rFilters.getLength();
2426*b1cdbd2cSJim Jagielski 	for ( ; pSubFilters != pSubFiltersEnd; ++pSubFilters )
2427*b1cdbd2cSJim Jagielski 		implAddFilter( pSubFilters->First, pSubFilters->Second );
2428*b1cdbd2cSJim Jagielski }
2429*b1cdbd2cSJim Jagielski 
2430*b1cdbd2cSJim Jagielski //*****************************************************************************
2431*b1cdbd2cSJim Jagielski 
2432*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
SetCurFilter(const String & rFilter)2433*b1cdbd2cSJim Jagielski void SvtFileDialog::SetCurFilter( const String& rFilter )
2434*b1cdbd2cSJim Jagielski {
2435*b1cdbd2cSJim Jagielski 	DBG_ASSERT( !IsInExecute(), "SvtFileDialog::SetCurFilter: currently executing!" );
2436*b1cdbd2cSJim Jagielski 
2437*b1cdbd2cSJim Jagielski 	// Entsprechenden Filter suchen.
2438*b1cdbd2cSJim Jagielski 	sal_uInt16 nPos = _pImp->_pFilter->Count();
2439*b1cdbd2cSJim Jagielski 
2440*b1cdbd2cSJim Jagielski     while ( nPos-- )
2441*b1cdbd2cSJim Jagielski 	{
2442*b1cdbd2cSJim Jagielski 		SvtFileDialogFilter_Impl* pFilter = _pImp->_pFilter->GetObject( nPos );
2443*b1cdbd2cSJim Jagielski 		if ( pFilter->GetName() == rFilter )
2444*b1cdbd2cSJim Jagielski 		{
2445*b1cdbd2cSJim Jagielski 			_pImp->SetCurFilter( pFilter, rFilter );
2446*b1cdbd2cSJim Jagielski 			break;
2447*b1cdbd2cSJim Jagielski 		}
2448*b1cdbd2cSJim Jagielski 	}
2449*b1cdbd2cSJim Jagielski }
2450*b1cdbd2cSJim Jagielski 
2451*b1cdbd2cSJim Jagielski //*****************************************************************************
2452*b1cdbd2cSJim Jagielski 
GetCurFilter() const2453*b1cdbd2cSJim Jagielski String SvtFileDialog::GetCurFilter() const
2454*b1cdbd2cSJim Jagielski {
2455*b1cdbd2cSJim Jagielski 	String aFilter;
2456*b1cdbd2cSJim Jagielski 
2457*b1cdbd2cSJim Jagielski 	const SvtFileDialogFilter_Impl* pCurrentFilter = _pImp->GetCurFilter();
2458*b1cdbd2cSJim Jagielski     if ( pCurrentFilter )
2459*b1cdbd2cSJim Jagielski 		aFilter = pCurrentFilter->GetName();
2460*b1cdbd2cSJim Jagielski 
2461*b1cdbd2cSJim Jagielski     return aFilter;
2462*b1cdbd2cSJim Jagielski }
2463*b1cdbd2cSJim Jagielski 
getCurFilter() const2464*b1cdbd2cSJim Jagielski String SvtFileDialog::getCurFilter( ) const
2465*b1cdbd2cSJim Jagielski {
2466*b1cdbd2cSJim Jagielski 	return GetCurFilter();
2467*b1cdbd2cSJim Jagielski }
2468*b1cdbd2cSJim Jagielski 
2469*b1cdbd2cSJim Jagielski //*****************************************************************************
2470*b1cdbd2cSJim Jagielski 
GetFilterCount() const2471*b1cdbd2cSJim Jagielski sal_uInt16 SvtFileDialog::GetFilterCount() const
2472*b1cdbd2cSJim Jagielski {
2473*b1cdbd2cSJim Jagielski 	return _pImp->_pFilter->Count();
2474*b1cdbd2cSJim Jagielski }
2475*b1cdbd2cSJim Jagielski 
2476*b1cdbd2cSJim Jagielski //*****************************************************************************
2477*b1cdbd2cSJim Jagielski 
GetFilterName(sal_uInt16 nPos) const2478*b1cdbd2cSJim Jagielski const String& SvtFileDialog::GetFilterName( sal_uInt16 nPos ) const
2479*b1cdbd2cSJim Jagielski {
2480*b1cdbd2cSJim Jagielski 	DBG_ASSERT( nPos < GetFilterCount(), "invalid index" );
2481*b1cdbd2cSJim Jagielski 	return _pImp->_pFilter->GetObject( nPos )->GetName();
2482*b1cdbd2cSJim Jagielski }
2483*b1cdbd2cSJim Jagielski 
2484*b1cdbd2cSJim Jagielski //*****************************************************************************
2485*b1cdbd2cSJim Jagielski 
InitSize()2486*b1cdbd2cSJim Jagielski void SvtFileDialog::InitSize()
2487*b1cdbd2cSJim Jagielski {
2488*b1cdbd2cSJim Jagielski 	if ( ! _pImp->_aIniKey.Len() )
2489*b1cdbd2cSJim Jagielski         return;
2490*b1cdbd2cSJim Jagielski 
2491*b1cdbd2cSJim Jagielski 	Size aDlgSize = GetResizeOutputSizePixel();
2492*b1cdbd2cSJim Jagielski 	SetMinOutputSizePixel( aDlgSize );
2493*b1cdbd2cSJim Jagielski 
2494*b1cdbd2cSJim Jagielski 	if ( !_pImp->_nFixDeltaHeight )
2495*b1cdbd2cSJim Jagielski 	{
2496*b1cdbd2cSJim Jagielski 		// Fixgr"ossen errechnen und merken
2497*b1cdbd2cSJim Jagielski 		Point aPnt = _pFileView->GetPosPixel();
2498*b1cdbd2cSJim Jagielski 		long nBoxH = _pFileView->GetSizePixel().Height();
2499*b1cdbd2cSJim Jagielski 		long nH = GetSizePixel().Height();
2500*b1cdbd2cSJim Jagielski 		_pImp->_nFixDeltaHeight = nH - nBoxH;
2501*b1cdbd2cSJim Jagielski 	}
2502*b1cdbd2cSJim Jagielski 
2503*b1cdbd2cSJim Jagielski 	// initialize from config
2504*b1cdbd2cSJim Jagielski 	SvtViewOptions aDlgOpt( E_DIALOG, _pImp->_aIniKey );
2505*b1cdbd2cSJim Jagielski 
2506*b1cdbd2cSJim Jagielski 	if ( aDlgOpt.Exists() )
2507*b1cdbd2cSJim Jagielski 	{
2508*b1cdbd2cSJim Jagielski 		SetWindowState( ByteString( String( aDlgOpt.GetWindowState() ), osl_getThreadTextEncoding() ) );
2509*b1cdbd2cSJim Jagielski 
2510*b1cdbd2cSJim Jagielski 		Any aUserData = aDlgOpt.GetUserItem( ::rtl::OUString::createFromAscii( "UserData" ) );
2511*b1cdbd2cSJim Jagielski 		::rtl::OUString sCfgStr;
2512*b1cdbd2cSJim Jagielski 		if ( aUserData >>= sCfgStr )
2513*b1cdbd2cSJim Jagielski 			_pFileView->SetConfigString( String( sCfgStr ) );
2514*b1cdbd2cSJim Jagielski 	}
2515*b1cdbd2cSJim Jagielski }
2516*b1cdbd2cSJim Jagielski 
2517*b1cdbd2cSJim Jagielski //*****************************************************************************
2518*b1cdbd2cSJim Jagielski 
GetPathList() const2519*b1cdbd2cSJim Jagielski SvStringsDtor* SvtFileDialog::GetPathList() const
2520*b1cdbd2cSJim Jagielski {
2521*b1cdbd2cSJim Jagielski 	SvStringsDtor*	pList = new SvStringsDtor;
2522*b1cdbd2cSJim Jagielski 	sal_uLong			nCount = _pFileView->GetSelectionCount();
2523*b1cdbd2cSJim Jagielski 	SvLBoxEntry*	pEntry = nCount ? _pFileView->FirstSelected() : NULL;
2524*b1cdbd2cSJim Jagielski 
2525*b1cdbd2cSJim Jagielski 	if ( ! pEntry )
2526*b1cdbd2cSJim Jagielski 	{
2527*b1cdbd2cSJim Jagielski 		String* pURL;
2528*b1cdbd2cSJim Jagielski 
2529*b1cdbd2cSJim Jagielski         if ( _pImp->_pEdFileName->GetText().Len() && _bIsInExecute )
2530*b1cdbd2cSJim Jagielski             pURL = new String( _pImp->_pEdFileName->GetURL() );
2531*b1cdbd2cSJim Jagielski         else
2532*b1cdbd2cSJim Jagielski             pURL = new String( _aPath );
2533*b1cdbd2cSJim Jagielski 
2534*b1cdbd2cSJim Jagielski         pList->Insert( pURL, pList->Count() );
2535*b1cdbd2cSJim Jagielski 	}
2536*b1cdbd2cSJim Jagielski 	else
2537*b1cdbd2cSJim Jagielski 	{
2538*b1cdbd2cSJim Jagielski 		while ( pEntry )
2539*b1cdbd2cSJim Jagielski 		{
2540*b1cdbd2cSJim Jagielski 			String* pURL = new String( _pFileView->GetURL( pEntry ) );
2541*b1cdbd2cSJim Jagielski 			pList->Insert( pURL, pList->Count() );
2542*b1cdbd2cSJim Jagielski 			pEntry = _pFileView->NextSelected( pEntry );
2543*b1cdbd2cSJim Jagielski 		}
2544*b1cdbd2cSJim Jagielski 	}
2545*b1cdbd2cSJim Jagielski 
2546*b1cdbd2cSJim Jagielski 	return pList;
2547*b1cdbd2cSJim Jagielski }
2548*b1cdbd2cSJim Jagielski 
2549*b1cdbd2cSJim Jagielski //*****************************************************************************
2550*b1cdbd2cSJim Jagielski 
implArrangeControls()2551*b1cdbd2cSJim Jagielski void SvtFileDialog::implArrangeControls()
2552*b1cdbd2cSJim Jagielski {
2553*b1cdbd2cSJim Jagielski     // this is the list of controls in the order they should be tabbed
2554*b1cdbd2cSJim Jagielski     // from topleft to bottomright
2555*b1cdbd2cSJim Jagielski     // pb: #136070# new order so all LabeledBy relations are correct now
2556*b1cdbd2cSJim Jagielski     Control* pControls[] =
2557*b1cdbd2cSJim Jagielski     {
2558*b1cdbd2cSJim Jagielski         _pImp->_pFtCurrentPath,
2559*b1cdbd2cSJim Jagielski         _pImp->_pBtnUp, _pImp->_pBtnNewFolder, _pImp->_pBtnStandard,        // image buttons
2560*b1cdbd2cSJim Jagielski         _pFileView,                                                         // the file view
2561*b1cdbd2cSJim Jagielski         _pImp->_pFtFileName, _pImp->_pEdFileName,
2562*b1cdbd2cSJim Jagielski         _pImp->_pFtFileVersion, _pImp->_pLbFileVersion,
2563*b1cdbd2cSJim Jagielski         _pImp->_pFtTemplates, _pImp->_pLbTemplates,
2564*b1cdbd2cSJim Jagielski         _pImp->_pFtImageTemplates, _pImp->_pLbImageTemplates,
2565*b1cdbd2cSJim Jagielski         _pImp->_pFtFileType, _pImp->GetFilterListControl(),                 // edit fields/list boxes
2566*b1cdbd2cSJim Jagielski         _pImp->_pCbPassword, _pImp->_pCbAutoExtension, _pImp->_pCbOptions,  // checkboxes
2567*b1cdbd2cSJim Jagielski         _pCbReadOnly, _pCbLinkBox, _pCbPreviewBox, _pCbSelection, _pPbPlay, // check boxes (continued)
2568*b1cdbd2cSJim Jagielski         _pImp->_pBtnFileOpen, _pImp->_pBtnCancel, _pImp->_pBtnHelp          // buttons
2569*b1cdbd2cSJim Jagielski 
2570*b1cdbd2cSJim Jagielski         // (including the FixedTexts is important - not for tabbing order (they're irrelevant there),
2571*b1cdbd2cSJim Jagielski         // but for working keyboard shortcuts)
2572*b1cdbd2cSJim Jagielski         // 96861 - 23.01.2002 - fs@openoffice.org
2573*b1cdbd2cSJim Jagielski     };
2574*b1cdbd2cSJim Jagielski 
2575*b1cdbd2cSJim Jagielski     // loop through all these controls and adjust the z-order
2576*b1cdbd2cSJim Jagielski     Window* pPreviousWin = NULL;
2577*b1cdbd2cSJim Jagielski     Control** pCurrent = pControls;
2578*b1cdbd2cSJim Jagielski     for ( sal_Int32 i = 0; i < sal_Int32(sizeof( pControls ) / sizeof( pControls[ 0 ] )); ++i, ++pCurrent )
2579*b1cdbd2cSJim Jagielski     {
2580*b1cdbd2cSJim Jagielski         if ( !*pCurrent )
2581*b1cdbd2cSJim Jagielski             // this control is not available in the current operation mode -> skip
2582*b1cdbd2cSJim Jagielski             continue;
2583*b1cdbd2cSJim Jagielski 
2584*b1cdbd2cSJim Jagielski         if ( pPreviousWin )
2585*b1cdbd2cSJim Jagielski             (*pCurrent)->SetZOrder( pPreviousWin, WINDOW_ZORDER_BEHIND );
2586*b1cdbd2cSJim Jagielski         else
2587*b1cdbd2cSJim Jagielski             (*pCurrent)->SetZOrder( NULL, WINDOW_ZORDER_FIRST );
2588*b1cdbd2cSJim Jagielski 
2589*b1cdbd2cSJim Jagielski         pPreviousWin = *pCurrent;
2590*b1cdbd2cSJim Jagielski     }
2591*b1cdbd2cSJim Jagielski 
2592*b1cdbd2cSJim Jagielski     // FileName edit not the first control but it should have the focus initially
2593*b1cdbd2cSJim Jagielski     _pImp->_pEdFileName->GrabFocus();
2594*b1cdbd2cSJim Jagielski }
2595*b1cdbd2cSJim Jagielski 
2596*b1cdbd2cSJim Jagielski //*****************************************************************************
2597*b1cdbd2cSJim Jagielski 
IsolateFilterFromPath_Impl(String & rPath,String & rFilter)2598*b1cdbd2cSJim Jagielski sal_Bool SvtFileDialog::IsolateFilterFromPath_Impl( String& rPath, String& rFilter )
2599*b1cdbd2cSJim Jagielski {
2600*b1cdbd2cSJim Jagielski 	String aEmpty;
2601*b1cdbd2cSJim Jagielski 	String aReversePath( rPath );
2602*b1cdbd2cSJim Jagielski 	aReversePath.Reverse();
2603*b1cdbd2cSJim Jagielski 	sal_uInt16 nQuestionMarkPos = rPath.Search( '?' );
2604*b1cdbd2cSJim Jagielski 
2605*b1cdbd2cSJim Jagielski 	if ( nQuestionMarkPos != STRING_NOTFOUND )
2606*b1cdbd2cSJim Jagielski 	{
2607*b1cdbd2cSJim Jagielski 		// Fragezeichen als Wildcard nur bei Files
2608*b1cdbd2cSJim Jagielski 		INetProtocol eProt = INetURLObject::CompareProtocolScheme( rPath );
2609*b1cdbd2cSJim Jagielski 
2610*b1cdbd2cSJim Jagielski 		if ( INET_PROT_NOT_VALID != eProt && INET_PROT_FILE != eProt )
2611*b1cdbd2cSJim Jagielski 			nQuestionMarkPos = STRING_NOTFOUND;
2612*b1cdbd2cSJim Jagielski 	}
2613*b1cdbd2cSJim Jagielski 	sal_uInt16 nWildCardPos = Min( rPath.Search( FILEDIALOG_DEF_WILDCARD ), nQuestionMarkPos );
2614*b1cdbd2cSJim Jagielski 	rFilter = aEmpty;
2615*b1cdbd2cSJim Jagielski 
2616*b1cdbd2cSJim Jagielski 	if ( nWildCardPos != STRING_NOTFOUND )
2617*b1cdbd2cSJim Jagielski 	{
2618*b1cdbd2cSJim Jagielski 		sal_uInt16 nPathTokenPos = aReversePath.Search( INET_PATH_TOKEN );
2619*b1cdbd2cSJim Jagielski 
2620*b1cdbd2cSJim Jagielski 		if ( nPathTokenPos == STRING_NOTFOUND )
2621*b1cdbd2cSJim Jagielski 		{
2622*b1cdbd2cSJim Jagielski 			String aDelim(
2623*b1cdbd2cSJim Jagielski #if defined(WNT) || defined(OS2)
2624*b1cdbd2cSJim Jagielski 					'\\'
2625*b1cdbd2cSJim Jagielski #else
2626*b1cdbd2cSJim Jagielski 					'/'
2627*b1cdbd2cSJim Jagielski #endif
2628*b1cdbd2cSJim Jagielski 			);
2629*b1cdbd2cSJim Jagielski 
2630*b1cdbd2cSJim Jagielski 			nPathTokenPos = aReversePath.Search( aDelim );
2631*b1cdbd2cSJim Jagielski #if defined(OS2)
2632*b1cdbd2cSJim Jagielski 			if ( nPathTokenPos == STRING_NOTFOUND )
2633*b1cdbd2cSJim Jagielski 			{
2634*b1cdbd2cSJim Jagielski 				nPathTokenPos = aReversePath.Search( '/' );
2635*b1cdbd2cSJim Jagielski 			}
2636*b1cdbd2cSJim Jagielski #endif
2637*b1cdbd2cSJim Jagielski #if !defined( UNX )
2638*b1cdbd2cSJim Jagielski 			if ( nPathTokenPos == STRING_NOTFOUND )
2639*b1cdbd2cSJim Jagielski 			{
2640*b1cdbd2cSJim Jagielski 				nPathTokenPos = aReversePath.Search( ':' );
2641*b1cdbd2cSJim Jagielski 			}
2642*b1cdbd2cSJim Jagielski #endif
2643*b1cdbd2cSJim Jagielski 		}
2644*b1cdbd2cSJim Jagielski 
2645*b1cdbd2cSJim Jagielski 		// Syntax pr"ufen.
2646*b1cdbd2cSJim Jagielski 		if ( nPathTokenPos != STRING_NOTFOUND )
2647*b1cdbd2cSJim Jagielski 		{
2648*b1cdbd2cSJim Jagielski 			if ( nPathTokenPos < (rPath.Len() - nWildCardPos - 1) )
2649*b1cdbd2cSJim Jagielski 			{
2650*b1cdbd2cSJim Jagielski 				ErrorHandler::HandleError( ERRCODE_SFX_INVALIDSYNTAX );
2651*b1cdbd2cSJim Jagielski 				return sal_False;
2652*b1cdbd2cSJim Jagielski 			}
2653*b1cdbd2cSJim Jagielski 
2654*b1cdbd2cSJim Jagielski 			// Filter abschneiden.
2655*b1cdbd2cSJim Jagielski 			rFilter = aReversePath;
2656*b1cdbd2cSJim Jagielski 			rFilter.Erase( nPathTokenPos );
2657*b1cdbd2cSJim Jagielski 			rFilter.Reverse();
2658*b1cdbd2cSJim Jagielski 
2659*b1cdbd2cSJim Jagielski 			// Ordner bestimmen.
2660*b1cdbd2cSJim Jagielski 			rPath = aReversePath;
2661*b1cdbd2cSJim Jagielski 			rPath.Erase( 0, nPathTokenPos );
2662*b1cdbd2cSJim Jagielski 			rPath.Reverse();
2663*b1cdbd2cSJim Jagielski 		}
2664*b1cdbd2cSJim Jagielski 		else
2665*b1cdbd2cSJim Jagielski 		{
2666*b1cdbd2cSJim Jagielski 			rFilter = rPath;
2667*b1cdbd2cSJim Jagielski 			rPath = aEmpty;
2668*b1cdbd2cSJim Jagielski 		}
2669*b1cdbd2cSJim Jagielski 	}
2670*b1cdbd2cSJim Jagielski 
2671*b1cdbd2cSJim Jagielski 	return sal_True;
2672*b1cdbd2cSJim Jagielski }
2673*b1cdbd2cSJim Jagielski 
2674*b1cdbd2cSJim Jagielski //*****************************************************************************
2675*b1cdbd2cSJim Jagielski 
2676*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
implUpdateImages()2677*b1cdbd2cSJim Jagielski void SvtFileDialog::implUpdateImages( )
2678*b1cdbd2cSJim Jagielski {
2679*b1cdbd2cSJim Jagielski 	// determine high contrast mode
2680*b1cdbd2cSJim Jagielski 	{
2681*b1cdbd2cSJim Jagielski 		sal_Bool bIsHighContrast = GetSettings().GetStyleSettings().GetHighContrastMode();
2682*b1cdbd2cSJim Jagielski 		m_aImages = ImageList( SvtResId( bIsHighContrast ? RID_FILEPICKER_IMAGES_HC : RID_FILEPICKER_IMAGES ) );
2683*b1cdbd2cSJim Jagielski 	}
2684*b1cdbd2cSJim Jagielski 
2685*b1cdbd2cSJim Jagielski 	// set the appropriate images on the buttons
2686*b1cdbd2cSJim Jagielski 	if ( _pImp->_pBtnUp )
2687*b1cdbd2cSJim Jagielski 		_pImp->_pBtnUp->SetModeImage( GetButtonImage( IMG_FILEDLG_BTN_UP ) );
2688*b1cdbd2cSJim Jagielski 
2689*b1cdbd2cSJim Jagielski 	if ( _pImp->_pBtnStandard )
2690*b1cdbd2cSJim Jagielski 		_pImp->_pBtnStandard->SetModeImage( GetButtonImage( IMG_FILEDLG_BTN_STD ) );
2691*b1cdbd2cSJim Jagielski 
2692*b1cdbd2cSJim Jagielski 	if ( _pImp->_pBtnNewFolder )
2693*b1cdbd2cSJim Jagielski 		_pImp->_pBtnNewFolder->SetModeImage( GetButtonImage( IMG_FILEDLG_CREATEFOLDER ) );
2694*b1cdbd2cSJim Jagielski }
2695*b1cdbd2cSJim Jagielski 
2696*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
DataChanged(const DataChangedEvent & _rDCEvt)2697*b1cdbd2cSJim Jagielski void SvtFileDialog::DataChanged( const DataChangedEvent& _rDCEvt )
2698*b1cdbd2cSJim Jagielski {
2699*b1cdbd2cSJim Jagielski 	if ( DATACHANGED_SETTINGS == _rDCEvt.GetType() )
2700*b1cdbd2cSJim Jagielski 		implUpdateImages( );
2701*b1cdbd2cSJim Jagielski 
2702*b1cdbd2cSJim Jagielski 	ModalDialog::DataChanged( _rDCEvt );
2703*b1cdbd2cSJim Jagielski }
2704*b1cdbd2cSJim Jagielski 
2705*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
Resize()2706*b1cdbd2cSJim Jagielski void SvtFileDialog::Resize()
2707*b1cdbd2cSJim Jagielski {
2708*b1cdbd2cSJim Jagielski 	if ( IsRollUp() )
2709*b1cdbd2cSJim Jagielski 		return;
2710*b1cdbd2cSJim Jagielski 
2711*b1cdbd2cSJim Jagielski 	Size aDlgSize = GetResizeOutputSizePixel();
2712*b1cdbd2cSJim Jagielski 	Size aOldSize = _pImp->_aDlgSize;
2713*b1cdbd2cSJim Jagielski 	_pImp->_aDlgSize = aDlgSize;
2714*b1cdbd2cSJim Jagielski 	long nWinDeltaW = 0;
2715*b1cdbd2cSJim Jagielski 
2716*b1cdbd2cSJim Jagielski 	if ( _pPrevWin &&
2717*b1cdbd2cSJim Jagielski          _pPrevWin->GetPosPixel().X() > _pFileView->GetPosPixel().X() )
2718*b1cdbd2cSJim Jagielski 	{
2719*b1cdbd2cSJim Jagielski 		nWinDeltaW = _pPrevWin->GetOutputSizePixel().Width() + _pImp->_a6Size.Width();
2720*b1cdbd2cSJim Jagielski 	}
2721*b1cdbd2cSJim Jagielski 
2722*b1cdbd2cSJim Jagielski 	Size aNewSize = _pFileView->GetSizePixel();
2723*b1cdbd2cSJim Jagielski 	Point aBoxPos( _pFileView->GetPosPixel() );
2724*b1cdbd2cSJim Jagielski 	long nDeltaY = aNewSize.Height();
2725*b1cdbd2cSJim Jagielski 	long nDeltaX = aNewSize.Width();
2726*b1cdbd2cSJim Jagielski 	aNewSize.Height() = aDlgSize.Height() - _pImp->_nFixDeltaHeight;
2727*b1cdbd2cSJim Jagielski 	aNewSize.Width() = aDlgSize.Width() - aBoxPos.X() - _pImp->_a6Size.Width() - nWinDeltaW;
2728*b1cdbd2cSJim Jagielski 	if ( aOldSize.Height() )
2729*b1cdbd2cSJim Jagielski 		nDeltaY = _pImp->_aDlgSize.Height() - aOldSize.Height();
2730*b1cdbd2cSJim Jagielski 	else
2731*b1cdbd2cSJim Jagielski 		nDeltaY = aNewSize.Height() - nDeltaY;
2732*b1cdbd2cSJim Jagielski 	nDeltaX = aNewSize.Width() - nDeltaX;
2733*b1cdbd2cSJim Jagielski 
2734*b1cdbd2cSJim Jagielski 	if ( nWinDeltaW )
2735*b1cdbd2cSJim Jagielski 		nWinDeltaW = nDeltaX * 2 / 3;
2736*b1cdbd2cSJim Jagielski 	aNewSize.Width() -= nWinDeltaW;
2737*b1cdbd2cSJim Jagielski 	nDeltaX -= nWinDeltaW;
2738*b1cdbd2cSJim Jagielski 
2739*b1cdbd2cSJim Jagielski 	_pFileView->SetSizePixel( aNewSize );
2740*b1cdbd2cSJim Jagielski 
2741*b1cdbd2cSJim Jagielski 	if ( !nDeltaY && !nDeltaX )
2742*b1cdbd2cSJim Jagielski 		// Dieses Resize wurde nur zum Ein - oder Ausblenden des Indicators aufgerufen
2743*b1cdbd2cSJim Jagielski 		return;
2744*b1cdbd2cSJim Jagielski 
2745*b1cdbd2cSJim Jagielski 	// -------------
2746*b1cdbd2cSJim Jagielski 	// move controls
2747*b1cdbd2cSJim Jagielski 
2748*b1cdbd2cSJim Jagielski 	// controls to move vertically
2749*b1cdbd2cSJim Jagielski 	{
2750*b1cdbd2cSJim Jagielski 		Control* aMoveControlsVert[] =
2751*b1cdbd2cSJim Jagielski 		{
2752*b1cdbd2cSJim Jagielski 			_pImp->_pFtFileName, _pImp->_pEdFileName, _pImp->_pFtFileVersion, _pImp->_pLbFileVersion,
2753*b1cdbd2cSJim Jagielski 			_pImp->_pFtTemplates, _pImp->_pLbTemplates, _pImp->_pFtImageTemplates, _pImp->_pLbImageTemplates,
2754*b1cdbd2cSJim Jagielski 			_pImp->_pFtFileType, _pImp->GetFilterListControl(), _pCbReadOnly, _pCbLinkBox, _pCbPreviewBox,
2755*b1cdbd2cSJim Jagielski 			_pPbPlay, _pImp->_pCbPassword, _pImp->_pCbAutoExtension, _pImp->_pCbOptions, _pCbSelection
2756*b1cdbd2cSJim Jagielski 		};
2757*b1cdbd2cSJim Jagielski 		Control** ppMoveControls = aMoveControlsVert;
2758*b1cdbd2cSJim Jagielski 		Control** ppMoveControlsEnd = ppMoveControls + sizeof( aMoveControlsVert ) / sizeof( aMoveControlsVert[0] );
2759*b1cdbd2cSJim Jagielski 		for ( ; ppMoveControls != ppMoveControlsEnd; ++ppMoveControls )
2760*b1cdbd2cSJim Jagielski 			lcl_MoveControl( *ppMoveControls, 0, nDeltaY );
2761*b1cdbd2cSJim Jagielski 	}
2762*b1cdbd2cSJim Jagielski 
2763*b1cdbd2cSJim Jagielski 	// controls to move vertically and horizontally
2764*b1cdbd2cSJim Jagielski 	{
2765*b1cdbd2cSJim Jagielski 		Control* aMoveControlsBoth[] =
2766*b1cdbd2cSJim Jagielski 		{
2767*b1cdbd2cSJim Jagielski 			_pImp->_pBtnFileOpen, _pImp->_pBtnCancel, _pImp->_pBtnHelp
2768*b1cdbd2cSJim Jagielski 		};
2769*b1cdbd2cSJim Jagielski 		Control** ppMoveControls = aMoveControlsBoth;
2770*b1cdbd2cSJim Jagielski 		Control** ppMoveControlsEnd = ppMoveControls + sizeof( aMoveControlsBoth ) / sizeof( aMoveControlsBoth[0] );
2771*b1cdbd2cSJim Jagielski 		for ( ; ppMoveControls != ppMoveControlsEnd; ++ppMoveControls )
2772*b1cdbd2cSJim Jagielski 			lcl_MoveControl( *ppMoveControls, nDeltaX, nDeltaY );
2773*b1cdbd2cSJim Jagielski 	}
2774*b1cdbd2cSJim Jagielski 
2775*b1cdbd2cSJim Jagielski 	// controls to move horizontally
2776*b1cdbd2cSJim Jagielski 	{
2777*b1cdbd2cSJim Jagielski 		Control* aMoveControlsHor[] =
2778*b1cdbd2cSJim Jagielski 		{
2779*b1cdbd2cSJim Jagielski 			_pImp->_pBtnUp, _pImp->_pBtnNewFolder, _pImp->_pBtnStandard
2780*b1cdbd2cSJim Jagielski 		};
2781*b1cdbd2cSJim Jagielski 		Control** ppMoveControls = aMoveControlsHor;
2782*b1cdbd2cSJim Jagielski 		Control** ppMoveControlsEnd = ppMoveControls + sizeof( aMoveControlsHor ) / sizeof( aMoveControlsHor[0] );
2783*b1cdbd2cSJim Jagielski 		for ( ; ppMoveControls != ppMoveControlsEnd; ++ppMoveControls )
2784*b1cdbd2cSJim Jagielski 			lcl_MoveControl( *ppMoveControls, nDeltaX, 0 );
2785*b1cdbd2cSJim Jagielski 	}
2786*b1cdbd2cSJim Jagielski 
2787*b1cdbd2cSJim Jagielski 	// ---------------
2788*b1cdbd2cSJim Jagielski 	// resize controls
2789*b1cdbd2cSJim Jagielski 	{
2790*b1cdbd2cSJim Jagielski 		Control* aSizeControls[] =
2791*b1cdbd2cSJim Jagielski 		{
2792*b1cdbd2cSJim Jagielski 			_pImp->_pEdFileName, _pImp->_pLbFileVersion, _pImp->_pLbTemplates, _pImp->_pLbImageTemplates,
2793*b1cdbd2cSJim Jagielski 			_pImp->GetFilterListControl(), _pImp->_pFtCurrentPath,
2794*b1cdbd2cSJim Jagielski 		};
2795*b1cdbd2cSJim Jagielski 		sal_Int32 nSizeControls = sizeof( aSizeControls ) / sizeof( aSizeControls[0] );
2796*b1cdbd2cSJim Jagielski 		Control** ppSizeControls = aSizeControls;
2797*b1cdbd2cSJim Jagielski 		for ( sal_Int32 j=0; j<nSizeControls; ++j, ++ppSizeControls )
2798*b1cdbd2cSJim Jagielski 		{
2799*b1cdbd2cSJim Jagielski 			if ( *ppSizeControls )
2800*b1cdbd2cSJim Jagielski 			{
2801*b1cdbd2cSJim Jagielski 				aNewSize = (*ppSizeControls)->GetSizePixel();
2802*b1cdbd2cSJim Jagielski 				aNewSize.Width() += nDeltaX;
2803*b1cdbd2cSJim Jagielski 				(*ppSizeControls)->SetSizePixel( aNewSize );
2804*b1cdbd2cSJim Jagielski 			}
2805*b1cdbd2cSJim Jagielski 		}
2806*b1cdbd2cSJim Jagielski 	}
2807*b1cdbd2cSJim Jagielski 
2808*b1cdbd2cSJim Jagielski 	// zus"atzliche Controls ausrichten
2809*b1cdbd2cSJim Jagielski 	if ( _pPrevWin &&
2810*b1cdbd2cSJim Jagielski          _pPrevWin->GetPosPixel().X() > _pFileView->GetPosPixel().X() )
2811*b1cdbd2cSJim Jagielski 	{
2812*b1cdbd2cSJim Jagielski 		// Controls vom Typ Window speziell ausrichten
2813*b1cdbd2cSJim Jagielski 		// auch die Gr"osse anpassen
2814*b1cdbd2cSJim Jagielski 		Point aNewPos = _pPrevWin->GetPosPixel();
2815*b1cdbd2cSJim Jagielski 		aNewPos.X() += nDeltaX;
2816*b1cdbd2cSJim Jagielski 		_pPrevWin->SetPosPixel( aNewPos );
2817*b1cdbd2cSJim Jagielski         _pPrevBmp->SetPosPixel( aNewPos );
2818*b1cdbd2cSJim Jagielski 		aNewSize = _pPrevWin->GetOutputSizePixel();
2819*b1cdbd2cSJim Jagielski 		aNewSize.Width() += nWinDeltaW;
2820*b1cdbd2cSJim Jagielski 		aNewSize.Height() += nDeltaY;
2821*b1cdbd2cSJim Jagielski 		if ( !aOldSize.Height() )
2822*b1cdbd2cSJim Jagielski 			aNewSize.Height() -= ( _pImp->_a6Size.Height() / 2 );
2823*b1cdbd2cSJim Jagielski 		_pPrevWin->SetOutputSizePixel( aNewSize );
2824*b1cdbd2cSJim Jagielski 		_pPrevBmp->SetOutputSizePixel( aNewSize );
2825*b1cdbd2cSJim Jagielski         _pPrevBmp->Invalidate();
2826*b1cdbd2cSJim Jagielski 	}
2827*b1cdbd2cSJim Jagielski 
2828*b1cdbd2cSJim Jagielski     if ( _pFileNotifier )
2829*b1cdbd2cSJim Jagielski 		_pFileNotifier->notify( DIALOG_SIZE_CHANGED, 0 );
2830*b1cdbd2cSJim Jagielski }
2831*b1cdbd2cSJim Jagielski 
2832*b1cdbd2cSJim Jagielski //*****************************************************************************
2833*b1cdbd2cSJim Jagielski 
2834*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
getControl(sal_Int16 _nControlId,sal_Bool _bLabelControl) const2835*b1cdbd2cSJim Jagielski Control* SvtFileDialog::getControl( sal_Int16 _nControlId, sal_Bool _bLabelControl ) const
2836*b1cdbd2cSJim Jagielski {
2837*b1cdbd2cSJim Jagielski 	Control* pReturn = NULL;
2838*b1cdbd2cSJim Jagielski 
2839*b1cdbd2cSJim Jagielski 	switch ( _nControlId )
2840*b1cdbd2cSJim Jagielski 	{
2841*b1cdbd2cSJim Jagielski 		case CONTROL_FILEVIEW:
2842*b1cdbd2cSJim Jagielski 			pReturn = _bLabelControl ? NULL : static_cast< Control* >( _pFileView );
2843*b1cdbd2cSJim Jagielski 			break;
2844*b1cdbd2cSJim Jagielski 
2845*b1cdbd2cSJim Jagielski 		case EDIT_FILEURL:
2846*b1cdbd2cSJim Jagielski 			pReturn =	_bLabelControl
2847*b1cdbd2cSJim Jagielski 					?	static_cast< Control* >( _pImp->_pFtFileName )
2848*b1cdbd2cSJim Jagielski 					:	static_cast< Control* >( _pImp->_pEdFileName );
2849*b1cdbd2cSJim Jagielski 			break;
2850*b1cdbd2cSJim Jagielski 
2851*b1cdbd2cSJim Jagielski 		case EDIT_FILEURL_LABEL:
2852*b1cdbd2cSJim Jagielski 			pReturn = static_cast< Control* >( _pImp->_pFtFileName );
2853*b1cdbd2cSJim Jagielski 			break;
2854*b1cdbd2cSJim Jagielski 
2855*b1cdbd2cSJim Jagielski 		case CHECKBOX_AUTOEXTENSION:
2856*b1cdbd2cSJim Jagielski 			pReturn = _pImp->_pCbAutoExtension;
2857*b1cdbd2cSJim Jagielski 			break;
2858*b1cdbd2cSJim Jagielski 
2859*b1cdbd2cSJim Jagielski 		case CHECKBOX_PASSWORD:
2860*b1cdbd2cSJim Jagielski 			pReturn = _pImp->_pCbPassword;
2861*b1cdbd2cSJim Jagielski 			break;
2862*b1cdbd2cSJim Jagielski 
2863*b1cdbd2cSJim Jagielski 		case CHECKBOX_FILTEROPTIONS:
2864*b1cdbd2cSJim Jagielski 			pReturn = _pImp->_pCbOptions;
2865*b1cdbd2cSJim Jagielski 			break;
2866*b1cdbd2cSJim Jagielski 
2867*b1cdbd2cSJim Jagielski 		case CHECKBOX_READONLY:
2868*b1cdbd2cSJim Jagielski 			pReturn = _pCbReadOnly;
2869*b1cdbd2cSJim Jagielski 			break;
2870*b1cdbd2cSJim Jagielski 
2871*b1cdbd2cSJim Jagielski 		case CHECKBOX_LINK:
2872*b1cdbd2cSJim Jagielski 			pReturn = _pCbLinkBox;
2873*b1cdbd2cSJim Jagielski 			break;
2874*b1cdbd2cSJim Jagielski 
2875*b1cdbd2cSJim Jagielski 		case CHECKBOX_PREVIEW:
2876*b1cdbd2cSJim Jagielski 			pReturn = _pCbPreviewBox;
2877*b1cdbd2cSJim Jagielski 			break;
2878*b1cdbd2cSJim Jagielski 
2879*b1cdbd2cSJim Jagielski 		case CHECKBOX_SELECTION:
2880*b1cdbd2cSJim Jagielski 			pReturn = _pCbSelection;
2881*b1cdbd2cSJim Jagielski 			break;
2882*b1cdbd2cSJim Jagielski 
2883*b1cdbd2cSJim Jagielski 		case LISTBOX_FILTER:
2884*b1cdbd2cSJim Jagielski 			pReturn = _bLabelControl ? _pImp->_pFtFileType : _pImp->GetFilterListControl();
2885*b1cdbd2cSJim Jagielski 			break;
2886*b1cdbd2cSJim Jagielski 
2887*b1cdbd2cSJim Jagielski 		case LISTBOX_FILTER_LABEL:
2888*b1cdbd2cSJim Jagielski 			pReturn = _pImp->_pFtFileType;
2889*b1cdbd2cSJim Jagielski 			break;
2890*b1cdbd2cSJim Jagielski 
2891*b1cdbd2cSJim Jagielski 		case FIXEDTEXT_CURRENTFOLDER:
2892*b1cdbd2cSJim Jagielski 			pReturn = _pImp->_pFtCurrentPath;
2893*b1cdbd2cSJim Jagielski 			break;
2894*b1cdbd2cSJim Jagielski 
2895*b1cdbd2cSJim Jagielski 		case LISTBOX_VERSION:
2896*b1cdbd2cSJim Jagielski 			pReturn =	_bLabelControl
2897*b1cdbd2cSJim Jagielski 					?	static_cast< Control* >( _pImp->_pFtFileVersion )
2898*b1cdbd2cSJim Jagielski 					:	static_cast< Control* >( _pImp->_pLbFileVersion );
2899*b1cdbd2cSJim Jagielski 			break;
2900*b1cdbd2cSJim Jagielski 
2901*b1cdbd2cSJim Jagielski 		case LISTBOX_TEMPLATE:
2902*b1cdbd2cSJim Jagielski 			pReturn =	_bLabelControl
2903*b1cdbd2cSJim Jagielski 					?	static_cast< Control* >( _pImp->_pFtTemplates )
2904*b1cdbd2cSJim Jagielski 					:	static_cast< Control* >( _pImp->_pLbTemplates );
2905*b1cdbd2cSJim Jagielski 			break;
2906*b1cdbd2cSJim Jagielski 
2907*b1cdbd2cSJim Jagielski 		case LISTBOX_IMAGE_TEMPLATE:
2908*b1cdbd2cSJim Jagielski 			pReturn =	_bLabelControl
2909*b1cdbd2cSJim Jagielski 					?	static_cast< Control* >( _pImp->_pFtImageTemplates )
2910*b1cdbd2cSJim Jagielski 					:	static_cast< Control* >( _pImp->_pLbImageTemplates );
2911*b1cdbd2cSJim Jagielski 			break;
2912*b1cdbd2cSJim Jagielski 
2913*b1cdbd2cSJim Jagielski 		case LISTBOX_VERSION_LABEL:
2914*b1cdbd2cSJim Jagielski 			pReturn = _pImp->_pFtFileVersion;
2915*b1cdbd2cSJim Jagielski 			break;
2916*b1cdbd2cSJim Jagielski 
2917*b1cdbd2cSJim Jagielski 		case LISTBOX_TEMPLATE_LABEL:
2918*b1cdbd2cSJim Jagielski 			pReturn = _pImp->_pFtTemplates;
2919*b1cdbd2cSJim Jagielski 			break;
2920*b1cdbd2cSJim Jagielski 
2921*b1cdbd2cSJim Jagielski 		case LISTBOX_IMAGE_TEMPLATE_LABEL:
2922*b1cdbd2cSJim Jagielski 			pReturn = _pImp->_pFtImageTemplates;
2923*b1cdbd2cSJim Jagielski 			break;
2924*b1cdbd2cSJim Jagielski 
2925*b1cdbd2cSJim Jagielski 		case PUSHBUTTON_OK:
2926*b1cdbd2cSJim Jagielski 			pReturn = _pImp->_pBtnFileOpen;
2927*b1cdbd2cSJim Jagielski 			break;
2928*b1cdbd2cSJim Jagielski 
2929*b1cdbd2cSJim Jagielski 		case PUSHBUTTON_CANCEL:
2930*b1cdbd2cSJim Jagielski 			pReturn = _pImp->_pBtnCancel;
2931*b1cdbd2cSJim Jagielski 			break;
2932*b1cdbd2cSJim Jagielski 
2933*b1cdbd2cSJim Jagielski 		case PUSHBUTTON_PLAY:
2934*b1cdbd2cSJim Jagielski 			pReturn = _pPbPlay;
2935*b1cdbd2cSJim Jagielski 			break;
2936*b1cdbd2cSJim Jagielski 
2937*b1cdbd2cSJim Jagielski 		case PUSHBUTTON_HELP:
2938*b1cdbd2cSJim Jagielski 			pReturn = _pImp->_pBtnHelp;
2939*b1cdbd2cSJim Jagielski 			break;
2940*b1cdbd2cSJim Jagielski 
2941*b1cdbd2cSJim Jagielski 		case TOOLBOXBUTOON_DEFAULT_LOCATION:
2942*b1cdbd2cSJim Jagielski 			pReturn = _pImp->_pBtnStandard;
2943*b1cdbd2cSJim Jagielski 			break;
2944*b1cdbd2cSJim Jagielski 
2945*b1cdbd2cSJim Jagielski 		case TOOLBOXBUTOON_LEVEL_UP:
2946*b1cdbd2cSJim Jagielski 			pReturn = _pImp->_pBtnUp;
2947*b1cdbd2cSJim Jagielski 			break;
2948*b1cdbd2cSJim Jagielski 
2949*b1cdbd2cSJim Jagielski 		case TOOLBOXBUTOON_NEW_FOLDER:
2950*b1cdbd2cSJim Jagielski 			pReturn = _pImp->_pBtnNewFolder;
2951*b1cdbd2cSJim Jagielski 			break;
2952*b1cdbd2cSJim Jagielski 
2953*b1cdbd2cSJim Jagielski         case LISTBOX_FILTER_SELECTOR:
2954*b1cdbd2cSJim Jagielski             // only exists on SalGtkFilePicker
2955*b1cdbd2cSJim Jagielski             break;
2956*b1cdbd2cSJim Jagielski 
2957*b1cdbd2cSJim Jagielski 		default:
2958*b1cdbd2cSJim Jagielski 			DBG_ERRORFILE( "SvtFileDialog::getControl: invalid id!" );
2959*b1cdbd2cSJim Jagielski 	}
2960*b1cdbd2cSJim Jagielski 	return pReturn;
2961*b1cdbd2cSJim Jagielski }
2962*b1cdbd2cSJim Jagielski 
2963*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
enableControl(sal_Int16 _nControlId,sal_Bool _bEnable)2964*b1cdbd2cSJim Jagielski void SvtFileDialog::enableControl( sal_Int16 _nControlId, sal_Bool _bEnable )
2965*b1cdbd2cSJim Jagielski {
2966*b1cdbd2cSJim Jagielski     Control* pControl = getControl( _nControlId, sal_False );
2967*b1cdbd2cSJim Jagielski     if ( pControl )
2968*b1cdbd2cSJim Jagielski         EnableControl( pControl, _bEnable );
2969*b1cdbd2cSJim Jagielski     Control* pLabel = getControl( _nControlId, sal_True );
2970*b1cdbd2cSJim Jagielski     if ( pLabel )
2971*b1cdbd2cSJim Jagielski         EnableControl( pLabel, _bEnable );
2972*b1cdbd2cSJim Jagielski }
2973*b1cdbd2cSJim Jagielski 
2974*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
AddControls_Impl()2975*b1cdbd2cSJim Jagielski void SvtFileDialog::AddControls_Impl( )
2976*b1cdbd2cSJim Jagielski {
2977*b1cdbd2cSJim Jagielski 	// create the "insert as link" checkbox, if needed
2978*b1cdbd2cSJim Jagielski     if ( _nExtraBits & SFX_EXTRA_INSERTASLINK )
2979*b1cdbd2cSJim Jagielski 	{
2980*b1cdbd2cSJim Jagielski 		_pCbLinkBox = new CheckBox( this );
2981*b1cdbd2cSJim Jagielski         _pCbLinkBox ->SetText( SvtResId( STR_SVT_FILEPICKER_INSERT_AS_LINK ) );
2982*b1cdbd2cSJim Jagielski 		_pCbLinkBox ->SetHelpId( HID_FILEDLG_LINK_CB );
2983*b1cdbd2cSJim Jagielski 		AddControl( _pCbLinkBox  );
2984*b1cdbd2cSJim Jagielski 		ReleaseOwnerShip( _pCbLinkBox );
2985*b1cdbd2cSJim Jagielski 		_pCbLinkBox->SetClickHdl( LINK( this, SvtFileDialog, ClickHdl_Impl ) );
2986*b1cdbd2cSJim Jagielski 	}
2987*b1cdbd2cSJim Jagielski 
2988*b1cdbd2cSJim Jagielski 	// create the "show preview" checkbox ( and the preview window, too ), if needed
2989*b1cdbd2cSJim Jagielski 	if ( _nExtraBits & SFX_EXTRA_SHOWPREVIEW  )
2990*b1cdbd2cSJim Jagielski     {
2991*b1cdbd2cSJim Jagielski     	_pImp->_aIniKey = IMPGRF_CONFIGNAME;
2992*b1cdbd2cSJim Jagielski 		// because the "<All Formats> (*.bmp,*...)" entry is to wide,
2993*b1cdbd2cSJim Jagielski 		// we need to disable the auto width feature of the filter box
2994*b1cdbd2cSJim Jagielski 		_pImp->DisableFilterBoxAutoWidth();
2995*b1cdbd2cSJim Jagielski 
2996*b1cdbd2cSJim Jagielski         // "Vorschau"
2997*b1cdbd2cSJim Jagielski 	    _pCbPreviewBox = new CheckBox( this );
2998*b1cdbd2cSJim Jagielski 	    _pCbPreviewBox->SetText( SvtResId( STR_SVT_FILEPICKER_SHOW_PREVIEW ) );
2999*b1cdbd2cSJim Jagielski 	    _pCbPreviewBox->SetHelpId( HID_FILEDLG_PREVIEW_CB );
3000*b1cdbd2cSJim Jagielski 	    AddControl( _pCbPreviewBox );
3001*b1cdbd2cSJim Jagielski 		ReleaseOwnerShip( _pCbPreviewBox );
3002*b1cdbd2cSJim Jagielski 		_pCbPreviewBox->SetClickHdl( LINK( this, SvtFileDialog, ClickHdl_Impl ) );
3003*b1cdbd2cSJim Jagielski 
3004*b1cdbd2cSJim Jagielski 	    // Preview-Fenster erst hier erzeugen
3005*b1cdbd2cSJim Jagielski 	    _pPrevWin = new Window( this, WinBits( WB_BORDER ) );
3006*b1cdbd2cSJim Jagielski 	    AddControl( _pPrevWin );
3007*b1cdbd2cSJim Jagielski 		ReleaseOwnerShip( _pPrevWin );
3008*b1cdbd2cSJim Jagielski         _pPrevWin->Hide();
3009*b1cdbd2cSJim Jagielski 
3010*b1cdbd2cSJim Jagielski         _pPrevBmp = new FixedBitmap( this, WinBits( WB_BORDER ) );
3011*b1cdbd2cSJim Jagielski 	    _pPrevBmp->SetBackground( Wallpaper( Color( COL_WHITE ) ) );
3012*b1cdbd2cSJim Jagielski         _pPrevBmp->Show();
3013*b1cdbd2cSJim Jagielski 		_pPrevBmp->SetAccessibleName(SvtResId(STR_PREVIEW));
3014*b1cdbd2cSJim Jagielski     }
3015*b1cdbd2cSJim Jagielski 
3016*b1cdbd2cSJim Jagielski     if ( _nExtraBits & SFX_EXTRA_AUTOEXTENSION )
3017*b1cdbd2cSJim Jagielski     {
3018*b1cdbd2cSJim Jagielski 		_pImp->_pCbAutoExtension = new CheckBox( this, SvtResId( CB_AUTO_EXTENSION ) );
3019*b1cdbd2cSJim Jagielski 	    _pImp->_pCbAutoExtension->SetText( SvtResId( STR_SVT_FILEPICKER_AUTO_EXTENSION ) );
3020*b1cdbd2cSJim Jagielski 		_pImp->_pCbAutoExtension->Check( sal_True );
3021*b1cdbd2cSJim Jagielski 		AddControl( _pImp->_pCbAutoExtension );
3022*b1cdbd2cSJim Jagielski 		ReleaseOwnerShip( _pImp->_pCbAutoExtension );
3023*b1cdbd2cSJim Jagielski 		_pImp->_pCbAutoExtension->SetClickHdl( LINK( this, SvtFileDialog, AutoExtensionHdl_Impl ) );
3024*b1cdbd2cSJim Jagielski     }
3025*b1cdbd2cSJim Jagielski 
3026*b1cdbd2cSJim Jagielski     if ( _nExtraBits & SFX_EXTRA_FILTEROPTIONS )
3027*b1cdbd2cSJim Jagielski 	{
3028*b1cdbd2cSJim Jagielski 		_pImp->_pCbOptions = new CheckBox( this, SvtResId( CB_OPTIONS ) );
3029*b1cdbd2cSJim Jagielski 	    _pImp->_pCbOptions->SetText( SvtResId( STR_SVT_FILEPICKER_FILTER_OPTIONS ) );
3030*b1cdbd2cSJim Jagielski 		AddControl( _pImp->_pCbOptions );
3031*b1cdbd2cSJim Jagielski 		ReleaseOwnerShip( _pImp->_pCbOptions );
3032*b1cdbd2cSJim Jagielski 		_pImp->_pCbOptions->SetClickHdl( LINK( this, SvtFileDialog, ClickHdl_Impl ) );
3033*b1cdbd2cSJim Jagielski 	}
3034*b1cdbd2cSJim Jagielski 
3035*b1cdbd2cSJim Jagielski     if ( _nExtraBits & SFX_EXTRA_SELECTION )
3036*b1cdbd2cSJim Jagielski 	{
3037*b1cdbd2cSJim Jagielski         _pCbSelection = new CheckBox( this, SvtResId( CB_OPTIONS ) );
3038*b1cdbd2cSJim Jagielski 	    _pCbSelection->SetText( SvtResId( STR_SVT_FILEPICKER_SELECTION ) );
3039*b1cdbd2cSJim Jagielski 		AddControl( _pCbSelection );
3040*b1cdbd2cSJim Jagielski 		ReleaseOwnerShip( _pCbSelection );
3041*b1cdbd2cSJim Jagielski 		_pCbSelection->SetClickHdl( LINK( this, SvtFileDialog, ClickHdl_Impl ) );
3042*b1cdbd2cSJim Jagielski 	}
3043*b1cdbd2cSJim Jagielski 
3044*b1cdbd2cSJim Jagielski     if ( _nExtraBits & SFX_EXTRA_PLAYBUTTON )
3045*b1cdbd2cSJim Jagielski 	{
3046*b1cdbd2cSJim Jagielski 		_pPbPlay = new PushButton( this );
3047*b1cdbd2cSJim Jagielski 	    _pPbPlay->SetText( SvtResId( STR_SVT_FILEPICKER_PLAY ) );
3048*b1cdbd2cSJim Jagielski 		_pPbPlay->SetHelpId( HID_FILESAVE_DOPLAY );
3049*b1cdbd2cSJim Jagielski 		AddControl( _pPbPlay );
3050*b1cdbd2cSJim Jagielski 		ReleaseOwnerShip( _pPbPlay );
3051*b1cdbd2cSJim Jagielski 		_pPbPlay->SetClickHdl( LINK( this, SvtFileDialog, PlayButtonHdl_Impl ) );
3052*b1cdbd2cSJim Jagielski 	}
3053*b1cdbd2cSJim Jagielski 
3054*b1cdbd2cSJim Jagielski 	if ( _nExtraBits & SFX_EXTRA_SHOWVERSIONS )
3055*b1cdbd2cSJim Jagielski 	{
3056*b1cdbd2cSJim Jagielski 		_pImp->_pFtFileVersion = new FixedText(	this, SvtResId( FT_EXPLORERFILE_SHARED_LISTBOX ) );
3057*b1cdbd2cSJim Jagielski 		_pImp->_pFtFileVersion->SetText( SvtResId( STR_SVT_FILEPICKER_VERSION ) );
3058*b1cdbd2cSJim Jagielski 
3059*b1cdbd2cSJim Jagielski 		_pImp->_pLbFileVersion = new ListBox( this, SvtResId( LB_EXPLORERFILE_SHARED_LISTBOX ) );
3060*b1cdbd2cSJim Jagielski 		_pImp->_pLbFileVersion->SetHelpId( HID_FILEOPEN_VERSION );
3061*b1cdbd2cSJim Jagielski 	}
3062*b1cdbd2cSJim Jagielski     else if ( _nExtraBits & SFX_EXTRA_TEMPLATES )
3063*b1cdbd2cSJim Jagielski 	{
3064*b1cdbd2cSJim Jagielski 		_pImp->_pFtTemplates = new FixedText( this, SvtResId( FT_EXPLORERFILE_SHARED_LISTBOX ) );
3065*b1cdbd2cSJim Jagielski 		_pImp->_pFtTemplates->SetText( SvtResId( STR_SVT_FILEPICKER_TEMPLATES ) );
3066*b1cdbd2cSJim Jagielski 
3067*b1cdbd2cSJim Jagielski 		_pImp->_pLbTemplates = new ListBox( this, SvtResId( LB_EXPLORERFILE_SHARED_LISTBOX ) );
3068*b1cdbd2cSJim Jagielski 		_pImp->_pLbTemplates->SetHelpId( HID_FILEOPEN_VERSION );
3069*b1cdbd2cSJim Jagielski 			// This is strange. During the re-factoring during 96930, I discovered that this help id
3070*b1cdbd2cSJim Jagielski 			// is set in the "Templates mode". This was hidden in the previous implementation.
3071*b1cdbd2cSJim Jagielski 			// Shouldn't this be a more meaningfull help id.
3072*b1cdbd2cSJim Jagielski 			// 96930 - 15.08.2002 - fs@openoffice.org
3073*b1cdbd2cSJim Jagielski 	}
3074*b1cdbd2cSJim Jagielski     else if ( _nExtraBits & SFX_EXTRA_IMAGE_TEMPLATE )
3075*b1cdbd2cSJim Jagielski 	{
3076*b1cdbd2cSJim Jagielski 		_pImp->_pFtImageTemplates = new FixedText( this, SvtResId( FT_EXPLORERFILE_SHARED_LISTBOX ) );
3077*b1cdbd2cSJim Jagielski 		_pImp->_pFtImageTemplates->SetText( SvtResId( STR_SVT_FILEPICKER_IMAGE_TEMPLATE ) );
3078*b1cdbd2cSJim Jagielski 
3079*b1cdbd2cSJim Jagielski 		_pImp->_pLbImageTemplates = new ListBox( this, SvtResId( LB_EXPLORERFILE_SHARED_LISTBOX ) );
3080*b1cdbd2cSJim Jagielski 		_pImp->_pLbImageTemplates->SetHelpId( HID_FILEOPEN_IMAGE_TEMPLATE );
3081*b1cdbd2cSJim Jagielski 	}
3082*b1cdbd2cSJim Jagielski }
3083*b1cdbd2cSJim Jagielski 
3084*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
getTargetColorDepth()3085*b1cdbd2cSJim Jagielski sal_Int32 SvtFileDialog::getTargetColorDepth()
3086*b1cdbd2cSJim Jagielski {
3087*b1cdbd2cSJim Jagielski     if ( _pPrevBmp )
3088*b1cdbd2cSJim Jagielski         return _pPrevBmp->GetBitCount();
3089*b1cdbd2cSJim Jagielski     else
3090*b1cdbd2cSJim Jagielski         return 0;
3091*b1cdbd2cSJim Jagielski }
3092*b1cdbd2cSJim Jagielski 
3093*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
getAvailableWidth()3094*b1cdbd2cSJim Jagielski sal_Int32 SvtFileDialog::getAvailableWidth()
3095*b1cdbd2cSJim Jagielski {
3096*b1cdbd2cSJim Jagielski     if ( _pPrevBmp )
3097*b1cdbd2cSJim Jagielski         return _pPrevBmp->GetOutputSizePixel().Width();
3098*b1cdbd2cSJim Jagielski     else
3099*b1cdbd2cSJim Jagielski         return 0;
3100*b1cdbd2cSJim Jagielski }
3101*b1cdbd2cSJim Jagielski 
3102*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
getAvailableHeight()3103*b1cdbd2cSJim Jagielski sal_Int32 SvtFileDialog::getAvailableHeight()
3104*b1cdbd2cSJim Jagielski {
3105*b1cdbd2cSJim Jagielski     if ( _pPrevBmp )
3106*b1cdbd2cSJim Jagielski         return _pPrevBmp->GetOutputSizePixel().Height();
3107*b1cdbd2cSJim Jagielski     else
3108*b1cdbd2cSJim Jagielski         return 0;
3109*b1cdbd2cSJim Jagielski }
3110*b1cdbd2cSJim Jagielski 
3111*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
setImage(sal_Int16,const Any & rImage)3112*b1cdbd2cSJim Jagielski void SvtFileDialog::setImage( sal_Int16 /*aImageFormat*/, const Any& rImage )
3113*b1cdbd2cSJim Jagielski {
3114*b1cdbd2cSJim Jagielski     if ( ! _pPrevBmp || ! _pPrevBmp->IsVisible() )
3115*b1cdbd2cSJim Jagielski         return;
3116*b1cdbd2cSJim Jagielski 
3117*b1cdbd2cSJim Jagielski     Sequence < sal_Int8 > aBmpSequence;
3118*b1cdbd2cSJim Jagielski 
3119*b1cdbd2cSJim Jagielski     if ( rImage >>= aBmpSequence )
3120*b1cdbd2cSJim Jagielski     {
3121*b1cdbd2cSJim Jagielski         Bitmap          aBmp;
3122*b1cdbd2cSJim Jagielski         SvMemoryStream  aData( aBmpSequence.getArray(),
3123*b1cdbd2cSJim Jagielski                                aBmpSequence.getLength(),
3124*b1cdbd2cSJim Jagielski                                STREAM_READ );
3125*b1cdbd2cSJim Jagielski         ReadDIB(aBmp, aData, true);
3126*b1cdbd2cSJim Jagielski 
3127*b1cdbd2cSJim Jagielski         _pPrevBmp->SetBitmap( aBmp );
3128*b1cdbd2cSJim Jagielski     }
3129*b1cdbd2cSJim Jagielski     else
3130*b1cdbd2cSJim Jagielski     {
3131*b1cdbd2cSJim Jagielski         Bitmap aEmpty;
3132*b1cdbd2cSJim Jagielski         _pPrevBmp->SetBitmap( aEmpty );
3133*b1cdbd2cSJim Jagielski     }
3134*b1cdbd2cSJim Jagielski }
3135*b1cdbd2cSJim Jagielski 
3136*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
setShowState(sal_Bool)3137*b1cdbd2cSJim Jagielski sal_Bool SvtFileDialog::setShowState( sal_Bool /*bShowState*/ )
3138*b1cdbd2cSJim Jagielski {
3139*b1cdbd2cSJim Jagielski 	// #97633 for the system filedialog it's
3140*b1cdbd2cSJim Jagielski 	// usefull to make the preview switchable
3141*b1cdbd2cSJim Jagielski 	// because the preview occupies
3142*b1cdbd2cSJim Jagielski 	// half of the size of the file listbox
3143*b1cdbd2cSJim Jagielski 	// which is not the case here,
3144*b1cdbd2cSJim Jagielski 	// so we (TRA/FS) decided not to make
3145*b1cdbd2cSJim Jagielski 	// the preview window switchable because
3146*b1cdbd2cSJim Jagielski 	// else we would have to change the layout
3147*b1cdbd2cSJim Jagielski 	// of the file dialog dynamically
3148*b1cdbd2cSJim Jagielski 	// support for set/getShowState is opionally
3149*b1cdbd2cSJim Jagielski 	// see com::sun::star::ui::dialogs::XFilePreview
3150*b1cdbd2cSJim Jagielski 	/*
3151*b1cdbd2cSJim Jagielski     if ( _pPrevBmp )
3152*b1cdbd2cSJim Jagielski     {
3153*b1cdbd2cSJim Jagielski         _pPrevBmp->Show( bShowState );
3154*b1cdbd2cSJim Jagielski         return sal_True;
3155*b1cdbd2cSJim Jagielski     }
3156*b1cdbd2cSJim Jagielski     else
3157*b1cdbd2cSJim Jagielski         return sal_False;
3158*b1cdbd2cSJim Jagielski 	*/
3159*b1cdbd2cSJim Jagielski 
3160*b1cdbd2cSJim Jagielski 	return sal_False;
3161*b1cdbd2cSJim Jagielski }
3162*b1cdbd2cSJim Jagielski 
3163*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
getCurrentFileText() const3164*b1cdbd2cSJim Jagielski String SvtFileDialog::getCurrentFileText( ) const
3165*b1cdbd2cSJim Jagielski {
3166*b1cdbd2cSJim Jagielski 	String sReturn;
3167*b1cdbd2cSJim Jagielski 	if ( _pImp && _pImp->_pEdFileName )
3168*b1cdbd2cSJim Jagielski 		sReturn = _pImp->_pEdFileName->GetText();
3169*b1cdbd2cSJim Jagielski 	return sReturn;
3170*b1cdbd2cSJim Jagielski }
3171*b1cdbd2cSJim Jagielski 
3172*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
setCurrentFileText(const String & _rText,bool _bSelectAll)3173*b1cdbd2cSJim Jagielski void SvtFileDialog::setCurrentFileText( const String& _rText, bool _bSelectAll )
3174*b1cdbd2cSJim Jagielski {
3175*b1cdbd2cSJim Jagielski 	if ( _pImp && _pImp->_pEdFileName )
3176*b1cdbd2cSJim Jagielski     {
3177*b1cdbd2cSJim Jagielski 	    _pImp->_pEdFileName->SetText( _rText );
3178*b1cdbd2cSJim Jagielski         if ( _bSelectAll )
3179*b1cdbd2cSJim Jagielski             _pImp->_pEdFileName->SetSelection( Selection( 0, _rText.Len() ) );
3180*b1cdbd2cSJim Jagielski     }
3181*b1cdbd2cSJim Jagielski }
3182*b1cdbd2cSJim Jagielski 
3183*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
isAutoExtensionEnabled()3184*b1cdbd2cSJim Jagielski sal_Bool SvtFileDialog::isAutoExtensionEnabled()
3185*b1cdbd2cSJim Jagielski {
3186*b1cdbd2cSJim Jagielski 	return _pImp->_pCbAutoExtension && _pImp->_pCbAutoExtension->IsChecked();
3187*b1cdbd2cSJim Jagielski }
3188*b1cdbd2cSJim Jagielski 
3189*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
getShowState()3190*b1cdbd2cSJim Jagielski sal_Bool SvtFileDialog::getShowState()
3191*b1cdbd2cSJim Jagielski {
3192*b1cdbd2cSJim Jagielski     if ( _pPrevBmp )
3193*b1cdbd2cSJim Jagielski         return _pPrevBmp->IsVisible();
3194*b1cdbd2cSJim Jagielski     else
3195*b1cdbd2cSJim Jagielski         return sal_False;
3196*b1cdbd2cSJim Jagielski }
3197*b1cdbd2cSJim Jagielski 
3198*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
ReleaseOwnerShip(Window * pUserControl)3199*b1cdbd2cSJim Jagielski void SvtFileDialog::ReleaseOwnerShip( Window* pUserControl )
3200*b1cdbd2cSJim Jagielski 
3201*b1cdbd2cSJim Jagielski /*
3202*b1cdbd2cSJim Jagielski   [Beschreibung]
3203*b1cdbd2cSJim Jagielski   Die Methode sorgt dafuer das das spezifizierte Element nicht mehr im Besitz
3204*b1cdbd2cSJim Jagielski   der Instanz ist.
3205*b1cdbd2cSJim Jagielski */
3206*b1cdbd2cSJim Jagielski 
3207*b1cdbd2cSJim Jagielski {
3208*b1cdbd2cSJim Jagielski 	ControlChain_Impl* pElement = _pUserControls;
3209*b1cdbd2cSJim Jagielski 	while ( pElement )
3210*b1cdbd2cSJim Jagielski 	{
3211*b1cdbd2cSJim Jagielski 		if ( pElement->_pControl == pUserControl )
3212*b1cdbd2cSJim Jagielski 		{
3213*b1cdbd2cSJim Jagielski 			pElement->_bHasOwnerShip = sal_False;
3214*b1cdbd2cSJim Jagielski 			break;
3215*b1cdbd2cSJim Jagielski 		}
3216*b1cdbd2cSJim Jagielski 		pElement = pElement->_pNext;
3217*b1cdbd2cSJim Jagielski 	}
3218*b1cdbd2cSJim Jagielski }
3219*b1cdbd2cSJim Jagielski 
3220*b1cdbd2cSJim Jagielski //***************************************************************************
3221*b1cdbd2cSJim Jagielski 
AddControl(Window * pControl,sal_Bool bNewLine)3222*b1cdbd2cSJim Jagielski sal_Bool SvtFileDialog::AddControl( Window* pControl, sal_Bool bNewLine )
3223*b1cdbd2cSJim Jagielski {
3224*b1cdbd2cSJim Jagielski 	// control already exists
3225*b1cdbd2cSJim Jagielski 	ControlChain_Impl* pElement = _pUserControls;
3226*b1cdbd2cSJim Jagielski 	while ( pElement )
3227*b1cdbd2cSJim Jagielski 	{
3228*b1cdbd2cSJim Jagielski 		if ( pElement->_pControl == pControl )
3229*b1cdbd2cSJim Jagielski 			return sal_False;
3230*b1cdbd2cSJim Jagielski 		pElement = pElement->_pNext;
3231*b1cdbd2cSJim Jagielski 	}
3232*b1cdbd2cSJim Jagielski 
3233*b1cdbd2cSJim Jagielski 	// Check if controls have already been added.
3234*b1cdbd2cSJim Jagielski 	Size aNewControlSize( pControl->GetOutputSizePixel() );
3235*b1cdbd2cSJim Jagielski 	Size aDlgSize( GetOutputSizePixel() );
3236*b1cdbd2cSJim Jagielski 	WindowType nType = pControl->GetType();
3237*b1cdbd2cSJim Jagielski 	if ( !aNewControlSize.Height() )
3238*b1cdbd2cSJim Jagielski 	{
3239*b1cdbd2cSJim Jagielski 		// Detect a size.
3240*b1cdbd2cSJim Jagielski 		Size aSize( 0, 10 );
3241*b1cdbd2cSJim Jagielski 		if ( nType == WINDOW_PUSHBUTTON )
3242*b1cdbd2cSJim Jagielski 		{
3243*b1cdbd2cSJim Jagielski 			Size aDefSiz = LogicToPixel( Size( 50, 14 ), MAP_APPFONT );
3244*b1cdbd2cSJim Jagielski 			long nTextWidth = pControl->GetTextWidth( pControl->GetText() );
3245*b1cdbd2cSJim Jagielski 			aSize.Width() = nTextWidth + WIDTH_ADDITION;
3246*b1cdbd2cSJim Jagielski 
3247*b1cdbd2cSJim Jagielski 			// PushButton:	Mindestbreite 50 logische Einheiten,
3248*b1cdbd2cSJim Jagielski 			//				H"ohe immer 14 logische Einheiten
3249*b1cdbd2cSJim Jagielski 			if ( aDefSiz.Width() > aSize.Width() )
3250*b1cdbd2cSJim Jagielski 				aSize.Width() = aDefSiz.Width();
3251*b1cdbd2cSJim Jagielski 			aSize.Height() = aDefSiz.Height();
3252*b1cdbd2cSJim Jagielski 			aNewControlSize = aSize;
3253*b1cdbd2cSJim Jagielski 		}
3254*b1cdbd2cSJim Jagielski 		else
3255*b1cdbd2cSJim Jagielski 			aNewControlSize = LogicToPixel( aSize, MAP_APPFONT );
3256*b1cdbd2cSJim Jagielski 		if ( nType != WINDOW_PUSHBUTTON )
3257*b1cdbd2cSJim Jagielski 			aNewControlSize.Width() = pControl->GetTextWidth( pControl->GetText() ) + WIDTH_ADDITION;
3258*b1cdbd2cSJim Jagielski 		if ( nType == WINDOW_CHECKBOX )
3259*b1cdbd2cSJim Jagielski 			aNewControlSize.Width() += WIDTH_ADDITION;
3260*b1cdbd2cSJim Jagielski 		if ( nType == WINDOW_WINDOW )
3261*b1cdbd2cSJim Jagielski 		{
3262*b1cdbd2cSJim Jagielski 			aNewControlSize.Height() = GetOutputSizePixel().Height() - 18;
3263*b1cdbd2cSJim Jagielski 			aNewControlSize.Width() = 200;
3264*b1cdbd2cSJim Jagielski 			aDlgSize.Width() += 210;
3265*b1cdbd2cSJim Jagielski 			SetOutputSizePixel( aDlgSize );
3266*b1cdbd2cSJim Jagielski 		}
3267*b1cdbd2cSJim Jagielski 		pControl->SetOutputSizePixel( aNewControlSize );
3268*b1cdbd2cSJim Jagielski 	}
3269*b1cdbd2cSJim Jagielski 	Point aNewControlPos;
3270*b1cdbd2cSJim Jagielski 	Size* pNewDlgSize = NULL;
3271*b1cdbd2cSJim Jagielski 	sal_Bool bNewRow = bNewLine;
3272*b1cdbd2cSJim Jagielski 	sal_Bool bFirstNewRow = sal_False;
3273*b1cdbd2cSJim Jagielski 
3274*b1cdbd2cSJim Jagielski 	if ( nType == WINDOW_WINDOW )
3275*b1cdbd2cSJim Jagielski 	{
3276*b1cdbd2cSJim Jagielski 		aNewControlPos.X() = aDlgSize.Width() - 210;
3277*b1cdbd2cSJim Jagielski 		aNewControlPos.Y() = 8;
3278*b1cdbd2cSJim Jagielski 	}
3279*b1cdbd2cSJim Jagielski 	else if ( _pUserControls )
3280*b1cdbd2cSJim Jagielski 	{
3281*b1cdbd2cSJim Jagielski 		Point aNewControlRange( _pUserControls->_pControl->GetPosPixel() );
3282*b1cdbd2cSJim Jagielski 		long nPrevControlHeight = _pUserControls->_pControl->GetSizePixel().Height();
3283*b1cdbd2cSJim Jagielski 		aNewControlRange +=
3284*b1cdbd2cSJim Jagielski 			Point( _pUserControls->_pControl->GetOutputSizePixel().Width(), 0 );
3285*b1cdbd2cSJim Jagielski 		aNewControlPos = aNewControlRange;
3286*b1cdbd2cSJim Jagielski 		if ( nPrevControlHeight > aNewControlSize.Height() )
3287*b1cdbd2cSJim Jagielski 		{
3288*b1cdbd2cSJim Jagielski 			long nY = nPrevControlHeight;
3289*b1cdbd2cSJim Jagielski 			nY -= aNewControlSize.Height();
3290*b1cdbd2cSJim Jagielski 			nY /= 2;
3291*b1cdbd2cSJim Jagielski 			aNewControlPos.Y() += nY;
3292*b1cdbd2cSJim Jagielski 		}
3293*b1cdbd2cSJim Jagielski 		aNewControlPos += LogicToPixel( Point( 3, 0 ), MAP_APPFONT );
3294*b1cdbd2cSJim Jagielski 		aNewControlRange += LogicToPixel( Point( 9, 0 ), MAP_APPFONT );
3295*b1cdbd2cSJim Jagielski 		aNewControlRange += Point( aNewControlSize.Width(), 0 );
3296*b1cdbd2cSJim Jagielski 
3297*b1cdbd2cSJim Jagielski 		// Check if a new row has to be created.
3298*b1cdbd2cSJim Jagielski 		if ( aNewControlRange.X() > aDlgSize.Width() )
3299*b1cdbd2cSJim Jagielski 			bNewRow = sal_True;
3300*b1cdbd2cSJim Jagielski 	}
3301*b1cdbd2cSJim Jagielski 	else
3302*b1cdbd2cSJim Jagielski 	{
3303*b1cdbd2cSJim Jagielski 		// Create a new row if there was no usercontrol before.
3304*b1cdbd2cSJim Jagielski 		bNewRow = sal_True;
3305*b1cdbd2cSJim Jagielski 		bFirstNewRow = sal_True;
3306*b1cdbd2cSJim Jagielski 	}
3307*b1cdbd2cSJim Jagielski 
3308*b1cdbd2cSJim Jagielski 	// Check if a new row has to be created.
3309*b1cdbd2cSJim Jagielski 	Size aBorderSize = LogicToPixel( Size( 6, 6 ), MAP_APPFONT );
3310*b1cdbd2cSJim Jagielski 	long nLeftBorder = aBorderSize.Width();
3311*b1cdbd2cSJim Jagielski 	long nLowerBorder = aBorderSize.Height();
3312*b1cdbd2cSJim Jagielski 	if ( bNewRow )
3313*b1cdbd2cSJim Jagielski 	{
3314*b1cdbd2cSJim Jagielski 		// Set control at the beginning of a new line.
3315*b1cdbd2cSJim Jagielski 		long nSmallBorderHeight = nLowerBorder / 2;
3316*b1cdbd2cSJim Jagielski 		aNewControlPos = Point( nLeftBorder, 0 );
3317*b1cdbd2cSJim Jagielski 		aNewControlPos += Point( 0, aDlgSize.Height() );
3318*b1cdbd2cSJim Jagielski 		aNewControlPos.Y() -= nSmallBorderHeight;
3319*b1cdbd2cSJim Jagielski 		// Set new size.
3320*b1cdbd2cSJim Jagielski 		pNewDlgSize = new Size( aDlgSize );
3321*b1cdbd2cSJim Jagielski 		pNewDlgSize->Height() -= nSmallBorderHeight;
3322*b1cdbd2cSJim Jagielski 		pNewDlgSize->Height() += aNewControlSize.Height();
3323*b1cdbd2cSJim Jagielski 		pNewDlgSize->Height() += nLowerBorder;
3324*b1cdbd2cSJim Jagielski 	}
3325*b1cdbd2cSJim Jagielski 	else
3326*b1cdbd2cSJim Jagielski 	{
3327*b1cdbd2cSJim Jagielski 		// Check if the window has to be resized.
3328*b1cdbd2cSJim Jagielski 		Size aNewControlRange( 0, aNewControlPos.Y() );
3329*b1cdbd2cSJim Jagielski 		aNewControlRange.Height() += aNewControlSize.Height();
3330*b1cdbd2cSJim Jagielski 		aNewControlRange.Height() += nLowerBorder;
3331*b1cdbd2cSJim Jagielski 		if ( aNewControlRange.Height() > aDlgSize.Height() )
3332*b1cdbd2cSJim Jagielski 			pNewDlgSize = new Size( aDlgSize.Width(), aNewControlRange.Height() );
3333*b1cdbd2cSJim Jagielski 	}
3334*b1cdbd2cSJim Jagielski 
3335*b1cdbd2cSJim Jagielski 	// Update view.
3336*b1cdbd2cSJim Jagielski 	if ( pNewDlgSize )
3337*b1cdbd2cSJim Jagielski 	{
3338*b1cdbd2cSJim Jagielski 		SetOutputSizePixel( *pNewDlgSize );
3339*b1cdbd2cSJim Jagielski 		delete pNewDlgSize;
3340*b1cdbd2cSJim Jagielski 	}
3341*b1cdbd2cSJim Jagielski 	pControl->SetPosPixel( aNewControlPos );
3342*b1cdbd2cSJim Jagielski 	pControl->Show();
3343*b1cdbd2cSJim Jagielski 	_pUserControls = new ControlChain_Impl( pControl, _pUserControls );
3344*b1cdbd2cSJim Jagielski 
3345*b1cdbd2cSJim Jagielski 	return sal_True;
3346*b1cdbd2cSJim Jagielski }
3347*b1cdbd2cSJim Jagielski 
ContentHasParentFolder(const rtl::OUString & rURL)3348*b1cdbd2cSJim Jagielski sal_Bool SvtFileDialog::ContentHasParentFolder( const rtl::OUString& rURL )
3349*b1cdbd2cSJim Jagielski {
3350*b1cdbd2cSJim Jagielski 	m_aContent.bindTo( rURL );
3351*b1cdbd2cSJim Jagielski 
3352*b1cdbd2cSJim Jagielski 	if ( m_aContent.isInvalid() )
3353*b1cdbd2cSJim Jagielski 		return sal_False;
3354*b1cdbd2cSJim Jagielski 
3355*b1cdbd2cSJim Jagielski 	return m_aContent.hasParentFolder( ) && m_aContent.isValid();
3356*b1cdbd2cSJim Jagielski }
3357*b1cdbd2cSJim Jagielski 
ContentCanMakeFolder(const rtl::OUString & rURL)3358*b1cdbd2cSJim Jagielski sal_Bool SvtFileDialog::ContentCanMakeFolder( const rtl::OUString& rURL )
3359*b1cdbd2cSJim Jagielski {
3360*b1cdbd2cSJim Jagielski 	m_aContent.bindTo( rURL );
3361*b1cdbd2cSJim Jagielski 
3362*b1cdbd2cSJim Jagielski 	if ( m_aContent.isInvalid() )
3363*b1cdbd2cSJim Jagielski 		return sal_False;
3364*b1cdbd2cSJim Jagielski 
3365*b1cdbd2cSJim Jagielski 	return m_aContent.canCreateFolder( ) && m_aContent.isValid();
3366*b1cdbd2cSJim Jagielski }
3367*b1cdbd2cSJim Jagielski 
ContentGetTitle(const rtl::OUString & rURL,String & rTitle)3368*b1cdbd2cSJim Jagielski sal_Bool SvtFileDialog::ContentGetTitle( const rtl::OUString& rURL, String& rTitle )
3369*b1cdbd2cSJim Jagielski {
3370*b1cdbd2cSJim Jagielski 	m_aContent.bindTo( rURL );
3371*b1cdbd2cSJim Jagielski 
3372*b1cdbd2cSJim Jagielski 	if ( m_aContent.isInvalid() )
3373*b1cdbd2cSJim Jagielski 		return sal_False;
3374*b1cdbd2cSJim Jagielski 
3375*b1cdbd2cSJim Jagielski 	::rtl::OUString sTitle;
3376*b1cdbd2cSJim Jagielski 	m_aContent.getTitle( sTitle );
3377*b1cdbd2cSJim Jagielski 	rTitle = sTitle;
3378*b1cdbd2cSJim Jagielski 
3379*b1cdbd2cSJim Jagielski 	return m_aContent.isValid();
3380*b1cdbd2cSJim Jagielski }
3381*b1cdbd2cSJim Jagielski 
appendDefaultExtension(String & _rFileName,const String & _rFilterDefaultExtension,const String & _rFilterExtensions)3382*b1cdbd2cSJim Jagielski void SvtFileDialog::appendDefaultExtension(String& _rFileName,
3383*b1cdbd2cSJim Jagielski                                            const String& _rFilterDefaultExtension,
3384*b1cdbd2cSJim Jagielski                                            const String& _rFilterExtensions)
3385*b1cdbd2cSJim Jagielski {
3386*b1cdbd2cSJim Jagielski     String aTemp(_rFileName);
3387*b1cdbd2cSJim Jagielski     aTemp.ToLowerAscii();
3388*b1cdbd2cSJim Jagielski     String aType(_rFilterExtensions);
3389*b1cdbd2cSJim Jagielski     aType.ToLowerAscii();
3390*b1cdbd2cSJim Jagielski 
3391*b1cdbd2cSJim Jagielski     if ( ! aType.EqualsAscii(FILEDIALOG_FILTER_ALL) )
3392*b1cdbd2cSJim Jagielski     {
3393*b1cdbd2cSJim Jagielski         sal_uInt16 nWildCard = aType.GetTokenCount( FILEDIALOG_DEF_EXTSEP );
3394*b1cdbd2cSJim Jagielski         sal_uInt16 nIndex, nPos = 0;
3395*b1cdbd2cSJim Jagielski 
3396*b1cdbd2cSJim Jagielski         for ( nIndex = 0; nIndex < nWildCard; nIndex++ )
3397*b1cdbd2cSJim Jagielski         {
3398*b1cdbd2cSJim Jagielski             String aExt(aType.GetToken( 0, FILEDIALOG_DEF_EXTSEP, nPos ));
3399*b1cdbd2cSJim Jagielski             // take care of a leading *
3400*b1cdbd2cSJim Jagielski             sal_uInt16 nExtOffset = (aExt.GetBuffer()[0] == '*' ? 1 : 0);
3401*b1cdbd2cSJim Jagielski             sal_Unicode* pExt = aExt.GetBufferAccess() + nExtOffset;
3402*b1cdbd2cSJim Jagielski             xub_StrLen nExtLen = aExt.Len() - nExtOffset;
3403*b1cdbd2cSJim Jagielski             xub_StrLen nOffset = aTemp.Len() - nExtLen;
3404*b1cdbd2cSJim Jagielski             // minimize search by starting at last possible index
3405*b1cdbd2cSJim Jagielski             if ( aTemp.Search(pExt, nOffset) == nOffset )
3406*b1cdbd2cSJim Jagielski                 break;
3407*b1cdbd2cSJim Jagielski         }
3408*b1cdbd2cSJim Jagielski 
3409*b1cdbd2cSJim Jagielski         if ( nIndex >= nWildCard )
3410*b1cdbd2cSJim Jagielski         {
3411*b1cdbd2cSJim Jagielski             _rFileName += '.';
3412*b1cdbd2cSJim Jagielski             _rFileName += _rFilterDefaultExtension;
3413*b1cdbd2cSJim Jagielski         }
3414*b1cdbd2cSJim Jagielski     }
3415*b1cdbd2cSJim Jagielski }
3416*b1cdbd2cSJim Jagielski 
3417*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
3418*b1cdbd2cSJim Jagielski 
3419*b1cdbd2cSJim Jagielski // QueryFolderNameDialog -------------------------------------------------------
3420*b1cdbd2cSJim Jagielski 
3421*b1cdbd2cSJim Jagielski namespace svtools {
3422*b1cdbd2cSJim Jagielski 
QueryFolderNameDialog(Window * _pParent,const String & rTitle,const String & rDefaultText,String * pGroupName)3423*b1cdbd2cSJim Jagielski QueryFolderNameDialog::QueryFolderNameDialog
3424*b1cdbd2cSJim Jagielski (
3425*b1cdbd2cSJim Jagielski 	Window* _pParent,
3426*b1cdbd2cSJim Jagielski 	const String& rTitle,
3427*b1cdbd2cSJim Jagielski 	const String& rDefaultText,
3428*b1cdbd2cSJim Jagielski 	String* pGroupName
3429*b1cdbd2cSJim Jagielski ) :
3430*b1cdbd2cSJim Jagielski 	ModalDialog( _pParent, SvtResId( DLG_SVT_QUERYFOLDERNAME ) ),
3431*b1cdbd2cSJim Jagielski 
3432*b1cdbd2cSJim Jagielski 	aNameText	( this, SvtResId( FT_SVT_QUERYFOLDERNAME_DLG_NAME ) ),
3433*b1cdbd2cSJim Jagielski 	aNameEdit	( this, SvtResId( ED_SVT_QUERYFOLDERNAME_DLG_NAME ) ),
3434*b1cdbd2cSJim Jagielski 	aNameLine	( this, SvtResId( FL_SVT_QUERYFOLDERNAME_DLG_NAME ) ),
3435*b1cdbd2cSJim Jagielski 	aOKBtn		( this, SvtResId( BT_SVT_QUERYFOLDERNAME_DLG_OK ) ),
3436*b1cdbd2cSJim Jagielski 	aCancelBtn	( this, SvtResId( BT_SVT_QUERYFOLDERNAME_DLG_CANCEL ) )
3437*b1cdbd2cSJim Jagielski {
3438*b1cdbd2cSJim Jagielski 	FreeResource();
3439*b1cdbd2cSJim Jagielski 	SetText( rTitle );
3440*b1cdbd2cSJim Jagielski 	aNameEdit.SetText( rDefaultText );
3441*b1cdbd2cSJim Jagielski 	aNameEdit.SetSelection( Selection( 0, rDefaultText.Len() ) );
3442*b1cdbd2cSJim Jagielski 	aOKBtn.SetClickHdl( LINK( this, QueryFolderNameDialog, OKHdl ) );
3443*b1cdbd2cSJim Jagielski 	aNameEdit.SetModifyHdl( LINK( this, QueryFolderNameDialog, NameHdl ) );
3444*b1cdbd2cSJim Jagielski 
3445*b1cdbd2cSJim Jagielski 	if ( pGroupName )
3446*b1cdbd2cSJim Jagielski 		aNameLine.SetText( *pGroupName );
3447*b1cdbd2cSJim Jagielski };
3448*b1cdbd2cSJim Jagielski 
3449*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
IMPL_LINK(QueryFolderNameDialog,OKHdl,Button *,EMPTYARG)3450*b1cdbd2cSJim Jagielski IMPL_LINK( QueryFolderNameDialog, OKHdl, Button *, EMPTYARG )
3451*b1cdbd2cSJim Jagielski {
3452*b1cdbd2cSJim Jagielski 	// trim the strings
3453*b1cdbd2cSJim Jagielski 	aNameEdit.SetText( aNameEdit.GetText().EraseLeadingChars().EraseTrailingChars() );
3454*b1cdbd2cSJim Jagielski 	EndDialog( RET_OK );
3455*b1cdbd2cSJim Jagielski 	return 1;
3456*b1cdbd2cSJim Jagielski }
3457*b1cdbd2cSJim Jagielski 
3458*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
IMPL_LINK(QueryFolderNameDialog,NameHdl,Edit *,EMPTYARG)3459*b1cdbd2cSJim Jagielski IMPL_LINK( QueryFolderNameDialog, NameHdl, Edit *, EMPTYARG )
3460*b1cdbd2cSJim Jagielski {
3461*b1cdbd2cSJim Jagielski 	// trim the strings
3462*b1cdbd2cSJim Jagielski 	String aName = aNameEdit.GetText();
3463*b1cdbd2cSJim Jagielski 	aName.EraseLeadingChars().EraseTrailingChars();
3464*b1cdbd2cSJim Jagielski 	if ( aName.Len() )
3465*b1cdbd2cSJim Jagielski 	{
3466*b1cdbd2cSJim Jagielski 		if ( !aOKBtn.IsEnabled() )
3467*b1cdbd2cSJim Jagielski 			aOKBtn.Enable( sal_True );
3468*b1cdbd2cSJim Jagielski 	}
3469*b1cdbd2cSJim Jagielski 	else
3470*b1cdbd2cSJim Jagielski 	{
3471*b1cdbd2cSJim Jagielski 		if ( aOKBtn.IsEnabled() )
3472*b1cdbd2cSJim Jagielski 			aOKBtn.Enable( sal_False );
3473*b1cdbd2cSJim Jagielski 	}
3474*b1cdbd2cSJim Jagielski 
3475*b1cdbd2cSJim Jagielski 	return 0;
3476*b1cdbd2cSJim Jagielski }
3477*b1cdbd2cSJim Jagielski 
3478*b1cdbd2cSJim Jagielski }
3479