diff options
Diffstat (limited to 'mailnews/compose/content/sendProgress.js')
-rw-r--r-- | mailnews/compose/content/sendProgress.js | 171 |
1 files changed, 171 insertions, 0 deletions
diff --git a/mailnews/compose/content/sendProgress.js b/mailnews/compose/content/sendProgress.js new file mode 100644 index 000000000..8354cf953 --- /dev/null +++ b/mailnews/compose/content/sendProgress.js @@ -0,0 +1,171 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* 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/. */ + +var nsIMsgCompDeliverMode = Components.interfaces.nsIMsgCompDeliverMode; + +// dialog is just an array we'll use to store various properties from the dialog document... +var dialog; + +// the msgProgress is a nsIMsgProgress object +var msgProgress = null; + +// random global variables... +var itsASaveOperation = false; +var gSendProgressStringBundle; + +// all progress notifications are done through the nsIWebProgressListener implementation... +var progressListener = { + onStateChange: function(aWebProgress, aRequest, aStateFlags, aStatus) + { + if (aStateFlags & Components.interfaces.nsIWebProgressListener.STATE_START) + { + // Put progress meter in undetermined mode. + dialog.progress.setAttribute("mode", "undetermined"); + } + + if (aStateFlags & Components.interfaces.nsIWebProgressListener.STATE_STOP) + { + // we are done sending/saving the message... + // Indicate completion in status area. + var msg; + if (itsASaveOperation) + msg = gSendProgressStringBundle.getString("messageSaved"); + else + msg = gSendProgressStringBundle.getString("messageSent"); + dialog.status.setAttribute("value", msg); + + // Put progress meter at 100%. + dialog.progress.setAttribute("value", 100); + dialog.progress.setAttribute("mode", "normal"); + var percentMsg = gSendProgressStringBundle.getFormattedString("percentMsg", [100]); + dialog.progressText.setAttribute("value", percentMsg); + + window.close(); + } + }, + + onProgressChange: function(aWebProgress, aRequest, aCurSelfProgress, aMaxSelfProgress, aCurTotalProgress, aMaxTotalProgress) + { + // Calculate percentage. + var percent; + if (aMaxTotalProgress > 0) + { + percent = Math.round(aCurTotalProgress / aMaxTotalProgress * 100); + if (percent > 100) + percent = 100; + + dialog.progress.removeAttribute("mode"); + + // Advance progress meter. + dialog.progress.setAttribute("value", percent); + + // Update percentage label on progress meter. + var percentMsg = gSendProgressStringBundle.getFormattedString("percentMsg", [percent]); + dialog.progressText.setAttribute("value", percentMsg); + } + else + { + // Progress meter should be barber-pole in this case. + dialog.progress.setAttribute("mode", "undetermined"); + // Update percentage label on progress meter. + dialog.progressText.setAttribute("value", ""); + } + }, + + onLocationChange: function(aWebProgress, aRequest, aLocation, aFlags) + { + // we can ignore this notification + }, + + onStatusChange: function(aWebProgress, aRequest, aStatus, aMessage) + { + if (aMessage != "") + dialog.status.setAttribute("value", aMessage); + }, + + onSecurityChange: function(aWebProgress, aRequest, state) + { + // we can ignore this notification + }, + + QueryInterface : function(iid) + { + if (iid.equals(Components.interfaces.nsIWebProgressListener) || + iid.equals(Components.interfaces.nsISupportsWeakReference) || + iid.equals(Components.interfaces.nsISupports)) + return this; + + throw Components.results.NS_NOINTERFACE; + } +}; + +function onLoad() +{ + // Set global variables. + let subject = ""; + gSendProgressStringBundle = document.getElementById("sendProgressStringBundle"); + + msgProgress = window.arguments[0]; + if (!msgProgress) + { + Components.utils.reportError("Invalid argument to sendProgress.xul."); + window.close(); + return; + } + + if (window.arguments[1]) + { + let progressParams = window.arguments[1].QueryInterface(Components.interfaces.nsIMsgComposeProgressParams); + if (progressParams) + { + itsASaveOperation = (progressParams.deliveryMode != nsIMsgCompDeliverMode.Now); + subject = progressParams.subject; + } + } + + if (subject) { + let title = itsASaveOperation ? "titleSaveMsgSubject" : "titleSendMsgSubject"; + document.title = gSendProgressStringBundle.getFormattedString(title, [subject]); + } else { + let title = itsASaveOperation ? "titleSaveMsg" : "titleSendMsg"; + document.title = gSendProgressStringBundle.getString(title); + } + + dialog = {}; + dialog.status = document.getElementById("dialog.status"); + dialog.progress = document.getElementById("dialog.progress"); + dialog.progressText = document.getElementById("dialog.progressText"); + + // set our web progress listener on the helper app launcher + msgProgress.registerListener(progressListener); +} + +function onUnload() +{ + if (msgProgress) + { + try + { + msgProgress.unregisterListener(progressListener); + msgProgress = null; + } catch (e) {} + } +} + +// If the user presses cancel, tell the app launcher and close the dialog... +function onCancel() +{ + // Cancel app launcher. + try + { + msgProgress.processCanceledByUser = true; + } catch (e) + { + return true; + } + + // don't Close up dialog by returning false, the backend will close the dialog when everything will be aborted. + return false; +} |