1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 #ifndef _IODLGIMPL_HXX 24 #define _IODLGIMPL_HXX 25 26 #ifndef _VCL_DIALOG_HXX 27 #include <vcl/dialog.hxx> 28 #endif 29 #ifndef _SV_BUTTON_HXX 30 #include <vcl/button.hxx> 31 #endif 32 #include <vcl/fixed.hxx> 33 #include <vcl/edit.hxx> 34 #include <vcl/combobox.hxx> 35 #include <vcl/lstbox.hxx> 36 #include <com/sun/star/beans/StringPair.hpp> 37 #include <com/sun/star/uno/Any.hxx> 38 #include <com/sun/star/uno/Sequence.hxx> 39 #include <com/sun/star/ucb/IOErrorCode.hpp> 40 #include <com/sun/star/ui/dialogs/XDialogClosedListener.hpp> 41 #include <unotools/confignode.hxx> 42 #include "svl/inettype.hxx" 43 #include "svl/urlfilter.hxx" 44 #include <svl/restrictedpaths.hxx> 45 #include "asyncfilepicker.hxx" 46 #include "OfficeControlAccess.hxx" 47 #include "fpsmartcontent.hxx" 48 49 #include <set> 50 51 // @@@ using namespace com::sun::star::ucb; 52 53 //***************************************************************************** 54 55 class SvTabListBox; 56 class SvStringsDtor; 57 class SvtFileView; 58 struct ControlChain_Impl; 59 class SvtFileDialogFilter_Impl; 60 61 //***************************************************************************** 62 63 #define SFXWB_INSERT ( 0x04000000L | WB_OPEN ) 64 #define SFXWB_PASSWORD WB_PASSWORD 65 #define SFXWB_READONLY WB_READONLY 66 #define SFXWB_PATHDIALOG WB_PATH 67 #define SFXWB_CLASSPATH ( 0x08000000L | SFXWB_PATHDIALOG ) 68 #define SFXWB_SHOWALLFOLDER 0x10000000L // alle Ordner auch Mail/News/... 69 #define SFXWB_MULTISELECTION 0x20000000L // Multiselection an 70 #define SFXWB_NOREMOTE 0x40000000L 71 #define SFXWB_SHOWVERSIONS 0x80000000L // Versionsauswahl anzeigen 72 73 #define SFX_EXTRA_AUTOEXTENSION 0x00000001L 74 #define SFX_EXTRA_FILTEROPTIONS 0x00000002L 75 #define SFX_EXTRA_SHOWVERSIONS 0x00000004L 76 #define SFX_EXTRA_INSERTASLINK 0x00000008L 77 #define SFX_EXTRA_SHOWPREVIEW 0x00000010L 78 #define SFX_EXTRA_TEMPLATES 0x00000020L 79 #define SFX_EXTRA_PLAYBUTTON 0x00000040L 80 #define SFX_EXTRA_SELECTION 0x00000080L 81 #define SFX_EXTRA_IMAGE_TEMPLATE 0x00000100L 82 83 #define RET_MANAGER 100 84 85 #define FILEDIALOG_FILTER_ALL "*.*" 86 87 //***************************************************************************** 88 // SvtFileDialog 89 //***************************************************************************** 90 91 class SvtExpFileDlg_Impl; 92 class SvtFileDialog : public ModalDialog, public ::svt::IFilePickerController 93 { 94 private: 95 // originally from VclFileDialog 96 ControlChain_Impl* _pUserControls; 97 98 CheckBox* _pCbReadOnly; 99 CheckBox* _pCbLinkBox; 100 CheckBox* _pCbPreviewBox; 101 CheckBox* _pCbSelection; 102 PushButton* _pPbPlay; 103 Window* _pPrevWin; 104 FixedBitmap* _pPrevBmp; 105 SvtFileView* _pFileView; 106 ::svt::IFilePickerListener* _pFileNotifier; 107 SvtExpFileDlg_Impl* _pImp; 108 WinBits _nExtraBits; 109 sal_Bool _bIsInExecute : 1; 110 111 ImageList m_aImages; 112 ::svt::SmartContent m_aContent; 113 114 ::svt::RestrictedPaths m_aURLFilter; 115 ::std::set< Control* > m_aDisabledControls; 116 117 ::utl::OConfigurationNode m_aConfiguration; 118 ::rtl::Reference< ::svt::AsyncPickerAction > 119 m_pCurrentAsyncAction; 120 ::com::sun::star::uno::Reference< 121 ::com::sun::star::ui::dialogs::XDialogClosedListener > 122 m_xListener; 123 bool m_bInExecuteAsync; 124 bool m_bHasFilename; 125 126 DECL_STATIC_LINK( SvtFileDialog, FilterSelectHdl_Impl, ListBox* ); 127 DECL_STATIC_LINK( SvtFileDialog, NewFolderHdl_Impl, PushButton* ); 128 DECL_STATIC_LINK( SvtFileDialog, ViewHdl_Impl, ImageButton* ); 129 DECL_STATIC_LINK( SvtFileDialog, OpenHdl_Impl, void* ); 130 DECL_LINK ( CancelHdl_Impl, void* ); 131 DECL_STATIC_LINK( SvtFileDialog, FileNameGetFocusHdl_Impl, void* ); 132 DECL_STATIC_LINK( SvtFileDialog, FileNameModifiedHdl_Impl, void* ); 133 134 void Init_Impl( WinBits nBits ); 135 /** find a filter with the given wildcard 136 @param _rFilter 137 the wildcard pattern to look for in the filter list 138 @param _bMultiExt 139 allow for filters with more than one extension pattern 140 @param _rFilterChanged 141 set to <TRUE/> if the filter changed 142 @return 143 the filter which has been found 144 */ 145 SvtFileDialogFilter_Impl* FindFilter_Impl( const String& _rFilter, 146 sal_Bool _bMultiExt, 147 sal_Bool& _rFilterChanged 148 ); 149 void ExecuteFilter(); 150 void OpenMultiSelection_Impl(); 151 void AddControls_Impl( ); 152 153 DECL_LINK( SelectHdl_Impl, SvTabListBox* ); 154 DECL_LINK( DblClickHdl_Impl, SvTabListBox* ); 155 DECL_LINK( EntrySelectHdl_Impl, ComboBox* ); 156 DECL_LINK( OpenDoneHdl_Impl, SvtFileView* ); 157 DECL_LINK( AutoExtensionHdl_Impl, CheckBox* ); 158 DECL_LINK( ClickHdl_Impl, CheckBox* ); 159 DECL_LINK( PlayButtonHdl_Impl, PushButton* ); 160 161 // entfernt einen Filter mit Wildcards aus dem Path und gibt in zurueck 162 sal_Bool IsolateFilterFromPath_Impl( String& rPath, String& rFilter ); 163 164 void implArrangeControls(); 165 void implUpdateImages( ); 166 167 protected: 168 virtual long Notify( NotifyEvent& rNEvt ); 169 void EnableInternet( sal_Bool bInternet ); 170 171 // originally from VclFileDialog 172 Link _aOKHdl; 173 Link _aFileSelectHdl; 174 Link _aFilterSelectHdl; 175 176 String _aPath; 177 String _aDefExt; 178 179 void ReleaseOwnerShip( Window* pUserControl ); 180 181 /** enables or disables the complete UI of the file picker, with only offering a 182 cancel button 183 184 This method preserves the "enabled" state of its controls in the following sense: 185 If you disable a certain control, then disable the dialog UI, then enable the dialog 186 UI, the control will still be disabled. 187 This is under the assumption that you'll use EnableControl. Direct access to the control 188 (such as pControl->Enable()) will break this. 189 */ 190 void EnableUI( sal_Bool _bEnable ); 191 192 /** enables or disables a control 193 194 You are strongly encouraged to prefer this method over pControl->Enable( _bEnable ). See 195 <member>EnableUI</member> for details. 196 */ 197 void EnableControl( Control* _pControl, sal_Bool _bEnable ); 198 short PrepareExecute(); 199 200 public: 201 SvtFileDialog( Window* _pParent, WinBits nBits, WinBits nExtraBits ); 202 SvtFileDialog( Window* _pParent, WinBits nBits ); 203 ~SvtFileDialog(); 204 205 virtual long OK(); 206 virtual short Execute(); 207 virtual void StartExecuteModal( const Link& rEndDialogHdl ); 208 209 void FileSelect(); 210 void FilterSelect(); 211 212 void SetBlackList( const ::com::sun::star::uno::Sequence< ::rtl::OUString >& rBlackList ); 213 const ::com::sun::star::uno::Sequence< ::rtl::OUString >& GetBlackList() const; 214 void SetStandardDir( const String& rStdDir ); 215 const String& GetStandardDir() const; 216 SvStringsDtor* GetPathList() const; // bei MultiSelektion 217 218 void AddFilter( const String& rFilter, 219 const String& rType ); 220 221 void AddFilterGroup( 222 const String& _rFilter, 223 const com::sun::star::uno::Sequence< com::sun::star::beans::StringPair >& rFilters ); 224 225 void SetCurFilter( const String& rFilter ); 226 String GetCurFilter() const; 227 sal_uInt16 GetFilterCount() const; 228 const String& GetFilterName( sal_uInt16 nPos ) const; 229 230 virtual void Resize(); 231 virtual void DataChanged( const DataChangedEvent& _rDCEvt ); 232 233 void PrevLevel_Impl(); 234 void OpenURL_Impl( const String& rURL ); 235 236 inline SvtFileView* GetView() const; 237 238 void DisableSaveLastDirectory(); 239 void InitSize(); 240 void UpdateControls( const String& rURL ); 241 void EnableAutocompletion( sal_Bool _bEnable = sal_True ); 242 243 void SetFileCallback( ::svt::IFilePickerListener *pNotifier ) { _pFileNotifier = pNotifier; } 244 245 sal_Int32 getTargetColorDepth(); 246 sal_Int32 getAvailableWidth(); 247 sal_Int32 getAvailableHeight(); 248 void setImage( sal_Int16 aImageFormat, const ::com::sun::star::uno::Any& rImage ); 249 sal_Bool setShowState( sal_Bool bShowState ); 250 sal_Bool getShowState(); 251 sal_Bool isAutoExtensionEnabled(); 252 253 String getCurrentFileText( ) const; 254 void setCurrentFileText( const String& _rText, bool _bSelectAll = false ); 255 256 void onAsyncOperationStarted(); 257 void onAsyncOperationFinished(); 258 259 void displayIOException( const String& _rURL, ::com::sun::star::ucb::IOErrorCode _eCode ); 260 void simulateAccessDenied( const String& _rURL ) 261 { 262 displayIOException( _rURL, ::com::sun::star::ucb::IOErrorCode_ACCESS_DENIED ); 263 } 264 265 // originally from VclFileDialog 266 virtual sal_Bool AddControl( Window* pControl, sal_Bool bNewLine = sal_False ); 267 268 // inline 269 inline void SetPath( const String& rNewURL ); 270 inline void SetHasFilename( bool bHasFilename ); 271 inline const String& GetPath() const; 272 inline void SetDefaultExt( const String& rExt ); 273 inline void EraseDefaultExt( xub_StrLen _nIndex = 0 ); 274 inline const String& GetDefaultExt() const; 275 inline void SetOKHdl( const Link& rLink ); 276 inline const Link& GetOKHdl() const; 277 inline void SetFileSelectHdl( const Link& rLink ); 278 inline const Link& GetFileSelectHdl() const; 279 inline void SetFilterSelectHdl( const Link& rLink ); 280 inline const Link& GetFilterSelectHdl() const; 281 282 inline Image GetButtonImage( sal_uInt16 _nButtonId ) const { return m_aImages.GetImage( _nButtonId ); } 283 284 sal_Bool ContentIsFolder( const rtl::OUString& rURL ) { return m_aContent.isFolder( rURL ) && m_aContent.isValid(); } 285 sal_Bool ContentHasParentFolder( const rtl::OUString& rURL ); 286 sal_Bool ContentCanMakeFolder( const rtl::OUString& rURL ); 287 sal_Bool ContentGetTitle( const rtl::OUString& rURL, String& rTitle ); 288 289 /** updates the sizes of the listboxes in the bottom area of the dialog, and of their labels, 290 according to the space occupied by the current label texts 291 292 @since #i42824# 293 */ 294 void updateListboxLabelSizes(); 295 296 /** checks URL access permissions 297 298 <p>with the "restriction" feature we have in the file dialog, it's possible that 299 only certain URLs can be browsed. This method checks whether a given URL belongs 300 to this set of permitted URLs.</p> 301 302 <p>If no "access restriction" is effective, this method always returns <TRUE/>.</p> 303 */ 304 inline bool isUrlAllowed( const String& _rURL ) const { return m_aURLFilter.isUrlAllowed( _rURL ); } 305 306 private: 307 SvtFileDialogFilter_Impl* implAddFilter( const String& _rFilter, const String& _rType ); 308 309 /** updates _pUserFilter with a new filter 310 <p>No checks for necessity are made.</p> 311 @param _bAllowUserDefExt 312 set to <TRUE/> if a filter like "*.txt" should reset the DefaultExtension to doc. 313 <p> 314 In a file-save-dialog this would have the following effect:<br/> 315 Say that auto-extension is checked, and the user enters *.txt, while a non-txt filter is selected.<br/> 316 If _bAllowUserDefExt is set to <TRUE/>, then a user input of "foo" would save a foo.txt, but in a format 317 which is determined by the filter selected (which is no txt file as said above).<br/> 318 If _bAllowUserDefExt is set to <FALSE/>, the default extension will be the one of the selected filter, means 319 in the above scenario a file "foo.<ext>" will be saved where ext is the extension of the selected filter. 320 </p> 321 @return <TRUE/> if the new filter is "*.*" 322 */ 323 sal_Bool createNewUserFilter( const String& _rNewFilter, sal_Bool _bAllowUserDefExt ); 324 325 sal_uInt16 adjustFilter( const String& _rFilter ); 326 327 // IFilePickerController, needed by OControlAccess 328 virtual Control* getControl( sal_Int16 _nControlId, sal_Bool _bLabelControl = sal_False ) const; 329 virtual void enableControl( sal_Int16 _nControlId, sal_Bool _bEnable ); 330 virtual String getCurFilter( ) const; 331 332 String implGetInitialURL( const String& _rPath, const String& _rFallback ); 333 334 /// initializes the special URL lists, such as our favourites and our restricted paths 335 void implInitializeSpecialURLLists( ); 336 337 /// executes a certain FileView action asynchronously 338 void executeAsync( 339 ::svt::AsyncPickerAction::Action _eAction, 340 const String& _rURL, 341 const String& _rFilter 342 ); 343 344 /** helper function to check and append the default filter extension if 345 necessary. 346 The function checks if the specified filename already contains one of 347 the valid extensions of the specified filter. If not the filter default 348 extension is appended to the filename. 349 350 @param _rFileName the filename which is checked and extended if necessary. 351 @param _rFilterDefaultExtension the default extension of the used filter. 352 @param _rFilterExtensions a list of one or more valid filter extensions 353 of the used filter. 354 355 */ 356 static void appendDefaultExtension( 357 String& _rFileName, 358 const String& _rFilterDefaultExtension, 359 const String& _rFilterExtensions); 360 }; 361 362 //*************************************************************************** 363 364 inline void SvtFileDialog::SetPath( const String& rNewURL ) 365 { 366 _aPath = rNewURL; 367 } 368 369 //*************************************************************************** 370 371 inline void SvtFileDialog::SetHasFilename( bool bHasFilename ) 372 { 373 m_bHasFilename = bHasFilename; 374 } 375 376 //*************************************************************************** 377 378 inline const String& SvtFileDialog::GetPath() const 379 { 380 return _aPath; 381 } 382 383 //*************************************************************************** 384 385 inline void SvtFileDialog::SetDefaultExt( const String& rExt ) 386 { 387 _aDefExt = rExt; 388 } 389 390 inline void SvtFileDialog::EraseDefaultExt( xub_StrLen _nIndex ) 391 { 392 _aDefExt.Erase( _nIndex ); 393 } 394 395 inline const String& SvtFileDialog::GetDefaultExt() const 396 { 397 return _aDefExt; 398 } 399 400 //***************************************************************************** 401 402 inline void SvtFileDialog::SetOKHdl 403 ( 404 const Link& rLink 405 ) 406 { 407 _aOKHdl = rLink; 408 } 409 410 //***************************************************************************** 411 412 inline const Link& SvtFileDialog::GetOKHdl() const 413 { 414 return _aOKHdl; 415 } 416 417 //***************************************************************************** 418 419 inline void SvtFileDialog::SetFileSelectHdl 420 ( 421 const Link& rLink 422 ) 423 { 424 _aFileSelectHdl = rLink; 425 } 426 427 //***************************************************************************** 428 429 inline const Link& SvtFileDialog::GetFileSelectHdl() const 430 { 431 return _aFileSelectHdl; 432 } 433 434 //***************************************************************************** 435 436 inline void SvtFileDialog::SetFilterSelectHdl 437 ( 438 const Link& rLink 439 ) 440 { 441 _aFilterSelectHdl = rLink; 442 } 443 444 //***************************************************************************** 445 446 inline const Link& SvtFileDialog::GetFilterSelectHdl() const 447 { 448 return _aFilterSelectHdl; 449 } 450 451 //***************************************************************************** 452 453 inline SvtFileView* SvtFileDialog::GetView() const 454 { 455 return _pFileView; 456 } 457 458 //***************************************************************************** 459 //***************************************************************************** 460 //***************************************************************************** 461 462 class SvtFilePicker; 463 464 #define FILE_SELECTION_CHANGED 1 465 #define DIRECTORY_CHANGED 2 466 #define HELP_REQUESTED 3 467 #define CTRL_STATE_CHANGED 4 468 #define DIALOG_SIZE_CHANGED 5 469 470 471 #endif // #ifndef _IODLG_HXX 472