emailuis/nmailui/src/nmeditorcontent.cpp
author hgs
Fri, 09 Jul 2010 12:17:13 +0300
changeset 51 d845db10c0d4
parent 49 00c7ae862740
child 62 a8c646b56683
permissions -rw-r--r--
201027
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
18
578830873419 Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
     1
/*
51
hgs
parents: 49
diff changeset
     2
* Copyright (c) 2009 - 2010 Nokia Corporation and/or its subsidiary(-ies).
18
578830873419 Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
     3
* All rights reserved.
578830873419 Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
     4
* This component and the accompanying materials are made available
578830873419 Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
578830873419 Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
     6
* which accompanies this distribution, and is available
578830873419 Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
578830873419 Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
     8
*
578830873419 Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
     9
* Initial Contributors:
578830873419 Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
578830873419 Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    11
*
578830873419 Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    12
* Contributors:
578830873419 Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    13
*
578830873419 Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    14
* Description: Message editor contents widget
578830873419 Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    15
*
578830873419 Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    16
*/
578830873419 Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    17
578830873419 Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    18
#include "nmuiheaders.h"
578830873419 Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    19
578830873419 Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    20
// Layout
578830873419 Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    21
static const char *NMUI_EDITOR_BODY = "BodyTextEdit";
47
hgs
parents: 44
diff changeset
    22
static const char *NMUI_EDITOR_SCROLL_AREA = "scrollArea";
hgs
parents: 44
diff changeset
    23
static const char *NMUI_EDITOR_SCROLL_AREA_CONTENTS = "scrollAreaContents";
18
578830873419 Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    24
47
hgs
parents: 44
diff changeset
    25
// Regular expression for selecting img tags with "cid" in the mail.
hgs
parents: 44
diff changeset
    26
static const char *NMUI_EDITOR_REMOVE_EMBD_IMAGES_REG = 
48
10eaf342f539 201025_1
hgs
parents: 47
diff changeset
    27
    "(<img[^<]+(src\\s*=\\s*)(.{0,1}cid)([^<]+)(>\\s*|/>\\s*|></img>\\s*))";
47
hgs
parents: 44
diff changeset
    28
	
18
578830873419 Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    29
/*!
578830873419 Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    30
    Constructor
578830873419 Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    31
*/
47
hgs
parents: 44
diff changeset
    32
NmEditorContent::NmEditorContent(QObject *parent,
20
ecc8def7944a Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents: 18
diff changeset
    33
                                 HbDocumentLoader *documentLoader,
47
hgs
parents: 44
diff changeset
    34
                                 QNetworkAccessManager &manager,
hgs
parents: 44
diff changeset
    35
                                 NmApplication &application) :
hgs
parents: 44
diff changeset
    36
    QObject(parent),
48
10eaf342f539 201025_1
hgs
parents: 47
diff changeset
    37
    mHeader(NULL),
47
hgs
parents: 44
diff changeset
    38
    mMessageBodyType(NmPlainText),
18
578830873419 Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    39
    mEditorWidget(NULL),
47
hgs
parents: 44
diff changeset
    40
    mScrollArea(NULL),
hgs
parents: 44
diff changeset
    41
    mScrollAreaContents(NULL),
51
hgs
parents: 49
diff changeset
    42
    mApplication(application),
hgs
parents: 49
diff changeset
    43
    mNeedForWidthAdjustment(false)
18
578830873419 Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    44
{
43
hgs
parents: 23
diff changeset
    45
    NM_FUNCTION;
18
578830873419 Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    46
47
hgs
parents: 44
diff changeset
    47
    // Construct container for the header widgets
51
hgs
parents: 49
diff changeset
    48
    mHeader = new NmEditorHeader(this, application, documentLoader);
18
578830873419 Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    49
578830873419 Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    50
    // Get pointer to body text area handling widget
578830873419 Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    51
    mEditorWidget = qobject_cast<NmEditorTextEdit *>(documentLoader->findWidget(NMUI_EDITOR_BODY));
51
hgs
parents: 49
diff changeset
    52
hgs
parents: 49
diff changeset
    53
    // Enable the emoticons.
hgs
parents: 49
diff changeset
    54
    mEditorWidget->setSmileysEnabled(true);
hgs
parents: 49
diff changeset
    55
20
ecc8def7944a Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents: 18
diff changeset
    56
    // Set body editor to use NmEditorTextDocument
ecc8def7944a Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents: 18
diff changeset
    57
    NmEditorTextDocument *textDocument = new NmEditorTextDocument(manager);
ecc8def7944a Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents: 18
diff changeset
    58
    mEditorWidget->setDocument(textDocument); 
ecc8def7944a Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents: 18
diff changeset
    59
    textDocument->setParent(mEditorWidget); // ownership changes
ecc8def7944a Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents: 18
diff changeset
    60
47
hgs
parents: 44
diff changeset
    61
    mScrollArea = qobject_cast<NmBaseViewScrollArea *>
49
00c7ae862740 201025_2
hgs
parents: 48
diff changeset
    62
        (documentLoader->findWidget(NMUI_EDITOR_SCROLL_AREA));
51
hgs
parents: 49
diff changeset
    63
    
48
10eaf342f539 201025_1
hgs
parents: 47
diff changeset
    64
    mScrollArea->setScrollDirections(Qt::Vertical | Qt::Horizontal);
51
hgs
parents: 49
diff changeset
    65
    mScrollArea->setClampingStyle(HbScrollArea::BounceBackClamping);
hgs
parents: 49
diff changeset
    66
        
23
2dc6caa42ec3 Revision: 201017
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents: 20
diff changeset
    67
    // Enable style picker menu item.
18
578830873419 Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    68
    mEditorWidget->setFormatDialog(new HbFormatDialog());
578830873419 Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    69
47
hgs
parents: 44
diff changeset
    70
    mScrollAreaContents =
hgs
parents: 44
diff changeset
    71
        qobject_cast<HbWidget *>(documentLoader->findWidget(NMUI_EDITOR_SCROLL_AREA_CONTENTS));
hgs
parents: 44
diff changeset
    72
    
18
578830873419 Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    73
    // Create signal slot connections
578830873419 Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    74
    createConnections();
51
hgs
parents: 49
diff changeset
    75
hgs
parents: 49
diff changeset
    76
    // The following line is necessary in terms of being able to add emoticons
hgs
parents: 49
diff changeset
    77
    // (smileys) to an empty document (mail content). Otherwise the private
hgs
parents: 49
diff changeset
    78
    // pointer of the QTextDocument which the smiley engine has is NULL and
hgs
parents: 49
diff changeset
    79
    // inserting a smiley will lead to an error.
hgs
parents: 49
diff changeset
    80
    mEditorWidget->setPlainText("");
18
578830873419 Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    81
}
578830873419 Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    82
578830873419 Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    83
/*!
578830873419 Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    84
    Destructor
578830873419 Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    85
*/
578830873419 Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    86
NmEditorContent::~NmEditorContent()
578830873419 Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    87
{
43
hgs
parents: 23
diff changeset
    88
    NM_FUNCTION;
18
578830873419 Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    89
}
578830873419 Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    90
578830873419 Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    91
/*!
20
ecc8def7944a Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents: 18
diff changeset
    92
    Fill message data into header and body fileds. If reply envelopw is
ecc8def7944a Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents: 18
diff changeset
    93
    present, reply header is generated and set to editor. Reply
ecc8def7944a Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents: 18
diff changeset
    94
    envelope ownership is not transferred here.
18
578830873419 Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    95
 */
47
hgs
parents: 44
diff changeset
    96
void NmEditorContent::setMessageData(const NmMessage &originalMessage, 
hgs
parents: 44
diff changeset
    97
                                     NmUiEditorStartMode &editorStartMode)
18
578830873419 Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    98
{
43
hgs
parents: 23
diff changeset
    99
    NM_FUNCTION;
44
hgs
parents: 43
diff changeset
   100
    
hgs
parents: 43
diff changeset
   101
    QString bodyContent;
51
hgs
parents: 49
diff changeset
   102
	QTextCursor cursor(mEditorWidget->document());
44
hgs
parents: 43
diff changeset
   103
    
47
hgs
parents: 44
diff changeset
   104
    // Create the "reply" header (also for forward message)
hgs
parents: 44
diff changeset
   105
    if (editorStartMode==NmUiEditorReply || editorStartMode==NmUiEditorReplyAll || 
hgs
parents: 44
diff changeset
   106
        editorStartMode==NmUiEditorForward) {
51
hgs
parents: 49
diff changeset
   107
		bodyContent.append(QString("<style type=\"text/css\">* { color: black; }</style>"));
47
hgs
parents: 44
diff changeset
   108
        bodyContent.append(NmUtilities::createReplyHeader(originalMessage.envelope()));
44
hgs
parents: 43
diff changeset
   109
    }
hgs
parents: 43
diff changeset
   110
    
43
hgs
parents: 23
diff changeset
   111
    // Check which part is present. Html or plain text part. We use the original message parts.
hgs
parents: 23
diff changeset
   112
    const NmMessagePart *htmlPart = originalMessage.htmlBodyPart();
hgs
parents: 23
diff changeset
   113
    const NmMessagePart *plainPart = originalMessage.plainTextBodyPart();
44
hgs
parents: 43
diff changeset
   114
 
47
hgs
parents: 44
diff changeset
   115
    if (htmlPart) {
44
hgs
parents: 43
diff changeset
   116
        bodyContent.append(htmlPart->textContent());
47
hgs
parents: 44
diff changeset
   117
        if(editorStartMode==NmUiEditorReply || editorStartMode==NmUiEditorReplyAll ) {
hgs
parents: 44
diff changeset
   118
            removeEmbeddedImages(bodyContent);
hgs
parents: 44
diff changeset
   119
        }
51
hgs
parents: 49
diff changeset
   120
        cursor.insertHtml(bodyContent);
47
hgs
parents: 44
diff changeset
   121
        mMessageBodyType = NmHTMLText;
20
ecc8def7944a Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents: 18
diff changeset
   122
    }
ecc8def7944a Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents: 18
diff changeset
   123
    else if (plainPart) {
ecc8def7944a Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents: 18
diff changeset
   124
        // Plain text part was present, set it to HbTextEdit
44
hgs
parents: 43
diff changeset
   125
        bodyContent.append(plainPart->textContent());
51
hgs
parents: 49
diff changeset
   126
        cursor.insertText(bodyContent);
47
hgs
parents: 44
diff changeset
   127
        mMessageBodyType = NmPlainText;
51
hgs
parents: 49
diff changeset
   128
        
hgs
parents: 49
diff changeset
   129
		// Next we set text color for black for all current content
hgs
parents: 49
diff changeset
   130
        QTextCharFormat blackForeground;
hgs
parents: 49
diff changeset
   131
    	blackForeground = cursor.charFormat();
hgs
parents: 49
diff changeset
   132
    	blackForeground.setForeground(Qt::black);
hgs
parents: 49
diff changeset
   133
    	cursor.select(QTextCursor::Document);
hgs
parents: 49
diff changeset
   134
    	cursor.mergeCharFormat(blackForeground);
18
578830873419 Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   135
    }
51
hgs
parents: 49
diff changeset
   136
    // Update of the body width is done when next contentChanged signal comes from the body.
hgs
parents: 49
diff changeset
   137
    mNeedForWidthAdjustment = true;
hgs
parents: 49
diff changeset
   138
	cursor.clearSelection();
hgs
parents: 49
diff changeset
   139
	cursor.setPosition(0);
hgs
parents: 49
diff changeset
   140
	cursor.insertHtml(QString("<html><body><br><br></body></html>"));
20
ecc8def7944a Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents: 18
diff changeset
   141
}  
18
578830873419 Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   142
578830873419 Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   143
/*!
578830873419 Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   144
   This method creates all needed signal-slot connections
578830873419 Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   145
 */
578830873419 Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   146
void NmEditorContent::createConnections()
578830873419 Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   147
{
43
hgs
parents: 23
diff changeset
   148
    NM_FUNCTION;
hgs
parents: 23
diff changeset
   149
    
18
578830873419 Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   150
    // Signal for setting HbTextEdit widgets html content
578830873419 Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   151
    connect(this, SIGNAL(setHtml(QString)),
44
hgs
parents: 43
diff changeset
   152
            mEditorWidget, SLOT(setHtml(QString)), Qt::QueuedConnection);
47
hgs
parents: 44
diff changeset
   153
18
578830873419 Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   154
    // Signal for setting HbTextEdit widgets plain text content
578830873419 Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   155
    connect(this, SIGNAL(setPlainText(QString)),
44
hgs
parents: 43
diff changeset
   156
            mEditorWidget, SLOT(setPlainText(QString)), Qt::QueuedConnection);
47
hgs
parents: 44
diff changeset
   157
18
578830873419 Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   158
    // Inform text edit widget that header height has been changed
48
10eaf342f539 201025_1
hgs
parents: 47
diff changeset
   159
    connect(mHeader, SIGNAL(headerHeightChanged(int)), this, SLOT(setEditorContentHeight()),
47
hgs
parents: 44
diff changeset
   160
        Qt::QueuedConnection);
hgs
parents: 44
diff changeset
   161
hgs
parents: 44
diff changeset
   162
    // we are interested in the document's height changes
hgs
parents: 44
diff changeset
   163
    connect(mEditorWidget->document()->documentLayout(), SIGNAL(documentSizeChanged(QSizeF)), this,
hgs
parents: 44
diff changeset
   164
        SLOT(setEditorContentHeight()), Qt::QueuedConnection);
hgs
parents: 44
diff changeset
   165
48
10eaf342f539 201025_1
hgs
parents: 47
diff changeset
   166
    // We need to update the scroll position according the editor's cursor position
10eaf342f539 201025_1
hgs
parents: 47
diff changeset
   167
    connect(mHeader->toEdit(), SIGNAL(cursorPositionChanged(int, int)), this, 
10eaf342f539 201025_1
hgs
parents: 47
diff changeset
   168
        SLOT(ensureCursorVisibility()), Qt::QueuedConnection);
10eaf342f539 201025_1
hgs
parents: 47
diff changeset
   169
    connect(mHeader->ccEdit(), SIGNAL(cursorPositionChanged(int, int)), this, 
10eaf342f539 201025_1
hgs
parents: 47
diff changeset
   170
        SLOT(ensureCursorVisibility()), Qt::QueuedConnection);
10eaf342f539 201025_1
hgs
parents: 47
diff changeset
   171
    connect(mHeader->bccEdit(), SIGNAL(cursorPositionChanged(int, int)), this, 
10eaf342f539 201025_1
hgs
parents: 47
diff changeset
   172
        SLOT(ensureCursorVisibility()), Qt::QueuedConnection);
10eaf342f539 201025_1
hgs
parents: 47
diff changeset
   173
    connect(mHeader->subjectEdit(), SIGNAL(cursorPositionChanged(int, int)), this, 
10eaf342f539 201025_1
hgs
parents: 47
diff changeset
   174
        SLOT(ensureCursorVisibility()), Qt::QueuedConnection);
47
hgs
parents: 44
diff changeset
   175
    connect(mEditorWidget, SIGNAL(cursorPositionChanged(int, int)), this, 
48
10eaf342f539 201025_1
hgs
parents: 47
diff changeset
   176
        SLOT(ensureCursorVisibility()), Qt::QueuedConnection);
10eaf342f539 201025_1
hgs
parents: 47
diff changeset
   177
10eaf342f539 201025_1
hgs
parents: 47
diff changeset
   178
    // listen to the parent's (NmEditorView) size changes which happen eg. when VKB is opened/closed
10eaf342f539 201025_1
hgs
parents: 47
diff changeset
   179
    connect(parent(), SIGNAL(sizeChanged()), this, SLOT(ensureCursorVisibility()),
10eaf342f539 201025_1
hgs
parents: 47
diff changeset
   180
        Qt::QueuedConnection);
51
hgs
parents: 49
diff changeset
   181
hgs
parents: 49
diff changeset
   182
    // Listen scroll posion change signals for header reposition.
hgs
parents: 49
diff changeset
   183
    connect(mScrollArea, SIGNAL(scrollPositionChanged(QPointF)),
hgs
parents: 49
diff changeset
   184
    		mHeader, SLOT(repositHeader(QPointF)));
hgs
parents: 49
diff changeset
   185
hgs
parents: 49
diff changeset
   186
    // Listen content change signal for body widget width adjustment.
hgs
parents: 49
diff changeset
   187
    connect(mEditorWidget->document(), SIGNAL(contentsChanged()), this, 
hgs
parents: 49
diff changeset
   188
        SLOT(setEditorContentWidth()), Qt::QueuedConnection);
18
578830873419 Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   189
}
578830873419 Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   190
578830873419 Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   191
/*!
578830873419 Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   192
    Return pointer to the email body text edit widget
578830873419 Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   193
 */
47
hgs
parents: 44
diff changeset
   194
NmEditorTextEdit *NmEditorContent::editor() const
18
578830873419 Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   195
{
43
hgs
parents: 23
diff changeset
   196
    NM_FUNCTION;
hgs
parents: 23
diff changeset
   197
    
18
578830873419 Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   198
    return mEditorWidget;
578830873419 Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   199
}
578830873419 Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   200
578830873419 Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   201
/*!
578830873419 Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   202
    Return pointer to the header widget
578830873419 Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   203
 */
47
hgs
parents: 44
diff changeset
   204
NmEditorHeader *NmEditorContent::header() const
18
578830873419 Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   205
{
43
hgs
parents: 23
diff changeset
   206
    NM_FUNCTION;
hgs
parents: 23
diff changeset
   207
    
48
10eaf342f539 201025_1
hgs
parents: 47
diff changeset
   208
    return mHeader;
18
578830873419 Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   209
}
578830873419 Revision: 201011
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   210
47
hgs
parents: 44
diff changeset
   211
/*!
hgs
parents: 44
diff changeset
   212
    This slot is called when header widget height has been changed. Function performs
hgs
parents: 44
diff changeset
   213
    the repositioning of the body field and resizing of the editor and content area.
hgs
parents: 44
diff changeset
   214
 */
hgs
parents: 44
diff changeset
   215
void NmEditorContent::setEditorContentHeight()
hgs
parents: 44
diff changeset
   216
{
hgs
parents: 44
diff changeset
   217
    NM_FUNCTION;
hgs
parents: 44
diff changeset
   218
    
48
10eaf342f539 201025_1
hgs
parents: 47
diff changeset
   219
    // the height of the margin between the title bar and the header
47
hgs
parents: 44
diff changeset
   220
    qreal topMargin = 0;
hgs
parents: 44
diff changeset
   221
    HbStyle().parameter("hb-param-margin-gene-top", topMargin);
hgs
parents: 44
diff changeset
   222
    
hgs
parents: 44
diff changeset
   223
    // header height
48
10eaf342f539 201025_1
hgs
parents: 47
diff changeset
   224
    qreal headerHeight = mHeader->headerHeight();
47
hgs
parents: 44
diff changeset
   225
hgs
parents: 44
diff changeset
   226
    // body area editor's document height with margins added
hgs
parents: 44
diff changeset
   227
    qreal documentHeightAndMargins = mEditorWidget->document()->size().height() +
hgs
parents: 44
diff changeset
   228
        (mEditorWidget->document()->documentMargin() * 2);
hgs
parents: 44
diff changeset
   229
48
10eaf342f539 201025_1
hgs
parents: 47
diff changeset
   230
    // chrome height
47
hgs
parents: 44
diff changeset
   231
    qreal chromeHeight = 0;
hgs
parents: 44
diff changeset
   232
    HbStyle().parameter("hb-param-widget-chrome-height", chromeHeight);
hgs
parents: 44
diff changeset
   233
    
hgs
parents: 44
diff changeset
   234
    // screen height
hgs
parents: 44
diff changeset
   235
    qreal screenHeight = mApplication.screenSize().height();
hgs
parents: 44
diff changeset
   236
hgs
parents: 44
diff changeset
   237
    // set min size for the body area so that at least the screen area is always filled
hgs
parents: 44
diff changeset
   238
    qreal bodyAreaMinSize = screenHeight - chromeHeight - topMargin - headerHeight;
hgs
parents: 44
diff changeset
   239
    
hgs
parents: 44
diff changeset
   240
    qreal bodyAreaSize = fmax(bodyAreaMinSize, documentHeightAndMargins);
hgs
parents: 44
diff changeset
   241
hgs
parents: 44
diff changeset
   242
    mScrollAreaContents->setPreferredHeight(topMargin + headerHeight + bodyAreaSize);
hgs
parents: 44
diff changeset
   243
}
hgs
parents: 44
diff changeset
   244
hgs
parents: 44
diff changeset
   245
/*!
51
hgs
parents: 49
diff changeset
   246
    This slot is used to set width for the body field.
hgs
parents: 49
diff changeset
   247
    For some reason HbTextEdit does not set it's width, so we need to se it here.
hgs
parents: 49
diff changeset
   248
    This slot can be removed if HbTextEdit is fixed.
hgs
parents: 49
diff changeset
   249
 */
hgs
parents: 49
diff changeset
   250
void NmEditorContent::setEditorContentWidth()
hgs
parents: 49
diff changeset
   251
{
hgs
parents: 49
diff changeset
   252
    NM_FUNCTION;
hgs
parents: 49
diff changeset
   253
    
hgs
parents: 49
diff changeset
   254
    if (mNeedForWidthAdjustment) {
hgs
parents: 49
diff changeset
   255
        mNeedForWidthAdjustment = false;
hgs
parents: 49
diff changeset
   256
        mScrollAreaContents->setPreferredWidth(mEditorWidget->document()->idealWidth());
hgs
parents: 49
diff changeset
   257
    }
hgs
parents: 49
diff changeset
   258
}
hgs
parents: 49
diff changeset
   259
hgs
parents: 49
diff changeset
   260
/*!
48
10eaf342f539 201025_1
hgs
parents: 47
diff changeset
   261
    This slot is called when the cursor visibility has to be ensured ie. the scroll position is 
10eaf342f539 201025_1
hgs
parents: 47
diff changeset
   262
    adjusted so that the cursor can be seen.
10eaf342f539 201025_1
hgs
parents: 47
diff changeset
   263
*/
10eaf342f539 201025_1
hgs
parents: 47
diff changeset
   264
void NmEditorContent::ensureCursorVisibility()
47
hgs
parents: 44
diff changeset
   265
{
hgs
parents: 44
diff changeset
   266
    NM_FUNCTION;
hgs
parents: 44
diff changeset
   267
48
10eaf342f539 201025_1
hgs
parents: 47
diff changeset
   268
    // check which of the editors has the focus and get the x/y coordinates for the cursor position
10eaf342f539 201025_1
hgs
parents: 47
diff changeset
   269
    QGraphicsWidget *focused = mScrollAreaContents->focusWidget();
10eaf342f539 201025_1
hgs
parents: 47
diff changeset
   270
    
10eaf342f539 201025_1
hgs
parents: 47
diff changeset
   271
    if (focused) {
10eaf342f539 201025_1
hgs
parents: 47
diff changeset
   272
        QRectF localRect(0, 0, 0, 0);
10eaf342f539 201025_1
hgs
parents: 47
diff changeset
   273
        bool notFound = false;
10eaf342f539 201025_1
hgs
parents: 47
diff changeset
   274
        
10eaf342f539 201025_1
hgs
parents: 47
diff changeset
   275
        if (focused == mHeader->toEdit()) {
10eaf342f539 201025_1
hgs
parents: 47
diff changeset
   276
            localRect = mHeader->toEdit()->rectForCursorPosition();
10eaf342f539 201025_1
hgs
parents: 47
diff changeset
   277
        }
10eaf342f539 201025_1
hgs
parents: 47
diff changeset
   278
        else if (focused == mHeader->ccEdit()) {
10eaf342f539 201025_1
hgs
parents: 47
diff changeset
   279
            localRect = mHeader->ccEdit()->rectForCursorPosition();
10eaf342f539 201025_1
hgs
parents: 47
diff changeset
   280
        }
10eaf342f539 201025_1
hgs
parents: 47
diff changeset
   281
        else if (focused == mHeader->bccEdit()) {
10eaf342f539 201025_1
hgs
parents: 47
diff changeset
   282
            localRect = mHeader->bccEdit()->rectForCursorPosition();
10eaf342f539 201025_1
hgs
parents: 47
diff changeset
   283
        }
10eaf342f539 201025_1
hgs
parents: 47
diff changeset
   284
        else if (focused == mHeader->subjectEdit()) {
10eaf342f539 201025_1
hgs
parents: 47
diff changeset
   285
            localRect = mHeader->subjectEdit()->rectForCursorPosition();
10eaf342f539 201025_1
hgs
parents: 47
diff changeset
   286
        }
10eaf342f539 201025_1
hgs
parents: 47
diff changeset
   287
        else if (focused == mEditorWidget) {
10eaf342f539 201025_1
hgs
parents: 47
diff changeset
   288
            localRect = mEditorWidget->rectForCursorPosition();
10eaf342f539 201025_1
hgs
parents: 47
diff changeset
   289
        }
10eaf342f539 201025_1
hgs
parents: 47
diff changeset
   290
        else {
10eaf342f539 201025_1
hgs
parents: 47
diff changeset
   291
            notFound = true;
10eaf342f539 201025_1
hgs
parents: 47
diff changeset
   292
        }
47
hgs
parents: 44
diff changeset
   293
48
10eaf342f539 201025_1
hgs
parents: 47
diff changeset
   294
        if (!notFound) {
10eaf342f539 201025_1
hgs
parents: 47
diff changeset
   295
            QPointF topLeftPos = focused->mapToItem(mScrollAreaContents, localRect.topLeft());
10eaf342f539 201025_1
hgs
parents: 47
diff changeset
   296
            QPointF bottomRightPos =
10eaf342f539 201025_1
hgs
parents: 47
diff changeset
   297
                focused->mapToItem(mScrollAreaContents, localRect.bottomRight());
10eaf342f539 201025_1
hgs
parents: 47
diff changeset
   298
            qreal marginRight = 0;
10eaf342f539 201025_1
hgs
parents: 47
diff changeset
   299
            HbStyle().parameter("hb-param-margin-gene-right", marginRight);
10eaf342f539 201025_1
hgs
parents: 47
diff changeset
   300
            bottomRightPos.rx() += marginRight;
10eaf342f539 201025_1
hgs
parents: 47
diff changeset
   301
            mScrollArea->ensureVisible(topLeftPos);
10eaf342f539 201025_1
hgs
parents: 47
diff changeset
   302
            mScrollArea->ensureVisible(bottomRightPos);
10eaf342f539 201025_1
hgs
parents: 47
diff changeset
   303
        }
47
hgs
parents: 44
diff changeset
   304
    }
hgs
parents: 44
diff changeset
   305
}
hgs
parents: 44
diff changeset
   306
/*!
hgs
parents: 44
diff changeset
   307
    Removes embedded images from the message body
hgs
parents: 44
diff changeset
   308
 */
hgs
parents: 44
diff changeset
   309
void NmEditorContent::removeEmbeddedImages(QString &bodyContent)
hgs
parents: 44
diff changeset
   310
{
hgs
parents: 44
diff changeset
   311
    NM_FUNCTION;
hgs
parents: 44
diff changeset
   312
 
hgs
parents: 44
diff changeset
   313
    QRegExp regExp(NMUI_EDITOR_REMOVE_EMBD_IMAGES_REG, Qt::CaseInsensitive);
hgs
parents: 44
diff changeset
   314
    bodyContent.remove(regExp);
48
10eaf342f539 201025_1
hgs
parents: 47
diff changeset
   315
}