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