diff -r a32b19fb291e -r 5b14749788d7 messagingapp/msgui/unifiededitor/src/msgunieditorbody.cpp --- 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 #include #include -#include #include -#include -//#include -//#include -#include #include #include #include @@ -45,40 +40,34 @@ #include #include #include - +#include // 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 - (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 + (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(sender()); - QString objName = action->parent()->objectName(); - if(objName == IMAGE_REGION) + QObject* senderObject = sender(); + + MsgUnifiedEditorPixmapWidget* pixmap = + qobject_cast(senderObject); + + MsgUniFiedEditorAudioWidget* audio = + qobject_cast(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(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 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 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 //---------------------------------------------------------------