ginebra2/EditorWidget.cpp
author hgs
Fri, 15 Oct 2010 17:30:59 -0400
changeset 16 3c88a81ff781
parent 12 afcd8e6d025b
permissions -rw-r--r--
201041
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
3
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
 * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     3
 * All rights reserved.
hgs
parents:
diff changeset
     4
 *
hgs
parents:
diff changeset
     5
 * This program is free software: you can redistribute it and/or modify
hgs
parents:
diff changeset
     6
 * it under the terms of the GNU Lesser General Public License as published by
hgs
parents:
diff changeset
     7
 * the Free Software Foundation, version 2.1 of the License.
hgs
parents:
diff changeset
     8
 *
hgs
parents:
diff changeset
     9
 * This program is distributed in the hope that it will be useful,
hgs
parents:
diff changeset
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
hgs
parents:
diff changeset
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
hgs
parents:
diff changeset
    12
 * GNU Lesser General Public License for more details.
hgs
parents:
diff changeset
    13
 *
hgs
parents:
diff changeset
    14
 * You should have received a copy of the GNU Lesser General Public License
hgs
parents:
diff changeset
    15
 * along with this program.  If not,
hgs
parents:
diff changeset
    16
 * see "http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html/".
hgs
parents:
diff changeset
    17
 *
hgs
parents:
diff changeset
    18
 * Description:
hgs
parents:
diff changeset
    19
 *
hgs
parents:
diff changeset
    20
 */
9
hgs
parents: 7
diff changeset
    21
#include <QIcon>
hgs
parents: 7
diff changeset
    22
hgs
parents: 7
diff changeset
    23
#ifdef ORBIT_UI
hgs
parents: 7
diff changeset
    24
#include <hbaction.h>
hgs
parents: 7
diff changeset
    25
#include <hbicon.h>
hgs
parents: 7
diff changeset
    26
#include <hbinputmethod.h>
hgs
parents: 7
diff changeset
    27
#include <hbinputeditorinterface.h>
hgs
parents: 7
diff changeset
    28
#include <hbinputsettingproxy.h>
hgs
parents: 7
diff changeset
    29
#endif
3
hgs
parents:
diff changeset
    30
hgs
parents:
diff changeset
    31
#include "EditorWidget.h"
hgs
parents:
diff changeset
    32
#include "Utilities.h"
hgs
parents:
diff changeset
    33
#include "ChromeEffect.h"
16
hgs
parents: 12
diff changeset
    34
#include "qstmgestureevent.h"
hgs
parents: 12
diff changeset
    35
hgs
parents: 12
diff changeset
    36
3
hgs
parents:
diff changeset
    37
hgs
parents:
diff changeset
    38
// FIXME ;;; Must address the following issues:
hgs
parents:
diff changeset
    39
//
9
hgs
parents: 7
diff changeset
    40
// * Clean ORBIT_UI flag by creating new class for orbit ui
hgs
parents: 7
diff changeset
    41
// * Replace QGraphicsTextItem with HbTextItem for orbit ui
3
hgs
parents:
diff changeset
    42
//
hgs
parents:
diff changeset
    43
hgs
parents:
diff changeset
    44
namespace GVA {
hgs
parents:
diff changeset
    45
hgs
parents:
diff changeset
    46
  // Methods for class EditorItem
hgs
parents:
diff changeset
    47
hgs
parents:
diff changeset
    48
  //GTextLineItem extends QGraphicsTextItem as a single-line editor.
hgs
parents:
diff changeset
    49
  //Signals horizontal cursor movement, which can be used to implement horizontal scrolling.
hgs
parents:
diff changeset
    50
hgs
parents:
diff changeset
    51
  GTextLineItem::GTextLineItem(QGraphicsItem * parent)
hgs
parents:
diff changeset
    52
  : QGraphicsTextItem(parent)
hgs
parents:
diff changeset
    53
  , m_maxTextLength(0)
hgs
parents:
diff changeset
    54
  , m_hints(Qt::ImhNoPredictiveText) // disable the predictive text
9
hgs
parents: 7
diff changeset
    55
  , m_setSpecificBtn(false)
16
hgs
parents: 12
diff changeset
    56
  , m_isContextMenuOn(false)
3
hgs
parents:
diff changeset
    57
  {
hgs
parents:
diff changeset
    58
    // Disable wrapping, force text to be stored and displayed
hgs
parents:
diff changeset
    59
    // as a single line.
hgs
parents:
diff changeset
    60
    QTextOption textOption = document()->defaultTextOption();
hgs
parents:
diff changeset
    61
    textOption.setWrapMode(QTextOption::NoWrap);
hgs
parents:
diff changeset
    62
    document()->setDefaultTextOption(textOption);
16
hgs
parents: 12
diff changeset
    63
    // Set default font size
hgs
parents: 12
diff changeset
    64
    QFont textFont = font();
hgs
parents: 12
diff changeset
    65
    textFont.setPointSize(11);
hgs
parents: 12
diff changeset
    66
    setFont(textFont);
3
hgs
parents:
diff changeset
    67
    // Enable cursor keys.
hgs
parents:
diff changeset
    68
    setTextInteractionFlags(Qt::TextEditorInteraction);
hgs
parents:
diff changeset
    69
    // This is needed to initialize m_textLine.
hgs
parents:
diff changeset
    70
    setText("");
hgs
parents:
diff changeset
    71
    setAcceptDrops(false);
hgs
parents:
diff changeset
    72
    m_defaultStartDragDistance = QApplication::startDragDistance();
16
hgs
parents: 12
diff changeset
    73
hgs
parents: 12
diff changeset
    74
    grabGesture(QStm_Gesture::assignedType());
hgs
parents: 12
diff changeset
    75
    installEventFilter(this);
hgs
parents: 12
diff changeset
    76
hgs
parents: 12
diff changeset
    77
}
3
hgs
parents:
diff changeset
    78
hgs
parents:
diff changeset
    79
  GTextLineItem::~GTextLineItem()
hgs
parents:
diff changeset
    80
  {
hgs
parents:
diff changeset
    81
    if (m_maxTextLength > 0)
hgs
parents:
diff changeset
    82
      disconnect(document(), SIGNAL(contentsChange(int, int, int)), this, SLOT(contentsChange(int, int, int)));
hgs
parents:
diff changeset
    83
    QApplication::setStartDragDistance(m_defaultStartDragDistance);
hgs
parents:
diff changeset
    84
  }
hgs
parents:
diff changeset
    85
hgs
parents:
diff changeset
    86
  void GTextLineItem::setText(const QString & text)
hgs
parents:
diff changeset
    87
  {
hgs
parents:
diff changeset
    88
    QString newText = text;
hgs
parents:
diff changeset
    89
    if(m_maxTextLength > 0 && text.length() > m_maxTextLength ) {
hgs
parents:
diff changeset
    90
        newText = newText.left(m_maxTextLength);
hgs
parents:
diff changeset
    91
    }
hgs
parents:
diff changeset
    92
    setPlainText(newText);
hgs
parents:
diff changeset
    93
    m_textLine = document()->begin().layout()->lineForTextPosition(0);
hgs
parents:
diff changeset
    94
  }
hgs
parents:
diff changeset
    95
hgs
parents:
diff changeset
    96
  void GTextLineItem::setMaxTextLength(int length)
hgs
parents:
diff changeset
    97
  {
hgs
parents:
diff changeset
    98
    if (m_maxTextLength <= 0 && length > 0) {
hgs
parents:
diff changeset
    99
        QString text = toPlainText();
hgs
parents:
diff changeset
   100
        if( text.length() > length ) {
hgs
parents:
diff changeset
   101
          setPlainText(text.left(length));
hgs
parents:
diff changeset
   102
        }
hgs
parents:
diff changeset
   103
        connect(document(), SIGNAL(contentsChange(int, int, int)), this, SLOT(contentsChange(int, int, int)));
hgs
parents:
diff changeset
   104
    } else if (m_maxTextLength > 0 && length <= 0) {
hgs
parents:
diff changeset
   105
        disconnect(document(), SIGNAL(contentsChange(int, int, int)), this, SLOT(contentsChange(int, int, int)));
hgs
parents:
diff changeset
   106
    }
hgs
parents:
diff changeset
   107
    m_maxTextLength = length;
hgs
parents:
diff changeset
   108
  }
9
hgs
parents: 7
diff changeset
   109
  
hgs
parents: 7
diff changeset
   110
  void GTextLineItem::setSpecificButton(QString& commitString, QString& buttonIconPath) {
hgs
parents: 7
diff changeset
   111
    m_spBtnCommitString = commitString;
hgs
parents: 7
diff changeset
   112
    m_spBtnIconPath = buttonIconPath;
hgs
parents: 7
diff changeset
   113
    m_setSpecificBtn = true;
hgs
parents: 7
diff changeset
   114
  }
3
hgs
parents:
diff changeset
   115
hgs
parents:
diff changeset
   116
  void GTextLineItem::contentsChange(int position, int charsRemoved, int charsAdded)
hgs
parents:
diff changeset
   117
  {
hgs
parents:
diff changeset
   118
    Q_UNUSED(position);
hgs
parents:
diff changeset
   119
    Q_UNUSED(charsRemoved);
hgs
parents:
diff changeset
   120
    Q_UNUSED(charsAdded);
hgs
parents:
diff changeset
   121
    if( m_maxTextLength > 0 && toPlainText().length() > m_maxTextLength ) {
hgs
parents:
diff changeset
   122
      QTextCursor cursor = textCursor();
hgs
parents:
diff changeset
   123
      cursor.deletePreviousChar();
hgs
parents:
diff changeset
   124
      setTextCursor(cursor);
hgs
parents:
diff changeset
   125
    }
hgs
parents:
diff changeset
   126
  }
hgs
parents:
diff changeset
   127
9
hgs
parents: 7
diff changeset
   128
  void GTextLineItem::specificBtnTriggered(bool checked)
hgs
parents: 7
diff changeset
   129
  {
16
hgs
parents: 12
diff changeset
   130
    Q_UNUSED(checked);
9
hgs
parents: 7
diff changeset
   131
#ifdef ORBIT_UI
hgs
parents: 7
diff changeset
   132
    QInputContext *ic = qApp->inputContext();
hgs
parents: 7
diff changeset
   133
    QInputMethodEvent *imEvent = new QInputMethodEvent();
hgs
parents: 7
diff changeset
   134
    imEvent->setCommitString(QString(m_spBtnCommitString));
hgs
parents: 7
diff changeset
   135
    if (ic)
hgs
parents: 7
diff changeset
   136
      ic->sendEvent(*imEvent);
hgs
parents: 7
diff changeset
   137
    delete imEvent;
hgs
parents: 7
diff changeset
   138
#endif
hgs
parents: 7
diff changeset
   139
  }
hgs
parents: 7
diff changeset
   140
3
hgs
parents:
diff changeset
   141
  // Get the pixel offset of the cursor. Needed to implement scrolling.
hgs
parents:
diff changeset
   142
hgs
parents:
diff changeset
   143
  qreal GTextLineItem::cursorX()
hgs
parents:
diff changeset
   144
  {
hgs
parents:
diff changeset
   145
    return m_textLine.cursorToX(textCursor().position());
hgs
parents:
diff changeset
   146
  }
hgs
parents:
diff changeset
   147
hgs
parents:
diff changeset
   148
  qreal GTextLineItem::anchorX()
hgs
parents:
diff changeset
   149
  {
hgs
parents:
diff changeset
   150
    return m_textLine.cursorToX(textCursor().anchor());
hgs
parents:
diff changeset
   151
  }
hgs
parents:
diff changeset
   152
hgs
parents:
diff changeset
   153
  QRectF GTextLineItem::selectionRectF()
hgs
parents:
diff changeset
   154
  {
hgs
parents:
diff changeset
   155
    qreal x1 = cursorX();
hgs
parents:
diff changeset
   156
    qreal x2 = anchorX();
hgs
parents:
diff changeset
   157
    if (x1 == x2)
hgs
parents:
diff changeset
   158
      return QRectF();
hgs
parents:
diff changeset
   159
    return QRectF(x1, 0, x2-x1 + 16, boundingRect().height());
hgs
parents:
diff changeset
   160
  }
hgs
parents:
diff changeset
   161
hgs
parents:
diff changeset
   162
  void GTextLineItem::selectAll()
hgs
parents:
diff changeset
   163
  {
hgs
parents:
diff changeset
   164
    QTextCursor tc = textCursor();
hgs
parents:
diff changeset
   165
    tc.select(QTextCursor::Document);
hgs
parents:
diff changeset
   166
    setTextCursor(tc);
hgs
parents:
diff changeset
   167
    emit cursorXChanged(cursorX());
hgs
parents:
diff changeset
   168
  }
hgs
parents:
diff changeset
   169
hgs
parents:
diff changeset
   170
  void GTextLineItem::unselect()
hgs
parents:
diff changeset
   171
  {
16
hgs
parents: 12
diff changeset
   172
    if (contextMenuOn())
hgs
parents: 12
diff changeset
   173
      return;
3
hgs
parents:
diff changeset
   174
    QTextCursor tc = textCursor();
hgs
parents:
diff changeset
   175
    tc.setPosition(tc.position());
hgs
parents:
diff changeset
   176
    setTextCursor(tc);
hgs
parents:
diff changeset
   177
  }
hgs
parents:
diff changeset
   178
hgs
parents:
diff changeset
   179
  void GTextLineItem::setCursorPosition(int pos)
hgs
parents:
diff changeset
   180
  {
hgs
parents:
diff changeset
   181
    QTextCursor tc = textCursor();
hgs
parents:
diff changeset
   182
    tc.setPosition(pos);
hgs
parents:
diff changeset
   183
    setTextCursor(tc);
hgs
parents:
diff changeset
   184
  }
hgs
parents:
diff changeset
   185
hgs
parents:
diff changeset
   186
  qreal GTextLineItem::textWidth()
hgs
parents:
diff changeset
   187
  {
hgs
parents:
diff changeset
   188
    return m_textLine.naturalTextWidth();
hgs
parents:
diff changeset
   189
  }
hgs
parents:
diff changeset
   190
hgs
parents:
diff changeset
   191
  void GTextLineItem::paint(QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget)
hgs
parents:
diff changeset
   192
  {
hgs
parents:
diff changeset
   193
    // Paint without ugly selection ants (the dashed line that surrounds
hgs
parents:
diff changeset
   194
    // the selected text). TODO: It is clearly a bug in QGraphicsTextItem
hgs
parents:
diff changeset
   195
    // that you cannot explicitly set the style of the selection indicator.  File this.
hgs
parents:
diff changeset
   196
    QStyleOptionGraphicsItem newOption = *option;
hgs
parents:
diff changeset
   197
    newOption.state &= (!QStyle::State_Selected | !QStyle::State_HasFocus);
hgs
parents:
diff changeset
   198
    painter->save();
hgs
parents:
diff changeset
   199
    painter->setRenderHint(QPainter::Antialiasing);
hgs
parents:
diff changeset
   200
    QGraphicsTextItem::paint(painter, &newOption, widget);
hgs
parents:
diff changeset
   201
    painter->restore();
hgs
parents:
diff changeset
   202
    if(!isEnabled()) {
hgs
parents:
diff changeset
   203
        ChromeEffect::paintDisabledRect(painter, option->exposedRect);
hgs
parents:
diff changeset
   204
    }
hgs
parents:
diff changeset
   205
  }
hgs
parents:
diff changeset
   206
hgs
parents:
diff changeset
   207
  void GTextLineItem::mouseMoveEvent(QGraphicsSceneMouseEvent * event)
hgs
parents:
diff changeset
   208
  {
16
hgs
parents: 12
diff changeset
   209
    event->setPos(QPointF(event->pos().x(), boundingRect().center().y())); // make selecting easily by using a fixed y position
3
hgs
parents:
diff changeset
   210
    QGraphicsTextItem::mouseMoveEvent(event);
hgs
parents:
diff changeset
   211
    emit cursorXChanged(cursorX());
hgs
parents:
diff changeset
   212
  }
hgs
parents:
diff changeset
   213
hgs
parents:
diff changeset
   214
  void GTextLineItem::mousePressEvent(QGraphicsSceneMouseEvent * event)
hgs
parents:
diff changeset
   215
  {
16
hgs
parents: 12
diff changeset
   216
    event->setPos(QPointF(event->pos().x(), boundingRect().center().y())); // make selecting easily by using a fixed y position
3
hgs
parents:
diff changeset
   217
    QGraphicsTextItem::mousePressEvent(event);
hgs
parents:
diff changeset
   218
  }
hgs
parents:
diff changeset
   219
hgs
parents:
diff changeset
   220
  void GTextLineItem::mouseReleaseEvent(QGraphicsSceneMouseEvent * event)
hgs
parents:
diff changeset
   221
  {
16
hgs
parents: 12
diff changeset
   222
    if (contextMenuOn())
hgs
parents: 12
diff changeset
   223
      return;
hgs
parents: 12
diff changeset
   224
    event->setPos(QPointF(event->pos().x(), boundingRect().center().y())); // make selecting easily by using a fixed y position
3
hgs
parents:
diff changeset
   225
    QGraphicsTextItem::mouseReleaseEvent(event);
hgs
parents:
diff changeset
   226
    QPointF pos = event->pos();
hgs
parents:
diff changeset
   227
    emit tapped(pos);
12
hgs
parents: 9
diff changeset
   228
    launchVKB();
3
hgs
parents:
diff changeset
   229
  }
hgs
parents:
diff changeset
   230
hgs
parents:
diff changeset
   231
  void GTextLineItem::keyPressEvent(QKeyEvent * event)
hgs
parents:
diff changeset
   232
  {
hgs
parents:
diff changeset
   233
    // Signal horizontal cursor movement so that an editor widget can
hgs
parents:
diff changeset
   234
    // implement horizontal scrolling.
hgs
parents:
diff changeset
   235
    qreal oldX = cursorX();
hgs
parents:
diff changeset
   236
    QGraphicsTextItem::keyPressEvent(event);
hgs
parents:
diff changeset
   237
    qreal newX = cursorX();
hgs
parents:
diff changeset
   238
    if (newX != oldX) {
hgs
parents:
diff changeset
   239
      emit cursorXChanged(newX);
hgs
parents:
diff changeset
   240
    }
hgs
parents:
diff changeset
   241
  }
hgs
parents:
diff changeset
   242
hgs
parents:
diff changeset
   243
  void GTextLineItem::keyReleaseEvent(QKeyEvent * event)
hgs
parents:
diff changeset
   244
  {
hgs
parents:
diff changeset
   245
    QGraphicsTextItem::keyReleaseEvent(event);
hgs
parents:
diff changeset
   246
    emit textMayChanged();
hgs
parents:
diff changeset
   247
  }
hgs
parents:
diff changeset
   248
hgs
parents:
diff changeset
   249
  void GTextLineItem::focusInEvent(QFocusEvent * event)
hgs
parents:
diff changeset
   250
  {
hgs
parents:
diff changeset
   251
    Q_UNUSED(event);
hgs
parents:
diff changeset
   252
    // disable the drag & drop to fix the auto-delete-all issue
hgs
parents:
diff changeset
   253
    QApplication::setStartDragDistance(1000);
hgs
parents:
diff changeset
   254
    QGraphicsTextItem::focusInEvent(event);
hgs
parents:
diff changeset
   255
9
hgs
parents: 7
diff changeset
   256
#ifndef ORBIT_UI
3
hgs
parents:
diff changeset
   257
    QWidget* fw = QApplication::focusWidget();
16
hgs
parents: 12
diff changeset
   258
    if (fw != NULL) {
hgs
parents: 12
diff changeset
   259
      Qt::InputMethodHints hints = fw->inputMethodHints();
hgs
parents: 12
diff changeset
   260
      if (hints != m_hints)
hgs
parents: 12
diff changeset
   261
        fw->setInputMethodHints(m_hints);
hgs
parents: 12
diff changeset
   262
    }
9
hgs
parents: 7
diff changeset
   263
#endif
3
hgs
parents:
diff changeset
   264
hgs
parents:
diff changeset
   265
    if (event->reason() != Qt::PopupFocusReason) // to fix the special char issue on VKB
hgs
parents:
diff changeset
   266
      emit focusChanged(true);
hgs
parents:
diff changeset
   267
  }
hgs
parents:
diff changeset
   268
hgs
parents:
diff changeset
   269
  void GTextLineItem::focusOutEvent(QFocusEvent * event)
hgs
parents:
diff changeset
   270
  {
hgs
parents:
diff changeset
   271
    Q_UNUSED(event);
hgs
parents:
diff changeset
   272
    // restore the drag & drop for other components
hgs
parents:
diff changeset
   273
    QApplication::setStartDragDistance(m_defaultStartDragDistance);
hgs
parents:
diff changeset
   274
    QGraphicsTextItem::focusOutEvent(event);
16
hgs
parents: 12
diff changeset
   275
    if (event->reason() != Qt::PopupFocusReason && event->reason() != Qt::ActiveWindowFocusReason && !contextMenuOn()) // to fix the special char issue on VKB
3
hgs
parents:
diff changeset
   276
      emit focusChanged(false);
hgs
parents:
diff changeset
   277
  }
hgs
parents:
diff changeset
   278
hgs
parents:
diff changeset
   279
  void GTextLineItem::contextMenuEvent(QGraphicsSceneContextMenuEvent *event)
hgs
parents:
diff changeset
   280
  {
hgs
parents:
diff changeset
   281
    // ignore context menu event
hgs
parents:
diff changeset
   282
    event->ignore();
hgs
parents:
diff changeset
   283
  }
hgs
parents:
diff changeset
   284
hgs
parents:
diff changeset
   285
  void GTextLineItem::setInputMethodHints(Qt::InputMethodHints hints)
hgs
parents:
diff changeset
   286
  { 
hgs
parents:
diff changeset
   287
    m_hints = hints;
hgs
parents:
diff changeset
   288
    m_hints |= Qt::ImhNoPredictiveText;  // disable the predictive text
hgs
parents:
diff changeset
   289
  }
16
hgs
parents: 12
diff changeset
   290
  
hgs
parents: 12
diff changeset
   291
  bool GTextLineItem::eventFilter(QObject* o, QEvent* e)
hgs
parents: 12
diff changeset
   292
  { 
hgs
parents: 12
diff changeset
   293
    if (e->type() == QEvent::GraphicsSceneMouseMove)
hgs
parents: 12
diff changeset
   294
        return false;
hgs
parents: 12
diff changeset
   295
  	return QStm_GestureEventFilter::instance()->eventFilter(o, e);
hgs
parents: 12
diff changeset
   296
  } 
hgs
parents: 12
diff changeset
   297
hgs
parents: 12
diff changeset
   298
  bool GTextLineItem::event(QEvent* event)
hgs
parents: 12
diff changeset
   299
  {
hgs
parents: 12
diff changeset
   300
    bool ret = false;
hgs
parents: 12
diff changeset
   301
    if (event->type() == QEvent::Gesture) {
hgs
parents: 12
diff changeset
   302
        QStm_Gesture* gesture = getQStmGesture(event);
hgs
parents: 12
diff changeset
   303
        if (gesture) {              
hgs
parents: 12
diff changeset
   304
            return  handleQStmGesture(gesture);
hgs
parents: 12
diff changeset
   305
        }
hgs
parents: 12
diff changeset
   306
    }
hgs
parents: 12
diff changeset
   307
    ret = QGraphicsTextItem::event(event);
hgs
parents: 12
diff changeset
   308
    return ret;
hgs
parents: 12
diff changeset
   309
  }
hgs
parents: 12
diff changeset
   310
hgs
parents: 12
diff changeset
   311
  bool GTextLineItem::handleQStmGesture(QStm_Gesture* gesture)
hgs
parents: 12
diff changeset
   312
  {
hgs
parents: 12
diff changeset
   313
    QStm_GestureType type = gesture->getGestureStmType();
hgs
parents: 12
diff changeset
   314
    
hgs
parents: 12
diff changeset
   315
    if (type == QStmLongPressGestureType) {
hgs
parents: 12
diff changeset
   316
        emit contextEvent(hasSelection());
hgs
parents: 12
diff changeset
   317
    }
hgs
parents: 12
diff changeset
   318
    else {
hgs
parents: 12
diff changeset
   319
        QEvent::Type mouseEventType = gesture->gestureType2GraphicsSceneMouseType();
hgs
parents: 12
diff changeset
   320
        
hgs
parents: 12
diff changeset
   321
        if (mouseEventType == QEvent::GraphicsSceneMousePress || 
hgs
parents: 12
diff changeset
   322
            mouseEventType == QEvent::GraphicsSceneMouseRelease) {
hgs
parents: 12
diff changeset
   323
            QGraphicsSceneMouseEvent gsme(mouseEventType);
hgs
parents: 12
diff changeset
   324
            QPointF pos = gesture->scenePosition(this);
hgs
parents: 12
diff changeset
   325
            qstmSetGraphicsSceneMouseEvent(pos, this, gsme);
hgs
parents: 12
diff changeset
   326
            switch (mouseEventType) {
hgs
parents: 12
diff changeset
   327
                case QEvent::GraphicsSceneMousePress:
hgs
parents: 12
diff changeset
   328
                    mousePressEvent(&gsme);
hgs
parents: 12
diff changeset
   329
                    break;
hgs
parents: 12
diff changeset
   330
                case QEvent::GraphicsSceneMouseRelease:
hgs
parents: 12
diff changeset
   331
                    mouseReleaseEvent(&gsme);
hgs
parents: 12
diff changeset
   332
                    break;
hgs
parents: 12
diff changeset
   333
                case QEvent::GraphicsSceneMouseMove:
hgs
parents: 12
diff changeset
   334
                    mouseMoveEvent(&gsme);
hgs
parents: 12
diff changeset
   335
                    break;            
hgs
parents: 12
diff changeset
   336
            }
hgs
parents: 12
diff changeset
   337
        }
hgs
parents: 12
diff changeset
   338
    }
hgs
parents: 12
diff changeset
   339
hgs
parents: 12
diff changeset
   340
	return true;
hgs
parents: 12
diff changeset
   341
}
hgs
parents: 12
diff changeset
   342
3
hgs
parents:
diff changeset
   343
12
hgs
parents: 9
diff changeset
   344
  void  GTextLineItem::launchVKB() {
hgs
parents: 9
diff changeset
   345
hgs
parents: 9
diff changeset
   346
hgs
parents: 9
diff changeset
   347
    // add specific button
hgs
parents: 9
diff changeset
   348
#ifdef ORBIT_UI
hgs
parents: 9
diff changeset
   349
    if (m_setSpecificBtn) { 
hgs
parents: 9
diff changeset
   350
      HbEditorInterface editorInterface(this);
hgs
parents: 9
diff changeset
   351
      QList<HbAction*> actionsList = editorInterface.actions();
hgs
parents: 9
diff changeset
   352
      for (int i = 0; i < actionsList.size(); ++i) {
hgs
parents: 9
diff changeset
   353
        editorInterface.removeAction(actionsList.at(i));
hgs
parents: 9
diff changeset
   354
      }
hgs
parents: 9
diff changeset
   355
      QIcon icon(m_spBtnIconPath);
hgs
parents: 9
diff changeset
   356
      HbAction* action = new HbAction(HbIcon(icon), QString(""), this);
hgs
parents: 9
diff changeset
   357
      connect(action, SIGNAL(triggered(bool)), this, SLOT(specificBtnTriggered(bool)));
hgs
parents: 9
diff changeset
   358
hgs
parents: 9
diff changeset
   359
      editorInterface.addAction(action);
hgs
parents: 9
diff changeset
   360
      m_setSpecificBtn = false;
hgs
parents: 9
diff changeset
   361
    }
hgs
parents: 9
diff changeset
   362
#endif
hgs
parents: 9
diff changeset
   363
    sendInputPanelEvent(QEvent::RequestSoftwareInputPanel);
hgs
parents: 9
diff changeset
   364
hgs
parents: 9
diff changeset
   365
hgs
parents: 9
diff changeset
   366
    // disable prediction
hgs
parents: 9
diff changeset
   367
#ifdef ORBIT_UI
hgs
parents: 9
diff changeset
   368
    HbInputSettingProxy* hbISProxy = HbInputSettingProxy::instance();
hgs
parents: 9
diff changeset
   369
    if (hbISProxy->predictiveInputStatusForActiveKeyboard())
hgs
parents: 9
diff changeset
   370
      hbISProxy->togglePrediction();
hgs
parents: 9
diff changeset
   371
#endif
hgs
parents: 9
diff changeset
   372
  }
hgs
parents: 9
diff changeset
   373
hgs
parents: 9
diff changeset
   374
  void  GTextLineItem::sendInputPanelEvent(QEvent::Type type) {
hgs
parents: 9
diff changeset
   375
    QInputContext *ic = qApp->inputContext(); 
hgs
parents: 9
diff changeset
   376
    if (ic) { QEvent *event = new QEvent(type);
hgs
parents: 9
diff changeset
   377
      ic->filterEvent(event);
hgs
parents: 9
diff changeset
   378
       delete event;
hgs
parents: 9
diff changeset
   379
    }
hgs
parents: 9
diff changeset
   380
  }
hgs
parents: 9
diff changeset
   381
16
hgs
parents: 12
diff changeset
   382
  void GTextLineItem::cut() {
hgs
parents: 12
diff changeset
   383
    QTextCursor tc = textCursor();
hgs
parents: 12
diff changeset
   384
    QApplication::clipboard()->setText(tc.selectedText());
hgs
parents: 12
diff changeset
   385
    tc.insertText("");
hgs
parents: 12
diff changeset
   386
    setTextCursor(tc);
hgs
parents: 12
diff changeset
   387
  }
hgs
parents: 12
diff changeset
   388
  
hgs
parents: 12
diff changeset
   389
  void GTextLineItem::copy() {
hgs
parents: 12
diff changeset
   390
    QTextCursor tc = textCursor();
hgs
parents: 12
diff changeset
   391
    QApplication::clipboard()->setText(tc.selectedText());
hgs
parents: 12
diff changeset
   392
  }
hgs
parents: 12
diff changeset
   393
  
hgs
parents: 12
diff changeset
   394
  void GTextLineItem::paste() {
hgs
parents: 12
diff changeset
   395
    QTextCursor tc = textCursor();
hgs
parents: 12
diff changeset
   396
    tc.insertText(QApplication::clipboard()->text(QClipboard::Clipboard));
hgs
parents: 12
diff changeset
   397
    setTextCursor(tc);
hgs
parents: 12
diff changeset
   398
  }
hgs
parents: 12
diff changeset
   399
3
hgs
parents:
diff changeset
   400
  // Methods for class GLineEditor
hgs
parents:
diff changeset
   401
  // GLineEditor is a QGraphicsWidget that wraps a GTextLineItem to implement scrolling, 
hgs
parents:
diff changeset
   402
  // draw a background and set padding 
hgs
parents:
diff changeset
   403
hgs
parents:
diff changeset
   404
  GLineEditor::GLineEditor(ChromeSnippet * snippet, ChromeWidget * chrome, QGraphicsItem * parent)
hgs
parents:
diff changeset
   405
  : QGraphicsWidget(parent)
hgs
parents:
diff changeset
   406
  , m_chrome(chrome)
hgs
parents:
diff changeset
   407
  , m_viewPortWidth(0.0)
12
hgs
parents: 9
diff changeset
   408
#ifdef BROWSER_LAYOUT_TENONE
hgs
parents: 9
diff changeset
   409
  , m_titleModeWidth(0.0)
hgs
parents: 9
diff changeset
   410
#endif
3
hgs
parents:
diff changeset
   411
  , m_padding(0.0)
hgs
parents:
diff changeset
   412
  , m_rightTextMargin(0.0)
hgs
parents:
diff changeset
   413
  {
hgs
parents:
diff changeset
   414
    Q_UNUSED(snippet);
hgs
parents:
diff changeset
   415
hgs
parents:
diff changeset
   416
    // The viewport clips the editor when text overflows
hgs
parents:
diff changeset
   417
    // viewport size will be set in resize()
hgs
parents:
diff changeset
   418
    m_viewPort = new QGraphicsWidget(this);
16
hgs
parents: 12
diff changeset
   419
    m_viewPort->setObjectName("ViewPort");
3
hgs
parents:
diff changeset
   420
    m_viewPort->setFlags(QGraphicsItem::ItemClipsChildrenToShape);
hgs
parents:
diff changeset
   421
hgs
parents:
diff changeset
   422
    // The actual text editor item
12
hgs
parents: 9
diff changeset
   423
    //m_textColor = QColor(Qt::black);
3
hgs
parents:
diff changeset
   424
    m_editor = new GTextLineItem(m_viewPort);
16
hgs
parents: 12
diff changeset
   425
    m_editor->setObjectName("LineItem");
12
hgs
parents: 9
diff changeset
   426
#ifndef BROWSER_LAYOUT_TENONE
3
hgs
parents:
diff changeset
   427
    m_editor->setDefaultTextColor(m_textColor);
12
hgs
parents: 9
diff changeset
   428
#endif
3
hgs
parents:
diff changeset
   429
    m_editor->installEventFilter(this);
hgs
parents:
diff changeset
   430
12
hgs
parents: 9
diff changeset
   431
#ifdef BROWSER_LAYOUT_TENONE
hgs
parents: 9
diff changeset
   432
    m_titleColor = QColor(Qt::white);
hgs
parents: 9
diff changeset
   433
    m_title = new GTitleItem(m_viewPort);
16
hgs
parents: 12
diff changeset
   434
    m_title->setObjectName("TitleItem");
12
hgs
parents: 9
diff changeset
   435
    m_title->setDefaultTextColor(m_titleColor);
hgs
parents: 9
diff changeset
   436
    m_title->hide();
hgs
parents: 9
diff changeset
   437
    safe_connect(m_title, SIGNAL(tapped(QPointF& )),
hgs
parents: 9
diff changeset
   438
                 this, SIGNAL(titleMouseEvent(QPointF&)));
hgs
parents: 9
diff changeset
   439
#endif
hgs
parents: 9
diff changeset
   440
3
hgs
parents:
diff changeset
   441
    // Monitor editor cursor position changes for horizontal scrolling.
hgs
parents:
diff changeset
   442
    safe_connect(m_editor, SIGNAL(cursorXChanged(qreal)),
hgs
parents:
diff changeset
   443
                 this, SLOT(makeVisible(qreal)));
hgs
parents:
diff changeset
   444
hgs
parents:
diff changeset
   445
    safe_connect(m_editor, SIGNAL(textMayChanged()),
hgs
parents:
diff changeset
   446
                 this, SIGNAL(textMayChanged()));
hgs
parents:
diff changeset
   447
12
hgs
parents: 9
diff changeset
   448
    safe_connect(m_editor->document(), SIGNAL(contentsChange(int, int, int)),
hgs
parents: 9
diff changeset
   449
                 this, SIGNAL(contentsChange(int, int, int)));
hgs
parents: 9
diff changeset
   450
3
hgs
parents:
diff changeset
   451
    safe_connect(m_editor, SIGNAL(focusChanged(bool)),
hgs
parents:
diff changeset
   452
                 this, SIGNAL(focusChanged(bool)));
hgs
parents:
diff changeset
   453
    
hgs
parents:
diff changeset
   454
    safe_connect(m_editor, SIGNAL(tapped(QPointF&)),
hgs
parents:
diff changeset
   455
                 this, SIGNAL(tapped(QPointF&)));
hgs
parents:
diff changeset
   456
16
hgs
parents: 12
diff changeset
   457
    safe_connect(m_editor, SIGNAL(contextEvent(bool)),
hgs
parents: 12
diff changeset
   458
                 this, SIGNAL(contextEvent(bool)));
hgs
parents: 12
diff changeset
   459
3
hgs
parents:
diff changeset
   460
    setAcceptDrops(false);
hgs
parents:
diff changeset
   461
  }
hgs
parents:
diff changeset
   462
hgs
parents:
diff changeset
   463
  GLineEditor::~GLineEditor()
hgs
parents:
diff changeset
   464
  {
hgs
parents:
diff changeset
   465
  }
hgs
parents:
diff changeset
   466
hgs
parents:
diff changeset
   467
  // TODO: Be a good QGraphicsWidget: update this to use palette color?
hgs
parents:
diff changeset
   468
hgs
parents:
diff changeset
   469
  void GLineEditor::setTextColor(QColor & color)
hgs
parents:
diff changeset
   470
  {
hgs
parents:
diff changeset
   471
    m_textColor = color;
hgs
parents:
diff changeset
   472
    m_editor->setDefaultTextColor(m_textColor);
hgs
parents:
diff changeset
   473
  }
hgs
parents:
diff changeset
   474
12
hgs
parents: 9
diff changeset
   475
#ifdef BROWSER_LAYOUT_TENONE
16
hgs
parents: 12
diff changeset
   476
  void GLineEditor::setTitleColor(QColor & color) {
12
hgs
parents: 9
diff changeset
   477
    m_titleColor = color;
hgs
parents: 9
diff changeset
   478
    m_title->setDefaultTextColor(m_titleColor);
hgs
parents: 9
diff changeset
   479
  }
hgs
parents: 9
diff changeset
   480
  
16
hgs
parents: 12
diff changeset
   481
  void GLineEditor::setTitleFont(QFont & font) {
12
hgs
parents: 9
diff changeset
   482
    m_title->setFont(font);
hgs
parents: 9
diff changeset
   483
  }
16
hgs
parents: 12
diff changeset
   484
hgs
parents: 12
diff changeset
   485
  void GLineEditor::setTextFont(QFont & font) {
hgs
parents: 12
diff changeset
   486
    m_editor->setFont(font);
hgs
parents: 12
diff changeset
   487
  }
12
hgs
parents: 9
diff changeset
   488
#endif
hgs
parents: 9
diff changeset
   489
  
3
hgs
parents:
diff changeset
   490
  void GLineEditor::setPadding(qreal padding)
hgs
parents:
diff changeset
   491
  {
hgs
parents:
diff changeset
   492
    m_padding = padding;
hgs
parents:
diff changeset
   493
    //Trigger a resize to adjust component sizes to new padding
hgs
parents:
diff changeset
   494
    resize(size());
hgs
parents:
diff changeset
   495
  }
hgs
parents:
diff changeset
   496
hgs
parents:
diff changeset
   497
  void GLineEditor::setRightTextMargin(qreal margin)
hgs
parents:
diff changeset
   498
  {
hgs
parents:
diff changeset
   499
    m_rightTextMargin = margin;
hgs
parents:
diff changeset
   500
    resize(size());
hgs
parents:
diff changeset
   501
  }
hgs
parents:
diff changeset
   502
hgs
parents:
diff changeset
   503
  QString GLineEditor::text() const
hgs
parents:
diff changeset
   504
  {
hgs
parents:
diff changeset
   505
    return m_editor->toPlainText();
hgs
parents:
diff changeset
   506
  }
hgs
parents:
diff changeset
   507
hgs
parents:
diff changeset
   508
  void GLineEditor::paint(QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget)
hgs
parents:
diff changeset
   509
  {
hgs
parents:
diff changeset
   510
    Q_UNUSED(option);
hgs
parents:
diff changeset
   511
    Q_UNUSED(widget);
hgs
parents:
diff changeset
   512
hgs
parents:
diff changeset
   513
    painter->save();
hgs
parents:
diff changeset
   514
    painter->setRenderHint(QPainter::Antialiasing);
hgs
parents:
diff changeset
   515
    // First, fill rectangle with background color.
hgs
parents:
diff changeset
   516
    painter->fillRect(boundingRect(), m_backgroundColor);
hgs
parents:
diff changeset
   517
    painter->restore();
16
hgs
parents: 12
diff changeset
   518
#ifdef BROWSER_LAYOUT_TENONE
hgs
parents: 12
diff changeset
   519
    if(!isEnabled() && !m_title->isVisible()) {
hgs
parents: 12
diff changeset
   520
#else
3
hgs
parents:
diff changeset
   521
    if(!isEnabled()) {
16
hgs
parents: 12
diff changeset
   522
#endif
hgs
parents: 12
diff changeset
   523
3
hgs
parents:
diff changeset
   524
        ChromeEffect::paintDisabledRect(painter, option->exposedRect);
hgs
parents:
diff changeset
   525
    }
hgs
parents:
diff changeset
   526
    // Make sure any required horizontal scrolling happens
hgs
parents:
diff changeset
   527
    // before rendering editor widget, which will be drawn on top
hgs
parents:
diff changeset
   528
    // of the background rectangle.
hgs
parents:
diff changeset
   529
    makeVisible(m_editor->cursorX());
hgs
parents:
diff changeset
   530
  }
hgs
parents:
diff changeset
   531
hgs
parents:
diff changeset
   532
  void GLineEditor::resizeEvent(QGraphicsSceneResizeEvent * event)
hgs
parents:
diff changeset
   533
  {
hgs
parents:
diff changeset
   534
    QSizeF size = event->newSize();
16
hgs
parents: 12
diff changeset
   535
    qreal height = size.height();
12
hgs
parents: 9
diff changeset
   536
    qreal width;
hgs
parents: 9
diff changeset
   537
hgs
parents: 9
diff changeset
   538
    width = m_viewPortWidth  = size.width() - m_rightTextMargin  - m_padding * 2;
hgs
parents: 9
diff changeset
   539
hgs
parents: 9
diff changeset
   540
#ifdef BROWSER_LAYOUT_TENONE
hgs
parents: 9
diff changeset
   541
    m_titleModeWidth =  size.width() - m_padding * 2;
hgs
parents: 9
diff changeset
   542
    if (m_title->isVisible() ) {
hgs
parents: 9
diff changeset
   543
        width = m_titleModeWidth;
hgs
parents: 9
diff changeset
   544
    }
hgs
parents: 9
diff changeset
   545
    m_title->setTextWidth(m_titleModeWidth);
hgs
parents: 9
diff changeset
   546
hgs
parents: 9
diff changeset
   547
#endif
3
hgs
parents:
diff changeset
   548
    m_viewPort->setGeometry(
hgs
parents:
diff changeset
   549
                            m_padding,
16
hgs
parents: 12
diff changeset
   550
                            0,
12
hgs
parents: 9
diff changeset
   551
                            width,
hgs
parents: 9
diff changeset
   552
                            height);
hgs
parents: 9
diff changeset
   553
3
hgs
parents:
diff changeset
   554
    m_editor->setTextWidth(m_viewPortWidth);
hgs
parents:
diff changeset
   555
    // move back the m_editor'x to 0
hgs
parents:
diff changeset
   556
    qreal editorShift = -1 * m_editor->pos().x();
hgs
parents:
diff changeset
   557
    m_editor->moveBy(editorShift, 0);
hgs
parents:
diff changeset
   558
    updateEditor();
12
hgs
parents: 9
diff changeset
   559
hgs
parents: 9
diff changeset
   560
hgs
parents: 9
diff changeset
   561
  }
hgs
parents: 9
diff changeset
   562
hgs
parents: 9
diff changeset
   563
#ifdef BROWSER_LAYOUT_TENONE
hgs
parents: 9
diff changeset
   564
hgs
parents: 9
diff changeset
   565
  void GLineEditor::changeEditorMode(bool edit) {
hgs
parents: 9
diff changeset
   566
      QRectF rect = m_viewPort->geometry();
hgs
parents: 9
diff changeset
   567
      if (edit) {
hgs
parents: 9
diff changeset
   568
          m_backgroundColor = QColor(Qt::white);
hgs
parents: 9
diff changeset
   569
          
hgs
parents: 9
diff changeset
   570
          // Update the width of viewPort
hgs
parents: 9
diff changeset
   571
          if (m_title->isVisible() ) {
hgs
parents: 9
diff changeset
   572
              m_viewPort->setGeometry(rect.x(), rect.y(), (rect.width() - m_rightTextMargin ), rect.height());
hgs
parents: 9
diff changeset
   573
hgs
parents: 9
diff changeset
   574
              //move back the m_editor'x to 0
hgs
parents: 9
diff changeset
   575
              qreal editorShift = -1 * m_editor->pos().x();
hgs
parents: 9
diff changeset
   576
              m_editor->moveBy(editorShift, 0);
hgs
parents: 9
diff changeset
   577
              updateEditor();
hgs
parents: 9
diff changeset
   578
              m_title->hide();
hgs
parents: 9
diff changeset
   579
              m_editor->show();
hgs
parents: 9
diff changeset
   580
          }
hgs
parents: 9
diff changeset
   581
      }
hgs
parents: 9
diff changeset
   582
      else {
hgs
parents: 9
diff changeset
   583
          m_backgroundColor = QColor(Qt::transparent);
hgs
parents: 9
diff changeset
   584
hgs
parents: 9
diff changeset
   585
          // Update the width of viewPort
hgs
parents: 9
diff changeset
   586
          if (m_editor->isVisible() ) {
hgs
parents: 9
diff changeset
   587
hgs
parents: 9
diff changeset
   588
              m_viewPort->setGeometry(rect.x(), rect.y(), (rect.width() + m_rightTextMargin ), rect.height());
hgs
parents: 9
diff changeset
   589
              m_editor->hide();
hgs
parents: 9
diff changeset
   590
              m_title->show();
hgs
parents: 9
diff changeset
   591
          }
hgs
parents: 9
diff changeset
   592
 
hgs
parents: 9
diff changeset
   593
      }
hgs
parents: 9
diff changeset
   594
  }
hgs
parents: 9
diff changeset
   595
hgs
parents: 9
diff changeset
   596
  void GLineEditor::setTitle(const QString & text)
hgs
parents: 9
diff changeset
   597
  {
hgs
parents: 9
diff changeset
   598
      m_title->setText(text);
hgs
parents: 9
diff changeset
   599
  }
hgs
parents: 9
diff changeset
   600
#endif
hgs
parents: 9
diff changeset
   601
hgs
parents: 9
diff changeset
   602
  void GLineEditor::closeVKB()
hgs
parents: 9
diff changeset
   603
  {
hgs
parents: 9
diff changeset
   604
      m_editor->sendInputPanelEvent(QEvent::CloseSoftwareInputPanel);
hgs
parents: 9
diff changeset
   605
hgs
parents: 9
diff changeset
   606
  }
hgs
parents: 9
diff changeset
   607
hgs
parents: 9
diff changeset
   608
  void GLineEditor::openVKB()
hgs
parents: 9
diff changeset
   609
  {
hgs
parents: 9
diff changeset
   610
      m_editor->launchVKB();
hgs
parents: 9
diff changeset
   611
3
hgs
parents:
diff changeset
   612
  }
hgs
parents:
diff changeset
   613
hgs
parents:
diff changeset
   614
  void GLineEditor::setText(const QString & text)
hgs
parents:
diff changeset
   615
  {
hgs
parents:
diff changeset
   616
    m_editor->setText(text);
hgs
parents:
diff changeset
   617
    m_editor->setPos(0, m_editor->pos().y());
hgs
parents:
diff changeset
   618
    updateEditor();
hgs
parents:
diff changeset
   619
  }
hgs
parents:
diff changeset
   620
hgs
parents:
diff changeset
   621
  void GLineEditor::updateEditor()
hgs
parents:
diff changeset
   622
  {
hgs
parents:
diff changeset
   623
    makeVisible(m_editor->cursorX());
hgs
parents:
diff changeset
   624
  }
hgs
parents:
diff changeset
   625
hgs
parents:
diff changeset
   626
  // We divide the viewport into 3 distinct regions:
hgs
parents:
diff changeset
   627
  //
hgs
parents:
diff changeset
   628
  //
hgs
parents:
diff changeset
   629
  //        [ left | middle | right ]
hgs
parents:
diff changeset
   630
  //
hgs
parents:
diff changeset
   631
  // [ editor, shifted left by editorShift pixels ]
hgs
parents:
diff changeset
   632
  //
hgs
parents:
diff changeset
   633
  // When a cursor is in the middle section of the viewport we
hgs
parents:
diff changeset
   634
  // leave the editor shift unchanged, to preserve stability.
hgs
parents:
diff changeset
   635
  //
hgs
parents:
diff changeset
   636
  // When a cursor is in the right section or beyond we shift
hgs
parents:
diff changeset
   637
  // the editor left until the cursor appears at the border
hgs
parents:
diff changeset
   638
  // between the middle and right sections.
hgs
parents:
diff changeset
   639
  //
hgs
parents:
diff changeset
   640
  // When a cursor is in the left section or beyond we shift
hgs
parents:
diff changeset
   641
  // the editor right until the cursor appears at the border
hgs
parents:
diff changeset
   642
  // between the left and middle sections.
hgs
parents:
diff changeset
   643
  //
hgs
parents:
diff changeset
   644
  // We never shift the editor right of the viewport.
hgs
parents:
diff changeset
   645
hgs
parents:
diff changeset
   646
  void GLineEditor::makeVisible(qreal cursorX)
hgs
parents:
diff changeset
   647
  {
hgs
parents:
diff changeset
   648
    qreal leftScrollBorder  = 0;
hgs
parents:
diff changeset
   649
    qreal rightScrollBorder = m_viewPortWidth - 20;
hgs
parents:
diff changeset
   650
    qreal editorShift = -1 * m_editor->pos().x();
hgs
parents:
diff changeset
   651
    qreal localX = cursorX - editorShift;
hgs
parents:
diff changeset
   652
hgs
parents:
diff changeset
   653
    if (m_editor->textWidth() < rightScrollBorder) {
hgs
parents:
diff changeset
   654
      if (editorShift !=0)
hgs
parents:
diff changeset
   655
        m_editor->moveBy(editorShift, 0);
hgs
parents:
diff changeset
   656
      return;
hgs
parents:
diff changeset
   657
    }
hgs
parents:
diff changeset
   658
    
hgs
parents:
diff changeset
   659
    if (m_editor->textWidth() - editorShift < rightScrollBorder) {           
hgs
parents:
diff changeset
   660
      if (editorShift != 0)
hgs
parents:
diff changeset
   661
        m_editor->moveBy(rightScrollBorder - m_editor->textWidth() + editorShift, 0);
hgs
parents:
diff changeset
   662
      return;
hgs
parents:
diff changeset
   663
    }
hgs
parents:
diff changeset
   664
hgs
parents:
diff changeset
   665
    if (localX < leftScrollBorder) {
hgs
parents:
diff changeset
   666
      // Before left section, scroll right.
hgs
parents:
diff changeset
   667
      // In left section, scroll right.
hgs
parents:
diff changeset
   668
      qreal shift = qMin(leftScrollBorder - localX, editorShift);
hgs
parents:
diff changeset
   669
      m_editor->moveBy(shift, 0);
hgs
parents:
diff changeset
   670
      return;
hgs
parents:
diff changeset
   671
    }
hgs
parents:
diff changeset
   672
    if (localX >= rightScrollBorder) {
hgs
parents:
diff changeset
   673
      // In right section, scroll left.
hgs
parents:
diff changeset
   674
      // After right section, scroll left.
hgs
parents:
diff changeset
   675
      qreal shift = localX - rightScrollBorder;
hgs
parents:
diff changeset
   676
      m_editor->moveBy(-shift, 0);
hgs
parents:
diff changeset
   677
      return;
hgs
parents:
diff changeset
   678
    }
hgs
parents:
diff changeset
   679
    // In middle section, no scroll needed.
hgs
parents:
diff changeset
   680
    return;
hgs
parents:
diff changeset
   681
  }
hgs
parents:
diff changeset
   682
hgs
parents:
diff changeset
   683
  bool GLineEditor::tappedOnText(qreal x) const
hgs
parents:
diff changeset
   684
  {
hgs
parents:
diff changeset
   685
    qreal editorShift = m_editor->pos().x();
hgs
parents:
diff changeset
   686
    qreal editorWidth = m_editor->textWidth();
hgs
parents:
diff changeset
   687
    if (editorShift == 0 && editorWidth < x)
hgs
parents:
diff changeset
   688
      return false;
hgs
parents:
diff changeset
   689
    return true;
hgs
parents:
diff changeset
   690
  }
hgs
parents:
diff changeset
   691
hgs
parents:
diff changeset
   692
  bool GLineEditor::eventFilter(QObject * object, QEvent * event)
hgs
parents:
diff changeset
   693
  {
hgs
parents:
diff changeset
   694
    // Filter editor key events.
hgs
parents:
diff changeset
   695
    if (object != m_editor)
hgs
parents:
diff changeset
   696
      return false;
hgs
parents:
diff changeset
   697
hgs
parents:
diff changeset
   698
    if (event->type() != QEvent::KeyPress)
hgs
parents:
diff changeset
   699
      return false;
hgs
parents:
diff changeset
   700
hgs
parents:
diff changeset
   701
    QKeyEvent * keyEvent = static_cast<QKeyEvent*>(event);
hgs
parents:
diff changeset
   702
    switch (keyEvent->key()) {
hgs
parents:
diff changeset
   703
    case Qt::Key_Select:
hgs
parents:
diff changeset
   704
    case Qt::Key_Return:
hgs
parents:
diff changeset
   705
    case Qt::Key_Enter:
hgs
parents:
diff changeset
   706
      // Signal that a carriage return-like key-press happened.
hgs
parents:
diff changeset
   707
      emit activated();
hgs
parents:
diff changeset
   708
      return true;
hgs
parents:
diff changeset
   709
    case Qt::Key_Down:
hgs
parents:
diff changeset
   710
    case Qt::Key_Up:
hgs
parents:
diff changeset
   711
      // Swallow arrow up/down keys, editor has just one line.
hgs
parents:
diff changeset
   712
      return true;
hgs
parents:
diff changeset
   713
    default:
hgs
parents:
diff changeset
   714
      return false;
hgs
parents:
diff changeset
   715
    }
hgs
parents:
diff changeset
   716
  }
hgs
parents:
diff changeset
   717
hgs
parents:
diff changeset
   718
  //GTextEditor paints a styled frame around a GLineEditor
hgs
parents:
diff changeset
   719
hgs
parents:
diff changeset
   720
  GTextEditor::GTextEditor(ChromeSnippet * snippet, ChromeWidget * chrome, QGraphicsItem * parent)
hgs
parents:
diff changeset
   721
  : GLineEditor(snippet, chrome, parent)
hgs
parents:
diff changeset
   722
  {
hgs
parents:
diff changeset
   723
  }
hgs
parents:
diff changeset
   724
hgs
parents:
diff changeset
   725
  GTextEditor::~GTextEditor()
hgs
parents:
diff changeset
   726
  {
hgs
parents:
diff changeset
   727
  }
hgs
parents:
diff changeset
   728
hgs
parents:
diff changeset
   729
  void GTextEditor::paintBorder(QPainter * painter)
hgs
parents:
diff changeset
   730
  {
hgs
parents:
diff changeset
   731
    if (m_padding > 0 ) {
hgs
parents:
diff changeset
   732
      QPainterPath border;
hgs
parents:
diff changeset
   733
      //qDebug() << "GTextEditor::paintBorder: " << boundingRect().width() << " " << size().width();
hgs
parents:
diff changeset
   734
      border.addRect(boundingRect());
hgs
parents:
diff changeset
   735
      border.addRoundedRect(
hgs
parents:
diff changeset
   736
                            m_padding,
hgs
parents:
diff changeset
   737
                            m_padding,
hgs
parents:
diff changeset
   738
                            size().width()-m_padding*2,
hgs
parents:
diff changeset
   739
                            size().height()-m_padding*2,
hgs
parents:
diff changeset
   740
                            4,
hgs
parents:
diff changeset
   741
                            4);
hgs
parents:
diff changeset
   742
      painter->fillPath(border, m_borderColor);
hgs
parents:
diff changeset
   743
    }
hgs
parents:
diff changeset
   744
  }
hgs
parents:
diff changeset
   745
hgs
parents:
diff changeset
   746
  void GTextEditor::paint(QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget)
hgs
parents:
diff changeset
   747
  {
hgs
parents:
diff changeset
   748
    Q_UNUSED(option);
hgs
parents:
diff changeset
   749
    Q_UNUSED(widget);
hgs
parents:
diff changeset
   750
hgs
parents:
diff changeset
   751
    //updateEditor();
hgs
parents:
diff changeset
   752
    GLineEditor::paint(painter, option, widget);
hgs
parents:
diff changeset
   753
    painter->save();
hgs
parents:
diff changeset
   754
    painter->setRenderHint(QPainter::Antialiasing);
hgs
parents:
diff changeset
   755
    paintBorder(painter);
hgs
parents:
diff changeset
   756
    painter->restore();
hgs
parents:
diff changeset
   757
  }
hgs
parents:
diff changeset
   758
hgs
parents:
diff changeset
   759
  //GProgressEditor adds a progress bar to GTextEditor. Joining these into a single QGraphicsWidget makes it
hgs
parents:
diff changeset
   760
  //possible to draw a text editor with a progress bar with minimal updates
hgs
parents:
diff changeset
   761
hgs
parents:
diff changeset
   762
  GProgressEditor::GProgressEditor(ChromeSnippet * snippet, ChromeWidget * chrome, QGraphicsItem * parent)
hgs
parents:
diff changeset
   763
  : GTextEditor(snippet, chrome, parent)
hgs
parents:
diff changeset
   764
  , m_percent(0)
hgs
parents:
diff changeset
   765
  {
hgs
parents:
diff changeset
   766
  }
hgs
parents:
diff changeset
   767
hgs
parents:
diff changeset
   768
  GProgressEditor::~GProgressEditor()
hgs
parents:
diff changeset
   769
  {
hgs
parents:
diff changeset
   770
  }
hgs
parents:
diff changeset
   771
hgs
parents:
diff changeset
   772
  void GProgressEditor::paint(QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget)
hgs
parents:
diff changeset
   773
  {
hgs
parents:
diff changeset
   774
    Q_UNUSED(option);
hgs
parents:
diff changeset
   775
    Q_UNUSED(widget);
hgs
parents:
diff changeset
   776
hgs
parents:
diff changeset
   777
    updateEditor();
hgs
parents:
diff changeset
   778
hgs
parents:
diff changeset
   779
    QRectF progressRect = boundingRect();
hgs
parents:
diff changeset
   780
    progressRect.setWidth(progressRect.width() * m_percent / 100.0);
hgs
parents:
diff changeset
   781
hgs
parents:
diff changeset
   782
    painter->save();
hgs
parents:
diff changeset
   783
    painter->setRenderHint(QPainter::Antialiasing);
7
hgs
parents: 3
diff changeset
   784
    painter->fillRect(boundingRect(), m_backgroundColor);
3
hgs
parents:
diff changeset
   785
    painter->fillRect(progressRect, m_progressColor);
hgs
parents:
diff changeset
   786
    paintBorder(painter);
hgs
parents:
diff changeset
   787
    painter->restore();
16
hgs
parents: 12
diff changeset
   788
#ifdef BROWSER_LAYOUT_TENONE
hgs
parents: 12
diff changeset
   789
    if(!isEnabled() && !m_title->isVisible()) {
hgs
parents: 12
diff changeset
   790
#else
3
hgs
parents:
diff changeset
   791
    if(!isEnabled()) {
16
hgs
parents: 12
diff changeset
   792
#endif
3
hgs
parents:
diff changeset
   793
        ChromeEffect::paintDisabledRect(painter, option->exposedRect);
hgs
parents:
diff changeset
   794
    }
hgs
parents:
diff changeset
   795
  }
hgs
parents:
diff changeset
   796
hgs
parents:
diff changeset
   797
  void GProgressEditor::setProgress(int percent)
hgs
parents:
diff changeset
   798
  {
hgs
parents:
diff changeset
   799
    // Don't bother with small increments, but ...
hgs
parents:
diff changeset
   800
    //
hgs
parents:
diff changeset
   801
    // - ALWAYS show the final increment to 99 or 100, because
hgs
parents:
diff changeset
   802
    //   this tells the user a network request has completed.
hgs
parents:
diff changeset
   803
    //
hgs
parents:
diff changeset
   804
    // - ALWAYS show the initial increment from 0, because this
hgs
parents:
diff changeset
   805
    //   tells the user a new network request has started.
hgs
parents:
diff changeset
   806
    //
hgs
parents:
diff changeset
   807
    // - ALWAYS show decrements, because this tells the user
hgs
parents:
diff changeset
   808
    //   a new network request has started.
hgs
parents:
diff changeset
   809
    if (percent < 99) {
hgs
parents:
diff changeset
   810
      if (m_percent > 0) {
hgs
parents:
diff changeset
   811
        if (percent > m_percent) {
hgs
parents:
diff changeset
   812
          if (percent - m_percent < 10) {
hgs
parents:
diff changeset
   813
            //qDebug() << "UrlSearchSnippet::setProgress" << percent << "IGNORE";
hgs
parents:
diff changeset
   814
            return;
hgs
parents:
diff changeset
   815
          }
hgs
parents:
diff changeset
   816
        }
hgs
parents:
diff changeset
   817
      }
hgs
parents:
diff changeset
   818
    }
hgs
parents:
diff changeset
   819
hgs
parents:
diff changeset
   820
    if (m_percent == percent) {
hgs
parents:
diff changeset
   821
      //qDebug() << "UrlSearchSnippet::setProgress" << percent << "IGNORE";
hgs
parents:
diff changeset
   822
      return;
hgs
parents:
diff changeset
   823
    }
hgs
parents:
diff changeset
   824
hgs
parents:
diff changeset
   825
    //qDebug() << "UrlSearchSnippet::setProgress" << percent << "UPDATE";
hgs
parents:
diff changeset
   826
    m_percent = percent;
hgs
parents:
diff changeset
   827
    update();
hgs
parents:
diff changeset
   828
  }
hgs
parents:
diff changeset
   829
hgs
parents:
diff changeset
   830
  //A chrome item that displays a GTextEditor. This can be embedded in HTML chrome instead of an input field.
hgs
parents:
diff changeset
   831
hgs
parents:
diff changeset
   832
  TextEditItem::TextEditItem(ChromeSnippet * snippet, ChromeWidget * chrome, QGraphicsItem * parent)
hgs
parents:
diff changeset
   833
    : NativeChromeItem(snippet, parent)
16
hgs
parents: 12
diff changeset
   834
    , m_justFocusIn(false)
3
hgs
parents:
diff changeset
   835
  {
hgs
parents:
diff changeset
   836
    m_textEditor = new GTextEditor(snippet, chrome, this);
16
hgs
parents: 12
diff changeset
   837
    m_textEditor->setObjectName("Editor");
3
hgs
parents:
diff changeset
   838
  
hgs
parents:
diff changeset
   839
    //Style via CSS
hgs
parents:
diff changeset
   840
    QWebElement we = m_snippet->element();
hgs
parents:
diff changeset
   841
hgs
parents:
diff changeset
   842
    QColor textColor;
hgs
parents:
diff changeset
   843
    NativeChromeItem::CSSToQColor(we.styleProperty("color", QWebElement::ComputedStyle),
hgs
parents:
diff changeset
   844
                                  textColor);
hgs
parents:
diff changeset
   845
    m_textEditor->setTextColor(textColor);
hgs
parents:
diff changeset
   846
hgs
parents:
diff changeset
   847
    //Background of text box 
hgs
parents:
diff changeset
   848
    QColor backgroundColor;
hgs
parents:
diff changeset
   849
    NativeChromeItem::CSSToQColor(we.styleProperty("background-color", QWebElement::ComputedStyle),
hgs
parents:
diff changeset
   850
                                  backgroundColor); 
hgs
parents:
diff changeset
   851
    m_textEditor->setBackgroundColor(backgroundColor);
hgs
parents:
diff changeset
   852
hgs
parents:
diff changeset
   853
    QColor borderColor;
hgs
parents:
diff changeset
   854
    NativeChromeItem::CSSToQColor(we.styleProperty("border-top-color", QWebElement::ComputedStyle),
hgs
parents:
diff changeset
   855
                                  borderColor);
12
hgs
parents: 9
diff changeset
   856
#ifndef BROWSER_LAYOUT_TENONE
3
hgs
parents:
diff changeset
   857
    m_textEditor->setBorderColor(borderColor);
12
hgs
parents: 9
diff changeset
   858
#endif
3
hgs
parents:
diff changeset
   859
hgs
parents:
diff changeset
   860
    //Padding sets the "border" width
hgs
parents:
diff changeset
   861
    QString cssPadding = we.styleProperty("padding-top", QWebElement::ComputedStyle);
hgs
parents:
diff changeset
   862
    m_textEditor->setPadding(cssPadding.remove("px").toInt());
hgs
parents:
diff changeset
   863
16
hgs
parents: 12
diff changeset
   864
    safe_connect(m_textEditor, SIGNAL(focusChanged(bool)),this, SLOT(focusChanged(bool)));
3
hgs
parents:
diff changeset
   865
    safe_connect(m_textEditor, SIGNAL(tapped(QPointF&)),this, SLOT(tapped(QPointF&)));
16
hgs
parents: 12
diff changeset
   866
    safe_connect(m_textEditor, SIGNAL(contextEvent(bool)), this, SIGNAL(contextEvent(bool)));
hgs
parents: 12
diff changeset
   867
  }
3
hgs
parents:
diff changeset
   868
  
hgs
parents:
diff changeset
   869
  void TextEditItem::tapped(QPointF& pos)
16
hgs
parents: 12
diff changeset
   870
  {
3
hgs
parents:
diff changeset
   871
    bool hitText = m_textEditor->tappedOnText(pos.x());
hgs
parents:
diff changeset
   872
    if (m_justFocusIn) {
16
hgs
parents: 12
diff changeset
   873
      m_justFocusIn = false;
hgs
parents: 12
diff changeset
   874
      if (hitText && !m_textEditor->hasSelection())
hgs
parents: 12
diff changeset
   875
        m_textEditor->selectAll();
3
hgs
parents:
diff changeset
   876
    }
16
hgs
parents: 12
diff changeset
   877
  }
3
hgs
parents:
diff changeset
   878
16
hgs
parents: 12
diff changeset
   879
  void TextEditItem::focusChanged(bool focusIn)
hgs
parents: 12
diff changeset
   880
  {
3
hgs
parents:
diff changeset
   881
    if (focusIn)
16
hgs
parents: 12
diff changeset
   882
      m_justFocusIn = true;
3
hgs
parents:
diff changeset
   883
    else {
16
hgs
parents: 12
diff changeset
   884
      m_justFocusIn = false;
hgs
parents: 12
diff changeset
   885
      m_textEditor->unselect();
hgs
parents: 12
diff changeset
   886
      m_textEditor->shiftToLeftEnd();
3
hgs
parents:
diff changeset
   887
    }
16
hgs
parents: 12
diff changeset
   888
  }
3
hgs
parents:
diff changeset
   889
hgs
parents:
diff changeset
   890
  TextEditItem::~TextEditItem()
hgs
parents:
diff changeset
   891
  {
hgs
parents:
diff changeset
   892
    delete m_textEditor;
hgs
parents:
diff changeset
   893
  }
hgs
parents:
diff changeset
   894
hgs
parents:
diff changeset
   895
  void TextEditItem::resizeEvent(QGraphicsSceneResizeEvent * ev)
hgs
parents:
diff changeset
   896
  {
hgs
parents:
diff changeset
   897
    m_textEditor->resize(ev->newSize());
hgs
parents:
diff changeset
   898
  }
hgs
parents:
diff changeset
   899
  
hgs
parents:
diff changeset
   900
  void TextEditItem::setTextOptions(int flag)
hgs
parents:
diff changeset
   901
  {
hgs
parents:
diff changeset
   902
    m_textEditor->setInputMethodHints((Qt::InputMethodHints)flag);
hgs
parents:
diff changeset
   903
  }
hgs
parents:
diff changeset
   904
hgs
parents:
diff changeset
   905
} // namespace GVA