homescreenapp/widgetplugins/hsshortcutwidgetplugin/src/hsshortcutwidget.cpp
branchRCL_3
changeset 82 5f0182e07bfb
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/homescreenapp/widgetplugins/hsshortcutwidgetplugin/src/hsshortcutwidget.cpp	Tue Aug 31 15:06:34 2010 +0300
@@ -0,0 +1,326 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: Home screen shortcut widget.
+*
+*/
+
+#include <QGraphicsSceneMouseEvent>
+
+#include <HbStyleLoader>
+#include <HbFrameItem>
+#include <HbFrameDrawer>
+#include <HbIconItem>
+#include <HbTextItem>
+#include <HbInstantFeedback>
+#include <HbTapGesture>
+
+#include "hsshortcutwidget.h"
+#include "hsshortcutservice.h"
+#include "hsapp_defs.h"
+#include "caservice.h"
+#include "canotifier.h"
+#include "caquery.h"
+#include "hsconfiguration.h"
+
+/*!
+    \class HsShortcutWidget
+    \ingroup group_hsshortcutwidgetplugin
+    \brief Implementation for the homescreen shortcut widget.
+
+    Shortcut can be defined to launch different applications or applications
+    with parameters, for example browser with certain url.
+*/
+
+/*!
+    Constructor.
+*/
+HsShortcutWidget::HsShortcutWidget(QGraphicsItem *parent, Qt::WindowFlags flags)
+  : HbWidget(parent, flags),
+    mBackground(0), mIcon(0), mText(0),
+    mCaEntryId(-1), mCaEntryRole(ItemEntryRole)
+{
+    grabGesture(Qt::TapGesture);
+
+    HbStyleLoader::registerFilePath(":/hsshortcutwidget.widgetml");
+    HbStyleLoader::registerFilePath(":/hsshortcutwidget.css");
+
+    createPrimitives();
+}
+
+/*!
+    Destructor.
+*/
+HsShortcutWidget::~HsShortcutWidget()
+{
+    HbStyleLoader::unregisterFilePath(":/hsshortcutwidget.widgetml");
+    HbStyleLoader::unregisterFilePath(":/hsshortcutwidget.css");
+}
+
+/*!
+    Sets the menu content service id.
+*/
+void HsShortcutWidget::setCaEntryId(int caEntryId)
+{
+    mCaEntryId = caEntryId;
+}
+
+/*!
+    Returns the menu content service id.
+*/
+int HsShortcutWidget::caEntryId() const
+{
+    return mCaEntryId;
+}
+
+/*!
+    Sets the application's UID this shortcut points to.
+*/
+void HsShortcutWidget::setUid(const QString &uid)
+{
+    mUid = uid;
+}
+
+/*!
+    Returns the application's UID this shortcut points to.
+*/
+QString HsShortcutWidget::uid() const
+{
+    return mUid;
+}
+
+/*!
+    Returns the text property. This property is needed by css selector.
+*/
+QString HsShortcutWidget::text() const
+{
+    if ( mText ) {
+        return mText->text();
+    } else {
+        return QString();
+        }
+}
+
+/*!
+    Sets the text property. This property is needed by css selector.
+*/
+void HsShortcutWidget::setText(const QString& textItem)
+{
+    if ( mText ) {
+        mText->setText(textItem);
+    }
+}
+
+/*!
+    Initializes this widget.
+*/
+void HsShortcutWidget::onInitialize()
+{
+    QSharedPointer<CaEntry> caEntry;
+
+    if(-1 == mCaEntryId) {
+        //Shortcut can be pre installed to Homescreen's DB by setting
+        //application UID for its preference. Entry Id is retrieved
+        //from CA by UID.
+        CaQuery query;
+        query.setEntryTypeNames(QStringList(Hs::applicationTypeName));
+        //Convert UID from hex to ten base, because CA t UIDs in ten base.
+        bool ok;
+        int hexBaseInteger = mUid.toInt(&ok, 0); // Qt Assistant: If base is 0, the C language convention is used:
+                                             // If the string begins with "0x", base 16 is used.
+        QString tenBaseString = QString::number(hexBaseInteger);
+        query.setAttribute(Hs::applicationUidEntryKey, tenBaseString);
+        QList< QSharedPointer<CaEntry> > appEntries = CaService::instance()->getEntries(query);
+
+        //Verify that entry's UID is what we want since we get all application entries
+        //if UID did not match in getEntries() above.
+        if (!appEntries.isEmpty()
+            && appEntries.first()->attribute(Hs::applicationUidEntryKey) == tenBaseString) {
+            caEntry = appEntries.first();
+            mCaEntryId = caEntry->id();
+			//Save caEntryId to Homescreen database
+            emit setPreferences(QStringList() << QLatin1String("caEntryId"));
+        }
+    } else {
+        caEntry = CaService::instance()->getEntry(mCaEntryId);
+    }
+
+    if (!caEntry.isNull()) {
+        createCaNotifier();
+        updateContent(*caEntry.data());
+    } else {
+        emit finished();
+    }
+}
+
+/*!
+    Wakes up this widget.
+*/
+void HsShortcutWidget::onShow()
+{
+    updateVisibility();
+}
+
+/*!
+    Puts this widget in quiescent state.
+*/
+void HsShortcutWidget::onHide()
+{
+}
+
+/*!
+    \internal  
+*/
+#ifdef COVERAGE_MEASUREMENT
+#pragma CTC SKIP
+#endif //COVERAGE_MEASUREMENT
+void HsShortcutWidget::gestureEvent(QGestureEvent *event)
+{
+    HbTapGesture *gesture = qobject_cast<HbTapGesture *>(event->gesture(Qt::TapGesture));
+    if (gesture) {
+        switch (gesture->state()) {
+            case Qt::GestureStarted:
+                setBackgroundToPressed();
+                break;            
+            case Qt::GestureCanceled:
+                setBackgroundToNormal();
+                break;
+            case Qt::GestureFinished:
+                setBackgroundToNormal();
+                if (gesture->tapStyleHint() == HbTapGesture::Tap) {
+                    launch();
+                }
+                break;
+            default:
+                break;
+        }
+    }
+}
+#ifdef COVERAGE_MEASUREMENT
+#pragma CTC ENDSKIP
+#endif //COVERAGE_MEASUREMENT
+
+/*!
+    \internal
+*/
+void HsShortcutWidget::launch()
+{
+    HbInstantFeedback::play(HSCONFIGURATION_GET(shortcutWidgetTapFeedbackEffect));
+    
+    if (mCaEntryRole == ItemEntryRole) {
+        CaService::instance()->executeCommand(mCaEntryId);
+    } else {
+        HsShortcutService::instance()->executeCollectionAction(mCaEntryId, mCaEntryTypeName);
+    }
+}
+
+/*!
+    \internal
+*/
+void HsShortcutWidget::createPrimitives()
+{
+    // Background
+    if (!mBackground) {
+        HbFrameDrawer *drawer = new HbFrameDrawer(
+            QLatin1String("qtg_fr_hsshortcut_normal"), HbFrameDrawer::NinePieces);
+        mBackground = new HbFrameItem(drawer, this);
+        HbStyle::setItemName(mBackground, QLatin1String("background"));
+    }
+
+    // Icon
+    if (!mIcon) {
+        mIcon = new HbIconItem(this);
+        HbStyle::setItemName(mIcon, QLatin1String("icon"));
+    }
+
+    // Text
+    if (HSCONFIGURATION_GET(isShortcutLabelVisible) && !mText ) {
+        mText = new HbTextItem(this);
+        HbStyle::setItemName(mText, QLatin1String("text"));
+    }
+}
+
+/*!
+    \internal
+*/
+void HsShortcutWidget::updateContent(const CaEntry &caEntry)
+{
+    mCaEntryRole = caEntry.role();
+    mCaEntryFlags = caEntry.flags();
+    mCaEntryTypeName = caEntry.entryTypeName();
+    mIcon->setIcon(caEntry.makeIcon());
+    if (mText) {
+        if(caEntry.attribute(Hs::entryShortName).length()) {
+            mText->setText(caEntry.attribute(Hs::entryShortName));
+        } else {
+            mText->setText(caEntry.text());
+        }        
+    }
+}
+
+/*!
+    \internal
+*/
+void HsShortcutWidget::updateVisibility()
+{
+    setVisible(!mCaEntryFlags.testFlag(MissingEntryFlag));
+}
+
+/*!
+    \internal
+*/
+void HsShortcutWidget::setBackgroundToNormal()
+{
+    mBackground->frameDrawer().
+        setFrameGraphicsName(QLatin1String("qtg_fr_hsshortcut_normal"));
+}
+
+/*!
+    \internal
+*/
+void HsShortcutWidget::setBackgroundToPressed()
+{
+    mBackground->frameDrawer().
+        setFrameGraphicsName(QLatin1String("qtg_fr_hsitems_pressed"));
+}
+
+/*!
+    \internal
+*/
+void HsShortcutWidget::createCaNotifier()
+{
+    CaNotifierFilter filter;
+    filter.setIds(QList<int>() << mCaEntryId);
+
+    CaNotifier *notifier = CaService::instance()->createNotifier(filter);
+    notifier->setParent(this);
+
+    connect(notifier,
+        SIGNAL(entryChanged(CaEntry,ChangeType)),
+        SLOT(onEntryChanged(CaEntry,ChangeType)),
+        Qt::QueuedConnection);
+}
+
+/*!
+    \internal
+*/
+void HsShortcutWidget::onEntryChanged(const CaEntry &caEntry, ChangeType changeType)
+{
+    updateContent(caEntry);
+    updateVisibility();
+
+    if ( changeType == RemoveChangeType && !(caEntry.flags() & MissingEntryFlag)) {
+        //genuinely removed
+        emit finished();
+    }
+}