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

messageviewer

  • sources
  • kde-4.14
  • kdepim
  • messageviewer
  • adblock
adblocksettingwidget.cpp
Go to the documentation of this file.
1 /* ============================================================
2 *
3 * This file is a part of the rekonq project
4 *
5 * Copyright (c) 2013-2015 Montel Laurent <montel@kde.org>
6 * based on code from rekonq
7 * Copyright (C) 2010-2012 by Andrea Diamantini <adjam7 at gmail dot com>
8 *
9 *
10 * This program is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU General Public License as
12 * published by the Free Software Foundation; either version 2 of
13 * the License or (at your option) version 3 or any later version
14 * accepted by the membership of KDE e.V. (or its successor approved
15 * by the membership of KDE e.V.), which shall act as a proxy
16 * defined in Section 14 of version 3 of the license.
17 *
18 * This program is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU General Public License for more details.
22 *
23 * You should have received a copy of the GNU General Public License
24 * along with this program. If not, see <http://www.gnu.org/licenses/>.
25 *
26 * ============================================================ */
27 
28 
29 // Self Includes
30 #include "adblocksettingwidget.h"
31 #include "settings/globalsettings.h"
32 #include "adblockaddsubscriptiondialog.h"
33 #include "adblockmanager.h"
34 #include "adblockshowlistdialog.h"
35 #include "adblock/adblockutil.h"
36 #include "pimcommon/widgets/configureimmutablewidgetutils.h"
37 using namespace PimCommon::ConfigureImmutableWidgetUtils;
38 
39 #include "pimcommon/util/pimutil.h"
40 
41 // KDE Includes
42 #include <KSharedConfig>
43 #include <KStandardDirs>
44 #include <KIcon>
45 #include <KDebug>
46 #include <KMessageBox>
47 
48 // Qt Includes
49 #include <QWhatsThis>
50 #include <QListWidgetItem>
51 #include <QFile>
52 #include <QPointer>
53 #include <QTextStream>
54 
55 using namespace MessageViewer;
56 AdBlockSettingWidget::AdBlockSettingWidget(QWidget *parent)
57  : QWidget(parent)
58  , mChanged(false)
59 {
60  setupUi(this);
61 
62  hintLabel->setText(i18n("<qt>Filter expression (e.g. <tt>http://www.example.com/ad/*</tt>, <a href=\"filterhelp\">more information</a>):"));
63  hintLabel->setContextMenuPolicy(Qt::NoContextMenu);
64  connect(hintLabel, SIGNAL(linkActivated(QString)), this, SLOT(slotInfoLinkActivated(QString)));
65 
66  manualFiltersListWidget->setSelectionMode(QAbstractItemView::MultiSelection);
67 
68  searchLine->setListWidget(manualFiltersListWidget);
69 
70  insertButton->setIcon(KIcon(QLatin1String("list-add")));
71  connect(insertButton, SIGNAL(clicked()), this, SLOT(insertRule()));
72 
73  removeButton->setIcon(KIcon(QLatin1String("list-remove")));
74  connect(removeButton, SIGNAL(clicked()), this, SLOT(removeRule()));
75  connect(removeSubscription, SIGNAL(clicked()), SLOT(slotRemoveSubscription()));
76  connect(manualFiltersListWidget, SIGNAL(currentItemChanged(QListWidgetItem*,QListWidgetItem*)), this, SLOT(slotUpdateManualButtons()));
77 
78  spinBox->setSuffix(ki18np(" day", " days"));
79 
80  removeSubscription->setEnabled(false);
81  showList->setEnabled(false);
82  // emit changed signal
83  connect(checkEnableAdblock, SIGNAL(stateChanged(int)), this, SLOT(hasChanged()));
84  connect(checkHideAds, SIGNAL(stateChanged(int)), this, SLOT(hasChanged()));
85  connect(spinBox, SIGNAL(valueChanged(int)), this, SLOT(hasChanged()));
86  connect(addFilters, SIGNAL(clicked()), this, SLOT(slotAddFilter()));
87  connect(showList, SIGNAL(clicked()), this, SLOT(slotShowList()));
88  connect(editFilter, SIGNAL(clicked()), this, SLOT(slotEditFilter()));
89 
90  connect(automaticFiltersListWidget, SIGNAL(itemChanged(QListWidgetItem*)), this, SLOT(hasChanged()));
91  connect(automaticFiltersListWidget, SIGNAL(currentItemChanged(QListWidgetItem*,QListWidgetItem*)), this, SLOT(slotUpdateButtons()));
92  connect(automaticFiltersListWidget, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(slotAutomaticFilterDouble(QListWidgetItem*)));
93 
94  connect(importFilters, SIGNAL(clicked()), SLOT(slotImportFilters()));
95  connect(exportFilters, SIGNAL(clicked()), SLOT(slotExportFilters()));
96  connect(addFilterLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotManualFilterLineEditTextChanged(QString)));
97  slotUpdateManualButtons();
98  insertButton->setEnabled(false);
99 }
100 
101 void AdBlockSettingWidget::slotManualFilterLineEditTextChanged(const QString &text)
102 {
103  insertButton->setEnabled(!text.isEmpty());
104 }
105 
106 void AdBlockSettingWidget::slotEditFilter()
107 {
108  QListWidgetItem *item = manualFiltersListWidget->currentItem();
109  if (item) {
110  manualFiltersListWidget->editItem(item);
111  }
112 }
113 
114 void AdBlockSettingWidget::slotUpdateButtons()
115 {
116  const bool enabled = automaticFiltersListWidget->currentItem();
117  removeSubscription->setEnabled(enabled);
118  showList->setEnabled(enabled);
119 }
120 
121 void AdBlockSettingWidget::slotUpdateManualButtons()
122 {
123  const bool enabled = manualFiltersListWidget->currentItem();
124  removeButton->setEnabled(enabled);
125  editFilter->setEnabled(enabled);
126  exportFilters->setEnabled(manualFiltersListWidget->count()>0);
127 }
128 
129 void AdBlockSettingWidget::slotInfoLinkActivated(const QString &url)
130 {
131  Q_UNUSED(url)
132 
133  const QString hintHelpString = i18n("<qt><p>Enter an expression to filter. Filters can be defined as either:"
134  "<ul><li>a shell-style wildcard, e.g. <tt>http://www.example.com/ads*</tt>, "
135  "the wildcards <tt>*?[]</tt> may be used</li>"
136  "<li>a full regular expression by surrounding the string with '<tt>/</tt>', "
137  "e.g. <tt>/\\/(ad|banner)\\./</tt></li></ul>"
138  "<p>Any filter string can be preceded by '<tt>@@</tt>' to whitelist (allow) any matching URL, "
139  "which takes priority over any blacklist (blocking) filter.");
140 
141  QWhatsThis::showText(QCursor::pos(), hintHelpString);
142 }
143 
144 
145 void AdBlockSettingWidget::insertRule()
146 {
147  const QString rule = addFilterLineEdit->text();
148  if (rule.isEmpty())
149  return;
150  const int numberItem(manualFiltersListWidget->count());
151  for (int i = 0; i < numberItem; ++i) {
152  if (manualFiltersListWidget->item(i)->text() == rule) {
153  addFilterLineEdit->clear();
154  return;
155  }
156  }
157 
158  addManualFilter(rule);
159  exportFilters->setEnabled(manualFiltersListWidget->count()>0);
160  addFilterLineEdit->clear();
161  hasChanged();
162 }
163 
164 
165 void AdBlockSettingWidget::removeRule()
166 {
167  QList<QListWidgetItem *> select = manualFiltersListWidget->selectedItems();
168  if (select.isEmpty()) {
169  return;
170  }
171  Q_FOREACH (QListWidgetItem *item, select) {
172  delete item;
173  }
174  exportFilters->setEnabled(manualFiltersListWidget->count()>0);
175  hasChanged();
176 }
177 
178 void AdBlockSettingWidget::doResetToDefaultsOther()
179 {
180  const bool bUseDefaults = MessageViewer::GlobalSettings::self()->useDefaults( true );
181  loadWidget(checkEnableAdblock,GlobalSettings::self()->adBlockEnabledItem());
182  tabWidget->setEnabled(GlobalSettings::self()->adBlockEnabled());
183  saveCheckBox(checkHideAds, GlobalSettings::self()->hideAdsEnabledItem());
184  loadWidget(spinBox, GlobalSettings::self()->adBlockUpdateIntervalItem());
185  MessageViewer::GlobalSettings::self()->useDefaults( bUseDefaults );
186 }
187 
188 void AdBlockSettingWidget::doLoadFromGlobalSettings()
189 {
190  manualFiltersListWidget->clear();
191  automaticFiltersListWidget->clear();
192  loadWidget(checkEnableAdblock,GlobalSettings::self()->adBlockEnabledItem());
193 
194  // update enabled status
195  tabWidget->setEnabled(GlobalSettings::self()->adBlockEnabled());
196  loadWidget(checkHideAds, GlobalSettings::self()->hideAdsEnabledItem());
197  loadWidget(spinBox, GlobalSettings::self()->adBlockUpdateIntervalItem());
198 
199  // ------------------------------------------------------------------------------
200 
201  // automatic filters
202  KConfig config(QLatin1String("messagevieweradblockrc"));
203 
204  const QStringList itemList = config.groupList().filter( QRegExp( QLatin1String("FilterList \\d+") ) );
205  Q_FOREACH(const QString &item, itemList) {
206  KConfigGroup filtersGroup(&config, item);
207  const bool isFilterEnabled = filtersGroup.readEntry(QLatin1String("FilterEnabled"), false);
208  const QString url = filtersGroup.readEntry(QLatin1String("url"));
209  const QString path = filtersGroup.readEntry(QLatin1String("path"));
210  const QString name = filtersGroup.readEntry(QLatin1String("name"));
211  const QDateTime lastUpdate = filtersGroup.readEntry(QLatin1String("lastUpdate"), QDateTime());
212  if (url.isEmpty() || path.isEmpty() || name.isEmpty())
213  continue;
214 
215  QListWidgetItem *subItem = new QListWidgetItem(automaticFiltersListWidget);
216  subItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsUserCheckable| Qt::ItemIsSelectable | Qt::ItemIsDragEnabled);
217  if (isFilterEnabled)
218  subItem->setCheckState(Qt::Checked);
219  else
220  subItem->setCheckState(Qt::Unchecked);
221 
222  subItem->setData(UrlList, url);
223  subItem->setData(PathList, path);
224  subItem->setData(LastUpdateList, lastUpdate);
225  subItem->setText(name);
226  }
227 
228  // ------------------------------------------------------------------------------
229 
230  // local filters
231  const QString localRulesFilePath = MessageViewer::AdBlockUtil::localFilterPath();
232 
233  QFile ruleFile(localRulesFilePath);
234  if (!ruleFile.open(QFile::ReadOnly | QFile::Text)) {
235  kDebug() << "Unable to open rule file" << localRulesFilePath;
236  return;
237  }
238 
239  QTextStream in(&ruleFile);
240  while (!in.atEnd()) {
241  QString stringRule = in.readLine();
242  addManualFilter(stringRule);
243  }
244  updateCheckBox();
245 }
246 
247 
248 void AdBlockSettingWidget::save()
249 {
250  if (!mChanged)
251  return;
252 
253  // General settings
254  saveCheckBox(checkEnableAdblock,GlobalSettings::self()->adBlockEnabledItem());
255  saveCheckBox(checkHideAds, GlobalSettings::self()->hideAdsEnabledItem());
256  saveSpinBox(spinBox, GlobalSettings::self()->adBlockUpdateIntervalItem());
257 
258  // automatic filters
259  KConfig config(QLatin1String("messagevieweradblockrc"));
260  const QStringList list = config.groupList().filter( QRegExp( QLatin1String("FilterList \\d+") ) );
261  foreach ( const QString &group, list ) {
262  config.deleteGroup( group );
263  }
264 
265  const int numberItem(automaticFiltersListWidget->count());
266  for (int i = 0; i < numberItem; ++i) {
267  QListWidgetItem *subItem = automaticFiltersListWidget->item(i);
268  KConfigGroup grp = config.group(QString::fromLatin1("FilterList %1").arg(i));
269  grp.writeEntry(QLatin1String("FilterEnabled"), subItem->checkState() == Qt::Checked);
270  grp.writeEntry(QLatin1String("url"), subItem->data(UrlList).toString());
271  grp.writeEntry(QLatin1String("name"), subItem->text());
272  if (subItem->data(LastUpdateList).toDateTime().isValid())
273  grp.writeEntry(QLatin1String("lastUpdate"), subItem->data(LastUpdateList).toDateTime());
274  QString path = subItem->data(PathList).toString();
275  if (path.isEmpty()) {
276  path = KStandardDirs::locateLocal("data", QString::fromLatin1("kmail2/adblockrules-%1").arg(i));
277  }
278  grp.writeEntry(QLatin1String("path"), path);
279  }
280 
281  config.sync();
282  // local filters
283  const QString localRulesFilePath = MessageViewer::AdBlockUtil::localFilterPath();
284 
285  QFile ruleFile(localRulesFilePath);
286  if (!ruleFile.open(QFile::WriteOnly | QFile::Text)) {
287  kDebug() << "Unable to open rule file" << localRulesFilePath;
288  return;
289  }
290 
291  QTextStream out(&ruleFile);
292  for (int i = 0; i < manualFiltersListWidget->count(); ++i) {
293  QListWidgetItem *subItem = manualFiltersListWidget->item(i);
294  const QString stringRule = subItem->text();
295  if (!stringRule.trimmed().isEmpty())
296  out << stringRule << '\n';
297  }
298 
299  // -------------------------------------------------------------------------------
300  mChanged = false;
301  emit changed(false);
302  AdBlockManager::self()->reloadConfig();
303 }
304 
305 void AdBlockSettingWidget::updateCheckBox()
306 {
307  // update enabled status
308  checkHideAds->setEnabled(checkEnableAdblock->isChecked());
309  tabWidget->setEnabled(checkEnableAdblock->isChecked());
310 }
311 
312 void AdBlockSettingWidget::hasChanged()
313 {
314  updateCheckBox();
315  mChanged = true;
316  emit changed(true);
317 }
318 
319 
320 bool AdBlockSettingWidget::changed() const
321 {
322  return mChanged;
323 }
324 
325 void AdBlockSettingWidget::slotAddFilter()
326 {
327  QStringList excludeList;
328  const int numberItem(automaticFiltersListWidget->count());
329  for (int i = 0; i < numberItem; ++i) {
330  excludeList << automaticFiltersListWidget->item(i)->text();
331  }
332  QPointer<MessageViewer::AdBlockAddSubscriptionDialog> dlg = new MessageViewer::AdBlockAddSubscriptionDialog(excludeList, this);
333  if (dlg->exec()) {
334  QString name;
335  QString url;
336  dlg->selectedList(name, url);
337  QListWidgetItem *subItem = new QListWidgetItem(automaticFiltersListWidget);
338  subItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsUserCheckable | Qt::ItemIsSelectable | Qt::ItemIsDragEnabled);
339  subItem->setCheckState(Qt::Checked);
340  subItem->setText(name);
341  subItem->setData(UrlList, url);
342  subItem->setData(LastUpdateList, QDateTime());
343  subItem->setData(PathList, QString());
344  hasChanged();
345  }
346  delete dlg;
347 }
348 
349 void AdBlockSettingWidget::slotRemoveSubscription()
350 {
351  QListWidgetItem *item = automaticFiltersListWidget->currentItem();
352  if (item) {
353  if (KMessageBox::questionYesNo(this, i18n("Do you want to delete list \"%1\"?", item->text()), i18n("Delete current list")) == KMessageBox::Yes) {
354  const QString path = item->data(PathList).toString();
355  if (!path.isEmpty()) {
356  if (!QFile(path).remove())
357  qDebug()<<" we can not remove file:"<<path;
358  }
359  delete item;
360  }
361  hasChanged();
362  }
363 }
364 
365 void AdBlockSettingWidget::slotShowList()
366 {
367  showAutomaticFilterList(automaticFiltersListWidget->currentItem());
368 }
369 
370 void AdBlockSettingWidget::showAutomaticFilterList(QListWidgetItem *item)
371 {
372  if (item) {
373  QPointer<AdBlockShowListDialog> dlg = new AdBlockShowListDialog(this);
374  dlg->setListName(item->text());
375  dlg->setAdBlockListPath(item->data(PathList).toString(), item->data(UrlList).toString());
376  connect(dlg, SIGNAL(deleteList(QString)), SLOT(slotDeleteList(QString)));
377  dlg->exec();
378  delete dlg;
379  }
380 }
381 
382 void AdBlockSettingWidget::slotDeleteList(const QString &listName)
383 {
384  QListWidgetItem *item = automaticFiltersListWidget->currentItem();
385  if (item && item->text() == listName) {
386  const QString path = item->data(PathList).toString();
387  if (!path.isEmpty()) {
388  if (!QFile(path).remove())
389  qDebug()<<" we can not remove file:"<<path;
390  }
391  delete item;
392  hasChanged();
393  }
394 }
395 
396 void AdBlockSettingWidget::slotImportFilters()
397 {
398  const QString filter = i18n( "*|all files (*)" );
399  const QString result = PimCommon::Util::loadToFile(filter, this, i18n("Import Filters"));
400  if (result.isEmpty()) {
401  return;
402  }
403  const QStringList listFilter = result.split(QLatin1Char('\n'));
404  QStringList excludeFilter;
405  const int numberOfElement(manualFiltersListWidget->count());
406  for (int i = 0; i < numberOfElement; ++i) {
407  QListWidgetItem *subItem = manualFiltersListWidget->item(i);
408  excludeFilter.append(subItem->text());
409  }
410 
411  Q_FOREACH (const QString &element, listFilter) {
412  if (element == QLatin1String("\n"))
413  continue;
414  if (excludeFilter.contains(element))
415  continue;
416  addManualFilter(element);
417  }
418 }
419 
420 void AdBlockSettingWidget::addManualFilter(const QString &text)
421 {
422  QListWidgetItem *subItem = new QListWidgetItem(manualFiltersListWidget);
423  subItem->setFlags(subItem->flags() | Qt::ItemIsEditable);
424  subItem->setText(text);
425 }
426 
427 void AdBlockSettingWidget::slotExportFilters()
428 {
429  const QString filter = i18n( "*|all files (*)" );
430  QString exportFilters;
431  const int numberOfElement(manualFiltersListWidget->count());
432  for (int i = 0; i < numberOfElement; ++i) {
433  QListWidgetItem *subItem = manualFiltersListWidget->item(i);
434  const QString stringRule = subItem->text();
435  if (!stringRule.isEmpty())
436  exportFilters += stringRule + QLatin1Char('\n');
437  }
438  PimCommon::Util::saveTextAs(exportFilters, filter, this, KUrl(), i18n("Export Filters"));
439 }
440 
441 void AdBlockSettingWidget::slotAutomaticFilterDouble(QListWidgetItem *item)
442 {
443  showAutomaticFilterList(item);
444 }
445 
globalsettings.h
QWidget
QListWidgetItem::checkState
Qt::CheckState checkState() const
QWidget::setupUi
void setupUi(QWidget *widget)
QTextStream::readLine
QString readLine(qint64 maxlen)
MessageViewer::AdBlockSettingWidget::changed
bool changed() const
Definition: adblocksettingwidget.cpp:320
MessageViewer::AdBlockAddSubscriptionDialog
Definition: adblockaddsubscriptiondialog.h:27
QFile::remove
bool remove()
MessageViewer::AdBlockSettingWidget
Definition: adblocksettingwidget.h:38
QString::split
QStringList split(const QString &sep, SplitBehavior behavior, Qt::CaseSensitivity cs) const
QVariant::toDateTime
QDateTime toDateTime() const
QWidget::style
QStyle * style() const
MessageViewer::AdBlockUtil::localFilterPath
QString localFilterPath()
Definition: adblockutil.cpp:69
adblocksettingwidget.h
QPointer
QStringList::contains
bool contains(const QString &str, Qt::CaseSensitivity cs) const
QWhatsThis
QListWidgetItem
adblockaddsubscriptiondialog.h
QListWidgetItem::flags
Qt::ItemFlags flags() const
QFile
QTextStream
adblockmanager.h
QString::clear
void clear()
QRegExp
QObject::name
const char * name() const
QWidget::enabled
enabled
QList::append
void append(const T &value)
QTextStream::atEnd
bool atEnd() const
QList::isEmpty
bool isEmpty() const
QListWidgetItem::setFlags
void setFlags(QFlags< Qt::ItemFlag > flags)
QString::isEmpty
bool isEmpty() const
QString::trimmed
QString trimmed() const
MessageViewer::GlobalSettings::self
static GlobalSettings * self()
Definition: globalsettings.cpp:34
QListWidgetItem::data
virtual QVariant data(int role) const
QWidget::pos
QPoint pos() const
QString
QListWidgetItem::setCheckState
void setCheckState(Qt::CheckState state)
QList
QFile::open
virtual bool open(QFlags< QIODevice::OpenModeFlag > mode)
QStringList
QLatin1Char
QListWidgetItem::setData
virtual void setData(int role, const QVariant &value)
adblockutil.h
MessageViewer::AdBlockManager::reloadConfig
void reloadConfig()
Definition: adblockmanager.cpp:94
QDateTime::isValid
bool isValid() const
MessageViewer::AdBlockManager::self
static AdBlockManager * self()
Entry point.
Definition: adblockmanager.cpp:56
MessageViewer::AdBlockSettingWidget::doLoadFromGlobalSettings
void doLoadFromGlobalSettings()
Definition: adblocksettingwidget.cpp:188
adblockshowlistdialog.h
QLatin1String
MessageViewer::AdBlockSettingWidget::doResetToDefaultsOther
void doResetToDefaultsOther()
Definition: adblocksettingwidget.cpp:178
QString::fromLatin1
QString fromLatin1(const char *str, int size)
QStringList::filter
QStringList filter(const QString &str, Qt::CaseSensitivity cs) const
QObject::connect
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
QCursor
QVariant::toString
QString toString() const
MessageViewer::AdBlockShowListDialog
Definition: adblockshowlistdialog.h:35
QListWidgetItem::text
QString text() const
QDateTime
QListWidgetItem::setText
void setText(const QString &text)
MessageViewer::AdBlockSettingWidget::save
void save()
Definition: adblocksettingwidget.cpp:248
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:32:45 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

messageviewer

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

kdepim API Reference

Skip menu "kdepim API Reference"
  • akonadi_next
  • akregator
  • blogilo
  • calendarsupport
  • console
  •   kabcclient
  •   konsolekalendar
  • kaddressbook
  • kalarm
  •   lib
  • kdgantt2
  • kjots
  • kleopatra
  • kmail
  • knode
  • knotes
  • kontact
  • korgac
  • korganizer
  • ktimetracker
  • libkdepim
  • libkleo
  • libkpgp
  • mailcommon
  • messagelist
  • messageviewer
  • pimprint

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