diff options
author | Phaneendra Hegde <pnh.pes@gmail.com> | 2012-05-27 09:49:35 +0200 |
---|---|---|
committer | Andrea Diamantini <adjam7@gmail.com> | 2012-05-27 23:34:32 +0200 |
commit | c4e2c2524615d781e1884123169dfdd928be09d4 (patch) | |
tree | 0e6e47f69ec9884ce60c9539217c2bf471a529db | |
parent | Add application icon ( Windows & OS X ). (diff) | |
download | rekonq-c4e2c2524615d781e1884123169dfdd928be09d4.tar.xz |
Fancy bookmarking on rekonq :)
- Fancy bookmarking's resource link dialog added to bookmark context menu
- UI improvements in bookmarks dialog
- WARNING: Nepomuk/soprano dependencies added
NB: Merged and squashed by adjam ;)
-rw-r--r-- | src/CMakeLists.txt | 13 | ||||
-rw-r--r-- | src/bookmarks/bookmarkowner.cpp | 24 | ||||
-rw-r--r-- | src/bookmarks/bookmarkowner.h | 2 | ||||
-rw-r--r-- | src/bookmarks/bookmarkscontextmenu.cpp | 1 | ||||
-rw-r--r-- | src/urlbar/bookmarkwidget.cpp | 161 | ||||
-rw-r--r-- | src/urlbar/bookmarkwidget.h | 24 | ||||
-rw-r--r-- | src/urlbar/newresourcedialog.cpp | 108 | ||||
-rw-r--r-- | src/urlbar/newresourcedialog.h | 50 | ||||
-rw-r--r-- | src/urlbar/resourcelinkdialog.cpp | 347 | ||||
-rw-r--r-- | src/urlbar/resourcelinkdialog.h | 66 |
10 files changed, 778 insertions, 18 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 7fd1cfc5..afdb9ec9 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -84,6 +84,8 @@ SET( rekonq_KDEINIT_SRCS urlbar/bookmarkwidget.cpp urlbar/webshortcutwidget.cpp urlbar/favoritewidget.cpp + urlbar/resourcelinkdialog.cpp + urlbar/newresourcedialog.cpp #---------------------------------------- analyzer/analyzerpanel.cpp analyzer/networkanalyzer.cpp @@ -138,7 +140,10 @@ KDE4_ADD_UI_FILES( rekonq_KDEINIT_SRCS ) KDE4_ADD_KCFG_FILES( rekonq_KDEINIT_SRCS rekonq.kcfgc ) - +find_package(KDE4 REQUIRED) +find_package(Nepomuk REQUIRED) +include(SopranoAddOntology) +include (KDE4Defaults) ### ------------- INCLUDING DIRECTORIES... @@ -155,6 +160,9 @@ INCLUDE_DIRECTORIES ( ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} ${KDE4_INCLUDES} ${QT4_INCLUDES} + ${SOPRANO_INCLUDE_DIR} + ${CMAKE_SOURCE_DIR} + ${NEPOMUK_INCLUDE_DIR} ) @@ -182,6 +190,9 @@ TARGET_LINK_LIBRARIES ( kdeinit_rekonq ${KDE4_KDEUI_LIBS} ${KDE4_KIO_LIBS} ${KDE4_KPARTS_LIBS} + ${NEPOMUK_LIBRARIES} + ${NEPOMUK_QUERY_LIBRARIES} + ${SOPRANO_LIBRARIES} ) diff --git a/src/bookmarks/bookmarkowner.cpp b/src/bookmarks/bookmarkowner.cpp index 141807ca..74683874 100644 --- a/src/bookmarks/bookmarkowner.cpp +++ b/src/bookmarks/bookmarkowner.cpp @@ -37,11 +37,15 @@ #include "mainview.h" #include "mainwindow.h" #include "webtab.h" +#include "resourcelinkdialog.h" // KDE Includes #include <KBookmarkDialog> #include <KLocalizedString> #include <KMessageBox> +#include <Nepomuk/Resource> +#include <Nepomuk/Vocabulary/NFO> + // Qt Includes #include <QClipboard> @@ -86,6 +90,9 @@ KAction* BookmarkOwner::createAction(const KBookmark &bookmark, const BookmarkAc case EDIT: return createAction(i18n("Edit"), "configure", i18n("Edit the bookmark"), SLOT(editBookmark(KBookmark)), bookmark); + case FANCYBOOKMARK: + return createAction(i18n("Fancy Bookmark"), "nepomuk", + i18n("Link Nepomuk resources"), SLOT(fancyBookmark(KBookmark)), bookmark); case DELETE: return createAction(i18n("Delete"), "edit-delete", i18n("Delete the bookmark"), SLOT(deleteBookmark(KBookmark)), bookmark); @@ -205,13 +212,19 @@ KBookmark BookmarkOwner::bookmarkCurrentPage(const KBookmark &bookmark) else { parent = rApp->bookmarkManager()->rootGroup(); + Nepomuk::Resource nfoResource; + nfoResource = ((QUrl)currentUrl()); + nfoResource.addType( Nepomuk::Vocabulary::NFO::Website() ); + nfoResource.setLabel( currentTitle() ); + qDebug()<<nfoResource.uri(); + } KBookmark newBk = parent.addBookmark(currentTitle(), KUrl(currentUrl())); if (!bookmark.isNull()) parent.moveBookmark(newBk, bookmark); - m_manager->emitChanged(parent); + m_manager->emitChanged(parent); return newBk; } @@ -297,6 +310,13 @@ void BookmarkOwner::editBookmark(KBookmark bookmark) delete dialog; } +void BookmarkOwner::fancyBookmark(KBookmark bookmark) +{ + Nepomuk::Resource nfoResource = (KUrl)bookmark.url(); + Nepomuk::ResourceLinkDialog r( nfoResource ); + r.exec(); + +} bool BookmarkOwner::deleteBookmark(const KBookmark &bookmark) { @@ -334,6 +354,8 @@ bool BookmarkOwner::deleteBookmark(const KBookmark &bookmark) return false; bmg.deleteBookmark(bookmark); + Nepomuk::Resource nfoResource(bookmark.url()); + nfoResource.remove(); m_manager->emitChanged(bmg); return true; } diff --git a/src/bookmarks/bookmarkowner.h b/src/bookmarks/bookmarkowner.h index c362fe5e..a9712d55 100644 --- a/src/bookmarks/bookmarkowner.h +++ b/src/bookmarks/bookmarkowner.h @@ -60,6 +60,7 @@ public: NEW_SEPARATOR, COPY, EDIT, + FANCYBOOKMARK, DELETE, NUM_ACTIONS, SET_TOOLBAR_FOLDER, @@ -107,6 +108,7 @@ public Q_SLOTS: void copyLink(const KBookmark &bookmark); void editBookmark(KBookmark bookmark); + void fancyBookmark(KBookmark bookmark); bool deleteBookmark(const KBookmark &bookmark); void setToolBarFolder(KBookmark bookmark = KBookmark()); void unsetToolBarFolder(); diff --git a/src/bookmarks/bookmarkscontextmenu.cpp b/src/bookmarks/bookmarkscontextmenu.cpp index 355a6d7f..bc8f0e3a 100644 --- a/src/bookmarks/bookmarkscontextmenu.cpp +++ b/src/bookmarks/bookmarkscontextmenu.cpp @@ -67,6 +67,7 @@ void BookmarksContextMenu::addBookmarkActions() addSeparator(); addAction(m_bmOwner->createAction(bookmark(), BookmarkOwner::EDIT)); + addAction(m_bmOwner->createAction(bookmark(),BookmarkOwner::FANCYBOOKMARK)); addAction(m_bmOwner->createAction(bookmark(), BookmarkOwner::DELETE)); } diff --git a/src/urlbar/bookmarkwidget.cpp b/src/urlbar/bookmarkwidget.cpp index 536befb8..ea278218 100644 --- a/src/urlbar/bookmarkwidget.cpp +++ b/src/urlbar/bookmarkwidget.cpp @@ -33,18 +33,26 @@ #include "application.h" #include "bookmarkmanager.h" #include "bookmarkowner.h" +#include "resourcelinkdialog.h" // KDE Includes #include <KComboBox> #include <KLocalizedString> #include <KIcon> #include <KLineEdit> +#include <KRatingWidget> // Qt Includes -#include <QDialogButtonBox> -#include <QFormLayout> -#include <QLabel> -#include <QPushButton> +#include <QtGui/QDialogButtonBox> +#include <QtGui/QFormLayout> +#include <QtGui/QLabel> +#include <QtGui/QPushButton> +#include <QCompleter> +#include <QTextCursor> + +//Nepomuk Includes +#include <Soprano/Vocabulary/NAO> + BookmarkWidget::BookmarkWidget(const KBookmark &bookmark, QWidget *parent) @@ -52,30 +60,42 @@ BookmarkWidget::BookmarkWidget(const KBookmark &bookmark, QWidget *parent) , m_bookmark(new KBookmark(bookmark)) { setAttribute(Qt::WA_DeleteOnClose); - setFixedWidth(350); + setFixedWidth(320); - QFormLayout *layout = new QFormLayout(this); + m_nfoResource = (QUrl)m_bookmark->url(); + QFormLayout *layout = new QFormLayout(this); + layout->setHorizontalSpacing(20); // Bookmark icon - QLabel *bookmarkIcon = new QLabel(this); - bookmarkIcon->setPixmap(KIcon("bookmarks").pixmap(32, 32)); +// QLabel *bookmarkIcon = new QLabel(this); +// bookmarkIcon->setPixmap(KIcon("bookmarks").pixmap(32, 32)); // Title - QVBoxLayout *vLayout = new QVBoxLayout; + QHBoxLayout *hLayout = new QHBoxLayout; QLabel *bookmarkInfo = new QLabel(this); - bookmarkInfo->setText(i18n("Edit this Bookmark")); + bookmarkInfo->setText(i18n(" Bookmark")); QFont f = bookmarkInfo->font(); f.setBold(true); bookmarkInfo->setFont(f); - vLayout->addWidget(bookmarkInfo); + // Remove button + QLabel *removeLabel = new QLabel( this ); + removeLabel->setText( i18n( "<a href='Remove'>Remove</a>" ) ); + removeLabel->setAlignment( Qt::AlignRight ); + hLayout->addWidget(bookmarkInfo); + hLayout->addWidget(removeLabel); + layout->addRow(hLayout); + + connect(removeLabel, SIGNAL( linkActivated(QString) ), this, SLOT( removeBookmark() )); + + /* QPushButton *removeButton = new QPushButton(this); removeButton->setText(i18n("Remove this Bookmark")); connect(removeButton, SIGNAL(clicked()), this, SLOT(removeBookmark())); vLayout->addWidget(removeButton); - - layout->addRow(bookmarkIcon, vLayout); +*/ + //layout->addRow(bookmarkIcon, vLayout); //Bookmark Folder QLabel *folderLabel = new QLabel(this); @@ -100,6 +120,53 @@ BookmarkWidget::BookmarkWidget(const KBookmark &bookmark, QWidget *parent) } layout->addRow(nameLabel, m_name); + QLabel* rateLabel = new QLabel(this); + rateLabel->setText( i18n( "Rate:" ) ); + KRatingWidget *ratingWidget = new KRatingWidget( this ); + if( m_nfoResource.rating() != NULL ) { + ratingWidget->setRating( m_nfoResource.rating() ); + } + connect( ratingWidget, SIGNAL( ratingChanged( int ) ), this, SLOT( setRatingSlot( int ) ) ); + ratingWidget->setToolTip( i18n( "Rate this page" ) ); + layout->addRow( rateLabel,ratingWidget ); + + //Add comments + QLabel *commentLabel = new QLabel( this ); + commentLabel->setText( i18n( "Describe:" ) ); + commentLabel->setAlignment( Qt::AlignCenter ); + m_commentEdit = new QPlainTextEdit( this ); + if( !m_nfoResource.description().isEmpty() ) { + m_commentEdit->setPlainText( m_nfoResource.description() ); + } + connect( m_commentEdit, SIGNAL(textChanged()), this, SLOT(addCommentSlot()) ); + layout->addRow( commentLabel, m_commentEdit ); + + //Create tags + QLabel *tagLabel = new QLabel( this ); + tagLabel->setText( i18n( "Tags:" ) ); + tagLabel->setAlignment( Qt::AlignLeft ); + m_tagLine = new KLineEdit( this ); + m_tagLine->setPlaceholderText( i18n( "add tags(comma separated)" ) ); + + //m_tagList = new QGridLayout( this ); + + QList<Nepomuk::Tag> tagList = Nepomuk::Tag::allTags(); + Q_FOREACH(Nepomuk::Tag t,tagList) { + m_tList.append(t.label()); + } + QCompleter *completeTag = new QCompleter( m_tList ); + completeTag->setCompletionMode(QCompleter::PopupCompletion); + m_tagLine->setCompleter(completeTag); + loadTags(); + + // connect( m_tagLine,SIGNAL( textEdited(QString) ),this,SLOT( tagListSlot() ) ); + layout->addRow(tagLabel,m_tagLine); +// layout->addRow(m_tagList); + + QPushButton *linkToResource = new QPushButton( this ); + linkToResource->setText( i18n( "Link Resources" ) ); + connect(linkToResource, SIGNAL(clicked()), this, SLOT( linkToResourceSlot() ) ); + layout->addWidget(linkToResource); // Ok & Cancel buttons QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, Qt::Horizontal, this); connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept())); @@ -131,7 +198,6 @@ void BookmarkWidget::accept() m_bookmark->setFullText(m_name->text()); rApp->bookmarkManager()->emitChanged(); } - QString folderAddress = m_folder->itemData(m_folder->currentIndex()).toString(); KBookmarkGroup a = rApp->bookmarkManager()->manager()->findByAddress(folderAddress).toGroup(); @@ -139,6 +205,7 @@ void BookmarkWidget::accept() parent.deleteBookmark(*m_bookmark); a.addBookmark(*m_bookmark); rApp->bookmarkManager()->manager()->emitChanged(a); + parseTags(); close(); } @@ -194,3 +261,69 @@ void BookmarkWidget::removeBookmark() emit updateIcon(); } + + + +void BookmarkWidget::addTags(QList<Nepomuk::Tag> tagList) +{ + foreach( const Nepomuk::Tag &tag,tagList) { + if(!m_nfoResource.tags().contains(tag)) { + m_nfoResource.addTag(tag); + } + } + foreach( Nepomuk::Tag tag,m_nfoResource.tags()) { + if(!tagList.contains(tag)) { + tag.remove(); + } + } +} + +void BookmarkWidget::parseTags() +{ + QList<Nepomuk::Tag> tagList; + if(m_tagLine->text().contains(',')) { + QString text = m_tagLine->text(); + QStringList tagStringList = text.split( QChar::fromAscii(',') ); + + foreach( const QString &tag, tagStringList ) { + QString trimmedTag = tag.trimmed(); + if( !trimmedTag.isEmpty() ) + tagList << trimmedTag; + } + } + else { + tagList<<m_tagLine->text().trimmed(); + } + addTags(tagList); +} + +void BookmarkWidget::loadTags() { + + QString list; + if(!m_nfoResource.tags().isEmpty()) { + foreach( const Nepomuk::Tag &tag, m_nfoResource.tags() ) { + list.append(tag.genericLabel()); + list.append(","); + } + m_tagLine->setText(list); + } + +} + +void BookmarkWidget::setRatingSlot( int rate ) +{ + m_nfoResource.setRating(rate); +} +void BookmarkWidget::addCommentSlot() +{ + m_nfoResource.setDescription(m_commentEdit->toPlainText()); +} + + +void BookmarkWidget::linkToResourceSlot() +{ + Nepomuk::ResourceLinkDialog r( m_nfoResource ); + r.exec(); +} + + diff --git a/src/urlbar/bookmarkwidget.h b/src/urlbar/bookmarkwidget.h index c2985759..01f672e9 100644 --- a/src/urlbar/bookmarkwidget.h +++ b/src/urlbar/bookmarkwidget.h @@ -29,7 +29,13 @@ #define BOOKMARKWIDGET_H // Qt Includes -#include <QMenu> +#include <QtGui/QMenu> +#include <QtGui/QGridLayout> +#include <QtGui/QPlainTextEdit> + +#include <Nepomuk/Resource> +#include <Nepomuk/Tag> +#include <Nepomuk/Vocabulary/NFO> // Forward Declarations class KBookmark; @@ -46,20 +52,34 @@ public: virtual ~BookmarkWidget(); void showAt(const QPoint &pos); + void addTags(QList<Nepomuk::Tag>); + void parseTags(); + void loadTags(); Q_SIGNALS: void updateIcon(); + private Q_SLOTS: void accept(); void removeBookmark(); + void setRatingSlot( int rate ); + void addCommentSlot(); + void linkToResourceSlot(); + //void tagListSlot(); private: KBookmark *m_bookmark; KLineEdit *m_name; KComboBox *m_folder; + KLineEdit *m_tagLine; + QPlainTextEdit *m_commentEdit; + //QGridLayout* m_tagList; + Nepomuk::Resource m_nfoResource; + QStringList m_tList; + void setupFolderComboBox(); }; -#endif // BOOKMARKWIDGET_H +#endif diff --git a/src/urlbar/newresourcedialog.cpp b/src/urlbar/newresourcedialog.cpp new file mode 100644 index 00000000..9e0ed223 --- /dev/null +++ b/src/urlbar/newresourcedialog.cpp @@ -0,0 +1,108 @@ +/* + This is a part of the GSoC project - Fancy Bookmarking + Copyright 2011 Phaneendra Hegde <pnh.pes@gmail.com> + + This library is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License 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. +*/ + +//Local Includes +#include "newresourcedialog.h" + +//Nepomuk Includes +#include <Nepomuk/Vocabulary/NCO> +#include <Nepomuk/Vocabulary/PIMO> +#include <Nepomuk/Resource> +#include <Nepomuk/Tag> + +//Qt Includes +#include <QPlainTextEdit> +#include <QVBoxLayout> +#include <QLabel> + +class Nepomuk::NewResourceDialog::Private +{ +public: + KLineEdit *m_resourceName; + QPlainTextEdit *m_description; + QLabel *m_titleResource; + QLabel *m_desResource; + Nepomuk::NewResourceDialog *q; + Nepomuk::Resource m_nofResource; + int m_index; +}; + + +Nepomuk::NewResourceDialog::NewResourceDialog( int index, Nepomuk::Resource& nfoResource, QWidget* parent ): + KDialog( parent ), + d( new Private() ) +{ + d->q = this; + d->m_index = index; + d->m_nofResource =nfoResource; + setWindowTitle( i18n( "Link to new Resource" ) ); + setButtonText( Ok, i18n( "Link" ) ); + setMinimumSize( 200, 150 ); + + QVBoxLayout *layout = new QVBoxLayout( mainWidget() ); + d->m_resourceName = new KLineEdit( mainWidget() ); + d->m_titleResource = new QLabel( mainWidget() ); + d->m_titleResource->setText( i18n( "* Resource Name:" ) ); + layout->addWidget( d->m_titleResource ); + layout->addWidget( d->m_resourceName ); + d->m_description = new QPlainTextEdit( mainWidget() ); + d->m_desResource = new QLabel( mainWidget() ); + d->m_desResource->setText( i18n( "Description (Optional)" )); + layout->addWidget( d->m_desResource); + layout->addWidget( d->m_description ); + + connect( this, SIGNAL( okClicked() ), this, SLOT( newResourceSlot() ) ); +} + + +Nepomuk::NewResourceDialog::~NewResourceDialog() +{ + delete d; +} + + +void Nepomuk::NewResourceDialog::newResourceSlot() +{ + if( d->m_index == 1 ) { + Nepomuk::Resource newResource( d->m_resourceName->text(), Nepomuk::Vocabulary::PIMO::Person() ); + newResource.addSymbol( "user-identity" ); + d->m_nofResource.addIsRelated( newResource ); + } + else if( d->m_index == 2 ) { + Nepomuk::Resource newResource( d->m_resourceName->text(), Nepomuk::Vocabulary::PIMO::Project() ); + newResource.addSymbol( "project-development" ); + d->m_nofResource.addIsRelated( newResource ); + } + else if( d->m_index == 3 ) { + Nepomuk::Resource newResource( d->m_resourceName->text(), Nepomuk::Vocabulary::PIMO::Task() ); + newResource.addSymbol( "view-pim-tasks" ); + d->m_nofResource.addIsRelated( newResource ); + } + else if( d->m_index == 4 ) { + Nepomuk::Resource newResource( d->m_resourceName->text(), Nepomuk::Vocabulary::PIMO::Location() ); + newResource.addSymbol( "user-location" ); + d->m_nofResource.addIsRelated( newResource ); + } + else if( d->m_index == 5 ) { + Nepomuk::Resource newResource( d->m_resourceName->text(), Nepomuk::Vocabulary::PIMO::Note() ); + newResource.addSymbol( "knotes" ); + d->m_nofResource.addIsRelated( newResource ); + } +} diff --git a/src/urlbar/newresourcedialog.h b/src/urlbar/newresourcedialog.h new file mode 100644 index 00000000..0bfcd0ba --- /dev/null +++ b/src/urlbar/newresourcedialog.h @@ -0,0 +1,50 @@ +/* + This is a part of the GSoC project - Fancy Bookmarking + Copyright 2011 Phaneendra Hegde <pnh.pes@gmail.com> + + This library is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License 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. +*/ + +#ifndef NEWRESOURCEDIALOG_H +#define NEWRESOURCEDIALOG_H + +//kde includes +#include <KDialog> +#include <KLineEdit> + +#include <Nepomuk/Resource> + +namespace Nepomuk +{ + class NewResourceDialog : public KDialog + { + Q_OBJECT + + public: + explicit NewResourceDialog( int index,Nepomuk::Resource& nfoResource, QWidget* parent = 0 ); + virtual ~NewResourceDialog(); + + private Q_SLOTS: + void newResourceSlot(); + + private: + class Private; + Private* const d; + }; + +} + +#endif // NEWRESOURCEDIALOG_H diff --git a/src/urlbar/resourcelinkdialog.cpp b/src/urlbar/resourcelinkdialog.cpp new file mode 100644 index 00000000..9c2ab203 --- /dev/null +++ b/src/urlbar/resourcelinkdialog.cpp @@ -0,0 +1,347 @@ +/* + This is a part of the GSoC project - Fancy Bookmarking + Copyright 2011 Phaneendra Hegde <pnh.pes@gmail.com> + + This library is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License 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. +*/ + +//Local Includes +#include "resourcelinkdialog.h" +#include "newresourcedialog.h" + +//Qt Includes +#include <QtGui/QGridLayout> +#include <QtGui/QHBoxLayout> +#include <QtGui/QComboBox> +#include <QtGui/QAbstractItemView> +#include <QLabel> +#include <QListView> +#include <QPushButton> +#include <QColumnView> +#include <QStringListModel> +#include <QStandardItem> +#include <QModelIndexList> +#include <QItemSelectionModel> +#include <QMenu> +#include <QListWidget> + +//KDE Includes +#include <KLocale> +#include <KDebug> +#include <KAction> +#include <KIcon> + +//Nepomuk Includes +#include <Nepomuk/Utils/SimpleResourceModel> +#include <Nepomuk/Query/Term> +#include <Nepomuk/Query/Result> +#include <Nepomuk/Query/ResourceTypeTerm> +#include <Nepomuk/Query/QueryServiceClient> +#include <Nepomuk/Vocabulary/PIMO> +#include <Nepomuk/Vocabulary/NCO> +#include <Nepomuk/Query/QueryParser> +#include <Nepomuk/Variant> + + +class Nepomuk::ResourceLinkDialog::Private +{ +public: + void _k_selectionChanged(); + + KLineEdit *m_searchBox; + QListView *m_resourceView; + QListView *m_linkedResources; + KAction *m_removeResourceAction; + QComboBox *m_resourceSelect; + QLabel *m_resourceLabel; + QLabel *m_linkedResourceLabel; + QColumnView *m_leftPanel; + QStringListModel *m_model; + QPushButton *m_newResourceButton; + Utils::SimpleResourceModel *m_resourceModel; + Utils::SimpleResourceModel *m_linkedResourceModel; + Nepomuk::ResourceLinkDialog *q; + + Nepomuk::Resource m_nfoResource; + +}; + +void Nepomuk::ResourceLinkDialog::Private::_k_selectionChanged() +{ + q->enableButton( KDialog::User1, !m_resourceView->selectionModel()->selectedRows().isEmpty() ); +} + + +Nepomuk::ResourceLinkDialog::ResourceLinkDialog( Nepomuk::Resource &nfoResource, QWidget* parent ): + KDialog( parent ), + d( new Private() ) +{ + d->m_nfoResource = nfoResource; + setWindowTitle( i18n( "Resource Linker" ) ); + setButtons( Ok | User1 | User2 | Cancel ); + enableButtonCancel( true ); + enableButtonOk( true ); + enableButton( User1, false ); + setButtonText( Ok, i18n( "Done" ) ); + setButtonText( User1, i18n( "Link" ) ); + setButtonText( User2, "Unlink" ); + setMinimumSize(400,350); +// d->m_resourceView->setSelectionMode(QAbstractItemView::ExtendedSelection); + QGridLayout *mainLayout = new QGridLayout ( mainWidget() ); + + d->q = this; + + d->m_linkedResources = new QListView ( mainWidget() ); + d->m_linkedResourceModel = new Utils::SimpleResourceModel( this ); + d->m_linkedResources->setModel( d->m_linkedResourceModel ); + setRelatedResources(); + + d->m_searchBox = new KLineEdit ( mainWidget() ); + d->m_searchBox->setPlaceholderText( i18n( "Search resources" ) ); + connect( d->m_searchBox, SIGNAL( textChanged( QString ) ), this, SLOT( dynamicSearchingSlot() ) ); + + d->m_resourceView = new QListView ( mainWidget() ); + d->m_resourceView->setToolTip( i18n( " Double click to link resource ") ); + d->m_resourceModel = new Utils::SimpleResourceModel( this ); + d->m_resourceView->setModel( d->m_resourceModel ); + + d->m_resourceSelect = new QComboBox( mainWidget() ); + QStringList rlist; + rlist << i18n( "Any resource" ) << i18n( "Persons" ) << i18n( "Projects" ) << i18n( "Tasks" ) << i18n( "Places" ) << i18n( "Notes" ); + d->m_resourceSelect->addItems( rlist ); + d->m_resourceSelect->setItemIcon(1,KIcon("user-identity")); + d->m_resourceSelect->setItemIcon(2,KIcon("project-development")); + d->m_resourceSelect->setItemIcon(3,KIcon("view-pim-tasks")); + d->m_resourceSelect->setItemIcon(4,KIcon("user-location")); + d->m_resourceSelect->setItemIcon(5,KIcon("knotes")); + connect( d->m_resourceSelect, SIGNAL( currentIndexChanged( int ) ), this, SLOT( resourceSelectedSlot( int ) ) ); + + d->m_resourceLabel = new QLabel( i18n( "Matching resources:" ), mainWidget() ); + d->m_linkedResourceLabel = new QLabel( i18n( "Linked Resources:" ), mainWidget() ); + + + d->m_newResourceButton = new QPushButton( mainWidget() ); + d->m_newResourceButton->setText( i18n( "Create New Resource" ) ); + if( d->m_resourceSelect->currentIndex() == 0 ) { + d->m_newResourceButton->setEnabled( false ); + } + connect(d->m_newResourceButton, SIGNAL( clicked() ), this, SLOT( createNewResourceSlot() ) ); + + QVBoxLayout *vlayoutR = new QVBoxLayout; + QVBoxLayout *vlayoutL = new QVBoxLayout; + vlayoutL->addWidget( d->m_searchBox ); + vlayoutL->addWidget( d->m_resourceLabel ); + vlayoutL->addWidget( d->m_resourceView ); + vlayoutR->addWidget( d->m_resourceSelect ); + vlayoutR->addWidget( d->m_linkedResourceLabel ); + vlayoutR->addWidget( d->m_linkedResources ); + vlayoutR->addWidget( d->m_newResourceButton ); + mainLayout->addLayout( vlayoutL, 1 ,1 ); + mainLayout->addLayout(vlayoutR, 1, 2); + mainLayout->setColumnMinimumWidth(1,100); + +// d->m_linkedResources->setContextMenuPolicy(Qt::CustomContextMenu); + d->m_linkedResources->setContextMenuPolicy(Qt::CustomContextMenu); + + connect( d->m_resourceView->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), + this, SLOT(_k_selectionChanged()) ); + connect ( d->m_linkedResources->selectionModel(), SIGNAL( selectionChanged( QItemSelection, QItemSelection ) ), + this, SLOT( _k_selectionChanged() ) ); + connect ( this, SIGNAL( user1Clicked() ), this, SLOT( linkResourceSlot() ) ); + connect ( this, SIGNAL( user2Clicked() ), this, SLOT( unlinkResourceSlot() ) ); + connect ( d->m_resourceView, SIGNAL( doubleClicked(QModelIndex) ), this, SLOT( linkResourceSlot() ) ); + connect (d->m_linkedResources, SIGNAL( customContextMenuRequested(QPoint) ), this, SLOT( showContextMenu(QPoint) ) ); + if( !d->m_linkedResources->selectionModel()->selectedRows().isEmpty() ) { + enableButton( User2, true ); + } +} + +Nepomuk::ResourceLinkDialog::~ResourceLinkDialog() +{ + delete d; +} + +void Nepomuk::ResourceLinkDialog::setRelatedResources() +{ + QList<Nepomuk::Resource> relatedResourceList = d->m_nfoResource.isRelateds(); + d->m_linkedResourceModel->setResources(relatedResourceList); + +} + +void Nepomuk::ResourceLinkDialog::linkResourceSlot() +{ + QModelIndexList selectedResourceList; + selectedResourceList << d->m_resourceView->selectionModel()->selectedIndexes(); + Q_FOREACH(const QModelIndex& i, selectedResourceList) { + d->m_resourceView->selectionModel()->setCurrentIndex( i, QItemSelectionModel::NoUpdate ); + d->m_nfoResource.addIsRelated( d->m_resourceModel->resourceForIndex(d->m_resourceView->selectionModel()->currentIndex() ) ); + } + setRelatedResources(); +} + +void Nepomuk::ResourceLinkDialog::unlinkResourceSlot() +{ + d->m_nfoResource.removeProperty( Nepomuk::Resource::isRelatedUri(), + d->m_linkedResourceModel->resourceForIndex( + d->m_linkedResources->selectionModel()->currentIndex() ) ); + setRelatedResources(); +} + +void Nepomuk::ResourceLinkDialog::showContextMenu(const QPoint &pos) +{ + d->m_removeResourceAction = new KAction(this); + d->m_removeResourceAction->setText(i18n("&Unlink ")); + d->m_removeResourceAction->setIcon(KIcon("edit-delete")); + connect (d->m_removeResourceAction, SIGNAL( triggered(bool) ), this, SLOT( unlinkResourceSlot() ) ); + + QMenu myMenu; + QPoint globalPos = d->m_linkedResources->mapToGlobal(pos); + myMenu.addAction(d->m_removeResourceAction); + myMenu.exec(globalPos); +} +void Nepomuk::ResourceLinkDialog::createNewResourceSlot() +{ + Nepomuk::NewResourceDialog newResource( d->m_resourceSelect->currentIndex(), d->m_nfoResource ); + //close(); + newResource.exec(); + setRelatedResources(); +} +void Nepomuk::ResourceLinkDialog::dynamicSearchingSlot() +{ + Nepomuk::Query::Query query; + Nepomuk::Query::QueryServiceClient *test; + switch( d->m_resourceSelect->currentIndex() ) { + case 1: + query = Nepomuk::Query::QueryParser::parseQuery( d->m_searchBox->text() ); + query = query && Nepomuk::Query::ResourceTypeTerm( Nepomuk::Vocabulary::PIMO::Person() ); + test = new Nepomuk::Query::QueryServiceClient( this ); + test->query( query ); + d->m_resourceModel->clear(); + connect(test,SIGNAL( newEntries( QList<Nepomuk::Query::Result> ) ), + d->m_resourceModel,SLOT( addResults(QList<Nepomuk::Query::Result>)) ); + break; + case 2: + query = Nepomuk::Query::QueryParser::parseQuery( d->m_searchBox->text() ); + query = query && Nepomuk::Query::ResourceTypeTerm( Nepomuk::Vocabulary::PIMO::Project() ); + test = new Nepomuk::Query::QueryServiceClient( this ); + test->query( query ); + d->m_resourceModel->clear(); + connect(test,SIGNAL( newEntries( QList<Nepomuk::Query::Result> ) ), + d->m_resourceModel,SLOT( addResults(QList<Nepomuk::Query::Result>)) ); + break; + case 3: + query = Nepomuk::Query::QueryParser::parseQuery( d->m_searchBox->text() ); + query = query && Nepomuk::Query::ResourceTypeTerm( Nepomuk::Vocabulary::PIMO::Task() ); + test = new Nepomuk::Query::QueryServiceClient( this ); + test->query( query ); + d->m_resourceModel->clear(); + connect(test,SIGNAL( newEntries( QList<Nepomuk::Query::Result> ) ), + d->m_resourceModel,SLOT( addResults(QList<Nepomuk::Query::Result>)) ); + break; + case 4: + query = Nepomuk::Query::QueryParser::parseQuery( d->m_searchBox->text() ); + query = query && Nepomuk::Query::ResourceTypeTerm( Nepomuk::Vocabulary::PIMO::Location() ); + test = new Nepomuk::Query::QueryServiceClient( this ); + test->query( query ); + d->m_resourceModel->clear(); + connect(test,SIGNAL( newEntries( QList<Nepomuk::Query::Result> ) ), + d->m_resourceModel,SLOT( addResults(QList<Nepomuk::Query::Result>)) ); + break; + case 5: + query = Nepomuk::Query::QueryParser::parseQuery( d->m_searchBox->text() ); + query = query && Nepomuk::Query::ResourceTypeTerm( Nepomuk::Vocabulary::PIMO::Note() ); + test = new Nepomuk::Query::QueryServiceClient( this ); + test->query( query ); + d->m_resourceModel->clear(); + connect(test,SIGNAL( newEntries( QList<Nepomuk::Query::Result> ) ), + d->m_resourceModel,SLOT( addResults(QList<Nepomuk::Query::Result>)) ); + break; + default: + break; + } +} + + +void Nepomuk::ResourceLinkDialog::resourceSelectedSlot( int index ) +{ + enableButton( User1, true ); + d->m_newResourceButton->setEnabled( true ); + if( index == 0 ) { + d->m_resourceModel->clear(); + d->m_newResourceButton->setEnabled( false ); + } + //List Personal Contacts + if( index == 1 ) { + Nepomuk::Query::Term term = Nepomuk::Query::ResourceTypeTerm( Nepomuk::Vocabulary::PIMO::Person() ); + Nepomuk::Query::Query query( term ); + query.setLimit( 20 ); + QList<Nepomuk::Query::Result>results = Nepomuk::Query::QueryServiceClient::syncQuery( query ); + QList <Nepomuk::Resource> resource; + Q_FOREACH( const Nepomuk::Query::Result& result, results ) { + resource.append( result.resource() ); + } + d->m_resourceModel->setResources( resource ); + } + //List Projects + else if( index == 2 ) { + Nepomuk::Query::Term term = Nepomuk::Query::ResourceTypeTerm( Nepomuk::Vocabulary::PIMO::Project() ); + Nepomuk::Query::Query query( term ); + query.setLimit(20); + QList<Nepomuk::Query::Result>results = Nepomuk::Query::QueryServiceClient::syncQuery( query ); + QList <Nepomuk::Resource> resource; + Q_FOREACH( const Nepomuk::Query::Result& result, results ) { + resource.append( result.resource() ); + } + d->m_resourceModel->setResources( resource ); + } + //List Tasks + else if( index == 3 ) { + Nepomuk::Query::Term term = Nepomuk::Query::ResourceTypeTerm( Nepomuk::Vocabulary::PIMO::Task() ); + Nepomuk::Query::Query query( term ); + query.setLimit(20); + QList<Nepomuk::Query::Result>results = Nepomuk::Query::QueryServiceClient::syncQuery( query ); + QList <Nepomuk::Resource> resource; + Q_FOREACH( const Nepomuk::Query::Result& result, results ) { + resource.append( result.resource() ); + } + d->m_resourceModel->setResources( resource ); + } + //List Places + else if( index == 4 ) { + Nepomuk::Query::Term term = Nepomuk::Query::ResourceTypeTerm( Nepomuk::Vocabulary::PIMO::Location() ); + Nepomuk::Query::Query query( term ); + query.setLimit(20); + QList<Nepomuk::Query::Result>results = Nepomuk::Query::QueryServiceClient::syncQuery( query ); + QList <Nepomuk::Resource> resource; + Q_FOREACH( const Nepomuk::Query::Result& result, results ) { + resource.append( result.resource() ); + } + d->m_resourceModel->setResources( resource ); + } + //List Notes + else if( index == 5 ) { + Nepomuk::Query::Term term = Nepomuk::Query::ResourceTypeTerm( Nepomuk::Vocabulary::PIMO::Note() ); + Nepomuk::Query::Query query( term ); + query.setLimit(20); + QList<Nepomuk::Query::Result>results = Nepomuk::Query::QueryServiceClient::syncQuery( query ); + QList <Nepomuk::Resource> resource; + Q_FOREACH( const Nepomuk::Query::Result& result, results ) { + resource.append( result.resource() ); + } + d->m_resourceModel->setResources( resource ); + } +} + diff --git a/src/urlbar/resourcelinkdialog.h b/src/urlbar/resourcelinkdialog.h new file mode 100644 index 00000000..7e623778 --- /dev/null +++ b/src/urlbar/resourcelinkdialog.h @@ -0,0 +1,66 @@ +/* + This is a part of the GSoC project - Fancy Bookmarking + Copyright 2011 Phaneendra Hegde <pnh.pes@gmail.com> + + This library is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License 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. +*/ + + +#ifndef RESOURCELINKDIALOG_H +#define RESOURCELINKDIALOG_H + +//Qt includes +#include <QListView> + +//kde includes +#include <KDialog> +#include <KLineEdit> +#include <KConfigDialog> + +namespace Nepomuk +{ + class Resource; + namespace Query { + class Query; + } + + class ResourceLinkDialog : public KDialog + { + Q_OBJECT + + public: + explicit ResourceLinkDialog( Nepomuk::Resource& nfoResource, QWidget* parent = 0 ); + virtual ~ResourceLinkDialog(); + void setRelatedResources(); + + private Q_SLOTS: + void dynamicSearchingSlot(); + void resourceSelectedSlot(int); + void linkResourceSlot(); + void unlinkResourceSlot(); + void createNewResourceSlot(); + void showContextMenu(const QPoint&); + + + private: + class Private; + Private* const d; + + }; + +} + +#endif // RESOURCELINKDIALOG_H |