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

messageviewer

  • sources
  • kde-4.12
  • 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 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 
36 #include "pimcommon/util/pimutil.h"
37 
38 // KDE Includes
39 #include <KSharedConfig>
40 #include <KStandardDirs>
41 #include <KIcon>
42 #include <KDebug>
43 #include <KMessageBox>
44 
45 // Qt Includes
46 #include <QWhatsThis>
47 #include <QListWidgetItem>
48 #include <QFile>
49 #include <QPointer>
50 #include <QTextStream>
51 
52 using namespace MessageViewer;
53 AdBlockSettingWidget::AdBlockSettingWidget(QWidget *parent)
54  : QWidget(parent)
55  , mChanged(false)
56 {
57  setupUi(this);
58 
59  hintLabel->setText(i18n("<qt>Filter expression (e.g. <tt>http://www.example.com/ad/*</tt>, <a href=\"filterhelp\">more information</a>):"));
60  connect(hintLabel, SIGNAL(linkActivated(QString)), this, SLOT(slotInfoLinkActivated(QString)));
61 
62  manualFiltersListWidget->setSelectionMode(QAbstractItemView::MultiSelection);
63 
64  searchLine->setListWidget(manualFiltersListWidget);
65 
66  insertButton->setIcon(KIcon(QLatin1String("list-add")));
67  connect(insertButton, SIGNAL(clicked()), this, SLOT(insertRule()));
68 
69  removeButton->setIcon(KIcon(QLatin1String("list-remove")));
70  connect(removeButton, SIGNAL(clicked()), this, SLOT(removeRule()));
71  connect(removeSubscription, SIGNAL(clicked()), SLOT(slotRemoveSubscription()));
72  connect(manualFiltersListWidget, SIGNAL(currentItemChanged(QListWidgetItem*,QListWidgetItem*)), this, SLOT(slotUpdateManualButtons()));
73 
74  spinBox->setSuffix(ki18np(" day", " days"));
75 
76  removeSubscription->setEnabled(false);
77  showList->setEnabled(false);
78  // emit changed signal
79  connect(checkEnableAdblock, SIGNAL(stateChanged(int)), this, SLOT(hasChanged()));
80  connect(checkHideAds, SIGNAL(stateChanged(int)), this, SLOT(hasChanged()));
81  connect(spinBox, SIGNAL(valueChanged(int)), this, SLOT(hasChanged()));
82  connect(addFilters, SIGNAL(clicked()), this, SLOT(slotAddFilter()));
83  connect(showList, SIGNAL(clicked()), this, SLOT(slotShowList()));
84  connect(editFilter, SIGNAL(clicked()), this, SLOT(slotEditFilter()));
85 
86  connect(automaticFiltersListWidget, SIGNAL(itemChanged(QListWidgetItem*)), this, SLOT(hasChanged()));
87  connect(automaticFiltersListWidget, SIGNAL(currentItemChanged(QListWidgetItem*,QListWidgetItem*)), this, SLOT(slotUpdateButtons()));
88  connect(automaticFiltersListWidget, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(slotAutomaticFilterDouble(QListWidgetItem*)));
89 
90  connect(importFilters, SIGNAL(clicked()), SLOT(slotImportFilters()));
91  connect(exportFilters, SIGNAL(clicked()), SLOT(slotExportFilters()));
92  connect(addFilterLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotManualFilterLineEditTextChanged(QString)));
93  slotUpdateManualButtons();
94  insertButton->setEnabled(false);
95 }
96 
97 void AdBlockSettingWidget::slotManualFilterLineEditTextChanged(const QString &text)
98 {
99  insertButton->setEnabled(!text.isEmpty());
100 }
101 
102 void AdBlockSettingWidget::slotEditFilter()
103 {
104  QListWidgetItem *item = manualFiltersListWidget->currentItem();
105  if (item) {
106  manualFiltersListWidget->editItem(item);
107  }
108 }
109 
110 void AdBlockSettingWidget::slotUpdateButtons()
111 {
112  const bool enabled = automaticFiltersListWidget->currentItem();
113  removeSubscription->setEnabled(enabled);
114  showList->setEnabled(enabled);
115 }
116 
117 void AdBlockSettingWidget::slotUpdateManualButtons()
118 {
119  const bool enabled = manualFiltersListWidget->currentItem();
120  removeButton->setEnabled(enabled);
121  editFilter->setEnabled(enabled);
122  exportFilters->setEnabled(manualFiltersListWidget->count()>0);
123 }
124 
125 void AdBlockSettingWidget::slotInfoLinkActivated(const QString &url)
126 {
127  Q_UNUSED(url)
128 
129  const QString hintHelpString = i18n("<qt><p>Enter an expression to filter. Filters can be defined as either:"
130  "<ul><li>a shell-style wildcard, e.g. <tt>http://www.example.com/ads*</tt>, "
131  "the wildcards <tt>*?[]</tt> may be used</li>"
132  "<li>a full regular expression by surrounding the string with '<tt>/</tt>', "
133  "e.g. <tt>/\\/(ad|banner)\\./</tt></li></ul>"
134  "<p>Any filter string can be preceded by '<tt>@@</tt>' to whitelist (allow) any matching URL, "
135  "which takes priority over any blacklist (blocking) filter.");
136 
137  QWhatsThis::showText(QCursor::pos(), hintHelpString);
138 }
139 
140 
141 void AdBlockSettingWidget::insertRule()
142 {
143  const QString rule = addFilterLineEdit->text();
144  if (rule.isEmpty())
145  return;
146  const int numberItem(manualFiltersListWidget->count());
147  for (int i = 0; i < numberItem; ++i) {
148  if (manualFiltersListWidget->item(i)->text() == rule) {
149  addFilterLineEdit->clear();
150  return;
151  }
152  }
153 
154  addManualFilter(rule);
155  exportFilters->setEnabled(manualFiltersListWidget->count()>0);
156  addFilterLineEdit->clear();
157  hasChanged();
158 }
159 
160 
161 void AdBlockSettingWidget::removeRule()
162 {
163  QList<QListWidgetItem *> select = manualFiltersListWidget->selectedItems();
164  if (select.isEmpty()) {
165  return;
166  }
167  Q_FOREACH (QListWidgetItem *item, select) {
168  delete item;
169  }
170  exportFilters->setEnabled(manualFiltersListWidget->count()>0);
171  hasChanged();
172 }
173 
174 void AdBlockSettingWidget::doResetToDefaultsOther()
175 {
176  const bool bUseDefaults = MessageViewer::GlobalSettings::self()->useDefaults( true );
177  checkEnableAdblock->setChecked(GlobalSettings::self()->adBlockEnabled());
178  tabWidget->setEnabled(GlobalSettings::self()->adBlockEnabled());
179  checkHideAds->setChecked(GlobalSettings::self()->hideAdsEnabled());
180  const int days = GlobalSettings::self()->adBlockUpdateInterval();
181  spinBox->setValue(days);
182  MessageViewer::GlobalSettings::self()->useDefaults( bUseDefaults );
183 }
184 
185 void AdBlockSettingWidget::doLoadFromGlobalSettings()
186 {
187  manualFiltersListWidget->clear();
188  automaticFiltersListWidget->clear();
189  checkEnableAdblock->setChecked(GlobalSettings::self()->adBlockEnabled());
190 
191  // update enabled status
192  tabWidget->setEnabled(GlobalSettings::self()->adBlockEnabled());
193  checkHideAds->setChecked(GlobalSettings::self()->hideAdsEnabled());
194  const int days = GlobalSettings::self()->adBlockUpdateInterval();
195  spinBox->setValue(days);
196 
197  // ------------------------------------------------------------------------------
198 
199  // automatic filters
200  KConfig config(QLatin1String("messagevieweradblockrc"));
201 
202  const QStringList itemList = config.groupList().filter( QRegExp( QLatin1String("FilterList \\d+") ) );
203  Q_FOREACH(const QString &item, itemList) {
204  KConfigGroup filtersGroup(&config, item);
205  const bool isFilterEnabled = filtersGroup.readEntry(QLatin1String("FilterEnabled"), false);
206  const QString url = filtersGroup.readEntry(QLatin1String("url"));
207  const QString path = filtersGroup.readEntry(QLatin1String("path"));
208  const QString name = filtersGroup.readEntry(QLatin1String("name"));
209  const QDateTime lastUpdate = filtersGroup.readEntry(QLatin1String("lastUpdate"), QDateTime());
210  if (url.isEmpty() || path.isEmpty() || name.isEmpty())
211  continue;
212 
213  QListWidgetItem *subItem = new QListWidgetItem(automaticFiltersListWidget);
214  subItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsUserCheckable| Qt::ItemIsSelectable | Qt::ItemIsDragEnabled);
215  if (isFilterEnabled)
216  subItem->setCheckState(Qt::Checked);
217  else
218  subItem->setCheckState(Qt::Unchecked);
219 
220  subItem->setData(UrlList, url);
221  subItem->setData(PathList, path);
222  subItem->setData(LastUpdateList, lastUpdate);
223  subItem->setText(name);
224  }
225 
226  // ------------------------------------------------------------------------------
227 
228  // local filters
229  const QString localRulesFilePath = KStandardDirs::locateLocal("appdata" , QLatin1String("adblockrules_local"));
230 
231  QFile ruleFile(localRulesFilePath);
232  if (!ruleFile.open(QFile::ReadOnly | QFile::Text)) {
233  kDebug() << "Unable to open rule file" << localRulesFilePath;
234  return;
235  }
236 
237  QTextStream in(&ruleFile);
238  while (!in.atEnd()) {
239  QString stringRule = in.readLine();
240  addManualFilter(stringRule);
241  }
242 }
243 
244 
245 void AdBlockSettingWidget::save()
246 {
247  if (!mChanged)
248  return;
249 
250  // General settings
251  GlobalSettings::self()->setHideAdsEnabled(checkHideAds->isChecked());
252  GlobalSettings::self()->setAdBlockEnabled(checkEnableAdblock->isChecked());
253  GlobalSettings::self()->setAdBlockUpdateInterval(spinBox->value());
254 
255  // automatic filters
256  KConfig config(QLatin1String("messagevieweradblockrc"));
257  const QStringList list = config.groupList().filter( QRegExp( QLatin1String("FilterList \\d+") ) );
258  foreach ( const QString &group, list ) {
259  config.deleteGroup( group );
260  }
261 
262  const int numberItem(automaticFiltersListWidget->count());
263  for (int i = 0; i < numberItem; ++i) {
264  QListWidgetItem *subItem = automaticFiltersListWidget->item(i);
265  KConfigGroup grp = config.group(QString::fromLatin1("FilterList %1").arg(i));
266  grp.writeEntry(QLatin1String("FilterEnabled"), subItem->checkState() == Qt::Checked);
267  grp.writeEntry(QLatin1String("url"), subItem->data(UrlList).toString());
268  grp.writeEntry(QLatin1String("name"), subItem->text());
269  grp.writeEntry(QLatin1String("lastUpdate"), subItem->data(LastUpdateList).toDateTime());
270  QString path = subItem->data(PathList).toString();
271  if (path.isEmpty()) {
272  path = KStandardDirs::locateLocal("appdata", QString::fromLatin1("adblockrules-%1").arg(i));
273  }
274  grp.writeEntry(QLatin1String("path"), path);
275  }
276 
277  config.sync();
278  // local filters
279  const QString localRulesFilePath = KStandardDirs::locateLocal("appdata" , QLatin1String("adblockrules_local"));
280 
281  QFile ruleFile(localRulesFilePath);
282  if (!ruleFile.open(QFile::WriteOnly | QFile::Text)) {
283  kDebug() << "Unable to open rule file" << localRulesFilePath;
284  return;
285  }
286 
287  QTextStream out(&ruleFile);
288  for (int i = 0; i < manualFiltersListWidget->count(); ++i) {
289  QListWidgetItem *subItem = manualFiltersListWidget->item(i);
290  const QString stringRule = subItem->text();
291  if (!stringRule.trimmed().isEmpty())
292  out << stringRule << '\n';
293  }
294 
295  // -------------------------------------------------------------------------------
296  mChanged = false;
297  emit changed(false);
298  AdBlockManager::self()->reloadConfig();
299 }
300 
301 
302 void AdBlockSettingWidget::hasChanged()
303 {
304  // update enabled status
305  checkHideAds->setEnabled(checkEnableAdblock->isChecked());
306  tabWidget->setEnabled(checkEnableAdblock->isChecked());
307  mChanged = true;
308  emit changed(true);
309 }
310 
311 
312 bool AdBlockSettingWidget::changed() const
313 {
314  return mChanged;
315 }
316 
317 void AdBlockSettingWidget::slotAddFilter()
318 {
319  QStringList excludeList;
320  const int numberItem(automaticFiltersListWidget->count());
321  for (int i = 0; i < numberItem; ++i) {
322  excludeList << automaticFiltersListWidget->item(i)->text();
323  }
324  QPointer<MessageViewer::AdBlockAddSubscriptionDialog> dlg = new MessageViewer::AdBlockAddSubscriptionDialog(excludeList, this);
325  if (dlg->exec()) {
326  QString name;
327  QString url;
328  dlg->selectedList(name, url);
329  QListWidgetItem *subItem = new QListWidgetItem(automaticFiltersListWidget);
330  subItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsUserCheckable | Qt::ItemIsSelectable | Qt::ItemIsDragEnabled);
331  subItem->setCheckState(Qt::Checked);
332  subItem->setText(name);
333  subItem->setData(UrlList, url);
334  subItem->setData(LastUpdateList, QDateTime());
335  subItem->setData(PathList, QString());
336  hasChanged();
337  }
338  delete dlg;
339 }
340 
341 void AdBlockSettingWidget::slotRemoveSubscription()
342 {
343  QListWidgetItem *item = automaticFiltersListWidget->currentItem();
344  if (item) {
345  if (KMessageBox::questionYesNo(this, i18n("Do you want to delete list \"%1\"?", item->text()), i18n("Delete current list")) == KMessageBox::Yes) {
346  const QString path = item->data(PathList).toString();
347  if (!path.isEmpty()) {
348  if (!QFile(path).remove())
349  qDebug()<<" we can not remove file:"<<path;
350  }
351  delete item;
352  }
353  hasChanged();
354  }
355 }
356 
357 void AdBlockSettingWidget::slotShowList()
358 {
359  showAutomaticFilterList(automaticFiltersListWidget->currentItem());
360 }
361 
362 void AdBlockSettingWidget::showAutomaticFilterList(QListWidgetItem *item)
363 {
364  if (item) {
365  QPointer<AdBlockShowListDialog> dlg = new AdBlockShowListDialog(this);
366  dlg->setAdBlockListPath(item->data(PathList).toString(), item->data(UrlList).toString());
367  dlg->exec();
368  delete dlg;
369  }
370 }
371 
372 void AdBlockSettingWidget::slotImportFilters()
373 {
374  const QString filter = i18n( "*|all files (*)" );
375  const QString result = PimCommon::Util::loadToFile(filter, this);
376  if (result.isEmpty()) {
377  return;
378  }
379  const QStringList listFilter = result.split(QLatin1Char('\n'));
380  QStringList excludeFilter;
381  const int numberOfElement(manualFiltersListWidget->count());
382  for (int i = 0; i < numberOfElement; ++i) {
383  QListWidgetItem *subItem = manualFiltersListWidget->item(i);
384  excludeFilter.append(subItem->text());
385  }
386 
387  Q_FOREACH (const QString &element, listFilter) {
388  if (element == QLatin1String("\n"))
389  continue;
390  if (excludeFilter.contains(element))
391  continue;
392  addManualFilter(element);
393  }
394 }
395 
396 void AdBlockSettingWidget::addManualFilter(const QString &text)
397 {
398  QListWidgetItem *subItem = new QListWidgetItem(manualFiltersListWidget);
399  subItem->setFlags(subItem->flags() | Qt::ItemIsEditable);
400  subItem->setText(text);
401 }
402 
403 void AdBlockSettingWidget::slotExportFilters()
404 {
405  const QString filter = i18n( "*|all files (*)" );
406  QString exportFilters;
407  const int numberOfElement(manualFiltersListWidget->count());
408  for (int i = 0; i < numberOfElement; ++i) {
409  QListWidgetItem *subItem = manualFiltersListWidget->item(i);
410  const QString stringRule = subItem->text();
411  if (!stringRule.isEmpty())
412  exportFilters += stringRule + QLatin1Char('\n');
413  }
414  PimCommon::Util::saveTextAs(exportFilters, filter, this);
415 }
416 
417 void AdBlockSettingWidget::slotAutomaticFilterDouble(QListWidgetItem *item)
418 {
419  showAutomaticFilterList(item);
420 }
421 
422 #include "adblocksettingwidget.moc"
globalsettings.h
MessageViewer::AdBlockSettingWidget::changed
bool changed() const
Definition: adblocksettingwidget.cpp:312
MessageViewer::AdBlockAddSubscriptionDialog
Definition: adblockaddsubscriptiondialog.h:27
MessageViewer::AdBlockSettingWidget
Definition: adblocksettingwidget.h:38
QWidget
adblocksettingwidget.h
adblockaddsubscriptiondialog.h
adblockmanager.h
MessageViewer::AdBlockSettingWidget::AdBlockSettingWidget
AdBlockSettingWidget(QWidget *parent=0)
Definition: adblocksettingwidget.cpp:53
MessageViewer::GlobalSettings::self
static GlobalSettings * self()
Definition: globalsettings.cpp:34
MessageViewer::AdBlockManager::reloadConfig
void reloadConfig()
Definition: adblockmanager.cpp:94
MessageViewer::AdBlockManager::self
static AdBlockManager * self()
Entry point.
Definition: adblockmanager.cpp:55
MessageViewer::AdBlockSettingWidget::doLoadFromGlobalSettings
void doLoadFromGlobalSettings()
Definition: adblocksettingwidget.cpp:185
adblockshowlistdialog.h
MessageViewer::AdBlockSettingWidget::doResetToDefaultsOther
void doResetToDefaultsOther()
Definition: adblocksettingwidget.cpp:174
MessageViewer::AdBlockShowListDialog
Definition: adblockshowlistdialog.h:35
MessageViewer::AdBlockSettingWidget::save
void save()
Definition: adblocksettingwidget.cpp:245
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:55:57 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

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