diff --git a/Changelog b/Changelog index 690efca3..bd1aef39 100644 --- a/Changelog +++ b/Changelog @@ -1,1198 +1,1199 @@ KAlarm Change Log === Version 3.0.0 --- 7 June 2020 === + Provide option to use file system resources instead of Akonadi resources. + Enable selection of multiple calendar files in Import Alarms dialogue. + Show alarm calendars sorted by name in calendars list. + Return to last used tab in Configuration dialogue when it is reopened. + Fix handling of calendar update or save errors when making alarm changes. + Refactor AlarmCalendar to split out resources and display calendars. -=== Version 2.14.2 (KDE Applications 20.04.2) --- 23 May 2020 === +=== Version 2.14.2 (KDE Applications 20.04.2) --- 8 June 2020 === + Make multiple KAlarm invocations work (Qt >5.12, Frameworks >5.60) [KDE Bug 417108] + Fix failure to set no-autostart for non-KDE desktops, if a writable autostart file exists. * Fix failure to execute command alarms in a terminal window. + Fix occasional crash on opening alarm edit dialogue [KDE Bug 412181] ++ Fix wrong Undo/Redo being performed when selected from list (fixes regression introduced in 2.13.0). === Version 2.14.1 (KDE Applications 20.04.1) --- 11 May 2020 === + Correctly interpret resource IDs in command line and DBus calls. + Fix sizing and reconfiguration of columns in alarm and template lists. === Version 2.14.0 (KDE Applications 20.04) --- 27 March 2020 === + Warn user if archiving but no default archived alarms calendar is set. + Fix some error messages not being displayed. + Refactor to use generic resource classes (part 2). === Version 2.13.3 (KDE Applications 19.12.3) --- 20 February 2020 === + Fix failure of command line options requiring calendar access [KDE Bug 417108] === Version 2.13.2 (KDE Applications 19.12.2) --- 9 January 2020 === + Add Show/Hide Menubar menu option; change New Email Alarm shortcut to Ctrl-L. === Version 2.13.1 (KDE Applications 19.12.1) --- 30 December 2019 === + Make defer dialogue accessible when a full screen window is active [KDE Bug 414383] + Only show 'Cancel Deferral' in defer dialogue if a deferral is already active. === Version 2.13.0 (KDE Applications 19.12) --- 19 November 2019 === + Fix user not always being prompted to update new resource if in old format. + Terminate application after executing 'kalarm --list'. + Fix alarm type column being too wide in alarm template list. + Fix failure to display image when alarm is configured to display an image file. + Fix failure to set no-autostart for non-KDE desktops, if no autostart directory exists. + Refactor to use generic resource classes (part 1). === Version 2.12.8 (KDE Applications 19.08.3) --- 16 October 2019 === + Fix error on redo of an active alarm deletion. + Archive repeat-at-login alarms if previously triggered, when they are deleted. + Fix layout of defer alarm dialogue. + Make user settings changes take effect immediately (fixes regression introduced in 2.10.11). === Version 2.12.7 (KDE Applications 19.08.2) --- 7 October 2019 === + Show correct read-only status of an alarm in its context menu. + Fix errors deleting and reactivating alarms (regression introduced in 2.12.5). + Fix error on undo of an active alarm deletion. + Don't trigger repeat-at-login alarms when they are edited or imported. === Version 2.12.6 (KDE Applications 19.08.1) --- 26 August 2019 === + Fix crash sometimes when a resource is enabled [KDE Bug 410596] + Fix D-Bus alarm creation failing if time zone is omitted from start time [KDE Bug 411296] + Fix command line options which don't work if KAlarm not already running: --edit, --list, --triggerEvent, --cancelEvent. === Version 2.12.5 (KDE Applications 19.08) --- 26 July 2019 === + Enable alarm list columns to be hidden using context menu on list header [KDE Bug 397093] + Fix regression introduced in version 2.12.0: Show time zone abbreviation in message window if alarm time has non-local time zone. + If only one writable archived alarm calendar exists, automatically set it as the default. + Don't allow user to create a new resource using same calendar file as an existing resource. + Remove duplicate resources (i.e. which use the same calendar file) at startup [KDE Bug 403124] + Fix drag and drop of emails from KMail, and KMail button in message window. + Improve drag and drop of events and todos from KOrganizer. === Version 2.12.4 (KDE Applications 19.04.3) --- 4 July 2019 === + Fix calendar resource dialogue not configuring resource correctly [KDE Bug 407882] + Fix calendar resource dialogue creating new resources unusable until restart [KDE Bug 407882] + Enable resource after creating with the calendar resource dialogue [KDE Bug 407882] + Fix colour and alarm type columns being too wide in alarm list. === Version 2.12.3 (KDE Applications 19.04.2) --- 23 May 2019 === * Fix calendar configuration dialogue not appearing. * Fix errors creating calendar resources on first run of KAlarm [KDE Bug 407544] * Display alarm message windows within current screen in multi-head systems. === Version 2.12.2 (KDE Applications 18.08.2) --- 27 September 2018 === * Fix Defer button being disabled for recurring alarms [KDE Bug 398658] === Version 2.12.1 (KDE Applications 18.08.1) --- 18 August 2018 === * Align and right adjust 'Time to' column values in main window [KDE Bug 397130] * Remove seconds values from Time column (erroneously added in 2.12.0). === Version 2.12.0 (KDE Applications 18.08) --- 29 July 2018 === * Use KAlarmCal::KADateTime instead of deprecated KDateTime. * Remove 'clock time' option, in favour of local system time zone. * Fix times being truncated and showing ellipsis in main window [KDE Bug 365257] * Fix evaluation of work days. * Fix reminder-once alarms not being correctly loaded from calendar file. * Fix some regressions introduced in version 2.11.0, including: Make global shortcuts available. Default sound file selection dialogue to the system sound files directory. === Version 2.11.16 (KDE Applications 17.04.1) --- 15 April 2017 === * Fix option text for using default email address from KMail/System Settings [KDE Bug 378722] === Version 2.11.15 (KDE Applications 17.04) --- 15 January 2017 === * Report if terminal for command alarms is not configured. * Don't allow 'auto-hide in system tray' on Unity desktop [KDE Bug 373848] === Version 2.11.14 --- 19 February 2017 === * Fix not showing main window if activated again while already running with --tray [KDE Bug 374520] * Fix --help, --version and option errors not being reported if KAlarm is already running. * Make command options --edit-new-* work [KDE Bug 376209] === Version 2.11.13 (KDE Applications 16.12.2) --- 29 January 2017 === * Fix system tray icon used for "some alarms disabled" * Improved system tray icons (requires Plasma 5.9) [KDE Bug 362631] * Don't show misleading "Failed to update alarm" if command alarm fails [KDE Bug 375615] === Version 2.11.12 (KDE Applications 16.12.1) --- 1 January 2017 === * Fix Export Alarms file save error [KDE Bug 374337] * Fix arrow/page up/down keys not working in date edit control (needs KDE Frameworks 5.30) [KDE Bug 373886] === Version 2.11.11 (KDE Applications 16.12.0) --- 16 November 2016 === * Fix crash on exit [KDE Bug 372223] === Version 2.11.10 (KDE Applications 16.08.3) --- 31 October 2016 === * Fix default calendar files not being created on first run [KDE Bug 362962] * Fix crash when a second instance of KAlarm is started [KDE Bug 371628] * Don't output error messages about temporary files in directory calendar [KDE Bug 370627] === Version 2.11.9 (KDE Applications 16.08.1) --- 18 August 2016 === * Prevent KAlarm autostarting on non-KDE desktops if it has never been run [KDE Bug 366562] === Version 2.11.8 (KDE Applications 16.08.0) --- 13 July 2016 === * Use the default time format in alarm list and system tray status popup [KAlarm Forum: https://forum.kde.org/viewtopic.php?f=229&t=133788] === Version 2.11.7 (KDE Applications 16.04.3) --- 11 June 2016 === * Always use current setting for email sender address when sending emails [KDE Bug 359163] === Version 2.11.6 (KDE Applications 16.04.1) --- 20 April 2016 === * Prevent KAlarm autostarting on non-KDE desktops if start-at-login is disabled [KAlarm Forum: https://forum.kde.org/viewtopic.php?f=229&t=131410] === Version 2.11.5 (KDE Applications 16.04.0) --- 13 April 2016 === * Fix alarm times out by an hour in daylight savings time (needs kcalcore 16.04) [KDE Bug 336738] * Don't show spurious extra calendar after adding new calendar [KDE Bug 361543] * Fix crash when adding new calendar [KDE Bugs 361539, 361717] === Version 2.11.4 (KDE Applications 15.12.3) --- 1 February 2016 === * Fix reminder time edit being covered by 'in advance' combo [KDE Bug 357018] * Fix crash after editing an alarm, if spell check is enabled [KDE Bug 356048] * Fix occasional crash on startup [KDE Bug 358217] * Fix specification on command line of a reminder after the alarm. * Fix deferral time of date-only recurring alarms [KDE Bug 346060] * Fix frequency edit field missing from recurrence editor. === Version 2.11.3 (KDE Applications 15.08.3) --- 4 November 2015 === * Re-enable use of sendmail for email alarms. * Fix conversion error in sub-repetition interval from command line. === Version 2.11.2 (KDE Applications 15.08.2) --- 24 September 2015 === * Enable typing into New Alarm dialogue while alarm is displayed (Unity desktop) [KDE Bug 352889] === Version 2.11.1 (KDE Applications 15.08.1) --- 1 September 2015 === * Fix conversion error in sub-repetition value from command line or D-Bus command. === Version 2.11.0 (KDE Applications 15.08.0) --- 30 July 2015 === * Use KDE Frameworks. * Disable use of sendmail for email alarms, due to removal from Akonadi. === Version 2.10.12 (KDE 4.14.2) --- 30 September 2014 === * Make New Audio Alarm dialogue use sound file repeat preference setting. === Version 2.10.11 (KDE 4.14.0) --- 12 August 2014 === * [Akonadi] Fix alarms not being redisplayed after Akonadi server restarts (requires kdepimlibs 4.14.0) [KDE Bug 336942] === Version 2.10.10 (KDE 4.13.2) --- 10 May 2014 === * [Akonadi] Fix no Defer button in alarm windows restored after login [KDE Bug 334334] * Fix display of duplicate alarm windows after login. === Version 2.10.9 (KDE 4.13.1) --- 4 May 2014 === * [Akonadi] Fix no Defer button in alarm windows restored after crash [KDE Bug 334334] === Version 2.10.8 (KDE 4.12.5) --- 18 April 2014 === * [Akonadi] Fix wrong startup message about no writable active alarm calendar. * [Akonadi] Fix setting Akonadi resource read-only making it unusable (requires kdepim-runtime 4.12.5) [KDE Bug 332889] === Version 2.10.7 (KDE 4.12.4, 4.13.0) --- 21 March 2014 === * [Akonadi] Fix deletion of alarm copies from KOrganiser not working. * Fix crash after session restoration has nothing to restore [KDE Bug 331719] * Prevent data in birthday import dialogue being editable. === Version 2.10.6 (KDE 4.11.1) --- 27 August 2013 === * [Akonadi] Fix error saving template when closing Edit Template dialogue [KDE Bug 323965] === Version 2.10.5 (KDE 4.11.0) --- 3 August 2013 === * Fix memory leak whenever the edit dialogue is closed. * Fix auto-close alarms not displaying when KAlarm defaults to UTC time zone. * Fix display alarm deferral limit when KAlarm defaults to UTC time zone. === Version 2.10.4 (KDE 4.11 beta2) --- 15 June 2013 === * Show startup warning if no writable active alarm calendar is enabled [KDE Bug 316338] === Version 2.10.3 (KDE 4.10.5) --- 15 June 2013 === * Fix sound repetition pause not working in audio alarms [KDE Bug 319261] * Fix Stop Play button being left enabled after closing alarm window. === Version 2.10.2 (KDE 4.10.4) --- 4 May 2013 === * [Akonadi] Fix infinite loop on shutdown if display alarms are active [KDE Bug 317806] === Version 2.10.1 (KDE 4.10.0) --- 10 December 2012 === * [Akonadi] Fix memory leak when an alarm message window is displayed. * [Akonadi] Fix memory leak on alarm edit. === Version 2.10.0 (KDE 4.10 beta1)--- 13 November 2012 === * Add --list command line option to list scheduled alarms to stdout. * Add 'list' D-Bus command to return list of scheduled alarms. * [Akonadi] Wait until calendars are populated before using them at startup. === Version 2.9.3 (KDE 4.9.4) --- 13 November 2012 === * [Akonadi] Fix alarm list not sorting new alarms when calendar is enabled [KDE Bug 306178] === Version 2.9.2 (KDE 4.9.1) --- 22 August 2012 === * Fix Quit not working in system tray icon context menu. * [KResources] Fix KAlarm button not highlighting the alarm in the main window [KDE Bug 266082] === Version 2.9.1 (KDE 4.9.0) --- 7 July 2012 === * Add option to execute a pre-alarm action before deferred alarms. * Provide options to auto-hide system tray icon when no alarms are due. * Store KAlarm version and backend in config file. === Version 2.8.6 (KDE 4.8.5) --- 14 July 2012 === * [Akonadi] Don't display calendars which have no Akonadi resource. * [Akonadi resources] Fix resource if config is missing. * [Akonadi resources] Make resource work if location is set by path OR URL. * Fix crash when closing alarm window for alarm which plays audio file. * Fix "server did not accept the sender address" errors sending emails [KDE Bug 301946] === Version 2.8.5 (KDE 4.8.4) --- 6 June 2012 === * [Akonadi] Warn user and disable KAlarm if Akonadi fails to run [KDE Bug 300083] * [Akonadi] Fix crash when saving new alarm [KDE Bug Bug 300376] === Version 2.8.3 (KDE 4.8.3) --- 22 April 2012 === * Store KAlarm version and backend in config file. * Use the last selected sound file picker directory as the default next time. === Version 2.8.2 (KDE 4.8.2) --- 29 March 2012 === * [Akonadi] Fix error saving changed alarms when closing Edit Alarm dialogue. * [Akonadi] Show old-format calendars in read-only colour in calendar list. * [KResources] Fail cleanly if calendar resources fail to open [KDE Bug 296383] * Prevent multiple email success messages after Try used in Edit Alarm dialogue. === Version 2.8.1 (KDE 4.8.1) --- 19 February 2012 === * [Akonadi] Don't give option to save new alarms in old format calendars. * [Akonadi] Prevent duplicate prompts to update format of new calendar resource. * [Akonadi] Automatically disable duplicated calendar resources [KDE Bug 293193] * [Akonadi] Fix errors when creating default calendar resources [KDE Bug 293208] * [Akonadi] Prevent multiple standard calendars for any alarm type. * [Akonadi] Fix various crashes. * Output cmake error if Akonadi option incompatible with kdepimlibs/kalarmcal. === Version 2.8.0 (KDE 4.8.0) --- 16 January 2012 === * Use Akonadi as the default calendar access method. * Use configurable colours and KDE colour scheme for calendar list. * Allow user to stop playback after clicking Try in audio alarm edit dialogue. === Version 2.7.5 (KDE 4.7.4) --- 23 November 2011 === * Fix crash due to audio thread not being correctly deleted. === Version 2.7.4 (KDE 4.7.1) --- 28 August 2011 === * Fix crash when last recurrence of late-cancel alarm triggers too late. * Fix conversion of pre-version 1.4.14 subsidiary alarms. * Fix new alarm not being scheduled after editing alarm from alarm window. * Don't do search if invalid regular expression is entered in Find dialogue. * Don't prevent interaction with alarm windows when a prompt or warning message window is displayed [using KDE 4.7.1 or later]. * Only reset visible tab in multi-tab settings sections when Defaults is clicked in Configuration dialogue, and Current tab option is selected. * Disable command output option for display alarms in edit alarm dialogue if user not authorised to run shell commands. * Always output "not authorised" error message if unauthorised user tries to run shell commands. === Version 2.7.3 --- 26 July 2011 === * Fix crash when Wake From Suspend dialogue is shown with no alarm selected. === Version 2.7.2 --- 15 July 2011 === * Fix KAlarm not quitting when no visible windows or system tray icon remain. * Cancel wake-from-suspend if alarm is disabled, or if all alarms are disabled. * Various improvements and bug fixes to Wake From Suspend dialogue. * In calendar list show calendar colours by text background, not coloured square. * In alarm list show multi-line tooltip for alarm text when appropriate. === Version 2.7.1 (KDE 4.7.0) --- 6 July 2011 === * Make wake-from-suspend schedule a time-from-now, to make it work correctly on systems whose hardware clock is out of sync with the system clock. * Include Content-Transfer-Encoding header in emails to allow correct display. === Version 2.7.0 --- 9 May 2011 === * Add option to set a reminder AFTER the main alarm. * Add option to wake computer from suspend when a selected alarm is triggered. * Add command line option to disable alarm monitoring. * Replace EMAILID, SPEAK, ERRCANCEL, ERRNOSHOW calendar properties with FLAGS property parameters. === Version 2.6.3 --- 27 April 2011 === * Add option to not notify execution errors for pre-alarm actions. * Set environment variable KALARM_UID to event UID for pre- & post-alarm actions. * Warn user if only UTC time zone is available (if ktimezoned not installed). * Don't reactivate start-at-login without prompting, after user switches it off, except if KAlarm is session restored. * Show error message and set read-only if location is blank for new resource. * Fix crash on some systems when New Alarm dialogue is displayed from system tray icon menu. * Fix KAlarm button in alarm window not always showing main window and not highlighting the alarm in the main window. * Move New Alarm From Template action into New alarm menu to simplify toolbar. === Version 2.4.11 (KDEPIM 4.4.11) --- 16 April 2011 === * Fix bad borders round left hand buttons of time spinboxes in Oxygen style. * Fix initialisation of library global statics. * Ensure sound volume is not out of range when reading from calendar. * Fix New Alarm dialogue from system tray menu restoring other windows. === Version 2.4.10 (KDEPIM 4.4.8) --- 2 December 2010 === * Fix KAlarm showing in system tray at login when configured not to show in tray. * Fix working-time-only alarms not triggering if KAlarm is started up outside working hours, after the last trigger time during working hours was missed. * Don't quit if no window is visible when 'show in system tray' is deselected. * Disable Defer button in new message window when deferral limit has been reached. * Fix reminder time shown when editing a non-recurring alarm's deferred reminder. * Fix conversion of pre-version 1.9.10 non-recurring alarms with simple repetition. * Make disabled system tray icon more distinguishable for colour blind users. === Version 2.4.9 (KDEPIM 4.4.7) --- 19 October 2010 === * Fix crash if alarm triggers while its deletion confirmation prompt is visible. * Fix crash when Try button is clicked while creating new display alarm. * Fix crash on KAlarm exit. * Fix possible crash when enabling individual alarms. * Prevent long file name from expanding the width of file display alarm window. * Allow pre- & post-alarm actions for alarms whose text is generated by a command. * Combine 4 New Alarm icons in toolbar, to fix icon texts not fitting into width. === Version 2.4.8 (KDEPIM 4.4.6) --- 4 September 2010 === * Fix crash when a reminder alarm is being redisplayed. * Fix possible crash: on alarm deletion, always update next alarm to trigger. * Fix Sound File selection dialogue Play button not playing any sound. * Always show current storage location choice in Configuration dialogue. * Fix inability to leave file name blank in audio alarm templates. * Fix changes to volume not enabling OK button when editing an audio alarm template with no audio file specified. === Version 2.4.7 (KDE 4.4.5) --- 3 June 2010 === * Fix inability to defer non-recurring alarms. * Fix crash when selecting calendar type in calendar selector, if text widths and selector width are "exactly wrong". * Fix loss of time zone specification for date only alarms when converting a pre-2.3.2 calendar, if start-of-day time in calendar is not midnight. * Enable alarm edit dialogue Time Zone button in read-only mode. === Version 2.4.6 (KDE 4.4.4) --- 20 May 2010 === * Fix alarm edit dialog not saving changes when invoked from alarm message window's Edit button. * Fix main window close action not working when system tray icon is not shown. === Version 2.4.5 (KDE 4.4.3) --- 7 April 2010 === * Fix audio files playing silently when no volume level has been specified. === Version 2.4.4 (KDE 4.4.2) --- 17 March 2010 === * Fix display alarm whose text is generated by a command and which has an audio file, being converted into an audio-only alarm when reloaded. === Version 2.4.3 (KDE 4.4.1) --- 21 February 2010 === * Disable resource calendars which contain only wrong alarm types. === Version 2.4.2 (KDE 4.4.0) --- 30 January 2010 === * Fix non-ASCII text being corrupted in emails sent by KAlarm. * Show error message if selected email identity has no email address. === Version 2.4.1 (KDE 4.4.0 RC1) --- 8 December 2009 === * Fix date-only recurring alarms triggering repeatedly at high frequency. === Version 2.4.0 --- 24 November 2009 === * New audio alarm option, without displaying alarm window. * Add configuration setting for event duration for alarms copied to KOrganizer. * Provide 'any time' option in Defer Alarm dialogue, for date-only alarms. * Use KDE system settings to determine default working days in the week. * Improve organisation of main menu. * If dual screens, show alarm in other screen if any full screen window exists. * Fix recurring date-only alarm triggering repeatedly and eating up CPU, if the start-of-day time is after midnight and the alarm is due, but current UTC time of day is earlier than the start-of-day time of day in the alarm's time zone. * Update date-only alarm trigger times when user changes the start-of-day time. * Don't write start-of-day time into calendar, to avoid clashes if it is shared. * Don't waste processing time calculating next trigger time for archived alarms. * Disable 'New Alarm from Template' action when no alarm templates exist. * Interpret '~' (i.e. home directory) properly in entered file names. * Fix crash if calendar formats are updated at login, during session restoration. * Fix crash if editing alarm from alarm window Edit button, and window changes from reminder to normal, or window changes from at-login to final at-login trigger time, or window auto-closes. * Prevent infinite loop if NEXTRECUR time in alarm is before alarm start time. * Fix error saving the alarm after editing a repeat-at-login alarm. * Don't set reminder/late-cancel/show-in-KOrganizer when saving repeat-at-login alarms. * Improve error feedback in sound file selection. * Prevent sound file configuration dialogue closing after showing error message. === Version 2.3.0 --- 10 July 2009 === * Alarm edit: warn user if entered start time needs adjustment to fit recurrence. * Command alarm edit: show error message if no command/script has been entered. * Allow use of other command line options with --edit-new-* to initialise edit dialogue options. * Improve detection of conflicting command line options. === Version 2.2.4 --- 23 June 2009 === * Alarm edit: keep existing display file name if file select dialogue cancelled. * Guard against crashes if KAlarm quits while a modal dialogue is open. * Fix crash creating alarm from command line, if KAlarm not already running. * Fix --reminder-once command line option being treated same as --reminder. === Version 2.2.3 --- 14 June 2009 === * Fix crash when more than one alarm with audio is displayed simultaneously. === Version 2.2.2 --- 10 June 2009 === * Fix email alarms sending multiple mails, when sent by KMail. * Fix crash when closing remote calendars. === Version 2.2.1 --- 25 May 2009 === * Include new handbook translation: Ukrainian. === Version 2.2.0 --- 29 April 2009 === * Provide facility to export alarms to a new calendar file. * Provide option to spread alarm and error messages over screen. * Show command execution error indication for alarms in main window alarm list. * Add configuration setting for default deferral time in Defer Alarm dialogue. * Accept drag and drop of Todo entries to create a new alarm. === Version 2.1.8 (KDE 4.2.4) --- 25 May 2009 === * Fix crash on exit from birthday import dialogue. * Fix crash when an alarm is open for edit when its last occurrence triggers, and the edit is then saved. * Fix another possible crash when KAlarm quits. * Don't show time in alarm list for date-only alarms without time zone (e.g. those created by Import Birthdays). === Version 2.1.7 (KDE 4.2.3) --- 29 April 2009 === * Fix recurring alarms being missed when deferred to earlier than next due alarm, when next due alarm is earlier than the next recurrence. * Fix crash at startup if a non-recurring cancel-if-late alarm has been missed. * Fix speech mode not working when alarm messages are displayed. * Fix KAlarm hanging sometimes while trying to play an audio file. * Fix crash when KAlarm quits. * Fix memory leak with undo/redo. === Version 2.1.6 (KDE 4.2.2) --- 18 March 2009 === * Fix memory leaks. * Fix crash when KAlarm quits. === Version 2.1.5 (KDE 4.2.1) --- 7 February 2009 === * Disable inapplicable alarm types in alarm edit dialogue Load Template list. * Prevent multiple identical error messages being displayed for the same alarm. * Fix possible crash on alarm refresh, or removal or disabling of a resource. === Version 2.1.4 (KDE 4.2) --- 18 January 2009 === * Prevent corrupt alarms if deferral reinstates from archived alarm instead of from the displaying calendar. * Ignore events in calendar without usable alarms (which prevents them getting stuck in the alarm list, and fixes high CPU usage). * Show error message when New Template selected but no writable resource exists. * Fix crash when iCalendar item is dragged and dropped onto KAlarm. * Make New Alarm shortcuts work. * Fix alarms not being saved if created by drag-and-drop but not edited further. === Version 2.1.3 (KDE 4.2 RC1) --- 5 January 2009 === * Fix invalid alarm remaining in calendar when pre-alarm action failure message is acknowledged before the alarm is deferred. === Version 2.1.2 --- 27 December 2008 === * New KAlarm icon. * Distinguish disabled from enabled alarm colour when highlighted in alarm list. * Ensure alarm windows show on top of full-screen windows. * Fix crash if KAlarm is activated again while restoring from previous session. * Fix kalarmautostart crash on logout while kalarmautostart is still running. * Fix click on system tray icon not showing main window if 'Show in system tray' configuration setting deselected. === Version 2.1.1 (KDE 4.2 beta2) --- 8 December 2008 === * Allow global shortcuts for New Alarm actions. * Fix failure to update alarms in KOrganizer when Kontact is running but Kontact's calendar component is not loaded. * Fix toolbar configuration being lost after quitting KAlarm. === Version 2.1.0 (KDE 4.2 beta1) --- 13 November 2008 === * Add option to exclude holidays from recurring alarms. * Provide More/Less Options button in edit alarm dialogue. * Improve Configuration dialogue layout, split pages into tabs. * Show separate toolbar buttons for new display, command and email alarms. * Show 'Time Zone' button instead of time zone selection controls when using default time zone. * Set file display alarm font & colour in same way as for text display alarms. * Set default reminder time units according to how long until alarm is due. === Version 2.0.6 (KDE 4.1.3) --- 22 October 2008 === * Fix alarms not triggering correctly after laptop wakes from hibernation. * Fix inability to change or cancel alarm deferral times. * Prevent defer dialogue date being set outside the allowed range. * Set background colour for file display alarm text. * Don't wrap lines in file display alarm message windows. * Fix addition and deletion of alarms to KOrganizer. === Version 2.0.5 --- 27 September 2008 === * Fix very high CPU usage by KAlarm when there are alarms with sub-repetitions, or deferrals, with periods greater than 1 week. Fix requires kdepimlibs 4.1.3. === Version 2.0.4 (KDE 4.1.2)--- 24 September 2008 === * Add work-time-only parameter for D-Bus calls to create new alarms. === Version 2.0.3 --- 7 September 2008 === * Double click accepts selected template in pick list. * Make text in edit alarm dialogue change colour when foreground colour changed. * Replace colour combo boxes by buttons which display standard KDE colour picker. === Version 2.0.2 (KDE 4.1.1) --- 27 August 2008 === * Show alarm text entry fields in the current alarm message colours. * Show background colour selector for file display alarms. * Set KDE sound files directory as default for picking sound files. * Fix width of buttons containing only an icon. * Change Control Center references to System Settings. * Fix formatting of file display alarms for non-HTML text files. * Fix crash when birthday dialogue is opened more than once. * Prevent quitting when main window is closed but system tray icon is visible. === Version 2.0.2 --- 4 August 2008 === * Set KDE sound files directory as default for picking sound files. * Fix width of buttons containing only an icon. * Change Control Center references to System Settings. === Version 2.0.1 (KDE 4.1) --- 17 July 2008 === * Double click in template dialogue list activates template edit dialogue. * Fix KAlarm quitting on closing message window when no main window visible. * Fix KAlarm crashing when quitting. === Version 2.0.0 --- 7 July 2008 === * New facility to use multiple alarm calendar resources. * Add facility to select time zone for alarm times. * Handle summer/winter time changes correctly. * New option to trigger a recurring alarm only during working hours. * Add option for display alarm text to be generated by a command. * Provide "Don't show again for this alarm" option for command error messages. * Alarm edit dialogue layout improvements. * Make alarm edit and preferences dialogues scrollable if too high for screen. * Choose new alarm/template type from menu instead of in alarm edit dialogue. * Add option to show alarm windows in centre of screen, with buttons initially disabled to prevent accidental acknowledgement. * Remove alarm daemon (kalarmd) and do alarm monitoring in KAlarm itself. * Remove --handleEvent command line option. * Use custom properties instead of CATEGORIES in calendar events for KAlarm data. * Don't discard non-KAlarm custom event properties when editing alarms. * Use kconf_update to convert old config file settings. * Change numeric codes in config file to strings for long-term maintainability. * Rename Defaults section options in config file. * Fix detection of yearly February 29th recurrences on Feb 28th or Mar 1st. === Version 1.5.3 --- 16 June 2008 === * In New From Template menu, show list of template names in sorted order. * Fix recurrence count being lost when using alarm templates. * Prevent invalid negative values appearing in 'Time from now' edit field. * Fix time shown in alarm edit dialogue for recurring alarms. * Fix recurrence count shown in alarm edit dialogue once alarm has triggered. * Fix Find not working with a new search text after a failed search. * Display correct error message when a search fails. * Prevent user changing font/colour dialogue when editing read-only alarms. === Version 1.5.2 --- 13 February 2008 === * Prevent repetition duration error message when saving alarm which never recurs. === Version 1.5.1 (KDE 3.5.9) --- 13 February 2008 === * Fix inability to set up sub-repetitions for simple yearly recurrences. === Version 1.5.0 --- 23 January 2008 === * Replace simple repetitions with recurrence sub-repetitions, to save confusion. * Add option to enter reminder times in minutes, in addition to hours/minutes. * Replace alarm edit dialogue background colour selector with font/colour sample. * Store email unique IDs instead of names in email alarms to prevent problems if email IDs are renamed. * Fix error "Sender verify failed (in reply to RCPT TO command)" using sendmail on some systems, by adding envelope sender address to emails. * Fix OpenSolaris build error. === Version 1.4.21 --- 19 December 2007 === * Remember last used main window show/hide options instead of setting them in Preferences dialogue. * Make the Menu key work in the alarm list. * Fix crash when saving preferences, if 'xterm' is not installed in the system. * Prevent multiple identical error messages being displayed for the same alarm. === Version 1.4.20 --- 18 November 2007 === * Fix deferral of non-recurring alarms not working. * Fix loss of reminder details in archive when alarm has had a reminder deferred. * Fix inability to reactivate deleted alarms which still have repetitions to go. * Fix incorrect interpretation of --late-cancel weekly parameter on command line. === Version 1.4.19 --- 11 November 2007 === * Fix KAlarm hanging and freezing the system for a while, especially on startup. * Fix next occurrence time set after editing alarm, when it's a sub-repetition. * Prevent error messages while typing date value, until user finishes entering it. === Version 1.4.18 --- 2 November 2007 === * Fix failure to trigger some recurring date-only alarms (e.g. after suspend-resume). * Fix date-only alarms triggering every minute from midnight to start-of-day time. * Simplify recurrence text shown in alarm edit dialogue Alarm tab when possible. * Prevent error after browsing for command log file, due to file:// prefix. === Version 1.4.17 (KDE 3.5.8) --- 8 October 2007 === * Allow time-from-now values up to 999 hours to be entered. * Fix incorrect email headers resulting in failure to send some emails. === Version 1.4.16a --- 12 September 2007 === * Fix failure to retrieve font and colour settings for display alarms. === Version 1.4.16 --- 10 September 2007 === * Attempt to fix failure to retrieve font and colour settings for display alarms. * Disable reminder etc. controls for at-login recurrence in alarm edit dialogue. === Version 1.4.15 --- 7 September 2007 === * Fix deferrals of recurring alarms not triggering correctly. * Fix failure to archive details of repetitions within a recurrence. * Enable/disable "Show expired alarms" action when preferences change. === Version 1.4.14 --- 5 August 2007 === * Fix handling of exception dates in recurrences. * In sound file dialogue change Play button to a Stop button while playing a file. === Version 1.4.13 --- 18 May 2007 === * Fix time value in templates not being stored. * Expand time spin boxes to make room for all digits. * Make Preferences dialogue non-modal. === Version 1.4.12 (KDE 3.5.7) --- 11 May 2007 === * Display advance reminders for each occurrence of recurring alarms. * Fix Undo of deletion of active alarms. * Disable simple repetition controls if repetitions can't fit between recurrences. * Make the system tray tooltip take account of alarm repetitions. * Show repetition & special action status by button states in alarm edit dialogue. * Fix reminder alarms displaying very big numbers for how long until alarm is due. * Fix KMail omitting attachments from email alarms (if KMail is the email client). === Version 1.4.11 --- 16 April 2007 === * Prevent pre-alarm actions being executed multiple times when alarm is triggered. * Prevent alarm daemon triggering alarms multiple times. * Only execute pre-alarm actions once (not for reminders or deferrals). * Only execute post-alarm actions once when alarm is finally acknowledged (after any deferrals), and not after reminders. * Show file name as a tooltip on sound type combo box when "file" is selected. === Version 1.4.10 --- 3 March 2007 === * Add play button to sound file selection dialogue. * Prevent simple repetitions triggering again when KAlarm is restarted. * Fix recurring alarms being triggered on exception days. * Fix start-of-day time being ignored for date-only alarms. * Disable Defer button in new message window when deferral limit has been reached. * Fix failure to save "Execute in terminal window" option in Preferences dialogue. * Ensure up-to-date menus are displayed if user has a customised toolbar. === Version 1.4.9 (KDE 3.5.6) --- 3 January 2007 === * Minor changes. === Version 1.4.8 --- 28 December 2006 === * Fix Find always using first search text entered even after entering a new one. === Version 1.4.7 --- 14 December 2006 === * Fix crash saving Preferences dialogue (due to command alarm terminal setting). === Version 1.4.6 --- 30 November 2006 === * Fix crash if an alarm triggers while user is deleting it. * Fix "Start alarm monitoring at login" value shown in preferences dialogue. * Fix deselecting "Start alarm monitoring at login" when daemon not running. * Fix editing of 29th February alarm options for non-leap years. * Tidy up preferences dialogue Run mode options. * Tidy up alarm edit/preferences dialogue sound type options into a combo box. * Add context help for sound file fade options. === Version 1.4.5 (KDE 3.5.5) --- 29 September 2006 === * Improve alarm edit dialogue layout (Reminder controls moved to below Time box). === Version 1.4.4 --- 11 July 2006 === * Use an alarm's previous deferral time interval as default for its next deferral. === Version 1.4.3 (KDE 3.5.4) --- 11 July 2006 === * Add facility to import alarms from other calendar files. * Fix Defer dialog time interval maximum to match maximum date/time value. * Fix crash when a deferred expired recurring alarm is edited from message window. * Fix crash when a message is redisplayed after login. * Prevent inapplicable 'Unable to speak' error when alarm redisplayed after login. * Save main window column order changes to use on restart (except message column). === Version 1.3.10 (KDE 3.5.3) --- 22 May 2006 === * Add DCOP calls and command line options to display the edit alarm dialogue. * Add Select All and Deselect actions & shortcuts for import birthdays list. * Make system tray icon appear in non-KDE window managers. * Output error message if deleting copy of alarm from KOrganizer fails. * Fix corruption of alarms displayed at logout and then deferred after login. * Fix reminder time not being saved in alarm templates. * Fix erroneous date adjustment of start of recurrence when saving alarm. * Fix crash when --play command line option is used, if compiled without aRts. * Don't show disabled alarms in system tray tooltip alarm list. === Version 1.3.9 (KDE 3.5.2) --- 7 March 2006 === * Notify daemon by DCOP that alarm has been processed: to prevent alarm loss, and to prevent defunct kalarm processes when run mode is on-demand. * Add Select All and Deselect actions & shortcuts for alarm and template lists. === Version 1.3.8 --- 24 January 2006 === * Fix kalarmd hang when triggering late alarm and KAlarm run mode is on-demand. === Version 1.3.7 --- 22 January 2006 === * Fix column widths when main window is resized, if columns have been reordered. === Version 1.3.6 (KDE 3.5.1) --- 10 January 2006 === * Make autoclose of message windows work. * Fix New From Template not creating alarm if template contents are not changed. * Ensure that day and month names translations are independent of locale calendar. * Display alarm message windows within current screen in multi-head systems. * Reduce size of Preferences dialog to fit in 1024x768 screen. === Version 1.3.5 --- 14 December 2005 === * Fix email attachments being forgotten when saving alarms. * Fix toolbar configuration being lost after quitting KAlarm. === Version 1.3.4 (KDE 3.5) --- 30 October 2005 === * Fix incorrect recurrence frequency in Alarm Edit dialogue's Alarm tab. === Version 1.3.3 --- 22 September 2005 === * Add day-of-week selection to daily recurrence dialog. === Version 1.3.2 (KDE 3.5 beta 1) --- 10 September 2005 === * Add option to show alarms in KOrganizer's active calendar. * Add option for email text alarms to locate the email in KMail. * When email alarm triggers and KMail isn't running, start KMail and send mail automatically instead of opening KMail composer window. * Provide per-alarm option for yearly February 29th recurrences. * Wait longer (20 seconds) before reporting alarm daemon registration failed. * Minimise KMix window if KMix is started by KAlarm when displaying a message. * Fix Plastik style 'enabled' indication for time spinbox left-hand buttons. * Prevent message windows always being full screen after a big message is shown. * Prevent message windows being initially larger than the desktop. * Prevent message windows initially overlapping the KDE panel. * Prevent session restoration displaying main windows which should be hidden. * Fix alarms getting stuck if due during a daylight savings clock change. * Change --volume command line option short form to -V (-v is used by --version). * Fix reported shell errors when output from command alarm is discarded. * Use 'KAlarm' untranslated in calendar product ID, to cater for locale changes. === Version 1.3.1 --- 30 May 2005 === * Add Undo/Redo facility for alarm edit/creation/deletion/reactivation. * Add text search facility. * Add option to speak alarm messages (if speech synthesis is installed). * Add command line option --speak. * Add 'New alarm from template' menu option and toolbar button. * Add 'Time from now' option in alarm templates. * Add fade option for playing sound files. * Add option to log command alarm output to a file. * Add Edit button to alarm message window to allow the alarm to be edited. * Enable drag and drop of alarms to other applications. * Email drag-and-drop from KMail (KDE >= 3.5) now presets alarm edit dialog with full From/To/Cc/Subject headers and body text. === Version 1.2.8 (KDE 3.4.1) --- 9 May 2005 === * Fix failure to enable "Reminder for first recurrence only" checkbox. === Version 1.2.7 --- 20 April 2005 === * Use a sensible default for terminal window command in Preferences dialog. * Validate terminal window command entered in Preferences dialog. * Fix date range no longer being validated in Defer dialog. * Don't ignore Sound setting in Preferences dialog Edit tab. * Reset sound volume (if it was set) as soon as audio file playing is complete. * Don't start KMix when an alarm is displayed if no sound volume is specified. * Add command script and execute-in-terminal options to DCOP interface. === Version 1.2.6 (KDE 3.4) --- 22 February 2005 === * Pop up message windows far from cursor to avoid accidental acknowledgement. * Start KMix if not already running, for setting alarm sound level. * Fix alarms not triggering if IDs are duplicated in different calendar files. * Improve validation when reading configuration file values. === Version 1.2.5 (KDE 3.4 beta2) --- 21 January 2005 === * Prevent multiple "Failed to start Alarm Daemon" error messages at startup. * Fix missing left border for time spinboxes in Plastik style. === Version 1.2.4 (KDE 3.4 beta1) --- 9 January 2005 === * Provide option to enter a script for a command alarm, instead of a command line. * Add option to run command alarms in terminal windows. * Accept drag and drop of KAddressBook entries to alarm edit dialog email fields. * Drag and drop now inserts text where appropriate, rather than replacing it. * Display correct controls after loading a template in alarm edit dialog. === Version 1.2.3 --- 7 December 2004 === * Put alarm type icons in a separate, sortable, column in alarm list. * Align times in alarm list. * Fix crash when the last recurrence of an alarm is reached. * Fix random limit on expired alarm discard time if stepping with spinbox buttons. * Fix dialog layouts for right-to-left languages. * Fix time spin box layout for right-to-left languages. === Version 1.2.2 --- 27 November 2004 === * Make alarm daemon (kalarmd) exclusive to KAlarm. * Move control options for alarm daemon into KAlarm preferences dialog. * Allow user to specify the late-cancellation period for an alarm. * Add option to automatically close window after late-cancellation period. * Add facility to enable and disable individual alarms. * Add simple repetition facility, including repetition within a recurrence. * Add option to pick a KMail identity to use as sender of email alarms. * Add option to copy emails sent via sendmail, to KMail sent-mail folder. * Show scheduled times, not reminder times, in alarm list and system tray tooltip. * Make time edit controls use 12-hour clock when that is the user's default. * Also fill in alarm edit dialog email fields when email is dropped onto KAlarm. * New revised DCOP request interface (old interface still kept for compatibility). * Make detection of email message display alarms independent of language. * Use KMix whenever possible to set hardware sound volume. * Limit range of entered date/time to valid values in deferral dialogue. * Prevent kalarm failing to register with kalarmd except when really necessary. * Fix time-to-alarm column in main window not always updating every minute. === Version 1.1.7 (KDE 3.3.2) --- 27 November 2004 === * Fix KAlarm button on message windows to make it always display main window. * Show scheduled times, not reminder times, in alarm list and system tray tooltip. * Fix time-to-alarm column in main window not always updating every minute. === Version 1.1.6 (KDE 3.3.1) --- 30 September 2004 === * Prevent crash, and output error message, if menu creation fails. * Unsuppress Quit warning message box if default answer is Cancel quit. * Prevent blind copy to self of email alarms via KMail when bcc is deselected. === Version 1.1.5 --- 1 September 2004 === * Show erroneous control in alarm edit dialog when an error message is displayed. * Make alarm edit dialog always appear on current desktop. * Make weekly/monthly/yearly recurrences scheduled from command line correspond correctly to the start date. * Fix start date for monthly/yearly recurrences scheduled from the command line. * Fix DCOP triggerEvent() call to not reschedule alarm if it isn't due yet. === Version 1.1.4 --- 21 August 2004 === * Fix errors when altering or cancelling deferrals of expired recurrences. === Version 1.1.3 (KDE 3.3) --- 28 July 2004 === * Fix dialog sizing the first time KAlarm is run. === Version 1.1.2 (KDE 3.3 beta2) --- 11 July 2004 === * Fix hangup in interactions with alarm daemon introduced in version 1.1.1. * Only tick Alarms Enabled menu items once alarms have actually been enabled. * Fix build for "./configure --without-arts". === Version 1.1.1 (KDE 3.3 beta1) --- 20 June 2004 === * Output error message and disable alarms if can't register with alarm daemon. * Exit if error in alarm calendar name configuration. * Fix bug where sound file is selected even when Cancel is pressed. === Version 1.1.0 --- 1 June 2004 === * Add facility to define alarm templates. * Add facility to specify pre- and post-alarm shell command actions. * Add option to play sound file repeatedly until alarm window is closed. * Add volume control for playing sound file. * Add 'stop sound' button to alarm message window when sound file is played. * Rename command line option --sound to --play, add option --play-repeat. * Add command line option --volume. * Add 'Configure Shortcuts' and 'Configure Toolbars' menu options in main window. * After creating/editing alarm, prompt to re-enable alarms if currently disabled. * Middle mouse button over system tray icon displays new alarm dialog. * Add option to display a reminder once only before the first alarm recurrence. * Display time-to-alarm in reminder message window. * For message texts which are truncated in main window, show full text in tooltip. * Allow time of day to be entered in format HHMM in time spin boxes. * Allow hour to be omitted when colon format time is entered in time spin boxes. * Add "Don't ask again" option to alarm deletion confirmation prompt. * Prevent expired alarm calendar purges clashing with other alarm actions. * Fix initial recurrence date/time for weekly/monthly/yearly recurrences. * Fix yearly recurrences of the last day in the month. * Disable yearly recurrence's month checkboxes depending on selected day of month. * Update which time columns are displayed in alarm list when Preferences change. * Don't store audio/reminder details in email/command alarms. * Don't store email details in message/file/command alarms. * Don't close message windows when quit is selected. * Fix "Warn before quitting" configuration option. * Don't redisplay error message windows on session restoration. * Remove obsolete --displayEvent command line option (replaced by --triggerEvent). * Remove obsolete pre-version 0.7 DCOP calls. === Version 1.0.7 --- 2 May 2004 === * Fix scheduleCommand() and scheduleEmail() DCOP handling. * Make KAlarm build for "./configure --without-arts". * Fix email body text not being saved in email alarms. * Fix loss of --exec command line arguments. * Remove wasted vertical space from message windows. === Version 1.0.6 (KDE 3.2.2) --- 26 March 2004 === * Make the Quit menu item in main window quit the program. * Update time entry field after editing as soon as mouse cursor leaves it. * Cancel deferral if reminder is set before it, to prevent it becoming stuck. * Prevent undeleted recurring alarms being triggered immediately. * Don't allow alarms to be undeleted if they are completely expired. === Version 1.0.5 (KDE 3.2.1) --- 24 February 2004 === * Fix whatsThis text on bottom row of alarm list. === Version 1.0.4 --- 22 February 2004 === * Fix freeze at login when multiple alarms trigger. * Show all audio file types in sound file chooser dialogue. === Version 1.0.3 --- 15 February 2004 === * Prevent email alarms from being sent if no 'From' address is configured. * Omit 'Bcc' when sending email alarms if no 'Bcc' address is configured. * Fix freeze when starting the alarm daemon. * Fix memory leaks displaying dialogs. * Fix scheduleCommand() and scheduleEmail() DCOP handling. * Fix errors saving expired alarm calendar. === Version 1.0.2 (KDE 3.2) --- 29 January 2004 === * Prevent editing alarm and saving without changes from deleting the alarm. === Version 1.0.1 --- 4 January 2004 === * Fix failure to see alarms if KAlarm is reactivated while restoring session. === Version 1.0.0 --- 7 December 2003 === * Allow entered start date for timed recurrence events to be earlier than now. * Prevent attempted entry of recurrence end date earlier than start date or today. * Fix error displaying time of expired repeat-at-login alarms. * Fix memory leak when sending emails with attachments. * Fix error trying to send emails with very small attachments. * Eliminate duplicate reload-calendar calls to alarm daemon. === Version 0.9.6 (KDE 3.2 beta1) --- 7 November 2003 === * Add option to choose foreground colour for alarm messages. * Create new alarm by dragging KMail email onto main window or system tray icon. * Set initial recurrence defaults to correspond to alarm start date. * Add option for how February 29th recurrences are handled in non-leap years. * Monthly/yearly recurrence edit: adhere to user preference for start day of week. * Eliminate multiple confirmation prompts when deleting multiple alarms. * Eliminate duplicate alarms in system tray tooltip. * Fix crash after reporting error opening calendar file. * Fix wrong status in system tray icon if KAlarm starts up with alarms disabled. * Fix wrong number of days in Time-to-alarm column in main window. * Fix omission of deferred alarms from system tray tooltip. === Version 0.9.5 --- 3 September 2003 === * Add option for non-modal alarm message windows. * Add option to display a notification when an email alarm queues an email. * Emails via KMail are sent without opening composer window, if KMail is running. * Provide separate configuration for 'From' and 'Bcc' addresses for email alarms. * Add exceptions to recurrence specification. * Add multiple month selection to yearly recurrence. * Add day of month selection in yearly recurrence. * Add last day of month option in monthly and yearly recurrences. * Add 2nd - 5th last week of month options in monthly and yearly recurrences. * Add filename completion to file and command alarm edit fields. * Display alarms-disabled indication in system tray tooltip. * Enable file alarms to display image files. * Fix file alarms not dislaying some text files, and improve HTML file display. * Fix loss of changes to attachment list after editing email alarms. * Fix wrong recurrence end date being displayed when editing an existing alarm. === Version 0.9.4 --- 3 July 2003 === * Add time-to-alarm display option to main alarm list. * Add option to list next 24 hours' alarms in system tray tooltip. * Create new alarm by dragging text or URL onto main window or system tray icon. * Display reasons for failure to send an email. * Allow editing of the list of message colours. * Edit new alarm by context menu or double click on white space in alarm list. * Add show expired alarms option to preferences dialog. * Display HTML files correctly in file display alarms. === Version 0.9.3 --- 4 March 2003 === * Add preferences option to set default sound file for the Edit Alarm dialog. * Fix display of "Invalid date" message before Edit Alarm dialog displays. === Version 0.9.2 --- 28 February 2003 === * Option to set font for individual alarm messages. * Allow multiple alarm selection in the main window. * KAlarm icon in alarm message window selects the alarm in the main window. * In Edit Alarm dialog, move all recurrence edit controls into Recurrence tab. * Add quit warning message option to preferences dialog. * Add "New Alarm" option to system tray context menu. * Disallow command alarms when KDE is running in kiosk mode. * Revised storage of beep, font, colour and program arguments in calendar file. * Always save alarms in iCalendar format (but vCalendar may still be read). * Add reminder, recurrence and font parameters to DCOP calls. * Fix failure to enable alarms when running in on-demand mode. === Version 0.9.1 --- 16 January 2003 === * Add option to set advance reminders for display alarms. * In run-in-system-tray mode, warn that alarms will be disabled before quitting. * Fix monthly and yearly recurrences on nth Monday etc. of the month. * Fix yearly recurrences on February 29th. * Fix recurrence start times stored in expired calendar file. * Fix extra empty events being stored in expired calendar file. === Version 0.9.0 --- 3 January 2003 === * Add facility to import birthdays from KAddressBook * Add option to send an email instead of displaying an alarm message. * Add option to store and view expired alarms. * Add copy, view and undelete actions (as applicable) for the selected alarm. * In alarm message window, message text can be copied to clipboard using mouse. * Allow message text to be scrolled in alarm message window if too big to fit. * Shift key with left mouse button steps time edit arrows by 5 minutes/6 hours. * Report failure to run command alarm (bash, ksh shells only). * Retain repeat-at-login status on alarm deferral. * Restore alarm messages which were displayed before KAlarm was killed or crashed. * Store alarm data in the calendar file in a more standard way. * Alarm message defer dialog: update recurrence deferral time limit in real time. * Weekly recurrence edit: adhere to user preference for start day of week. * Use standard action icons. === Version 0.8.5 (KDE 3.1.1) --- 21 February 2003 === * Fix monthly and yearly recurrences on nth Monday etc. of the month. * Fix yearly recurrences on February 29th. * Fix failure to enable alarms when running in on-demand mode. === Version 0.8.4 (KDE 3.1) --- 8 January 2003 === * Make KAlarm icon in message window bring main window to current desktop. * Fix detection of KDE desktop. * Fix entry of yearly recurrences on a specified date in the year. === Version 0.8.3 --- 9 November 2002 === * Fix no system tray icon being displayed. * Fix multiple system tray icons being displayed. * Fix alarms being missed after changing "Disable alarms when not running" status. === Version 0.8.2 --- 2 November 2002 === * Fix audio files not playing. === Version 0.8.1 --- 1 November 2002 === * Adhere to KDE single/double click setting when clicking on alarm list. * Fix possible loss of alarms if KAlarm has previously used another calendar file. * Fix coordination between "At time" and "After time" values when they change. * Always remove alarm deferral even when next recurrence triggers instead. * When alarm triggers, replace any existing repeat-at-login alarm message window. * Fix deselection of Sound not working after selecting a sound file. * Fix display of hour spin buttons in time edit spin boxes. * Prevent time edit spin box buttons from selecting the text. * Clean up previous alarm list highlight properly when a new alarm is selected. * Set sensible initial focus when edit alarm dialog pages are displayed. * Fix Quit duplicate entry in system tray context menu. === Version 0.8 (KDE 3.1 beta2) --- 16 September 2002 === * Move recurrence edit to separate tab in alarm dialog (now fits 800x600 display). * Add accelerator keys in dialogs. * Provide date picker for entering dates. === Version 0.7.5 --- 1 September 2002 === * Add preferences options to choose default settings for the Edit Alarm dialog. * Fix right-to-left character sets not being displayed in message edit control. * Make "Help -> Report Bug" use the KDE bug system (bug #43250). * Fix session restoration not occurring. === Version 0.7.4 (KDE 3.1 beta1) --- 5 August 2002 === * Add option to prompt for confirmation on alarm deletion. * Add option to prompt for confirmation on alarm acknowedgement. * Display KAlarm handbook Preferences section when Help clicked in config dialog. * Correctly adjust wrong summer times stored by version 0.5.7 (KDE 3.0.0). === Version 0.7.3 --- 24 July 2002 === * Fix loss of alarm times after saving pre-version 0.7 calendar file. * Fix main alarm list display of hours or hours/minutes repeat interval. * Display KAlarm handbook when Help clicked in configuration dialog. === Version 0.7.2 --- 2 July 2002 === * Fix reading wrong alarm times from pre-version 0.7 calendar file. * Partially fix loss of alarm times after saving pre-version 0.7 calendar file. === Version 0.7.1 --- 29 June 2002 === * Prevent duplicate message windows from being displayed. * Make Close button on message window not the default button to reduce chance of accidental acknowledgement. * Fix non-ASCII message texts being saved as question marks. * Fix memory leak with recurrences. === Version 0.7.0 --- 15 June 2002 === * Add option to play audio file when message is displayed. * Add daily, weekly, monthly, annual recurrences. * Allow deferring only up to next scheduled repetition time. * Don't defer repetitions when an alarm is deferred. * Make regular repetition and repeat-at-login mutually exclusive. * Double click on alarm in main window opens alarm edit dialog. * Change Reset Daemon menu option to Refresh Alarms. * Save and restore window sizes. === Version 0.6.4 --- 8 May 2002 === * Make click on system tray icon always bring KAlarm to top on current desktop. * Fix alarms not being triggered (depending on time zone). === Version 0.6.0 --- 8 March 2002 === * Add option to execute a command instead of displaying an alarm message. * Add Try button to alarm message edit dialog. * Add icons in the alarm list to indicate each alarm's type. * Display error message if a file to be displayed is not a text file. * Reduce chance of lost late-cancel alarms when daemon check interval is reduced. * Rename command line option --displayEvent to --triggerEvent. * Rename DCOP function displayMessage() to triggerEvent(). * Rename DCOP function cancelMessage() to cancelEvent(). === Version 0.5.8 (KDE 3.0.5A) --- 23 November 2002 === * Fix detection of KDE desktop. === Version 0.5.8 (KDE 3.0.5) --- 4 October 2002 === * Fix possible loss of alarms if KAlarm has previously used another calendar file. === Version 0.5.8 (KDE 3.0.4) --- 18 August 2002 === * Make "Help -> Report Bug" use the KDE bug system (bug #43250). * Fix right-to-left character sets not being displayed in message edit control. === Version 0.5.8 (KDE 3.0.3) --- 5 August 2002 === * Adjust wrong summer times stored by version 0.5.7 (KDE 3.0.0). * Display KAlarm handbook when Help clicked in configuration dialog. * Make Close button on message window not the default button to reduce chance of accidental acknowledgement. * Fix session restoration often not occurring at login. === Version 0.5.7 (KDE 3.0.1) --- 9 May 2002 === * Use local time for alarm times instead of using a time zone. * Make click on system tray icon always bring KAlarm to top on current desktop. === Version 0.5.7 (KDE 3.0) --- 17 March 2002 === * Show system tray icon on deferring command line-initiated message (run-in- system-tray mode). * Associate main window with system tray icon when displayed from message window. * Don't start KAlarm at login, until it has been run for the first time. * Add startup notification to kalarm.desktop. * Prevent open main window from cancelling KDE session shutdown. * Fix failure to display messages after daemon is restarted (run-on-demand mode). * Fix possible failure to display command line-initiated message. * Fix crash in some circumstances on changing run mode to run-on-demand. * Fix crash on clicking KAlarm icon in command line-initiated message window. * Fix crash on deferring alarm in command line-initiated message window. * Fix duplication of repeat-at-login alarms at login. * Fix error displaying text file messages. === Version 0.5.4 --- 7 February 2002 === * Fix extra window being displayed in session restoration. === Version 0.5.2 --- 31 January 2002 === * Fix session restore crash if in 'run continuously in system tray' mode. === Version 0.5.1 --- 30 January 2002 === * Change configuration defaults. === Version 0.5 --- 29 January 2002 === * Incorporate system tray icon into KAlarm, add --tray option. * Add 'run continuously in system tray' operating mode. * Don't use alarm daemon GUI application. * Add enable/disable alarms option to main window menu. * Add show/hide system tray icon option to main window menu. * Add toolbar. * Rename alarm dialog Set Alarm button to OK. * Rename message window OK button to Close. * Remove keyboard accelerator for Reset Daemon. * Fix magnified system tray icon. * Include README, etc. files in installation. === Version 0.4 --- 22 December 2001 === * Modify to use split alarm daemon/alarm daemon GUI. * Prevent a command line error exiting all open KAlarm windows. * Ensure the program exits after starting with --stop or --reset options. === Version 0.3.5 --- 5 December 2001 === * Add option to repeat alarms at login. * Add context help button to main window and message window. * Fix occasional crash on displaying non-repeating alarms. * Fix possible failure to display alarms at login. * Fix blank title bar when main window restored at login. * Fix alarms not deleted from main window when displayed at login. * Fix handling of zero-length calendar file. * Improve error messages. * Make documentation files installation dependent on KDE version. === Version 0.3.1 --- 20 November 2001 === * Fix build fault when using ./configure --enable-final === Version 0.3 --- 4 November 2001 === * Add option to display a file's contents instead of specifying a message. * Add dialog option to set an alarm's time as an interval from the current time. * Add defer option to alarm message window. * Provide button in alarm message window to activate KAlarm. * Make dialogs modal only for their parent window. === Version 0.2 --- 20 October 2001 === * Implement repeating alarms. * Add extra pair of arrow buttons to time spinbox to change the hour. * Fix sorting by colour column. * Better What's This? texts for the main window. * Remove -r, -s short options (use --reset, --stop instead). === Version 0.1.1 --- 1 September 2001 === * Fix documentation not being created by build. === Version 0.1 --- 31 August 2001 === * Initial release. diff --git a/src/org.kde.kalarm.appdata.xml b/src/org.kde.kalarm.appdata.xml index 5647a289..07d6cd3a 100644 --- a/src/org.kde.kalarm.appdata.xml +++ b/src/org.kde.kalarm.appdata.xml @@ -1,366 +1,373 @@ org.kde.kalarm.desktop CC0-1.0 GPL-2.0+ KAlarm منبّهك KAlarm KAlarm KAlarm KAlarm KAlarm KAlarm KAlarm KAlarm KAlarm KAlarm KAlarm KAlarm KAlarm KAlarm KAlarm KAlarm KAlarm KAlarm KAlarm KAlarm KAlarm KAlarm KAlarm KAlarm KAlarm KAlarm KAlarm KAlarm К‑аларм K‑alarm К‑аларм K‑alarm Kalarm KAlarm KAlarm xxKAlarmxx KAlarm KAlarm Personal Alarm Scheduler مجدوِل المنبّهات الشخصيّ Raspoređivač osobnih alarma Planificador personal per a alarmes Planificador personal per a alarmes Osobní plánovač alarmů Persönliche Termin-Erinnerung Personal Alarm Scheduler Planificador de alarmas personal Meeldetuletuste ajastaja Henkilökohtainen hälytysajastin Planificateur d'alarme personnel Programador persoal de alarmas Emlékeztetőkezelő Planificator de alarma personal Penjadwal Alarm Personal Programmatore degli avvisi personali 개인 알람 스케줄러 Personlig varslingsplanlegger Persöönlich Anstöötgever Persoonlijke alarmplanner Planowanie alarmów osobistych Calendarização de Alarmes Pessoais Agendador de alarme pessoal Planificator personal de alarme Личные напоминания Osobný plánovač alarmov Osebni planer alarmov Лични распоређивач аларма Lični raspoređivač alarma Лични распоређивач аларма Lični raspoređivač alarma Personlig alarmschemaläggning Kişisel Alarm Zamanlayıcı Персональний планувальник нагадувань xxPersonal Alarm Schedulerxx 个人提醒和计划任务 個人鬧鐘排程程式

KAlarm is a personal alarm message, command and email scheduler application by KDE

El KAlarm és una aplicació de planificació personal per a alarmes de missatge, ordres i correu electrònic, creat per la comunitat KDE

El KAlarm és una aplicació de planificació personal per a alarmes de missatge, ordres i correu electrònic, creat per la comunitat KDE

KAlarm ist ein Planer für Erinnerungsnachrichten sowie für termingesteuerten E-Mail-Versand und Befehlsausführungen von KDE

KAlarm is a personal alarm message, command and email scheduler application by KDE

KAlarm es una aplicación de mensaje personal de alarmas, órdenes y planificador de correo de KDE

KAlarm on KDE personaalsete häiresõnumite, -käskude ja -e-kirjade ajastaja

KAlarm on KDE:n henkilökohtainen hälytysten, komentojen ja sähköpostin ajastin

KAlarm est un programmateur personnel de message d'alarme, de commande et de courrier électronique développé par KDE

KAlarm é unha aplicación de KDE para programar mensaxes persoais de alarma, ordes e mensaxes de correo electrónico.

+

KAlarm es un application de planificator per posta, commando e message de alarma personal per KDE

KAlarm adalah sebuah perpesanan alarm personal, aplikasi penjadwal email dan perintah

KAlarm è un pianificatore personale di messaggi di avviso, di posta elettronica e per l'esecuzione di comandi sviluppato da KDE

KAlarm은 KDE의 개인 알람, 명령, 이메일 스케줄러입니다

Kalarm is een persoonlijke planner voor herinneringen, opdrachten en plannen van e-mailberichten door KDE

KAlarm jest osobistym programem KDE do planowania wiadomości alarmowych, poleceń i wiadomości pocztowych

O KAlarm é um sistema para agendar alarmes com mensagens, comandos e e-mails do KDE

O KAlarm é um aplicativo agendador pessoal de mensagens de alarme, comandos e e-mails do KDE

KAlarm — разработанная KDE программа для установки напоминаний, а также для планирования запуска команд и отправки электронных писем

KAlarm je aplikácia osobného budíku, príkazového a e-mailového plánovača od KDE

Kalarm je osebni planer alarmov, ukazov in e-pošte izdelan v skupnosti KDE

Kalarm är ett schemaläggningsprogram av personliga alarmmeddelanden, kommandon och e-post av KDE

KAlarm — інструмент від KDE для складання розкладу повідомлень, команд і поштових повідомлень для нагадування.

xxKAlarm is a personal alarm message, command and email scheduler application by KDExx

KAlarm 是一个 KDE 出品的个人定时消息、命令及邮件调度程序

KAlarm 是款由 KDE 出品的應用程式,可以設定個人化的鬧鐘訊息、指令或排程發送電子郵件

Features:

الميزات:

Svojstva:

Característiques:

Característiques:

Vlastnosti:

Funktioner:

Funktionen:

Features:

Características:

Omadused:

Ominaisuudet:

Fonctionnalités :

Funcionalidades:

Szolgáltatások:

Characteristicas:

Fitur:

Funzionalità:

기능:

Ypatybės:

Egenskaper:

Markmalen:

Mogelijkheden:

Możliwości:

Funcionalidades:

Funcionalidades:

Caracteristici:

Возможности:

Funkcie:

Zmožnosti:

Могућности:

Mogućnosti:

Могућности:

Mogućnosti:

Funktioner:

Özellikler:

Можливості:

xxFeatures:xx

功能:

功能:

http://www.astrojar.org.uk/kalarm/ https://bugs.kde.org/enter_bug.cgi?format=guided&product=kalarm https://docs.kde.org/stable5/en/pim/kalarm/index.html KAlarm configuration window with a testing message alarm Finestra de configuració del KAlarm amb una alarma de missatge de prova. Finestra de configuració del KAlarm amb una alarma de missatge de prova. Der Einrichtungsdialog von KAlarm mit dem Test einer Erinnerungsnachricht KAlarm configuration window with a testing message alarm Ventana de configuración de KAlarm con un mensaje de prueba de alarma KAlarmi seadistustedialoog sõnumihäire testimisega KAlardmin asetusikkuna ja viestihälytyksen testaus Fenêtre de configuration de KAlarm avec une alarme contenant un message de test Xanela de configuración de KAlarm cunha alarma de mensaxe de proba + Fenestra de configuration de KAlarm con un alarma con message de prova Window konfigurasi KAlarm dengan sebuah pengujian alarm perpesanan Finestra di configurazione di KAlarm con un messaggio di avviso di prova 메시지 알람 테스트가 표시된 KAlarm 설정 창 KAlarm configuratievenster met een testbericht voor een herinnering Okno ustawień KAlarm z próbną wiadomością alarmową Janela de configuração do KAlarm com um alarme de teste com mensagem Janela de configuração do KAlarm com uma mensagem de teste de alarme Окно настроек KAlarm с напоминанием Konfiguračné okno KAlarm s testovacou správou alarmu Okno za nastavitev alarma s tesnim sporočilom ob alarmu Inställningsfönstret i Kalarm med test av ett meddelandealarm Вікно налаштовування KAlarm із тестовим нагадуванням у форматі повідомлення xxKAlarm configuration window with a testing message alarmxx KAlarm 配置窗口,带有一个测试用的定时消息 包含測試訊息通知的 KAlarm 設定視窗 https://kde.org/images/screenshots/kalarm.png KDE kalarm
diff --git a/src/undo.cpp b/src/undo.cpp index 5014de45..6dee8ccb 100644 --- a/src/undo.cpp +++ b/src/undo.cpp @@ -1,1444 +1,1444 @@ /* * undo.cpp - undo/redo facility * Program: kalarm * Copyright © 2005-2020 David Jarvie * * 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 "undo.h" #include "alarmcalendar.h" #include "functions.h" #include "resources/resources.h" #include "lib/messagebox.h" #include "kalarm_debug.h" #include #include #include #include static int maxCount = 12; #ifdef DELETE #undef DELETE // conflicting Windows macro #endif class UndoItem { public: enum Operation { ADD, EDIT, DELETE, REACTIVATE, DEACTIVATE, MULTI }; UndoItem(); // needed by QList virtual ~UndoItem(); virtual Operation operation() const = 0; virtual QString actionText() const { return !mName.isEmpty() ? mName : defaultActionText(); } virtual QString defaultActionText() const = 0; virtual QString description() const { return QString(); } virtual QString eventID() const { return QString(); } virtual QString oldEventID() const { return QString(); } virtual QString newEventID() const { return QString(); } virtual Resource resource() const { return Resource(); } int id() const { return mId; } Undo::Type type() const { return mType; } void setType(Undo::Type t) { mType = t; } CalEvent::Type calendar() const { return mCalendar; } virtual void setCalendar(CalEvent::Type s) { mCalendar = s; } virtual UndoItem* restore() = 0; virtual bool deleteID(const QString& /*id*/) { return false; } virtual void dumpDebug() const; enum Error { ERR_NONE, ERR_PROG, ERR_NOT_FOUND, ERR_CREATE, ERR_TEMPLATE, ERR_ARCHIVED }; enum Warning { WARN_NONE, WARN_KORG_ADD, WARN_KORG_MODIFY, WARN_KORG_DELETE }; static int mLastId; static Error mRestoreError; // error code valid only if restore() returns 0 static Warning mRestoreWarning; // warning code set by restore() static KAlarm::UpdateResult mRestoreWarningKorg; // KOrganizer error status set by restore() static int mRestoreWarningCount; // item count for mRestoreWarning (to allow i18n messages to work correctly) protected: UndoItem(Undo::Type, const QString& name = QString()); static QString addDeleteActionText(CalEvent::Type, bool add); QString description(const KAEvent&) const; void replaceWith(UndoItem* item) { Undo::replace(this, item); } virtual void dumpDebugTitle(const char* typeName) const; QString mName; // specified action name (overrides default) int mId {0}; // unique identifier (only for mType = UNDO, REDO) Undo::Type mType; // which list (if any) the object is in CalEvent::Type mCalendar; }; class UndoMultiBase : public UndoItem { public: UndoMultiBase(Undo::Type t, const QString& name) : UndoItem(t, name), mUndos(new Undo::List) {} UndoMultiBase(Undo::Type t, Undo::List* undos, const QString& name) : UndoItem(t, name), mUndos(undos) {} ~UndoMultiBase() { delete mUndos; } const Undo::List* undos() const { return mUndos; } protected: void dumpDebugTitle(const char* typeName) const override; Undo::List* mUndos; // this list must always have >= 2 entries }; template class UndoMulti : public UndoMultiBase { public: UndoMulti(Undo::Type, const Undo::EventList&, const QString& name); UndoMulti(Undo::Type t, Undo::List* undos, const QString& name) : UndoMultiBase(t, undos, name) {} Operation operation() const override { return MULTI; } UndoItem* restore() override; bool deleteID(const QString& id) override; virtual UndoItem* createRedo(Undo::List*) = 0; }; class UndoAdd : public UndoItem { public: UndoAdd(Undo::Type, const Undo::Event&, const QString& name = QString()); UndoAdd(Undo::Type, const KAEvent&, const Resource&, const QString& name = QString()); UndoAdd(Undo::Type, const KAEvent&, const Resource&, const QString& name, CalEvent::Type); Operation operation() const override { return ADD; } QString defaultActionText() const override; QString description() const override { return mDescription; } Resource resource() const override { return mResource; } QString eventID() const override { return mEventId; } QString newEventID() const override { return mEventId; } UndoItem* restore() override { return doRestore(); } void dumpDebug() const override; protected: UndoItem* doRestore(bool setArchive = false); virtual UndoItem* createRedo(const KAEvent&, const Resource&); void dumpDebugTitle(const char* typeName) const override; private: Resource mResource; // resource containing the event QString mEventId; QString mDescription; }; class UndoEdit : public UndoItem { public: UndoEdit(Undo::Type, const KAEvent& oldEvent, const QString& newEventID, const Resource&, const QStringList& dontShowErrors, const QString& description); ~UndoEdit(); Operation operation() const override { return EDIT; } QString defaultActionText() const override; QString description() const override { return mDescription; } Resource resource() const override { return mResource; } QString eventID() const override { return mNewEventId; } QString oldEventID() const override { return mOldEvent->id(); } QString newEventID() const override { return mNewEventId; } UndoItem* restore() override; void dumpDebug() const override; protected: void dumpDebugTitle(const char* typeName) const override; private: Resource mResource; // resource containing the event KAEvent* mOldEvent; QString mNewEventId; QString mDescription; QStringList mDontShowErrors; }; class UndoDelete : public UndoItem { public: UndoDelete(Undo::Type, const Undo::Event&, const QString& name = QString()); UndoDelete(Undo::Type, const KAEvent&, const Resource&, const QStringList& dontShowErrors, const QString& name = QString()); ~UndoDelete(); Operation operation() const override { return DELETE; } QString defaultActionText() const override; QString description() const override { return UndoItem::description(*mEvent); } Resource resource() const override { return mResource; } QString eventID() const override { return mEvent->id(); } QString oldEventID() const override { return mEvent->id(); } UndoItem* restore() override; KAEvent* event() const { return mEvent; } void dumpDebug() const override; protected: virtual UndoItem* createRedo(const KAEvent&, const Resource&); void dumpDebugTitle(const char* typeName) const override; private: Resource mResource; // resource containing the event KAEvent* mEvent; QStringList mDontShowErrors; }; class UndoReactivate : public UndoAdd { public: UndoReactivate(Undo::Type t, const Undo::Event& e, const QString& name = QString()) : UndoAdd(t, e.event, e.resource, name, CalEvent::ACTIVE) {} UndoReactivate(Undo::Type t, const KAEvent& e, const Resource& r, const QString& name = QString()) : UndoAdd(t, e, r, name, CalEvent::ACTIVE) {} Operation operation() const override { return REACTIVATE; } QString defaultActionText() const override; UndoItem* restore() override; void dumpDebug() const override; protected: UndoItem* createRedo(const KAEvent&, const Resource&) override; }; class UndoDeactivate : public UndoDelete { public: UndoDeactivate(Undo::Type t, const KAEvent& e, const Resource& r, const QString& name = QString()) : UndoDelete(t, e, r, QStringList(), name) {} Operation operation() const override { return DEACTIVATE; } QString defaultActionText() const override; UndoItem* restore() override; void dumpDebug() const override; protected: UndoItem* createRedo(const KAEvent&, const Resource&) override; }; class UndoAdds : public UndoMulti { public: UndoAdds(Undo::Type t, const Undo::EventList& events, const QString& name = QString()) : UndoMulti(t, events, name) {} // UNDO only UndoAdds(Undo::Type t, Undo::List* undos, const QString& name) : UndoMulti(t, undos, name) {} QString defaultActionText() const override; UndoItem* createRedo(Undo::List*) override; void dumpDebug() const override; }; class UndoDeletes : public UndoMulti { public: UndoDeletes(Undo::Type t, const Undo::EventList& events, const QString& name = QString()) : UndoMulti(t, events, name) {} // UNDO only UndoDeletes(Undo::Type t, Undo::List* undos, const QString& name) : UndoMulti(t, undos, name) {} QString defaultActionText() const override; UndoItem* createRedo(Undo::List*) override; void dumpDebug() const override; }; class UndoReactivates : public UndoMulti { public: UndoReactivates(Undo::Type t, const Undo::EventList& events, const QString& name = QString()) : UndoMulti(t, events, name) {} // UNDO only UndoReactivates(Undo::Type t, Undo::List* undos, const QString& name) : UndoMulti(t, undos, name) {} QString defaultActionText() const override; UndoItem* createRedo(Undo::List*) override; void dumpDebug() const override; }; Undo* Undo::mInstance = nullptr; Undo::List Undo::mUndoList; Undo::List Undo::mRedoList; /****************************************************************************** * Create the one and only instance of the Undo class. */ Undo* Undo::instance() { if (!mInstance) mInstance = new Undo(qApp); return mInstance; } /****************************************************************************** * Clear the lists of undo and redo items. */ void Undo::clear() { if (!mUndoList.isEmpty() || !mRedoList.isEmpty()) { mInstance->blockSignals(true); while (!mUndoList.isEmpty()) delete mUndoList.first(); // N.B. 'delete' removes the object from the list while (!mRedoList.isEmpty()) delete mRedoList.first(); // N.B. 'delete' removes the object from the list mInstance->blockSignals(false); emitChanged(); } } /****************************************************************************** * Create an undo item and add it to the list of undos. * N.B. The base class constructor adds the object to the undo list. */ void Undo::saveAdd(const KAEvent& event, const Resource& resource, const QString& name) { new UndoAdd(UNDO, event, resource, name); emitChanged(); } void Undo::saveAdds(const Undo::EventList& events, const QString& name) { int count = events.count(); if (count == 1) saveAdd(events.first().event, events.first().resource, name); else if (count > 1) { new UndoAdds(UNDO, events, name); emitChanged(); } } void Undo::saveEdit(const Undo::Event& oldEvent, const KAEvent& newEvent) { new UndoEdit(UNDO, oldEvent.event, newEvent.id(), oldEvent.resource, oldEvent.dontShowErrors, AlarmText::summary(newEvent)); removeRedos(oldEvent.event.id()); // remove any redos which are made invalid by this edit emitChanged(); } void Undo::saveDelete(const Undo::Event& event, const QString& name) { new UndoDelete(UNDO, event.event, event.resource, event.dontShowErrors, name); removeRedos(event.event.id()); // remove any redos which are made invalid by this deletion emitChanged(); } void Undo::saveDeletes(const Undo::EventList& events, const QString& name) { int count = events.count(); if (count == 1) saveDelete(events[0], name); else if (count > 1) { new UndoDeletes(UNDO, events, name); for (const Undo::Event& event : events) removeRedos(event.event.id()); // remove any redos which are made invalid by these deletions emitChanged(); } } void Undo::saveReactivate(const KAEvent& event, const Resource& resource, const QString& name) { new UndoReactivate(UNDO, event, resource, name); emitChanged(); } void Undo::saveReactivates(const EventList& events, const QString& name) { int count = events.count(); if (count == 1) saveReactivate(events[0].event, events[0].resource, name); else if (count > 1) { new UndoReactivates(UNDO, events, name); emitChanged(); } } /****************************************************************************** * Remove any redos which are made invalid by a new undo. */ void Undo::removeRedos(const QString& eventID) { QString id = eventID; for (int i = 0; i < mRedoList.count(); ) { UndoItem* item = mRedoList[i]; if (item->operation() == UndoItem::MULTI) { if (item->deleteID(id)) { // The old multi-redo was replaced with a new single redo delete item; // N.B. 'delete' removes the object from the list } } else if (item->eventID() == id) { if (item->operation() == UndoItem::EDIT) id = item->oldEventID(); // continue looking for its post-edit ID delete item; // N.B. 'delete' removes the object from the list } else ++i; } } /****************************************************************************** * Undo or redo a specified item. * Reply = true if success, or if the item no longer exists. */ bool Undo::undo(int i, Undo::Type type, QWidget* parent, const QString& action) { UndoItem::mRestoreError = UndoItem::ERR_NONE; UndoItem::mRestoreWarning = UndoItem::WARN_NONE; UndoItem::mRestoreWarningKorg = KAlarm::UPDATE_OK; UndoItem::mRestoreWarningCount = 0; List& list = (type == UNDO) ? mUndoList : mRedoList; if (i < list.count() && list[i]->type() == type) { list[i]->restore(); delete list[i]; // N.B. 'delete' removes the object from its list emitChanged(); } QString err; switch (UndoItem::mRestoreError) { case UndoItem::ERR_NONE: { KAlarm::UpdateError errcode; switch (UndoItem::mRestoreWarning) { case UndoItem::WARN_KORG_ADD: errcode = KAlarm::ERR_ADD; break; case UndoItem::WARN_KORG_MODIFY: errcode = KAlarm::ERR_MODIFY; break; case UndoItem::WARN_KORG_DELETE: errcode = KAlarm::ERR_DELETE; break; case UndoItem::WARN_NONE: default: return true; } KAlarm::displayKOrgUpdateError(parent, errcode, UndoItem::mRestoreWarningKorg, UndoItem::mRestoreWarningCount); return true; } case UndoItem::ERR_NOT_FOUND: err = i18nc("@info", "Alarm not found"); break; case UndoItem::ERR_CREATE: err = i18nc("@info", "Error recreating alarm"); break; case UndoItem::ERR_TEMPLATE: err = i18nc("@info", "Error recreating alarm template"); break; case UndoItem::ERR_ARCHIVED: err = i18nc("@info", "Cannot reactivate archived alarm"); break; case UndoItem::ERR_PROG: err = i18nc("@info", "Program error"); break; default: err = i18nc("@info", "Unknown error"); break; } KAMessageBox::sorry(parent, i18nc("@info Undo-action: message", "%1: %2", action, err)); return false; } /****************************************************************************** * Add an undo item to the start of one of the lists. */ void Undo::add(UndoItem* item, bool undo) { if (item) { // Limit the number of items stored const int undoCount = mUndoList.count(); const int redoCount = mRedoList.count(); if (undoCount + redoCount >= maxCount - 1) { if (undoCount) mUndoList.pop_back(); else mRedoList.pop_back(); } // Append the new item List* const list = undo ? &mUndoList : &mRedoList; list->prepend(item); } } /****************************************************************************** * Remove an undo item from one of the lists. */ void Undo::remove(UndoItem* item, bool undo) { List* const list = undo ? &mUndoList : &mRedoList; if (!list->isEmpty()) list->removeAt(list->indexOf(item)); } /****************************************************************************** * Replace an undo item in one of the lists. */ void Undo::replace(UndoItem* old, UndoItem* New) { const Type type = old->type(); List* const list = (type == UNDO) ? &mUndoList : (type == REDO) ? &mRedoList : nullptr; if (!list) return; const int i = list->indexOf(old); if (i >= 0) { New->setType(type); // ensure the item points to the correct list (*list)[i] = New; old->setType(NONE); // mark the old item as no longer being in a list } } /****************************************************************************** * Return the action description of the latest undo/redo item. */ QString Undo::actionText(Undo::Type type) { const List* const list = (type == UNDO) ? &mUndoList : (type == REDO) ? &mRedoList : nullptr; return (list && !list->isEmpty()) ? (*list)[0]->actionText() : QString(); } /****************************************************************************** * Return the action description of the undo/redo item with the specified ID. */ QString Undo::actionText(Undo::Type type, int id) { const UndoItem* undo = getItem(id, type); return undo ? undo->actionText() : QString(); } /****************************************************************************** * Return the alarm description of the undo/redo item with the specified ID. */ QString Undo::description(Undo::Type type, int id) { const UndoItem* undo = getItem(id, type); return undo ? undo->description() : QString(); } /****************************************************************************** * Return the descriptions of all undo or redo items, in order latest first. * For alarms which have undergone more than one change, only the first one is * listed, to force dependent undos to be executed in their correct order. * If 'ids' is non-null, also returns a list of their corresponding IDs. */ QList Undo::ids(Undo::Type type) { QList ids; QStringList ignoreIDs; //int n=0; const List* const list = (type == UNDO) ? &mUndoList : (type == REDO) ? &mRedoList : nullptr; if (!list) return ids; for (const UndoItem* item : *list) { // Check whether this item should be ignored because it is a // dependent undo. If not, add this item's ID to the ignore list. bool omit = false; if (item->operation() == UndoItem::MULTI) { // If any item in a multi-undo is disqualified, omit the whole multi-undo QStringList newIDs; const Undo::List* undos = ((UndoMultiBase*)item)->undos(); for (const UndoItem* undo : *undos) { const QString evid = undo->eventID(); if (ignoreIDs.contains(evid)) omit = true; else if (omit) ignoreIDs.append(evid); else newIDs.append(evid); } if (omit) { for (const QString& newID : qAsConst(newIDs)) ignoreIDs.append(newID); } } else { omit = ignoreIDs.contains(item->eventID()); if (!omit) ignoreIDs.append(item->eventID()); if (item->operation() == UndoItem::EDIT) ignoreIDs.append(item->oldEventID()); // continue looking for its post-edit ID } if (!omit) ids.append(item->id()); //else qCDebug(KALARM_LOG)<<"Undo::ids(): omit"<actionText()<<":"<description(); } //qCDebug(KALARM_LOG)<<"Undo::ids():"<"<emitChanged(actionText(UNDO), actionText(REDO)); } /****************************************************************************** * Return the item with the specified ID. */ UndoItem* Undo::getItem(int id, Undo::Type type) { List* const list = (type == UNDO) ? &mUndoList : (type == REDO) ? &mRedoList : nullptr; if (list) { for (int i = 0, end = list->count(); i < end; ++i) { UndoItem* item = (*list)[i]; if (item->id() == id) return item; } } return nullptr; } /****************************************************************************** * Find an item with the specified ID. */ int Undo::findItem(int id, Undo::Type type) { const List& list = (type == UNDO) ? mUndoList : mRedoList; int i = 0; - for (const UndoItem* item : list) + for (int end = list.count(); i < end; ++i) { - if (item->id() == id) + if (list[i]->id() == id) break; } return i; } /****************************************************************************** * Dump the last 'count' undos or redos to debug, starting with the most recent. */ void Undo::dumpDebug(Undo::Type type, int count) { #ifndef KDE_NO_DEBUG_OUTPUT const List& list = (type == UNDO) ? mUndoList : mRedoList; if (count > list.count()) count = list.count(); qCDebug(KALARM_LOG) << "Undo::dumpDebug():" << count; for (int i = 0; i < count; ++i) list[i]->dumpDebug(); #endif } /*============================================================================= = Class: UndoItem = A single undo action. =============================================================================*/ int UndoItem::mLastId = 0; UndoItem::Error UndoItem::mRestoreError; UndoItem::Warning UndoItem::mRestoreWarning; KAlarm::UpdateResult UndoItem::mRestoreWarningKorg; int UndoItem::mRestoreWarningCount; /****************************************************************************** * Constructor. * Optionally appends the undo to the list of undos. */ UndoItem::UndoItem(Undo::Type type, const QString& name) : mName(name) , mType(type) , mCalendar(CalEvent::EMPTY) { if (type != Undo::NONE) { mId = ++mLastId; if (mId < 0) mId = mLastId = 1; // wrap round if we reach a negative number Undo::add(this, (mType == Undo::UNDO)); } } /****************************************************************************** * Destructor. * Removes the undo from the list (if it's in the list). */ UndoItem::~UndoItem() { if (mType != Undo::NONE) Undo::remove(this, (mType == Undo::UNDO)); } /****************************************************************************** * Return the description of an event. */ QString UndoItem::description(const KAEvent& event) const { return (mCalendar == CalEvent::TEMPLATE) ? event.templateName() : AlarmText::summary(event); } /****************************************************************************** * Return the action description of an add or delete Undo/Redo item for displaying. */ QString UndoItem::addDeleteActionText(CalEvent::Type calendar, bool add) { switch (calendar) { case CalEvent::ACTIVE: if (add) return i18nc("@info Action to create a new alarm", "New alarm"); else return i18nc("@info Action to delete an alarm", "Delete alarm"); case CalEvent::TEMPLATE: if (add) return i18nc("@info Action to create a new alarm template", "New template"); else return i18nc("@info Action to delete an alarm template", "Delete template"); case CalEvent::ARCHIVED: return i18nc("@info", "Delete archived alarm"); default: break; } return QString(); } /****************************************************************************** * Dump the instance's contents to debug. */ void UndoItem::dumpDebug() const { #ifndef KDE_NO_DEBUG_OUTPUT dumpDebugTitle("UndoItem"); #endif } void UndoItem::dumpDebugTitle(const char* typeName) const { #ifndef KDE_NO_DEBUG_OUTPUT qCDebug(KALARM_LOG) << typeName << "begin:"; qCDebug(KALARM_LOG) << "-- mName: " << mName; qCDebug(KALARM_LOG) << "-- mId: " << mId; qCDebug(KALARM_LOG) << "-- mType: " << (mType == Undo::UNDO ? "Undo" : mType == Undo::REDO ? "Redo" : "None"); qCDebug(KALARM_LOG) << "-- mCalendar: " << mCalendar; #endif } /*============================================================================= = Class: UndoMultiBase = Undo item for multiple alarms. =============================================================================*/ /****************************************************************************** * Dump the instance's contents to debug. */ void UndoMultiBase::dumpDebugTitle(const char* typeName) const { #ifndef KDE_NO_DEBUG_OUTPUT UndoItem::dumpDebugTitle(typeName); qCDebug(KALARM_LOG) << "-- mUndos count:" << mUndos->count(); #endif } /*============================================================================= = Class: UndoMulti = Undo item for multiple alarms. =============================================================================*/ template UndoMulti::UndoMulti(Undo::Type type, const Undo::EventList& events, const QString& name) : UndoMultiBase(type, name) // UNDO only { for (const Undo::Event& event : events) mUndos->append(new T(Undo::NONE, event)); } /****************************************************************************** * Undo the item, i.e. restore multiple alarms which were deleted (or delete * alarms which were restored). * Create a redo item to delete (or restore) the alarms again. * Reply = redo item. */ template UndoItem* UndoMulti::restore() { Undo::List* newUndos = new Undo::List; for (int i = 0, end = mUndos->count(); i < end; ++i) { UndoItem* undo = (*mUndos)[i]->restore(); if (undo) newUndos->append(undo); } if (newUndos->isEmpty()) { delete newUndos; return nullptr; } // Create a redo item to delete the alarm again return createRedo(newUndos); } /****************************************************************************** * If one of the multiple items has the specified ID, delete it. * If an item is deleted and there is only one item left, the UndoMulti * instance is removed from its list and replaced by the remaining UndoItem instead. * Reply = true if this instance was replaced. The caller must delete it. * = false otherwise. */ template bool UndoMulti::deleteID(const QString& id) { for (int i = 0, end = mUndos->count(); i < end; ++i) { UndoItem* item = (*mUndos)[i]; if (item->eventID() == id) { // Found a matching entry - remove it mUndos->removeAt(i); if (mUndos->count() == 1) { // There is only one entry left after removal. // Replace 'this' multi instance with the remaining single entry. replaceWith(item); return true; } else { delete item; return false; } } } return false; } /*============================================================================= = Class: UndoAdd = Undo item for alarm creation. =============================================================================*/ UndoAdd::UndoAdd(Undo::Type type, const Undo::Event& undo, const QString& name) : UndoItem(type, name) , mResource(undo.resource) , mEventId(undo.event.id()) { setCalendar(undo.event.category()); mDescription = UndoItem::description(undo.event); // calendar must be set before calling this } UndoAdd::UndoAdd(Undo::Type type, const KAEvent& event, const Resource& resource, const QString& name) : UndoItem(type, name) , mResource(resource) , mEventId(event.id()) { setCalendar(event.category()); mDescription = UndoItem::description(event); // calendar must be set before calling this } UndoAdd::UndoAdd(Undo::Type type, const KAEvent& event, const Resource& resource, const QString& name, CalEvent::Type cal) : UndoItem(type, name) , mResource(resource) , mEventId(CalEvent::uid(event.id(), cal)) // convert if old-style event ID { setCalendar(cal); mDescription = UndoItem::description(event); // calendar must be set before calling this } /****************************************************************************** * Undo the item, i.e. delete the alarm which was added. * Create a redo item to add the alarm back again. * Reply = redo item. */ UndoItem* UndoAdd::doRestore(bool setArchive) { // Retrieve the current state of the alarm qCDebug(KALARM_LOG) << "UndoAdd::doRestore:" << mEventId; const KAEvent* ev = ResourcesCalendar::getEvent(EventId(mResource.id(), mEventId)); if (!ev) { mRestoreError = ERR_NOT_FOUND; // alarm is no longer in calendar return nullptr; } KAEvent event(*ev); // Create a redo item to recreate the alarm. // Do it now, since 'event' gets modified by KAlarm::deleteEvent() UndoItem* undo = createRedo(event, mResource); switch (calendar()) { case CalEvent::ACTIVE: { if (setArchive) event.setArchive(); // Archive it if it has already triggered KAlarm::UpdateResult status = KAlarm::deleteEvent(event, mResource, true); switch (status.status) { case KAlarm::UPDATE_ERROR: case KAlarm::UPDATE_FAILED: case KAlarm::SAVE_FAILED: mRestoreError = ERR_CREATE; break; case KAlarm::UPDATE_KORG_FUNCERR: case KAlarm::UPDATE_KORG_ERRINIT: case KAlarm::UPDATE_KORG_ERRSTART: case KAlarm::UPDATE_KORG_ERR: mRestoreWarning = WARN_KORG_DELETE; ++mRestoreWarningCount; if (status.status > mRestoreWarningKorg.status) mRestoreWarningKorg = status; break; default: break; } break; } case CalEvent::TEMPLATE: if (KAlarm::deleteTemplate(event) != KAlarm::UPDATE_OK) mRestoreError = ERR_TEMPLATE; break; case CalEvent::ARCHIVED: // redoing the deletion of an archived alarm { Resource resource; KAlarm::deleteEvent(event, resource); break; } default: delete undo; mRestoreError = ERR_PROG; return nullptr; } return undo; } /****************************************************************************** * Create a redo item to add the alarm back again. */ UndoItem* UndoAdd::createRedo(const KAEvent& event, const Resource& resource) { const Undo::Type t = (type() == Undo::UNDO) ? Undo::REDO : (type() == Undo::REDO) ? Undo::UNDO : Undo::NONE; return new UndoDelete(t, event, resource, QStringList(), mName); } /****************************************************************************** * Return the action description of the Undo item for displaying. */ QString UndoAdd::defaultActionText() const { return addDeleteActionText(calendar(), (type() == Undo::UNDO)); } /****************************************************************************** * Dump the instance's contents to debug. */ void UndoAdd::dumpDebug() const { #ifndef KDE_NO_DEBUG_OUTPUT dumpDebugTitle("UndoAdd"); #endif } void UndoAdd::dumpDebugTitle(const char* typeName) const { #ifndef KDE_NO_DEBUG_OUTPUT UndoItem::dumpDebugTitle(typeName); qCDebug(KALARM_LOG) << "-- mResource: " << mResource.id(); qCDebug(KALARM_LOG) << "-- mEventId: " << mEventId; qCDebug(KALARM_LOG) << "-- mDescript: " << mDescription; #endif } /*============================================================================= = Class: UndoAdds = Undo item for multiple alarm creation. =============================================================================*/ /****************************************************************************** * Create a redo item to add the alarms again. */ UndoItem* UndoAdds::createRedo(Undo::List* undos) { const Undo::Type t = (type() == Undo::UNDO) ? Undo::REDO : (type() == Undo::REDO) ? Undo::UNDO : Undo::NONE; return new UndoAdds(t, undos, mName); } /****************************************************************************** * Return the action description of the Undo item for displaying. */ QString UndoAdds::defaultActionText() const { return i18nc("@info", "Create multiple alarms"); } /****************************************************************************** * Dump the instance's contents to debug. */ void UndoAdds::dumpDebug() const { #ifndef KDE_NO_DEBUG_OUTPUT dumpDebugTitle("UndoAdds"); #endif } /*============================================================================= = Class: UndoEdit = Undo item for alarm edit. =============================================================================*/ UndoEdit::UndoEdit(Undo::Type type, const KAEvent& oldEvent, const QString& newEventID, const Resource& resource, const QStringList& dontShowErrors, const QString& description) : UndoItem(type) , mResource(resource) , mOldEvent(new KAEvent(oldEvent)) , mNewEventId(newEventID) , mDescription(description) , mDontShowErrors(dontShowErrors) { setCalendar(oldEvent.category()); } UndoEdit::~UndoEdit() { delete mOldEvent; } /****************************************************************************** * Undo the item, i.e. undo an edit to a previously existing alarm. * Create a redo item to reapply the edit. * Reply = redo item. */ UndoItem* UndoEdit::restore() { qCDebug(KALARM_LOG) << "UndoEdit::restore:" << mNewEventId; // Retrieve the current state of the alarm const KAEvent* event = ResourcesCalendar::getEvent(EventId(mResource.id(), mNewEventId)); if (!event) { mRestoreError = ERR_NOT_FOUND; // alarm is no longer in calendar return nullptr; } KAEvent newEvent(*event); // Create a redo item to restore the edit const Undo::Type t = (type() == Undo::UNDO) ? Undo::REDO : (type() == Undo::REDO) ? Undo::UNDO : Undo::NONE; UndoItem* undo = new UndoEdit(t, newEvent, mOldEvent->id(), mResource, KAlarm::dontShowErrors(EventId(newEvent)), mDescription); switch (calendar()) { case CalEvent::ACTIVE: { KAlarm::UpdateResult status = KAlarm::modifyEvent(newEvent, *mOldEvent); switch (status.status) { case KAlarm::UPDATE_ERROR: case KAlarm::UPDATE_FAILED: case KAlarm::SAVE_FAILED: mRestoreError = ERR_CREATE; break; case KAlarm::UPDATE_KORG_FUNCERR: case KAlarm::UPDATE_KORG_ERRINIT: case KAlarm::UPDATE_KORG_ERRSTART: case KAlarm::UPDATE_KORG_ERR: mRestoreWarning = WARN_KORG_MODIFY; ++mRestoreWarningCount; if (status.status > mRestoreWarningKorg.status) mRestoreWarningKorg = status; // fall through to default Q_FALLTHROUGH(); default: KAlarm::setDontShowErrors(EventId(*mOldEvent), mDontShowErrors); break; } break; } case CalEvent::TEMPLATE: if (KAlarm::updateTemplate(*mOldEvent) != KAlarm::UPDATE_OK) mRestoreError = ERR_TEMPLATE; break; case CalEvent::ARCHIVED: // editing of archived events is not allowed default: delete undo; mRestoreError = ERR_PROG; return nullptr; } return undo; } /****************************************************************************** * Return the action description of the Undo item for displaying. */ QString UndoEdit::defaultActionText() const { switch (calendar()) { case CalEvent::ACTIVE: return i18nc("@info Action to edit an alarm", "Edit alarm"); case CalEvent::TEMPLATE: return i18nc("@info Action to edit an alarm template", "Edit template"); default: break; } return QString(); } /****************************************************************************** * Dump the instance's contents to debug. */ void UndoEdit::dumpDebug() const { #ifndef KDE_NO_DEBUG_OUTPUT dumpDebugTitle("UndoEdit"); #endif } void UndoEdit::dumpDebugTitle(const char* typeName) const { #ifndef KDE_NO_DEBUG_OUTPUT UndoItem::dumpDebugTitle(typeName); qCDebug(KALARM_LOG) << "-- mResource: " << mResource.id(); qCDebug(KALARM_LOG) << "-- mOldEvent: " << mOldEvent->id(); qCDebug(KALARM_LOG) << "-- mNewEventId: " << mNewEventId; qCDebug(KALARM_LOG) << "-- mDescription:" << mDescription; qCDebug(KALARM_LOG) << "-- mDontShowErr:" << mDontShowErrors; #endif } /*============================================================================= = Class: UndoDelete = Undo item for alarm deletion. =============================================================================*/ UndoDelete::UndoDelete(Undo::Type type, const Undo::Event& undo, const QString& name) : UndoItem(type, name) , mResource(undo.resource) , mEvent(new KAEvent(undo.event)) , mDontShowErrors(undo.dontShowErrors) { setCalendar(mEvent->category()); } UndoDelete::UndoDelete(Undo::Type type, const KAEvent& event, const Resource& resource, const QStringList& dontShowErrors, const QString& name) : UndoItem(type, name) , mResource(resource) , mEvent(new KAEvent(event)) , mDontShowErrors(dontShowErrors) { setCalendar(mEvent->category()); } UndoDelete::~UndoDelete() { delete mEvent; } /****************************************************************************** * Undo the item, i.e. restore an alarm which was deleted. * Create a redo item to delete the alarm again. * Reply = redo item. */ UndoItem* UndoDelete::restore() { qCDebug(KALARM_LOG) << "UndoDelete::restore:" << mEvent->id(); // Restore the original event CalEvent::Type saveType = calendar(); switch (calendar()) { case CalEvent::ACTIVE: if (mEvent->toBeArchived()) { // It was archived when it was deleted mEvent->setCategory(CalEvent::ARCHIVED); mEvent->setResourceId(Resources::resourceForEvent(mEvent->id()).id()); const KAlarm::UpdateResult status = KAlarm::reactivateEvent(*mEvent, mResource); switch (status.status) { case KAlarm::UPDATE_KORG_FUNCERR: case KAlarm::UPDATE_KORG_ERRINIT: case KAlarm::UPDATE_KORG_ERRSTART: case KAlarm::UPDATE_KORG_ERR: mRestoreWarning = WARN_KORG_ADD; ++mRestoreWarningCount; if (status.status > mRestoreWarningKorg.status) mRestoreWarningKorg = status; break; case KAlarm::UPDATE_ERROR: case KAlarm::UPDATE_FAILED: case KAlarm::SAVE_FAILED: mRestoreError = ERR_ARCHIVED; return nullptr; case KAlarm::UPDATE_OK: break; } } else { const KAlarm::UpdateResult status = KAlarm::addEvent(*mEvent, mResource, nullptr, true); switch (status.status) { case KAlarm::UPDATE_KORG_FUNCERR: case KAlarm::UPDATE_KORG_ERRINIT: case KAlarm::UPDATE_KORG_ERRSTART: case KAlarm::UPDATE_KORG_ERR: mRestoreWarning = WARN_KORG_ADD; ++mRestoreWarningCount; if (status.status > mRestoreWarningKorg.status) mRestoreWarningKorg = status; break; case KAlarm::UPDATE_ERROR: case KAlarm::UPDATE_FAILED: case KAlarm::SAVE_FAILED: mRestoreError = ERR_CREATE; return nullptr; case KAlarm::UPDATE_OK: break; } } KAlarm::setDontShowErrors(EventId(*mEvent), mDontShowErrors); break; case CalEvent::TEMPLATE: if (KAlarm::addTemplate(*mEvent, mResource) != KAlarm::UPDATE_OK) { mRestoreError = ERR_CREATE; return nullptr; } break; case CalEvent::ARCHIVED: if (!KAlarm::addArchivedEvent(*mEvent, mResource)) { mRestoreError = ERR_CREATE; return nullptr; } break; default: mRestoreError = ERR_PROG; return nullptr; } // Create a redo item to delete the alarm again mEvent->setCategory(saveType); return createRedo(*mEvent, mResource); } /****************************************************************************** * Create a redo item to archive the alarm again. */ UndoItem* UndoDelete::createRedo(const KAEvent& event, const Resource& resource) { const Undo::Type t = (type() == Undo::UNDO) ? Undo::REDO : (type() == Undo::REDO) ? Undo::UNDO : Undo::NONE; return new UndoAdd(t, event, resource, mName); } /****************************************************************************** * Return the action description of the Undo item for displaying. */ QString UndoDelete::defaultActionText() const { return addDeleteActionText(calendar(), (type() == Undo::REDO)); } /****************************************************************************** * Dump the instance's contents to debug. */ void UndoDelete::dumpDebug() const { #ifndef KDE_NO_DEBUG_OUTPUT dumpDebugTitle("UndoDelete"); #endif } void UndoDelete::dumpDebugTitle(const char* typeName) const { #ifndef KDE_NO_DEBUG_OUTPUT UndoItem::dumpDebugTitle(typeName); qCDebug(KALARM_LOG) << "-- mResource: " << mResource.id(); qCDebug(KALARM_LOG) << "-- mEvent: " << mEvent->id(); qCDebug(KALARM_LOG) << "-- mDontShowErr:" << mDontShowErrors; #endif } /*============================================================================= = Class: UndoDeletes = Undo item for multiple alarm deletion. =============================================================================*/ /****************************************************************************** * Create a redo item to delete the alarms again. */ UndoItem* UndoDeletes::createRedo(Undo::List* undos) { const Undo::Type t = (type() == Undo::UNDO) ? Undo::REDO : (type() == Undo::REDO) ? Undo::UNDO : Undo::NONE; return new UndoDeletes(t, undos, mName); } /****************************************************************************** * Return the action description of the Undo item for displaying. */ QString UndoDeletes::defaultActionText() const { if (mUndos->isEmpty()) return QString(); for (const UndoItem* item : *mUndos) { switch (item->calendar()) { case CalEvent::ACTIVE: return i18nc("@info", "Delete multiple alarms"); case CalEvent::TEMPLATE: return i18nc("@info", "Delete multiple templates"); case CalEvent::ARCHIVED: break; // check if they are ALL archived default: return QString(); } } return i18nc("@info", "Delete multiple archived alarms"); } /****************************************************************************** * Dump the instance's contents to debug. */ void UndoDeletes::dumpDebug() const { #ifndef KDE_NO_DEBUG_OUTPUT dumpDebugTitle("UndoDeletes"); #endif } /*============================================================================= = Class: UndoReactivate = Undo item for alarm reactivation. =============================================================================*/ /****************************************************************************** * Undo the item, i.e. re-archive the alarm which was reactivated. * Create a redo item to reactivate the alarm back again. * Reply = redo item. */ UndoItem* UndoReactivate::restore() { qCDebug(KALARM_LOG) << "UndoReactivate::restore"; // Validate the alarm's calendar switch (calendar()) { case CalEvent::ACTIVE: break; default: mRestoreError = ERR_PROG; return nullptr; } return UndoAdd::doRestore(true); // restore alarm, ensuring that it is re-archived } /****************************************************************************** * Create a redo item to add the alarm back again. */ UndoItem* UndoReactivate::createRedo(const KAEvent& event, const Resource& resource) { const Undo::Type t = (type() == Undo::UNDO) ? Undo::REDO : (type() == Undo::REDO) ? Undo::UNDO : Undo::NONE; return new UndoDeactivate(t, event, resource, mName); } /****************************************************************************** * Return the action description of the Undo item for displaying. */ QString UndoReactivate::defaultActionText() const { return i18nc("@info", "Reactivate alarm"); } /****************************************************************************** * Dump the instance's contents to debug. */ void UndoReactivate::dumpDebug() const { #ifndef KDE_NO_DEBUG_OUTPUT dumpDebugTitle("UndoReactivate"); #endif } /*============================================================================= = Class: UndoDeactivate = Redo item for alarm reactivation. =============================================================================*/ /****************************************************************************** * Undo the item, i.e. reactivate an alarm which was archived. * Create a redo item to archive the alarm again. * Reply = redo item. */ UndoItem* UndoDeactivate::restore() { qCDebug(KALARM_LOG) << "UndoDeactivate::restore"; // Validate the alarm's calendar switch (calendar()) { case CalEvent::ACTIVE: break; default: mRestoreError = ERR_PROG; return nullptr; } return UndoDelete::restore(); } /****************************************************************************** * Create a redo item to archive the alarm again. */ UndoItem* UndoDeactivate::createRedo(const KAEvent& event, const Resource& resource) { const Undo::Type t = (type() == Undo::UNDO) ? Undo::REDO : (type() == Undo::REDO) ? Undo::UNDO : Undo::NONE; return new UndoReactivate(t, event, resource, mName); } /****************************************************************************** * Return the action description of the Undo item for displaying. */ QString UndoDeactivate::defaultActionText() const { return i18nc("@info", "Reactivate alarm"); } /****************************************************************************** * Dump the instance's contents to debug. */ void UndoDeactivate::dumpDebug() const { #ifndef KDE_NO_DEBUG_OUTPUT dumpDebugTitle("UndoDeactivate"); #endif } /*============================================================================= = Class: UndoReactivates = Undo item for multiple alarm reactivation. =============================================================================*/ /****************************************************************************** * Create a redo item to reactivate the alarms again. */ UndoItem* UndoReactivates::createRedo(Undo::List* undos) { const Undo::Type t = (type() == Undo::UNDO) ? Undo::REDO : (type() == Undo::REDO) ? Undo::UNDO : Undo::NONE; return new UndoReactivates(t, undos, mName); } /****************************************************************************** * Return the action description of the Undo item for displaying. */ QString UndoReactivates::defaultActionText() const { return i18nc("@info", "Reactivate multiple alarms"); } /****************************************************************************** * Dump the instance's contents to debug. */ void UndoReactivates::dumpDebug() const { #ifndef KDE_NO_DEBUG_OUTPUT dumpDebugTitle("UndoReactivates"); #endif } /*============================================================================= = Class: Event = Event details for external calls. =============================================================================*/ Undo::Event::Event(const KAEvent& e, const Resource& r) : event(e) , resource(r) { if (e.category() == CalEvent::ACTIVE) dontShowErrors = KAlarm::dontShowErrors(EventId(e)); } // vim: et sw=4: