16 */ |
16 */ |
17 |
17 |
18 #include "nmuiheaders.h" |
18 #include "nmuiheaders.h" |
19 |
19 |
20 // Layout |
20 // Layout |
21 static const char *NMUI_EDITOR_TO_LABEL = "EditorHeaderToLabel"; |
21 static const char *NMUI_EDITOR_RECIPIENT_FIELDS = "RecipientFields"; |
22 static const char *NMUI_EDITOR_TO_EDIT = "EditorHeaderToEdit"; |
|
23 static const char *NMUI_EDITOR_TO_BUTTON = "EditorHeaderToButton"; |
|
24 static const char *NMUI_EDITOR_RECIPIENT_GB = "EditorHeaderRecipientGB"; |
|
25 static const char *NMUI_EDITOR_SUBJECT_LABEL = "EditorHeaderSubjectLabel"; |
22 static const char *NMUI_EDITOR_SUBJECT_LABEL = "EditorHeaderSubjectLabel"; |
26 static const char *NMUI_EDITOR_SUBJECT_EDIT = "EditorHeaderSubjectEdit"; |
23 static const char *NMUI_EDITOR_SUBJECT_EDIT = "EditorHeaderSubjectEdit"; |
27 static const char *NMUI_EDITOR_PRIORITY_ICON = "labelPriorityIcon"; |
24 static const char *NMUI_EDITOR_PRIORITY_ICON = "labelPriorityIcon"; |
28 static const char *NMUI_EDITOR_ATTACHMENT_LIST = "attachmentListWidget"; |
25 static const char *NMUI_EDITOR_ATTACHMENT_LIST = "attachmentListWidget"; |
29 |
26 |
30 // Following constants are removed when header fields will offer these |
27 // Following constants are removed when header fields will offer these |
31 static const double Un = 6.66; |
28 static const double Un = 6.66; |
32 static const double FieldHeightWhenSecondaryFont = 5 * Un; |
29 static const double FieldHeightWhenSecondaryFont = 5 * Un; |
33 static const int GroupBoxTitleHeight = 42; |
|
34 static const double Margin = 2 * Un; |
30 static const double Margin = 2 * Un; |
35 static const double HeaderAreaMarginsTotal = 3 * Un; |
|
36 static const double IconFieldWidth = 5 * Un; |
31 static const double IconFieldWidth = 5 * Un; |
37 |
32 |
38 static const int nmLayoutSystemWaitTimer = 10; |
33 static const int nmLayoutSystemWaitTimer = 10; |
39 |
34 |
40 /*! |
35 /*! |
70 /*! |
68 /*! |
71 Load widgets from XML for the header. |
69 Load widgets from XML for the header. |
72 */ |
70 */ |
73 void NmEditorHeader::loadWidgets() |
71 void NmEditorHeader::loadWidgets() |
74 { |
72 { |
75 // To: field objects |
73 // Add "To:", "CC:" and "BCC:" fields |
76 HbLabel *toLabel = qobject_cast<HbLabel *> |
74 mHeader = qobject_cast<HbWidget *> |
77 (mDocumentLoader->findWidget(NMUI_EDITOR_TO_LABEL)); |
75 (mDocumentLoader->findWidget(NMUI_EDITOR_RECIPIENT_FIELDS)); |
78 NmRecipientLineEdit *toEdit = qobject_cast<NmRecipientLineEdit *> |
76 |
79 (mDocumentLoader->findWidget(NMUI_EDITOR_TO_EDIT)); |
77 mLayout = new QGraphicsLinearLayout(Qt::Vertical); |
80 HbPushButton *toButton = qobject_cast<HbPushButton *> |
78 mLayout->setContentsMargins(0,Un,0,0); |
81 (mDocumentLoader->findWidget(NMUI_EDITOR_TO_BUTTON)); |
79 |
82 mToField = new NmRecipientField(toLabel, toEdit, toButton); |
80 mToField = new NmRecipientField(QString("To:"), mHeader); |
83 |
81 mCcField = new NmRecipientField(QString("Cc:"), mHeader); |
84 // Create recipient group box which includes cc and bcc fields |
82 mBccField = new NmRecipientField(QString("Bcc:"), mHeader); |
85 mGroupBoxRecipient = qobject_cast<HbGroupBox *> |
83 |
86 (mDocumentLoader->findWidget(NMUI_EDITOR_RECIPIENT_GB)); |
84 // Only 'To:' field is visible at startup |
87 // Ownership is transfered |
85 mLayout->addItem(mToField); |
88 mGroupBoxRecipient->setContentWidget(createRecipientGroupBoxContentWidget()); |
86 mCcField->hide(); |
89 mGroupBoxRecipient->setHeading(hbTrId("txt_mail_subhead_ccbcc")); |
87 mBccField->hide(); |
90 mGroupBoxRecipient->setCollapsable(true); |
88 |
91 mGroupBoxRecipient->setCollapsed(true); |
89 mHeader->setLayout(mLayout); |
|
90 mHeader->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::MinimumExpanding); |
92 |
91 |
93 // Add Subject: field |
92 // Add Subject: field |
94 mSubjectLabel = qobject_cast<HbLabel *> |
93 mSubjectLabel = qobject_cast<HbLabel *> |
95 (mDocumentLoader->findWidget(NMUI_EDITOR_SUBJECT_LABEL)); |
94 (mDocumentLoader->findWidget(NMUI_EDITOR_SUBJECT_LABEL)); |
96 mSubjectEdit = qobject_cast<NmHtmlLineEdit *> |
95 mSubjectEdit = qobject_cast<NmHtmlLineEdit *> |
119 connect(mBccField, SIGNAL(textChanged(const QString &)), |
118 connect(mBccField, SIGNAL(textChanged(const QString &)), |
120 this, SLOT(editorContentChanged())); |
119 this, SLOT(editorContentChanged())); |
121 |
120 |
122 // Signals for handling the recipient field expanding |
121 // Signals for handling the recipient field expanding |
123 connect(mToField, SIGNAL(textChanged(const QString &)), |
122 connect(mToField, SIGNAL(textChanged(const QString &)), |
124 this, SLOT(sendHeaderHeightChanged())); |
123 this, SLOT(fixHeaderFieldHeights())); |
125 connect(mCcField, SIGNAL(textChanged(const QString &)), |
124 connect(mCcField, SIGNAL(textChanged(const QString &)), |
126 this, SLOT(sendHeaderHeightChanged())); |
125 this, SLOT(fixHeaderFieldHeights())); |
127 connect(mBccField, SIGNAL(textChanged(const QString &)), |
126 connect(mBccField, SIGNAL(textChanged(const QString &)), |
128 this, SLOT(sendHeaderHeightChanged())); |
127 this, SLOT(fixHeaderFieldHeights())); |
129 connect(mSubjectEdit, SIGNAL(contentsChanged()), this, SLOT(sendHeaderHeightChanged())); |
128 connect(mSubjectEdit, SIGNAL(contentsChanged()), this, SLOT(fixHeaderFieldHeights())); |
130 |
|
131 // Signal for handling the recipient group box expanding/collapsing |
|
132 connect(mGroupBoxRecipient, SIGNAL(toggled(bool)), |
|
133 this, SLOT(groupBoxExpandCollapse())); |
|
134 |
129 |
135 // Signals for handling the attachment list |
130 // Signals for handling the attachment list |
136 connect(&mAttachmentList->listWidget(), SIGNAL(itemActivated(int)), |
131 connect(&mAttachmentList->listWidget(), SIGNAL(itemActivated(int)), |
137 this, SLOT(attachmentActivated(int))); |
132 this, SLOT(attachmentActivated(int))); |
138 connect(&mAttachmentList->listWidget(), SIGNAL(longPressed(int, QPointF)), |
133 connect(&mAttachmentList->listWidget(), SIGNAL(longPressed(int, QPointF)), |
153 (Should find beter way to get the height of the header area.) |
172 (Should find beter way to get the height of the header area.) |
154 */ |
173 */ |
155 int NmEditorHeader::headerHeight() const |
174 int NmEditorHeader::headerHeight() const |
156 { |
175 { |
157 qreal toHeight = mToField->height(); |
176 qreal toHeight = mToField->height(); |
|
177 qreal ccHeight = 0; |
|
178 qreal bccHeight = 0; |
|
179 if (mCcBccFieldVisible) { |
|
180 ccHeight = mCcField->height(); |
|
181 bccHeight = mBccField->height(); |
|
182 } |
158 qreal subjectHeight = mSubjectEdit->geometry().height() + Margin; |
183 qreal subjectHeight = mSubjectEdit->geometry().height() + Margin; |
159 |
184 |
160 // When called first time, height is wrongly 'Margin' |
185 // When called first time, height is wrongly 'Margin' |
161 if (toHeight == Margin) { |
186 if (toHeight == Margin) { |
162 toHeight = FieldHeightWhenSecondaryFont; |
187 toHeight = FieldHeightWhenSecondaryFont; |
|
188 ccHeight = FieldHeightWhenSecondaryFont; |
|
189 bccHeight = FieldHeightWhenSecondaryFont; |
163 subjectHeight = FieldHeightWhenSecondaryFont; |
190 subjectHeight = FieldHeightWhenSecondaryFont; |
164 } |
|
165 |
|
166 // Recipient GroupBox |
|
167 qreal recipientGroupBoxHeight = GroupBoxTitleHeight; |
|
168 if (!mGroupBoxRecipient->isCollapsed()) { |
|
169 recipientGroupBoxHeight += |
|
170 mGroupBoxRecipientContent->geometry().height() + HeaderAreaMarginsTotal; |
|
171 } |
191 } |
172 |
192 |
173 qreal attHeight = 0; |
193 qreal attHeight = 0; |
174 if (mAttachmentList && mAttachmentList->count() > 0) { |
194 if (mAttachmentList && mAttachmentList->count() > 0) { |
175 attHeight = mAttachmentList->listWidget().geometry().height(); |
195 attHeight = mAttachmentList->listWidget().geometry().height(); |
176 } |
196 } |
177 |
197 |
178 return (int)(toHeight + recipientGroupBoxHeight + subjectHeight + attHeight); |
198 return (int)(toHeight + ccHeight + bccHeight + subjectHeight + attHeight); |
179 } |
199 } |
180 |
200 |
181 /*! |
201 /*! |
182 Send signal to inform that one of the recipient fields height has been changed. |
202 Send signal to inform that one of the recipient fields height has been changed. |
183 */ |
203 */ |
|
204 void NmEditorHeader::fixHeaderFieldHeights() |
|
205 { |
|
206 // Adjust height of recipient fields |
|
207 adjustFieldSizeValues(mToField->editor(), mToField->editor()->document()->size().height()); |
|
208 adjustFieldSizeValues(mCcField->editor(), mCcField->editor()->document()->size().height()); |
|
209 adjustFieldSizeValues(mBccField->editor(), mBccField->editor()->document()->size().height()); |
|
210 |
|
211 // Adjust height of the subject field |
|
212 if (mSubjectEdit->document()->size().height() > FieldHeightWhenSecondaryFont) { |
|
213 mSubjectEdit->setPreferredHeight( |
|
214 mSubjectEdit->document()->size().height() + Margin ); |
|
215 } |
|
216 else { |
|
217 mSubjectEdit->setPreferredHeight( FieldHeightWhenSecondaryFont ); |
|
218 } |
|
219 |
|
220 QTimer::singleShot(nmLayoutSystemWaitTimer*5, this, SLOT(sendHeaderHeightChanged())); |
|
221 } |
|
222 |
|
223 |
|
224 /*! |
|
225 Private routine to adjust heights of the recipient fields |
|
226 */ |
|
227 void NmEditorHeader::adjustFieldSizeValues( NmRecipientLineEdit *widget, qreal height ) |
|
228 { |
|
229 if (height > FieldHeightWhenSecondaryFont) { |
|
230 widget->setMaximumHeight( height + Margin ); |
|
231 widget->setMinimumHeight( height + Margin ); |
|
232 } |
|
233 else { |
|
234 widget->setMaximumHeight( FieldHeightWhenSecondaryFont ); |
|
235 widget->setMinimumHeight( FieldHeightWhenSecondaryFont ); |
|
236 } |
|
237 } |
|
238 |
|
239 /*! |
|
240 Send signal to inform that one of the recipient fields height has been changed. |
|
241 */ |
184 void NmEditorHeader::sendHeaderHeightChanged() |
242 void NmEditorHeader::sendHeaderHeightChanged() |
185 { |
243 { |
186 // Adjust field heights |
|
187 mToField->editor()->setPreferredHeight( |
|
188 mToField->editor()->document()->size().height() + Margin); |
|
189 mCcField->editor()->setPreferredHeight( |
|
190 mCcField->editor()->document()->size().height() + Margin); |
|
191 mBccField->editor()->setPreferredHeight( |
|
192 mBccField->editor()->document()->size().height() + Margin); |
|
193 mSubjectEdit->setPreferredHeight( |
|
194 mSubjectEdit->document()->size().height() + Margin); |
|
195 |
|
196 int hHeight = headerHeight(); |
244 int hHeight = headerHeight(); |
197 if (mHeaderHeight != hHeight) { |
245 if (mHeaderHeight != hHeight) { |
198 mHeaderHeight = hHeight; |
246 mHeaderHeight = hHeight; |
199 emit headerHeightChanged(mHeaderHeight); |
247 emit headerHeightChanged(mHeaderHeight); |
200 } |
248 } |
201 } |
249 } |
202 |
250 |
203 /*! |
251 /*! |
204 This slot is called when group box state is changed. Timer is used to give some time |
252 Return pointer to to edit |
205 for layout system so that header hight can be recalculated correctly |
253 */ |
206 */ |
254 NmRecipientLineEdit* NmEditorHeader::toEdit() const |
207 void NmEditorHeader::groupBoxExpandCollapse() |
|
208 { |
|
209 QTimer::singleShot(nmLayoutSystemWaitTimer, this, SLOT(sendHeaderHeightChanged())); |
|
210 } |
|
211 |
|
212 /*! |
|
213 Return pointer to to field |
|
214 */ |
|
215 NmRecipientLineEdit* NmEditorHeader::toField() const |
|
216 { |
255 { |
217 return mToField->editor(); |
256 return mToField->editor(); |
218 } |
257 } |
219 |
258 |
220 /*! |
259 /*! |
221 Return pointer to cc field |
260 Return pointer to cc edit |
222 */ |
261 */ |
223 NmRecipientLineEdit* NmEditorHeader::ccField() const |
262 NmRecipientLineEdit* NmEditorHeader::ccEdit() const |
224 { |
263 { |
225 return mCcField->editor(); |
264 return mCcField->editor(); |
226 } |
265 } |
227 |
266 |
228 /*! |
267 /*! |
229 Return pointer to bcc field |
268 Return pointer to bcc edit |
230 */ |
269 */ |
231 NmRecipientLineEdit* NmEditorHeader::bccField() const |
270 NmRecipientLineEdit* NmEditorHeader::bccEdit() const |
232 { |
271 { |
233 return mBccField->editor(); |
272 return mBccField->editor(); |
234 } |
273 } |
235 |
274 |
236 /*! |
275 /*! |
237 Return pointer to subject field |
276 Return pointer to subject field |
238 */ |
277 */ |
239 NmHtmlLineEdit* NmEditorHeader::subjectField() const |
278 NmHtmlLineEdit* NmEditorHeader::subjectEdit() const |
240 { |
279 { |
241 return mSubjectEdit; |
280 return mSubjectEdit; |
242 } |
281 } |
243 |
282 |
244 /*! |
283 /*! |
259 } |
298 } |
260 if (mRecipientFieldsEmpty != recipientsFieldsEmpty) { |
299 if (mRecipientFieldsEmpty != recipientsFieldsEmpty) { |
261 mRecipientFieldsEmpty = recipientsFieldsEmpty; |
300 mRecipientFieldsEmpty = recipientsFieldsEmpty; |
262 emit recipientFieldsHaveContent(!mRecipientFieldsEmpty); |
301 emit recipientFieldsHaveContent(!mRecipientFieldsEmpty); |
263 } |
302 } |
264 } |
|
265 |
|
266 /*! |
|
267 This function create content widget for recipient group box. |
|
268 When AD offers groupBox content widget handling. This function |
|
269 need to be changed to use AD/docml |
|
270 */ |
|
271 HbWidget* NmEditorHeader::createRecipientGroupBoxContentWidget() |
|
272 { |
|
273 mGroupBoxRecipientContent = new HbWidget(); |
|
274 |
|
275 // Create layout for the widget |
|
276 mGbVerticalLayout = new QGraphicsLinearLayout(Qt::Vertical,mGroupBoxRecipientContent); |
|
277 mCcFieldLayout = new QGraphicsLinearLayout(Qt::Horizontal, mGbVerticalLayout); |
|
278 mBccFieldLayout = new QGraphicsLinearLayout(Qt::Horizontal, mGbVerticalLayout); |
|
279 |
|
280 // Add Cc: field into widget |
|
281 mCcField = new NmRecipientField(hbTrId("txt_mail_editor_cc")); |
|
282 if (mCcField) { |
|
283 mCcField->setObjectName("lineEditCcField"); |
|
284 mGbVerticalLayout->insertItem(EEditorCcLine, mCcField ); |
|
285 } |
|
286 |
|
287 // Add Bcc: field into widget |
|
288 mBccField = new NmRecipientField(hbTrId("txt_mail_editor_bcc")); |
|
289 if (mBccField){ |
|
290 mBccField->setObjectName("lineEditBccField"); |
|
291 mGbVerticalLayout->insertItem(EEditorBccLine, mBccField); |
|
292 } |
|
293 mGbVerticalLayout->setContentsMargins(0,0,0,0); |
|
294 |
|
295 mGroupBoxRecipientContent->setLayout(mGbVerticalLayout); |
|
296 return mGroupBoxRecipientContent; |
|
297 } |
303 } |
298 |
304 |
299 /*! |
305 /*! |
300 Sets the icon for priority |
306 Sets the icon for priority |
301 */ |
307 */ |