messagingapp/msgui/unifiededitor/src/msgunieditorlineedit.cpp
author hgs
Tue, 19 Oct 2010 11:30:16 +0530
changeset 76 60a8a215b0ec
parent 37 518b245aa84c
permissions -rw-r--r--
201041
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
37
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
 * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     3
 * All rights reserved.
hgs
parents:
diff changeset
     4
 * This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
 * under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
 * which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
 *
hgs
parents:
diff changeset
     9
 * Initial Contributors:
hgs
parents:
diff changeset
    10
 * Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
 *
hgs
parents:
diff changeset
    12
 * Contributors:
hgs
parents:
diff changeset
    13
 *
hgs
parents:
diff changeset
    14
 * Description:
hgs
parents:
diff changeset
    15
 *
hgs
parents:
diff changeset
    16
 */
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
#include "msgunieditorlineedit.h"
hgs
parents:
diff changeset
    19
#include <HbTapGesture>
hgs
parents:
diff changeset
    20
#include <HbMenu>
hgs
parents:
diff changeset
    21
#include <QApplication>
hgs
parents:
diff changeset
    22
#include <QClipboard>
hgs
parents:
diff changeset
    23
hgs
parents:
diff changeset
    24
const QRegExp expr("[,;\n]$");
hgs
parents:
diff changeset
    25
const QRegExp sepAtEnd("; $");
hgs
parents:
diff changeset
    26
const QRegExp sepAtMiddle("; ");
hgs
parents:
diff changeset
    27
hgs
parents:
diff changeset
    28
const QString replacementStr("; ");
hgs
parents:
diff changeset
    29
const QString labelSeperator(": ");
hgs
parents:
diff changeset
    30
hgs
parents:
diff changeset
    31
const int fadedAlpha(125);
hgs
parents:
diff changeset
    32
const int solidAlpha(255);
hgs
parents:
diff changeset
    33
hgs
parents:
diff changeset
    34
const int SNAP_DELAY = 350;
hgs
parents:
diff changeset
    35
hgs
parents:
diff changeset
    36
//Localization
hgs
parents:
diff changeset
    37
#define LOC_PASTE hbTrId("txt_common_menu_paste")
hgs
parents:
diff changeset
    38
hgs
parents:
diff changeset
    39
MsgUnifiedEditorLineEdit::MsgUnifiedEditorLineEdit(const QString& label,QGraphicsItem *parent):
76
hgs
parents: 37
diff changeset
    40
HbTextEdit(parent),
37
hgs
parents:
diff changeset
    41
mSelectionStart(-1),
hgs
parents:
diff changeset
    42
mSelectionEnd(-1),
hgs
parents:
diff changeset
    43
mDefaultBehaviour(false)
hgs
parents:
diff changeset
    44
{
hgs
parents:
diff changeset
    45
    QString labelStr = label.trimmed();
hgs
parents:
diff changeset
    46
    
hgs
parents:
diff changeset
    47
    QTextCursor cursor(this->textCursor());
hgs
parents:
diff changeset
    48
    QTextCharFormat colorFormat(cursor.charFormat());
hgs
parents:
diff changeset
    49
   
hgs
parents:
diff changeset
    50
    QColor fgColor = this->palette().color(QPalette::Text);     
hgs
parents:
diff changeset
    51
    fgColor.setAlpha(fadedAlpha);
hgs
parents:
diff changeset
    52
    colorFormat.setForeground(fgColor);
hgs
parents:
diff changeset
    53
    cursor.insertText(labelStr , colorFormat);
hgs
parents:
diff changeset
    54
hgs
parents:
diff changeset
    55
    fgColor.setAlpha(solidAlpha);
hgs
parents:
diff changeset
    56
    colorFormat.setForeground(fgColor);
hgs
parents:
diff changeset
    57
hgs
parents:
diff changeset
    58
    cursor.insertText(" ",colorFormat);    
hgs
parents:
diff changeset
    59
hgs
parents:
diff changeset
    60
    mLabelExpr.setPattern(QString("^"+labelStr+" $"));
hgs
parents:
diff changeset
    61
    mLabel = labelStr+" ";
hgs
parents:
diff changeset
    62
    
hgs
parents:
diff changeset
    63
    moveCursor(QTextCursor::EndOfBlock);
hgs
parents:
diff changeset
    64
hgs
parents:
diff changeset
    65
    connect(this,SIGNAL(selectionChanged(QTextCursor,QTextCursor)),
hgs
parents:
diff changeset
    66
            this,SLOT(selectionChanged(QTextCursor,QTextCursor)));
hgs
parents:
diff changeset
    67
    connect(this, SIGNAL(contentsChanged()), this, SLOT(onContentsChanged()));
hgs
parents:
diff changeset
    68
    
hgs
parents:
diff changeset
    69
    connect(this,SIGNAL(aboutToShowContextMenu(HbMenu*,const QPointF &)),
hgs
parents:
diff changeset
    70
            this,SLOT(aboutToShowContextMenu(HbMenu*,const QPointF &)));
hgs
parents:
diff changeset
    71
    
hgs
parents:
diff changeset
    72
}
hgs
parents:
diff changeset
    73
hgs
parents:
diff changeset
    74
MsgUnifiedEditorLineEdit::~MsgUnifiedEditorLineEdit()
hgs
parents:
diff changeset
    75
{
hgs
parents:
diff changeset
    76
}
hgs
parents:
diff changeset
    77
hgs
parents:
diff changeset
    78
void MsgUnifiedEditorLineEdit::inputMethodEvent(QInputMethodEvent *event)
hgs
parents:
diff changeset
    79
{
hgs
parents:
diff changeset
    80
    //let it go in default way.
hgs
parents:
diff changeset
    81
    if(mDefaultBehaviour)
hgs
parents:
diff changeset
    82
    {
76
hgs
parents: 37
diff changeset
    83
        HbTextEdit::inputMethodEvent(event);
37
hgs
parents:
diff changeset
    84
        event->accept();
hgs
parents:
diff changeset
    85
        return;
hgs
parents:
diff changeset
    86
    }
hgs
parents:
diff changeset
    87
hgs
parents:
diff changeset
    88
    if (!event->commitString().isEmpty() || event->replacementLength())
hgs
parents:
diff changeset
    89
    {
hgs
parents:
diff changeset
    90
        if (event->commitString().contains(expr))
hgs
parents:
diff changeset
    91
        {
hgs
parents:
diff changeset
    92
            if(this->text().isEmpty() || this->text().contains(sepAtEnd) || this->text().contains(mLabelExpr))
hgs
parents:
diff changeset
    93
            {
hgs
parents:
diff changeset
    94
                event->accept();
hgs
parents:
diff changeset
    95
                return;
hgs
parents:
diff changeset
    96
            }
hgs
parents:
diff changeset
    97
hgs
parents:
diff changeset
    98
            this->setCursorPosition(this->text().length());
hgs
parents:
diff changeset
    99
hgs
parents:
diff changeset
   100
            QString str = event->commitString();
hgs
parents:
diff changeset
   101
            str.replace(expr, replacementStr);            
hgs
parents:
diff changeset
   102
hgs
parents:
diff changeset
   103
            event->setCommitString(str, event->replacementStart(), event->replacementLength());            
hgs
parents:
diff changeset
   104
        }
76
hgs
parents: 37
diff changeset
   105
        else if(this->textCursor().hasSelection())
37
hgs
parents:
diff changeset
   106
        {// all user inputs get appended at the end
hgs
parents:
diff changeset
   107
            this->setCursorPosition(this->text().length());
hgs
parents:
diff changeset
   108
        }
hgs
parents:
diff changeset
   109
    }
hgs
parents:
diff changeset
   110
    
76
hgs
parents: 37
diff changeset
   111
    HbTextEdit::inputMethodEvent(event);
37
hgs
parents:
diff changeset
   112
    event->accept();
hgs
parents:
diff changeset
   113
}
hgs
parents:
diff changeset
   114
hgs
parents:
diff changeset
   115
void MsgUnifiedEditorLineEdit::keyPressEvent(QKeyEvent *event)
hgs
parents:
diff changeset
   116
{
hgs
parents:
diff changeset
   117
    QString str = event->text();
hgs
parents:
diff changeset
   118
hgs
parents:
diff changeset
   119
    if(event->key()== Qt::Key_Enter || event->key()== Qt::Key_Return)
hgs
parents:
diff changeset
   120
    {
hgs
parents:
diff changeset
   121
        if(mDefaultBehaviour)
hgs
parents:
diff changeset
   122
        {
76
hgs
parents: 37
diff changeset
   123
            HbTextEdit::keyReleaseEvent(event);
37
hgs
parents:
diff changeset
   124
            event->accept();
hgs
parents:
diff changeset
   125
            return;
hgs
parents:
diff changeset
   126
        }
hgs
parents:
diff changeset
   127
        if(this->text().isEmpty() || this->text().contains(sepAtEnd) || this->text().contains(mLabelExpr))
hgs
parents:
diff changeset
   128
        {
hgs
parents:
diff changeset
   129
            event->accept();
hgs
parents:
diff changeset
   130
            return;
hgs
parents:
diff changeset
   131
        }
hgs
parents:
diff changeset
   132
        this->setCursorPosition(this->text().length());
hgs
parents:
diff changeset
   133
        str = replacementStr;
hgs
parents:
diff changeset
   134
        QKeyEvent eve(event->type(), Qt::Key_Any, event->modifiers(), str);
76
hgs
parents: 37
diff changeset
   135
        HbTextEdit::keyPressEvent(&eve);
37
hgs
parents:
diff changeset
   136
        event->accept();
hgs
parents:
diff changeset
   137
        return;
hgs
parents:
diff changeset
   138
    }
hgs
parents:
diff changeset
   139
hgs
parents:
diff changeset
   140
    if(event->key() == Qt::Key_Backspace || event->key() == Qt::Key_Delete )
hgs
parents:
diff changeset
   141
    {
hgs
parents:
diff changeset
   142
        int pos = this->cursorPosition();
hgs
parents:
diff changeset
   143
        bool pbkContact = true;
hgs
parents:
diff changeset
   144
76
hgs
parents: 37
diff changeset
   145
        if(!this->textCursor().hasSelection())
37
hgs
parents:
diff changeset
   146
        {
hgs
parents:
diff changeset
   147
            this->setCursorPosition(pos-2);
hgs
parents:
diff changeset
   148
            pbkContact = this->textCursor().charFormat().fontUnderline();
hgs
parents:
diff changeset
   149
            this->setCursorPosition(pos);
hgs
parents:
diff changeset
   150
        }
hgs
parents:
diff changeset
   151
hgs
parents:
diff changeset
   152
        QString text = this->text();
hgs
parents:
diff changeset
   153
        text = text.left(pos);
hgs
parents:
diff changeset
   154
hgs
parents:
diff changeset
   155
        if(text.contains(mLabelExpr))
hgs
parents:
diff changeset
   156
        {
hgs
parents:
diff changeset
   157
            event->accept();
hgs
parents:
diff changeset
   158
            return;
hgs
parents:
diff changeset
   159
        }
hgs
parents:
diff changeset
   160
hgs
parents:
diff changeset
   161
        if(pbkContact)
hgs
parents:
diff changeset
   162
        {
hgs
parents:
diff changeset
   163
            //if already selected delete it.
76
hgs
parents: 37
diff changeset
   164
            if(this->textCursor().hasSelection())
37
hgs
parents:
diff changeset
   165
            {
hgs
parents:
diff changeset
   166
                // deleting phbkContact is an atomic operation
hgs
parents:
diff changeset
   167
                // ensure that the signal is emitted only once
hgs
parents:
diff changeset
   168
                disconnect(this, SIGNAL(contentsChanged()), 
hgs
parents:
diff changeset
   169
                        this, SLOT(onContentsChanged()));
76
hgs
parents: 37
diff changeset
   170
                HbTextEdit::keyPressEvent(event);
37
hgs
parents:
diff changeset
   171
                event->accept();
hgs
parents:
diff changeset
   172
                //delete seperator (i.e."; ").
hgs
parents:
diff changeset
   173
                QKeyEvent eve(event->type(), Qt::Key_Delete, Qt::NoModifier);
76
hgs
parents: 37
diff changeset
   174
                HbTextEdit::keyPressEvent(&eve);
hgs
parents: 37
diff changeset
   175
                HbTextEdit::keyPressEvent(&eve);
37
hgs
parents:
diff changeset
   176
                connect(this, SIGNAL(contentsChanged()), 
hgs
parents:
diff changeset
   177
                        this, SLOT(onContentsChanged()));
hgs
parents:
diff changeset
   178
                onContentsChanged();
hgs
parents:
diff changeset
   179
            }
hgs
parents:
diff changeset
   180
            else //make it selected
hgs
parents:
diff changeset
   181
            {                
hgs
parents:
diff changeset
   182
                this->setCursorPosition(pos-3);
hgs
parents:
diff changeset
   183
                setHighlight(pos-3);
hgs
parents:
diff changeset
   184
            }
hgs
parents:
diff changeset
   185
        }
hgs
parents:
diff changeset
   186
        else
hgs
parents:
diff changeset
   187
        {
hgs
parents:
diff changeset
   188
            QString str = text.right(2);
hgs
parents:
diff changeset
   189
            if(str == replacementStr)
hgs
parents:
diff changeset
   190
            {
hgs
parents:
diff changeset
   191
                // deleting contact is an atomic operation
hgs
parents:
diff changeset
   192
                // ensure that the signal is emitted only once
hgs
parents:
diff changeset
   193
                disconnect(this, SIGNAL(contentsChanged()), 
hgs
parents:
diff changeset
   194
                        this, SLOT(onContentsChanged()));
hgs
parents:
diff changeset
   195
                //delete seperator (i.e."; ").
hgs
parents:
diff changeset
   196
                QKeyEvent eve(event->type(), Qt::Key_Backspace, Qt::NoModifier);
76
hgs
parents: 37
diff changeset
   197
                HbTextEdit::keyPressEvent(&eve);
hgs
parents: 37
diff changeset
   198
                HbTextEdit::keyPressEvent(&eve);
37
hgs
parents:
diff changeset
   199
                connect(this, SIGNAL(contentsChanged()), 
hgs
parents:
diff changeset
   200
                        this, SLOT(onContentsChanged()));
hgs
parents:
diff changeset
   201
                onContentsChanged();
hgs
parents:
diff changeset
   202
            }
hgs
parents:
diff changeset
   203
            else
hgs
parents:
diff changeset
   204
            {
76
hgs
parents: 37
diff changeset
   205
                HbTextEdit::keyPressEvent(event);
37
hgs
parents:
diff changeset
   206
            }
hgs
parents:
diff changeset
   207
            event->accept();
hgs
parents:
diff changeset
   208
        }
hgs
parents:
diff changeset
   209
        
hgs
parents:
diff changeset
   210
        event->accept();
hgs
parents:
diff changeset
   211
        return;
hgs
parents:
diff changeset
   212
    }
hgs
parents:
diff changeset
   213
hgs
parents:
diff changeset
   214
    if (event->key() == Qt::Key_Left )
hgs
parents:
diff changeset
   215
    {
76
hgs
parents: 37
diff changeset
   216
        bool selectedText = this->textCursor().hasSelection();
37
hgs
parents:
diff changeset
   217
hgs
parents:
diff changeset
   218
        //look ahead left.
hgs
parents:
diff changeset
   219
        int pos = this->cursorPosition();
hgs
parents:
diff changeset
   220
hgs
parents:
diff changeset
   221
        QString text = this->text();
hgs
parents:
diff changeset
   222
        text = text.left(pos);
hgs
parents:
diff changeset
   223
hgs
parents:
diff changeset
   224
        //no text other than label;
hgs
parents:
diff changeset
   225
        if(text.contains(mLabelExpr))
hgs
parents:
diff changeset
   226
        {
hgs
parents:
diff changeset
   227
            event->accept();
hgs
parents:
diff changeset
   228
            return;
hgs
parents:
diff changeset
   229
        }
hgs
parents:
diff changeset
   230
hgs
parents:
diff changeset
   231
        //look for next seperator while going left.
hgs
parents:
diff changeset
   232
        int newPos = text.lastIndexOf(sepAtMiddle);
hgs
parents:
diff changeset
   233
hgs
parents:
diff changeset
   234
        if(newPos < 0 && selectedText)
hgs
parents:
diff changeset
   235
        {
hgs
parents:
diff changeset
   236
            event->accept();
hgs
parents:
diff changeset
   237
            return;
hgs
parents:
diff changeset
   238
        }
hgs
parents:
diff changeset
   239
hgs
parents:
diff changeset
   240
        bool pbkContact = true;
hgs
parents:
diff changeset
   241
hgs
parents:
diff changeset
   242
        if(!selectedText)
hgs
parents:
diff changeset
   243
        {
hgs
parents:
diff changeset
   244
            this->setCursorPosition(pos-2);
hgs
parents:
diff changeset
   245
            pbkContact = this->textCursor().charFormat().fontUnderline();
hgs
parents:
diff changeset
   246
            this->setCursorPosition(pos);
hgs
parents:
diff changeset
   247
        }
hgs
parents:
diff changeset
   248
        else
hgs
parents:
diff changeset
   249
        {
hgs
parents:
diff changeset
   250
            this->setCursorPosition(newPos);
hgs
parents:
diff changeset
   251
            pbkContact = this->textCursor().charFormat().fontUnderline();
hgs
parents:
diff changeset
   252
            this->setCursorPosition(pos);
hgs
parents:
diff changeset
   253
        }
hgs
parents:
diff changeset
   254
hgs
parents:
diff changeset
   255
hgs
parents:
diff changeset
   256
        if(pbkContact && newPos >0)
hgs
parents:
diff changeset
   257
        {
hgs
parents:
diff changeset
   258
hgs
parents:
diff changeset
   259
            setHighlight(newPos-1);
hgs
parents:
diff changeset
   260
        }
hgs
parents:
diff changeset
   261
        else
hgs
parents:
diff changeset
   262
        {
hgs
parents:
diff changeset
   263
            //move left, char by char. if seperator met jump over it.
hgs
parents:
diff changeset
   264
            if( (newPos > 0 && selectedText) || (pos-2  == newPos))
hgs
parents:
diff changeset
   265
            {
hgs
parents:
diff changeset
   266
                this->setCursorPosition(newPos+1);
hgs
parents:
diff changeset
   267
            }
hgs
parents:
diff changeset
   268
76
hgs
parents: 37
diff changeset
   269
            HbTextEdit::keyPressEvent(event);
37
hgs
parents:
diff changeset
   270
hgs
parents:
diff changeset
   271
        }
hgs
parents:
diff changeset
   272
        event->accept();
hgs
parents:
diff changeset
   273
        return;
hgs
parents:
diff changeset
   274
    }
hgs
parents:
diff changeset
   275
hgs
parents:
diff changeset
   276
    if (event->key() == Qt::Key_Right)
hgs
parents:
diff changeset
   277
    {
76
hgs
parents: 37
diff changeset
   278
        bool selectedText = this->textCursor().hasSelection();
37
hgs
parents:
diff changeset
   279
hgs
parents:
diff changeset
   280
        //look ahead.
hgs
parents:
diff changeset
   281
        int pos = this->cursorPosition();
hgs
parents:
diff changeset
   282
        this->setCursorPosition(pos+3);
hgs
parents:
diff changeset
   283
        bool pbkContact = this->textCursor().charFormat().fontUnderline();
hgs
parents:
diff changeset
   284
        this->setCursorPosition(pos);
hgs
parents:
diff changeset
   285
hgs
parents:
diff changeset
   286
        //look for next seperator.
hgs
parents:
diff changeset
   287
        QString text = this->text();
hgs
parents:
diff changeset
   288
        int newPos = text.indexOf(sepAtMiddle,pos+2);
hgs
parents:
diff changeset
   289
hgs
parents:
diff changeset
   290
        if(pbkContact && newPos >0)
hgs
parents:
diff changeset
   291
        {
hgs
parents:
diff changeset
   292
            this->setCursorPosition(newPos-1);
hgs
parents:
diff changeset
   293
            setHighlight(newPos-1);
hgs
parents:
diff changeset
   294
        }
hgs
parents:
diff changeset
   295
        else
hgs
parents:
diff changeset
   296
        {            
hgs
parents:
diff changeset
   297
            int seperatorPos = text.indexOf(sepAtMiddle,pos);
hgs
parents:
diff changeset
   298
hgs
parents:
diff changeset
   299
            if(selectedText || seperatorPos == pos)
hgs
parents:
diff changeset
   300
            {
hgs
parents:
diff changeset
   301
                this->setCursorPosition(pos+1);
hgs
parents:
diff changeset
   302
                this->deselect();
hgs
parents:
diff changeset
   303
            }
76
hgs
parents: 37
diff changeset
   304
            HbTextEdit::keyPressEvent(event);
37
hgs
parents:
diff changeset
   305
        }
hgs
parents:
diff changeset
   306
        event->accept();
hgs
parents:
diff changeset
   307
        return;
hgs
parents:
diff changeset
   308
    }
hgs
parents:
diff changeset
   309
hgs
parents:
diff changeset
   310
    if(!str.isEmpty())
hgs
parents:
diff changeset
   311
    {
hgs
parents:
diff changeset
   312
        if(mDefaultBehaviour)
hgs
parents:
diff changeset
   313
        {
76
hgs
parents: 37
diff changeset
   314
            HbTextEdit::keyPressEvent(event);
37
hgs
parents:
diff changeset
   315
            event->accept();
hgs
parents:
diff changeset
   316
            return;
hgs
parents:
diff changeset
   317
        }
hgs
parents:
diff changeset
   318
        if (str.contains(expr))
hgs
parents:
diff changeset
   319
        {
hgs
parents:
diff changeset
   320
            if(this->text().isEmpty() || this->text().contains(sepAtEnd) || this->text().contains(mLabelExpr))
hgs
parents:
diff changeset
   321
            {
hgs
parents:
diff changeset
   322
                event->accept();
hgs
parents:
diff changeset
   323
                return;
hgs
parents:
diff changeset
   324
            }
hgs
parents:
diff changeset
   325
hgs
parents:
diff changeset
   326
            // auto-complete the last incomplete word
hgs
parents:
diff changeset
   327
            int contentLength = this->text().length();
hgs
parents:
diff changeset
   328
            int pos = this->cursorPosition();
hgs
parents:
diff changeset
   329
            QString incompleteWord(this->text().right(contentLength-(pos-1)));
hgs
parents:
diff changeset
   330
            if(!incompleteWord.contains(sepAtMiddle))
hgs
parents:
diff changeset
   331
            {
hgs
parents:
diff changeset
   332
                this->setCursorPosition(this->text().length());
hgs
parents:
diff changeset
   333
            }
hgs
parents:
diff changeset
   334
hgs
parents:
diff changeset
   335
            str.replace(expr, replacementStr);
hgs
parents:
diff changeset
   336
            QKeyEvent eve(event->type(), event->key(), event->modifiers(), str);
76
hgs
parents: 37
diff changeset
   337
            HbTextEdit::keyPressEvent(&eve);
37
hgs
parents:
diff changeset
   338
        }
hgs
parents:
diff changeset
   339
        else
hgs
parents:
diff changeset
   340
        {
76
hgs
parents: 37
diff changeset
   341
            HbTextEdit::keyPressEvent(event);
37
hgs
parents:
diff changeset
   342
            event->accept();
hgs
parents:
diff changeset
   343
            return;
hgs
parents:
diff changeset
   344
        }
hgs
parents:
diff changeset
   345
    }
hgs
parents:
diff changeset
   346
}
hgs
parents:
diff changeset
   347
hgs
parents:
diff changeset
   348
void MsgUnifiedEditorLineEdit::handleTap()
hgs
parents:
diff changeset
   349
{
hgs
parents:
diff changeset
   350
    int currentPos = this->cursorPosition();
hgs
parents:
diff changeset
   351
hgs
parents:
diff changeset
   352
    QString txt = this->text();
hgs
parents:
diff changeset
   353
hgs
parents:
diff changeset
   354
    QString tempTxt = txt.left(currentPos+2);
hgs
parents:
diff changeset
   355
    int seperatorPos = tempTxt.lastIndexOf(sepAtMiddle,currentPos);
hgs
parents:
diff changeset
   356
hgs
parents:
diff changeset
   357
    txt = txt.right(txt.length() - currentPos);
hgs
parents:
diff changeset
   358
    int labelPos = txt.indexOf(labelSeperator);
hgs
parents:
diff changeset
   359
hgs
parents:
diff changeset
   360
    if(labelPos >= 0 )//pressed on label.
hgs
parents:
diff changeset
   361
    {
76
hgs
parents: 37
diff changeset
   362
        HbTextEdit::setCursorPosition(currentPos + labelPos + 2);
37
hgs
parents:
diff changeset
   363
    }
hgs
parents:
diff changeset
   364
    else if(seperatorPos == currentPos-1 || seperatorPos == currentPos)//pressed just on seperator.
hgs
parents:
diff changeset
   365
    {
76
hgs
parents: 37
diff changeset
   366
        HbTextEdit::setCursorPosition(seperatorPos+2);
37
hgs
parents:
diff changeset
   367
    }
hgs
parents:
diff changeset
   368
    else
hgs
parents:
diff changeset
   369
    {
76
hgs
parents: 37
diff changeset
   370
        HbTextEdit::setCursorPosition(currentPos);
37
hgs
parents:
diff changeset
   371
        bool pbkContact = this->textCursor().charFormat().fontUnderline();
hgs
parents:
diff changeset
   372
        if(pbkContact)
hgs
parents:
diff changeset
   373
        {
hgs
parents:
diff changeset
   374
            setHighlight(currentPos);
hgs
parents:
diff changeset
   375
        }
hgs
parents:
diff changeset
   376
    }
hgs
parents:
diff changeset
   377
hgs
parents:
diff changeset
   378
    this->update();
hgs
parents:
diff changeset
   379
}
hgs
parents:
diff changeset
   380
hgs
parents:
diff changeset
   381
void MsgUnifiedEditorLineEdit::gestureEvent(QGestureEvent* event)
hgs
parents:
diff changeset
   382
{
hgs
parents:
diff changeset
   383
    //passing gesture event to base class.
76
hgs
parents: 37
diff changeset
   384
    HbTextEdit::gestureEvent(event);
37
hgs
parents:
diff changeset
   385
    
hgs
parents:
diff changeset
   386
    
hgs
parents:
diff changeset
   387
    if(HbTapGesture *tap = qobject_cast<HbTapGesture*>(event->gesture(Qt::TapGesture)))
hgs
parents:
diff changeset
   388
    {
hgs
parents:
diff changeset
   389
        //capturing gesture position, and map to local co-ordinates.
hgs
parents:
diff changeset
   390
        QPointF pos = mapFromScene(tap->scenePosition());
hgs
parents:
diff changeset
   391
        
hgs
parents:
diff changeset
   392
        switch (tap->state()) 
hgs
parents:
diff changeset
   393
        {
hgs
parents:
diff changeset
   394
            case Qt::GestureFinished:
hgs
parents:
diff changeset
   395
            {
hgs
parents:
diff changeset
   396
                if (HbTapGesture::Tap == tap->tapStyleHint()) 
hgs
parents:
diff changeset
   397
                {
hgs
parents:
diff changeset
   398
                    handleTap();
hgs
parents:
diff changeset
   399
                }
hgs
parents:
diff changeset
   400
                break;
hgs
parents:
diff changeset
   401
            }
hgs
parents:
diff changeset
   402
            default:
hgs
parents:
diff changeset
   403
                break;
hgs
parents:
diff changeset
   404
        }
hgs
parents:
diff changeset
   405
        event->accept();
hgs
parents:
diff changeset
   406
    }
hgs
parents:
diff changeset
   407
    else
hgs
parents:
diff changeset
   408
    {
hgs
parents:
diff changeset
   409
        event->ignore();
hgs
parents:
diff changeset
   410
    }
hgs
parents:
diff changeset
   411
}
hgs
parents:
diff changeset
   412
hgs
parents:
diff changeset
   413
void MsgUnifiedEditorLineEdit::setText(const QString& text, bool underlined)
hgs
parents:
diff changeset
   414
{
hgs
parents:
diff changeset
   415
hgs
parents:
diff changeset
   416
    if(!mDefaultBehaviour)
hgs
parents:
diff changeset
   417
    {
hgs
parents:
diff changeset
   418
        // atomic operation, ensure one signal only at the end
hgs
parents:
diff changeset
   419
        disconnect(this, SIGNAL(contentsChanged()), this, SLOT(onContentsChanged()));
hgs
parents:
diff changeset
   420
hgs
parents:
diff changeset
   421
        //make sure previous text is complete.
hgs
parents:
diff changeset
   422
        if(this->content().length() > 0)
hgs
parents:
diff changeset
   423
        {
hgs
parents:
diff changeset
   424
            QInputMethodEvent e;
hgs
parents:
diff changeset
   425
            e.setCommitString(";");
hgs
parents:
diff changeset
   426
            this->inputMethodEvent(&e);
hgs
parents:
diff changeset
   427
        }
hgs
parents:
diff changeset
   428
        this->setCursorPosition(this->text().length());
hgs
parents:
diff changeset
   429
hgs
parents:
diff changeset
   430
        QTextCursor cursor(this->textCursor());
hgs
parents:
diff changeset
   431
        QTextCharFormat colorFormat(cursor.charFormat());
hgs
parents:
diff changeset
   432
        if(underlined)
hgs
parents:
diff changeset
   433
        {
hgs
parents:
diff changeset
   434
            QColor fgColor = colorFormat.foreground().color();
hgs
parents:
diff changeset
   435
            fgColor.setAlpha(fadedAlpha);
hgs
parents:
diff changeset
   436
            colorFormat.setUnderlineColor(fgColor);
hgs
parents:
diff changeset
   437
            colorFormat.setFontUnderline(true);        
hgs
parents:
diff changeset
   438
        }
hgs
parents:
diff changeset
   439
        cursor.insertText(text , colorFormat);
hgs
parents:
diff changeset
   440
        colorFormat.setFontUnderline(false);
hgs
parents:
diff changeset
   441
hgs
parents:
diff changeset
   442
        cursor.insertText(replacementStr,colorFormat);
hgs
parents:
diff changeset
   443
        connect(this, SIGNAL(contentsChanged()), this, SLOT(onContentsChanged()));
hgs
parents:
diff changeset
   444
        onContentsChanged();
hgs
parents:
diff changeset
   445
    }
hgs
parents:
diff changeset
   446
    else
hgs
parents:
diff changeset
   447
    {
hgs
parents:
diff changeset
   448
       this->setCursorPosition(this->text().length());
hgs
parents:
diff changeset
   449
       QTextCursor cursor(this->textCursor());
hgs
parents:
diff changeset
   450
       cursor.insertText(text);
hgs
parents:
diff changeset
   451
    }
hgs
parents:
diff changeset
   452
    
hgs
parents:
diff changeset
   453
    moveCursor(QTextCursor::EndOfBlock);
hgs
parents:
diff changeset
   454
}
hgs
parents:
diff changeset
   455
hgs
parents:
diff changeset
   456
QStringList MsgUnifiedEditorLineEdit::addresses()
hgs
parents:
diff changeset
   457
{
hgs
parents:
diff changeset
   458
    QString text = this->content();
hgs
parents:
diff changeset
   459
    QStringList list = text.split(replacementStr,QString::SkipEmptyParts);
hgs
parents:
diff changeset
   460
    return list;
hgs
parents:
diff changeset
   461
}
hgs
parents:
diff changeset
   462
hgs
parents:
diff changeset
   463
void MsgUnifiedEditorLineEdit::focusInEvent(QFocusEvent* event)
hgs
parents:
diff changeset
   464
{    
76
hgs
parents: 37
diff changeset
   465
    HbTextEdit::focusInEvent(event);
hgs
parents: 37
diff changeset
   466
//    this->setCursorVisibility(Hb::TextCursorVisible);
37
hgs
parents:
diff changeset
   467
}
hgs
parents:
diff changeset
   468
hgs
parents:
diff changeset
   469
void MsgUnifiedEditorLineEdit::focusOutEvent(QFocusEvent* event)
hgs
parents:
diff changeset
   470
{    
76
hgs
parents: 37
diff changeset
   471
    HbTextEdit::focusOutEvent(event);
hgs
parents: 37
diff changeset
   472
//    this->setCursorVisibility(Hb::TextCursorHidden);
37
hgs
parents:
diff changeset
   473
}
hgs
parents:
diff changeset
   474
hgs
parents:
diff changeset
   475
void MsgUnifiedEditorLineEdit::setHighlight(int currentPos)
hgs
parents:
diff changeset
   476
{
hgs
parents:
diff changeset
   477
    QString txt = this->text();    
hgs
parents:
diff changeset
   478
hgs
parents:
diff changeset
   479
    int endPos = qMax(txt.indexOf(sepAtMiddle,currentPos),
hgs
parents:
diff changeset
   480
                      txt.indexOf(labelSeperator,currentPos));
hgs
parents:
diff changeset
   481
hgs
parents:
diff changeset
   482
    int startPos = qMax(txt.lastIndexOf(sepAtMiddle,currentPos),
hgs
parents:
diff changeset
   483
                        txt.lastIndexOf(labelSeperator,currentPos));
hgs
parents:
diff changeset
   484
hgs
parents:
diff changeset
   485
    disconnect(this,SIGNAL(selectionChanged(QTextCursor,QTextCursor)),
hgs
parents:
diff changeset
   486
               this,SLOT(selectionChanged(QTextCursor,QTextCursor)));
hgs
parents:
diff changeset
   487
hgs
parents:
diff changeset
   488
    //highlight if pbk contact.
hgs
parents:
diff changeset
   489
    if(startPos > 0 && endPos > 0 && startPos != endPos)
hgs
parents:
diff changeset
   490
    {
hgs
parents:
diff changeset
   491
        this->setSelection(startPos + 2, endPos - startPos - 2);
hgs
parents:
diff changeset
   492
        this->update();
hgs
parents:
diff changeset
   493
    }
hgs
parents:
diff changeset
   494
    else
hgs
parents:
diff changeset
   495
    {
hgs
parents:
diff changeset
   496
        this->deselect();
hgs
parents:
diff changeset
   497
    }
hgs
parents:
diff changeset
   498
hgs
parents:
diff changeset
   499
    this->update();
hgs
parents:
diff changeset
   500
hgs
parents:
diff changeset
   501
    connect(this,SIGNAL(selectionChanged(QTextCursor,QTextCursor)),
hgs
parents:
diff changeset
   502
            this,SLOT(selectionChanged(QTextCursor,QTextCursor)));
hgs
parents:
diff changeset
   503
}
hgs
parents:
diff changeset
   504
hgs
parents:
diff changeset
   505
void MsgUnifiedEditorLineEdit::selectionChanged(const QTextCursor &oldCursor, const QTextCursor& newCursor)
hgs
parents:
diff changeset
   506
{
hgs
parents:
diff changeset
   507
hgs
parents:
diff changeset
   508
    if(mSelectionSnapTimer.isActive())
hgs
parents:
diff changeset
   509
    {
hgs
parents:
diff changeset
   510
        mSelectionSnapTimer.stop();
hgs
parents:
diff changeset
   511
    }
hgs
parents:
diff changeset
   512
hgs
parents:
diff changeset
   513
    if(newCursor.selectionStart() < mLabel.length())
hgs
parents:
diff changeset
   514
    {
hgs
parents:
diff changeset
   515
        this->setTextCursor(oldCursor);
hgs
parents:
diff changeset
   516
        return;
hgs
parents:
diff changeset
   517
    }
hgs
parents:
diff changeset
   518
hgs
parents:
diff changeset
   519
    if(!mDefaultBehaviour)
hgs
parents:
diff changeset
   520
        {
hgs
parents:
diff changeset
   521
        mSelectionStart  = newCursor.selectionStart();
hgs
parents:
diff changeset
   522
        mSelectionEnd    = newCursor.selectionEnd();
hgs
parents:
diff changeset
   523
hgs
parents:
diff changeset
   524
        if(mSelectionStart == mSelectionEnd )
hgs
parents:
diff changeset
   525
            {
hgs
parents:
diff changeset
   526
            return;
hgs
parents:
diff changeset
   527
            }
hgs
parents:
diff changeset
   528
    
hgs
parents:
diff changeset
   529
        mSelectionSnapTimer.start(SNAP_DELAY,this);
hgs
parents:
diff changeset
   530
        }
hgs
parents:
diff changeset
   531
}
hgs
parents:
diff changeset
   532
hgs
parents:
diff changeset
   533
void MsgUnifiedEditorLineEdit::timerEvent(QTimerEvent *event)
hgs
parents:
diff changeset
   534
{
hgs
parents:
diff changeset
   535
    //passing event to base class.
76
hgs
parents: 37
diff changeset
   536
    HbTextEdit::timerEvent(event);
37
hgs
parents:
diff changeset
   537
hgs
parents:
diff changeset
   538
    if (event->timerId() == mSelectionSnapTimer.timerId())
hgs
parents:
diff changeset
   539
    {
hgs
parents:
diff changeset
   540
        mSelectionSnapTimer.stop();
hgs
parents:
diff changeset
   541
hgs
parents:
diff changeset
   542
        disconnect(this,SIGNAL(selectionChanged(QTextCursor,QTextCursor)),
hgs
parents:
diff changeset
   543
                   this,SLOT(selectionChanged(QTextCursor,QTextCursor)));
hgs
parents:
diff changeset
   544
hgs
parents:
diff changeset
   545
        QString txt = this->text();
hgs
parents:
diff changeset
   546
hgs
parents:
diff changeset
   547
        int startPos = qMax(txt.lastIndexOf(sepAtMiddle,mSelectionStart),
hgs
parents:
diff changeset
   548
                            txt.lastIndexOf(labelSeperator,mSelectionStart));
hgs
parents:
diff changeset
   549
hgs
parents:
diff changeset
   550
        int endPos = qMax(txt.indexOf(sepAtMiddle,mSelectionEnd),
hgs
parents:
diff changeset
   551
                          txt.indexOf(labelSeperator,mSelectionEnd));
hgs
parents:
diff changeset
   552
hgs
parents:
diff changeset
   553
        if(endPos < 0 )
hgs
parents:
diff changeset
   554
        {
hgs
parents:
diff changeset
   555
            endPos = mSelectionEnd;
hgs
parents:
diff changeset
   556
        }
hgs
parents:
diff changeset
   557
hgs
parents:
diff changeset
   558
        this->setSelection(startPos + 2, endPos - startPos - 2);
hgs
parents:
diff changeset
   559
hgs
parents:
diff changeset
   560
        connect(this,SIGNAL(selectionChanged(QTextCursor,QTextCursor)),
hgs
parents:
diff changeset
   561
                this,SLOT(selectionChanged(QTextCursor,QTextCursor)));
hgs
parents:
diff changeset
   562
hgs
parents:
diff changeset
   563
        event->accept();
hgs
parents:
diff changeset
   564
    }
hgs
parents:
diff changeset
   565
}
hgs
parents:
diff changeset
   566
hgs
parents:
diff changeset
   567
void MsgUnifiedEditorLineEdit::setDefaultBehaviour(bool defaultBehaviour)
hgs
parents:
diff changeset
   568
{
hgs
parents:
diff changeset
   569
    mDefaultBehaviour = defaultBehaviour;
hgs
parents:
diff changeset
   570
}
hgs
parents:
diff changeset
   571
hgs
parents:
diff changeset
   572
QString MsgUnifiedEditorLineEdit::text() const
hgs
parents:
diff changeset
   573
{
76
hgs
parents: 37
diff changeset
   574
   return this->toPlainText();
37
hgs
parents:
diff changeset
   575
}
hgs
parents:
diff changeset
   576
hgs
parents:
diff changeset
   577
QString MsgUnifiedEditorLineEdit::content() const
hgs
parents:
diff changeset
   578
{
hgs
parents:
diff changeset
   579
    QString text = this->text();
hgs
parents:
diff changeset
   580
    text.remove(mLabel);
hgs
parents:
diff changeset
   581
    return text;
hgs
parents:
diff changeset
   582
}
hgs
parents:
diff changeset
   583
hgs
parents:
diff changeset
   584
void MsgUnifiedEditorLineEdit::clearContent()
hgs
parents:
diff changeset
   585
{
hgs
parents:
diff changeset
   586
    // avoid getting updates during local editing
hgs
parents:
diff changeset
   587
    disconnect(this, SIGNAL(contentsChanged()), this, SLOT(onContentsChanged()));
hgs
parents:
diff changeset
   588
    
hgs
parents:
diff changeset
   589
    int startPos = mLabel.length();
hgs
parents:
diff changeset
   590
    this->setSelection(startPos, content().length());
hgs
parents:
diff changeset
   591
    QKeyEvent eve(QEvent::KeyPress, Qt::Key_Backspace, Qt::NoModifier);
hgs
parents:
diff changeset
   592
    this->keyPressEvent(&eve);
hgs
parents:
diff changeset
   593
    this->deselect();
hgs
parents:
diff changeset
   594
hgs
parents:
diff changeset
   595
    // re-connect signal to start getting updates
hgs
parents:
diff changeset
   596
    connect(this, SIGNAL(contentsChanged()), this, SLOT(onContentsChanged()));
hgs
parents:
diff changeset
   597
}
hgs
parents:
diff changeset
   598
hgs
parents:
diff changeset
   599
void MsgUnifiedEditorLineEdit::onContentsChanged()
hgs
parents:
diff changeset
   600
{
hgs
parents:
diff changeset
   601
    emit contentsChanged(content());
hgs
parents:
diff changeset
   602
}
hgs
parents:
diff changeset
   603
hgs
parents:
diff changeset
   604
void MsgUnifiedEditorLineEdit::highlightInvalidString(QString invalidStr)
hgs
parents:
diff changeset
   605
{
hgs
parents:
diff changeset
   606
    // for only address editor
hgs
parents:
diff changeset
   607
    if(!mDefaultBehaviour)
hgs
parents:
diff changeset
   608
    {
hgs
parents:
diff changeset
   609
        QString txtContent = this->text();
hgs
parents:
diff changeset
   610
        int searchStartPos = mLabel.length();
hgs
parents:
diff changeset
   611
        int startPos = txtContent.indexOf(invalidStr, searchStartPos);
hgs
parents:
diff changeset
   612
        disconnect(this,SIGNAL(selectionChanged(QTextCursor,QTextCursor)),
hgs
parents:
diff changeset
   613
                   this,SLOT(selectionChanged(QTextCursor,QTextCursor)));
hgs
parents:
diff changeset
   614
        // if invalidStr found
hgs
parents:
diff changeset
   615
        if(startPos > 0)
hgs
parents:
diff changeset
   616
        {
hgs
parents:
diff changeset
   617
            this->setSelection(startPos, invalidStr.length());
hgs
parents:
diff changeset
   618
        }
hgs
parents:
diff changeset
   619
        connect(this,SIGNAL(selectionChanged(QTextCursor,QTextCursor)),
hgs
parents:
diff changeset
   620
                this,SLOT(selectionChanged(QTextCursor,QTextCursor)));
hgs
parents:
diff changeset
   621
    }
hgs
parents:
diff changeset
   622
}
hgs
parents:
diff changeset
   623
hgs
parents:
diff changeset
   624
void MsgUnifiedEditorLineEdit::aboutToShowContextMenu(HbMenu *contextMenu, const QPointF &pos)
hgs
parents:
diff changeset
   625
{
hgs
parents:
diff changeset
   626
    Q_UNUSED(pos)
hgs
parents:
diff changeset
   627
    //clear all menu actions.
hgs
parents:
diff changeset
   628
    contextMenu->clearActions();
hgs
parents:
diff changeset
   629
    
hgs
parents:
diff changeset
   630
    const QMimeData *mimedata = QApplication::clipboard()->mimeData();
hgs
parents:
diff changeset
   631
    if(mimedata)
hgs
parents:
diff changeset
   632
    {
hgs
parents:
diff changeset
   633
        if(canInsertFromMimeData(mimedata))
hgs
parents:
diff changeset
   634
        {
hgs
parents:
diff changeset
   635
            contextMenu->addAction(LOC_PASTE,this,SLOT(paste()));
hgs
parents:
diff changeset
   636
        }
hgs
parents:
diff changeset
   637
    }
hgs
parents:
diff changeset
   638
hgs
parents:
diff changeset
   639
}
76
hgs
parents: 37
diff changeset
   640
hgs
parents: 37
diff changeset
   641
void MsgUnifiedEditorLineEdit::setSelection(int start, int length)
hgs
parents: 37
diff changeset
   642
{
hgs
parents: 37
diff changeset
   643
    int textLength = text().count();
hgs
parents: 37
diff changeset
   644
    QString test = text();
hgs
parents: 37
diff changeset
   645
    Q_UNUSED(test)
hgs
parents: 37
diff changeset
   646
    if (start < 0 || start > textLength) {
hgs
parents: 37
diff changeset
   647
        return;
hgs
parents: 37
diff changeset
   648
    }
hgs
parents: 37
diff changeset
   649
hgs
parents: 37
diff changeset
   650
    int end(start+length);
hgs
parents: 37
diff changeset
   651
    if (end > textLength) {
hgs
parents: 37
diff changeset
   652
        end = textLength;
hgs
parents: 37
diff changeset
   653
    } else if (end < 0) {
hgs
parents: 37
diff changeset
   654
        end = 0;
hgs
parents: 37
diff changeset
   655
    }
hgs
parents: 37
diff changeset
   656
hgs
parents: 37
diff changeset
   657
    QTextCursor cursor = textCursor();
hgs
parents: 37
diff changeset
   658
    cursor.setPosition(start, QTextCursor::MoveAnchor);
hgs
parents: 37
diff changeset
   659
    cursor.setPosition(end, QTextCursor::KeepAnchor);
hgs
parents: 37
diff changeset
   660
    setTextCursor(cursor);
hgs
parents: 37
diff changeset
   661
hgs
parents: 37
diff changeset
   662
}
37
hgs
parents:
diff changeset
   663
// eof