summaryrefslogtreecommitdiff
path: root/src/bookmarks
diff options
context:
space:
mode:
Diffstat (limited to 'src/bookmarks')
-rw-r--r--src/bookmarks/bookmarksmanager.cpp299
-rw-r--r--src/bookmarks/bookmarksmanager.h249
-rw-r--r--src/bookmarks/bookmarkspanel.cpp110
-rw-r--r--src/bookmarks/bookmarkspanel.h58
-rw-r--r--src/bookmarks/bookmarksproxy.cpp29
-rw-r--r--src/bookmarks/bookmarksproxy.h48
-rw-r--r--src/bookmarks/bookmarkstreemodel.cpp255
-rw-r--r--src/bookmarks/bookmarkstreemodel.h69
8 files changed, 1117 insertions, 0 deletions
diff --git a/src/bookmarks/bookmarksmanager.cpp b/src/bookmarks/bookmarksmanager.cpp
new file mode 100644
index 00000000..1c881e08
--- /dev/null
+++ b/src/bookmarks/bookmarksmanager.cpp
@@ -0,0 +1,299 @@
+/* ============================================================
+*
+* This file is a part of the rekonq project
+*
+* Copyright (C) 2008-2009 by Andrea Diamantini <adjam7 at gmail dot com>
+* Copyright (C) 2009 by Paweł Prażak <pawelprazak at gmail dot com>
+* Copyright (C) 2009 by Lionel Chauvin <megabigbug@yahoo.fr>
+*
+*
+* 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 <http://www.gnu.org/licenses/>.
+*
+* ============================================================ */
+
+
+// Self Includes
+#include "bookmarksmanager.h"
+#include "bookmarksmanager.moc"
+
+// Local Includes
+#include "mainwindow.h"
+#include "webview.h"
+
+// KDE Includes
+#include <KActionCollection>
+#include <KBookmark>
+#include <KBookmarkAction>
+#include <KBookmarkGroup>
+#include <KBookmarkMenu>
+#include <KToolBar>
+#include <KDebug>
+#include <KMenu>
+#include <KStandardDirs>
+#include <KUrl>
+
+// Qt Includes
+#include <QtCore/QFile>
+#include <QtGui/QActionGroup>
+
+
+
+BookmarkOwner::BookmarkOwner(QObject *parent)
+ : QObject(parent)
+ , KBookmarkOwner()
+{
+}
+
+
+void BookmarkOwner::openBookmark(const KBookmark & bookmark,
+ Qt::MouseButtons mouseButtons,
+ Qt::KeyboardModifiers keyboardModifiers)
+{
+ if (keyboardModifiers & Qt::ControlModifier || mouseButtons == Qt::MidButton)
+ {
+ emit openUrl(bookmark.url(), Rekonq::NewCurrentTab);
+ }
+ else
+ {
+ emit openUrl(bookmark.url(), Rekonq::CurrentTab);
+ }
+}
+
+
+bool BookmarkOwner::supportsTabs() const
+{
+ return true;
+}
+
+
+QString BookmarkOwner::currentUrl() const
+{
+ return Application::instance()->mainWindow()->currentTab()->url().url();
+}
+
+
+QString BookmarkOwner::currentTitle() const
+{
+ return Application::instance()->mainWindow()->currentTab()->title();
+}
+
+
+void BookmarkOwner::openFolderinTabs(const KBookmarkGroup &bm)
+{
+ QList<KUrl> urlList = bm.groupUrlList();
+ QList<KUrl>::iterator url;
+ for (url = urlList.begin(); url != urlList.end(); ++url)
+ {
+ Application::instance()->loadUrl(*url, Rekonq::NewCurrentTab);
+ }
+}
+
+
+// ------------------------------------------------------------------------------------------------------
+
+
+BookmarkMenu::BookmarkMenu(KBookmarkManager *manager,
+ KBookmarkOwner *owner,
+ KMenu *menu,
+ KActionCollection* actionCollection)
+ : KBookmarkMenu(manager, owner, menu, actionCollection)
+
+{
+ KAction *a = KStandardAction::addBookmark(this, SLOT(slotAddBookmark()), this);
+// a->setText(i18n("Bookmark this Page"));
+ actionCollection->addAction(QLatin1String("rekonq_add_bookmark"),a);
+}
+
+BookmarkMenu::~BookmarkMenu()
+{
+}
+
+
+KMenu *BookmarkMenu::viewContextMenu(QAction *action)
+{
+ // contextMenu() returns an invalid KMenu (seg fault) for the folders in the toolbar
+ KMenu *menu = contextMenu(action);
+ if(menu)
+ return menu;
+
+ return 0; // new KMenu();
+}
+
+
+void BookmarkMenu::slotAddBookmark()
+{
+ KAction *action = qobject_cast<KAction *>(sender());
+ if (action && !action->data().isNull())
+ {
+ KBookmarkGroup parentBookmark = manager()->findByAddress(parentAddress()).toGroup();
+ /// TODO Add bookmark Icon
+ parentBookmark.addBookmark(owner()->currentTitle(), action->data().toUrl());
+ manager()->emitChanged();
+ return;
+ }
+
+ KBookmarkMenu::slotAddBookmark();
+}
+
+
+// ------------------------------------------------------------------------------------------------------
+
+
+BookmarkProvider::BookmarkProvider(QObject *parent)
+ : QObject(parent)
+ , m_manager(0)
+ , m_owner(0)
+ , m_actionCollection(new KActionCollection(this))
+ , m_bookmarkMenu(0)
+ , m_bookmarkToolBar(0)
+{
+ KUrl bookfile = KUrl("~/.kde/share/apps/konqueror/bookmarks.xml"); // share konqueror bookmarks
+
+ if (!QFile::exists(bookfile.path()))
+ {
+ bookfile = KUrl("~/.kde4/share/apps/konqueror/bookmarks.xml");
+ if (!QFile::exists(bookfile.path()))
+ {
+ QString bookmarksDefaultPath = KStandardDirs::locate("appdata" , "defaultbookmarks.xbel");
+ QFile bkms(bookmarksDefaultPath);
+ QString bookmarksPath = KStandardDirs::locateLocal("appdata", "bookmarks.xml", true);
+ bookmarksPath.replace("rekonq", "konqueror");
+ bkms.copy(bookmarksPath);
+
+ bookfile = KUrl(bookmarksPath);
+ }
+ }
+ m_manager = KBookmarkManager::managerForExternalFile(bookfile.path());
+ connect(m_manager, SIGNAL(changed(const QString &, const QString &)),
+ this, SLOT(slotBookmarksChanged(const QString &, const QString &)));
+
+ // setup menu
+ m_owner = new BookmarkOwner(this);
+ connect(m_owner, SIGNAL(openUrl(const KUrl&, const Rekonq::OpenType &)), this, SIGNAL(openUrl(const KUrl&, const Rekonq::OpenType &)));
+}
+
+
+BookmarkProvider::~BookmarkProvider()
+{
+ delete m_bookmarkMenu;
+ delete m_actionCollection;
+ delete m_owner;
+ delete m_manager;
+}
+
+
+void BookmarkProvider::setupBookmarkBar(KToolBar *t)
+{
+ m_bookmarkToolBar = t;
+ connect(m_bookmarkToolBar, SIGNAL(customContextMenuRequested(const QPoint &)),
+ this, SLOT(contextMenu(const QPoint &)));
+
+ slotBookmarksChanged("", "");
+}
+
+
+void BookmarkProvider::slotBookmarksChanged(const QString &group, const QString &caller)
+{
+ Q_UNUSED(group)
+ Q_UNUSED(caller)
+
+ if (!m_bookmarkToolBar)
+ return;
+
+ KBookmarkGroup toolBarGroup = m_manager->toolbar();
+ if (toolBarGroup.isNull())
+ return;
+
+ if(m_bookmarkToolBar)
+ {
+ m_bookmarkToolBar->clear(); // FIXME CRASH
+
+ KBookmark bookmark = toolBarGroup.first();
+ while (!bookmark.isNull())
+ {
+ m_bookmarkToolBar->addAction(fillBookmarkBar(bookmark));
+ bookmark = toolBarGroup.next(bookmark);
+ }
+ }
+}
+
+
+QAction *BookmarkProvider::actionByName(const QString &name)
+{
+ QAction *action = m_actionCollection->action(name);
+ if (action)
+ return action;
+ return new QAction(this); // return empty object instead of NULL pointer
+}
+
+
+void BookmarkProvider::contextMenu(const QPoint &point)
+{
+ KAction* action = dynamic_cast<KAction*>(m_bookmarkToolBar->actionAt(point));
+ if (!action)
+ return;
+ KMenu *menu = m_bookmarkMenu->viewContextMenu(action);
+ if (!menu)
+ return;
+ menu->popup(m_bookmarkToolBar->mapToGlobal(point));
+}
+
+
+KActionMenu* BookmarkProvider::bookmarkActionMenu(QWidget *parent)
+{
+ KMenu *menu = new KMenu(parent);
+ m_bookmarkMenu = new BookmarkMenu(m_manager, m_owner, menu, m_actionCollection);
+ KActionMenu *bookmarkActionMenu = new KActionMenu(parent);
+ bookmarkActionMenu->setMenu(menu);
+ bookmarkActionMenu->setText(i18n("&Bookmarks"));
+ return bookmarkActionMenu;
+}
+
+
+KAction *BookmarkProvider::fillBookmarkBar(const KBookmark &bookmark)
+{
+ if (bookmark.isGroup())
+ {
+ KBookmarkGroup group = bookmark.toGroup();
+ KBookmark bm = group.first();
+ KActionMenu *menuAction = new KActionMenu(KIcon(bookmark.icon()), bookmark.text(), this);
+ menuAction->setDelayed(false);
+ while (!bm.isNull())
+ {
+ menuAction->addAction(fillBookmarkBar(bm));
+ bm = group.next(bm);
+ }
+ return menuAction;
+ }
+
+ if(bookmark.isSeparator())
+ {
+ KAction *a = new KAction(this);
+ a->setSeparator(true);
+ return a;
+ }
+ else
+ {
+ return new KBookmarkAction(bookmark, m_owner, this);
+ }
+}
+
+
+KBookmarkGroup BookmarkProvider::rootGroup()
+{
+ return m_manager->root();
+}
diff --git a/src/bookmarks/bookmarksmanager.h b/src/bookmarks/bookmarksmanager.h
new file mode 100644
index 00000000..febac234
--- /dev/null
+++ b/src/bookmarks/bookmarksmanager.h
@@ -0,0 +1,249 @@
+/* ============================================================
+*
+* This file is a part of the rekonq project
+*
+* Copyright (C) 2008-2009 by Andrea Diamantini <adjam7 at gmail dot com>
+* Copyright (C) 2009 by Paweł Prażak <pawelprazak at gmail dot com>
+* Copyright (C) 2009 by Lionel Chauvin <megabigbug@yahoo.fr>
+*
+*
+* 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 <http://www.gnu.org/licenses/>.
+*
+* ============================================================ */
+
+
+#ifndef BOOKMARKS_H
+#define BOOKMARKS_H
+
+
+// Local Includes
+#include "application.h"
+
+// Qt Includes
+#include <QWidget>
+
+// KDE Includes
+#include <KBookmarkOwner>
+
+// Forward Declarations
+class BookmarkProvider;
+
+class KAction;
+class KActionCollection;
+class KActionMenu;
+class KUrl;
+class KToolBar;
+class KBookmarkManager;
+
+
+/**
+ * Reimplementation of KBookmarkOwner, this class allows to manage
+ * bookmarks as actions
+ *
+ */
+class BookmarkOwner : public QObject , public KBookmarkOwner
+{
+ Q_OBJECT
+
+public:
+
+ /**
+ * @short The class constructor.
+ *
+ * @param parent the pointer parent Bookmark provider. We need it
+ * to get pointer to MainWindow
+ */
+ BookmarkOwner(QObject *parent = 0);
+ virtual ~BookmarkOwner() {}
+
+ /**
+ * This function is called when a bookmark is selected and belongs to
+ * the ancestor class.
+ * This method actually emits signal to load bookmark's url.
+ *
+ * @param bookmark the bookmark to open
+ * @param mouseButtons the mouse buttons clicked to select the bookmark
+ * @param keyboardModifiers the keyboard modifiers pushed when the bookmark was selected
+ */
+ virtual void openBookmark(const KBookmark &bookmark,
+ Qt::MouseButtons mouseButtons,
+ Qt::KeyboardModifiers keyboardModifiers);
+
+
+ /**
+ * this method, from KBookmarkOwner interface, allows to add the current page
+ * to the bookmark list, returning the URL page as QString.
+ *
+ * @return the current page's URL
+ */
+ virtual QString currentUrl() const;
+
+ /**
+ * this method, from KBookmarkOwner interface, allows to add the current page
+ * to the bookmark list, returning the title's page as QString.
+ *
+ * @return the current page's title
+ */
+ virtual QString currentTitle() const;
+
+ /**
+ * This function returns whether the owner supports tabs.
+ */
+ virtual bool supportsTabs() const;
+
+ /**
+ * Called if the user wants to open every bookmark in this folder in a new tab.
+ * The default implementation does nothing.
+ * This is only called if supportsTabs() returns true
+ */
+ virtual void openFolderinTabs(const KBookmarkGroup &bm);
+
+signals:
+ /**
+ * This signal is emitted when an url has to be loaded
+ *
+ * @param url the URL to load
+ *
+ */
+ void openUrl(const KUrl &, const Rekonq::OpenType &);
+};
+
+// ------------------------------------------------------------------------------
+
+
+// KDE Includes
+#include <KBookmarkMenu>
+
+
+/**
+ * This class represent the rekonq bookmarks menu.
+ * It's just a simple class inherited from KBookmarkMenu
+ *
+ */
+class BookmarkMenu : public KBookmarkMenu
+{
+ Q_OBJECT
+
+public:
+ BookmarkMenu(KBookmarkManager* manager,
+ KBookmarkOwner* owner,
+ KMenu* menu,
+ KActionCollection* actionCollection);
+ ~BookmarkMenu();
+
+ virtual KMenu *viewContextMenu(QAction* action);
+
+protected slots:
+ void slotAddBookmark();
+
+};
+
+
+// ------------------------------------------------------------------------------
+
+
+/**
+ * This class represent the interface to rekonq bookmarks system.
+ * All rekonq needs (Bookmarks Menu, Bookmarks Toolbar) is provided
+ * from this class.
+ * So it implements code to have each one
+ *
+ *
+ */
+class BookmarkProvider : public QObject
+{
+ Q_OBJECT
+
+public:
+ /**
+ * @short Class constructor.
+ * Connect BookmarksProvider with bookmarks source
+ * (actually konqueror's bookmarks)
+ * @param parent The MainWindow to provide bookmarks objects
+ *
+ */
+ BookmarkProvider(QObject* parent = 0);
+ ~BookmarkProvider();
+
+ /**
+ * @short Get the Bookmarks Menu Action
+ * @param the parent widget
+ * @return the Bookmarks Menu
+ */
+ KActionMenu *bookmarkActionMenu(QWidget *parent);
+
+
+ /**
+ * @short set the Bookmarks Toolbar Action
+ */
+ void setupBookmarkBar(KToolBar *);
+
+
+ /**
+ * @short Get action by name
+ * This method returns poiner bookmark action of given name.
+ * @pre m_actionCollection != NULL
+ * @param name Name of action you want to get
+ * @return It returns actions if one exists or empty object
+ */
+ QAction *actionByName(const QString &name);
+
+ /**
+ * returns Bookmark Manager root group
+ *
+ * @return the root bookmark group
+ */
+ KBookmarkGroup rootGroup();
+
+ KBookmarkManager *bookmarkManager() { return m_manager; }
+signals:
+ /**
+ * @short This signal is emitted when an url has to be loaded
+ *
+ * @param url the URL to load
+ */
+ void openUrl(const KUrl &, const Rekonq::OpenType &);
+
+
+public slots:
+ /**
+ * @short Opens the context menu on given position
+ * @param point Point on which you want to open this menu
+ */
+ void contextMenu(const QPoint &point);
+
+ /**
+ * @short Waits for signal that the group with the address has been modified by the caller.
+ * Waits for signal that the group (or any of its children) with the address
+ * @p groupAddress (e.g. "/4/5") has been modified by the caller @p caller.
+ * @param group bookmark group address
+ * @param caller caller that modified the bookmarks
+ * @see KBookmarkManager::changed
+ */
+ void slotBookmarksChanged(const QString &group, const QString &caller);
+
+private:
+ KAction *fillBookmarkBar(const KBookmark &bookmark);
+
+ KBookmarkManager *m_manager;
+ BookmarkOwner *m_owner;
+ KActionCollection *m_actionCollection;
+ BookmarkMenu *m_bookmarkMenu;
+ KToolBar *m_bookmarkToolBar;
+};
+
+#endif
diff --git a/src/bookmarks/bookmarkspanel.cpp b/src/bookmarks/bookmarkspanel.cpp
new file mode 100644
index 00000000..a09e0058
--- /dev/null
+++ b/src/bookmarks/bookmarkspanel.cpp
@@ -0,0 +1,110 @@
+/* ============================================================
+*
+* This file is a part of the rekonq project
+*
+* Copyright (C) 2009 by Nils Weigel <nehlsen at gmail dot com>
+*
+*
+* 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 <http://www.gnu.org/licenses/>.
+*
+* ============================================================ */
+
+
+// rekonq includes
+#include "bookmarkspanel.h"
+#include "bookmarkstreemodel.h"
+#include "bookmarksproxy.h"
+
+// Auto Includes
+#include "rekonq.h"
+
+// Qt includes
+#include <QHBoxLayout>
+#include <QLabel>
+#include <QTreeView>
+#include <QHeaderView>
+
+// KDE includes
+#include <KLineEdit>
+#include <KLocalizedString>
+
+BookmarksPanel::BookmarksPanel(const QString &title, QWidget *parent, Qt::WindowFlags flags):
+ QDockWidget(title, parent, flags)
+{
+ setup();
+
+ setShown(ReKonfig::showBookmarksPanel());
+}
+
+
+BookmarksPanel::~BookmarksPanel()
+{
+ ReKonfig::setShowBookmarksPanel(!isHidden());
+
+ delete ui;
+}
+
+void BookmarksPanel::bookmarkActivated( const QModelIndex &index )
+{
+ if( index.isValid() )
+ emit openUrl( qVariantValue< KUrl >( index.data( Qt::UserRole ) ) );
+}
+
+void BookmarksPanel::setup()
+{
+ setObjectName("bookmarksPanel");
+ setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
+
+ ui = new QWidget(this);
+
+ // setup search bar
+ QHBoxLayout *searchLayout = new QHBoxLayout;
+ searchLayout->setContentsMargins(5, 0, 0, 0);
+ QLabel *searchLabel = new QLabel(i18n("&Search:"));
+ searchLayout->addWidget(searchLabel);
+ KLineEdit *search = new KLineEdit;
+ search->setClearButtonShown(true);
+ searchLayout->addWidget(search);
+ searchLabel->setBuddy( search );
+
+ // setup tree view
+ QTreeView *treeView = new QTreeView(ui);
+ treeView->setUniformRowHeights(true);
+ treeView->setSelectionBehavior(QAbstractItemView::SelectRows);
+ treeView->setTextElideMode(Qt::ElideMiddle);
+ treeView->setAlternatingRowColors(true);
+ treeView->header()->hide();
+ treeView->setRootIsDecorated( false );
+
+ // put everything together
+ QVBoxLayout *vBoxLayout = new QVBoxLayout;
+ vBoxLayout->setContentsMargins(0, 0, 0, 0);
+ vBoxLayout->addLayout(searchLayout);
+ vBoxLayout->addWidget(treeView);
+
+ // add it to the UI
+ ui->setLayout(vBoxLayout);
+ setWidget(ui);
+
+ BookmarksTreeModel *model = new BookmarksTreeModel( this );
+ BookmarksProxy *proxy = new BookmarksProxy(ui);
+ proxy->setSourceModel( model );
+ treeView->setModel( proxy );
+
+ connect(search, SIGNAL(textChanged(QString)), proxy, SLOT(setFilterFixedString(QString)));
+ connect( treeView, SIGNAL( activated(QModelIndex) ), this, SLOT( bookmarkActivated(QModelIndex) ) );
+}
diff --git a/src/bookmarks/bookmarkspanel.h b/src/bookmarks/bookmarkspanel.h
new file mode 100644
index 00000000..8c3e6121
--- /dev/null
+++ b/src/bookmarks/bookmarkspanel.h
@@ -0,0 +1,58 @@
+/* ============================================================
+*
+* This file is a part of the rekonq project
+*
+* Copyright (C) 2009 by Nils Weigel <nehlsen at gmail dot com>
+*
+*
+* 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 <http://www.gnu.org/licenses/>.
+*
+* ============================================================ */
+
+
+#ifndef BOOKMARKSPANEL_H
+#define BOOKMARKSPANEL_H
+
+// Qt Includes
+#include <QDockWidget>
+
+// Forward Declarations
+class KUrl;
+class QModelIndex;
+
+class BookmarksPanel : public QDockWidget
+{
+ Q_OBJECT
+ Q_DISABLE_COPY(BookmarksPanel)
+
+public:
+ explicit BookmarksPanel(const QString &title, QWidget *parent = 0, Qt::WindowFlags flags = 0);
+ ~BookmarksPanel();
+
+signals:
+ void openUrl(const KUrl &);
+
+private slots:
+ void bookmarkActivated( const QModelIndex &index );
+
+private:
+ void setup();
+
+ QWidget *ui;
+};
+
+#endif // BOOKMARKSPANEL_H
diff --git a/src/bookmarks/bookmarksproxy.cpp b/src/bookmarks/bookmarksproxy.cpp
new file mode 100644
index 00000000..87d1ce71
--- /dev/null
+++ b/src/bookmarks/bookmarksproxy.cpp
@@ -0,0 +1,29 @@
+#include "bookmarksproxy.h"
+
+BookmarksProxy::BookmarksProxy( QObject *parent ):
+ QSortFilterProxyModel( parent )
+{
+}
+
+bool BookmarksProxy::filterAcceptsRow( int source_row, const QModelIndex &source_parent ) const
+{
+ QModelIndex idx = sourceModel()->index( source_row, 0, source_parent );
+
+// return idx.data().toString().contains( filterRegExp() );
+ return recursiveMatch( idx );
+}
+
+bool BookmarksProxy::recursiveMatch( const QModelIndex &index ) const
+{
+ if( index.data().toString().contains( filterRegExp() ) ) {
+ return true;
+ }
+
+ for( int childRow = 0; childRow < sourceModel()->rowCount( index ); ++childRow ) {
+ if( recursiveMatch( sourceModel()->index( childRow, 0, index ) ) ) {
+ return true;
+ }
+ }
+
+ return false;
+}
diff --git a/src/bookmarks/bookmarksproxy.h b/src/bookmarks/bookmarksproxy.h
new file mode 100644
index 00000000..99483331
--- /dev/null
+++ b/src/bookmarks/bookmarksproxy.h
@@ -0,0 +1,48 @@
+/* ============================================================
+*
+* This file is a part of the rekonq project
+*
+* Copyright (C) 2009 by Nils Weigel <nehlsen at gmail dot com>
+*
+*
+* 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 <http://www.gnu.org/licenses/>.
+*
+* ============================================================ */
+
+
+#ifndef BOOKMARKSPROXY_H
+#define BOOKMARKSPROXY_H
+
+// Qt Includes
+#include <QSortFilterProxyModel>
+
+class BookmarksProxy : public QSortFilterProxyModel
+{
+ Q_OBJECT
+ Q_DISABLE_COPY(BookmarksProxy)
+
+public:
+ BookmarksProxy( QObject *parent = 0 );
+
+protected:
+ virtual bool filterAcceptsRow( int source_row, const QModelIndex &source_parent ) const;
+
+ // returns true if any child(or childs-child...) matches filter
+ bool recursiveMatch( const QModelIndex &index ) const;
+};
+
+#endif // BOOKMARKSPROXY_H
diff --git a/src/bookmarks/bookmarkstreemodel.cpp b/src/bookmarks/bookmarkstreemodel.cpp
new file mode 100644
index 00000000..b5690a9b
--- /dev/null
+++ b/src/bookmarks/bookmarkstreemodel.cpp
@@ -0,0 +1,255 @@
+#include "bookmarkstreemodel.h"
+
+// rekonq includes
+#include "application.h"
+#include "bookmarksmanager.h"
+
+// KDE includes
+#include <KBookmarkGroup>
+#include <KLocalizedString>
+
+class BookmarksTreeModel::BtmItem
+{
+public:
+ BtmItem(const KBookmark &bm):
+ m_parent(0), m_kbm(bm)
+ {
+ }
+ ~BtmItem()
+ {
+ qDeleteAll(m_children);
+ }
+
+ QVariant data( int role = Qt::DisplayRole ) const
+ {
+ if( m_kbm.isNull() )
+ return QVariant();// should only happen for root item
+
+ if( role == Qt::DisplayRole )
+ return m_kbm.text();
+ if( role == Qt::DecorationRole )
+ return KIcon( m_kbm.icon() );
+ if( role == Qt::UserRole )
+ return m_kbm.url();
+
+ return QVariant();
+ }
+
+ int row() const
+ {
+ if(m_parent)
+ return m_parent->m_children.indexOf( const_cast< BtmItem* >( this ) );
+ return 0;
+ }
+ int childCount() const
+ {
+ return m_children.count();
+ }
+ BtmItem* child( int n )
+ {
+ Q_ASSERT(n>=0);
+ Q_ASSERT(n<childCount());
+
+ return m_children.at(n);
+ }
+ BtmItem* parent() const
+ {
+ return m_parent;
+ }
+
+ void appendChild(BtmItem *child)
+ {
+// Q_ASSERT( child != 0 );
+ if( !child )
+ return;
+
+ child->m_parent = this;
+ m_children << child;
+ }
+ void clear()
+ {
+ qDeleteAll(m_children);
+ m_children.clear();
+ }
+
+private:
+ BtmItem *m_parent;
+ QList< BtmItem* > m_children;
+
+ KBookmark m_kbm;
+};
+
+BookmarksTreeModel::BookmarksTreeModel(QObject *parent):
+ QAbstractItemModel(parent), m_root(0)
+{
+ resetModel();
+ connect( Application::bookmarkProvider()->bookmarkManager(), SIGNAL( changed(QString,QString) ), this, SLOT( bookmarksChanged(QString) ) );
+ connect( Application::bookmarkProvider()->bookmarkManager(), SIGNAL( bookmarksChanged(QString) ), this, SLOT( bookmarksChanged(QString) ) );
+}
+
+BookmarksTreeModel::~BookmarksTreeModel()
+{
+ delete m_root;
+}
+
+int BookmarksTreeModel::rowCount(const QModelIndex &parent) const
+{
+ BtmItem *parentItem = 0;
+ if( !parent.isValid() ) {
+ parentItem = m_root;
+ }
+ else {
+ parentItem = static_cast< BtmItem* >( parent.internalPointer() );
+ }
+
+ return parentItem->childCount();
+}
+
+int BookmarksTreeModel::columnCount(const QModelIndex &/*parent*/) const
+{
+ // name
+ return 1;
+}
+
+QVariant BookmarksTreeModel::headerData(int section, Qt::Orientation orientation, int role) const
+{
+ if( orientation == Qt::Horizontal && role == Qt::DisplayRole && section == 0 )
+ return i18n( "Bookmark" );
+
+ return QVariant();
+}
+
+Qt::ItemFlags BookmarksTreeModel::flags(const QModelIndex &/*index*/) const
+{
+ return Qt::ItemIsEnabled|Qt::ItemIsSelectable;
+}
+
+QModelIndex BookmarksTreeModel::index(int row, int column, const QModelIndex &parent) const
+{
+ if( !hasIndex( row, column, parent ) ) {
+ return QModelIndex();
+ }
+
+ BtmItem *parentItem;
+
+ if( !parent.isValid() ) {
+ parentItem = m_root;
+ }
+ else {
+ parentItem = static_cast< BtmItem* >( parent.internalPointer() );
+ }
+
+ BtmItem *childItem = parentItem->child( row );
+ if( childItem ) {
+ return createIndex( row, column, childItem );
+ }
+
+ return QModelIndex();
+}
+
+QModelIndex BookmarksTreeModel::parent(const QModelIndex &index) const
+{
+ if( !index.isValid() ) {
+ return QModelIndex();
+ }
+
+ BtmItem *childItem = static_cast< BtmItem* >( index.internalPointer() );
+ BtmItem *parentItem = childItem->parent();
+
+ if( parentItem == m_root ) {
+ return QModelIndex();
+ }
+
+ return createIndex( parentItem->row(), 0, parentItem );
+}
+
+QVariant BookmarksTreeModel::data(const QModelIndex &index, int role) const
+{
+ if( !index.isValid() ) {
+ return QVariant();
+ }
+
+ BtmItem *node = static_cast< BtmItem* >( index.internalPointer() );
+ if( node && node == m_root ) {
+ if( role == Qt::DisplayRole )
+ return i18n( "Bookmarks" );
+ else if( role == Qt::DecorationRole )
+ return KIcon( "bookmarks" );
+ }
+ else if( node ) {
+ return node->data( role );
+ }
+
+ return QVariant();
+}
+
+// bool BookmarksTreeModel::setData(const QModelIndex &index, const QVariant &value, int role)
+// {
+// }
+
+void BookmarksTreeModel::bookmarksChanged( const QString &groupAddress )
+{
+// qDebug( "bookmarksChanged '%s'", qPrintable( groupAddress ) );
+
+ if( groupAddress.isEmpty() ) {
+ resetModel();
+ return;
+ }
+
+ BtmItem *node = m_root;
+ QModelIndex nodeIndex;
+
+ QStringList indexChain( groupAddress.split( '/', QString::SkipEmptyParts) );
+ foreach( QString sIndex, indexChain ) {
+ bool ok;
+ int i = sIndex.toInt( &ok );
+ if( !ok )
+ break;
+
+ if( i < 0 || i >= node->childCount() )
+ break;
+
+ node = node->child( i );
+ nodeIndex = index( i, 0, nodeIndex );
+ }
+// qDebug( " changed: '%s'(0-%d)", ( node == m_root ? "ROOT" : qPrintable( node->data().toString() ) ), node->childCount() );
+ emit dataChanged( index( 0, 0, nodeIndex ), index( node->childCount(), 0, nodeIndex ) );
+}
+
+void BookmarksTreeModel::resetModel()
+{
+ setRoot(Application::bookmarkProvider()->rootGroup());
+}
+
+void BookmarksTreeModel::setRoot(KBookmarkGroup bmg)
+{
+ delete m_root;
+ m_root = new BtmItem(KBookmark());
+
+ if( bmg.isNull() ) {
+ return;
+ }
+
+ populate( m_root, bmg );
+
+ reset();
+}
+
+void BookmarksTreeModel::populate( BtmItem *node, KBookmarkGroup bmg)
+{
+ node->clear();
+
+ if( bmg.isNull() ) {
+ return;
+ }
+
+ KBookmark bm = bmg.first();
+ while( !bm.isNull() ) {
+ BtmItem *newChild = new BtmItem( bm );
+ if( bm.isGroup() )
+ populate( newChild, bm.toGroup() );
+
+ node->appendChild( newChild );
+ bm = bmg.next( bm );
+ }
+}
diff --git a/src/bookmarks/bookmarkstreemodel.h b/src/bookmarks/bookmarkstreemodel.h
new file mode 100644
index 00000000..9753999c
--- /dev/null
+++ b/src/bookmarks/bookmarkstreemodel.h
@@ -0,0 +1,69 @@
+/* ============================================================
+*
+* This file is a part of the rekonq project
+*
+* Copyright (C) 2009 by Nils Weigel <nehlsen at gmail dot com>
+*
+*
+* 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 <http://www.gnu.org/licenses/>.
+*
+* ============================================================ */
+
+
+#ifndef BOOKMARKSTREEMODEL_H
+#define BOOKMARKSTREEMODEL_H
+
+// Qt Includes
+#include <QAbstractItemModel>
+
+// KDE includes
+#include <KBookmark>
+
+class BookmarksTreeModel : public QAbstractItemModel
+{
+ Q_OBJECT
+ Q_DISABLE_COPY(BookmarksTreeModel)
+
+public:
+ explicit BookmarksTreeModel(QObject *parent = 0);
+ ~BookmarksTreeModel();
+
+ virtual int rowCount(const QModelIndex &parent = QModelIndex()) const;
+ virtual int columnCount(const QModelIndex &parent = QModelIndex()) const;
+
+ virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
+ virtual Qt::ItemFlags flags(const QModelIndex &index) const;
+
+ virtual QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const;
+ virtual QModelIndex parent(const QModelIndex &index) const;
+ virtual QVariant data(const QModelIndex &index, int role) const;
+// virtual bool setData(const QModelIndex &index, const QVariant &value, int role);
+
+private slots:
+ void bookmarksChanged( const QString &groupAddress );
+
+private:
+ class BtmItem;
+ BtmItem *m_root;
+
+ void resetModel();
+
+ void setRoot(KBookmarkGroup bmg);
+ void populate( BtmItem *node, KBookmarkGroup bmg);
+};
+
+#endif // BOOKMARKSTREEMODEL_H