38 #include <MsgImageInfo.h> |
39 #include <MsgImageInfo.h> |
39 #include <HbIconAnimationManager> |
40 #include <HbIconAnimationManager> |
40 #include <HbIconAnimator> |
41 #include <HbIconAnimator> |
41 #include <HbIcon> |
42 #include <HbIcon> |
42 |
43 |
|
44 #include <csmsaccount.h> |
|
45 #include <smutset.h> |
|
46 #include <xqaiwrequest.h> |
|
47 #include <xqrequestinfo.h> |
|
48 #include <xqsharablefile.h> |
|
49 #include <xqappmgr.h> |
|
50 |
43 // USER INCLUDES |
51 // USER INCLUDES |
44 #include "msgunieditorbody.h" |
52 #include "msgunieditorbody.h" |
45 #include "UniEditorGenUtils.h" |
53 #include "UniEditorGenUtils.h" |
|
54 #include "unisendingsettings.h" |
46 #include "msgmonitor.h" |
55 #include "msgmonitor.h" |
47 #include "s60qconversions.h" |
56 #include "s60qconversions.h" |
48 #include "mmsinsertcheckoperation.h" |
57 #include "mmsconformancecheck.h" |
|
58 #include "unieditorpluginloader.h" |
|
59 #include "unieditorplugininterface.h" |
|
60 #include "convergedmessage.h" |
|
61 #include "msgmediautil.h" |
49 |
62 |
50 // Constants |
63 // Constants |
51 const QString EDITOR_FRAME("qtg_fr_editor"); |
64 const QString EDITOR_FRAME("qtg_fr_lineedit_normal"); |
|
65 const QString BACKGROUND_FRAME("qtg_fr_btn_normal"); |
52 const QString AUDIO_REGION("AudioRegion"); |
66 const QString AUDIO_REGION("AudioRegion"); |
53 const QString VIDEO_REGION("VideoRegion"); |
67 const QString VIDEO_REGION("VideoRegion"); |
54 const QString IMAGE_REGION("ImageRegion"); |
68 const QString IMAGE_REGION("ImageRegion"); |
55 const QString INVALID_REGION("InvalidRegion"); |
69 const QString INVALID_REGION("InvalidRegion"); |
56 const QString SEND_ICON("qtg_mono_send.svg"); |
70 const QString SEND_ICON("qtg_mono_send"); |
57 |
71 |
58 //Localized Constants |
72 //Localized Constants for item specific menu |
59 #define LOC_COMMON_OPEN hbTrId("txt_common_menu_open") |
73 #define LOC_OPEN hbTrId("txt_common_menu_open") |
60 #define LOC_REMOVE_ATTACHMENT hbTrId("txt_messaging_menu_remove_attachment") |
74 #define LOC_REMOVE hbTrId("txt_common_menu_remove") |
61 #define LOC_COMMON_DETAILS hbTrId("txt_common_menu_details") |
75 #define LOC_DETAILS hbTrId("txt_common_menu_details") |
62 |
76 #define LOC_TITLE hbTrId("txt_messaging_title_messaging") |
63 |
77 |
64 MsgUnifiedEditorBody::MsgUnifiedEditorBody( const QString& pluginPath, QGraphicsItem *parent ) : |
78 const QString AUDIO_ICON("qtg_mono_audio"); |
|
79 const QString ANIMATION_ICON(":/qtg_anim_longtap_2"); |
|
80 |
|
81 const TInt KShowCounterLimit = 10; |
|
82 |
|
83 MsgUnifiedEditorBody::MsgUnifiedEditorBody( const QString& pluginPath, |
|
84 QGraphicsItem *parent ) : |
65 HbWidget(parent), |
85 HbWidget(parent), |
66 mHasImage(false), |
86 mHasImage(false), |
67 mHasAudio(false), |
87 mHasAudio(false), |
68 mTextEdit(0), |
88 mTextEdit(0), |
69 mEditorFrame(0), |
89 mEditorFrame(0), |
81 |
101 |
82 mTextEdit = new HbTextEdit(this); |
102 mTextEdit = new HbTextEdit(this); |
83 HbStyle::setItemName(mTextEdit,"textEdit"); |
103 HbStyle::setItemName(mTextEdit,"textEdit"); |
84 |
104 |
85 HbFrameDrawer* frameDrawer = new HbFrameDrawer(EDITOR_FRAME, |
105 HbFrameDrawer* frameDrawer = new HbFrameDrawer(EDITOR_FRAME, |
86 HbFrameDrawer::NinePieces); |
106 HbFrameDrawer::NinePieces); |
87 |
107 |
88 mEditorFrame = new HbFrameItem(frameDrawer,this); |
108 mEditorFrame = new HbFrameItem(frameDrawer,this); |
89 HbStyle::setItemName(mEditorFrame,"textEditFrame"); |
109 HbStyle::setItemName(mEditorFrame,"textEditFrame"); |
90 mEditorFrame->setZValue(-1); |
110 mEditorFrame->setZValue(-1); |
91 |
111 |
92 // add "Send" action in VKB |
112 // add "Send" action in VKB |
93 HbEditorInterface editorInterface(mTextEdit); |
113 HbEditorInterface editorInterface(mTextEdit); |
94 HbAction *sendAction = new HbAction(HbIcon(SEND_ICON), QString(),this); |
114 HbAction *sendAction = new HbAction(HbIcon(SEND_ICON), QString(),this); |
95 connect(sendAction, SIGNAL(triggered()),this, SIGNAL(sendMessage())); |
115 connect(sendAction, SIGNAL(triggered()),this, SIGNAL(sendMessage())); |
96 editorInterface.addAction(sendAction); |
116 editorInterface.addAction(sendAction); |
97 |
117 |
98 mGestureFilter = new HbGestureSceneFilter(Qt::LeftButton, this); |
118 mGestureFilter = new HbGestureSceneFilter(Qt::LeftButton, this); |
99 mGestureFilter->setLongpressAnimation(true); |
119 mGestureFilter->setLongpressAnimation(true); |
100 HbGesture *gesture = new HbGesture(HbGesture::longpress, 0); |
120 HbGesture *gesture = new HbGesture(HbGesture::longpress, 5); |
101 mGestureFilter->addGesture(gesture); |
121 mGestureFilter->addGesture(gesture); |
102 connect(gesture, SIGNAL(longPress(QPointF)), this, SLOT(longPressed(QPointF))); |
122 connect(gesture, SIGNAL(longPress(QPointF)), this, SLOT(longPressed(QPointF))); |
103 connect(mTextEdit, SIGNAL(contentsChanged()), this, SLOT(onTextChanged())); |
123 connect(mTextEdit, SIGNAL(contentsChanged()), this, SLOT(onTextChanged())); |
104 |
124 |
105 mfs.Connect(); |
125 mfs.Connect(); |
106 mfs.ShareProtected(); |
126 mfs.ShareProtected(); |
107 |
127 |
108 mMmsInsertCheckOp = new MmsInsertCheckOperation; |
128 mMmsConformanceCheck = new MmsConformanceCheck; |
|
129 |
|
130 mCharCounter = new HbTextItem(this); |
|
131 HbStyle::setItemName(mCharCounter, "charCounter"); |
|
132 mCharCounter->setZValue(1.5); |
|
133 mCharCounter->setText("160(1)"); |
|
134 |
|
135 mBackgroundItem = new HbFrameItem(this); |
|
136 HbStyle::setItemName(mBackgroundItem, "charCounterFrame"); |
|
137 |
|
138 mBackgroundItem->frameDrawer().setFrameType(HbFrameDrawer::NinePieces); |
|
139 mBackgroundItem->frameDrawer().setFillWholeRect(true); |
|
140 |
|
141 mBackgroundItem->frameDrawer().setFrameGraphicsName( |
|
142 BACKGROUND_FRAME); |
|
143 |
|
144 mPluginLoader = new UniEditorPluginLoader(this); |
|
145 |
|
146 mPluginInterface = |
|
147 mPluginLoader->getUniEditorPlugin(ConvergedMessage::Sms); |
|
148 |
|
149 CSmsSettings* settings = CSmsSettings::NewLC(); |
|
150 CSmsAccount* account = CSmsAccount::NewLC(); |
|
151 account->LoadSettingsL( *settings ); |
|
152 |
|
153 if( settings->CharacterSet() == TSmsDataCodingScheme::ESmsAlphabetUCS2) |
|
154 { |
|
155 mCharSupportType = TUniSendingSettings::EUniCharSupportFull; |
|
156 } |
|
157 else |
|
158 { |
|
159 mCharSupportType = TUniSendingSettings::EUniCharSupportReduced; |
|
160 } |
|
161 |
|
162 CleanupStack::PopAndDestroy( account ); |
|
163 CleanupStack::PopAndDestroy( settings ); |
|
164 |
|
165 //Set the mPrevBuffer to NULL initially |
|
166 mPrevBuffer = QString(); |
|
167 |
|
168 mCharCounter->setVisible(false); |
|
169 mBackgroundItem->setVisible(false); |
109 } |
170 } |
110 |
171 |
111 MsgUnifiedEditorBody::~MsgUnifiedEditorBody() |
172 MsgUnifiedEditorBody::~MsgUnifiedEditorBody() |
112 { |
173 { |
113 style()->unregisterPlugin(mPluginPath); |
174 style()->unregisterPlugin(mPluginPath); |
114 delete mMmsInsertCheckOp; |
175 delete mMmsConformanceCheck; |
115 delete mProcessImageOperation; |
176 delete mProcessImageOperation; |
116 delete mMediaResolver; |
177 delete mMediaResolver; |
117 delete mImageInfo; |
178 delete mImageInfo; |
118 //Close has to be called after ProcessImageOperation object is deleted |
179 //Close has to be called after ProcessImageOperation object is deleted |
119 mfs.Close(); |
180 mfs.Close(); |
152 |
213 |
153 if( error == KErrNone) |
214 if( error == KErrNone) |
154 { |
215 { |
155 mMediaResolver->SetCharacterSetRecognition(EFalse); |
216 mMediaResolver->SetCharacterSetRecognition(EFalse); |
156 |
217 |
157 RFile file; |
|
158 |
|
159 HBufC *name = S60QConversions::qStringToS60Desc(imagefile); |
218 HBufC *name = S60QConversions::qStringToS60Desc(imagefile); |
160 file.Open(mfs, *name, EFileWrite); |
219 RFile file = mMediaResolver->FileHandleL(*name); |
161 |
220 |
162 TRAP(error,mImageInfo = static_cast<CMsgImageInfo*> |
221 TRAP(error,mImageInfo = static_cast<CMsgImageInfo*> |
163 (mMediaResolver->CreateMediaInfoL(file))); |
222 (mMediaResolver->CreateMediaInfoL(file))); |
164 if (error == KErrNone) |
223 if (error == KErrNone) |
165 { |
224 { |
166 TRAP(error, mMediaResolver->ParseInfoDetailsL(mImageInfo, file)); |
225 TRAP(error, mMediaResolver->ParseInfoDetailsL(mImageInfo, file)); |
256 setAudio(false); |
312 setAudio(false); |
257 //Show appropriate note and leave |
313 //Show appropriate note and leave |
258 return; |
314 return; |
259 } |
315 } |
260 |
316 |
261 HbIconItem* audioIcon = new HbIconItem(":/qtg_mono_audio.svg"); |
317 HbIconItem* audioIcon = new HbIconItem(AUDIO_ICON); |
262 mAudioItem = new HbPushButton(this); |
318 mAudioItem = new HbPushButton(this); |
263 mAudioItem->hide(); |
319 mAudioItem->hide(); |
264 HbStyle::setItemName(mAudioItem,"audioItem"); |
320 HbStyle::setItemName(mAudioItem,"audioItem"); |
265 mAudioItem->setIcon(audioIcon->icon()); |
321 mAudioItem->setIcon(audioIcon->icon()); |
266 mAudioItem->setText(fileinfo.baseName()); |
322 mAudioItem->setText(fileinfo.baseName()); |
267 //TODO: get actual play-time from utility |
323 MsgMediaUtil mediaUtil; |
268 mAudioItem->setAdditionalText("00:00"); |
324 mAudioItem->setAdditionalText(mediaUtil.mediaDuration(mAudioFile)); |
269 mAudioItem->setTextAlignment(Qt::AlignVCenter | Qt::AlignLeft); |
325 mAudioItem->setTextAlignment(Qt::AlignVCenter | Qt::AlignLeft); |
270 connect(mAudioItem, SIGNAL(longPress(QPointF)), this, SLOT(longPressed(QPointF))); |
326 connect(mAudioItem, SIGNAL(longPress(QPointF)), this, SLOT(longPressed(QPointF))); |
271 |
327 |
272 // repolish the body widget |
328 // repolish the body widget |
273 this->repolish(); |
329 this->repolish(); |
274 |
330 |
275 // emit signal to indicate addition of mms content |
331 // emit signal to indicate addition of audio |
276 emit mmContentAdded(true); |
332 emit contentChanged(); |
277 |
|
278 // emit signal to indicate new body size |
|
279 emit sizeChanged(bodySize()); |
|
280 } |
333 } |
281 |
334 |
282 void MsgUnifiedEditorBody::setVideo(QString& videofile) |
335 void MsgUnifiedEditorBody::setVideo(QString& videofile) |
283 { |
336 { |
284 //check for insert conformance |
337 //check for insert conformance |
285 if(EInsertSuccess != mMmsInsertCheckOp->checkModeForInsert(videofile)) |
338 if(EInsertSuccess != mMmsConformanceCheck->checkModeForInsert(videofile)) |
286 return; |
339 return; |
287 |
340 |
288 // update the media file-list |
341 // update the media file-list |
289 mVideoFile = videofile; |
342 mVideoFile = videofile; |
290 |
343 |
443 } |
493 } |
444 |
494 |
445 void MsgUnifiedEditorBody::longPressed(QPointF position) |
495 void MsgUnifiedEditorBody::longPressed(QPointF position) |
446 { |
496 { |
447 HbMenu* menu = new HbMenu; |
497 HbMenu* menu = new HbMenu; |
448 menu->addAction(LOC_COMMON_OPEN, this, SLOT(openMedia())); |
498 menu->addAction(LOC_OPEN, this, SLOT(openMedia())); |
449 menu->addAction(LOC_REMOVE_ATTACHMENT, this, SLOT(removeMedia())); |
499 menu->addAction(LOC_REMOVE, this, SLOT(removeMedia())); |
450 menu->addAction(LOC_COMMON_DETAILS, this, SLOT(viewDetails())); |
500 menu->addAction(LOC_DETAILS, this, SLOT(viewDetails())); |
451 |
501 |
452 menu->setDismissPolicy(HbPopup::TapAnywhere); |
502 menu->setDismissPolicy(HbPopup::TapAnywhere); |
453 menu->setAttribute(Qt::WA_DeleteOnClose, true); |
503 menu->setAttribute(Qt::WA_DeleteOnClose, true); |
454 menu->setPreferredPos(position); |
504 menu->setPreferredPos(position); |
455 |
505 |
493 // return without doing anything |
543 // return without doing anything |
494 return; |
544 return; |
495 } |
545 } |
496 |
546 |
497 this->repolish(); |
547 this->repolish(); |
498 emit mmContentAdded(false); |
548 |
499 |
549 emit contentChanged(); |
500 // emit signal to indicate new body size |
550 } |
501 emit sizeChanged(bodySize()); |
551 |
502 } |
552 //--------------------------------------------------------------- |
503 |
553 // MsgUnifiedEditorBody :: openMedia |
|
554 // @see header file |
|
555 //--------------------------------------------------------------- |
504 void MsgUnifiedEditorBody::openMedia() |
556 void MsgUnifiedEditorBody::openMedia() |
505 { |
557 { |
506 //open corresponding viewer app. |
558 HbAction* action = qobject_cast<HbAction*>(sender()); |
507 } |
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 |
508 void MsgUnifiedEditorBody::viewDetails() |
631 void MsgUnifiedEditorBody::viewDetails() |
509 { |
632 { |
510 //open details view. |
633 //open details view. |
511 } |
634 } |
512 |
635 |
582 |
705 |
583 return INVALID_REGION; |
706 return INVALID_REGION; |
584 } |
707 } |
585 |
708 |
586 void MsgUnifiedEditorBody::onTextChanged() |
709 void MsgUnifiedEditorBody::onTextChanged() |
587 { |
710 { |
588 // emit signal to indicate new body size |
711 QString string = text(); |
589 emit sizeChanged(bodySize()); |
712 |
|
713 if( !mPrevBuffer.isEmpty() && |
|
714 string.size() > mPrevBuffer.size() && |
|
715 MsgMonitor::messageType() == ConvergedMessage::Mms ) |
|
716 { |
|
717 //Save the previous buffer |
|
718 mPrevBuffer = string; |
|
719 // emit signal to indicate change in content |
|
720 emit contentChanged(); |
|
721 |
|
722 return; |
|
723 } |
|
724 |
|
725 //Check done for optimization |
|
726 //Only if content is deleted we need to call encodingsettings again |
|
727 if (mPrevBuffer.isEmpty() || string.size() <= mPrevBuffer.size()) |
|
728 { |
|
729 mPluginInterface->setEncodingSettings(EFalse, ESmsEncodingNone, |
|
730 mCharSupportType); |
|
731 } |
|
732 |
|
733 TInt numOfRemainingChars; |
|
734 TInt numOfPDUs; |
|
735 TBool unicodeMode; |
|
736 TSmsEncoding alternativeEncodingType; |
|
737 mPluginInterface->getNumPDUs(string, numOfRemainingChars, numOfPDUs, |
|
738 unicodeMode, alternativeEncodingType); |
|
739 |
|
740 //Save the unicode value returned |
|
741 mUnicode = unicodeMode; |
|
742 //Save the old buffer |
|
743 mPrevBuffer = string; |
|
744 |
|
745 // emit signal to indicate change in content |
|
746 emit contentChanged(); |
|
747 |
|
748 if(MsgMonitor::messageType() == ConvergedMessage::Sms) |
|
749 { |
|
750 //Set char counter value |
|
751 QString display = QString("%1(%2)").arg(numOfRemainingChars).arg( |
|
752 numOfPDUs); |
|
753 mCharCounter->setText(display); |
|
754 |
|
755 if (numOfPDUs > 1 || numOfRemainingChars <= KShowCounterLimit) |
|
756 { |
|
757 mCharCounter->setVisible(true); |
|
758 mBackgroundItem->setVisible(true); |
|
759 } |
|
760 else |
|
761 { |
|
762 mCharCounter->setVisible(false); |
|
763 mBackgroundItem->setVisible(false); |
|
764 } |
|
765 } |
590 } |
766 } |
591 |
767 |
592 void MsgUnifiedEditorBody::EditorOperationEvent( |
768 void MsgUnifiedEditorBody::EditorOperationEvent( |
593 TUniEditorProcessImageOperationEvent aEvent, TFileName aFileName) |
769 TUniEditorProcessImageOperationEvent aEvent, TFileName aFileName) |
594 { |
770 { |
640 delete mIconItem; |
816 delete mIconItem; |
641 mIconItem = NULL; |
817 mIconItem = NULL; |
642 } |
818 } |
643 } |
819 } |
644 |
820 |
|
821 // --------------------------------------------------------- |
|
822 // MsgUnifiedEditorBody::isUnicode |
|
823 // --------------------------------------------------------- |
|
824 // |
|
825 bool MsgUnifiedEditorBody::isUnicode() |
|
826 { |
|
827 return mUnicode; |
|
828 } |
|
829 |
|
830 // --------------------------------------------------------- |
|
831 // MsgUnifiedEditorBody::disableCharCounter |
|
832 // --------------------------------------------------------- |
|
833 // |
|
834 void MsgUnifiedEditorBody::disableCharCounter() |
|
835 { |
|
836 mCharCounter->setVisible(false); |
|
837 mBackgroundItem->setVisible(false); |
|
838 } |
|
839 |
|
840 //--------------------------------------------------------------- |
|
841 // MsgUnifiedEditorBody :: handleOk |
|
842 // @see header file |
|
843 //--------------------------------------------------------------- |
|
844 void MsgUnifiedEditorBody::handleOk(const QVariant& result) |
|
845 { |
|
846 Q_UNUSED(result) |
|
847 } |
|
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 |
645 // EOF |
860 // EOF |