emailuis/nmsettingui/src/nmsettingsviewfactory.cpp
changeset 18 578830873419
child 20 ecc8def7944a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/emailuis/nmsettingui/src/nmsettingsviewfactory.cpp	Fri Apr 16 14:51:52 2010 +0300
@@ -0,0 +1,252 @@
+/*
+* 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 <QProcess>
+#include <QTranslator>
+#include <QCoreApplication>
+#include <HbInstance>
+#include <HbAction>
+#include <HbMessagebox>
+
+#include "nmsettingsviewfactory.h"
+#include "nmmailboxsettingsmanager.h"
+#include "nmmailboxsettingview.h"
+#include "nmmailboxselectionview.h"
+#include "nmmailbox.h"
+#include "nmcommon.h"
+#include "nmsettingsviewlauncher.h"
+#include "nmsettingscommon.h"
+
+static const QString mailWizardStartExe = "mailwizard.exe";
+static const QString mailWizardStartArgs = "from:controlpanel";
+
+
+/*!
+    \class NmSettingsViewFactory
+    \brief Constructs and displays settings views.
+
+*/
+
+
+// ======== MEMBER FUNCTIONS ========
+
+/*!
+    Constructor of NmSettingsViewFactory.
+
+    \param itemDataHelper
+    \param text
+    \param description
+    \param icon
+    \param parent
+    \return A newly constructed settings view factory instance.
+*/
+NmSettingsViewFactory::NmSettingsViewFactory(
+    CpItemDataHelper &itemDataHelper,
+    const QString &text,
+    const QString &description,
+    const HbIcon &icon,
+    const HbDataFormModelItem *parent)
+ : CpSettingFormEntryItemData(itemDataHelper, text, description, icon, parent),
+   mSettingsManager(new NmMailboxSettingsManager()), mSettingsViewLauncher(0),mPrevView(0)
+{
+}
+
+
+/*!
+    Constructor of NmSettingsViewFactory.
+
+    \param viewLauncher
+    \param itemDataHelper
+    \param text
+    \param description
+    \param icon
+    \param parent
+    \return A newly constructed settings view factory instance.
+*/
+NmSettingsViewFactory::NmSettingsViewFactory(
+    const NmSettingsViewLauncher *viewLauncher,
+    CpItemDataHelper &itemDataHelper,
+    const QString &text,
+    const QString &description,
+    const HbIcon &icon,
+    const HbDataFormModelItem *parent)
+ : CpSettingFormEntryItemData(itemDataHelper, text, description, icon, parent),
+     mSettingsManager(new NmMailboxSettingsManager()), mSettingsViewLauncher(viewLauncher), mPrevView(0)
+{
+}
+
+
+/*!
+    Destructor of NmSettingsViewFactory.
+*/
+NmSettingsViewFactory::~NmSettingsViewFactory()
+{
+    delete mSettingsManager;
+}
+
+
+/*!
+    Constructs a setting view. The type of the view depends on the number of
+    mailboxes present. If there are no mailboxes defined, displays a query
+    asking whether to user wants to define a new mailbox or not.
+
+    \return A newly constructed setting view instance.
+*/
+CpBaseSettingView *NmSettingsViewFactory::createSettingView() const
+{
+    NMLOG(QString("NmSettingsViewFactory::createSettingView(): Begin."));
+
+    CpBaseSettingView *view = 0;
+    QList<NmMailbox *> mailboxList;
+    mSettingsManager->listMailboxes(mailboxList);
+    const int mailboxCount(mailboxList.count());
+
+    // Log the number of mailboxes.
+    NMLOG(QString("NmSettingsViewFactory::createSettingView(): Mailbox count is ") +
+          QString::number(mailboxCount));
+
+    if (mailboxCount == 0) {
+        // Query the user whether to launch the wizard or not.
+        HbMessageBox *messageBox = new HbMessageBox(HbMessageBox::MessageTypeQuestion);
+        messageBox->setText(hbTrId("txt_mail_dialog_no_mailboxes_create_new"));
+        messageBox->setTimeout(HbMessageBox::NoTimeout);
+
+        // Read the user selection.
+        HbAction *action = messageBox->exec();
+
+        if (action == messageBox->primaryAction()) {
+            // Launch mail wizard.
+            NMLOG(QString("NmSettingsViewFactory::createSettingView(): Launching the mail wizard."));
+            QStringList args;
+            args << mailWizardStartArgs;
+            QProcess::startDetached(mailWizardStartExe, args);
+        }
+    }
+    else if (mailboxCount == 1) {
+        // Construct setting view for the only available mailbox
+        NmMailbox *mailbox = mailboxList.at(0);
+        view = new NmMailboxSettingView(mailbox->id(),
+                                        mailbox->name(),
+                                        *mSettingsManager);
+    }
+    else if (mailboxCount > 1) {
+        // Construct mailbox selection view
+        view = new NmMailboxSelectionView(*this, *mSettingsManager, mailboxList);
+    }
+
+    if (view) {
+        connect(mSettingsManager,
+                SIGNAL(mailboxListChanged(const NmId &, NmSettings::MailboxEventType)),
+                view, SLOT(mailboxListChanged(const NmId &, NmSettings::MailboxEventType)));
+
+        connect(mSettingsManager,
+                SIGNAL(mailboxPropertyChanged(const NmId &, QVariant, QVariant)),
+                view, SLOT(mailboxPropertyChanged(const NmId &, QVariant, QVariant)));
+    }
+
+    NMLOG(QString("NmSettingsViewFactory::createSettingView(): End."));
+    return view;
+}
+
+
+/*!
+    Constructs and launches, i.e. displays a setting view for the given mailbox.
+
+    \param mailboxId The id of the mailbox.
+    \param mailboxName The name of the mailbox.
+*/
+void NmSettingsViewFactory::launchSettingView(const NmId &mailboxId,
+                                              const QString &mailboxName) const
+{
+    NMLOG(QString("NmSettingsViewFactory::launchSettingView"));
+
+    // There's always at least one valid main window available.
+    HbMainWindow *mainWindow = hbInstance->allMainWindows().takeFirst();
+
+    CpBaseSettingView *view =
+        new NmMailboxSettingView(mailboxId, mailboxName, *mSettingsManager);
+
+    connect(mSettingsManager,
+            SIGNAL(mailboxListChanged(const NmId &, NmSettings::MailboxEventType)),
+            view, SLOT(mailboxListChanged(const NmId &, NmSettings::MailboxEventType)));
+
+    connect(mSettingsManager,
+            SIGNAL(mailboxPropertyChanged(const NmId &, QVariant, QVariant)),
+            view, SLOT(mailboxPropertyChanged(const NmId &, QVariant, QVariant)));
+
+    // Disconnect mSettingsViewLauncher's previous connections to be sure that signals which are
+    // offered out will be sent last.
+    mSettingsManager->disconnect(
+        SIGNAL(mailboxListChanged(const NmId &, NmSettings::MailboxEventType)),
+        mSettingsViewLauncher,
+        SIGNAL(mailboxListChanged(const NmId &, NmSettings::MailboxEventType)));
+
+    mSettingsManager->disconnect(
+        SIGNAL(mailboxPropertyChanged(const NmId &, QVariant, QVariant)),
+        mSettingsViewLauncher,
+        SIGNAL(mailboxPropertyChanged(const NmId &, QVariant, QVariant)));
+
+
+    // Reconnect mSettingsViewLauncher.
+    connect(mSettingsManager,
+            SIGNAL(mailboxListChanged(const NmId &, NmSettings::MailboxEventType)),
+            mSettingsViewLauncher,
+            SIGNAL(mailboxListChanged(const NmId &, NmSettings::MailboxEventType)));
+
+    connect(mSettingsManager,
+            SIGNAL(mailboxPropertyChanged(const NmId &, QVariant, QVariant)),
+            mSettingsViewLauncher,
+            SIGNAL(mailboxPropertyChanged(const NmId &, QVariant, QVariant)));
+
+    // Create back navigation action for a view.
+    HbAction *action = new HbAction(Hb::BackNaviAction, view);
+    connect(action, SIGNAL(triggered()), this, SLOT(backPress()));
+    view->setNavigationAction(action);
+    mPrevView = mainWindow->currentView();
+    mainWindow->addView(view);
+    mainWindow->setCurrentView(view);
+
+    NMLOG(QString("NmSettingsViewFactory::launchSettingView - OK"));
+}
+
+
+/*!
+   Handles back button press.
+   Removes the current view from the main window and activates the previous view.
+   Destroys removed view.
+*/
+void NmSettingsViewFactory::backPress()
+{
+    NMLOG(QString("NmSettingsViewFactory::backPress"));
+
+    HbMainWindow *mainWindow = hbInstance->allMainWindows().takeFirst();
+    QList<HbView *> views = mainWindow->views();
+    if (views.count() > 1) {
+        HbView *currentView = mainWindow->currentView();
+        int indexOfView(views.indexOf(mPrevView));
+        if (indexOfView > -1) {
+            mainWindow->setCurrentView(views.at(indexOfView));
+            mainWindow->removeView(currentView);
+            currentView->deleteLater();
+        }
+        mPrevView = 0;
+    }
+
+    NMLOG(QString("NmSettingsViewFactory::backPress - OK"));
+}
+
+// End of file.