• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdepim API Reference
  • KDE Home
  • Contact Us
 

messageviewer

  • sources
  • kde-4.14
  • kdepim
  • messageviewer
  • widgets
eventedit.cpp
Go to the documentation of this file.
1 /*
2  Copyright (c) 2014-2015 Montel Laurent <montel@kde.org>
3 
4  This program is free software; you can redistribute it and/or modify it
5  under the terms of the GNU General Public License, version 2, as
6  published by the Free Software Foundation.
7 
8  This program is distributed in the hope that it will be useful, but
9  WITHOUT ANY WARRANTY; without even the implied warranty of
10  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11  General Public License for more details.
12 
13  You should have received a copy of the GNU General Public License along
14  with this program; if not, write to the Free Software Foundation, Inc.,
15  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16 */
17 
18 #include "eventedit.h"
19 
20 #include "messageviewer/globalsettings_base.h"
21 #include "eventdatetimewidget.h"
22 
23 #include <KLocalizedString>
24 #include <KLineEdit>
25 #include <KIcon>
26 #include <KDateTimeEdit>
27 #include <KTimeComboBox>
28 
29 #include <QHBoxLayout>
30 #include <QEvent>
31 #include <QKeyEvent>
32 #include <QLabel>
33 #include <KDateComboBox>
34 
35 #include <Akonadi/CollectionComboBox>
36 #include <KPushButton>
37 
38 #include <incidenceeditor-ng/incidencedialogfactory.h>
39 #include <incidenceeditor-ng/incidencedialog.h>
40 
41 
42 namespace MessageViewer {
43 MESSAGEVIEWER_EXPORT QAbstractItemModel *_k_eventEditStubModel = 0;
44 }
45 
46 using namespace MessageViewer;
47 
48 EventEdit::EventEdit(QWidget *parent)
49  : QWidget(parent)
50 {
51  QVBoxLayout *vbox = new QVBoxLayout;
52  vbox->setMargin(5);
53  vbox->setSpacing(2);
54  setLayout(vbox);
55 
56  QHBoxLayout *hbox = new QHBoxLayout;
57  hbox->setMargin(0);
58  hbox->setSpacing(2);
59  vbox->addLayout(hbox);
60 
61  QLabel *lab = new QLabel(i18n("Event:"));
62  hbox->addWidget(lab);
63 
64  mEventEdit = new KLineEdit;
65  mEventEdit->setClearButtonShown(true);
66  mEventEdit->setObjectName(QLatin1String("noteedit"));
67  mEventEdit->setFocus();
68  connect(mEventEdit, SIGNAL(returnPressed()), SLOT(slotReturnPressed()));
69  connect(mEventEdit, SIGNAL(textChanged(QString)), SLOT(slotUpdateButtons(QString)));
70  hbox->addWidget(mEventEdit);
71 
72  hbox->addSpacing(5);
73 
74  mCollectionCombobox = new Akonadi::CollectionComboBox(_k_eventEditStubModel);
75  mCollectionCombobox->setAccessRightsFilter(Akonadi::Collection::CanCreateItem);
76  mCollectionCombobox->setMinimumWidth(250);
77  mCollectionCombobox->setMimeTypeFilter( QStringList() << KCalCore::Event::eventMimeType() );
78  mCollectionCombobox->setObjectName(QLatin1String("akonadicombobox"));
79 #ifndef QT_NO_ACCESSIBILITY
80  mCollectionCombobox->setAccessibleDescription( i18n("Calendar where the new event will be stored.") );
81 #endif
82  mCollectionCombobox->setToolTip( i18n("Calendar where the new event will be stored.") );
83 
84  connect(mCollectionCombobox, SIGNAL(currentIndexChanged(int)), SLOT(slotCollectionChanged(int)));
85  connect(mCollectionCombobox, SIGNAL(activated(int)), SLOT(slotCollectionChanged(int)));
86  hbox->addWidget(mCollectionCombobox);
87 
88  hbox = new QHBoxLayout;
89  hbox->setMargin(0);
90  hbox->setSpacing(2);
91  vbox->addLayout(hbox);
92 
93  lab = new QLabel(i18n("Start:"));
94  hbox->addWidget(lab);
95  KDateTime currentDateTime = KDateTime::currentDateTime(KDateTime::LocalZone);
96  mStartDateTimeEdit = new EventDateTimeWidget;
97  mStartDateTimeEdit->setObjectName(QLatin1String("startdatetimeedit"));
98 
99 
100 #ifndef QT_NO_ACCESSIBILITY
101  mStartDateTimeEdit->setAccessibleDescription( i18n("Select start time for event.") );
102 #endif
103  connect(mStartDateTimeEdit, SIGNAL(dateTimeChanged(KDateTime)),
104  this, SLOT(slotStartDateTimeChanged(KDateTime)));
105 
106  hbox->addWidget(mStartDateTimeEdit);
107 
108  hbox->addSpacing(5);
109 
110  lab = new QLabel(i18n("End:"));
111  hbox->addWidget(lab);
112  mEndDateTimeEdit = new EventDateTimeWidget;
113  mEndDateTimeEdit->setObjectName(QLatin1String("enddatetimeedit"));
114  mEndDateTimeEdit->setDateTime(currentDateTime.addSecs(3600));
115 #ifndef QT_NO_ACCESSIBILITY
116  mEndDateTimeEdit->setAccessibleDescription( i18n("Select end time for event.") );
117 #endif
118  connect(mEndDateTimeEdit, SIGNAL(dateTimeChanged(KDateTime)),
119  this, SLOT(slotEndDateTimeChanged(KDateTime)));
120 
121  hbox->addWidget(mEndDateTimeEdit);
122 
123  hbox->addStretch(1);
124 
125  hbox = new QHBoxLayout;
126  hbox->setSpacing(2);
127  hbox->setMargin(0);
128  vbox->addLayout(hbox);
129 
130  hbox->addStretch(1);
131 
132  mSaveButton = new KPushButton(KIcon(QLatin1String("appointment-new")), i18n("&Save"));
133  mSaveButton->setObjectName(QLatin1String("save-button"));
134  mSaveButton->setEnabled(false);
135 #ifndef QT_NO_ACCESSIBILITY
136  mSaveButton->setAccessibleDescription(i18n("Create new event and close this widget."));
137 #endif
138  connect(mSaveButton, SIGNAL(clicked(bool)), this, SLOT(slotReturnPressed()));
139  hbox->addWidget(mSaveButton);
140 
141  mOpenEditorButton = new KPushButton(i18n("Open &editor..."));
142 #ifndef QT_NO_ACCESSIBILITY
143  mOpenEditorButton->setAccessibleDescription(i18n("Open event editor, where more details can be changed."));
144 #endif
145  mOpenEditorButton->setObjectName(QLatin1String("open-editor-button"));
146  mOpenEditorButton->setEnabled(false);
147  connect(mOpenEditorButton, SIGNAL(clicked(bool)), this, SLOT(slotOpenEditor()));
148  hbox->addWidget(mOpenEditorButton);
149 
150  KPushButton *btn = new KPushButton(KStandardGuiItem::cancel());
151  btn->setObjectName(QLatin1String("close-button"));
152 #ifndef QT_NO_ACCESSIBILITY
153  btn->setAccessibleDescription(i18n("Close the widget for creating new events."));
154 #endif
155  connect(btn, SIGNAL(clicked(bool)), this, SLOT(slotCloseWidget()));
156  hbox->addWidget(btn);
157 
158  readConfig();
159  setSizePolicy( QSizePolicy( QSizePolicy::Preferred, QSizePolicy::Fixed ) );
160  installEventFilter(this);
161  mCollectionCombobox->installEventFilter(this);
162 }
163 
164 EventEdit::~EventEdit()
165 {
166  writeConfig();
167 }
168 
169 void EventEdit::writeConfig()
170 {
171  const Akonadi::Collection col = mCollectionCombobox->currentCollection();
172  // col might not be valid if the collection wasn't found yet (the combo is async), skip saving in that case.
173  if (col.isValid() && col.id() != MessageViewer::GlobalSettingsBase::self()->lastEventSelectedFolder()) {
174  MessageViewer::GlobalSettingsBase::self()->setLastEventSelectedFolder(col.id());
175  MessageViewer::GlobalSettingsBase::self()->writeConfig();
176  }
177 }
178 
179 void EventEdit::slotUpdateButtons(const QString &subject)
180 {
181  const bool subjectIsNotEmpty = !subject.trimmed().isEmpty();
182  const bool collectionComboboxEmpty = (mCollectionCombobox->count() < 1);
183  mSaveButton->setEnabled(subjectIsNotEmpty && !collectionComboboxEmpty);
184  mOpenEditorButton->setEnabled(subjectIsNotEmpty && !collectionComboboxEmpty);
185 }
186 
187 void EventEdit::showEventEdit()
188 {
189  mEventEdit->setFocus();
190  KDateTime currentDateTime = KDateTime::currentDateTime(KDateTime::LocalZone);
191  mStartDateTimeEdit->setDateTime(currentDateTime);
192  mEndDateTimeEdit->setDateTime(currentDateTime.addSecs(3600));
193  show();
194 }
195 
196 void EventEdit::readConfig()
197 {
198  const qint64 id = MessageViewer::GlobalSettingsBase::self()->lastEventSelectedFolder();
199  if (id >= 0) {
200  mCollectionCombobox->setDefaultCollection(Akonadi::Collection(id));
201  }
202 }
203 
204 Akonadi::Collection EventEdit::collection() const
205 {
206  return mCollection;
207 }
208 
209 void EventEdit::slotCollectionChanged(int /*index*/)
210 {
211  setCollection(mCollectionCombobox->currentCollection());
212 }
213 
214 void EventEdit::setCollection(const Akonadi::Collection &value)
215 {
216  if (mCollection != value) {
217  mCollection = value;
218  Q_EMIT collectionChanged(mCollection);
219  }
220 }
221 
222 KMime::Message::Ptr EventEdit::message() const
223 {
224  return mMessage;
225 }
226 
227 void EventEdit::setMessage(const KMime::Message::Ptr &value)
228 {
229  if (mMessage != value) {
230  mMessage = value;
231  const KMime::Headers::Subject * const subject = mMessage ? mMessage->subject(false) : 0;
232  if (subject) {
233  mEventEdit->setText(i18n("Reply to \"%1\"", subject->asUnicodeString()));
234  mEventEdit->selectAll();
235  mEventEdit->setFocus();
236  } else {
237  mEventEdit->clear();
238  }
239  Q_EMIT messageChanged(mMessage);
240  }
241 }
242 
243 void EventEdit::slotCloseWidget()
244 {
245  if (isVisible()) {
246  writeConfig();
247  mEventEdit->clear();
248  mMessage = KMime::Message::Ptr();
249  hide();
250  }
251 }
252 
253 void EventEdit::slotReturnPressed()
254 {
255  if (!mMessage) {
256  kDebug()<<" Message is null";
257  return;
258  }
259  const Akonadi::Collection collection = mCollectionCombobox->currentCollection();
260  if (!collection.isValid()) {
261  kDebug()<<" Collection is not valid";
262  return;
263  }
264 
265  const KDateTime dtstart = mStartDateTimeEdit->dateTime();
266  const KDateTime dtend = mEndDateTimeEdit->dateTime();
267  if (!dtstart.isValid() || !dtend.isValid()) {
268  qDebug()<<" date is not valid !";
269  return;
270  }
271 
272  if (!mEventEdit->text().trimmed().isEmpty()) {
273  KCalCore::Event::Ptr event( new KCalCore::Event );
274  event->setDtStart(dtstart);
275  event->setDtEnd(dtend);
276  event->setSummary(mEventEdit->text());
277  Q_EMIT createEvent(event, collection);
278  mEventEdit->clear();
279  hide();
280  }
281 }
282 
283 bool EventEdit::eventFilter(QObject *object, QEvent *e)
284 {
285  // Close the bar when pressing Escape.
286  // Not using a QShortcut for this because it could conflict with
287  // window-global actions (e.g. Emil Sedgh binds Esc to "close tab").
288  // With a shortcut override we can catch this before it gets to kactions.
289  const bool shortCutOverride = (e->type() == QEvent::ShortcutOverride);
290  if (shortCutOverride ) {
291  QKeyEvent* kev = static_cast<QKeyEvent* >(e);
292  if (kev->key() == Qt::Key_Escape) {
293  e->accept();
294  slotCloseWidget();
295  return true;
296  } else if ( kev->key() == Qt::Key_Enter ||
297  kev->key() == Qt::Key_Return ||
298  kev->key() == Qt::Key_Space) {
299  e->accept();
300  if (object == mCollectionCombobox) {
301  mCollectionCombobox->showPopup();
302  }
303  return true;
304  }
305  }
306  return QWidget::eventFilter(object,e);
307 }
308 
309 void EventEdit::slotEndDateTimeChanged(const KDateTime &newDateTime)
310 {
311  if (!newDateTime.isValid()) {
312  return;
313  }
314  KDateTime currentDateTime = KDateTime::currentDateTime(KDateTime::LocalZone);
315  if (newDateTime.date() > currentDateTime.date()) {
316  KDateTime newDateDate = newDateTime;
317  newDateDate.setTime(QTime(0, 0, 0));
318  mEndDateTimeEdit->setMinimumDateTime(newDateDate);
319  }
320 }
321 
322 void EventEdit::slotStartDateTimeChanged(const KDateTime &newDateTime)
323 {
324  if (!newDateTime.isValid()) {
325  return;
326  }
327 
328  if (mEndDateTimeEdit->date() == newDateTime.date() && mEndDateTimeEdit->time() < newDateTime.time()) {
329  mEndDateTimeEdit->setTime(newDateTime.time());
330  }
331  if (mEndDateTimeEdit->date() < newDateTime.date()) {
332  mEndDateTimeEdit->setDate(newDateTime.date());
333  }
334 
335  mEndDateTimeEdit->setMinimumDateTime(newDateTime);
336 }
337 
338 
339 void EventEdit::slotOpenEditor()
340 {
341  KCalCore::Attachment::Ptr attachment(new KCalCore::Attachment(mMessage->encodedContent().toBase64(), KMime::Message::mimeType()));
342  const KMime::Headers::Subject * const subject = mMessage->subject(false);
343  if (subject) {
344  attachment->setLabel(subject->asUnicodeString());
345  }
346  KCalCore::Event::Ptr event(new KCalCore::Event);
347  event->setSummary(mEventEdit->text());
348  event->setDtStart(mStartDateTimeEdit->dateTime());
349  event->setDtEnd(mEndDateTimeEdit->dateTime());
350 
351  event->addAttachment(attachment);
352 
353  Akonadi::Item item;
354  item.setPayload<KCalCore::Event::Ptr>(event);
355  item.setMimeType(KCalCore::Event::eventMimeType());
356 
357  IncidenceEditorNG::IncidenceDialog *dlg = IncidenceEditorNG::IncidenceDialogFactory::create(true, KCalCore::IncidenceBase::TypeEvent, 0, this);
358  connect(dlg, SIGNAL(finished()), this, SLOT(slotCloseWidget()));
359  dlg->load(item);
360  dlg->open();
361 }
MessageViewer::EventDateTimeWidget::setDateTime
void setDateTime(const KDateTime &dateTime)
Definition: eventdatetimewidget.cpp:64
QWidget::setAccessibleDescription
void setAccessibleDescription(const QString &description)
QEvent
QWidget
QEvent::type
Type type() const
MessageViewer::EventEdit::~EventEdit
~EventEdit()
Definition: eventedit.cpp:164
QSizePolicy
QWidget::isVisible
bool isVisible() const
QHBoxLayout
MessageViewer::EventDateTimeWidget::date
QDate date() const
Definition: eventdatetimewidget.cpp:83
QBoxLayout::addSpacing
void addSpacing(int size)
MessageViewer::EventEdit::collection
Akonadi::Collection collection() const
Definition: eventedit.cpp:204
QTime
MessageViewer::EventEdit::message
KMime::Message::Ptr message() const
Definition: eventedit.cpp:222
MessageViewer::EventEdit::writeConfig
void writeConfig()
Definition: eventedit.cpp:169
MessageViewer::EventEdit::eventFilter
bool eventFilter(QObject *object, QEvent *e)
Definition: eventedit.cpp:283
QBoxLayout::addWidget
void addWidget(QWidget *widget, int stretch, QFlags< Qt::AlignmentFlag > alignment)
MessageViewer::EventEdit::createEvent
void createEvent(const KCalCore::Event::Ptr &event, const Akonadi::Collection &collection)
MessageViewer::_k_eventEditStubModel
MESSAGEVIEWER_EXPORT QAbstractItemModel * _k_eventEditStubModel
Definition: eventedit.cpp:43
QWidget::setLayout
void setLayout(QLayout *layout)
QObject::installEventFilter
void installEventFilter(QObject *filterObj)
QObject
MessageViewer::EventDateTimeWidget::time
QTime time() const
Definition: eventdatetimewidget.cpp:88
eventdatetimewidget.h
QObject::setObjectName
void setObjectName(const QString &name)
QString::isEmpty
bool isEmpty() const
QString::trimmed
QString trimmed() const
MessageViewer::EventDateTimeWidget::setTime
void setTime(const QTime &time)
Definition: eventdatetimewidget.cpp:93
QVBoxLayout
QObject::eventFilter
virtual bool eventFilter(QObject *watched, QEvent *event)
QString
QWidget::hide
void hide()
MessageViewer::EventDateTimeWidget::setMinimumDateTime
void setMinimumDateTime(const KDateTime &dateTime)
Definition: eventdatetimewidget.cpp:56
QLayout::setMargin
void setMargin(int margin)
QWidget::setSizePolicy
void setSizePolicy(QSizePolicy)
QStringList
MessageViewer::EventEdit::messageChanged
void messageChanged(const KMime::Message::Ptr &msg)
QKeyEvent::key
int key() const
QEvent::accept
void accept()
MESSAGEVIEWER_EXPORT
#define MESSAGEVIEWER_EXPORT
Definition: messageviewer_export.h:37
eventedit.h
MessageViewer::EventEdit::EventEdit
EventEdit(QWidget *parent=0)
Definition: eventedit.cpp:48
MessageViewer::EventDateTimeWidget::dateTime
KDateTime dateTime() const
Definition: eventdatetimewidget.cpp:75
QKeyEvent
MessageViewer::EventEdit::collectionChanged
void collectionChanged(const Akonadi::Collection &col)
MessageViewer::EventDateTimeWidget
Definition: eventdatetimewidget.h:28
MessageViewer::EventEdit::setCollection
void setCollection(const Akonadi::Collection &value)
Definition: eventedit.cpp:214
QLatin1String
QBoxLayout::addStretch
void addStretch(int stretch)
MessageViewer::EventDateTimeWidget::setDate
void setDate(const QDate &date)
Definition: eventdatetimewidget.cpp:98
MessageViewer::EventEdit::setMessage
void setMessage(const KMime::Message::Ptr &value)
Definition: eventedit.cpp:227
QAbstractItemModel
MessageViewer::EventEdit::slotCloseWidget
void slotCloseWidget()
Definition: eventedit.cpp:243
QWidget::show
void show()
QObject::connect
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
QLabel
MessageViewer::EventEdit::showEventEdit
void showEventEdit()
Definition: eventedit.cpp:187
QWidget::event
virtual bool event(QEvent *event)
QBoxLayout::setSpacing
void setSpacing(int spacing)
QBoxLayout::addLayout
void addLayout(QLayout *layout, int stretch)
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:32:45 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

messageviewer

Skip menu "messageviewer"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdepim API Reference

Skip menu "kdepim API Reference"
  • akonadi_next
  • akregator
  • blogilo
  • calendarsupport
  • console
  •   kabcclient
  •   konsolekalendar
  • kaddressbook
  • kalarm
  •   lib
  • kdgantt2
  • kjots
  • kleopatra
  • kmail
  • knode
  • knotes
  • kontact
  • korgac
  • korganizer
  • ktimetracker
  • libkdepim
  • libkleo
  • libkpgp
  • mailcommon
  • messagelist
  • messageviewer
  • pimprint

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal