--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/appinstaller/AppinstUi/sifuidevicedialogplugin/src/sifuidialogcontentwidget.cpp Fri Apr 16 15:05:20 2010 +0300
@@ -0,0 +1,475 @@
+/*
+* 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: Software install notification content widget.
+*
+*/
+
+#include "sifuidialogcontentwidget.h"
+#include <QGraphicsLinearLayout>
+#include <hbstackedwidget.h>
+#include <hblabel.h>
+#include <hbpushbutton.h>
+#include <hbcombobox.h>
+#include <hbprogressbar.h>
+#include <QPixmap>
+#include <QDir>
+#include <QFileInfoList>
+#if defined(Q_OS_SYMBIAN)
+#include <fbs.h> // CFbsBitmap
+#endif // Q_OS_SYMBIAN
+
+// See definitions in sifuidevicedialogplugin.qrc
+const char KSifUiDialogIconAppDefault[] = ":/default_app_icon.svg";
+
+const int KAppNameIndex = 0;
+const int KAppSizeIndex = 1;
+
+
+// ======== LOCAL FUNCTIONS ========
+
+// ----------------------------------------------------------------------------
+// fbsBitmap()
+// ----------------------------------------------------------------------------
+//
+CFbsBitmap *fbsBitmap(int handle)
+{
+ CFbsBitmap *bitmap = 0;
+#if defined(Q_OS_SYMBIAN)
+ bitmap = new CFbsBitmap;
+ if (bitmap) {
+ if (!bitmap->Duplicate(handle)) {
+ delete bitmap;
+ bitmap = 0;
+ }
+ }
+#endif // Q_OS_SYMBIAN
+ return bitmap;
+}
+
+
+// ======== MEMBER FUNCTIONS ========
+
+// ----------------------------------------------------------------------------
+// SifUiDialogContentWidget::SifUiDialogContentWidget()
+// ----------------------------------------------------------------------------
+//
+SifUiDialogContentWidget::SifUiDialogContentWidget(QGraphicsItem *parent,
+ Qt::WindowFlags flags) : HbWidget(parent, flags),
+ mAppIcon(0), mAppName(0), mAppSize(0),
+ mMainLayout(0), mAppDetailsLayout(0), mStackedWidget(0),
+ mMemorySelection(0), mProgressBar(0), mErrorText(0),
+ mBitmap(0), mMask(0)
+{
+}
+
+// ----------------------------------------------------------------------------
+// SifUiDialogContentWidget::~SifUiDialogContentWidget()
+// ----------------------------------------------------------------------------
+//
+SifUiDialogContentWidget::~SifUiDialogContentWidget()
+{
+ delete mBitmap;
+ delete mMask;
+}
+
+// ----------------------------------------------------------------------------
+// SifUiDialogContentWidget::constructFromParameters()
+// ----------------------------------------------------------------------------
+//
+void SifUiDialogContentWidget::constructFromParameters(const QVariantMap ¶meters)
+{
+ Q_ASSERT(mMainLayout == 0);
+ mMainLayout = new QGraphicsLinearLayout(Qt::Vertical);
+
+ // Application icon
+ QGraphicsLinearLayout *iconAndAppLayout = new QGraphicsLinearLayout(Qt::Horizontal);
+ Q_ASSERT(mAppIcon == 0);
+ mAppIcon = new HbLabel;
+ updateAppIcon(parameters);
+ iconAndAppLayout->addItem(mAppIcon);
+
+ // Application name and version
+ Q_ASSERT(mAppDetailsLayout == 0);
+ mAppDetailsLayout = new QGraphicsLinearLayout(Qt::Vertical);
+ Q_ASSERT(mAppName == 0);
+ mAppName = new HbLabel(applicationName(parameters));
+ mAppDetailsLayout->addItem(mAppName);
+
+ // Application size
+ Q_ASSERT(mAppSize == 0);
+ updateAppSize(parameters);
+
+ // Other application details
+ if (parameters.contains(KSifUiApplicationDetails)) {
+ addDetails(parameters.value(KSifUiApplicationDetails).toStringList());
+ }
+ iconAndAppLayout->addItem(mAppDetailsLayout);
+ mMainLayout->addItem(iconAndAppLayout);
+
+ // Memory selection, progress bar, and error text within a stacked widget
+ Q_ASSERT(mStackedWidget == 0);
+ mStackedWidget = new HbStackedWidget;
+
+ Q_ASSERT(mMemorySelection == 0);
+ mMemorySelection = new HbComboBox;
+ connect(mMemorySelection, SIGNAL(currentIndexChanged(const QString &)),
+ this, SIGNAL(memorySelectionChanged(const QString &)));
+ mStackedWidget->addWidget(mMemorySelection);
+
+ Q_ASSERT(mProgressBar == 0);
+ mProgressBar = new HbProgressBar;
+ mProgressBar->setRange(0,0); // busy indicator by default
+ mStackedWidget->addWidget(mProgressBar);
+
+ Q_ASSERT(mErrorText == 0);
+ mErrorText = new HbLabel;
+ mStackedWidget->addWidget(mErrorText);
+
+ mMainLayout->addItem(mStackedWidget);
+ updateMemorySelection(parameters);
+ updateProgressBar(parameters);
+ updateErrorText(parameters);
+
+ setLayout(mMainLayout);
+ }
+
+// ----------------------------------------------------------------------------
+// SifUiDialogContentWidget::updateFromParameters()
+// ----------------------------------------------------------------------------
+//
+void SifUiDialogContentWidget::updateFromParameters(const QVariantMap ¶meters)
+{
+ // Application icon
+ updateAppIcon(parameters);
+
+ // Application name and version
+ if (parameters.contains(KSifUiApplicationName)) {
+ QString appNameStr = applicationName(parameters);
+ if (mAppName) {
+ if (mAppName->plainText() != appNameStr) {
+ mAppName->setPlainText(appNameStr);
+ }
+ } else {
+ HbLabel *appName = new HbLabel(appNameStr);
+ mAppDetailsLayout->insertItem(KAppNameIndex, appName);
+ mAppName = appName;
+ }
+ }
+
+ // Application size
+ updateAppSize(parameters);
+
+ // Other application details
+ if (parameters.contains(KSifUiApplicationDetails)) {
+ removeDetails();
+ addDetails(parameters.value(KSifUiApplicationDetails).toStringList());
+ }
+
+ // Stacked widgets: memory selection, progress bar and error text
+ updateMemorySelection(parameters);
+ updateProgressBar(parameters);
+ updateErrorText(parameters);
+}
+
+// ----------------------------------------------------------------------------
+// SifUiDialogContentWidget::changeType()
+// ----------------------------------------------------------------------------
+//
+void SifUiDialogContentWidget::changeType(SifUiDeviceDialogType type)
+{
+ switch (type) {
+ case SifUiConfirmationQuery:
+ mStackedWidget->setCurrentWidget(mMemorySelection);
+ break;
+ case SifUiProgressNote:
+ mStackedWidget->setCurrentWidget(mProgressBar);
+ break;
+ case SifUiCompleteNote:
+ // TODO: remove mStackedWidget?
+ break;
+ case SifUiErrorNote:
+ mStackedWidget->setCurrentWidget(mErrorText);
+ break;
+ default:
+ break;
+ }
+}
+
+// ----------------------------------------------------------------------------
+// SifUiDialogContentWidget::applicationName()
+// ----------------------------------------------------------------------------
+//
+QString SifUiDialogContentWidget::applicationName() const
+{
+ if (mAppName) {
+ return mAppName->plainText();
+ }
+ return QString();
+}
+
+// ----------------------------------------------------------------------------
+// SifUiDialogContentWidget::isDefaultIconUsed()
+// ----------------------------------------------------------------------------
+//
+bool SifUiDialogContentWidget::isDefaultIconUsed() const
+{
+ return (mBitmap != 0 && mMask != 0);
+}
+
+// ----------------------------------------------------------------------------
+// SifUiDialogContentWidget::iconHandles()
+// ----------------------------------------------------------------------------
+//
+void SifUiDialogContentWidget::iconHandles(int &iconHandle, int &maskHandle) const
+{
+ if (mBitmap && mMask) {
+ iconHandle = mBitmap->Handle();
+ maskHandle = mMask->Handle();
+ }
+}
+
+// ----------------------------------------------------------------------------
+// SifUiDialogContentWidget::progressInfo()
+// ----------------------------------------------------------------------------
+//
+void SifUiDialogContentWidget::progressInfo(int &finalValue, int ¤tValue) const
+{
+ if (mProgressBar) {
+ finalValue = mProgressBar->maximum();
+ currentValue = mProgressBar->progressValue();
+ }
+}
+
+// ----------------------------------------------------------------------------
+// SifUiDialogContentWidget::applicationName()
+// ----------------------------------------------------------------------------
+//
+QString SifUiDialogContentWidget::applicationName(const QVariantMap ¶meters)
+{
+ QString appName = "";
+ if (parameters.contains(KSifUiApplicationName)) {
+ QString nameParam = parameters.value(KSifUiApplicationName).toString();
+ if (parameters.contains(KSifUiApplicationVersion)) {
+ QString versionParam = parameters.value(KSifUiApplicationVersion).toString();
+ //: Template for application name and version in SW install confirmation query.
+ //: %1 is the application name and %2 is the version number.
+ //: Version number consist of major, minor, and build numbers.
+ //: For example: "Chess (v 1.01(123))".
+ // TODO: enable when translations ready
+ //appName = hbTrId("txt_sisxui_install_appname_version").arg(nameParam, versionParam);
+ appName = tr("%1 (v %2)").arg(nameParam, versionParam);
+ } else {
+ appName = nameParam;
+ }
+ }
+ return appName;
+}
+
+// ----------------------------------------------------------------------------
+// SifUiDialogContentWidget::applicationSize()
+// ----------------------------------------------------------------------------
+//
+QString SifUiDialogContentWidget::applicationSize(const QVariantMap ¶meters)
+{
+ QString appSize = "";
+ if (parameters.contains(KSifUiApplicationSize)) {
+ uint size = parameters.value(KSifUiApplicationSize).toUInt();
+ if (size > 0) {
+ if (size > KMega) {
+ //: Application size in SW install confirmation query, %1 is in megabytes
+ // TODO: enable when translations ready
+ //appSize = hbTrId("txt_sisxui_install_appsize_mb").arg(size/KMega);
+ appSize = tr("Size: %1 MB").arg(size/KMega);
+ } else if(size > KKilo) {
+ //: Application size in SW install confirmation query, %1 is in kilobytes
+ // TODO: enable when translations ready
+ //appSize = hbTrId("txt_sisxui_install_appsize_kb").arg(size/KKilo);
+ appSize = tr("Size: %1 kB").arg(size/KKilo);
+ } else {
+ //: Application size in SW install confirmation query, %1 is in bytes
+ // TODO: enable when translations ready
+ //appSize = hbTrId("txt_sisxui_install_appsize_b").arg(size);
+ appSize = tr("Size: %1 B").arg(size);
+ }
+ }
+ }
+ return appSize;
+}
+
+// ----------------------------------------------------------------------------
+// SifUiDialogContentWidget::removeDetails()
+// ----------------------------------------------------------------------------
+//
+void SifUiDialogContentWidget::removeDetails()
+{
+ int firstDetailsItemIndex = ( mAppName ? 1 : 0 ) + ( mAppSize ? 1 : 0 );
+ QGraphicsLayoutItem *item = 0;
+ for (int i = 0; i < mAppDetailsLayout->count(); ++i) {
+ if (i >= firstDetailsItemIndex) {
+ item = mAppDetailsLayout->itemAt(i);
+ mAppDetailsLayout->removeAt(i);
+ delete item;
+ item = 0;
+ }
+ }
+}
+
+// ----------------------------------------------------------------------------
+// SifUiDialogContentWidget::addDetails()
+// ----------------------------------------------------------------------------
+//
+void SifUiDialogContentWidget::addDetails(const QStringList &detailList)
+{
+ QStringListIterator detailsIter(detailList);
+ while (detailsIter.hasNext())
+ {
+ addDetail(detailsIter.next());
+ }
+}
+
+// ----------------------------------------------------------------------------
+// SifUiDialogContentWidget::addDetail()
+// ----------------------------------------------------------------------------
+//
+void SifUiDialogContentWidget::addDetail(const QString &detailText)
+{
+ Q_ASSERT(mAppDetailsLayout != 0);
+ HbLabel *detailItem = new HbLabel(detailText);
+ mAppDetailsLayout->addItem(detailItem);
+}
+
+// ----------------------------------------------------------------------------
+// SifUiDialogContentWidget::updateAppIcon()
+// ----------------------------------------------------------------------------
+//
+void SifUiDialogContentWidget::updateAppIcon(const QVariantMap ¶meters)
+{
+ Q_ASSERT(mAppIcon != 0);
+ if (parameters.contains(KSifUiApplicationIconHandle) &&
+ parameters.contains(KSifUiApplicationIconMaskHandle)) {
+ int iconHandle = parameters.value(KSifUiApplicationIconHandle).toInt();
+ int maskHandle = parameters.value(KSifUiApplicationIconMaskHandle).toInt();
+ QPixmap pixmap;
+ delete mBitmap;
+ mBitmap = fbsBitmap(iconHandle);
+ delete mMask;
+ mMask = fbsBitmap(maskHandle);
+ if (mBitmap && mMask) {
+ pixmap = QPixmap::fromSymbianCFbsBitmap(mBitmap);
+ pixmap.setAlphaChannel(QPixmap::fromSymbianCFbsBitmap(mMask));
+ }
+ mAppIcon->setIcon(HbIcon(pixmap));
+ } else {
+ if (mAppIcon->icon().isNull()) {
+ mAppIcon->setIcon(HbIcon(KSifUiDialogIconAppDefault));
+ }
+ }
+}
+
+// ----------------------------------------------------------------------------
+// SifUiDialogContentWidget::updateAppSize()
+// ----------------------------------------------------------------------------
+//
+void SifUiDialogContentWidget::updateAppSize(const QVariantMap ¶meters)
+{
+ if (parameters.contains(KSifUiApplicationSize)) {
+ QString appSizeStr = applicationSize(parameters);
+ if (appSizeStr.length() > 0) {
+ if (mAppSize) {
+ if (mAppSize->plainText() != appSizeStr) {
+ mAppSize->setPlainText(appSizeStr);
+ }
+ } else {
+ HbLabel *appSize = new HbLabel(appSizeStr);
+ mAppDetailsLayout->insertItem(KAppSizeIndex, appSize);
+ mAppSize = appSize;
+ }
+ }
+ }
+}
+
+// ----------------------------------------------------------------------------
+// SifUiDialogContentWidget::updateMemorySelection()
+// ----------------------------------------------------------------------------
+//
+void SifUiDialogContentWidget::updateMemorySelection(const QVariantMap ¶meters)
+{
+ if (parameters.contains(KSifUiMemorySelection)) {
+
+ // TODO: get user visible drives, icons for them, and free sizes
+ // it might be better to get this list from Symbian-side via SifUi API
+ QStringList driveList;
+ QFileInfoList driveInfoList = QDir::drives();
+ foreach(const QFileInfo &driveInfo, driveInfoList) {
+ const QChar driveName = driveInfo.absolutePath()[0];
+ switch (driveName.toAscii()) {
+ case 'C':
+ driveList << "C: Phone memory";
+ break;
+ case 'E':
+ driveList << "E: Mass memory";
+ break;
+ case 'F':
+ driveList << "F: Memory card";
+ break;
+ default:
+ break;
+ }
+ }
+
+ mMemorySelection->setItems(driveList);
+ mStackedWidget->setCurrentWidget(mMemorySelection);
+
+ // TODO: set selected item, read the default from cenrep
+ }
+}
+
+// ----------------------------------------------------------------------------
+// SifUiDialogContentWidget::updateProgressBar()
+// ----------------------------------------------------------------------------
+//
+void SifUiDialogContentWidget::updateProgressBar(const QVariantMap ¶meters)
+{
+ bool progressBarChanged = false;
+ if (parameters.contains(KSifUiProgressNoteFinalValue)) {
+ mProgressBar->setMaximum(parameters.value(KSifUiProgressNoteFinalValue).toInt());
+ progressBarChanged = true;
+ }
+ if (parameters.contains(KSifUiProgressNoteValue)) {
+ int newValue = mProgressBar->progressValue();
+ newValue += parameters.value(KSifUiProgressNoteValue).toInt();
+ mProgressBar->setProgressValue(newValue);
+ progressBarChanged = true;
+ }
+ if (progressBarChanged) {
+ mStackedWidget->setCurrentWidget(mProgressBar);
+ }
+}
+
+// ----------------------------------------------------------------------------
+// SifUiDialogContentWidget::updateErrorText()
+// ----------------------------------------------------------------------------
+//
+void SifUiDialogContentWidget::updateErrorText(const QVariantMap ¶meters)
+{
+ if (parameters.contains(KSifUiErrorCode)) {
+ // TODO: proper error texts
+ QString errorText = tr("Error %1").arg(parameters.value(KSifUiErrorCode).toInt());
+ mErrorText->setPlainText(errorText);
+ mStackedWidget->setCurrentWidget(mErrorText);
+ }
+}
+
+
+