You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdepim/kalarm/prefdlg.cpp

1364 lines
56 KiB

/*
* prefdlg.cpp - program preferences dialog
* Program: kalarm
* Copyright © 2001-2008 by David Jarvie <djarvie@kde.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include "kalarm.h"
#include <qobjectlist.h>
#include <qlayout.h>
#include <qbuttongroup.h>
#include <qvbox.h>
#include <qlineedit.h>
#include <qcheckbox.h>
#include <qradiobutton.h>
#include <qpushbutton.h>
#include <qcombobox.h>
#include <qwhatsthis.h>
#include <qtooltip.h>
#include <qstyle.h>
#include <kglobal.h>
#include <klocale.h>
#include <kstandarddirs.h>
#include <kshell.h>
#include <kmessagebox.h>
#include <kaboutdata.h>
#include <kapplication.h>
#include <kiconloader.h>
#include <kcolorcombo.h>
#include <kstdguiitem.h>
#ifdef Q_WS_X11
#include <kwin.h>
#endif
#include <kdebug.h>
#include <kalarmd/kalarmd.h>
#include "alarmcalendar.h"
#include "alarmtimewidget.h"
#include "daemon.h"
#include "editdlg.h"
#include "fontcolour.h"
#include "functions.h"
#include "kalarmapp.h"
#include "kamail.h"
#include "label.h"
#include "latecancel.h"
#include "mainwindow.h"
#include "preferences.h"
#include "radiobutton.h"
#include "recurrenceedit.h"
#ifndef WITHOUT_ARTS
#include "sounddlg.h"
#endif
#include "soundpicker.h"
#include "specialactions.h"
#include "timeedit.h"
#include "timespinbox.h"
#include "traywindow.h"
#include "prefdlg.moc"
// Command strings for executing commands in different types of terminal windows.
// %t = window title parameter
// %c = command to execute in terminal
// %w = command to execute in terminal, with 'sleep 86400' appended
// %C = temporary command file to execute in terminal
// %W = temporary command file to execute in terminal, with 'sleep 86400' appended
static QString xtermCommands[] = {
QString::fromLatin1("xterm -sb -hold -title %t -e %c"),
QString::fromLatin1("konsole --noclose -T %t -e ${SHELL:-sh} -c %c"),
QString::fromLatin1("gnome-terminal -t %t -e %W"),
QString::fromLatin1("eterm --pause -T %t -e %C"), // some systems use eterm...
QString::fromLatin1("Eterm --pause -T %t -e %C"), // while some use Eterm
QString::fromLatin1("rxvt -title %t -e ${SHELL:-sh} -c %w"),
QString::null // end of list indicator - don't change!
};
/*=============================================================================
= Class KAlarmPrefDlg
=============================================================================*/
KAlarmPrefDlg* KAlarmPrefDlg::mInstance = 0;
void KAlarmPrefDlg::display()
{
if (!mInstance)
{
mInstance = new KAlarmPrefDlg;
mInstance->show();
}
else
{
#ifdef Q_WS_X11
KWin::WindowInfo info = KWin::windowInfo(mInstance->winId(), static_cast<unsigned long>(NET::WMGeometry | NET::WMDesktop));
KWin::setCurrentDesktop(info.desktop());
#endif
mInstance->showNormal(); // un-minimise it if necessary
mInstance->raise();
mInstance->setActiveWindow();
}
}
KAlarmPrefDlg::KAlarmPrefDlg()
: KDialogBase(IconList, i18n("Preferences"), Help | Default | Ok | Apply | Cancel, Ok, 0, "PrefDlg", false, true)
{
setWFlags(Qt::WDestructiveClose);
setIconListAllVisible(true);
QVBox* frame = addVBoxPage(i18n("General"), i18n("General"), DesktopIcon("misc"));
mMiscPage = new MiscPrefTab(frame);
frame = addVBoxPage(i18n("Email"), i18n("Email Alarm Settings"), DesktopIcon("mail_generic"));
mEmailPage = new EmailPrefTab(frame);
frame = addVBoxPage(i18n("View"), i18n("View Settings"), DesktopIcon("view_choose"));
mViewPage = new ViewPrefTab(frame);
frame = addVBoxPage(i18n("Font & Color"), i18n("Default Font and Color"), DesktopIcon("colorize"));
mFontColourPage = new FontColourPrefTab(frame);
frame = addVBoxPage(i18n("Edit"), i18n("Default Alarm Edit Settings"), DesktopIcon("edit"));
mEditPage = new EditPrefTab(frame);
restore();
adjustSize();
}
KAlarmPrefDlg::~KAlarmPrefDlg()
{
mInstance = 0;
}
// Restore all defaults in the options...
void KAlarmPrefDlg::slotDefault()
{
kdDebug(5950) << "KAlarmPrefDlg::slotDefault()" << endl;
mFontColourPage->setDefaults();
mEmailPage->setDefaults();
mViewPage->setDefaults();
mEditPage->setDefaults();
mMiscPage->setDefaults();
}
void KAlarmPrefDlg::slotHelp()
{
kapp->invokeHelp("preferences");
}
// Apply the preferences that are currently selected
void KAlarmPrefDlg::slotApply()
{
kdDebug(5950) << "KAlarmPrefDlg::slotApply()" << endl;
QString errmsg = mEmailPage->validate();
if (!errmsg.isEmpty())
{
showPage(pageIndex(mEmailPage->parentWidget()));
if (KMessageBox::warningYesNo(this, errmsg) != KMessageBox::Yes)
{
mValid = false;
return;
}
}
errmsg = mEditPage->validate();
if (!errmsg.isEmpty())
{
showPage(pageIndex(mEditPage->parentWidget()));
KMessageBox::sorry(this, errmsg);
mValid = false;
return;
}
mValid = true;
mFontColourPage->apply(false);
mEmailPage->apply(false);
mViewPage->apply(false);
mEditPage->apply(false);
mMiscPage->apply(false);
Preferences::syncToDisc();
}
// Apply the preferences that are currently selected
void KAlarmPrefDlg::slotOk()
{
kdDebug(5950) << "KAlarmPrefDlg::slotOk()" << endl;
mValid = true;
slotApply();
if (mValid)
KDialogBase::slotOk();
}
// Discard the current preferences and close the dialogue
void KAlarmPrefDlg::slotCancel()
{
kdDebug(5950) << "KAlarmPrefDlg::slotCancel()" << endl;
restore();
KDialogBase::slotCancel();
}
// Discard the current preferences and use the present ones
void KAlarmPrefDlg::restore()
{
kdDebug(5950) << "KAlarmPrefDlg::restore()" << endl;
mFontColourPage->restore();
mEmailPage->restore();
mViewPage->restore();
mEditPage->restore();
mMiscPage->restore();
}
/*=============================================================================
= Class PrefsTabBase
=============================================================================*/
int PrefsTabBase::mIndentWidth = 0;
PrefsTabBase::PrefsTabBase(QVBox* frame)
: QWidget(frame),
mPage(frame)
{
if (!mIndentWidth)
mIndentWidth = style().subRect(QStyle::SR_RadioButtonIndicator, this).width();
}
void PrefsTabBase::apply(bool syncToDisc)
{
Preferences::save(syncToDisc);
}
/*=============================================================================
= Class MiscPrefTab
=============================================================================*/
MiscPrefTab::MiscPrefTab(QVBox* frame)
: PrefsTabBase(frame)
{
// Get alignment to use in QGridLayout (AlignAuto doesn't work correctly there)
int alignment = QApplication::reverseLayout() ? Qt::AlignRight : Qt::AlignLeft;
QGroupBox* group = new QButtonGroup(i18n("Run Mode"), mPage, "modeGroup");
QGridLayout* grid = new QGridLayout(group, 6, 2, KDialog::marginHint(), KDialog::spacingHint());
grid->setColStretch(2, 1);
grid->addColSpacing(0, indentWidth());
grid->addColSpacing(1, indentWidth());
grid->addRowSpacing(0, fontMetrics().lineSpacing()/2);
// Run-on-demand radio button
mRunOnDemand = new QRadioButton(i18n("&Run only on demand"), group, "runDemand");
mRunOnDemand->setFixedSize(mRunOnDemand->sizeHint());
connect(mRunOnDemand, SIGNAL(toggled(bool)), SLOT(slotRunModeToggled(bool)));
QWhatsThis::add(mRunOnDemand,
i18n("Check to run KAlarm only when required.\n\n"
"Notes:\n"
"1. Alarms are displayed even when KAlarm is not running, since alarm monitoring is done by the alarm daemon.\n"
"2. With this option selected, the system tray icon can be displayed or hidden independently of KAlarm."));
grid->addMultiCellWidget(mRunOnDemand, 1, 1, 0, 2, alignment);
// Run-in-system-tray radio button
mRunInSystemTray = new QRadioButton(i18n("Run continuously in system &tray"), group, "runTray");
mRunInSystemTray->setFixedSize(mRunInSystemTray->sizeHint());
connect(mRunInSystemTray, SIGNAL(toggled(bool)), SLOT(slotRunModeToggled(bool)));
QWhatsThis::add(mRunInSystemTray,
i18n("Check to run KAlarm continuously in the KDE system tray.\n\n"
"Notes:\n"
"1. With this option selected, closing the system tray icon will quit KAlarm.\n"
"2. You do not need to select this option in order for alarms to be displayed, since alarm monitoring is done by the alarm daemon."
" Running in the system tray simply provides easy access and a status indication."));
grid->addMultiCellWidget(mRunInSystemTray, 2, 2, 0, 2, alignment);
// Run continuously options
mDisableAlarmsIfStopped = new QCheckBox(i18n("Disa&ble alarms while not running"), group, "disableAl");
mDisableAlarmsIfStopped->setFixedSize(mDisableAlarmsIfStopped->sizeHint());
connect(mDisableAlarmsIfStopped, SIGNAL(toggled(bool)), SLOT(slotDisableIfStoppedToggled(bool)));
QWhatsThis::add(mDisableAlarmsIfStopped,
i18n("Check to disable alarms whenever KAlarm is not running. Alarms will only appear while the system tray icon is visible."));
grid->addMultiCellWidget(mDisableAlarmsIfStopped, 3, 3, 1, 2, alignment);
mQuitWarn = new QCheckBox(i18n("Warn before &quitting"), group, "disableAl");
mQuitWarn->setFixedSize(mQuitWarn->sizeHint());
QWhatsThis::add(mQuitWarn,
i18n("Check to display a warning prompt before quitting KAlarm."));
grid->addWidget(mQuitWarn, 4, 2, alignment);
mAutostartTrayIcon = new QCheckBox(i18n("Autostart at &login"), group, "autoTray");
#ifdef AUTOSTART_BY_KALARMD
connect(mAutostartTrayIcon, SIGNAL(toggled(bool)), SLOT(slotAutostartToggled(bool)));
#endif
grid->addMultiCellWidget(mAutostartTrayIcon, 5, 5, 0, 2, alignment);
// Autostart alarm daemon
mAutostartDaemon = new QCheckBox(i18n("Start alarm monitoring at lo&gin"), group, "startDaemon");
mAutostartDaemon->setFixedSize(mAutostartDaemon->sizeHint());
connect(mAutostartDaemon, SIGNAL(clicked()), SLOT(slotAutostartDaemonClicked()));
QWhatsThis::add(mAutostartDaemon,
i18n("Automatically start alarm monitoring whenever you start KDE, by running the alarm daemon (%1).\n\n"
"This option should always be checked unless you intend to discontinue use of KAlarm.")
.arg(QString::fromLatin1(DAEMON_APP_NAME)));
grid->addMultiCellWidget(mAutostartDaemon, 6, 6, 0, 2, alignment);
group->setFixedHeight(group->sizeHint().height());
// Start-of-day time
QHBox* itemBox = new QHBox(mPage);
QHBox* box = new QHBox(itemBox); // this is to control the QWhatsThis text display area
box->setSpacing(KDialog::spacingHint());
QLabel* label = new QLabel(i18n("&Start of day for date-only alarms:"), box);
mStartOfDay = new TimeEdit(box);
mStartOfDay->setFixedSize(mStartOfDay->sizeHint());
label->setBuddy(mStartOfDay);
static const QString startOfDayText = i18n("The earliest time of day at which a date-only alarm (i.e. "
"an alarm with \"any time\" specified) will be triggered.");
QWhatsThis::add(box, QString("%1\n\n%2").arg(startOfDayText).arg(TimeSpinBox::shiftWhatsThis()));
itemBox->setStretchFactor(new QWidget(itemBox), 1); // left adjust the controls
itemBox->setFixedHeight(box->sizeHint().height());
// Confirm alarm deletion?
itemBox = new QHBox(mPage); // this is to allow left adjustment
mConfirmAlarmDeletion = new QCheckBox(i18n("Con&firm alarm deletions"), itemBox, "confirmDeletion");
mConfirmAlarmDeletion->setMinimumSize(mConfirmAlarmDeletion->sizeHint());
QWhatsThis::add(mConfirmAlarmDeletion,
i18n("Check to be prompted for confirmation each time you delete an alarm."));
itemBox->setStretchFactor(new QWidget(itemBox), 1); // left adjust the controls
itemBox->setFixedHeight(itemBox->sizeHint().height());
// Expired alarms
group = new QGroupBox(i18n("Expired Alarms"), mPage);
grid = new QGridLayout(group, 2, 2, KDialog::marginHint(), KDialog::spacingHint());
grid->setColStretch(1, 1);
grid->addColSpacing(0, indentWidth());
grid->addRowSpacing(0, fontMetrics().lineSpacing()/2);
mKeepExpired = new QCheckBox(i18n("Keep alarms after e&xpiry"), group, "keepExpired");
mKeepExpired->setFixedSize(mKeepExpired->sizeHint());
connect(mKeepExpired, SIGNAL(toggled(bool)), SLOT(slotExpiredToggled(bool)));
QWhatsThis::add(mKeepExpired,
i18n("Check to store alarms after expiry or deletion (except deleted alarms which were never triggered)."));
grid->addMultiCellWidget(mKeepExpired, 1, 1, 0, 1, alignment);
box = new QHBox(group);
box->setSpacing(KDialog::spacingHint());
mPurgeExpired = new QCheckBox(i18n("Discard ex&pired alarms after:"), box, "purgeExpired");
mPurgeExpired->setMinimumSize(mPurgeExpired->sizeHint());
connect(mPurgeExpired, SIGNAL(toggled(bool)), SLOT(slotExpiredToggled(bool)));
mPurgeAfter = new SpinBox(box);
mPurgeAfter->setMinValue(1);
mPurgeAfter->setLineShiftStep(10);
mPurgeAfter->setMinimumSize(mPurgeAfter->sizeHint());
mPurgeAfterLabel = new QLabel(i18n("da&ys"), box);
mPurgeAfterLabel->setMinimumSize(mPurgeAfterLabel->sizeHint());
mPurgeAfterLabel->setBuddy(mPurgeAfter);
QWhatsThis::add(box,
i18n("Uncheck to store expired alarms indefinitely. Check to enter how long expired alarms should be stored."));
grid->addWidget(box, 2, 1, alignment);
mClearExpired = new QPushButton(i18n("Clear Expired Alar&ms"), group);
mClearExpired->setFixedSize(mClearExpired->sizeHint());
connect(mClearExpired, SIGNAL(clicked()), SLOT(slotClearExpired()));
QWhatsThis::add(mClearExpired,
i18n("Delete all existing expired alarms."));
grid->addWidget(mClearExpired, 3, 1, alignment);
group->setFixedHeight(group->sizeHint().height());
// Terminal window to use for command alarms
group = new QGroupBox(i18n("Terminal for Command Alarms"), mPage);
QWhatsThis::add(group,
i18n("Choose which application to use when a command alarm is executed in a terminal window"));
grid = new QGridLayout(group, 1, 3, KDialog::marginHint(), KDialog::spacingHint());
grid->addRowSpacing(0, fontMetrics().lineSpacing()/2);
int row = 0;
mXtermType = new QButtonGroup(group);
mXtermType->hide();
QString whatsThis = i18n("The parameter is a command line, e.g. 'xterm -e'", "Check to execute command alarms in a terminal window by '%1'");
int index = 0;
mXtermFirst = -1;
for (mXtermCount = 0; !xtermCommands[mXtermCount].isNull(); ++mXtermCount)
{
QString cmd = xtermCommands[mXtermCount];
QStringList args = KShell::splitArgs(cmd);
if (args.isEmpty() || KStandardDirs::findExe(args[0]).isEmpty())
continue;
QRadioButton* radio = new QRadioButton(args[0], group);
radio->setMinimumSize(radio->sizeHint());
mXtermType->insert(radio, mXtermCount);
if (mXtermFirst < 0)
mXtermFirst = mXtermCount; // note the id of the first button
cmd.replace("%t", kapp->aboutData()->programName());
cmd.replace("%c", "<command>");
cmd.replace("%w", "<command; sleep>");
cmd.replace("%C", "[command]");
cmd.replace("%W", "[command; sleep]");
QWhatsThis::add(radio, whatsThis.arg(cmd));
grid->addWidget(radio, (row = index/3 + 1), index % 3, Qt::AlignAuto);
++index;
}
box = new QHBox(group);
grid->addMultiCellWidget(box, row + 1, row + 1, 0, 2, Qt::AlignAuto);
QRadioButton* radio = new QRadioButton(i18n("Other:"), box);
radio->setFixedSize(radio->sizeHint());
connect(radio, SIGNAL(toggled(bool)), SLOT(slotOtherTerminalToggled(bool)));
mXtermType->insert(radio, mXtermCount);
if (mXtermFirst < 0)
mXtermFirst = mXtermCount; // note the id of the first button
mXtermCommand = new QLineEdit(box);
QWhatsThis::add(box,
i18n("Enter the full command line needed to execute a command in your chosen terminal window. "
"By default the alarm's command string will be appended to what you enter here. "
"See the KAlarm Handbook for details of special codes to tailor the command line."));
mPage->setStretchFactor(new QWidget(mPage), 1); // top adjust the widgets
}
void MiscPrefTab::restore()
{
mAutostartDaemon->setChecked(Daemon::autoStart());
bool systray = Preferences::mRunInSystemTray;
mRunInSystemTray->setChecked(systray);
mRunOnDemand->setChecked(!systray);
mDisableAlarmsIfStopped->setChecked(Preferences::mDisableAlarmsIfStopped);
mQuitWarn->setChecked(Preferences::quitWarn());
mAutostartTrayIcon->setChecked(Preferences::mAutostartTrayIcon);
mConfirmAlarmDeletion->setChecked(Preferences::confirmAlarmDeletion());
mStartOfDay->setValue(Preferences::mStartOfDay);
setExpiredControls(Preferences::mExpiredKeepDays);
QString xtermCmd = Preferences::cmdXTermCommand();
int id = mXtermFirst;
if (!xtermCmd.isEmpty())
{
for ( ; id < mXtermCount; ++id)
{
if (mXtermType->find(id) && xtermCmd == xtermCommands[id])
break;
}
}
mXtermType->setButton(id);
mXtermCommand->setEnabled(id == mXtermCount);
mXtermCommand->setText(id == mXtermCount ? xtermCmd : "");
slotDisableIfStoppedToggled(true);
}
void MiscPrefTab::apply(bool syncToDisc)
{
// First validate anything entered in Other X-terminal command
int xtermID = mXtermType->selectedId();
if (xtermID >= mXtermCount)
{
QString cmd = mXtermCommand->text();
if (cmd.isEmpty())
xtermID = -1; // 'Other' is only acceptable if it's non-blank
else
{
QStringList args = KShell::splitArgs(cmd);
cmd = args.isEmpty() ? QString::null : args[0];
if (KStandardDirs::findExe(cmd).isEmpty())
{
mXtermCommand->setFocus();
if (KMessageBox::warningContinueCancel(this, i18n("Command to invoke terminal window not found:\n%1").arg(cmd))
!= KMessageBox::Continue)
return;
}
}
}
if (xtermID < 0)
{
xtermID = mXtermFirst;
mXtermType->setButton(mXtermFirst);
}
bool systray = mRunInSystemTray->isChecked();
Preferences::mRunInSystemTray = systray;
Preferences::mDisableAlarmsIfStopped = mDisableAlarmsIfStopped->isChecked();
if (mQuitWarn->isEnabled())
Preferences::setQuitWarn(mQuitWarn->isChecked());
Preferences::mAutostartTrayIcon = mAutostartTrayIcon->isChecked();
#ifdef AUTOSTART_BY_KALARMD
bool newAutostartDaemon = mAutostartDaemon->isChecked() || Preferences::mAutostartTrayIcon;
#else
bool newAutostartDaemon = mAutostartDaemon->isChecked();
#endif
if (newAutostartDaemon != Daemon::autoStart())
Daemon::enableAutoStart(newAutostartDaemon);
Preferences::setConfirmAlarmDeletion(mConfirmAlarmDeletion->isChecked());
int sod = mStartOfDay->value();
Preferences::mStartOfDay.setHMS(sod/60, sod%60, 0);
Preferences::mExpiredKeepDays = !mKeepExpired->isChecked() ? 0
: mPurgeExpired->isChecked() ? mPurgeAfter->value() : -1;
Preferences::mCmdXTermCommand = (xtermID < mXtermCount) ? xtermCommands[xtermID] : mXtermCommand->text();
PrefsTabBase::apply(syncToDisc);
}
void MiscPrefTab::setDefaults()
{
mAutostartDaemon->setChecked(true);
bool systray = Preferences::default_runInSystemTray;
mRunInSystemTray->setChecked(systray);
mRunOnDemand->setChecked(!systray);
mDisableAlarmsIfStopped->setChecked(Preferences::default_disableAlarmsIfStopped);
mQuitWarn->setChecked(Preferences::default_quitWarn);
mAutostartTrayIcon->setChecked(Preferences::default_autostartTrayIcon);
mConfirmAlarmDeletion->setChecked(Preferences::default_confirmAlarmDeletion);
mStartOfDay->setValue(Preferences::default_startOfDay);
setExpiredControls(Preferences::default_expiredKeepDays);
mXtermType->setButton(mXtermFirst);
mXtermCommand->setEnabled(false);
slotDisableIfStoppedToggled(true);
}
void MiscPrefTab::slotAutostartDaemonClicked()
{
if (!mAutostartDaemon->isChecked()
&& KMessageBox::warningYesNo(this,
i18n("You should not uncheck this option unless you intend to discontinue use of KAlarm"),
QString::null, KStdGuiItem::cont(), KStdGuiItem::cancel()
) != KMessageBox::Yes)
mAutostartDaemon->setChecked(true);
}
void MiscPrefTab::slotRunModeToggled(bool)
{
bool systray = mRunInSystemTray->isOn();
mAutostartTrayIcon->setText(systray ? i18n("Autostart at &login") : i18n("Autostart system tray &icon at login"));
QWhatsThis::add(mAutostartTrayIcon, (systray ? i18n("Check to run KAlarm whenever you start KDE.")
: i18n("Check to display the system tray icon whenever you start KDE.")));
mDisableAlarmsIfStopped->setEnabled(systray);
slotDisableIfStoppedToggled(true);
}
/******************************************************************************
* If autostart at login is selected, the daemon must be autostarted so that it
* can autostart KAlarm, in which case disable the daemon autostart option.
*/
void MiscPrefTab::slotAutostartToggled(bool)
{
#ifdef AUTOSTART_BY_KALARMD
mAutostartDaemon->setEnabled(!mAutostartTrayIcon->isChecked());
#endif
}
void MiscPrefTab::slotDisableIfStoppedToggled(bool)
{
bool enable = mDisableAlarmsIfStopped->isEnabled() && mDisableAlarmsIfStopped->isChecked();
mQuitWarn->setEnabled(enable);
}
void MiscPrefTab::setExpiredControls(int purgeDays)
{
mKeepExpired->setChecked(purgeDays);
mPurgeExpired->setChecked(purgeDays > 0);
mPurgeAfter->setValue(purgeDays > 0 ? purgeDays : 0);
slotExpiredToggled(true);
}
void MiscPrefTab::slotExpiredToggled(bool)
{
bool keep = mKeepExpired->isChecked();
bool after = keep && mPurgeExpired->isChecked();
mPurgeExpired->setEnabled(keep);
mPurgeAfter->setEnabled(after);
mPurgeAfterLabel->setEnabled(keep);
mClearExpired->setEnabled(keep);
}
void MiscPrefTab::slotClearExpired()
{
AlarmCalendar* cal = AlarmCalendar::expiredCalendarOpen();
if (cal)
cal->purgeAll();
}
void MiscPrefTab::slotOtherTerminalToggled(bool on)
{
mXtermCommand->setEnabled(on);
}
/*=============================================================================
= Class EmailPrefTab
=============================================================================*/
EmailPrefTab::EmailPrefTab(QVBox* frame)
: PrefsTabBase(frame),
mAddressChanged(false),
mBccAddressChanged(false)
{
QHBox* box = new QHBox(mPage);
box->setSpacing(2*KDialog::spacingHint());
QLabel* label = new QLabel(i18n("Email client:"), box);
mEmailClient = new ButtonGroup(box);
mEmailClient->hide();
RadioButton* radio = new RadioButton(i18n("&KMail"), box, "kmail");
radio->setMinimumSize(radio->sizeHint());
mEmailClient->insert(radio, Preferences::KMAIL);
radio = new RadioButton(i18n("&Sendmail"), box, "sendmail");
radio->setMinimumSize(radio->sizeHint());
mEmailClient->insert(radio, Preferences::SENDMAIL);
connect(mEmailClient, SIGNAL(buttonSet(int)), SLOT(slotEmailClientChanged(int)));
box->setFixedHeight(box->sizeHint().height());
QWhatsThis::add(box,
i18n("Choose how to send email when an email alarm is triggered.\n"
"KMail: The email is sent automatically via KMail. KMail is started first if necessary.\n"
"Sendmail: The email is sent automatically. This option will only work if "
"your system is configured to use sendmail or a sendmail compatible mail transport agent."));
box = new QHBox(mPage); // this is to allow left adjustment
mEmailCopyToKMail = new QCheckBox(i18n("Co&py sent emails into KMail's %1 folder").arg(KAMail::i18n_sent_mail()), box);
mEmailCopyToKMail->setFixedSize(mEmailCopyToKMail->sizeHint());
QWhatsThis::add(mEmailCopyToKMail,
i18n("After sending an email, store a copy in KMail's %1 folder").arg(KAMail::i18n_sent_mail()));
box->setStretchFactor(new QWidget(box), 1); // left adjust the controls
box->setFixedHeight(box->sizeHint().height());
// Your Email Address group box
QGroupBox* group = new QGroupBox(i18n("Your Email Address"), mPage);
QGridLayout* grid = new QGridLayout(group, 6, 3, KDialog::marginHint(), KDialog::spacingHint());
grid->addRowSpacing(0, fontMetrics().lineSpacing()/2);
grid->setColStretch(1, 1);
// 'From' email address controls ...
label = new Label(EditAlarmDlg::i18n_f_EmailFrom(), group);
label->setFixedSize(label->sizeHint());
grid->addWidget(label, 1, 0);
mFromAddressGroup = new ButtonGroup(group);
mFromAddressGroup->hide();
connect(mFromAddressGroup, SIGNAL(buttonSet(int)), SLOT(slotFromAddrChanged(int)));
// Line edit to enter a 'From' email address
radio = new RadioButton(group);
mFromAddressGroup->insert(radio, Preferences::MAIL_FROM_ADDR);
radio->setFixedSize(radio->sizeHint());
label->setBuddy(radio);
grid->addWidget(radio, 1, 1);
mEmailAddress = new QLineEdit(group);
connect(mEmailAddress, SIGNAL(textChanged(const QString&)), SLOT(slotAddressChanged()));
QString whatsThis = i18n("Your email address, used to identify you as the sender when sending email alarms.");
QWhatsThis::add(radio, whatsThis);
QWhatsThis::add(mEmailAddress, whatsThis);
radio->setFocusWidget(mEmailAddress);
grid->addWidget(mEmailAddress, 1, 2);
// 'From' email address to be taken from Control Centre
radio = new RadioButton(i18n("&Use address from Control Center"), group);
radio->setFixedSize(radio->sizeHint());
mFromAddressGroup->insert(radio, Preferences::MAIL_FROM_CONTROL_CENTRE);
QWhatsThis::add(radio,
i18n("Check to use the email address set in the KDE Control Center, to identify you as the sender when sending email alarms."));
grid->addMultiCellWidget(radio, 2, 2, 1, 2, Qt::AlignAuto);
// 'From' email address to be picked from KMail's identities when the email alarm is configured
radio = new RadioButton(i18n("Use KMail &identities"), group);
radio->setFixedSize(radio->sizeHint());
mFromAddressGroup->insert(radio, Preferences::MAIL_FROM_KMAIL);
QWhatsThis::add(radio,
i18n("Check to use KMail's email identities to identify you as the sender when sending email alarms. "
"For existing email alarms, KMail's default identity will be used. "
"For new email alarms, you will be able to pick which of KMail's identities to use."));
grid->addMultiCellWidget(radio, 3, 3, 1, 2, Qt::AlignAuto);
// 'Bcc' email address controls ...
grid->addRowSpacing(4, KDialog::spacingHint());
label = new Label(i18n("'Bcc' email address", "&Bcc:"), group);
label->setFixedSize(label->sizeHint());
grid->addWidget(label, 5, 0);
mBccAddressGroup = new ButtonGroup(group);
mBccAddressGroup->hide();
connect(mBccAddressGroup, SIGNAL(buttonSet(int)), SLOT(slotBccAddrChanged(int)));
// Line edit to enter a 'Bcc' email address
radio = new RadioButton(group);
radio->setFixedSize(radio->sizeHint());
mBccAddressGroup->insert(radio, Preferences::MAIL_FROM_ADDR);
label->setBuddy(radio);
grid->addWidget(radio, 5, 1);
mEmailBccAddress = new QLineEdit(group);
whatsThis = i18n("Your email address, used for blind copying email alarms to yourself. "
"If you want blind copies to be sent to your account on the computer which KAlarm runs on, you can simply enter your user login name.");
QWhatsThis::add(radio, whatsThis);
QWhatsThis::add(mEmailBccAddress, whatsThis);
radio->setFocusWidget(mEmailBccAddress);
grid->addWidget(mEmailBccAddress, 5, 2);
// 'Bcc' email address to be taken from Control Centre
radio = new RadioButton(i18n("Us&e address from Control Center"), group);
radio->setFixedSize(radio->sizeHint());
mBccAddressGroup->insert(radio, Preferences::MAIL_FROM_CONTROL_CENTRE);
QWhatsThis::add(radio,
i18n("Check to use the email address set in the KDE Control Center, for blind copying email alarms to yourself."));
grid->addMultiCellWidget(radio, 6, 6, 1, 2, Qt::AlignAuto);
group->setFixedHeight(group->sizeHint().height());
box = new QHBox(mPage); // this is to allow left adjustment
mEmailQueuedNotify = new QCheckBox(i18n("&Notify when remote emails are queued"), box);
mEmailQueuedNotify->setFixedSize(mEmailQueuedNotify->sizeHint());
QWhatsThis::add(mEmailQueuedNotify,
i18n("Display a notification message whenever an email alarm has queued an email for sending to a remote system. "
"This could be useful if, for example, you have a dial-up connection, so that you can then ensure that the email is actually transmitted."));
box->setStretchFactor(new QWidget(box), 1); // left adjust the controls
box->setFixedHeight(box->sizeHint().height());
mPage->setStretchFactor(new QWidget(mPage), 1); // top adjust the widgets
}
void EmailPrefTab::restore()
{
mEmailClient->setButton(Preferences::mEmailClient);
mEmailCopyToKMail->setChecked(Preferences::emailCopyToKMail());
setEmailAddress(Preferences::mEmailFrom, Preferences::mEmailAddress);
setEmailBccAddress((Preferences::mEmailBccFrom == Preferences::MAIL_FROM_CONTROL_CENTRE), Preferences::mEmailBccAddress);
mEmailQueuedNotify->setChecked(Preferences::emailQueuedNotify());
mAddressChanged = mBccAddressChanged = false;
}
void EmailPrefTab::apply(bool syncToDisc)
{
int client = mEmailClient->id(mEmailClient->selected());
Preferences::mEmailClient = (client >= 0) ? Preferences::MailClient(client) : Preferences::default_emailClient;
Preferences::mEmailCopyToKMail = mEmailCopyToKMail->isChecked();
Preferences::setEmailAddress(static_cast<Preferences::MailFrom>(mFromAddressGroup->selectedId()), mEmailAddress->text().stripWhiteSpace());
Preferences::setEmailBccAddress((mBccAddressGroup->selectedId() == Preferences::MAIL_FROM_CONTROL_CENTRE), mEmailBccAddress->text().stripWhiteSpace());
Preferences::setEmailQueuedNotify(mEmailQueuedNotify->isChecked());
PrefsTabBase::apply(syncToDisc);
}
void EmailPrefTab::setDefaults()
{
mEmailClient->setButton(Preferences::default_emailClient);
setEmailAddress(Preferences::default_emailFrom(), Preferences::default_emailAddress);
setEmailBccAddress((Preferences::default_emailBccFrom == Preferences::MAIL_FROM_CONTROL_CENTRE), Preferences::default_emailBccAddress);
mEmailQueuedNotify->setChecked(Preferences::default_emailQueuedNotify);
}
void EmailPrefTab::setEmailAddress(Preferences::MailFrom from, const QString& address)
{
mFromAddressGroup->setButton(from);
mEmailAddress->setText(from == Preferences::MAIL_FROM_ADDR ? address.stripWhiteSpace() : QString());
}
void EmailPrefTab::setEmailBccAddress(bool useControlCentre, const QString& address)
{
mBccAddressGroup->setButton(useControlCentre ? Preferences::MAIL_FROM_CONTROL_CENTRE : Preferences::MAIL_FROM_ADDR);
mEmailBccAddress->setText(useControlCentre ? QString() : address.stripWhiteSpace());
}
void EmailPrefTab::slotEmailClientChanged(int id)
{
mEmailCopyToKMail->setEnabled(id == Preferences::SENDMAIL);
}
void EmailPrefTab::slotFromAddrChanged(int id)
{
mEmailAddress->setEnabled(id == Preferences::MAIL_FROM_ADDR);
mAddressChanged = true;
}
void EmailPrefTab::slotBccAddrChanged(int id)
{
mEmailBccAddress->setEnabled(id == Preferences::MAIL_FROM_ADDR);
mBccAddressChanged = true;
}
QString EmailPrefTab::validate()
{
if (mAddressChanged)
{
mAddressChanged = false;
QString errmsg = validateAddr(mFromAddressGroup, mEmailAddress, KAMail::i18n_NeedFromEmailAddress());
if (!errmsg.isEmpty())
return errmsg;
}
if (mBccAddressChanged)
{
mBccAddressChanged = false;
return validateAddr(mBccAddressGroup, mEmailBccAddress, i18n("No valid 'Bcc' email address is specified."));
}
return QString::null;
}
QString EmailPrefTab::validateAddr(ButtonGroup* group, QLineEdit* addr, const QString& msg)
{
QString errmsg = i18n("%1\nAre you sure you want to save your changes?").arg(msg);
switch (group->selectedId())
{
case Preferences::MAIL_FROM_CONTROL_CENTRE:
if (!KAMail::controlCentreAddress().isEmpty())
return QString::null;
errmsg = i18n("No email address is currently set in the KDE Control Center. %1").arg(errmsg);
break;
case Preferences::MAIL_FROM_KMAIL:
if (KAMail::identitiesExist())
return QString::null;
errmsg = i18n("No KMail identities currently exist. %1").arg(errmsg);
break;
case Preferences::MAIL_FROM_ADDR:
if (!addr->text().stripWhiteSpace().isEmpty())
return QString::null;
break;
}
return errmsg;
}
/*=============================================================================
= Class FontColourPrefTab
=============================================================================*/
FontColourPrefTab::FontColourPrefTab(QVBox* frame)
: PrefsTabBase(frame)
{
mFontChooser = new FontColourChooser(mPage, 0, false, QStringList(), i18n("Message Font && Color"), true, false);
mPage->setStretchFactor(mFontChooser, 1);
QFrame* layoutBox = new QFrame(mPage);
QHBoxLayout* hlayout = new QHBoxLayout(layoutBox);
QVBoxLayout* colourLayout = new QVBoxLayout(hlayout, KDialog::spacingHint());
hlayout->addStretch();
QHBox* box = new QHBox(layoutBox); // to group widgets for QWhatsThis text
box->setSpacing(KDialog::spacingHint()/2);
colourLayout->addWidget(box);
QLabel* label1 = new QLabel(i18n("Di&sabled alarm color:"), box);
box->setStretchFactor(new QWidget(box), 1);
mDisabledColour = new KColorCombo(box);
label1->setBuddy(mDisabledColour);
QWhatsThis::add(box,
i18n("Choose the text color in the alarm list for disabled alarms."));
box = new QHBox(layoutBox); // to group widgets for QWhatsThis text
box->setSpacing(KDialog::spacingHint()/2);
colourLayout->addWidget(box);
QLabel* label2 = new QLabel(i18n("E&xpired alarm color:"), box);
box->setStretchFactor(new QWidget(box), 1);
mExpiredColour = new KColorCombo(box);
label2->setBuddy(mExpiredColour);
QWhatsThis::add(box,
i18n("Choose the text color in the alarm list for expired alarms."));
}
void FontColourPrefTab::restore()
{
mFontChooser->setBgColour(Preferences::mDefaultBgColour);
mFontChooser->setColours(Preferences::mMessageColours);
mFontChooser->setFont(Preferences::mMessageFont);
mDisabledColour->setColor(Preferences::mDisabledColour);
mExpiredColour->setColor(Preferences::mExpiredColour);
}
void FontColourPrefTab::apply(bool syncToDisc)
{
Preferences::mDefaultBgColour = mFontChooser->bgColour();
Preferences::mMessageColours = mFontChooser->colours();
Preferences::mMessageFont = mFontChooser->font();
Preferences::mDisabledColour = mDisabledColour->color();
Preferences::mExpiredColour = mExpiredColour->color();
PrefsTabBase::apply(syncToDisc);
}
void FontColourPrefTab::setDefaults()
{
mFontChooser->setBgColour(Preferences::default_defaultBgColour);
mFontChooser->setColours(Preferences::default_messageColours);
mFontChooser->setFont(Preferences::default_messageFont());
mDisabledColour->setColor(Preferences::default_disabledColour);
mExpiredColour->setColor(Preferences::default_expiredColour);
}
/*=============================================================================
= Class EditPrefTab
=============================================================================*/
EditPrefTab::EditPrefTab(QVBox* frame)
: PrefsTabBase(frame)
{
// Get alignment to use in QLabel::setAlignment(alignment | Qt::WordBreak)
// (AlignAuto doesn't work correctly there)
int alignment = QApplication::reverseLayout() ? Qt::AlignRight : Qt::AlignLeft;
int groupTopMargin = fontMetrics().lineSpacing()/2;
QString defsetting = i18n("The default setting for \"%1\" in the alarm edit dialog.");
QString soundSetting = i18n("Check to select %1 as the default setting for \"%2\" in the alarm edit dialog.");
// DISPLAY ALARMS
QGroupBox* group = new QGroupBox(i18n("Display Alarms"), mPage);
QBoxLayout* layout = new QVBoxLayout(group, KDialog::marginHint(), KDialog::spacingHint());
layout->addSpacing(groupTopMargin);
mConfirmAck = new QCheckBox(EditAlarmDlg::i18n_k_ConfirmAck(), group, "defConfAck");
mConfirmAck->setMinimumSize(mConfirmAck->sizeHint());
QWhatsThis::add(mConfirmAck, defsetting.arg(EditAlarmDlg::i18n_ConfirmAck()));
layout->addWidget(mConfirmAck, 0, Qt::AlignAuto);
mAutoClose = new QCheckBox(LateCancelSelector::i18n_i_AutoCloseWinLC(), group, "defAutoClose");
mAutoClose->setMinimumSize(mAutoClose->sizeHint());
QWhatsThis::add(mAutoClose, defsetting.arg(LateCancelSelector::i18n_AutoCloseWin()));
layout->addWidget(mAutoClose, 0, Qt::AlignAuto);
QHBox* box = new QHBox(group);
box->setSpacing(KDialog::spacingHint());
layout->addWidget(box);
QLabel* label = new QLabel(i18n("Reminder &units:"), box);
label->setFixedSize(label->sizeHint());
mReminderUnits = new QComboBox(box, "defWarnUnits");
mReminderUnits->insertItem(TimePeriod::i18n_Minutes(), TimePeriod::MINUTES);
mReminderUnits->insertItem(TimePeriod::i18n_Hours_Mins(), TimePeriod::HOURS_MINUTES);
mReminderUnits->insertItem(TimePeriod::i18n_Days(), TimePeriod::DAYS);
mReminderUnits->insertItem(TimePeriod::i18n_Weeks(), TimePeriod::WEEKS);
mReminderUnits->setFixedSize(mReminderUnits->sizeHint());
label->setBuddy(mReminderUnits);
QWhatsThis::add(box,
i18n("The default units for the reminder in the alarm edit dialog."));
box->setStretchFactor(new QWidget(box), 1); // left adjust the control
mSpecialActionsButton = new SpecialActionsButton(EditAlarmDlg::i18n_SpecialActions(), box);
mSpecialActionsButton->setFixedSize(mSpecialActionsButton->sizeHint());
// SOUND
QButtonGroup* bgroup = new QButtonGroup(SoundPicker::i18n_Sound(), mPage, "soundGroup");
layout = new QVBoxLayout(bgroup, KDialog::marginHint(), KDialog::spacingHint());
layout->addSpacing(groupTopMargin);
QBoxLayout* hlayout = new QHBoxLayout(layout, KDialog::spacingHint());
mSound = new QComboBox(false, bgroup, "defSound");
mSound->insertItem(SoundPicker::i18n_None()); // index 0
mSound->insertItem(SoundPicker::i18n_Beep()); // index 1
mSound->insertItem(SoundPicker::i18n_File()); // index 2
if (theApp()->speechEnabled())
mSound->insertItem(SoundPicker::i18n_Speak()); // index 3
mSound->setMinimumSize(mSound->sizeHint());
QWhatsThis::add(mSound, defsetting.arg(SoundPicker::i18n_Sound()));
hlayout->addWidget(mSound);
hlayout->addStretch(1);
#ifndef WITHOUT_ARTS
mSoundRepeat = new QCheckBox(i18n("Repea&t sound file"), bgroup, "defRepeatSound");
mSoundRepeat->setMinimumSize(mSoundRepeat->sizeHint());
QWhatsThis::add(mSoundRepeat, i18n("sound file \"Repeat\" checkbox", "The default setting for sound file \"%1\" in the alarm edit dialog.").arg(SoundDlg::i18n_Repeat()));
hlayout->addWidget(mSoundRepeat);
#endif
box = new QHBox(bgroup); // this is to control the QWhatsThis text display area
box->setSpacing(KDialog::spacingHint());
mSoundFileLabel = new QLabel(i18n("Sound &file:"), box);
mSoundFileLabel->setFixedSize(mSoundFileLabel->sizeHint());
mSoundFile = new QLineEdit(box);
mSoundFileLabel->setBuddy(mSoundFile);
mSoundFileBrowse = new QPushButton(box);
mSoundFileBrowse->setPixmap(SmallIcon("fileopen"));
mSoundFileBrowse->setFixedSize(mSoundFileBrowse->sizeHint());
connect(mSoundFileBrowse, SIGNAL(clicked()), SLOT(slotBrowseSoundFile()));
QToolTip::add(mSoundFileBrowse, i18n("Choose a sound file"));
QWhatsThis::add(box,
i18n("Enter the default sound file to use in the alarm edit dialog."));
box->setFixedHeight(box->sizeHint().height());
layout->addWidget(box);
bgroup->setFixedHeight(bgroup->sizeHint().height());
// COMMAND ALARMS
group = new QGroupBox(i18n("Command Alarms"), mPage);
layout = new QVBoxLayout(group, KDialog::marginHint(), KDialog::spacingHint());
layout->addSpacing(groupTopMargin);
layout = new QHBoxLayout(layout, KDialog::spacingHint());
mCmdScript = new QCheckBox(EditAlarmDlg::i18n_p_EnterScript(), group, "defCmdScript");
mCmdScript->setMinimumSize(mCmdScript->sizeHint());
QWhatsThis::add(mCmdScript, defsetting.arg(EditAlarmDlg::i18n_EnterScript()));
layout->addWidget(mCmdScript);
layout->addStretch();
mCmdXterm = new QCheckBox(EditAlarmDlg::i18n_w_ExecInTermWindow(), group, "defCmdXterm");
mCmdXterm->setMinimumSize(mCmdXterm->sizeHint());
QWhatsThis::add(mCmdXterm, defsetting.arg(EditAlarmDlg::i18n_ExecInTermWindow()));
layout->addWidget(mCmdXterm);
// EMAIL ALARMS
group = new QGroupBox(i18n("Email Alarms"), mPage);
layout = new QVBoxLayout(group, KDialog::marginHint(), KDialog::spacingHint());
layout->addSpacing(groupTopMargin);
// BCC email to sender
mEmailBcc = new QCheckBox(EditAlarmDlg::i18n_e_CopyEmailToSelf(), group, "defEmailBcc");
mEmailBcc->setMinimumSize(mEmailBcc->sizeHint());
QWhatsThis::add(mEmailBcc, defsetting.arg(EditAlarmDlg::i18n_CopyEmailToSelf()));
layout->addWidget(mEmailBcc, 0, Qt::AlignAuto);
// MISCELLANEOUS
// Show in KOrganizer
mCopyToKOrganizer = new QCheckBox(EditAlarmDlg::i18n_g_ShowInKOrganizer(), mPage, "defShowKorg");
mCopyToKOrganizer->setMinimumSize(mCopyToKOrganizer->sizeHint());
QWhatsThis::add(mCopyToKOrganizer, defsetting.arg(EditAlarmDlg::i18n_ShowInKOrganizer()));
// Late cancellation
box = new QHBox(mPage);
box->setSpacing(KDialog::spacingHint());
mLateCancel = new QCheckBox(LateCancelSelector::i18n_n_CancelIfLate(), box, "defCancelLate");
mLateCancel->setMinimumSize(mLateCancel->sizeHint());
QWhatsThis::add(mLateCancel, defsetting.arg(LateCancelSelector::i18n_CancelIfLate()));
box->setStretchFactor(new QWidget(box), 1); // left adjust the control
// Recurrence
QHBox* itemBox = new QHBox(box); // this is to control the QWhatsThis text display area
itemBox->setSpacing(KDialog::spacingHint());
label = new QLabel(i18n("&Recurrence:"), itemBox);
label->setFixedSize(label->sizeHint());
mRecurPeriod = new QComboBox(itemBox, "defRecur");
mRecurPeriod->insertItem(RecurrenceEdit::i18n_NoRecur());
mRecurPeriod->insertItem(RecurrenceEdit::i18n_AtLogin());
mRecurPeriod->insertItem(RecurrenceEdit::i18n_HourlyMinutely());
mRecurPeriod->insertItem(RecurrenceEdit::i18n_Daily());
mRecurPeriod->insertItem(RecurrenceEdit::i18n_Weekly());
mRecurPeriod->insertItem(RecurrenceEdit::i18n_Monthly());
mRecurPeriod->insertItem(RecurrenceEdit::i18n_Yearly());
mRecurPeriod->setFixedSize(mRecurPeriod->sizeHint());
label->setBuddy(mRecurPeriod);
QWhatsThis::add(itemBox,
i18n("The default setting for the recurrence rule in the alarm edit dialog."));
box->setFixedHeight(itemBox->sizeHint().height());
// How to handle February 29th in yearly recurrences
QVBox* vbox = new QVBox(mPage); // this is to control the QWhatsThis text display area
vbox->setSpacing(KDialog::spacingHint());
label = new QLabel(i18n("In non-leap years, repeat yearly February 29th alarms on:"), vbox);
label->setAlignment(alignment | Qt::WordBreak);
itemBox = new QHBox(vbox);
itemBox->setSpacing(2*KDialog::spacingHint());
mFeb29 = new QButtonGroup(itemBox);
mFeb29->hide();
QWidget* widget = new QWidget(itemBox);
widget->setFixedWidth(3*KDialog::spacingHint());
QRadioButton* radio = new QRadioButton(i18n("February 2&8th"), itemBox);
radio->setMinimumSize(radio->sizeHint());
mFeb29->insert(radio, KARecurrence::FEB29_FEB28);
radio = new QRadioButton(i18n("March &1st"), itemBox);
radio->setMinimumSize(radio->sizeHint());
mFeb29->insert(radio, KARecurrence::FEB29_MAR1);
radio = new QRadioButton(i18n("Do &not repeat"), itemBox);
radio->setMinimumSize(radio->sizeHint());
mFeb29->insert(radio, KARecurrence::FEB29_FEB29);
itemBox->setFixedHeight(itemBox->sizeHint().height());
QWhatsThis::add(vbox,
i18n("For yearly recurrences, choose what date, if any, alarms due on February 29th should occur in non-leap years.\n"
"Note that the next scheduled occurrence of existing alarms is not re-evaluated when you change this setting."));
mPage->setStretchFactor(new QWidget(mPage), 1); // top adjust the widgets
}
void EditPrefTab::restore()
{
mAutoClose->setChecked(Preferences::mDefaultAutoClose);
mConfirmAck->setChecked(Preferences::mDefaultConfirmAck);
mReminderUnits->setCurrentItem(Preferences::mDefaultReminderUnits);
mSpecialActionsButton->setActions(Preferences::mDefaultPreAction, Preferences::mDefaultPostAction);
mSound->setCurrentItem(soundIndex(Preferences::mDefaultSoundType));
mSoundFile->setText(Preferences::mDefaultSoundFile);
#ifndef WITHOUT_ARTS
mSoundRepeat->setChecked(Preferences::mDefaultSoundRepeat);
#endif
mCmdScript->setChecked(Preferences::mDefaultCmdScript);
mCmdXterm->setChecked(Preferences::mDefaultCmdLogType == EditAlarmDlg::EXEC_IN_TERMINAL);
mEmailBcc->setChecked(Preferences::mDefaultEmailBcc);
mCopyToKOrganizer->setChecked(Preferences::mDefaultCopyToKOrganizer);
mLateCancel->setChecked(Preferences::mDefaultLateCancel);
mRecurPeriod->setCurrentItem(recurIndex(Preferences::mDefaultRecurPeriod));
mFeb29->setButton(Preferences::mDefaultFeb29Type);
}
void EditPrefTab::apply(bool syncToDisc)
{
Preferences::mDefaultAutoClose = mAutoClose->isChecked();
Preferences::mDefaultConfirmAck = mConfirmAck->isChecked();
Preferences::mDefaultReminderUnits = static_cast<TimePeriod::Units>(mReminderUnits->currentItem());
Preferences::mDefaultPreAction = mSpecialActionsButton->preAction();
Preferences::mDefaultPostAction = mSpecialActionsButton->postAction();
switch (mSound->currentItem())
{
case 3: Preferences::mDefaultSoundType = SoundPicker::SPEAK; break;
case 2: Preferences::mDefaultSoundType = SoundPicker::PLAY_FILE; break;
case 1: Preferences::mDefaultSoundType = SoundPicker::BEEP; break;
case 0:
default: Preferences::mDefaultSoundType = SoundPicker::NONE; break;
}
Preferences::mDefaultSoundFile = mSoundFile->text();
#ifndef WITHOUT_ARTS
Preferences::mDefaultSoundRepeat = mSoundRepeat->isChecked();
#endif
Preferences::mDefaultCmdScript = mCmdScript->isChecked();
Preferences::mDefaultCmdLogType = (mCmdXterm->isChecked() ? EditAlarmDlg::EXEC_IN_TERMINAL : EditAlarmDlg::DISCARD_OUTPUT);
Preferences::mDefaultEmailBcc = mEmailBcc->isChecked();
Preferences::mDefaultCopyToKOrganizer = mCopyToKOrganizer->isChecked();
Preferences::mDefaultLateCancel = mLateCancel->isChecked() ? 1 : 0;
switch (mRecurPeriod->currentItem())
{
case 6: Preferences::mDefaultRecurPeriod = RecurrenceEdit::ANNUAL; break;
case 5: Preferences::mDefaultRecurPeriod = RecurrenceEdit::MONTHLY; break;
case 4: Preferences::mDefaultRecurPeriod = RecurrenceEdit::WEEKLY; break;
case 3: Preferences::mDefaultRecurPeriod = RecurrenceEdit::DAILY; break;
case 2: Preferences::mDefaultRecurPeriod = RecurrenceEdit::SUBDAILY; break;
case 1: Preferences::mDefaultRecurPeriod = RecurrenceEdit::AT_LOGIN; break;
case 0:
default: Preferences::mDefaultRecurPeriod = RecurrenceEdit::NO_RECUR; break;
}
int feb29 = mFeb29->selectedId();
Preferences::mDefaultFeb29Type = (feb29 >= 0) ? static_cast<KARecurrence::Feb29Type>(feb29) : Preferences::default_defaultFeb29Type;
PrefsTabBase::apply(syncToDisc);
}
void EditPrefTab::setDefaults()
{
mAutoClose->setChecked(Preferences::default_defaultAutoClose);
mConfirmAck->setChecked(Preferences::default_defaultConfirmAck);
mReminderUnits->setCurrentItem(Preferences::default_defaultReminderUnits);
mSpecialActionsButton->setActions(Preferences::default_defaultPreAction, Preferences::default_defaultPostAction);
mSound->setCurrentItem(soundIndex(Preferences::default_defaultSoundType));
mSoundFile->setText(Preferences::default_defaultSoundFile);
#ifndef WITHOUT_ARTS
mSoundRepeat->setChecked(Preferences::default_defaultSoundRepeat);
#endif
mCmdScript->setChecked(Preferences::default_defaultCmdScript);
mCmdXterm->setChecked(Preferences::default_defaultCmdLogType == EditAlarmDlg::EXEC_IN_TERMINAL);
mEmailBcc->setChecked(Preferences::default_defaultEmailBcc);
mCopyToKOrganizer->setChecked(Preferences::default_defaultCopyToKOrganizer);
mLateCancel->setChecked(Preferences::default_defaultLateCancel);
mRecurPeriod->setCurrentItem(recurIndex(Preferences::default_defaultRecurPeriod));
mFeb29->setButton(Preferences::default_defaultFeb29Type);
}
void EditPrefTab::slotBrowseSoundFile()
{
QString defaultDir;
QString url = SoundPicker::browseFile(defaultDir, mSoundFile->text());
if (!url.isEmpty())
mSoundFile->setText(url);
}
int EditPrefTab::soundIndex(SoundPicker::Type type)
{
switch (type)
{
case SoundPicker::SPEAK: return 3;
case SoundPicker::PLAY_FILE: return 2;
case SoundPicker::BEEP: return 1;
case SoundPicker::NONE:
default: return 0;
}
}
int EditPrefTab::recurIndex(RecurrenceEdit::RepeatType type)
{
switch (type)
{
case RecurrenceEdit::ANNUAL: return 6;
case RecurrenceEdit::MONTHLY: return 5;
case RecurrenceEdit::WEEKLY: return 4;
case RecurrenceEdit::DAILY: return 3;
case RecurrenceEdit::SUBDAILY: return 2;
case RecurrenceEdit::AT_LOGIN: return 1;
case RecurrenceEdit::NO_RECUR:
default: return 0;
}
}
QString EditPrefTab::validate()
{
if (mSound->currentItem() == SoundPicker::PLAY_FILE && mSoundFile->text().isEmpty())
{
mSoundFile->setFocus();
return i18n("You must enter a sound file when %1 is selected as the default sound type").arg(SoundPicker::i18n_File());;
}
return QString::null;
}
/*=============================================================================
= Class ViewPrefTab
=============================================================================*/
ViewPrefTab::ViewPrefTab(QVBox* frame)
: PrefsTabBase(frame)
{
QGroupBox* group = new QGroupBox(i18n("System Tray Tooltip"), mPage);
QGridLayout* grid = new QGridLayout(group, 5, 3, KDialog::marginHint(), KDialog::spacingHint());
grid->setColStretch(2, 1);
grid->addColSpacing(0, indentWidth());
grid->addColSpacing(1, indentWidth());
grid->addRowSpacing(0, fontMetrics().lineSpacing()/2);
mTooltipShowAlarms = new QCheckBox(i18n("Show next &24 hours' alarms"), group, "tooltipShow");
mTooltipShowAlarms->setMinimumSize(mTooltipShowAlarms->sizeHint());
connect(mTooltipShowAlarms, SIGNAL(toggled(bool)), SLOT(slotTooltipAlarmsToggled(bool)));
QWhatsThis::add(mTooltipShowAlarms,
i18n("Specify whether to include in the system tray tooltip, a summary of alarms due in the next 24 hours"));
grid->addMultiCellWidget(mTooltipShowAlarms, 1, 1, 0, 2, Qt::AlignAuto);
QHBox* box = new QHBox(group);
box->setSpacing(KDialog::spacingHint());
mTooltipMaxAlarms = new QCheckBox(i18n("Ma&ximum number of alarms to show:"), box, "tooltipMax");
mTooltipMaxAlarms->setMinimumSize(mTooltipMaxAlarms->sizeHint());
connect(mTooltipMaxAlarms, SIGNAL(toggled(bool)), SLOT(slotTooltipMaxToggled(bool)));
mTooltipMaxAlarmCount = new SpinBox(1, 99, 1, box);
mTooltipMaxAlarmCount->setLineShiftStep(5);
mTooltipMaxAlarmCount->setMinimumSize(mTooltipMaxAlarmCount->sizeHint());
QWhatsThis::add(box,
i18n("Uncheck to display all of the next 24 hours' alarms in the system tray tooltip. "
"Check to enter an upper limit on the number to be displayed."));
grid->addMultiCellWidget(box, 2, 2, 1, 2, Qt::AlignAuto);
mTooltipShowTime = new QCheckBox(MainWindow::i18n_m_ShowAlarmTime(), group, "tooltipTime");
mTooltipShowTime->setMinimumSize(mTooltipShowTime->sizeHint());
connect(mTooltipShowTime, SIGNAL(toggled(bool)), SLOT(slotTooltipTimeToggled(bool)));
QWhatsThis::add(mTooltipShowTime,
i18n("Specify whether to show in the system tray tooltip, the time at which each alarm is due"));
grid->addMultiCellWidget(mTooltipShowTime, 3, 3, 1, 2, Qt::AlignAuto);
mTooltipShowTimeTo = new QCheckBox(MainWindow::i18n_l_ShowTimeToAlarm(), group, "tooltipTimeTo");
mTooltipShowTimeTo->setMinimumSize(mTooltipShowTimeTo->sizeHint());
connect(mTooltipShowTimeTo, SIGNAL(toggled(bool)), SLOT(slotTooltipTimeToToggled(bool)));
QWhatsThis::add(mTooltipShowTimeTo,
i18n("Specify whether to show in the system tray tooltip, how long until each alarm is due"));
grid->addMultiCellWidget(mTooltipShowTimeTo, 4, 4, 1, 2, Qt::AlignAuto);
box = new QHBox(group); // this is to control the QWhatsThis text display area
box->setSpacing(KDialog::spacingHint());
mTooltipTimeToPrefixLabel = new QLabel(i18n("&Prefix:"), box);
mTooltipTimeToPrefixLabel->setFixedSize(mTooltipTimeToPrefixLabel->sizeHint());
mTooltipTimeToPrefix = new QLineEdit(box);
mTooltipTimeToPrefixLabel->setBuddy(mTooltipTimeToPrefix);
QWhatsThis::add(box,
i18n("Enter the text to be displayed in front of the time until the alarm, in the system tray tooltip"));
box->setFixedHeight(box->sizeHint().height());
grid->addWidget(box, 5, 2, Qt::AlignAuto);
group->setMaximumHeight(group->sizeHint().height());
mModalMessages = new QCheckBox(i18n("Message &windows have a title bar and take keyboard focus"), mPage, "modalMsg");
mModalMessages->setMinimumSize(mModalMessages->sizeHint());
QWhatsThis::add(mModalMessages,
i18n("Specify the characteristics of alarm message windows:\n"
"- If checked, the window is a normal window with a title bar, which grabs keyboard input when it is displayed.\n"
"- If unchecked, the window does not interfere with your typing when "
"it is displayed, but it has no title bar and cannot be moved or resized."));
QHBox* itemBox = new QHBox(mPage); // this is to control the QWhatsThis text display area
box = new QHBox(itemBox);
box->setSpacing(KDialog::spacingHint());
QLabel* label = new QLabel(i18n("System tray icon &update interval:"), box);
mDaemonTrayCheckInterval = new SpinBox(1, 9999, 1, box, "daemonCheck");
mDaemonTrayCheckInterval->setLineShiftStep(10);
mDaemonTrayCheckInterval->setMinimumSize(mDaemonTrayCheckInterval->sizeHint());
label->setBuddy(mDaemonTrayCheckInterval);
label = new QLabel(i18n("seconds"), box);
QWhatsThis::add(box,
i18n("How often to update the system tray icon to indicate whether or not the Alarm Daemon is monitoring alarms."));
itemBox->setStretchFactor(new QWidget(itemBox), 1); // left adjust the controls
itemBox->setFixedHeight(box->sizeHint().height());
mPage->setStretchFactor(new QWidget(mPage), 1); // top adjust the widgets
}
void ViewPrefTab::restore()
{
setTooltip(Preferences::mTooltipAlarmCount,
Preferences::mShowTooltipAlarmTime,
Preferences::mShowTooltipTimeToAlarm,
Preferences::mTooltipTimeToPrefix);
mModalMessages->setChecked(Preferences::mModalMessages);
mDaemonTrayCheckInterval->setValue(Preferences::mDaemonTrayCheckInterval);
}
void ViewPrefTab::apply(bool syncToDisc)
{
int n = mTooltipShowAlarms->isChecked() ? -1 : 0;
if (n && mTooltipMaxAlarms->isChecked())
n = mTooltipMaxAlarmCount->value();
Preferences::mTooltipAlarmCount = n;
Preferences::mShowTooltipAlarmTime = mTooltipShowTime->isChecked();
Preferences::mShowTooltipTimeToAlarm = mTooltipShowTimeTo->isChecked();
Preferences::mTooltipTimeToPrefix = mTooltipTimeToPrefix->text();
Preferences::mModalMessages = mModalMessages->isChecked();
Preferences::mDaemonTrayCheckInterval = mDaemonTrayCheckInterval->value();
PrefsTabBase::apply(syncToDisc);
}
void ViewPrefTab::setDefaults()
{
setTooltip(Preferences::default_tooltipAlarmCount,
Preferences::default_showTooltipAlarmTime,
Preferences::default_showTooltipTimeToAlarm,
Preferences::default_tooltipTimeToPrefix);
mModalMessages->setChecked(Preferences::default_modalMessages);
mDaemonTrayCheckInterval->setValue(Preferences::default_daemonTrayCheckInterval);
}
void ViewPrefTab::setTooltip(int maxAlarms, bool time, bool timeTo, const QString& prefix)
{
if (!timeTo)
time = true; // ensure that at least one time option is ticked
// Set the states of the controls without calling signal
// handlers, since these could change the checkboxes' states.
mTooltipShowAlarms->blockSignals(true);
mTooltipShowTime->blockSignals(true);
mTooltipShowTimeTo->blockSignals(true);
mTooltipShowAlarms->setChecked(maxAlarms);
mTooltipMaxAlarms->setChecked(maxAlarms > 0);
mTooltipMaxAlarmCount->setValue(maxAlarms > 0 ? maxAlarms : 1);
mTooltipShowTime->setChecked(time);
mTooltipShowTimeTo->setChecked(timeTo);
mTooltipTimeToPrefix->setText(prefix);
mTooltipShowAlarms->blockSignals(false);
mTooltipShowTime->blockSignals(false);
mTooltipShowTimeTo->blockSignals(false);
// Enable/disable controls according to their states
slotTooltipTimeToToggled(timeTo);
slotTooltipAlarmsToggled(maxAlarms);
}
void ViewPrefTab::slotTooltipAlarmsToggled(bool on)
{
mTooltipMaxAlarms->setEnabled(on);
mTooltipMaxAlarmCount->setEnabled(on && mTooltipMaxAlarms->isChecked());
mTooltipShowTime->setEnabled(on);
mTooltipShowTimeTo->setEnabled(on);
on = on && mTooltipShowTimeTo->isChecked();
mTooltipTimeToPrefix->setEnabled(on);
mTooltipTimeToPrefixLabel->setEnabled(on);
}
void ViewPrefTab::slotTooltipMaxToggled(bool on)
{
mTooltipMaxAlarmCount->setEnabled(on && mTooltipMaxAlarms->isEnabled());
}
void ViewPrefTab::slotTooltipTimeToggled(bool on)
{
if (!on && !mTooltipShowTimeTo->isChecked())
mTooltipShowTimeTo->setChecked(true);
}
void ViewPrefTab::slotTooltipTimeToToggled(bool on)
{
if (!on && !mTooltipShowTime->isChecked())
mTooltipShowTime->setChecked(true);
on = on && mTooltipShowTimeTo->isEnabled();
mTooltipTimeToPrefix->setEnabled(on);
mTooltipTimeToPrefixLabel->setEnabled(on);
}