diff -r dcf0eedfc1a3 -r d189ee25cf9d emailuis/nmailuiwidgets/src/nmrecipientlineedit.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailuis/nmailuiwidgets/src/nmrecipientlineedit.cpp Tue Aug 31 15:04:17 2010 +0300 @@ -0,0 +1,321 @@ +/* +* 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: nmrecipientlineedit.cpp +* +*/ + +#include "nmailuiwidgetsheaders.h" + +static const QString Semicolon(";"); +static const QString Delimiter("; "); +static const QRegExp CommaOrSemicolon("[,;]"); + + +/*! + Constructor +*/ +NmRecipientLineEdit::NmRecipientLineEdit(QGraphicsItem *parent) + : NmHtmlLineEdit(parent), + mNeedToGenerateEmailAddressList(true) +{ + NM_FUNCTION; + + connect(this, SIGNAL(textChanged(QString)), this, SLOT(handleTextChanged(QString))); +} + + +/*! + Destructor +*/ +NmRecipientLineEdit::~NmRecipientLineEdit() +{ + NM_FUNCTION; +} + + +/*! + Get the emailaddress list generated from the content of the lineedit. +*/ +QList NmRecipientLineEdit::emailAddressList() +{ + NM_FUNCTION; + + if (mNeedToGenerateEmailAddressList) { + // Empty mEmailAddressList. + mEmailAddressList.clear(); + // Generate mEmailAddressList from the lineedit content. + generateEmailAddressList(); + mNeedToGenerateEmailAddressList = false; + } + + return mEmailAddressList; +} + + +#ifdef Q_OS_SYMBIAN +/*! + This Slot appends the selected contacts to the end of the lineedit content. +*/ +void NmRecipientLineEdit::addSelectedContacts(const QVariant &selectedContacts) +{ + NM_FUNCTION; + + // If user selected contact + if (!selectedContacts.isNull()) { + + // If the lineedit is not empty and if there is no ";" or "; " at the end, + // add a delimiter("; ") at the end. + if (this->text().length() != 0 && !(this->text().endsWith(Semicolon)) && + !(this->text().endsWith(Delimiter))){ + + // Move cursor to the end of the lineedit. + this->setCursorPosition(this->text().length()); + QTextCursor textCursor(this->textCursor()); + // Append delimiter("; ") to the end of the lineedit + textCursor.insertText(Delimiter); + } + + CntServicesContactList contactList = qVariantValue(selectedContacts); + + // Loop through all the selected contacts. + for (int i = 0; i < contactList.count(); ++i) { + QString contactName = contactList[i].mDisplayName; + QString contactEmailAddress = contactList[i].mEmailAddress; + + // If this contact has no name, use it's emailaddress as the display name + if(contactName.isEmpty()) { + // Move cursor to the end of the lineedit. + this->setCursorPosition(this->text().length()); + QTextCursor textCursor(this->textCursor()); + // Append contactEmailAddress to the end of the lineedit + textCursor.insertText(contactEmailAddress); + } + // If this contact has name, use the name as the display name + else { + // Handle a rare case: there are contacts has same name but different emailaddress. + for (int i = 0; i != mRecipientsAddedFromContacts.count(); ++i) { + if (mRecipientsAddedFromContacts.at(i).displayName() == contactName && + mRecipientsAddedFromContacts.at(i).address() != contactEmailAddress) { + // Differentiate this contact by supplying it's emailaddress + contactName.append("<"); + contactName.append(contactEmailAddress); + contactName.append(">"); + } + } + + // Move cursor to the end of the lineedit. + this->setCursorPosition(this->text().length()); + QTextCursor textCursor(this->textCursor()); + // Append contactName to the end of the lineedit + textCursor.insertText(contactName); + } + + QTextCursor textCursor(this->textCursor()); + // Append delimiter("; ") + textCursor.insertText(Delimiter); + + // Form the contact into Qmail NmAddress format. + NmAddress contact; + contact.setAddress(contactEmailAddress); + contact.setDisplayName(contactName); + + // Add this NmAddress formated contact into mRecipientsAddedFromContacts. + mRecipientsAddedFromContacts.append(contact); + } + } + else { + //Request returned NULL + NM_COMMENT("ContactsPicker request returned NULL."); + } + +} + +Q_IMPLEMENT_USER_METATYPE(CntServicesContact) +Q_IMPLEMENT_USER_METATYPE_NO_OPERATORS(CntServicesContactList) +#endif // Q_OS_SYMBIAN + + +/*! + keyPressEvent handles replacing user inputs "," or ";" from physical keyboard with "; " + P.S. keyPressEvent can only catch QKeyEvent "," or ";" typed from physical keyboard, + inputMethodEvent method handles user inputs "," or ";" from virtual keyboard. +*/ +void NmRecipientLineEdit::keyPressEvent(QKeyEvent *keyEvent) +{ + NM_FUNCTION; + + bool eventHandled = false; + + if (keyEvent) { + switch (keyEvent->key()) { + case Qt::Key_Comma: + case Qt::Key_Semicolon: + { + QString textBeforeCursor = (this->text()).left(this->cursorPosition()); + + // No action when the lineedit is empty or cursor is after a Delimiter("; ") + // or a Semicolon (";"). + if ((this->text()).isEmpty() || textBeforeCursor.endsWith(Delimiter) + || textBeforeCursor.endsWith(Semicolon)) { + keyEvent->ignore(); + eventHandled = true; + } + else { + // Generate custom keyevent for Delimiter("; ") and + // forward to the base class to handle. + QKeyEvent delimiterKeyEvent(keyEvent->type(), keyEvent->key(), + keyEvent->modifiers(), Delimiter); + NmHtmlLineEdit::keyPressEvent(&delimiterKeyEvent); + eventHandled = true; + } + } + break; + + default: + NmHtmlLineEdit::keyPressEvent(keyEvent); + eventHandled = true; + break; + } + } + + // If event is not handled, forward to the base class to handle. + if (!eventHandled) { + NmHtmlLineEdit::keyPressEvent(keyEvent); + } +} + + +/*! + inputMethodEvent handles replacing user inputs "," or ";" from virtual keyboard with "; ". + P.S. keyPressEvent can only catch QKeyEvent "," or ";" typed from physical keyboard +*/ +void NmRecipientLineEdit::inputMethodEvent(QInputMethodEvent *event) +{ + NM_FUNCTION; + + bool eventHandled = false; + + if (event) { + QString eventText = event->commitString(); + + if (!eventText.isEmpty() || event->replacementLength()) { + // If typed charater from virtual keyboard is "," or ";" + if (eventText.contains(CommaOrSemicolon)) { + QString textBeforeCursor = (this->text()).left(this->cursorPosition()); + + // No action when the lineedit is empty or cursor is after a Delimiter("; ") + // or Semicolon (";"). + if ((this->text()).isEmpty() || textBeforeCursor.endsWith(Delimiter) + || textBeforeCursor.endsWith(Semicolon)) { + event->ignore(); + eventHandled = true; + } + else { + // Modify event with Delimiter("; ") and forward to the base class to handle. + event->setCommitString(Delimiter, event->replacementStart(), + event->replacementLength()); + NmHtmlLineEdit::inputMethodEvent(event); + eventHandled = true; + } + } + } + } + + // If event is not handled, forward to the base class to handle. + if (!eventHandled) { + NmHtmlLineEdit::inputMethodEvent(event); + } +} + + +/*! + Generate a list of all the email addresses from the content of the lineedit. +*/ +void NmRecipientLineEdit::generateEmailAddressList() +{ + NM_FUNCTION; + + // Remove whitespace from the start and the end of the lineedit content. + QString contentOfLineedit = (this->text()).trimmed(); + + // Split the lineedit content by semicolon(";"). + QStringList itemsOfLineeditContent = contentOfLineedit.split(Semicolon, QString::SkipEmptyParts); + + // Loop through all the items of the lineedit content. + for (int i = 0; i != itemsOfLineeditContent.count(); ++i) { + // Remove whitespace from the start and the end of the item. + QString itemInLineedit = itemsOfLineeditContent.at(i).trimmed(); + + // Get the count of the recipients added from Contacts. + int countOfRecipientsAddedFromContacts = mRecipientsAddedFromContacts.count(); + + // If there is recipient added from Contacts. + if (countOfRecipientsAddedFromContacts > 0) { + QStringList listOfAddedContactsName; + QStringList listOfAddedContactsAddress; + + // Loop through all the recipients added from Contacts. + for (int j = 0; j != countOfRecipientsAddedFromContacts; ++j) { + NmAddress contact = mRecipientsAddedFromContacts.at(j); + listOfAddedContactsName.append(contact.displayName()); + listOfAddedContactsAddress.append(contact.address()); + } + + int indexInAddedContactsName = listOfAddedContactsName.indexOf(itemInLineedit); + int indexInAddedContactsAddress = listOfAddedContactsAddress.indexOf(itemInLineedit); + + // If this itemInLineedit matches the name of one added contact. + if (indexInAddedContactsName >= 0) { + // Add the recipient into mEmailAddressList. + mEmailAddressList.append(mRecipientsAddedFromContacts.at(indexInAddedContactsName)); + } + // If this itemInLineedit matches the emailaddress of one added contact. + else if (indexInAddedContactsAddress >= 0) { + // Add the recipient into mEmailAddressList. + mEmailAddressList.append(mRecipientsAddedFromContacts.at(indexInAddedContactsAddress)); + } + // This itemInLineedit is not added from Contacts + else { + // Form the item into NmAddress format. + NmAddress recipient; + recipient.setAddress(itemInLineedit); + // There is no display name info available, so leave display name empty. + recipient.setDisplayName(QString()); + // Add this NmAddress formated lineedit item into mEmailAddressList. + mEmailAddressList.append(recipient); + } + } + else { // There is no recipient is added from Contacts + // Form the item into NmAddress format. + NmAddress recipient; + recipient.setAddress(itemInLineedit); + // There is no display name info available, so leave display name emapty. + recipient.setDisplayName(QString()); + // Add this NmAddress formated lineedit item into mEmailAddressList. + mEmailAddressList.append(recipient); + } + } +} + + +/*! + This Slot is called when the lineedit text changes. +*/ +void NmRecipientLineEdit::handleTextChanged(const QString &text) +{ + NM_FUNCTION; + + Q_UNUSED(text); + mNeedToGenerateEmailAddressList = true; +}