From e30a962d8bb9bc5018ba121a4046132a59f6e1c3 Mon Sep 17 00:00:00 2001 From: matgic78 Date: Wed, 21 Apr 2010 11:53:32 +0200 Subject: Akregator RSS support --- src/urlbar/lineedit.cpp | 197 +++++++++++++++++++++++++++++++++++++++++++++++ src/urlbar/urlbar.cpp | 6 +- src/urlbar/urlbar.h | 5 +- src/urlbar/urlresolver.h | 5 +- src/webtab.cpp | 96 +++++++++++++++-------- src/webtab.h | 4 +- 6 files changed, 274 insertions(+), 39 deletions(-) create mode 100644 src/urlbar/lineedit.cpp (limited to 'src') diff --git a/src/urlbar/lineedit.cpp b/src/urlbar/lineedit.cpp new file mode 100644 index 00000000..29d07e16 --- /dev/null +++ b/src/urlbar/lineedit.cpp @@ -0,0 +1,197 @@ +/* ============================================================ +* +* This file is a part of the rekonq project +* +* Copyright (C) 2009 by Andrea Diamantini +* Copyright (C) 2009 by Paweł Prażak +* Copyright (C) 2009 by Lionel Chauvin +* +* +* 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) version 3 or any later version +* accepted by the membership of KDE e.V. (or its successor approved +* by the membership of KDE e.V.), which shall act as a proxy +* defined in Section 14 of version 3 of the license. +* +* 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, see . +* +* ============================================================ */ + + +// Self Includes +#include "lineedit.h" +#include "lineedit.moc" + +// KDE Includes +#include +#include +#include +#include + +// Qt Includes +#include +#include +#include +#include +#include + + +IconButton::IconButton(QWidget *parent) + : QToolButton(parent) +{ + setToolButtonStyle(Qt::ToolButtonIconOnly); + setStyleSheet("IconButton { background-color:transparent; border: none; padding: 0px}"); + setCursor(Qt::ArrowCursor); +} + +void IconButton::mouseReleaseEvent(QMouseEvent* event) +{ + emit clicked(event->globalPos()); +} + +// ----------------------------------------------------------------------------------------------------------- + + +LineEdit::LineEdit(QWidget* parent) + : KLineEdit(parent) + , _icon( new IconButton(this) ) +{ + // cosmetic + setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); + setMinimumWidth(200); + setMinimumHeight(26); + + // initial style + setStyleSheet( QString("LineEdit { padding: 0 0 0 %1px;} ").arg(_icon->sizeHint().width()) ); + + // doesn't show the clear button + setClearButtonShown(false); + + // trap Key_Enter & Key_Return events, while emitting the returnPressed signal + setTrapReturnKey(true); + + // insert decoded URLs + setUrlDropsEnabled(true); + + // accept focus, via tabbing, clicking & wheeling + setFocusPolicy(Qt::WheelFocus); + + // disable completion object (we have our own :) ) + setCompletionObject(0); +} + + +LineEdit::~LineEdit() +{ + delete _icon; +} + + +void LineEdit::keyPressEvent(QKeyEvent *event) +{ + if (event->key() == Qt::Key_Escape) + { + clearFocus(); + event->accept(); + } + + KLineEdit::keyPressEvent(event); +} + + +void LineEdit::mouseDoubleClickEvent(QMouseEvent *) +{ + selectAll(); +} + + +IconButton *LineEdit::iconButton() const +{ + return _icon; +} + + +void LineEdit::paintEvent(QPaintEvent *event) +{ + // you need this before our code to draw inside the line edit.. + KLineEdit::paintEvent(event); + + if (text().isEmpty()) + { + QStyleOptionFrame option; + initStyleOption(&option); + QRect textRect = style()->subElementRect(QStyle::SE_LineEditContents, &option, this); + QPainter painter(this); + painter.setPen(Qt::gray); + painter.drawText( textRect, + Qt::AlignCenter, + i18n("Search Bookmarks, History, Web.. just start typing here!") + ); + } +} + + +IconButton *LineEdit::addRightIcon(LineEdit::icon ic) +{ + IconButton *rightIcon = new IconButton(this); + + switch(ic) + { + case LineEdit::KGet: + rightIcon->setIcon( KIcon("download") ); + rightIcon->setToolTip( i18n("List all links with KGet") ); + break; + case LineEdit::RSS: + rightIcon->setIcon( KIcon("application-rss+xml") ); + rightIcon->setToolTip( i18n("List all available RSS feeds") ); + break; + case LineEdit::SSL: + rightIcon->setIcon( KIcon("object-locked") ); + rightIcon->setToolTip( i18n("Show SSL Infos") ); + break; + default: + kDebug() << "ERROR.. default non extant case!!"; + break; + } + + _rightIconsList << rightIcon; + int iconsCount = _rightIconsList.count(); + rightIcon->move( width() - 23*iconsCount, 6); + rightIcon->show(); + + return rightIcon; +} + + +void LineEdit::clearRightIcons() +{ + qDeleteAll(_rightIconsList); + _rightIconsList.clear(); +} + + +void LineEdit::resizeEvent(QResizeEvent *event) +{ + int newHeight = ( height() - 19 )/2; + _icon->move(4, newHeight ); + + int iconsCount = _rightIconsList.count(); + int w = width(); + + for(int i = 0; i < iconsCount; ++i) + { + IconButton *bt = _rightIconsList.at(i); + bt->move( w - 25*(i+1), newHeight ); + } + + KLineEdit::resizeEvent(event); + +} diff --git a/src/urlbar/urlbar.cpp b/src/urlbar/urlbar.cpp index 6d255c02..d7fc7199 100644 --- a/src/urlbar/urlbar.cpp +++ b/src/urlbar/urlbar.cpp @@ -63,6 +63,10 @@ IconButton::IconButton(QWidget *parent) setCursor(Qt::ArrowCursor); } +void IconButton::mouseReleaseEvent(QMouseEvent* event) +{ + emit clicked(event->globalPos()); +} // ----------------------------------------------------------------------------------------------------------- @@ -282,7 +286,7 @@ void UrlBar::loadFinished() if(_tab->hasRSSInfo()) { IconButton *bt = addRightIcon(UrlBar::RSS); - connect(bt, SIGNAL(clicked()), _tab, SLOT(showRSSInfo())); + connect(bt, SIGNAL(clicked(QPoint)), _tab, SLOT(showRSSInfo(QPoint))); } // show SSL diff --git a/src/urlbar/urlbar.h b/src/urlbar/urlbar.h index 0be1ecf9..91b38e23 100644 --- a/src/urlbar/urlbar.h +++ b/src/urlbar/urlbar.h @@ -53,9 +53,12 @@ class WebTab; class IconButton : public QToolButton { Q_OBJECT - public: IconButton(QWidget *parent = 0); +signals: + void clicked(QPoint); +protected: + void mouseReleaseEvent(QMouseEvent *event); }; diff --git a/src/urlbar/urlresolver.h b/src/urlbar/urlresolver.h index 22a9de4f..5200a401 100644 --- a/src/urlbar/urlresolver.h +++ b/src/urlbar/urlresolver.h @@ -37,9 +37,8 @@ class UrlSearchItem { - - public: - +public: + enum types { Search = 0x00000001, diff --git a/src/webtab.cpp b/src/webtab.cpp index 62de6299..83532a65 100644 --- a/src/webtab.cpp +++ b/src/webtab.cpp @@ -50,6 +50,7 @@ #include #include #include +#include // Qt Includes #include @@ -179,43 +180,76 @@ void WebTab::createPreviewSelectorBar(int index) bool WebTab::hasRSSInfo() { - _rssList.clear(); - QWebElementCollection col = page()->mainFrame()->findAllElements("link"); - foreach(QWebElement el, col) - { - if( el.attribute("type") == QL1S("application/rss+xml") || el.attribute("type") == QL1S("application/rss+xml") ) - { - if( el.attribute("href").startsWith( QL1S("http") ) ) - { - _rssList << KUrl( el.attribute("href") ); - } - else - { - KUrl u = url(); - // NOTE - // cd() is probably better than setPath() here, - // for all those url sites just having a path - if(u.cd( el.attribute("href") )) - _rssList << u; - } - } - } + QWebElementCollection col = page()->mainFrame()->findAllElements("link[type=\"application/rss+xml\"]"); + col.append(page()->mainFrame()->findAllElements("link[type=\"application/atom+xml\"]")); + if(col.count() != 0) + return true; - return !_rssList.isEmpty(); + return false; } -void WebTab::showRSSInfo() +void WebTab::showRSSInfo(QPoint menuPos) { - QString urlList = QString(i18n("The following RSS feeds were found:

")); - foreach(const KUrl &url, _rssList) + KMenu *menu = new KMenu(); + menu->addTitle(KIcon("application-rss+xml"), i18n("Add Streams to Akregator")); + + QWebElementCollection col = page()->mainFrame()->findAllElements("link[type=\"application/rss+xml\"]"); + col.append(page()->mainFrame()->findAllElements("link[type=\"application/atom+xml\"]")); + foreach(QWebElement el, col) { - urlList += QString("") + url.url() + QString("
"); + QString urlString; + if( el.attribute("href").startsWith( QL1S("http") ) ) + urlString = el.attribute("href"); + else + { + KUrl u = url(); + // NOTE + // cd() is probably better than setPath() here, + // for all those url sites just having a path + if(u.cd( el.attribute("href") )) + urlString = u.toMimeDataString(); + } + + QString title = el.attribute("title"); + if(title.isEmpty()) + title= el.attribute("href"); + + KAction *action = new KAction(title, menu); + action->setData(urlString); + + menu->addAction(action); } - urlList += QString(i18n("
Enough for now... Waiting for some cool Akonadi based feeds management :)")); - KMessageBox::information( view(), - urlList, - i18n("RSS Management") - ); + QAction *action = menu->exec(menuPos); + if(action == 0) + return; + + // Akregator is running + if(QDBusConnection::sessionBus().interface()->isServiceRegistered("org.kde.akregator")) + { + QDBusInterface akregator("org.kde.akregator", "/Akregator", "org.kde.akregator.part"); + QDBusReply reply = akregator.call("addFeedsToGroup", action->data().toStringList(), i18n("Imported Feeds")); + + if(!reply.isValid()) + { + KMessageBox::error( 0, QString(i18n("Could not add stream to akregator, Please add it manually :") + + "

data().toString() + "\">" + + action->data().toString() + "")); + } + } + // Akregator is not running + else + { + KProcess proc; + proc << "akregator" << "-g" << i18n("Imported Feeds"); + proc << "-a" << action->data().toString(); + if(proc.startDetached() == 0) + { + KMessageBox::error( 0, QString(i18n("There was an error. Please verify Akregator is installed on your system.") + + "

data().toString() + "\">" + + action->data().toString() + "")); + } + + } } diff --git a/src/webtab.h b/src/webtab.h index 9054a7c1..16e0a6b6 100644 --- a/src/webtab.h +++ b/src/webtab.h @@ -65,12 +65,10 @@ private slots: void loadFinished(bool); void createWalletBar(const QString &, const QUrl &); - void showRSSInfo(); + void showRSSInfo(QPoint menuPos); private: int m_progress; - - KUrl::List _rssList; }; #endif -- cgit v1.2.1