|
@@ -0,0 +1,153 @@
|
|
|
+# HG changeset patch
|
|
|
+# User MakeMyDay <makemyday@gmx-topmail.de>
|
|
|
+# Date 1533328118 -7200
|
|
|
+# Node ID b015e76f95e34ec2432bde120706a5b22f681876
|
|
|
+# Parent fba8ffb861bbff50fb2b8138ffe4f5fb9208b561
|
|
|
+Bug 1479449 - Avoid an additional prompt when deleting as part of cutting a recurring event. r+a=philipp
|
|
|
+
|
|
|
+diff --git a/calendar/base/content/calendar-clipboard.js b/calendar/base/content/calendar-clipboard.js
|
|
|
+--- a/calendar/base/content/calendar-clipboard.js
|
|
|
++++ b/calendar/base/content/calendar-clipboard.js
|
|
|
+@@ -36,53 +36,64 @@ function canPaste() {
|
|
|
+ return Services.clipboard.hasDataMatchingFlavors(flavors,
|
|
|
+ flavors.length,
|
|
|
+ Ci.nsIClipboard.kGlobalClipboard);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Copy the ics data of the current view's selected events to the clipboard and
|
|
|
+ * deletes the events on success
|
|
|
++ *
|
|
|
++ * @param aCalendarItemArray (optional) an array of items to cut. If not
|
|
|
++ * passed, the current view's selected items will
|
|
|
++ * be used.
|
|
|
+ */
|
|
|
+-function cutToClipboard() {
|
|
|
+- if (copyToClipboard(null, true)) {
|
|
|
+- deleteSelectedItems();
|
|
|
+- }
|
|
|
++function cutToClipboard(aCalendarItemArray=null) {
|
|
|
++ copyToClipboard(aCalendarItemArray, true);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Copy the ics data of the items in calendarItemArray to the clipboard. Fills
|
|
|
+ * both text/unicode and text/calendar mime types.
|
|
|
+ *
|
|
|
+ * @param aCalendarItemArray (optional) an array of items to copy. If not
|
|
|
+ * passed, the current view's selected items will
|
|
|
+ * be used.
|
|
|
+ * @param aCutMode (optional) set to true, if this is a cut operation
|
|
|
+- * @return A boolean indicating if the operation succeeded.
|
|
|
+ */
|
|
|
+ function copyToClipboard(aCalendarItemArray=null, aCutMode=false) {
|
|
|
+ let calendarItemArray = aCalendarItemArray || getSelectedItems();
|
|
|
+ if (!calendarItemArray.length) {
|
|
|
+- cal.LOG("[calendar-clipboard] No items to copy.");
|
|
|
+- return false;
|
|
|
++ cal.LOG("[calendar-clipboard] No items selected.");
|
|
|
++ return;
|
|
|
++ }
|
|
|
++ if (aCutMode) {
|
|
|
++ let items = calendarItemArray.filter(aItem =>
|
|
|
++ cal.acl.userCanModifyItem(aItem) ||
|
|
|
++ (aItem.calendar && cal.acl.userCanDeleteItemsFromCalendar(aItem.calendar))
|
|
|
++ );
|
|
|
++ if (items.length < calendarItemArray.length) {
|
|
|
++ cal.LOG("[calendar-clipboard] No priviledge to delete some or all selected items.");
|
|
|
++ return;
|
|
|
++ }
|
|
|
++ calendarItemArray = items;
|
|
|
+ }
|
|
|
+ let [targetItems, , response] = promptOccurrenceModification(
|
|
|
+ calendarItemArray,
|
|
|
+ true,
|
|
|
+ aCutMode ? "cut" : "copy"
|
|
|
+ );
|
|
|
+ if (!response) {
|
|
|
+ // The user canceled the dialog, bail out
|
|
|
+- return false;
|
|
|
++ return;
|
|
|
+ }
|
|
|
+- calendarItemArray = targetItems;
|
|
|
+
|
|
|
+ let icsSerializer = Cc["@mozilla.org/calendar/ics-serializer;1"]
|
|
|
+ .createInstance(Ci.calIIcsSerializer);
|
|
|
+- icsSerializer.addItems(calendarItemArray, calendarItemArray.length);
|
|
|
++ icsSerializer.addItems(targetItems, targetItems.length);
|
|
|
+ let icsString = icsSerializer.serializeToString();
|
|
|
+
|
|
|
+ let clipboard = Services.clipboard;
|
|
|
+ let trans = Cc["@mozilla.org/widget/transferable;1"]
|
|
|
+ .createInstance(Ci.nsITransferable);
|
|
|
+
|
|
|
+ if (trans && clipboard) {
|
|
|
+ // Register supported data flavors
|
|
|
+@@ -101,20 +112,25 @@ function copyToClipboard(aCalendarItemAr
|
|
|
+ trans.setTransferData("text/calendar",
|
|
|
+ icsWrapper,
|
|
|
+ icsWrapper.data.length * 2); // double byte data
|
|
|
+ trans.setTransferData("text/unicode",
|
|
|
+ icsWrapper,
|
|
|
+ icsWrapper.data.length * 2);
|
|
|
+
|
|
|
+ clipboard.setData(trans, null, Ci.nsIClipboard.kGlobalClipboard);
|
|
|
+-
|
|
|
+- return true;
|
|
|
++ if (aCutMode) {
|
|
|
++ // check for MODIFICATION_PARENT
|
|
|
++ let useParent = (response == 3);
|
|
|
++ calendarViewController.deleteOccurrences(targetItems.length,
|
|
|
++ targetItems,
|
|
|
++ useParent,
|
|
|
++ true);
|
|
|
++ }
|
|
|
+ }
|
|
|
+- return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Reads ics data from the clipboard, parses it into items and inserts the items
|
|
|
+ * into the currently selected calendar.
|
|
|
+ */
|
|
|
+ function pasteFromClipboard() {
|
|
|
+ if (!canPaste()) {
|
|
|
+@@ -227,17 +243,17 @@ function pasteFromClipboard() {
|
|
|
+ });
|
|
|
+ if (calendars.length > 1) {
|
|
|
+ let args = {};
|
|
|
+ args.calendars = calendars;
|
|
|
+ args.promptText = cal.l10n.getCalString("pastePrompt");
|
|
|
+
|
|
|
+ if (validPasteText) {
|
|
|
+ pasteText = cal.l10n.getCalString(pasteText);
|
|
|
+- let note = cal.l10n.getCalString("pasteNotifyAbout", pasteText);
|
|
|
++ let note = cal.l10n.getCalString("pasteNotifyAbout", [pasteText]);
|
|
|
+ args.promptNotify = note;
|
|
|
+
|
|
|
+ args.labelExtra1 = cal.l10n.getCalString("pasteDontNotifyLabel");
|
|
|
+ args.onExtra1 = (aCal) => {
|
|
|
+ destCal = aCal;
|
|
|
+ notify = Ci.calIItipItem.NONE;
|
|
|
+ };
|
|
|
+ args.labelOk = cal.l10n.getCalString("pasteAndNotifyLabel");
|
|
|
+@@ -269,17 +285,17 @@ function pasteFromClipboard() {
|
|
|
+ // clipboard content.
|
|
|
+ newItem.id = cal.getUUID();
|
|
|
+ if (offset) {
|
|
|
+ cal.item.shiftOffset(newItem, offset);
|
|
|
+ }
|
|
|
+
|
|
|
+ let extResp = { responseMode: Ci.calIItipItem.NONE };
|
|
|
+ if (item.getAttendees({}).length > 0) {
|
|
|
+- Ci.calIItipItem.USERextResp.responseMode = notify;
|
|
|
++ extResp.responseMode = notify;
|
|
|
+ }
|
|
|
+
|
|
|
+ doTransaction("add", newItem, destCal, null, null, extResp);
|
|
|
+ }
|
|
|
+ endBatchTransaction();
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ default:
|
|
|
+
|