diff --git a/xpfe/components/alerts/makefile.win b/xpfe/components/alerts/makefile.win new file mode 100644 index 00000000000..e69de29bb2d diff --git a/xpfe/components/alerts/public/makefile.win b/xpfe/components/alerts/public/makefile.win new file mode 100644 index 00000000000..e69de29bb2d diff --git a/xpfe/components/alerts/public/nsIAlertsService.idl b/xpfe/components/alerts/public/nsIAlertsService.idl new file mode 100644 index 00000000000..f1ff88e2707 --- /dev/null +++ b/xpfe/components/alerts/public/nsIAlertsService.idl @@ -0,0 +1,71 @@ +/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: NPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Netscape Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/NPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 2002 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Scott MacGregor + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the NPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the NPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + + +#include "nsISupports.idl" + +/* nsIAlertsListener --> when a consumer asks the alerts service to put up an alert, they have the option + of passing in an alert listener as well. The alert listener gets notified when the alert has gone away. +*/ +[scriptable, uuid(A840623B-5B87-4e99-A74A-9EF0886C11DD)] +interface nsIAlertListener : nsISupports +{ + void onAlertFinished(in wstring aAlertCookie); + void onAlertClickCallback(in wstring aAlertCookie); // if the user clicks on the link and you wanted notified.... +}; + +[scriptable, uuid(7E8B76C6-A70C-4075-81AA-D48B6152E1B4)] +interface nsIAlertsService : nsISupports +{ + /* showAlertNotification: shows an animated alert icon + aImageUrl --> a url identifying an image to put in the alert. + aAlertTitle --> the title text for the alert (i.e. You have New Mail) + aAlertText --> the contents of the alert + alertTextClickable --> set to true if you wish to be notified if the user attempts to click + the alert text. Also causes the alert text to look like a link. + aAlertCookie --> a blind cookie the alert will pass back to the consumer during the alert listener callbacks + */ + void showAlertNotification(in string aImageUrl, in wstring aAlertTitle, + in wstring aAlertText, in boolean alertTextClickable, + in wstring aAlertCookie, + in nsIAlertListener aAlertListener ); +}; + +%{ C++ +#define NS_ALERTSERVICE_CONTRACTID "@mozilla.org/alerts-service;1" +%} diff --git a/xpfe/components/alerts/resources/content/alert.js b/xpfe/components/alerts/resources/content/alert.js new file mode 100644 index 00000000000..cf17bca386b --- /dev/null +++ b/xpfe/components/alerts/resources/content/alert.js @@ -0,0 +1,137 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: NPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Netscape Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/NPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 1998 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Scott MacGregor + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the NPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the NPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +var gCurrentHeight = 0; +var gFinalHeight = 50; +var gWidth = 260; +var gSlideIncrement = 1; +var gSlideTime = 10; +var gOpenTime = 3000; // total time the alert should stay up once we are done animating. + +var gAlertListener = null; +var gAlertTextClickable = false; +var gAlertCookie = ""; + +// fudge factor constants used to help guess a good width for the alert +var imageWidthFudgeFactor = 40; // an alert image should be 26 pixels wide plus a fudge factor +var alertTextFudgeMultiplier = 7; + +function onAlertLoad() +{ + // unwrap all the args.... + // arguments[0] --> the image src url + // arguments[1] --> the alert title + // arguments[2] --> the alert text + // arguments[3] --> is the text clickable? + // arguments[4] --> the alert cookie to be passed back to the listener + // arguments[5] --> an optional callback listener (nsIAlertListener) + + document.getElementById('alertImage').setAttribute('src', window.arguments[0]); + document.getElementById('alertTitleLabel').firstChild.nodeValue = window.arguments[1]; + document.getElementById('alertTextLabel').firstChild.nodeValue = window.arguments[2]; + gAlertTextClickable = window.arguments[3]; + gAlertCookie = window.arguments[4]; + + // HACK: we need to make sure the alert is wide enough to cleanly hold the image + // plus the length of the text passed in. Unfortunately we currently have no way to convert + // .ems into pixels. So I'm "faking" this by multiplying the length of the alert text by a fudge + // factor. I'm then adding to that the width of the image + a small fudge factor. + window.outerWidth = imageWidthFudgeFactor + window.arguments[2].length * alertTextFudgeMultiplier; + + if (gAlertTextClickable) + document.getElementById('alertTextLabel').setAttribute('clickable', true); + + // the 5th argument is optional + if (window.arguments[5]) + gAlertListener = window.arguments[5].QueryInterface(Components.interfaces.nsIAlertListener); + + // read out our initial settings from prefs. + try + { + var prefService = Components.classes["@mozilla.org/preferences-service;1"].getService(); + prefService = prefService.QueryInterface(Components.interfaces.nsIPrefService); + var prefBranch = prefService.getBranch(null); + gSlideIncrement = prefBranch.getIntPref("alerts.slideIncrement"); + gSlideTime = prefBranch.getIntPref("alerts.slideIncrementTime"); + gOpenTime = prefBranch.getIntPref("alerts.totalOpenTime"); + gFinalHeight = prefBranch.getIntPref("alerts.height"); + } catch (ex) {} + + // offset the alert by 10 pixels from the far right edge of the screen + gWidth = window.outerWidth + 10; + + window.moveTo(screen.availWidth, screen.availHeight); // move it offscreen initially + // force a resize on the window to make sure it is wide enough then after that, begin animating the alert. + setTimeout('window.resizeTo(gWidth - 10, 1);', 1); + setTimeout(animateAlert, 10); +} + +function animateAlert() +{ + if (gCurrentHeight < gFinalHeight) + { + gCurrentHeight += gSlideIncrement; + window.outerHeight = gCurrentHeight; + window.moveTo((screen.availWidth - gWidth), screen.availHeight - gCurrentHeight); + setTimeout(animateAlert, gSlideTime); + } + else + setTimeout(closeAlert, gOpenTime); +} + +function closeAlert() +{ + if (gCurrentHeight) + { + gCurrentHeight -= gSlideIncrement; + window.outerHeight = gCurrentHeight; + window.moveTo((screen.availWidth - gWidth), screen.availHeight - gCurrentHeight); + setTimeout(closeAlert, gSlideTime); + } + else + { + if (gAlertListener) + gAlertListener.onAlertFinished(gAlertCookie); + window.close(); + } +} + +function onAlertClick() +{ + if (gAlertListener && gAlertTextClickable) + gAlertListener.onAlertClickCallback(gAlertCookie); +} diff --git a/xpfe/components/alerts/resources/content/alert.xul b/xpfe/components/alerts/resources/content/alert.xul new file mode 100644 index 00000000000..3197885543d --- /dev/null +++ b/xpfe/components/alerts/resources/content/alert.xul @@ -0,0 +1,46 @@ + + + + + + + +