logsui/logscntfinder/src/logspredictivetranslator.cpp
changeset 4 e52d42f9500c
parent 2 7119b73b84d6
child 8 6c9acdc6adc0
equal deleted inserted replaced
2:7119b73b84d6 4:e52d42f9500c
    15 *
    15 *
    16 */
    16 */
    17 #include <QObject>
    17 #include <QObject>
    18 #include <QLocale>
    18 #include <QLocale>
    19 #include <QHash>
    19 #include <QHash>
       
    20 #include <hbinputkeymapfactory.h>
    20 #include <hbinputsettingproxy.h>
    21 #include <hbinputsettingproxy.h>
    21 #include <QStringList>
    22 #include <QStringList>
       
    23 #include <QTextCodec>
    22 
    24 
    23 #include "logspredictivetranslator.h"
    25 #include "logspredictivetranslator.h"
    24 #include "logspredictivelatin12keytranslator.h"
    26 #include "logspredictivelatin12keytranslator.h"
    25 #include "logspredictivethai12keytranslator.h"
    27 #include "logspredictivethai12keytranslator.h"
    26 #include "logslogger.h"
    28 #include "logslogger.h"
    32 // LogsPredictiveTranslator::instance()
    34 // LogsPredictiveTranslator::instance()
    33 // -----------------------------------------------------------------------------
    35 // -----------------------------------------------------------------------------
    34 //
    36 //
    35 LogsPredictiveTranslator* LogsPredictiveTranslator::instance()
    37 LogsPredictiveTranslator* LogsPredictiveTranslator::instance()
    36 {
    38 {
       
    39     LOGS_QDEBUG( "logs [FINDER] -> LogsPredictiveTranslator::\
       
    40 instance()" )
    37     if ( !mInstance ) {
    41     if ( !mInstance ) {
    38         HbInputLanguage lang = 
    42         HbInputLanguage lang = 
    39                 HbInputSettingProxy::instance()->globalInputLanguage();
    43                 HbInputSettingProxy::instance()->globalInputLanguage();
       
    44         LOGS_QDEBUG_2( "logs [FINDER] Input lang is %d", 
       
    45                        lang.language() )
    40         switch( lang.language() ) {
    46         switch( lang.language() ) {
    41             case QLocale::Thai:
    47             case QLocale::Thai:
    42                 mInstance = new LogsPredictiveThai12KeyTranslator();
    48                 mInstance = new LogsPredictiveThai12KeyTranslator( lang );
    43                 break;
    49                 break;
    44             default:
    50             default:
    45                 mInstance = new LogsPredictiveLatin12KeyTranslator();
    51                 mInstance = new LogsPredictiveLatin12KeyTranslator( lang );
    46                 break;
    52                 break;
    47             }
    53             }
    48     }
    54     }
       
    55     LOGS_QDEBUG( "logs [FINDER] <- LogsPredictiveTranslator::\
       
    56 instance()" )
    49     return mInstance;
    57     return mInstance;
    50 }
    58 }
    51 
    59 
    52 // -----------------------------------------------------------------------------
    60 // -----------------------------------------------------------------------------
    53 // LogsPredictiveTranslator::deleteInstance()
    61 // LogsPredictiveTranslator::deleteInstance()
    62 
    70 
    63 // -----------------------------------------------------------------------------
    71 // -----------------------------------------------------------------------------
    64 // LogsPredictiveTranslator::LogsPredictiveTranslator()
    72 // LogsPredictiveTranslator::LogsPredictiveTranslator()
    65 // -----------------------------------------------------------------------------
    73 // -----------------------------------------------------------------------------
    66 //
    74 //
    67 LogsPredictiveTranslator::LogsPredictiveTranslator()
    75 LogsPredictiveTranslator::LogsPredictiveTranslator( const HbInputLanguage& lang )
       
    76     : mNameTranslator(0)
       
    77 
    68 {
    78 {
    69     LOGS_QDEBUG( "logs [FINDER] -> LogsPredictiveTranslator::\
    79     LOGS_QDEBUG( "logs [FINDER] -> LogsPredictiveTranslator::\
    70 LogsPredictiveTranslator()" )
    80 LogsPredictiveTranslator()" )
       
    81 
       
    82     mKeyMap = HbKeymapFactory::instance()->keymap( lang.language(), 
       
    83                                                    lang.variant() );
       
    84 
    71     LOGS_QDEBUG( "logs [FINDER] <- LogsPredictiveTranslator::\
    85     LOGS_QDEBUG( "logs [FINDER] <- LogsPredictiveTranslator::\
    72 LogsPredictiveTranslator()" )
    86 LogsPredictiveTranslator()" )
    73 }
    87 }
    74 
    88 
    75 
    89 
    81 {
    95 {
    82     LOGS_QDEBUG( "logs [FINDER] -> LogsPredictiveTranslator::\
    96     LOGS_QDEBUG( "logs [FINDER] -> LogsPredictiveTranslator::\
    83 ~LogsPredictiveTranslator()" )
    97 ~LogsPredictiveTranslator()" )
    84     mInstance = 0;
    98     mInstance = 0;
    85     mKeyMap = 0;
    99     mKeyMap = 0;
       
   100     delete mNameTranslator;
       
   101     mNameTranslator = 0;
    86     LOGS_QDEBUG( "logs [FINDER] <- LogsPredictiveTranslator::\
   102     LOGS_QDEBUG( "logs [FINDER] <- LogsPredictiveTranslator::\
    87 ~LogsPredictiveTranslator()" )
   103 ~LogsPredictiveTranslator()" )
    88     
   104     
    89 }
   105 }
    90 
   106 
    91 // -----------------------------------------------------------------------------
   107 // -----------------------------------------------------------------------------
       
   108 // LogsPredictiveTranslator::translateText()
       
   109 // -----------------------------------------------------------------------------
       
   110 //
       
   111 const QString LogsPredictiveTranslator::translateText( 
       
   112                                                   const QString& text )
       
   113 {
       
   114     LOGS_QDEBUG( "logs [FINDER] -> LogsPredictiveTranslator::translateText()" )
       
   115     LOGS_QDEBUG_2( "logs [FINDER] text ", text );
       
   116             
       
   117     bool ok;
       
   118     
       
   119     QString result = translate( text, &ok );
       
   120     if ( !ok ) {
       
   121         LOGS_QDEBUG( "logs [FINDER] Text is not in input language" )
       
   122         result = nameTranslator( text ).translate( text );
       
   123     }
       
   124     
       
   125     LOGS_QDEBUG( "logs [FINDER] <- LogsPredictiveTranslator::translateText()" )
       
   126     return result;
       
   127 }
       
   128 
       
   129 // -----------------------------------------------------------------------------
       
   130 // LogsPredictiveTranslator::nameTranslator()
       
   131 // -----------------------------------------------------------------------------
       
   132 //
       
   133 const LogsPredictiveTranslator& LogsPredictiveTranslator::nameTranslator( 
       
   134                                                    const QString& name )
       
   135 {
       
   136     LOGS_QDEBUG( "logs [FINDER] -> LogsPredictiveTranslator::nameTranslator()" )
       
   137     
       
   138     const LogsPredictiveTranslator* nameTranslator = this;
       
   139     if ( mNameTranslator && mNameTranslator->encodes( name ) ) {
       
   140         LOGS_QDEBUG( "logs [FINDER] <- LogsPredictiveTranslator::\
       
   141 nameTranslator() - use current" )
       
   142         nameTranslator = mNameTranslator;
       
   143     } else { 
       
   144         delete mNameTranslator;
       
   145         mNameTranslator = new LogsPredictiveLatin12KeyTranslator();
       
   146         if( mNameTranslator->encodes( name ) ) {
       
   147             nameTranslator = mNameTranslator;
       
   148             LOGS_QDEBUG( "logs [FINDER] <- LogsPredictiveTranslator::\
       
   149 nameTranslator() - use latin" )
       
   150             return *nameTranslator;
       
   151         }
       
   152         delete mNameTranslator;
       
   153         mNameTranslator = new LogsPredictiveThai12KeyTranslator();
       
   154         if( mNameTranslator->encodes( name ) ) {
       
   155             nameTranslator = mNameTranslator;
       
   156             LOGS_QDEBUG( "logs [FINDER] <- LogsPredictiveTranslator::\
       
   157 nameTranslator() - use thai" )
       
   158             return *nameTranslator;
       
   159         }
       
   160         delete mNameTranslator;
       
   161         mNameTranslator = 0;
       
   162         LOGS_QDEBUG( "logs [FINDER] <- LogsPredictiveTranslator::\
       
   163 nameTranslator() - use global input language" )
       
   164 
       
   165     }
       
   166     
       
   167         
       
   168     return *nameTranslator;
       
   169     
       
   170 }
       
   171 
       
   172 // -----------------------------------------------------------------------------
       
   173 // LogsPredictiveTranslator::encodes()
       
   174 // -----------------------------------------------------------------------------
       
   175 //
       
   176 bool LogsPredictiveTranslator::encodes( const QString& sniplet )
       
   177 {
       
   178     bool ok;
       
   179     translate( sniplet, &ok );
       
   180     return ok;
       
   181 }
       
   182 
       
   183 // -----------------------------------------------------------------------------
       
   184 // LogsPredictiveTranslator::translatePattern()
       
   185 // -----------------------------------------------------------------------------
       
   186 //
       
   187 const QString LogsPredictiveTranslator::translatePattern( 
       
   188                                                    const QString& pattern ) const
       
   189 {
       
   190     LOGS_QDEBUG( "logs [FINDER] -> LogsPredictiveTranslator::translatePattern()" )
       
   191     QString result = translate( pattern );
       
   192     
       
   193     LOGS_QDEBUG( "logs [FINDER] <- LogsPredictiveTranslator::translatePattern()" )
       
   194     return result;
       
   195 }
       
   196 
       
   197 // -----------------------------------------------------------------------------
    92 // LogsPredictiveTranslator::translate()
   198 // LogsPredictiveTranslator::translate()
    93 // -----------------------------------------------------------------------------
   199 // -----------------------------------------------------------------------------
    94 //
   200 //
    95 const QString LogsPredictiveTranslator::translate( const QString& name, 
   201 const QString LogsPredictiveTranslator::translate( const QString& text,
    96                                                    int count ) const
   202                                                    bool* ok, int count ) const
    97 {
   203 {
    98     LOGS_QDEBUG( "logs [FINDER] -> LogsPredictiveTranslator::translate()" )
   204     LOGS_QDEBUG( "logs [FINDER] -> LogsPredictiveTranslator::translate()" )
    99     LOGS_QDEBUG_2( "logs [FINDER] name ", name );
   205     LOGS_QDEBUG_2( "logs [FINDER] text ", text );
   100     
   206     
   101     count = count == -1 ? name.length() : count;
   207     count = count == -1 ? text.length() : count;
       
   208     bool isok = ok ? *ok : true;
   102     QString result;
   209     QString result;
   103     const QChar* content = name.data();
   210     const QChar* content = text.data();
   104     int index = 0;
   211     int index = 0;
   105     while( index < count ) {
   212     while( index < count && isok ) {
   106         QChar ch = translateChar( *content++ );
   213         QChar ch = translateChar( *content++, isok );
   107         if ( !ch.isNull() ) {
   214         if ( !ch.isNull() ) {
   108             result.append( ch );
   215             result.append( ch );
   109         }
   216         }
   110         index++;
   217         index++;
   111     }
   218     }
       
   219     if ( ok ) {
       
   220         *ok = isok;
       
   221     }
   112     LOGS_QDEBUG( "logs [FINDER] <- LogsPredictiveTranslator::translate()" )
   222     LOGS_QDEBUG( "logs [FINDER] <- LogsPredictiveTranslator::translate()" )
   113     return result;
   223     return result;
   114 }
   224 }
   115 
   225 
   116 // -----------------------------------------------------------------------------
   226 
   117 // LogsPredictiveTranslator::startsWith()
       
   118 // -----------------------------------------------------------------------------
       
   119 //
       
   120 int LogsPredictiveTranslator::startsWith( const QString& text, 
       
   121                                           const QString& pattern,
       
   122                                           bool optimize ) const
       
   123 {
       
   124     LOGS_QDEBUG( "logs [FINDER] -> LogsPredictiveTranslator::startsWith()" )
       
   125     //assumed that text has found based on pattern, thus only checking with
       
   126     //first char is enough, if mightContainZeroes eq false
       
   127     int matchCount = pattern.length();
       
   128     if ( text.isEmpty() || matchCount > text.length() ) {
       
   129         matchCount = 0;
       
   130     } else {
       
   131         if ( !optimize ) {
       
   132             QString translatedText = translate( text, pattern.length() );
       
   133             matchCount = translatedText == pattern ? matchCount : 0; 
       
   134         } else {
       
   135             matchCount = translateChar( *text.data() ) == *pattern.data() ? 
       
   136                          matchCount : 0;
       
   137         }
       
   138     }
       
   139         
       
   140     LOGS_QDEBUG_2( "logs [FINDER] matchCount=", matchCount )
       
   141     LOGS_QDEBUG( "logs [FINDER] <- LogsPredictiveTranslator::startsWith()" )
       
   142     return matchCount;
       
   143 }
       
   144