diff -r e686773b3f54 -r 0ba2181d7c28 phonebookui/pbkcommonui/src/cnteditview.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/pbkcommonui/src/cnteditview.cpp Fri Mar 19 09:27:18 2010 +0200 @@ -0,0 +1,912 @@ +/* +* 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 "cnteditview.h" +#include "cntviewparameters.h" +#include "cntviewmanager.h" +#include "cntdetailpopup.h" +#include "cnteditviewdetailitem.h" +#include "cnteditviewheadingitem.h" + +#include +#include +#include +#include +#include +#include +#include + +const char *CNT_UI_XML = ":/xml/contacts_ev.docml"; + +CntEditView::CntEditView(CntViewManager *aViewManager, QGraphicsItem *aParent) : + CntBaseView(aViewManager, aParent), + mScrollArea(0), + mContainerWidget(0), + mContainerLayout(0), + mContact(0), + mDetailItem(0), + mThumbnailManager(0), + mHeadingItem(0), + mDetailItemIndex(-1), + mAddressItemIndex(-1) +{ + bool ok = false; + ok=loadDocument(CNT_UI_XML); + + if (ok) + { + QGraphicsWidget *content = findWidget(QString("content")); + setWidget(content); + } + else + { + qFatal("Unable to read :/xml/contacts_ev.docml"); + } + mThumbnailManager = new ThumbnailManager(this); + mThumbnailManager->setMode(ThumbnailManager::Default); + mThumbnailManager->setQualityPreference(ThumbnailManager::OptimizeForQuality); + mThumbnailManager->setThumbnailSize(ThumbnailManager::ThumbnailMedium); + + connect( mThumbnailManager, SIGNAL(thumbnailReady(QPixmap, void*, int, int)), + this, SLOT(thumbnailReady(QPixmap, void*, int, int)) ); +} + +CntEditView::~CntEditView() +{ + delete mContact; +} + +void CntEditView::thumbnailReady(const QPixmap& pixmap, void *data, int id, int error) +{ + Q_UNUSED(data); + Q_UNUSED(id); + Q_UNUSED(error); + QIcon qicon(pixmap); + HbIcon icon(qicon); + mHeadingItem->setIcon(icon); +} + +/*! +Activates a previous view +*/ +void CntEditView::aboutToCloseView() +{ + if (contact() && contact()->localId() == contactManager()->selfContactId() + && contactManager()->selfContactId() != 0 && contact()->details().count() <= 4) + { + //delete empty mycard + contactManager()->removeContact(contact()->localId()); + CntViewParameters viewParameters(CntViewParameters::namesView); + viewManager()->onActivateView(viewParameters); + } + + // save contact if there is one and it's not empty + else if (contact() && !contact()->isEmpty()) + { + bool isSaved = contactManager()->saveContact(contact()); + + CntViewParameters viewParameters(CntViewParameters::namesView); + if (isSaved) + { + viewParameters.setSelectedContact(*contact()); + viewParameters.setSelectedAction("save"); + } + else + { + viewParameters.setSelectedAction("failed"); + } + viewManager()->onActivateView(viewParameters); + } + else + { + CntViewParameters viewParameters(CntViewParameters::namesView); + viewManager()->onActivateView(viewParameters); + } +} + +void CntEditView::resizeEvent(QGraphicsSceneResizeEvent *event) +{ + if (mScrollArea) + { + mContainerWidget->resize(mScrollArea->size().width() - 50, 0); + } + CntBaseView::resizeEvent(event); +} + +/* +Activates a default view +*/ +void CntEditView::activateView(const CntViewParameters &aViewParameters) +{ + QContact xcontact = aViewParameters.selectedContact(); + mContact = new QContact(xcontact); + + mHeadingItem = static_cast(findWidget(QString("cnt_editview_heading"))); + mHeadingItem->setDetails(mContact); + connect(mHeadingItem, SIGNAL(iconClicked()), this, SLOT(openImageEditor())); + connect(mHeadingItem, SIGNAL(textClicked()), this, SLOT(openNameEditor())); + + QList details = mContact->details(); + if (details.count() > 0) + { + for (int i = 0;i < details.count();i++) + { + if (details.at(i).subType() == QContactAvatar::SubTypeImage) + { + mThumbnailManager->getThumbnail(details.at(i).avatar()); + break; + } + } + } + + //construct listview & connect signals + mScrollArea = static_cast(findWidget(QString("cnt_listview_labels"))); + mScrollArea->setScrollDirections(Qt::Vertical); + + mContainerWidget = new QGraphicsWidget(mScrollArea); + mContainerWidget->setPreferredWidth(mScrollArea->size().width() - 50); + mScrollArea->setContentWidget(mContainerWidget); + + mContainerLayout = new QGraphicsLinearLayout(Qt::Vertical); + mContainerLayout->setContentsMargins(0, 0, 0, 0); + mContainerLayout->setSpacing(0); + mContainerWidget->setLayout(mContainerLayout); + prepareItems(); + + // command handling (for delete menu option) + connect(commands(), SIGNAL(commandExecuted(QString, QContact)), + this, SLOT(handleExecutedCommand(QString, QContact))); + + // You can't delete a contact which hasn't been saved yet, now can you? + if (mContact->localId() == 0) + { + menu()->removeAction(actions()->baseAction("cnt:deletecontact")); + } + + // Save and Discard all changes options only available once changes have been made + if (xcontact == contactManager()->contact(mContact->localId())) + { + actions()->baseAction("cnt:discardallchanges")->setEnabled(false); + actions()->baseAction("cnt:save")->setEnabled(false); + } +} + +void CntEditView::prepareItems() +{ + QList numberDetails = mContact->details(); + QList emailDetails = mContact->details(); + QList addressDetails = mContact->details(); + QList chatDetails = mContact->details(); + QList urlDetails = mContact->details(); + + // phone numbers + if (numberDetails.count()) + { + for (int i = 0;i < numberDetails.count();i++) + { + createItem(numberDetails.at(i)); + } + } + else + { + QContactPhoneNumber number; + createItem(number); + } + + // email addresses + if (emailDetails.count()) + { + for (int i = 0;i < emailDetails.count();i++) + { + createItem(emailDetails.at(i)); + } + } + else + { + QContactEmailAddress email; + createItem(email); + } + + // postal addresses + if (!addressDetails.count()) + { + QContactAddress address; + createItem(address); + } + else + { + mAddressItemIndex = mContainerLayout->count(); + } + + // IM accounts + if (chatDetails.count()) + { + for (int i = 0;i < chatDetails.count();i++) + { + createItem(chatDetails.at(i)); + } + } + else + { + QContactOnlineAccount account; + createItem(account); + } + + // URL addresses + if (urlDetails.count()) + { + for (int i = 0;i < urlDetails.count();i++) + { + createItem(urlDetails.at(i)); + } + } + else + { + QContactUrl url; + createItem(url); + } + + QList companyDetails = mContact->details(); + QList birthdayDetails = mContact->details(); + QList anniversaryDetails = mContact->details(); + QList noteDetails = mContact->details(); + QList familyDetails = mContact->details(); + + QList ringingtoneDetails = mContact->details(); + bool hasRingingtone = false; + for (int i = 0;i < ringingtoneDetails.count();i++) + { + if (ringingtoneDetails.at(i).subType() == QContactAvatar::SubTypeAudioRingtone) + { + hasRingingtone = true; + break; + } + } + + if (addressDetails.count() || companyDetails.count() || birthdayDetails.count() || + anniversaryDetails.count() || noteDetails.count() || familyDetails.count() || hasRingingtone) + { + mDetailItem = new HbGroupBox(this); + mDetailItem->setHeading(hbTrId("Details")); + mContainerLayout->addItem(mDetailItem); + mDetailItemIndex = mContainerLayout->count(); + + // address details + if (addressDetails.count()) + { + for (int i = 0;i < addressDetails.count();i++) + { + createItem(addressDetails.at(i)); + } + } + + // company details + if (companyDetails.count()) + { + for (int i = 0;i < companyDetails.count();i++) + { + if (!companyDetails.at(i).title().isEmpty() || + !companyDetails.at(i).name().isEmpty() || + !companyDetails.at(i).department().isEmpty()) + { + mExcludeList.append(QContactOrganization::DefinitionName); + createItem(companyDetails.at(i), QContactOrganization::DefinitionName); + } + if (!companyDetails.at(i).assistantName().isEmpty()) + { + mExcludeList.append(QContactOrganization::FieldAssistantName); + createItem(companyDetails.at(i), QContactOrganization::FieldAssistantName); + } + } + } + + // birthday + if (birthdayDetails.count()) + { + mExcludeList.append(QContactBirthday::DefinitionName); + for (int i = 0;i < birthdayDetails.count();i++) + { + createItem(birthdayDetails.at(i)); + } + } + + // anniversary + if (anniversaryDetails.count()) + { + mExcludeList.append(QContactAnniversary::DefinitionName); + for (int i = 0;i < anniversaryDetails.count();i++) + { + createItem(anniversaryDetails.at(i)); + } + } + + // ringing tone + if (ringingtoneDetails.count()) + { + for (int i = 0;i < ringingtoneDetails.count();i++) + { + if (ringingtoneDetails.at(i).subType() == QContactAvatar::SubTypeAudioRingtone) + { + mExcludeList.append(QContactAvatar::SubTypeAudioRingtone); + createItem(ringingtoneDetails.at(i)); + } + } + } + + // notes + if (noteDetails.count()) + { + mExcludeList.append(QContactNote::DefinitionName); + for (int i = 0;i < noteDetails.count();i++) + { + createItem(noteDetails.at(i)); + } + } + + // family details + if (familyDetails.count()) + { + for (int i = 0;i < familyDetails.count();i++) + { + if (!familyDetails.at(i).spouse().isEmpty()) + { + mExcludeList.append(QContactFamily::FieldSpouse); + createItem(familyDetails.at(i), QContactFamily::FieldSpouse); + } + if (familyDetails.at(i).children().count()) + { + mExcludeList.append(QContactFamily::FieldChildren); + createItem(familyDetails.at(i), QContactFamily::FieldChildren); + } + } + } + } +} + +void CntEditView::onLongPressed(const QPointF &point) +{ + CntEditViewDetailItem *item = qobject_cast(sender()); + QContactDetail detail = item->detail(); + + HbMenu *menu = new HbMenu(); + HbAction *addDetailAction = 0; + HbAction *editAction = 0; + HbAction *deleteAction = 0; + + // not possible for some of the details or when detail type doesn't exist yet + if (detail.definitionName() != QContactAddress::DefinitionName && + detail.definitionName() != QContactFamily::DefinitionName && + detail.definitionName() != QContactOrganization::DefinitionName && + detail.definitionName() != QContactBirthday::DefinitionName && + detail.definitionName() != QContactAnniversary::DefinitionName && + detail.definitionName() != QContactAvatar::DefinitionName && + !detail.isEmpty()) + { + addDetailAction = menu->addAction(hbTrId("Add detail")); + } + + editAction = menu->addAction(hbTrId("Edit")); + + // only add this if details contains something to delete + if (!detail.isEmpty()) + { + deleteAction = menu->addAction(hbTrId("Delete detail")); + } + + HbAction *selectedAction = menu->exec(point); + + if (selectedAction) + { + if (selectedAction == editAction) + { + onItemActivated(); + } + else if (selectedAction == deleteAction) + { + deleteDetail(); + } + else if (selectedAction == addDetailAction) + { + addDetail(); + } + } + menu->deleteLater(); +} + +void CntEditView::onItemActivated() +{ + CntEditViewDetailItem *item = qobject_cast(sender()); + QContactDetail detail = item->detail(); + + QString field = detail.definitionName(); + + // check the context (needed for editing postal address) + // or the index of the detail (needed for other editors for correct VKB handling) + QString context; + if (detail.contexts().count() && field == QContactAddress::DefinitionName) + { + context = detail.contexts().at(0); + } + // Phone number + else if (field == QContactPhoneNumber::DefinitionName) + { + int index = mContact->details().indexOf(detail); + context.setNum(index); + } + // Email address + else if (field == QContactEmailAddress::DefinitionName) + { + int index = mContact->details().indexOf(detail); + context.setNum(index); + } + // Online account (IM) + else if (field == QContactOnlineAccount::DefinitionName) + { + int index = mContact->details().indexOf(detail); + context.setNum(index); + } + // URL + else if (field == QContactUrl::DefinitionName) + { + int index = mContact->details().indexOf(detail); + context.setNum(index); + } + // Note + else if (field == QContactNote::DefinitionName) + { + int index = mContact->details().indexOf(detail); + context.setNum(index); + } + // Family details + else if (field == QContactFamily::DefinitionName) + { + if (item->fieldType() == QContactFamily::FieldSpouse) + { + context = "spouse"; + } + } + // Company details + else if (field == QContactOrganization::DefinitionName) + { + if (item->fieldType() == field) + { + context = "company"; + } + } + // Ringing tone + else if (field == QContactAvatar::DefinitionName) + { + // launch ringtone picker service + } + + CntViewParameters viewParameters(CntViewParameters::noView); + viewParameters = prepareToEditContact(field, context); + viewParameters.setSelectedContact(*contact()); + if (viewParameters.nextViewId() != CntViewParameters::noView) + { + viewManager()->onActivateView(viewParameters); + } +} + +/*! +Open the editor for the selected detail and add a new empty field with default subtype & context +*/ +void CntEditView::addDetail() +{ + CntEditViewDetailItem *item = qobject_cast(sender()); + QContactDetail detail = item->detail(); + QString field = detail.definitionName(); + + CntViewParameters viewParameters(CntViewParameters::noView); + QString action("add"); + viewParameters = prepareToEditContact(field, action); + viewParameters.setSelectedContact(*contact()); + if (viewParameters.nextViewId() != CntViewParameters::noView) + { + viewManager()->onActivateView(viewParameters); + } +} + +/*! +Delete the selected (via longtap menu) detail +*/ +void CntEditView::deleteDetail() +{ + CntEditViewDetailItem *item = qobject_cast(sender()); + QContactDetail detail = item->detail(); + + // family detail needs special checking as it is split in multiple items in the list + if (detail.definitionName() == QContactFamily::DefinitionName) + { + QContactFamily family(detail); + + if (item->fieldType() == QContactFamily::FieldSpouse) + { + family.setSpouse(QString()); + mExcludeList.removeOne(QContactFamily::FieldSpouse); + } + else + { + family.setChildren(QStringList()); + mExcludeList.removeOne(QContactFamily::FieldChildren); + } + contact()->saveDetail(&family); + } + // same goes for company details + else if (detail.definitionName() == QContactOrganization::DefinitionName) + { + QContactOrganization company(detail); + + if (item->fieldType() == QContactOrganization::DefinitionName) + { + company.setTitle(QString()); + company.setDepartment(QStringList()); + company.setName(QString()); + mExcludeList.removeOne(QContactOrganization::DefinitionName); + } + else + { + company.setAssistantName(QString()); + mExcludeList.removeOne(QContactOrganization::FieldAssistantName); + } + contact()->saveDetail(&company); + } + else if (detail.definitionName() == QContactBirthday::DefinitionName) + { + mExcludeList.removeOne(QContactBirthday::DefinitionName); + contact()->removeDetail(&detail); + } + else if (detail.definitionName() == QContactAnniversary::DefinitionName) + { + mExcludeList.removeOne(QContactAnniversary::DefinitionName); + contact()->removeDetail(&detail); + } + else if (detail.definitionName() == QContactAvatar::DefinitionName) + { + mExcludeList.removeOne(QContactAvatar::SubTypeAudioRingtone); + contact()->removeDetail(&detail); + } + else if (detail.definitionName() == QContactNote::DefinitionName) + { + contact()->removeDetail(&detail); + if (!contact()->details().count()) + { + mExcludeList.removeOne(QContactNote::DefinitionName); + } + } + else + { + contact()->removeDetail(&detail); + } + + // if removed detail was the last of its type, create an empty one as a replacement (else decrease detail item index) + if (detail.definitionName() == QContactPhoneNumber::DefinitionName) + { + if (contact()->details().count()) + { + mDetailItemIndex--; + mAddressItemIndex--; + mContainerLayout->removeItem(item); + item->deleteLater(); + } + else + { + QContactPhoneNumber number; + item->setDetail(number); + } + } + else if (detail.definitionName() == QContactEmailAddress::DefinitionName) + { + if (contact()->details().count()) + { + mDetailItemIndex--; + mAddressItemIndex--; + mContainerLayout->removeItem(item); + item->deleteLater(); + } + else + { + QContactEmailAddress email; + item->setDetail(email); + } + } + else if (detail.definitionName() == QContactAddress::DefinitionName) + { + mContainerLayout->removeItem(item); + item->deleteLater(); + + if (!contact()->details().count()) + { + QContactAddress address; + createItem(address, QString(), mAddressItemIndex); + mDetailItemIndex++; + } + } + else if (detail.definitionName() == QContactOnlineAccount::DefinitionName) + { + if (contact()->details().count()) + { + mDetailItemIndex--; + mContainerLayout->removeItem(item); + item->deleteLater(); + } + else + { + QContactOnlineAccount account; + item->setDetail(account); + } + } + else if (detail.definitionName() == QContactUrl::DefinitionName) + { + if (contact()->details().count()) + { + mDetailItemIndex--; + mContainerLayout->removeItem(item); + item->deleteLater(); + } + else + { + QContactUrl url; + item->setDetail(url); + } + } + else + { + mContainerLayout->removeItem(item); + item->deleteLater(); + } + + if (mContainerLayout->count() == mDetailItemIndex) + { + mContainerLayout->removeItem(mDetailItem); + mDetailItem->deleteLater(); + mDetailItemIndex = -1; + } + + actions()->baseAction("cnt:discardallchanges")->setEnabled(true); + actions()->baseAction("cnt:save")->setEnabled(true); +} + +/*! +Add actions also to toolbar +*/ +void CntEditView::addActionsToToolBar() +{ + //Add Action to the toolbar + actions()->clearActionList(); + actions()->actionList() << actions()->baseAction("cnt:addfield"); + actions()->addActionsToToolBar(toolBar()); + + connect(actions()->baseAction("cnt:addfield"), SIGNAL(triggered()), + this, SLOT(addField())); +} + +/*! +Add actions to options menu +*/ +void CntEditView::addMenuItems() +{ + actions()->clearActionList(); + actions()->actionList() << actions()->baseAction("cnt:save") << actions()->baseAction("cnt:discardallchanges") << + actions()->baseAction("cnt:deletecontact"); + actions()->addActionsToMenu(menu()); + + connect(actions()->baseAction("cnt:discardallchanges"), SIGNAL(triggered()), + this, SLOT(discardAllChanges())); + + connect(actions()->baseAction("cnt:deletecontact"), SIGNAL(triggered()), + this, SLOT(deleteContact())); + + connect(actions()->baseAction("cnt:save"), SIGNAL(triggered()), + this, SLOT(aboutToCloseView())); +} + +/*! +Cancel all changes made and return to names view +*/ +void CntEditView::discardAllChanges() +{ + CntViewParameters viewParameters(CntViewParameters::namesView); + viewManager()->onActivateView(viewParameters); +} + +/*! +Launch delete query +*/ +void CntEditView::deleteContact() +{ + commands()->deleteContact(*contact()); +} + +/*! +Open the "Add field" popup and launch a specific detail editor view if needed +*/ +void CntEditView::addField() +{ + QString detail = CntDetailPopup::selectDetail(mExcludeList); + + if (detail == hbTrId("txt_phob_formlabel_note")) + { + CntViewParameters viewParameters(CntViewParameters::noteEditorView); + viewParameters.setSelectedContact(*contact()); + viewManager()->onActivateView(viewParameters); + } + else if (detail == hbTrId("txt_phob_formlabel_personal_ringing_tone")) + { + // launch ringtone selection service + } + else if (detail == hbTrId("txt_phob_formlabel_date")) + { + CntViewParameters viewParameters(CntViewParameters::dateEditorView); + viewParameters.setSelectedContact(*contact()); + viewManager()->onActivateView(viewParameters); + } + else if (detail == hbTrId("txt_phob_formlabel_company_details")) + { + CntViewParameters viewParameters(CntViewParameters::companyEditorView); + viewParameters.setSelectedContact(*contact()); + viewParameters.setSelectedAction("company"); + viewManager()->onActivateView(viewParameters); + } + else if (detail == hbTrId("txt_phob_formlabel_family")) + { + CntViewParameters viewParameters(CntViewParameters::familyDetailEditorView); + viewParameters.setSelectedContact(*contact()); + viewParameters.setSelectedAction("spouse"); + viewManager()->onActivateView(viewParameters); + } + else if (detail == hbTrId("Synchronization")) + { + // Synchronization detail editor view to be done (lacks engine support) + } +} + +/*! +Opens the name detail editor view +*/ +void CntEditView::openNameEditor() +{ + CntViewParameters viewParameters(CntViewParameters::namesEditorView); + viewParameters.setSelectedContact(*contact()); + viewManager()->onActivateView(viewParameters); +} + +/*! +Opens the image detail editor view +*/ +void CntEditView::openImageEditor() +{ + CntViewParameters viewParameters(CntViewParameters::imageEditorView); + viewParameters.setSelectedContact(*contact()); + viewManager()->onActivateView(viewParameters); +} + +/* +Handle signals emitted from CntCommands, only used for delete command for now. +*/ +int CntEditView::handleExecutedCommand(QString aCommand, const QContact &aContact) +{ + Q_UNUSED(aContact); + int result=-1; + if (aCommand == "delete") + { + CntViewParameters viewParameters(CntViewParameters::namesView); + viewParameters.setSelectedContact(*contact()); + viewParameters.setSelectedAction("delete"); + viewManager()->onActivateView(viewParameters); + result=0; + } + return result; +} + +/*! +Set correct next view id and possible action string (used for "Add detail" longtap menu command +and when opening postal address editor view) +*/ +CntViewParameters CntEditView::prepareToEditContact(const QString &aViewType, const QString &aAction) +{ + CntViewParameters viewParameters(CntViewParameters::noView); + + // open name editor + if (aViewType == QContactName::DefinitionName) + { + viewParameters.setNextViewId(CntViewParameters::namesEditorView); + } + // open number editor + else if (aViewType == QContactPhoneNumber::DefinitionName) + { + viewParameters.setNextViewId(CntViewParameters::phoneNumberEditorView); + } + // open email editor + else if (aViewType == QContactEmailAddress::DefinitionName) + { + viewParameters.setNextViewId(CntViewParameters::emailEditorView); + } + // open address editor + else if (aViewType == QContactAddress::DefinitionName) + { + viewParameters.setNextViewId(CntViewParameters::addressEditorView); + } + // open online account editor + else if (aViewType == QContactOnlineAccount::DefinitionName) + { + viewParameters.setNextViewId(CntViewParameters::onlineAccountEditorView); + } + // open URL editor + else if (aViewType == QContactUrl::DefinitionName) + { + viewParameters.setNextViewId(CntViewParameters::urlEditorView); + } + // open note editor + else if (aViewType == QContactNote::DefinitionName) + { + viewParameters.setNextViewId(CntViewParameters::noteEditorView); + } + // open family detail editor + else if (aViewType == QContactFamily::DefinitionName) + { + viewParameters.setNextViewId(CntViewParameters::familyDetailEditorView); + } + // open company detail editor + else if (aViewType == QContactOrganization::DefinitionName) + { + viewParameters.setNextViewId(CntViewParameters::companyEditorView); + } + // open date detail editor + else if (aViewType == QContactBirthday::DefinitionName) + { + viewParameters.setNextViewId(CntViewParameters::dateEditorView); + } + // open date detail editor + else if (aViewType == QContactAnniversary::DefinitionName) + { + viewParameters.setNextViewId(CntViewParameters::dateEditorView); + } + else + { + viewParameters.setNextViewId(CntViewParameters::noView); + } + + viewParameters.setSelectedAction(aAction); + + return viewParameters; +} + +void CntEditView::createItem(const QContactDetail &detail, const QString &type, int position) +{ + CntEditViewDetailItem *item = new CntEditViewDetailItem(mContainerWidget); + item->setDetail(detail, type); + mContainerLayout->insertItem(position, item); + connect(item, SIGNAL(longPressed(const QPointF&)), this, SLOT(onLongPressed(const QPointF&))); + connect(item, SIGNAL(clicked()), this, SLOT(onItemActivated())); +} + +QContact *CntEditView::contact() +{ + return mContact; +} + +void CntEditView::setContact(QContact* aContact) +{ + if (contact()) + { + delete mContact; + } + mContact=aContact; +} + +// EOF