src/hbwidgets/editors/hbabstractedit_p.cpp
branchGCC_SURGE
changeset 15 f378acbc9cfb
parent 7 923ff622b8b9
child 21 4633027730f5
child 34 ed14f46c0e55
--- a/src/hbwidgets/editors/hbabstractedit_p.cpp	Thu Jul 15 14:03:49 2010 +0100
+++ b/src/hbwidgets/editors/hbabstractedit_p.cpp	Thu Jul 22 16:36:53 2010 +0100
@@ -39,15 +39,17 @@
 #include "hbstyleoption_p.h"
 #include "hbscrollarea.h"
 #include "hbvalidator.h"
-#include "hbmeshlayout_p.h"
 #include "hbmenu.h"
 #include "hbselectioncontrol_p.h"
 #include "hbcolorscheme.h"
 #include "hbsmileyengine_p.h"
 #include "hbtextmeasurementutility_p.h"
-#include "hbfeaturemanager_p.h"
+#include "hbfeaturemanager_r.h"
 #include "hbinputeditorinterface.h"
 #include "hbinputvkbhost.h"
+#include "hbinputmethod.h"
+#include "hbinputfocusobject.h"
+
 
 #include <QValidator>
 #include <QTextLayout>
@@ -95,6 +97,7 @@
 
     HbEditItem(HbAbstractEdit *parent) : HbWidget(parent), edit(parent)
     {
+    	setFlag(QGraphicsItem::ItemUsesExtendedStyleOption, true);
     };
 
     virtual ~HbEditItem() {};
@@ -198,7 +201,8 @@
     wasGesture(false),
     smileysEnabled(false),
     smileyEngine(0),
-    formatDialog(0)
+    formatDialog(0),
+    updatePrimitivesInProgress(false)
 {
 }
 
@@ -211,6 +215,8 @@
     Q_Q(HbAbstractEdit);
 
     canvas = new HbEditItem(q);
+    canvas->setSizePolicy(QSizePolicy::Ignored,QSizePolicy::Ignored);
+
 
     setContent(Qt::RichText, QString());
 
@@ -238,6 +244,7 @@
     q->setFlag(QGraphicsItem::ItemIsFocusable);
     q->setFlag(QGraphicsItem::ItemAcceptsInputMethod);
     q->setFlag(QGraphicsItem::ItemSendsScenePositionChanges);
+    q->setFlag(QGraphicsItem::ItemHasNoContents, false);
     q->setFocusPolicy(Qt::StrongFocus);
     q->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
 
@@ -248,28 +255,6 @@
 
 void HbAbstractEditPrivate::updatePaletteFromTheme()
 {
-    Q_Q(HbAbstractEdit);
-
-    // TODO: remove once these color dissapear from hbcolorgroup.css
-    QColor textColor = HbColorScheme::color("qtc_editor_normal");
-    QColor selectedColor = HbColorScheme::color("qtc_editor_selected");
-    QColor selectedBackground = HbColorScheme::color("qtc_editor_marker_normal");
-    QPalette pal = q->palette();
-
-    if (textColor.isValid()) {
-        pal.setColor(QPalette::Text, textColor);
-    }
-
-    if (selectedColor.isValid()) {
-        pal.setColor(QPalette::HighlightedText, selectedColor);
-    }
-
-    if (selectedBackground.isValid()) {
-        pal.setColor(QPalette::Highlight, selectedBackground);
-    }
-    q->setPalette(pal);
-
-
     // The link color is used from application's palette
     QColor linkColor = HbColorScheme::color("qtc_view_link_normal");
     QColor linkVisitedColor = HbColorScheme::color("qtc_view_visited_normal");
@@ -390,8 +375,12 @@
 
 void HbAbstractEditPrivate::setCursorPosition(int pos, QTextCursor::MoveMode mode)
 {
+    if (cursor.isNull()) {
+        cursor = QTextCursor(doc);
+    }
+
     cursor.setPosition(pos, mode);
-
+    ensureCursorVisible();
     cursorChanged(HbValidator::CursorChangeFromMouse);
 }
 
@@ -510,13 +499,12 @@
         return false;
     }
 
-    const QTextCursor oldCursor = cursor;
+    //const QTextCursor oldCursor = cursor;
     bool visualNavigation = cursor.visualNavigation();
     cursor.setVisualNavigation(true);
     cursor.movePosition(op, mode);
     cursor.setVisualNavigation(visualNavigation);
     cursorChanged(HbValidator::CursorChangeFromOperation);
-    repaintOldAndNewSelection(oldCursor);
 
     return true;
 }
@@ -596,13 +584,11 @@
 
 void HbAbstractEditPrivate::setTextInteractionFlags(Qt::TextInteractionFlags flags)
 {
-    Q_Q(HbAbstractEdit);
-
     if (flags == interactionFlags)
         return;
     interactionFlags = flags;
 
-    if (q->hasFocus()) {
+    if (hasInputFocus()) {
         setBlinkingCursorEnabled(flags & Qt::TextEditable);
     }
 }
@@ -649,14 +635,15 @@
     Q_Q(HbAbstractEdit);
 
     if (cursor.hasSelection()) {   
-        if (selectionControl) {
-            selectionControl->showHandles();
-            q->update();
-        }      
+        selectionControl = HbSelectionControl::attachEditor(q);
+        selectionControl->showHandles();
     } else if (selectionControl){
         selectionControl->hideHandles();
-        q->update();
     }
+    
+    QTextCursor oldSelection(selectionCursor);
+    selectionCursor = cursor;
+    repaintOldAndNewSelection(oldSelection);
 }
 
 void HbAbstractEditPrivate::_q_scrollStarted()
@@ -761,7 +748,6 @@
     }
 
     emit q->selectionChanged(selectionCursor, cursor);
-    selectionCursor = cursor;
 }
 
 void HbAbstractEditPrivate::acceptKeyPressEvent(QKeyEvent *event)
@@ -792,7 +778,7 @@
     if (cursor.hasSelection()) {
         QAbstractTextDocumentLayout::Selection selection;
         selection.cursor = cursor;
-        QPalette::ColorGroup cg = q->hasFocus() ? QPalette::Active : QPalette::Inactive;
+        QPalette::ColorGroup cg = hasInputFocus() ? QPalette::Active : QPalette::Inactive;
         selection.format.setBackground(ctx.palette.brush(cg, QPalette::Highlight));
         selection.format.setForeground(ctx.palette.brush(cg, QPalette::HighlightedText));
 
@@ -995,7 +981,7 @@
     QTextLayout *layout = cursor.block().layout();
     int cursorPos = hitTest(tapPos, Qt::ExactHit);
 
-    if (cursorPos == -1) {
+    if (layout && cursorPos == -1) {
             cursorPos = cursor.position() + layout->preeditAreaText().length();
     }
 
@@ -1078,7 +1064,6 @@
     if (removeSelection && cursor.hasSelection()) {
         const QTextCursor oldCursor = cursor;
         cursor.clearSelection();
-        repaintOldAndNewSelection(oldCursor);
         emit q->selectionChanged(oldCursor, cursor);
     }
 
@@ -1094,14 +1079,27 @@
     } else {
         // Currently focused widget to listen to InputContext before updating the cursor position
         sendMouseEventToInputContext(point);
+
+        // translate the point to have the Y ccordinate inside the viewport
+        QPointF translatedPoint(point);
+        if(translatedPoint.y() < viewPortRect().top()) {
+            translatedPoint.setY(viewPortRect().top() + 1);
+        } else if(translatedPoint.y() > viewPortRect().bottom()){
+            translatedPoint.setY(viewPortRect().bottom() - 1);
+        }
+
         // need to get the cursor position again since input context can change the document
-        newCursorPos = hitTest(point, Qt::FuzzyHit);
+        newCursorPos = hitTest(translatedPoint, Qt::FuzzyHit);
         setCursorPosition(newCursorPos);
 
         if (interactionFlags & Qt::TextEditable) {
             updateCurrentCharFormat();
         }
-        cursorChanged(HbValidator::CursorChangeFromMouse);
+
+        QString anchor(q->anchorAt(translatedPoint));
+        if(!anchor.isEmpty()) {
+            emit q->anchorTapped(anchor);
+        }
     }
 }
 
@@ -1172,6 +1170,22 @@
     }
 }
 
+void HbAbstractEditPrivate::filterInputText(QString &text) const
+{
+    Q_Q(const HbAbstractEdit);
+    HbEditorInterface editorInterface(const_cast<HbAbstractEdit*>(q));
+    HbInputFilter *inputFilter = editorInterface.filter();
+
+    if (!text.isEmpty() && inputFilter) {
+        for(int i(text.length() - 1); i>=0; --i) {
+            if (!inputFilter->filter(text.at(i))) {
+                text.remove(i,1);
+            }
+        }
+    }
+}
+
+
 Qt::Alignment HbAbstractEditPrivate::alignmentFromString(const QString &text)
 {
     Qt::Alignment align(0);
@@ -1229,16 +1243,27 @@
     sendInputPanelEvent(QEvent::CloseSoftwareInputPanel);
 }
 
-#include "hbinputeditorinterface.h"
-#include "hbinputvkbhost.h"
-
-void HbAbstractEditPrivate::minimizeInputPanel()
+bool HbAbstractEditPrivate::hasInputFocus() const
 {
-    Q_Q(HbAbstractEdit);
+    Q_Q(const HbAbstractEdit);
+
+    HbInputMethod* inputMethod = HbInputMethod::activeInputMethod();
+    if (inputMethod && inputMethod->focusObject() &&
+        qobject_cast<HbAbstractEdit*>(inputMethod->focusObject()->object()) == q) {
+        return true;
+    }
+    return false;
+}
 
-    HbEditorInterface ei(q);
-    HbVkbHost* vkbHost = ei.vkbHost();
-    vkbHost->minimizeKeypad();
+void HbAbstractEditPrivate::setInputFocusEnabled(bool enable)
+{
+    QGraphicsItem *focusItem = focusPrimitive(HbWidget::FocusHighlightActive);
+    if (focusItem) {
+        focusItem->setVisible(enable);
+    }
+
+    setBlinkingCursorEnabled(enable);
+    repaintOldAndNewSelection(selectionCursor);
 }
 
 #include "moc_hbabstractedit.cpp"