messagingapp/msgui/unifiededitor/src/msgunieditorbody.cpp
branchGCC_SURGE
changeset 47 5b14749788d7
parent 27 e4592d119491
parent 44 36f374c67aa8
--- a/messagingapp/msgui/unifiededitor/src/msgunieditorbody.cpp	Thu Jun 17 09:57:06 2010 +0100
+++ b/messagingapp/msgui/unifiededitor/src/msgunieditorbody.cpp	Thu Jul 22 16:32:06 2010 +0100
@@ -21,12 +21,7 @@
 #include <HbFrameItem>
 #include <HbFrameDrawer>
 #include <HbIconItem>
-#include <HbPushButton>
 #include <HbAction>
-#include <hbinputeditorinterface.h>
-//#include <HbGestureSceneFilter>
-//#include <HbGesture>
-#include <HbMenu>
 #include <HbMainWindow>
 #include <HbDeviceProfile>
 #include <QImageReader>
@@ -45,40 +40,34 @@
 #include <xqrequestinfo.h>
 #include <xqsharablefile.h>
 #include <xqappmgr.h>
-
+#include <xqconversions.h>
 // USER INCLUDES
 #include "msgunieditorbody.h"
 #include "UniEditorGenUtils.h"
-#include "unisendingsettings.h"
-#include "msgmonitor.h"
-#include "s60qconversions.h"
+#include "UniSendingSettings.h"
+#include "msgunieditormonitor.h"
+
 #include "mmsconformancecheck.h"
 #include "unieditorpluginloader.h"
 #include "unieditorplugininterface.h"
 #include "convergedmessage.h"
 #include "msgmediautil.h"
+#include "msgunieditorpixmapwidget.h"
+#include "msgunieditoraudiowidget.h"
 
 // Constants
-const QString EDITOR_FRAME("qtg_fr_lineedit_normal");
 const QString BACKGROUND_FRAME("qtg_fr_btn_normal");
-const QString AUDIO_REGION("AudioRegion");
-const QString VIDEO_REGION("VideoRegion");
-const QString IMAGE_REGION("ImageRegion");
-const QString INVALID_REGION("InvalidRegion");
-const QString SEND_ICON("qtg_mono_send");
+
 const int KShowCounterLimit = 10;
 const int BYTES_TO_KBYTES_FACTOR = 1024; 
 
 //Localized Constants for item specific menu
-#define LOC_OPEN    hbTrId("txt_common_menu_open")
-#define LOC_REMOVE  hbTrId("txt_common_menu_remove")
-#define LOC_DETAILS hbTrId("txt_common_menu_details")
 #define LOC_TITLE   hbTrId("txt_messaging_title_messaging")
 #define LOC_UNABLE_TO_ADD_CONTENT hbTrId("txt_messaging_dpopinfo_unable_to_add_more_content")
 #define LOC_UNABLE_TO_ATTACH_ITEM hbTrId("txt_messaging_dpopinfo_unable_to_attach_item_avai")
 #define LOC_PROCESSING hbTrId("txt_messaging_formlabel_loading")
+#define LOC_HINT_TEXT hbTrId("txt_messaging_formlabel_enter_message_here")
 
-const QString AUDIO_ICON("qtg_mono_audio");
 const QString ANIMATION_ICON("qtg_anim_loading");
 const QString ANIMATION_FILE(":/qtg_anim_loading.axml");
 // LOCAL FUNCTIONS
@@ -90,7 +79,7 @@
 void showInsertFailureNote()
 {
     int availableSize =
-            (MsgMonitor::maxMmsSize() - MsgMonitor::messageSize())
+            (MsgUnifiedEditorMonitor::maxMmsSize() - MsgUnifiedEditorMonitor::messageSize())
             /BYTES_TO_KBYTES_FACTOR;
     QString displayStr = QString(LOC_UNABLE_TO_ATTACH_ITEM)
             .arg(availableSize);
@@ -108,8 +97,7 @@
 mHasImage(false),
 mHasAudio(false),
 mTextEdit(0),
-mEditorFrame(0),
-mIconItem(0),
+mPixmapItem(0),
 mAudioItem(0),
 mImageSize(0),
 mAudioSize(0),
@@ -117,29 +105,13 @@
 mProcessImageOperation(0),
 mMediaResolver(0),
 mImageInfo(0),
-mProcessingWidget(0)
+mProcessingWidget(0),
+mDraftMessage(false),
+mIsImageResizing(false)
 {
     mTextEdit = new HbTextEdit(this);
+    mTextEdit->setPlaceholderText(LOC_HINT_TEXT);
     HbStyle::setItemName(mTextEdit,"textEdit");
-
-    HbFrameDrawer* frameDrawer = new HbFrameDrawer(EDITOR_FRAME, 
-                                                   HbFrameDrawer::NinePieces);
-    
-    mEditorFrame = new HbFrameItem(frameDrawer,this);
-    HbStyle::setItemName(mEditorFrame,"textEditFrame");
-    mEditorFrame->setZValue(-1);
-    
-    // add "Send" action in VKB
-    HbEditorInterface editorInterface(mTextEdit);
-    HbAction *sendAction = new HbAction(HbIcon(SEND_ICON), QString(),this);
-    connect(sendAction, SIGNAL(triggered()),this, SIGNAL(sendMessage()));
-    editorInterface.addAction(sendAction);
-
-  /*  mGestureFilter = new HbGestureSceneFilter(Qt::LeftButton, this);
-    mGestureFilter->setLongpressAnimation(true);
-    HbGesture *gesture = new HbGesture(HbGesture::longpress, 5);
-    mGestureFilter->addGesture(gesture);
-    connect(gesture, SIGNAL(longPress(QPointF)), this, SLOT(longPressed(QPointF)));*/
     connect(mTextEdit, SIGNAL(contentsChanged()), this, SLOT(onTextChanged()));
 
     mMmsConformanceCheck = new MmsConformanceCheck;
@@ -198,67 +170,82 @@
     return mTextEdit->toPlainText();
 }
 
-void MsgUnifiedEditorBody::setImage(QString& imagefile)
-{
-    if (!mImageInfo)
-     {
-        setImage(true);
-        
-        mImageFile = imagefile;
-        if (mIconItem)
+void MsgUnifiedEditorBody::setImage(QString& imagefile, bool draftMessage)
+    {
+    // do nothing if filepath is empty
+    if (imagefile.isEmpty())
         {
-            delete mIconItem;
-            mIconItem = NULL;
-            mImageSize = 0;
-        }
-
-        int error = KErrNone;
-        
-        if( !mProcessImageOperation )
-        {
-        TRAP(error,mProcessImageOperation = 
-            CUniEditorProcessImageOperation::NewL(*this));
-        }
-        if( !mMediaResolver && error == KErrNone )
-        {
-        TRAP(error,mMediaResolver = CMsgMediaResolver::NewL());
+        return;
         }
 
-        if( error == KErrNone)
+    mDraftMessage = draftMessage;
+    if (!mImageInfo)
         {
-            mMediaResolver->SetCharacterSetRecognition(EFalse);
-            HBufC *name = S60QConversions::qStringToS60Desc(imagefile);
-            RFile file;
-            TRAP(error, file = mMediaResolver->FileHandleL(*name));
-            if(error == KErrNone)
+        setImage(true);
+
+        mImageFile = imagefile;
+        if (mPixmapItem)
+            {
+            mPixmapItem->setParent(NULL);
+            delete mPixmapItem;
+            mPixmapItem = NULL;
+            mImageSize = 0;
+            }
+
+        int error = KErrNone;
+        if (!mDraftMessage)
             {
-                TRAP(error,mImageInfo = static_cast<CMsgImageInfo*>
-                (mMediaResolver->CreateMediaInfoL(file)));
+        // if image is in draft, no need to resize it because it is resized already
+            if (!mProcessImageOperation)
+                {
+                TRAP(error,mProcessImageOperation =
+                        CUniEditorProcessImageOperation::NewL(*this));
+                }
+            if (!mMediaResolver && error == KErrNone)
+                {
+                TRAP(error,mMediaResolver = CMsgMediaResolver::NewL());
+                }
+
+            if (error == KErrNone)
+                {
+                mMediaResolver->SetCharacterSetRecognition(EFalse);
+                HBufC *name = XQConversions::qStringToS60Desc(imagefile);
+                RFile file;
+                TRAP(error, file = mMediaResolver->FileHandleL(*name));
                 if (error == KErrNone)
-                {
-                    TRAP(error, mMediaResolver->ParseInfoDetailsL(
-                            mImageInfo, file));
+                    {
+                    TRAP(error,mImageInfo = static_cast<CMsgImageInfo*>
+                            (mMediaResolver->CreateMediaInfoL(file)));
+                    if (error == KErrNone)
+                        {
+                        TRAP(error, mMediaResolver->ParseInfoDetailsL(
+                                        mImageInfo, file));
+                        }
+                    file.Close();
+                    }
+                delete name;
                 }
-                file.Close();
             }
-            delete name;
-        }
-
-        if (error == KErrNone)
-        {
+        if (error == KErrNone && !mDraftMessage)
+            {
             mSavedImageFile = imagefile;
             startResizeAnimation();
+            mIsImageResizing = true;
             mProcessImageOperation->Process(mImageInfo);
-        }
+            }
         else
-        {
-            delete mImageInfo;
-            mImageInfo = NULL;
+            {
+            if (mImageInfo)
+                {
+                delete mImageInfo;
+                mImageInfo = NULL;
+                }
             mSavedImageFile.clear();
             handleSetImage();
+            }
+
         }
     }
-}
 
 void MsgUnifiedEditorBody::handleSetImage()
 {   
@@ -269,7 +256,7 @@
     int msgSize = messageSize();
     QFileInfo fileinfo(mImageFile);
     int imageSize = fileinfo.size() + KEstimatedMimeHeaderSize;
-    if ( (imageSize + msgSize) <= MsgMonitor::maxMmsSize())
+    if ( (imageSize + msgSize) <= MsgUnifiedEditorMonitor::maxMmsSize())
     {
         mImageSize = imageSize;
     }
@@ -282,16 +269,13 @@
         return;
     }
 
-    mIconItem = new HbIconItem(this);
-    mIconItem->hide();
-    //mIconItem->setIconName(mImageFile);
-    QPixmap pixmap(mImageFile);
-    mIconItem->setIcon(HbIcon(pixmap));
-
-    HbStyle::setItemName(mIconItem, "pixmap");
-    mIconItem->setAlignment(Qt::AlignHCenter | Qt::AlignTop);
-   // mIconItem->installSceneEventFilter(mGestureFilter);
-
+    mPixmapItem = new MsgUnifiedEditorPixmapWidget(this);
+    mPixmapItem->hide();
+    HbStyle::setItemName(mPixmapItem, "pixmap");
+    mPixmapItem->setAlignment(Qt::AlignHCenter | Qt::AlignTop);
+    mPixmapItem->populate(mImageFile);
+    connect(mPixmapItem,SIGNAL(remove()),this,SLOT(removeMedia()));
+    
     // repolish the body widget
     this->repolish();
 
@@ -301,6 +285,12 @@
 
 void MsgUnifiedEditorBody::setAudio(QString& audiofile)
 {
+    // do nothing if filepath is empty
+    if(audiofile.isEmpty())
+    {
+        return;
+    }
+
     //check for insert conformance
     if(EInsertSuccess != mMmsConformanceCheck->checkModeForInsert(audiofile))
         return;
@@ -309,6 +299,7 @@
     mAudioFile = audiofile;
     if(mAudioItem)
     {
+        mAudioItem->setParent(NULL);
         delete mAudioItem;
         mAudioItem = NULL;
         mAudioSize = 0;
@@ -317,7 +308,7 @@
     int msgSize = messageSize();
     QFileInfo fileinfo(mAudioFile);
     int audioSize = fileinfo.size() + KEstimatedMimeHeaderSize;
-    if((audioSize + msgSize) <= MsgMonitor::maxMmsSize() )
+    if((audioSize + msgSize) <= MsgUnifiedEditorMonitor::maxMmsSize() )
     {
     	mAudioSize = audioSize;
     }
@@ -330,16 +321,11 @@
     	return;
     }    
 
-    HbIconItem* audioIcon = new HbIconItem(AUDIO_ICON);
-    mAudioItem = new HbPushButton(this);
+    mAudioItem = new MsgUniFiedEditorAudioWidget(this);
     mAudioItem->hide();
     HbStyle::setItemName(mAudioItem,"audioItem");
-    mAudioItem->setIcon(audioIcon->icon());
-    mAudioItem->setText(fileinfo.baseName());
-    MsgMediaUtil mediaUtil;
-    mAudioItem->setAdditionalText(mediaUtil.mediaDuration(mAudioFile));
-    mAudioItem->setTextAlignment(Qt::AlignVCenter | Qt::AlignLeft);
-    connect(mAudioItem, SIGNAL(longPress(QPointF)), this, SLOT(longPressed(QPointF)));
+    mAudioItem->populate(mAudioFile);
+    connect(mAudioItem,SIGNAL(remove()),this,SLOT(removeMedia()));
 
     // repolish the body widget
     this->repolish();
@@ -350,7 +336,10 @@
 
 void MsgUnifiedEditorBody::setText(QString& text)
 {
-	mTextEdit->setPlainText(text);
+    if(!text.isEmpty())
+    {    
+        mTextEdit->setPlainText(text);
+    }
 }
 
 const QStringList MsgUnifiedEditorBody::mediaContent()
@@ -363,8 +352,6 @@
     if(mHasAudio)
         mediaFiles << mAudioFile;
 
-    //TODO: append video content
-
     return mediaFiles;
 }
 
@@ -427,7 +414,7 @@
         mAudioItem->show();
     }
     
-    if(mIconItem || mProcessingWidget)
+    if(mPixmapItem || mProcessingWidget)
         {
         QSizeF imageSize(0.0,0.0);
         QSizeF defaultImageSize(QImageReader(mImageFile).size());
@@ -461,17 +448,17 @@
                 imageSize.setWidth(newWidth);
             }
 
-            if(mIconItem)
+            if(mPixmapItem)
             {
-            mIconItem->setPreferredSize(imageSize);
-            mIconItem->setSize(imageSize);
+            mPixmapItem->setPreferredSize(imageSize);
+            mPixmapItem->setSize(imageSize);
             if(mMainWindow->orientation() == Qt::Horizontal)
             {
-                QPointF currPos = mIconItem->pos();
+                QPointF currPos = mPixmapItem->pos();
                 currPos.setX(leftMargin+((maxWidth-imageSize.width())/2));
-                mIconItem->setPos(currPos);
+                mPixmapItem->setPos(currPos);
             }
-            mIconItem->show();
+            mPixmapItem->show();
             }
             
             if(mProcessingWidget)
@@ -490,147 +477,46 @@
     return szHint;
 }
 
-void MsgUnifiedEditorBody::longPressed(QPointF position)
-{
-    HbMenu* menu = new HbMenu;
-    menu->addAction(LOC_OPEN, this, SLOT(openMedia()));
-    menu->addAction(LOC_REMOVE, this, SLOT(removeMedia()));
-    menu->addAction(LOC_DETAILS, this, SLOT(viewDetails()));
-
-    menu->setDismissPolicy(HbPopup::TapAnywhere);
-    menu->setAttribute(Qt::WA_DeleteOnClose, true);
-    menu->setPreferredPos(position);
-
-    menu->setObjectName(getHitRegion(position));
-    menu->show();
-}
-
 void MsgUnifiedEditorBody::removeMedia()
 {
-    HbAction* action = qobject_cast<HbAction*>(sender());
-    QString objName = action->parent()->objectName();
-    if(objName == IMAGE_REGION)
+    QObject* senderObject = sender();
+    
+    MsgUnifiedEditorPixmapWidget* pixmap = 
+        qobject_cast<MsgUnifiedEditorPixmapWidget*>(senderObject);
+
+    MsgUniFiedEditorAudioWidget* audio = 
+        qobject_cast<MsgUniFiedEditorAudioWidget*>(senderObject);
+    
+    if(pixmap) //remove image
     {
         mImageFile.clear();
-        if(mIconItem)
+        if(mPixmapItem)
         {
-      //      mIconItem->removeSceneEventFilter(mGestureFilter);
-            delete mIconItem;
-            mIconItem = NULL;
+            mPixmapItem->setParent(NULL);
+            delete mPixmapItem;
+            mPixmapItem = NULL;
         }
         setImage(false);
         mImageSize = 0;
     }
-    else if(objName == AUDIO_REGION)
-    {
-        mAudioFile.clear();
-        if(mAudioItem)
+    else if(audio)//remove audio item
         {
-            delete mAudioItem;
-            mAudioItem = NULL;
+            mAudioFile.clear();
+            if(mAudioItem)
+            {
+                mAudioItem->setParent(NULL);
+                delete mAudioItem;
+                mAudioItem = NULL;
+            }
+            setAudio(false);
+            mAudioSize = 0;
         }
-        setAudio(false);
-        mAudioSize = 0;
-    }
-    else if(objName == VIDEO_REGION)
-    {
-        //TODO: complete this with video handling story
-    }
-    else
-    {
-        // return without doing anything
-        return;
-    }
 
     this->repolish();
 
 	emit contentChanged();
 }
 
-//---------------------------------------------------------------
-// MsgUnifiedEditorBody :: openMedia
-// @see header file
-//---------------------------------------------------------------
-void MsgUnifiedEditorBody::openMedia()
-{
-    HbAction* action = qobject_cast<HbAction*>(sender());
-    QString objName = action->parent()->objectName();
-    
-    QString fileName;
-    if ( objName == IMAGE_REGION )
-    {
-        fileName = mImageFile;
-    }
-    else if ( objName == AUDIO_REGION )
-    {
-        fileName = mAudioFile;
-    }
-    else
-    {
-        return;
-    }
-    
-    XQSharableFile sf;
-    XQAiwRequest* request = 0;
-
-    if ( !sf.open(fileName) ) 
-        {
-        return;
-        }
-
-    // Get handlers
-    XQApplicationManager appManager;
-    QList<XQAiwInterfaceDescriptor> fileHandlers = appManager.list(sf);
-    if (fileHandlers.count() > 0)
-        {
-        XQAiwInterfaceDescriptor d = fileHandlers.first();
-        request = appManager.create(sf, d);
-    
-        if ( !request )
-            {
-            sf.close();
-            return ;
-            }
-        }
-    else
-        {
-        sf.close();
-        return;
-        }
-
-    // Result handlers
-    connect (request, SIGNAL(requestOk(const QVariant&)), 
-            this, SLOT(handleOk(const QVariant&)));
-    connect (request, SIGNAL(requestError(const QVariant&)), 
-            this, SLOT(handleError(const QVariant&)));
-
-    request->setEmbedded(true);
-    request->setSynchronous(true);
-
-    // Fill args
-    QList<QVariant> args;
-    args << qVariantFromValue(sf);
-    request->setArguments(args);
-
-    // Fill headers
-    QString key("WindowTitle");
-    QVariant value(QString(LOC_TITLE));
-    XQRequestInfo info;
-    info.setInfo(key, value);
-    request->setInfo(info);
-    
-    request->send();
-    
-    // Cleanup
-    sf.close();
-    delete request;
-}
-
-void MsgUnifiedEditorBody::viewDetails()
-{
-    //open details view.
-}
-
 bool MsgUnifiedEditorBody::hasImage()
 {
     return mHasImage;
@@ -676,32 +562,7 @@
         estimatedMediaSize = KEstimatedMmsSmilHeaderSize;
     }
     
-    return estimatedMediaSize + MsgMonitor::subjectSize() + MsgMonitor::containerSize();
-}
-
-QString MsgUnifiedEditorBody::getHitRegion(QPointF position)
-{
-    if(mIconItem)
-    {
-        QPolygonF imageHitRegion = mIconItem->mapToScene(mIconItem->boundingRect());
-        if(imageHitRegion.containsPoint(position, Qt::OddEvenFill))
-        {
-            return IMAGE_REGION;
-        }
-    }
-
-    if(mAudioItem)
-    {
-        QPolygonF audioHitRegion = mAudioItem->mapToScene(mAudioItem->boundingRect());
-        if(audioHitRegion.containsPoint(position, Qt::OddEvenFill))
-        {
-            return AUDIO_REGION;
-        }
-    }
-
-    //TODO : add hit test for video region with video userstory
-
-    return INVALID_REGION;
+    return estimatedMediaSize + MsgUnifiedEditorMonitor::subjectSize() + MsgUnifiedEditorMonitor::containerSize();
 }
 
 void MsgUnifiedEditorBody::onTextChanged()
@@ -709,12 +570,12 @@
     QString string = text();
 
     if( string.size() > mPrevBuffer.size() &&
-        MsgMonitor::messageType() == ConvergedMessage::Mms )
+        MsgUnifiedEditorMonitor::messageType() == ConvergedMessage::Mms )
     {
         // reject any text input if mms size limit is reached
         int futureSize = bodySize() +
-                MsgMonitor::containerSize() + MsgMonitor::subjectSize();
-        if(futureSize > MsgMonitor::maxMmsSize())
+                MsgUnifiedEditorMonitor::containerSize() + MsgUnifiedEditorMonitor::subjectSize();
+        if(futureSize > MsgUnifiedEditorMonitor::maxMmsSize())
         {
             mTextEdit->setPlainText(mPrevBuffer);
             HbNotificationDialog::launchDialog(LOC_UNABLE_TO_ADD_CONTENT);
@@ -754,7 +615,7 @@
     // emit signal to indicate change in content
     emit contentChanged();
     
-    if(MsgMonitor::messageType() == ConvergedMessage::Sms)
+    if(MsgUnifiedEditorMonitor::messageType() == ConvergedMessage::Sms)
     {
         //Set char counter value
         QString display = QString("%1(%2)").arg(numOfRemainingChars).arg(
@@ -777,27 +638,34 @@
 void MsgUnifiedEditorBody::EditorOperationEvent(
     TUniEditorProcessImageOperationEvent aEvent, TFileName aFileName)
 {
-    stopResizeAnimation();
-    
     delete mImageInfo;
     mImageInfo = NULL;
 
     if (aEvent == EUniEditorProcessImageOperationComplete && 
             aFileName.Length() > 0)
     {
-        mImageFile = S60QConversions::s60DescToQString(aFileName);
+        mImageFile = XQConversions::s60DescToQString(aFileName);
     }
     else
     {
         mImageFile = mSavedImageFile;
     }
     mSavedImageFile.clear();
+
+   // image resize is complete. reset the image resize flag
+    mIsImageResizing = false;
     //handle the processed image from ProcessImage Operation
     handleSetImage();
+    
+    stopResizeAnimation();
 }
 
 void MsgUnifiedEditorBody::startResizeAnimation()
 {
+    // emit signal to indicate disable the send tool button.
+    emit enableSendButton(false);
+    
+	
     QGraphicsLinearLayout* processingLayout = new QGraphicsLinearLayout(Qt::Vertical);
     
     mProcessingWidget = new HbWidget(this);
@@ -810,6 +678,7 @@
     processingLayout->addItem(processingText);
     
     HbIconItem* animationItem = new HbIconItem(ANIMATION_ICON,mProcessingWidget);
+    animationItem->setAlignment(Qt::AlignHCenter);
     processingLayout->addItem(animationItem);
     
     HbIconAnimator& iconAnimator = animationItem->animator();
@@ -828,6 +697,7 @@
         delete mProcessingWidget;
         mProcessingWidget = NULL;
     }
+	
 }
 
 // ---------------------------------------------------------
@@ -850,26 +720,6 @@
 }
 
 //---------------------------------------------------------------
-// MsgUnifiedEditorBody :: handleOk
-// @see header file
-//---------------------------------------------------------------
-void MsgUnifiedEditorBody::handleOk(const QVariant& result)
-{
-    Q_UNUSED(result)
-}
-
-//---------------------------------------------------------------
-// MsgUnifiedEditorBody :: handleError
-// @see header file
-//---------------------------------------------------------------
-void MsgUnifiedEditorBody::handleError(int errorCode, 
-    const QString& errorMessage)
-{
-    Q_UNUSED(errorMessage)
-    Q_UNUSED(errorCode)
-}
-
-//---------------------------------------------------------------
 // MsgUnifiedEditorBody :: setFocus
 // @see header file
 //---------------------------------------------------------------