diff options
author | toma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2009-11-25 17:56:58 +0000 |
---|---|---|
committer | toma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2009-11-25 17:56:58 +0000 |
commit | 4aed2c8219774f5d797760606b8489a92ddc5163 (patch) | |
tree | 3f8c130f7d269626bf6a9447407ef6c35954426a /kcontrol/konqhtml/filteropts.cpp | |
download | tdebase-4aed2c8219774f5d797760606b8489a92ddc5163.tar.gz tdebase-4aed2c8219774f5d797760606b8489a92ddc5163.zip |
Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features.
BUG:215923
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdebase@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'kcontrol/konqhtml/filteropts.cpp')
-rw-r--r-- | kcontrol/konqhtml/filteropts.cpp | 327 |
1 files changed, 327 insertions, 0 deletions
diff --git a/kcontrol/konqhtml/filteropts.cpp b/kcontrol/konqhtml/filteropts.cpp new file mode 100644 index 000000000..a1a68b63e --- /dev/null +++ b/kcontrol/konqhtml/filteropts.cpp @@ -0,0 +1,327 @@ +/* + Copyright (C) 2005 Ivor Hewitt <ivor@ivor.org> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +#include <kconfig.h> +#include <klocale.h> +#include <kglobal.h> +#include <kaboutdata.h> +#include <kfiledialog.h> +#include <dcopclient.h> + +#include <qlayout.h> +#include <qlistbox.h> +#include <qpushbutton.h> +#include <qgroupbox.h> +#include <qhbox.h> +#include <qvbox.h> +#include <qlineedit.h> +#include <qlabel.h> +#include <qcheckbox.h> +#include <qwhatsthis.h> +#include <qregexp.h> + +#include "filteropts.h" +#include "filteropts.moc" + +KCMFilter::KCMFilter(KConfig *config, QString group, + QWidget *parent, const char * ) + : KCModule( parent, "kcmkonqhtml" ), + mConfig( config ), + mGroupname( group ), + mSelCount(0) +{ + setButtons(Default|Apply); + + QVBoxLayout *topLayout = new QVBoxLayout(this, 0, KDialog::spacingHint()); + + mEnableCheck = new QCheckBox(i18n("Enable filters"), this); + topLayout->addWidget( mEnableCheck ); + + mKillCheck = new QCheckBox(i18n("Hide filtered images"), this); + topLayout->addWidget( mKillCheck ); + + QGroupBox *topBox = new QGroupBox( 1, Horizontal, i18n("URL Expressions to Filter"), this ); + topLayout->addWidget( topBox ); + + mListBox = new QListBox( topBox ); + mListBox->setSelectionMode(QListBox::Extended); + new QLabel( i18n("Expression (e.g. http://www.site.com/ad/*):"), topBox); + mString = new QLineEdit( topBox ); + + QHBox *buttonBox = new QHBox( topBox ); + buttonBox->setSpacing( KDialog::spacingHint() ); + + mInsertButton = new QPushButton( i18n("Insert"), buttonBox ); + connect( mInsertButton, SIGNAL( clicked() ), SLOT( insertFilter() ) ); + mUpdateButton = new QPushButton( i18n("Update"), buttonBox ); + connect( mUpdateButton, SIGNAL( clicked() ), SLOT( updateFilter() ) ); + mRemoveButton = new QPushButton( i18n("Remove"), buttonBox ); + connect( mRemoveButton, SIGNAL( clicked() ), SLOT( removeFilter() ) ); + + mImportButton = new QPushButton(i18n("Import..."),buttonBox); + connect( mImportButton, SIGNAL( clicked() ), SLOT( importFilters() ) ); + mExportButton = new QPushButton(i18n("Export..."),buttonBox); + connect( mExportButton, SIGNAL( clicked() ), SLOT( exportFilters() ) ); + + connect( mEnableCheck, SIGNAL( clicked()), this, SLOT( slotEnableChecked())); + connect( mKillCheck, SIGNAL( clicked()), this, SLOT( slotKillChecked())); + connect( mListBox, SIGNAL( selectionChanged ()),this, SLOT( slotItemSelected())); + +/* + * Whats this items + */ + QWhatsThis::add( mEnableCheck, i18n("Enable or disable AdBlocK filters. When enabled a set of expressions " + "to be blocked should be defined in the filter list for blocking to " + "take effect.")); + QWhatsThis::add( mKillCheck, i18n("When enabled blocked images will be removed from the page completely " + "otherwise a placeholder 'blocked' image will be used.")); + QWhatsThis::add( mListBox, i18n("This is the list of URL filters that will be applied to all linked " + "images and frames. The filters are processed in order so place " + "more generic filters towards the top of the list.")); + QWhatsThis::add( mString, i18n("Enter an expression to filter. Expressions can be defined as either " + "a filename style wildcard e.g. http://www.site.com/ads* or as a full " + "regular expression by surrounding the string with '/' e.g. " + " //(ad|banner)\\./")); + load(); + updateButton(); +} + +KCMFilter::~KCMFilter() +{ + delete mConfig; +} + +void KCMFilter::slotKillChecked() +{ + emit changed( true ); +} + +void KCMFilter::slotEnableChecked() +{ + updateButton(); + emit changed( true ); +} + +void KCMFilter::slotItemSelected() +{ + int currentId=-1; + unsigned int i; + for( i=0,mSelCount=0; i < mListBox->count() && mSelCount<2; ++i ) + { + if (mListBox->isSelected(i)) + { + currentId=i; + mSelCount++; + } + } + + if ( currentId >= 0 ) + { + mString->setText(mListBox->text(currentId)); + } + updateButton(); +} + +void KCMFilter::updateButton() +{ + bool state = mEnableCheck->isChecked(); + + mUpdateButton->setEnabled(state && (mSelCount == 1)); + mRemoveButton->setEnabled(state && (mSelCount > 0)); + mInsertButton->setEnabled(state); + mImportButton->setEnabled(state); + mExportButton->setEnabled(state); + + mListBox->setEnabled(state); + mString->setEnabled(state); + mKillCheck->setEnabled(state); +} + +void KCMFilter::importFilters() +{ + QString inFile = KFileDialog::getOpenFileName(); + if (inFile.length() > 0) + { + QFile f(inFile); + if ( f.open( IO_ReadOnly ) ) + { + QTextStream ts( &f ); + QStringList paths; + QString line; + while (!ts.atEnd()) + { + line = ts.readLine(); + if (line.lower().compare("[adblock]") == 0) + continue; + + // Treat leading ! as filter comment, otherwise check expressions + // are valid. + if (!line.startsWith("!")) + { + if (line.length()>2 && line[0]=='/' && line[line.length()-1] == '/') + { + QString inside = line.mid(1, line.length()-2); + QRegExp rx(inside); + if (!rx.isValid()) + continue; + } + else + { + QRegExp rx(line); + rx.setWildcard(true); + if (!rx.isValid()) + continue; + } + } + + if (!line.isEmpty() && mListBox->findItem(line, Qt::CaseSensitive|Qt::ExactMatch) == 0) + paths.append(line); + } + f.close(); + + mListBox->insertStringList( paths ); + emit changed(true); + } + } +} + +void KCMFilter::exportFilters() +{ + QString outFile = KFileDialog::getSaveFileName(); + if (outFile.length() > 0) + { + QFile f(outFile); + if ( f.open( IO_WriteOnly ) ) + { + QTextStream ts( &f ); + ts.setEncoding( QTextStream::UnicodeUTF8 ); + ts << "[AdBlock]" << endl; + + uint i; + for( i = 0; i < mListBox->count(); ++i ) + ts << mListBox->text(i) << endl; + + f.close(); + } + } +} + +void KCMFilter::defaults() +{ + load( true ); +} + +void KCMFilter::save() +{ + mConfig->deleteGroup(mGroupname); + mConfig->setGroup(mGroupname); + + mConfig->writeEntry("Enabled",mEnableCheck->isChecked()); + mConfig->writeEntry("Shrink",mKillCheck->isChecked()); + + uint i; + for( i = 0; i < mListBox->count(); ++i ) + { + QString key = "Filter-" + QString::number(i); + mConfig->writeEntry(key, mListBox->text(i)); + } + mConfig->writeEntry("Count",mListBox->count()); + + mConfig->sync(); + DCOPClient::mainClient()->send("konqueror*","KonquerorIface","reparseConfiguration()",QByteArray()); + +} +void KCMFilter::load() +{ + load( false ); +} + +void KCMFilter::load( bool useDefaults ) +{ + QStringList paths; + + mConfig->setReadDefaults( useDefaults ); + + mConfig->setGroup( mGroupname ); + mEnableCheck->setChecked( mConfig->readBoolEntry("Enabled",false)); + mKillCheck->setChecked( mConfig->readBoolEntry("Shrink",false)); + + QMap<QString,QString> entryMap = mConfig->entryMap( mGroupname ); + QMap<QString,QString>::ConstIterator it; + int num = mConfig->readNumEntry("Count",0); + for (int i=0; i<num; ++i) + { + QString key = "Filter-" + QString::number(i); + it = entryMap.find(key); + if (it != entryMap.end()) + paths.append(it.data()); + } + + mListBox->insertStringList( paths ); + + emit changed( useDefaults ); +} + +void KCMFilter::insertFilter() +{ + if ( !mString->text().isEmpty() ) + { + mListBox->insertItem( mString->text() ); + int id=mListBox->count()-1; + mListBox->clearSelection(); + mListBox->setSelected(id,true); + mListBox->setCurrentItem(id); + mListBox->ensureCurrentVisible(); + mString->clear(); + emit changed( true ); + } + updateButton(); +} + +void KCMFilter::removeFilter() +{ + for( int i = mListBox->count(); i >= 0; --i ) + { + if (mListBox->isSelected(i)) + mListBox->removeItem(i); + } + mString->clear(); + emit changed( true ); + updateButton(); +} + +void KCMFilter::updateFilter() +{ + if ( !mString->text().isEmpty() ) + { + int index = mListBox->currentItem(); + if ( index >= 0 ) + { + mListBox->changeItem( mString->text(), index ); + emit changed( true ); + } + } + updateButton(); +} + +QString KCMFilter::quickHelp() const +{ + return i18n("<h1>Konqueror AdBlocK</h1> Konqueror AdBlocK allows you to create a list of filters" + " that are checked against linked images and frames. URL's that match are either discarded or" + " replaced with a placeholder image. "); +} |