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> |
24 #include <HbPushButton> |
25 #include <QFileInfo> |
|
26 #include <HbAction> |
25 #include <HbAction> |
27 #include <hbinputeditorinterface.h> |
26 #include <hbinputeditorinterface.h> |
28 #include <QGraphicsLayout> |
27 //#include <HbGestureSceneFilter> |
29 #include <HbGestureSceneFilter> |
28 //#include <HbGesture> |
30 #include <HbGesture> |
|
31 #include <HbMenu> |
29 #include <HbMenu> |
32 #include <HbMainWindow> |
30 #include <HbMainWindow> |
33 #include <hbinstance.h> |
|
34 #include <HbDeviceProfile> |
31 #include <HbDeviceProfile> |
35 #include <QImageReader> |
32 #include <QImageReader> |
36 #include <QFileInfo> |
33 #include <QFileInfo> |
37 #include <apmstd.h> |
|
38 #include <MsgMediaResolver.h> |
34 #include <MsgMediaResolver.h> |
39 #include <MsgImageInfo.h> |
35 #include <MsgImageInfo.h> |
40 #include <HbIconAnimationManager> |
36 #include <HbIconAnimationManager> |
41 #include <HbIconAnimator> |
37 #include <HbIconAnimator> |
42 #include <HbIcon> |
38 #include <HbIcon> |
|
39 #include <QGraphicsLinearLayout> |
|
40 #include <HbNotificationDialog> |
43 |
41 |
44 #include <csmsaccount.h> |
42 #include <csmsaccount.h> |
45 #include <smutset.h> |
43 #include <smutset.h> |
46 #include <xqaiwrequest.h> |
44 #include <xqaiwrequest.h> |
47 #include <xqrequestinfo.h> |
45 #include <xqrequestinfo.h> |
66 const QString AUDIO_REGION("AudioRegion"); |
64 const QString AUDIO_REGION("AudioRegion"); |
67 const QString VIDEO_REGION("VideoRegion"); |
65 const QString VIDEO_REGION("VideoRegion"); |
68 const QString IMAGE_REGION("ImageRegion"); |
66 const QString IMAGE_REGION("ImageRegion"); |
69 const QString INVALID_REGION("InvalidRegion"); |
67 const QString INVALID_REGION("InvalidRegion"); |
70 const QString SEND_ICON("qtg_mono_send"); |
68 const QString SEND_ICON("qtg_mono_send"); |
|
69 const int KShowCounterLimit = 10; |
|
70 const int BYTES_TO_KBYTES_FACTOR = 1024; |
71 |
71 |
72 //Localized Constants for item specific menu |
72 //Localized Constants for item specific menu |
73 #define LOC_OPEN hbTrId("txt_common_menu_open") |
73 #define LOC_OPEN hbTrId("txt_common_menu_open") |
74 #define LOC_REMOVE hbTrId("txt_common_menu_remove") |
74 #define LOC_REMOVE hbTrId("txt_common_menu_remove") |
75 #define LOC_DETAILS hbTrId("txt_common_menu_details") |
75 #define LOC_DETAILS hbTrId("txt_common_menu_details") |
76 #define LOC_TITLE hbTrId("txt_messaging_title_messaging") |
76 #define LOC_TITLE hbTrId("txt_messaging_title_messaging") |
|
77 #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") |
|
79 #define LOC_PROCESSING hbTrId("txt_messaging_formlabel_loading") |
77 |
80 |
78 const QString AUDIO_ICON("qtg_mono_audio"); |
81 const QString AUDIO_ICON("qtg_mono_audio"); |
79 const QString ANIMATION_ICON(":/qtg_anim_longtap_2"); |
82 const QString ANIMATION_ICON("qtg_anim_loading"); |
80 |
83 const QString ANIMATION_FILE(":/qtg_anim_loading.axml"); |
81 const TInt KShowCounterLimit = 10; |
84 // LOCAL FUNCTIONS |
82 |
85 |
83 MsgUnifiedEditorBody::MsgUnifiedEditorBody( const QString& pluginPath, |
86 //--------------------------------------------------------------- |
84 QGraphicsItem *parent ) : |
87 // showInsertFailureNote |
85 HbWidget(parent), |
88 // @return fullPath of unified editor's temporary dir |
|
89 //--------------------------------------------------------------- |
|
90 void showInsertFailureNote() |
|
91 { |
|
92 int availableSize = |
|
93 (MsgMonitor::maxMmsSize() - MsgMonitor::messageSize()) |
|
94 /BYTES_TO_KBYTES_FACTOR; |
|
95 QString displayStr = QString(LOC_UNABLE_TO_ATTACH_ITEM) |
|
96 .arg(availableSize); |
|
97 HbNotificationDialog* dlg = new HbNotificationDialog(); |
|
98 dlg->setFocusPolicy(Qt::NoFocus); |
|
99 dlg->setDismissPolicy(HbPopup::TapAnywhere); |
|
100 dlg->setAttribute(Qt::WA_DeleteOnClose, true); |
|
101 dlg->setText(displayStr); |
|
102 dlg->show(); |
|
103 } |
|
104 |
|
105 |
|
106 MsgUnifiedEditorBody::MsgUnifiedEditorBody( QGraphicsItem *parent ) : |
|
107 MsgUnifiedEditorBaseWidget(parent), |
86 mHasImage(false), |
108 mHasImage(false), |
87 mHasAudio(false), |
109 mHasAudio(false), |
88 mTextEdit(0), |
110 mTextEdit(0), |
89 mEditorFrame(0), |
111 mEditorFrame(0), |
90 mIconItem(0), |
112 mIconItem(0), |
91 mAudioItem(0), |
113 mAudioItem(0), |
92 mPluginPath(pluginPath), |
|
93 mImageSize(0), |
114 mImageSize(0), |
94 mAudioSize(0), |
115 mAudioSize(0), |
95 mVideoSize(0), |
116 mVideoSize(0), |
96 mProcessImageOperation(0), |
117 mProcessImageOperation(0), |
97 mMediaResolver(0), |
118 mMediaResolver(0), |
98 mImageInfo(0) |
119 mImageInfo(0), |
99 { |
120 mProcessingWidget(0) |
100 setPluginBaseId(style()->registerPlugin(mPluginPath)); |
121 { |
101 |
|
102 mTextEdit = new HbTextEdit(this); |
122 mTextEdit = new HbTextEdit(this); |
103 HbStyle::setItemName(mTextEdit,"textEdit"); |
123 HbStyle::setItemName(mTextEdit,"textEdit"); |
104 |
124 |
105 HbFrameDrawer* frameDrawer = new HbFrameDrawer(EDITOR_FRAME, |
125 HbFrameDrawer* frameDrawer = new HbFrameDrawer(EDITOR_FRAME, |
106 HbFrameDrawer::NinePieces); |
126 HbFrameDrawer::NinePieces); |
113 HbEditorInterface editorInterface(mTextEdit); |
133 HbEditorInterface editorInterface(mTextEdit); |
114 HbAction *sendAction = new HbAction(HbIcon(SEND_ICON), QString(),this); |
134 HbAction *sendAction = new HbAction(HbIcon(SEND_ICON), QString(),this); |
115 connect(sendAction, SIGNAL(triggered()),this, SIGNAL(sendMessage())); |
135 connect(sendAction, SIGNAL(triggered()),this, SIGNAL(sendMessage())); |
116 editorInterface.addAction(sendAction); |
136 editorInterface.addAction(sendAction); |
117 |
137 |
118 mGestureFilter = new HbGestureSceneFilter(Qt::LeftButton, this); |
138 /* mGestureFilter = new HbGestureSceneFilter(Qt::LeftButton, this); |
119 mGestureFilter->setLongpressAnimation(true); |
139 mGestureFilter->setLongpressAnimation(true); |
120 HbGesture *gesture = new HbGesture(HbGesture::longpress, 5); |
140 HbGesture *gesture = new HbGesture(HbGesture::longpress, 5); |
121 mGestureFilter->addGesture(gesture); |
141 mGestureFilter->addGesture(gesture); |
122 connect(gesture, SIGNAL(longPress(QPointF)), this, SLOT(longPressed(QPointF))); |
142 connect(gesture, SIGNAL(longPress(QPointF)), this, SLOT(longPressed(QPointF)));*/ |
123 connect(mTextEdit, SIGNAL(contentsChanged()), this, SLOT(onTextChanged())); |
143 connect(mTextEdit, SIGNAL(contentsChanged()), this, SLOT(onTextChanged())); |
124 |
|
125 mfs.Connect(); |
|
126 mfs.ShareProtected(); |
|
127 |
144 |
128 mMmsConformanceCheck = new MmsConformanceCheck; |
145 mMmsConformanceCheck = new MmsConformanceCheck; |
129 |
146 |
130 mCharCounter = new HbTextItem(this); |
147 mCharCounter = new HbTextItem(this); |
131 HbStyle::setItemName(mCharCounter, "charCounter"); |
148 HbStyle::setItemName(mCharCounter, "charCounter"); |
159 mCharSupportType = TUniSendingSettings::EUniCharSupportReduced; |
177 mCharSupportType = TUniSendingSettings::EUniCharSupportReduced; |
160 } |
178 } |
161 |
179 |
162 CleanupStack::PopAndDestroy( account ); |
180 CleanupStack::PopAndDestroy( account ); |
163 CleanupStack::PopAndDestroy( settings ); |
181 CleanupStack::PopAndDestroy( settings ); |
164 |
182 ); |
165 //Set the mPrevBuffer to NULL initially |
183 |
166 mPrevBuffer = QString(); |
|
167 |
|
168 mCharCounter->setVisible(false); |
184 mCharCounter->setVisible(false); |
169 mBackgroundItem->setVisible(false); |
185 mBackgroundItem->setVisible(false); |
170 } |
186 } |
171 |
187 |
172 MsgUnifiedEditorBody::~MsgUnifiedEditorBody() |
188 MsgUnifiedEditorBody::~MsgUnifiedEditorBody() |
173 { |
189 { |
174 style()->unregisterPlugin(mPluginPath); |
|
175 delete mMmsConformanceCheck; |
190 delete mMmsConformanceCheck; |
176 delete mProcessImageOperation; |
191 delete mProcessImageOperation; |
177 delete mMediaResolver; |
192 delete mMediaResolver; |
178 delete mImageInfo; |
193 delete mImageInfo; |
179 //Close has to be called after ProcessImageOperation object is deleted |
|
180 mfs.Close(); |
|
181 } |
194 } |
182 |
195 |
183 QString MsgUnifiedEditorBody::text() |
196 QString MsgUnifiedEditorBody::text() |
184 { |
197 { |
185 return mTextEdit->toPlainText(); |
198 return mTextEdit->toPlainText(); |
202 int error = KErrNone; |
215 int error = KErrNone; |
203 |
216 |
204 if( !mProcessImageOperation ) |
217 if( !mProcessImageOperation ) |
205 { |
218 { |
206 TRAP(error,mProcessImageOperation = |
219 TRAP(error,mProcessImageOperation = |
207 CUniEditorProcessImageOperation::NewL(*this, mfs)); |
220 CUniEditorProcessImageOperation::NewL(*this)); |
208 } |
221 } |
209 if( !mMediaResolver && error == KErrNone ) |
222 if( !mMediaResolver && error == KErrNone ) |
210 { |
223 { |
211 TRAP(error,mMediaResolver = CMsgMediaResolver::NewL()); |
224 TRAP(error,mMediaResolver = CMsgMediaResolver::NewL()); |
212 } |
225 } |
213 |
226 |
214 if( error == KErrNone) |
227 if( error == KErrNone) |
215 { |
228 { |
216 mMediaResolver->SetCharacterSetRecognition(EFalse); |
229 mMediaResolver->SetCharacterSetRecognition(EFalse); |
217 |
|
218 HBufC *name = S60QConversions::qStringToS60Desc(imagefile); |
230 HBufC *name = S60QConversions::qStringToS60Desc(imagefile); |
219 RFile file = mMediaResolver->FileHandleL(*name); |
231 RFile file; |
220 |
232 TRAP(error, file = mMediaResolver->FileHandleL(*name)); |
221 TRAP(error,mImageInfo = static_cast<CMsgImageInfo*> |
233 if(error == KErrNone) |
222 (mMediaResolver->CreateMediaInfoL(file))); |
234 { |
223 if (error == KErrNone) |
235 TRAP(error,mImageInfo = static_cast<CMsgImageInfo*> |
224 { |
236 (mMediaResolver->CreateMediaInfoL(file))); |
225 TRAP(error, mMediaResolver->ParseInfoDetailsL(mImageInfo, file)); |
237 if (error == KErrNone) |
|
238 { |
|
239 TRAP(error, mMediaResolver->ParseInfoDetailsL( |
|
240 mImageInfo, file)); |
|
241 } |
|
242 file.Close(); |
226 } |
243 } |
227 |
|
228 file.Close(); |
|
229 delete name; |
244 delete name; |
230 } |
245 } |
231 |
246 |
232 if (error == KErrNone) |
247 if (error == KErrNone) |
233 { |
248 { |
234 mSavedImageFile = imagefile; |
249 mSavedImageFile = imagefile; |
235 startResizeAnimation(); |
250 startResizeAnimation(); |
236 mProcessImageOperation->Process(mImageInfo); |
251 mProcessImageOperation->Process(mImageInfo); |
272 QPixmap pixmap(mImageFile); |
288 QPixmap pixmap(mImageFile); |
273 mIconItem->setIcon(HbIcon(pixmap)); |
289 mIconItem->setIcon(HbIcon(pixmap)); |
274 |
290 |
275 HbStyle::setItemName(mIconItem, "pixmap"); |
291 HbStyle::setItemName(mIconItem, "pixmap"); |
276 mIconItem->setAlignment(Qt::AlignHCenter | Qt::AlignTop); |
292 mIconItem->setAlignment(Qt::AlignHCenter | Qt::AlignTop); |
277 mIconItem->installSceneEventFilter(mGestureFilter); |
293 // mIconItem->installSceneEventFilter(mGestureFilter); |
278 |
294 |
279 // repolish the body widget |
295 // repolish the body widget |
280 this->repolish(); |
296 this->repolish(); |
281 |
297 |
282 // emit signal to indicate addition of image |
298 // emit signal to indicate addition of image |
330 |
346 |
331 // emit signal to indicate addition of audio |
347 // emit signal to indicate addition of audio |
332 emit contentChanged(); |
348 emit contentChanged(); |
333 } |
349 } |
334 |
350 |
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) |
351 void MsgUnifiedEditorBody::setText(QString& text) |
368 { |
352 { |
369 mTextEdit->setPlainText(text); |
353 mTextEdit->setPlainText(text); |
370 } |
354 } |
371 |
355 |
385 } |
369 } |
386 |
370 |
387 QSizeF MsgUnifiedEditorBody::sizeHint(Qt::SizeHint which, const QSizeF &constraint) const |
371 QSizeF MsgUnifiedEditorBody::sizeHint(Qt::SizeHint which, const QSizeF &constraint) const |
388 { |
372 { |
389 QSizeF szHint = HbWidget::sizeHint(which,constraint); |
373 QSizeF szHint = HbWidget::sizeHint(which,constraint); |
390 |
374 |
391 QList<HbMainWindow *> windowList = hbInstance->allMainWindows(); |
375 HbMainWindow* mMainWindow = this->mainWindow(); |
392 HbMainWindow* mMainWindow = windowList[0]; |
376 if(!mMainWindow) |
|
377 { |
|
378 return szHint; |
|
379 } |
393 |
380 |
394 qreal leftMargin = 0.0; |
381 qreal leftMargin = 0.0; |
395 qreal rightMargin = 0.0; |
382 qreal rightMargin = 0.0; |
396 qreal chromeHeight = 0.0; |
383 qreal chromeHeight = 0.0; |
397 qreal toolbarHeight = 0.0; |
384 qreal toolbarHeight = 0.0; |
472 { |
459 { |
473 qreal newWidth = defaultImageSize.width()*newHeight/defaultImageSize.height(); |
460 qreal newWidth = defaultImageSize.width()*newHeight/defaultImageSize.height(); |
474 imageSize.setWidth(newWidth); |
461 imageSize.setWidth(newWidth); |
475 } |
462 } |
476 |
463 |
|
464 if(mIconItem) |
|
465 { |
477 mIconItem->setPreferredSize(imageSize); |
466 mIconItem->setPreferredSize(imageSize); |
478 mIconItem->setSize(imageSize); |
467 mIconItem->setSize(imageSize); |
479 if(mMainWindow->orientation() == Qt::Horizontal) |
468 if(mMainWindow->orientation() == Qt::Horizontal) |
480 { |
469 { |
481 QPointF currPos = mIconItem->pos(); |
470 QPointF currPos = mIconItem->pos(); |
482 currPos.setX(leftMargin+((maxWidth-imageSize.width())/2)); |
471 currPos.setX(leftMargin+((maxWidth-imageSize.width())/2)); |
483 mIconItem->setPos(currPos); |
472 mIconItem->setPos(currPos); |
484 } |
473 } |
485 mIconItem->show(); |
474 mIconItem->show(); |
|
475 } |
|
476 |
|
477 if(mProcessingWidget) |
|
478 { |
|
479 imageSize.setHeight(mProcessingWidget->preferredHeight()); |
|
480 mProcessingWidget->setPreferredSize(imageSize); |
|
481 mProcessingWidget->show(); |
|
482 } |
486 szHint.rheight() += imageSize.height(); |
483 szHint.rheight() += imageSize.height(); |
487 } |
484 } |
488 } |
485 } |
|
486 |
489 |
487 |
490 mTextEdit->setMinimumHeight(maxHeight); |
488 mTextEdit->setMinimumHeight(maxHeight); |
491 szHint.rheight() += bodyItemSpacing; |
489 szHint.rheight() += bodyItemSpacing; |
492 return szHint; |
490 return szHint; |
493 } |
491 } |
707 } |
705 } |
708 |
706 |
709 void MsgUnifiedEditorBody::onTextChanged() |
707 void MsgUnifiedEditorBody::onTextChanged() |
710 { |
708 { |
711 QString string = text(); |
709 QString string = text(); |
712 |
710 |
713 if( !mPrevBuffer.isEmpty() && |
711 if( string.size() > mPrevBuffer.size() && |
714 string.size() > mPrevBuffer.size() && |
712 MsgMonitor::messageType() == ConvergedMessage::Mms ) |
715 MsgMonitor::messageType() == ConvergedMessage::Mms ) |
713 { |
716 { |
714 // reject any text input if mms size limit is reached |
717 //Save the previous buffer |
715 int futureSize = bodySize() + |
718 mPrevBuffer = string; |
716 MsgMonitor::containerSize() + MsgMonitor::subjectSize(); |
719 // emit signal to indicate change in content |
717 if(futureSize > MsgMonitor::maxMmsSize()) |
720 emit contentChanged(); |
718 { |
721 |
719 mTextEdit->setPlainText(mPrevBuffer); |
722 return; |
720 HbNotificationDialog::launchDialog(LOC_UNABLE_TO_ADD_CONTENT); |
|
721 mTextEdit->setCursorPosition(mPrevBuffer.length()); |
|
722 return; |
|
723 } |
|
724 else if(!mPrevBuffer.isEmpty()) |
|
725 { |
|
726 //Save the previous buffer |
|
727 mPrevBuffer = string; |
|
728 // emit signal to indicate change in content |
|
729 emit contentChanged(); |
|
730 return; |
|
731 } |
723 } |
732 } |
724 |
733 |
725 //Check done for optimization |
734 //Check done for optimization |
726 //Only if content is deleted we need to call encodingsettings again |
735 //Only if content is deleted we need to call encodingsettings again |
727 if (mPrevBuffer.isEmpty() || string.size() <= mPrevBuffer.size()) |
736 if (mPrevBuffer.isEmpty() || string.size() <= mPrevBuffer.size()) |
787 handleSetImage(); |
796 handleSetImage(); |
788 } |
797 } |
789 |
798 |
790 void MsgUnifiedEditorBody::startResizeAnimation() |
799 void MsgUnifiedEditorBody::startResizeAnimation() |
791 { |
800 { |
792 HbIconAnimationManager *manager = HbIconAnimationManager::global(); |
801 QGraphicsLinearLayout* processingLayout = new QGraphicsLinearLayout(Qt::Vertical); |
793 bool defined = manager->addDefinitionFile(":/animation.axml"); |
802 |
794 |
803 mProcessingWidget = new HbWidget(this); |
795 HbIcon animIcon; |
804 HbStyle::setItemName(mProcessingWidget,"pixmap"); |
796 animIcon.setIconName("frame_anim_looping"); |
805 mProcessingWidget->hide(); |
797 |
806 mProcessingWidget->setLayout(processingLayout); |
798 mIconItem = new HbIconItem(this); |
807 |
799 mIconItem->hide(); |
808 HbTextItem* processingText = new HbTextItem(LOC_PROCESSING,mProcessingWidget); |
800 HbStyle::setItemName(mIconItem,"pixmap"); |
809 processingText->setAlignment(Qt::AlignCenter); |
801 mIconItem->setAlignment(Qt::AlignHCenter | Qt::AlignTop); |
810 processingLayout->addItem(processingText); |
802 mIconItem->setIcon(animIcon); |
811 |
803 |
812 HbIconItem* animationItem = new HbIconItem(ANIMATION_ICON,mProcessingWidget); |
804 mImageFile = ANIMATION_ICON; |
813 processingLayout->addItem(animationItem); |
805 HbIconAnimator animator; |
814 |
806 animator.setIcon(animIcon); |
815 HbIconAnimator& iconAnimator = animationItem->animator(); |
807 |
816 HbIconAnimationManager* iconAnimationManager = HbIconAnimationManager::global(); |
808 animator.startAnimation(); |
817 iconAnimationManager->addDefinitionFile(ANIMATION_FILE); |
809 this->repolish(); |
818 |
|
819 iconAnimator.startAnimation(); |
|
820 |
|
821 this->repolish(); |
810 } |
822 } |
811 |
823 |
812 void MsgUnifiedEditorBody::stopResizeAnimation() |
824 void MsgUnifiedEditorBody::stopResizeAnimation() |
813 { |
825 { |
814 if (mIconItem) |
826 if(mProcessingWidget) |
815 { |
827 { |
816 delete mIconItem; |
828 delete mProcessingWidget; |
817 mIconItem = NULL; |
829 mProcessingWidget = NULL; |
818 } |
830 } |
819 } |
831 } |
820 |
832 |
821 // --------------------------------------------------------- |
833 // --------------------------------------------------------- |
822 // MsgUnifiedEditorBody::isUnicode |
834 // MsgUnifiedEditorBody::isUnicode |
823 // --------------------------------------------------------- |
835 // --------------------------------------------------------- |