summaryrefslogtreecommitdiffstats
path: root/comm/calendar/base/content/preferences/alarms.js
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--comm/calendar/base/content/preferences/alarms.js165
1 files changed, 165 insertions, 0 deletions
diff --git a/comm/calendar/base/content/preferences/alarms.js b/comm/calendar/base/content/preferences/alarms.js
new file mode 100644
index 0000000000..29b5df30ab
--- /dev/null
+++ b/comm/calendar/base/content/preferences/alarms.js
@@ -0,0 +1,165 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/* exported gAlarmsPane */
+
+/* import-globals-from ../calendar-ui-utils.js */
+/* globals Preferences */
+
+Preferences.addAll([
+ { id: "calendar.alarms.playsound", type: "bool" },
+ { id: "calendar.alarms.soundURL", type: "string" },
+ { id: "calendar.alarms.soundType", type: "int" },
+ { id: "calendar.alarms.show", type: "bool" },
+ { id: "calendar.alarms.showmissed", type: "bool" },
+ { id: "calendar.alarms.onforevents", type: "int" },
+ { id: "calendar.alarms.onfortodos", type: "int" },
+ { id: "calendar.alarms.eventalarmlen", type: "int" },
+ { id: "calendar.alarms.eventalarmunit", type: "string" },
+ { id: "calendar.alarms.todoalarmlen", type: "int" },
+ { id: "calendar.alarms.todoalarmunit", type: "string" },
+ { id: "calendar.alarms.defaultsnoozelength", type: "int" },
+]);
+
+/**
+ * Global Object to hold methods for the alarms pref pane
+ */
+var gAlarmsPane = {
+ /**
+ * Initialize the alarms pref pane. Sets up dialog controls to match the
+ * values set in prefs.
+ */
+ init() {
+ // Enable/disable the alarm sound URL box and buttons
+ this.alarmsPlaySoundPrefChanged();
+
+ // Set the correct singular/plural for the time units
+ updateMenuLabelsPlural("eventdefalarmlen", "eventdefalarmunit");
+ updateMenuLabelsPlural("tododefalarmlen", "tododefalarmunit");
+ updateUnitLabelPlural("defaultsnoozelength", "defaultsnoozelengthunit", "minutes");
+
+ Preferences.addSyncFromPrefListener(document.getElementById("alarmSoundFileField"), () =>
+ this.readSoundLocation()
+ );
+ },
+
+ /**
+ * Converts the given file url to a nsIFile
+ *
+ * @param aFileURL A string with a file:// url.
+ * @returns The corresponding nsIFile.
+ */
+ convertURLToLocalFile(aFileURL) {
+ // Convert the file url into a nsIFile
+ if (aFileURL) {
+ let fph = Services.io.getProtocolHandler("file").QueryInterface(Ci.nsIFileProtocolHandler);
+ return fph.getFileFromURLSpec(aFileURL);
+ }
+ return null;
+ },
+
+ /**
+ * Handler function to be called when the calendar.alarms.soundURL pref has
+ * changed. Updates the label in the dialog.
+ */
+ readSoundLocation() {
+ let soundUrl = document.getElementById("alarmSoundFileField");
+ soundUrl.value = Preferences.get("calendar.alarms.soundURL").value;
+ if (soundUrl.value.startsWith("file://")) {
+ soundUrl.label = gAlarmsPane.convertURLToLocalFile(soundUrl.value).leafName;
+ } else {
+ soundUrl.label = soundUrl.value;
+ }
+ soundUrl.style.backgroundImage = "url(moz-icon://" + soundUrl.label + "?size=16)";
+ return undefined;
+ },
+
+ /**
+ * Causes the default sound to be selected in the dialog controls
+ */
+ useDefaultSound() {
+ let defaultSoundUrl = "chrome://calendar/content/sound.wav";
+ Preferences.get("calendar.alarms.soundURL").value = defaultSoundUrl;
+ document.getElementById("alarmSoundCheckbox").checked = true;
+ this.readSoundLocation();
+ },
+
+ /**
+ * Opens a filepicker to open a local sound for the alarm.
+ */
+ browseAlarm() {
+ let picker = Cc["@mozilla.org/filepicker;1"].createInstance(Ci.nsIFilePicker);
+
+ // If we already have a sound file, then use the path for that sound file
+ // as the initial path in the dialog.
+ let currentValue = Preferences.get("calendar.alarms.soundURL").value;
+ if (currentValue && currentValue.startsWith("file://")) {
+ let localFile = Services.io.newURI(currentValue).QueryInterface(Ci.nsIFileURL).file;
+ picker.displayDirectory = localFile.parent;
+ }
+
+ let title = document.getElementById("bundlePreferences").getString("soundFilePickerTitle");
+
+ picker.init(window, title, Ci.nsIFilePicker.modeOpen);
+ picker.appendFilters(Ci.nsIFilePicker.filterAudio);
+ picker.appendFilters(Ci.nsIFilePicker.filterAll);
+
+ picker.open(rv => {
+ if (rv != Ci.nsIFilePicker.returnOK || !picker.file) {
+ return;
+ }
+ Preferences.get("calendar.alarms.soundURL").value = picker.fileURL.spec;
+ document.getElementById("alarmSoundCheckbox").checked = true;
+ this.readSoundLocation();
+ });
+ },
+
+ /**
+ * Plays the alarm sound currently selected.
+ */
+ previewAlarm() {
+ let soundUrl;
+ if (Preferences.get("calendar.alarms.soundType").value == 0) {
+ soundUrl = "chrome://calendar/content/sound.wav";
+ } else {
+ soundUrl = Preferences.get("calendar.alarms.soundURL").value;
+ }
+ let soundIfc = Cc["@mozilla.org/sound;1"].createInstance(Ci.nsISound);
+ let url;
+ try {
+ soundIfc.init();
+ if (soundUrl && soundUrl.length && soundUrl.length > 0) {
+ url = Services.io.newURI(soundUrl);
+ soundIfc.play(url);
+ } else {
+ soundIfc.beep();
+ }
+ } catch (ex) {
+ dump("alarms.js previewAlarm Exception caught! " + ex + "\n");
+ }
+ },
+
+ /**
+ * Handler function to call when the calendar.alarms.playsound preference
+ * has been changed. Updates the disabled state of fields that depend on
+ * playing a sound.
+ */
+ alarmsPlaySoundPrefChanged() {
+ let alarmsPlaySoundPref = Preferences.get("calendar.alarms.playsound");
+ let alarmsSoundType = Preferences.get("calendar.alarms.soundType");
+
+ for (let item of ["alarmSoundType", "calendar.prefs.alarm.sound.play"]) {
+ document.getElementById(item).disabled = !alarmsPlaySoundPref.value;
+ }
+
+ for (let item of ["alarmSoundFileField", "calendar.prefs.alarm.sound.browse"]) {
+ document.getElementById(item).disabled =
+ alarmsSoundType.value != 1 || !alarmsPlaySoundPref.value;
+ }
+ },
+};
+
+Preferences.get("calendar.alarms.playsound").on("change", gAlarmsPane.alarmsPlaySoundPrefChanged);
+Preferences.get("calendar.alarms.soundType").on("change", gAlarmsPane.alarmsPlaySoundPrefChanged);
+Preferences.get("calendar.alarms.soundURL").on("change", gAlarmsPane.readSoundLocation);