homescreenapp/widgetplugins/hsclockwidgetplugin/src/hsclockwidget.cpp
branchRCL_3
changeset 82 5f0182e07bfb
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/homescreenapp/widgetplugins/hsclockwidgetplugin/src/hsclockwidget.cpp	Tue Aug 31 15:06:34 2010 +0300
@@ -0,0 +1,228 @@
+/*
+* 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:  Clock widget
+*
+*/
+
+#include <QTimer>
+#include <QGraphicsLinearLayout>
+
+#include "hsclockwidget.h"
+#include "hsclockwidgettimer.h"
+#include "hsanalogclockwidget.h"
+#include "hsdigitalclockwidget.h"
+
+#ifdef Q_OS_SYMBIAN    
+#include "hsclocksettingsnotifier_symbian.h"
+#include <apgtask.h>
+#include <eikenv.h>
+#endif //Q_OS_SYMBIAN
+
+namespace
+{
+    const char ANALOG[] = "analog";
+    const char DIGITAL[] = "digital";
+    const char TIME12[] = "TIME12";
+    const char TIME24[] = "TIME24";
+
+    const int clockUpdateInterval = 1000; // msec
+}
+
+#ifdef Q_OS_SYMBIAN
+#define KClockAppUid TUid::Uid(0x10005903)
+_LIT (KClockAppExe, "clock.exe");
+#endif //Q_OS_SYMBIAN
+
+/*!
+    \class HsClockWidget
+    \ingroup group_hsclockwidgetplugin
+    \brief Implementation for the homescreen clock widget.
+*/
+
+/*!
+    Constructs widget.
+*/
+HsClockWidget::HsClockWidget(QGraphicsItem *parent, Qt::WindowFlags flags)
+  : HbWidget(parent, flags),
+    mWidget(0),
+    mLayout(0),
+    mClockType(ANALOG),
+    mTimeType(TIME12)
+{
+#ifdef Q_OS_SYMBIAN    
+    mClockSettingsNotifier = new HsClockSettingsNotifier(this);
+    mClockType = mClockSettingsNotifier->clockFormat();
+    mTimeType = mClockSettingsNotifier->timeFormat();
+#endif
+}
+
+/*!
+    Destructor.
+*/
+HsClockWidget::~HsClockWidget()
+{
+}
+
+/*!
+    Return shape
+*/
+QPainterPath HsClockWidget::shape() const
+{
+    return mWidget->shape();
+}
+
+/*!
+    Initializes this widget.
+*/
+void HsClockWidget::onInitialize()
+{
+    mLayout = new QGraphicsLinearLayout(Qt::Vertical);
+    mLayout->setContentsMargins(0, 0, 0, 0);
+    mWidget = loadClockWidget();
+    mLayout->addItem(mWidget);           
+    setLayout(mLayout);
+#ifdef Q_OS_SYMBIAN  
+    connect(mClockSettingsNotifier, SIGNAL(settingsChanged(QString, QString)), this, SLOT(onSettingsChanged(QString, QString)));
+#endif    
+
+}
+
+/*!
+    Shows this widget.
+*/
+void HsClockWidget::onShow()
+{    
+    HsClockWidgetTimer::instance();
+    connect(HsClockWidgetTimer::instance(), 
+        SIGNAL(tick()), 
+        SLOT(updateTime()), 
+        Qt::UniqueConnection);
+}
+
+
+/*!
+    Hides this widget.
+*/
+void HsClockWidget::onHide()
+{
+    HsClockWidgetTimer::instance()->disconnect(this);
+}
+
+/*!
+    Uninitializes this widget.
+*/
+void HsClockWidget::onUninitialize()
+{
+    HsClockWidgetTimer::instance()->disconnect(this);
+}
+
+/*!
+    Draws the clock with every second.
+*/
+void HsClockWidget::updateTime()
+{
+    if (mClockType == DIGITAL) {
+        static_cast<HsDigitalClockWidget*>(mWidget)->tick();
+    } else {
+        static_cast<HsAnalogClockWidget*>(mWidget)->tick();
+    }
+}
+
+/*!
+    \internal
+*/
+void HsClockWidget::onSettingsChanged(const QString &clockFormat, const QString &timeFormat)
+{
+    if (mClockType != clockFormat) {        
+        mClockType = clockFormat;
+        mLayout->removeItem(mWidget);
+        delete mWidget;
+        mWidget = 0;
+        mWidget = loadClockWidget();
+        mLayout->addItem(mWidget);        
+    }    
+    
+    if (mTimeType != timeFormat) {
+        mTimeType = timeFormat;
+        if (mClockType == DIGITAL) {
+            if (mTimeType == TIME12) {
+                static_cast<HsDigitalClockWidget*>(mWidget)->setAmPm(true);
+            } else {
+            static_cast<HsDigitalClockWidget*>(mWidget)->setAmPm(false);
+            }    
+        }
+    }
+}
+
+/*!
+    Clock tapped.
+*/
+void HsClockWidget::onClockTapped()
+{
+#ifndef Q_OS_SYMBIAN
+    if (mClockType == ANALOG) {
+        mClockType = DIGITAL;
+        if (mTimeType == TIME12) {
+            mTimeType = TIME24;
+        } else {
+            mTimeType = TIME12;
+        }    
+    } else {
+        mClockType = ANALOG;
+    }
+    mLayout->removeItem(mWidget);
+    delete mWidget;
+    mWidget = 0;
+    mWidget = loadClockWidget();
+    mLayout->addItem(mWidget); 
+    updateTime();
+#else //Q_OS_SYMBIAN
+    TApaTaskList taskList(CEikonEnv::Static()->WsSession());    
+    TApaTask task = taskList.FindApp(KClockAppUid);    
+    if (task.Exists()){
+        task.BringToForeground();
+    }    
+    else {
+        RProcess process;
+        TInt error = process.Create(KClockAppExe, KNullDesC, EOwnerThread);
+    
+        if (error == KErrNone){
+            // start the process running.
+            process.Resume();
+            process.Close();
+        }
+    }
+#endif //Q_OS_SYMBIAN   
+}
+
+/*!
+    Loads the digital or analog clock widget.
+*/
+HbWidget *HsClockWidget::loadClockWidget()
+{
+    HbWidget *clockWidget = 0;
+
+    if (mClockType == DIGITAL) {
+        bool useAmPm = true;
+        if (mTimeType == TIME24) {
+            useAmPm = false;
+        }   
+        clockWidget = new HsDigitalClockWidget(useAmPm);
+    } else {
+        clockWidget = new HsAnalogClockWidget();
+    }
+
+    connect(clockWidget, SIGNAL(clockTapped()), this, SLOT(onClockTapped()), Qt::QueuedConnection);
+    return clockWidget;
+}