messagingapp/msgui/unifiededitor/src/msgunieditorbody.cpp
branchGCC_SURGE
changeset 47 5b14749788d7
parent 27 e4592d119491
parent 44 36f374c67aa8
equal deleted inserted replaced
35:a32b19fb291e 47:5b14749788d7
    19 #include <HbTextEdit>
    19 #include <HbTextEdit>
    20 #include <HbTextItem>
    20 #include <HbTextItem>
    21 #include <HbFrameItem>
    21 #include <HbFrameItem>
    22 #include <HbFrameDrawer>
    22 #include <HbFrameDrawer>
    23 #include <HbIconItem>
    23 #include <HbIconItem>
    24 #include <HbPushButton>
       
    25 #include <HbAction>
    24 #include <HbAction>
    26 #include <hbinputeditorinterface.h>
       
    27 //#include <HbGestureSceneFilter>
       
    28 //#include <HbGesture>
       
    29 #include <HbMenu>
       
    30 #include <HbMainWindow>
    25 #include <HbMainWindow>
    31 #include <HbDeviceProfile>
    26 #include <HbDeviceProfile>
    32 #include <QImageReader>
    27 #include <QImageReader>
    33 #include <QFileInfo>
    28 #include <QFileInfo>
    34 #include <MsgMediaResolver.h>
    29 #include <MsgMediaResolver.h>
    43 #include <smutset.h>
    38 #include <smutset.h>
    44 #include <xqaiwrequest.h>
    39 #include <xqaiwrequest.h>
    45 #include <xqrequestinfo.h>
    40 #include <xqrequestinfo.h>
    46 #include <xqsharablefile.h>
    41 #include <xqsharablefile.h>
    47 #include <xqappmgr.h>
    42 #include <xqappmgr.h>
    48 
    43 #include <xqconversions.h>
    49 // USER INCLUDES
    44 // USER INCLUDES
    50 #include "msgunieditorbody.h"
    45 #include "msgunieditorbody.h"
    51 #include "UniEditorGenUtils.h"
    46 #include "UniEditorGenUtils.h"
    52 #include "unisendingsettings.h"
    47 #include "UniSendingSettings.h"
    53 #include "msgmonitor.h"
    48 #include "msgunieditormonitor.h"
    54 #include "s60qconversions.h"
    49 
    55 #include "mmsconformancecheck.h"
    50 #include "mmsconformancecheck.h"
    56 #include "unieditorpluginloader.h"
    51 #include "unieditorpluginloader.h"
    57 #include "unieditorplugininterface.h"
    52 #include "unieditorplugininterface.h"
    58 #include "convergedmessage.h"
    53 #include "convergedmessage.h"
    59 #include "msgmediautil.h"
    54 #include "msgmediautil.h"
       
    55 #include "msgunieditorpixmapwidget.h"
       
    56 #include "msgunieditoraudiowidget.h"
    60 
    57 
    61 // Constants
    58 // Constants
    62 const QString EDITOR_FRAME("qtg_fr_lineedit_normal");
       
    63 const QString BACKGROUND_FRAME("qtg_fr_btn_normal");
    59 const QString BACKGROUND_FRAME("qtg_fr_btn_normal");
    64 const QString AUDIO_REGION("AudioRegion");
    60 
    65 const QString VIDEO_REGION("VideoRegion");
       
    66 const QString IMAGE_REGION("ImageRegion");
       
    67 const QString INVALID_REGION("InvalidRegion");
       
    68 const QString SEND_ICON("qtg_mono_send");
       
    69 const int KShowCounterLimit = 10;
    61 const int KShowCounterLimit = 10;
    70 const int BYTES_TO_KBYTES_FACTOR = 1024; 
    62 const int BYTES_TO_KBYTES_FACTOR = 1024; 
    71 
    63 
    72 //Localized Constants for item specific menu
    64 //Localized Constants for item specific menu
    73 #define LOC_OPEN    hbTrId("txt_common_menu_open")
       
    74 #define LOC_REMOVE  hbTrId("txt_common_menu_remove")
       
    75 #define LOC_DETAILS hbTrId("txt_common_menu_details")
       
    76 #define LOC_TITLE   hbTrId("txt_messaging_title_messaging")
    65 #define LOC_TITLE   hbTrId("txt_messaging_title_messaging")
    77 #define LOC_UNABLE_TO_ADD_CONTENT hbTrId("txt_messaging_dpopinfo_unable_to_add_more_content")
    66 #define LOC_UNABLE_TO_ADD_CONTENT hbTrId("txt_messaging_dpopinfo_unable_to_add_more_content")
    78 #define LOC_UNABLE_TO_ATTACH_ITEM hbTrId("txt_messaging_dpopinfo_unable_to_attach_item_avai")
    67 #define LOC_UNABLE_TO_ATTACH_ITEM hbTrId("txt_messaging_dpopinfo_unable_to_attach_item_avai")
    79 #define LOC_PROCESSING hbTrId("txt_messaging_formlabel_loading")
    68 #define LOC_PROCESSING hbTrId("txt_messaging_formlabel_loading")
    80 
    69 #define LOC_HINT_TEXT hbTrId("txt_messaging_formlabel_enter_message_here")
    81 const QString AUDIO_ICON("qtg_mono_audio");
    70 
    82 const QString ANIMATION_ICON("qtg_anim_loading");
    71 const QString ANIMATION_ICON("qtg_anim_loading");
    83 const QString ANIMATION_FILE(":/qtg_anim_loading.axml");
    72 const QString ANIMATION_FILE(":/qtg_anim_loading.axml");
    84 // LOCAL FUNCTIONS
    73 // LOCAL FUNCTIONS
    85 
    74 
    86 //---------------------------------------------------------------
    75 //---------------------------------------------------------------
    88 // @return fullPath of unified editor's temporary dir
    77 // @return fullPath of unified editor's temporary dir
    89 //---------------------------------------------------------------
    78 //---------------------------------------------------------------
    90 void showInsertFailureNote()
    79 void showInsertFailureNote()
    91 {
    80 {
    92     int availableSize =
    81     int availableSize =
    93             (MsgMonitor::maxMmsSize() - MsgMonitor::messageSize())
    82             (MsgUnifiedEditorMonitor::maxMmsSize() - MsgUnifiedEditorMonitor::messageSize())
    94             /BYTES_TO_KBYTES_FACTOR;
    83             /BYTES_TO_KBYTES_FACTOR;
    95     QString displayStr = QString(LOC_UNABLE_TO_ATTACH_ITEM)
    84     QString displayStr = QString(LOC_UNABLE_TO_ATTACH_ITEM)
    96             .arg(availableSize);
    85             .arg(availableSize);
    97     HbNotificationDialog* dlg = new HbNotificationDialog();
    86     HbNotificationDialog* dlg = new HbNotificationDialog();
    98     dlg->setFocusPolicy(Qt::NoFocus);
    87     dlg->setFocusPolicy(Qt::NoFocus);
   106 MsgUnifiedEditorBody::MsgUnifiedEditorBody( QGraphicsItem *parent ) :
    95 MsgUnifiedEditorBody::MsgUnifiedEditorBody( QGraphicsItem *parent ) :
   107 MsgUnifiedEditorBaseWidget(parent),
    96 MsgUnifiedEditorBaseWidget(parent),
   108 mHasImage(false),
    97 mHasImage(false),
   109 mHasAudio(false),
    98 mHasAudio(false),
   110 mTextEdit(0),
    99 mTextEdit(0),
   111 mEditorFrame(0),
   100 mPixmapItem(0),
   112 mIconItem(0),
       
   113 mAudioItem(0),
   101 mAudioItem(0),
   114 mImageSize(0),
   102 mImageSize(0),
   115 mAudioSize(0),
   103 mAudioSize(0),
   116 mVideoSize(0),
   104 mVideoSize(0),
   117 mProcessImageOperation(0),
   105 mProcessImageOperation(0),
   118 mMediaResolver(0),
   106 mMediaResolver(0),
   119 mImageInfo(0),
   107 mImageInfo(0),
   120 mProcessingWidget(0)
   108 mProcessingWidget(0),
       
   109 mDraftMessage(false),
       
   110 mIsImageResizing(false)
   121 {
   111 {
   122     mTextEdit = new HbTextEdit(this);
   112     mTextEdit = new HbTextEdit(this);
       
   113     mTextEdit->setPlaceholderText(LOC_HINT_TEXT);
   123     HbStyle::setItemName(mTextEdit,"textEdit");
   114     HbStyle::setItemName(mTextEdit,"textEdit");
   124 
       
   125     HbFrameDrawer* frameDrawer = new HbFrameDrawer(EDITOR_FRAME, 
       
   126                                                    HbFrameDrawer::NinePieces);
       
   127     
       
   128     mEditorFrame = new HbFrameItem(frameDrawer,this);
       
   129     HbStyle::setItemName(mEditorFrame,"textEditFrame");
       
   130     mEditorFrame->setZValue(-1);
       
   131     
       
   132     // add "Send" action in VKB
       
   133     HbEditorInterface editorInterface(mTextEdit);
       
   134     HbAction *sendAction = new HbAction(HbIcon(SEND_ICON), QString(),this);
       
   135     connect(sendAction, SIGNAL(triggered()),this, SIGNAL(sendMessage()));
       
   136     editorInterface.addAction(sendAction);
       
   137 
       
   138   /*  mGestureFilter = new HbGestureSceneFilter(Qt::LeftButton, this);
       
   139     mGestureFilter->setLongpressAnimation(true);
       
   140     HbGesture *gesture = new HbGesture(HbGesture::longpress, 5);
       
   141     mGestureFilter->addGesture(gesture);
       
   142     connect(gesture, SIGNAL(longPress(QPointF)), this, SLOT(longPressed(QPointF)));*/
       
   143     connect(mTextEdit, SIGNAL(contentsChanged()), this, SLOT(onTextChanged()));
   115     connect(mTextEdit, SIGNAL(contentsChanged()), this, SLOT(onTextChanged()));
   144 
   116 
   145     mMmsConformanceCheck = new MmsConformanceCheck;
   117     mMmsConformanceCheck = new MmsConformanceCheck;
   146     
   118     
   147     mCharCounter = new HbTextItem(this);
   119     mCharCounter = new HbTextItem(this);
   196 QString MsgUnifiedEditorBody::text()
   168 QString MsgUnifiedEditorBody::text()
   197 {
   169 {
   198     return mTextEdit->toPlainText();
   170     return mTextEdit->toPlainText();
   199 }
   171 }
   200 
   172 
   201 void MsgUnifiedEditorBody::setImage(QString& imagefile)
   173 void MsgUnifiedEditorBody::setImage(QString& imagefile, bool draftMessage)
   202 {
   174     {
       
   175     // do nothing if filepath is empty
       
   176     if (imagefile.isEmpty())
       
   177         {
       
   178         return;
       
   179         }
       
   180 
       
   181     mDraftMessage = draftMessage;
   203     if (!mImageInfo)
   182     if (!mImageInfo)
   204      {
   183         {
   205         setImage(true);
   184         setImage(true);
   206         
   185 
   207         mImageFile = imagefile;
   186         mImageFile = imagefile;
   208         if (mIconItem)
   187         if (mPixmapItem)
   209         {
   188             {
   210             delete mIconItem;
   189             mPixmapItem->setParent(NULL);
   211             mIconItem = NULL;
   190             delete mPixmapItem;
       
   191             mPixmapItem = NULL;
   212             mImageSize = 0;
   192             mImageSize = 0;
   213         }
   193             }
   214 
   194 
   215         int error = KErrNone;
   195         int error = KErrNone;
   216         
   196         if (!mDraftMessage)
   217         if( !mProcessImageOperation )
   197             {
   218         {
   198         // if image is in draft, no need to resize it because it is resized already
   219         TRAP(error,mProcessImageOperation = 
   199             if (!mProcessImageOperation)
   220             CUniEditorProcessImageOperation::NewL(*this));
   200                 {
   221         }
   201                 TRAP(error,mProcessImageOperation =
   222         if( !mMediaResolver && error == KErrNone )
   202                         CUniEditorProcessImageOperation::NewL(*this));
   223         {
   203                 }
   224         TRAP(error,mMediaResolver = CMsgMediaResolver::NewL());
   204             if (!mMediaResolver && error == KErrNone)
   225         }
   205                 {
   226 
   206                 TRAP(error,mMediaResolver = CMsgMediaResolver::NewL());
   227         if( error == KErrNone)
   207                 }
   228         {
   208 
   229             mMediaResolver->SetCharacterSetRecognition(EFalse);
   209             if (error == KErrNone)
   230             HBufC *name = S60QConversions::qStringToS60Desc(imagefile);
   210                 {
   231             RFile file;
   211                 mMediaResolver->SetCharacterSetRecognition(EFalse);
   232             TRAP(error, file = mMediaResolver->FileHandleL(*name));
   212                 HBufC *name = XQConversions::qStringToS60Desc(imagefile);
   233             if(error == KErrNone)
   213                 RFile file;
   234             {
   214                 TRAP(error, file = mMediaResolver->FileHandleL(*name));
   235                 TRAP(error,mImageInfo = static_cast<CMsgImageInfo*>
       
   236                 (mMediaResolver->CreateMediaInfoL(file)));
       
   237                 if (error == KErrNone)
   215                 if (error == KErrNone)
   238                 {
   216                     {
   239                     TRAP(error, mMediaResolver->ParseInfoDetailsL(
   217                     TRAP(error,mImageInfo = static_cast<CMsgImageInfo*>
   240                             mImageInfo, file));
   218                             (mMediaResolver->CreateMediaInfoL(file)));
       
   219                     if (error == KErrNone)
       
   220                         {
       
   221                         TRAP(error, mMediaResolver->ParseInfoDetailsL(
       
   222                                         mImageInfo, file));
       
   223                         }
       
   224                     file.Close();
       
   225                     }
       
   226                 delete name;
   241                 }
   227                 }
   242                 file.Close();
   228             }
   243             }
   229         if (error == KErrNone && !mDraftMessage)
   244             delete name;
   230             {
   245         }
       
   246 
       
   247         if (error == KErrNone)
       
   248         {
       
   249             mSavedImageFile = imagefile;
   231             mSavedImageFile = imagefile;
   250             startResizeAnimation();
   232             startResizeAnimation();
       
   233             mIsImageResizing = true;
   251             mProcessImageOperation->Process(mImageInfo);
   234             mProcessImageOperation->Process(mImageInfo);
   252         }
   235             }
   253         else
   236         else
   254         {
   237             {
   255             delete mImageInfo;
   238             if (mImageInfo)
   256             mImageInfo = NULL;
   239                 {
       
   240                 delete mImageInfo;
       
   241                 mImageInfo = NULL;
       
   242                 }
   257             mSavedImageFile.clear();
   243             mSavedImageFile.clear();
   258             handleSetImage();
   244             handleSetImage();
   259         }
   245             }
   260     }
   246 
   261 }
   247         }
       
   248     }
   262 
   249 
   263 void MsgUnifiedEditorBody::handleSetImage()
   250 void MsgUnifiedEditorBody::handleSetImage()
   264 {   
   251 {   
   265     //check for insert conformance
   252     //check for insert conformance
   266     if(EInsertSuccess != mMmsConformanceCheck->checkModeForInsert(mImageFile))
   253     if(EInsertSuccess != mMmsConformanceCheck->checkModeForInsert(mImageFile))
   267         return;
   254         return;
   268     
   255     
   269     int msgSize = messageSize();
   256     int msgSize = messageSize();
   270     QFileInfo fileinfo(mImageFile);
   257     QFileInfo fileinfo(mImageFile);
   271     int imageSize = fileinfo.size() + KEstimatedMimeHeaderSize;
   258     int imageSize = fileinfo.size() + KEstimatedMimeHeaderSize;
   272     if ( (imageSize + msgSize) <= MsgMonitor::maxMmsSize())
   259     if ( (imageSize + msgSize) <= MsgUnifiedEditorMonitor::maxMmsSize())
   273     {
   260     {
   274         mImageSize = imageSize;
   261         mImageSize = imageSize;
   275     }
   262     }
   276     else
   263     else
   277     {
   264     {
   280         //Show appropriate note and leave
   267         //Show appropriate note and leave
   281         showInsertFailureNote();
   268         showInsertFailureNote();
   282         return;
   269         return;
   283     }
   270     }
   284 
   271 
   285     mIconItem = new HbIconItem(this);
   272     mPixmapItem = new MsgUnifiedEditorPixmapWidget(this);
   286     mIconItem->hide();
   273     mPixmapItem->hide();
   287     //mIconItem->setIconName(mImageFile);
   274     HbStyle::setItemName(mPixmapItem, "pixmap");
   288     QPixmap pixmap(mImageFile);
   275     mPixmapItem->setAlignment(Qt::AlignHCenter | Qt::AlignTop);
   289     mIconItem->setIcon(HbIcon(pixmap));
   276     mPixmapItem->populate(mImageFile);
   290 
   277     connect(mPixmapItem,SIGNAL(remove()),this,SLOT(removeMedia()));
   291     HbStyle::setItemName(mIconItem, "pixmap");
   278     
   292     mIconItem->setAlignment(Qt::AlignHCenter | Qt::AlignTop);
       
   293    // mIconItem->installSceneEventFilter(mGestureFilter);
       
   294 
       
   295     // repolish the body widget
   279     // repolish the body widget
   296     this->repolish();
   280     this->repolish();
   297 
   281 
   298     // emit signal to indicate addition of image
   282     // emit signal to indicate addition of image
   299     emit contentChanged();
   283     emit contentChanged();
   300 }
   284 }
   301 
   285 
   302 void MsgUnifiedEditorBody::setAudio(QString& audiofile)
   286 void MsgUnifiedEditorBody::setAudio(QString& audiofile)
   303 {
   287 {
       
   288     // do nothing if filepath is empty
       
   289     if(audiofile.isEmpty())
       
   290     {
       
   291         return;
       
   292     }
       
   293 
   304     //check for insert conformance
   294     //check for insert conformance
   305     if(EInsertSuccess != mMmsConformanceCheck->checkModeForInsert(audiofile))
   295     if(EInsertSuccess != mMmsConformanceCheck->checkModeForInsert(audiofile))
   306         return;
   296         return;
   307 
   297 
   308     setAudio(true);
   298     setAudio(true);
   309     mAudioFile = audiofile;
   299     mAudioFile = audiofile;
   310     if(mAudioItem)
   300     if(mAudioItem)
   311     {
   301     {
       
   302         mAudioItem->setParent(NULL);
   312         delete mAudioItem;
   303         delete mAudioItem;
   313         mAudioItem = NULL;
   304         mAudioItem = NULL;
   314         mAudioSize = 0;
   305         mAudioSize = 0;
   315     }
   306     }
   316 
   307 
   317     int msgSize = messageSize();
   308     int msgSize = messageSize();
   318     QFileInfo fileinfo(mAudioFile);
   309     QFileInfo fileinfo(mAudioFile);
   319     int audioSize = fileinfo.size() + KEstimatedMimeHeaderSize;
   310     int audioSize = fileinfo.size() + KEstimatedMimeHeaderSize;
   320     if((audioSize + msgSize) <= MsgMonitor::maxMmsSize() )
   311     if((audioSize + msgSize) <= MsgUnifiedEditorMonitor::maxMmsSize() )
   321     {
   312     {
   322     	mAudioSize = audioSize;
   313     	mAudioSize = audioSize;
   323     }
   314     }
   324     else
   315     else
   325     {
   316     {
   328     	//Show appropriate note and leave
   319     	//Show appropriate note and leave
   329     	showInsertFailureNote();
   320     	showInsertFailureNote();
   330     	return;
   321     	return;
   331     }    
   322     }    
   332 
   323 
   333     HbIconItem* audioIcon = new HbIconItem(AUDIO_ICON);
   324     mAudioItem = new MsgUniFiedEditorAudioWidget(this);
   334     mAudioItem = new HbPushButton(this);
       
   335     mAudioItem->hide();
   325     mAudioItem->hide();
   336     HbStyle::setItemName(mAudioItem,"audioItem");
   326     HbStyle::setItemName(mAudioItem,"audioItem");
   337     mAudioItem->setIcon(audioIcon->icon());
   327     mAudioItem->populate(mAudioFile);
   338     mAudioItem->setText(fileinfo.baseName());
   328     connect(mAudioItem,SIGNAL(remove()),this,SLOT(removeMedia()));
   339     MsgMediaUtil mediaUtil;
       
   340     mAudioItem->setAdditionalText(mediaUtil.mediaDuration(mAudioFile));
       
   341     mAudioItem->setTextAlignment(Qt::AlignVCenter | Qt::AlignLeft);
       
   342     connect(mAudioItem, SIGNAL(longPress(QPointF)), this, SLOT(longPressed(QPointF)));
       
   343 
   329 
   344     // repolish the body widget
   330     // repolish the body widget
   345     this->repolish();
   331     this->repolish();
   346 
   332 
   347     // emit signal to indicate addition of audio
   333     // emit signal to indicate addition of audio
   348     emit contentChanged();
   334     emit contentChanged();
   349 }
   335 }
   350 
   336 
   351 void MsgUnifiedEditorBody::setText(QString& text)
   337 void MsgUnifiedEditorBody::setText(QString& text)
   352 {
   338 {
   353 	mTextEdit->setPlainText(text);
   339     if(!text.isEmpty())
       
   340     {    
       
   341         mTextEdit->setPlainText(text);
       
   342     }
   354 }
   343 }
   355 
   344 
   356 const QStringList MsgUnifiedEditorBody::mediaContent()
   345 const QStringList MsgUnifiedEditorBody::mediaContent()
   357 {
   346 {
   358     QStringList mediaFiles;
   347     QStringList mediaFiles;
   360     // as it means we are not in middle of resizing
   349     // as it means we are not in middle of resizing
   361     if (mHasImage && mSavedImageFile.isEmpty()) 
   350     if (mHasImage && mSavedImageFile.isEmpty()) 
   362         mediaFiles << mImageFile;
   351         mediaFiles << mImageFile;
   363     if(mHasAudio)
   352     if(mHasAudio)
   364         mediaFiles << mAudioFile;
   353         mediaFiles << mAudioFile;
   365 
       
   366     //TODO: append video content
       
   367 
   354 
   368     return mediaFiles;
   355     return mediaFiles;
   369 }
   356 }
   370 
   357 
   371 QSizeF MsgUnifiedEditorBody::sizeHint(Qt::SizeHint which, const QSizeF &constraint) const
   358 QSizeF MsgUnifiedEditorBody::sizeHint(Qt::SizeHint which, const QSizeF &constraint) const
   425         QSizeF audioSize = mAudioItem->effectiveSizeHint(which, constraint);
   412         QSizeF audioSize = mAudioItem->effectiveSizeHint(which, constraint);
   426         szHint.rheight() += (audioSize.height() + bodyItemSpacing);
   413         szHint.rheight() += (audioSize.height() + bodyItemSpacing);
   427         mAudioItem->show();
   414         mAudioItem->show();
   428     }
   415     }
   429     
   416     
   430     if(mIconItem || mProcessingWidget)
   417     if(mPixmapItem || mProcessingWidget)
   431         {
   418         {
   432         QSizeF imageSize(0.0,0.0);
   419         QSizeF imageSize(0.0,0.0);
   433         QSizeF defaultImageSize(QImageReader(mImageFile).size());
   420         QSizeF defaultImageSize(QImageReader(mImageFile).size());
   434 
   421 
   435         if(!defaultImageSize.isEmpty())
   422         if(!defaultImageSize.isEmpty())
   459             {
   446             {
   460                 qreal newWidth = defaultImageSize.width()*newHeight/defaultImageSize.height();
   447                 qreal newWidth = defaultImageSize.width()*newHeight/defaultImageSize.height();
   461                 imageSize.setWidth(newWidth);
   448                 imageSize.setWidth(newWidth);
   462             }
   449             }
   463 
   450 
   464             if(mIconItem)
   451             if(mPixmapItem)
   465             {
   452             {
   466             mIconItem->setPreferredSize(imageSize);
   453             mPixmapItem->setPreferredSize(imageSize);
   467             mIconItem->setSize(imageSize);
   454             mPixmapItem->setSize(imageSize);
   468             if(mMainWindow->orientation() == Qt::Horizontal)
   455             if(mMainWindow->orientation() == Qt::Horizontal)
   469             {
   456             {
   470                 QPointF currPos = mIconItem->pos();
   457                 QPointF currPos = mPixmapItem->pos();
   471                 currPos.setX(leftMargin+((maxWidth-imageSize.width())/2));
   458                 currPos.setX(leftMargin+((maxWidth-imageSize.width())/2));
   472                 mIconItem->setPos(currPos);
   459                 mPixmapItem->setPos(currPos);
   473             }
   460             }
   474             mIconItem->show();
   461             mPixmapItem->show();
   475             }
   462             }
   476             
   463             
   477             if(mProcessingWidget)
   464             if(mProcessingWidget)
   478             {
   465             {
   479                 imageSize.setHeight(mProcessingWidget->preferredHeight());
   466                 imageSize.setHeight(mProcessingWidget->preferredHeight());
   488     mTextEdit->setMinimumHeight(maxHeight);
   475     mTextEdit->setMinimumHeight(maxHeight);
   489     szHint.rheight() += bodyItemSpacing;
   476     szHint.rheight() += bodyItemSpacing;
   490     return szHint;
   477     return szHint;
   491 }
   478 }
   492 
   479 
   493 void MsgUnifiedEditorBody::longPressed(QPointF position)
       
   494 {
       
   495     HbMenu* menu = new HbMenu;
       
   496     menu->addAction(LOC_OPEN, this, SLOT(openMedia()));
       
   497     menu->addAction(LOC_REMOVE, this, SLOT(removeMedia()));
       
   498     menu->addAction(LOC_DETAILS, this, SLOT(viewDetails()));
       
   499 
       
   500     menu->setDismissPolicy(HbPopup::TapAnywhere);
       
   501     menu->setAttribute(Qt::WA_DeleteOnClose, true);
       
   502     menu->setPreferredPos(position);
       
   503 
       
   504     menu->setObjectName(getHitRegion(position));
       
   505     menu->show();
       
   506 }
       
   507 
       
   508 void MsgUnifiedEditorBody::removeMedia()
   480 void MsgUnifiedEditorBody::removeMedia()
   509 {
   481 {
   510     HbAction* action = qobject_cast<HbAction*>(sender());
   482     QObject* senderObject = sender();
   511     QString objName = action->parent()->objectName();
   483     
   512     if(objName == IMAGE_REGION)
   484     MsgUnifiedEditorPixmapWidget* pixmap = 
       
   485         qobject_cast<MsgUnifiedEditorPixmapWidget*>(senderObject);
       
   486 
       
   487     MsgUniFiedEditorAudioWidget* audio = 
       
   488         qobject_cast<MsgUniFiedEditorAudioWidget*>(senderObject);
       
   489     
       
   490     if(pixmap) //remove image
   513     {
   491     {
   514         mImageFile.clear();
   492         mImageFile.clear();
   515         if(mIconItem)
   493         if(mPixmapItem)
   516         {
   494         {
   517       //      mIconItem->removeSceneEventFilter(mGestureFilter);
   495             mPixmapItem->setParent(NULL);
   518             delete mIconItem;
   496             delete mPixmapItem;
   519             mIconItem = NULL;
   497             mPixmapItem = NULL;
   520         }
   498         }
   521         setImage(false);
   499         setImage(false);
   522         mImageSize = 0;
   500         mImageSize = 0;
   523     }
   501     }
   524     else if(objName == AUDIO_REGION)
   502     else if(audio)//remove audio item
   525     {
   503         {
   526         mAudioFile.clear();
   504             mAudioFile.clear();
   527         if(mAudioItem)
   505             if(mAudioItem)
   528         {
   506             {
   529             delete mAudioItem;
   507                 mAudioItem->setParent(NULL);
   530             mAudioItem = NULL;
   508                 delete mAudioItem;
   531         }
   509                 mAudioItem = NULL;
   532         setAudio(false);
   510             }
   533         mAudioSize = 0;
   511             setAudio(false);
   534     }
   512             mAudioSize = 0;
   535     else if(objName == VIDEO_REGION)
   513         }
   536     {
       
   537         //TODO: complete this with video handling story
       
   538     }
       
   539     else
       
   540     {
       
   541         // return without doing anything
       
   542         return;
       
   543     }
       
   544 
   514 
   545     this->repolish();
   515     this->repolish();
   546 
   516 
   547 	emit contentChanged();
   517 	emit contentChanged();
   548 }
       
   549 
       
   550 //---------------------------------------------------------------
       
   551 // MsgUnifiedEditorBody :: openMedia
       
   552 // @see header file
       
   553 //---------------------------------------------------------------
       
   554 void MsgUnifiedEditorBody::openMedia()
       
   555 {
       
   556     HbAction* action = qobject_cast<HbAction*>(sender());
       
   557     QString objName = action->parent()->objectName();
       
   558     
       
   559     QString fileName;
       
   560     if ( objName == IMAGE_REGION )
       
   561     {
       
   562         fileName = mImageFile;
       
   563     }
       
   564     else if ( objName == AUDIO_REGION )
       
   565     {
       
   566         fileName = mAudioFile;
       
   567     }
       
   568     else
       
   569     {
       
   570         return;
       
   571     }
       
   572     
       
   573     XQSharableFile sf;
       
   574     XQAiwRequest* request = 0;
       
   575 
       
   576     if ( !sf.open(fileName) ) 
       
   577         {
       
   578         return;
       
   579         }
       
   580 
       
   581     // Get handlers
       
   582     XQApplicationManager appManager;
       
   583     QList<XQAiwInterfaceDescriptor> fileHandlers = appManager.list(sf);
       
   584     if (fileHandlers.count() > 0)
       
   585         {
       
   586         XQAiwInterfaceDescriptor d = fileHandlers.first();
       
   587         request = appManager.create(sf, d);
       
   588     
       
   589         if ( !request )
       
   590             {
       
   591             sf.close();
       
   592             return ;
       
   593             }
       
   594         }
       
   595     else
       
   596         {
       
   597         sf.close();
       
   598         return;
       
   599         }
       
   600 
       
   601     // Result handlers
       
   602     connect (request, SIGNAL(requestOk(const QVariant&)), 
       
   603             this, SLOT(handleOk(const QVariant&)));
       
   604     connect (request, SIGNAL(requestError(const QVariant&)), 
       
   605             this, SLOT(handleError(const QVariant&)));
       
   606 
       
   607     request->setEmbedded(true);
       
   608     request->setSynchronous(true);
       
   609 
       
   610     // Fill args
       
   611     QList<QVariant> args;
       
   612     args << qVariantFromValue(sf);
       
   613     request->setArguments(args);
       
   614 
       
   615     // Fill headers
       
   616     QString key("WindowTitle");
       
   617     QVariant value(QString(LOC_TITLE));
       
   618     XQRequestInfo info;
       
   619     info.setInfo(key, value);
       
   620     request->setInfo(info);
       
   621     
       
   622     request->send();
       
   623     
       
   624     // Cleanup
       
   625     sf.close();
       
   626     delete request;
       
   627 }
       
   628 
       
   629 void MsgUnifiedEditorBody::viewDetails()
       
   630 {
       
   631     //open details view.
       
   632 }
   518 }
   633 
   519 
   634 bool MsgUnifiedEditorBody::hasImage()
   520 bool MsgUnifiedEditorBody::hasImage()
   635 {
   521 {
   636     return mHasImage;
   522     return mHasImage;
   674     {
   560     {
   675         // This is the first media content to be inserted
   561         // This is the first media content to be inserted
   676         estimatedMediaSize = KEstimatedMmsSmilHeaderSize;
   562         estimatedMediaSize = KEstimatedMmsSmilHeaderSize;
   677     }
   563     }
   678     
   564     
   679     return estimatedMediaSize + MsgMonitor::subjectSize() + MsgMonitor::containerSize();
   565     return estimatedMediaSize + MsgUnifiedEditorMonitor::subjectSize() + MsgUnifiedEditorMonitor::containerSize();
   680 }
       
   681 
       
   682 QString MsgUnifiedEditorBody::getHitRegion(QPointF position)
       
   683 {
       
   684     if(mIconItem)
       
   685     {
       
   686         QPolygonF imageHitRegion = mIconItem->mapToScene(mIconItem->boundingRect());
       
   687         if(imageHitRegion.containsPoint(position, Qt::OddEvenFill))
       
   688         {
       
   689             return IMAGE_REGION;
       
   690         }
       
   691     }
       
   692 
       
   693     if(mAudioItem)
       
   694     {
       
   695         QPolygonF audioHitRegion = mAudioItem->mapToScene(mAudioItem->boundingRect());
       
   696         if(audioHitRegion.containsPoint(position, Qt::OddEvenFill))
       
   697         {
       
   698             return AUDIO_REGION;
       
   699         }
       
   700     }
       
   701 
       
   702     //TODO : add hit test for video region with video userstory
       
   703 
       
   704     return INVALID_REGION;
       
   705 }
   566 }
   706 
   567 
   707 void MsgUnifiedEditorBody::onTextChanged()
   568 void MsgUnifiedEditorBody::onTextChanged()
   708 {   
   569 {   
   709     QString string = text();
   570     QString string = text();
   710 
   571 
   711     if( string.size() > mPrevBuffer.size() &&
   572     if( string.size() > mPrevBuffer.size() &&
   712         MsgMonitor::messageType() == ConvergedMessage::Mms )
   573         MsgUnifiedEditorMonitor::messageType() == ConvergedMessage::Mms )
   713     {
   574     {
   714         // reject any text input if mms size limit is reached
   575         // reject any text input if mms size limit is reached
   715         int futureSize = bodySize() +
   576         int futureSize = bodySize() +
   716                 MsgMonitor::containerSize() + MsgMonitor::subjectSize();
   577                 MsgUnifiedEditorMonitor::containerSize() + MsgUnifiedEditorMonitor::subjectSize();
   717         if(futureSize > MsgMonitor::maxMmsSize())
   578         if(futureSize > MsgUnifiedEditorMonitor::maxMmsSize())
   718         {
   579         {
   719             mTextEdit->setPlainText(mPrevBuffer);
   580             mTextEdit->setPlainText(mPrevBuffer);
   720             HbNotificationDialog::launchDialog(LOC_UNABLE_TO_ADD_CONTENT);
   581             HbNotificationDialog::launchDialog(LOC_UNABLE_TO_ADD_CONTENT);
   721             mTextEdit->setCursorPosition(mPrevBuffer.length());
   582             mTextEdit->setCursorPosition(mPrevBuffer.length());
   722             return;
   583             return;
   752     mPrevBuffer = string;
   613     mPrevBuffer = string;
   753     
   614     
   754     // emit signal to indicate change in content
   615     // emit signal to indicate change in content
   755     emit contentChanged();
   616     emit contentChanged();
   756     
   617     
   757     if(MsgMonitor::messageType() == ConvergedMessage::Sms)
   618     if(MsgUnifiedEditorMonitor::messageType() == ConvergedMessage::Sms)
   758     {
   619     {
   759         //Set char counter value
   620         //Set char counter value
   760         QString display = QString("%1(%2)").arg(numOfRemainingChars).arg(
   621         QString display = QString("%1(%2)").arg(numOfRemainingChars).arg(
   761             numOfPDUs);
   622             numOfPDUs);
   762         mCharCounter->setText(display);
   623         mCharCounter->setText(display);
   775 }
   636 }
   776 
   637 
   777 void MsgUnifiedEditorBody::EditorOperationEvent(
   638 void MsgUnifiedEditorBody::EditorOperationEvent(
   778     TUniEditorProcessImageOperationEvent aEvent, TFileName aFileName)
   639     TUniEditorProcessImageOperationEvent aEvent, TFileName aFileName)
   779 {
   640 {
   780     stopResizeAnimation();
       
   781     
       
   782     delete mImageInfo;
   641     delete mImageInfo;
   783     mImageInfo = NULL;
   642     mImageInfo = NULL;
   784 
   643 
   785     if (aEvent == EUniEditorProcessImageOperationComplete && 
   644     if (aEvent == EUniEditorProcessImageOperationComplete && 
   786             aFileName.Length() > 0)
   645             aFileName.Length() > 0)
   787     {
   646     {
   788         mImageFile = S60QConversions::s60DescToQString(aFileName);
   647         mImageFile = XQConversions::s60DescToQString(aFileName);
   789     }
   648     }
   790     else
   649     else
   791     {
   650     {
   792         mImageFile = mSavedImageFile;
   651         mImageFile = mSavedImageFile;
   793     }
   652     }
   794     mSavedImageFile.clear();
   653     mSavedImageFile.clear();
       
   654 
       
   655    // image resize is complete. reset the image resize flag
       
   656     mIsImageResizing = false;
   795     //handle the processed image from ProcessImage Operation
   657     //handle the processed image from ProcessImage Operation
   796     handleSetImage();
   658     handleSetImage();
       
   659     
       
   660     stopResizeAnimation();
   797 }
   661 }
   798 
   662 
   799 void MsgUnifiedEditorBody::startResizeAnimation()
   663 void MsgUnifiedEditorBody::startResizeAnimation()
   800 {
   664 {
       
   665     // emit signal to indicate disable the send tool button.
       
   666     emit enableSendButton(false);
       
   667     
       
   668 	
   801     QGraphicsLinearLayout* processingLayout = new QGraphicsLinearLayout(Qt::Vertical);
   669     QGraphicsLinearLayout* processingLayout = new QGraphicsLinearLayout(Qt::Vertical);
   802     
   670     
   803     mProcessingWidget = new HbWidget(this);
   671     mProcessingWidget = new HbWidget(this);
   804     HbStyle::setItemName(mProcessingWidget,"pixmap"); 
   672     HbStyle::setItemName(mProcessingWidget,"pixmap"); 
   805     mProcessingWidget->hide();
   673     mProcessingWidget->hide();
   808     HbTextItem* processingText = new HbTextItem(LOC_PROCESSING,mProcessingWidget);
   676     HbTextItem* processingText = new HbTextItem(LOC_PROCESSING,mProcessingWidget);
   809     processingText->setAlignment(Qt::AlignCenter);
   677     processingText->setAlignment(Qt::AlignCenter);
   810     processingLayout->addItem(processingText);
   678     processingLayout->addItem(processingText);
   811     
   679     
   812     HbIconItem* animationItem = new HbIconItem(ANIMATION_ICON,mProcessingWidget);
   680     HbIconItem* animationItem = new HbIconItem(ANIMATION_ICON,mProcessingWidget);
       
   681     animationItem->setAlignment(Qt::AlignHCenter);
   813     processingLayout->addItem(animationItem);
   682     processingLayout->addItem(animationItem);
   814     
   683     
   815     HbIconAnimator& iconAnimator = animationItem->animator();
   684     HbIconAnimator& iconAnimator = animationItem->animator();
   816     HbIconAnimationManager* iconAnimationManager = HbIconAnimationManager::global();
   685     HbIconAnimationManager* iconAnimationManager = HbIconAnimationManager::global();
   817     iconAnimationManager->addDefinitionFile(ANIMATION_FILE);
   686     iconAnimationManager->addDefinitionFile(ANIMATION_FILE);
   826     if(mProcessingWidget)
   695     if(mProcessingWidget)
   827     {
   696     {
   828         delete mProcessingWidget;
   697         delete mProcessingWidget;
   829         mProcessingWidget = NULL;
   698         mProcessingWidget = NULL;
   830     }
   699     }
       
   700 	
   831 }
   701 }
   832 
   702 
   833 // ---------------------------------------------------------
   703 // ---------------------------------------------------------
   834 // MsgUnifiedEditorBody::isUnicode
   704 // MsgUnifiedEditorBody::isUnicode
   835 // ---------------------------------------------------------
   705 // ---------------------------------------------------------
   848     mCharCounter->setVisible(false);
   718     mCharCounter->setVisible(false);
   849     mBackgroundItem->setVisible(false);
   719     mBackgroundItem->setVisible(false);
   850 }
   720 }
   851 
   721 
   852 //---------------------------------------------------------------
   722 //---------------------------------------------------------------
   853 // MsgUnifiedEditorBody :: handleOk
       
   854 // @see header file
       
   855 //---------------------------------------------------------------
       
   856 void MsgUnifiedEditorBody::handleOk(const QVariant& result)
       
   857 {
       
   858     Q_UNUSED(result)
       
   859 }
       
   860 
       
   861 //---------------------------------------------------------------
       
   862 // MsgUnifiedEditorBody :: handleError
       
   863 // @see header file
       
   864 //---------------------------------------------------------------
       
   865 void MsgUnifiedEditorBody::handleError(int errorCode, 
       
   866     const QString& errorMessage)
       
   867 {
       
   868     Q_UNUSED(errorMessage)
       
   869     Q_UNUSED(errorCode)
       
   870 }
       
   871 
       
   872 //---------------------------------------------------------------
       
   873 // MsgUnifiedEditorBody :: setFocus
   723 // MsgUnifiedEditorBody :: setFocus
   874 // @see header file
   724 // @see header file
   875 //---------------------------------------------------------------
   725 //---------------------------------------------------------------
   876 void MsgUnifiedEditorBody::setFocus()
   726 void MsgUnifiedEditorBody::setFocus()
   877 {
   727 {