kalarm

preferences.cpp

00001 /*
00002  *  preferences.cpp  -  program preference settings
00003  *  Program:  kalarm
00004  *  Copyright © 2001-2007 by David Jarvie <software@astrojar.org.uk>
00005  *
00006  *  This program is free software; you can redistribute it and/or modify
00007  *  it under the terms of the GNU General Public License as published by
00008  *  the Free Software Foundation; either version 2 of the License, or
00009  *  (at your option) any later version.
00010  *
00011  *  This program is distributed in the hope that it will be useful,
00012  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00013  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
00014  *  GNU General Public License for more details.
00015  *
00016  *  You should have received a copy of the GNU General Public License along
00017  *  with this program; if not, write to the Free Software Foundation, Inc.,
00018  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
00019  */
00020 
00021 #include "kalarm.h"
00022 
00023 #include <kglobal.h>
00024 #include <kconfig.h>
00025 #include <kstandarddirs.h>
00026 #include <kapplication.h>
00027 #include <kglobalsettings.h>
00028 #include <kmessagebox.h>
00029 
00030 #include <libkpimidentities/identity.h>
00031 #include <libkpimidentities/identitymanager.h>
00032 
00033 #include "daemon.h"
00034 #include "functions.h"
00035 #include "kamail.h"
00036 #include "messagebox.h"
00037 #include "preferences.moc"
00038 
00039 
00040 static QString translateXTermPath(KConfig*, const QString& cmdline, bool write);
00041 
00042 Preferences* Preferences::mInstance = 0;
00043 
00044 // Default config file settings
00045 QColor defaultMessageColours[] = { Qt::red, Qt::green, Qt::blue, Qt::cyan, Qt::magenta, Qt::yellow, Qt::white, Qt::lightGray, Qt::black, QColor() };
00046 const ColourList                 Preferences::default_messageColours(defaultMessageColours);
00047 const QColor                     Preferences::default_defaultBgColour(Qt::red);
00048 const QColor                     Preferences::default_defaultFgColour(Qt::black);
00049 QFont                            Preferences::mDefault_messageFont;    // initialised in constructor
00050 const QTime                      Preferences::default_startOfDay(0, 0);
00051 const bool                       Preferences::default_runInSystemTray         = true;
00052 const bool                       Preferences::default_disableAlarmsIfStopped  = true;
00053 const bool                       Preferences::default_quitWarn                = true;
00054 const bool                       Preferences::default_autostartTrayIcon       = true;
00055 const bool                       Preferences::default_confirmAlarmDeletion    = true;
00056 const bool                       Preferences::default_modalMessages           = true;
00057 const int                        Preferences::default_messageButtonDelay      = 0;     // (seconds)
00058 const bool                       Preferences::default_showExpiredAlarms       = false;
00059 const bool                       Preferences::default_showAlarmTime           = true;
00060 const bool                       Preferences::default_showTimeToAlarm         = false;
00061 const int                        Preferences::default_tooltipAlarmCount       = 5;
00062 const bool                       Preferences::default_showTooltipAlarmTime    = true;
00063 const bool                       Preferences::default_showTooltipTimeToAlarm  = true;
00064 const QString                    Preferences::default_tooltipTimeToPrefix     = QString::fromLatin1("+");
00065 const int                        Preferences::default_daemonTrayCheckInterval = 10;     // (seconds)
00066 const bool                       Preferences::default_emailCopyToKMail        = false;
00067 const bool                       Preferences::default_emailQueuedNotify       = false;
00068 const QColor                     Preferences::default_disabledColour(Qt::lightGray);
00069 const QColor                     Preferences::default_expiredColour(Qt::darkRed);
00070 const int                        Preferences::default_expiredKeepDays         = 7;
00071 const QString                    Preferences::default_defaultSoundFile        = QString::null;
00072 const float                      Preferences::default_defaultSoundVolume      = -1;
00073 const int                        Preferences::default_defaultLateCancel       = 0;
00074 const bool                       Preferences::default_defaultAutoClose        = false;
00075 const bool                       Preferences::default_defaultCopyToKOrganizer = false;
00076 const bool                       Preferences::default_defaultSoundRepeat      = false;
00077 const SoundPicker::Type          Preferences::default_defaultSoundType        = SoundPicker::NONE;
00078 const bool                       Preferences::default_defaultConfirmAck       = false;
00079 const bool                       Preferences::default_defaultCmdScript        = false;
00080 const EditAlarmDlg::CmdLogType   Preferences::default_defaultCmdLogType       = EditAlarmDlg::DISCARD_OUTPUT;
00081 const bool                       Preferences::default_defaultEmailBcc         = false;
00082 const QString                    Preferences::default_emailAddress            = QString::null;
00083 const QString                    Preferences::default_emailBccAddress         = QString::null;
00084 const Preferences::MailClient    Preferences::default_emailClient             = KMAIL;
00085 const Preferences::MailFrom      Preferences::default_emailBccFrom            = MAIL_FROM_CONTROL_CENTRE;
00086 const RecurrenceEdit::RepeatType Preferences::default_defaultRecurPeriod      = RecurrenceEdit::NO_RECUR;
00087 const KARecurrence::Feb29Type    Preferences::default_defaultFeb29Type        = KARecurrence::FEB29_MAR1;
00088 const TimePeriod::Units          Preferences::default_defaultReminderUnits    = TimePeriod::HOURS_MINUTES;
00089 const QString                    Preferences::default_defaultPreAction;
00090 const QString                    Preferences::default_defaultPostAction;
00091 
00092 Preferences::MailFrom Preferences::default_emailFrom()
00093 {
00094     return KAMail::identitiesExist() ? MAIL_FROM_KMAIL : MAIL_FROM_CONTROL_CENTRE;
00095 }
00096 
00097 // Active config file settings
00098 ColourList                 Preferences::mMessageColours;
00099 QColor                     Preferences::mDefaultBgColour;
00100 QFont                      Preferences::mMessageFont;
00101 QTime                      Preferences::mStartOfDay;
00102 bool                       Preferences::mRunInSystemTray;
00103 bool                       Preferences::mDisableAlarmsIfStopped;
00104 bool                       Preferences::mAutostartTrayIcon;
00105 KARecurrence::Feb29Type    Preferences::mDefaultFeb29Type;
00106 bool                       Preferences::mModalMessages;
00107 int                        Preferences::mMessageButtonDelay;
00108 bool                       Preferences::mShowExpiredAlarms;
00109 bool                       Preferences::mShowAlarmTime;
00110 bool                       Preferences::mShowTimeToAlarm;
00111 int                        Preferences::mTooltipAlarmCount;
00112 bool                       Preferences::mShowTooltipAlarmTime;
00113 bool                       Preferences::mShowTooltipTimeToAlarm;
00114 QString                    Preferences::mTooltipTimeToPrefix;
00115 int                        Preferences::mDaemonTrayCheckInterval;
00116 QString                    Preferences::mEmailAddress;
00117 QString                    Preferences::mEmailBccAddress;
00118 Preferences::MailClient    Preferences::mEmailClient;
00119 Preferences::MailFrom      Preferences::mEmailFrom;
00120 Preferences::MailFrom      Preferences::mEmailBccFrom;
00121 bool                       Preferences::mEmailCopyToKMail;
00122 QString                    Preferences::mCmdXTermCommand;
00123 QColor                     Preferences::mDisabledColour;
00124 QColor                     Preferences::mExpiredColour;
00125 int                        Preferences::mExpiredKeepDays;
00126 // Default settings for Edit Alarm dialog
00127 QString                    Preferences::mDefaultSoundFile;
00128 float                      Preferences::mDefaultSoundVolume;
00129 int                        Preferences::mDefaultLateCancel;
00130 bool                       Preferences::mDefaultAutoClose;
00131 bool                       Preferences::mDefaultCopyToKOrganizer;
00132 SoundPicker::Type          Preferences::mDefaultSoundType;
00133 bool                       Preferences::mDefaultSoundRepeat;
00134 bool                       Preferences::mDefaultConfirmAck;
00135 bool                       Preferences::mDefaultEmailBcc;
00136 bool                       Preferences::mDefaultCmdScript;
00137 EditAlarmDlg::CmdLogType   Preferences::mDefaultCmdLogType;
00138 QString                    Preferences::mDefaultCmdLogFile;
00139 RecurrenceEdit::RepeatType Preferences::mDefaultRecurPeriod;
00140 TimePeriod::Units          Preferences::mDefaultReminderUnits;
00141 QString                    Preferences::mDefaultPreAction;
00142 QString                    Preferences::mDefaultPostAction;
00143 // Change tracking
00144 QTime                      Preferences::mOldStartOfDay;
00145 bool                       Preferences::mStartOfDayChanged;
00146 
00147 
00148 static const QString defaultFeb29RecurType    = QString::fromLatin1("Mar1");
00149 static const QString defaultEmailClient       = QString::fromLatin1("kmail");
00150 
00151 // Config file entry names
00152 static const QString GENERAL_SECTION          = QString::fromLatin1("General");
00153 static const QString VERSION_NUM              = QString::fromLatin1("Version");
00154 static const QString MESSAGE_COLOURS          = QString::fromLatin1("MessageColours");
00155 static const QString MESSAGE_BG_COLOUR        = QString::fromLatin1("MessageBackgroundColour");
00156 static const QString MESSAGE_FONT             = QString::fromLatin1("MessageFont");
00157 static const QString RUN_IN_SYSTEM_TRAY       = QString::fromLatin1("RunInSystemTray");
00158 static const QString DISABLE_IF_STOPPED       = QString::fromLatin1("DisableAlarmsIfStopped");
00159 static const QString AUTOSTART_TRAY           = QString::fromLatin1("AutostartTray");
00160 static const QString FEB29_RECUR_TYPE         = QString::fromLatin1("Feb29Recur");
00161 static const QString MODAL_MESSAGES           = QString::fromLatin1("ModalMessages");
00162 static const QString MESSAGE_BUTTON_DELAY     = QString::fromLatin1("MessageButtonDelay");
00163 static const QString SHOW_EXPIRED_ALARMS      = QString::fromLatin1("ShowExpiredAlarms");
00164 static const QString SHOW_ALARM_TIME          = QString::fromLatin1("ShowAlarmTime");
00165 static const QString SHOW_TIME_TO_ALARM       = QString::fromLatin1("ShowTimeToAlarm");
00166 static const QString TOOLTIP_ALARM_COUNT      = QString::fromLatin1("TooltipAlarmCount");
00167 static const QString TOOLTIP_ALARM_TIME       = QString::fromLatin1("ShowTooltipAlarmTime");
00168 static const QString TOOLTIP_TIME_TO_ALARM    = QString::fromLatin1("ShowTooltipTimeToAlarm");
00169 static const QString TOOLTIP_TIME_TO_PREFIX   = QString::fromLatin1("TooltipTimeToPrefix");
00170 static const QString DAEMON_TRAY_INTERVAL     = QString::fromLatin1("DaemonTrayCheckInterval");
00171 static const QString EMAIL_CLIENT             = QString::fromLatin1("EmailClient");
00172 static const QString EMAIL_COPY_TO_KMAIL      = QString::fromLatin1("EmailCopyToKMail");
00173 static const QString EMAIL_FROM               = QString::fromLatin1("EmailFrom");
00174 static const QString EMAIL_BCC_ADDRESS        = QString::fromLatin1("EmailBccAddress");
00175 static const QString CMD_XTERM_COMMAND        = QString::fromLatin1("CmdXTerm");
00176 static const QString START_OF_DAY             = QString::fromLatin1("StartOfDay");
00177 static const QString START_OF_DAY_CHECK       = QString::fromLatin1("Sod");
00178 static const QString DISABLED_COLOUR          = QString::fromLatin1("DisabledColour");
00179 static const QString EXPIRED_COLOUR           = QString::fromLatin1("ExpiredColour");
00180 static const QString EXPIRED_KEEP_DAYS        = QString::fromLatin1("ExpiredKeepDays");
00181 static const QString DEFAULTS_SECTION         = QString::fromLatin1("Defaults");
00182 static const QString DEF_LATE_CANCEL          = QString::fromLatin1("DefLateCancel");
00183 static const QString DEF_AUTO_CLOSE           = QString::fromLatin1("DefAutoClose");
00184 static const QString DEF_CONFIRM_ACK          = QString::fromLatin1("DefConfirmAck");
00185 static const QString DEF_COPY_TO_KORG         = QString::fromLatin1("DefCopyKOrg");
00186 static const QString DEF_SOUND_TYPE           = QString::fromLatin1("DefSoundType");
00187 static const QString DEF_SOUND_FILE           = QString::fromLatin1("DefSoundFile");
00188 static const QString DEF_SOUND_VOLUME         = QString::fromLatin1("DefSoundVolume");
00189 static const QString DEF_SOUND_REPEAT         = QString::fromLatin1("DefSoundRepeat");
00190 static const QString DEF_CMD_SCRIPT           = QString::fromLatin1("DefCmdScript");
00191 static const QString DEF_CMD_LOG_TYPE         = QString::fromLatin1("DefCmdLogType");
00192 static const QString DEF_LOG_FILE             = QString::fromLatin1("DefLogFile");
00193 static const QString DEF_EMAIL_BCC            = QString::fromLatin1("DefEmailBcc");
00194 static const QString DEF_RECUR_PERIOD         = QString::fromLatin1("DefRecurPeriod");
00195 static const QString DEF_REMIND_UNITS         = QString::fromLatin1("DefRemindUnits");
00196 static const QString DEF_PRE_ACTION           = QString::fromLatin1("DefPreAction");
00197 static const QString DEF_POST_ACTION          = QString::fromLatin1("DefPostAction");
00198 
00199 // Config file entry name for temporary use
00200 static const QString TEMP                     = QString::fromLatin1("Temp");
00201 
00202 // Values for EmailFrom entry
00203 static const QString FROM_CONTROL_CENTRE      = QString::fromLatin1("@ControlCenter");
00204 static const QString FROM_KMAIL               = QString::fromLatin1("@KMail");
00205 
00206 // Config file entry names for notification messages
00207 const QString Preferences::QUIT_WARN              = QString::fromLatin1("QuitWarn");
00208 const QString Preferences::CONFIRM_ALARM_DELETION = QString::fromLatin1("ConfirmAlarmDeletion");
00209 const QString Preferences::EMAIL_QUEUED_NOTIFY    = QString::fromLatin1("EmailQueuedNotify");
00210 
00211 static const int SODxor = 0x82451630;
00212 inline int Preferences::startOfDayCheck()
00213 {
00214     // Combine with a 'random' constant to prevent 'clever' people fiddling the
00215     // value, and thereby screwing things up.
00216     return QTime().msecsTo(mStartOfDay) ^ SODxor;
00217 }
00218 
00219 
00220 void Preferences::initialise()
00221 {
00222     if (!mInstance)
00223     {
00224         // Initialise static variables here to avoid static initialisation
00225         // sequencing errors.
00226         mDefault_messageFont = QFont(KGlobalSettings::generalFont().family(), 16, QFont::Bold);
00227 
00228         mInstance = new Preferences;
00229 
00230         convertOldPrefs();    // convert preferences written by previous KAlarm versions
00231         read();
00232 
00233         // Set the default button for the Quit warning message box to Cancel
00234         MessageBox::setContinueDefault(QUIT_WARN, KMessageBox::Cancel);
00235         MessageBox::setDefaultShouldBeShownContinue(QUIT_WARN, default_quitWarn);
00236         MessageBox::setDefaultShouldBeShownContinue(EMAIL_QUEUED_NOTIFY, default_emailQueuedNotify);
00237         MessageBox::setDefaultShouldBeShownContinue(CONFIRM_ALARM_DELETION, default_confirmAlarmDeletion);
00238     }
00239 }
00240 
00241 void Preferences::connect(const char* signal, const QObject* receiver, const char* member)
00242 {
00243     initialise();
00244     QObject::connect(mInstance, signal, receiver, member);
00245 }
00246 
00247 void Preferences::emitStartOfDayChanged()
00248 {
00249     emit startOfDayChanged(mOldStartOfDay);
00250 }
00251 
00252 void Preferences::emitPreferencesChanged()
00253 {
00254     emit preferencesChanged();
00255 }
00256 
00257 /******************************************************************************
00258 * Read preference values from the config file.
00259 */
00260 void Preferences::read()
00261 {
00262     initialise();
00263 
00264     KConfig* config = KGlobal::config();
00265     config->setGroup(GENERAL_SECTION);
00266     QStringList cols = config->readListEntry(MESSAGE_COLOURS);
00267     if (!cols.count())
00268         mMessageColours = default_messageColours;
00269     else
00270     {
00271         mMessageColours.clear();
00272         for (QStringList::Iterator it = cols.begin();  it != cols.end();  ++it)
00273         {
00274             QColor c((*it));
00275             if (c.isValid())
00276                 mMessageColours.insert(c);
00277         }
00278     }
00279     mDefaultBgColour          = config->readColorEntry(MESSAGE_BG_COLOUR, &default_defaultBgColour);
00280     mMessageFont              = config->readFontEntry(MESSAGE_FONT, &mDefault_messageFont);
00281     mRunInSystemTray          = config->readBoolEntry(RUN_IN_SYSTEM_TRAY, default_runInSystemTray);
00282     mDisableAlarmsIfStopped   = config->readBoolEntry(DISABLE_IF_STOPPED, default_disableAlarmsIfStopped);
00283     mAutostartTrayIcon        = config->readBoolEntry(AUTOSTART_TRAY, default_autostartTrayIcon);
00284     mModalMessages            = config->readBoolEntry(MODAL_MESSAGES, default_modalMessages);
00285     mMessageButtonDelay       = config->readNumEntry(MESSAGE_BUTTON_DELAY, default_messageButtonDelay);
00286     if (mMessageButtonDelay > 10)
00287         mMessageButtonDelay = 10;    // prevent windows being unusable for a long time
00288     if (mMessageButtonDelay < -1)
00289         mMessageButtonDelay = -1;
00290     mShowExpiredAlarms        = config->readBoolEntry(SHOW_EXPIRED_ALARMS, default_showExpiredAlarms);
00291     mShowTimeToAlarm          = config->readBoolEntry(SHOW_TIME_TO_ALARM, default_showTimeToAlarm);
00292     mShowAlarmTime            = !mShowTimeToAlarm ? true : config->readBoolEntry(SHOW_ALARM_TIME, default_showAlarmTime);
00293     mTooltipAlarmCount        = static_cast<int>(config->readUnsignedNumEntry(TOOLTIP_ALARM_COUNT, default_tooltipAlarmCount));
00294     if (mTooltipAlarmCount < 1)
00295         mTooltipAlarmCount = 1;
00296     mShowTooltipAlarmTime     = config->readBoolEntry(TOOLTIP_ALARM_TIME, default_showTooltipAlarmTime);
00297     mShowTooltipTimeToAlarm   = config->readBoolEntry(TOOLTIP_TIME_TO_ALARM, default_showTooltipTimeToAlarm);
00298     mTooltipTimeToPrefix      = config->readEntry(TOOLTIP_TIME_TO_PREFIX, default_tooltipTimeToPrefix);
00299     mDaemonTrayCheckInterval  = static_cast<int>(config->readUnsignedNumEntry(DAEMON_TRAY_INTERVAL, default_daemonTrayCheckInterval));
00300     if (mDaemonTrayCheckInterval < 1)
00301         mDaemonTrayCheckInterval = 1;
00302     QCString client           = config->readEntry(EMAIL_CLIENT, defaultEmailClient).local8Bit();  // don't use readPathEntry() here (values are hard-coded)
00303     mEmailClient              = (client == "sendmail" ? SENDMAIL : KMAIL);
00304     mEmailCopyToKMail         = config->readBoolEntry(EMAIL_COPY_TO_KMAIL, default_emailCopyToKMail);
00305     QString from              = config->readEntry(EMAIL_FROM, emailFrom(default_emailFrom(), false, false));
00306     mEmailFrom                = emailFrom(from);
00307     QString bccFrom           = config->readEntry(EMAIL_BCC_ADDRESS, emailFrom(default_emailBccFrom, false, true));
00308     mEmailBccFrom             = emailFrom(bccFrom);
00309     if (mEmailFrom == MAIL_FROM_CONTROL_CENTRE  ||  mEmailBccFrom == MAIL_FROM_CONTROL_CENTRE)
00310         mEmailAddress = mEmailBccAddress = KAMail::controlCentreAddress();
00311     if (mEmailFrom == MAIL_FROM_ADDR)
00312         mEmailAddress     = from;
00313     if (mEmailBccFrom == MAIL_FROM_ADDR)
00314         mEmailBccAddress  = bccFrom;
00315     mCmdXTermCommand          = translateXTermPath(config, config->readEntry(CMD_XTERM_COMMAND), false);
00316     QDateTime defStartOfDay(QDate(1900,1,1), default_startOfDay);
00317     mStartOfDay               = config->readDateTimeEntry(START_OF_DAY, &defStartOfDay).time();
00318     mOldStartOfDay.setHMS(0,0,0);
00319     int sod = config->readNumEntry(START_OF_DAY_CHECK, 0);
00320     if (sod)
00321         mOldStartOfDay    = mOldStartOfDay.addMSecs(sod ^ SODxor);
00322     mDisabledColour           = config->readColorEntry(DISABLED_COLOUR, &default_disabledColour);
00323     mExpiredColour            = config->readColorEntry(EXPIRED_COLOUR, &default_expiredColour);
00324     mExpiredKeepDays          = config->readNumEntry(EXPIRED_KEEP_DAYS, default_expiredKeepDays);
00325 
00326     config->setGroup(DEFAULTS_SECTION);
00327     mDefaultLateCancel        = static_cast<int>(config->readUnsignedNumEntry(DEF_LATE_CANCEL, default_defaultLateCancel));
00328     mDefaultAutoClose         = config->readBoolEntry(DEF_AUTO_CLOSE, default_defaultAutoClose);
00329     mDefaultConfirmAck        = config->readBoolEntry(DEF_CONFIRM_ACK, default_defaultConfirmAck);
00330     mDefaultCopyToKOrganizer  = config->readBoolEntry(DEF_COPY_TO_KORG, default_defaultCopyToKOrganizer);
00331     int soundType             = config->readNumEntry(DEF_SOUND_TYPE, default_defaultSoundType);
00332     mDefaultSoundType         = (soundType < 0 || soundType > SoundPicker::SPEAK)
00333                               ? default_defaultSoundType : (SoundPicker::Type)soundType;
00334     mDefaultSoundVolume       = static_cast<float>(config->readDoubleNumEntry(DEF_SOUND_VOLUME, default_defaultSoundVolume));
00335 #ifdef WITHOUT_ARTS
00336     mDefaultSoundRepeat       = false;
00337 #else
00338     mDefaultSoundRepeat       = config->readBoolEntry(DEF_SOUND_REPEAT, default_defaultSoundRepeat);
00339 #endif
00340     mDefaultSoundFile         = config->readPathEntry(DEF_SOUND_FILE);
00341     mDefaultCmdScript         = config->readBoolEntry(DEF_CMD_SCRIPT, default_defaultCmdScript);
00342     int logType               = config->readNumEntry(DEF_CMD_LOG_TYPE, default_defaultCmdLogType);
00343     mDefaultCmdLogType        = (logType < EditAlarmDlg::DISCARD_OUTPUT || logType > EditAlarmDlg::EXEC_IN_TERMINAL)
00344                               ? default_defaultCmdLogType : (EditAlarmDlg::CmdLogType)logType;
00345     mDefaultCmdLogFile        = config->readPathEntry(DEF_LOG_FILE);
00346     mDefaultEmailBcc          = config->readBoolEntry(DEF_EMAIL_BCC, default_defaultEmailBcc);
00347     int recurPeriod           = config->readNumEntry(DEF_RECUR_PERIOD, default_defaultRecurPeriod);
00348     mDefaultRecurPeriod       = (recurPeriod < RecurrenceEdit::SUBDAILY || recurPeriod > RecurrenceEdit::ANNUAL)
00349                               ? default_defaultRecurPeriod : (RecurrenceEdit::RepeatType)recurPeriod;
00350     QCString feb29            = config->readEntry(FEB29_RECUR_TYPE, defaultFeb29RecurType).local8Bit();
00351     mDefaultFeb29Type         = (feb29 == "Mar1") ? KARecurrence::FEB29_MAR1 : (feb29 == "Feb28") ? KARecurrence::FEB29_FEB28 : KARecurrence::FEB29_FEB29;
00352     int reminderUnits         = config->readNumEntry(DEF_REMIND_UNITS, default_defaultReminderUnits);
00353     mDefaultReminderUnits     = (reminderUnits < TimePeriod::HOURS_MINUTES || reminderUnits > TimePeriod::WEEKS)
00354                               ? default_defaultReminderUnits : (TimePeriod::Units)reminderUnits;
00355     mDefaultPreAction         = config->readEntry(DEF_PRE_ACTION, default_defaultPreAction);
00356     mDefaultPostAction        = config->readEntry(DEF_POST_ACTION, default_defaultPostAction);
00357     mInstance->emitPreferencesChanged();
00358     mStartOfDayChanged = (mStartOfDay != mOldStartOfDay);
00359     if (mStartOfDayChanged)
00360     {
00361         mInstance->emitStartOfDayChanged();
00362         mOldStartOfDay = mStartOfDay;
00363     }
00364 }
00365 
00366 /******************************************************************************
00367 * Save preference values to the config file.
00368 */
00369 void Preferences::save(bool syncToDisc)
00370 {
00371     KConfig* config = KGlobal::config();
00372     config->setGroup(GENERAL_SECTION);
00373     config->writeEntry(VERSION_NUM, KALARM_VERSION);
00374     QStringList colours;
00375     for (ColourList::const_iterator it = mMessageColours.begin();  it != mMessageColours.end();  ++it)
00376         colours.append(QColor(*it).name());
00377     config->writeEntry(MESSAGE_COLOURS, colours);
00378     config->writeEntry(MESSAGE_BG_COLOUR, mDefaultBgColour);
00379     config->writeEntry(MESSAGE_FONT, mMessageFont);
00380     config->writeEntry(RUN_IN_SYSTEM_TRAY, mRunInSystemTray);
00381     config->writeEntry(DISABLE_IF_STOPPED, mDisableAlarmsIfStopped);
00382     config->writeEntry(AUTOSTART_TRAY, mAutostartTrayIcon);
00383     config->writeEntry(MODAL_MESSAGES, mModalMessages);
00384     config->writeEntry(MESSAGE_BUTTON_DELAY, mMessageButtonDelay);
00385     config->writeEntry(SHOW_EXPIRED_ALARMS, mShowExpiredAlarms);
00386     config->writeEntry(SHOW_ALARM_TIME, mShowAlarmTime);
00387     config->writeEntry(SHOW_TIME_TO_ALARM, mShowTimeToAlarm);
00388     config->writeEntry(TOOLTIP_ALARM_COUNT, mTooltipAlarmCount);
00389     config->writeEntry(TOOLTIP_ALARM_TIME, mShowTooltipAlarmTime);
00390     config->writeEntry(TOOLTIP_TIME_TO_ALARM, mShowTooltipTimeToAlarm);
00391     config->writeEntry(TOOLTIP_TIME_TO_PREFIX, mTooltipTimeToPrefix);
00392     config->writeEntry(DAEMON_TRAY_INTERVAL, mDaemonTrayCheckInterval);
00393     config->writeEntry(EMAIL_CLIENT, (mEmailClient == SENDMAIL ? "sendmail" : "kmail"));
00394     config->writeEntry(EMAIL_COPY_TO_KMAIL, mEmailCopyToKMail);
00395     config->writeEntry(EMAIL_FROM, emailFrom(mEmailFrom, true, false));
00396     config->writeEntry(EMAIL_BCC_ADDRESS, emailFrom(mEmailBccFrom, true, true));
00397     config->writeEntry(CMD_XTERM_COMMAND, translateXTermPath(config, mCmdXTermCommand, true));
00398     config->writeEntry(START_OF_DAY, QDateTime(QDate(1900,1,1), mStartOfDay));
00399     // Start-of-day check value is only written once the start-of-day time has been processed.
00400     config->writeEntry(DISABLED_COLOUR, mDisabledColour);
00401     config->writeEntry(EXPIRED_COLOUR, mExpiredColour);
00402     config->writeEntry(EXPIRED_KEEP_DAYS, mExpiredKeepDays);
00403 
00404     config->setGroup(DEFAULTS_SECTION);
00405     config->writeEntry(DEF_LATE_CANCEL, mDefaultLateCancel);
00406     config->writeEntry(DEF_AUTO_CLOSE, mDefaultAutoClose);
00407     config->writeEntry(DEF_CONFIRM_ACK, mDefaultConfirmAck);
00408     config->writeEntry(DEF_COPY_TO_KORG, mDefaultCopyToKOrganizer);
00409     config->writeEntry(DEF_SOUND_TYPE, mDefaultSoundType);
00410     config->writePathEntry(DEF_SOUND_FILE, mDefaultSoundFile);
00411     config->writeEntry(DEF_SOUND_VOLUME, static_cast<double>(mDefaultSoundVolume));
00412     config->writeEntry(DEF_SOUND_REPEAT, mDefaultSoundRepeat);
00413     config->writeEntry(DEF_CMD_SCRIPT, mDefaultCmdScript);
00414     config->writeEntry(DEF_CMD_LOG_TYPE, mDefaultCmdLogType);
00415     config->writePathEntry(DEF_LOG_FILE, mDefaultCmdLogFile);
00416     config->writeEntry(DEF_EMAIL_BCC, mDefaultEmailBcc);
00417     config->writeEntry(DEF_RECUR_PERIOD, mDefaultRecurPeriod);
00418     config->writeEntry(FEB29_RECUR_TYPE, (mDefaultFeb29Type == KARecurrence::FEB29_MAR1 ? "Mar1" : mDefaultFeb29Type == KARecurrence::FEB29_FEB28 ? "Feb28" : "None"));
00419     config->writeEntry(DEF_REMIND_UNITS, mDefaultReminderUnits);
00420     config->writeEntry(DEF_PRE_ACTION, mDefaultPreAction);
00421     config->writeEntry(DEF_POST_ACTION, mDefaultPostAction);
00422 
00423     if (syncToDisc)
00424         config->sync();
00425     mInstance->emitPreferencesChanged();
00426     if (mStartOfDay != mOldStartOfDay)
00427     {
00428         mInstance->emitStartOfDayChanged();
00429         mOldStartOfDay = mStartOfDay;
00430     }
00431 }
00432 
00433 void Preferences::syncToDisc()
00434 {
00435     KGlobal::config()->sync();
00436 }
00437 
00438 void Preferences::updateStartOfDayCheck()
00439 {
00440     KConfig* config = KGlobal::config();
00441     config->setGroup(GENERAL_SECTION);
00442     config->writeEntry(START_OF_DAY_CHECK, startOfDayCheck());
00443     config->sync();
00444     mStartOfDayChanged = false;
00445 }
00446 
00447 QString Preferences::emailFrom(Preferences::MailFrom from, bool useAddress, bool bcc)
00448 {
00449     switch (from)
00450     {
00451         case MAIL_FROM_KMAIL:
00452             return FROM_KMAIL;
00453         case MAIL_FROM_CONTROL_CENTRE:
00454             return FROM_CONTROL_CENTRE;
00455         case MAIL_FROM_ADDR:
00456             return useAddress ? (bcc ? mEmailBccAddress : mEmailAddress) : QString::null;
00457         default:
00458             return QString::null;
00459     }
00460 }
00461 
00462 Preferences::MailFrom Preferences::emailFrom(const QString& str)
00463 {
00464     if (str == FROM_KMAIL)
00465         return MAIL_FROM_KMAIL;
00466     if (str == FROM_CONTROL_CENTRE)
00467         return MAIL_FROM_CONTROL_CENTRE;
00468     return MAIL_FROM_ADDR;
00469 }
00470 
00471 /******************************************************************************
00472 * Get user's default 'From' email address.
00473 */
00474 QString Preferences::emailAddress()
00475 {
00476     switch (mEmailFrom)
00477     {
00478         case MAIL_FROM_KMAIL:
00479             return KAMail::identityManager()->defaultIdentity().fullEmailAddr();
00480         case MAIL_FROM_CONTROL_CENTRE:
00481             return KAMail::controlCentreAddress();
00482         case MAIL_FROM_ADDR:
00483             return mEmailAddress;
00484         default:
00485             return QString::null;
00486     }
00487 }
00488 
00489 QString Preferences::emailBccAddress()
00490 {
00491     switch (mEmailBccFrom)
00492     {
00493         case MAIL_FROM_CONTROL_CENTRE:
00494             return KAMail::controlCentreAddress();
00495         case MAIL_FROM_ADDR:
00496             return mEmailBccAddress;
00497         default:
00498             return QString::null;
00499     }
00500 }
00501 
00502 void Preferences::setEmailAddress(Preferences::MailFrom from, const QString& address)
00503 {
00504     switch (from)
00505     {
00506         case MAIL_FROM_KMAIL:
00507             break;
00508         case MAIL_FROM_CONTROL_CENTRE:
00509             mEmailAddress = KAMail::controlCentreAddress();
00510             break;
00511         case MAIL_FROM_ADDR:
00512             mEmailAddress = address;
00513             break;
00514         default:
00515             return;
00516     }
00517     mEmailFrom = from;
00518 }
00519 
00520 void Preferences::setEmailBccAddress(bool useControlCentre, const QString& address)
00521 {
00522     if (useControlCentre)
00523         mEmailBccAddress = KAMail::controlCentreAddress();
00524     else
00525         mEmailBccAddress = address;
00526     mEmailBccFrom = useControlCentre ? MAIL_FROM_CONTROL_CENTRE : MAIL_FROM_ADDR;
00527 }
00528 
00529 /******************************************************************************
00530 * Called to allow or suppress output of the specified message dialog, where the
00531 * dialog has a checkbox to turn notification off.
00532 */
00533 void Preferences::setNotify(const QString& messageID, bool notify)
00534 {
00535     MessageBox::saveDontShowAgainContinue(messageID, !notify);
00536 }
00537 
00538 /******************************************************************************
00539 * Return whether the specified message dialog is output, where the dialog has
00540 * a checkbox to turn notification off.
00541 * Reply = false if message has been suppressed (by preferences or by selecting
00542 *               "don't ask again")
00543 *       = true in all other cases.
00544 */
00545 bool Preferences::notifying(const QString& messageID)
00546 {
00547     return MessageBox::shouldBeShownContinue(messageID);
00548 }
00549 
00550 /******************************************************************************
00551 * If the preferences were written by a previous version of KAlarm, do any
00552 * necessary conversions.
00553 */
00554 void Preferences::convertOldPrefs()
00555 {
00556     KConfig* config = KGlobal::config();
00557     config->setGroup(GENERAL_SECTION);
00558     int version = KAlarm::getVersionNumber(config->readEntry(VERSION_NUM));
00559     if (version >= KAlarm::Version(1,4,6))
00560         return;     // config format is up to date
00561 
00562     // Convert KAlarm 1.4.5 preferences
00563     static const QString DEF_SOUND = QString::fromLatin1("DefSound");
00564     config->setGroup(DEFAULTS_SECTION);
00565     bool sound = config->readBoolEntry(DEF_SOUND, false);
00566     if (!sound)
00567         config->writeEntry(DEF_SOUND_TYPE, SoundPicker::NONE);
00568     config->deleteEntry(DEF_SOUND);
00569 
00570     if (version < KAlarm::Version(1,3,0))
00571     {
00572         // Convert KAlarm pre-1.3 preferences
00573         static const QString EMAIL_ADDRESS             = QString::fromLatin1("EmailAddress");
00574         static const QString EMAIL_USE_CTRL_CENTRE     = QString::fromLatin1("EmailUseControlCenter");
00575         static const QString EMAIL_BCC_USE_CTRL_CENTRE = QString::fromLatin1("EmailBccUseControlCenter");
00576         QMap<QString, QString> entries = config->entryMap(GENERAL_SECTION);
00577         if (entries.find(EMAIL_FROM) == entries.end()
00578         &&  entries.find(EMAIL_USE_CTRL_CENTRE) != entries.end())
00579         {
00580             // Preferences were written by KAlarm pre-1.2.1
00581             config->setGroup(GENERAL_SECTION);
00582             bool useCC = false;
00583             bool bccUseCC = false;
00584             const bool default_emailUseControlCentre    = true;
00585             const bool default_emailBccUseControlCentre = true;
00586             useCC = config->readBoolEntry(EMAIL_USE_CTRL_CENTRE, default_emailUseControlCentre);
00587             // EmailBccUseControlCenter was missing in preferences written by KAlarm pre-0.9.5
00588             bccUseCC = config->hasKey(EMAIL_BCC_USE_CTRL_CENTRE)
00589                      ? config->readBoolEntry(EMAIL_BCC_USE_CTRL_CENTRE, default_emailBccUseControlCentre)
00590                  : useCC;
00591             config->writeEntry(EMAIL_FROM, (useCC ? FROM_CONTROL_CENTRE : config->readEntry(EMAIL_ADDRESS)));
00592             config->writeEntry(EMAIL_BCC_ADDRESS, (bccUseCC ? FROM_CONTROL_CENTRE : config->readEntry(EMAIL_BCC_ADDRESS)));
00593             config->deleteEntry(EMAIL_ADDRESS);
00594             config->deleteEntry(EMAIL_BCC_USE_CTRL_CENTRE);
00595             config->deleteEntry(EMAIL_USE_CTRL_CENTRE);
00596         }
00597         // Convert KAlarm 1.2 preferences
00598         static const QString DEF_CMD_XTERM = QString::fromLatin1("DefCmdXterm");
00599         config->setGroup(DEFAULTS_SECTION);
00600         if (config->hasKey(DEF_CMD_XTERM))
00601         {
00602             config->writeEntry(DEF_CMD_LOG_TYPE,
00603                 (config->readBoolEntry(DEF_CMD_XTERM, false) ? EditAlarmDlg::EXEC_IN_TERMINAL : EditAlarmDlg::DISCARD_OUTPUT));
00604             config->deleteEntry(DEF_CMD_XTERM);
00605         }
00606     }
00607     config->setGroup(GENERAL_SECTION);
00608     config->writeEntry(VERSION_NUM, KALARM_VERSION);
00609     config->sync();
00610 }
00611 
00612 /******************************************************************************
00613 * Translate an X terminal command path to/from config file format.
00614 * Note that only a home directory specification at the start of the path is
00615 * translated, so there's no need to worry about missing out some of the
00616 * executable's path due to quotes etc.
00617 * N.B. Calling KConfig::read/writePathEntry() on the entire command line
00618 *      causes a crash on some systems, so it's necessary to extract the
00619 *      executable path first before processing.
00620 */
00621 QString translateXTermPath(KConfig* config, const QString& cmdline, bool write)
00622 {
00623     QString params;
00624     QString cmd = cmdline;
00625     if (cmdline.isEmpty())
00626         return cmdline;
00627     // Strip any leading quote
00628     QChar quote = cmdline[0];
00629     char q = static_cast<char>(quote);
00630     bool quoted = (q == '"' || q == '\'');
00631     if (quoted)
00632         cmd = cmdline.mid(1);
00633     // Split the command at the first non-escaped space
00634     for (int i = 0, count = cmd.length();  i < count;  ++i)
00635     {
00636         switch (cmd[i].latin1())
00637         {
00638             case '\\':
00639                 ++i;
00640                 continue;
00641             case '"':
00642             case '\'':
00643                 if (cmd[i] != quote)
00644                     continue;
00645                 // fall through to ' '
00646             case ' ':
00647                 params = cmd.mid(i);
00648                 cmd = cmd.left(i);
00649                 break;
00650             default:
00651                 continue;
00652         }
00653         break;
00654     }
00655     // Translate any home directory specification at the start of the
00656     // executable's path.
00657     if (write)
00658     {
00659         config->writePathEntry(TEMP, cmd);
00660         cmd = config->readEntry(TEMP);
00661     }
00662     else
00663     {
00664         config->writeEntry(TEMP, cmd);
00665         cmd = config->readPathEntry(TEMP);
00666     }
00667     config->deleteEntry(TEMP);
00668     if (quoted)
00669         return quote + cmd + params;
00670     else
00671         return cmd + params;
00672 }
KDE Home | KDE Accessibility Home | Description of Access Keys