source: chrome/content/v_identity/vI_notificationBar.xml @ e94667

Last change on this file since e94667 was e94667, checked in by rene <rene@…>, 13 years ago

small bugfix

  • Property mode set to 100644
File size: 12.7 KB
Line 
1<?xml version="1.0"?>
2
3<!DOCTYPE overlay [
4<!ENTITY % versionDTD SYSTEM "chrome://v_identity/content/_version.dtd">
5%versionDTD;
6<!ENTITY % vIdentDTD SYSTEM "chrome://v_identity/locale/v_identity.dtd">
7%vIdentDTD;
8]>
9
10<bindings id="notificationBindings"
11          xmlns="http://www.mozilla.org/xbl"
12          xmlns:xbl="http://www.mozilla.org/xbl"
13          xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
14
15  <binding id="notificationbox">
16    <content>
17      <xul:stack xbl:inherits="hidden=notificationshidden">
18        <xul:spacer/>
19        <children includes="notification"/>
20      </xul:stack>
21      <children/>
22    </content>
23
24    <implementation>
25      <field name="PRIORITY_INFO_LOW" readonly="true">1</field>
26      <field name="PRIORITY_INFO_MEDIUM" readonly="true">2</field>
27      <field name="PRIORITY_INFO_HIGH" readonly="true">3</field>
28      <field name="PRIORITY_WARNING_LOW" readonly="true">4</field>
29      <field name="PRIORITY_WARNING_MEDIUM" readonly="true">5</field>
30      <field name="PRIORITY_WARNING_HIGH" readonly="true">6</field>
31      <field name="PRIORITY_CRITICAL_LOW" readonly="true">7</field>
32      <field name="PRIORITY_CRITICAL_MEDIUM" readonly="true">8</field>
33      <field name="PRIORITY_CRITICAL_HIGH" readonly="true">9</field>
34      <field name="PRIORITY_CRITICAL_BLOCK" readonly="true">10</field>
35
36      <field name="currentNotification">null</field>
37      <field name="slideSteps">4</field>
38
39      <field name="_timer">null</field>
40      <field name="_closedNotification">null</field>
41      <field name="_blockBox">null</field>
42
43      <property name="notificationsHidden"
44                onget="return this.getAttribute('notificationshidden') == 'true';">
45        <setter>
46          if (val)
47            this.setAttribute('notificationshidden', true);
48          else this.removeAttribute('notificationshidden');
49        </setter>
50      </property>
51
52      <property name="allNotifications" readonly="true"
53                onget="return this.getElementsByTagName('notification');"/>
54
55      <method name="getNotificationWithValue">
56        <parameter name="aValue"/>
57        <body>
58          <![CDATA[
59            var notifications = this.allNotifications;
60            for (var n = notifications.length - 1; n >= 0; n--) {
61              if (aValue == notifications[n].value)
62                return notifications[n];
63            }
64            return null;
65          ]]>
66        </body>
67      </method>
68
69      <method name="appendNotification">
70        <parameter name="aLabel"/>
71        <parameter name="aValue"/>
72        <parameter name="aImage"/>
73        <parameter name="aPriority"/>
74        <parameter name="aButtons"/>
75        <body>
76          <![CDATA[
77            if (aPriority < this.PRIORITY_INFO_LOW ||
78                aPriority > this.PRIORITY_CRITICAL_BLOCK)
79              throw "Invalid notification priority " + aPriority;
80
81            // check for where the notification should be inserted according to
82            // priority. If two are equal, the existing one appears on top.
83            var notifications = this.allNotifications;
84            var insertPos = null;
85            for (var n = notifications.length - 1; n >= 0; n--) {
86              if (notifications[n].priority < aPriority)
87                break;
88              insertPos = notifications[n];
89            }
90
91            const XULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
92            var newitem = document.createElementNS(XULNS, "notification");
93            newitem.setAttribute("label", aLabel);
94            newitem.setAttribute("value", aValue);
95            newitem.setAttribute("image", aImage);
96            if (!insertPos) {
97              newitem.style.position = "fixed";
98              newitem.style.top = "100%";
99            }
100            this.insertBefore(newitem, insertPos);
101
102            if (aButtons) {
103              for (var b = 0; b < aButtons.length; b++) {
104                var button = aButtons[b];
105                var buttonElem = document.createElementNS(XULNS, "button");
106                buttonElem.setAttribute("label", button.label);
107                buttonElem.setAttribute("accesskey", button.accessKey);
108
109                newitem.appendChild(buttonElem);
110                buttonElem.buttonInfo = button;
111              }
112            }
113
114            newitem.priority = aPriority;
115            if (aPriority >= this.PRIORITY_CRITICAL_LOW)
116              newitem.type = "critical";
117            else if (aPriority <= this.PRIORITY_INFO_HIGH)
118              newitem.type = "info";
119            else
120              newitem.type = "warning";
121
122            if (!insertPos)
123              this._showNotification(newitem, true);
124
125            // Fire event for accessibility APIs
126            var event = document.createEvent("Events");
127            event.initEvent("AlertActive", true, true);
128            newitem.dispatchEvent(event);
129
130            return newitem;
131          ]]>
132        </body>
133      </method>
134
135      <method name="removeNotification">
136        <parameter name="aItem"/>
137        <body>
138          <![CDATA[
139            if (aItem == this.currentNotification)
140              this.removeCurrentNotification();
141            else
142              this.removeChild(aItem);
143            return aItem;
144          ]]>
145        </body>
146      </method>
147
148      <method name="removeCurrentNotification">
149        <body>
150          <![CDATA[
151            this._showNotification(this.currentNotification, false);
152            return null;
153          ]]>
154        </body>
155      </method>
156
157      <method name="removeAllNotifications">
158        <parameter name="aImmediate"/>
159        <body>
160          <![CDATA[
161            var notifications = this.allNotifications;
162            for (var n = notifications.length - 1; n >= 0; n--) {
163              if (aImmediate)
164                this.removeChild(notifications[n]);
165              else
166                this.removeNotification(notifications[n]);
167            }
168            this.currentNotification = null;
169          ]]>
170        </body>
171      </method>
172
173      <method name="_showNotification">
174        <parameter name="aNotification"/>
175        <parameter name="aSlideIn"/>
176        <body>
177          <![CDATA[
178            if (this._timer) {
179              clearInterval(this._timer);
180              if (this.currentNotification) {
181                this.currentNotification.style.marginTop = "0px";
182                this.currentNotification.style.opacity = 1;
183              }
184              try { if (this._closedNotification)
185                this._closedNotification.parentNode.
186                  removeChild(this._closedNotification); }
187          catch (e) {};
188            }
189
190            var height = aNotification.boxObject.height;
191            var change = height / this.slideSteps;
192            if (aSlideIn) {
193              if (this.currentNotification &&
194                  this.currentNotification.boxObject.height > height)
195                height = this.currentNotification.boxObject.height;
196
197              this.currentNotification = aNotification;
198              this._closedNotification = null;
199              aNotification.style.removeProperty("position");
200              aNotification.style.removeProperty("top");
201              aNotification.style.marginTop = -height + "px";
202              aNotification.style.opacity = 0;
203            }
204            else {
205              change = -change;
206              this._closedNotification = aNotification;
207              var notifications = this.allNotifications;
208              var idx = notifications.length - 2;
209              if (idx >= 0)
210                this.currentNotification = notifications[idx];
211              else
212                this.currentNotification = null;
213            }
214            var opacitychange = change / height;
215
216            var self = this;
217            var slide = function slideInFn()
218            {
219              var done = false;
220
221              var style = window.getComputedStyle(aNotification, null);
222              var margin = style.getPropertyCSSValue("margin-top").
223                             getFloatValue(CSSPrimitiveValue.CSS_PX);
224
225              if (change > 0 && margin + change >= 0) {
226                aNotification.style.marginTop = "0px";
227                aNotification.style.opacity = 1;
228                done = true;
229              }
230              else if (change < 0 && margin + change <= -height) {
231                aNotification.style.marginTop = -height + "px";
232                done = true;
233              }
234              else {
235                aNotification.style.marginTop = (margin + change).toFixed(4) + "px";
236                if (opacitychange)
237                  aNotification.style.opacity =
238                    Number(aNotification.style.opacity) + opacitychange;
239              }
240
241              if (done) {
242                clearInterval(self._timer);
243                self._timer = null;
244                if (self._closedNotification)
245                  self._closedNotification.parentNode.
246                    removeChild(self._closedNotification);
247              }
248            }
249
250            this._timer = setInterval(slide, 50);
251          ]]>
252        </body>
253      </method>
254
255    </implementation>
256  </binding>
257     
258  <binding id="notification">
259    <content>
260      <xul:hbox class="notification-inner outset" flex="1" xbl:inherits="type">
261        <xul:hbox anonid="details" align="center" flex="1"
262                  oncommand="this.parentNode.parentNode._doButtonCommand(event);">
263          <xul:image anonid="messageImage" class="messageImage" xbl:inherits="src=image"/>
264          <xul:description anonid="messageText" class="messageText" flex="1" xbl:inherits="xbl:text=label"/>
265          <xul:spacer flex="1"/>
266          <children/>
267        </xul:hbox>
268        <xul:vbox><xul:spacer flex="1" /><xul:label class="v_identity_logo vINotificationLogo"
269            value="&vident.vidLogo.label; &vident.version;" align="right" />
270        <xul:spacer flex="1" /></xul:vbox>
271        <xul:toolbarbutton ondblclick="event.stopPropagation();"
272                           class="messageCloseButton"
273                           xbl:inherits="hidden=hideclose"
274                           oncommand="vI_notificationBar.clear();"/>
275      </xul:hbox>
276    </content>
277    <resources>
278      <stylesheet src="chrome://global/skin/notification.css"/>
279    </resources>
280    <implementation implements="nsIAccessibleProvider">
281      <property name="accessible" readonly="true">
282        <getter>
283          <![CDATA[
284            var accService = Components.classes["@mozilla.org/accessibilityService;1"].getService(Components.interfaces.nsIAccessibilityService);
285            return accService.createXULAlertAccessible(this);
286          ]]>
287        </getter>
288      </property>
289
290      <property name="label" onset="return this.setAttribute('label', val);"
291                             onget="return this.getAttribute('label');"/>
292      <property name="value" onset="return this.setAttribute('value', val);"
293                             onget="return this.getAttribute('value');"/>
294      <property name="image" onset="return this.setAttribute('image', val);"
295                             onget="return this.getAttribute('image');"/>
296      <property name="type" onget="return this.getAttribute('type');"
297                            onset="this.setAttribute('type', val); return val;"/>
298      <property name="priority" onget="return this.getAttribute('priority');"
299                                onset="this.setAttribute('priority', val); return val;"/>
300
301      <property name="control" readonly="true">
302        <getter>
303          <![CDATA[
304            var parent = this.parentNode;
305            while (parent) {
306              if (parent.localName == "notificationbox")
307                return parent;
308              parent = parent.parentNode;
309            }
310            return null;
311          ]]>
312        </getter>
313      </property>
314
315      <method name="close">
316        <body>
317          <![CDATA[
318            var control = this.control;
319            if (control)
320              control.removeNotification(this);
321            else
322              this.hidden = true;
323          ]]>
324        </body>
325      </method>
326
327      <method name="_doButtonCommand">
328        <parameter name="aEvent"/>
329        <body>
330          <![CDATA[
331            if (!("buttonInfo" in aEvent.target))
332              return;
333
334            var button = aEvent.target.buttonInfo;
335            if (button.popup) {
336              document.getElementById(button.popup).
337                showPopup(aEvent.originalTarget, -1, -1, "popup", "bottomleft", "topleft");
338              aEvent.stopPropagation();
339            }
340            else {
341              var callback = button.callback;
342              if (callback) {
343                var result = callback(this, button);
344                if (!result)
345                  this.close();
346                aEvent.stopPropagation();
347              }
348            }
349          ]]>
350        </body>
351      </method>
352    </implementation>
353  </binding>
354</bindings>
Note: See TracBrowser for help on using the repository browser.