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