coreapplicationuis/devicepowermenuplugin/src/hbdevicepowermenuwidegt.cpp
changeset 48 2222076f5c60
child 49 76883296a0d5
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/coreapplicationuis/devicepowermenuplugin/src/hbdevicepowermenuwidegt.cpp	Wed Jun 23 18:22:59 2010 +0300
@@ -0,0 +1,481 @@
+/*
+ * Copyright (c) 2010 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:
+ *
+ */
+
+
+#include "hbdevicepowermenuwidegt_p.h"
+#include "hbdevicepowermenupluginerrors_p.h"
+#include <HbInstance.h>
+
+//resuorces
+QString POWER_MENU_DOCML(":/xml/powermenu.docml");
+QString VOLUME_DECREASE_ICON(":/images/decrement.svg");
+QString VOLUME_INCREASE_ICON(":/images/increment.svg");
+QString VOLUME_UNMUTE_ICON(":/images/unmuted.svg");
+QString VOLUME_MUTE_ICON(":/images/muted.svg");
+//For Localization
+QString LOCALE_PATH("/resource/qt/translations/"); 
+QString TS_FILE("power_menu");
+
+//Widget names
+QString MAIN_DLG("maindialog");
+QString PWR_SILENCE("Silence");
+QString PWR_VOLUME("Volume");
+QString PWR_VIBARTE("Vibrate");
+QString PWR_OFFLINE("Offline");
+QString PWR_POWEROFF("PowerOff");
+QString PWR_CONTAINER("container_1");
+
+//DO not modify these strings
+QString KVolumeLevel("VolumeLevel");
+QString KSilenceLatchOn("SilenceLatchOn");            //Used to latch silencebutton	
+QString KVibrationEnable("VibrationEnable");
+QString KOfflineEnable("OfflineEnable");
+QString KCypherOff("CypherOff");            //used to poweroffButtonEnabled/Disabled 		
+QString KShutDown("ShutDown");
+
+//Used for Orientation of PowerMenu
+qreal KVerticalX = 175;
+//width of PowerMenu
+qreal KPMWidth = 360;
+/**
+ * Constructor
+ */
+HbDevicePowerMenuWidget::HbDevicePowerMenuWidget(const QVariantMap &parameters)
+	:mDeviceDialogError(NoError), 
+	 mVolumeLevel(0),
+	 mShowVolume(false), 
+	 mVibrationChecked(true),
+	 mOfflineChecked(true),
+	 mSilencelatched(true), 
+	 mCypherOff(true),
+	 mDialogWidget(NULL),
+	 mSilenceButton(NULL),
+	 mVolumeSlider(NULL), 
+	 mVibarte(NULL),
+	 mOffline(NULL),
+	 mPowerOffButton(NULL),
+	 mLoader(NULL), 
+	 mHbTranslator(NULL)
+    {
+    // mMainWindow(NULL),
+	TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::Constructor:Begin") ) );
+    if (preConstructDialog())
+        {
+        //Translator loaded succesfully then olny construct widgets
+        constructDialog(parameters);
+        }
+    TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::Constructor:End") ) );
+    }
+    
+/**
+ * Destructor
+ */
+HbDevicePowerMenuWidget::~HbDevicePowerMenuWidget()
+    {
+    TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::Destructor()") ) );
+	delete mLoader;
+	delete mHbTranslator;
+    }
+
+/**
+ * Implementation of HbDeviceDialogInterface method
+ * sets parameters of custom widget
+ */
+bool HbDevicePowerMenuWidget::setDeviceDialogParameters(const QVariantMap &parameters)
+	{
+	TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::setDeviceDialogParameters:Begin") ) );
+ 	if(parameters.contains(KVolumeLevel))
+		{
+		mVolumeLevel = parameters.value(KVolumeLevel).toInt();
+		}
+	if(parameters.contains(KSilenceLatchOn))
+		{
+		mSilencelatched = parameters.value(KSilenceLatchOn).toBool();
+		//If SilenceMode is Enabled then MasterVolume control is Disabled 
+		mShowVolume = mSilencelatched? false:true;
+		}
+	if(parameters.contains(KVibrationEnable))
+		{
+		mVibrationChecked = parameters.value(KVibrationEnable).toBool();
+		}
+	if(parameters.contains(KOfflineEnable))
+		{
+		mOfflineChecked = parameters.value(KOfflineEnable).toBool();
+		}
+	if(parameters.contains(KCypherOff))
+		{
+		mCypherOff = parameters.value(KCypherOff).toBool();
+		}
+    TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::setDeviceDialogParameters:End") ) );
+	return true;
+	}
+
+/**
+ * Returns error code
+ */
+int HbDevicePowerMenuWidget::deviceDialogError() const
+	{
+	TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::deviceDialogError") ) );
+	return mDeviceDialogError;
+	}
+
+/**
+ * Close DeviceDialog
+ */
+void HbDevicePowerMenuWidget::closeDeviceDialog(bool byClient)
+	{
+	TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::closeDeviceDialog:Begin") ) );
+    Q_UNUSED(byClient);
+    TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::closeDeviceDialog:End") ) );
+    mDialogWidget->close();
+	}
+
+/**
+ * Implementation of HbDeviceDialogInterface method
+ */
+HbPopup* HbDevicePowerMenuWidget::deviceDialogWidget() const
+	{
+	TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::deviceDialogWidget") ) );
+	return mDialogWidget;
+	}
+
+/**
+ * Implementation of HbDeviceDialogInterface method
+ * to get signals from action events
+ */
+QObject* HbDevicePowerMenuWidget::signalSender() const
+    {
+    TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::signalSender") ) );
+    return const_cast<HbDevicePowerMenuWidget*>(this);
+    }
+
+/**
+ * Before loading docml and widgets Translator must be loaded
+ */
+bool HbDevicePowerMenuWidget::preConstructDialog()
+    {
+    TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::preConstructDialog:Begin") ) );
+    //Translator
+    mHbTranslator = new HbTranslator(LOCALE_PATH,TS_FILE);
+    if(!mHbTranslator)
+        {
+        //Translator is failed to create
+        mDeviceDialogError = UnknownDeviceDialogError;
+        TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::preConstructDialog:MemoryAllocation Failed") ) );
+        return false;
+        }
+    TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::preConstructDialog:End") ) );
+    return true;
+    }
+
+/**
+ * Constrcuts customized widget dialog by loading the UI from docml and
+ * initializes all parameters and attributes.
+ * Throws bad-memory on Un-succesful memory allocations
+ */
+void HbDevicePowerMenuWidget::constructDialog(const QVariantMap &parameters)
+	{
+	TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::constructDialog:Begin") ) );
+	bool dialogLoaded(false);
+	//Docml loader
+	mLoader = new HbDocumentLoader();
+	if(!mLoader)
+	    {
+        //Document Loader failed to create
+        mDeviceDialogError = UnknownDeviceDialogError;
+        cleanupMemory();
+        TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::constructDialog:mLoader::MemoryAllocation Failed") ) );        
+        return;
+	    }
+	mLoader->load(POWER_MENU_DOCML, &dialogLoaded);
+	Q_ASSERT_X(dialogLoaded, "HbDevicePowerMenuWidget", "Invalid xml file");
+	//Widgets
+	if (dialogLoaded)
+		{
+        //Dialog loaded succesfully from docml
+		TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::constructDialog:dialogLoaded:Begin") ) );
+        
+		//Initialize Parameters received
+        setDeviceDialogParameters(parameters);
+		mDialogWidget = qobject_cast <HbDialog *>(mLoader->findWidget(MAIN_DLG));
+		//Find the handles for all widget items
+		mSilenceButton = qobject_cast <HbPushButton *>(mLoader->findWidget(PWR_SILENCE));
+		mVolumeSlider = qobject_cast <HbSlider *>(mLoader->findWidget(PWR_VOLUME));
+		mVibarte = qobject_cast <HbCheckBox *>(mLoader->findWidget(PWR_VIBARTE));
+		mOffline = qobject_cast <HbCheckBox *>(mLoader->findWidget(PWR_OFFLINE));
+		mPowerOffButton = qobject_cast <HbPushButton *>(mLoader->findWidget(PWR_POWEROFF));	
+		QGraphicsWidget *widget(NULL);
+		widget = mLoader->findWidget(PWR_CONTAINER);
+		if (!(IsValidHandles()&&(widget)))
+		    {
+            //Atleast, One of the Handles are not allocated memory
+            mDeviceDialogError = UnknownDeviceDialogError;
+            cleanupMemory();
+            TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::constructDialog:Widgets::MemoryAllocation Failed") ) );            
+            return;
+		    }
+		//Sets Speaker icon
+        setSpeakerIcon();
+		//Customize slider to VolumeSlider
+		customizeVolumeSlider();
+		mDialogWidget->setContentWidget(widget);
+		//SetWidget Attributes
+		//1. Volume 
+	    mVolumeSlider->setSliderPosition(mVolumeLevel);
+	    mVolumeSlider->setEnabled(mShowVolume);
+	    //This will avoid IPC calls while dragging the Slider
+	    mVolumeSlider->setTracking(false);
+	    bool ok = connect(mVolumeSlider,SIGNAL(valueChanged(int)) , this , SLOT(handleVolumeChanged(int)));
+        Q_ASSERT_X(ok, "VolumeSlider", "Invalid IncrementDecrement Change");
+
+		//2.Silence Mode
+		mSilenceButton->setDown(mSilencelatched);
+		ok = connect(mSilenceButton,SIGNAL(clicked(bool)) , this , SLOT(handleSilenceMode(bool)));
+	    Q_ASSERT_X(ok, "SilenceButton", "Invalid Clicked");
+
+	    //3.Master Vibration
+	    mVibarte->setChecked(mVibrationChecked);
+	    ok = connect(mVibarte,SIGNAL(stateChanged(int)) , this , SLOT(handleVibrationToggled(int)));
+		Q_ASSERT_X(ok, "Vibrator", "Invalid Vibrator Toggeld");
+		
+		//4.Offline
+	    mOffline->setChecked(mOfflineChecked);
+	    ok = connect(mOffline,SIGNAL(stateChanged(int)) , this , SLOT(handleOfflineToggled(int)));
+		Q_ASSERT_X(ok, "Vibrator", "Invalid Offline Toggeld");  
+		
+		//5.Power off
+		mPowerOffButton->setEnabled(mCypherOff);
+		ok = connect(mPowerOffButton,SIGNAL(clicked(bool)) , this , SLOT(handlePowerOff(bool)));
+	    Q_ASSERT_X(ok, "PowerOffButton", "Invalid Clicked");	  
+	    
+        //Dialog dismiss only with Tap outside
+        mDialogWidget->setTimeout(HbPopup::NoTimeout);
+        mDialogWidget->setDismissPolicy(HbPopup::TapOutside);
+        mDialogWidget->setPreferredWidth(KPMWidth);
+        //Sets Dialog position on screen
+/*        
+        HbInstance* instance = HbInstance::instance();
+        mMainWindow = instance->allMainWindows().first();
+        ok = connect(mMainWindow , SIGNAL(orientationChanged(Qt::Orientation)), this, SLOT(setDialogWidget(Qt::Orientation)));
+        //This is required to launch menu in right place for very first time
+        setDialogWidget(mMainWindow->orientation());
+        
+        Q_ASSERT_X(ok, "Orientation", "Invalid Orientation");
+*/
+        connect(mDialogWidget,SIGNAL(aboutToClose()),this, SLOT(closedialog()));
+        
+	    TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::constructDialog:dialogLoaded:End") ) );
+		}
+    TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::constructDialog:End") ) );
+	}
+
+/**
+ * Checks whether all Hadles for widgets DialogWidget, 
+ * SilenceButton, Vibrate, Offline and Poweroff Button allocated memory.
+ * Returns True, if all Handles allocated memory.
+ * Flase, atleast one of them NOT allocated memory.
+ */
+bool HbDevicePowerMenuWidget::IsValidHandles()
+    {
+    if((!mDialogWidget) || (!mSilenceButton) || (!mVolumeSlider)||(!mVibarte) || (!mOffline) || (!mPowerOffButton))
+        {
+        return false;
+        }
+    else{
+        //All handles are allocated memory
+        return true;
+        }
+    }
+
+/**
+ * Sets Mute/Unmute icon for Volume slider
+ * Mute/Unmute icon to display the current status of Silence Mode.
+ * Mute icon dispalyed when Device in Silence mode.
+ * Unmute icon dispalyed when Device Non-Silence mode. 
+ */
+void HbDevicePowerMenuWidget::setSpeakerIcon()
+	{
+	TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::setSpeakerIcon:Begin") ) );
+	QString speakerIcon= ( mSilencelatched )? VOLUME_MUTE_ICON : VOLUME_UNMUTE_ICON ;
+	mVolumeSlider->setElementIcon(HbSlider:: IconElement,HbIcon(speakerIcon));
+    TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::setSpeakerIcon:End") ) );
+	}
+
+
+/**
+ * Customizes the slider to Vloume Slider 
+ */
+void HbDevicePowerMenuWidget::customizeVolumeSlider()
+	{
+	TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::customizeVolumeSlider:Begin") ) );
+	//Construct Volume Slider from the HbSlider
+	mVolumeSlider->setSliderElements(QList<QVariant>()
+                                        << HbSlider::DecreaseElement 
+                                        << HbSlider::TrackElement
+                                        << HbSlider::IncreaseElement
+                                        << HbSlider::IconElement     );
+	
+	// To set DecreaseIcon and IncreseIcon
+	mVolumeSlider->setElementIcon(HbSlider::DecreaseElement, HbIcon(VOLUME_DECREASE_ICON));
+	mVolumeSlider->setElementIcon(HbSlider:: IncreaseElement, HbIcon(VOLUME_INCREASE_ICON));
+    //set Range of volume
+	mVolumeSlider->setRange(1,10);
+    TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::customizeVolumeSlider:End") ) );
+	}
+
+/**
+ * Widget is about to hide. 
+ * This method is dervied from HBpopUp
+ * 
+ */
+void HbDevicePowerMenuWidget::hideEvent(QHideEvent *event)
+	{
+	TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::hideEvent:Begin") ) );
+    Q_UNUSED(event);
+    //emit deviceDialogClosed();
+    TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::hideEvent:End") ) );
+	}
+
+void HbDevicePowerMenuWidget::closedialog()
+    {
+    TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::closedialog:Begin") ) );
+    emit deviceDialogClosed();
+    TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::closedialog:Begin") ) );
+    }
+/**
+ * Widget is about to show
+ * This method is dervied from HBpopUp
+ */
+void HbDevicePowerMenuWidget::showEvent(QShowEvent *event)
+	{
+	TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::showEvent") ) );
+    Q_UNUSED(event);
+	}
+
+/**
+ * Slot
+ */
+void HbDevicePowerMenuWidget::handleVolumeChanged(int aVolume)
+    {
+    TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::handleVolumeChanged:Begin") ) );
+    mVolumeLevel = aVolume;
+    //inform the client may be through data changed etc.
+    QVariantMap mDataToSend;
+    QVariant volume(mVolumeLevel);
+    mDataToSend.insert(KVolumeLevel, volume);
+    emit deviceDialogData(mDataToSend);
+    TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::handleVolumeChanged:Begin") ) );
+    }
+
+/**
+ * Slot
+ * Switch between the states to latch down and latch up.
+ * In case of Silence mode, The Silence button id latched down and Disables Volume control.
+ * In case of Non-Silence mode, The Silence button id latched Up and enables Volume control.
+ */
+void HbDevicePowerMenuWidget::handleSilenceMode(bool aState)
+	{
+	TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::handleSilenceMode:Begin") ) );
+	Q_UNUSED(aState);
+	mShowVolume = !(mShowVolume);
+	mSilencelatched = !(mSilencelatched);
+	mSilenceButton->setDown(mSilencelatched);
+	mVolumeSlider->setEnabled(mShowVolume);	
+    setSpeakerIcon();
+	//inform the client may be through data changed etc.
+    QVariantMap mDataToSend;
+    QVariant silence(mSilencelatched);
+    mDataToSend.insert(KSilenceLatchOn, silence);
+    emit deviceDialogData(mDataToSend);
+    TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::handleSilenceMode:End") ) );
+	}
+
+/**
+ * Slot
+ */
+void HbDevicePowerMenuWidget::handlePowerOff(bool aState)
+	{
+	TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::handlePowerOff:Begin") ) );
+	Q_UNUSED(aState);
+    QVariantMap mDataToSend;
+    QVariant shutdown(true);
+    mDataToSend.insert(KShutDown, shutdown);
+    emit deviceDialogData(mDataToSend);
+    emit deviceDialogClosed();
+    TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::handlePowerOff:End") ) );
+	}
+
+/**
+ * Slot
+ */
+void HbDevicePowerMenuWidget::handleOfflineToggled(int aOfflineToggel)
+	{
+	TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::handleOfflineToggled:Begin") ) );
+	mOfflineChecked = aOfflineToggel;
+    QVariantMap mDataToSend;
+    QVariant offline(mOfflineChecked);
+    mDataToSend.insert(KOfflineEnable, offline);
+    emit deviceDialogData(mDataToSend);
+    TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::handleOfflineToggled:End") ) );
+	}
+
+/**
+ * Slot
+ */
+void HbDevicePowerMenuWidget::handleVibrationToggled(int aVibrationToggel)
+	{
+	TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::handleVibrationToggled:Begin") ) );
+	mVibrationChecked = aVibrationToggel;
+    QVariantMap mDataToSend;
+    QVariant vibration(mVibrationChecked);
+    mDataToSend.insert(KVibrationEnable, vibration);
+    emit deviceDialogData(mDataToSend);
+    TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::handleVibrationToggled:End") ) );
+	}
+
+void HbDevicePowerMenuWidget::cleanupMemory()
+    {
+    TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::cleanupMemory:Begin") ) );
+    if(mLoader)
+        {
+        delete mLoader;
+        }
+    if(mHbTranslator)
+        {
+        delete mHbTranslator;    
+        }
+    TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::cleanupMemory:End") ) );
+    }
+
+/**
+ * Slot
+ * Sets Dialog position on screen
+ */
+/*void HbDevicePowerMenuWidget::setDialogWidget(Qt::Orientation aOrientation)
+    {
+    TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::setDialogWidget:Begin") ) );
+    if (aOrientation == Qt::Vertical)
+        {
+        mDialogWidget->setPreferredPos(QPointF(0,0),HbPopup::TopLeftCorner);
+        }
+    else
+        {
+        mDialogWidget->setPreferredPos(QPointF(KVerticalX,0),HbPopup::TopLeftCorner);
+        }
+    TRACES( RDebug::Print( _L("HbDevicePowerMenuWidget::setDialogWidget:End") ) );
+    }*/
+