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"); |
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; |
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()) |
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 // --------------------------------------------------------- |