25 #include "tdefiledialog.h" 31 #include <tqptrcollection.h> 32 #include <tqcheckbox.h> 33 #include <tqcombobox.h> 36 #include <tqlineedit.h> 37 #include <tqptrlist.h> 39 #include <tqtextcodec.h> 40 #include <tqtooltip.h> 42 #include <tqwhatsthis.h> 43 #include <tqfiledialog.h> 46 #include <tdeaction.h> 47 #include <tdeapplication.h> 48 #include <kcharsets.h> 49 #include <tdecmdlineargs.h> 50 #include <tdecompletionbox.h> 51 #include <tdeconfig.h> 53 #include <tdeglobal.h> 54 #include <tdeglobalsettings.h> 55 #include <kiconloader.h> 57 #include <tdeio/job.h> 58 #include <tdeio/netaccess.h> 59 #include <tdeio/scheduler.h> 60 #include <tdeio/kservicetypefactory.h> 61 #include <tdelocale.h> 62 #include <tdemessagebox.h> 63 #include <kmimetype.h> 64 #include <tdepopupmenu.h> 65 #include <kprotocolinfo.h> 66 #include <kpushbutton.h> 67 #include <tderecentdirs.h> 69 #include <kstandarddirs.h> 70 #include <kstdguiitem.h> 71 #include <kstaticdeleter.h> 72 #include <tdetoolbar.h> 73 #include <tdetoolbarbutton.h> 75 #include <kurlcombobox.h> 76 #include <kurlcompletion.h> 79 #include "config-tdefile.h" 80 #include "kpreviewwidgetbase.h" 82 #include <kdirselectdialog.h> 83 #include <tdefileview.h> 84 #include <tderecentdocument.h> 85 #include <tdefilefiltercombo.h> 86 #include <tdediroperator.h> 87 #include <kimagefilepreview.h> 89 #include <tdefilespeedbar.h> 90 #include <tdefilebookmarkhandler.h> 97 enum Buttons { HOTLIST_BUTTON,
98 PATH_COMBO, CONFIGURE_BUTTON };
100 template class TQPtrList<TDEIO::StatJob>;
103 static void silenceQToolBar(TQtMsgType,
const char *)
108 struct KFileDialogPrivate
121 TQBoxLayout *boxLayout;
122 TQWidget *mainWidget;
124 TQLabel *locationLabel;
127 TQLabel *filterLabel;
129 KPushButton *okButton, *cancelButton;
130 KFileSpeedBar *urlBar;
131 TQHBoxLayout *urlBarLayout;
132 TQWidget *customWidget;
135 TQCheckBox *autoSelectExtCheckBox;
136 bool autoSelectExtChecked;
139 TQPtrList<TDEIO::StatJob> statJobs;
143 TQStringList mimetypes;
147 bool keepLocation :1;
153 bool hasDefaultFilter :1;
159 KFileBookmarkHandler *bookmarkHandler;
162 int m_pathComboIndex;
165 KURL *KFileDialog::lastDirectory;
167 static KStaticDeleter<KURL> ldd;
170 TQWidget *parent,
const char* name,
bool modal)
171 : KDialogBase( parent, name, modal, TQString::null, 0 )
173 init( startDir, filter, 0 );
177 TQWidget *parent,
const char* name,
bool modal, TQWidget* widget)
178 : KDialogBase( parent, name, modal, TQString::null, 0 )
180 init( startDir, filter, widget );
188 TDEConfig *config = TDEGlobal::config();
191 d->urlBar->save( config );
195 delete d->bookmarkHandler;
202 d->locationLabel->setText(text);
207 int pos = filter.find(
'/');
212 if (pos > 0 && filter[pos - 1] !=
'\\') {
213 TQStringList filters = TQStringList::split(
" ", filter );
221 TQString copy (filter);
222 for (pos = 0; (pos = copy.find(
"\\/", pos)) != -1; ++pos)
226 filterWidget->setFilter(copy);
228 d->hasDefaultFilter =
false;
229 filterWidget->setEditable(
true );
236 return filterWidget->currentFilter();
241 const KMimeType::List &types,
242 const KMimeType::Ptr &defaultType)
244 d->mimetypes.clear();
245 d->filterLabel->setText(label);
247 KMimeType::List::ConstIterator it;
248 for( it = types.begin(); it != types.end(); ++it)
249 d->mimetypes.append( (*it)->name() );
255 const TQString& defaultType )
257 d->mimetypes = mimeTypes;
258 filterWidget->setMimeFilter( mimeTypes, defaultType );
260 TQStringList types = TQStringList::split(
" ", filterWidget->currentFilter());
261 types.append( TQString::fromLatin1(
"inode/directory" ));
264 d->hasDefaultFilter = !defaultType.isEmpty();
265 filterWidget->setEditable( !d->hasDefaultFilter ||
266 d->operationMode != Saving );
273 d->mimetypes.clear();
274 filterWidget->setFilter( TQString::null );
276 d->hasDefaultFilter =
false;
277 filterWidget->setEditable(
true );
284 int i = filterWidget->currentItem();
285 if (filterWidget->showsAllTypes())
288 if ((i >= 0) && (i < (int) d->mimetypes.count()))
289 return d->mimetypes[i];
290 return TQString::null;
312 TQString url = KShell::tildeExpand(_url);
315 if ( KURL::isRelativeURL(url) )
317 if (!url.isEmpty() && !TQDir::isRelativePath(url) )
333 void KFileDialog::slotOk()
335 kdDebug(tdefile_area) <<
"slotOK\n";
337 if (locationEdit->lineEdit()->edited())
339 enterURL(d->pathCombo->lineEdit()->text());
345 if ( (
mode() & KFile::Directory) != KFile::Directory ) {
346 if ( locationEdit->currentText().stripWhiteSpace().isEmpty() ) {
347 if ( !items || items->isEmpty() )
350 if ( d->operationMode == Saving )
351 msg = i18n(
"Please specify the filename to save to.");
353 msg = i18n(
"Please select the file to open.");
354 KMessageBox::information(
this, msg);
362 bool multi = (
mode() & KFile::Files) != 0;
363 KFileItemListIterator it( *items );
364 TQString endQuote = TQString::fromLatin1(
"\" ");
365 TQString name, files;
366 while ( it.current() ) {
367 name = (*it)->name();
370 name.append( endQuote );
373 files.append( name );
376 setLocationText( files );
385 if ( items && !locationEdit->lineEdit()->edited() &&
386 !(items->isEmpty() && !dirOnly) ) {
389 d->filenames = TQString::null;
395 if ( !(
mode() & KFile::Files) ) {
396 d->url = items->getFirst()->url();
401 KFileItemListIterator it( *items );
402 while ( it.current() ) {
403 d->urlList.append( (*it)->url() );
409 KURL url = TDEIO::NetAccess::mostLocalURL(d->url,topLevelWidget());
410 if ( (
mode() & KFile::LocalOnly) == KFile::LocalOnly &&
411 !url.isLocalFile() ) {
413 KMessageBox::sorry( d->mainWidget,
414 i18n(
"You can only select local files."),
415 i18n(
"Remote Files Not Accepted") );
427 if ( (
mode() & KFile::Files) == KFile::Files ) {
428 TQString locationText = locationEdit->currentText();
429 if ( locationText.contains(
'/' )) {
431 KURL u( ops->
url(), KShell::tildeExpand(locationText));
435 selectedURL = ops->
url();
438 selectedURL = ops->
url();
445 appendExtension (selectedURL);
448 if ( !selectedURL.isValid() ) {
449 KMessageBox::sorry( d->mainWidget, i18n(
"%1\ndoes not appear to be a valid URL.\n").arg(d->url.url()), i18n(
"Invalid URL") );
453 KURL url = TDEIO::NetAccess::mostLocalURL(selectedURL,topLevelWidget());
454 if ( (
mode() & KFile::LocalOnly) == KFile::LocalOnly &&
455 !url.isLocalFile() ) {
456 KMessageBox::sorry( d->mainWidget,
457 i18n(
"You can only select local files."),
458 i18n(
"Remote Files Not Accepted") );
466 if ( (
mode() & KFile::Directory) == KFile::Directory ) {
467 kdDebug(tdefile_area) <<
"Directory" << endl;
469 if ( d->url.isLocalFile() ) {
470 if ( locationEdit->currentText().stripWhiteSpace().isEmpty() ) {
471 TQFileInfo info( d->url.path() );
472 if ( info.isDir() ) {
473 d->filenames = TQString::null;
475 d->urlList.append( d->url );
478 else if (!info.exists() && (
mode() & KFile::File) != KFile::File) {
480 if ( ops->
mkdir( d->url.url(), true ))
487 if ( (
mode() & KFile::File) == KFile::File ||
488 (
mode() & KFile::Files) == KFile::Files )
494 if (
mode() & KFile::ExistingOnly )
498 KURL fullURL(d->url, locationEdit->currentText());
499 if ( TQFile::exists( fullURL.path() ) )
502 d->filenames = TQString::null;
512 d->filenames = locationEdit->currentText();
519 d->filenames = TQString::null;
521 d->urlList.append( d->url );
523 if (
mode() & KFile::ExistingOnly )
533 if (!kapp->authorizeURLAction(
"open", KURL(), d->url))
535 TQString msg = TDEIO::buildErrorString(TDEIO::ERR_ACCESS_DENIED, d->url.prettyURL());
536 KMessageBox::error( d->mainWidget, msg);
540 TDEIO::StatJob *job = 0L;
542 d->filenames = KShell::tildeExpand(locationEdit->currentText());
544 if ( (
mode() & KFile::Files) == KFile::Files &&
545 !locationEdit->currentText().contains(
'/' )) {
546 kdDebug(tdefile_area) <<
"Files\n";
547 KURL::List list = parseSelectedURLs();
548 for ( KURL::List::ConstIterator it = list.begin();
549 it != list.end(); ++it )
551 if (!kapp->authorizeURLAction(
"open", KURL(), *it))
553 TQString msg = TDEIO::buildErrorString(TDEIO::ERR_ACCESS_DENIED, (*it).prettyURL());
554 KMessageBox::error( d->mainWidget, msg);
558 for ( KURL::List::ConstIterator it = list.begin();
559 it != list.end(); ++it )
561 job = TDEIO::stat( *it, !(*it).isLocalFile() );
562 job->setWindow (topLevelWidget());
563 TDEIO::Scheduler::scheduleJob( job );
564 d->statJobs.append( job );
565 connect( job, TQT_SIGNAL( result(TDEIO::Job *) ),
566 TQT_SLOT( slotStatResult( TDEIO::Job *) ));
571 job = TDEIO::stat(d->url,!d->url.isLocalFile());
572 job->setWindow (topLevelWidget());
573 d->statJobs.append( job );
574 connect(job, TQT_SIGNAL(result(TDEIO::Job*)), TQT_SLOT(slotStatResult(TDEIO::Job*)));
578 static bool isDirectory (
const TDEIO::UDSEntry &t)
582 for (TDEIO::UDSEntry::ConstIterator it = t.begin();
586 if ((*it).m_uds == TDEIO::UDS_FILE_TYPE)
588 isDir = S_ISDIR ((mode_t) ((*it).m_long));
599 void KFileDialog::slotStatResult(TDEIO::Job* job)
601 kdDebug(tdefile_area) <<
"slotStatResult" << endl;
602 TDEIO::StatJob *sJob =
static_cast<TDEIO::StatJob *
>( job );
604 if ( !d->statJobs.removeRef( sJob ) ) {
608 int count = d->statJobs.count();
612 if (sJob->error() && count == 0 && !ops->
dirOnlyMode())
618 TDEIO::UDSEntry t = sJob->statResult();
623 d->filenames = TQString::null;
630 locationEdit->clearEdit();
631 locationEdit->lineEdit()->setEdited(
false );
643 kdDebug(tdefile_area) <<
"filename " << sJob->url().url() << endl;
649 void KFileDialog::accept()
651 setResult( TQDialog::Accepted );
653 *lastDirectory = ops->
url();
654 if (!d->fileClass.isEmpty())
658 locationEdit->changeItem( TQString::null, 0 );
661 TQValueListConstIterator<KURL> it = list.begin();
662 for ( ; it != list.end(); ++it ) {
663 const KURL& url = *it;
667 TQString file = url.isLocalFile() ? url.path(-1) : url.prettyURL(-1);
670 for (
int i = 1; i < locationEdit->count(); i++ ) {
671 if ( locationEdit->text( i ) == file ) {
672 locationEdit->removeItem( i-- );
676 locationEdit->insertItem( file, 1 );
679 TDEConfig *config = TDEGlobal::config();
680 config->setForceGlobal(
true );
682 config->setForceGlobal(
false );
687 KDialogBase::accept();
689 addToRecentDocuments();
691 if ( (
mode() & KFile::Files) != KFile::Files )
705 if ( (ops->
mode() & KFile::Files) != KFile::Files ) {
711 if ( !locationEdit->hasFocus() ) {
712 setLocationText( i->name() );
728 if ( (ops->
mode() & KFile::Files) != KFile::Files ) {
733 setLocationText( i->name() );
747 if ( locationEdit->hasFocus() )
750 locationEdit->lineEdit()->setEdited(
false );
754 locationEdit->clearEdit();
758 static const TQString &begin = TDEGlobal::staticQString(
" \"");
759 KFileItemListIterator it ( *list );
761 while ( (item = it.current()) ) {
762 text.append( begin ).append( item->name() ).append(
'\"' );
766 setLocationText( text.stripWhiteSpace() );
769 void KFileDialog::setLocationText(
const TQString& text )
774 disconnect( locationEdit, TQT_SIGNAL( textChanged(
const TQString& ) ),
775 this, TQT_SLOT( slotLocationChanged(
const TQString& ) ) );
776 locationEdit->setCurrentItem( 0 );
777 connect( locationEdit, TQT_SIGNAL( textChanged(
const TQString& ) ),
778 TQT_SLOT( slotLocationChanged(
const TQString& )) );
779 locationEdit->setEditText( text );
782 if ( d->operationMode == Saving && !locationEdit->isVisible())
783 setNonExtSelection();
786 static const char autocompletionWhatsThisText[] = I18N_NOOP(
"<p>While typing in the text area, you may be presented " 787 "with possible matches. " 788 "This feature can be controlled by clicking with the right mouse button " 789 "and selecting a preferred mode from the <b>Text Completion</b> menu.")
"</qt>";
790 void KFileDialog::updateLocationWhatsThis (
void)
792 TQString whatsThisText;
793 if (d->operationMode == KFileDialog::Saving)
795 whatsThisText =
"<qt>" + i18n(
"This is the name to save the file as.") +
796 i18n (autocompletionWhatsThisText);
798 else if (ops->
mode() & KFile::Files)
800 whatsThisText =
"<qt>" + i18n(
"This is the list of files to open. More than " 801 "one file can be specified by listing several " 802 "files, separated by spaces.") +
803 i18n (autocompletionWhatsThisText);
807 whatsThisText =
"<qt>" + i18n(
"This is the name of the file to open.") +
808 i18n (autocompletionWhatsThisText);
811 TQWhatsThis::add(d->locationLabel, whatsThisText);
812 TQWhatsThis::add(locationEdit, whatsThisText);
818 d =
new KFileDialogPrivate();
821 d->keepLocation =
false;
822 d->operationMode = Opening;
823 d->bookmarkHandler = 0;
824 d->hasDefaultFilter =
false;
826 d->mainWidget =
new TQWidget(
this,
"KFileDialog::mainWidget");
827 setMainWidget( d->mainWidget );
828 d->okButton =
new KPushButton( KStdGuiItem::ok(), d->mainWidget );
829 d->okButton->setDefault(
true );
830 d->cancelButton =
new KPushButton(KStdGuiItem::cancel(), d->mainWidget);
831 connect( d->okButton, TQT_SIGNAL( clicked() ), TQT_SLOT( slotOk() ));
832 connect( d->cancelButton, TQT_SIGNAL( clicked() ), TQT_SLOT( slotCancel() ));
833 d->customWidget = widget;
834 d->autoSelectExtCheckBox = 0;
835 d->autoSelectExtChecked =
false;
838 TQtMsgHandler oldHandler = tqInstallMsgHandler( silenceQToolBar );
839 toolbar =
new TDEToolBar( d->mainWidget,
"KFileDialog::toolbar",
true);
840 toolbar->setFlat(
true);
841 tqInstallMsgHandler( oldHandler );
843 d->pathCombo =
new KURLComboBox( KURLComboBox::Directories,
true,
844 toolbar,
"path combo" );
845 TQToolTip::add( d->pathCombo, i18n(
"Current location") );
846 TQWhatsThis::add( d->pathCombo,
"<qt>" + i18n(
"This is the currently listed location. " 847 "The drop-down list also lists commonly used locations. " 848 "This includes standard locations, such as your home folder, as well as " 849 "locations that have been visited recently.") + i18n (autocompletionWhatsThisText));
852 u.setPath( TQDir::rootDirPath() );
853 TQString text = i18n(
"Root Folder: %1").arg( u.path() );
854 d->pathCombo->addDefaultURL( u,
855 KMimeType::pixmapForURL( u, 0, TDEIcon::Small ),
858 u.setPath( TQDir::homeDirPath() );
859 text = i18n(
"Home Folder: %1").arg( u.path( +1 ) );
860 d->pathCombo->addDefaultURL( u, KMimeType::pixmapForURL( u, 0, TDEIcon::Small ),
864 docPath.setPath( TDEGlobalSettings::documentPath() );
865 if ( (u.path(+1) != docPath.path(+1)) &&
866 TQDir(docPath.path(+1)).exists() )
868 text = i18n(
"Documents: %1").arg( docPath.path( +1 ) );
869 d->pathCombo->addDefaultURL( docPath,
870 KMimeType::pixmapForURL( docPath, 0, TDEIcon::Small ),
874 u.setPath( TDEGlobalSettings::desktopPath() );
875 text = i18n(
"Desktop: %1").arg( u.path( +1 ) );
876 d->pathCombo->addDefaultURL( u,
877 KMimeType::pixmapForURL( u, 0, TDEIcon::Small ),
881 d->selection = d->url.url();
884 if ( d->url.isLocalFile() )
886 if ( !TQFile::exists( d->url.path() ) )
888 d->url = d->url.upURL();
889 TQDir dir( d->url.path() );
890 while ( !dir.exists() )
892 d->url = d->url.upURL();
893 dir.setPath( d->url.path() );
898 ops =
new KDirOperator(d->url, d->mainWidget,
"KFileDialog::ops");
900 connect(ops, TQT_SIGNAL(urlEntered(
const KURL&)),
901 TQT_SLOT(urlEntered(
const KURL&)));
904 connect(ops, TQT_SIGNAL(
fileSelected(
const KFileItem *)),
906 connect(ops, TQT_SIGNAL(finishedLoading()),
907 TQT_SLOT(slotLoadingFinished()));
909 ops->
setupMenu(KDirOperator::SortActions |
910 KDirOperator::FileActions |
911 KDirOperator::ViewActions);
915 coll->action(
"up" )->plug( toolbar );
916 coll->action(
"up" )->setWhatsThis(i18n(
"<qt>Click this button to enter the parent folder.<p>" 917 "For instance, if the current location is file:/home/%1 clicking this " 918 "button will take you to file:/home.</qt>").arg( KUser().loginName() ));
919 coll->action(
"back" )->plug( toolbar );
920 coll->action(
"back" )->setWhatsThis(i18n(
"Click this button to move backwards one step in the browsing history."));
921 coll->action(
"forward" )->plug( toolbar );
922 coll->action(
"forward" )->setWhatsThis(i18n(
"Click this button to move forward one step in the browsing history."));
923 coll->action(
"reload" )->plug( toolbar );
924 coll->action(
"reload" )->setWhatsThis(i18n(
"Click this button to reload the contents of the current location."));
925 coll->action(
"mkdir" )->setShortcut(Key_F10);
926 coll->action(
"mkdir" )->plug( toolbar );
927 coll->action(
"mkdir" )->setWhatsThis(i18n(
"Click this button to create a new folder."));
929 TDEToggleAction *showSidebarAction =
930 new TDEToggleAction(i18n(
"Show Quick Access Navigation Panel"), Key_F9, coll,
"toggleSpeedbar");
931 showSidebarAction->setCheckedState(i18n(
"Hide Quick Access Navigation Panel"));
932 connect( showSidebarAction, TQT_SIGNAL( toggled(
bool ) ),
935 TDEToggleAction *showBookmarksAction =
936 new TDEToggleAction(i18n(
"Show Bookmarks"), 0, coll,
"toggleBookmarks");
937 showBookmarksAction->setCheckedState(i18n(
"Hide Bookmarks"));
938 connect( showBookmarksAction, TQT_SIGNAL( toggled(
bool ) ),
941 TDEActionMenu *menu =
new TDEActionMenu( i18n(
"Configure"),
"configure", TQT_TQOBJECT(
this),
"extra menu" );
942 menu->setWhatsThis(i18n(
"<qt>This is the configuration menu for the file dialog. " 943 "Various options can be accessed from this menu including: <ul>" 944 "<li>how files are sorted in the list</li>" 945 "<li>types of view, including icon and list</li>" 946 "<li>showing of hidden files</li>" 947 "<li>the Quick Access navigation panel</li>" 948 "<li>file previews</li>" 949 "<li>separating folders from files</li></ul></qt>"));
950 menu->insert( coll->action(
"sorting menu" ));
951 menu->insert( coll->action(
"separator" ));
952 coll->action(
"short view" )->setShortcut(Key_F6);
953 menu->insert( coll->action(
"short view" ));
954 coll->action(
"detailed view" )->setShortcut(Key_F7);
955 menu->insert( coll->action(
"detailed view" ));
956 menu->insert( coll->action(
"separator" ));
957 coll->action(
"show hidden" )->setShortcut(Key_F8);
958 menu->insert( coll->action(
"show hidden" ));
959 menu->insert( showSidebarAction );
960 menu->insert( showBookmarksAction );
961 coll->action(
"preview" )->setShortcut(Key_F11);
962 menu->insert( coll->action(
"preview" ));
963 coll->action(
"separate dirs" )->setShortcut(Key_F12);
964 menu->insert( coll->action(
"separate dirs" ));
966 menu->setDelayed(
false );
967 connect( menu->popupMenu(), TQT_SIGNAL( aboutToShow() ),
968 ops, TQT_SLOT( updateSelectionDependentActions() ));
969 menu->plug( toolbar );
972 TDEToolBarSeparator* spacerWidget =
new TDEToolBarSeparator(Qt::Horizontal,
false ,
974 d->m_pathComboIndex = toolbar->insertWidget(-1, -1, spacerWidget);
975 toolbar->insertWidget(PATH_COMBO, 0, d->pathCombo);
978 toolbar->setItemAutoSized (PATH_COMBO);
979 toolbar->setIconText(TDEToolBar::IconOnly);
980 toolbar->setBarPos(TDEToolBar::Top);
981 toolbar->setMovingEnabled(
false);
982 toolbar->adjustSize();
984 KURLCompletion *pathCompletionObj =
new KURLCompletion( KURLCompletion::DirCompletion );
985 d->pathCombo->setCompletionObject( pathCompletionObj );
986 d->pathCombo->setAutoDeleteCompletionObject(
true );
988 connect( d->pathCombo, TQT_SIGNAL( urlActivated(
const KURL& )),
989 this, TQT_SLOT( enterURL(
const KURL& ) ));
990 connect( d->pathCombo, TQT_SIGNAL( returnPressed(
const TQString& )),
991 this, TQT_SLOT( enterURL(
const TQString& ) ));
992 connect( d->pathCombo, TQT_SIGNAL( activated(
const TQString& )),
993 this, TQT_SLOT( enterURL(
const TQString& ) ));
995 TQString whatsThisText;
998 d->locationLabel =
new TQLabel(i18n(
"&Location:"), d->mainWidget);
999 locationEdit =
new KURLComboBox(KURLComboBox::Files,
true,
1000 d->mainWidget,
"LocationEdit");
1001 locationEdit->setSizePolicy(TQSizePolicy(TQSizePolicy::Expanding, TQSizePolicy::Fixed));
1002 connect( locationEdit, TQT_SIGNAL( textChanged(
const TQString& ) ),
1003 TQT_SLOT( slotLocationChanged(
const TQString& )) );
1005 updateLocationWhatsThis ();
1006 d->locationLabel->setBuddy(locationEdit);
1008 locationEdit->setFocus();
1009 KURLCompletion *fileCompletionObj =
new KURLCompletion( KURLCompletion::FileCompletion );
1010 TQString dir = d->url.url(+1);
1011 pathCompletionObj->setDir( dir );
1012 fileCompletionObj->setDir( dir );
1013 locationEdit->setCompletionObject( fileCompletionObj );
1014 locationEdit->setAutoDeleteCompletionObject(
true );
1015 connect( fileCompletionObj, TQT_SIGNAL( match(
const TQString& ) ),
1016 TQT_SLOT( fileCompletion(
const TQString& )) );
1018 connect( locationEdit, TQT_SIGNAL( returnPressed() ),
1019 this, TQT_SLOT( slotOk()));
1020 connect(locationEdit, TQT_SIGNAL( activated(
const TQString& )),
1021 this, TQT_SLOT( locationActivated(
const TQString& ) ));
1024 whatsThisText = i18n(
"<qt>This is the filter to apply to the file list. " 1025 "File names that do not match the filter will not be shown.<p>" 1026 "You may select from one of the preset filters in the " 1027 "drop down menu, or you may enter a custom filter " 1028 "directly into the text area.<p>" 1029 "Wildcards such as * and ? are allowed.</qt>");
1030 d->filterLabel =
new TQLabel(i18n(
"&Filter:"), d->mainWidget);
1031 TQWhatsThis::add(d->filterLabel, whatsThisText);
1032 filterWidget =
new KFileFilterCombo(d->mainWidget,
1033 "KFileDialog::filterwidget");
1034 filterWidget->setSizePolicy(TQSizePolicy(TQSizePolicy::Expanding, TQSizePolicy::Fixed));
1035 TQWhatsThis::add(filterWidget, whatsThisText);
1037 d->filterLabel->setBuddy(filterWidget);
1038 connect(filterWidget, TQT_SIGNAL(
filterChanged()), TQT_SLOT(slotFilterChanged()));
1042 d->autoSelectExtCheckBox =
new TQCheckBox (d->mainWidget);
1043 connect(d->autoSelectExtCheckBox, TQT_SIGNAL(clicked()), TQT_SLOT(slotAutoSelectExtClicked()));
1047 TDEConfig* config = TDEGlobal::config();
1057 void KFileDialog::initSpeedbar()
1059 d->urlBar =
new KFileSpeedBar( d->mainWidget,
"url bar" );
1060 connect( d->urlBar, TQT_SIGNAL( activated(
const KURL& )),
1061 TQT_SLOT( enterURL(
const KURL& )) );
1067 d->urlBar->setCurrentItem( d->url );
1069 d->urlBarLayout->insertWidget( 0, d->urlBar );
1074 delete d->boxLayout;
1076 d->boxLayout =
new TQVBoxLayout( d->mainWidget, 0, KDialog::spacingHint());
1077 d->boxLayout->addWidget(toolbar, AlignTop);
1079 d->urlBarLayout =
new TQHBoxLayout( d->boxLayout );
1080 TQVBoxLayout *vbox =
new TQVBoxLayout( d->urlBarLayout );
1082 vbox->addWidget(ops, 4);
1083 vbox->addSpacing(3);
1085 TQGridLayout* lafBox=
new TQGridLayout(2, 3, KDialog::spacingHint());
1087 lafBox->addWidget(d->locationLabel, 0, 0, Qt::AlignVCenter);
1088 lafBox->addWidget(locationEdit, 0, 1, Qt::AlignVCenter);
1089 lafBox->addWidget(d->okButton, 0, 2, Qt::AlignVCenter);
1091 lafBox->addWidget(d->filterLabel, 1, 0, Qt::AlignVCenter);
1092 lafBox->addWidget(filterWidget, 1, 1, Qt::AlignVCenter);
1093 lafBox->addWidget(d->cancelButton, 1, 2, Qt::AlignVCenter);
1095 lafBox->setColStretch(1, 4);
1097 vbox->addLayout(TQT_TQLAYOUT(lafBox), 0);
1098 vbox->addSpacing(3);
1101 vbox->addWidget (d->autoSelectExtCheckBox);
1102 vbox->addSpacing (3);
1104 setTabOrder(ops, d->autoSelectExtCheckBox);
1105 setTabOrder (d->autoSelectExtCheckBox, locationEdit);
1106 setTabOrder(locationEdit, filterWidget);
1107 setTabOrder(filterWidget, d->okButton);
1108 setTabOrder(d->okButton, d->cancelButton);
1109 setTabOrder(d->cancelButton, d->pathCombo);
1110 setTabOrder(d->pathCombo, ops);
1113 if ( d->customWidget != 0 )
1118 d->customWidget->reparent( d->mainWidget, TQPoint() );
1120 vbox->addWidget( d->customWidget );
1121 vbox->addSpacing(3);
1128 setTabOrder(d->cancelButton, d->customWidget);
1129 setTabOrder(d->customWidget, d->pathCombo);
1133 setTabOrder(d->cancelButton, d->pathCombo);
1136 setTabOrder(d->pathCombo, ops);
1139 void KFileDialog::slotFilterChanged()
1141 TQString filter = filterWidget->currentFilter();
1144 if ( filter.find(
'/' ) > -1 ) {
1145 TQStringList types = TQStringList::split(
" ", filter );
1146 types.prepend(
"inode/directory" );
1162 d->selection = TQString::null;
1163 ops->
setURL( url, clearforward);
1167 void KFileDialog::urlEntered(
const KURL& url)
1169 TQString filename = locationEdit->currentText();
1170 d->selection = TQString::null;
1172 if ( d->pathCombo->count() != 0 ) {
1173 d->pathCombo->setURL( url );
1176 if (url.protocol()==
"beagle" && url.path()==
"/") {
1177 d->pathCombo->setEditText(
"beagle:/<"+i18n(
"search term")+
">");
1178 d->pathCombo->lineEdit()->setSelection(8,255);
1179 d->pathCombo->setFocus();
1182 locationEdit->blockSignals(
true );
1183 locationEdit->setCurrentItem( 0 );
1184 if ( d->keepLocation )
1185 locationEdit->setEditText( filename );
1187 locationEdit->blockSignals(
false );
1189 TQString dir = url.url(+1);
1190 static_cast<KURLCompletion*
>( d->pathCombo->completionObject() )->setDir( dir );
1191 static_cast<KURLCompletion*
>( locationEdit->completionObject() )->setDir( dir );
1194 d->urlBar->setCurrentItem( url );
1197 void KFileDialog::locationActivated(
const TQString& url )
1204 if (!locationEdit->lineEdit()->edited())
1208 void KFileDialog::enterURL(
const KURL& url)
1213 void KFileDialog::enterURL(
const TQString& url )
1215 setURL( KURL::fromPathOrURL( KURLCompletion::replacedPath( url,
true,
true )) );
1229 kdDebug(tdefile_area) <<
"setSelection " << url << endl;
1231 if (url.isEmpty()) {
1232 d->selection = TQString::null;
1238 kdWarning() << url <<
" is not a correct argument for setSelection!" << endl;
1242 if (!KProtocolInfo::supportsListing(u)) {
1243 locationEdit->lineEdit()->setEdited(
true );
1250 KFileItem i(KFileItem::Unknown, KFileItem::Unknown, u,
true );
1252 if ( i.isDir() && u.isLocalFile() && TQFile::exists( u.path() ) ) {
1260 TQString filename = u.url();
1261 int sep = filename.findRev(
'/');
1263 if ( KProtocolInfo::supportsListing( u )) {
1265 dir.setQuery( TQString::null );
1266 dir.setFileName( TQString::null );
1272 filename = u.fileName();
1273 kdDebug(tdefile_area) <<
"filename " << filename << endl;
1274 d->selection = filename;
1275 setLocationText( filename );
1284 locationEdit->lineEdit()->setEdited(
true );
1287 d->url = ops->
url();
1288 d->url.addPath(filename);
1292 void KFileDialog::slotLoadingFinished()
1294 if ( !d->selection.isNull() )
1305 void KFileDialog::fileCompletion(
const TQString& match )
1307 if ( match.isEmpty() && ops->
view() )
1313 void KFileDialog::slotLocationChanged(
const TQString& text )
1315 if ( text.isEmpty() && ops->
view() )
1323 kdWarning() <<
"KFileDialog::updateStatusLine is deprecated! The status line no longer exists. Do not try and use it!" << endl;
1327 const TQString& filter,
1328 TQWidget *parent,
const TQString& caption)
1330 KFileDialog dlg(startDir, filter, parent,
"filedialog",
true);
1333 dlg.
setMode( KFile::File | KFile::LocalOnly );
1334 dlg.setCaption(caption.isNull() ? i18n(
"Open") : caption);
1343 const TQString& filter,
1344 WId parent_id,
const TQString& caption)
1346 TQWidget* parent = TQT_TQWIDGET(TQWidget::find( parent_id ));
1347 KFileDialog dlg(startDir, filter, parent,
"filedialog",
true);
1349 if( parent == NULL && parent_id != 0 )
1350 XSetTransientForHint( tqt_xdisplay(), dlg.winId(), parent_id );
1357 dlg.
setMode( KFile::File | KFile::LocalOnly );
1358 dlg.setCaption(caption.isNull() ? i18n(
"Open") : caption);
1367 const TQString& filter,
1369 const TQString& caption)
1371 KFileDialog dlg(startDir, filter, parent,
"filedialog",
true);
1374 dlg.setCaption(caption.isNull() ? i18n(
"Open") : caption);
1375 dlg.
setMode(KFile::Files | KFile::LocalOnly);
1383 TQWidget *parent,
const TQString& caption)
1385 KFileDialog dlg(startDir, filter, parent,
"filedialog",
true);
1388 dlg.setCaption(caption.isNull() ? i18n(
"Open") : caption);
1397 const TQString& filter,
1399 const TQString& caption)
1401 KFileDialog dlg(startDir, filter, parent,
"filedialog",
true);
1404 dlg.setCaption(caption.isNull() ? i18n(
"Open") : caption);
1414 const TQString& caption)
1421 const TQString& caption)
1424 return TQFileDialog::getExistingDirectory(startDir, parent,
"getExistingDirectory",
1425 caption,
true,
true);
1429 if ( url.isValid() )
1432 return TQString::null;
1437 const TQString& caption)
1439 TQStringList mimetypes = KImageIO::mimeTypes( KImageIO::Reading );
1441 mimetypes.join(
" "),
1442 parent,
"filedialog",
true);
1444 dlg.setCaption( caption.isNull() ? i18n(
"Open") : caption );
1445 dlg.setMode( KFile::File );
1448 dlg.setPreviewWidget( ip );
1451 return dlg.selectedURL();
1456 if ( result() == TQDialog::Accepted )
1465 if ( result() == TQDialog::Accepted ) {
1466 if ( (ops->
mode() & KFile::Files) == KFile::Files )
1467 list = parseSelectedURLs();
1469 list.append( d->url );
1475 KURL::List& KFileDialog::parseSelectedURLs()
const 1477 if ( d->filenames.isEmpty() ) {
1482 if ( d->filenames.contains(
'/' )) {
1483 static const TQString &prot = TDEGlobal::staticQString(
":/");
1485 if ( d->filenames.find( prot ) != -1 )
1488 u.setPath( d->filenames );
1491 d->urlList.append( u );
1493 KMessageBox::error( d->mainWidget,
1494 i18n(
"The chosen filenames do not\n" 1495 "appear to be valid."),
1496 i18n(
"Invalid Filenames") );
1500 d->urlList =
tokenize( d->filenames );
1502 d->filenames = TQString::null;
1512 KURL u( ops->
url() );
1515 int count = line.contains(
'"' );
1517 u.setFileName( line );
1524 if ( (count % 2) == 1 ) {
1526 KMessageBox::sorry(that, i18n(
"The requested filenames\n" 1528 "do not appear to be valid;\n" 1529 "make sure every filename is enclosed in double quotes.").arg(line),
1530 i18n(
"Filename Error"));
1535 int index1 = -1, index2 = -1;
1537 index1 = line.find(
'"', start );
1538 index2 = line.find(
'"', index1 + 1 );
1544 name = line.mid( index1 + 1, index2 - index1 - 1 );
1545 u.setFileName( name );
1557 if ( result() == TQDialog::Accepted )
1559 KURL url = TDEIO::NetAccess::mostLocalURL(d->url,topLevelWidget());
1560 if (url.isLocalFile())
1563 KMessageBox::sorry( d->mainWidget,
1564 i18n(
"You can only select local files."),
1565 i18n(
"Remote Files Not Accepted") );
1568 return TQString::null;
1576 if ( result() == TQDialog::Accepted ) {
1577 if ( (ops->
mode() & KFile::Files) == KFile::Files ) {
1578 KURL::List urls = parseSelectedURLs();
1579 TQValueListConstIterator<KURL> it = urls.begin();
1580 while ( it != urls.end() ) {
1581 url = TDEIO::NetAccess::mostLocalURL(*it,topLevelWidget());
1582 if ( url.isLocalFile() )
1583 list.append( url.path() );
1589 if ( d->url.isLocalFile() )
1590 list.append( d->url.path() );
1604 const TQString& caption)
1606 bool specialDir = dir.at(0) ==
':';
1607 KFileDialog dlg( specialDir ? dir : TQString::null, filter, parent,
"filedialog",
true);
1612 dlg.setCaption(caption.isNull() ? i18n(
"Save As") : caption);
1617 if (!filename.isEmpty())
1625 const TQString& caption)
1627 bool specialDir = dir.at(0) ==
':';
1628 TQWidget* parent = TQT_TQWIDGET(TQWidget::find( parent_id ));
1629 KFileDialog dlg( specialDir ? dir : TQString::null, filter, parent,
"filedialog",
true);
1631 if( parent == NULL && parent_id != 0 )
1632 XSetTransientForHint(tqt_xdisplay(), dlg.winId(), parent_id);
1641 dlg.setCaption(caption.isNull() ? i18n(
"Save As") : caption);
1646 if (!filename.isEmpty())
1653 TQWidget *parent,
const TQString& caption)
1655 bool specialDir = dir.at(0) ==
':';
1656 KFileDialog dlg(specialDir ? dir : TQString::null, filter, parent,
"filedialog",
true);
1660 dlg.setCaption(caption.isNull() ? i18n(
"Save As") : caption);
1672 void KFileDialog::show()
1674 if ( !d->hasView ) {
1680 KDialogBase::show();
1687 filterWidget->setDefaultFilter( i18n(
"*|All Folders") );
1690 filterWidget->setDefaultFilter( i18n(
"*|All Files") );
1698 setMode(static_cast<KFile::Mode>( m ));
1712 TQString oldGroup = kc->group();
1713 if ( !group.isEmpty() )
1714 kc->setGroup( group );
1719 combo->
setURLs( kc->readPathListEntry( RecentURLs ), KURLComboBox::RemoveTop );
1720 combo->
setMaxItems( kc->readNumEntry( RecentURLsNumber,
1721 DefaultRecentURLsNumber ) );
1723 autoDirectoryFollowing = kc->readBoolEntry( AutoDirectoryFollowing,
1724 DefaultDirectoryFollowing );
1726 TDEGlobalSettings::Completion cm = (TDEGlobalSettings::Completion)
1727 kc->readNumEntry( PathComboCompletionMode,
1728 TDEGlobalSettings::completionMode() );
1729 if ( cm != TDEGlobalSettings::completionMode() )
1730 combo->setCompletionMode( cm );
1732 cm = (TDEGlobalSettings::Completion)
1733 kc->readNumEntry( LocationComboCompletionMode,
1734 TDEGlobalSettings::completionMode() );
1735 if ( cm != TDEGlobalSettings::completionMode() )
1736 locationEdit->setCompletionMode( cm );
1745 d->autoSelectExtChecked = kc->readBoolEntry (AutoSelectExtChecked, DefaultAutoSelectExtChecked);
1748 int w1 = minimumSize().width();
1749 int w2 = toolbar->sizeHint().width() + 10;
1751 setMinimumWidth(w2);
1753 TQSize size = configDialogSize( group );
1755 kc->setGroup( oldGroup );
1763 TQString oldGroup = kc->group();
1764 if ( !group.isEmpty() )
1765 kc->setGroup( group );
1767 kc->writePathEntry( RecentURLs, d->pathCombo->urls() );
1768 saveDialogSize( group,
true );
1769 kc->writeEntry( PathComboCompletionMode, static_cast<int>(d->pathCombo->completionMode()) );
1770 kc->writeEntry( LocationComboCompletionMode, static_cast<int>(locationEdit->completionMode()) );
1771 kc->writeEntry( ShowSpeedbar, d->urlBar && !d->urlBar->isHidden() );
1772 kc->writeEntry( ShowBookmarks, d->bookmarkHandler != 0 );
1773 kc->writeEntry( AutoSelectExtChecked, d->autoSelectExtChecked );
1776 kc->setGroup( oldGroup );
1782 TQString oldGroup = kc->group();
1783 kc->setGroup( ConfigGroup );
1785 locationEdit->
setMaxItems( kc->readNumEntry( RecentFilesNumber,
1786 DefaultRecentURLsNumber ) );
1787 locationEdit->
setURLs( kc->readPathListEntry( RecentFiles ),
1788 KURLComboBox::RemoveBottom );
1789 locationEdit->insertItem( TQString::null, 0 );
1790 locationEdit->setCurrentItem( 0 );
1792 kc->setGroup( oldGroup );
1797 TQString oldGroup = kc->group();
1798 kc->setGroup( ConfigGroup );
1800 kc->writePathEntry( RecentFiles, locationEdit->
urls() );
1802 kc->setGroup( oldGroup );
1812 return d->cancelButton;
1820 void KFileDialog::slotCancel()
1823 KDialogBase::slotCancel();
1825 TDEConfig *config = TDEGlobal::config();
1826 config->setForceGlobal(
true );
1828 config->setForceGlobal(
false );
1833 d->keepLocation = keep;
1838 return d->keepLocation;
1843 d->operationMode =
mode;
1844 d->keepLocation = (mode == Saving);
1845 filterWidget->setEditable( !d->hasDefaultFilter || mode != Saving );
1846 if ( mode == Opening )
1847 d->okButton->setGuiItem( KGuiItem( i18n(
"&Open"),
"document-open") );
1848 else if ( mode == Saving ) {
1849 d->okButton->setGuiItem( KStdGuiItem::save() );
1850 setNonExtSelection();
1853 d->okButton->setGuiItem( KStdGuiItem::ok() );
1854 updateLocationWhatsThis ();
1860 return d->operationMode;
1863 void KFileDialog::slotAutoSelectExtClicked()
1865 kdDebug (tdefile_area) <<
"slotAutoSelectExtClicked(): " 1866 << d->autoSelectExtCheckBox->isChecked () << endl;
1869 d->autoSelectExtChecked = d->autoSelectExtCheckBox->isChecked ();
1872 updateLocationEditExtension (d->extension );
1875 static TQString getExtensionFromPatternList (
const TQStringList &patternList)
1878 kdDebug (tdefile_area) <<
"\tgetExtension " << patternList << endl;
1880 TQStringList::ConstIterator patternListEnd = patternList.end ();
1881 for (TQStringList::ConstIterator it = patternList.begin ();
1882 it != patternListEnd;
1885 kdDebug (tdefile_area) <<
"\t\ttry: \'" << (*it) <<
"\'" << endl;
1894 if ((*it).startsWith (
"*.") &&
1895 (*it).length () > 2 &&
1896 (*it).find (
'*', 2) < 0 && (*it).find (
'?', 2) < 0)
1898 ret = (*it).mid (1);
1906 static TQString stripUndisplayable (
const TQString &
string)
1908 TQString ret = string;
1919 return d->extension;
1924 if (!d->autoSelectExtCheckBox)
return;
1933 kdDebug (tdefile_area) <<
"Figure out an extension: " << endl;
1934 TQString lastExtension = d->extension;
1935 d->extension = TQString::null;
1945 if (!filter.isEmpty ())
1948 if (filter.find (
'/') < 0)
1950 d->extension = getExtensionFromPatternList (TQStringList::split (
" ", filter)).lower ();
1951 kdDebug (tdefile_area) <<
"\tsetFilter-style: pattern ext=\'" 1952 << d->extension <<
"\'" << endl;
1957 KMimeType::Ptr mime = KMimeType::mimeType (filter);
1960 TQString nativeExtension = mime->property (
"X-TDE-NativeExtension").toString ();
1961 if (nativeExtension.at (0) ==
'.')
1963 d->extension = nativeExtension.lower ();
1964 kdDebug (tdefile_area) <<
"\tsetMimeFilter-style: native ext=\'" 1965 << d->extension <<
"\'" << endl;
1969 if (d->extension.isEmpty ())
1971 d->extension = getExtensionFromPatternList (mime->patterns ()).lower ();
1972 kdDebug (tdefile_area) <<
"\tsetMimeFilter-style: pattern ext=\'" 1973 << d->extension <<
"\'" << endl;
1983 TQString whatsThisExtension;
1984 if (!d->extension.isEmpty ())
1987 d->autoSelectExtCheckBox->setText (i18n (
"Automatically select filename e&xtension (%1)").arg (d->extension));
1988 whatsThisExtension = i18n (
"the extension <b>%1</b>").arg (d->extension);
1990 d->autoSelectExtCheckBox->setEnabled (
true);
1991 d->autoSelectExtCheckBox->setChecked (d->autoSelectExtChecked);
1996 d->autoSelectExtCheckBox->setText (i18n (
"Automatically select filename e&xtension"));
1997 whatsThisExtension = i18n (
"a suitable extension");
1999 d->autoSelectExtCheckBox->setChecked (
false);
2000 d->autoSelectExtCheckBox->setEnabled (
false);
2003 const TQString locationLabelText = stripUndisplayable (d->locationLabel->text ());
2004 const TQString filterLabelText = stripUndisplayable (d->filterLabel->text ());
2005 TQWhatsThis::add (d->autoSelectExtCheckBox,
2008 "This option enables some convenient features for " 2009 "saving files with extensions:<br>" 2011 "<li>Any extension specified in the <b>%1</b> text " 2012 "area will be updated if you change the file type " 2015 "<li>If no extension is specified in the <b>%2</b> " 2016 "text area when you click " 2017 "<b>Save</b>, %3 will be added to the end of the " 2018 "filename (if the filename does not already exist). " 2019 "This extension is based on the file type that you " 2020 "have chosen to save in.<br>" 2022 "If you do not want TDE to supply an extension for the " 2023 "filename, you can either turn this option off or you " 2024 "can suppress it by adding a period (.) to the end of " 2025 "the filename (the period will be automatically " 2029 "If unsure, keep this option enabled as it makes your " 2030 "files more manageable." 2032 .arg (locationLabelText)
2033 .arg (locationLabelText)
2034 .arg (whatsThisExtension)
2038 d->autoSelectExtCheckBox->show ();
2042 updateLocationEditExtension (lastExtension);
2047 d->autoSelectExtCheckBox->setChecked (
false);
2048 d->autoSelectExtCheckBox->hide ();
2055 void KFileDialog::updateLocationEditExtension (
const TQString &lastExtension)
2057 if (!d->autoSelectExtCheckBox->isChecked () || d->extension.isEmpty ())
2060 TQString urlStr = locationEdit->currentText ();
2061 if (urlStr.isEmpty ())
2065 kdDebug (tdefile_area) <<
"updateLocationEditExtension (" << url <<
")" << endl;
2067 const int fileNameOffset = urlStr.findRev (
'/') + 1;
2068 TQString fileName = urlStr.mid (fileNameOffset);
2070 const int dot = fileName.findRev (
'.');
2071 const int len = fileName.length ();
2079 if (TDEIO::NetAccess::stat (url, t, topLevelWidget()))
2081 kdDebug (tdefile_area) <<
"\tfile exists" << endl;
2083 if (isDirectory (t))
2085 kdDebug (tdefile_area) <<
"\tisDir - won't alter extension" << endl;
2098 if (lastExtension.length () && fileName.endsWith (lastExtension))
2099 fileName.truncate (len - lastExtension.length ());
2102 fileName.truncate (dot);
2105 const TQString newText = urlStr.left (fileNameOffset) + fileName + d->extension;
2106 if ( newText != locationEdit->currentText() )
2108 locationEdit->setCurrentText (urlStr.left (fileNameOffset) + fileName + d->extension);
2109 locationEdit->lineEdit()->setEdited (
true);
2116 void KFileDialog::updateFilter ()
2119 const TQString urlStr = locationEdit->currentText ();
2120 if (urlStr.isEmpty ())
2123 KMimeType::Ptr mime = KMimeType::findByPath(urlStr, 0,
true);
2124 if (mime && mime->name() != KMimeType::defaultMimeType()) {
2125 if (filterWidget->currentFilter() != mime->name() &&
2126 filterWidget->filters.findIndex(mime->name()) != -1) {
2127 filterWidget->setCurrentFilter(mime->name());
2134 void KFileDialog::appendExtension (KURL &url)
2136 if (!d->autoSelectExtCheckBox->isChecked () || d->extension.isEmpty ())
2139 TQString fileName = url.fileName ();
2140 if (fileName.isEmpty ())
2143 kdDebug (tdefile_area) <<
"appendExtension(" << url <<
")" << endl;
2145 const int len = fileName.length ();
2146 const int dot = fileName.findRev (
'.');
2148 const bool suppressExtension = (dot == len - 1);
2149 const bool unspecifiedExtension = (dot <= 0);
2152 if (!(suppressExtension || unspecifiedExtension))
2157 if (TDEIO::NetAccess::stat (url, t, topLevelWidget()))
2159 kdDebug (tdefile_area) <<
"\tfile exists - won't append extension" << endl;
2164 if (suppressExtension)
2176 kdDebug (tdefile_area) <<
"\tstrip trailing dot" << endl;
2177 url.setFileName (fileName.left (len - 1));
2180 else if (unspecifiedExtension)
2182 kdDebug (tdefile_area) <<
"\tappending extension \'" << d->extension <<
"\'..." << endl;
2183 url.setFileName (fileName + d->extension);
2184 kdDebug (tdefile_area) <<
"\tsaving as \'" << url <<
"\'" << endl;
2190 void KFileDialog::addToRecentDocuments()
2192 int m = ops->
mode();
2194 if ( m & KFile::LocalOnly ) {
2196 TQStringList::ConstIterator it = files.begin();
2197 for ( ; it != files.end(); ++it )
2203 KURL::List::ConstIterator it = urls.begin();
2204 for ( ; it != urls.end(); ++it ) {
2205 if ( (*it).isValid() )
2218 if ( e->key() == Key_Escape )
2221 d->cancelButton->animateClick();
2224 KDialogBase::keyPressEvent( e );
2239 homeURL.setPath( TQDir::homeDirPath() );
2242 if ( homeURL.equals( urlItem->
url(), true ) )
2248 urlItem =
static_cast<KURLBarItem*
>( urlItem->next() );
2260 static_cast<TDEToggleAction *
>(
actionCollection()->action(
"toggleSpeedbar"))->setChecked( show );
2267 if (d->bookmarkHandler)
2272 d->bookmarkHandler =
new KFileBookmarkHandler(
this );
2273 connect( d->bookmarkHandler, TQT_SIGNAL( openURL(
const TQString& )),
2274 TQT_SLOT( enterURL(
const TQString& )));
2276 toolbar->insertButton(TQString::fromLatin1(
"bookmark"),
2277 (
int)HOTLIST_BUTTON,
true,
2278 i18n(
"Bookmarks"), 5);
2279 toolbar->getButton(HOTLIST_BUTTON)->setPopup(d->bookmarkHandler->menu(),
2281 TQWhatsThis::add(toolbar->getButton(HOTLIST_BUTTON),
2282 i18n(
"<qt>This button allows you to bookmark specific locations. " 2283 "Click on this button to open the bookmark menu where you may add, " 2284 "edit or select a bookmark.<p>" 2285 "These bookmarks are specific to the file dialog, but otherwise operate " 2286 "like bookmarks elsewhere in TDE.</qt>"));
2288 else if (d->bookmarkHandler)
2290 delete d->bookmarkHandler;
2291 d->bookmarkHandler = 0;
2292 toolbar->removeItem(HOTLIST_BUTTON);
2295 static_cast<TDEToggleAction *
>(
actionCollection()->action(
"toggleBookmarks"))->setChecked( show );
2300 return d->m_pathComboIndex;
2304 void KFileDialog::initStatic()
2306 if ( lastDirectory )
2309 lastDirectory = ldd.setObject(lastDirectory,
new KURL());
2314 TQString& recentDirClass )
2318 recentDirClass = TQString::null;
2321 bool useDefaultStartDir = startDir.isEmpty();
2322 if ( !useDefaultStartDir )
2324 if (startDir[0] ==
':')
2326 recentDirClass = startDir;
2331 ret = TDECmdLineArgs::makeURL( TQFile::encodeName(startDir) );
2333 if ( !KProtocolInfo::supportsListing( ret ) )
2334 useDefaultStartDir =
true;
2338 if ( useDefaultStartDir )
2340 if (lastDirectory->isEmpty()) {
2341 lastDirectory->setPath(TDEGlobalSettings::documentPath());
2343 home.setPath( TQDir::homeDirPath() );
2348 if ( lastDirectory->path(+1) == home.path(+1) ||
2349 TQDir::currentDirPath() != TQDir::homeDirPath() ||
2350 !TQDir(lastDirectory->path(+1)).exists() )
2351 lastDirectory->setPath(TQDir::currentDirPath());
2353 ret = *lastDirectory;
2359 void KFileDialog::setStartDir(
const KURL& directory )
2362 if ( directory.isValid() )
2363 *lastDirectory = directory;
2366 void KFileDialog::setNonExtSelection()
2369 TQString pattern, filename = locationEdit->currentText().stripWhiteSpace();
2370 KServiceTypeFactory::self()->findFromPattern( filename, &pattern );
2372 if ( !pattern.isEmpty() && pattern.at( 0 ) ==
'*' && pattern.find(
'*' , 1 ) == -1 )
2373 locationEdit->lineEdit()->setSelection( 0, filename.length() - pattern.stripWhiteSpace().length()+1 );
2376 int lastDot = filename.findRev(
'.' );
2378 locationEdit->lineEdit()->setSelection( 0, lastDot );
2382 void KFileDialog::virtual_hook(
int id,
void* data )
2383 { KDialogBase::virtual_hook(
id, data ); }
2386 #include "tdefiledialog.moc" void setMimeFilter(const TQStringList &types, const TQString &defaultType=TQString::null)
Sets the filter up to specify the output type.
static TQString dir(const TQString &fileClass)
Returns the most recently used directory accociated with this file-class.
static KURL getSaveURL(const TQString &startDir=TQString::null, const TQString &filter=TQString::null, TQWidget *parent=0, const TQString &caption=TQString::null)
Creates a modal file dialog and returns the selected filename or an empty string if none was chosen...
This combobox shows a number of recent URLs/directories, as well as some default directories.
virtual void keyPressEvent(TQKeyEvent *e)
Reimplemented to animate the cancel button.
void setFilterMimeType(const TQString &label, const KMimeType::List &types, const KMimeType::Ptr &defaultType) KDE_DEPRECATED
Sets the filter up to specify the output type.
void close()
Stops loading immediately.
void setOnlyDoubleClickSelectsFiles(bool enable)
This is a KFileDialog specific hack: we want to select directories with single click, but not files.
static KURL selectDirectory(const TQString &startDir=TQString::null, bool localOnly=false, TQWidget *parent=0L, const TQString &caption=TQString::null)
Creates a KDirSelectDialog, and returns the result.
void setPreviewWidget(const TQWidget *w) KDE_DEPRECATED
KPushButton * okButton() const
~KFileDialog()
Destructs the file dialog.
void fileHighlighted(const TQString &)
Emitted when the user highlights a file.
virtual void readConfig(TDEConfig *, const TQString &group=TQString::null)
Reads the default settings for a view, i.e.
TQString currentFilter() const
Returns the current filter as entered by the user or one of the predefined set via setFilter()...
void dirCompletion(const TQString &)
void init(const TQString &startDir, const TQString &filter, TQWidget *widget)
Perform basic initialization tasks.
const KFileItemList * selectedItems() const
TQString currentFilterExtension()
Returns the filename extension associated with the currentFilter().
void clearFilter()
Clears any mime- or namefilter.
Mode
Modes of operation for the dialog.
static TQString getSaveFileName(const TQString &startDir=TQString::null, const TQString &filter=TQString::null, TQWidget *parent=0, const TQString &caption=TQString::null)
Creates a modal file dialog and returns the selected filename or an empty string if none was chosen...
static KURL getOpenURL(const TQString &startDir=TQString::null, const TQString &filter=TQString::null, TQWidget *parent=0, const TQString &caption=TQString::null)
Creates a modal file dialog and returns the selected URL or an empty string if none was chosen...
KURL::List selectedURLs() const
void setMaxItems(int)
Sets how many items should be handled and displayed by the combobox.
Provides a user (and developer) friendly way to select files and directories.
TQStringList selectedFiles() const
Returns a list of all selected local files.
void setViewConfig(TDEConfig *config, const TQString &group)
Sets the config object and the to be used group in KDirOperator.
virtual void clearSelection()=0
Clears any selection, unhighlights everything.
bool mkdir(const TQString &directory, bool enterDirectory=true)
Creates the given directory/url.
void setCurrentItem(const TQString &filename)
Clears the current selection and attempts to set filename the current file.
void setURL(const KURL &url, bool clearforward=true)
Sets the directory to view.
void setMode(KFile::Mode m)
Sets the listing/selection mode for the views, an OR'ed combination of.
static void add(const TQString &fileClass, const TQString &directory)
Associates directory with fileClass.
virtual void initGUI()
rebuild geometry management.
const KURL & url() const
returns the url of this item.
static KURL getStartURL(const TQString &startDir, TQString &recentDirClass)
This method implements the logic to determine the user's default directory to be listed.
KFileDialog(const TQString &startDir, const TQString &filter, TQWidget *parent, const char *name, bool modal)
Constructs a file dialog.
OperationMode operationMode() const
void setKeepLocation(bool keep)
Sets whether the filename/url should be kept when changing directories.
This widget works as a network transparent filebrowser.
KURL getCompleteURL(const TQString &)
Returns the absolute version of the URL specified in locationEdit.
KURLBar is a widget that displays icons together with a description.
static void add(const KURL &url)
Add a new item to the Recent Document menu.
void pathComboChanged(const TQString &)
static TQString getOpenFileNameWId(const TQString &startDir, const TQString &filter, WId parent_id, const TQString &caption)
Use this version only if you have no TQWidget available as parent widget.
void updateDir()
to update the view after changing the settings
virtual void updateStatusLine(int dirs, int files)
void fileSelected(const TQString &)
Emitted when the user selects a file.
void setNameFilter(const TQString &filter)
Sets a filter like "*.cpp *.h *.o".
KURL::List tokenize(const TQString &line) const
Parses the string "line" for files.
static KURL::List getOpenURLs(const TQString &startDir=TQString::null, const TQString &filter=TQString::null, TQWidget *parent=0, const TQString &caption=TQString::null)
Creates a modal file dialog and returns the selected URLs or an empty list if none was chosen...
static TQString getExistingDirectory(const TQString &startDir=TQString::null, TQWidget *parent=0, const TQString &caption=TQString::null)
Creates a modal file dialog and returns the selected directory or an empty string if none was chosen...
void setOperationMode(KFileDialog::OperationMode)
Sets the operational mode of the filedialog to Saving, Opening or Other.
TQString selectedFile() const
Returns the full path of the selected file in the local filesystem.
KFile::Mode mode() const
Returns the mode of the filedialog.
virtual void saveRecentFiles(TDEConfig *)
Saves the entries from the location combobox.
TDEActionCollection * actionCollection() const
Image preview widget for the file dialog.
void setURL(const KURL &url)
Sets the current url.
static KURL getImageOpenURL(const TQString &startDir=TQString::null, TQWidget *parent=0, const TQString &caption=TQString::null)
Creates a modal file dialog with an image previewer and returns the selected url or an empty string i...
virtual void writeConfig(TDEConfig *, const TQString &group=TQString::null)
Saves the current configuration.
TQString currentMimeFilter() const
The mimetype for the desired output format.
KMimeType::Ptr currentFilterMimeType()
Returns the mimetype for the desired output format.
OperationMode
Defines some default behavior of the filedialog.
void setURLs(TQStringList urls)
Inserts urls into the combobox below the "default urls" (see addDefaultURL).
void setMimeFilter(const TQStringList &mimetypes)
Sets a list of mimetypes as filter.
void setPreviewWidget(const TQWidget *w)
Sets a preview-widget to be shown next to the file-view.
void toolbarCallback(int)
void selectionChanged()
Emitted when the user hilights one or more files in multiselection mode.
void clearFilter()
Clears both the namefilter and mimetype filter, so that all files and directories will be shown...
void clearHistory()
Clears the forward and backward history.
static KURL getExistingURL(const TQString &startDir=TQString::null, TQWidget *parent=0, const TQString &caption=TQString::null)
Creates a modal file dialog and returns the selected directory or an empty string if none was chosen...
TQStringList urls() const
An item to be used in KURLBar / KURLBarListBox.
void toggleSpeedbar(bool)
void toggleBookmarks(bool show)
void setSelection(const TQString &name)
Sets the file name to preselect to name.
void filterChanged(const TQString &filter)
Emitted when the filter changed, i.e.
void setMode(KFile::Mode m)
Convenient overload of the other setMode(unsigned int) method.
void multiSelectionChanged()
called when an item is highlighted/selected in multiselection mode.
void setLocationLabel(const TQString &text)
Sets the text to be displayed in front of the selection.
void setURL(const KURL &url, bool clearforward)
Sets a new url to list.
void updateAutoSelectExtension()
Updates the currentFilterExtension and the availability of the Automatically Select Extension Checkbo...
void setFilter(const TQString &filter)
Sets the filter to be used to filter.
void setupMenu(int whichActions)
Sets up the action menu.
virtual void readConfig(TDEConfig *, const TQString &group=TQString::null)
Reads configuration and applies it (size, recent directories, ...)
TDEActionCollection * actionCollection() const
an accessor to a collection of all available Actions.
virtual void writeConfig(TDEConfig *, const TQString &group=TQString::null)
Saves the current settings like sorting, simple or detailed view.
bool keepsLocation() const
static TQStringList getOpenFileNames(const TQString &startDir=TQString::null, const TQString &filter=TQString::null, TQWidget *parent=0, const TQString &caption=TQString::null)
Creates a modal file dialog and returns the selected filenames or an empty list if none was chosen...
KPushButton * cancelButton() const
void setView(KFileView *view)
Sets a new KFileView to be used for showing and browsing files.
static TQString getOpenFileName(const TQString &startDir=TQString::null, const TQString &filter=TQString::null, TQWidget *parent=0, const TQString &caption=TQString::null)
Creates a modal file dialog and return the selected filename or an empty string if none was chosen...
static TQString getSaveFileNameWId(const TQString &dir, const TQString &filter, WId parent_id, const TQString &caption)
This function accepts the window id of the parent window, instead of TQWidget*.
virtual void readRecentFiles(TDEConfig *)
Reads the recent used files and inserts them into the location combobox.