messagingapp/msgui/unifiedviewer/src/unifiedviewer.cpp
branchRCL_3
changeset 57 ebe688cedc25
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingapp/msgui/unifiedviewer/src/unifiedviewer.cpp	Tue Aug 31 15:11:31 2010 +0300
@@ -0,0 +1,390 @@
+/*
+ * 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: Main view of unified viewer
+ *
+ */
+
+#include "unifiedviewer.h"
+
+// SYSTEM INCLUDES
+#include <QGraphicsLinearLayout>
+#include <HbAction>
+#include <HbToolBar>
+#include <hbmessagebox.h>
+#include <hbnotificationdialog.h>
+#include <HbStyleLoader>
+#include <centralrepository.h>
+#include <MmsEngineDomainCRKeys.h>
+#include <ccsdefs.h>
+
+// USER INCLUDES
+#include "uniscrollarea.h"
+#include "unicontentswidget.h"
+#include "univiewerfeeder.h"
+#include "convergedmessageid.h"
+#include "convergedmessage.h"
+#include "convergedmessageaddress.h"
+#include "conversationsenginedefines.h"
+#include "conversationsengine.h"
+#include "debugtraces.h"
+#include "nativemessageconsts.h"
+#include "mmsconformancecheck.h"
+
+// LOCAL CONSTANTS
+const QString REPLY_ICON("qtg_mono_reply");
+const QString REPLY_ALL_ICON("qtg_mono_reply_all");
+const QString FORWARD_ICON("qtg_mono_forward_msg");
+const QString SEND_ICON("qtg_mono_send");
+const QString DELETE_ICON("qtg_mono_delete");
+
+//DB-file
+_LIT(KDbFileName, "c:[2002A542]conversations.db");
+// query to see if msg is forwardable
+_LIT(KSelectMsgPropertyStmt, " SELECT message_id, msg_property FROM conversation_messages WHERE message_id=:message_id ");
+
+
+//LOCALIZED CONSTANTS
+#define LOC_DELETE_MESSAGE hbTrId("txt_messaging_dialog_delete_message")
+#define LOC_DELETE_SHARED_MESSAGE hbTrId("txt_messaging_dialog_same_message_exists_in_multip")
+
+//----------------------------------------------------------------------------
+// UnifiedViewer::UnifiedViewer
+// constructor
+//----------------------------------------------------------------------------
+UnifiedViewer::UnifiedViewer(const qint32 messageId,
+                             QGraphicsItem *parent) :
+    MsgBaseView(parent)
+{
+    QDEBUG_WRITE("UnifiedViewer contruction start");
+
+    if (!HbStyleLoader::registerFilePath(":/layouts"))
+    {
+        QDEBUG_WRITE("ERROR: UnifiedViewer -> HbStyleLoader::registerFilePath");
+    }
+
+    mMessageId = messageId;
+    mViewFeeder = new UniViewerFeeder(mMessageId, this);
+
+    mScrollArea = new UniScrollArea(this);
+    this->setWidget(mScrollArea);
+
+    mContentsWidget = new UniContentsWidget(mViewFeeder,this);
+
+    connect(mContentsWidget,SIGNAL(sendMessage(const QString&,const QString&)),
+            this, SLOT(sendMessage(const QString&,const QString&)));
+
+    connect(mScrollArea, SIGNAL(scrolledToNextSlide()),
+    mContentsWidget, SLOT(populateNextSlide()));
+
+    mScrollArea->setContentWidget(mContentsWidget);
+    mScrollArea->setHorizontalScrollBarPolicy(HbScrollArea::ScrollBarAlwaysOff);
+    mScrollArea->setVerticalScrollBarPolicy(HbScrollArea::ScrollBarAutoHide);
+
+    QDEBUG_WRITE("UnifiedViewer contruction End");
+}
+
+//----------------------------------------------------------------------------
+// UnifiedViewer::UnifiedViewer
+// Destructor
+//----------------------------------------------------------------------------
+UnifiedViewer::~UnifiedViewer()
+{
+    HbStyleLoader::unregisterFilePath(":/layouts");
+}
+
+//----------------------------------------------------------------------------
+// UnifiedViewer::createToolBar
+// Creates tool bar actions
+//----------------------------------------------------------------------------
+void UnifiedViewer::createToolBar()
+{
+    HbToolBar* toolbar = this->toolBar();
+    toolbar->setOrientation(Qt::Horizontal);
+
+    int sendingState = mViewFeeder->sendingState();
+
+    if (mViewFeeder->sendingState() == ConvergedMessage::Failed)
+    {
+        toolbar->addAction(HbIcon(SEND_ICON), "");
+    }
+    else
+    {
+        // do not show reply option for multi recipient outgoing message
+        if(!(!mViewFeeder->isIncoming() && mViewFeeder->recipientCount()>1))
+        {
+            toolbar->addAction(HbIcon(REPLY_ICON), "", this, SLOT(handleReplyAction()));
+        }
+
+        if (mViewFeeder->recipientCount() > 1)
+        {
+            toolbar->addAction(HbIcon(REPLY_ALL_ICON), "", this, SLOT(handleReplyAllAction()));
+        }
+    }
+
+    if (isForwardOk())
+    {
+        toolbar->addAction(HbIcon(FORWARD_ICON), "", this, SLOT(handleFwdAction()));
+    }
+
+    toolbar->addAction(HbIcon(DELETE_ICON), "", this, SLOT(handleDeleteAction()));
+}
+
+//---------------------------------------------------------------
+// UnifiedViewer::clearContent
+// @see header file
+//---------------------------------------------------------------
+void UnifiedViewer::clearContent()
+{
+    QDEBUG_WRITE("UnifiedViewer clearContent start");
+
+    mContentsWidget->clearContent();
+    mContentsWidget->resize(mContentsWidget->rect().width(), -1);
+    mScrollArea->setPosToStart();
+    mViewFeeder->clearContent();
+
+    QDEBUG_WRITE("UnifiedViewer clearContent End");
+}
+
+//---------------------------------------------------------------
+// UnifiedViewer::populateContent
+// @see header file
+//---------------------------------------------------------------
+void UnifiedViewer::populateContent(const qint32 messageId, bool update, int msgCount)
+{
+    QDEBUG_WRITE("UnifiedViewer populateContent Start");
+
+    mMsgCount = msgCount;
+    mMessageId = messageId;
+
+    QDEBUG_WRITE("UnifiedViewer feeder->updateContent START");
+
+    if (update)
+    {
+        mViewFeeder->updateContent(messageId);
+    }
+    QDEBUG_WRITE("UnifiedViewer feeder->updateContent END");
+
+    // Dont show the scroll bar.
+    mScrollArea->setVerticalScrollBarPolicy(HbScrollArea::ScrollBarAlwaysOff);
+
+    if ( (mViewFeeder->msgType() == KSenduiMtmMmsUidValue) &&
+         (mViewFeeder->slideCount() > 0) )
+    {
+        mScrollArea->setTotalSlides(mViewFeeder->slideCount());
+    }
+    else
+    {
+        mScrollArea->setTotalSlides(1);
+    }
+    mScrollArea->resetCurrentSlide();
+
+    mContentsWidget->populateContent();
+
+    //Creation of toolbar now depends on content
+    createToolBar();
+
+    QDEBUG_WRITE("UnifiedViewer populateContent END");
+}
+
+//---------------------------------------------------------------
+// UnifiedViewer::handleFwdAction
+// @see header file
+//---------------------------------------------------------------
+void UnifiedViewer::handleFwdAction()
+{
+    launchEditor(MsgBaseView::FORWARD_MSG);
+}
+
+//---------------------------------------------------------------
+// UnifiedViewer::handleReplyAction
+// @see header file
+//---------------------------------------------------------------
+void UnifiedViewer::handleReplyAction()
+{
+    launchEditor(MsgBaseView::REPLY_MSG);
+}
+
+//---------------------------------------------------------------
+// UnifiedViewer::handleReplyAllAction
+// @see header file
+//---------------------------------------------------------------
+void UnifiedViewer::handleReplyAllAction()
+{
+    launchEditor(MsgBaseView::REPLY_ALL_MSG);
+}
+
+//---------------------------------------------------------------
+// UnifiedViewer::resizeEvent
+// @see header file
+//---------------------------------------------------------------
+void UnifiedViewer::resizeEvent(QGraphicsSceneResizeEvent * event)
+{
+    Q_UNUSED(event)
+    mContentsWidget->resize(this->rect().width(), this->rect().height()+1);
+}
+
+//---------------------------------------------------------------
+// UnifiedViewer::handleDeleteAction
+// @see header file
+//---------------------------------------------------------------
+void UnifiedViewer::handleDeleteAction()
+{
+    QString txt = LOC_DELETE_MESSAGE;
+
+    //if mms and out going. check for sharing
+    if((mViewFeeder->msgType() == KSenduiMtmMmsUidValue) && (!mViewFeeder->isIncoming()))
+    {
+        if(mViewFeeder->recipientCount() > 1 )
+        {
+            txt =  LOC_DELETE_SHARED_MESSAGE;
+        }
+    }
+
+    HbMessageBox::question(txt,this,SLOT(onDialogDeleteMsg(int)),
+                           HbMessageBox::Delete | HbMessageBox::Cancel);
+}
+
+//---------------------------------------------------------------
+// UnifiedViewer::sendMessage
+// @see header file
+//---------------------------------------------------------------
+void UnifiedViewer::sendMessage(const QString& phoneNumber,const QString& alias)
+    {
+    ConvergedMessage message;
+    message.setBodyText(QString());
+
+    ConvergedMessageAddress address;
+    address.setAlias(alias);
+    address.setAddress(phoneNumber);
+    message.addToRecipient(address);
+
+    QByteArray dataArray;
+    QDataStream messageStream
+    (&dataArray, QIODevice::WriteOnly | QIODevice::Append);
+    message.serialize(messageStream);
+
+    QVariantList params;
+    params << MsgBaseView::UNIEDITOR;
+    params << MsgBaseView::UNIVIEWER;
+    params << dataArray;
+
+    emit switchView(params);
+    }
+
+//---------------------------------------------------------------
+// UnifiedViewer::onDialogDeleteMsg
+// @see header file
+//---------------------------------------------------------------
+void UnifiedViewer::onDialogDeleteMsg(int val)
+{
+    if (val == HbMessageBox::Delete) {
+        QList<int> msgIdList;
+        msgIdList << mMessageId;
+
+        ConversationsEngine::instance()->deleteMessages(msgIdList);
+
+        QVariantList param;
+        if (mMsgCount > 1) {
+            param << MsgBaseView::CV;
+            param << MsgBaseView::UNIVIEWER;
+        }
+        else {
+            param << MsgBaseView::CLV;
+            param << MsgBaseView::UNIVIEWER;
+        }
+
+        QVariant dummy(QVariant::Invalid);
+        param << dummy;
+        emit switchView(param);
+    }
+}
+
+//---------------------------------------------------------------
+// UnifiedViewer::launchEditor
+// @see header file
+//---------------------------------------------------------------
+void UnifiedViewer::launchEditor(
+        MsgBaseView::UniEditorOperation operation)
+{
+    ConvergedMessage message;
+    ConvergedMessageId id(mMessageId);
+    message.setMessageId(id);
+    if(mViewFeeder->msgType() == KSenduiMtmMmsUidValue)
+    {
+        message.setMessageType(ConvergedMessage::Mms);
+    }
+    else
+    {
+        message.setMessageType(ConvergedMessage::Sms);
+    }
+
+    QByteArray dataArray;
+    QDataStream messageStream
+    (&dataArray, QIODevice::WriteOnly | QIODevice::Append);
+    message.serialize(messageStream);
+
+    QVariantList params;
+    params << MsgBaseView::UNIEDITOR; // target view
+    params << MsgBaseView::UNIVIEWER; // source view
+
+    params << dataArray;
+    params << operation;
+
+    emit switchView(params);
+}
+
+//---------------------------------------------------------------
+// UnifiedViewer::isForwardOk
+// @see header file
+//---------------------------------------------------------------
+bool UnifiedViewer::isForwardOk()
+{
+    bool canForwardMsg = true;
+    if(mViewFeeder->msgType() == KSenduiMtmMmsUidValue)
+    {
+        // open DB
+        RSqlDatabase sqlDb;
+        TInt error = sqlDb.Open(KDbFileName);
+        if(error == KErrNone)
+        {
+            RSqlStatement sqlSelectStmt;
+            CleanupClosePushL(sqlSelectStmt);
+            sqlSelectStmt.PrepareL(sqlDb,KSelectMsgPropertyStmt);
+            TInt msgIdIndex = sqlSelectStmt.ParameterIndex(_L(":message_id"));
+            sqlSelectStmt.BindInt(msgIdIndex, mMessageId);
+            // read the flag
+            TInt msgPropertyIndex =
+                    sqlSelectStmt.ColumnIndex(_L("msg_property"));
+            TInt retValue = 0;
+            if (sqlSelectStmt.Next() == KSqlAtRow)
+            {
+                retValue = static_cast<TInt>
+                    (sqlSelectStmt.ColumnInt(msgPropertyIndex));
+            }
+            CleanupStack::PopAndDestroy(&sqlSelectStmt);
+            sqlDb.Close();
+            canForwardMsg = (retValue & EPreviewForward)? true:false;
+        }
+        else
+        {
+            // fall-back plan
+            MmsConformanceCheck* mmsConformanceCheck = new MmsConformanceCheck;
+            canForwardMsg = mmsConformanceCheck->validateMsgForForward(mMessageId);
+            delete mmsConformanceCheck;
+        }
+    }
+    return canForwardMsg;
+}
+
+// EOF