homescreenapp/stateplugins/hsmenuworkerstateplugin/src/hspreviewhswidgetstate.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/homescreenapp/stateplugins/hsmenuworkerstateplugin/src/hspreviewhswidgetstate.cpp Fri Mar 19 09:27:44 2010 +0200
@@ -0,0 +1,239 @@
+/*
+* Copyright (c) 2009 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: Menu Application Library state.
+ *
+*/
+
+
+#include <hblabel.h>
+//#include <hsiwidgetprovider.h>
+#include <hbmessagebox.h>
+#include <qstatemachine.h>
+#include <hbaction.h>
+#include <hbdialog.h>
+#include <hbwidget.h>
+#include <hbscrollarea.h>
+#include <hbscrollbar.h>
+
+#include "hsmenueventfactory.h"
+#include "hsmenuservice.h"
+#include "hswidgetdata.h"
+#include "hswidgethost.h"
+#include "hspreviewhswidgetstate.h"
+#include "hsmenuevent.h"
+#include "hsapp_defs.h"
+#include "hsscene.h"
+#include "hspage.h"
+
+#include "canotifier.h"
+#include "canotifierfilter.h"
+#include "caservice.h"
+
+#include "hsdomainmodel_global.h"
+#include <hscontentservice.h>
+
+/*!
+ Constructor
+ \param parent: parent state
+ \retval void
+ */
+HsPreviewHSWidgetState::HsPreviewHSWidgetState(QState *parent) :
+ HsMenuBaseState("HsPreviewHSWidgetState", parent),
+ mPopupDialog(0),
+ mNotifier(0)
+{
+ requestServices(QList<QVariant> () << CONTENT_SERVICE_KEY);
+ connect(this, SIGNAL(exited()),SLOT(stateExited()));
+}
+
+/*!
+ Destructor.
+ */
+HsPreviewHSWidgetState::~HsPreviewHSWidgetState()
+{
+ if (mNotifier) {
+ delete mNotifier;
+ }
+ if (mPopupDialog) {
+ delete mPopupDialog;
+ }
+}
+
+/*!
+ onEntry method invoked on entering the state
+ Adds a widget or shortcut to the active page of home screen.
+ It reads "data" property which value is a string map.
+ The map can keep either data specific for shortcut (item id)
+ or widget (entry type name, widget library name, widget uri).
+ Depending on the property values it calls method for adding widget
+ or shortcut.
+ \param contentService: service for adding widgets
+ \param shortcutService: service for adding shortcuts
+ \retval void
+ */
+#ifdef COVERAGE_MEASUREMENT
+#pragma CTC SKIP
+#endif //COVERAGE_MEASUREMENT
+void HsPreviewHSWidgetState::onEntry(QEvent *event)
+{
+ HSMENUTEST_FUNC_ENTRY("HsPreviewHSWidgetState::onEntry");
+ HsMenuBaseState::onEntry(event);
+ HsMenuEvent *menuEvent = static_cast<HsMenuEvent *>(event);
+ QVariantMap data = menuEvent->data();
+
+ const int entryId = data.value(itemIdKey()).toInt();
+
+ QVariantMap widgetData;
+ widgetData.insert("library", data.value(widgetLibraryAttributeName()).toString());
+ widgetData.insert("uri", data.value(widgetUriAttributeName()).toString());
+ HsWidgetHost *widget = contentService()->createWidgetForPreview(widgetData);
+
+ if (widget) {
+ widget->setMinimumSize(widget->preferredWidth(),widget->preferredHeight());
+ HbScrollArea *scrollArea = new HbScrollArea();
+ scrollArea->setClampingStyle(HbScrollArea::StrictClamping);
+ scrollArea->setScrollingStyle(HbScrollArea::Pan);
+ scrollArea->setHorizontalScrollBarPolicy(HbScrollArea::ScrollBarAsNeeded);
+ scrollArea->setHorizontalScrollBarPolicy(HbScrollArea::ScrollBarAutoHide);//
+ scrollArea->setVerticalScrollBarPolicy(HbScrollArea::ScrollBarAsNeeded);
+ scrollArea->setVerticalScrollBarPolicy(HbScrollArea::ScrollBarAutoHide);//
+ scrollArea->verticalScrollBar()->setInteractive(true);
+ scrollArea->horizontalScrollBar()->setInteractive(true);
+ // this sets up the scroll area to scroll in both directions
+ scrollArea->setScrollDirections(Qt::Vertical | Qt::Horizontal);
+ scrollArea->setContentWidget(widget); //ownership transferred
+ scrollArea->setAlignment(Qt::AlignCenter);
+
+ // Instantiate a popup
+ mPopupDialog = new HbDialog();
+
+ // Set dismiss policy that determines what tap events will cause the dialog
+ // to be dismissed
+ mPopupDialog->setDismissPolicy(HbDialog::NoDismiss);
+ mPopupDialog->setTimeout(HbDialog::NoTimeout);
+
+ // Set content widget
+ mPopupDialog->setContentWidget(scrollArea); //ownership transferred
+
+ // Sets the primary action and secondary action
+ mPopupDialog->setPrimaryAction(new HbAction(hbTrId("txt_applib_button_add_to_homescreen"),mPopupDialog));
+ mPopupDialog->setSecondaryAction(new HbAction(hbTrId("txt_common_button_close"),mPopupDialog));
+
+ subscribeForMemoryCardRemove(entryId);
+ widget->initializeWidget();
+ widget->showWidget();
+ // Launch popup syncronously
+ HbAction *result = mPopupDialog->exec();
+
+ disconnect(mNotifier,
+ SIGNAL(entryChanged(const CaEntry &, ChangeType)),
+ this, SLOT(memoryCardRemoved()));
+
+ if (result == mPopupDialog->primaryAction()) {
+ // take it back from scrollarea
+ scrollArea->takeContentWidget();
+ widget->hideWidget();
+ widget->uninitializeWidget();
+ HsScene::instance()->activePage()->addNewWidget(widget);
+ } else {
+ widget->deleteFromDatabase();
+ }
+
+ delete result;
+ result = NULL;
+
+ } else {
+ showMessageWidgetCorrupted(entryId);
+ }
+
+ HSMENUTEST_FUNC_EXIT("HsPreviewHSWidgetState::onEntry");
+}
+#ifdef COVERAGE_MEASUREMENT
+#pragma CTC ENDSKIP
+#endif //COVERAGE_MEASUREMENT
+
+/*!
+ State exited.
+ \retval void
+ */
+void HsPreviewHSWidgetState::stateExited()
+{
+ HSMENUTEST_FUNC_ENTRY("HsPreviewHSWidgetState::stateExited");
+
+ if (mNotifier) {
+ delete mNotifier;
+ mNotifier = NULL;
+ }
+
+ if (mPopupDialog) {
+ delete mPopupDialog;
+ mPopupDialog = NULL;
+ }
+
+ HSMENUTEST_FUNC_EXIT("HsPreviewHSWidgetState::stateExited");
+ qDebug("HsPreviewHSWidgetState::stateExited()");
+}
+
+/*!
+ Memory card with instaled widget was removed.
+ \retval void
+ */
+void HsPreviewHSWidgetState::memoryCardRemoved()
+{
+ if (mPopupDialog) {
+ mPopupDialog->close();
+ }
+}
+
+/*!
+ Subscribe for memory card remove.
+ \param entryId: HSWidget id.
+ \retval void
+ */
+void HsPreviewHSWidgetState::subscribeForMemoryCardRemove(int entryId)
+{
+ CaNotifierFilter filter;
+ QList<int> entryIds;
+ entryIds.append(entryId);
+ filter.setIds(entryIds);
+ mNotifier = CaService::instance()->createNotifier(filter);
+ mNotifier->setParent(this);
+ connect(mNotifier,
+ SIGNAL(entryChanged(const CaEntry &, ChangeType)),
+ SLOT(memoryCardRemoved()));
+}
+
+
+/*!
+ Shows message about corrupted widget library. Deletes widget eventually
+ \param itemId entryId of widget (needed to delete it)
+ \retval void
+ */
+#ifdef COVERAGE_MEASUREMENT
+#pragma CTC SKIP
+#endif //COVERAGE_MEASUREMENT
+void HsPreviewHSWidgetState::showMessageWidgetCorrupted(int itemId)
+{
+ HSMENUTEST_FUNC_ENTRY("HsCollectionState::showMessageWidgetCorrupted");
+ QString message(hbTrId("txt_applib_dialog_file_corrupted_unable_to_use_wi"));
+ if (HbMessageBox::question(message,hbTrId(
+ "txt_common_button_ok"), hbTrId("txt_common_button_cancel"))) {
+ HsMenuService::executeAction(itemId, removeActionIdentifier());
+ }
+ HSMENUTEST_FUNC_EXIT("HsCollectionState::showMessageWidgetCorrupted");
+}
+#ifdef COVERAGE_MEASUREMENT
+#pragma CTC ENDSKIP
+#endif //COVERAGE_MEASUREMENT
+