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

kget

  • sources
  • kde-4.12
  • kdenetwork
  • kget
  • ui
  • linkview
kget_linkview.cpp
Go to the documentation of this file.
1 /* This file is part of the KDE project
2 
3  Copyright (C) 2002 Carsten Pfeiffer <pfeiffer@kde.org>
4  Copyright (C) 2007 Urs Wolfer <uwolfer @ kde.org>
5  Copyright (C) 2009 Matthias Fuchs <mat69@gmx.net>
6 
7  This program is free software; you can redistribute it and/or
8  modify it under the terms of the GNU General Public
9  License as published by the Free Software Foundation; either
10  version 2 of the License, or (at your option) any later version.
11 */
12 
13 #include "kget_linkview.h"
14 #include "settings.h"
15 #include "kget_sortfilterproxymodel.h"
16 #include "core/kget.h"
17 #include "core/linkimporter.h"
18 #include "ui/newtransferdialog.h"
19 
20 #include <QApplication>
21 #include <QClipboard>
22 #include <QMenu>
23 #include <QStandardItemModel>
24 
25 #include <KAction>
26 #include <KActionCollection>
27 #include <KIcon>
28 #include <KIconLoader>
29 #include <KLocale>
30 #include <KMessageBox>
31 #include <KMimeType>
32 #include <KShortcut>
33 #include <KStandardAction>
34 #include <KWindowSystem>
35 
36 KGetLinkView::KGetLinkView(QWidget *parent)
37  : KGetSaveSizeDialog("KGetLinkView", parent),
38  m_linkImporter(0),
39  m_nameAction(0),
40  m_urlAction(0)
41 {
42  setAttribute(Qt::WA_DeleteOnClose);
43  setCaption(i18n("Import Links"));
44  setButtons(0);
45 
46  if (parent) {
47  KWindowInfo info = KWindowSystem::windowInfo(parent->winId(), NET::WMDesktop, NET::WMDesktop);
48  KWindowSystem::setCurrentDesktop(info.desktop());
49  KWindowSystem::forceActiveWindow(parent->winId());
50  }
51 
52  // proxy model to filter links
53  m_proxyModel = new KGetSortFilterProxyModel(1, this);
54  m_proxyModel->setDynamicSortFilter(true);
55  m_proxyModel->setFilterCaseSensitivity(Qt::CaseInsensitive);
56 
57  QWidget *widget = new QWidget(this);
58  ui.setupUi(widget);
59 
60  m_proxyModel->setShowWebContent(ui.showWebContent->isChecked());
61 
62  ui.filterMode->addItem(i18n("Contains"), KGetSortFilterProxyModel::Contain);
63  ui.filterMode->addItem(i18n("Does Not Contain"), KGetSortFilterProxyModel::DoesNotContain);
64 
65  // set the Icons
66  ui.importLinks->setIcon(KIcon("document-import"));
67  ui.showCombo->addItem(KIcon("view-list-icons"), i18n("All"), KGetSortFilterProxyModel::NoFilter);
68  ui.showCombo->addItem(KIcon("video-x-generic"), i18n("Videos"), KGetSortFilterProxyModel::VideoFiles);
69  ui.showCombo->addItem(KIcon("image-x-generic"), i18n("Images"), KGetSortFilterProxyModel::ImageFiles);
70  ui.showCombo->addItem(KIcon("audio-x-generic"), i18n("Audio"), KGetSortFilterProxyModel::AudioFiles);
71  ui.showCombo->addItem(KIcon("package-x-generic"), i18n("Archives"), KGetSortFilterProxyModel::CompressedFiles );
72 
73  ui.treeView->setModel(m_proxyModel);
74  ui.progressBar->hide();
75 
76  //creates pattern syntax menu for the text filter
77  m_patternSyntaxMenu = new QMenu(i18nc("of a filter, e.g. RegExp or Wildcard", "Pattern Syntax"), this);
78  QAction *wildcardAction = new QAction(i18n("Escape Sequences"), this);
79  wildcardAction->setCheckable(true);
80  wildcardAction->setChecked(Settings::linkViewFilterPatternSyntax() == Wildcard);
81  QAction *regExpAction = new QAction(i18n("Regular Expression"), this);
82  regExpAction->setCheckable(true);
83  regExpAction->setChecked(Settings::linkViewFilterPatternSyntax() == RegExp);
84  QActionGroup *actionGroup = new QActionGroup(this);
85  actionGroup->addAction(wildcardAction);
86  actionGroup->addAction(regExpAction);
87  m_patternSyntaxMenu->addActions(actionGroup->actions());
88 
89  //Filter for name/url actions
90  QActionGroup *columnGroup = new QActionGroup(this);
91  m_nameAction = new KAction(i18nc("name of a file", "Name"), this);
92  m_nameAction->setCheckable(true);
93  m_nameAction->setChecked(true);
94  m_urlAction = new KAction(i18n("URL"), this);
95  m_urlAction->setCheckable(true);
96  columnGroup->addAction(m_nameAction);
97  columnGroup->addAction(m_urlAction);
98  connect(columnGroup, SIGNAL(triggered(QAction*)), this, SLOT(slotFilterColumn(QAction*)));
99 
100  connect(wildcardAction, SIGNAL(toggled(bool)), this, SLOT(wildcardPatternToggled(bool)));
101  connect(ui.treeView, SIGNAL(doubleClicked(QModelIndex)),
102  this, SLOT(uncheckItem(QModelIndex)));
103  connect(ui.textFilter, SIGNAL(textChanged(QString)), SLOT(setTextFilter(QString)));
104  connect(ui.textFilter, SIGNAL(aboutToShowContextMenu(QMenu*)), this, SLOT(contextMenuDisplayed(QMenu*)));
105  connect(ui.filterMode, SIGNAL(currentIndexChanged(int)), this, SLOT(slotFilterModeChanged(int)));
106  connect(ui.showCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(slotMimeTypeChanged(int)));
107  connect(ui.showCombo, SIGNAL(currentIndexChanged(int)), SLOT(updateSelectionButtons()));
108  connect(ui.urlRequester, SIGNAL(textChanged(QString)), SLOT(updateImportButtonStatus(QString)));
109  connect(ui.urlRequester, SIGNAL(urlSelected(KUrl)), SLOT(slotStartImport()));
110  connect(ui.selectAll, SIGNAL(clicked()), this, SLOT(checkAll()));
111  connect(ui.deselectAll, SIGNAL(clicked()), this, SLOT(uncheckAll()));
112  connect(ui.invertSelection, SIGNAL(clicked()), this, SLOT(slotInvertSelection()));
113  connect(this, SIGNAL(accepted()), this, SLOT(slotStartLeech()));
114  connect(ui.showWebContent, SIGNAL(stateChanged(int)), m_proxyModel, SLOT(setShowWebContent(int)));
115  connect(ui.importLinks, SIGNAL(clicked()), this, SLOT(slotStartImport()));
116  connect(ui.treeView->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
117  SLOT(selectionChanged()));
118  connect(ui.dialogButtonBox, SIGNAL(rejected()), SLOT(reject()));
119 
120  setMainWidget(widget);
121  QPushButton *download = ui.dialogButtonBox->addButton(i18nc("Download the items which have been selected","&Download"),
122  QDialogButtonBox::AcceptRole,
123  this,
124  SLOT(accept()));
125  download->setIcon(KIcon("kget"));
126 
127  checkClipboard();
128 }
129 
130 KGetLinkView::~KGetLinkView()
131 {
132  delete(m_linkImporter);
133 }
134 
135 void KGetLinkView::checkClipboard()
136 {
137  QString clipboardContent = QApplication::clipboard()->text(QClipboard::Clipboard);
138 
139  if (clipboardContent.length() > 0)
140  {
141  delete m_linkImporter;
142 
143  m_linkImporter = new LinkImporter(this);
144 
145  connect(m_linkImporter, SIGNAL(finished()), SLOT(slotImportFinished()));
146  m_linkImporter->checkClipboard(clipboardContent);
147  }
148 }
149 
150 void KGetLinkView::setLinks(const QStringList &links)
151 {
152  m_links = links;
153  showLinks(m_links, false);
154 }
155 
156 void KGetLinkView::showLinks(const QStringList &links, bool urlRequestVisible)
157 {
158  ui.importWidget->setVisible(urlRequestVisible);
159 
160  QStandardItemModel *model = new QStandardItemModel(0, 5, this);
161 
162  model->setHeaderData(0, Qt::Horizontal, i18n("Auxiliary header"));
163  model->setHeaderData(1, Qt::Horizontal, i18n("File Name"));
164  model->setHeaderData(2, Qt::Horizontal, i18n("Description"));
165  model->setHeaderData(3, Qt::Horizontal, i18nc("list header: type of file", "File Type"));
166  model->setHeaderData(4, Qt::Horizontal, i18n("Location (URL)"));
167 
168  foreach (const QString &linkitem, links)
169  {
170  KUrl url;
171  KMimeType::Ptr mt;
172 
173  if (linkitem.contains(QLatin1String("url "), Qt::CaseInsensitive) &&
174  linkitem.contains(QLatin1String("type "), Qt::CaseInsensitive)) {
175  const QStringList items = linkitem.split(QLatin1Char(' '), QString::SkipEmptyParts);
176  const int count = items.count();
177  int index = items.indexOf(QLatin1String("url"));
178  if (index > -1 && index+1 < count)
179  url = items.at(index+1);
180  index = items.indexOf(QLatin1String("type"));
181  if (index > -1 && index+1 < count)
182  mt = KMimeType::mimeType(items.at(index+1));
183  } else {
184  url = linkitem;
185  mt = KMimeType::findByUrl(linkitem, 0, true, true);
186  }
187 
188  kDebug(5001) << "Adding:" << linkitem;
189 
190  QString file = url.fileName();
191  if (file.isEmpty())
192  file = QString(url.host());
193 
194  QString mimeTypeName, mimeTypeIcon, mimeTypeComment;
195  if (mt) {
196  mimeTypeName = mt->name();
197  mimeTypeIcon = mt->iconName();
198  mimeTypeComment = mt->comment();
199  }
200 
201  QStandardItem *item = new QStandardItem(file);
202  item->setIcon(KIcon(mimeTypeIcon));
203  item->setCheckable(true);
204  item->setCheckState(Qt::Checked);
205  item->setData(QVariant(url.fileName()), Qt::DisplayRole);
206  item->setData(QVariant(mimeTypeName), Qt::UserRole); // used for filtering DownloadFilterType
207 
208  QList<QStandardItem*> items;
209  QStandardItem *number = new QStandardItem();
210  number->setData(model->rowCount(), Qt::DisplayRole);//used for inital sorting
211  items << number;
212  items << item;
213  items << new QStandardItem();
214  items << new QStandardItem(mimeTypeComment);
215  items << new QStandardItem(url.prettyUrl());
216 
217  model->insertRow(model->rowCount(), items);
218  }
219 
220  connect(model, SIGNAL(itemChanged(QStandardItem*)), this, SLOT(selectionChanged()));
221  m_proxyModel->setSourceModel(model);
222  m_proxyModel->setFilterKeyColumn(1);
223  m_proxyModel->sort(0);
224 
225  ui.treeView->header()->hideSection(0);
226  ui.treeView->setColumnWidth(1, 200); // make the filename column bigger by default
227 
228  selectionChanged(); // adapt buttons to the new situation
229 }
230 
231 void KGetLinkView::slotMimeTypeChanged(int index)
232 {
233  m_proxyModel->setFilterType(ui.showCombo->itemData(index).toInt());
234 }
235 
236 void KGetLinkView::slotFilterModeChanged(int index)
237 {
238  m_proxyModel->setFilterMode(ui.filterMode->itemData(index).toInt());
239 }
240 
241 void KGetLinkView::slotFilterColumn(QAction *action)
242 {
243  //FIXME make this not depend on "magic numbers"?
244  m_proxyModel->setFilterColumn(action == m_urlAction ? 4 : 1);
245 }
246 
247 void KGetLinkView::slotStartLeech()
248 {
249  QStandardItemModel *model = qobject_cast<QStandardItemModel *>(m_proxyModel->sourceModel());
250  if (model)
251  {
252  KUrl::List urls;
253 
254  for (int row = 0; row < model->rowCount(); row++)
255  {
256  QStandardItem *checkeableItem = model->item(row, 1);
257 
258  if (checkeableItem->checkState() == Qt::Checked)
259  {
260  urls.append(KUrl(model->data(model->index(row, 4)).toString()));
261  }
262  }
263 
264  NewTransferDialogHandler::showNewTransferDialog(urls);
265  }
266 }
267 
268 void KGetLinkView::setPageUrl( const QString& url )
269 {
270  setPlainCaption( i18n( "Links in: %1 - KGet", url ) );
271 }
272 
273 void KGetLinkView::importUrl(const QString &url)
274 {
275  if (url.isEmpty())
276  {
277  KUrl clipboardUrl = KUrl(QApplication::clipboard()->text(QClipboard::Clipboard).trimmed());
278  if (clipboardUrl.isValid() &&
279  ((!clipboardUrl.scheme().isEmpty() && !clipboardUrl.host().isEmpty()) ||
280  (clipboardUrl.isLocalFile())))
281  {
282  ui.urlRequester->setUrl(clipboardUrl);
283  }
284  }
285  else
286  {
287  ui.urlRequester->setUrl(KUrl(url));
288  slotStartImport();
289  }
290 }
291 
292 void KGetLinkView::selectionChanged()
293 {
294  QStandardItemModel *model = qobject_cast<QStandardItemModel *>(m_proxyModel->sourceModel());
295  if (model)
296  {
297  const int modelRowCount = model->rowCount();
298  bool buttonEnabled = false;
299  int count = 0;
300 
301  for (int row = 0; row < modelRowCount; row++)
302  {
303  QStandardItem *checkeableItem = model->item(row, 1);
304 
305  if ((checkeableItem->checkState() == Qt::Checked))
306  {
307  buttonEnabled = true;
308 
309  // only count the checked files that are currently visible
310  if (m_proxyModel->mapFromSource(model->index(row, 1)).isValid())
311  {
312  count++;
313  }
314  }
315  }
316 
317  ui.selectAll->setEnabled( !(!modelRowCount || count == m_proxyModel->rowCount() ) );
318  ui.deselectAll->setEnabled( count > 0 );
319  ui.invertSelection->setEnabled( count > 0 );
320 
321  enableButtonOk(buttonEnabled);
322  }
323 }
324 
325 void KGetLinkView::setTextFilter(const QString &text)
326 {
327  // TODO: escape user input for avoding malicious user input! (FiNEX)
328  QString temp = text.isEmpty() ? ui.textFilter->text() : text;
329  if (Settings::linkViewFilterPatternSyntax() == Wildcard) {
330  m_proxyModel->setFilterWildcard(temp);
331  } else {
332  QRegExp rx(temp, Qt::CaseSensitive, QRegExp::RegExp2);
333  m_proxyModel->setFilterRegExp(rx);
334  }
335 
336  updateSelectionButtons();
337 }
338 
339 void KGetLinkView::updateSelectionButtons()
340 {
341  const bool isFiltered = !ui.textFilter->text().isEmpty() || (ui.showCombo->currentIndex() != KGetSortFilterProxyModel::NoFilter);
342  ui.selectAll->setText(isFiltered ? i18n("&Select All Filtered") : i18n("&Select All"));
343  ui.deselectAll->setText(isFiltered ? i18n("D&eselect All Filtered") : i18n("D&eselect All"));
344 
345  selectionChanged();
346 }
347 
348 void KGetLinkView::checkAll()
349 {
350  QStandardItemModel *itemsModel = qobject_cast<QStandardItemModel *>(m_proxyModel->sourceModel());
351  if (itemsModel)
352  {
353  for (int row = 0; row < m_proxyModel->rowCount(); row++)
354  {
355  const QModelIndex index = m_proxyModel->mapToSource(m_proxyModel->index(row, 3));
356  QStandardItem *item = itemsModel->item(index.row(), 1);
357  item->setCheckState(Qt::Checked);
358  }
359  }
360 }
361 
362 void KGetLinkView::uncheckAll()
363 {
364  QStandardItemModel *itemsModel = qobject_cast<QStandardItemModel *>(m_proxyModel->sourceModel());
365  if (itemsModel)
366  {
367  for (int row = 0; row < m_proxyModel->rowCount(); row++)
368  {
369  const QModelIndex index = m_proxyModel->mapToSource(m_proxyModel->index(row, 3));
370  QStandardItem *item = itemsModel->item(index.row(), 1);
371  item->setCheckState(Qt::Unchecked);
372  }
373  }
374 }
375 
376 void KGetLinkView::uncheckItem(const QModelIndex &index)
377 {
378  QStandardItemModel *model = qobject_cast<QStandardItemModel *>(m_proxyModel->sourceModel());
379  if (model)
380  {
381  if (index.column() != 0)
382  {
383  QStandardItem *item = model->itemFromIndex(model->index(m_proxyModel->mapToSource(index).row(), 1));
384  item->setCheckState(item->checkState() == Qt::Checked ? Qt::Unchecked : Qt::Checked);
385  }
386  }
387 }
388 
389 void KGetLinkView::slotCheckSelected()
390 {
391  QStandardItemModel *model = qobject_cast<QStandardItemModel *>(m_proxyModel->sourceModel());
392  if (model)
393  {
394  foreach(const QModelIndex &index, ui.treeView->selectionModel()->selectedIndexes())
395  {
396  QModelIndex sourceIndex = m_proxyModel->mapToSource(index);
397  QStandardItem *item = model->item(sourceIndex.row(), 1);
398 
399  item->setCheckState(Qt::Checked);
400  }
401  }
402 }
403 
404 void KGetLinkView::slotInvertSelection()
405 {
406  QStandardItemModel *itemsModel = qobject_cast<QStandardItemModel *>(m_proxyModel->sourceModel());
407  if (itemsModel)
408  {
409  for (int row = 0; row < m_proxyModel->rowCount(); row++)
410  {
411  const QModelIndex index = m_proxyModel->mapToSource(m_proxyModel->index(row, 3));
412  QStandardItem *item = itemsModel->item(index.row(), 1);
413  item->setCheckState((item->checkState() == Qt::Checked) ? Qt::Unchecked : Qt::Checked);
414  }
415  }
416 }
417 
418 void KGetLinkView::slotStartImport()
419 {
420  delete m_linkImporter;
421 
422  m_linkImporter = new LinkImporter(ui.urlRequester->url(), this);
423 
424  connect(m_linkImporter, SIGNAL(progress(int)), SLOT(slotImportProgress(int)));
425  connect(m_linkImporter, SIGNAL(finished()), SLOT(slotImportFinished()));
426 
427  if (!ui.urlRequester->url().isLocalFile())
428  {
429  m_linkImporter->copyRemoteFile();
430  }
431 
432  m_linkImporter->start();
433  ui.progressBar->show();
434 }
435 
436 void KGetLinkView::slotImportProgress(int progress)
437 {
438  ui.progressBar->setValue(progress);
439 }
440 
441 void KGetLinkView::slotImportFinished()
442 {
443  ui.progressBar->hide();
444  m_links = m_linkImporter->links();
445  showLinks(m_links, true);
446 }
447 
448 void KGetLinkView::updateImportButtonStatus(const QString &text)
449 {
450  bool enabled = false;
451  if (!text.isEmpty())
452  {
453  KUrl url(text);
454  if (url.isValid())
455  {
456  enabled = true;
457  }
458  }
459  ui.importLinks->setEnabled(enabled);
460 }
461 
462 void KGetLinkView::contextMenuDisplayed(QMenu *menu)
463 {
464  menu->addSeparator();
465  menu->addMenu(m_patternSyntaxMenu);
466  menu->addSeparator()->setText(i18n("Filter Column"));
467  menu->addAction(m_nameAction);
468  menu->addAction(m_urlAction);
469 }
470 
471 
472 void KGetLinkView::wildcardPatternToggled(bool enabled)
473 {
474  if (enabled) {
475  Settings::setLinkViewFilterPatternSyntax(Wildcard);
476  } else {
477  Settings::setLinkViewFilterPatternSyntax(RegExp);
478  }
479 }
480 
481 #include "kget_linkview.moc"
kget_linkview.h
KGetSortFilterProxyModel
Definition: kget_sortfilterproxymodel.h:25
KGetSortFilterProxyModel::CompressedFiles
Definition: kget_sortfilterproxymodel.h:37
LinkImporter::links
QList< QString > links()
Returns a list with the links of the selected url m_url.
Definition: linkimporter.h:51
KGetSortFilterProxyModel::AudioFiles
Definition: kget_sortfilterproxymodel.h:36
QWidget
QStandardItemModel
KGetLinkView::setPageUrl
void setPageUrl(const QString &url)
Definition: kget_linkview.cpp:268
LinkImporter::copyRemoteFile
void copyRemoteFile()
copy the remote file out of the thread
Definition: linkimporter.cpp:80
KGetSortFilterProxyModel::VideoFiles
Definition: kget_sortfilterproxymodel.h:35
KGetSortFilterProxyModel::Contain
Definition: kget_sortfilterproxymodel.h:42
Settings::setLinkViewFilterPatternSyntax
static void setLinkViewFilterPatternSyntax(int v)
Set LinkViewFilterPatternSyntax.
Definition: settings.h:971
LinkImporter::checkClipboard
void checkClipboard(const QString &clipboardContent)
Check for urls in clipboard.
Definition: linkimporter.cpp:51
KGetLinkView::KGetLinkView
KGetLinkView(QWidget *parent=0)
Definition: kget_linkview.cpp:36
LinkImporter
Import a list of urls from a file (local or remote)
Definition: linkimporter.h:25
newtransferdialog.h
Settings::linkViewFilterPatternSyntax
static int linkViewFilterPatternSyntax()
Get LinkViewFilterPatternSyntax.
Definition: settings.h:981
KGetSortFilterProxyModel::NoFilter
Definition: kget_sortfilterproxymodel.h:34
KGetLinkView::~KGetLinkView
~KGetLinkView()
Definition: kget_linkview.cpp:130
KGetSortFilterProxyModel::ImageFiles
Definition: kget_sortfilterproxymodel.h:38
KGetLinkView::importUrl
void importUrl(const QString &url=QString())
Definition: kget_linkview.cpp:273
KGetSortFilterProxyModel::setShowWebContent
void setShowWebContent(bool show)
Definition: kget_sortfilterproxymodel.cpp:71
KGetSaveSizeDialog
Subclass to make sure that the size of the dialog is automatically stored and restored.
Definition: basedialog.h:32
KGetSortFilterProxyModel::setFilterType
void setFilterType(int filterType)
Definition: kget_sortfilterproxymodel.cpp:50
settings.h
NewTransferDialogHandler::showNewTransferDialog
static void showNewTransferDialog(const KUrl &url=KUrl())
Definition: newtransferdialog.cpp:493
linkimporter.h
kget.h
KGetSortFilterProxyModel::setFilterMode
void setFilterMode(int filterMode)
Definition: kget_sortfilterproxymodel.cpp:56
KGetSortFilterProxyModel::setFilterColumn
void setFilterColumn(int column)
Definition: kget_sortfilterproxymodel.cpp:83
kget_sortfilterproxymodel.h
QStandardItem
KGetLinkView::setLinks
void setLinks(const QStringList &links)
Definition: kget_linkview.cpp:150
KGetSortFilterProxyModel::DoesNotContain
Definition: kget_sortfilterproxymodel.h:43
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:53:17 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

kget

Skip menu "kget"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members

kdenetwork API Reference

Skip menu "kdenetwork API Reference"
  • kget
  • kopete
  •   kopete
  •   libkopete
  • krdc
  • krfb

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