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

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

implemented new notifcation-box. Now using textfield.

  • Property mode set to 100644
File size: 15.8 KB
Line 
1<?xml version="1.0"?>
2
3<!DOCTYPE bindings [
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="_blockingCanvas">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          return val;
50        </setter>
51      </property>
52
53      <property name="allNotifications" readonly="true"
54                onget="return this.getElementsByTagName('notification');"/>
55
56      <method name="getNotificationWithValue">
57        <parameter name="aValue"/>
58        <body>
59          <![CDATA[
60            var notifications = this.allNotifications;
61            for (var n = notifications.length - 1; n >= 0; n--) {
62              if (aValue == notifications[n].value)
63                return notifications[n];
64            }
65            return null;
66          ]]>
67        </body>
68      </method>
69
70      <method name="appendNotification">
71        <parameter name="aLabel"/>
72        <parameter name="aValue"/>
73        <parameter name="aImage"/>
74        <parameter name="aPriority"/>
75        <parameter name="aButtons"/>
76        <body>
77          <![CDATA[
78            if (aPriority < this.PRIORITY_INFO_LOW ||
79                aPriority > this.PRIORITY_CRITICAL_BLOCK)
80              throw "Invalid notification priority " + aPriority;
81
82            // check for where the notification should be inserted according to
83            // priority. If two are equal, the existing one appears on top.
84            var notifications = this.allNotifications;
85            var insertPos = null;
86            for (var n = notifications.length - 1; n >= 0; n--) {
87              if (notifications[n].priority < aPriority)
88                break;
89              insertPos = notifications[n];
90            }
91
92            const XULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
93            var newitem = document.createElementNS(XULNS, "notification");
94            newitem.setAttribute("label", aLabel);
95            newitem.setAttribute("value", aValue);
96            if (aImage)
97                newitem.setAttribute("image", aImage);
98            if (!insertPos) {
99              newitem.style.position = "fixed";
100              newitem.style.top = "100%";
101            }
102            this.insertBefore(newitem, insertPos);
103
104            if (aButtons) {
105              for (var b = 0; b < aButtons.length; b++) {
106                var button = aButtons[b];
107                var buttonElem = document.createElementNS(XULNS, "button");
108                buttonElem.setAttribute("label", button.label);
109                buttonElem.setAttribute("accesskey", button.accessKey);
110
111                newitem.appendChild(buttonElem);
112                buttonElem.buttonInfo = button;
113              }
114            }
115
116            newitem.priority = aPriority;
117            if (aPriority >= this.PRIORITY_CRITICAL_LOW)
118              newitem.type = "critical";
119            else if (aPriority <= this.PRIORITY_INFO_HIGH)
120              newitem.type = "info";
121            else
122              newitem.type = "warning";
123
124            if (!insertPos)
125              this._showNotification(newitem, true);
126
127            // Fire event for accessibility APIs
128            var event = document.createEvent("Events");
129            event.initEvent("AlertActive", true, true);
130            newitem.dispatchEvent(event);
131
132            return newitem;
133          ]]>
134        </body>
135      </method>
136
137      <method name="removeNotification">
138        <parameter name="aItem"/>
139        <body>
140          <![CDATA[
141            if (aItem == this.currentNotification)
142              this.removeCurrentNotification();
143            else
144              this.removeChild(aItem);
145            return aItem;
146          ]]>
147        </body>
148      </method>
149
150      <method name="removeCurrentNotification">
151        <body>
152          <![CDATA[
153            this._showNotification(this.currentNotification, false);
154            return null;
155          ]]>
156        </body>
157      </method>
158
159      <method name="removeAllNotifications">
160        <parameter name="aImmediate"/>
161        <body>
162          <![CDATA[
163            var notifications = this.allNotifications;
164            for (var n = notifications.length - 1; n >= 0; n--) {
165              if (aImmediate)
166                this.removeChild(notifications[n]);
167              else
168                this.removeNotification(notifications[n]);
169            }
170            this.currentNotification = null;
171          ]]>
172        </body>
173      </method>
174
175      <method name="removeTransientNotifications">
176        <body>
177          <![CDATA[
178            var notifications = this.allNotifications;
179            for (var n = notifications.length - 1; n >= 0; n--) {
180              var notification = notifications[n];
181              if (notification.persistence)
182                notification.persistence--;
183              else if (Date.now() > notification.timeout)
184                this.removeNotification(notification);
185            }
186          ]]>
187        </body>
188      </method>
189
190      <method name="_showNotification">
191        <parameter name="aNotification"/>
192        <parameter name="aSlideIn"/>
193        <body>
194          <![CDATA[
195            if (this._timer) {
196              clearInterval(this._timer);
197              if (this.currentNotification) {
198                this.currentNotification.style.marginTop = "0px";
199                this.currentNotification.style.opacity = 1;
200              }
201              try { if (this._closedNotification)
202                this._closedNotification.parentNode.
203                  removeChild(this._closedNotification); }
204          catch (e) {};
205              this._setBlockingState(this.currentNotification);
206            }
207
208            var height = aNotification.boxObject.height;
209            var change = height / this.slideSteps;
210            if (aSlideIn) {
211              if (this.currentNotification &&
212                  this.currentNotification.boxObject.height > height)
213                height = this.currentNotification.boxObject.height;
214
215              this.currentNotification = aNotification;
216              this._closedNotification = null;
217              aNotification.style.removeProperty("position");
218              aNotification.style.removeProperty("top");
219              aNotification.style.marginTop = -height + "px";
220              aNotification.style.opacity = 0;
221            }
222            else {
223              change = -change;
224              this._closedNotification = aNotification;
225              var notifications = this.allNotifications;
226              var idx = notifications.length - 2;
227              if (idx >= 0)
228                this.currentNotification = notifications[idx];
229              else
230                this.currentNotification = null;
231            }
232            var opacitychange = change / height;
233
234            var self = this;
235            var slide = function slideInFn()
236            {
237              var done = false;
238
239              var style = window.getComputedStyle(aNotification, null);
240              var margin = style.getPropertyCSSValue("margin-top").
241                             getFloatValue(CSSPrimitiveValue.CSS_PX);
242
243              if (change > 0 && margin + change >= 0) {
244                aNotification.style.marginTop = "0px";
245                aNotification.style.opacity = 1;
246                done = true;
247              }
248              else if (change < 0 && margin + change <= -height) {
249                aNotification.style.marginTop = -height + "px";
250                done = true;
251              }
252              else {
253                aNotification.style.marginTop = (margin + change).toFixed(4) + "px";
254                if (opacitychange)
255                  aNotification.style.opacity =
256                    Number(aNotification.style.opacity) + opacitychange;
257              }
258
259              if (done) {
260                clearInterval(self._timer);
261                self._timer = null;
262                if (self._closedNotification)
263                  self._closedNotification.parentNode.
264                    removeChild(self._closedNotification);
265                self._setBlockingState(self.currentNotification);
266              }
267            }
268
269            this._timer = setInterval(slide, 50);
270          ]]>
271        </body>
272      </method>
273
274      <method name="_setBlockingState">
275        <parameter name="aNotification"/>
276        <body>
277          <![CDATA[
278            var isblock = aNotification &&
279                          aNotification.priority == this.PRIORITY_CRITICAL_BLOCK;
280            var canvas = this._blockingCanvas;
281            if (isblock) {
282              if (!canvas)
283                canvas = document.createElementNS("http://www.w3.org/1999/xhtml", "canvas");
284              const XULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
285              var content = this.firstChild;
286              if (!content ||
287                   content.namespaceURI != XULNS ||
288                   content.localName != "browser")
289                return;
290
291              var width = content.boxObject.width;
292              var height = content.boxObject.height;
293              content.collapsed = true;
294
295              canvas.setAttribute("width", width);
296              canvas.setAttribute("height", height);
297              canvas.setAttribute("flex", "1");
298
299              this.appendChild(canvas);
300              this._blockingCanvas = canvas;
301
302              var bgcolor = "white";
303              try {
304                var prefService = Components.classes["@mozilla.org/preferences-service;1"].
305                                    getService(Components.interfaces.nsIPrefBranch);
306                bgcolor = prefService.getCharPref("browser.display.background_color");
307
308                var win = content.contentWindow;
309                var context = canvas.getContext("2d");
310                context.globalAlpha = 0.5;
311                context.drawWindow(win, win.scrollX, win.scrollY,
312                                   width, height, bgcolor);
313              }
314              catch(ex) { };
315            }
316            else if (canvas) {
317              canvas.parentNode.removeChild(canvas);
318              this._blockingCanvas = null;
319              var content = this.firstChild;
320              if (content)
321                content.collapsed = false;
322            }
323          ]]>
324        </body>
325      </method>
326
327    </implementation>
328  </binding>
329
330  <binding id="notification">
331    <content>
332      <xul:hbox class="notification-inner outset" flex="1" xbl:inherits="type">
333        <xul:hbox anonid="details" align="center" flex="1"
334                  oncommand="this.parentNode.parentNode._doButtonCommand(event);">
335          <xul:image anonid="messageImage" class="messageImage" xbl:inherits="src=image"/>
336      <xul:vbox><xul:spacer flex="1" />
337          <xul:label id="vINotificationTitle" hidden="true" align="right" />
338          <xul:label class="v_identity_logo vINotificationLogo"
339                              value="&vident.vidLogo.label; &vident.version;" align="right" />
340          <xul:spacer flex="1" /></xul:vbox>
341          <xul:textbox id="vINotificationTextbox" anonid="messageText" class="plain" height="3"
342            value="" flex="1" multiline="true" readonly="true" 
343            xbl:inherits="value=label"
344            DOMAttrModified="if(event.attrName == 'value') this.value = event.newValue; return true;"
345            onoverflow="vI_notificationBar.overflow(this);" oncontextmenu="" />
346          <children/>
347        </xul:hbox>
348        <xul:toolbarbutton ondblclick="event.stopPropagation();"
349                           class="messageCloseButton tabbable"
350                           xbl:inherits="hidden=hideclose"
351                           oncommand="vI_notificationBar.clear();"/>
352      </xul:hbox>
353    </content>
354    <resources>
355      <stylesheet src="chrome://global/skin/notification.css"/>
356    </resources>
357    <implementation implements="nsIAccessibleProvider">
358      <property name="accessibleType" readonly="true">
359        <getter>
360          <![CDATA[
361            return Components.interfaces.nsIAccessibleProvider.XULAlert;
362          ]]>
363        </getter>
364      </property>
365
366      <property name="label" onset="this.setAttribute('label', val); return val;"
367                             onget="return this.getAttribute('label');"/>
368      <property name="value" onset="this.setAttribute('value', val); return val;"
369                             onget="return this.getAttribute('value');"/>
370      <property name="image" onset="this.setAttribute('image', val); return val;"
371                             onget="return this.getAttribute('image');"/>
372      <property name="type" onset="this.setAttribute('type', val); return val;"
373                            onget="return this.getAttribute('type');"/>
374      <property name="priority" onget="return parseInt(this.getAttribute('priority')) || 0;"
375                                onset="this.setAttribute('priority', val); return val;"/>
376      <property name="persistence" onget="return parseInt(this.getAttribute('persistence')) || 0;"
377                                   onset="this.setAttribute('persistence', val); return val;"/>
378      <field name="timeout">0</field>
379
380      <property name="control" readonly="true">
381        <getter>
382          <![CDATA[
383            var parent = this.parentNode;
384            while (parent) {
385              if (parent.localName == "notificationbox")
386                return parent;
387              parent = parent.parentNode;
388            }
389            return null;
390          ]]>
391        </getter>
392      </property>
393
394      <method name="close">
395        <body>
396          <![CDATA[
397            var control = this.control;
398            if (control)
399              control.removeNotification(this);
400            else
401              this.hidden = true;
402          ]]>
403        </body>
404      </method>
405
406      <method name="_doButtonCommand">
407        <parameter name="aEvent"/>
408        <body>
409          <![CDATA[
410            if (!("buttonInfo" in aEvent.target))
411              return;
412
413            var button = aEvent.target.buttonInfo;
414            if (button.popup) {
415              document.popupNode = aEvent.target;
416              document.getElementById(button.popup).
417                showPopup(aEvent.originalTarget, -1, -1, "popup", "bottomleft", "topleft");
418              aEvent.stopPropagation();
419            }
420            else {
421              var callback = button.callback;
422              if (callback) {
423                var result = callback(this, button);
424                if (!result)
425                  this.close();
426                aEvent.stopPropagation();
427              }
428            }
429          ]]>
430        </body>
431      </method>
432    </implementation>
433  </binding>
434</bindings>
Note: See TracBrowser for help on using the repository browser.