diff options
| author | Rahman Duran <[email protected]> | 2009-03-25 22:00:50 +0000 |
|---|---|---|
| committer | Rahman Duran <[email protected]> | 2009-03-25 22:00:50 +0000 |
| commit | bd2f7179de1b42399b5f04ef65221e8e81250392 (patch) | |
| tree | 3ed1e361a19414eeb5049c2c079e161a5d9ebb0c /src/dolphinremoteencoding.cpp | |
| parent | 750bb9e12c9ef1ef85e93535e619f91f17ae04cc (diff) | |
BUG: 175658
GUI:
The remote encoding code adapted from Konqueror to Dolphin. Now user can change
encoding for remote urls like ftp. Konqueror doesn't use
KRemoteEncodingPlugin anymore. Instead, this feature is supplied to
Konqueror via DolphinPart.
svn path=/trunk/KDE/kdebase/apps/; revision=944659
Diffstat (limited to 'src/dolphinremoteencoding.cpp')
| -rw-r--r-- | src/dolphinremoteencoding.cpp | 354 |
1 files changed, 169 insertions, 185 deletions
diff --git a/src/dolphinremoteencoding.cpp b/src/dolphinremoteencoding.cpp index dc804a05a..397eaccc0 100644 --- a/src/dolphinremoteencoding.cpp +++ b/src/dolphinremoteencoding.cpp @@ -1,30 +1,30 @@ -/* - Copyright (c) 2003 Thiago Macieira <[email protected]> - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public - License (LGPL) as published by the Free Software Foundation; - either version 2 of the License, or (at your option) any later - version. - - This library 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public License - along with this library; see the file COPYING.LIB. If not, write to - the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. -*/ - -/* - * This code is largely based on the UserAgent changer plugin (uachanger) - * Copyright © 2001 Dawit Alemayehu <[email protected]> +/*************************************************************************** + * Copyright (C) 2009 by Rahman Duran <[email protected]> * + * * + * 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 * + ***************************************************************************/ + + /* + * This code is largely based on the kremoteencodingplugin + * Copyright (c) 2003 Thiago Macieira <[email protected]> * Distributed under the same terms. */ - -#include "kremoteencodingplugin.h" + +#include "dolphinremoteencoding.h" +#include "dolphinviewactionhandler.h" #include <kdebug.h> #include <kactionmenu.h> @@ -36,222 +36,206 @@ #include <kconfig.h> #include <kcharsets.h> #include <kmenu.h> -#include <kgenericfactory.h> #include <kprotocolinfo.h> #include <kprotocolmanager.h> #include <kio/slaveconfig.h> #include <kio/scheduler.h> -#include <kparts/browserextension.h> #include <kconfiggroup.h> -#define DATA_KEY QLatin1String("Charset") +#define DATA_KEY QLatin1String("Charset") -KRemoteEncodingPlugin::KRemoteEncodingPlugin(QObject * parent, - const QStringList &) - : KParts::Plugin(parent), m_loaded(false), m_idDefault(0) +DolphinRemoteEncoding::DolphinRemoteEncoding(QObject* parent, DolphinViewActionHandler* actionHandler) + :QObject(parent), + m_actionHandler(actionHandler), + m_loaded(false), + m_idDefault(0) { - m_menu = new KActionMenu(KIcon("character-set"), i18n("Select Remote Charset"), this); - actionCollection()->addAction("changeremoteencoding", m_menu); - connect(m_menu->menu(), SIGNAL(aboutToShow()), - this, SLOT(slotAboutToShow())); - m_menu->setEnabled(false); - m_menu->setDelayed(false); + m_menu = new KActionMenu(KIcon("character-set"), i18n("Select Remote Charset"), this); + m_actionHandler->actionCollection()->addAction("change_remote_encoding", m_menu); + connect(m_menu->menu(), SIGNAL(aboutToShow()), + this, SLOT(slotAboutToShow())); - m_part = qobject_cast<KParts::ReadOnlyPart*>(parent); - if (m_part) { - // if parent is not a part, our menu will never show - connect(m_part, SIGNAL(aboutToOpenURL()), - this, SLOT(slotAboutToOpenURL())); - m_part->installEventFilter(this); - } + m_menu->setEnabled(false); + m_menu->setDelayed(false); } -KRemoteEncodingPlugin::~KRemoteEncodingPlugin() +DolphinRemoteEncoding::~DolphinRemoteEncoding() { } -void -KRemoteEncodingPlugin::slotReload() +void DolphinRemoteEncoding::slotReload() { - loadSettings(); + loadSettings(); } -void -KRemoteEncodingPlugin::loadSettings() +void DolphinRemoteEncoding::loadSettings() { - m_loaded = true; - - m_encodingDescriptions = KGlobal::charsets()->descriptiveEncodingNames(); + m_loaded = true; + m_encodingDescriptions = KGlobal::charsets()->descriptiveEncodingNames(); - fillMenu(); + fillMenu(); } -void -KRemoteEncodingPlugin::slotAboutToOpenURL() +void DolphinRemoteEncoding::slotAboutToOpenUrl() { - KUrl oldURL = m_currentURL; - m_currentURL = m_part->url(); + KUrl oldURL = m_currentURL; + m_currentURL = m_actionHandler->currentView()->url(); - if (m_currentURL.protocol() != oldURL.protocol()) - { - // This plugin works on ftp, fish, etc. - // everything whose type is T_FILESYSTEM except for local files - if (!m_currentURL.isLocalFile() && - KProtocolManager::outputType(m_currentURL) == KProtocolInfo::T_FILESYSTEM) - { - m_menu->setEnabled(true); - loadSettings(); - } - else - m_menu->setEnabled(false); - - return; + if (m_currentURL.protocol() != oldURL.protocol()) { + // This plugin works on ftp, fish, etc. + // everything whose type is T_FILESYSTEM except for local files + if (!m_currentURL.isLocalFile() && + KProtocolManager::outputType(m_currentURL) == KProtocolInfo::T_FILESYSTEM) { + + m_menu->setEnabled(true); + loadSettings(); + } else { + m_menu->setEnabled(false); + } + return; } - if (m_currentURL.host() != oldURL.host()) - updateMenu(); + if (m_currentURL.host() != oldURL.host()) { + updateMenu(); + } } -void -KRemoteEncodingPlugin::fillMenu() +void DolphinRemoteEncoding::fillMenu() { - KMenu *menu = m_menu->menu(); - menu->clear(); + KMenu* menu = m_menu->menu(); + menu->clear(); - QStringList::ConstIterator it; - int count = 0; - for (it = m_encodingDescriptions.constBegin(); it != m_encodingDescriptions.constEnd(); ++it) - menu->insertItem(*it, this, SLOT(slotItemSelected(int)), 0, ++count); - menu->addSeparator(); + + for (int i = 0; i < m_encodingDescriptions.size();i++) { + QAction* action = new QAction(m_encodingDescriptions.at(i), this); + action->setCheckable(true); + action->setData(i); + menu->addAction(action); + } + menu->addSeparator(); - menu->insertItem(i18n("Reload"), this, SLOT(slotReload()), 0, ++count); - menu->insertItem(i18n("Default"), this, SLOT(slotDefault()), 0, ++count); - m_idDefault = count; + menu->addAction(i18n("Reload"), this, SLOT(slotReload()), 0); + menu->addAction(i18n("Default"), this, SLOT(slotDefault()), 0)->setCheckable(true); + m_idDefault = m_encodingDescriptions.size() + 2; + + connect(menu, SIGNAL(triggered(QAction*)), this, SLOT(slotItemSelected(QAction*))); } -void -KRemoteEncodingPlugin::updateMenu() +void DolphinRemoteEncoding::updateMenu() { - if (!m_loaded) - loadSettings(); - - // uncheck everything - for (unsigned i = 0; i < m_menu->menu()->actions().count(); i++) - m_menu->menu()->setItemChecked(m_menu->menu()->idAt(i), false); - - QString charset = KIO::SlaveConfig::self()->configData(m_currentURL.protocol(), m_currentURL.host(), - DATA_KEY); - if (!charset.isEmpty()) - { - int id = 1; - QStringList::const_iterator it; - for (it = m_encodingDescriptions.constBegin(); it != m_encodingDescriptions.constEnd(); ++it, ++id) - if ((*it).indexOf(charset) != -1) - break; + if (!m_loaded) { + loadSettings(); + } + + // uncheck everything + for (int i = 0; i < m_menu->menu()->actions().count(); i++) { + m_menu->menu()->actions().at(i)->setChecked(false); + } + + QString charset = KIO::SlaveConfig::self()->configData(m_currentURL.protocol(), + m_currentURL.host(), DATA_KEY); - kDebug() << "URL=" << m_currentURL << " charset=" << charset; + if (!charset.isEmpty()) { + int id = 0; + bool isFound = false; + for (int i = 0; i < m_encodingDescriptions.size(); i++) { + if (m_encodingDescriptions.at(i).contains(charset)) { + isFound = true; + id = i; + break; + } + } + + kDebug() << "URL=" << m_currentURL << " charset=" << charset; - if (it == m_encodingDescriptions.constEnd()) - kWarning() << "could not find entry for charset=" << charset ; - else - m_menu->menu()->setItemChecked(id, true); + if (!isFound) { + kWarning() << "could not find entry for charset=" << charset ; + } else { + m_menu->menu()->actions().at(id)->setChecked(true); + } + } else { + m_menu->menu()->actions().at(m_idDefault)->setChecked(true); } - else - m_menu->menu()->setItemChecked(m_idDefault, true); + } -void -KRemoteEncodingPlugin::slotAboutToShow() +void DolphinRemoteEncoding::slotAboutToShow() { - if (!m_loaded) - loadSettings(); - updateMenu(); + if (!m_loaded) { + loadSettings(); + } + updateMenu(); } -void -KRemoteEncodingPlugin::slotItemSelected(int id) +void DolphinRemoteEncoding::slotItemSelected(QAction* action) { - KConfig config(("kio_" + m_currentURL.protocol() + "rc").toLatin1()); - QString host = m_currentURL.host(); - if ( m_menu->menu()->isItemChecked(id) ) - { - QString charset = KGlobal::charsets()->encodingForName(m_encodingDescriptions[id - 1]); - KConfigGroup cg(&config, host); - cg.writeEntry(DATA_KEY, charset); - config.sync(); - // Update the io-slaves... - updateBrowser(); + if (action != 0) { + int id = action->data().toInt(); + + KConfig config(("kio_" + m_currentURL.protocol() + "rc").toLatin1()); + QString host = m_currentURL.host(); + if (m_menu->menu()->actions().at(id)->isChecked()) { + QString charset = KGlobal::charsets()->encodingForName(m_encodingDescriptions.at(id)); + KConfigGroup cg(&config, host); + cg.writeEntry(DATA_KEY, charset); + config.sync(); + + // Update the io-slaves... + updateView(); + } } } -void -KRemoteEncodingPlugin::slotDefault() +void DolphinRemoteEncoding::slotDefault() { - // We have no choice but delete all higher domain level - // settings here since it affects what will be matched. - KConfig config(("kio_" + m_currentURL.protocol() + "rc").toLatin1()); + // We have no choice but delete all higher domain level + // settings here since it affects what will be matched. + KConfig config(("kio_" + m_currentURL.protocol() + "rc").toLatin1()); - QStringList partList = m_currentURL.host().split('.', QString::SkipEmptyParts); - if (!partList.isEmpty()) - { - partList.erase(partList.begin()); + QStringList partList = m_currentURL.host().split('.', QString::SkipEmptyParts); + if (!partList.isEmpty()) { + partList.erase(partList.begin()); - QStringList domains; - // Remove the exact name match... - domains << m_currentURL.host(); + QStringList domains; + // Remove the exact name match... + domains << m_currentURL.host(); - while (partList.count()) - { - if (partList.count() == 2) - if (partList[0].length() <= 2 && partList[1].length() == 2) - break; + while (partList.count()) { + if (partList.count() == 2) { + if (partList[0].length() <= 2 && partList[1].length() == 2) { + break; + } + } - if (partList.count() == 1) - break; + if (partList.count() == 1) { + break; + } - domains << partList.join("."); - partList.erase(partList.begin()); - } + domains << partList.join("."); + partList.erase(partList.begin()); + } - for (QStringList::const_iterator it = domains.constBegin(); it != domains.constEnd(); - ++it) - { - kDebug() << "Domain to remove: " << *it; - if (config.hasGroup(*it)) - config.deleteGroup(*it); - else if (config.group("").hasKey(*it)) - config.group("").deleteEntry(*it); //don't know what group name is supposed to be XXX - } + for (QStringList::const_iterator it = domains.constBegin(); it != domains.constEnd();++it) { + kDebug() << "Domain to remove: " << *it; + if (config.hasGroup(*it)) { + config.deleteGroup(*it); + } else if (config.group("").hasKey(*it)) { + config.group("").deleteEntry(*it); //don't know what group name is supposed to be XXX + } + } } - config.sync(); - - // Update the io-slaves. - updateBrowser(); -} + config.sync(); -void -KRemoteEncodingPlugin::updateBrowser() -{ - KIO::Scheduler::emitReparseSlaveConfiguration(); - // Reload the page with the new charset - KParts::OpenUrlArguments args = m_part->arguments(); - args.setReload( true ); - m_part->setArguments( args ); - m_part->openUrl(m_currentURL); + // Update the io-slaves. + updateView(); } -bool KRemoteEncodingPlugin::eventFilter(QObject*obj, QEvent *ev) +void DolphinRemoteEncoding::updateView() { - if (obj == m_part && KParts::OpenUrlEvent::test(ev)) { - const QString mimeType = m_part->arguments().mimeType(); - if (!mimeType.isEmpty() && KMimeType::mimeType(mimeType)->is("inode/directory")) - slotAboutToOpenURL(); - } - return KParts::Plugin::eventFilter(obj, ev); + KIO::Scheduler::emitReparseSlaveConfiguration(); + // Reload the page with the new charset + m_actionHandler->currentView()->setUrl(m_currentURL); + m_actionHandler->currentView()->reload(); } -typedef KGenericFactory < KRemoteEncodingPlugin > KRemoteEncodingPluginFactory; -K_EXPORT_COMPONENT_FACTORY(konq_remoteencoding, - KRemoteEncodingPluginFactory("kremoteencodingplugin")) - -#include "kremoteencodingplugin.moc" +#include "dolphinremoteencoding.moc" |
