logsui/logscntfinder/src/logscntfinder.cpp
changeset 2 7119b73b84d6
parent 0 4a5361db8937
child 4 e52d42f9500c
--- a/logsui/logscntfinder/src/logscntfinder.cpp	Tue May 04 12:39:37 2010 +0300
+++ b/logsui/logscntfinder/src/logscntfinder.cpp	Fri May 14 15:52:41 2010 +0300
@@ -15,446 +15,20 @@
 *
 */
 
-#include <QListIterator>
-
 #include <qcontactdetailfilter.h>
 #include <qcontactphonenumber.h>
 #include <qcontactname.h>
 #include <qcontactmanager.h>
 #include <qcontactavatar.h>
-#include <QVector>
 
+#include "logscntentry.h"
 #include "logscntfinder.h"
 #include "logspredictivetranslator.h"
 #include "logslogger.h"
 
 const int MaxPredSearchPatternLen = 15;
-const QChar ZeroSepar('0');
-
-
-// -----------------------------------------------------------------------------
-// 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::tokens()
-// -----------------------------------------------------------------------------
-//
-QStringList LogsCntEntry::tokens( const QString& source, 
-                                  const QChar& separ ) const
-{
-    QStringList target = source.split( separ, QString::SkipEmptyParts );
-    if ( target.length() > 1 && separ == ZeroSepar ) {
-        QString& first = target[0];
-        QString& last = target[target.length()-1];
-        padWithZeros( first, source, 0 );
-        padWithZeros( last, source, last.length() );
-    }
-    return target;
-    
-}
-
-
-// -----------------------------------------------------------------------------
-// LogsCntEntry::padWithLeadingZeros()
-// -----------------------------------------------------------------------------
-//
-void LogsCntEntry::padWithZeros( QString& token, 
-                                 const QString& source, int padIndex ) const
-{
-    const QChar* content = source.data();
-    int index = !padIndex ? 0 : source.length()-1;
-            
-    while( index >= 0 && index < source.length() ) {
-        if ( content[ index ] == ZeroSepar ) {
-            token.insert( padIndex, ZeroSepar );
-            index = !padIndex ? index+1 : index-1;
-        } else {
-            index = -1;
-        }
-    }
-}
-
 
 
-// -----------------------------------------------------------------------------
-// LogsCntEntry::doSetText()
-// -----------------------------------------------------------------------------
-//
-void LogsCntEntry::doSetText( const QString& text, LogsCntTextList& textlist ) 
-{
-    QListIterator<QString> iter( tokens( text ) );
-
-    while( iter.hasNext() ) {
-        LogsCntText txt;
-        txt.mText = iter.next();
-        txt.mTranslatedText = 
-            LogsPredictiveTranslator::instance()->translate( txt.mText );
-        textlist.append( txt );
-    }
-    if ( textlist.count() == 0 ) {
-        textlist.append( LogsCntText() );
-    }
-}
-
-// -----------------------------------------------------------------------------
-// LogsCntEntry::setPhoneNumber()
-// -----------------------------------------------------------------------------
-//
-void LogsCntEntry::setPhoneNumber( const QString& number )
-{
-    mCached=true;
-    mPhoneNumber.mText = number;
-}
-
-// -----------------------------------------------------------------------------
-// LogsCntEntry::resetHighlights()
-// -----------------------------------------------------------------------------
-//
-void LogsCntEntry::resetHighlights( LogsCntTextList& nameArray )
-{
-    QMutableListIterator<LogsCntText> names( nameArray ); 
-    while( names.hasNext() ) {
-        names.next().mHighlights = 0;
-    }
-    
-}
-
-
-// -----------------------------------------------------------------------------
-// LogsCntEntry::setHighlights()
-// -----------------------------------------------------------------------------
-//
-void LogsCntEntry::setHighlights( const QString& pattern )
-{
-    resetHighlights( mFirstName );
-    resetHighlights( mLastName );
-    
-    mPhoneNumber.mHighlights = 
-            mPhoneNumber.text().startsWith( pattern ) &&
-            mPhoneNumber.text().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<LogsCntText> names( nameArray ); 
-    bool hasZeros = pattern.contains( ZeroSepar );
-    
-    //simple
-    while( names.hasNext() ) {
-        LogsCntText& nameItem = names.next();
-        nameItem.mHighlights = 
-                translator->startsWith( nameItem.mText, pattern, false );
-    }
-    
-    //complex
-    QStringList tokenArray = tokens( pattern, ZeroSepar );
-    QListIterator<QString> patternArray( tokenArray  );
-    while( hasZeros && patternArray.hasNext() ) {
-        QString patternItem = patternArray.next();
-        names.toFront();
-        while( names.hasNext() ) {
-            LogsCntText& nameItem = names.next();
-            int matchSize = translator->startsWith( nameItem.mText, 
-                                                    patternItem, !hasZeros );
-            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;
-    
-    //direct match with phone number is enough
-    match = mPhoneNumber.text().startsWith( pattern ) ||
-            doSimpleMatch( pattern );
-    
-    if ( !match && pattern.contains( ZeroSepar ) ) {
-        QStringList patternArray = tokens( pattern, ZeroSepar );
-        match = doComplexMatch( patternArray );
-    }
-    
-    return match;
-}
-
-// -----------------------------------------------------------------------------
-// LogsCntEntry::doSimpleMatch()
-// -----------------------------------------------------------------------------
-//
-bool LogsCntEntry::doSimpleMatch( const QString& pattern ) const
-{
-    LogsCntTextList nameArray = mFirstName + mLastName; //with empties
-    QListIterator<LogsCntText> 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<LogsCntText> names( nameArray ); 
-    QListIterator<QString> patterns( patternArray );
-    QVector<bool> 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;
-}
 
 // -----------------------------------------------------------------------------
 // LogsCntFinder::LogsCntFinder()
@@ -511,7 +85,7 @@
     //"" -> XXX not progressive
     //XX -> YY not progressive
     //XXX -> YY not progressive
-    int prevPatternLen = mCurrentPredictivePattern.length();
+    int prevPatternLen = mCurrentInputPattern.length();
     return prevPatternLen > 0 &&  
            pattern.length() - prevPatternLen > 0;
 }
@@ -538,21 +112,26 @@
                                mCachedCounter == resultsCount();
     bool nothingToDo = resultsCount() == 0 &&
                        patternIsProgressive;
-                                           
+    int patternSeparators = 
+            LogsPredictiveTranslator::instance()->hasPatternSeparators( 
+                                                        mCurrentInputPattern );
+    bool doCacheQuery =  patternSeparators != mCurrentInputPattern.length() && 
+                        ( ( patternIsProgressive && resultsAreAllCached ) || nothingToDo );
+            
     LOGS_QDEBUG_2( "logs [FINDER] patternIsProgressive = ", patternIsProgressive )
     LOGS_QDEBUG_2( "logs [FINDER] resultsAreAllCached = ", resultsAreAllCached )
     LOGS_QDEBUG_2( "logs [FINDER] nothingToDo = ", nothingToDo )
     LOGS_QDEBUG_2( "logs [FINDER] cachedCounter = ", mCachedCounter )
+    LOGS_QDEBUG_2( "logs [FINDER] patternSeparators = ", patternSeparators )
+    LOGS_QDEBUG_2( "logs [FINDER] doCacheQuery = ", doCacheQuery )
     
-    mCurrentPredictivePattern = pattern;
+    setCurrentPattern( pattern );
     
     if ( mCurrentPredictivePattern.isEmpty() ) {
         qDeleteAll( mResults );
         mResults.clear();
         mCachedCounter = 0;
-    } else if ( ( patternIsProgressive &&
-                  resultsAreAllCached ) ||
-                nothingToDo ) {
+    } else if ( doCacheQuery ) {
         doPredictiveCacheQuery();
     } else {        
         mCachedCounter = 0;
@@ -598,7 +177,7 @@
     QContactDetailFilter df;
     df.setDetailDefinitionName( QContactName::DefinitionName );
     df.setMatchFlags( QContactFilter::MatchKeypadCollation );
-    df.setValue( mCurrentPredictivePattern );
+    df.setValue( mCurrentInputPattern );
     QList<QContactLocalId> cntIds;
     LOGS_QDEBUG( "logs [FINDER] about to call contacts manager" )
     
@@ -685,6 +264,20 @@
 
 
 // -----------------------------------------------------------------------------
+// LogsCntFinder::setCurrentPattern()
+// -----------------------------------------------------------------------------
+//
+void LogsCntFinder::setCurrentPattern( const QString& pattern )
+{
+    LogsPredictiveTranslator* translator = 
+            LogsPredictiveTranslator::instance();
+    
+    mCurrentInputPattern = pattern;
+    mCurrentPredictivePattern = translator->translate( mCurrentInputPattern );
+    
+}
+
+// -----------------------------------------------------------------------------
 // LogsCntFinder::resultsCount
 // -----------------------------------------------------------------------------
 //