diff options
Diffstat (limited to 'src/urlbar/resourcelinkdialog.cpp')
-rw-r--r-- | src/urlbar/resourcelinkdialog.cpp | 385 |
1 files changed, 385 insertions, 0 deletions
diff --git a/src/urlbar/resourcelinkdialog.cpp b/src/urlbar/resourcelinkdialog.cpp new file mode 100644 index 00000000..8a4b5685 --- /dev/null +++ b/src/urlbar/resourcelinkdialog.cpp @@ -0,0 +1,385 @@ +/* ============================================================ +* +* This is a part of the GSoC project 2011 - Fancy Bookmarking +* +* Copyright (c) 2011-2012 by Phaneendra Hegde <pnh.pes@gmail.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/>. +* +* ============================================================ */ + + +// Self Includes +#include "resourcelinkdialog.h" +#include "resourcelinkdialog.moc" + +// Local Includes +#include "newresourcedialog.h" + +// Qt Includes +#include <QGridLayout> +#include <QHBoxLayout> +#include <QComboBox> +#include <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); + + 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); + } +} |