• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdelibs API Reference
  • KDE Home
  • Contact Us
 

KIO

  • sources
  • kde-4.14
  • kdelibs
  • kio
  • kfile
kfiledialog.cpp
Go to the documentation of this file.
1 // -*- c++ -*-
2 /* This file is part of the KDE libraries
3  Copyright (C) 1997, 1998 Richard Moore <rich@kde.org>
4  1998 Stephan Kulow <coolo@kde.org>
5  1998 Daniel Grana <grana@ie.iwi.unibe.ch>
6  1999,2000,2001,2002,2003 Carsten Pfeiffer <pfeiffer@kde.org>
7  2003 Clarence Dang <dang@kde.org>
8  2008 JarosÅ‚aw Staniek <staniek@kde.org>
9  2009 David Jarvie <djarvie@kde.org>
10 
11  This library is free software; you can redistribute it and/or
12  modify it under the terms of the GNU Library General Public
13  License as published by the Free Software Foundation; either
14  version 2 of the License, or (at your option) any later version.
15 
16  This library is distributed in the hope that it will be useful,
17  but WITHOUT ANY WARRANTY; without even the implied warranty of
18  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19  Library General Public License for more details.
20 
21  You should have received a copy of the GNU Library General Public License
22  along with this library; see the file COPYING.LIB. If not, write to
23  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
24  Boston, MA 02110-1301, USA.
25 */
26 
27 #include "kfiledialog.h"
28 
29 #include <QtGui/QCheckBox>
30 #include <QtGui/QKeyEvent>
31 #include <QtGui/QFileDialog>
32 #include <QtGui/QApplication>
33 #include <QtGui/QDesktopWidget>
34 
35 #include <kimageio.h>
36 #include <klocale.h>
37 #include <kpushbutton.h>
38 #include <config-kfile.h>
39 #include <krecentdocument.h>
40 #include <kdebug.h>
41 #include <kwindowsystem.h>
42 #include "kabstractfilewidget.h"
43 #include "kabstractfilemodule.h"
44 #include "krecentdirs.h"
45 #include "kservice.h"
46 
48 #if defined(Q_WS_WIN) || defined(Q_WS_MAEMO_5)
49 const bool NATIVE_FILEDIALOGS_BY_DEFAULT = true;
50 #else
51 const bool NATIVE_FILEDIALOGS_BY_DEFAULT = false;
52 #endif
53 
54 static QStringList mime2KdeFilter( const QStringList &mimeTypes, QString *allExtensions = 0 )
55 {
56  const KUrl emptyUrl;
57  QStringList kdeFilter;
58  QStringList allExt;
59  foreach( const QString& mimeType, mimeTypes ) {
60  KMimeType::Ptr mime( KMimeType::mimeType(mimeType) );
61  if (mime) {
62  allExt += mime->patterns();
63  kdeFilter.append(mime->patterns().join(QLatin1String(" ")) +
64  QLatin1Char('|') +
65  mime->comment(emptyUrl));
66  }
67  }
68  if (allExtensions) {
69  allExt.sort();
70  *allExtensions = allExt.join(QLatin1String(" "));
71  }
72  return kdeFilter;
73 }
77 static QString qtFilter(const QStringList& _filters)
78 {
79  QString converted;
80  const QStringList filters = _filters;
81 
82  foreach (const QString& current, filters) {
83  QString new_f; //filter part
84  QString new_name; //filter name part
85  int p = current.indexOf('|');
86  if (p==-1) {
87  new_f = current;
88  new_name = current; // nothing better found
89  }
90  else {
91  new_f = current.left(p);
92  new_name = current.mid(p+1);
93  }
94  //Qt filters assume anything in () is the file extension list
95  new_name = new_name.replace('(', '[').replace(')',']').trimmed();
96 
97  //convert everything to lower case and remove dupes (doesn't matter on win32)
98  QStringList allfiltersUnique;
99  const QStringList origList( new_f.split(' ', QString::SkipEmptyParts) );
100  foreach (const QString& origFilter, origList) {
101  if (!allfiltersUnique.contains(origFilter, Qt::CaseInsensitive))
102  allfiltersUnique += origFilter.toLower();
103  }
104 
105  if (!converted.isEmpty())
106  converted += ";;";
107 
108  converted += (new_name + " (" + allfiltersUnique.join(" ") + QLatin1Char(')'));
109  }
110 
111  // Strip escape characters from escaped '/' characters.
112  converted.replace("\\/","/");
113 
114  return converted;
115 }
116 
120 static QString qtFilter(const QString& filter)
121 {
122  // Qt format: "some text (*.first *.second)" or "All files (*)" separated by ;;
123  // KDE format: "*.first *.second|Description" or "*|Description", separated by \n (Description is optional)
124  QStringList filters;
125  if (filter.isEmpty())
126  filters += i18n("*|All files");
127  else {
128  // check if it's a mimefilter
129  int pos = filter.indexOf('/');
130  if (pos > 0 && filter[pos - 1] != '\\')
131  filters = mime2KdeFilter(filter.split(QLatin1Char(' '), QString::SkipEmptyParts));
132  else
133  filters = filter.split('\n', QString::SkipEmptyParts);
134  }
135  return qtFilter(filters);
136 }
137 
138 static KAbstractFileModule* s_module = 0;
139 static KAbstractFileModule* loadFileModule( const QString& moduleName )
140 {
141  KService::Ptr fileModuleService = KService::serviceByDesktopName(moduleName);
142  if(fileModuleService)
143  return fileModuleService->createInstance<KAbstractFileModule>();
144  else
145  return 0;
146 }
147 
148 static const char s_defaultFileModuleName[] = "kfilemodule";
149 static KAbstractFileModule* fileModule()
150 {
151  if(!s_module) {
152  QString moduleName = KConfig("kdeglobals").group(ConfigGroup).readEntry("file module", s_defaultFileModuleName);
153  if(!(s_module = loadFileModule(moduleName))) {
154  kDebug() << "Failed to load configured file module" << moduleName;
155  if(moduleName != s_defaultFileModuleName) {
156  kDebug() << "Falling back to default file module.";
157  s_module = loadFileModule(s_defaultFileModuleName);
158  }
159  }
160  }
161  return s_module;
162 }
163 
164 class KFileDialogPrivate
165 {
166 public:
168  class Native {
169  public:
170  Native()
171  : mode(KFile::File),
172  operationMode(KAbstractFileWidget::Opening)
173  {
174  }
177  KUrl startDir() const
178  {
179  if (!s_startDir.isEmpty())
180  return s_startDir;
181  if (!selectedUrls.isEmpty())
182  return selectedUrls.first();
183  return KUrl();
184  }
187  static KUrl staticStartDir( const KUrl& defaultDir )
188  {
189  if ( s_startDir.isEmpty() )
190  return defaultDir;
191  return s_startDir;
192  }
193  static KUrl s_startDir;
194  static bool s_allowNative; // as fallback when we can't use native dialog
195  QString filter;
196  QString selectedFilter;
197  QStringList mimeTypes;
198  KUrl::List selectedUrls;
199  KFile::Modes mode;
200  KAbstractFileWidget::OperationMode operationMode;
201  };
202 
203  KFileDialogPrivate()
204  : native(0),
205  w(0),
206  cfgGroup(KGlobal::config(), ConfigGroup)
207  {
208  if (cfgGroup.readEntry("Native", NATIVE_FILEDIALOGS_BY_DEFAULT) &&
209  KFileDialogPrivate::Native::s_allowNative)
210  native = new Native;
211  }
212 
213  static bool isNative()
214  {
215  if(!KFileDialogPrivate::Native::s_allowNative)
216  return false;
217  KConfigGroup cfgGroup(KGlobal::config(), ConfigGroup);
218  return cfgGroup.readEntry("Native", NATIVE_FILEDIALOGS_BY_DEFAULT);
219  }
220 
221  static QString getOpenFileName(const KUrl& startDir, const QString& filter,
222  QWidget *parent, const QString& caption,
223  QString *selectedFilter);
224  static KUrl getOpenUrl(const KUrl& startDir, const QString& filter,
225  QWidget *parent, const QString& caption,
226  QString *selectedFilter);
227  static QStringList getOpenFileNames(const KUrl& startDir, const QString& filter,
228  QWidget *parent, const QString& caption,
229  QString *selectedFilter);
230  static KUrl::List getOpenUrls(const KUrl& startDir, const QString& filter,
231  QWidget *parent, const QString& caption,
232  QString *selectedFilter);
233  static QString getSaveFileName(const KUrl& dir, const QString& filter,
234  QWidget *parent, const QString& caption,
235  KFileDialog::Options options, QString *selectedFilter);
236  static KUrl getSaveUrl(const KUrl& dir, const QString& filter,
237  QWidget *parent, const QString& caption,
238  KFileDialog::Options options, QString *selectedFilter);
239 
240  ~KFileDialogPrivate()
241  {
242  delete native;
243  }
244 
245  Native* native;
246  KAbstractFileWidget* w;
247  KConfigGroup cfgGroup;
248 };
249 
250 KUrl KFileDialogPrivate::Native::s_startDir;
251 bool KFileDialogPrivate::Native::s_allowNative = true;
252 
253 KFileDialog::KFileDialog( const KUrl& startDir, const QString& filter,
254  QWidget *parent, QWidget* customWidget)
255 #ifdef Q_WS_WIN
256  : KDialog( parent , Qt::WindowMinMaxButtonsHint),
257 #else
258  : KDialog( parent ),
259 #endif
260  d( new KFileDialogPrivate )
261 
262 {
263  // It would be nice to have this behind d->native but it doesn't work
264  // because of derived classes like KEncodingDialog...
265  // Dlopen the file widget from libkfilemodule
266  QWidget* fileQWidget = fileModule()->createFileWidget(startDir, this);
267  d->w = ::qobject_cast<KAbstractFileWidget *>(fileQWidget);
268 
269  if (d->native) {
270  KFileDialogPrivate::Native::s_startDir = startDir;
271  // check if it's a mimefilter
272  int pos = filter.indexOf('/');
273  if (pos > 0 && filter[pos - 1] != '\\')
274  setMimeFilter(filter.split(QLatin1Char(' '), QString::SkipEmptyParts));
275  else
276  setFilter(filter);
277  return;
278  }
279 
280  setButtons( KDialog::None );
281  restoreDialogSize(d->cfgGroup); // call this before the fileQWidget is set as the main widget.
282  // otherwise the sizes for the components are not obeyed (ereslibre)
283 
284  d->w->setFilter(filter);
285  setMainWidget(fileQWidget);
286 
287  d->w->okButton()->show();
288  connect(d->w->okButton(), SIGNAL(clicked()), SLOT(slotOk()));
289  d->w->cancelButton()->show();
290  connect(d->w->cancelButton(), SIGNAL(clicked()), SLOT(slotCancel()));
291 
292  // Publish signals
293  // TODO: Move the relevant signal declarations from KFileWidget to the
294  // KAbstractFileWidget interface?
295  // Else, all of these connects (including "accepted") are not typesafe.
296  // Answer: you cannot define signals in a non-qobject base class (DF).
297  // I simply documentde them in kabstractfilewidget.h now.
298  kDebug (kfile_area) << "KFileDialog connecting signals";
299  connect(fileQWidget, SIGNAL(fileSelected(KUrl)),
300  SIGNAL(fileSelected(KUrl)));
301  connect(fileQWidget, SIGNAL(fileHighlighted(KUrl)),
302  SIGNAL(fileHighlighted(KUrl)));
303  connect(fileQWidget, SIGNAL(fileSelected(QString)),
304  SIGNAL(fileSelected(QString)));
305  connect(fileQWidget, SIGNAL(fileHighlighted(QString)),
306  SIGNAL(fileHighlighted(QString)));
307  connect(fileQWidget, SIGNAL(selectionChanged()),
308  SIGNAL(selectionChanged()));
309  connect(fileQWidget, SIGNAL(filterChanged(QString)),
310  SIGNAL(filterChanged(QString)));
311 
312  connect(fileQWidget, SIGNAL(accepted()), SLOT(accept()));
313  //connect(fileQWidget, SIGNAL(canceled()), SLOT(slotCancel()));
314 
315  if (customWidget)
316  d->w->setCustomWidget(QString(), customWidget);
317 }
318 
319 
320 KFileDialog::~KFileDialog()
321 {
322  delete d;
323 }
324 
325 void KFileDialog::setLocationLabel(const QString& text)
326 {
327  if (d->native)
328  return; // not available
329  d->w->setLocationLabel(text);
330 }
331 
332 void KFileDialog::setFilter(const QString& filter)
333 {
334  if (d->native) {
335  d->native->filter = filter;
336  return;
337  }
338  d->w->setFilter(filter);
339 }
340 
341 QString KFileDialog::currentFilter() const
342 {
343  if (d->native)
344  return QString(); // not available
345  return d->w->currentFilter();
346 }
347 
348 void KFileDialog::setMimeFilter( const QStringList& mimeTypes,
349  const QString& defaultType )
350 {
351  d->w->setMimeFilter(mimeTypes, defaultType);
352 
353  if (d->native) {
354  QString allExtensions;
355  QStringList filters = mime2KdeFilter(mimeTypes, &allExtensions);
356  if (defaultType.isEmpty() && (mimeTypes.count() > 1)) {
357  filters.prepend(allExtensions + QLatin1Char('|') + i18n("All Supported Files"));
358  }
359  d->native->filter = filters.join(QLatin1String("\n"));
360  }
361 }
362 
363 void KFileDialog::clearFilter()
364 {
365  if (d->native) {
366  d->native->filter.clear();
367  return;
368  }
369  d->w->clearFilter();
370 }
371 
372 QString KFileDialog::currentMimeFilter() const
373 {
374  if (d->native) {
375  // adapted from qt2KdeFilter
376  QString filter = d->native->selectedFilter.split(";;").replaceInStrings("/", "\\/")[0];
377  filter = filter.mid(filter.indexOf('(') + 1, filter.indexOf(')') - filter.indexOf('(') - 1);
378  QString mimetype = KMimeType::findByPath("test" + filter.mid(1).split(' ')[0])->name();
379  return mimetype;
380  }
381  return d->w->currentMimeFilter();
382 }
383 
384 KMimeType::Ptr KFileDialog::currentFilterMimeType()
385 {
386  return KMimeType::mimeType( currentMimeFilter() );
387 }
388 
389 void KFileDialog::setPreviewWidget(KPreviewWidgetBase *w)
390 {
391  if (d->native)
392  return;
393  d->w->setPreviewWidget(w);
394 }
395 
396 void KFileDialog::setInlinePreviewShown(bool show)
397 {
398  if (d->native) {
399  return;
400  }
401  d->w->setInlinePreviewShown(show);
402 }
403 
404 // This is only used for the initial size when no configuration has been saved
405 QSize KFileDialog::sizeHint() const
406 {
407  int fontSize = fontMetrics().height();
408  QSize goodSize(48 * fontSize, 30 * fontSize);
409  QSize screenSize = QApplication::desktop()->availableGeometry(this).size();
410  QSize minSize(screenSize / 2);
411  QSize maxSize(screenSize * qreal(0.9));
412  return (goodSize.expandedTo(minSize).boundedTo(maxSize));
413 }
414 
415 // This slot still exists mostly for compat purposes; for subclasses which reimplement slotOk
416 void KFileDialog::slotOk()
417 {
418  if (d->native)
419  return;
420  d->w->slotOk();
421 }
422 
423 // This slot still exists mostly for compat purposes; for subclasses which reimplement accept
424 void KFileDialog::accept()
425 {
426  if (d->native)
427  return;
428  setResult( QDialog::Accepted ); // keep old behavior; probably not needed though
429  d->w->accept();
430  KConfigGroup cfgGroup(KGlobal::config(), ConfigGroup);
431  KDialog::accept();
432  emit okClicked();
433 }
434 
435 // This slot still exists mostly for compat purposes; for subclasses which reimplement slotCancel
436 void KFileDialog::slotCancel()
437 {
438  if (d->native)
439  return;
440  d->w->slotCancel();
441  reject();
442 }
443 
444 void KFileDialog::setUrl(const KUrl& url, bool clearforward)
445 {
446  if (d->native) {
447  d->native->selectedUrls.clear();
448  d->native->selectedUrls.append(url);
449  return;
450  }
451  d->w->setUrl(url, clearforward);
452 }
453 
454 void KFileDialog::setSelection(const QString& name)
455 {
456  if (d->native) {
457  d->native->selectedUrls.clear();
458  d->native->selectedUrls.append( KUrl(name) );
459  return;
460  }
461  d->w->setSelection(name);
462 }
463 
464 QString KFileDialog::getOpenFileName(const KUrl& startDir,
465  const QString& filter,
466  QWidget *parent, const QString& caption)
467 {
468  return KFileDialogPrivate::getOpenFileName(startDir, filter, parent, caption, 0);
469 }
470 
471 QString KFileDialogPrivate::getOpenFileName(const KUrl& startDir,
472  const QString& filter,
473  QWidget *parent,
474  const QString& caption,
475  QString *selectedFilter)
476 {
477  if (KFileDialogPrivate::isNative() && (!startDir.isValid() || startDir.isLocalFile())) {
478  return QFileDialog::getOpenFileName(
479  parent,
480  caption.isEmpty() ? i18n("Open") : caption,
481  KFileDialogPrivate::Native::staticStartDir( startDir ).toLocalFile(),
482  qtFilter(filter),
483  selectedFilter );
484 // TODO use extra args? QString * selectedFilter = 0, Options options = 0
485  }
486  KFileDialog dlg(startDir, filter, parent);
487 
488  dlg.setOperationMode( KFileDialog::Opening );
489  dlg.setMode( KFile::File | KFile::LocalOnly | KFile::ExistingOnly );
490  dlg.setCaption(caption.isEmpty() ? i18n("Open") : caption);
491 
492  dlg.exec();
493  if(selectedFilter) *selectedFilter = dlg.currentMimeFilter();
494  return dlg.selectedFile();
495 }
496 
497 QString KFileDialog::getOpenFileNameWId(const KUrl& startDir,
498  const QString& filter,
499  WId parent_id, const QString& caption)
500 {
501  if (KFileDialogPrivate::isNative() && (!startDir.isValid() || startDir.isLocalFile()))
502  return KFileDialog::getOpenFileName(startDir, filter, 0, caption); // everything we can do...
503  QWidget* parent = QWidget::find( parent_id );
504  KFileDialogPrivate::Native::s_allowNative = false;
505  KFileDialog dlg(startDir, filter, parent);
506  if( parent == NULL && parent_id != 0 )
507  KWindowSystem::setMainWindow( &dlg, parent_id );
508 
509  dlg.setOperationMode( KFileDialog::Opening );
510  dlg.setMode( KFile::File | KFile::LocalOnly | KFile::ExistingOnly );
511  dlg.setCaption(caption.isEmpty() ? i18n("Open") : caption);
512 
513  dlg.exec();
514 
515  return dlg.selectedFile();
516 }
517 
518 QStringList KFileDialog::getOpenFileNames(const KUrl& startDir,
519  const QString& filter,
520  QWidget *parent,
521  const QString& caption)
522 {
523  return KFileDialogPrivate::getOpenFileNames(startDir, filter, parent, caption, 0);
524 }
525 
526 QStringList KFileDialogPrivate::getOpenFileNames(const KUrl& startDir,
527  const QString& filter,
528  QWidget *parent,
529  const QString& caption,
530  QString *selectedFilter)
531 {
532  if (KFileDialogPrivate::isNative() && (!startDir.isValid() || startDir.isLocalFile())) {
533  return QFileDialog::getOpenFileNames(
534  parent,
535  caption.isEmpty() ? i18n("Open") : caption,
536  KFileDialogPrivate::Native::staticStartDir( startDir ).toLocalFile(),
537  qtFilter( filter ), selectedFilter );
538 // TODO use extra args? QString * selectedFilter = 0, Options options = 0
539  }
540  KFileDialogPrivate::Native::s_allowNative = false;
541  KFileDialog dlg(startDir, filter, parent);
542 
543  dlg.setOperationMode( KFileDialog::Opening );
544  dlg.setMode(KFile::Files | KFile::LocalOnly | KFile::ExistingOnly);
545  dlg.setCaption(caption.isEmpty() ? i18n("Open") : caption);
546 
547  dlg.exec();
548  if(selectedFilter) *selectedFilter = dlg.currentMimeFilter();
549  return dlg.selectedFiles();
550 }
551 
552 KUrl KFileDialog::getOpenUrl(const KUrl& startDir, const QString& filter,
553  QWidget *parent, const QString& caption)
554 {
555  return KFileDialogPrivate::getOpenUrl(startDir, filter, parent, caption, 0);
556 }
557 KUrl KFileDialogPrivate::getOpenUrl(const KUrl& startDir, const QString& filter,
558  QWidget *parent, const QString& caption,
559  QString *selectedFilter)
560 {
561  if (KFileDialogPrivate::isNative() && (!startDir.isValid() || startDir.isLocalFile())) {
562  const QString fileName( KFileDialogPrivate::getOpenFileName(
563  startDir, filter, parent, caption, selectedFilter) );
564  return fileName.isEmpty() ? KUrl() : KUrl::fromPath(fileName);
565  }
566  KFileDialogPrivate::Native::s_allowNative = false;
567  KFileDialog dlg(startDir, filter, parent);
568 
569  dlg.setOperationMode( KFileDialog::Opening );
570  dlg.setMode( KFile::File | KFile::ExistingOnly );
571  dlg.setCaption(caption.isEmpty() ? i18n("Open") : caption);
572 
573  dlg.exec();
574  if(selectedFilter) *selectedFilter = dlg.currentMimeFilter();
575  return dlg.selectedUrl();
576 }
577 
578 KUrl::List KFileDialog::getOpenUrls(const KUrl& startDir,
579  const QString& filter,
580  QWidget *parent,
581  const QString& caption)
582 {
583  return KFileDialogPrivate::getOpenUrls(startDir, filter, parent, caption, 0);
584 }
585 
586 KUrl::List KFileDialogPrivate::getOpenUrls(const KUrl& startDir,
587  const QString& filter,
588  QWidget *parent,
589  const QString& caption,
590  QString *selectedFilter)
591 {
592  if (KFileDialogPrivate::isNative() && (!startDir.isValid() || startDir.isLocalFile())) {
593  const QStringList fileNames( KFileDialogPrivate::getOpenFileNames(
594  startDir, filter, parent, caption, selectedFilter) );
595  return KUrl::List(fileNames);
596  }
597  KFileDialogPrivate::Native::s_allowNative = false;
598 
599  KFileDialog dlg(startDir, filter, parent);
600 
601  dlg.setOperationMode( KFileDialog::Opening );
602  dlg.setMode( KFile::Files | KFile::ExistingOnly );
603  dlg.setCaption(caption.isEmpty() ? i18n("Open") : caption);
604 
605  dlg.exec();
606  if(selectedFilter) *selectedFilter = dlg.currentMimeFilter();
607  return dlg.selectedUrls();
608 }
609 
610 void KFileDialog::setConfirmOverwrite(bool enable)
611 {
612  if (operationMode() == KFileDialog::Saving) {
613  d->w->setConfirmOverwrite(enable);
614  }
615 }
616 
617 KUrl KFileDialog::getExistingDirectoryUrl(const KUrl& startDir,
618  QWidget *parent,
619  const QString& caption)
620 {
621  if (KFileDialogPrivate::isNative() && (!startDir.isValid() || startDir.isLocalFile())) {
622  QString result( QFileDialog::getExistingDirectory(parent, caption,
623  KFileDialogPrivate::Native::staticStartDir( startDir ).toLocalFile(),
624  QFileDialog::ShowDirsOnly) );
625  return result.isEmpty() ? KUrl() : KUrl::fromPath(result);
626  }
627  return fileModule()->selectDirectory(startDir, false, parent, caption);
628 }
629 
630 QString KFileDialog::getExistingDirectory(const KUrl& startDir,
631  QWidget *parent,
632  const QString& caption)
633 {
634  if (KFileDialogPrivate::isNative() && (!startDir.isValid() || startDir.isLocalFile())) {
635  return QFileDialog::getExistingDirectory(parent, caption,
636  KFileDialogPrivate::Native::staticStartDir( startDir ).toLocalFile(),
637  QFileDialog::ShowDirsOnly);
638  }
639  KUrl url = fileModule()->selectDirectory(startDir, true, parent, caption);
640  if ( url.isValid() )
641  return url.toLocalFile();
642  return QString();
643 }
644 
645 KUrl KFileDialog::getImageOpenUrl( const KUrl& startDir, QWidget *parent,
646  const QString& caption)
647 {
648  if (KFileDialogPrivate::isNative() && (!startDir.isValid() || startDir.isLocalFile())) { // everything we can do...
649  const QStringList mimetypes( KImageIO::mimeTypes( KImageIO::Reading ) );
650  return KFileDialog::getOpenUrl(startDir, mimetypes.join(" "), parent, caption);
651  }
652  const QStringList mimetypes = KImageIO::mimeTypes( KImageIO::Reading );
653  KFileDialogPrivate::Native::s_allowNative = false;
654  KFileDialog dlg(startDir, mimetypes.join(" "), parent);
655 
656  dlg.setOperationMode( KFileDialog::Opening );
657  dlg.setMode( KFile::File | KFile::ExistingOnly );
658  dlg.setCaption( caption.isEmpty() ? i18n("Open") : caption );
659  dlg.setInlinePreviewShown( true );
660 
661  dlg.exec();
662 
663  return dlg.selectedUrl();
664 }
665 
666 KUrl KFileDialog::selectedUrl() const
667 {
668  if (d->native)
669  return d->native->selectedUrls.isEmpty() ? KUrl() : d->native->selectedUrls.first();
670  return d->w->selectedUrl();
671 }
672 
673 KUrl::List KFileDialog::selectedUrls() const
674 {
675  if (d->native)
676  return d->native->selectedUrls;
677  return d->w->selectedUrls();
678 }
679 
680 QString KFileDialog::selectedFile() const
681 {
682  if (d->native)
683  return selectedUrl().toLocalFile();
684  return d->w->selectedFile();
685 }
686 
687 QStringList KFileDialog::selectedFiles() const
688 {
689  if (d->native)
690  return selectedUrls().toStringList();
691  return d->w->selectedFiles();
692 }
693 
694 KUrl KFileDialog::baseUrl() const
695 {
696  if (d->native)
697  return selectedUrl().isEmpty() ? KUrl() : KUrl::fromPath(selectedUrl().path());
698  return d->w->baseUrl();
699 }
700 
701 QString KFileDialog::getSaveFileName(const KUrl& dir, const QString& filter,
702  QWidget *parent,
703  const QString& caption)
704 {
705  //TODO KDE5: replace this method by the method below (with default parameter values in declaration)
706  // Set no confirm-overwrite mode for backwards compatibility
707  return KFileDialogPrivate::getSaveFileName(dir, filter, parent, caption, Options(0), 0);
708 }
709 
710 QString KFileDialog::getSaveFileName(const KUrl& dir, const QString& filter,
711  QWidget *parent,
712  const QString& caption, Options options)
713 {
714  return KFileDialogPrivate::getSaveFileName(dir, filter, parent, caption, options, 0);
715 }
716 
717 QString KFileDialogPrivate::getSaveFileName(const KUrl& dir, const QString& filter,
718  QWidget *parent, const QString& caption,
719  KFileDialog::Options options, QString *selectedFilter)
720 {
721  if (KFileDialogPrivate::isNative()) {
722  bool defaultDir = dir.isEmpty();
723  bool specialDir = !defaultDir && dir.protocol() == "kfiledialog";
724  KUrl startDir;
725  QString recentDirClass;
726  if (specialDir) {
727  startDir = KFileDialog::getStartUrl(dir, recentDirClass);
728  }
729  else if ( !specialDir && !defaultDir ) {
730  if (!dir.isLocalFile())
731  kWarning() << "non-local start dir " << dir;
732  startDir = dir;
733  }
734 
735  QFileDialog::Options opts = (options & KFileDialog::ConfirmOverwrite) ? QFileDialog::Options(0) : QFileDialog::DontConfirmOverwrite;
736  const QString result = QFileDialog::getSaveFileName(
737  parent,
738  caption.isEmpty() ? i18n("Save As") : caption,
739  KFileDialogPrivate::Native::staticStartDir( startDir ).toLocalFile(),
740  qtFilter(filter),
741 // TODO use extra args? QString * selectedFilter = 0, Options opts = 0
742  selectedFilter, opts );
743  if (!result.isEmpty()) {
744  if (!recentDirClass.isEmpty())
745  KRecentDirs::add(recentDirClass, KUrl::fromPath(result).url());
746  KRecentDocument::add(result);
747  }
748  return result;
749  }
750 
751  KFileDialog dlg(dir, filter, parent);
752 
753  dlg.setOperationMode( KFileDialog::Saving );
754  dlg.setMode( KFile::File | KFile::LocalOnly );
755  dlg.setConfirmOverwrite(options & KFileDialog::ConfirmOverwrite);
756  dlg.setInlinePreviewShown(options & KFileDialog::ShowInlinePreview);
757  dlg.setCaption(caption.isEmpty() ? i18n("Save As") : caption);
758 
759  dlg.exec();
760 
761  QString filename = dlg.selectedFile();
762  if (!filename.isEmpty())
763  KRecentDocument::add(filename);
764 
765  return filename;
766 }
767 
768 QString KFileDialog::getSaveFileNameWId(const KUrl& dir, const QString& filter,
769  WId parent_id,
770  const QString& caption)
771 {
772  //TODO KDE5: replace this method by the method below (with default parameter values in declaration)
773  // Set no confirm-overwrite mode for backwards compatibility
774  return getSaveFileNameWId(dir, filter, parent_id, caption, Options(0));
775 }
776 
777 QString KFileDialog::getSaveFileNameWId(const KUrl& dir, const QString& filter,
778  WId parent_id,
779  const QString& caption, Options options)
780 {
781  if (KFileDialogPrivate::isNative()) {
782  return KFileDialog::getSaveFileName(dir, filter, 0, caption, options); // everything we can do...
783  }
784 
785  QWidget* parent = QWidget::find( parent_id );
786  KFileDialog dlg(dir, filter, parent);
787  if( parent == NULL && parent_id != 0 )
788  KWindowSystem::setMainWindow( &dlg, parent_id);
789 
790  dlg.setOperationMode( KFileDialog::Saving );
791  dlg.setMode( KFile::File | KFile::LocalOnly );
792  dlg.setConfirmOverwrite(options & ConfirmOverwrite);
793  dlg.setInlinePreviewShown(options & ShowInlinePreview);
794  dlg.setCaption(caption.isEmpty() ? i18n("Save As") : caption);
795 
796  dlg.exec();
797 
798  QString filename = dlg.selectedFile();
799  if (!filename.isEmpty())
800  KRecentDocument::add(filename);
801 
802  return filename;
803 }
804 
805 KUrl KFileDialog::getSaveUrl(const KUrl& dir, const QString& filter,
806  QWidget *parent, const QString& caption)
807 {
808  //TODO KDE5: replace this method by the method below (with default parameter values in declaration)
809  // Set no confirm-overwrite mode for backwards compatibility
810  return KFileDialogPrivate::getSaveUrl(dir, filter, parent, caption, Options(0), 0);
811 }
812 
813 KUrl KFileDialog::getSaveUrl(const KUrl& dir, const QString& filter,
814  QWidget *parent, const QString& caption, Options options)
815 {
816  return KFileDialogPrivate::getSaveUrl(dir, filter, parent, caption, options, 0);
817 }
818 KUrl KFileDialogPrivate::getSaveUrl(const KUrl& dir, const QString& filter,
819  QWidget *parent, const QString& caption,
820  KFileDialog::Options options, QString *selectedFilter)
821 {
822  if (KFileDialogPrivate::isNative() && (!dir.isValid() || dir.isLocalFile())) {
823  const QString fileName( KFileDialogPrivate::getSaveFileName(
824  dir, filter, parent, caption, options, selectedFilter) );
825  return fileName.isEmpty() ? KUrl() : KUrl::fromPath(fileName);
826  }
827 
828  KFileDialogPrivate::Native::s_allowNative = false;
829 
830  KFileDialog dlg(dir, filter, parent);
831 
832  dlg.setOperationMode( KFileDialog::Saving );
833  dlg.setMode( KFile::File );
834  dlg.setConfirmOverwrite(options & KFileDialog::ConfirmOverwrite);
835  dlg.setInlinePreviewShown(options & KFileDialog::ShowInlinePreview);
836  dlg.setCaption(caption.isEmpty() ? i18n("Save As") : caption);
837 
838  dlg.exec();
839  if(selectedFilter) *selectedFilter = dlg.currentMimeFilter();
840  KUrl url = dlg.selectedUrl();
841  if (url.isValid())
842  KRecentDocument::add( url );
843 
844  return url;
845 }
846 
847 void KFileDialog::setMode( KFile::Modes m )
848 {
849  if (d->native)
850  d->native->mode = m;
851  else
852  d->w->setMode(m);
853 }
854 
855 KFile::Modes KFileDialog::mode() const
856 {
857  if (d->native)
858  return d->native->mode;
859  return d->w->mode();
860 }
861 
862 KPushButton * KFileDialog::okButton() const
863 {
864  return d->w->okButton();
865 }
866 
867 KPushButton * KFileDialog::cancelButton() const
868 {
869  return d->w->cancelButton();
870 }
871 
872 KUrlComboBox* KFileDialog::locationEdit() const
873 {
874  return d->w->locationEdit();
875 }
876 
877 KFileFilterCombo* KFileDialog::filterWidget() const
878 {
879  return d->w->filterWidget();
880 }
881 
882 KActionCollection * KFileDialog::actionCollection() const
883 {
884  return d->w->actionCollection();
885 }
886 
887 void KFileDialog::setKeepLocation( bool keep )
888 {
889  if (d->native)
890  return;
891  d->w->setKeepLocation(keep);
892 }
893 
894 bool KFileDialog::keepsLocation() const
895 {
896  if (d->native)
897  return false;
898  return d->w->keepsLocation();
899 }
900 
901 void KFileDialog::setOperationMode( OperationMode mode )
902 {
903  if (d->native)
904  d->native->operationMode = static_cast<KAbstractFileWidget::OperationMode>(mode);
905  else
906  d->w->setOperationMode(static_cast<KAbstractFileWidget::OperationMode>(mode));
907 }
908 
909 KFileDialog::OperationMode KFileDialog::operationMode() const
910 {
911  if (d->native)
912  return static_cast<KFileDialog::OperationMode>(d->native->operationMode);
913  return static_cast<KFileDialog::OperationMode>(d->w->operationMode());
914 }
915 
916 void KFileDialog::keyPressEvent( QKeyEvent *e )
917 {
918  if (d->native)
919  return;
920 
921  if ( e->key() == Qt::Key_Escape )
922  {
923  e->accept();
924  d->w->cancelButton()->animateClick();
925  }
926  else
927  KDialog::keyPressEvent( e );
928 }
929 
930 void KFileDialog::hideEvent( QHideEvent *e )
931 {
932  if (d->native)
933  return;
934 
935  saveDialogSize(d->cfgGroup, KConfigBase::Persistent);
936 
937  KDialog::hideEvent( e );
938 }
939 
940 // static
941 KUrl KFileDialog::getStartUrl( const KUrl& startDir,
942  QString& recentDirClass )
943 {
944  return fileModule()->getStartUrl(startDir, recentDirClass);
945 }
946 
947 void KFileDialog::setStartDir( const KUrl& directory )
948 {
949  if (KFileDialogPrivate::isNative())
950  KFileDialogPrivate::Native::s_startDir = directory;
951  fileModule()->setStartDir(directory);
952 }
953 
954 KToolBar * KFileDialog::toolBar() const
955 {
956  return d->w->toolBar();
957 }
958 
959 KAbstractFileWidget* KFileDialog::fileWidget()
960 {
961  return d->w;
962 }
963 
964 #ifdef Q_WS_WIN
965 int KFileDialog::exec()
966 {
967  if (!d->native || !KFileDialogPrivate::Native::s_allowNative) {
968  KFileDialogPrivate::Native::s_allowNative = true;
969  return KDialog::exec();
970  }
971 
972 // not clear here to let KFileDialogPrivate::Native::startDir() return a useful value
973 // d->native->selectedUrls.clear();
974  int res = QDialog::Rejected;
975  switch (d->native->operationMode) {
976  case KAbstractFileWidget::Opening:
977  case KAbstractFileWidget::Other:
978  if (d->native->mode & KFile::File) {
979  KUrl url( KFileDialogPrivate::getOpenUrl(
980  d->native->startDir(), d->native->filter, parentWidget(), windowTitle(), &d->native->selectedFilter ) );
981  if (url.isEmpty() || !url.isValid()) {
982  res = QDialog::Rejected;
983  break;
984  }
985  d->native->selectedUrls.clear();
986  d->native->selectedUrls.append(url);
987  res = QDialog::Accepted;
988  break;
989  }
990  else if (d->native->mode & KFile::Files) {
991  KUrl::List urls( KFileDialogPrivate::getOpenUrls(
992  d->native->startDir(), d->native->filter, parentWidget(), windowTitle(), &d->native->selectedFilter ) );
993  if (urls.isEmpty()) {
994  res = QDialog::Rejected;
995  break;
996  }
997  d->native->selectedUrls = urls;
998  res = QDialog::Accepted;
999  break;
1000  }
1001  else if (d->native->mode & KFile::Directory) {
1002  KUrl url( KFileDialog::getExistingDirectoryUrl(
1003  d->native->startDir(), parentWidget(), windowTitle()) );
1004  if (url.isEmpty() || !url.isValid()) {
1005  res = QDialog::Rejected;
1006  break;
1007  }
1008  d->native->selectedUrls.clear();
1009  d->native->selectedUrls.append(url);
1010  res = QDialog::Accepted;
1011  break;
1012  }
1013  break;
1014  case KAbstractFileWidget::Saving:
1015  if (d->native->mode & KFile::File) {
1016  KUrl url( KFileDialogPrivate::getSaveUrl(
1017  d->native->startDir(), d->native->filter, parentWidget(), windowTitle(), Options(0), &d->native->selectedFilter ) );
1018  if (url.isEmpty() || !url.isValid()) {
1019  res = QDialog::Rejected;
1020  break;
1021  }
1022  d->native->selectedUrls.clear();
1023  d->native->selectedUrls.append(url);
1024  res = QDialog::Accepted;
1025  break;
1026  }
1027  else if (d->native->mode & KFile::Directory) {
1028  KUrl url( KFileDialog::getExistingDirectoryUrl(
1029  d->native->startDir(), parentWidget(), windowTitle()) );
1030  if (url.isEmpty() || !url.isValid()) {
1031  res = QDialog::Rejected;
1032  break;
1033  }
1034  d->native->selectedUrls.clear();
1035  d->native->selectedUrls.append(url);
1036  res = QDialog::Accepted;
1037  break;
1038  }
1039  break;
1040  default:;
1041  }
1042 
1043  setResult(res);
1044  emit finished();
1045 
1046  if (res == QDialog::Accepted) {
1047  emit accepted();
1048  } else {
1049  emit rejected();
1050  }
1051 
1052  return res;
1053 }
1054 #endif // Q_WS_WIN
1055 
1056 #ifdef Q_WS_WIN
1057 #define KF_EXTERN extern __declspec(dllimport)
1058 #else
1059 #define KF_EXTERN extern
1060 #endif
1061 
1062 typedef QString (*_qt_filedialog_existing_directory_hook)(QWidget *parent, const QString &caption,
1063  const QString &dir,
1064  QFileDialog::Options options);
1065 KF_EXTERN _qt_filedialog_existing_directory_hook qt_filedialog_existing_directory_hook;
1066 
1067 typedef QString (*_qt_filedialog_open_filename_hook)(QWidget * parent, const QString &caption,
1068  const QString &dir, const QString &filter,
1069  QString *selectedFilter,
1070  QFileDialog::Options options);
1071 KF_EXTERN _qt_filedialog_open_filename_hook qt_filedialog_open_filename_hook;
1072 
1073 typedef QStringList (*_qt_filedialog_open_filenames_hook)(QWidget * parent, const QString &caption,
1074  const QString &dir, const QString &filter,
1075  QString *selectedFilter,
1076  QFileDialog::Options options);
1077 KF_EXTERN _qt_filedialog_open_filenames_hook qt_filedialog_open_filenames_hook;
1078 
1079 typedef QString (*_qt_filedialog_save_filename_hook)(QWidget * parent, const QString &caption,
1080  const QString &dir, const QString &filter,
1081  QString *selectedFilter,
1082  QFileDialog::Options options);
1083 KF_EXTERN _qt_filedialog_save_filename_hook qt_filedialog_save_filename_hook;
1084 
1085 /*
1086  * This class is used to override Qt's QFileDialog calls with KFileDialog ones.
1087  * This is necessary because QPrintDialog calls QFileDialog::getSaveFileName() for
1088  * the print to file function.
1089  */
1090 class KFileDialogQtOverride
1091 {
1092 public:
1093  KFileDialogQtOverride()
1094  {
1095  if(!qt_filedialog_existing_directory_hook)
1096  qt_filedialog_existing_directory_hook=&getExistingDirectory;
1097  if(!qt_filedialog_open_filename_hook)
1098  qt_filedialog_open_filename_hook=&getOpenFileName;
1099  if(!qt_filedialog_open_filenames_hook)
1100  qt_filedialog_open_filenames_hook=&getOpenFileNames;
1101  if(!qt_filedialog_save_filename_hook)
1102  qt_filedialog_save_filename_hook=&getSaveFileName;
1103  }
1104 
1105  ~KFileDialogQtOverride() {
1106  if(qt_filedialog_existing_directory_hook == &getExistingDirectory)
1107  qt_filedialog_existing_directory_hook = 0;
1108  if(qt_filedialog_open_filename_hook == &getOpenFileName)
1109  qt_filedialog_open_filename_hook = 0;
1110  if(qt_filedialog_open_filenames_hook == &getOpenFileNames)
1111  qt_filedialog_open_filenames_hook=0;
1112  if(qt_filedialog_save_filename_hook == &getSaveFileName)
1113  qt_filedialog_save_filename_hook=0;
1114  }
1115 
1116  /*
1117  * Map a Qt filter string into a KDE one.
1118  */
1119  static QString qt2KdeFilter(const QString &f)
1120  {
1121  QString filter;
1122  QTextStream str(&filter, QIODevice::WriteOnly);
1123  QStringList list(f.split(";;").replaceInStrings("/", "\\/"));
1124  QStringList::const_iterator it(list.begin()),
1125  end(list.end());
1126  bool first=true;
1127 
1128  for(; it!=end; ++it)
1129  {
1130  int ob=(*it).lastIndexOf('('),
1131  cb=(*it).lastIndexOf(')');
1132 
1133  if(-1!=cb && ob<cb)
1134  {
1135  if(first)
1136  first=false;
1137  else
1138  str << '\n';
1139  str << (*it).mid(ob+1, (cb-ob)-1) << '|' << (*it).mid(0, ob);
1140  }
1141  }
1142 
1143  return filter;
1144  }
1145 
1146  /*
1147  * Map a KDE filter string into a Qt one.
1148  */
1149  static void kde2QtFilter(const QString &orig, const QString &kde, QString *sel)
1150  {
1151  if(sel)
1152  {
1153  QStringList list(orig.split(";;"));
1154  QStringList::const_iterator it(list.begin()),
1155  end(list.end());
1156  int pos;
1157 
1158  for(; it!=end; ++it)
1159  if(-1!=(pos=(*it).indexOf(kde)) && pos>0 &&
1160  ('('==(*it)[pos-1] || ' '==(*it)[pos-1]) &&
1161  (*it).length()>=kde.length()+pos &&
1162  (')'==(*it)[pos+kde.length()] || ' '==(*it)[pos+kde.length()]))
1163  {
1164  *sel=*it;
1165  return;
1166  }
1167  }
1168  }
1169 
1170  static QString getExistingDirectory(QWidget *parent, const QString &caption, const QString &dir,
1171  QFileDialog::Options options)
1172  {
1173  if (KFileDialogPrivate::isNative()) {
1174  if(qt_filedialog_existing_directory_hook)
1175  qt_filedialog_existing_directory_hook=0; // do not override
1176  return QFileDialog::getExistingDirectory(parent, caption, dir, options);
1177  }
1178 
1179  fileModule(); // make sure i18n is initialized properly, needed for pure Qt applications
1180  KUrl url(KFileDialog::getExistingDirectory(KUrl(dir), parent, caption));
1181 
1182  if(url.isLocalFile())
1183  return url.pathOrUrl();
1184  else
1185  return QString();
1186  }
1187 
1188  static QString getOpenFileName(QWidget *parent, const QString &caption, const QString &dir,
1189  const QString &filter, QString *selectedFilter,
1190  QFileDialog::Options options)
1191  {
1192  if (KFileDialogPrivate::isNative()) {
1193  if(qt_filedialog_open_filename_hook)
1194  qt_filedialog_open_filename_hook=0; // do not override
1195  return QFileDialog::getOpenFileName(parent, caption, dir, filter, selectedFilter, options);
1196  }
1197 
1198  fileModule(); // make sure i18n is initialized properly, needed for pure Qt applications
1199  KFileDialog dlg(KUrl(dir), qt2KdeFilter(filter), parent);
1200 
1201  dlg.setOperationMode(KFileDialog::Opening);
1202  dlg.setMode(KFile::File|KFile::LocalOnly);
1203  dlg.setCaption(caption);
1204  dlg.exec();
1205 
1206  QString rv(dlg.selectedFile());
1207 
1208  if(!rv.isEmpty())
1209  kde2QtFilter(filter, dlg.currentFilter(), selectedFilter);
1210 
1211  return rv;
1212  }
1213 
1214  static QStringList getOpenFileNames(QWidget *parent, const QString &caption, const QString &dir,
1215  const QString &filter, QString *selectedFilter,
1216  QFileDialog::Options options)
1217  {
1218  if (KFileDialogPrivate::isNative()) {
1219  if(qt_filedialog_open_filenames_hook)
1220  qt_filedialog_open_filenames_hook=0; // do not override
1221  return QFileDialog::getOpenFileNames(parent, caption, dir, filter, selectedFilter, options);
1222  }
1223 
1224  fileModule(); // make sure i18n is initialized properly, needed for pure Qt applications
1225  KFileDialog dlg(KUrl(dir), qt2KdeFilter(filter), parent);
1226 
1227  dlg.setOperationMode(KFileDialog::Opening);
1228  dlg.setMode(KFile::Files|KFile::LocalOnly);
1229  dlg.setCaption(caption);
1230  dlg.exec();
1231 
1232  QStringList rv(dlg.selectedFiles());
1233 
1234  if(rv.count())
1235  kde2QtFilter(filter, dlg.currentFilter(), selectedFilter);
1236 
1237  return rv;
1238  }
1239 
1240  static QString getSaveFileName(QWidget *parent, const QString &caption, const QString &dir,
1241  const QString &filter, QString *selectedFilter,
1242  QFileDialog::Options options)
1243  {
1244  if (KFileDialogPrivate::isNative()) {
1245  if(qt_filedialog_save_filename_hook)
1246  qt_filedialog_save_filename_hook=0; // do not override
1247  return QFileDialog::getSaveFileName(parent, caption, dir, filter, selectedFilter, options);
1248  }
1249 
1250  fileModule(); // make sure i18n is initialized properly, needed for pure Qt applications
1251  KFileDialog dlg(KUrl(dir), qt2KdeFilter(filter), parent);
1252 
1253  dlg.setOperationMode(KFileDialog::Saving);
1254  dlg.setMode(KFile::File|KFile::LocalOnly);
1255  dlg.setCaption(caption);
1256  dlg.setConfirmOverwrite(!(options & QFileDialog::DontConfirmOverwrite));
1257  dlg.exec();
1258 
1259  QString rv(dlg.selectedFile());
1260 
1261  if(!rv.isEmpty())
1262  kde2QtFilter(filter, dlg.currentFilter(), selectedFilter);
1263 
1264  return rv;
1265  }
1266 
1267 };
1268 
1269 static KFileDialogQtOverride qtOverride;
1270 
1271 #include "kfiledialog.moc"
QHideEvent
KAbstractFileWidget::Saving
Definition: kabstractfilewidget.h:73
fileModule
static KAbstractFileModule * fileModule()
Definition: kfiledialog.cpp:149
i18n
QString i18n(const char *text)
QSize::boundedTo
QSize boundedTo(const QSize &otherSize) const
KSharedPtr
Definition: kprotocolmanager.h:31
KPushButton
QString::indexOf
int indexOf(QChar ch, int from, Qt::CaseSensitivity cs) const
KActionCollection
QWidget
KAbstractFileWidget::Other
Definition: kabstractfilewidget.h:73
QRect::size
QSize size() const
QFileDialog::getExistingDirectory
QString getExistingDirectory(QWidget *parent, const QString &caption, const QString &dir, QFlags< QFileDialog::Option > options)
QDialog::reject
virtual void reject()
KAbstractFileModule::createFileWidget
virtual QWidget * createFileWidget(const KUrl &startDir, QWidget *parent)=0
the returned widget implements the KAbstractFileWidget interface
kdebug.h
kabstractfilemodule.h
qt_filedialog_open_filename_hook
KF_EXTERN _qt_filedialog_open_filename_hook qt_filedialog_open_filename_hook
Definition: kfiledialog.cpp:1071
KFileDialog::setFilter
void setFilter(const QString &filter)
Sets the filter to be used to filter.
Definition: kfiledialog.cpp:332
KFileDialog::slotOk
virtual void slotOk()
Definition: kfiledialog.cpp:416
KService::serviceByDesktopName
static Ptr serviceByDesktopName(const QString &_name)
KFileDialog::baseUrl
KUrl baseUrl() const
Definition: kfiledialog.cpp:694
KFileDialog::accept
virtual void accept()
Definition: kfiledialog.cpp:424
KFile::Directory
Definition: kfile.h:46
kfiledialog.h
QString::split
QStringList split(const QString &sep, SplitBehavior behavior, Qt::CaseSensitivity cs) const
KIO::mimetype
MimetypeJob * mimetype(const KUrl &url, JobFlags flags=DefaultFlags)
Find mimetype for one file or directory.
Definition: job.cpp:1856
QDialog::rejected
void rejected()
KFileDialog::getOpenFileNames
static QStringList getOpenFileNames(const KUrl &startDir=KUrl(), const QString &filter=QString(), QWidget *parent=0, const QString &caption=QString())
Creates a modal file dialog and returns the selected filenames or an empty list if none was chosen...
Definition: kfiledialog.cpp:518
KFile
KFile is a class which provides a namespace for some enumerated values associated with the kfile libr...
Definition: kfile.h:31
KAbstractFileWidget::Opening
Definition: kabstractfilewidget.h:73
KFileDialog::~KFileDialog
~KFileDialog()
Destructs the file dialog.
Definition: kfiledialog.cpp:320
QStringList::contains
bool contains(const QString &str, Qt::CaseSensitivity cs) const
KFileDialog::slotCancel
virtual void slotCancel()
Definition: kfiledialog.cpp:436
KFileDialog::ShowInlinePreview
Always show an inline preview.
Definition: kfiledialog.h:93
s_module
static KAbstractFileModule * s_module
Definition: kfiledialog.cpp:138
KRecentDirs::add
void add(const QString &fileClass, const QString &directory)
Associates directory with fileClass.
Definition: krecentdirs.cpp:74
KFile::Files
Definition: kfile.h:47
QDialog::accepted
void accepted()
f
static quint32 f(DES_KEY *key, quint32 r, char *subkey)
Definition: des.cpp:378
QDialog::exec
int exec()
KUrl::fromPath
static KUrl fromPath(const QString &text)
KConfig::group
KConfigGroup group(const QByteArray &group)
KF_EXTERN
#define KF_EXTERN
Definition: kfiledialog.cpp:1057
qtOverride
static KFileDialogQtOverride qtOverride
Definition: kfiledialog.cpp:1269
KFileDialog::getExistingDirectoryUrl
static KUrl getExistingDirectoryUrl(const KUrl &startDir=KUrl(), QWidget *parent=0, const QString &caption=QString())
Creates a modal directory-selection dialog and returns the selected directory or an empty string if n...
Definition: kfiledialog.cpp:617
KFileDialog::selectedFile
QString selectedFile() const
Returns the full path of the selected file in the local filesystem.
Definition: kfiledialog.cpp:680
KUrl::toLocalFile
QString toLocalFile(AdjustPathOption trailing=LeaveTrailingSlash) const
KFileDialog::setStartDir
static void setStartDir(const KUrl &directory)
Definition: kfiledialog.cpp:947
KDialog
QStringList::join
QString join(const QString &separator) const
KRecentDocument::add
static void add(const KUrl &url)
Add a new item to the Recent Document menu.
Definition: krecentdocument.cpp:88
KFileDialog::clearFilter
void clearFilter()
Clears any mime- or namefilter.
Definition: kfiledialog.cpp:363
KFile::File
Definition: kfile.h:45
kDebug
static QDebug kDebug(bool cond, int area=KDE_DEFAULT_DEBUG_AREA)
klocale.h
QUrl::isEmpty
bool isEmpty() const
krecentdirs.h
KFileDialog::currentFilter
QString currentFilter() const
Returns the current filter as entered by the user or one of the predefined set via setFilter()...
Definition: kfiledialog.cpp:341
QList::const_iterator
KUrl
QDialog::setResult
void setResult(int i)
KUrlComboBox
This combobox shows a number of recent URLs/directories, as well as some default directories.
Definition: kurlcombobox.h:47
QTextStream
config-kfile.h
config
KSharedConfigPtr config()
KFileDialog
Provides a user (and developer) friendly way to select files and directories.
Definition: kfiledialog.h:68
_qt_filedialog_open_filename_hook
QString(* _qt_filedialog_open_filename_hook)(QWidget *parent, const QString &caption, const QString &dir, const QString &filter, QString *selectedFilter, QFileDialog::Options options)
Definition: kfiledialog.cpp:1067
QDialog::finished
void finished(int result)
KFileDialog::okButton
KPushButton * okButton() const
Definition: kfiledialog.cpp:862
KAbstractFileModule::selectDirectory
virtual KUrl selectDirectory(const KUrl &startDir, bool localOnly, QWidget *parent, const QString &caption)=0
Creates a modal file dialog and returns the selected directory or an empty string if none was chosen...
QObject::name
const char * name() const
KAbstractFileWidget
Base class for KFileWidget.
Definition: kabstractfilewidget.h:57
qt_filedialog_save_filename_hook
KF_EXTERN _qt_filedialog_save_filename_hook qt_filedialog_save_filename_hook
Definition: kfiledialog.cpp:1083
QList::count
int count(const T &value) const
QList::append
void append(const T &value)
KFileDialog::actionCollection
KActionCollection * actionCollection() const
Definition: kfiledialog.cpp:882
KFileDialog::filterWidget
KFileFilterCombo * filterWidget() const
Definition: kfiledialog.cpp:877
NATIVE_FILEDIALOGS_BY_DEFAULT
const bool NATIVE_FILEDIALOGS_BY_DEFAULT
File dialogs are native by default on Windows.
Definition: kfiledialog.cpp:49
KFileDialog::locationEdit
KUrlComboBox * locationEdit() const
Definition: kfiledialog.cpp:872
KFileDialog::setLocationLabel
void setLocationLabel(const QString &text)
Sets the text to be displayed in front of the selection.
Definition: kfiledialog.cpp:325
qtFilter
static QString qtFilter(const QStringList &_filters)
Definition: kfiledialog.cpp:77
KFileDialog::keepsLocation
bool keepsLocation() const
Definition: kfiledialog.cpp:894
KAbstractFileModule::setStartDir
virtual void setStartDir(const KUrl &directory)=0
QWidget::hideEvent
virtual void hideEvent(QHideEvent *event)
KFileDialog::setKeepLocation
void setKeepLocation(bool keep)
Sets whether the filename/url should be kept when changing directories.
Definition: kfiledialog.cpp:887
KUrl::protocol
QString protocol() const
KFileDialog::setUrl
void setUrl(const KUrl &url, bool clearforward=true)
Sets the directory to view.
Definition: kfiledialog.cpp:444
QList::isEmpty
bool isEmpty() const
KFileDialog::getOpenFileName
static QString getOpenFileName(const KUrl &startDir=KUrl(), const QString &filter=QString(), QWidget *parent=0, const QString &caption=QString())
Creates a modal file dialog and return the selected filename or an empty string if none was chosen...
Definition: kfiledialog.cpp:464
QString::isEmpty
bool isEmpty() const
QString::trimmed
QString trimmed() const
kimageio.h
KUrl::pathOrUrl
QString pathOrUrl() const
KFileDialog::setMode
void setMode(KFile::Modes m)
Sets the mode of the dialog.
Definition: kfiledialog.cpp:847
ConfigGroup
#define ConfigGroup
Definition: config-kfile.h:35
_qt_filedialog_existing_directory_hook
QString(* _qt_filedialog_existing_directory_hook)(QWidget *parent, const QString &caption, const QString &dir, QFileDialog::Options options)
Definition: kfiledialog.cpp:1062
_qt_filedialog_open_filenames_hook
QStringList(* _qt_filedialog_open_filenames_hook)(QWidget *parent, const QString &caption, const QString &dir, const QString &filter, QString *selectedFilter, QFileDialog::Options options)
Definition: kfiledialog.cpp:1073
QDialog::result
int result() const
QStringList::replaceInStrings
QStringList & replaceInStrings(const QString &before, const QString &after, Qt::CaseSensitivity cs)
QString
KFileDialog::setOperationMode
void setOperationMode(KFileDialog::OperationMode)
Sets the operational mode of the filedialog to Saving, Opening or Other.
Definition: kfiledialog.cpp:901
KFileDialog::toolBar
KToolBar * toolBar() const
Returns a pointer to the toolbar.
Definition: kfiledialog.cpp:954
KFileDialog::exec
int exec()
Definition: kfiledialog.cpp:965
QDialog::accept
virtual void accept()
QStringList
_qt_filedialog_save_filename_hook
QString(* _qt_filedialog_save_filename_hook)(QWidget *parent, const QString &caption, const QString &dir, const QString &filter, QString *selectedFilter, QFileDialog::Options options)
Definition: kfiledialog.cpp:1079
KImageIO::mimeTypes
QStringList mimeTypes(Mode mode=Writing)
Returns a list of MIME types for all KImageIO supported formats.
Definition: kimageio.cpp:64
kservice.h
KImageIO::Reading
Definition: kimageio.h:53
KFileDialog::currentMimeFilter
QString currentMimeFilter() const
The mimetype for the desired output format.
Definition: kfiledialog.cpp:372
KFileDialog::setInlinePreviewShown
void setInlinePreviewShown(bool show)
Forces the inline previews to be shown or hidden, depending on show.
Definition: kfiledialog.cpp:396
KFileDialog::Opening
Definition: kfiledialog.h:85
KFileDialog::getOpenFileNameWId
static QString getOpenFileNameWId(const KUrl &startDir, const QString &filter, WId parent_id, const QString &caption)
Use this version only if you have no QWidget available as parent widget.
Definition: kfiledialog.cpp:497
QList::end
iterator end()
QString::toLower
QString toLower() const
QKeyEvent::key
int key() const
QEvent::accept
void accept()
QSize
KFileDialog::getSaveFileName
static QString getSaveFileName(const KUrl &startDir=KUrl(), const QString &filter=QString(), QWidget *parent=0, const QString &caption=QString())
Creates a modal file dialog and returns the selected filename or an empty string if none was chosen...
Definition: kfiledialog.cpp:701
QLatin1Char
KFileDialog::ConfirmOverwrite
Confirm whether to overwrite file to save.
Definition: kfiledialog.h:92
kpushbutton.h
KFileDialog::getOpenUrls
static KUrl::List getOpenUrls(const KUrl &startDir=KUrl(), const QString &filter=QString(), QWidget *parent=0, const QString &caption=QString())
Creates a modal file dialog and returns the selected URLs or an empty list if none was chosen...
Definition: kfiledialog.cpp:578
KWindowSystem::setMainWindow
static void setMainWindow(QWidget *subwindow, WId mainwindow)
KFileDialog::currentFilterMimeType
KMimeType::Ptr currentFilterMimeType()
Returns the mimetype for the desired output format.
Definition: kfiledialog.cpp:384
KFileDialog::getSaveUrl
static KUrl getSaveUrl(const KUrl &startDir=KUrl(), const QString &filter=QString(), QWidget *parent=0, const QString &caption=QString())
Creates a modal file dialog and returns the selected filename or an empty string if none was chosen...
Definition: kfiledialog.cpp:805
KFileDialog::OperationMode
OperationMode
Defines some default behavior of the filedialog.
Definition: kfiledialog.h:85
QDialog::keyPressEvent
virtual void keyPressEvent(QKeyEvent *e)
KConfigGroup
KAbstractFileModule
Interface to the module that contains the file widget.
Definition: kabstractfilemodule.h:35
QString::replace
QString & replace(int position, int n, QChar after)
KUrl::List
KFile::LocalOnly
Definition: kfile.h:49
QKeyEvent
KFileDialog::getStartUrl
static KUrl getStartUrl(const KUrl &startDir, QString &recentDirClass)
This method implements the logic to determine the user's default directory to be listed.
Definition: kfiledialog.cpp:941
KFileDialog::mode
KFile::Modes mode() const
Returns the mode of the filedialog.
Definition: kfiledialog.cpp:855
s_defaultFileModuleName
static const char s_defaultFileModuleName[]
Definition: kfiledialog.cpp:148
KConfig
QFileDialog::Options
typedef Options
QUrl::isValid
bool isValid() const
KFileDialog::getExistingDirectory
static QString getExistingDirectory(const KUrl &startDir=KUrl(), QWidget *parent=0, const QString &caption=QString())
Creates a modal directory-selection dialog and returns the selected directory (local only) or an empt...
Definition: kfiledialog.cpp:630
KFileDialog::Saving
Definition: kfiledialog.h:85
QString::mid
QString mid(int position, int n) const
QWidget::fontMetrics
QFontMetrics fontMetrics() const
KFileDialog::getOpenUrl
static KUrl getOpenUrl(const KUrl &startDir=KUrl(), const QString &filter=QString(), QWidget *parent=0, const QString &caption=QString())
Creates a modal file dialog and returns the selected URL or an empty string if none was chosen...
Definition: kfiledialog.cpp:552
loadFileModule
static KAbstractFileModule * loadFileModule(const QString &moduleName)
Definition: kfiledialog.cpp:139
KRecentDirs::dir
QString dir(const QString &fileClass)
Returns the most recently used directory accociated with this file-class.
Definition: krecentdirs.cpp:68
QLatin1String
QApplication::desktop
QDesktopWidget * desktop()
QSize::expandedTo
QSize expandedTo(const QSize &otherSize) const
KToolBar
QWidget::find
QWidget * find(WId id)
KFileDialog::setPreviewWidget
void setPreviewWidget(KPreviewWidgetBase *w)
Adds a preview widget and enters the preview mode.
Definition: kfiledialog.cpp:389
QWidget::parentWidget
QWidget * parentWidget() const
QWidget::windowTitle
QString windowTitle() const
KFileDialog::selectedUrls
KUrl::List selectedUrls() const
Definition: kfiledialog.cpp:673
KAbstractFileModule::getStartUrl
virtual KUrl getStartUrl(const KUrl &startDir, QString &recentDirClass)=0
QFontMetrics::height
int height() const
QWidget::setCaption
void setCaption(const QString &c)
KPreviewWidgetBase
Abstract baseclass for all preview widgets which shall be used via KFileDialog::setPreviewWidget(cons...
Definition: kpreviewwidgetbase.h:43
QFileDialog::getSaveFileName
QString getSaveFileName(QWidget *parent, const QString &caption, const QString &dir, const QString &filter, QString *selectedFilter, QFlags< QFileDialog::Option > options)
KUrl::List::toStringList
QStringList toStringList() const
krecentdocument.h
QString::length
int length() const
KFileDialog::fileWidget
KAbstractFileWidget * fileWidget()
Returns the KFileWidget that implements most of this file dialog.
Definition: kfiledialog.cpp:959
KFileDialog::setConfirmOverwrite
void setConfirmOverwrite(bool enable)
Sets whether the dialog should ask before accepting the selected file when KFileDialog::OperationMode...
Definition: kfiledialog.cpp:610
kwindowsystem.h
kWarning
static QDebug kWarning(bool cond, int area=KDE_DEFAULT_DEBUG_AREA)
mime2KdeFilter
static QStringList mime2KdeFilter(const QStringList &mimeTypes, QString *allExtensions=0)
Definition: kfiledialog.cpp:54
KFileDialog::getImageOpenUrl
static KUrl getImageOpenUrl(const KUrl &startDir=KUrl(), QWidget *parent=0, const QString &caption=QString())
Creates a modal file dialog with an image previewer and returns the selected url or an empty string i...
Definition: kfiledialog.cpp:645
QString::left
QString left(int n) const
KFileDialog::sizeHint
virtual QSize sizeHint() const
Definition: kfiledialog.cpp:405
QStringList::sort
void sort()
KFileDialog::operationMode
OperationMode operationMode() const
Definition: kfiledialog.cpp:909
QDesktopWidget::availableGeometry
const QRect availableGeometry(int screen) const
QList::prepend
void prepend(const T &value)
KUrl::url
QString url(AdjustPathOption trailing=LeaveTrailingSlash) const
QtConcurrent::filter
QFuture< void > filter(Sequence &sequence, FilterFunction filterFunction)
QFileDialog::getOpenFileName
QString getOpenFileName(QWidget *parent, const QString &caption, const QString &dir, const QString &filter, QString *selectedFilter, QFlags< QFileDialog::Option > options)
KUrl::isLocalFile
bool isLocalFile() const
qt_filedialog_open_filenames_hook
KF_EXTERN _qt_filedialog_open_filenames_hook qt_filedialog_open_filenames_hook
Definition: kfiledialog.cpp:1077
QObject::parent
QObject * parent() const
KFile::ExistingOnly
Definition: kfile.h:48
KFileDialog::keyPressEvent
virtual void keyPressEvent(QKeyEvent *e)
Reimplemented to animate the cancel button.
Definition: kfiledialog.cpp:916
KFileDialog::selectedUrl
KUrl selectedUrl() const
Definition: kfiledialog.cpp:666
KFileDialog::KFileDialog
KFileDialog(const KUrl &startDir, const QString &filter, QWidget *parent, QWidget *widget=0)
Constructs a file dialog.
Definition: kfiledialog.cpp:253
end
const KShortcut & end()
kabstractfilewidget.h
KConfigGroup::readEntry
T readEntry(const QString &key, const T &aDefault) const
KFileDialog::setMimeFilter
void setMimeFilter(const QStringList &types, const QString &defaultType=QString())
Sets the filter up to specify the output type.
Definition: kfiledialog.cpp:348
kfile_area
const int kfile_area
Definition: config-kfile.h:22
KFileDialog::getSaveFileNameWId
static QString getSaveFileNameWId(const KUrl &startDir, const QString &filter, WId parent_id, const QString &caption)
This function accepts the window id of the parent window, instead of QWidget*.
Definition: kfiledialog.cpp:768
QList::begin
iterator begin()
KFileDialog::cancelButton
KPushButton * cancelButton() const
Definition: kfiledialog.cpp:867
KFileDialog::hideEvent
virtual void hideEvent(QHideEvent *event)
Reimplemented for saving the dialog geometry.
Definition: kfiledialog.cpp:930
KAbstractFileWidget::OperationMode
OperationMode
Defines some default behavior of the filedialog.
Definition: kabstractfilewidget.h:73
QFileDialog::getOpenFileNames
QStringList getOpenFileNames(QWidget *parent, const QString &caption, const QString &dir, const QString &filter, QString *selectedFilter, QFlags< QFileDialog::Option > options)
KFileDialog::selectedFiles
QStringList selectedFiles() const
Returns a list of all selected local files.
Definition: kfiledialog.cpp:687
qt_filedialog_existing_directory_hook
KF_EXTERN _qt_filedialog_existing_directory_hook qt_filedialog_existing_directory_hook
Definition: kfiledialog.cpp:1065
QWidget::caption
QString caption() const
KRecentDirs::list
QStringList list(const QString &fileClass)
Returns a list of directories associated with this file-class.
Definition: krecentdirs.cpp:60
KFileDialog::setSelection
void setSelection(const QString &name)
Sets the file name to preselect to name.
Definition: kfiledialog.cpp:454
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:24:53 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

KIO

Skip menu "KIO"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdelibs API Reference

Skip menu "kdelibs API Reference"
  • DNSSD
  • Interfaces
  •   KHexEdit
  •   KMediaPlayer
  •   KSpeech
  •   KTextEditor
  • kconf_update
  • KDE3Support
  •   KUnitTest
  • KDECore
  • KDED
  • KDEsu
  • KDEUI
  • KDEWebKit
  • KDocTools
  • KFile
  • KHTML
  • KImgIO
  • KInit
  • kio
  • KIOSlave
  • KJS
  •   KJS-API
  •   WTF
  • kjsembed
  • KNewStuff
  • KParts
  • KPty
  • Kross
  • KUnitConversion
  • KUtils
  • Nepomuk
  • Plasma
  • Solid
  • Sonnet
  • ThreadWeaver

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal