diff -r 4a5361db8937 -r 7119b73b84d6 logsui/logscntfinder/src/logscntentry.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/logsui/logscntfinder/src/logscntentry.cpp Fri May 14 15:52:41 2010 +0300 @@ -0,0 +1,417 @@ +/* +* 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 +#include +#include + +#include "logscntentry.h" +#include "logspredictivetranslator.h" +#include "logslogger.h" + + + +// ----------------------------------------------------------------------------- +// LogsCntEntry::richText() +// ----------------------------------------------------------------------------- +// +QString LogsCntText::richText( QString startTag, + QString endTag ) const +{ + QString str = text(); + if ( str.length() > 0 && highlights() > 0 ) { + str.insert( highlights() , endTag ); + str.insert( 0, startTag ); + } + + return str; + +} + +// ----------------------------------------------------------------------------- +// LogsCntEntry::LogsCntEntry() +// ----------------------------------------------------------------------------- +// +LogsCntEntry::LogsCntEntry( LogsCntEntryHandle& handle, + quint32 cid ) + : mType( EntryTypeHistory ), mCid( cid ), + mCached( true ),mHandle(&handle) +{ + LogsCntText empty; + mFirstName.append( empty ); + mLastName.append( empty ); + mAvatarPath = ""; +} + +// ----------------------------------------------------------------------------- +// LogsCntEntry::LogsCntEntry() +// ----------------------------------------------------------------------------- +// +LogsCntEntry::LogsCntEntry( quint32 cid ) + : mType( EntryTypeContact ), mCid( cid ), + mCached( false ),mHandle(0) +{ + LogsCntText empty; + mFirstName.append( empty ); + mLastName.append( empty ); + mAvatarPath = ""; +} + +// ----------------------------------------------------------------------------- +// copy LogsCntEntry::LogsCntEntry() +// ----------------------------------------------------------------------------- +// +LogsCntEntry::LogsCntEntry( const LogsCntEntry& entry ) + : mType(entry.mType), + mCid(entry.mCid), + mFirstName(entry.mFirstName), + mLastName(entry.mLastName), + mCached(entry.mCached), + mHandle(entry.mHandle), + mPhoneNumber(entry.mPhoneNumber), + mAvatarPath(entry.mAvatarPath) +{ +} + +// ----------------------------------------------------------------------------- +// LogsCntEntry::~LogsCntEntry() +// ----------------------------------------------------------------------------- +// +LogsCntEntry::~LogsCntEntry() +{ +} + +// ----------------------------------------------------------------------------- +// LogsCntEntry::firstName() +// ----------------------------------------------------------------------------- +// +const LogsCntTextList& LogsCntEntry::firstName() const +{ + return mFirstName; +} + +// ----------------------------------------------------------------------------- +// LogsCntEntry::lastName() +// ----------------------------------------------------------------------------- +// +const LogsCntTextList& LogsCntEntry::lastName() const +{ + return mLastName; +} + +// ----------------------------------------------------------------------------- +// LogsCntEntry::avatarPath() +// ----------------------------------------------------------------------------- +// +const QString& LogsCntEntry::avatarPath() const +{ + return mAvatarPath; +} + +// ----------------------------------------------------------------------------- +// LogsCntEntry::phoneNumber() +// ----------------------------------------------------------------------------- +// +const LogsCntText& LogsCntEntry::phoneNumber() const +{ + return mPhoneNumber; +} + +// ----------------------------------------------------------------------------- +// LogsCntEntry::speedDial() +// ----------------------------------------------------------------------------- +// +const QString& LogsCntEntry::speedDial() const +{ + return mSpeedDial; +} + + + +// ----------------------------------------------------------------------------- +// LogsCntEntry::contactId() +// ----------------------------------------------------------------------------- +// +quint32 LogsCntEntry::contactId() const +{ + return mCid; +} + +// ----------------------------------------------------------------------------- +// LogsCntEntry::handle() +// ----------------------------------------------------------------------------- +// +LogsCntEntryHandle* LogsCntEntry::handle() const +{ + return mHandle; +} + +// ----------------------------------------------------------------------------- +// LogsCntEntry::setFirstName() +// ----------------------------------------------------------------------------- +// +void LogsCntEntry::setFirstName( const QString& name ) +{ + mCached=true; + mFirstName.clear(); + doSetText( name, mFirstName ); +} + +// ----------------------------------------------------------------------------- +// LogsCntEntry::setLastName() +// ----------------------------------------------------------------------------- +// +void LogsCntEntry::setLastName( const QString& name ) +{ + mCached=true; + mLastName.clear(); + doSetText( name, mLastName ); +} + +// ----------------------------------------------------------------------------- +// LogsCntEntry::setAvatarPath() +// ----------------------------------------------------------------------------- +// +void LogsCntEntry::setAvatarPath( const QString& avatarpath ) +{ + mCached=true; + mAvatarPath.clear(); + mAvatarPath = avatarpath; +} + +// ----------------------------------------------------------------------------- +// LogsCntEntry::setPhoneNumber() +// ----------------------------------------------------------------------------- +// +void LogsCntEntry::setPhoneNumber( const QString& number ) +{ + LogsPredictiveTranslator* translator = LogsPredictiveTranslator::instance(); + + mCached=true; + mPhoneNumber.mText = number; + mPhoneNumber.mTranslatedText = translator->translate( mPhoneNumber.mText ); + +} + + +// ----------------------------------------------------------------------------- +// LogsCntEntry::doSetText() +// ----------------------------------------------------------------------------- +// +void LogsCntEntry::doSetText( const QString& text, LogsCntTextList& textlist ) +{ + LogsPredictiveTranslator* translator = LogsPredictiveTranslator::instance(); + + QListIterator iter( translator->nameTokens( text ) ); + + while( iter.hasNext() ) { + LogsCntText txt; + txt.mText = iter.next(); + txt.mTranslatedText = translator->translate( txt.mText ); + textlist.append( txt ); + } + if ( textlist.count() == 0 ) { + textlist.append( LogsCntText() ); + } +} + + +// ----------------------------------------------------------------------------- +// LogsCntEntry::resetHighlights() +// ----------------------------------------------------------------------------- +// +void LogsCntEntry::resetHighlights( LogsCntTextList& nameArray ) +{ + QMutableListIterator names( nameArray ); + while( names.hasNext() ) { + names.next().mHighlights = 0; + } + +} + + +// ----------------------------------------------------------------------------- +// LogsCntEntry::setHighlights() +// ----------------------------------------------------------------------------- +// +void LogsCntEntry::setHighlights( const QString& pattern ) +{ + resetHighlights( mFirstName ); + resetHighlights( mLastName ); + + mPhoneNumber.mHighlights = + mPhoneNumber.mTranslatedText.startsWith( pattern ) && + mPhoneNumber.mTranslatedText.length() >= pattern.length() ? + pattern.length(): 0; + + doSetHighlights( pattern, mFirstName ); + doSetHighlights( pattern, mLastName ); + +} + +// ----------------------------------------------------------------------------- +// LogsCntEntry::doSetHighlights() +// ----------------------------------------------------------------------------- +// +void LogsCntEntry::doSetHighlights( const QString& pattern, + LogsCntTextList& nameArray ) +{ + + LogsPredictiveTranslator* translator = LogsPredictiveTranslator::instance(); + QMutableListIterator names( nameArray ); + bool hasSeparators = translator->hasPatternSeparators( pattern ); + + //simple + while( names.hasNext() ) { + LogsCntText& nameItem = names.next(); + nameItem.mHighlights = + translator->startsWith( nameItem.mText, pattern, false ); + } + + //complex + QListIterator patternArray( translator->patternTokens( pattern ) ); + while( hasSeparators && patternArray.hasNext() ) { + QString patternItem = patternArray.next(); + names.toFront(); + while( names.hasNext() ) { + LogsCntText& nameItem = names.next(); + int matchSize = translator->startsWith( nameItem.mText, + patternItem, !hasSeparators ); + nameItem.mHighlights = matchSize > nameItem.mHighlights ? + matchSize : nameItem.mHighlights; + } + } +} + +// ----------------------------------------------------------------------------- +// LogsCntEntry::setSpeedDial() +// ----------------------------------------------------------------------------- +// +void LogsCntEntry::setSpeedDial( const QString& number ) +{ + mSpeedDial = number; +} + + + +// ----------------------------------------------------------------------------- +// LogsCntEntry::match() +// ----------------------------------------------------------------------------- +// +bool LogsCntEntry::match( const QString& pattern ) const +{ + bool match = false; + LogsPredictiveTranslator* translator = LogsPredictiveTranslator::instance(); + + //direct match with phone number is enough + match = ( type() == EntryTypeHistory && + mPhoneNumber.mTranslatedText.startsWith( pattern ) ) || + doSimpleMatch( pattern ); + + match = !match && translator->hasPatternSeparators( pattern ) ? + doComplexMatch( translator->patternTokens( pattern) ) : match; + + return match; +} + +// ----------------------------------------------------------------------------- +// LogsCntEntry::doSimpleMatch() +// ----------------------------------------------------------------------------- +// +bool LogsCntEntry::doSimpleMatch( const QString& pattern ) const +{ + LogsCntTextList nameArray = mFirstName + mLastName; //with empties + QListIterator names( nameArray ); + int matchCount = 0; + + while( names.hasNext() && !matchCount ) { + matchCount = (int)names.next().mTranslatedText.startsWith( pattern ); + } + + return matchCount > 0; +} + + +// ----------------------------------------------------------------------------- +// LogsCntEntry::doComplexMatch() +// ----------------------------------------------------------------------------- +// +bool LogsCntEntry::doComplexMatch( QStringList patternArray ) const +{ + const bool zero = false; + + LogsCntTextList nameArray = mFirstName + mLastName; //with empties + + int targetMatchCount = patternArray.count(); + int namesCount = nameArray.count(); + + //if pattern has more tokens than name(s), it is a missmatch + if ( namesCount < targetMatchCount ) { + return false; + } + + QListIterator names( nameArray ); + QListIterator patterns( patternArray ); + QVector matchVector(targetMatchCount, zero ); + int currentPattern = 0; + int matchCount = 0; + bool match = false; + + while( names.hasNext() && matchCount < targetMatchCount ) { + LogsCntText name = names.next(); + currentPattern = 0; + patterns.toFront(); + match = false; + while ( !name.mText.isEmpty() && + patterns.hasNext() && !match ) { + QString pattern = patterns.next(); + //unique match check + if ( !matchVector.at( currentPattern ) ) { + match = matchVector[ currentPattern ] + = name.mTranslatedText.startsWith( pattern ); + matchCount = match ? matchCount+1 : matchCount; + } + currentPattern++; + } + } + return matchCount >= targetMatchCount; + + } + + + +// ----------------------------------------------------------------------------- +// LogsCntEntry::isCached() +// ----------------------------------------------------------------------------- +// +bool LogsCntEntry::isCached() const +{ + return mCached; +} + + +// ----------------------------------------------------------------------------- +// LogsCntEntry::type() +// ----------------------------------------------------------------------------- +// +LogsCntEntry::EntryType LogsCntEntry::type() const +{ + return mType; +} + + +