59 #include <QtGui/QCheckBox>
60 #include <QtGui/QDockWidget>
61 #include <QtGui/QLayout>
62 #include <QtGui/QLabel>
63 #include <QtGui/QLineEdit>
64 #include <QtGui/QSplitter>
65 #include <QtGui/QAbstractProxyModel>
66 #include <QtGui/QHelpEvent>
67 #include <QtGui/QApplication>
68 #include <QtCore/QFSFileEngine>
73 class KFileWidgetPrivate
81 placesViewSplitter(0),
83 labeledCustomWidget(0),
84 bottomCustomWidget(0),
85 autoSelectExtCheckBox(0),
92 autoSelectExtChecked(false),
95 hasDefaultFilter(false),
98 confirmOverwrite(false),
99 differentHierarchyLevelItemsEntered(false),
105 ~KFileWidgetPrivate()
107 delete bookmarkHandler;
111 void updateLocationWhatsThis();
112 void updateAutoSelectExtension();
117 void setNonExtSelection();
118 void setLocationText(
const KUrl&);
120 void appendExtension(
KUrl &url);
121 void updateLocationEditExtension(
const QString &);
143 void multiSelectionChanged();
154 void setDummyHistoryEntry(
const QString& text,
const QPixmap& icon = QPixmap(),
155 bool usePreviousPixmapIfNull =
true);
160 void removeDummyHistoryEntry();
168 bool toOverwrite(
const KUrl&);
171 void _k_slotLocationChanged(
const QString& );
172 void _k_urlEntered(
const KUrl& );
173 void _k_enterUrl(
const KUrl& );
174 void _k_enterUrl(
const QString& );
175 void _k_locationAccepted(
const QString& );
176 void _k_slotFilterChanged();
177 void _k_fileHighlighted(
const KFileItem& );
178 void _k_fileSelected(
const KFileItem& );
179 void _k_slotLoadingFinished();
180 void _k_fileCompletion(
const QString& );
181 void _k_toggleSpeedbar(
bool );
182 void _k_toggleBookmarks(
bool );
183 void _k_slotAutoSelectExtClicked();
184 void _k_placesViewSplitterMoved(
int,
int);
185 void _k_activateUrlNavigator();
186 void _k_zoomOutIconsSize();
187 void _k_zoomInIconsSize();
188 void _k_slotIconSizeSliderMoved(
int);
189 void _k_slotIconSizeChanged(
int);
191 void addToRecentDocuments();
193 QString locationEditCurrentText()
const;
202 void setInlinePreviewShown(
bool show);
214 QBoxLayout *boxLayout;
225 QDockWidget *placesDock;
227 QSplitter *placesViewSplitter;
237 QCheckBox *autoSelectExtCheckBox;
257 QTimer filterDelayTimer;
262 bool autoSelectExtChecked : 1;
266 bool keepLocation : 1;
272 bool hasDefaultFilter : 1;
273 bool autoDirectoryFollowing : 1;
277 bool confirmOverwrite : 1;
278 bool differentHierarchyLevelItemsEntered;
281 QSlider *iconSizeSlider;
286 static const
char autocompletionWhatsThisText[] = I18N_NOOP("<qt>While typing in the text area, you may be presented "
287 "with possible matches. "
288 "This feature can be controlled by clicking with the right mouse button "
289 "and selecting a preferred mode from the <b>Text Completion</b> menu.</qt>");
294 int len =
string.length();
295 static const char prot[] =
":/";
296 for (
int i=0; i < len;) {
297 i =
string.indexOf( QLatin1String(prot), i );
301 for (; j >= 0; j--) {
302 const QChar& ch(
string[j] );
303 if (ch.toLatin1() == 0 || !ch.isLetter())
305 if (ch.isSpace() && (i-j-1) >= 2)
318 KUrl startDir(_startDir);
322 d->okButton =
new KPushButton(KStandardGuiItem::ok(),
this);
323 d->okButton->setDefault(
true);
324 d->cancelButton =
new KPushButton(KStandardGuiItem::cancel(),
this);
327 d->cancelButton->hide();
329 d->opsWidget =
new QWidget(
this);
330 QVBoxLayout *opsWidgetLayout =
new QVBoxLayout(d->opsWidget);
331 opsWidgetLayout->setMargin(0);
332 opsWidgetLayout->setSpacing(0);
334 d->toolbar =
new KToolBar(d->opsWidget,
true);
335 d->toolbar->setObjectName(
"KFileWidget::toolbar");
336 d->toolbar->setMovable(
false);
337 opsWidgetLayout->addWidget(d->toolbar);
343 d->url =
getStartUrl( startDir, d->fileClass, filename );
353 d->urlNavigator->setPlacesSelectorVisible(
false);
354 opsWidgetLayout->addWidget(d->urlNavigator);
359 foreach(
const QFileInfo &drive,QFSFileEngine::drives() )
393 d->ops->setObjectName(
"KFileWidget::ops" );
394 d->ops->setIsSaving(d->operationMode ==
Saving);
395 opsWidgetLayout->addWidget(d->ops);
396 connect(d->ops, SIGNAL(urlEntered(
KUrl)),
397 SLOT(_k_urlEntered(
KUrl)));
402 connect(d->ops, SIGNAL(finishedLoading()),
403 SLOT(_k_slotLoadingFinished()));
419 coll->
action(
"up" )->setWhatsThis(
i18n(
"<qt>Click this button to enter the parent folder.<br /><br />"
420 "For instance, if the current location is file:/home/%1 clicking this "
421 "button will take you to file:/home.</qt>",
KUser().loginName() ));
423 coll->
action(
"back" )->setWhatsThis(
i18n(
"Click this button to move backwards one step in the browsing history."));
424 coll->
action(
"forward" )->setWhatsThis(
i18n(
"Click this button to move forward one step in the browsing history."));
426 coll->
action(
"reload" )->setWhatsThis(
i18n(
"Click this button to reload the contents of the current location."));
427 coll->
action(
"mkdir" )->setShortcut( QKeySequence(Qt::Key_F10) );
428 coll->
action(
"mkdir" )->setWhatsThis(
i18n(
"Click this button to create a new folder."));
430 KAction *goToNavigatorAction = coll->
addAction(
"gotonavigator",
this, SLOT(_k_activateUrlNavigator()) );
431 goToNavigatorAction->
setShortcut( QKeySequence(Qt::CTRL + Qt::Key_L) );
435 coll->
addAction(
"toggleSpeedbar", showSidebarAction);
436 showSidebarAction->
setShortcut( QKeySequence(Qt::Key_F9) );
437 connect( showSidebarAction, SIGNAL(toggled(
bool)),
438 SLOT(_k_toggleSpeedbar(
bool)) );
442 coll->
addAction(
"toggleBookmarks", showBookmarksAction);
443 connect( showBookmarksAction, SIGNAL(toggled(
bool)),
444 SLOT(_k_toggleBookmarks(
bool)) );
448 menu->setWhatsThis(
i18n(
"<qt>This is the preferences menu for the file dialog. "
449 "Various options can be accessed from this menu including: <ul>"
450 "<li>how files are sorted in the list</li>"
451 "<li>types of view, including icon and list</li>"
452 "<li>showing of hidden files</li>"
453 "<li>the Places navigation panel</li>"
454 "<li>file previews</li>"
455 "<li>separating folders from files</li></ul></qt>"));
464 KShortcut( QKeySequence(Qt::ALT + Qt::Key_Period), QKeySequence(Qt::Key_F8) ) );
469 coll->
action(
"inline preview" )->setShortcut( QKeySequence(Qt::Key_F11) );
473 connect( menu->
menu(), SIGNAL(aboutToShow()),
474 d->ops, SLOT(updateSelectionDependentActions()));
476 d->iconSizeSlider =
new QSlider(
this);
477 d->iconSizeSlider->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Fixed);
478 d->iconSizeSlider->setOrientation(Qt::Horizontal);
479 d->iconSizeSlider->setMinimum(0);
480 d->iconSizeSlider->setMaximum(100);
481 d->iconSizeSlider->installEventFilter(
this);
482 connect(d->iconSizeSlider, SIGNAL(valueChanged(
int)),
483 d->ops, SLOT(setIconsZoom(
int)));
484 connect(d->iconSizeSlider, SIGNAL(valueChanged(
int)),
485 this, SLOT(_k_slotIconSizeChanged(
int)));
486 connect(d->iconSizeSlider, SIGNAL(sliderMoved(
int)),
487 this, SLOT(_k_slotIconSizeSliderMoved(
int)));
488 connect(d->ops, SIGNAL(currentIconSizeChanged(
int)),
489 d->iconSizeSlider, SLOT(setValue(
int)));
492 connect(furtherAction, SIGNAL(triggered()), SLOT(_k_zoomOutIconsSize()));
494 connect(closerAction, SIGNAL(triggered()), SLOT(_k_zoomInIconsSize()));
497 midSpacer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
500 separator->setSeparator(
true);
503 separator2->setSeparator(
true);
505 d->toolbar->addAction(coll->
action(
"back" ));
506 d->toolbar->addAction(coll->
action(
"forward"));
507 d->toolbar->addAction(coll->
action(
"up"));
508 d->toolbar->addAction(coll->
action(
"reload"));
509 d->toolbar->addAction(separator);
510 d->toolbar->addAction(coll->
action(
"inline preview"));
511 d->toolbar->addWidget(midSpacer);
512 d->toolbar->addAction(furtherAction);
513 d->toolbar->addWidget(d->iconSizeSlider);
514 d->toolbar->addAction(closerAction);
515 d->toolbar->addAction(separator2);
516 d->toolbar->addAction(coll->
action(
"mkdir"));
517 d->toolbar->addAction(menu);
519 d->toolbar->setToolButtonStyle(Qt::ToolButtonIconOnly);
520 d->toolbar->setMovable(
false);
526 connect( d->urlNavigator, SIGNAL(urlChanged(
KUrl)),
527 this, SLOT(_k_enterUrl(
KUrl)));
528 connect( d->urlNavigator, SIGNAL(returnPressed()),
529 d->ops, SLOT(setFocus()));
534 d->locationLabel =
new QLabel(
i18n(
"&Name:"),
this);
536 d->locationEdit->installEventFilter(
this);
540 d->locationEdit->setSizeAdjustPolicy(QComboBox::AdjustToMinimumContentsLength);
541 connect( d->locationEdit, SIGNAL(editTextChanged(
QString)),
542 SLOT(_k_slotLocationChanged(
QString)) );
544 d->updateLocationWhatsThis();
545 d->locationLabel->setBuddy(d->locationEdit);
548 d->locationEdit->setCompletionObject( fileCompletionObj );
549 d->locationEdit->setAutoDeleteCompletionObject(
true );
550 connect( fileCompletionObj, SIGNAL(match(
QString)),
551 SLOT(_k_fileCompletion(
QString)) );
553 connect(d->locationEdit, SIGNAL(returnPressed(
QString)),
554 this, SLOT(_k_locationAccepted(
QString)));
557 whatsThisText =
i18n(
"<qt>This is the filter to apply to the file list. "
558 "File names that do not match the filter will not be shown.<p>"
559 "You may select from one of the preset filters in the "
560 "drop down menu, or you may enter a custom filter "
561 "directly into the text area.</p><p>"
562 "Wildcards such as * and ? are allowed.</p></qt>");
563 d->filterLabel =
new QLabel(
i18n(
"&Filter:"),
this);
564 d->filterLabel->setWhatsThis(whatsThisText);
569 d->filterWidget->setSizeAdjustPolicy(QComboBox::AdjustToMinimumContentsLength);
570 d->filterWidget->setWhatsThis(whatsThisText);
571 d->filterLabel->setBuddy(d->filterWidget);
572 connect(d->filterWidget, SIGNAL(
filterChanged()), SLOT(_k_slotFilterChanged()));
574 d->filterDelayTimer.setSingleShot(
true);
575 d->filterDelayTimer.setInterval(300);
576 connect(d->filterWidget, SIGNAL(editTextChanged(
QString)), &d->filterDelayTimer, SLOT(start()));
577 connect(&d->filterDelayTimer, SIGNAL(
timeout()), SLOT(_k_slotFilterChanged()));
581 d->autoSelectExtCheckBox =
new QCheckBox (
this);
582 d->autoSelectExtCheckBox->setStyleSheet(
QString(
"QCheckBox { padding-top: %1px; }").arg(KDialog::spacingHint()));
583 connect(d->autoSelectExtCheckBox, SIGNAL(clicked()), SLOT(_k_slotAutoSelectExtClicked()));
590 d->readConfig(viewConfigGroup);
592 coll->
action(
"inline preview")->setChecked(d->ops->isInlinePreviewShown());
593 d->iconSizeSlider->setValue(d->ops->iconsZoom());
607 bool statRes =
false;
608 if ( filename.isEmpty() )
610 KIO::StatJob *statJob = KIO::stat(startDir, KIO::HideProgressInfo);
616 kDebug(
kfile_area) <<
"statJob -> startDir" << startDir <<
"filename" << filename;
620 d->ops->setUrl(startDir,
true);
621 d->urlNavigator->setLocationUrl(startDir);
623 d->placesView->setUrl(startDir);
628 if (!filename.isEmpty()) {
629 QLineEdit* lineEdit = d->locationEdit->lineEdit();
632 d->setLocationText(filename);
634 lineEdit->setText(filename);
636 lineEdit->setModified(
true);
638 lineEdit->selectAll();
641 d->locationEdit->setFocus();
654 d->locationLabel->setText(text);
659 int pos = filter.indexOf(
'/');
664 if (pos > 0 && filter[pos - 1] !=
'\\') {
665 QStringList filters = filter.split(
' ', QString::SkipEmptyParts);
674 for (pos = 0; (pos = copy.indexOf(
"\\/", pos)) != -1; ++pos)
677 d->ops->clearFilter();
678 d->filterWidget->setFilter(copy);
679 d->ops->setNameFilter(d->filterWidget->currentFilter());
681 d->hasDefaultFilter =
false;
682 d->filterWidget->setEditable(
true );
684 d->updateAutoSelectExtension ();
689 return d->filterWidget->currentFilter();
695 d->filterWidget->setMimeFilter( mimeTypes, defaultType );
697 QStringList types = d->filterWidget->currentFilter().split(
' ', QString::SkipEmptyParts);
698 types.append( QLatin1String(
"inode/directory" ));
699 d->ops->clearFilter();
700 d->ops->setMimeFilter( types );
701 d->hasDefaultFilter = !defaultType.isEmpty();
702 d->filterWidget->setEditable( !d->hasDefaultFilter ||
703 d->operationMode !=
Saving );
705 d->updateAutoSelectExtension ();
710 d->filterWidget->setFilter(
QString() );
711 d->ops->clearFilter();
712 d->hasDefaultFilter =
false;
713 d->filterWidget->setEditable(
true );
715 d->updateAutoSelectExtension ();
720 int i = d->filterWidget->currentIndex();
721 if (d->filterWidget->showsAllTypes() && i == 0)
724 return d->filterWidget->filters()[i];
733 d->ops->setPreviewWidget(w);
734 d->ops->clearHistory();
738 KUrl KFileWidgetPrivate::getCompleteUrl(
const QString &_url)
const
742 const QString url = KShell::tildeExpand(_url);
745 if (QDir::isAbsolutePath(url)) {
748 KUrl relativeUrlTest(ops->url());
750 if (!ops->dirLister()->findByUrl(relativeUrlTest).isNull() ||
767 const QString locationEditCurrentText(KShell::tildeExpand(d->locationEditCurrentText()));
769 KUrl::List locationEditCurrentTextList(d->tokenize(locationEditCurrentText));
770 KFile::Modes
mode = d->ops->mode();
773 if (!locationEditCurrentTextList.count()) {
785 if (locationEditCurrentTextList.count() > 1) {
786 if (mode & KFile::File) {
788 i18n(
"You can only select one file"),
789 i18n(
"More than one file provided"));
813 if (!d->differentHierarchyLevelItemsEntered) {
824 while (!res && start < locationEditCurrentTextList.count()) {
825 topMostUrl = locationEditCurrentTextList.at(start);
826 statJob = KIO::stat(topMostUrl, KIO::HideProgressInfo);
841 for (
int i = start; i < locationEditCurrentTextList.count(); ++i) {
842 KUrl currUrl = locationEditCurrentTextList.at(i);
843 KIO::StatJob *statJob = KIO::stat(currUrl, KIO::HideProgressInfo);
853 topMostUrl = topMostUrl.
upUrl();
859 for (
int i = 0; i < locationEditCurrentTextList.count(); ++i) {
860 locationEditCurrentTextList[i] =
KUrl::relativeUrl(topMostUrl, locationEditCurrentTextList[i]);
863 d->ops->setUrl(topMostUrl,
true);
864 const bool signalsBlocked = d->locationEdit->lineEdit()->blockSignals(
true);
866 foreach (
const KUrl &url, locationEditCurrentTextList) {
869 d->locationEdit->lineEdit()->setText(
QString(
"\"%1\"").arg(stringList.join(
"\" \"")));
870 d->locationEdit->lineEdit()->blockSignals(signalsBlocked);
872 d->differentHierarchyLevelItemsEntered =
true;
879 }
else if (locationEditCurrentTextList.count()) {
883 (QDir::isAbsolutePath(locationEditCurrentText) ||
887 KUrl url(locationEditCurrentText);
888 if (d->operationMode ==
Opening) {
889 KIO::StatJob *statJob = KIO::stat(url, KIO::HideProgressInfo);
901 KUrl directory = url;
904 KIO::StatJob * statJob = KIO::stat(directory, KIO::HideProgressInfo);
914 d->ops->setUrl(url,
true);
915 const bool signalsBlocked = d->locationEdit->lineEdit()->blockSignals(
true);
916 d->locationEdit->lineEdit()->setText(fileName);
917 d->locationEdit->lineEdit()->blockSignals(signalsBlocked);
924 d->differentHierarchyLevelItemsEntered =
false;
930 bool onlyDirectoryMode = directoryMode && !(mode &
KFile::File) && !(mode & KFile::Files);
931 KUrl::List::ConstIterator it = locationEditCurrentTextList.constBegin();
932 bool filesInList =
false;
933 while (it != locationEditCurrentTextList.constEnd()) {
936 if (d->operationMode ==
Saving && !directoryMode) {
937 d->appendExtension(url);
941 KIO::StatJob *statJob = KIO::stat(url, KIO::HideProgressInfo);
944 if (!KAuthorized::authorizeUrlAction(
"open",
KUrl(), url)) {
945 QString msg = KIO::buildErrorString(KIO::ERR_ACCESS_DENIED, d->url.prettyUrl());
953 i18n(
"You can only select local files"),
954 i18n(
"Remote files not accepted"));
958 if ((d->operationMode ==
Saving) && d->confirmOverwrite && !d->toOverwrite(url)) {
967 while (it != locationEditCurrentTextList.constEnd()) {
969 KIO::StatJob *checkStatJob = KIO::stat(checkUrl, KIO::HideProgressInfo);
972 KMessageBox::sorry(
this,
i18n(
"More than one folder has been selected and this dialog does not accept folders, so it is not possible to decide which one to enter. Please select only one folder to list it."),
i18n(
"More than one folder provided"));
980 KMessageBox::information(
this,
i18n(
"At least one folder and one file has been selected. Selected files will be ignored and the selected folder will be listed"),
i18n(
"Files and folders selected"));
982 d->ops->setUrl(url,
true);
983 const bool signalsBlocked = d->locationEdit->lineEdit()->blockSignals(
true);
984 d->locationEdit->lineEdit()->setText(
QString());
985 d->locationEdit->lineEdit()->blockSignals(signalsBlocked);
1010 *lastDirectory = d->ops->url();
1011 if (!d->fileClass.isEmpty())
1012 KRecentDirs::add(d->fileClass, d->ops->url().url());
1015 d->locationEdit->setItemText( 0,
QString() );
1019 int atmost = d->locationEdit->maxItems();
1020 for ( ; it != list.end() && atmost > 0; ++it ) {
1021 const KUrl& url = *it;
1028 for (
int i = 1; i < d->locationEdit->count(); i++ ) {
1029 if ( d->locationEdit->itemText( i ) == file ) {
1030 d->locationEdit->removeItem( i-- );
1037 d->locationEdit->insertItem( 1,file);
1043 d->writeConfig(grp);
1044 d->saveRecentFiles(grp);
1046 d->addToRecentDocuments();
1057 void KFileWidgetPrivate::_k_fileHighlighted(
const KFileItem &i)
1060 (locationEdit->hasFocus() && !locationEdit->currentText().isEmpty()))
1063 const bool modified = locationEdit->lineEdit()->isModified();
1068 setLocationText(
KUrl());
1075 if (!locationEdit->hasFocus()) {
1076 setLocationText( url );
1079 emit q->fileHighlighted(url.url());
1080 emit q->fileHighlighted(url);
1082 multiSelectionChanged();
1083 emit q->selectionChanged();
1086 locationEdit->lineEdit()->setModified(
false );
1087 locationEdit->lineEdit()->selectAll();
1090 void KFileWidgetPrivate::_k_fileSelected(
const KFileItem &i)
1098 setLocationText(
KUrl());
1101 setLocationText(i.
url());
1103 multiSelectionChanged();
1104 emit q->selectionChanged();
1110 locationEdit->setFocus();
1119 void KFileWidgetPrivate::multiSelectionChanged()
1121 if (locationEdit->hasFocus() && !locationEdit->currentText().isEmpty()) {
1127 if (list.isEmpty()) {
1128 setLocationText(
KUrl());
1133 foreach (
const KFileItem &fileItem, list) {
1134 urlList << fileItem.
url();
1137 setLocationText(urlList);
1140 void KFileWidgetPrivate::setDummyHistoryEntry(
const QString& text,
const QPixmap& icon,
1141 bool usePreviousPixmapIfNull )
1146 QObject::disconnect( locationEdit, SIGNAL(editTextChanged(
QString)),
1147 q, SLOT(_k_slotLocationChanged(
QString)) );
1149 bool dummyExists = dummyAdded;
1151 int cursorPosition = locationEdit->lineEdit()->cursorPosition();
1154 if ( !icon.isNull() ) {
1155 locationEdit->setItemIcon( 0, icon );
1156 locationEdit->setItemText( 0, text );
1158 if ( !usePreviousPixmapIfNull ) {
1159 locationEdit->setItemIcon( 0, QPixmap() );
1161 locationEdit->setItemText( 0, text );
1164 if ( !text.isEmpty() ) {
1165 if ( !icon.isNull() ) {
1166 locationEdit->insertItem( 0, icon, text );
1168 if ( !usePreviousPixmapIfNull ) {
1169 locationEdit->insertItem( 0, QPixmap(), text );
1171 locationEdit->insertItem( 0, text );
1179 if ( dummyExists && !text.isEmpty() ) {
1180 locationEdit->setCurrentIndex( 0 );
1183 locationEdit->lineEdit()->setCursorPosition( cursorPosition );
1185 QObject::connect( locationEdit, SIGNAL(editTextChanged(
QString)),
1186 q, SLOT(_k_slotLocationChanged(
QString)) );
1189 void KFileWidgetPrivate::removeDummyHistoryEntry()
1191 if ( !dummyAdded ) {
1198 QObject::disconnect( locationEdit, SIGNAL(editTextChanged(
QString)),
1199 q, SLOT(_k_slotLocationChanged(
QString)) );
1201 if (locationEdit->count()) {
1202 locationEdit->removeItem( 0 );
1204 locationEdit->setCurrentIndex( -1 );
1207 QObject::connect( locationEdit, SIGNAL(editTextChanged(
QString)),
1208 q, SLOT(_k_slotLocationChanged(
QString)) );
1211 void KFileWidgetPrivate::setLocationText(
const KUrl& url)
1213 if (!url.isEmpty()) {
1220 q->setUrl(u,
false);
1223 q->setUrl(url.
path(),
false);
1226 setDummyHistoryEntry(url.
fileName() , mimeTypeIcon);
1228 removeDummyHistoryEntry();
1233 setNonExtSelection();
1237 void KFileWidgetPrivate::setLocationText(
const KUrl::List& urlList )
1239 const KUrl currUrl = ops->
url();
1241 if ( urlList.count() > 1 ) {
1243 foreach (
const KUrl &url, urlList) {
1246 urls = urls.left( urls.size() - 1 );
1248 setDummyHistoryEntry( urls, QPixmap(),
false );
1249 }
else if ( urlList.count() ) {
1253 removeDummyHistoryEntry();
1258 setNonExtSelection();
1261 void KFileWidgetPrivate::updateLocationWhatsThis()
1266 whatsThisText =
"<qt>" +
i18n(
"This is the name to save the file as.") +
1267 i18n (autocompletionWhatsThisText);
1271 whatsThisText =
"<qt>" +
i18n(
"This is the list of files to open. More than "
1272 "one file can be specified by listing several "
1273 "files, separated by spaces.") +
1274 i18n (autocompletionWhatsThisText);
1278 whatsThisText =
"<qt>" +
i18n(
"This is the name of the file to open.") +
1279 i18n (autocompletionWhatsThisText);
1282 locationLabel->setWhatsThis(whatsThisText);
1283 locationEdit->setWhatsThis(whatsThisText);
1286 void KFileWidgetPrivate::initSpeedbar()
1292 placesDock =
new QDockWidget(
i18nc(
"@title:window",
"Places"), q);
1293 placesDock->setFeatures(QDockWidget::DockWidgetClosable);
1296 placesView->setModel(model);
1297 placesView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
1299 placesView->setObjectName(QLatin1String(
"url bar"));
1300 QObject::connect(placesView, SIGNAL(urlChanged(
KUrl)),
1301 q, SLOT(_k_enterUrl(
KUrl)));
1307 placesView->setUrl(url);
1309 placesDock->setWidget(placesView);
1310 placesViewSplitter->insertWidget(0, placesDock);
1313 KConfigGroup configGroup(KGlobal::config(), ConfigGroup);
1314 placesViewWidth = configGroup.readEntry(SpeedbarWidth, placesView->sizeHint().width());
1316 QList<int> sizes = placesViewSplitter->sizes();
1317 if (placesViewWidth > 0) {
1318 sizes[0] = placesViewWidth + 1;
1319 sizes[1] = q->width() - placesViewWidth -1;
1320 placesViewSplitter->setSizes(sizes);
1323 QObject::connect(placesDock, SIGNAL(visibilityChanged(
bool)),
1324 q, SLOT(_k_toggleSpeedbar(
bool)));
1327 void KFileWidgetPrivate::initGUI()
1331 boxLayout =
new QVBoxLayout( q);
1332 boxLayout->setMargin(0);
1334 placesViewSplitter =
new QSplitter(q);
1335 placesViewSplitter->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
1336 placesViewSplitter->setChildrenCollapsible(
false);
1337 boxLayout->addWidget(placesViewSplitter);
1339 QObject::connect(placesViewSplitter, SIGNAL(splitterMoved(
int,
int)),
1340 q, SLOT(_k_placesViewSplitterMoved(
int,
int)));
1341 placesViewSplitter->insertWidget(0, opsWidget);
1343 vbox =
new QVBoxLayout();
1345 boxLayout->addLayout(vbox);
1347 lafBox =
new QGridLayout();
1349 lafBox->addWidget(locationLabel, 0, 0, Qt::AlignVCenter | Qt::AlignRight);
1350 lafBox->addWidget(locationEdit, 0, 1, Qt::AlignVCenter);
1351 lafBox->addWidget(okButton, 0, 2, Qt::AlignVCenter);
1353 lafBox->addWidget(filterLabel, 1, 0, Qt::AlignVCenter | Qt::AlignRight);
1354 lafBox->addWidget(filterWidget, 1, 1, Qt::AlignVCenter);
1355 lafBox->addWidget(cancelButton, 1, 2, Qt::AlignVCenter);
1357 lafBox->setColumnStretch(1, 4);
1359 vbox->addLayout(lafBox);
1362 vbox->addWidget(autoSelectExtCheckBox);
1364 q->setTabOrder(ops, autoSelectExtCheckBox);
1365 q->setTabOrder(autoSelectExtCheckBox, locationEdit);
1366 q->setTabOrder(locationEdit, filterWidget);
1367 q->setTabOrder(filterWidget, okButton);
1368 q->setTabOrder(okButton, cancelButton);
1369 q->setTabOrder(cancelButton, urlNavigator);
1370 q->setTabOrder(urlNavigator, ops);
1371 q->setTabOrder(cancelButton, urlNavigator);
1372 q->setTabOrder(urlNavigator, ops);
1376 void KFileWidgetPrivate::_k_slotFilterChanged()
1380 filterDelayTimer.stop();
1382 QString filter = filterWidget->currentFilter();
1385 if ( filter.contains(
'/') ) {
1387 types.prepend(
"inode/directory");
1388 ops->setMimeFilter( types );
1390 else if ( filter.contains(
'*') || filter.contains(
'?') || filter.contains(
'[') ) {
1391 ops->setNameFilter( filter );
1394 ops->setNameFilter(
'*' + filter.replace(
' ',
'*') +
'*');
1399 updateAutoSelectExtension();
1401 emit q->filterChanged(filter);
1409 d->ops->setUrl(url, clearforward);
1413 void KFileWidgetPrivate::_k_urlEntered(
const KUrl& url)
1417 QString filename = locationEditCurrentText();
1420 if (pathCombo->count() != 0) {
1424 bool blocked = locationEdit->blockSignals(
true);
1426 locationEdit->changeUrl(0,
KIcon(KMimeType::iconNameForUrl(filename)), filename);
1427 locationEdit->lineEdit()->setModified(
true);
1430 locationEdit->blockSignals( blocked );
1432 urlNavigator->setLocationUrl(url);
1437 completion->setDir( url.
path() );
1441 placesView->setUrl( url );
1445 void KFileWidgetPrivate::_k_locationAccepted(
const QString &url)
1452 void KFileWidgetPrivate::_k_enterUrl(
const KUrl& url )
1456 KUrl fixedUrl( url );
1460 q->setUrl( fixedUrl );
1461 if (!locationEdit->hasFocus())
1465 void KFileWidgetPrivate::_k_enterUrl(
const QString& url )
1469 _k_enterUrl(
KUrl( KUrlCompletion::replacedPath( url,
true,
true )) );
1472 bool KFileWidgetPrivate::toOverwrite(
const KUrl &url)
1476 KIO::StatJob *statJob = KIO::stat(url, KIO::HideProgressInfo);
1481 i18n(
"The file \"%1\" already exists. Do you wish to overwrite it?" ,
1482 url.
fileName() ),
i18n(
"Overwrite File?" ), KStandardGuiItem::overwrite(),
1498 if (url.isEmpty()) {
1502 KUrl u = d->getCompleteUrl(url);
1504 kWarning() << url <<
" is not a correct argument for setSelection!";
1512 d->setLocationText(url);
1515 void KFileWidgetPrivate::_k_slotLoadingFinished()
1517 if (locationEdit->currentText().isEmpty()) {
1521 ops->blockSignals(
true);
1525 ops->setCurrentItem(url.
url());
1526 ops->blockSignals(
false);
1529 void KFileWidgetPrivate::_k_fileCompletion(
const QString& match )
1533 if (match.isEmpty() || locationEdit->currentText().contains(
'"')) {
1540 void KFileWidgetPrivate::_k_slotLocationChanged(
const QString& text )
1544 locationEdit->lineEdit()->setModified(
true);
1546 if (text.isEmpty() && ops->view()) {
1547 ops->view()->clearSelection();
1550 if (text.isEmpty()) {
1551 removeDummyHistoryEntry();
1553 setDummyHistoryEntry( text );
1556 if (!locationEdit->lineEdit()->text().isEmpty()) {
1559 foreach (
const KUrl &url, urlList) {
1560 stringList << url.
url();
1562 ops->setCurrentItems(stringList);
1583 if ( d->inAccept ) {
1585 list = d->parseSelectedUrls();
1587 list.append( d->url );
1593 KUrl::List& KFileWidgetPrivate::parseSelectedUrls()
1597 if ( filenames.isEmpty() ) {
1602 if ( filenames.contains(
'/' )) {
1610 urlList.append( u );
1613 i18n(
"The chosen filenames do not\n"
1614 "appear to be valid."),
1615 i18n(
"Invalid Filenames") );
1619 urlList = tokenize( filenames );
1633 KUrl u( ops->url() );
1637 const int count = line.count( QLatin1Char(
'"' ) );
1639 if (!QDir::isAbsolutePath(line)) {
1651 int index1 = -1, index2 = -1;
1653 index1 = line.indexOf(
'"', start );
1654 index2 = line.indexOf(
'"', index1 + 1 );
1656 if ( index1 < 0 || index2 < 0 )
1660 name = line.mid( index1 + 1, index2 - index1 - 1 );
1664 KUrl currUrl( name );
1666 if ( !QDir::isAbsolutePath(currUrl.
url()) ) {
1667 _u.setFileName( name );
1674 if ( _u.isValid() ) {
1689 if ( d->inAccept ) {
1690 const KUrl url = d->mostLocalUrl(d->url);
1695 i18n(
"You can only select local files."),
1696 i18n(
"Remote Files Not Accepted") );
1710 const KUrl::List urls = d->parseSelectedUrls();
1712 while (it != urls.end()) {
1713 KUrl url = d->mostLocalUrl(*it);
1721 if ( d->url.isLocalFile() )
1722 list.append( d->url.toLocalFile() );
1731 return d->ops->url();
1736 QWidget::resizeEvent(event);
1738 if (d->placesDock) {
1741 QList<int> sizes = d->placesViewSplitter->sizes();
1742 sizes[0] = d->placesViewWidth + 1;
1743 sizes[1] = width() - d->placesViewWidth - 1;
1744 d->placesViewSplitter->setSizes( sizes );
1750 if ( !d->hasView ) {
1754 d->ops->view()->setSizePolicy( QSizePolicy( QSizePolicy::Maximum, QSizePolicy::Maximum ) );
1757 d->ops->clearHistory();
1759 QWidget::showEvent(event);
1764 const bool res = QWidget::eventFilter(watched, event);
1766 QKeyEvent *keyEvent =
dynamic_cast<QKeyEvent*
>(event);
1767 if (watched == d->iconSizeSlider && keyEvent) {
1768 if (keyEvent->key() == Qt::Key_Left || keyEvent->key() == Qt::Key_Up ||
1769 keyEvent->key() == Qt::Key_Right || keyEvent->key() == Qt::Key_Down) {
1770 d->_k_slotIconSizeSliderMoved(d->iconSizeSlider->value());
1772 }
else if (watched == d->locationEdit && event->type() == QEvent::KeyPress) {
1773 if (keyEvent->modifiers() & Qt::AltModifier) {
1774 switch (keyEvent->key()) {
1776 d->ops->actionCollection()->action(
"up")->trigger();
1779 d->ops->actionCollection()->action(
"back")->trigger();
1782 d->ops->actionCollection()->action(
"forward")->trigger();
1798 if ( d->ops->dirOnlyMode() ) {
1799 d->filterWidget->setDefaultFilter(
i18n(
"*|All Folders") );
1802 d->filterWidget->setDefaultFilter(
i18n(
"*|All Files") );
1805 d->updateAutoSelectExtension();
1810 return d->ops->mode();
1814 void KFileWidgetPrivate::readConfig(
KConfigGroup &configGroup)
1818 readRecentFiles(configGroup);
1820 ops->setViewConfig(configGroup);
1821 ops->readConfig(configGroup);
1826 DefaultRecentURLsNumber ) );
1827 combo->
setUrl( ops->url() );
1828 autoDirectoryFollowing = configGroup.
readEntry(AutoDirectoryFollowing,
1829 DefaultDirectoryFollowing);
1832 configGroup.
readEntry( PathComboCompletionMode,
1838 configGroup.
readEntry( LocationComboCompletionMode,
1841 locationEdit->setCompletionMode( cm );
1847 completion->setDir(ops->url().url());
1851 _k_toggleSpeedbar( configGroup.
readEntry( ShowSpeedbar,
true ) );
1854 _k_toggleBookmarks( configGroup.
readEntry(ShowBookmarks,
false) );
1857 autoSelectExtChecked = configGroup.
readEntry (AutoSelectExtChecked, DefaultAutoSelectExtChecked);
1858 updateAutoSelectExtension();
1861 urlNavigator->setUrlEditable( !configGroup.
readEntry(BreadcrumbNavigation,
true) );
1864 urlNavigator->setShowFullPath( configGroup.
readEntry(ShowFullPath,
false) );
1866 int w1 = q->minimumSize().width();
1867 int w2 = toolbar->sizeHint().width();
1869 q->setMinimumWidth(w2);
1872 void KFileWidgetPrivate::writeConfig(
KConfigGroup &configGroup)
1882 group.writePathEntry( RecentURLs, pathCombo->urls() );
1884 group.writeEntry( PathComboCompletionMode, static_cast<int>(pathCombo->completionMode()) );
1885 group.writeEntry( LocationComboCompletionMode, static_cast<int>(locationEdit->completionMode()) );
1887 const bool showSpeedbar = placesDock && !placesDock->isHidden();
1888 group.writeEntry( ShowSpeedbar, showSpeedbar );
1890 const QList<int> sizes = placesViewSplitter->sizes();
1891 Q_ASSERT( sizes.count() > 0 );
1892 group.writeEntry( SpeedbarWidth, sizes[0] );
1895 group.writeEntry( ShowBookmarks, bookmarkHandler != 0 );
1896 group.writeEntry( AutoSelectExtChecked, autoSelectExtChecked );
1897 group.writeEntry( BreadcrumbNavigation, !urlNavigator->isUrlEditable() );
1898 group.writeEntry( ShowFullPath, urlNavigator->showFullPath() );
1900 ops->writeConfig(group);
1904 void KFileWidgetPrivate::readRecentFiles(
KConfigGroup &cg)
1908 QObject::disconnect(locationEdit, SIGNAL(editTextChanged(
QString)),
1909 q, SLOT(_k_slotLocationChanged(
QString)));
1911 locationEdit->setMaxItems(cg.
readEntry(RecentFilesNumber, DefaultRecentURLsNumber));
1914 locationEdit->setCurrentIndex(-1);
1916 QObject::connect(locationEdit, SIGNAL(editTextChanged(
QString)),
1917 q, SLOT(_k_slotLocationChanged(
QString)));
1920 void KFileWidgetPrivate::saveRecentFiles(
KConfigGroup &cg)
1933 return d->cancelButton;
1944 d->writeConfig(grp);
1949 d->keepLocation = keep;
1954 return d->keepLocation;
1961 d->operationMode =
mode;
1962 d->keepLocation = (mode ==
Saving);
1963 d->filterWidget->setEditable( !d->hasDefaultFilter || mode !=
Saving );
1966 d->okButton->setGuiItem(
KGuiItem(
i18n(
"&Open" ),
"document-open") );
1969 }
else if ( mode ==
Saving ) {
1970 d->okButton->setGuiItem( KStandardGuiItem::save() );
1971 d->setNonExtSelection();
1973 d->okButton->setGuiItem( KStandardGuiItem::ok() );
1975 d->updateLocationWhatsThis();
1976 d->updateAutoSelectExtension();
1979 d->ops->setIsSaving(mode ==
Saving);
1985 return d->operationMode;
1988 void KFileWidgetPrivate::_k_slotAutoSelectExtClicked()
1994 autoSelectExtChecked = autoSelectExtCheckBox->isChecked();
1997 updateLocationEditExtension (extension );
2000 void KFileWidgetPrivate::_k_placesViewSplitterMoved(
int pos,
int index)
2006 if (placesDock && index == 1) {
2007 placesViewWidth = pos;
2009 lafBox->setColumnMinimumWidth(0, placesViewWidth);
2013 void KFileWidgetPrivate::_k_activateUrlNavigator()
2017 urlNavigator->setUrlEditable(!urlNavigator->isUrlEditable());
2018 if(urlNavigator->isUrlEditable()) {
2019 urlNavigator->setFocus();
2020 urlNavigator->editor()->lineEdit()->selectAll();
2024 void KFileWidgetPrivate::_k_zoomOutIconsSize()
2026 const int currValue = ops->iconsZoom();
2027 const int futValue = qMax(0, currValue - 10);
2028 iconSizeSlider->setValue(futValue);
2029 _k_slotIconSizeSliderMoved(futValue);
2032 void KFileWidgetPrivate::_k_zoomInIconsSize()
2034 const int currValue = ops->iconsZoom();
2035 const int futValue = qMin(100, currValue + 10);
2036 iconSizeSlider->setValue(futValue);
2037 _k_slotIconSizeSliderMoved(futValue);
2040 void KFileWidgetPrivate::_k_slotIconSizeChanged(
int _value)
2043 int value = (maxSize * _value / 100) + KIconLoader::SizeSmall;
2045 case KIconLoader::SizeSmall:
2051 iconSizeSlider->setToolTip(
i18n(
"Icon size: %1 pixels (standard size)", value));
2054 iconSizeSlider->setToolTip(
i18n(
"Icon size: %1 pixels", value));
2059 void KFileWidgetPrivate::_k_slotIconSizeSliderMoved(
int _value)
2063 _k_slotIconSizeChanged(_value);
2065 QPoint global(iconSizeSlider->rect().topLeft());
2066 global.ry() += iconSizeSlider->height() / 2;
2067 QHelpEvent toolTipEvent(QEvent::ToolTip,
QPoint(0, 0), iconSizeSlider->mapToGlobal(global));
2068 QApplication::sendEvent(iconSizeSlider, &toolTipEvent);
2078 QStringList::ConstIterator patternListEnd = patternList.end();
2079 for (QStringList::ConstIterator it = patternList.begin();
2080 it != patternListEnd;
2092 if ((*it).startsWith (QLatin1String(
"*.")) &&
2093 (*it).length() > 2 &&
2094 (*it).indexOf(
'*', 2) < 0 && (*it).indexOf (
'?', 2) < 0)
2096 ret = (*it).mid (1);
2109 ret = KGlobal::locale()->removeAcceleratorMarker (ret);
2120 void KFileWidgetPrivate::updateAutoSelectExtension()
2122 if (!autoSelectExtCheckBox)
return;
2132 QString lastExtension = extension;
2142 QString filter = filterWidget->currentFilter();
2143 if (!filter.isEmpty())
2148 QString currentExtension = KMimeType::extractKnownExtension(locationEditCurrentText());
2149 if ( currentExtension.isEmpty() )
2150 currentExtension = locationEditCurrentText().section(QLatin1Char(
'.'), -1, -1);
2151 kDebug (kfile_area) <<
"filter:" << filter <<
"locationEdit:" << locationEditCurrentText()
2152 <<
"currentExtension:" << currentExtension;
2158 if (filter.indexOf (
'/') < 0)
2160 extensionList = filter.split(
' ', QString::SkipEmptyParts);
2169 extensionList = mime->patterns();
2170 defaultExtension = mime->mainExtension();
2174 if ( !currentExtension.isEmpty() && extensionList.contains(QLatin1String(
"*.") + currentExtension) )
2175 extension = QLatin1Char(
'.') + currentExtension;
2177 extension = defaultExtension;
2179 kDebug (kfile_area) <<
"List:" << extensionList <<
"auto-selected extension:" << extension;
2188 if (!extension.isEmpty())
2191 autoSelectExtCheckBox->setText (i18n (
"Automatically select filename e&xtension (%1)", extension));
2192 whatsThisExtension =
i18n (
"the extension <b>%1</b>", extension);
2194 autoSelectExtCheckBox->setEnabled (
true);
2195 autoSelectExtCheckBox->setChecked (autoSelectExtChecked);
2200 autoSelectExtCheckBox->setText (i18n (
"Automatically select filename e&xtension"));
2201 whatsThisExtension =
i18n (
"a suitable extension");
2203 autoSelectExtCheckBox->setChecked (
false);
2204 autoSelectExtCheckBox->setEnabled (
false);
2209 autoSelectExtCheckBox->setWhatsThis(
"<qt>" +
2211 "This option enables some convenient features for "
2212 "saving files with extensions:<br />"
2214 "<li>Any extension specified in the <b>%1</b> text "
2215 "area will be updated if you change the file type "
2218 "<li>If no extension is specified in the <b>%2</b> "
2219 "text area when you click "
2220 "<b>Save</b>, %3 will be added to the end of the "
2221 "filename (if the filename does not already exist). "
2222 "This extension is based on the file type that you "
2223 "have chosen to save in.<br />"
2225 "If you do not want KDE to supply an extension for the "
2226 "filename, you can either turn this option off or you "
2227 "can suppress it by adding a period (.) to the end of "
2228 "the filename (the period will be automatically "
2232 "If unsure, keep this option enabled as it makes your "
2233 "files more manageable."
2241 autoSelectExtCheckBox->show();
2245 updateLocationEditExtension (lastExtension);
2250 autoSelectExtCheckBox->setChecked (
false);
2251 autoSelectExtCheckBox->hide();
2258 void KFileWidgetPrivate::updateLocationEditExtension (
const QString &lastExtension)
2260 if (!autoSelectExtCheckBox->isChecked() || extension.isEmpty())
2263 QString urlStr = locationEditCurrentText();
2264 if (urlStr.isEmpty())
2267 KUrl url = getCompleteUrl(urlStr);
2270 const int fileNameOffset = urlStr.lastIndexOf (
'/') + 1;
2271 QString fileName = urlStr.mid (fileNameOffset);
2273 const int dot = fileName.lastIndexOf (
'.');
2274 const int len = fileName.length();
2281 KIO::StatJob *statJob = KIO::stat(url, KIO::HideProgressInfo);
2302 if (lastExtension.length() && fileName.endsWith (lastExtension))
2303 fileName.truncate (len - lastExtension.length());
2304 else if (extension.length() && fileName.endsWith (extension))
2305 fileName.truncate (len - extension.length());
2308 fileName.truncate (dot);
2311 const QString newText = urlStr.left (fileNameOffset) + fileName + extension;
2312 if ( newText != locationEditCurrentText() )
2314 locationEdit->setItemText(locationEdit->currentIndex(),urlStr.left (fileNameOffset) + fileName + extension);
2315 locationEdit->lineEdit()->setModified (
true);
2322 void KFileWidgetPrivate::updateFilter()
2327 QString urlStr = locationEditCurrentText();
2328 if (urlStr.isEmpty())
2331 if( filterWidget->isMimeFilter()) {
2333 if (mime && mime->name() != KMimeType::defaultMimeType()) {
2334 if (filterWidget->currentFilter() != mime->name() &&
2335 filterWidget->filters().indexOf(mime->name()) != -1)
2336 filterWidget->setCurrentFilter(mime->name());
2339 QString filename = urlStr.mid( urlStr.lastIndexOf( KDIR_SEPARATOR ) + 1 );
2340 foreach(
const QString& filter, filterWidget->filters()) {
2341 QStringList patterns = filter.left( filter.indexOf(
'|' )).split (
' ', QString::SkipEmptyParts );
2342 foreach (
const QString& p, patterns ) {
2343 if( KMimeType::matchFileName( filename, p )) {
2345 filterWidget->setCurrentFilter( filter );
2356 void KFileWidgetPrivate::appendExtension (
KUrl &url)
2360 if (!autoSelectExtCheckBox->isChecked() || extension.isEmpty())
2364 if (fileName.isEmpty())
2369 const int len = fileName.length();
2370 const int dot = fileName.lastIndexOf (
'.');
2372 const bool suppressExtension = (dot == len - 1);
2373 const bool unspecifiedExtension = (dot <= 0);
2376 if (!(suppressExtension || unspecifiedExtension))
2380 KIO::StatJob *statJob = KIO::stat(url, KIO::HideProgressInfo);
2389 if (suppressExtension)
2405 else if (unspecifiedExtension)
2415 void KFileWidgetPrivate::addToRecentDocuments()
2417 int m = ops->mode();
2423 QStringList::ConstIterator it = files.begin();
2424 for ( ; it != files.end() && atmost > 0; ++it ) {
2432 KUrl::List::ConstIterator it = urls.begin();
2433 for ( ; it != urls.end() && atmost > 0; ++it ) {
2434 if ( (*it).isValid() ) {
2444 return d->locationEdit;
2449 return d->filterWidget;
2454 return d->ops->actionCollection();
2457 void KFileWidgetPrivate::_k_toggleSpeedbar(
bool show)
2462 lafBox->setColumnMinimumWidth(0, placesViewWidth);
2466 homeURL.
setPath( QDir::homePath() );
2468 for (
int rowIndex = 0 ; rowIndex < model->
rowCount() ; rowIndex++) {
2469 QModelIndex index = model->
index(rowIndex, 0);
2473 toolbar->removeAction( ops->actionCollection()->action(
"home" ) );
2478 if (q->sender() == placesDock && placesDock && placesDock->isVisibleTo(q)) {
2488 QAction* homeAction = ops->actionCollection()->action(
"home");
2489 QAction* reloadAction = ops->actionCollection()->action(
"reload");
2490 if (!toolbar->actions().contains(homeAction)) {
2491 toolbar->insertAction(reloadAction, homeAction);
2495 lafBox->setColumnMinimumWidth(0, 0);
2498 static_cast<KToggleAction *
>(q->actionCollection()->action(
"toggleSpeedbar"))->setChecked(show);
2501 urlNavigator->setPlacesSelectorVisible(!show);
2504 void KFileWidgetPrivate::_k_toggleBookmarks(
bool show)
2508 if (bookmarkHandler)
2514 q->connect( bookmarkHandler, SIGNAL(openUrl(
QString)),
2518 bookmarkButton->setDelayed(
false);
2519 q->actionCollection()->addAction(
"bookmark", bookmarkButton);
2520 bookmarkButton->setMenu(bookmarkHandler->menu());
2521 bookmarkButton->setWhatsThis(
i18n(
"<qt>This button allows you to bookmark specific locations. "
2522 "Click on this button to open the bookmark menu where you may add, "
2523 "edit or select a bookmark.<br /><br />"
2524 "These bookmarks are specific to the file dialog, but otherwise operate "
2525 "like bookmarks elsewhere in KDE.</qt>"));
2526 toolbar->addAction(bookmarkButton);
2528 else if (bookmarkHandler)
2530 delete bookmarkHandler;
2531 bookmarkHandler = 0;
2532 delete bookmarkButton;
2536 static_cast<KToggleAction *
>(q->actionCollection()->action(
"toggleBookmarks"))->setChecked( show );
2545 return getStartUrl( startDir, recentDirClass, fileName );
2554 recentDirClass.clear();
2558 bool useDefaultStartDir = startDir.isEmpty();
2559 if ( !useDefaultStartDir )
2561 if ( startDir.
protocol() ==
"kfiledialog" )
2576 if ( urlDir ==
"/" )
2583 keyword = urlDir.mid( 1 );
2587 if ( startDir.
query() ==
"?global" )
2588 recentDirClass =
QString(
"::%1" ).arg( keyword );
2590 recentDirClass =
QString(
":%1" ).arg( keyword );
2592 ret =
KUrl( KRecentDirs::dir(recentDirClass) );
2600 (!startDir.scheme().isEmpty() && !startDir.
isLocalFile()))
2605 useDefaultStartDir =
true;
2612 useDefaultStartDir =
true;
2617 if ( useDefaultStartDir )
2619 if (lastDirectory->isEmpty()) {
2622 home.
setPath( QDir::homePath() );
2628 QDir::currentPath() != QDir::homePath() ||
2630 lastDirectory->setPath(QDir::currentPath());
2632 ret = *lastDirectory;
2635 kDebug(
kfile_area) <<
"for" << startDir <<
"->" << ret <<
"recentDirClass" << recentDirClass <<
"fileName" << fileName;
2641 if ( directory.isValid() )
2642 *lastDirectory = directory;
2645 void KFileWidgetPrivate::setNonExtSelection()
2648 QString filename = locationEditCurrentText();
2649 QString extension = KMimeType::extractKnownExtension( filename );
2651 if ( !extension.isEmpty() )
2652 locationEdit->lineEdit()->setSelection( 0, filename.length() - extension.length() - 1 );
2655 int lastDot = filename.lastIndexOf(
'.' );
2657 locationEdit->lineEdit()->setSelection( 0, lastDot );
2668 delete d->bottomCustomWidget;
2669 d->bottomCustomWidget = widget;
2674 d->bottomCustomWidget->setParent(
this );
2676 d->vbox->addWidget( d->bottomCustomWidget );
2684 setTabOrder(d->cancelButton, d->bottomCustomWidget);
2685 setTabOrder(d->bottomCustomWidget, d->urlNavigator);
2690 delete d->labeledCustomWidget;
2691 d->labeledCustomWidget = widget;
2694 label->setAlignment(Qt::AlignRight);
2695 d->lafBox->addWidget(label, 2, 0, Qt::AlignVCenter);
2696 d->lafBox->addWidget(widget, 2, 1, Qt::AlignVCenter);
2708 bool *enable =
static_cast<bool*
>(data);
2709 d->confirmOverwrite = *enable;
2713 bool *show =
static_cast<bool*
>(data);
2714 d->setInlinePreviewShown(*show);
2729 d->readConfig(group);
2732 QString KFileWidgetPrivate::locationEditCurrentText()
const
2734 return QDir::fromNativeSeparators(locationEdit->currentText());
2737 KUrl KFileWidgetPrivate::mostLocalUrl(
const KUrl &url)
2743 KIO::StatJob *statJob = KIO::stat(url, KIO::HideProgressInfo);
2751 if (!path.isEmpty()) {
2760 void KFileWidgetPrivate::setInlinePreviewShown(
bool show)
2762 ops->setInlinePreviewShown(show);
2766 #include "kfilewidget.moc"