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