25 #include "kfiledialog.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> 47 #include <kapplication.h> 48 #include <kcharsets.h> 49 #include <kcmdlineargs.h> 50 #include <kcompletionbox.h> 54 #include <kglobalsettings.h> 55 #include <kiconloader.h> 58 #include <kio/netaccess.h> 59 #include <kio/scheduler.h> 60 #include <kio/kservicetypefactory.h> 62 #include <kmessagebox.h> 63 #include <kmimetype.h> 64 #include <kpopupmenu.h> 65 #include <kprotocolinfo.h> 66 #include <kpushbutton.h> 67 #include <krecentdirs.h> 69 #include <kstandarddirs.h> 70 #include <kstdguiitem.h> 71 #include <kstaticdeleter.h> 73 #include <ktoolbarbutton.h> 75 #include <kurlcombobox.h> 76 #include <kurlcompletion.h> 79 #include "config-kfile.h" 80 #include "kpreviewwidgetbase.h" 82 #include <kdirselectdialog.h> 83 #include <kfileview.h> 84 #include <krecentdocument.h> 85 #include <kfilefiltercombo.h> 86 #include <kdiroperator.h> 87 #include <kimagefilepreview.h> 89 #include <kfilespeedbar.h> 90 #include <kfilebookmarkhandler.h> 97 enum Buttons { HOTLIST_BUTTON,
98 PATH_COMBO, CONFIGURE_BUTTON };
100 template class TQPtrList<KIO::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<KIO::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 KConfig *config = KGlobal::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(kfile_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 = KIO::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 = KIO::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(kfile_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 = KIO::buildErrorString(KIO::ERR_ACCESS_DENIED, d->url.prettyURL());
536 KMessageBox::error( d->mainWidget, msg);
540 KIO::StatJob *job = 0L;
542 d->filenames = KShell::tildeExpand(locationEdit->currentText());
544 if ( (
mode() & KFile::Files) == KFile::Files &&
545 !locationEdit->currentText().contains(
'/' )) {
546 kdDebug(kfile_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 = KIO::buildErrorString(KIO::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 = KIO::stat( *it, !(*it).isLocalFile() );
562 job->setWindow (topLevelWidget());
563 KIO::Scheduler::scheduleJob( job );
564 d->statJobs.append( job );
565 connect( job, TQT_SIGNAL( result(KIO::Job *) ),
566 TQT_SLOT( slotStatResult( KIO::Job *) ));
571 job = KIO::stat(d->url,!d->url.isLocalFile());
572 job->setWindow (topLevelWidget());
573 d->statJobs.append( job );
574 connect(job, TQT_SIGNAL(result(KIO::Job*)), TQT_SLOT(slotStatResult(KIO::Job*)));
578 static bool isDirectory (
const KIO::UDSEntry &t)
582 for (KIO::UDSEntry::ConstIterator it = t.begin();
586 if ((*it).m_uds == KIO::UDS_FILE_TYPE)
588 isDir = S_ISDIR ((mode_t) ((*it).m_long));
599 void KFileDialog::slotStatResult(KIO::Job* job)
601 kdDebug(kfile_area) <<
"slotStatResult" << endl;
602 KIO::StatJob *sJob =
static_cast<KIO::StatJob *
>( job );
604 if ( !d->statJobs.removeRef( sJob ) ) {
608 int count = d->statJobs.count();
612 if (sJob->error() && count == 0 && !ops->
dirOnlyMode())
618 KIO::UDSEntry t = sJob->statResult();
623 d->filenames = TQString::null;
630 locationEdit->clearEdit();
631 locationEdit->lineEdit()->setEdited(
false );
643 kdDebug(kfile_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 KConfig *config = KGlobal::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 = KGlobal::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 KToolBar( 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, KIcon::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, KIcon::Small ),
864 docPath.setPath( KGlobalSettings::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, KIcon::Small ),
874 u.setPath( KGlobalSettings::desktopPath() );
875 text = i18n(
"Desktop: %1").arg( u.path( +1 ) );
876 d->pathCombo->addDefaultURL( u,
877 KMimeType::pixmapForURL( u, 0, KIcon::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 KToggleAction *showSidebarAction =
930 new KToggleAction(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 KToggleAction *showBookmarksAction =
936 new KToggleAction(i18n(
"Show Bookmarks"), 0, coll,
"toggleBookmarks");
937 showBookmarksAction->setCheckedState(i18n(
"Hide Bookmarks"));
938 connect( showBookmarksAction, TQT_SIGNAL( toggled(
bool ) ),
941 KActionMenu *menu =
new KActionMenu( 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 KToolBarSeparator* spacerWidget =
new KToolBarSeparator(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(KToolBar::IconOnly);
980 toolbar->setBarPos(KToolBar::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 connect( locationEdit, TQT_SIGNAL( textChanged(
const TQString& ) ),
1002 TQT_SLOT( slotLocationChanged(
const TQString& )) );
1004 updateLocationWhatsThis ();
1005 d->locationLabel->setBuddy(locationEdit);
1007 locationEdit->setFocus();
1008 KURLCompletion *fileCompletionObj =
new KURLCompletion( KURLCompletion::FileCompletion );
1009 TQString dir = d->url.url(+1);
1010 pathCompletionObj->setDir( dir );
1011 fileCompletionObj->setDir( dir );
1012 locationEdit->setCompletionObject( fileCompletionObj );
1013 locationEdit->setAutoDeleteCompletionObject(
true );
1014 connect( fileCompletionObj, TQT_SIGNAL( match(
const TQString& ) ),
1015 TQT_SLOT( fileCompletion(
const TQString& )) );
1017 connect( locationEdit, TQT_SIGNAL( returnPressed() ),
1018 this, TQT_SLOT( slotOk()));
1019 connect(locationEdit, TQT_SIGNAL( activated(
const TQString& )),
1020 this, TQT_SLOT( locationActivated(
const TQString& ) ));
1023 whatsThisText = i18n(
"<qt>This is the filter to apply to the file list. " 1024 "File names that do not match the filter will not be shown.<p>" 1025 "You may select from one of the preset filters in the " 1026 "drop down menu, or you may enter a custom filter " 1027 "directly into the text area.<p>" 1028 "Wildcards such as * and ? are allowed.</qt>");
1029 d->filterLabel =
new TQLabel(i18n(
"&Filter:"), d->mainWidget);
1030 TQWhatsThis::add(d->filterLabel, whatsThisText);
1031 filterWidget =
new KFileFilterCombo(d->mainWidget,
1032 "KFileDialog::filterwidget");
1033 TQWhatsThis::add(filterWidget, whatsThisText);
1035 d->filterLabel->setBuddy(filterWidget);
1036 connect(filterWidget, TQT_SIGNAL(
filterChanged()), TQT_SLOT(slotFilterChanged()));
1040 d->autoSelectExtCheckBox =
new TQCheckBox (d->mainWidget);
1041 connect(d->autoSelectExtCheckBox, TQT_SIGNAL(clicked()), TQT_SLOT(slotAutoSelectExtClicked()));
1045 KConfig* config = KGlobal::config();
1055 void KFileDialog::initSpeedbar()
1057 d->urlBar =
new KFileSpeedBar( d->mainWidget,
"url bar" );
1058 connect( d->urlBar, TQT_SIGNAL( activated(
const KURL& )),
1059 TQT_SLOT( enterURL(
const KURL& )) );
1065 d->urlBar->setCurrentItem( d->url );
1067 d->urlBarLayout->insertWidget( 0, d->urlBar );
1072 delete d->boxLayout;
1074 d->boxLayout =
new TQVBoxLayout( d->mainWidget, 0, KDialog::spacingHint());
1075 d->boxLayout->addWidget(toolbar, AlignTop);
1077 d->urlBarLayout =
new TQHBoxLayout( d->boxLayout );
1078 TQVBoxLayout *vbox =
new TQVBoxLayout( d->urlBarLayout );
1080 vbox->addWidget(ops, 4);
1081 vbox->addSpacing(3);
1083 TQGridLayout* lafBox=
new TQGridLayout(2, 3, KDialog::spacingHint());
1085 lafBox->addWidget(d->locationLabel, 0, 0, Qt::AlignVCenter);
1086 lafBox->addWidget(locationEdit, 0, 1, Qt::AlignVCenter);
1087 lafBox->addWidget(d->okButton, 0, 2, Qt::AlignVCenter);
1089 lafBox->addWidget(d->filterLabel, 1, 0, Qt::AlignVCenter);
1090 lafBox->addWidget(filterWidget, 1, 1, Qt::AlignVCenter);
1091 lafBox->addWidget(d->cancelButton, 1, 2, Qt::AlignVCenter);
1093 lafBox->setColStretch(1, 4);
1095 vbox->addLayout(TQT_TQLAYOUT(lafBox), 0);
1096 vbox->addSpacing(3);
1099 vbox->addWidget (d->autoSelectExtCheckBox);
1100 vbox->addSpacing (3);
1102 setTabOrder(ops, d->autoSelectExtCheckBox);
1103 setTabOrder (d->autoSelectExtCheckBox, locationEdit);
1104 setTabOrder(locationEdit, filterWidget);
1105 setTabOrder(filterWidget, d->okButton);
1106 setTabOrder(d->okButton, d->cancelButton);
1107 setTabOrder(d->cancelButton, d->pathCombo);
1108 setTabOrder(d->pathCombo, ops);
1111 if ( d->customWidget != 0 )
1116 d->customWidget->reparent( d->mainWidget, TQPoint() );
1118 vbox->addWidget( d->customWidget );
1119 vbox->addSpacing(3);
1126 setTabOrder(d->cancelButton, d->customWidget);
1127 setTabOrder(d->customWidget, d->pathCombo);
1131 setTabOrder(d->cancelButton, d->pathCombo);
1134 setTabOrder(d->pathCombo, ops);
1137 void KFileDialog::slotFilterChanged()
1139 TQString filter = filterWidget->currentFilter();
1142 if ( filter.find(
'/' ) > -1 ) {
1143 TQStringList types = TQStringList::split(
" ", filter );
1144 types.prepend(
"inode/directory" );
1160 d->selection = TQString::null;
1161 ops->
setURL( url, clearforward);
1165 void KFileDialog::urlEntered(
const KURL& url)
1167 TQString filename = locationEdit->currentText();
1168 d->selection = TQString::null;
1170 if ( d->pathCombo->count() != 0 ) {
1171 d->pathCombo->setURL( url );
1174 locationEdit->blockSignals(
true );
1175 locationEdit->setCurrentItem( 0 );
1176 if ( d->keepLocation )
1177 locationEdit->setEditText( filename );
1179 locationEdit->blockSignals(
false );
1181 TQString dir = url.url(+1);
1182 static_cast<KURLCompletion*
>( d->pathCombo->completionObject() )->setDir( dir );
1183 static_cast<KURLCompletion*
>( locationEdit->completionObject() )->setDir( dir );
1186 d->urlBar->setCurrentItem( url );
1189 void KFileDialog::locationActivated(
const TQString& url )
1196 if (!locationEdit->lineEdit()->edited())
1200 void KFileDialog::enterURL(
const KURL& url)
1205 void KFileDialog::enterURL(
const TQString& url )
1207 setURL( KURL::fromPathOrURL( KURLCompletion::replacedPath( url,
true,
true )) );
1221 kdDebug(kfile_area) <<
"setSelection " << url << endl;
1223 if (url.isEmpty()) {
1224 d->selection = TQString::null;
1230 kdWarning() << url <<
" is not a correct argument for setSelection!" << endl;
1234 if (!KProtocolInfo::supportsListing(u)) {
1235 locationEdit->lineEdit()->setEdited(
true );
1242 KFileItem i(KFileItem::Unknown, KFileItem::Unknown, u,
true );
1244 if ( i.isDir() && u.isLocalFile() && TQFile::exists( u.path() ) ) {
1252 TQString filename = u.url();
1253 int sep = filename.findRev(
'/');
1255 if ( KProtocolInfo::supportsListing( u )) {
1257 dir.setQuery( TQString::null );
1258 dir.setFileName( TQString::null );
1264 filename = u.fileName();
1265 kdDebug(kfile_area) <<
"filename " << filename << endl;
1266 d->selection = filename;
1267 setLocationText( filename );
1276 locationEdit->lineEdit()->setEdited(
true );
1279 d->url = ops->
url();
1280 d->url.addPath(filename);
1284 void KFileDialog::slotLoadingFinished()
1286 if ( !d->selection.isNull() )
1297 void KFileDialog::fileCompletion(
const TQString& match )
1299 if ( match.isEmpty() && ops->
view() )
1305 void KFileDialog::slotLocationChanged(
const TQString& text )
1307 if ( text.isEmpty() && ops->
view() )
1315 kdWarning() <<
"KFileDialog::updateStatusLine is deprecated! The status line no longer exists. Do not try and use it!" << endl;
1319 const TQString& filter,
1320 TQWidget *parent,
const TQString& caption)
1322 KFileDialog dlg(startDir, filter, parent,
"filedialog",
true);
1325 dlg.
setMode( KFile::File | KFile::LocalOnly );
1326 dlg.setCaption(caption.isNull() ? i18n(
"Open") : caption);
1335 const TQString& filter,
1336 WId parent_id,
const TQString& caption)
1338 TQWidget* parent = TQT_TQWIDGET(TQWidget::find( parent_id ));
1339 KFileDialog dlg(startDir, filter, parent,
"filedialog",
true);
1341 if( parent == NULL && parent_id != 0 )
1342 XSetTransientForHint( qt_xdisplay(), dlg.winId(), parent_id );
1349 dlg.
setMode( KFile::File | KFile::LocalOnly );
1350 dlg.setCaption(caption.isNull() ? i18n(
"Open") : caption);
1359 const TQString& filter,
1361 const TQString& caption)
1363 KFileDialog dlg(startDir, filter, parent,
"filedialog",
true);
1366 dlg.setCaption(caption.isNull() ? i18n(
"Open") : caption);
1367 dlg.
setMode(KFile::Files | KFile::LocalOnly);
1375 TQWidget *parent,
const TQString& caption)
1377 KFileDialog dlg(startDir, filter, parent,
"filedialog",
true);
1380 dlg.setCaption(caption.isNull() ? i18n(
"Open") : caption);
1389 const TQString& filter,
1391 const TQString& caption)
1393 KFileDialog dlg(startDir, filter, parent,
"filedialog",
true);
1396 dlg.setCaption(caption.isNull() ? i18n(
"Open") : caption);
1406 const TQString& caption)
1413 const TQString& caption)
1416 return TQFileDialog::getExistingDirectory(startDir, parent,
"getExistingDirectory",
1417 caption,
true,
true);
1421 if ( url.isValid() )
1424 return TQString::null;
1429 const TQString& caption)
1431 TQStringList mimetypes = KImageIO::mimeTypes( KImageIO::Reading );
1433 mimetypes.join(
" "),
1434 parent,
"filedialog",
true);
1436 dlg.setCaption( caption.isNull() ? i18n(
"Open") : caption );
1437 dlg.setMode( KFile::File );
1440 dlg.setPreviewWidget( ip );
1443 return dlg.selectedURL();
1448 if ( result() == TQDialog::Accepted )
1457 if ( result() == TQDialog::Accepted ) {
1458 if ( (ops->
mode() & KFile::Files) == KFile::Files )
1459 list = parseSelectedURLs();
1461 list.append( d->url );
1467 KURL::List& KFileDialog::parseSelectedURLs()
const 1469 if ( d->filenames.isEmpty() ) {
1474 if ( d->filenames.contains(
'/' )) {
1475 static const TQString &prot = KGlobal::staticQString(
":/");
1477 if ( d->filenames.find( prot ) != -1 )
1480 u.setPath( d->filenames );
1483 d->urlList.append( u );
1485 KMessageBox::error( d->mainWidget,
1486 i18n(
"The chosen filenames do not\n" 1487 "appear to be valid."),
1488 i18n(
"Invalid Filenames") );
1492 d->urlList =
tokenize( d->filenames );
1494 d->filenames = TQString::null;
1504 KURL u( ops->
url() );
1507 int count = line.contains(
'"' );
1509 u.setFileName( line );
1516 if ( (count % 2) == 1 ) {
1518 KMessageBox::sorry(that, i18n(
"The requested filenames\n" 1520 "do not appear to be valid;\n" 1521 "make sure every filename is enclosed in double quotes.").arg(line),
1522 i18n(
"Filename Error"));
1527 int index1 = -1, index2 = -1;
1529 index1 = line.find(
'"', start );
1530 index2 = line.find(
'"', index1 + 1 );
1536 name = line.mid( index1 + 1, index2 - index1 - 1 );
1537 u.setFileName( name );
1549 if ( result() == TQDialog::Accepted )
1551 KURL url = KIO::NetAccess::mostLocalURL(d->url,topLevelWidget());
1552 if (url.isLocalFile())
1555 KMessageBox::sorry( d->mainWidget,
1556 i18n(
"You can only select local files."),
1557 i18n(
"Remote Files Not Accepted") );
1560 return TQString::null;
1568 if ( result() == TQDialog::Accepted ) {
1569 if ( (ops->
mode() & KFile::Files) == KFile::Files ) {
1570 KURL::List urls = parseSelectedURLs();
1571 TQValueListConstIterator<KURL> it = urls.begin();
1572 while ( it != urls.end() ) {
1573 url = KIO::NetAccess::mostLocalURL(*it,topLevelWidget());
1574 if ( url.isLocalFile() )
1575 list.append( url.path() );
1581 if ( d->url.isLocalFile() )
1582 list.append( d->url.path() );
1596 const TQString& caption)
1598 bool specialDir = dir.at(0) ==
':';
1599 KFileDialog dlg( specialDir ? dir : TQString::null, filter, parent,
"filedialog",
true);
1604 dlg.setCaption(caption.isNull() ? i18n(
"Save As") : caption);
1609 if (!filename.isEmpty())
1617 const TQString& caption)
1619 bool specialDir = dir.at(0) ==
':';
1620 TQWidget* parent = TQT_TQWIDGET(TQWidget::find( parent_id ));
1621 KFileDialog dlg( specialDir ? dir : TQString::null, filter, parent,
"filedialog",
true);
1623 if( parent == NULL && parent_id != 0 )
1624 XSetTransientForHint(qt_xdisplay(), dlg.winId(), parent_id);
1633 dlg.setCaption(caption.isNull() ? i18n(
"Save As") : caption);
1638 if (!filename.isEmpty())
1645 TQWidget *parent,
const TQString& caption)
1647 bool specialDir = dir.at(0) ==
':';
1648 KFileDialog dlg(specialDir ? dir : TQString::null, filter, parent,
"filedialog",
true);
1652 dlg.setCaption(caption.isNull() ? i18n(
"Save As") : caption);
1664 void KFileDialog::show()
1666 if ( !d->hasView ) {
1672 KDialogBase::show();
1679 filterWidget->setDefaultFilter( i18n(
"*|All Folders") );
1682 filterWidget->setDefaultFilter( i18n(
"*|All Files") );
1690 setMode(static_cast<KFile::Mode>( m ));
1704 TQString oldGroup = kc->group();
1705 if ( !group.isEmpty() )
1706 kc->setGroup( group );
1711 combo->
setURLs( kc->readPathListEntry( RecentURLs ), KURLComboBox::RemoveTop );
1712 combo->
setMaxItems( kc->readNumEntry( RecentURLsNumber,
1713 DefaultRecentURLsNumber ) );
1715 autoDirectoryFollowing = kc->readBoolEntry( AutoDirectoryFollowing,
1716 DefaultDirectoryFollowing );
1718 KGlobalSettings::Completion cm = (KGlobalSettings::Completion)
1719 kc->readNumEntry( PathComboCompletionMode,
1720 KGlobalSettings::completionMode() );
1721 if ( cm != KGlobalSettings::completionMode() )
1722 combo->setCompletionMode( cm );
1724 cm = (KGlobalSettings::Completion)
1725 kc->readNumEntry( LocationComboCompletionMode,
1726 KGlobalSettings::completionMode() );
1727 if ( cm != KGlobalSettings::completionMode() )
1728 locationEdit->setCompletionMode( cm );
1737 d->autoSelectExtChecked = kc->readBoolEntry (AutoSelectExtChecked, DefaultAutoSelectExtChecked);
1740 int w1 = minimumSize().width();
1741 int w2 = toolbar->sizeHint().width() + 10;
1743 setMinimumWidth(w2);
1745 TQSize size = configDialogSize( group );
1747 kc->setGroup( oldGroup );
1755 TQString oldGroup = kc->group();
1756 if ( !group.isEmpty() )
1757 kc->setGroup( group );
1759 kc->writePathEntry( RecentURLs, d->pathCombo->urls() );
1760 saveDialogSize( group,
true );
1761 kc->writeEntry( PathComboCompletionMode, static_cast<int>(d->pathCombo->completionMode()) );
1762 kc->writeEntry( LocationComboCompletionMode, static_cast<int>(locationEdit->completionMode()) );
1763 kc->writeEntry( ShowSpeedbar, d->urlBar && !d->urlBar->isHidden() );
1764 kc->writeEntry( ShowBookmarks, d->bookmarkHandler != 0 );
1765 kc->writeEntry( AutoSelectExtChecked, d->autoSelectExtChecked );
1768 kc->setGroup( oldGroup );
1774 TQString oldGroup = kc->group();
1775 kc->setGroup( ConfigGroup );
1777 locationEdit->
setMaxItems( kc->readNumEntry( RecentFilesNumber,
1778 DefaultRecentURLsNumber ) );
1779 locationEdit->
setURLs( kc->readPathListEntry( RecentFiles ),
1780 KURLComboBox::RemoveBottom );
1781 locationEdit->insertItem( TQString::null, 0 );
1782 locationEdit->setCurrentItem( 0 );
1784 kc->setGroup( oldGroup );
1789 TQString oldGroup = kc->group();
1790 kc->setGroup( ConfigGroup );
1792 kc->writePathEntry( RecentFiles, locationEdit->urls() );
1794 kc->setGroup( oldGroup );
1804 return d->cancelButton;
1812 void KFileDialog::slotCancel()
1815 KDialogBase::slotCancel();
1817 KConfig *config = KGlobal::config();
1818 config->setForceGlobal(
true );
1820 config->setForceGlobal(
false );
1825 d->keepLocation = keep;
1830 return d->keepLocation;
1835 d->operationMode =
mode;
1836 d->keepLocation = (mode == Saving);
1837 filterWidget->setEditable( !d->hasDefaultFilter || mode != Saving );
1838 if ( mode == Opening )
1839 d->okButton->setGuiItem( KGuiItem( i18n(
"&Open"),
"fileopen") );
1840 else if ( mode == Saving ) {
1841 d->okButton->setGuiItem( KStdGuiItem::save() );
1842 setNonExtSelection();
1845 d->okButton->setGuiItem( KStdGuiItem::ok() );
1846 updateLocationWhatsThis ();
1852 return d->operationMode;
1855 void KFileDialog::slotAutoSelectExtClicked()
1857 kdDebug (kfile_area) <<
"slotAutoSelectExtClicked(): " 1858 << d->autoSelectExtCheckBox->isChecked () << endl;
1861 d->autoSelectExtChecked = d->autoSelectExtCheckBox->isChecked ();
1864 updateLocationEditExtension (d->extension );
1867 static TQString getExtensionFromPatternList (
const TQStringList &patternList)
1870 kdDebug (kfile_area) <<
"\tgetExtension " << patternList << endl;
1872 TQStringList::ConstIterator patternListEnd = patternList.end ();
1873 for (TQStringList::ConstIterator it = patternList.begin ();
1874 it != patternListEnd;
1877 kdDebug (kfile_area) <<
"\t\ttry: \'" << (*it) <<
"\'" << endl;
1886 if ((*it).startsWith (
"*.") &&
1887 (*it).length () > 2 &&
1888 (*it).find (
'*', 2) < 0 && (*it).find (
'?', 2) < 0)
1890 ret = (*it).mid (1);
1898 static TQString stripUndisplayable (
const TQString &
string)
1900 TQString ret = string;
1911 return d->extension;
1916 if (!d->autoSelectExtCheckBox)
return;
1925 kdDebug (kfile_area) <<
"Figure out an extension: " << endl;
1926 TQString lastExtension = d->extension;
1927 d->extension = TQString::null;
1937 if (!filter.isEmpty ())
1940 if (filter.find (
'/') < 0)
1942 d->extension = getExtensionFromPatternList (TQStringList::split (
" ", filter)).lower ();
1943 kdDebug (kfile_area) <<
"\tsetFilter-style: pattern ext=\'" 1944 << d->extension <<
"\'" << endl;
1949 KMimeType::Ptr mime = KMimeType::mimeType (filter);
1952 TQString nativeExtension = mime->property (
"X-KDE-NativeExtension").toString ();
1953 if (nativeExtension.at (0) ==
'.')
1955 d->extension = nativeExtension.lower ();
1956 kdDebug (kfile_area) <<
"\tsetMimeFilter-style: native ext=\'" 1957 << d->extension <<
"\'" << endl;
1961 if (d->extension.isEmpty ())
1963 d->extension = getExtensionFromPatternList (mime->patterns ()).lower ();
1964 kdDebug (kfile_area) <<
"\tsetMimeFilter-style: pattern ext=\'" 1965 << d->extension <<
"\'" << endl;
1975 TQString whatsThisExtension;
1976 if (!d->extension.isEmpty ())
1979 d->autoSelectExtCheckBox->setText (i18n (
"Automatically select filename e&xtension (%1)").arg (d->extension));
1980 whatsThisExtension = i18n (
"the extension <b>%1</b>").arg (d->extension);
1982 d->autoSelectExtCheckBox->setEnabled (
true);
1983 d->autoSelectExtCheckBox->setChecked (d->autoSelectExtChecked);
1988 d->autoSelectExtCheckBox->setText (i18n (
"Automatically select filename e&xtension"));
1989 whatsThisExtension = i18n (
"a suitable extension");
1991 d->autoSelectExtCheckBox->setChecked (
false);
1992 d->autoSelectExtCheckBox->setEnabled (
false);
1995 const TQString locationLabelText = stripUndisplayable (d->locationLabel->text ());
1996 const TQString filterLabelText = stripUndisplayable (d->filterLabel->text ());
1997 TQWhatsThis::add (d->autoSelectExtCheckBox,
2000 "This option enables some convenient features for " 2001 "saving files with extensions:<br>" 2003 "<li>Any extension specified in the <b>%1</b> text " 2004 "area will be updated if you change the file type " 2007 "<li>If no extension is specified in the <b>%2</b> " 2008 "text area when you click " 2009 "<b>Save</b>, %3 will be added to the end of the " 2010 "filename (if the filename does not already exist). " 2011 "This extension is based on the file type that you " 2012 "have chosen to save in.<br>" 2014 "If you do not want KDE to supply an extension for the " 2015 "filename, you can either turn this option off or you " 2016 "can suppress it by adding a period (.) to the end of " 2017 "the filename (the period will be automatically " 2021 "If unsure, keep this option enabled as it makes your " 2022 "files more manageable." 2024 .arg (locationLabelText)
2025 .arg (locationLabelText)
2026 .arg (whatsThisExtension)
2030 d->autoSelectExtCheckBox->show ();
2034 updateLocationEditExtension (lastExtension);
2039 d->autoSelectExtCheckBox->setChecked (
false);
2040 d->autoSelectExtCheckBox->hide ();
2047 void KFileDialog::updateLocationEditExtension (
const TQString &lastExtension)
2049 if (!d->autoSelectExtCheckBox->isChecked () || d->extension.isEmpty ())
2052 TQString urlStr = locationEdit->currentText ();
2053 if (urlStr.isEmpty ())
2057 kdDebug (kfile_area) <<
"updateLocationEditExtension (" << url <<
")" << endl;
2059 const int fileNameOffset = urlStr.findRev (
'/') + 1;
2060 TQString fileName = urlStr.mid (fileNameOffset);
2062 const int dot = fileName.findRev (
'.');
2063 const int len = fileName.length ();
2071 if (KIO::NetAccess::stat (url, t, topLevelWidget()))
2073 kdDebug (kfile_area) <<
"\tfile exists" << endl;
2075 if (isDirectory (t))
2077 kdDebug (kfile_area) <<
"\tisDir - won't alter extension" << endl;
2090 if (lastExtension.length () && fileName.endsWith (lastExtension))
2091 fileName.truncate (len - lastExtension.length ());
2094 fileName.truncate (dot);
2097 const TQString newText = urlStr.left (fileNameOffset) + fileName + d->extension;
2098 if ( newText != locationEdit->currentText() )
2100 locationEdit->setCurrentText (urlStr.left (fileNameOffset) + fileName + d->extension);
2101 locationEdit->lineEdit()->setEdited (
true);
2108 void KFileDialog::updateFilter ()
2111 const TQString urlStr = locationEdit->currentText ();
2112 if (urlStr.isEmpty ())
2115 KMimeType::Ptr mime = KMimeType::findByPath(urlStr, 0,
true);
2116 if (mime && mime->name() != KMimeType::defaultMimeType()) {
2117 if (filterWidget->currentFilter() != mime->name() &&
2118 filterWidget->filters.findIndex(mime->name()) != -1) {
2119 filterWidget->setCurrentFilter(mime->name());
2126 void KFileDialog::appendExtension (KURL &url)
2128 if (!d->autoSelectExtCheckBox->isChecked () || d->extension.isEmpty ())
2131 TQString fileName = url.fileName ();
2132 if (fileName.isEmpty ())
2135 kdDebug (kfile_area) <<
"appendExtension(" << url <<
")" << endl;
2137 const int len = fileName.length ();
2138 const int dot = fileName.findRev (
'.');
2140 const bool suppressExtension = (dot == len - 1);
2141 const bool unspecifiedExtension = (dot <= 0);
2144 if (!(suppressExtension || unspecifiedExtension))
2149 if (KIO::NetAccess::stat (url, t, topLevelWidget()))
2151 kdDebug (kfile_area) <<
"\tfile exists - won't append extension" << endl;
2156 if (suppressExtension)
2168 kdDebug (kfile_area) <<
"\tstrip trailing dot" << endl;
2169 url.setFileName (fileName.left (len - 1));
2172 else if (unspecifiedExtension)
2174 kdDebug (kfile_area) <<
"\tappending extension \'" << d->extension <<
"\'..." << endl;
2175 url.setFileName (fileName + d->extension);
2176 kdDebug (kfile_area) <<
"\tsaving as \'" << url <<
"\'" << endl;
2182 void KFileDialog::addToRecentDocuments()
2184 int m = ops->
mode();
2186 if ( m & KFile::LocalOnly ) {
2188 TQStringList::ConstIterator it = files.begin();
2189 for ( ; it != files.end(); ++it )
2195 KURL::List::ConstIterator it = urls.begin();
2196 for ( ; it != urls.end(); ++it ) {
2197 if ( (*it).isValid() )
2210 if ( e->key() == Key_Escape )
2213 d->cancelButton->animateClick();
2216 KDialogBase::keyPressEvent( e );
2231 homeURL.setPath( TQDir::homeDirPath() );
2234 if ( homeURL.equals( urlItem->
url(), true ) )
2240 urlItem =
static_cast<KURLBarItem*
>( urlItem->next() );
2252 static_cast<KToggleAction *
>(
actionCollection()->action(
"toggleSpeedbar"))->setChecked( show );
2259 if (d->bookmarkHandler)
2264 d->bookmarkHandler =
new KFileBookmarkHandler(
this );
2265 connect( d->bookmarkHandler, TQT_SIGNAL( openURL(
const TQString& )),
2266 TQT_SLOT( enterURL(
const TQString& )));
2268 toolbar->insertButton(TQString::fromLatin1(
"bookmark"),
2269 (
int)HOTLIST_BUTTON,
true,
2270 i18n(
"Bookmarks"), 5);
2271 toolbar->getButton(HOTLIST_BUTTON)->setPopup(d->bookmarkHandler->menu(),
2273 TQWhatsThis::add(toolbar->getButton(HOTLIST_BUTTON),
2274 i18n(
"<qt>This button allows you to bookmark specific locations. " 2275 "Click on this button to open the bookmark menu where you may add, " 2276 "edit or select a bookmark.<p>" 2277 "These bookmarks are specific to the file dialog, but otherwise operate " 2278 "like bookmarks elsewhere in KDE.</qt>"));
2280 else if (d->bookmarkHandler)
2282 delete d->bookmarkHandler;
2283 d->bookmarkHandler = 0;
2284 toolbar->removeItem(HOTLIST_BUTTON);
2287 static_cast<KToggleAction *
>(
actionCollection()->action(
"toggleBookmarks"))->setChecked( show );
2292 return d->m_pathComboIndex;
2296 void KFileDialog::initStatic()
2298 if ( lastDirectory )
2301 lastDirectory = ldd.setObject(lastDirectory,
new KURL());
2306 TQString& recentDirClass )
2310 recentDirClass = TQString::null;
2313 bool useDefaultStartDir = startDir.isEmpty();
2314 if ( !useDefaultStartDir )
2316 if (startDir[0] ==
':')
2318 recentDirClass = startDir;
2323 ret = KCmdLineArgs::makeURL( TQFile::encodeName(startDir) );
2325 if ( !KProtocolInfo::supportsListing( ret ) )
2326 useDefaultStartDir =
true;
2330 if ( useDefaultStartDir )
2332 if (lastDirectory->isEmpty()) {
2333 lastDirectory->setPath(KGlobalSettings::documentPath());
2335 home.setPath( TQDir::homeDirPath() );
2340 if ( lastDirectory->path(+1) == home.path(+1) ||
2341 TQDir::currentDirPath() != TQDir::homeDirPath() ||
2342 !TQDir(lastDirectory->path(+1)).exists() )
2343 lastDirectory->setPath(TQDir::currentDirPath());
2345 ret = *lastDirectory;
2351 void KFileDialog::setStartDir(
const KURL& directory )
2354 if ( directory.isValid() )
2355 *lastDirectory = directory;
2358 void KFileDialog::setNonExtSelection()
2361 TQString pattern, filename = locationEdit->currentText().stripWhiteSpace();
2362 KServiceTypeFactory::self()->findFromPattern( filename, &pattern );
2364 if ( !pattern.isEmpty() && pattern.at( 0 ) ==
'*' && pattern.find(
'*' , 1 ) == -1 )
2365 locationEdit->lineEdit()->setSelection( 0, filename.length() - pattern.stripWhiteSpace().length()+1 );
2368 int lastDot = filename.findRev(
'.' );
2370 locationEdit->lineEdit()->setSelection( 0, lastDot );
2374 void KFileDialog::virtual_hook(
int id,
void* data )
2375 { KDialogBase::virtual_hook(
id, data ); }
2378 #include "kfiledialog.moc" void setMimeFilter(const TQStringList &types, const TQString &defaultType=TQString::null)
Sets the filter up to specify the output type.
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.
static void add(const KURL &url)
Add a new item to the Recent Document menu.
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.
virtual void readConfig(KConfig *, const TQString &group=TQString::null)
Reads configuration and applies it (size, recent directories, ...)
virtual void writeConfig(KConfig *, const TQString &group=TQString::null)
Saves the current configuration.
void setPreviewWidget(const TQWidget *w) KDE_DEPRECATED
KPushButton * okButton() const
virtual void saveRecentFiles(KConfig *)
Saves the entries from the location combobox.
~KFileDialog()
Destructs the file dialog.
void fileHighlighted(const TQString &)
Emitted when the user highlights a file.
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.
KActionCollection * actionCollection() const
an accessor to a collection of all available Actions.
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.
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 TQString dir(const TQString &fileClass)
Returns the most recently used directory accociated with this file-class.
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.
virtual void writeConfig(KConfig *, const TQString &group=TQString::null)
Saves the current settings like sorting, simple or detailed view.
KURLBar is a widget that displays icons together with a description.
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...
virtual void readConfig(KConfig *, const TQString &group=TQString::null)
Reads the default settings for a view, i.e.
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.
Image preview widget for the file dialog.
virtual void readRecentFiles(KConfig *)
Reads the recent used files and inserts them into the location combobox.
void setURL(const KURL &url)
Sets the current url.
KActionCollection * actionCollection() const
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...
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...
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.
static void add(const TQString &fileClass, const TQString &directory)
Associates directory with fileClass.
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.
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...
void setViewConfig(KConfig *config, const TQString &group)
Sets the config object and the to be used group in KDirOperator.
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*.