emailuis/nmailui/src/nmeditorcontent.cpp
changeset 18 578830873419
child 20 ecc8def7944a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/emailuis/nmailui/src/nmeditorcontent.cpp	Fri Apr 16 14:51:52 2010 +0300
@@ -0,0 +1,165 @@
+/*
+* 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: Message editor contents widget
+*
+*/
+
+#include "nmuiheaders.h"
+
+// Layout
+static const char *NMUI_EDITOR_BODY = "BodyTextEdit";
+
+static const double Un = 6.66;
+static const double HeaderAreaMarginsTotal = 3 * Un;
+
+/*!
+    Constructor
+*/
+NmEditorContent::NmEditorContent(QGraphicsItem *parent,
+                                 NmEditorView *parentView,
+                                 HbDocumentLoader *documentLoader) :
+    HbWidget(parent),
+    mHeaderWidget(NULL),
+    mParentView(parentView),
+    mEditorLayout(NULL),
+    mMessage(NULL),
+    mMessageBodyType(PlainText),
+    mEditorWidget(NULL),
+    mBackgroundScrollArea((NmBaseViewScrollArea*)parent)
+{
+    mBackgroundScrollArea->setLongPressEnabled(true);
+
+    // Add header area handling widget into layout
+    mHeaderWidget = new NmEditorHeader(documentLoader, this);
+
+    // Get pointer to body text area handling widget
+    mEditorWidget = qobject_cast<NmEditorTextEdit *>(documentLoader->findWidget(NMUI_EDITOR_BODY));
+    mEditorWidget->init(this, mBackgroundScrollArea);
+    
+    // Remove the comment to enable style picker menu item.
+    mEditorWidget->setFormatDialog(new HbFormatDialog());
+
+    // Create signal slot connections
+    createConnections();
+}
+
+/*!
+    Destructor
+*/
+NmEditorContent::~NmEditorContent()
+{
+   delete mHeaderWidget;
+}
+
+/*!
+    Fill message data into header and body fileds
+ */
+void NmEditorContent::setMessageData(NmMessage *message)
+{
+    if(message)	{
+        mMessage = message;
+        // Check which part is present. Html or plain text part
+        NmMessagePart *htmlPart = mMessage->htmlBodyPart();
+        NmMessagePart *plainPart = mMessage->plainTextBodyPart();
+
+        QList<NmMessagePart*> parts;
+        mMessage->attachmentList(parts);
+        NmMessagePart* attachmentHtml = NULL;
+
+        foreach(NmMessagePart* part, parts) {
+            if (part->contentDescription().startsWith( NmContentDescrAttachmentHtml )) {
+                    attachmentHtml = part;
+                }
+            }
+        
+        if (htmlPart) {	    
+            // Html part was present, set it to HbTextEdit
+            // This will generate contentsChanged() event which is used to
+            // set new height for the editor widget and content.
+            if(attachmentHtml){
+                QString htmlText = htmlPart->textContent() + attachmentHtml->textContent();
+                emit setHtml(htmlText);
+            }
+            else{
+                emit setHtml(htmlPart->textContent());    
+            }
+
+            mMessageBodyType = HTMLText;
+        }
+        else if (plainPart) {
+            // Plain text part was present, set it to HbTextEdit
+            emit setPlainText(plainPart->textContent());
+            mMessageBodyType = PlainText;
+        }
+    }
+}
+
+/*!
+   This method set new height for the editor content when header or body field
+   height has been changed.
+ */
+void NmEditorContent::setEditorContentHeight()
+{
+	const QSizeF reso = HbDeviceProfile::current().logicalSize();
+    qreal containerHeight =
+        mEditorWidget->contentHeight() + mHeaderWidget->headerHeight() + HeaderAreaMarginsTotal;
+    if (containerHeight < reso.height()) {
+        //Currently content height is too long because Chrome hiding is not supported.
+        //Fix this when Chrome works.
+        containerHeight = reso.height();
+        qreal bodyContentHeight =
+            reso.height() - mHeaderWidget->headerHeight() - HeaderAreaMarginsTotal;
+        mEditorWidget->setPreferredHeight(bodyContentHeight);
+        mEditorWidget->setMaximumHeight(bodyContentHeight);
+    }
+    mParentView->scrollAreaContents()->setMinimumHeight(containerHeight);
+    mParentView->scrollAreaContents()->setMaximumHeight(containerHeight);
+    mBackgroundScrollArea->setMaximumHeight(containerHeight);
+}
+
+/*!
+   This method creates all needed signal-slot connections
+ */
+void NmEditorContent::createConnections()
+{
+    // Body edit widget is also interested about bg scroll position change
+    connect(mBackgroundScrollArea, SIGNAL(scrollPositionChanged(QPointF)),
+            mEditorWidget, SLOT(updateScrollPosition(QPointF)));
+    // Signal for setting HbTextEdit widgets html content
+    connect(this, SIGNAL(setHtml(QString)),
+            mEditorWidget, SLOT(setHtml(QString)));
+    // Signal for setting HbTextEdit widgets plain text content
+    connect(this, SIGNAL(setPlainText(QString)),
+            mEditorWidget, SLOT(setPlainText(QString)));
+    // Inform text edit widget that header height has been changed
+    connect(mHeaderWidget, SIGNAL(headerHeightChanged(int)),
+            mEditorWidget, SLOT(setHeaderHeight(int)));
+}
+
+/*!
+    Return pointer to the email body text edit widget
+ */
+NmEditorTextEdit* NmEditorContent::editor() const
+{
+    return mEditorWidget;
+}
+
+/*!
+    Return pointer to the header widget
+ */
+NmEditorHeader* NmEditorContent::header() const
+{
+    return mHeaderWidget;
+}
+