src/hbwidgets/editors/hbsmileyengine.cpp
changeset 1 f7ac710697a9
parent 0 16d8024aca5e
child 2 06ff229162e9
--- a/src/hbwidgets/editors/hbsmileyengine.cpp	Mon Apr 19 14:02:13 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,385 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2008-2010 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (developer.feedback@nokia.com)
-**
-** This file is part of the HbWidgets module of the UI Extensions for Mobile.
-**
-** GNU Lesser General Public License Usage
-** This file may be used under the terms of the GNU Lesser General Public
-** License version 2.1 as published by the Free Software Foundation and
-** appearing in the file LICENSE.LGPL included in the packaging of this file.
-** Please review the following information to ensure the GNU Lesser General
-** Public License version 2.1 requirements will be met:
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights.  These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at developer.feedback@nokia.com.
-**
-****************************************************************************/
-
-#include "hbsmileyengine.h"
-#include "hbsmileyengine_p.h"
-#include <hbiconanimator.h>
-#include <hbicon.h>
-#include <QTextDocument>
-#include <QFontMetricsF>
-#include <QChar>
-
-namespace {
-    const qreal ICON_SCALE_FACTOR = 1.5;
-}
-
-HbSmileyTheme HbSmileyEnginePrivate::mDefaultTheme = HbSmileyTheme();
-
-QSizeF HbIconTextObject::intrinsicSize(QTextDocument *doc, int posInDocument,
-                                    const QTextFormat &format)
-{
-    Q_UNUSED(doc)
-    Q_UNUSED(posInDocument)
-
-    HbSmileyDataType smiley = qVariantValue<HbSmileyDataType>(format.property(HbSmileyData));
-    HbIconAnimator *animator = smiley.second;
-    Q_ASSERT(animator);
-
-    QFont f = static_cast<const QTextCharFormat&>(format).font();
-    QFontMetricsF fm(f);
-
-    // TODO: optimize this
-    HbIcon icon = animator->icon();
-    qreal iconHeight = fm.height() * ICON_SCALE_FACTOR;
-    if(icon.height() != iconHeight) {
-        icon.setHeight(iconHeight);
-        animator->setIcon(icon);
-    }
-    return icon.size();
-}
-
-void HbIconTextObject::drawObject(QPainter *painter, const QRectF &rect,
-                               QTextDocument *doc, int posInDocument,
-                               const QTextFormat &format)
-{
-    Q_UNUSED(doc)
-    Q_UNUSED(posInDocument)
-
-    HbSmileyDataType smiley = qVariantValue<HbSmileyDataType>(format.property(HbSmileyData));
-    HbIconAnimator *animator = smiley.second;
-    animator->paint(painter,rect);
-}
-
-HbSmileyEnginePrivate::HbSmileyEnginePrivate()
-    :mDocument(0),
-     mEdited(true),
-     mIconTextObject(new HbIconTextObject)
-{
-    q_ptr = 0;
-}
-
-HbSmileyEnginePrivate::~HbSmileyEnginePrivate()
-{
-    cleanUp();
-    delete mIconTextObject;
-}
-
-
-void HbSmileyEnginePrivate::init()
-{
-    // Load default smiley theme
-    if(mDefaultTheme.isNull()) {
-        HbSmileyEnginePrivate::mDefaultTheme.load(":smileys/smileys_theme.sml");
-        //
-        //TODO: uncomment the lines below if animation definition file is provided for
-        //      default smiley theme.
-        //HbIconAnimationManager* m = HbIconAnimationManager::global();
-        //m->addDefinitionFile(":smileys/smileys_animations.xml");
-    }
-    mSmileyTheme = HbSmileyEnginePrivate::mDefaultTheme;
-}
-
-void HbSmileyEnginePrivate::cleanUp()
-{
-    QList<QTextCursor*> cursors = mCursorToAnimator.keys();
-    qDeleteAll(cursors);
-
-    QList<HbIconAnimator*> animators = mAnimatorToCursors.keys();
-    qDeleteAll(animators);
-
-    mAnimatorToCursors.clear();
-    mCursorToAnimator.clear();
-    mSmileyAnimator.clear();
-}
-
-void HbSmileyEnginePrivate::setDocument(QTextDocument *doc)
-{
-    Q_Q(HbSmileyEngine);
-    mDocument = doc;
-    mDocument->documentLayout()->registerHandler(HbIconTextFormat, mIconTextObject);
-    q->connect(mDocument, SIGNAL(contentsChange(int,int,int)), q, SLOT(_q_documentContentsChanged(int,int,int)));
-    cleanUp();
-}
-
-void HbSmileyEnginePrivate::insertSmiley( QTextCursor cursor, const QString& name)
-{
-    QTextCharFormat hbiconFormat;
-    QTextCursor *tmpCursor = new QTextCursor(cursor);
-    hbiconFormat.setObjectType(HbIconTextFormat);
-
-    HbIconTextObject::HbSmileyDataType smiley;
-    HbIconAnimator *animator = lookupAnimator(name);
-    smiley.first = tmpCursor;
-    smiley.second = animator;
-
-    hbiconFormat.setProperty(HbIconTextObject::HbSmileyData, qVariantFromValue(smiley));
-
-    mEdited = false;
-    tmpCursor->insertText(QString(QChar::ObjectReplacementCharacter), hbiconFormat);
-    mEdited = true;
-    tmpCursor->setPosition(tmpCursor->position()-1);
-    mAnimatorToCursors[animator] << tmpCursor;
-    mCursorToAnimator[tmpCursor] = animator;
-}
-
-void HbSmileyEnginePrivate::insertSmileys( QTextCursor cursor, bool insertOne)
-{
-    QString regexpStr;
-    foreach (QString pattern, mSmileyTheme.patterns()) {
-        regexpStr += QRegExp::escape(pattern) + "|";
-    }
-    regexpStr.remove(regexpStr.count()-1, 1);
-
-    QRegExp rx(regexpStr);
-    cursor = mDocument->find(rx, cursor);
-    while ( !cursor.isNull()){
-        insertSmiley(cursor, mSmileyTheme.smiley(cursor.selectedText()));
-        if (insertOne) {
-            break;
-        }
-        cursor = mDocument->find(rx, cursor);
-    }
-}
-
-
-HbIconAnimator* HbSmileyEnginePrivate::lookupAnimator(const QString& name)
-{
-    Q_Q(HbSmileyEngine);
-    HbIconAnimator *animator = mSmileyAnimator.value(name);
-
-    // Init icon if it doesn't already exits
-    if (!animator) {
-        HbIconAnimator *newAnimator = new HbIconAnimator();
-        animator = newAnimator;
-        HbIcon icon = HbIcon(name);
-        icon.setFlags(HbIcon::NoAutoStartAnimation);
-        animator->setIcon(icon);
-        q->connect(animator,SIGNAL(animationProgressed()),q,SLOT(_q_animationProgressed()));
-        animator->startAnimation();
-        mSmileyAnimator[name] = animator;
-    }
-
-    return animator;
-}
-
-
-bool HbSmileyEnginePrivate::isCursorValid(QTextCursor* cursor) const
-{
-    bool ret = true;
-
-    if (cursor) {
-        if (mDocument->characterAt(cursor->position()) != QChar::ObjectReplacementCharacter) {
-            ret = false;
-         } else {
-             QTextCursor tmpCursor(*cursor);
-             tmpCursor.setPosition(tmpCursor.position()+1);
-             QTextCharFormat format = tmpCursor.charFormat();
-
-             HbIconTextObject::HbSmileyDataType smiley =
-                     qVariantValue<HbIconTextObject::HbSmileyDataType>(format.property(HbIconTextObject::HbSmileyData));
-             if (cursor != smiley.first) {
-                ret = false;
-             }
-         }
-     } else {
-        ret = false;
-     }
-    return ret;
-}
-
-void HbSmileyEnginePrivate::convertToText(QTextDocument *copyDoc) const
-{
-    QList<QTextCursor> cursors;
-    // copy the cursors to copy document so that the positions get automatically updated
-    foreach(QTextCursor *cursor, mCursorToAnimator.keys()) {
-        if(isCursorValid(cursor)) {
-            QTextCursor copyCursor(copyDoc);
-            copyCursor.setPosition(cursor->position());
-            cursors << copyCursor;
-        }
-    }
-
-    foreach(QTextCursor copyCursor, cursors) {
-        copyCursor.setPosition(copyCursor.position()+1, QTextCursor::KeepAnchor);
-        QTextFormat format = copyCursor.charFormat();
-        HbIconTextObject::HbSmileyDataType smiley =
-                qVariantValue<HbIconTextObject::HbSmileyDataType>(format.property(HbIconTextObject::HbSmileyData));
-        HbIconAnimator *animator = smiley.second;
-        Q_ASSERT(animator);
-
-        QString pattern = mSmileyTheme.patterns(mSmileyAnimator.key(animator)).first();
-        copyCursor.deleteChar();
-        copyCursor.insertText(pattern);
-    }
-}
-
-void HbSmileyEnginePrivate::_q_animationProgressed()
-{
-    Q_Q(HbSmileyEngine);
-    HbIconAnimator *animator = qobject_cast<HbIconAnimator *>(q->sender());
-    Q_ASSERT(animator);
-
-    foreach(QTextCursor *cursor, mAnimatorToCursors.value(animator)) {
-        QTextCursor tmpCursor(*cursor);
-        tmpCursor.setPosition(tmpCursor.position()+1, QTextCursor::KeepAnchor);
-
-        // update a bogus property, which will trigger a paint
-        QTextCharFormat format;
-        format.setProperty(HbIconTextObject::HbSmileyData+1, QString("Dummy"));
-        mEdited = false;
-        tmpCursor.mergeCharFormat(format);
-        mEdited = true;
-    }
-}
-
-void HbSmileyEnginePrivate::_q_documentContentsChanged(int position, int charsRemoved, int charsAdded)
-{
-    Q_UNUSED(position);
-    Q_UNUSED(charsRemoved);
-    Q_UNUSED(charsAdded);
-
-    if(charsRemoved > 0 && mEdited) {
-        foreach (QTextCursor* cursor, mCursorToAnimator.keys()) {          
-            if (!isCursorValid(cursor)) {
-                HbIconAnimator * animator = mCursorToAnimator.value(cursor);
-                mCursorToAnimator.remove(cursor);
-                QList<QTextCursor*> & cursorList = mAnimatorToCursors[animator];
-                cursorList.removeFirst();
-                if (!cursorList.count()) {
-                    mAnimatorToCursors.remove(animator);
-                    mSmileyAnimator.remove(mSmileyAnimator.key(animator));
-                    animator->deleteLater();
-                }
-                delete cursor;
-            }
-        }
-    }
-}
-
-
-HbSmileyEngine::HbSmileyEngine(QObject *parent)
-    :QObject(parent),
-    d_ptr(new HbSmileyEnginePrivate)
-
-{
-    Q_D(HbSmileyEngine);
-    d->q_ptr = this;
-    d->init();
-}
-
-HbSmileyEngine::HbSmileyEngine(HbSmileyEnginePrivate &dd, QObject *parent)
-    :QObject(parent),
-    d_ptr(&dd)
-{
-    Q_D(HbSmileyEngine);
-    d->q_ptr = this;
-    d->init();
-}
-
-HbSmileyEngine::~HbSmileyEngine()
-{
-    delete d_ptr;
-}
-
-void HbSmileyEngine::setDocument(QTextDocument *doc)
-{
-    Q_D(HbSmileyEngine);
-    d->setDocument(doc);
-}
-
-void HbSmileyEngine::setTheme(const HbSmileyTheme& theme)
-{
-    Q_D(HbSmileyEngine);
-    d->mSmileyTheme = theme;
-}
-
-HbSmileyTheme HbSmileyEngine::theme() const
-{
-    Q_D(const HbSmileyEngine);
-    return d->mSmileyTheme;
-}
-
-HbSmileyTheme HbSmileyEngine::defaultTheme() const
-{
-    return HbSmileyEnginePrivate::mDefaultTheme;
-}
-
-
-QString HbSmileyEngine::toPlainText() const
-{
-    Q_D(const HbSmileyEngine);
-    QTextDocument *copyDoc = d->mDocument->clone();
-    d->convertToText(copyDoc);
-    QString plainText = copyDoc->toPlainText();
-    delete copyDoc;
-    return plainText;
-}
-
-QString HbSmileyEngine::toHtml() const
-{
-    Q_D(const HbSmileyEngine);
-    QTextDocument *copyDoc = d->mDocument->clone();
-    d->convertToText(copyDoc);
-    QString htmlString = copyDoc->toHtml();
-    return htmlString;
-}
-
-void HbSmileyEngine::startAnimation()
-{
-    Q_D(HbSmileyEngine);
-    foreach (HbIconAnimator *animator, d->mAnimatorToCursors.keys()) {
-        animator->startAnimation();
-    }
-}
-
-void HbSmileyEngine::stopAnimation()
-{
-    Q_D(HbSmileyEngine);
-    foreach (HbIconAnimator *animator, d->mAnimatorToCursors.keys()) {
-        animator->stopAnimation();
-    }
-}
-
-void HbSmileyEngine::insertSmileys()
-{
-    Q_D(HbSmileyEngine);
-
-    QTextCursor cursor(d->mDocument);
-    d->insertSmileys(cursor);
-}
-
-void HbSmileyEngine::insertSmileys(const QTextCursor& cursor)
-{
-    Q_D(HbSmileyEngine);
-    d->insertSmileys(cursor);
-}
-
-void HbSmileyEngine::insertSmiley(const QTextCursor& cursor)
-{
-    Q_D(HbSmileyEngine);
-    d->insertSmileys(cursor,true);
-}
-
-#include "moc_hbsmileyengine.cpp"