3
<bindings id="popupBindings"
4
xmlns="http://www.mozilla.org/xbl"
5
xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
6
xmlns:xbl="http://www.mozilla.org/xbl">
8
<binding id="popup-base">
10
<stylesheet src="chrome://global/skin/popup.css"/>
15
extends="chrome://global/content/bindings/popup.xml#popup-base">
17
<implementation implements="nsIDOMXULPopupElement, nsIAccessibleProvider">
18
<property name="accessibleType" readonly="true">
21
return Components.interfaces.nsIAccessibleProvider.XULMenupopup;
26
<property name="position" onget="return this.getAttribute('position');"
27
onset="this.setAttribute('position', val); return val;"/>
28
<property name="popupBoxObject">
30
return this.boxObject.QueryInterface(Components.interfaces.nsIPopupBoxObject);
34
<property name="state" readonly="true"
35
onget="return this.popupBoxObject.popupState"/>
37
<method name="openPopup">
38
<parameter name="aAnchorElement"/>
39
<parameter name="aPosition"/>
40
<parameter name="aX"/>
41
<parameter name="aY"/>
42
<parameter name="aIsContextMenu"/>
43
<parameter name="aAttributesOverride"/>
47
var popupBox = this.popupBoxObject;
49
popupBox.openPopup(aAnchorElement, aPosition, aX, aY,
50
aIsContextMenu, aAttributesOverride);
56
<method name="openPopupAtScreen">
57
<parameter name="aX"/>
58
<parameter name="aY"/>
59
<parameter name="aIsContextMenu"/>
63
var popupBox = this.popupBoxObject;
65
popupBox.openPopupAtScreen(aX, aY, aIsContextMenu);
71
<method name="showPopup">
72
<parameter name="element"/>
73
<parameter name="xpos"/>
74
<parameter name="ypos"/>
75
<parameter name="popuptype"/>
76
<parameter name="anchoralignment"/>
77
<parameter name="popupalignment"/>
83
popupBox = this.popupBoxObject;
86
menuBox = this.parentNode.boxObject.QueryInterface(Components.interfaces.nsIMenuBoxObject);
89
menuBox.openMenu(true);
91
popupBox.showPopup(element, this, xpos, ypos, popuptype, anchoralignment, popupalignment);
96
<method name="hidePopup">
102
popupBox = this.boxObject.QueryInterface(Components.interfaces.nsIPopupBoxObject);
105
menuBox = this.parentNode.boxObject.QueryInterface(Components.interfaces.nsIMenuBoxObject);
108
menuBox.openMenu(false);
110
popupBox.hidePopup();
115
<property name="autoPosition">
118
return this.popupBoxObject.autoPosition;
123
return this.popupBoxObject.autoPosition = val;
128
<method name="enableKeyboardNavigator">
129
<parameter name="aEnableKeyboardNavigator"/>
132
this.popupBoxObject.enableKeyboardNavigator(aEnableKeyboardNavigator);
137
<method name="enableRollup">
138
<parameter name="aEnableRollup"/>
141
this.popupBoxObject.enableRollup(aEnableRollup);
146
<method name="sizeTo">
147
<parameter name="aWidth"/>
148
<parameter name="aHeight"/>
151
this.popupBoxObject.sizeTo(aWidth, aHeight);
156
<method name="moveTo">
157
<parameter name="aLeft"/>
158
<parameter name="aTop"/>
161
this.popupBoxObject.moveTo(aLeft, aTop);
170
extends="chrome://global/content/bindings/popup.xml#panel">
172
<xul:arrowscrollbox class="popup-internal-box" flex="1" orient="vertical">
174
</xul:arrowscrollbox>
178
<handler event="contextmenu" action="event.preventDefault();"/>
180
<handler event="popupshowing" phase="target">
184
for (var menuitem = this.firstChild; menuitem; menuitem = menuitem.nextSibling) {
185
if (menuitem.localName == "menuitem" && menuitem.hasAttribute("acceltext")) {
186
var accel = document.getAnonymousElementByAttribute(menuitem, "anonid", "accel");
187
if (accel && accel.boxObject) {
189
if (accel.boxObject.width > width)
190
width = accel.boxObject.width;
194
for (var i = 0; i < array.length; i++)
195
array[i].width = width;
201
<binding id="tooltip" extends="chrome://global/content/bindings/popup.xml#popup">
204
<xul:label class="tooltip-label" xbl:inherits="xbl:text=label" flex="1"/>
208
<implementation implements="nsIAccessibleProvider">
209
<property name="accessibleType" readonly="true">
211
return Components.interfaces.nsIAccessibleProvider.XULTooltip;
215
<field name="_mouseOutCount">0</field>
216
<field name="_isMouseOver">false</field>
218
<property name="label"
219
onget="return this.getAttribute('label');"
220
onset="this.setAttribute('label', val); return val;"/>
224
<handler event="mouseover"><![CDATA[
225
var rel = event.relatedTarget;
226
//dump("ENTERING " + (rel ? rel.localName : "null") + "\n");
230
// find out if the node we entered from is one of our anonymous children
234
rel = rel.parentNode;
237
// if the exited node is not a descendant of ours, we are entering for the first time
239
this._isMouseOver = true;
242
<handler event="mouseout"><![CDATA[
243
var rel = event.relatedTarget;
244
//dump("LEAVING " + (rel ? rel.localName : "null") + "\n");
246
// relatedTarget is null when the titletip is first shown: a mouseout event fires
247
// because the mouse is exiting the main window and entering the titletip "window".
248
// relatedTarget is also null when the mouse exits the main window completely,
249
// so count how many times relatedTarget was null after titletip is first shown
250
// and hide popup the 2nd time
252
++this._mouseOutCount;
253
if (this._mouseOutCount > 1)
258
// find out if the node we are entering is one of our anonymous children
262
rel = rel.parentNode;
265
// if the entered node is not a descendant of ours, hide the tooltip
266
if (rel != this && this._isMouseOver) {
271
<handler event="popuphiding"><![CDATA[
272
this._isMouseOver = false;
273
this._mouseOutCount = 0;
278
<!-- XXXben this binding is not currently used -->
279
<binding id="resizerbase" extends="xul:box">
281
<property name="popup">
284
var currNode = this.parentNode;
287
var bo = currNode.boxObject.QueryInterface(Components.interfaces.nsIPopupBoxObject);
293
currNode = currNode.parentNode;
300
<method name="handleMouseMove">
301
<parameter name="aEvent"/>
304
throw Components.results.NS_ERROR_NOT_IMPLEMENTED;
309
<field name="screenLeft">0</field>
310
<field name="screenTop">0</field>
311
<field name="resizerDirection">0</field>
315
<handler event="mousedown" phase="capturing">
317
var popup = event.target.popup;
318
var boxObject = popup.boxObject;
319
boxObject.captureMouseEvents = true;
320
event.target.screenLeft = event.screenX;
321
event.target.screenTop = event.screenY;
322
event.target.setMode();
323
event.preventDefault();
326
<handler event="mouseup" phase="capturing">
328
var popup = event.target.popup;
329
var boxObject = popup.boxObject;
330
boxObject.captureMouseEvents = false;
331
event.target.screenLeft = event.screenX;
332
event.target.screenTop = event.screenY;
333
event.target.direction = 0;
334
event.preventDefault();
337
<handler event="mousemove" phase="capturing">
339
event.target.handleMouseMove(event);
340
event.preventDefault();
346
<!-- East-West resizer -->
347
<binding id="ew-resizer" extends="xul:box"> <!-- extends="chrome://global/content/bindings/popup.xml#resizerbase"> -->
349
<xul:hbox class="ew-resizer-box" flex="1"/>
353
<method name="handleMouseMove">
354
<parameter name="aEvent"/>
357
var boxObject = aEvent.target.boxObject;
358
if (boxObject.captureMouseEvents && this.resizerDirection == "right") {
359
var delta = aEvent.screenX - this.screenLeft;
360
this.screenLeft = aEvent.screenX;
362
// We can set this directly as we're only modifying one dimension
363
aEvent.target.width += delta;
368
<method name="setMode">
371
this.resizerDirection = "right";
379
<!-- North-South resizer -->
380
<binding id="ns-resizer" extends="xul:box"> <!-- extends="chrome://global/content/bindings/popup.xml#resizerbase"> -->
382
<xul:hbox class="ns-resizer-box" flex="1"/>
386
<method name="handleMouseMove">
387
<parameter name="aEvent"/>
390
var boxObject = aEvent.target.boxObject;
391
if (boxObject.captureMouseEvents && this.resizerDirection == "bottom") {
392
var delta = aEvent.screenY - this.screenTop;
393
this.screenTop = aEvent.screenY;
394
var currWidth = aEvent.target.boxObject.width;
396
// We can set this directly as we're only modifying one dimension
397
aEvent.target.height += delta;
402
<method name="setMode">
405
this.resizerDirection = "bottom";
413
<!-- Diagonal resizer -->
414
<binding id="diag-resizer" extends="xul:box"> <!-- extends="chrome://global/content/bindings/popup.xml#resizerbase"> -->
416
<xul:hbox class="diag-resizer-box" align="center" flex="1">
417
<xul:image class="diag-resizer-image"/>
422
<method name="handleMouseMove">
423
<parameter name="aEvent"/>
426
var boxObject = aEvent.target.boxObject;
427
if (boxObject.captureMouseEvents && this.resizerDirection == "bottomright") {
428
if (!this.screenLeft || !this.screenTop) {
429
this.screenLeft = aEvent.screenX;
430
this.screenTop = aEvent.screenY;
432
var deltaX = aEvent.screenX - this.screenLeft;
433
var deltaY = aEvent.screenY - this.screenTop;
434
this.screenLeft = aEvent.screenX;
435
this.screenTop = aEvent.screenY;
436
var currWidth = aEvent.target.boxObject.width;
437
var currHeight = aEvent.target.boxObject.height;
438
aEvent.target.sizeTo(currWidth + deltaX, currHeight + deltaY);
443
<method name="setMode">
446
this.resizerDirection = "bottomright";
454
<binding id="titlebar" extends="xul:box"> <!-- extends="chrome://global/content/bindings/popup.xml#resizerbase"> -->
456
<xul:hbox class="titlebar-box" flex="1">
457
<xul:hbox class="titlebar-title-box" flex="1" tooltiptext="Click and drag to float">
458
<xul:label class="titlebar-title" xbl:inherits="value=title" flex="1" crop="right"/>
460
<xul:button class="popupClose" tooltiptext="Close"/>
465
<method name="handleMouseMove">
466
<parameter name="aEvent"/>
469
if (!this.popup) this.popup = aEvent.target.popup;
470
var boxObject = this.popup.boxObject;
471
if (boxObject.captureMouseEvents && this.direction == "titlebar") {
472
if (!this.screenLeft || !this.screenTop) {
473
this.screenLeft = aEvent.screenX;
474
this.screenTop = aEvent.screenY;
476
var deltaX = aEvent.screenX - this.screenLeft;
477
var deltaY = aEvent.screenY - this.screenTop;
478
this.screenLeft = aEvent.screenX;
479
this.screenTop = aEvent.screenY;
480
var currX = aEvent.target.boxObject.screenX;
481
var currY = aEvent.target.boxObject.screenY;
482
aEvent.target.moveTo(currX + deltaX, currY + deltaY);
487
<method name="setMode">
490
this.direction = "titlebar";
498
<binding id="floater-base" display="xul:popup" extends="chrome://global/content/bindings/popup.xml#popup">
501
<!-- Popup Manipulation Constants -->
502
<field name="MANIPULATE_NONE" readonly="true">0</field>
503
<field name="MANIPULATE_MOVE" readonly="true">1</field>
504
<field name="MANIPULATE_SIZE_EW" readonly="true">2</field>
505
<field name="MANIPULATE_SIZE_NS" readonly="true">3</field>
506
<field name="MANIPULATE_SIZE_DIAG" readonly="true">4</field>
508
<method name="handleMouseMove">
509
<parameter name="aEvent"/>
512
var boxObject = this.boxObject;
513
if (boxObject.captureMouseEvents) {
515
var eScreenX = aEvent.screenX;
516
var eScreenY = aEvent.screenY;
517
switch (this.manipulateMode) {
518
case this.MANIPULATE_SIZE_EW:
519
var width = boxObject.width;
520
dX = eScreenX - this.screenLeft;
521
this.sizeTo(width + dX, this.height);
523
case this.MANIPULATE_SIZE_NS:
524
var height = boxObject.height;
525
dY = eScreenY - this.screenTop;
526
this.sizeTo(this.width, height + dY);
528
case this.MANIPULATE_SIZE_DIAG:
529
dX = eScreenX - this.screenLeft;
530
dY = eScreenY - this.screenTop;
531
this.sizeTo(this.width + dX, this.height + dY);
533
case this.MANIPULATE_MOVE:
534
// XXXben this may not yet be complete. When we drag away from the
535
// owner, we set some properties to ensure that we aren't
536
// positioned as a menu, automatically closed or steal
537
// keyboard navigation in an inappropriate way.
538
this.autoPosition = false;
539
this.enableRollup(false);
540
this.enableKeyboardNavigator(false);
541
dX = eScreenX - this.screenLeft;
542
dY = eScreenY - this.screenTop;
543
this.moveTo(this.left + dX, this.top + dY);
548
this.screenLeft = eScreenX;
549
this.screenTop = eScreenY;
554
<method name="findParentByLocalName">
555
<parameter name="aNode"/>
556
<parameter name="aLocalName"/>
560
var names = [].concat(aLocalName);
562
for (var i = 0; i < names.length; ++i) {
563
if (parent.localName == names[i])
566
parent = parent.parentNode;
572
<method name="setMode">
573
<parameter name="aEvent"/>
576
var widget = this.findParentByLocalName(aEvent.originalTarget, ["resizer", "titlebar"]);
578
if (widget.localName == "titlebar")
579
this.manipulateMode = this.MANIPULATE_MOVE;
581
this.sizeDirection = widget.getAttribute("direction");
586
<method name="cleanUp">
587
<parameter name="aEvent"/>
590
this.boxObject.captureMouseEvents = false;
591
this.screenLeft = aEvent.screenX;
592
this.screenTop = aEvent.screenY;
593
this.manipulateMode = this.MANIPULATE_NONE;
594
aEvent.preventDefault();
598
<field name="screenLeft">0</field>
599
<field name="screenTop">0</field>
600
<field name="manipulateMode">0</field>
603
<handler event="mousedown" phase="capturing">
605
this.boxObject.captureMouseEvents = true;
606
this.screenLeft = event.screenX;
607
this.screenTop = event.screenY;
611
<handler event="mouseup" phase="capturing">
616
<handler event="mousemove" phase="capturing">
618
this.handleMouseMove(event);
619
event.preventDefault();
622
<!-- clean up, release the mouse, etc -->
623
<handler event="popuphiding">
628
<handler event="click">
630
// Hide the popup if the [X] box is clicked.
631
// XXXben this may not really belong here, but rather in a derived binding.
632
if (event.originalTarget.className.indexOf("popupClose") != -1)
633
this.popupBoxObject.hidePopup();
639
<binding id="popup-scrollbars" extends="chrome://global/content/bindings/popup.xml#popup">
641
<xul:hbox class="popup-internal-box" flex="1" orient="vertical" style="overflow: auto;">
647
<binding id="floater-normal" extends="chrome://global/content/bindings/popup.xml#floater-base">
648
<content xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" >
649
<vbox class="floater-box" flex="1">
650
<box class="floater-box-top">
651
<titlebar flex="1" xbl:inherits="title" style="border: 1px outset grey; background-color: grey;"/>
653
<box class="floater-box-center" flex="1">
654
<box class="floater-children" flex="1">
658
<box class="floater-box-bottom">
659
<resizer direction="bottom" flex="1"/>
660
<resizer direction="bottomright" tooltiptext="Click and drag to resize"/>
666
<binding id="floater-dock-left" extends="chrome://global/content/bindings/popup.xml#floater-base">
667
<content xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" >
668
<vbox class="floater-box" flex="1">
669
<box class="floater-box-top">
670
<titlebar flex="1" xbl:inherits="title"/>
672
<box class="floater-box-center" flex="1">
673
<box class="floater-children" flex="1">
676
<resizer direction="right" tooltiptext="Click and drag to resize"/>
682
<binding id="close-button" extends="chrome://global/content/bindings/button.xml#button-base">
684
<xul:hbox align="center" flex="1">
685
<xul:image class="close-button-x"/>