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> |
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 |
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 /*! |
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())); |
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 |