src/hbwidgets/editors/hbabstractedit.cpp
changeset 7 923ff622b8b9
parent 6 c3690ec91ef8
child 21 4633027730f5
child 34 ed14f46c0e55
equal deleted inserted replaced
6:c3690ec91ef8 7:923ff622b8b9
    34 #include "hbevent.h"
    34 #include "hbevent.h"
    35 #include "hbwidgetfeedback.h"
    35 #include "hbwidgetfeedback.h"
    36 #include "hbmenu.h"
    36 #include "hbmenu.h"
    37 #include "hbaction.h"
    37 #include "hbaction.h"
    38 #include "hbselectioncontrol_p.h"
    38 #include "hbselectioncontrol_p.h"
    39 #include "hbmeshlayout_p.h"
       
    40 #include "hbsmileyengine_p.h"
    39 #include "hbsmileyengine_p.h"
    41 #include "hbinputeditorinterface.h"
    40 #include "hbinputeditorinterface.h"
    42 #include "hbfeaturemanager_r.h"
    41 #include "hbfeaturemanager_r.h"
    43 #include "hbtextmeasurementutility_p.h"
    42 #include "hbtextmeasurementutility_p.h"
    44 #include "hbtapgesture.h"
    43 #include "hbtapgesture.h"
    45 #include "hbpangesture.h"
    44 #include "hbpangesture.h"
       
    45 #include "hbnamespace_p.h"
    46 
    46 
    47 #include <QApplication>
    47 #include <QApplication>
    48 #include "hbpopup.h"
    48 #include "hbpopup.h"
    49 #include "hbformatdialog.h"
    49 #include "hbformatdialog.h"
    50 #include <QTextList>
    50 #include <QTextList>
    52 #include <QPainter>
    52 #include <QPainter>
    53 #include <QTextBlock>
    53 #include <QTextBlock>
    54 #include <QAbstractTextDocumentLayout>
    54 #include <QAbstractTextDocumentLayout>
    55 #include <QClipboard>
    55 #include <QClipboard>
    56 #include <QInputContext>
    56 #include <QInputContext>
       
    57 #include <QGraphicsScene>
    57 
    58 
    58 /*!
    59 /*!
    59     \class HbAbstractEdit
    60     \class HbAbstractEdit
    60     \brief HbAbstractEdit is a base class for all text editors.
    61     \brief HbAbstractEdit is a base class for all text editors.
    61     @proto
    62     @proto
   199 /*!
   200 /*!
   200     \reimp
   201     \reimp
   201 */
   202 */
   202 bool HbAbstractEdit::event(QEvent* event)
   203 bool HbAbstractEdit::event(QEvent* event)
   203 {
   204 {
       
   205     Q_D(HbAbstractEdit);
       
   206 
   204     if(event->type() ==  QEvent::DynamicPropertyChange) {
   207     if(event->type() ==  QEvent::DynamicPropertyChange) {
   205         const QString p = static_cast<QDynamicPropertyChangeEvent *>(event)->propertyName();
   208         const QString p = static_cast<QDynamicPropertyChangeEvent *>(event)->propertyName();
   206         if(p == "SmileyIcon") {
   209         if(p == "SmileyIcon") {
   207             Q_D(HbAbstractEdit);
   210             Q_D(HbAbstractEdit);
   208             QString iconName = property("SmileyIcon").toString();
   211             QString iconName = property("SmileyIcon").toString();
   221             matchCursor.setPosition(oldPos);
   224             matchCursor.setPosition(oldPos);
   222             d->smileyEngineInstance()->insertSmiley(matchCursor);
   225             d->smileyEngineInstance()->insertSmiley(matchCursor);
   223 
   226 
   224             d->cursorChanged(HbValidator::CursorChangeFromContentUpdate);
   227             d->cursorChanged(HbValidator::CursorChangeFromContentUpdate);
   225         }
   228         }
   226     }
   229     } else { //HbEvent handler
       
   230         if (event->type() == HbEvent::InputMethodFocusIn) {
       
   231             d->setInputFocusEnabled(true);
       
   232             
       
   233         } else if (event->type() == HbEvent::InputMethodFocusOut) {
       
   234             d->setInputFocusEnabled(false);
       
   235         }
       
   236     }
       
   237 
   227     return HbWidget::event(event);
   238     return HbWidget::event(event);
   228 }
   239 }
   229 
   240 
   230 QVariant HbAbstractEdit::inputMethodQuery (Qt::InputMethodQuery query) const
   241 QVariant HbAbstractEdit::inputMethodQuery (Qt::InputMethodQuery query) const
   231 {
   242 {
   241         return QVariant(d->cursor.position() - block.position());
   252         return QVariant(d->cursor.position() - block.position());
   242     case Qt::ImSurroundingText:
   253     case Qt::ImSurroundingText:
   243         return QVariant(block.text());
   254         return QVariant(block.text());
   244     case Qt::ImCurrentSelection:
   255     case Qt::ImCurrentSelection:
   245         return QVariant(d->cursor.selectedText());
   256         return QVariant(d->cursor.selectedText());
       
   257     case Qt::ImMaximumTextLength:
       
   258         return QVariant(); // No limit.
       
   259     case Qt::ImAnchorPosition:
       
   260         return QVariant(qBound(0, d->cursor.anchor() - block.position(), block.length()));
   246     default:
   261     default:
   247         return QVariant();
   262         return QVariant();
   248     }
   263     }
   249 }
   264 }
   250 
   265 
   328         d->imAdded = e->commitString().length();
   343         d->imAdded = e->commitString().length();
   329         d->imRemoved =  e->replacementLength();
   344         d->imRemoved =  e->replacementLength();
   330         d->_q_contentsChanged();
   345         d->_q_contentsChanged();
   331     }
   346     }
   332 
   347 
   333     if(hasFocus()) {
   348     if(d->hasInputFocus()) {
   334         d->cursorOn = true;
   349         d->cursorOn = true;
   335     }
   350     }
   336     d->ensureCursorVisible();
   351     d->ensureCursorVisible();
   337 }
   352 }
   338 
   353 
   476     d->selectionControl = HbSelectionControl::attachEditor(this);
   491     d->selectionControl = HbSelectionControl::attachEditor(this);
   477 
   492 
   478     if (d->interactionFlags & Qt::NoTextInteraction)
   493     if (d->interactionFlags & Qt::NoTextInteraction)
   479         return;
   494         return;
   480 
   495 
   481     update(d->selectionRect());
   496     // It sets the cursor the focus item's depending on if
   482 
   497     // the input panel is connceted or not
   483     if (d->interactionFlags & Qt::TextEditable) {
   498     d->setInputFocusEnabled(d->hasInputFocus());
   484         d->setBlinkingCursorEnabled(true);
       
   485     } else {
       
   486         d->cursorOn = (d->interactionFlags & Qt::TextSelectableByKeyboard);
       
   487     }
       
   488 
       
   489     d->openInputPanel();        
       
   490 
   499 
   491     event->accept();
   500     event->accept();
   492 }
   501 }
   493 
   502 
   494 /*!
   503 /*!
   501     Q_D(HbAbstractEdit);
   510     Q_D(HbAbstractEdit);
   502 
   511 
   503     if (d->interactionFlags & Qt::NoTextInteraction)
   512     if (d->interactionFlags & Qt::NoTextInteraction)
   504         return;
   513         return;
   505 
   514 
   506     d->setBlinkingCursorEnabled(false);
   515     // It sets the cursor the focus item's depending on if
   507     d->repaintOldAndNewSelection(d->selectionCursor);
   516     // the input panel is connceted or not
       
   517     d->setInputFocusEnabled(d->hasInputFocus());
   508 
   518 
   509     event->accept();
   519     event->accept();
   510 }
   520 }
   511 
   521 
   512 /*!
   522 /*!
   554     Q_D(HbAbstractEdit);
   564     Q_D(HbAbstractEdit);
   555     HbWidget::hideEvent(event);
   565     HbWidget::hideEvent(event);
   556 
   566 
   557     deselect();
   567     deselect();
   558 
   568 
   559     if(hasFocus() && !isReadOnly() && !panel()) {
   569     if(d->hasInputFocus() && !isReadOnly() && !panel()) {
   560         d->closeInputPanel();
   570         d->closeInputPanel();
   561     }
   571     }
   562 }
   572 }
   563 
   573 
   564 
   574 
   655     f ^= Qt::TextEditable;
   665     f ^= Qt::TextEditable;
   656 
   666 
   657     d->setTextInteractionFlags(f);
   667     d->setTextInteractionFlags(f);
   658 
   668 
   659     setFlag(QGraphicsItem::ItemAcceptsInputMethod, !value);
   669     setFlag(QGraphicsItem::ItemAcceptsInputMethod, !value);
       
   670 
       
   671     if (value && d->hasInputFocus()) {
       
   672         d->closeInputPanel();
       
   673     }
   660 }
   674 }
   661 
   675 
   662 /*!
   676 /*!
   663 
   677 
   664     \deprecated HbAbstractEdit::primitive(HbStyle::Primitive)
   678     \deprecated HbAbstractEdit::primitive(HbStyle::Primitive)
   694         d->updatePrimitivesInProgress = true;
   708         d->updatePrimitivesInProgress = true;
   695 
   709 
   696         HbWidget::updatePrimitives();
   710         HbWidget::updatePrimitives();
   697 
   711 
   698         if (d->scrollArea) {
   712         if (d->scrollArea) {
   699             d->doc->setTextWidth(d->scrollArea->size().width());
   713             if(!qFuzzyCompare(d->doc->textWidth(), d->scrollArea->size().width())){
   700             if(d->placeholderDoc) {
   714                 d->doc->setTextWidth(d->scrollArea->size().width());
   701                 d->placeholderDoc->setTextWidth(d->scrollArea->size().width());
   715                 if(d->placeholderDoc) {
       
   716                     d->placeholderDoc->setTextWidth(d->scrollArea->size().width());
       
   717                 }
   702             }
   718             }
   703         }
   719         }
   704         QRectF canvasGeom(QRectF(QPointF(0,0),d->doc->size()));
   720         QRectF canvasGeom(QRectF(QPointF(0,0),d->doc->size()));
   705         if(d->scrollArea) {
   721         if(d->scrollArea) {
   706             canvasGeom.setHeight(qMax(d->scrollArea->size().height(), d->doc->size().height()));
   722             canvasGeom.setHeight(qMax(d->scrollArea->size().height(), d->doc->size().height()));
  1276 void HbAbstractEdit::showContextMenu(QPointF position)
  1292 void HbAbstractEdit::showContextMenu(QPointF position)
  1277 {
  1293 {
  1278     Q_D(HbAbstractEdit);
  1294     Q_D(HbAbstractEdit);
  1279     HbMenu *menu = createContextMenu();
  1295     HbMenu *menu = createContextMenu();
  1280 
  1296 
       
  1297     QTextBlock block = d->cursor.block();
       
  1298     QTextLayout *layout = block.layout();
       
  1299     if(layout && !layout->preeditAreaText().isEmpty())
       
  1300     {
       
  1301         // there's pre-edit text present, it needs to be commited 1st
       
  1302         if(qApp->inputContext()) {
       
  1303             qApp->inputContext()->reset();
       
  1304         }
       
  1305     }
       
  1306 
  1281     if (!menu) {
  1307     if (!menu) {
  1282         menu = new HbMenu();
  1308         menu = new HbMenu();
  1283     }
  1309     }
  1284 
       
  1285     menu->setAttribute(Hb::InputMethodNeutral);
       
  1286 
  1310 
  1287     if (d->cursor.hasSelection() && d->canCut()) {
  1311     if (d->cursor.hasSelection() && d->canCut()) {
  1288         connect(
  1312         connect(
  1289             menu->addAction(hbTrId("txt_common_menu_cut")), SIGNAL(triggered()),
  1313             menu->addAction(hbTrId("txt_common_menu_cut")), SIGNAL(triggered()),
  1290             this, SLOT(cut()));       
  1314             this, SLOT(cut()));       
  1319     }
  1343     }
  1320 
  1344 
  1321     emit aboutToShowContextMenu(menu, d->tapPosition);
  1345     emit aboutToShowContextMenu(menu, d->tapPosition);
  1322 
  1346 
  1323     if(menu->actions().count() > 0){
  1347     if(menu->actions().count() > 0){
  1324         d->minimizeInputPanel();
  1348 //        d->minimizeInputPanel();
  1325         menu->setPreferredPos(position);
  1349         menu->setPreferredPos(position);
  1326         menu->show();
  1350         menu->show();
  1327     }
  1351     }
  1328 }
  1352 }
  1329 
  1353 
  1672         // The QGestureEvent knows the viewport through which the gesture
  1696         // The QGestureEvent knows the viewport through which the gesture
  1673         // was triggered.
  1697         // was triggered.
  1674         QPointF pos = mapFromScene(event->mapToGraphicsScene(tap->position()));
  1698         QPointF pos = mapFromScene(event->mapToGraphicsScene(tap->position()));
  1675         switch(tap->state()) {
  1699         switch(tap->state()) {
  1676         case Qt::GestureStarted:
  1700         case Qt::GestureStarted:
       
  1701             scene()->setProperty(HbPrivate::OverridingGesture.latin1(),Qt::TapGesture);
       
  1702             if (!tap->property(HbPrivate::ThresholdRect.latin1()).toRect().isValid()) {
       
  1703                 tap->setProperty(HbPrivate::ThresholdRect.latin1(), mapRectToScene(boundingRect()).toRect());
       
  1704             }
       
  1705 
  1677             d->tapPosition = pos;
  1706             d->tapPosition = pos;
  1678             HbWidgetFeedback::triggered(this, Hb::InstantPressed);
  1707             HbWidgetFeedback::triggered(this, Hb::InstantPressed);
  1679             break;
  1708             break;
  1680         case Qt::GestureUpdated:
  1709         case Qt::GestureUpdated:
  1681             if(tap->tapStyleHint() == HbTapGesture::TapAndHold) {
  1710             if(tap->tapStyleHint() == HbTapGesture::TapAndHold) {
  1682                 d->longTapGesture(pos);
  1711                 d->openInputPanel();
       
  1712                 d->longTapGesture(pos);                
  1683             }
  1713             }
  1684             break;
  1714             break;
  1685       case Qt::GestureFinished:
  1715       case Qt::GestureFinished:
       
  1716             scene()->setProperty(HbPrivate::OverridingGesture.latin1(),QVariant());
       
  1717 
  1686             if(tap->tapStyleHint() == HbTapGesture::TapAndHold) {
  1718             if(tap->tapStyleHint() == HbTapGesture::TapAndHold) {
  1687             } else {
  1719             } else {
  1688                 d->tapGesture(pos);
  1720                 d->tapGesture(pos);
  1689             }
  1721             }
  1690 
  1722 
  1692 
  1724 
  1693             d->openInputPanel();
  1725             d->openInputPanel();
  1694             
  1726             
  1695             break;
  1727             break;
  1696       case Qt::GestureCanceled:
  1728       case Qt::GestureCanceled:
       
  1729             scene()->setProperty(HbPrivate::OverridingGesture.latin1(),QVariant());
       
  1730 
  1697             break;
  1731             break;
  1698       default:
  1732       default:
  1699             break;
  1733             break;
  1700         }
  1734         }
  1701         event->accept();
  1735         event->accept();