blob: bebd2fbd30295e8318b818167336a92334a5711b [file] [log] [blame]
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
/*
* Copyright (c) 2013, Regents of the University of California
* Yingdi Yu
*
* BSD license, See the LICENSE file for more information
*
* Author: Yingdi Yu <yingdi@cs.ucla.edu>
*/
#include "contact-panel.hpp"
#include "ui_contact-panel.h"
#include <QMenu>
#include <QItemSelectionModel>
#include <QModelIndex>
#include <QtSql/QSqlRecord>
#include <QtSql/QSqlField>
#include <QtSql/QSqlError>
#ifndef Q_MOC_RUN
#include "logging.h"
#endif
// INIT_LOGGER("ContactPanel");
namespace chronos {
ContactPanel::ContactPanel(QWidget *parent)
: QDialog(parent)
, ui(new Ui::ContactPanel)
, m_setAliasDialog(new SetAliasDialog)
, m_contactListModel(new QStringListModel)
, m_trustScopeModel(0)
, m_endorseDataModel(0)
, m_endorseComboBoxDelegate(new EndorseComboBoxDelegate)
{
ui->setupUi(this);
ui->ContactList->setModel(m_contactListModel);
m_menuAlias = new QAction("Set Alias", this);
m_menuDelete = new QAction("Delete", this);
connect(ui->ContactList->selectionModel(),
SIGNAL(selectionChanged(const QItemSelection &, const QItemSelection &)),
this,
SLOT(onSelectionChanged(const QItemSelection &, const QItemSelection &)));
connect(ui->ContactList, SIGNAL(customContextMenuRequested(const QPoint&)),
this, SLOT(onContextMenuRequested(const QPoint&)));
connect(ui->isIntroducer, SIGNAL(stateChanged(int)),
this, SLOT(onIsIntroducerChanged(int)));
connect(ui->addScope, SIGNAL(clicked()),
this, SLOT(onAddScopeClicked()));
connect(ui->deleteScope, SIGNAL(clicked()),
this, SLOT(onDeleteScopeClicked()));
connect(ui->saveButton, SIGNAL(clicked()),
this, SLOT(onSaveScopeClicked()));
connect(ui->endorseButton, SIGNAL(clicked()),
this, SLOT(onEndorseButtonClicked()));
connect(m_setAliasDialog, SIGNAL(aliasChanged(const QString&, const QString&)),
this, SLOT(onAliasChanged(const QString&, const QString&)));
}
ContactPanel::~ContactPanel()
{
if (m_contactListModel)
delete m_contactListModel;
if (m_trustScopeModel)
delete m_trustScopeModel;
if (m_endorseDataModel)
delete m_endorseDataModel;
delete m_setAliasDialog;
delete m_endorseComboBoxDelegate;
delete m_menuAlias;
delete m_menuDelete;
delete ui;
}
//private methods
void
ContactPanel::resetPanel()
{
// Clean up General tag.
ui->NameData->clear();
ui->NameSpaceData->clear();
ui->InstitutionData->clear();
// Clean up TrustScope tag.
ui->isIntroducer->setChecked(false);
ui->addScope->setEnabled(false);
ui->deleteScope->setEnabled(false);
m_trustScopeModel = new QSqlTableModel;
m_trustScopeModel->setHeaderData(0, Qt::Horizontal, QObject::tr("ID"));
m_trustScopeModel->setHeaderData(1, Qt::Horizontal, QObject::tr("Contact"));
m_trustScopeModel->setHeaderData(2, Qt::Horizontal, QObject::tr("TrustScope"));
ui->trustScopeList->setModel(m_trustScopeModel);
ui->trustScopeList->setColumnHidden(0, true);
ui->trustScopeList->setColumnHidden(1, true);
ui->trustScopeList->show();
ui->trustScopeList->setEnabled(false);
// Clean up Endorse tag.
m_endorseDataModel = new QSqlTableModel;
m_endorseDataModel->setHeaderData(0, Qt::Horizontal, QObject::tr("Identity"));
m_endorseDataModel->setHeaderData(1, Qt::Horizontal, QObject::tr("Type"));
m_endorseDataModel->setHeaderData(2, Qt::Horizontal, QObject::tr("Value"));
m_endorseDataModel->setHeaderData(3, Qt::Horizontal, QObject::tr("Endorse"));
ui->endorseList->setModel(m_endorseDataModel);
ui->endorseList->setColumnHidden(0, true);
ui->endorseList->resizeColumnToContents(1);
ui->endorseList->resizeColumnToContents(2);
ui->endorseList->setItemDelegateForColumn(3, m_endorseComboBoxDelegate);
ui->endorseList->show();
ui->endorseList->setEnabled(false);
// Clean up contact list.
m_contactAliasList.clear();
m_contactIdList.clear();
m_currentSelectedContact.clear();
m_contactListModel->setStringList(m_contactAliasList);
}
// public slots
void
ContactPanel::onCloseDBModule()
{
// _LOG_DEBUG("close db module");
if (m_trustScopeModel) {
delete m_trustScopeModel;
// _LOG_DEBUG("trustScopeModel closed");
}
if (m_endorseDataModel) {
delete m_endorseDataModel;
// _LOG_DEBUG("endorseDataModel closed");
}
}
void
ContactPanel::onIdentityUpdated(const QString& identity)
{
resetPanel();
emit waitForContactList(); // Re-load contact list;
}
void
ContactPanel::onContactAliasListReady(const QStringList& aliasList)
{
m_contactAliasList = aliasList;
m_contactListModel->setStringList(m_contactAliasList);
}
void
ContactPanel::onContactIdListReady(const QStringList& idList)
{
m_currentSelectedContact.clear();
m_contactIdList = idList;
}
void
ContactPanel::onContactInfoReady(const QString& identity,
const QString& name,
const QString& institute,
bool isIntro)
{
ui->NameData->setText(name);
ui->NameSpaceData->setText(identity);
ui->InstitutionData->setText(institute);
QString filter = QString("contact_namespace = '%1'").arg(identity);
m_trustScopeModel->setEditStrategy(QSqlTableModel::OnManualSubmit);
m_trustScopeModel->setTable("TrustScope");
m_trustScopeModel->setFilter(filter);
m_trustScopeModel->select();
ui->trustScopeList->setModel(m_trustScopeModel);
ui->trustScopeList->setColumnHidden(0, true);
ui->trustScopeList->setColumnHidden(1, true);
ui->trustScopeList->show();
if (isIntro) {
ui->isIntroducer->setChecked(true);
ui->addScope->setEnabled(true);
ui->deleteScope->setEnabled(true);
ui->trustScopeList->setEnabled(true);
}
else {
ui->isIntroducer->setChecked(false);
ui->addScope->setEnabled(false);
ui->deleteScope->setEnabled(false);
ui->trustScopeList->setEnabled(false);
}
QString filter2 = QString("profile_identity = '%1'").arg(identity);
m_endorseDataModel->setEditStrategy(QSqlTableModel::OnManualSubmit);
m_endorseDataModel->setTable("ContactProfile");
m_endorseDataModel->setFilter(filter2);
m_endorseDataModel->select();
ui->endorseList->setModel(m_endorseDataModel);
ui->endorseList->setColumnHidden(0, true);
ui->endorseList->resizeColumnToContents(1);
ui->endorseList->resizeColumnToContents(2);
ui->endorseList->setItemDelegateForColumn(3, m_endorseComboBoxDelegate);
ui->endorseList->show();
ui->endorseList->setEnabled(true);
}
// private slots
void
ContactPanel::onSelectionChanged(const QItemSelection &selected,
const QItemSelection &deselected)
{
QModelIndexList items = selected.indexes();
QString alias = m_contactListModel->data(items.first(), Qt::DisplayRole).toString();
bool contactFound = false;
for (int i = 0; i < m_contactAliasList.size(); i++) {
if (alias == m_contactAliasList[i]) {
contactFound = true;
m_currentSelectedContact = m_contactIdList[i];
break;
}
}
if (!contactFound) {
emit warning("This should not happen: ContactPanel::updateSelection #1");
return;
}
emit waitForContactInfo(m_currentSelectedContact);
}
void
ContactPanel::onContextMenuRequested(const QPoint& pos)
{
QMenu menu(ui->ContactList);
menu.addAction(m_menuAlias);
connect(m_menuAlias, SIGNAL(triggered()),
this, SLOT(onSetAliasDialogRequested()));
menu.addAction(m_menuDelete);
connect(m_menuDelete, SIGNAL(triggered()),
this, SLOT(onContactDeletionRequested()));
menu.exec(ui->ContactList->mapToGlobal(pos));
}
void
ContactPanel::onSetAliasDialogRequested()
{
for (int i = 0; i < m_contactIdList.size(); i++)
if (m_contactIdList[i] == m_currentSelectedContact) {
m_setAliasDialog->setTargetIdentity(m_currentSelectedContact, m_contactAliasList[i]);
m_setAliasDialog->show();
return;
}
}
void
ContactPanel::onContactDeletionRequested()
{
QItemSelectionModel* selectionModel = ui->ContactList->selectionModel();
QModelIndexList selectedList = selectionModel->selectedIndexes();
for (QModelIndexList::iterator it = selectedList.begin(); it != selectedList.end(); it++) {
QString alias = m_contactListModel->data(*it, Qt::DisplayRole).toString();
for (int i = 0; i < m_contactAliasList.size(); i++)
if (m_contactAliasList[i] == alias) {
emit removeContact(m_contactIdList[i]);
return;
}
}
}
void
ContactPanel::onIsIntroducerChanged(int state)
{
if (state == Qt::Checked) {
ui->addScope->setEnabled(true);
ui->deleteScope->setEnabled(true);
ui->trustScopeList->setEnabled(true);
emit updateIsIntroducer(m_currentSelectedContact, true);
}
else {
ui->addScope->setEnabled(false);
ui->deleteScope->setEnabled(false);
ui->trustScopeList->setEnabled(false);
emit updateIsIntroducer(m_currentSelectedContact, false);
}
}
void
ContactPanel::onAddScopeClicked()
{
int rowCount = m_trustScopeModel->rowCount();
QSqlRecord record;
QSqlField identityField("contact_namespace", QVariant::String);
record.append(identityField);
record.setValue("contact_namespace", m_currentSelectedContact);
m_trustScopeModel->insertRow(rowCount);
m_trustScopeModel->setRecord(rowCount, record);
}
void
ContactPanel::onDeleteScopeClicked()
{
QItemSelectionModel* selectionModel = ui->trustScopeList->selectionModel();
QModelIndexList indexList = selectionModel->selectedIndexes();
for (int i = indexList.size() - 1; i >= 0; i--)
m_trustScopeModel->removeRow(indexList[i].row());
m_trustScopeModel->submitAll();
}
void
ContactPanel::onSaveScopeClicked()
{
m_trustScopeModel->submitAll();
}
void
ContactPanel::onEndorseButtonClicked()
{
m_endorseDataModel->submitAll();
emit updateEndorseCertificate(m_currentSelectedContact);
}
void
ContactPanel::onAliasChanged(const QString& identity, const QString& alias)
{
emit updateAlias(identity, alias);
}
} // namespace chronos
#if WAF
#include "contact-panel.moc"
// #include "contact-panel.cpp.moc"
#endif