--- a/qtmobility/examples/samplephonebook/contactlistpage.cpp Fri Apr 16 15:51:22 2010 +0300
+++ b/qtmobility/examples/samplephonebook/contactlistpage.cpp Mon May 03 13:18:40 2010 +0300
@@ -49,59 +49,119 @@
#include <QtGui>
-ContactListPage::ContactListPage(QWidget *parent)
- : QWidget(parent)
+ContactListPage::ContactListPage(QMainWindow *mainWindow, QWidget *parent)
+ : QWidget(parent), m_mainWindow(mainWindow)
{
m_manager = 0;
m_currentFilter = QContactFilter();
m_backendsCombo = new QComboBox(this);
QStringList availableManagers = QContactManager::availableManagers();
+ availableManagers.removeAll("invalid");
+ foreach(QString managerName, availableManagers) {
+
+ QMap<QString, QString> params;
+ QString managerUri = QContactManager::buildUri(managerName, params);
+
+ // Add some parameters to SIM backend so that we can use
+ // all the stores.
+ if (managerName == "symbiansim") {
+ availableManagers.removeAll("symbiansim");
+
+ availableManagers.append("symbiansim:adn");
+ params.insert("store", "ADN");
+ managerUri = QContactManager::buildUri(managerName, params);
+ m_availableManagers.insert(availableManagers.last(), managerUri);
+
+ availableManagers.append("symbiansim:fdn");
+ params.clear();
+ params.insert("store", "FDN");
+ managerUri = QContactManager::buildUri(managerName, params);
+ m_availableManagers.insert(availableManagers.last(), managerUri);
+
+ availableManagers.append("symbiansim:sdn");
+ params.clear();
+ params.insert("store", "SDN");
+ managerUri = QContactManager::buildUri(managerName, params);
+ m_availableManagers.insert(availableManagers.last(), managerUri);
+ }
+ else {
+ m_availableManagers.insert(managerName, managerUri);
+ }
+ }
m_backendsCombo->addItems(availableManagers);
connect(m_backendsCombo, SIGNAL(currentIndexChanged(QString)), this, SLOT(backendSelected()));
- m_filterActiveLabel = new QLabel("Inactive");
+ m_filterActiveLabel = new QLabel(tr("Filter active"));
m_filterActiveLabel->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
+ QVBoxLayout *bookLayout = new QVBoxLayout;
+ QFormLayout *backendLayout = new QFormLayout;
+ backendLayout->addRow(tr("Store:"), m_backendsCombo);
+ backendLayout->addRow(m_filterActiveLabel);
+ bookLayout->addLayout(backendLayout);
+
m_contactsList = new QListWidget(this);
+ bookLayout->addWidget(m_contactsList);
- QPushButton* m_addContactBtn = new QPushButton("Add", this);
- connect(m_addContactBtn, SIGNAL(clicked()), this, SLOT(addContactClicked()));
- QPushButton* m_editBtn = new QPushButton("Edit", this);
- connect(m_editBtn, SIGNAL(clicked()), this, SLOT(editClicked()));
- QPushButton* m_deleteBtn = new QPushButton("Delete", this);
- connect(m_deleteBtn, SIGNAL(clicked()), this, SLOT(deleteClicked()));
- QPushButton* m_filterBtn = new QPushButton("Filter", this);
- connect(m_filterBtn, SIGNAL(clicked()), this, SLOT(filterClicked()));
- QPushButton* m_importBtn = new QPushButton("Import");
- connect(m_importBtn, SIGNAL(clicked()), this, SLOT(importClicked()));
- QPushButton* m_exportBtn = new QPushButton("Export");
- connect(m_exportBtn, SIGNAL(clicked()), this, SLOT(exportClicked()));
+ // Action buttons at the bottom
+ QHBoxLayout *btnLayout1 = new QHBoxLayout;
+ QPushButton* addBtn = new QPushButton(tr("&Add"), this);
+ connect(addBtn, SIGNAL(clicked()), this, SLOT(addClicked()));
+ btnLayout1->addWidget(addBtn);
- QFormLayout *backendLayout = new QFormLayout;
- backendLayout->addRow("Store:", m_backendsCombo);
- backendLayout->addRow("Filter:", m_filterActiveLabel);
-
- QHBoxLayout *btnLayout1 = new QHBoxLayout;
- btnLayout1->addWidget(m_addContactBtn);
- btnLayout1->addWidget(m_editBtn);
- btnLayout1->addWidget(m_deleteBtn);
- btnLayout1->addWidget(m_filterBtn);
+ QPushButton* editBtn = new QPushButton(tr("&Edit"), this);
+ connect(editBtn, SIGNAL(clicked()), this, SLOT(editClicked()));
+ btnLayout1->addWidget(editBtn);
- QHBoxLayout *btnLayout2 = new QHBoxLayout;
- btnLayout2->addWidget(m_importBtn);
- btnLayout2->addWidget(m_exportBtn);
+ QPushButton* deleteBtn = new QPushButton(tr("&Delete"), this);
+ connect(deleteBtn, SIGNAL(clicked()), this, SLOT(deleteClicked()));
+ btnLayout1->addWidget(deleteBtn);
- QVBoxLayout *bookLayout = new QVBoxLayout;
- bookLayout->addLayout(backendLayout);
- bookLayout->addWidget(m_contactsList);
bookLayout->addLayout(btnLayout1);
-#ifdef BUILD_VERSIT
- bookLayout->addLayout(btnLayout2);
-#endif
setLayout(bookLayout);
+ // Add items to the menu
+ if (m_mainWindow) {
+#if defined(Q_OS_SYMBIAN) || defined(Q_WS_MAEMO_5) || defined(Q_WS_MAEMO_6)
+ QMenuBar *optionsMenu = m_mainWindow->menuBar();
+#else
+ QMenu *optionsMenu = new QMenu(tr("&Contacts"), this);
+ m_mainWindow->menuBar()->addMenu(optionsMenu);
+#endif
+ QAction* addAction = new QAction(tr("&Add Contact..."), this);
+ connect(addAction, SIGNAL(triggered()), this, SLOT(addClicked()));
+ optionsMenu->addAction(addAction);
+ QAction* editAction = new QAction(tr("&Edit Contact..."), this);
+ connect(editAction, SIGNAL(triggered()), this, SLOT(editClicked()));
+ optionsMenu->addAction(editAction);
+ QAction* deleteAction = new QAction(tr("&Delete Contact"), this);
+ connect(deleteAction, SIGNAL(triggered()), this, SLOT(deleteClicked()));
+ optionsMenu->addAction(deleteAction);
+ optionsMenu->addSeparator();
+ QAction* filterAction = new QAction(tr("Apply &Filter..."), this);
+ connect(filterAction, SIGNAL(triggered()), this, SLOT(filterClicked()));
+ optionsMenu->addAction(filterAction);
+ QAction* clearFilterAction = new QAction(tr("&Clear Filter"), this);
+ connect(clearFilterAction, SIGNAL(triggered()), this, SIGNAL(clearFilter()));
+ optionsMenu->addAction(clearFilterAction);
+ optionsMenu->addSeparator();
+
+#ifdef BUILD_VERSIT
+ QAction* importAction = new QAction(tr("&Import contacts..."), this);
+ connect(importAction, SIGNAL(triggered()), this, SLOT(importClicked()));
+ optionsMenu->addAction(importAction);
+ QAction* exportAction = new QAction(tr("Ex&port contacts..."), this);
+ connect(exportAction, SIGNAL(triggered()), this, SLOT(exportClicked()));
+ optionsMenu->addAction(exportAction);
+ optionsMenu->addSeparator();
+#endif
+ QAction* exitAction = new QAction(tr("E&xit"), this);
+ connect(exitAction, SIGNAL(triggered()), qApp, SLOT(quit()));
+ optionsMenu->addAction(exitAction);
+ }
+
// force update to backend.
QTimer::singleShot(0, this, SLOT(backendSelected()));
}
@@ -117,18 +177,24 @@
void ContactListPage::backendSelected()
{
- QString backend = m_backendsCombo->currentText();
+ QString managerUri = m_availableManagers.value(m_backendsCombo->currentText());
// first, check to see if they reselected the same backend.
- if (m_manager && m_manager->managerName() == backend)
+ if (m_manager && m_manager->managerUri() == managerUri)
return;
// the change is real. update.
- if (m_initialisedManagers.contains(backend)) {
- m_manager = m_initialisedManagers.value(backend);
+ if (m_initialisedManagers.contains(managerUri)) {
+ m_manager = m_initialisedManagers.value(managerUri);
} else {
- m_manager = new QContactManager(backend);
- m_initialisedManagers.insert(backend, m_manager);
+ m_manager = QContactManager::fromUri(managerUri);
+ if (m_manager->error()) {
+ QMessageBox::information(this, tr("Failed!"), QString("Failed to open store!\n(error code %1)").arg(m_manager->error()));
+ delete m_manager;
+ m_manager = 0;
+ return;
+ }
+ m_initialisedManagers.insert(managerUri, m_manager);
}
// signal that the manager has changed.
@@ -140,14 +206,11 @@
void ContactListPage::rebuildList(const QContactFilter& filter)
{
- // first, check to see whether the filter does anything
- if (filter == QContactFilter())
- m_filterActiveLabel->setText("Inactive");
- else
- m_filterActiveLabel->setText("Active");
+ m_currentFilter = QContactManagerEngine::canonicalizedFilter(filter);
+
+ m_filterActiveLabel->setVisible(m_currentFilter != QContactFilter());
QContact currContact;
- m_currentFilter = filter;
m_contactsList->clear();
m_idToListIndex.clear();
QList<QContactLocalId> contactIds = m_manager->contactIds(m_currentFilter);
@@ -161,9 +224,10 @@
}
}
-void ContactListPage::addContactClicked()
+void ContactListPage::addClicked()
{
- emit showEditorPage(QContactLocalId(0));
+ if (m_manager)
+ emit showEditorPage(QContactLocalId(0));
}
void ContactListPage::editClicked()
@@ -175,7 +239,8 @@
void ContactListPage::filterClicked()
{
- emit showFilterPage(m_currentFilter);
+ if (m_manager)
+ emit showFilterPage(m_currentFilter);
}
void ContactListPage::deleteClicked()
@@ -189,12 +254,11 @@
qWarning() << "Nothing to delete.";
return;
}
-
+
QContactLocalId contactId = QContactLocalId(m_contactsList->currentItem()->data(Qt::UserRole).toUInt());
bool success = m_manager->removeContact(contactId);
if (success) {
delete m_contactsList->takeItem(m_contactsList->currentRow());
- QMessageBox::information(this, "Success!", "Contact deleted successfully!");
}
else
QMessageBox::information(this, "Failed!", "Failed to delete contact!");
@@ -216,10 +280,12 @@
reader.setDevice(&file);
if (reader.startReading() && reader.waitForFinished()) {
QVersitContactImporter importer;
- QList<QContact> contacts = importer.importContacts(reader.results());
- QMap<int, QContactManager::Error> errorMap;
- m_manager->saveContacts(&contacts, &errorMap);
- rebuildList(m_currentFilter);
+ if (importer.importDocuments(reader.results())) {
+ QList<QContact> contacts = importer.contacts();
+ QMap<int, QContactManager::Error> errorMap;
+ m_manager->saveContacts(&contacts, &errorMap);
+ rebuildList(m_currentFilter);
+ }
}
}
#endif
@@ -232,7 +298,7 @@
qWarning() << "No manager selected; cannot import";
return;
}
- QList<QContact> contacts = m_manager->contacts(QList<QContactSortOrder>(), QStringList());
+ QList<QContact> contacts = m_manager->contacts(QList<QContactSortOrder>(), QContactFetchHint());
QString fileName = QFileDialog::getSaveFileName(this, tr("Save vCard"),
"./contacts.vcf",
tr("vCards (*.vcf)"));
@@ -240,11 +306,13 @@
file.open(QIODevice::WriteOnly);
if (file.isWritable()) {
QVersitContactExporter exporter;
- QList<QVersitDocument> documents = exporter.exportContacts(contacts);
- QVersitWriter writer;
- writer.setDevice(&file);
- writer.startWriting(documents);
- writer.waitForFinished();
+ if(exporter.exportContacts(contacts, QVersitDocument::VCard30Type)) {
+ QList<QVersitDocument> documents = exporter.documents();
+ QVersitWriter writer;
+ writer.setDevice(&file);
+ writer.startWriting(documents);
+ writer.waitForFinished();
+ }
}
#endif
}