phonebookui/pbkcommonui/src/cntnamesview_p.cpp
changeset 25 76a2435edfd4
child 27 de1630741fbe
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/pbkcommonui/src/cntnamesview_p.cpp	Fri Apr 16 14:53:18 2010 +0300
@@ -0,0 +1,511 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+#include "cntnamesview_p.h"
+#include "cntaction.h"
+#include "qtpbkglobal.h"
+
+#include <qapplication.h>
+#include <hbabstractviewitem.h>
+#include <hbaction.h>
+#include <hbnotificationdialog.h>
+#include <hbmenu.h>
+#include <hbtoolbar.h>
+#include <hbmainwindow.h>
+#include <hbview.h>
+#include <hbtextitem.h>
+#include <hbdocumentloader.h>
+#include <hblistview.h>
+#include <hblistviewitem.h>
+#include <hbgroupbox.h>
+#include <hbsearchpanel.h>
+#include <hbtoolbar.h>
+#include <hbframebackground.h>
+#include <hbstaticvkbhost.h>
+#include <hbmessagebox.h>
+
+#include <QGraphicsLinearLayout>
+#include <QList>
+
+const char *CNT_CONTACTLIST_XML = ":/xml/contacts_namelist.docml";
+
+CntNamesViewPrivate::CntNamesViewPrivate() :
+    QObject(),
+    mViewManager(0),
+    mListModel(0),
+    mView(0),
+    mListView(0),
+    mEmptyList(0),
+    mBanner(0),
+    mSearchPanel(0),
+    mLoader(0),
+    mLayout(0),
+    mVirtualKeyboard(0),
+    mMenuBuilder(0),
+    mIsDefault(true),
+    mId( CntViewParameters::namesView )
+{
+    bool ok;
+    document()->load( CNT_CONTACTLIST_XML, &ok);
+    if (!ok) {
+        qFatal("Unable to read %S", CNT_CONTACTLIST_XML);
+    }
+    mView = static_cast<HbView*> (document()->findWidget("view"));
+
+    mVirtualKeyboard = new HbStaticVkbHost(mView);
+    connect(mVirtualKeyboard, SIGNAL(keypadOpened()), this, SLOT(handleKeypadOpen()));
+    connect(mVirtualKeyboard, SIGNAL(keypadClosed()), this, SLOT(handleKeypadClose()));
+    
+    mSoftkey = new HbAction(Hb::BackNaviAction, mView);
+       
+    HbAction* newContact = static_cast<HbAction*> (document()->findObject("cnt:newcontact"));
+    HbAction* findContacts = static_cast<HbAction*> (document()->findObject("cnt:find"));
+    HbAction* groups = static_cast<HbAction*> (document()->findObject("cnt:groups"));
+    HbAction* importSim = static_cast<HbAction*> (document()->findObject("cnt:importsim"));
+       
+    connect(mSoftkey, SIGNAL(triggered()), this, SLOT(showPreviousView()));
+    connect(newContact, SIGNAL(triggered()), this, SLOT(createNewContact()));
+    connect(findContacts, SIGNAL(triggered()), this, SLOT(showFinder()));
+    connect(groups, SIGNAL(triggered()), this, SLOT(showCollectionView()));
+    connect( importSim, SIGNAL(triggered()), this, SLOT(importSim()) );
+    connect(list(), SIGNAL(longPressed(HbAbstractViewItem*,QPointF)), this,
+           SLOT(showContextMenu(HbAbstractViewItem*,QPointF)));
+    connect(list(), SIGNAL(activated (const QModelIndex&)), this,
+           SLOT(showContactView(const QModelIndex&)));
+       
+}
+
+CntNamesViewPrivate::~CntNamesViewPrivate()
+{
+    mView->deleteLater();
+
+    delete mListModel;
+    mListModel = 0;
+
+    delete mListView;
+    mListView = 0;
+
+    delete mSearchPanel;
+    mSearchPanel = 0;
+
+    delete mEmptyList;
+    mEmptyList = 0;
+
+    delete mBanner;
+    mBanner = 0;
+
+    delete mLoader;
+    mLoader = 0;
+
+    delete mVirtualKeyboard;
+    mVirtualKeyboard = 0;
+    
+    delete mMenuBuilder;
+    mMenuBuilder = 0;
+}
+
+void CntNamesViewPrivate::activate(CntAbstractViewManager* aMgr, const CntViewParameters& aArgs)
+{
+    mViewManager = aMgr;
+    if (!mListModel) {
+        QContactSortOrder sortOrderFirstName;
+        sortOrderFirstName.setDetailDefinitionName(QContactName::DefinitionName,
+            QContactName::FieldFirst);
+
+        QContactSortOrder sortOrderLastName;
+        sortOrderLastName.setDetailDefinitionName(QContactName::DefinitionName,
+            QContactName::FieldLast);
+
+        QList<QContactSortOrder> sortOrders;
+        sortOrders.append(sortOrderFirstName);
+        sortOrders.append(sortOrderLastName);
+
+        mListModel = new MobCntModel(mViewManager->contactManager(SYMBIAN_BACKEND), QContactFilter(), sortOrders);
+
+        QContactDetailFilter filter;
+        filter.setDetailDefinitionName(QContactType::DefinitionName, QContactType::FieldType);
+
+        QString typeContact = QContactType::TypeContact;
+        filter.setValue(typeContact);
+
+        mListModel->setFilterAndSortOrder(filter);
+        mListModel->showMyCard(true);
+    }
+
+    list()->setModel(mListModel);
+
+    mMenuBuilder = new CntActionMenuBuilder( mListModel->myCardId() );
+    connect( mMenuBuilder, SIGNAL(deleteContact(QContact&)), this, SLOT(deleteContact(QContact&)) );
+    connect( mMenuBuilder, SIGNAL(editContact(QContact&)), this, SLOT(showContactEditorView(QContact&)) );
+    connect( mMenuBuilder, SIGNAL(openContact(QContact&)), this, SLOT(showContactView(QContact&)) );
+    connect( mMenuBuilder, SIGNAL(performContactAction(QContact&,QString)), this, SLOT(executeAction(QContact&,QString)));
+        
+    if ( mView->navigationAction() != mSoftkey)
+    {
+        mView->setNavigationAction(mSoftkey);
+    }
+    
+    QContactManager* contactManager = aMgr->contactManager( SYMBIAN_BACKEND );
+    QString action = aArgs.selectedAction();
+    if ( action == "save" )
+    {
+        QString name = contactManager->synthesizedDisplayLabel( aArgs.selectedContact() );
+        HbNotificationDialog::launchDialog(qtTrId("Contact \"%1\" saved").arg(name));
+
+        scrollTo( aArgs.selectedContact() );
+    }
+           
+    else if ( aArgs.selectedAction() == "delete" )
+    {
+        QString name = contactManager->synthesizedDisplayLabel( aArgs.selectedContact() );
+        HbNotificationDialog::launchDialog(qtTrId("%1 deleted").arg(name));
+    }    
+    else if ( aArgs.selectedAction() == "failed")
+    {
+        HbNotificationDialog::launchDialog(qtTrId("SAVING FAILED!"));
+    }
+}
+
+void CntNamesViewPrivate::deactivate()
+{
+    hideFinder();
+
+    // Don't delete the model, default views will retain it between
+    // activate/deactivate. do it in destructor.
+    list()->setModel(NULL);
+    
+    delete mMenuBuilder;
+    mMenuBuilder = 0;
+    
+    // delete the hbsearch since we can not empty text from outside.
+    delete mSearchPanel;
+    mSearchPanel = 0;
+}
+
+void CntNamesViewPrivate::scrollTo(const QContact &aContact)
+{
+    if (mListModel) 
+    {
+        QModelIndex index = mListModel->indexOfContact(aContact);
+
+        if (index.isValid()) 
+        {
+            list()->scrollTo(index);
+        }
+    }
+}
+void CntNamesViewPrivate::setFilter(const QString &filterString)
+{
+    QStringList searchList = filterString.split(QRegExp("\\s+"), QString::SkipEmptyParts);
+    QContactDetailFilter filter;
+    filter.setDetailDefinitionName(QContactDisplayLabel::DefinitionName,
+        QContactDisplayLabel::FieldLabel);
+    filter.setMatchFlags(QContactFilter::MatchStartsWith);
+    filter.setValue(searchList);
+
+    mListModel->setFilterAndSortOrder(filter);
+
+    if (mListModel->rowCount() == 0) {
+        layout()->removeItem(list());
+        layout()->insertItem(1, emptyLabel());
+        list()->setVisible(false);
+        emptyLabel()->setVisible(true);
+    }
+    else {
+        layout()->removeItem(emptyLabel());
+        layout()->insertItem(1, list());
+        emptyLabel()->setVisible(false);
+        list()->setVisible(true);
+    }
+    mListModel->showMyCard(false);
+}
+
+void CntNamesViewPrivate::handleKeypadOpen()
+{
+    qreal searchHeight = search()->size().height();
+    qreal bannerHeight = groupBox()->size().height();
+    qreal heightToSet = mView->size().height() - mVirtualKeyboard->keyboardArea().height()
+        - searchHeight - bannerHeight;
+
+    list()->setMaximumHeight(heightToSet);
+    emptyLabel()->setMaximumHeight(heightToSet);
+}
+
+void CntNamesViewPrivate::handleKeypadClose()
+{
+    list()->setMaximumHeight(mView->size().height());
+    emptyLabel()->setMaximumHeight(mView->size().height());
+}
+
+void CntNamesViewPrivate::showBanner(const QString aText)
+{
+    layout()->insertItem(0, groupBox());
+    groupBox()->setHeading(aText);
+    groupBox()->setVisible(true);
+}
+
+void CntNamesViewPrivate::hideBanner()
+{
+    layout()->removeItem(groupBox());
+    groupBox()->setVisible(false);
+}
+
+void CntNamesViewPrivate::showFinder()
+{
+    showBanner(hbTrId("txt_phob_subtitle_find_all_contacts"));
+
+    mView->toolBar()->hide();
+    setFilter(QString());
+
+    list()->setVisible(true);
+    layout()->addItem(search());
+    search()->setVisible(true);
+
+    mListModel->showMyCard(false);
+}
+
+void CntNamesViewPrivate::hideFinder()
+{
+    layout()->removeItem(emptyLabel());
+    layout()->removeItem(search());
+    emptyLabel()->setVisible(false);
+    search()->setVisible(false);
+
+    hideBanner();
+
+    layout()->addItem(list());
+    list()->setVisible(true);
+
+    QContactDetailFilter filter;
+    filter.setDetailDefinitionName(QContactType::DefinitionName, QContactType::FieldType);
+    QString typeContact = QContactType::TypeContact;
+    filter.setValue(typeContact);
+
+    mListModel->setFilterAndSortOrder(filter);
+    mListModel->showMyCard(true);
+
+    mView->toolBar()->show();
+}
+
+bool CntNamesViewPrivate::isFinderVisible()
+{
+    return search()->isVisible();
+}
+
+void CntNamesViewPrivate::showPreviousView()
+{
+    if ( !isFinderVisible() )
+    {
+        qApp->quit();
+    }
+    hideFinder();
+}
+
+void CntNamesViewPrivate::createNewContact()
+{
+    QContact newContact;
+    showContactEditorView(newContact);
+}
+
+void CntNamesViewPrivate::showContactView( const QModelIndex& aIndex )
+{
+    QContact c = mListModel->contact(aIndex);
+    showContactView( c );
+}
+
+void CntNamesViewPrivate::showContactView( QContact& aContact )
+{
+    CntViewParameters args(CntViewParameters::commLauncherView);
+    if (aContact.localId() == mListModel->myCardId() && aContact.details().count() <= 4)
+    {
+        args.setNextViewId(CntViewParameters::myCardView);
+    }
+
+    args.setSelectedContact(aContact);
+    mViewManager->changeView(args);
+}
+
+void CntNamesViewPrivate::showContextMenu(HbAbstractViewItem* aItem, QPointF aPoint)
+{
+    QContact contact = mListModel->contact(aItem->modelIndex());
+    mMenuBuilder->execActionMenu( contact, aPoint );
+}
+
+void CntNamesViewPrivate::executeAction( QContact& aContact, QString aAction )
+{
+    CntAction* other = new CntAction( aAction );
+    connect(other, SIGNAL(actionExecuted(CntAction*)), this, SLOT(actionExecuted(CntAction*)));
+    other->execute(aContact, QContactDetail());
+}
+
+void CntNamesViewPrivate::actionExecuted(CntAction* aAction)
+{
+    aAction->deleteLater();
+}
+
+void CntNamesViewPrivate::deleteContact(QContact& aContact)
+{
+    QContactManager* manager = mViewManager->contactManager( SYMBIAN_BACKEND );
+    QString name = manager->synthesizedDisplayLabel(aContact);
+
+    HbMessageBox *note = new HbMessageBox(
+            hbTrId("txt_phob_info_delete_1").arg(name),
+            HbMessageBox::MessageTypeQuestion);
+
+    note->setPrimaryAction(new HbAction(hbTrId("txt_phob_button_delete"), note));
+    note->setSecondaryAction(new HbAction(hbTrId("txt_common_button_cancel"), note));
+
+    HbAction *selected = note->exec();
+    if (selected == note->primaryAction())
+    {
+        manager->removeContact(aContact.localId());
+        HbNotificationDialog::launchDialog(hbTrId("txt_phob_dpophead_1_deleted").arg(name));
+    }
+    delete note;
+}
+
+void CntNamesViewPrivate::showContactEditorView(QContact& aContact)
+{
+    CntViewParameters args(CntViewParameters::editView);
+    args.setSelectedContact(aContact);
+
+    mViewManager->changeView(args);
+}
+
+void CntNamesViewPrivate::showCollectionView()
+{
+    CntViewParameters args(CntViewParameters::collectionView);
+    mViewManager->changeView(args);
+}
+
+void CntNamesViewPrivate::importSim()
+{
+    int copied(0);
+    int failed(0);
+    QContactManager* simManager = mViewManager->contactManager( SIM_BACKEND );
+    QContactManager* symbianManager = mViewManager->contactManager( SYMBIAN_BACKEND );
+    
+    QList<QContactLocalId> contactIds = simManager->contactIds();
+    if (contactIds.count() == 0) {
+        HbMessageBox::information("Nothing to copy: SIM card is empty or not accessible.");
+        return;
+    }
+        
+    foreach(QContactLocalId id, contactIds) {
+        QContact contact = simManager->contact(id);
+        if (contact.localId() > 0) {
+            //delete local id before saving to different storage
+            QScopedPointer<QContactId> contactId(new QContactId());
+            contactId->setLocalId(0);
+            contactId->setManagerUri(QString());
+            contact.setId(*contactId);
+
+            // custom label contains name information, save it to the first name 
+            QList<QContactDetail> names = contact.details(QContactName::DefinitionName);
+            if (names.count() > 0) {
+                QContactName name = static_cast<QContactName>(names.at(0));
+                name.setFirstName(name.customLabel());
+                name.setCustomLabel(QString());
+                contact.saveDetail(&name);
+            }
+                
+            if (symbianManager->saveContact(&contact)) {
+                copied++;
+            }
+            else {
+                failed++;
+            }
+        }
+        else {
+            failed++;
+        }
+    }
+    
+    QString resultMessage;
+    resultMessage.setNum(copied);
+    resultMessage.append(" contact copied, ");
+    resultMessage.append(QString().setNum(failed));
+    resultMessage.append(" failed.");
+        
+    HbMessageBox::information(resultMessage);
+}
+
+
+//// lazy accessors
+HbListView* CntNamesViewPrivate::list()
+{
+    if (!mListView) {
+        mListView = static_cast<HbListView*> (mLoader->findWidget("listView"));
+        HbListViewItem *prototype = mListView->listItemPrototype();
+        prototype->setGraphicsSize(HbListViewItem::Thumbnail);
+
+        mListView->setFrictionEnabled(true);
+        mListView->setScrollingStyle(HbScrollArea::PanOrFlick);
+        mListView->listItemPrototype()->setGraphicsSize(HbListViewItem::Thumbnail);
+
+        HbFrameBackground frame;
+        frame.setFrameGraphicsName("qtg_fr_list_normal");
+        frame.setFrameType(HbFrameDrawer::NinePieces);
+        mListView->itemPrototypes().first()->setDefaultFrame(frame);
+    }
+    return mListView;
+}
+
+HbTextItem* CntNamesViewPrivate::emptyLabel()
+{
+    if (!mEmptyList) {
+        mEmptyList = new HbTextItem(hbTrId("(no matching contacts)"));
+        mEmptyList->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
+        mEmptyList->setFontSpec(HbFontSpec(HbFontSpec::Primary));
+        mEmptyList->setAlignment(Qt::AlignCenter);
+    }
+    return mEmptyList;
+}
+HbGroupBox* CntNamesViewPrivate::groupBox()
+{
+    if (!mBanner)
+        mBanner = new HbGroupBox();
+    return mBanner;
+}
+
+HbSearchPanel* CntNamesViewPrivate::search()
+{
+    if (!mSearchPanel) {
+        mSearchPanel = new HbSearchPanel();
+        connect(mSearchPanel, SIGNAL(exitClicked()), this, SLOT(hideFinder()));
+        connect(mSearchPanel, SIGNAL(criteriaChanged(QString)), this, SLOT(setFilter(QString)));
+    }
+    return mSearchPanel;
+}
+QGraphicsLinearLayout* CntNamesViewPrivate::layout()
+{
+    if (!mLayout) {
+        QGraphicsWidget *w = mLoader->findWidget(QString("content"));
+        mLayout = static_cast<QGraphicsLinearLayout*> (w->layout());
+    }
+    return mLayout;
+}
+
+HbDocumentLoader* CntNamesViewPrivate::document()
+{
+    if (!mLoader) {
+        mLoader = new HbDocumentLoader();
+    }
+    return mLoader;
+}
+
+// End of File