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

kalarm

  • sources
  • kde-4.14
  • kdepim
  • kalarm
editdlgtypes.cpp
Go to the documentation of this file.
1 /*
2  * editdlgtypes.cpp - dialogs to create or edit alarm or alarm template types
3  * Program: kalarm
4  * Copyright © 2001-2014 by David Jarvie <djarvie@kde.org>
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License along
17  * with this program; if not, write to the Free Software Foundation, Inc.,
18  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19  */
20 
21 #include "kalarm.h"
22 #include "editdlgtypes.h"
23 #include "editdlg_p.h"
24 
25 #include "autoqpointer.h"
26 #include "buttongroup.h"
27 #include "checkbox.h"
28 #include "colourbutton.h"
29 #include "emailidcombo.h"
30 #include "fontcolourbutton.h"
31 #include "functions.h"
32 #include "kalarmapp.h"
33 #include "kamail.h"
34 #include "latecancel.h"
35 #include "lineedit.h"
36 #include "mainwindow.h"
37 #include "messagebox.h"
38 #include "messagewin.h"
39 #include "pickfileradio.h"
40 #include "preferences.h"
41 #include "radiobutton.h"
42 #include "reminder.h"
43 #include "shellprocess.h"
44 #include "soundpicker.h"
45 #include "sounddlg.h"
46 #include "specialactions.h"
47 #include "templatepickdlg.h"
48 #include "timespinbox.h"
49 
50 #include <kalarmcal/identities.h>
51 
52 #include <akonadi/contact/emailaddressselectiondialog.h>
53 #ifdef USE_AKONADI
54 #include <kcalcore/person.h>
55 #include <kcalutils/icaldrag.h>
56 using namespace KCalCore;
57 #else
58 #include <kcal/person.h>
59 #include <kcal/icaldrag.h>
60 using namespace KCal;
61 #endif
62 
63 #include <klocale.h>
64 #include <kiconloader.h>
65 #include <kio/netaccess.h>
66 #include <kfileitem.h>
67 #include <khbox.h>
68 #include <kdebug.h>
69 
70 #include <QLabel>
71 #include <QDir>
72 #include <QStyle>
73 #include <QGroupBox>
74 #include <QGridLayout>
75 #include <QHBoxLayout>
76 #include <QVBoxLayout>
77 #include <QDragEnterEvent>
78 #include <QStandardItemModel>
79 
80 using namespace KAlarmCal;
81 
82 enum { tTEXT, tFILE, tCOMMAND }; // order of mTypeCombo items
83 
84 
85 /*=============================================================================
86 = Class PickLogFileRadio
87 =============================================================================*/
88 class PickLogFileRadio : public PickFileRadio
89 {
90  public:
91  PickLogFileRadio(QPushButton* b, LineEdit* e, const QString& text, ButtonGroup* group, QWidget* parent)
92  : PickFileRadio(b, e, text, group, parent) { }
93  virtual QString pickFile() // called when browse button is pressed to select a log file
94  {
95  return KAlarm::browseFile(i18nc("@title:window", "Choose Log File"), mDefaultDir, fileEdit()->text(), QString(),
96  KFile::LocalOnly, parentWidget());
97  }
98  private:
99  QString mDefaultDir; // default directory for log file browse button
100 };
101 
102 
103 /*=============================================================================
104 = Class EditDisplayAlarmDlg
105 = Dialog to edit display alarms.
106 =============================================================================*/
107 
108 QString EditDisplayAlarmDlg::i18n_chk_ConfirmAck() { return i18nc("@option:check", "Confirm acknowledgment"); }
109 
110 
111 /******************************************************************************
112 * Constructor.
113 * Parameters:
114 * Template = true to edit/create an alarm template
115 * = false to edit/create an alarm.
116 * event != to initialise the dialog to show the specified event's data.
117 */
118 EditDisplayAlarmDlg::EditDisplayAlarmDlg(bool Template, QWidget* parent, GetResourceType getResource)
119  : EditAlarmDlg(Template, KAEvent::MESSAGE, parent, getResource),
120  mSpecialActionsButton(0),
121  mReminderDeferral(false),
122  mReminderArchived(false)
123 {
124  kDebug() << "New";
125  init(0);
126 }
127 
128 EditDisplayAlarmDlg::EditDisplayAlarmDlg(bool Template, const KAEvent* event, bool newAlarm, QWidget* parent,
129  GetResourceType getResource, bool readOnly)
130  : EditAlarmDlg(Template, event, newAlarm, parent, getResource, readOnly),
131  mSpecialActionsButton(0),
132  mReminderDeferral(false),
133  mReminderArchived(false)
134 {
135  kDebug() << "Event.id()";
136  init(event);
137 }
138 
139 /******************************************************************************
140 * Return the window caption.
141 */
142 QString EditDisplayAlarmDlg::type_caption() const
143 {
144  return isTemplate() ? (isNewAlarm() ? i18nc("@title:window", "New Display Alarm Template") : i18nc("@title:window", "Edit Display Alarm Template"))
145  : (isNewAlarm() ? i18nc("@title:window", "New Display Alarm") : i18nc("@title:window", "Edit Display Alarm"));
146 }
147 
148 /******************************************************************************
149 * Set up the dialog controls common to display alarms.
150 */
151 void EditDisplayAlarmDlg::type_init(QWidget* parent, QVBoxLayout* frameLayout)
152 {
153  // Display type combo box
154  KHBox* box = new KHBox(parent); // to group widgets for QWhatsThis text
155  box->setMargin(0);
156  box->setSpacing(KDialog::spacingHint());
157  QLabel* label = new QLabel(i18nc("@label:listbox", "Display type:"), box);
158  label->setFixedSize(label->sizeHint());
159  mTypeCombo = new ComboBox(box);
160  QString textItem = i18nc("@item:inlistbox", "Text message");
161  QString fileItem = i18nc("@item:inlistbox", "File contents");
162  QString commandItem = i18nc("@item:inlistbox", "Command output");
163  mTypeCombo->addItem(textItem); // index = tTEXT
164  mTypeCombo->addItem(fileItem); // index = tFILE
165  mTypeCombo->addItem(commandItem); // index = tCOMMAND
166  mTypeCombo->setFixedSize(mTypeCombo->sizeHint());
167  mTypeCombo->setCurrentIndex(-1); // ensure slotAlarmTypeChanged() is called when index is set
168  if (!ShellProcess::authorised())
169  {
170  // User not authorised to issue shell commands - disable Command Output option
171  QStandardItemModel* model = qobject_cast<QStandardItemModel*>(mTypeCombo->model());
172  if (model)
173  {
174  QModelIndex index = model->index(2, mTypeCombo->modelColumn(), mTypeCombo->rootModelIndex());
175  QStandardItem* item = model->itemFromIndex(index);
176  if (item)
177  item->setEnabled(false);
178  }
179  }
180  connect(mTypeCombo, SIGNAL(currentIndexChanged(int)), SLOT(slotAlarmTypeChanged(int)));
181  connect(mTypeCombo, SIGNAL(currentIndexChanged(int)), SLOT(contentsChanged()));
182  label->setBuddy(mTypeCombo);
183  box->setWhatsThis(i18nc("@info:whatsthis", "<para>Select what the alarm should display:"
184  "<list><item><interface>%1</interface>: the alarm will display the text message you type in.</item>"
185  "<item><interface>%2</interface>: the alarm will display the contents of a text or image file.</item>"
186  "<item><interface>%3</interface>: the alarm will display the output from a command.</item></list></para>",
187  textItem, fileItem, commandItem));
188  box->setStretchFactor(new QWidget(box), 1); // left adjust the control
189  frameLayout->addWidget(box);
190 
191  // Text message edit box
192  mTextMessageEdit = new TextEdit(parent);
193  mTextMessageEdit->setLineWrapMode(KTextEdit::NoWrap);
194  mTextMessageEdit->setWhatsThis(i18nc("@info:whatsthis", "Enter the text of the alarm message. It may be multi-line."));
195  connect(mTextMessageEdit, SIGNAL(textChanged()), SLOT(contentsChanged()));
196  frameLayout->addWidget(mTextMessageEdit);
197 
198  // File name edit box
199  mFileBox = new KHBox(parent);
200  mFileBox->setMargin(0);
201  frameLayout->addWidget(mFileBox);
202  mFileMessageEdit = new LineEdit(LineEdit::Url, mFileBox);
203  mFileMessageEdit->setAcceptDrops(true);
204  mFileMessageEdit->setWhatsThis(i18nc("@info:whatsthis", "Enter the name or URL of a text or image file to display."));
205  connect(mFileMessageEdit, SIGNAL(textChanged(QString)), SLOT(contentsChanged()));
206 
207  // File browse button
208  mFileBrowseButton = new QPushButton(mFileBox);
209  mFileBrowseButton->setIcon(SmallIcon(QLatin1String("document-open")));
210  int size = mFileBrowseButton->sizeHint().height();
211  mFileBrowseButton->setFixedSize(size, size);
212  mFileBrowseButton->setToolTip(i18nc("@info:tooltip", "Choose a file"));
213  mFileBrowseButton->setWhatsThis(i18nc("@info:whatsthis", "Select a text or image file to display."));
214  connect(mFileBrowseButton, SIGNAL(clicked()), SLOT(slotPickFile()));
215 
216  // Command type checkbox and edit box
217  mCmdEdit = new CommandEdit(parent);
218  connect(mCmdEdit, SIGNAL(scriptToggled(bool)), SLOT(slotCmdScriptToggled(bool)));
219  connect(mCmdEdit, SIGNAL(changed()), SLOT(contentsChanged()));
220  frameLayout->addWidget(mCmdEdit);
221 
222  // Sound checkbox and file selector
223  QHBoxLayout* hlayout = new QHBoxLayout();
224  hlayout->setMargin(0);
225  frameLayout->addLayout(hlayout);
226  mSoundPicker = new SoundPicker(parent);
227  mSoundPicker->setFixedSize(mSoundPicker->sizeHint());
228  connect(mSoundPicker, SIGNAL(changed()), SLOT(contentsChanged()));
229  hlayout->addWidget(mSoundPicker);
230  hlayout->addSpacing(2*spacingHint());
231  hlayout->addStretch();
232 
233  // Font and colour choice button and sample text
234  mFontColourButton = new FontColourButton(parent);
235  mFontColourButton->setMaximumHeight(mFontColourButton->sizeHint().height() * 3/2);
236  hlayout->addWidget(mFontColourButton);
237  connect(mFontColourButton, SIGNAL(selected(QColor,QColor)), SLOT(setColours(QColor,QColor)));
238  connect(mFontColourButton, SIGNAL(selected(QColor,QColor)), SLOT(contentsChanged()));
239 
240  if (ShellProcess::authorised()) // don't display if shell commands not allowed (e.g. kiosk mode)
241  {
242  // Special actions button
243  mSpecialActionsButton = new SpecialActionsButton(false, parent);
244  mSpecialActionsButton->setFixedSize(mSpecialActionsButton->sizeHint());
245  connect(mSpecialActionsButton, SIGNAL(selected()), SLOT(contentsChanged()));
246  frameLayout->addWidget(mSpecialActionsButton, 0, Qt::AlignRight);
247  }
248 
249  // Top-adjust the controls
250  mFilePadding = new KHBox(parent);
251  mFilePadding->setMargin(0);
252  frameLayout->addWidget(mFilePadding);
253  frameLayout->setStretchFactor(mFilePadding, 1);
254 }
255 
256 /******************************************************************************
257 * Create a reminder control.
258 */
259 Reminder* EditDisplayAlarmDlg::createReminder(QWidget* parent)
260 {
261  static const QString reminderText = i18nc("@info:whatsthis", "Enter how long in advance of or after the main alarm to display a reminder alarm.");
262  return new Reminder(i18nc("@info:whatsthis", "Check to additionally display a reminder in advance of or after the main alarm time(s)."),
263  i18nc("@info:whatsthis", "<para>Enter how long in advance of or after the main alarm to display a reminder alarm.</para><para>%1</para>", TimeSpinBox::shiftWhatsThis()),
264  i18nc("@info:whatsthis", "Select whether the reminder should be triggered before or after the main alarm"),
265  true, true, parent);
266 }
267 
268 /******************************************************************************
269 * Create an "acknowledgement confirmation required" checkbox.
270 */
271 CheckBox* EditDisplayAlarmDlg::createConfirmAckCheckbox(QWidget* parent)
272 {
273  CheckBox* confirmAck = new CheckBox(i18n_chk_ConfirmAck(), parent);
274  confirmAck->setWhatsThis(i18nc("@info:whatsthis", "Check to be prompted for confirmation when you acknowledge the alarm."));
275  return confirmAck;
276 }
277 
278 /******************************************************************************
279 * Initialise the dialog controls from the specified event.
280 */
281 void EditDisplayAlarmDlg::type_initValues(const KAEvent* event)
282 {
283  mKMailSerialNumber = 0;
284  lateCancel()->showAutoClose(true);
285  if (event)
286  {
287  if (mAlarmType == KAEvent::MESSAGE && event->kmailSerialNumber()
288  && AlarmText::checkIfEmail(event->cleanText()))
289  mKMailSerialNumber = event->kmailSerialNumber();
290  lateCancel()->setAutoClose(event->autoClose());
291  if (event->useDefaultFont())
292  mFontColourButton->setDefaultFont();
293  else
294  mFontColourButton->setFont(event->font());
295  mFontColourButton->setBgColour(event->bgColour());
296  mFontColourButton->setFgColour(event->fgColour());
297  setColours(event->fgColour(), event->bgColour());
298  mConfirmAck->setChecked(event->confirmAck());
299  bool recurs = event->recurs();
300  int reminderMins = event->reminderMinutes();
301  if (reminderMins > 0 && !event->reminderActive())
302  reminderMins = 0; // don't show advance reminder which has already passed
303  if (!reminderMins)
304  {
305  if (event->reminderDeferral() && !recurs)
306  {
307  reminderMins = event->deferDateTime().minsTo(event->mainDateTime());
308  mReminderDeferral = true;
309  }
310  else if (event->reminderMinutes() && recurs)
311  {
312  reminderMins = event->reminderMinutes();
313  mReminderArchived = true;
314  }
315  }
316  reminder()->setMinutes(reminderMins, dateOnly());
317  reminder()->setOnceOnly(event->reminderOnceOnly());
318  reminder()->enableOnceOnly(recurs);
319  if (mSpecialActionsButton)
320  mSpecialActionsButton->setActions(event->preAction(), event->postAction(), event->extraActionOptions());
321  Preferences::SoundType soundType = event->speak() ? Preferences::Sound_Speak
322  : event->beep() ? Preferences::Sound_Beep
323  : !event->audioFile().isEmpty() ? Preferences::Sound_File
324  : Preferences::Sound_None;
325  mSoundPicker->set(soundType, event->audioFile(), event->soundVolume(),
326  event->fadeVolume(), event->fadeSeconds(), event->repeatSoundPause());
327  }
328  else
329  {
330  // Set the values to their defaults
331  if (!ShellProcess::authorised())
332  {
333  // Don't allow shell commands in kiosk mode
334  if (mSpecialActionsButton)
335  mSpecialActionsButton->setEnabled(false);
336  }
337  lateCancel()->setAutoClose(Preferences::defaultAutoClose());
338  mTypeCombo->setCurrentIndex(0);
339  mFontColourButton->setDefaultFont();
340  mFontColourButton->setBgColour(Preferences::defaultBgColour());
341  mFontColourButton->setFgColour(Preferences::defaultFgColour());
342  setColours(Preferences::defaultFgColour(), Preferences::defaultBgColour());
343  mConfirmAck->setChecked(Preferences::defaultConfirmAck());
344  reminder()->setMinutes(0, false);
345  reminder()->enableOnceOnly(isTimedRecurrence()); // must be called after mRecurrenceEdit is set up
346  if (mSpecialActionsButton)
347  {
348  KAEvent::ExtraActionOptions opts(0);
349  if (Preferences::defaultExecPreActionOnDeferral())
350  opts |= KAEvent::ExecPreActOnDeferral;
351  if (Preferences::defaultCancelOnPreActionError())
352  opts |= KAEvent::CancelOnPreActError;
353  if (Preferences::defaultDontShowPreActionError())
354  opts |= KAEvent::DontShowPreActError;
355  mSpecialActionsButton->setActions(Preferences::defaultPreAction(), Preferences::defaultPostAction(), opts);
356  }
357  mSoundPicker->set(Preferences::defaultSoundType(), Preferences::defaultSoundFile(),
358  Preferences::defaultSoundVolume(), -1, 0, (Preferences::defaultSoundRepeat() ? 0 : -1));
359  }
360 }
361 
362 /******************************************************************************
363 * Called when the More/Less Options button is clicked.
364 * Show/hide the optional options.
365 */
366 void EditDisplayAlarmDlg::type_showOptions(bool more)
367 {
368  if (mSpecialActionsButton)
369  {
370  if (more)
371  mSpecialActionsButton->show();
372  else
373  mSpecialActionsButton->hide();
374  }
375 }
376 
377 /******************************************************************************
378 * Called when the font/color button has been clicked.
379 * Set the colors in the message text entry control.
380 */
381 void EditDisplayAlarmDlg::setColours(const QColor& fgColour, const QColor& bgColour)
382 {
383  QPalette pal = mTextMessageEdit->palette();
384  pal.setColor(mTextMessageEdit->backgroundRole(), bgColour);
385  pal.setColor(QPalette::Text, fgColour);
386  mTextMessageEdit->setPalette(pal);
387  pal = mTextMessageEdit->viewport()->palette();
388  pal.setColor(mTextMessageEdit->viewport()->backgroundRole(), bgColour);
389  pal.setColor(QPalette::Text, fgColour);
390  mTextMessageEdit->viewport()->setPalette(pal);
391  // Change the color of existing text
392  QTextCursor cursor = mTextMessageEdit->textCursor();
393  mTextMessageEdit->selectAll();
394  mTextMessageEdit->setTextColor(fgColour);
395  mTextMessageEdit->setTextCursor(cursor);
396 }
397 
398 /******************************************************************************
399 * Set the dialog's action and the action's text.
400 */
401 void EditDisplayAlarmDlg::setAction(KAEvent::SubAction action, const AlarmText& alarmText)
402 {
403  QString text = alarmText.displayText();
404  switch (action)
405  {
406  case KAEvent::MESSAGE:
407  mTypeCombo->setCurrentIndex(tTEXT);
408  mTextMessageEdit->setPlainText(text);
409  mKMailSerialNumber = alarmText.isEmail() ? alarmText.kmailSerialNumber() : 0;
410  break;
411  case KAEvent::FILE:
412  mTypeCombo->setCurrentIndex(tFILE);
413  mFileMessageEdit->setText(text);
414  break;
415  case KAEvent::COMMAND:
416  mTypeCombo->setCurrentIndex(tCOMMAND);
417  mCmdEdit->setText(alarmText);
418  break;
419  default:
420  Q_ASSERT(0);
421  break;
422  }
423 }
424 
425 /******************************************************************************
426 * Initialise various values in the New Alarm dialogue.
427 */
428 void EditDisplayAlarmDlg::setBgColour(const QColor& colour)
429 {
430  mFontColourButton->setBgColour(colour);
431  setColours(mFontColourButton->fgColour(), colour);
432 }
433 void EditDisplayAlarmDlg::setFgColour(const QColor& colour)
434 {
435  mFontColourButton->setFgColour(colour);
436  setColours(colour, mFontColourButton->bgColour());
437 }
438 void EditDisplayAlarmDlg::setConfirmAck(bool confirm)
439 {
440  mConfirmAck->setChecked(confirm);
441 }
442 void EditDisplayAlarmDlg::setAutoClose(bool close)
443 {
444  lateCancel()->setAutoClose(close);
445 }
446 void EditDisplayAlarmDlg::setAudio(Preferences::SoundType type, const QString& file, float volume, int repeatPause)
447 {
448  mSoundPicker->set(type, file, volume, -1, 0, repeatPause);
449 }
450 void EditDisplayAlarmDlg::setReminder(int minutes, bool onceOnly)
451 {
452  reminder()->setMinutes(minutes, dateOnly());
453  reminder()->setOnceOnly(onceOnly);
454  reminder()->enableOnceOnly(isTimedRecurrence());
455 }
456 
457 /******************************************************************************
458 * Set the read-only status of all non-template controls.
459 */
460 void EditDisplayAlarmDlg::setReadOnly(bool readOnly)
461 {
462  mTypeCombo->setReadOnly(readOnly);
463  mTextMessageEdit->setReadOnly(readOnly);
464  mFileMessageEdit->setReadOnly(readOnly);
465  mCmdEdit->setReadOnly(readOnly);
466  mFontColourButton->setReadOnly(readOnly);
467  mSoundPicker->setReadOnly(readOnly);
468  mConfirmAck->setReadOnly(readOnly);
469  reminder()->setReadOnly(readOnly);
470  if (mSpecialActionsButton)
471  mSpecialActionsButton->setReadOnly(readOnly);
472  if (readOnly)
473  mFileBrowseButton->hide();
474  else
475  mFileBrowseButton->show();
476  EditAlarmDlg::setReadOnly(readOnly);
477 }
478 
479 /******************************************************************************
480 * Save the state of all controls.
481 */
482 void EditDisplayAlarmDlg::saveState(const KAEvent* event)
483 {
484  EditAlarmDlg::saveState(event);
485  mSavedType = mTypeCombo->currentIndex();
486  mSavedCmdScript = mCmdEdit->isScript();
487  mSavedSoundType = mSoundPicker->sound();
488  mSavedSoundFile = mSoundPicker->file();
489  mSavedSoundVolume = mSoundPicker->volume(mSavedSoundFadeVolume, mSavedSoundFadeSeconds);
490  mSavedRepeatPause = mSoundPicker->repeatPause();
491  mSavedConfirmAck = mConfirmAck->isChecked();
492  mSavedFont = mFontColourButton->font();
493  mSavedFgColour = mFontColourButton->fgColour();
494  mSavedBgColour = mFontColourButton->bgColour();
495  mSavedReminder = reminder()->minutes();
496  mSavedOnceOnly = reminder()->isOnceOnly();
497  mSavedAutoClose = lateCancel()->isAutoClose();
498  if (mSpecialActionsButton)
499  {
500  mSavedPreAction = mSpecialActionsButton->preAction();
501  mSavedPostAction = mSpecialActionsButton->postAction();
502  mSavedPreActionOptions = mSpecialActionsButton->options();
503  }
504 }
505 
506 /******************************************************************************
507 * Check whether any of the controls has changed state since the dialog was
508 * first displayed.
509 * Reply = true if any controls have changed, or if it's a new event.
510 * = false if no controls have changed.
511 */
512 bool EditDisplayAlarmDlg::type_stateChanged() const
513 {
514  if (mSavedType != mTypeCombo->currentIndex()
515  || mSavedCmdScript != mCmdEdit->isScript()
516  || mSavedSoundType != mSoundPicker->sound()
517  || mSavedConfirmAck != mConfirmAck->isChecked()
518  || mSavedFont != mFontColourButton->font()
519  || mSavedFgColour != mFontColourButton->fgColour()
520  || mSavedBgColour != mFontColourButton->bgColour()
521  || mSavedReminder != reminder()->minutes()
522  || mSavedOnceOnly != reminder()->isOnceOnly()
523  || mSavedAutoClose != lateCancel()->isAutoClose())
524  return true;
525  if (mSpecialActionsButton)
526  {
527  if (mSavedPreAction != mSpecialActionsButton->preAction()
528  || mSavedPostAction != mSpecialActionsButton->postAction()
529  || mSavedPreActionOptions != mSpecialActionsButton->options())
530  return true;
531  }
532  if (mSavedSoundType == Preferences::Sound_File)
533  {
534  if (mSavedSoundFile != mSoundPicker->file())
535  return true;
536  if (!mSavedSoundFile.isEmpty())
537  {
538  float fadeVolume;
539  int fadeSecs;
540  if (mSavedRepeatPause != mSoundPicker->repeatPause()
541  || mSavedSoundVolume != mSoundPicker->volume(fadeVolume, fadeSecs)
542  || mSavedSoundFadeVolume != fadeVolume
543  || mSavedSoundFadeSeconds != fadeSecs)
544  return true;
545  }
546  }
547  return false;
548 }
549 
550 /******************************************************************************
551 * Extract the data in the dialog specific to the alarm type and set up a
552 * KAEvent from it.
553 */
554 void EditDisplayAlarmDlg::type_setEvent(KAEvent& event, const KDateTime& dt, const QString& text, int lateCancel, bool trial)
555 {
556  KAEvent::SubAction type;
557  switch (mTypeCombo->currentIndex())
558  {
559  case tFILE: type = KAEvent::FILE; break;
560  case tCOMMAND: type = KAEvent::COMMAND; break;
561  default:
562  case tTEXT: type = KAEvent::MESSAGE; break;
563  }
564  event.set(dt, text, mFontColourButton->bgColour(), mFontColourButton->fgColour(), mFontColourButton->font(),
565  type, lateCancel, getAlarmFlags());
566  if (type == KAEvent::MESSAGE)
567  {
568  if (AlarmText::checkIfEmail(text))
569  event.setKMailSerialNumber(mKMailSerialNumber);
570  }
571  float fadeVolume;
572  int fadeSecs;
573  float volume = mSoundPicker->volume(fadeVolume, fadeSecs);
574  int repeatPause = mSoundPicker->repeatPause();
575  event.setAudioFile(mSoundPicker->file().prettyUrl(), volume, fadeVolume, fadeSecs, repeatPause);
576  if (!trial && reminder()->isEnabled())
577  event.setReminder(reminder()->minutes(), reminder()->isOnceOnly());
578  if (mSpecialActionsButton && mSpecialActionsButton->isEnabled())
579  event.setActions(mSpecialActionsButton->preAction(), mSpecialActionsButton->postAction(),
580  mSpecialActionsButton->options());
581 }
582 
583 /******************************************************************************
584 * Get the currently specified alarm flag bits.
585 */
586 KAEvent::Flags EditDisplayAlarmDlg::getAlarmFlags() const
587 {
588  bool cmd = (mTypeCombo->currentIndex() == tCOMMAND);
589  KAEvent::Flags flags = EditAlarmDlg::getAlarmFlags();
590  if (mSoundPicker->sound() == Preferences::Sound_Beep) flags |= KAEvent::BEEP;
591  if (mSoundPicker->sound() == Preferences::Sound_Speak) flags |= KAEvent::SPEAK;
592  if (mSoundPicker->repeatPause() >= 0) flags |= KAEvent::REPEAT_SOUND;
593  if (mConfirmAck->isChecked()) flags |= KAEvent::CONFIRM_ACK;
594  if (lateCancel()->isAutoClose()) flags |= KAEvent::AUTO_CLOSE;
595  if (mFontColourButton->defaultFont()) flags |= KAEvent::DEFAULT_FONT;
596  if (cmd) flags |= KAEvent::DISPLAY_COMMAND;
597  if (cmd && mCmdEdit->isScript()) flags |= KAEvent::SCRIPT;
598  return flags;
599 }
600 
601 /******************************************************************************
602 * Called when one of the alarm display type combo box is changed, to display
603 * the appropriate set of controls for that action type.
604 */
605 void EditDisplayAlarmDlg::slotAlarmTypeChanged(int index)
606 {
607  QWidget* focus = 0;
608  switch (index)
609  {
610  case tTEXT: // text message
611  mFileBox->hide();
612  mFilePadding->hide();
613  mCmdEdit->hide();
614  mTextMessageEdit->show();
615  mSoundPicker->showSpeak(true);
616  setButtonWhatsThis(Try, i18nc("@info:whatsthis", "Display the alarm message now"));
617  focus = mTextMessageEdit;
618  break;
619  case tFILE: // file contents
620  mTextMessageEdit->hide();
621  mFileBox->show();
622  mFilePadding->show();
623  mCmdEdit->hide();
624  mSoundPicker->showSpeak(false);
625  setButtonWhatsThis(Try, i18nc("@info:whatsthis", "Display the file now"));
626  mFileMessageEdit->setNoSelect();
627  focus = mFileMessageEdit;
628  break;
629  case tCOMMAND: // command output
630  mTextMessageEdit->hide();
631  mFileBox->hide();
632  slotCmdScriptToggled(mCmdEdit->isScript()); // show/hide mFilePadding
633  mCmdEdit->show();
634  mSoundPicker->showSpeak(true);
635  setButtonWhatsThis(Try, i18nc("@info:whatsthis", "Display the command output now"));
636  focus = mCmdEdit;
637  break;
638  }
639  if (focus)
640  focus->setFocus();
641 }
642 
643 /******************************************************************************
644 * Called when the file browse button is pressed to select a file to display.
645 */
646 void EditDisplayAlarmDlg::slotPickFile()
647 {
648  static QString defaultDir; // default directory for file browse button
649  QString file = KAlarm::browseFile(i18nc("@title:window", "Choose Text or Image File to Display"),
650  defaultDir, mFileMessageEdit->text(), QString(), KFile::ExistingOnly, this);
651  if (!file.isEmpty())
652  {
653  mFileMessageEdit->setText(KAlarm::pathOrUrl(file));
654  contentsChanged();
655  }
656 }
657 
658 /******************************************************************************
659 * Called when one of the command type radio buttons is clicked,
660 * to display the appropriate edit field.
661 */
662 void EditDisplayAlarmDlg::slotCmdScriptToggled(bool on)
663 {
664  if (on)
665  mFilePadding->hide();
666  else
667  mFilePadding->show();
668 }
669 
670 /******************************************************************************
671 * Clean up the alarm text, and if it's a file, check whether it's valid.
672 */
673 bool EditDisplayAlarmDlg::checkText(QString& result, bool showErrorMessage) const
674 {
675  switch (mTypeCombo->currentIndex())
676  {
677  case tTEXT:
678  result = mTextMessageEdit->toPlainText();
679  break;
680 
681  case tFILE:
682  {
683  QString alarmtext = mFileMessageEdit->text().trimmed();
684  KUrl url;
685  KAlarm::FileErr err = KAlarm::checkFileExists(alarmtext, url);
686  if (err == KAlarm::FileErr_None)
687  {
688  switch (KAlarm::fileType(KFileItem(KFileItem::Unknown, KFileItem::Unknown, url).mimeTypePtr()))
689  {
690  case KAlarm::TextFormatted:
691  case KAlarm::TextPlain:
692  case KAlarm::TextApplication:
693  case KAlarm::Image:
694  break;
695  default:
696  err = KAlarm::FileErr_NotTextImage;
697  break;
698  }
699  }
700  if (err != KAlarm::FileErr_None && showErrorMessage)
701  {
702  mFileMessageEdit->setFocus();
703  if (!KAlarm::showFileErrMessage(alarmtext, err, KAlarm::FileErr_BlankDisplay, const_cast<EditDisplayAlarmDlg*>(this)))
704  return false;
705  }
706  result = alarmtext;
707  break;
708  }
709  case tCOMMAND:
710  result = mCmdEdit->text(const_cast<EditDisplayAlarmDlg*>(this), showErrorMessage);
711  if (result.isEmpty())
712  return false;
713  break;
714  }
715  return true;
716 }
717 
718 
719 /*=============================================================================
720 = Class EditCommandAlarmDlg
721 = Dialog to edit command alarms.
722 =============================================================================*/
723 
724 QString EditCommandAlarmDlg::i18n_chk_EnterScript() { return i18nc("@option:check", "Enter a script"); }
725 QString EditCommandAlarmDlg::i18n_radio_ExecInTermWindow() { return i18nc("@option:radio", "Execute in terminal window"); }
726 QString EditCommandAlarmDlg::i18n_chk_ExecInTermWindow() { return i18nc("@option:check", "Execute in terminal window"); }
727 
728 
729 /******************************************************************************
730 * Constructor.
731 * Parameters:
732 * Template = true to edit/create an alarm template
733 * = false to edit/create an alarm.
734 * event != to initialise the dialog to show the specified event's data.
735 */
736 EditCommandAlarmDlg::EditCommandAlarmDlg(bool Template, QWidget* parent, GetResourceType getResource)
737  : EditAlarmDlg(Template, KAEvent::COMMAND, parent, getResource)
738 {
739  kDebug() << "New";
740  init(0);
741 }
742 
743 EditCommandAlarmDlg::EditCommandAlarmDlg(bool Template, const KAEvent* event, bool newAlarm, QWidget* parent,
744  GetResourceType getResource, bool readOnly)
745  : EditAlarmDlg(Template, event, newAlarm, parent, getResource, readOnly)
746 {
747  kDebug() << "Event.id()";
748  init(event);
749 }
750 
751 /******************************************************************************
752 * Return the window caption.
753 */
754 QString EditCommandAlarmDlg::type_caption() const
755 {
756  return isTemplate() ? (isNewAlarm() ? i18nc("@title:window", "New Command Alarm Template") : i18nc("@title:window", "Edit Command Alarm Template"))
757  : (isNewAlarm() ? i18nc("@title:window", "New Command Alarm") : i18nc("@title:window", "Edit Command Alarm"));
758 }
759 
760 /******************************************************************************
761 * Set up the command alarm dialog controls.
762 */
763 void EditCommandAlarmDlg::type_init(QWidget* parent, QVBoxLayout* frameLayout)
764 {
765  setButtonWhatsThis(Try, i18nc("@info:whatsthis", "Execute the specified command now"));
766 
767  mCmdEdit = new CommandEdit(parent);
768  connect(mCmdEdit, SIGNAL(scriptToggled(bool)), SLOT(slotCmdScriptToggled(bool)));
769  connect(mCmdEdit, SIGNAL(changed()), SLOT(contentsChanged()));
770  frameLayout->addWidget(mCmdEdit);
771 
772  // What to do with command output
773 
774  mCmdOutputBox = new QGroupBox(i18nc("@title:group", "Command Output"), parent);
775  frameLayout->addWidget(mCmdOutputBox);
776  QVBoxLayout* vlayout = new QVBoxLayout(mCmdOutputBox);
777  vlayout->setMargin(marginHint());
778  vlayout->setSpacing(spacingHint());
779  mCmdOutputGroup = new ButtonGroup(mCmdOutputBox);
780  connect(mCmdOutputGroup, SIGNAL(buttonSet(QAbstractButton*)), SLOT(contentsChanged()));
781 
782  // Execute in terminal window
783  mCmdExecInTerm = new RadioButton(i18n_radio_ExecInTermWindow(), mCmdOutputBox);
784  mCmdExecInTerm->setFixedSize(mCmdExecInTerm->sizeHint());
785  mCmdExecInTerm->setWhatsThis(i18nc("@info:whatsthis", "Check to execute the command in a terminal window"));
786  mCmdOutputGroup->addButton(mCmdExecInTerm, Preferences::Log_Terminal);
787  vlayout->addWidget(mCmdExecInTerm, 0, Qt::AlignLeft);
788 
789  // Log file name edit box
790  KHBox* box = new KHBox(mCmdOutputBox);
791  box->setMargin(0);
792  (new QWidget(box))->setFixedWidth(mCmdExecInTerm->style()->pixelMetric(QStyle::PM_ExclusiveIndicatorWidth)); // indent the edit box
793  mCmdLogFileEdit = new LineEdit(LineEdit::Url, box);
794  mCmdLogFileEdit->setAcceptDrops(true);
795  mCmdLogFileEdit->setWhatsThis(i18nc("@info:whatsthis", "Enter the name or path of the log file."));
796  connect(mCmdLogFileEdit, SIGNAL(textChanged(QString)), SLOT(contentsChanged()));
797 
798  // Log file browse button.
799  // The file browser dialog is activated by the PickLogFileRadio class.
800  QPushButton* browseButton = new QPushButton(box);
801  browseButton->setIcon(SmallIcon(QLatin1String("document-open")));
802  int size = browseButton->sizeHint().height();
803  browseButton->setFixedSize(size, size);
804  browseButton->setToolTip(i18nc("@info:tooltip", "Choose a file"));
805  browseButton->setWhatsThis(i18nc("@info:whatsthis", "Select a log file."));
806 
807  // Log output to file
808  mCmdLogToFile = new PickLogFileRadio(browseButton, mCmdLogFileEdit, i18nc("@option:radio", "Log to file"), mCmdOutputGroup, mCmdOutputBox);
809  mCmdLogToFile->setFixedSize(mCmdLogToFile->sizeHint());
810  mCmdLogToFile->setWhatsThis(i18nc("@info:whatsthis", "Check to log the command output to a local file. The output will be appended to any existing contents of the file."));
811  connect(mCmdLogToFile, SIGNAL(fileChanged()), SLOT(contentsChanged()));
812  mCmdOutputGroup->addButton(mCmdLogToFile, Preferences::Log_File);
813  vlayout->addWidget(mCmdLogToFile, 0, Qt::AlignLeft);
814  vlayout->addWidget(box);
815 
816  // Discard output
817  mCmdDiscardOutput = new RadioButton(i18nc("@option:radio", "Discard"), mCmdOutputBox);
818  mCmdDiscardOutput->setFixedSize(mCmdDiscardOutput->sizeHint());
819  mCmdDiscardOutput->setWhatsThis(i18nc("@info:whatsthis", "Check to discard command output."));
820  mCmdOutputGroup->addButton(mCmdDiscardOutput, Preferences::Log_Discard);
821  vlayout->addWidget(mCmdDiscardOutput, 0, Qt::AlignLeft);
822 
823  // Top-adjust the controls
824  mCmdPadding = new KHBox(parent);
825  mCmdPadding->setMargin(0);
826  frameLayout->addWidget(mCmdPadding);
827  frameLayout->setStretchFactor(mCmdPadding, 1);
828 }
829 
830 /******************************************************************************
831 * Initialise the dialog controls from the specified event.
832 */
833 void EditCommandAlarmDlg::type_initValues(const KAEvent* event)
834 {
835  if (event)
836  {
837  // Set the values to those for the specified event
838  RadioButton* logType = event->commandXterm() ? mCmdExecInTerm
839  : !event->logFile().isEmpty() ? mCmdLogToFile
840  : mCmdDiscardOutput;
841  if (logType == mCmdLogToFile)
842  mCmdLogFileEdit->setText(event->logFile()); // set file name before setting radio button
843  logType->setChecked(true);
844  }
845  else
846  {
847  // Set the values to their defaults
848  mCmdEdit->setScript(Preferences::defaultCmdScript());
849  mCmdLogFileEdit->setText(Preferences::defaultCmdLogFile()); // set file name before setting radio button
850  mCmdOutputGroup->setButton(Preferences::defaultCmdLogType());
851  }
852  slotCmdScriptToggled(mCmdEdit->isScript());
853 }
854 
855 /******************************************************************************
856 * Called when the More/Less Options button is clicked.
857 * Show/hide the optional options.
858 */
859 void EditCommandAlarmDlg::type_showOptions(bool more)
860 {
861  if (more)
862  mCmdOutputBox->show();
863  else
864  mCmdOutputBox->hide();
865 }
866 
867 /******************************************************************************
868 * Set the dialog's action and the action's text.
869 */
870 void EditCommandAlarmDlg::setAction(KAEvent::SubAction action, const AlarmText& alarmText)
871 {
872  Q_UNUSED(action);
873  Q_ASSERT(action == KAEvent::COMMAND);
874  mCmdEdit->setText(alarmText);
875 }
876 
877 /******************************************************************************
878 * Set the read-only status of all non-template controls.
879 */
880 void EditCommandAlarmDlg::setReadOnly(bool readOnly)
881 {
882  if (!isTemplate() && !ShellProcess::authorised())
883  readOnly = true; // don't allow editing of existing command alarms in kiosk mode
884  mCmdEdit->setReadOnly(readOnly);
885  mCmdExecInTerm->setReadOnly(readOnly);
886  mCmdLogToFile->setReadOnly(readOnly);
887  mCmdDiscardOutput->setReadOnly(readOnly);
888  EditAlarmDlg::setReadOnly(readOnly);
889 }
890 
891 /******************************************************************************
892 * Save the state of all controls.
893 */
894 void EditCommandAlarmDlg::saveState(const KAEvent* event)
895 {
896  EditAlarmDlg::saveState(event);
897  mSavedCmdScript = mCmdEdit->isScript();
898  mSavedCmdOutputRadio = mCmdOutputGroup->checkedButton();
899  mSavedCmdLogFile = mCmdLogFileEdit->text();
900 }
901 
902 /******************************************************************************
903 * Check whether any of the controls has changed state since the dialog was
904 * first displayed.
905 * Reply = true if any controls have changed, or if it's a new event.
906 * = false if no controls have changed.
907 */
908 bool EditCommandAlarmDlg::type_stateChanged() const
909 {
910  if (mSavedCmdScript != mCmdEdit->isScript()
911  || mSavedCmdOutputRadio != mCmdOutputGroup->checkedButton())
912  return true;
913  if (mCmdOutputGroup->checkedButton() == mCmdLogToFile)
914  {
915  if (mSavedCmdLogFile != mCmdLogFileEdit->text())
916  return true;
917  }
918  return false;
919 }
920 
921 /******************************************************************************
922 * Extract the data in the dialog specific to the alarm type and set up a
923 * KAEvent from it.
924 */
925 void EditCommandAlarmDlg::type_setEvent(KAEvent& event, const KDateTime& dt, const QString& text, int lateCancel, bool trial)
926 {
927  Q_UNUSED(trial);
928  event.set(dt, text, QColor(), QColor(), QFont(), KAEvent::COMMAND, lateCancel, getAlarmFlags());
929  if (mCmdOutputGroup->checkedButton() == mCmdLogToFile)
930  event.setLogFile(mCmdLogFileEdit->text());
931 }
932 
933 /******************************************************************************
934 * Get the currently specified alarm flag bits.
935 */
936 KAEvent::Flags EditCommandAlarmDlg::getAlarmFlags() const
937 {
938  KAEvent::Flags flags = EditAlarmDlg::getAlarmFlags();
939  if (mCmdEdit->isScript()) flags |= KAEvent::SCRIPT;
940  if (mCmdOutputGroup->checkedButton() == mCmdExecInTerm) flags |= KAEvent::EXEC_IN_XTERM;
941  return flags;
942 }
943 
944 /******************************************************************************
945 * Validate and convert command alarm data.
946 */
947 bool EditCommandAlarmDlg::type_validate(bool trial)
948 {
949  Q_UNUSED(trial);
950  if (mCmdOutputGroup->checkedButton() == mCmdLogToFile)
951  {
952  // Validate the log file name
953  QString file = mCmdLogFileEdit->text();
954  QFileInfo info(file);
955  QDir::setCurrent(QDir::homePath());
956  bool err = file.isEmpty() || info.isDir();
957  if (!err)
958  {
959  if (info.exists())
960  {
961  err = !info.isWritable();
962  }
963  else
964  {
965  QFileInfo dirinfo(info.absolutePath()); // get absolute directory path
966  err = (!dirinfo.isDir() || !dirinfo.isWritable());
967  }
968  }
969  if (err)
970  {
971  showMainPage();
972  mCmdLogFileEdit->setFocus();
973  KAMessageBox::sorry(this, i18nc("@info", "Log file must be the name or path of a local file, with write permission."));
974  return false;
975  }
976  // Convert the log file to an absolute path
977  mCmdLogFileEdit->setText(info.absoluteFilePath());
978  }
979  return true;
980 }
981 
982 /******************************************************************************
983 * Called when the Try action has been executed.
984 * Tell the user the result of the Try action.
985 */
986 void EditCommandAlarmDlg::type_executedTry(const QString& text, void* result)
987 {
988  ShellProcess* proc = (ShellProcess*)result;
989  if (proc && proc != (void*)-1
990  && mCmdOutputGroup->checkedButton() != mCmdExecInTerm)
991  {
992  theApp()->commandMessage(proc, this);
993  KAMessageBox::information(this, i18nc("@info", "Command executed: <icode>%1</icode>", text));
994  theApp()->commandMessage(proc, 0);
995  }
996 }
997 
998 /******************************************************************************
999 * Called when one of the command type radio buttons is clicked,
1000 * to display the appropriate edit field.
1001 */
1002 void EditCommandAlarmDlg::slotCmdScriptToggled(bool on)
1003 {
1004  if (on)
1005  mCmdPadding->hide();
1006  else
1007  mCmdPadding->show();
1008 }
1009 
1010 /******************************************************************************
1011 * Clean up the alarm text.
1012 */
1013 bool EditCommandAlarmDlg::checkText(QString& result, bool showErrorMessage) const
1014 {
1015  result = mCmdEdit->text(const_cast<EditCommandAlarmDlg*>(this), showErrorMessage);
1016  if (result.isEmpty())
1017  return false;
1018  return true;
1019 }
1020 
1021 
1022 /*=============================================================================
1023 = Class EditEmailAlarmDlg
1024 = Dialog to edit email alarms.
1025 =============================================================================*/
1026 
1027 QString EditEmailAlarmDlg::i18n_chk_CopyEmailToSelf() { return i18nc("@option:check", "Copy email to self"); }
1028 
1029 
1030 /******************************************************************************
1031 * Constructor.
1032 * Parameters:
1033 * Template = true to edit/create an alarm template
1034 * = false to edit/create an alarm.
1035 * event != to initialise the dialog to show the specified event's data.
1036 */
1037 EditEmailAlarmDlg::EditEmailAlarmDlg(bool Template, QWidget* parent, GetResourceType getResource)
1038  : EditAlarmDlg(Template, KAEvent::EMAIL, parent, getResource),
1039  mEmailRemoveButton(0)
1040 {
1041  kDebug() << "New";
1042  init(0);
1043 }
1044 
1045 EditEmailAlarmDlg::EditEmailAlarmDlg(bool Template, const KAEvent* event, bool newAlarm, QWidget* parent,
1046  GetResourceType getResource, bool readOnly)
1047  : EditAlarmDlg(Template, event, newAlarm, parent, getResource, readOnly),
1048  mEmailRemoveButton(0)
1049 {
1050  kDebug() << "Event.id()";
1051  init(event);
1052 }
1053 
1054 /******************************************************************************
1055 * Return the window caption.
1056 */
1057 QString EditEmailAlarmDlg::type_caption() const
1058 {
1059  return isTemplate() ? (isNewAlarm() ? i18nc("@title:window", "New Email Alarm Template") : i18nc("@title:window", "Edit Email Alarm Template"))
1060  : (isNewAlarm() ? i18nc("@title:window", "New Email Alarm") : i18nc("@title:window", "Edit Email Alarm"));
1061 }
1062 
1063 /******************************************************************************
1064 * Set up the email alarm dialog controls.
1065 */
1066 void EditEmailAlarmDlg::type_init(QWidget* parent, QVBoxLayout* frameLayout)
1067 {
1068  setButtonWhatsThis(Try, i18nc("@info:whatsthis", "Send the email to the specified addressees now"));
1069 
1070  QGridLayout* grid = new QGridLayout();
1071  grid->setMargin(0);
1072  grid->setColumnStretch(1, 1);
1073  frameLayout->addLayout(grid);
1074 
1075  mEmailFromList = 0;
1076  if (Preferences::emailFrom() == Preferences::MAIL_FROM_KMAIL)
1077  {
1078  // Email sender identity
1079  QLabel* label = new QLabel(i18nc("@label:listbox 'From' email address", "From:"), parent);
1080  label->setFixedSize(label->sizeHint());
1081  grid->addWidget(label, 0, 0);
1082 
1083  mEmailFromList = new EmailIdCombo(Identities::identityManager(), parent);
1084  mEmailFromList->setMinimumSize(mEmailFromList->sizeHint());
1085  label->setBuddy(mEmailFromList);
1086  mEmailFromList->setWhatsThis(i18nc("@info:whatsthis", "Your email identity, used to identify you as the sender when sending email alarms."));
1087  connect(mEmailFromList, SIGNAL(identityChanged(uint)), SLOT(contentsChanged()));
1088  grid->addWidget(mEmailFromList, 0, 1, 1, 2);
1089  }
1090 
1091  // Email recipients
1092  QLabel* label = new QLabel(i18nc("@label:textbox Email addressee", "To:"), parent);
1093  label->setFixedSize(label->sizeHint());
1094  grid->addWidget(label, 1, 0);
1095 
1096  mEmailToEdit = new LineEdit(LineEdit::Emails, parent);
1097  mEmailToEdit->setMinimumSize(mEmailToEdit->sizeHint());
1098  mEmailToEdit->setWhatsThis(i18nc("@info:whatsthis", "Enter the addresses of the email recipients. Separate multiple addresses by "
1099  "commas or semicolons."));
1100  connect(mEmailToEdit, SIGNAL(textChanged(QString)), SLOT(contentsChanged()));
1101  grid->addWidget(mEmailToEdit, 1, 1);
1102 
1103  mEmailAddressButton = new QPushButton(parent);
1104  mEmailAddressButton->setIcon(SmallIcon(QLatin1String("help-contents")));
1105  int size = mEmailAddressButton->sizeHint().height();
1106  mEmailAddressButton->setFixedSize(size, size);
1107  connect(mEmailAddressButton, SIGNAL(clicked()), SLOT(openAddressBook()));
1108  mEmailAddressButton->setToolTip(i18nc("@info:tooltip", "Open address book"));
1109  mEmailAddressButton->setWhatsThis(i18nc("@info:whatsthis", "Select email addresses from your address book."));
1110  grid->addWidget(mEmailAddressButton, 1, 2);
1111 
1112  // Email subject
1113  label = new QLabel(i18nc("@label:textbox Email subject", "Subject:"), parent);
1114  label->setFixedSize(label->sizeHint());
1115  grid->addWidget(label, 2, 0);
1116 
1117  mEmailSubjectEdit = new LineEdit(parent);
1118  mEmailSubjectEdit->setMinimumSize(mEmailSubjectEdit->sizeHint());
1119  label->setBuddy(mEmailSubjectEdit);
1120  mEmailSubjectEdit->setWhatsThis(i18nc("@info:whatsthis", "Enter the email subject."));
1121  connect(mEmailSubjectEdit, SIGNAL(textChanged(QString)), SLOT(contentsChanged()));
1122  grid->addWidget(mEmailSubjectEdit, 2, 1, 1, 2);
1123 
1124  // Email body
1125  mEmailMessageEdit = new TextEdit(parent);
1126  mEmailMessageEdit->setWhatsThis(i18nc("@info:whatsthis", "Enter the email message."));
1127  connect(mEmailMessageEdit, SIGNAL(textChanged()), SLOT(contentsChanged()));
1128  frameLayout->addWidget(mEmailMessageEdit);
1129 
1130  // Email attachments
1131  grid = new QGridLayout();
1132  grid->setMargin(0);
1133  frameLayout->addLayout(grid);
1134  label = new QLabel(i18nc("@label:listbox", "Attachments:"), parent);
1135  label->setFixedSize(label->sizeHint());
1136  grid->addWidget(label, 0, 0);
1137 
1138  mEmailAttachList = new KComboBox(parent);
1139  mEmailAttachList->setEditable(true);
1140  mEmailAttachList->setMinimumSize(mEmailAttachList->sizeHint());
1141  if (mEmailAttachList->lineEdit())
1142  mEmailAttachList->lineEdit()->setReadOnly(true);
1143  label->setBuddy(mEmailAttachList);
1144  mEmailAttachList->setWhatsThis(i18nc("@info:whatsthis", "Files to send as attachments to the email."));
1145  grid->addWidget(mEmailAttachList, 0, 1);
1146  grid->setColumnStretch(1, 1);
1147 
1148  mEmailAddAttachButton = new QPushButton(i18nc("@action:button", "Add..."), parent);
1149  connect(mEmailAddAttachButton, SIGNAL(clicked()), SLOT(slotAddAttachment()));
1150  mEmailAddAttachButton->setWhatsThis(i18nc("@info:whatsthis", "Add an attachment to the email."));
1151  grid->addWidget(mEmailAddAttachButton, 0, 2);
1152 
1153  mEmailRemoveButton = new QPushButton(i18nc("@action:button", "Remove"), parent);
1154  connect(mEmailRemoveButton, SIGNAL(clicked()), SLOT(slotRemoveAttachment()));
1155  mEmailRemoveButton->setWhatsThis(i18nc("@info:whatsthis", "Remove the highlighted attachment from the email."));
1156  grid->addWidget(mEmailRemoveButton, 1, 2);
1157 
1158  // BCC email to sender
1159  mEmailBcc = new CheckBox(i18n_chk_CopyEmailToSelf(), parent);
1160  mEmailBcc->setFixedSize(mEmailBcc->sizeHint());
1161  mEmailBcc->setWhatsThis(i18nc("@info:whatsthis", "If checked, the email will be blind copied to you."));
1162  connect(mEmailBcc, SIGNAL(toggled(bool)), SLOT(contentsChanged()));
1163  grid->addWidget(mEmailBcc, 1, 0, 1, 2, Qt::AlignLeft);
1164 }
1165 
1166 /******************************************************************************
1167 * Initialise the dialog controls from the specified event.
1168 */
1169 void EditEmailAlarmDlg::type_initValues(const KAEvent* event)
1170 {
1171  if (event)
1172  {
1173  // Set the values to those for the specified event
1174  mEmailAttachList->addItems(event->emailAttachments());
1175  mEmailToEdit->setText(event->emailAddresses(QLatin1String(", ")));
1176  mEmailSubjectEdit->setText(event->emailSubject());
1177  mEmailBcc->setChecked(event->emailBcc());
1178  if (mEmailFromList)
1179  mEmailFromList->setCurrentIdentity(event->emailFromId());
1180  }
1181  else
1182  {
1183  // Set the values to their defaults
1184  mEmailBcc->setChecked(Preferences::defaultEmailBcc());
1185  }
1186  attachmentEnable();
1187 }
1188 
1189 /******************************************************************************
1190 * Enable/disable controls depending on whether any attachments are entered.
1191 */
1192 void EditEmailAlarmDlg::attachmentEnable()
1193 {
1194  bool enable = mEmailAttachList->count();
1195  mEmailAttachList->setEnabled(enable);
1196  if (mEmailRemoveButton)
1197  mEmailRemoveButton->setEnabled(enable);
1198 }
1199 
1200 /******************************************************************************
1201 * Set the dialog's action and the action's text.
1202 */
1203 void EditEmailAlarmDlg::setAction(KAEvent::SubAction action, const AlarmText& alarmText)
1204 {
1205  Q_UNUSED(action);
1206  Q_ASSERT(action == KAEvent::EMAIL);
1207  if (alarmText.isEmail())
1208  {
1209  mEmailToEdit->setText(alarmText.to());
1210  mEmailSubjectEdit->setText(alarmText.subject());
1211  mEmailMessageEdit->setPlainText(alarmText.body());
1212  }
1213  else
1214  mEmailMessageEdit->setPlainText(alarmText.displayText());
1215 }
1216 
1217 /******************************************************************************
1218 * Initialise various values in the New Alarm dialogue.
1219 */
1220 #ifdef USE_AKONADI
1221 void EditEmailAlarmDlg::setEmailFields(uint fromID, const KCalCore::Person::List& addresses,
1222  const QString& subject, const QStringList& attachments)
1223 #else
1224 void EditEmailAlarmDlg::setEmailFields(uint fromID, const QList<KCal::Person>& addresses,
1225  const QString& subject, const QStringList& attachments)
1226 #endif
1227 {
1228  if (fromID && mEmailFromList)
1229  mEmailFromList->setCurrentIdentity(fromID);
1230  if (!addresses.isEmpty())
1231  mEmailToEdit->setText(KAEvent::joinEmailAddresses(addresses, QLatin1String(", ")));
1232  if (!subject.isEmpty())
1233  mEmailSubjectEdit->setText(subject);
1234  if (!attachments.isEmpty())
1235  {
1236  mEmailAttachList->addItems(attachments);
1237  attachmentEnable();
1238  }
1239 }
1240 void EditEmailAlarmDlg::setBcc(bool bcc)
1241 {
1242  mEmailBcc->setChecked(bcc);
1243 }
1244 
1245 /******************************************************************************
1246 * Set the read-only status of all non-template controls.
1247 */
1248 void EditEmailAlarmDlg::setReadOnly(bool readOnly)
1249 {
1250  mEmailToEdit->setReadOnly(readOnly);
1251  mEmailSubjectEdit->setReadOnly(readOnly);
1252  mEmailMessageEdit->setReadOnly(readOnly);
1253  mEmailBcc->setReadOnly(readOnly);
1254  if (mEmailFromList)
1255  mEmailFromList->setReadOnly(readOnly);
1256  if (readOnly)
1257  {
1258  mEmailAddressButton->hide();
1259  mEmailAddAttachButton->hide();
1260  mEmailRemoveButton->hide();
1261  }
1262  else
1263  {
1264  mEmailAddressButton->show();
1265  mEmailAddAttachButton->show();
1266  mEmailRemoveButton->show();
1267  }
1268  EditAlarmDlg::setReadOnly(readOnly);
1269 }
1270 
1271 /******************************************************************************
1272 * Save the state of all controls.
1273 */
1274 void EditEmailAlarmDlg::saveState(const KAEvent* event)
1275 {
1276  EditAlarmDlg::saveState(event);
1277  if (mEmailFromList)
1278  mSavedEmailFrom = mEmailFromList->currentIdentityName();
1279  mSavedEmailTo = mEmailToEdit->text();
1280  mSavedEmailSubject = mEmailSubjectEdit->text();
1281  mSavedEmailAttach.clear();
1282  for (int i = 0, end = mEmailAttachList->count(); i < end; ++i)
1283  mSavedEmailAttach += mEmailAttachList->itemText(i);
1284  mSavedEmailBcc = mEmailBcc->isChecked();
1285 }
1286 
1287 /******************************************************************************
1288 * Check whether any of the controls has changed state since the dialog was
1289 * first displayed.
1290 * Reply = true if any controls have changed, or if it's a new event.
1291 * = false if no controls have changed.
1292 */
1293 bool EditEmailAlarmDlg::type_stateChanged() const
1294 {
1295  QStringList emailAttach;
1296  for (int i = 0, end = mEmailAttachList->count(); i < end; ++i)
1297  emailAttach += mEmailAttachList->itemText(i);
1298  if ((mEmailFromList && mSavedEmailFrom != mEmailFromList->currentIdentityName())
1299  || mSavedEmailTo != mEmailToEdit->text()
1300  || mSavedEmailSubject != mEmailSubjectEdit->text()
1301  || mSavedEmailAttach != emailAttach
1302  || mSavedEmailBcc != mEmailBcc->isChecked())
1303  return true;
1304  return false;
1305 }
1306 
1307 /******************************************************************************
1308 * Extract the data in the dialog specific to the alarm type and set up a
1309 * KAEvent from it.
1310 */
1311 void EditEmailAlarmDlg::type_setEvent(KAEvent& event, const KDateTime& dt, const QString& text, int lateCancel, bool trial)
1312 {
1313  Q_UNUSED(trial);
1314  event.set(dt, text, QColor(), QColor(), QFont(), KAEvent::EMAIL, lateCancel, getAlarmFlags());
1315  uint from = mEmailFromList ? mEmailFromList->currentIdentity() : 0;
1316  event.setEmail(from, mEmailAddresses, mEmailSubjectEdit->text(), mEmailAttachments);
1317 }
1318 
1319 /******************************************************************************
1320 * Get the currently specified alarm flag bits.
1321 */
1322 KAEvent::Flags EditEmailAlarmDlg::getAlarmFlags() const
1323 {
1324  KAEvent::Flags flags = EditAlarmDlg::getAlarmFlags();
1325  if (mEmailBcc->isChecked()) flags |= KAEvent::EMAIL_BCC;
1326  return flags;
1327 }
1328 
1329 /******************************************************************************
1330 * Convert the email addresses to a list, and validate them. Convert the email
1331 * attachments to a list.
1332 */
1333 bool EditEmailAlarmDlg::type_validate(bool trial)
1334 {
1335  QString addrs = mEmailToEdit->text();
1336  if (addrs.isEmpty())
1337  mEmailAddresses.clear();
1338  else
1339  {
1340  QString bad = KAMail::convertAddresses(addrs, mEmailAddresses);
1341  if (!bad.isEmpty())
1342  {
1343  mEmailToEdit->setFocus();
1344  KAMessageBox::error(this, i18nc("@info", "Invalid email address: <email>%1</email>", bad));
1345  return false;
1346  }
1347  }
1348  if (mEmailAddresses.isEmpty())
1349  {
1350  mEmailToEdit->setFocus();
1351  KAMessageBox::error(this, i18nc("@info", "No email address specified"));
1352  return false;
1353  }
1354 
1355  mEmailAttachments.clear();
1356  for (int i = 0, end = mEmailAttachList->count(); i < end; ++i)
1357  {
1358  QString att = mEmailAttachList->itemText(i);
1359  switch (KAMail::checkAttachment(att))
1360  {
1361  case 1:
1362  mEmailAttachments.append(att);
1363  break;
1364  case 0:
1365  break; // empty
1366  case -1:
1367  mEmailAttachList->setFocus();
1368  KAMessageBox::error(this, i18nc("@info", "Invalid email attachment: <filename>%1</filename>", att));
1369  return false;
1370  }
1371  }
1372  if (trial && KAMessageBox::warningContinueCancel(this, i18nc("@info", "Do you really want to send the email now to the specified recipient(s)?"),
1373  i18nc("@action:button", "Confirm Email"), KGuiItem(i18nc("@action:button", "Send"))) != KMessageBox::Continue)
1374  return false;
1375  return true;
1376 }
1377 
1378 /******************************************************************************
1379 * Called when the Try action is about to be executed.
1380 */
1381 void EditEmailAlarmDlg::type_aboutToTry()
1382 {
1383  // Disconnect any previous connections, to prevent multiple messages being output
1384  disconnect(theApp(), SIGNAL(execAlarmSuccess()), this, SLOT(slotTrySuccess()));
1385  connect(theApp(), SIGNAL(execAlarmSuccess()), SLOT(slotTrySuccess()));
1386 }
1387 
1388 /******************************************************************************
1389 * Tell the user the result of the Try action.
1390 */
1391 void EditEmailAlarmDlg::slotTrySuccess()
1392 {
1393  disconnect(theApp(), SIGNAL(execAlarmSuccess()), this, SLOT(slotTrySuccess()));
1394  QString msg;
1395  QString to = KAEvent::joinEmailAddresses(mEmailAddresses, QLatin1String("<nl/>"));
1396  to.replace(QLatin1Char('<'), QLatin1String("&lt;"));
1397  to.replace(QLatin1Char('>'), QLatin1String("&gt;"));
1398  if (mEmailBcc->isChecked())
1399  msg = QLatin1String("<qt>") + i18nc("@info", "Email sent to:<nl/>%1<nl/>Bcc: <email>%2</email>",
1400  to, Preferences::emailBccAddress()) + QLatin1String("</qt>");
1401  else
1402  msg = QLatin1String("<qt>") + i18nc("@info", "Email sent to:<nl/>%1", to) + QLatin1String("</qt>");
1403  KAMessageBox::information(this, msg);
1404 }
1405 
1406 /******************************************************************************
1407 * Get a selection from the Address Book.
1408 */
1409 void EditEmailAlarmDlg::openAddressBook()
1410 {
1411  // Use AutoQPointer to guard against crash on application exit while
1412  // the dialogue is still open. It prevents double deletion (both on
1413  // deletion of MainWindow, and on return from this function).
1414  AutoQPointer<Akonadi::EmailAddressSelectionDialog> dlg = new Akonadi::EmailAddressSelectionDialog(this);
1415  if (dlg->exec() != QDialog::Accepted)
1416  return;
1417 
1418  Akonadi::EmailAddressSelection::List selections = dlg->selectedAddresses();
1419  if (selections.isEmpty())
1420  return;
1421  Person person(selections.first().name(), selections.first().email());
1422  QString addrs = mEmailToEdit->text().trimmed();
1423  if (!addrs.isEmpty())
1424  addrs += QLatin1String(", ");
1425  addrs += person.fullName();
1426  mEmailToEdit->setText(addrs);
1427 }
1428 
1429 /******************************************************************************
1430 * Select a file to attach to the email.
1431 */
1432 void EditEmailAlarmDlg::slotAddAttachment()
1433 {
1434  QString url = KAlarm::browseFile(i18nc("@title:window", "Choose File to Attach"), mAttachDefaultDir, QString(),
1435  QString(), KFile::ExistingOnly, this);
1436  if (!url.isEmpty())
1437  {
1438  mEmailAttachList->addItem(url);
1439  mEmailAttachList->setCurrentIndex(mEmailAttachList->count() - 1); // select the new item
1440  mEmailRemoveButton->setEnabled(true);
1441  mEmailAttachList->setEnabled(true);
1442  contentsChanged();
1443  }
1444 }
1445 
1446 /******************************************************************************
1447 * Remove the currently selected attachment from the email.
1448 */
1449 void EditEmailAlarmDlg::slotRemoveAttachment()
1450 {
1451  int item = mEmailAttachList->currentIndex();
1452  mEmailAttachList->removeItem(item);
1453  int count = mEmailAttachList->count();
1454  if (item >= count)
1455  mEmailAttachList->setCurrentIndex(count - 1);
1456  if (!count)
1457  {
1458  mEmailRemoveButton->setEnabled(false);
1459  mEmailAttachList->setEnabled(false);
1460  }
1461  contentsChanged();
1462 }
1463 
1464 /******************************************************************************
1465 * Clean up the alarm text.
1466 */
1467 bool EditEmailAlarmDlg::checkText(QString& result, bool showErrorMessage) const
1468 {
1469  Q_UNUSED(showErrorMessage);
1470  result = mEmailMessageEdit->toPlainText();
1471  return true;
1472 }
1473 
1474 
1475 /*=============================================================================
1476 = Class EditAudioAlarmDlg
1477 = Dialog to edit audio alarms with no display window.
1478 =============================================================================*/
1479 
1480 /******************************************************************************
1481 * Constructor.
1482 * Parameters:
1483 * Template = true to edit/create an alarm template
1484 * = false to edit/create an alarm.
1485 * event != to initialise the dialog to show the specified event's data.
1486 */
1487 EditAudioAlarmDlg::EditAudioAlarmDlg(bool Template, QWidget* parent, GetResourceType getResource)
1488  : EditAlarmDlg(Template, KAEvent::AUDIO, parent, getResource),
1489  mMessageWin(0)
1490 {
1491  kDebug() << "New";
1492  init(0);
1493 }
1494 
1495 EditAudioAlarmDlg::EditAudioAlarmDlg(bool Template, const KAEvent* event, bool newAlarm, QWidget* parent,
1496  GetResourceType getResource, bool readOnly)
1497  : EditAlarmDlg(Template, event, newAlarm, parent, getResource, readOnly),
1498  mMessageWin(0)
1499 {
1500  kDebug() << "Event.id()";
1501  init(event);
1502  KPushButton* tryButton = button(Try);
1503  tryButton->setEnabled(!MessageWin::isAudioPlaying());
1504  connect(theApp(), SIGNAL(audioPlaying(bool)), SLOT(slotAudioPlaying(bool)));
1505 }
1506 
1507 /******************************************************************************
1508 * Return the window caption.
1509 */
1510 QString EditAudioAlarmDlg::type_caption() const
1511 {
1512  return isTemplate() ? (isNewAlarm() ? i18nc("@title:window", "New Audio Alarm Template") : i18nc("@title:window", "Edit Audio Alarm Template"))
1513  : (isNewAlarm() ? i18nc("@title:window", "New Audio Alarm") : i18nc("@title:window", "Edit Audio Alarm"));
1514 }
1515 
1516 /******************************************************************************
1517 * Set up the dialog controls common to display alarms.
1518 */
1519 void EditAudioAlarmDlg::type_init(QWidget* parent, QVBoxLayout* frameLayout)
1520 {
1521  // File name edit box
1522  mSoundConfig = new SoundWidget(false, true, parent);
1523  if (isTemplate())
1524  mSoundConfig->setAllowEmptyFile();
1525  connect(mSoundConfig, SIGNAL(changed()), SLOT(contentsChanged()));
1526  frameLayout->addWidget(mSoundConfig);
1527 
1528  // Top-adjust the controls
1529  mPadding = new KHBox(parent);
1530  mPadding->setMargin(0);
1531  frameLayout->addWidget(mPadding);
1532  frameLayout->setStretchFactor(mPadding, 1);
1533 }
1534 
1535 /******************************************************************************
1536 * Initialise the dialog controls from the specified event.
1537 */
1538 void EditAudioAlarmDlg::type_initValues(const KAEvent* event)
1539 {
1540  if (event)
1541  {
1542  mSoundConfig->set(event->audioFile(), event->soundVolume(), event->fadeVolume(), event->fadeSeconds(),
1543  (event->flags() & KAEvent::REPEAT_SOUND) ? event->repeatSoundPause() : -1);
1544  }
1545  else
1546  {
1547  // Set the values to their defaults
1548  mSoundConfig->set(Preferences::defaultSoundFile(), Preferences::defaultSoundVolume(),
1549  -1, 0, (Preferences::defaultSoundRepeat() ? 0 : -1));
1550  }
1551 }
1552 
1553 /******************************************************************************
1554 * Initialise various values in the New Alarm dialogue.
1555 */
1556 void EditAudioAlarmDlg::setAudio(const QString& file, float volume)
1557 {
1558  mSoundConfig->set(file, volume);
1559 }
1560 
1561 /******************************************************************************
1562 * Set the dialog's action and the action's text.
1563 */
1564 void EditAudioAlarmDlg::setAction(KAEvent::SubAction action, const AlarmText& alarmText)
1565 {
1566  Q_UNUSED(action);
1567  Q_ASSERT(action == KAEvent::AUDIO);
1568  mSoundConfig->set(alarmText.displayText(), Preferences::defaultSoundVolume());
1569 }
1570 
1571 /******************************************************************************
1572 * Set the read-only status of all non-template controls.
1573 */
1574 void EditAudioAlarmDlg::setReadOnly(bool readOnly)
1575 {
1576  mSoundConfig->setReadOnly(readOnly);
1577  EditAlarmDlg::setReadOnly(readOnly);
1578 }
1579 
1580 /******************************************************************************
1581 * Save the state of all controls.
1582 */
1583 void EditAudioAlarmDlg::saveState(const KAEvent* event)
1584 {
1585  EditAlarmDlg::saveState(event);
1586  mSavedFile = mSoundConfig->fileName();
1587  mSoundConfig->getVolume(mSavedVolume, mSavedFadeVolume, mSavedFadeSeconds);
1588  mSavedRepeatPause = mSoundConfig->repeatPause();
1589 }
1590 
1591 /******************************************************************************
1592 * Check whether any of the controls has changed state since the dialog was
1593 * first displayed.
1594 * Reply = true if any controls have changed, or if it's a new event.
1595 * = false if no controls have changed.
1596 */
1597 bool EditAudioAlarmDlg::type_stateChanged() const
1598 {
1599  if (mSavedFile != mSoundConfig->fileName())
1600  return true;
1601  if (!mSavedFile.isEmpty() || isTemplate())
1602  {
1603  float volume, fadeVolume;
1604  int fadeSecs;
1605  mSoundConfig->getVolume(volume, fadeVolume, fadeSecs);
1606  if (mSavedRepeatPause != mSoundConfig->repeatPause()
1607  || mSavedVolume != volume
1608  || mSavedFadeVolume != fadeVolume
1609  || mSavedFadeSeconds != fadeSecs)
1610  return true;
1611  }
1612  return false;
1613 }
1614 
1615 /******************************************************************************
1616 * Extract the data in the dialog specific to the alarm type and set up a
1617 * KAEvent from it.
1618 */
1619 void EditAudioAlarmDlg::type_setEvent(KAEvent& event, const KDateTime& dt, const QString& text, int lateCancel, bool trial)
1620 {
1621  Q_UNUSED(text);
1622  Q_UNUSED(trial);
1623  event.set(dt, QString(), QColor(), QColor(), QFont(), KAEvent::AUDIO, lateCancel, getAlarmFlags());
1624  float volume, fadeVolume;
1625  int fadeSecs;
1626  mSoundConfig->getVolume(volume, fadeVolume, fadeSecs);
1627  int repeatPause = mSoundConfig->repeatPause();
1628  KUrl url;
1629  mSoundConfig->file(url, false);
1630  event.setAudioFile(url.prettyUrl(), volume, fadeVolume, fadeSecs, repeatPause, isTemplate());
1631 }
1632 
1633 /******************************************************************************
1634 * Get the currently specified alarm flag bits.
1635 */
1636 KAEvent::Flags EditAudioAlarmDlg::getAlarmFlags() const
1637 {
1638  KAEvent::Flags flags = EditAlarmDlg::getAlarmFlags();
1639  if (mSoundConfig->repeatPause() >= 0) flags |= KAEvent::REPEAT_SOUND;
1640  return flags;
1641 }
1642 
1643 /******************************************************************************
1644 * Check whether the file name is valid.
1645 */
1646 bool EditAudioAlarmDlg::checkText(QString& result, bool showErrorMessage) const
1647 {
1648  KUrl url;
1649  if (!mSoundConfig->file(url, showErrorMessage))
1650  {
1651  result.clear();
1652  return false;
1653  }
1654  result = url.pathOrUrl();
1655  return true;
1656 }
1657 
1658 /******************************************************************************
1659 * Called when the Try button is clicked.
1660 * If the audio file is currently playing (as a result of previously clicking
1661 * the Try button), cancel playback. Otherwise, play the audio file.
1662 */
1663 void EditAudioAlarmDlg::slotTry()
1664 {
1665  if (!MessageWin::isAudioPlaying())
1666  EditAlarmDlg::slotTry(); // play the audio file
1667  else if (mMessageWin)
1668  {
1669  mMessageWin->stopAudio();
1670  mMessageWin = 0;
1671  }
1672 }
1673 
1674 /******************************************************************************
1675 * Called when the Try action has been executed.
1676 */
1677 void EditAudioAlarmDlg::type_executedTry(const QString&, void* result)
1678 {
1679  mMessageWin = (MessageWin*)result; // note which MessageWin controls the audio playback
1680  if (mMessageWin)
1681  {
1682  slotAudioPlaying(true);
1683  connect(mMessageWin, SIGNAL(destroyed(QObject*)), SLOT(audioWinDestroyed()));
1684  }
1685 }
1686 
1687 /******************************************************************************
1688 * Called when audio playing starts or stops.
1689 * Enable/disable/toggle the Try button.
1690 */
1691 void EditAudioAlarmDlg::slotAudioPlaying(bool playing)
1692 {
1693  KPushButton* tryButton = button(Try);
1694  if (!playing)
1695  {
1696  // Nothing is playing, so enable the Try button
1697  tryButton->setEnabled(true);
1698  tryButton->setCheckable(false);
1699  tryButton->setChecked(false);
1700  mMessageWin = 0;
1701  }
1702  else if (mMessageWin)
1703  {
1704  // The test sound file is playing, so enable the Try button and depress it
1705  tryButton->setEnabled(true);
1706  tryButton->setCheckable(true);
1707  tryButton->setChecked(true);
1708  }
1709  else
1710  {
1711  // An alarm is playing, so disable the Try button
1712  tryButton->setEnabled(false);
1713  tryButton->setCheckable(false);
1714  tryButton->setChecked(false);
1715  }
1716 }
1717 
1718 
1719 /*=============================================================================
1720 = Class CommandEdit
1721 = A widget to allow entry of a command or a command script.
1722 =============================================================================*/
1723 CommandEdit::CommandEdit(QWidget* parent)
1724  : QWidget(parent)
1725 {
1726  QVBoxLayout* vlayout = new QVBoxLayout(this);
1727  vlayout->setMargin(0);
1728  vlayout->setSpacing(KDialog::spacingHint());
1729  mTypeScript = new CheckBox(EditCommandAlarmDlg::i18n_chk_EnterScript(), this);
1730  mTypeScript->setFixedSize(mTypeScript->sizeHint());
1731  mTypeScript->setWhatsThis(i18nc("@info:whatsthis", "Check to enter the contents of a script instead of a shell command line"));
1732  connect(mTypeScript, SIGNAL(toggled(bool)), SLOT(slotCmdScriptToggled(bool)));
1733  connect(mTypeScript, SIGNAL(toggled(bool)), SIGNAL(changed()));
1734  vlayout->addWidget(mTypeScript, 0, Qt::AlignLeft);
1735 
1736  mCommandEdit = new LineEdit(LineEdit::Url, this);
1737  mCommandEdit->setWhatsThis(i18nc("@info:whatsthis", "Enter a shell command to execute."));
1738  connect(mCommandEdit, SIGNAL(textChanged(QString)), SIGNAL(changed()));
1739  vlayout->addWidget(mCommandEdit);
1740 
1741  mScriptEdit = new TextEdit(this);
1742  mScriptEdit->setWhatsThis(i18nc("@info:whatsthis", "Enter the contents of a script to execute"));
1743  connect(mScriptEdit, SIGNAL(textChanged()), SIGNAL(changed()));
1744  vlayout->addWidget(mScriptEdit);
1745 
1746  slotCmdScriptToggled(mTypeScript->isChecked());
1747 }
1748 
1749 /******************************************************************************
1750 * Initialise the widget controls from the specified event.
1751 */
1752 void CommandEdit::setScript(bool script)
1753 {
1754  mTypeScript->setChecked(script);
1755 }
1756 
1757 bool CommandEdit::isScript() const
1758 {
1759  return mTypeScript->isChecked();
1760 }
1761 
1762 /******************************************************************************
1763 * Set the widget's text.
1764 */
1765 void CommandEdit::setText(const AlarmText& alarmText)
1766 {
1767  QString text = alarmText.displayText();
1768  bool script = alarmText.isScript();
1769  mTypeScript->setChecked(script);
1770  if (script)
1771  mScriptEdit->setPlainText(text);
1772  else
1773  mCommandEdit->setText(KAlarm::pathOrUrl(text));
1774 }
1775 
1776 /******************************************************************************
1777 * Return the widget's text.
1778 */
1779 QString CommandEdit::text() const
1780 {
1781  QString result;
1782  if (mTypeScript->isChecked())
1783  result = mScriptEdit->toPlainText();
1784  else
1785  result = mCommandEdit->text();
1786  return result.trimmed();
1787 }
1788 
1789 /******************************************************************************
1790 * Return the alarm text.
1791 * If 'showErrorMessage' is true and the text is empty, an error message is
1792 * displayed.
1793 */
1794 QString CommandEdit::text(EditAlarmDlg* dlg, bool showErrorMessage) const
1795 {
1796  QString result = text();
1797  if (showErrorMessage && result.isEmpty())
1798  KAMessageBox::sorry(dlg, i18nc("@info", "Please enter a command or script to execute"));
1799  return result;
1800 }
1801 
1802 /******************************************************************************
1803 * Set the read-only status of all controls.
1804 */
1805 void CommandEdit::setReadOnly(bool readOnly)
1806 {
1807  mTypeScript->setReadOnly(readOnly);
1808  mCommandEdit->setReadOnly(readOnly);
1809  mScriptEdit->setReadOnly(readOnly);
1810 }
1811 
1812 /******************************************************************************
1813 * Called when one of the command type radio buttons is clicked,
1814 * to display the appropriate edit field.
1815 */
1816 void CommandEdit::slotCmdScriptToggled(bool on)
1817 {
1818  if (on)
1819  {
1820  mCommandEdit->hide();
1821  mScriptEdit->show();
1822  mScriptEdit->setFocus();
1823  }
1824  else
1825  {
1826  mScriptEdit->hide();
1827  mCommandEdit->show();
1828  mCommandEdit->setFocus();
1829  }
1830  emit scriptToggled(on);
1831 }
1832 
1833 /******************************************************************************
1834 * Returns the minimum size of the widget.
1835 */
1836 QSize CommandEdit::minimumSizeHint() const
1837 {
1838  QSize t(mTypeScript->minimumSizeHint());
1839  QSize s(mCommandEdit->minimumSizeHint().expandedTo(mScriptEdit->minimumSizeHint()));
1840  s.setHeight(s.height() + KDialog::spacingHint() + t.height());
1841  if (s.width() < t.width())
1842  s.setWidth(t.width());
1843  return s;
1844 }
1845 
1846 
1847 
1848 /*=============================================================================
1849 = Class TextEdit
1850 = A text edit field with a minimum height of 3 text lines.
1851 =============================================================================*/
1852 TextEdit::TextEdit(QWidget* parent)
1853  : KTextEdit(parent)
1854 {
1855  QSize tsize = sizeHint();
1856  tsize.setHeight(fontMetrics().lineSpacing()*13/4 + 2*frameWidth());
1857  setMinimumSize(tsize);
1858 }
1859 
1860 void TextEdit::dragEnterEvent(QDragEnterEvent* e)
1861 {
1862 #ifdef USE_AKONADI
1863  if (KCalUtils::ICalDrag::canDecode(e->mimeData()))
1864 #else
1865  if (KCal::ICalDrag::canDecode(e->mimeData()))
1866 #endif
1867  e->ignore(); // don't accept "text/calendar" objects
1868  KTextEdit::dragEnterEvent(e);
1869 }
1870 #include "moc_editdlgtypes.cpp"
1871 // vim: et sw=4:
FontColourButton::setFgColour
void setFgColour(const QColor &c)
Definition: fontcolourbutton.h:40
EditDisplayAlarmDlg::getAlarmFlags
virtual KAEvent::Flags getAlarmFlags() const
Definition: editdlgtypes.cpp:586
EditAudioAlarmDlg::setAction
virtual void setAction(KAEvent::SubAction, const AlarmText &=AlarmText())
Definition: editdlgtypes.cpp:1564
QList::clear
void clear()
QStandardItemModel::index
virtual QModelIndex index(int row, int column, const QModelIndex &parent) const
FontColourButton::bgColour
QColor bgColour() const
Definition: fontcolourbutton.h:43
FontColourButton::defaultFont
bool defaultFont() const
Definition: fontcolourbutton.h:41
CheckBox::setReadOnly
virtual void setReadOnly(bool readOnly)
QModelIndex
KPushButton
QStandardItemModel
EditAlarmDlg::isTemplate
bool isTemplate() const
Definition: editdlg.h:124
QWidget
EditAlarmDlg::mAlarmType
KAEvent::SubAction mAlarmType
Definition: editdlg.h:161
SoundWidget::repeatPause
int repeatPause() const
Definition: sounddlg.cpp:385
buttongroup.h
QSize::setHeight
void setHeight(int height)
SoundPicker::sound
Preferences::SoundType sound() const
Returns the selected option.
Definition: soundpicker.cpp:160
SoundPicker::file
KUrl file() const
If the 'file' option is selected, returns the URL of the chosen file.
Definition: soundpicker.cpp:173
EditAudioAlarmDlg::getAlarmFlags
virtual KAEvent::Flags getAlarmFlags() const
Definition: editdlgtypes.cpp:1636
CommandEdit::isScript
bool isScript() const
Definition: editdlgtypes.cpp:1757
fontcolourbutton.h
QTextCursor
EditAlarmDlg::lateCancel
LateCancelSelector * lateCancel() const
Definition: editdlg.h:130
SoundWidget::getVolume
void getVolume(float &volume, float &fadeVolume, int &fadeSeconds) const
Definition: sounddlg.cpp:366
CommandEdit::minimumSizeHint
virtual QSize minimumSizeHint() const
Definition: editdlgtypes.cpp:1836
EditCommandAlarmDlg::i18n_chk_EnterScript
static QString i18n_chk_EnterScript()
Definition: editdlgtypes.cpp:724
EditDisplayAlarmDlg::i18n_chk_ConfirmAck
static QString i18n_chk_ConfirmAck()
Definition: editdlgtypes.cpp:108
EditAlarmDlg::slotTry
virtual void slotTry()
Definition: editdlg.cpp:1224
QDropEvent::mimeData
const QMimeData * mimeData() const
EditEmailAlarmDlg::type_setEvent
virtual void type_setEvent(KAEvent &, const KDateTime &, const QString &text, int lateCancel, bool trial)
Definition: editdlgtypes.cpp:1311
CommandEdit::changed
void changed()
LineEdit::setNoSelect
void setNoSelect()
QPushButton::sizeHint
virtual QSize sizeHint() const
LineEdit::setText
virtual void setText(const QString &str)
EditEmailAlarmDlg::i18n_chk_CopyEmailToSelf
static QString i18n_chk_CopyEmailToSelf()
Definition: editdlgtypes.cpp:1027
EditDisplayAlarmDlg::setAudio
void setAudio(Preferences::SoundType, const QString &file=QString(), float volume=-1, int repeatPause=-1)
Definition: editdlgtypes.cpp:446
EditCommandAlarmDlg::type_caption
virtual QString type_caption() const
Definition: editdlgtypes.cpp:754
EditAudioAlarmDlg::saveState
virtual void saveState(const KAEvent *)
Definition: editdlgtypes.cpp:1583
EditDisplayAlarmDlg::type_init
virtual void type_init(QWidget *parent, QVBoxLayout *frameLayout)
Definition: editdlgtypes.cpp:151
QPalette::setColor
void setColor(ColorGroup group, ColorRole role, const QColor &color)
EditDisplayAlarmDlg::type_setEvent
virtual void type_setEvent(KAEvent &, const KDateTime &, const QString &text, int lateCancel, bool trial)
Definition: editdlgtypes.cpp:554
QGridLayout::addWidget
void addWidget(QWidget *widget, int row, int column, QFlags< Qt::AlignmentFlag > alignment)
MessageWin::isAudioPlaying
static bool isAudioPlaying()
Definition: messagewin.cpp:1576
TextEdit::TextEdit
TextEdit(QWidget *parent)
Definition: editdlgtypes.cpp:1852
FontColourButton::fgColour
QColor fgColour() const
Definition: fontcolourbutton.h:44
EditAudioAlarmDlg::type_initValues
virtual void type_initValues(const KAEvent *)
Definition: editdlgtypes.cpp:1538
text
virtual QByteArray text(quint32 serialNumber) const =0
RadioButton
EditDisplayAlarmDlg::setAction
virtual void setAction(KAEvent::SubAction, const AlarmText &=AlarmText())
Definition: editdlgtypes.cpp:401
EditEmailAlarmDlg::type_init
virtual void type_init(QWidget *parent, QVBoxLayout *frameLayout)
Definition: editdlgtypes.cpp:1066
specialactions.h
QFont
QWidget::style
QStyle * style() const
QStyle::pixelMetric
virtual int pixelMetric(PixelMetric metric, const QStyleOption *option, const QWidget *widget) const =0
SoundPicker::setReadOnly
void setReadOnly(bool readOnly)
Sets whether the widget can be changed the user.
Definition: soundpicker.cpp:111
LateCancelSelector::showAutoClose
void showAutoClose(bool show)
Definition: latecancel.cpp:147
tTEXT
Definition: editdlgtypes.cpp:82
QCheckBox::sizeHint
virtual QSize sizeHint() const
ShellProcess::authorised
static bool authorised()
KAMessageBox::error
static void error(QWidget *parent, const QString &text, const QString &caption=QString(), Options options=Options(Notify|WindowModal))
QCheckBox::minimumSizeHint
virtual QSize minimumSizeHint() const
latecancel.h
lineedit.h
pickfileradio.h
radio button with an associated file picker
QHBoxLayout
SoundWidget::file
bool file(KUrl &, bool showErrorMessage=true) const
Definition: sounddlg.cpp:354
EditDisplayAlarmDlg::setReadOnly
virtual void setReadOnly(bool readOnly)
Definition: editdlgtypes.cpp:460
EditAudioAlarmDlg::type_init
virtual void type_init(QWidget *parent, QVBoxLayout *frameLayout)
Definition: editdlgtypes.cpp:1519
EditAudioAlarmDlg::checkText
virtual bool checkText(QString &result, bool showErrorMessage=true) const
Definition: editdlgtypes.cpp:1646
EditAudioAlarmDlg::type_executedTry
virtual void type_executedTry(const QString &text, void *obj)
Definition: editdlgtypes.cpp:1677
EditEmailAlarmDlg::saveState
virtual void saveState(const KAEvent *)
Definition: editdlgtypes.cpp:1274
EditDisplayAlarmDlg::createReminder
virtual Reminder * createReminder(QWidget *parent)
Definition: editdlgtypes.cpp:259
QGridLayout
FontColourButton::setDefaultFont
void setDefaultFont()
Definition: fontcolourbutton.cpp:50
SoundPicker::volume
float volume(float &fadeVolume, int &fadeSeconds) const
Returns the volume and fade characteristics for playing a sound file.
Definition: soundpicker.cpp:182
KAlarmApp::commandMessage
void commandMessage(ShellProcess *, QWidget *parent)
Definition: kalarmapp.cpp:2383
EditCommandAlarmDlg::type_showOptions
virtual void type_showOptions(bool more)
Definition: editdlgtypes.cpp:859
EditEmailAlarmDlg::type_initValues
virtual void type_initValues(const KAEvent *)
Definition: editdlgtypes.cpp:1169
from
QString from() const
QBoxLayout::addSpacing
void addSpacing(int size)
checkbox.h
FontColourButton::font
QFont font() const
Definition: fontcolourbutton.h:42
QFrame::sizeHint
virtual QSize sizeHint() const
EditCommandAlarmDlg::type_stateChanged
virtual bool type_stateChanged() const
Definition: editdlgtypes.cpp:908
QDir::homePath
QString homePath()
LineEdit::text
QString text() const
QAbstractButton::setIcon
void setIcon(const QIcon &icon)
EditAudioAlarmDlg::EditAudioAlarmDlg
EditAudioAlarmDlg(bool Template, QWidget *parent=0, GetResourceType=RES_PROMPT)
Definition: editdlgtypes.cpp:1487
EditDisplayAlarmDlg::type_stateChanged
virtual bool type_stateChanged() const
Definition: editdlgtypes.cpp:512
tCOMMAND
Definition: editdlgtypes.cpp:82
EditAudioAlarmDlg::type_setEvent
virtual void type_setEvent(KAEvent &, const KDateTime &, const QString &text, int lateCancel, bool trial)
Definition: editdlgtypes.cpp:1619
EditAlarmDlg::showMainPage
void showMainPage()
Definition: editdlg.cpp:1518
SoundWidget::setAllowEmptyFile
void setAllowEmptyFile()
Definition: sounddlg.h:50
QString::clear
void clear()
QLabel::setBuddy
void setBuddy(QWidget *buddy)
kalarmapp.h
the KAlarm application object
EditEmailAlarmDlg::type_caption
virtual QString type_caption() const
Definition: editdlgtypes.cpp:1057
EditEmailAlarmDlg::setBcc
void setBcc(bool)
Definition: editdlgtypes.cpp:1240
Reminder::setMinutes
void setMinutes(int minutes, bool dateOnly)
Definition: reminder.cpp:176
EditAudioAlarmDlg::slotTry
virtual void slotTry()
Definition: editdlgtypes.cpp:1663
EditDisplayAlarmDlg::createConfirmAckCheckbox
static CheckBox * createConfirmAckCheckbox(QWidget *parent)
Definition: editdlgtypes.cpp:271
CommandEdit::setText
void setText(const AlarmText &)
Definition: editdlgtypes.cpp:1765
EditCommandAlarmDlg::type_setEvent
virtual void type_setEvent(KAEvent &, const KDateTime &, const QString &text, int lateCancel, bool trial)
Definition: editdlgtypes.cpp:925
KAMail::convertAddresses
static QString convertAddresses(const QString &addresses, QList< KCal::Person > &)
Definition: kamail.cpp:485
EditAlarmDlg::contentsChanged
void contentsChanged()
Definition: editdlg.cpp:743
SoundWidget::set
void set(const QString &file, float volume, float fadeVolume=-1, int fadeSeconds=0, int repeatPause=-1)
Definition: sounddlg.cpp:306
QWidget::setEnabled
void setEnabled(bool)
QBoxLayout::addWidget
void addWidget(QWidget *widget, int stretch, QFlags< Qt::AlignmentFlag > alignment)
MessageWin
MessageWin: A window to display an alarm or error message.
Definition: messagewin.h:61
KAMail::checkAttachment
static int checkAttachment(QString &attachment, KUrl *=0)
Definition: kamail.cpp:596
QList::append
void append(const T &value)
Preferences::MAIL_FROM_KMAIL
Definition: preferences.h:40
SoundPicker::set
void set(Preferences::SoundType type, const QString &filename, float volume, float fadeVolume, int fadeSeconds, int repeatPause)
Initialises the widget's state.
Definition: soundpicker.cpp:210
templatepickdlg.h
QGroupBox
EditDisplayAlarmDlg::setReminder
void setReminder(int minutes, bool onceOnly)
Definition: editdlgtypes.cpp:450
EditDisplayAlarmDlg::setBgColour
void setBgColour(const QColor &)
Definition: editdlgtypes.cpp:428
LineEdit
CheckBox
QFileInfo::isDir
bool isDir() const
CommandEdit::text
QString text() const
Definition: editdlgtypes.cpp:1779
autoqpointer.h
EditEmailAlarmDlg::type_stateChanged
virtual bool type_stateChanged() const
Definition: editdlgtypes.cpp:1293
tFILE
Definition: editdlgtypes.cpp:82
EmailIdCombo::setReadOnly
void setReadOnly(bool ro)
Definition: emailidcombo.h:36
QObject
QWidget::setFocus
void setFocus()
EditCommandAlarmDlg::type_executedTry
virtual void type_executedTry(const QString &text, void *obj)
Definition: editdlgtypes.cpp:986
EditAlarmDlg::getAlarmFlags
virtual KAEvent::Flags getAlarmFlags() const
Definition: editdlg.cpp:854
EditCommandAlarmDlg::checkText
virtual bool checkText(QString &result, bool showErrorMessage=true) const
Definition: editdlgtypes.cpp:1013
QList::isEmpty
bool isEmpty() const
colourbutton.h
QFileInfo::absoluteFilePath
QString absoluteFilePath() const
QString::isEmpty
bool isEmpty() const
QString::trimmed
QString trimmed() const
TextEdit::dragEnterEvent
virtual void dragEnterEvent(QDragEnterEvent *)
Definition: editdlgtypes.cpp:1860
MessageWin::stopAudio
static void stopAudio(bool wait=false)
Definition: messagewin.cpp:1584
messagewin.h
displays an alarm message
mainwindow.h
main application window
FontColourButton::setBgColour
void setBgColour(const QColor &c)
Definition: fontcolourbutton.h:39
to
QString to() const
subject
QString subject() const
SpecialActionsButton
Definition: specialactions.h:36
QVBoxLayout
TextEdit::minimumSizeHint
virtual QSize minimumSizeHint() const
Definition: editdlg_p.h:52
SoundWidget
Definition: sounddlg.h:41
QDir::setCurrent
bool setCurrent(const QString &path)
EditDisplayAlarmDlg::setFgColour
void setFgColour(const QColor &)
Definition: editdlgtypes.cpp:433
EditEmailAlarmDlg::setEmailFields
void setEmailFields(uint fromID, const QList< KCal::Person > &, const QString &subject, const QStringList &attachments)
Definition: editdlgtypes.cpp:1224
EditEmailAlarmDlg::setAction
virtual void setAction(KAEvent::SubAction, const AlarmText &=AlarmText())
Definition: editdlgtypes.cpp:1203
EditDisplayAlarmDlg::saveState
virtual void saveState(const KAEvent *)
Definition: editdlgtypes.cpp:482
ButtonGroup::addButton
void addButton(QAbstractButton *button)
EmailIdCombo
Definition: emailidcombo.h:31
messagebox.h
QString
QList< KCal::Person >
QWidget::hide
void hide()
SoundWidget::fileName
QString fileName() const
Definition: sounddlg.cpp:346
QColor
SpecialActionsButton::options
KAEvent::ExtraActionOptions options() const
Definition: specialactions.h:44
EditEmailAlarmDlg::type_validate
virtual bool type_validate(bool trial)
Definition: editdlgtypes.cpp:1333
EditDisplayAlarmDlg::checkText
virtual bool checkText(QString &result, bool showErrorMessage=true) const
Definition: editdlgtypes.cpp:673
EditAlarmDlg::dateOnly
bool dateOnly() const
Definition: editdlg.cpp:1508
QLayout::setMargin
void setMargin(int margin)
ComboBox::setReadOnly
virtual void setReadOnly(bool readOnly)
canDecode
static bool canDecode(const QMimeData *md)
theApp
KAlarmApp * theApp()
Definition: kalarmapp.h:263
QStringList
PickFileRadio
Radio button with associated file picker controls.
Definition: pickfileradio.h:51
reminder.h
QFileInfo
QDragMoveEvent::ignore
void ignore()
QStandardItem::setEnabled
void setEnabled(bool enabled)
QFileInfo::exists
bool exists() const
EditCommandAlarmDlg::saveState
virtual void saveState(const KAEvent *)
Definition: editdlgtypes.cpp:894
QSize
QWidget::setFixedSize
void setFixedSize(const QSize &s)
QLatin1Char
AutoQPointer
LineEdit::Url
editdlgtypes.h
preferences.h
EditEmailAlarmDlg::setReadOnly
virtual void setReadOnly(bool readOnly)
Definition: editdlgtypes.cpp:1248
EditDisplayAlarmDlg::setAutoClose
void setAutoClose(bool)
Definition: editdlgtypes.cpp:442
EditEmailAlarmDlg::EditEmailAlarmDlg
EditEmailAlarmDlg(bool Template, QWidget *parent=0, GetResourceType=RES_PROMPT)
Definition: editdlgtypes.cpp:1037
EditAlarmDlg::setReadOnly
virtual void setReadOnly(bool readOnly)=0
Definition: editdlg.cpp:650
SoundPicker::repeatPause
int repeatPause() const
Returns pause in seconds between repetitions of the sound file, or -1 if no repeat or 'file' option i...
Definition: soundpicker.cpp:202
EditAudioAlarmDlg::type_stateChanged
virtual bool type_stateChanged() const
Definition: editdlgtypes.cpp:1597
EditCommandAlarmDlg::type_validate
virtual bool type_validate(bool trial)
Definition: editdlgtypes.cpp:947
EditDisplayAlarmDlg::EditDisplayAlarmDlg
EditDisplayAlarmDlg(bool Template, QWidget *parent=0, GetResourceType=RES_PROMPT)
Definition: editdlgtypes.cpp:118
QAbstractButton::setChecked
void setChecked(bool)
Reminder::setReadOnly
void setReadOnly(bool)
Definition: reminder.cpp:113
FontColourButton::setFont
void setFont(const QFont &)
Definition: fontcolourbutton.cpp:55
EditAlarmDlg::isTimedRecurrence
bool isTimedRecurrence() const
Definition: editdlg.cpp:1513
QString::replace
QString & replace(int position, int n, QChar after)
EditAlarmDlg::init
void init(const KAEvent *event)
Definition: editdlg.cpp:234
QAbstractButton
RadioButton::setReadOnly
virtual void setReadOnly(bool readOnly)
EditEmailAlarmDlg::getAlarmFlags
virtual KAEvent::Flags getAlarmFlags() const
Definition: editdlgtypes.cpp:1322
kamail.h
SpecialActionsButton::setReadOnly
virtual void setReadOnly(bool ro)
Definition: specialactions.h:45
QWidget::setWhatsThis
void setWhatsThis(const QString &)
EditAudioAlarmDlg::type_caption
virtual QString type_caption() const
Definition: editdlgtypes.cpp:1510
CommandEdit::CommandEdit
CommandEdit(QWidget *parent)
Definition: editdlgtypes.cpp:1723
Preferences::emailBccAddress
static QString emailBccAddress()
Definition: preferences.cpp:335
QDragEnterEvent
editdlg_p.h
SpecialActionsButton::setActions
void setActions(const QString &pre, const QString &post, KAEvent::ExtraActionOptions)
Definition: specialactions.cpp:63
FontColourButton
Definition: fontcolourbutton.h:32
EditCommandAlarmDlg::i18n_radio_ExecInTermWindow
static QString i18n_radio_ExecInTermWindow()
Definition: editdlgtypes.cpp:725
QLatin1String
sounddlg.h
functions.h
miscellaneous functions
QStandardItemModel::itemFromIndex
QStandardItem * itemFromIndex(const QModelIndex &index) const
QBoxLayout::addStretch
void addStretch(int stretch)
KAMessageBox::sorry
static void sorry(QWidget *parent, const QString &text, const QString &caption=QString(), Options options=Options(Notify|WindowModal))
EditAlarmDlg
Definition: editdlg.h:60
LateCancelSelector::isAutoClose
bool isAutoClose() const
Definition: latecancel.cpp:157
QGridLayout::setColumnStretch
void setColumnStretch(int column, int stretch)
Reminder::isOnceOnly
bool isOnceOnly() const
Definition: reminder.cpp:129
CommandEdit::setScript
void setScript(bool)
Definition: editdlgtypes.cpp:1752
SoundWidget::setReadOnly
void setReadOnly(bool)
Definition: sounddlg.cpp:326
SoundPicker
Definition: soundpicker.h:35
kalarm.h
CommandEdit
Definition: editdlg_p.h:58
QLabel::sizeHint
virtual QSize sizeHint() const
QSize::height
int height() const
EditCommandAlarmDlg::type_initValues
virtual void type_initValues(const KAEvent *)
Definition: editdlgtypes.cpp:833
KComboBox
EditAlarmDlg::reminder
Reminder * reminder() const
Definition: editdlg.h:129
EditAudioAlarmDlg::setAudio
void setAudio(const QString &file, float volume=-1)
Definition: editdlgtypes.cpp:1556
QFileInfo::isWritable
bool isWritable() const
KAMessageBox::warningContinueCancel
static int warningContinueCancel(QWidget *parent, const QString &text, const QString &caption=QString(), const KGuiItem &buttonContinue=KStandardGuiItem::cont(), const KGuiItem &buttonCancel=KStandardGuiItem::cancel(), const QString &dontAskAgainName=QString(), Options options=Options(Notify|WindowModal))
soundpicker.h
QPushButton
TextEdit::sizeHint
virtual QSize sizeHint() const
Definition: editdlg_p.h:51
CommandEdit::scriptToggled
void scriptToggled(bool)
Reminder::minutes
int minutes() const
Definition: reminder.cpp:164
EditDisplayAlarmDlg::type_caption
virtual QString type_caption() const
Definition: editdlgtypes.cpp:142
ButtonGroup::setButton
void setButton(int id)
KHBox
QWidget::show
void show()
ComboBox
CommandEdit::setReadOnly
void setReadOnly(bool)
Definition: editdlgtypes.cpp:1805
Reminder::enableOnceOnly
void enableOnceOnly(bool enable)
Definition: reminder.cpp:143
shellprocess.h
EditCommandAlarmDlg::setReadOnly
virtual void setReadOnly(bool readOnly)
Definition: editdlgtypes.cpp:880
EditDisplayAlarmDlg::setConfirmAck
void setConfirmAck(bool)
Definition: editdlgtypes.cpp:438
EditCommandAlarmDlg::getAlarmFlags
virtual KAEvent::Flags getAlarmFlags() const
Definition: editdlgtypes.cpp:936
QStandardItem
QWidget::setToolTip
void setToolTip(const QString &)
EditDisplayAlarmDlg::type_showOptions
virtual void type_showOptions(bool more)
Definition: editdlgtypes.cpp:366
EditAlarmDlg::saveState
virtual void saveState(const KAEvent *)=0
Definition: editdlg.cpp:671
EditDisplayAlarmDlg::type_initValues
virtual void type_initValues(const KAEvent *)
Definition: editdlgtypes.cpp:281
TimeSpinBox::shiftWhatsThis
static QString shiftWhatsThis()
QRadioButton::sizeHint
virtual QSize sizeHint() const
EditAlarmDlg::isNewAlarm
bool isNewAlarm() const
Definition: editdlg.h:125
EditCommandAlarmDlg::type_init
virtual void type_init(QWidget *parent, QVBoxLayout *frameLayout)
Definition: editdlgtypes.cpp:763
QFileInfo::absolutePath
QString absolutePath() const
EditCommandAlarmDlg::EditCommandAlarmDlg
EditCommandAlarmDlg(bool Template, QWidget *parent=0, GetResourceType=RES_PROMPT)
Definition: editdlgtypes.cpp:736
QObject::connect
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
SoundPicker::showSpeak
void showSpeak(bool show)
Show or hide the 'speak' option.
Definition: soundpicker.cpp:122
QLabel
Preferences::defaultSoundVolume
static float defaultSoundVolume()
Definition: preferences.h:82
SpecialActionsButton::preAction
const QString & preAction() const
Definition: specialactions.h:42
FontColourButton::setReadOnly
virtual void setReadOnly(bool ro, bool noHighlight=false)
Definition: fontcolourbutton.h:45
QButtonGroup::checkedButton
QAbstractButton * checkedButton() const
EditEmailAlarmDlg::checkText
virtual bool checkText(QString &result, bool showErrorMessage=true) const
Definition: editdlgtypes.cpp:1467
EditAlarmDlg::GetResourceType
GetResourceType
Definition: editdlg.h:65
EditCommandAlarmDlg::i18n_chk_ExecInTermWindow
static QString i18n_chk_ExecInTermWindow()
Definition: editdlgtypes.cpp:726
timespinbox.h
LineEdit::Emails
SpecialActionsButton::postAction
const QString & postAction() const
Definition: specialactions.h:43
emailidcombo.h
QBoxLayout::setStretchFactor
bool setStretchFactor(QWidget *widget, int stretch)
ShellProcess
QPalette
QBoxLayout::setSpacing
void setSpacing(int spacing)
radiobutton.h
EditEmailAlarmDlg::type_aboutToTry
virtual void type_aboutToTry()
Definition: editdlgtypes.cpp:1381
TextEdit
Definition: editdlg_p.h:46
KTextEdit
LateCancelSelector::setAutoClose
void setAutoClose(bool autoClose)
Definition: latecancel.cpp:162
Reminder::setOnceOnly
void setOnceOnly(bool)
Definition: reminder.cpp:134
QBoxLayout::addLayout
void addLayout(QLayout *layout, int stretch)
EditCommandAlarmDlg::setAction
virtual void setAction(KAEvent::SubAction, const AlarmText &=AlarmText())
Definition: editdlgtypes.cpp:870
EditAudioAlarmDlg::setReadOnly
virtual void setReadOnly(bool readOnly)
Definition: editdlgtypes.cpp:1574
Preferences::emailFrom
static MailFrom emailFrom()
Definition: preferences.cpp:291
Reminder
Definition: reminder.h:32
ButtonGroup
KAMessageBox::information
static void information(QWidget *parent, const QString &text, const QString &caption=QString(), const QString &dontShowAgainName=QString(), Options options=Options(Notify|WindowModal))
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:34:51 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

kalarm

Skip menu "kalarm"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members

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