home *** CD-ROM | disk | FTP | other *** search
/ Australian Personal Computer 2004 September / APC0409D1.iso / f_looks / files / adblock-0.5-dev.xpi / chrome / adblock.jar / content / settings.xml < prev    next >
Encoding:
Extensible Markup Language  |  2003-10-31  |  31.0 KB  |  974 lines

  1. <?xml version="1.0"?>
  2.  
  3. <bindings id="listboxBindings"
  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">
  7.   
  8.   <binding id="listbox-base">
  9.     <resources>
  10.       <stylesheet src="chrome://global/skin/listbox.css"/>
  11.     </resources>
  12.   </binding>
  13.   
  14.   <binding id="listbox"
  15.            extends="settings.xml#listbox-base">
  16.     <content>
  17.       <children includes="listcols">
  18.         <xul:listcols>
  19.           <xul:listcol flex="1"/>
  20.         </xul:listcols>
  21.       </children>
  22.       <xul:listrows>
  23.         <children includes="listhead"/>
  24.         <xul:listboxbody xbl:inherits="rows,size,minheight">
  25.           <children includes="listitem"/>
  26.         </xul:listboxbody> 
  27.       </xul:listrows>
  28.     </content>
  29.     
  30.     <implementation implements="nsIDOMXULMultiSelectControlElement, nsIDOMXULSelectControlElement, nsIAccessibleProvider">
  31.       <field name="_isUpSelection">0</field>
  32.       <field name="_isDownSelection">0</field>
  33.       <field name="_suppressOnSelect">false</field>
  34.       <field name="_selectionStart">null</field>
  35.       <field name="_currentItem">null</field>
  36.       <field name="_selectTimeout">null</field>
  37.       <field name="_lastKeyTime">0</field>
  38.       <field name="_incrementalString">""</field>
  39.  
  40.       <constructor>
  41.       <![CDATA[
  42.         var els = this.getElementsByAttribute("selected", "true");
  43.         this.selectedItems = [];
  44.         for (var i = 0; i < els.length; ++i)
  45.           this.selectedItems.push(els[i]);
  46.       ]]>
  47.       </constructor>
  48.  
  49.       <!-- ///////////////// nsIAccessibleProvider ///////////////// -->
  50.  
  51.       <property name="accessible">
  52.         <getter>
  53.           <![CDATA[
  54.             var accService = Components.classes["@mozilla.org/accessibilityService;1"].getService(Components.interfaces.nsIAccessibilityService);
  55.             return accService.createXULListboxAccessible(this);
  56.           ]]>
  57.         </getter>
  58.       </property>
  59.       
  60.       <!-- ///////////////// public listbox members ///////////////// -->
  61.  
  62.       <property name="listBoxObject"
  63.                 onget="return this.boxObject.QueryInterface(Components.interfaces.nsIListBoxObject);"
  64.                 readonly="true"/>
  65.  
  66.       <property name="disableKeyNavigation"
  67.                 onget="return this.hasAttribute('disableKeyNavigation');"
  68.                 onset="if (val) this.setAttribute('disableKeyNavigation', 'true');
  69.                        else this.removeAttribute('disableKeyNavigation'); return val;"/>
  70.  
  71.       <method name="timedSelect">
  72.         <parameter name="item"/>
  73.         <parameter name="timeout"/>
  74.         <body>
  75.         <![CDATA[
  76.           var suppress = this._suppressOnSelect;
  77.           if (timeout != -1)
  78.             this._suppressOnSelect = true;
  79.           
  80.           this.selectItem(item);
  81.           
  82.           this._suppressOnSelect = suppress;         
  83.           
  84.           if (timeout != -1) {
  85.             if (this._selectTimeout)
  86.               window.clearTimeout(this._selectTimeout);
  87.               
  88.             this._selectTimeout = window.setTimeout(this._selectTimeoutHandler, timeout, this); 
  89.           }
  90.         ]]>
  91.         </body>
  92.       </method>      
  93.  
  94.       <!-- ///////////////// private listbox members ///////////////// -->
  95.  
  96.       <method name="_fireOnSelect">
  97.         <body>
  98.         <![CDATA[
  99.           if (!this._suppressOnSelect && this.getAttribute("suppressonselect") != "true") {
  100.             var event = document.createEvent("Events");
  101.             event.initEvent("select", false, true);
  102.             this.dispatchEvent(event);
  103.           }
  104.         ]]>
  105.         </body>
  106.       </method>
  107.  
  108.       <method name="_selectTimeoutHandler">
  109.         <parameter name="me"/>
  110.         <body>
  111.         <![CDATA[
  112.           me._fireOnSelect();
  113.           me._selectTimeout = null;
  114.         ]]>
  115.         </body>
  116.       </method>      
  117.       
  118.       <!-- ///////////////// nsIDOMXULSelectControlElement ///////////////// -->
  119.  
  120.       <property name="selType"
  121.                 onget="return this.getAttribute('seltype')"
  122.                 onset="this.setAttribute('seltype', val); return val;"/>
  123.  
  124.       <property name="selectedIndex">
  125.         <getter><![CDATA[
  126.           return this.selectedItems.length > 0 ? this.getIndexOfItem(this.selectedItems[0]) : -1;
  127.         ]]></getter>
  128.         <setter><![CDATA[
  129.           if (val >= 0)
  130.             this.selectItem(this.getItemAtIndex(val));
  131.           else
  132.             this.clearSelection();
  133.         ]]></setter>
  134.       </property>
  135.  
  136.       <property name="selectedItem">
  137.         <getter><![CDATA[
  138.           return this.selectedItems.length > 0 ? this.selectedItems[0] : null;
  139.         ]]></getter>
  140.         <setter><![CDATA[
  141.           this.selectItem(val);
  142.         ]]></setter>
  143.       </property>
  144.  
  145.       <property name="value">
  146.         <getter>
  147.           <![CDATA[
  148.             if (this.selectedItems.length > 0)
  149.               return this.selectedItem.value;
  150.             else
  151.               return null;
  152.           ]]>
  153.         </getter>
  154.         <setter>
  155.           <![CDATA[
  156.             var kids = this.getElementsByAttribute("value", val);
  157.             if (kids && kids.length)
  158.               this.selectItem(kids[0]);
  159.             return val;
  160.           ]]>
  161.         </setter>
  162.       </property>
  163.  
  164.       <method name="appendItem">
  165.         <parameter name="label"/>
  166.         <parameter name="value"/>
  167.         <body>
  168.         <![CDATA[
  169.           var XULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
  170.           var item = document.createElementNS(XULNS, "listitem");
  171.           item.setAttribute("label", label);
  172.           item.setAttribute("value", value);
  173.           this.appendChild(item);
  174.           return item;
  175.         ]]>
  176.         </body>
  177.       </method>
  178.       
  179.       <method name="insertItemAt">
  180.         <parameter name="index"/>
  181.         <parameter name="label"/>
  182.         <parameter name="value"/>
  183.         <body>
  184.         <![CDATA[
  185.           var XULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
  186.           var item = document.createElementNS(XULNS, "listitem");
  187.           item.setAttribute("label", label);
  188.           item.setAttribute("value", value);
  189.           var before = this.childNodes[index];
  190.           if (before)
  191.             this.insertBefore(item, before);
  192.           else
  193.             this.appendChild(item);
  194.           return item;
  195.         ]]>
  196.         </body>
  197.       </method>
  198.  
  199.       <method name="removeItemAt">
  200.         <parameter name="index"/>
  201.         <body>
  202.         <![CDATA[
  203.           var remove = this.childNodes[index];
  204.           if (remove)
  205.             this.removeChild(remove);
  206.           return remove;
  207.         ]]>
  208.         </body>
  209.       </method>
  210.       <!-- ///////////////// nsIDOMXULSelectMultipleControlElement ///////////////// -->
  211.  
  212.       <property name="currentItem" onget="return this._currentItem;">
  213.         <setter>
  214.         <![CDATA[
  215.           if (this._currentItem)
  216.             this._currentItem.current = false;
  217.           this._currentItem = val;
  218.           if (val)
  219.             val.current = true;          
  220.           return val;
  221.         ]]>
  222.         </setter>
  223.       </property>
  224.       
  225.       <property name="selectedCount" onget="return this.selectedItems.length;"/>
  226.       
  227.       <method name="getSelectedItem">
  228.         <parameter name="index"/>
  229.         <body>
  230.         <![CDATA[
  231.           return index < this.selectedItems.length ? this.selectedItems[index] : null;
  232.         ]]>
  233.         </body>
  234.       </method>      
  235.       
  236.       <method name="addItemToSelection">
  237.         <parameter name="item"/>
  238.         <body>
  239.         <![CDATA[
  240.           if (this.selType != "multiple" && this.selectedCount)
  241.             return;
  242.  
  243.           if (item.selected)
  244.             return;
  245.             
  246.           this.selectedItems.push(item);
  247.           item.selected = true;
  248.           
  249.           this._fireOnSelect();
  250.         ]]>
  251.         </body>
  252.       </method>      
  253.       
  254.       <method name="removeItemFromSelection">
  255.         <parameter name="item"/>
  256.         <body>
  257.         <![CDATA[
  258.           if (!item.selected)
  259.             return;
  260.             
  261.           for (var i = 0; i < this.selectedItems.length; ++i) {
  262.             if (this.selectedItems[i] == item) {
  263.               this.selectedItems.splice(i, 1);
  264.               item.selected = false;
  265.               break;
  266.             }
  267.           }
  268.               
  269.           this._fireOnSelect();
  270.         ]]>
  271.         </body>
  272.       </method>      
  273.       
  274.       <method name="toggleItemSelection">
  275.         <parameter name="item"/>
  276.         <body>
  277.         <![CDATA[
  278.           if (item.selected)
  279.             this.removeItemFromSelection(item);
  280.           else
  281.             this.addItemToSelection(item);
  282.         ]]>
  283.         </body>
  284.       </method>      
  285.       
  286.       <method name="selectItem">
  287.         <parameter name="item"/>
  288.         <body>
  289.         <![CDATA[
  290.           if (!item)
  291.             return;
  292.             
  293.           if (this.selectedItems.length == 1 && this.selectedItems[0] == item)
  294.             return;
  295.           
  296.           this._selectionStart = null;
  297.           
  298.           var suppress = this._suppressOnSelect;
  299.           this._suppressOnSelect = true;
  300.  
  301.           this.clearSelection();
  302.           this.addItemToSelection(item);
  303.           this.currentItem = item;
  304.           
  305.           this._suppressOnSelect = suppress;
  306.           this._fireOnSelect();
  307.         ]]>
  308.         </body>
  309.       </method>      
  310.       
  311.       <method name="selectItemRange">
  312.         <parameter name="startItem"/>
  313.         <parameter name="endItem"/>
  314.         <body>
  315.         <![CDATA[
  316.           if (this.selType != "multiple")
  317.             return;
  318.  
  319.           if (!startItem)
  320.             startItem = this._selectionStart ? this._selectionStart : this.currentItem;
  321.           if (!startItem)
  322.             startItem = endItem;
  323.                       
  324.           var suppressSelect = this._suppressOnSelect;
  325.           this._suppressOnSelect = true;
  326.           this.clearSelection();
  327.  
  328.           this._selectionStart = startItem;
  329.           
  330.           var currentItem;
  331.           var startIndex = this.getIndexOfItem(startItem);
  332.           var endIndex = this.getIndexOfItem(endItem);
  333.           if (endIndex < startIndex) {
  334.             currentItem = endItem;
  335.             endItem = startItem;
  336.             startItem = currentItem;            
  337.           } else {
  338.             currentItem = startItem;
  339.           }
  340.             
  341.           while (currentItem) {
  342.             if (currentItem.localName == "listitem")
  343.               this.addItemToSelection(currentItem);
  344.             if (currentItem == endItem)
  345.               break;
  346.             currentItem = this.getNextItem(currentItem, 1);
  347.           }
  348.  
  349.           this._suppressOnSelect = suppressSelect;
  350.           
  351.           this._fireOnSelect();
  352.         ]]>
  353.         </body>
  354.       </method>      
  355.       
  356.       <method name="selectAll">
  357.         <body>
  358.         <![CDATA[
  359.           var suppress = this._suppressOnSelect;
  360.           this._suppressOnSelect = true;
  361.           
  362.           var item = this.getItemAtIndex(0);
  363.           while (item) {
  364.             this.addItemToSelection(item);
  365.             item = this.getNextItem(item, 1);  
  366.           }
  367.           
  368.           this._suppressOnSelect = suppress;
  369.           this._fireOnSelect();
  370.         ]]>
  371.         </body>
  372.       </method>      
  373.       
  374.       <method name="invertSelection">
  375.         <body>
  376.         <![CDATA[
  377.           var suppress = this._suppressOnSelect;
  378.           this._suppressOnSelect = true;
  379.           
  380.           var item = this.getItemAtIndex(0);
  381.           while (item) {
  382.             if (item.selected)
  383.               this.removeItemFromSelection(item);
  384.             else
  385.               this.addItemToSelection(item);
  386.             item = this.getNextItem(item, 1);  
  387.           }
  388.           
  389.           this._suppressOnSelect = suppress;
  390.           this._fireOnSelect();
  391.         ]]>
  392.         </body>
  393.       </method>      
  394.       
  395.       <method name="clearSelection">
  396.         <body>
  397.         <![CDATA[
  398.           if (this.selectedItems)
  399.           {
  400.             for (var i = this.selectedItems.length-1; i >= 0; --i)
  401.               this.selectedItems[i].selected = false;
  402.           
  403.             this.selectedItems.splice(0, this.selectedItems.length);
  404.           }
  405.           this._selectionStart = null;
  406.           this._fireOnSelect();
  407.         ]]>
  408.         </body>
  409.       </method>      
  410.       
  411.       <!-- ///////////////// nsIListBoxObject ///////////////// -->
  412.       
  413.       <method name="getNextItem">
  414.         <parameter name="startItem"/>
  415.         <parameter name="delta"/>
  416.         <body><![CDATA[
  417.           while (startItem) {
  418.             startItem = startItem.nextSibling;
  419.             if (startItem && startItem.localName == "listitem") {
  420.               --delta;
  421.               if (delta == 0)
  422.                 return startItem;
  423.             }
  424.           }
  425.           return null;
  426.         ]]></body>
  427.       </method>
  428.       <method name="getPreviousItem">
  429.         <parameter name="startItem"/>
  430.         <parameter name="delta"/>
  431.         <body><![CDATA[
  432.           while (startItem) {
  433.             startItem = startItem.previousSibling;
  434.             if (startItem && startItem.localName == "listitem") {
  435.               --delta;
  436.               if (delta == 0)
  437.                 return startItem;
  438.             }
  439.           }
  440.           return null;
  441.         ]]></body>
  442.       </method>
  443.       <method name="getIndexOfItem">
  444.         <parameter name="item"/>
  445.         <body>
  446.           return this.listBoxObject.getIndexOfItem(item);
  447.         </body>
  448.       </method>
  449.       <method name="getItemAtIndex">
  450.         <parameter name="index"/>
  451.         <body>
  452.           return this.listBoxObject.getItemAtIndex(index);
  453.         </body>
  454.       </method>
  455.       <method name="ensureIndexIsVisible">
  456.         <parameter name="index"/>
  457.         <body>
  458.           return this.listBoxObject.ensureIndexIsVisible(index);
  459.         </body>
  460.       </method>
  461.       <method name="ensureElementIsVisible">
  462.         <parameter name="element"/>
  463.         <body>
  464.           return this.ensureIndexIsVisible(this.listBoxObject.getIndexOfItem(element));
  465.         </body>
  466.       </method>
  467.       <method name="scrollToIndex">
  468.         <parameter name="index"/>
  469.         <body>
  470.           return this.listBoxObject.scrollToIndex(index);
  471.         </body>
  472.       </method>
  473.       <method name="getNumberOfVisibleRows">
  474.         <body>
  475.           return this.listBoxObject.getNumberOfVisibleRows();
  476.         </body>
  477.       </method>
  478.       <method name="getIndexOfFirstVisibleRow">
  479.         <body>
  480.           return this.listBoxObject.getIndexOfFirstVisibleRow();
  481.         </body>
  482.       </method>
  483.       <method name="getRowCount">
  484.         <body>
  485.           return this.listBoxObject.getRowCount();
  486.         </body>
  487.       </method>
  488.     </implementation>
  489.     
  490.     <handlers>
  491.       <handler event="keypress" keycode="vk_up">
  492.         <![CDATA[
  493.          if (event.target != this || this.selectedItems.length < 1)
  494.            return;
  495.          this._isUpSelection=0;
  496.          this._isDownSelection=0;
  497.          var n = this.getPreviousItem(this.selectedItems[this.selectedItems.length-1], 1);
  498.          if (n) {
  499.            this.ensureIndexIsVisible(this.getIndexOfItem(n));
  500.            this.timedSelect(n, 500);
  501.          }
  502.         ]]>
  503.       </handler>
  504.       <handler event="keypress" keycode="vk_down">
  505.         <![CDATA[
  506.          if (event.target != this)
  507.            return;
  508.  
  509.          var n;
  510.          if (this.selectedItems.length == 0) {
  511.            n = this.getItemAtIndex(0);
  512.          }
  513.          else {
  514.            this._isUpSelection=0;
  515.            this._isDownSelection=0;
  516.            n = this.getNextItem(this.selectedItems[this.selectedItems.length-1], 1);
  517.          }
  518.  
  519.          if (n) {
  520.            this.ensureIndexIsVisible(this.getIndexOfItem(n));
  521.            this.timedSelect(n, 500);
  522.          }
  523.         ]]>
  524.       </handler>
  525.       <handler event="keypress" modifiers="shift" keycode="vk_up">
  526.         <![CDATA[
  527.          var l=this.selectedItems.length;
  528.          if (event.target != this || l < 1 || this.selType != "multiple")
  529.            return;
  530.          var n = this.getPreviousItem(this.selectedItems[l-1], 1);
  531.          if (n) {
  532.            this.ensureElementIsVisible(n);
  533.            if ( this._isDownSelection) {
  534.              if ( l > 1 )
  535.                this.removeItemFromSelection(this.selectedItems[l-1]);
  536.              if ( l <= 2 )
  537.                this._isDownSelection=0;
  538.      }
  539.            else {
  540.              this.addItemToSelection(n);
  541.              this._isUpSelection=1;
  542.            }
  543.          }
  544.         ]]>
  545.       </handler>
  546.       <handler event="keypress" modifiers="shift" keycode="vk_down">
  547.         <![CDATA[
  548.          var l=this.selectedItems.length;
  549.          if (event.target != this || l < 1 || this.selType != "multiple")
  550.            return;
  551.          var n = this.getNextItem(this.selectedItems[l-1], 1);
  552.          if (n) {
  553.            this.ensureElementIsVisible(n);
  554.            if ( this._isUpSelection) {
  555.              if ( l > 1 )
  556.          this.removeItemFromSelection(this.selectedItems[l-1]);
  557.              if ( l <= 2 )
  558.                this._isUpSelection=0;
  559.            }
  560.            else {
  561.              this.addItemToSelection(n);
  562.              this._isDownSelection=1;
  563.            }
  564.          }
  565.         ]]>
  566.       </handler>
  567.       <handler event="keypress" keycode="vk_page_up">
  568.         <![CDATA[
  569.          var l = this.selectedItems.length;
  570.          if (event.target != this || l < 1)
  571.            return;
  572.          this._isUpSelection=0;
  573.          this._isDownSelection=0;
  574.          var i = this.getIndexOfFirstVisibleRow();
  575.          if ( i == 0 )
  576.            var n=this.getItemAtIndex(0);
  577.          else {
  578.            var v = this.getNumberOfVisibleRows();
  579.            n = this.getPreviousItem(this.selectedItems[l-1], v);
  580.            var newIndex = i - v;
  581.            if ( ! n || newIndex < 0 ) {
  582.              newIndex=0;
  583.              n=this.getItemAtIndex(this.getIndexOfItem(this.selectedItems[l-1]) - i);
  584.            }
  585.            this.scrollToIndex(newIndex);
  586.          }
  587.          this.timedSelect(n, 500);
  588.         ]]>
  589.       </handler>
  590.       <handler event="keypress" keycode="vk_page_down">
  591.         <![CDATA[
  592.          var l = this.selectedItems.length;
  593.          if (event.target != this || l < 1)
  594.            return;
  595.          this._isUpSelection=0;
  596.          this._isDownSelection=0;
  597.          var i = this.getIndexOfFirstVisibleRow();
  598.          var v = this.getNumberOfVisibleRows();
  599.          var count = this.getRowCount();
  600.          var n;
  601.          if ( i >= count - v )
  602.            n=this.getItemAtIndex(count - 1);
  603.          else {
  604.            n = this.getNextItem(this.selectedItems[l-1], v);
  605.            var newIndex = i + v;
  606.            if ( ! n || newIndex > count - v ) {
  607.              newIndex = count - v;
  608.              n = this.getItemAtIndex(newIndex + this.getIndexOfItem(this.selectedItems[l-1]) - i);
  609.            }
  610.            this.scrollToIndex(newIndex);
  611.          }
  612.          this.timedSelect(n, 500);
  613.         ]]>
  614.       </handler>
  615.       <handler event="keypress" keycode="vk_home">
  616.         <![CDATA[
  617.          if (event.target != this || this.selectedItems.length < 1)
  618.            return;
  619.          this._isUpSelection=0;
  620.          this._isDownSelection=0;
  621.          this.scrollToIndex(0);
  622.          this.selectItem(this.getItemAtIndex(0));
  623.         ]]>
  624.       </handler>
  625.       <handler event="keypress" keycode="vk_end">
  626.         <![CDATA[
  627.          if (event.target != this || this.selectedItems.length < 1)
  628.            return;
  629.          this._isUpSelection=0;
  630.          this._isDownSelection=0;
  631.          var count = this.getRowCount();
  632.          this.ensureIndexIsVisible(count-1);
  633.          this.selectItem(this.getItemAtIndex(count-1));
  634.         ]]>
  635.       </handler>
  636.  
  637.       <handler event="keypress" key=" ">
  638.       <![CDATA[
  639.         if (this.currentItem &&
  640.             this.currentItem.getAttribute("type") == "checkbox" &&
  641.             !this.currentItem.disabled)
  642.           this.currentItem.checked = !this.currentItem.checked;
  643.       ]]>
  644.       </handler>
  645.       <handler event="keypress">
  646.       <![CDATA[
  647.          if (!this.disableKeyNavigation && event.charCode > 0 && 
  648.              !event.altKey && !event.ctrlKey && !event.shiftKey && !event.metaKey) {
  649.            var key = String.fromCharCode(event.charCode);
  650.            key = key.toLowerCase();
  651.            if (event.timeStamp - this._lastKeyTime > 1000)
  652.              this._incrementalString = key;
  653.            else {
  654.              if (this._incrementalString.length != 1 || this._incrementalString.charAt(0) != key.charAt(0))
  655.                this._incrementalString += key;
  656.            }
  657.            this._lastKeyTime = event.timeStamp;
  658.            
  659.            var l = this.selectedItems.length;
  660.            var c = -1;
  661.            if (l > 0)
  662.              c = this.getIndexOfItem(this.selectedItems[l-1]);
  663.            var rowCount = this.getRowCount();
  664.            var start = 1;
  665.            
  666.            if (this._incrementalString.length > 1) {
  667.              start = 0;
  668.              if (c < 0)
  669.                c = 0;
  670.            }
  671.  
  672.            for (var i = 0; i < rowCount; i++) {
  673.              var k = (i + start + c) % rowCount;
  674.              var item = this.getItemAtIndex(k); //listitem
  675.              var cellText = item.getAttribute("label");
  676.              cellText = cellText.toLowerCase();
  677.              if (cellText.search(this._incrementalString) == 0) {
  678.                this._isUpSelection=0;
  679.                this._isDownSelection=0;
  680.                this.ensureIndexIsVisible(k);
  681.                this.timedSelect(item, 500);
  682.                break;
  683.              }
  684.            }
  685.          }
  686.        ]]>
  687.        </handler>
  688.     </handlers>    
  689.   </binding>
  690.  
  691.   <binding id="listrows"
  692.            extends="settings.xml#listbox-base">
  693.     <handlers>
  694.       <handler event="DOMMouseScroll" phase="capturing">
  695.       <![CDATA[
  696.         var listBox = this.parentNode.listBoxObject;
  697.         var rows = event.detail;
  698.         if (rows == NSUIEvent.SCROLL_PAGE_UP)
  699.           rows = -listBox.getNumberOfVisibleRows();
  700.         else if (rows == NSUIEvent.SCROLL_PAGE_DOWN)
  701.           rows = listBox.getNumberOfVisibleRows();
  702.  
  703.         listBox.scrollByLines(rows);
  704.       ]]>
  705.       </handler>
  706.  
  707.       <!-- If there is no modifier key, we select on mousedown, not
  708.            click, so that drags work correctly. -->
  709.       <handler event="mousedown">
  710.       <![CDATA[
  711.         var targetItem = event.target;
  712.         if (targetItem.localName == "listitem" && !event.ctrlKey && !event.shiftKey && !event.metaKey) {
  713.           if (!targetItem.selected) {
  714.             parentNode.selectItem(targetItem);
  715.           }
  716.           parentNode.currentItem = targetItem;
  717.         }
  718.       ]]>
  719.       </handler>
  720.  
  721.       <!-- On a click (up+down on the same item), deselect everything
  722.            except this item. -->
  723.       <handler event="click">
  724.       <![CDATA[
  725.         if (event.button != 0) return;
  726.         var targetItem = event.target;
  727.         if (targetItem.localName == "listitem") {
  728.           if (parentNode.selType != "multiple") {
  729.             parentNode.selectItem(targetItem);
  730.           }
  731.           else if (event.ctrlKey || event.metaKey) {
  732.             parentNode.toggleItemSelection(targetItem);
  733.             parentNode.currentItem = targetItem;
  734.           }
  735.           else if (event.shiftKey) {
  736.             parentNode.selectItemRange(null, targetItem);
  737.             parentNode.currentItem = targetItem;
  738.           }
  739.           else {
  740.             /* We want to deselect all the selected items except what was
  741.                clicked, UNLESS it was a right-click.  We have to do this
  742.                in click rather than mousedown so that you can drag a
  743.                selected group of items */
  744.             
  745.             var selectedItems = parentNode.selectedItems;
  746.             var didSuppressSelect = false;
  747.             var i = 0;
  748.             while (i < selectedItems.length) {
  749.               if (selectedItems[i] != targetItem) {
  750.                 if (!didSuppressSelect) {
  751.                   parentNode._suppressOnSelect = true;
  752.                   didSuppressSelect = true;
  753.                 }
  754.                 parentNode.removeItemFromSelection(selectedItems[i]);
  755.               }
  756.               else
  757.                 i++;
  758.             }
  759.             if (didSuppressSelect)
  760.               parentNode._suppressOnSelect = false;
  761.           }
  762.         }
  763.         else {
  764.           if (parentNode.selType != "multiple" || (!event.ctrlKey && !event.shiftKey && !event.metaKey))
  765.             parentNode.clearSelection();
  766.         }
  767.       ]]>
  768.       </handler>
  769.     </handlers>
  770.   </binding>
  771.   
  772.   <binding id="listitem"
  773.            xxextends="chrome://global/content/bindings/general.xml#basetext">
  774.     <resources>
  775.       <stylesheet src="chrome://global/skin/listbox.css"/>
  776.     </resources>
  777.  
  778.     <content>
  779.       <children>
  780.         <xul:listcell id="li-lc-generated" xbl:inherits="label,crop,disabled,flexlabel"/>
  781.         <xul:textbox id="li-tb-generated" xbl:inherits="label,crop,disabled,flexlabel" hidden="true"/>
  782.       </children>
  783.     </content>
  784.  
  785.     <implementation implements="nsIDOMXULSelectControlItemElement, nsIAccessibleProvider">
  786.     
  787.     <!-- copied from chrome://global/content/bindings/general.xml#basetext -->
  788.       <property name="label"      onset="return this.setAttribute('label',val);"
  789.                                   onget="return this.getAttribute('label');"/>
  790.       <property name="crop"       onset="return this.setAttribute('crop',val);"
  791.                                   onget="return this.getAttribute('crop');"/>
  792.       <property name="disabled"   onset="if (val) this.setAttribute('disabled', 'true');
  793.                                          else this.removeAttribute('disabled');
  794.                                          return val;"
  795.                                   onget="return this.hasAttribute('disabled');"/>                                        <property name="image"      onset="return this.setAttribute('image',val);"
  796.                                   onget="return this.getAttribute('image');"/>
  797.       <property name="accessKey"  onset="return this.setAttribute('accesskey',val);"
  798.                                   onget="return this.getAttribute('accesskey');"/>
  799.      <!-- / copy -->
  800.      
  801.       <property name="current" onget="return this.getAttribute('current') == 'true';">
  802.         <setter><![CDATA[
  803.           if (val)
  804.             this.setAttribute("current", "true");
  805.           else
  806.             this.removeAttribute("current");
  807.           return val;
  808.         ]]></setter>
  809.       </property>
  810.  
  811.       <!-- ///////////////// nsIAccessibleProvider ///////////////// -->
  812.  
  813.       <property name="accessible">
  814.         <getter>
  815.           <![CDATA[
  816.             var accService = Components.classes["@mozilla.org/accessibilityService;1"].getService(Components.interfaces.nsIAccessibilityService);
  817.             return accService.createXULListitemAccessible(this);
  818.           ]]>
  819.         </getter>
  820.       </property>
  821.  
  822.       <!-- ///////////////// nsIDOMXULSelectControlItemElement ///////////////// -->
  823.                 
  824.       <property name="value" onget="return this.getAttribute('value');"
  825.                              onset="this.setAttribute('value', val); return val;"/>
  826.       <property name="label" onget="return this.getAttribute('label');"
  827.                              onset="this.setAttribute('label', val); return val;"/>
  828.       
  829.       <property name="disabled" onget="return this.getAttribute('disabled') == 'true';"
  830.                                 onset="if (val) this.setAttribute('disabled', 'true'); else this.removeAttribute('disabled');"/>
  831.       
  832.       <property name="selected" onget="return this.getAttribute('selected') == 'true';">
  833.         <setter><![CDATA[
  834.           if (val)
  835.             this.setAttribute("selected", "true");
  836.           else
  837.             this.removeAttribute("selected");
  838.  
  839.           var event = document.createEvent("Events");
  840.           event.initEvent("ListitemStateChange", true, true);
  841.           this.dispatchEvent(event);
  842.  
  843.           return val;
  844.         ]]></setter>
  845.       </property>
  846.  
  847.       <property name="control">
  848.         <getter><![CDATA[
  849.           var parent = this.parentNode;
  850.           while (parent) {
  851.             if (parent.localName == "listbox")
  852.               return parent;
  853.             parent = parent.parentNode;
  854.           }
  855.           return null;
  856.         ]]></getter>
  857.       </property>
  858.  
  859.         <!--constructor>
  860.             //alert(this.hasChildNodes());
  861.             //alert(this.getElementsByTagName("textbox")[0]);
  862.         </constructor-->
  863.  
  864.     </implementation>
  865.   </binding>
  866.  
  867.   <binding id="listitem-iconic"
  868.            extends="settings.xml#listitem">
  869.     <content>
  870.       <children>
  871.         <xul:listcell class="listcell-iconic" xbl:inherits="label,image,crop,disabled,flexlabel"/>
  872.       </children>
  873.     </content>
  874.   </binding>
  875.   
  876.   <binding id="listitem-checkbox"
  877.            extends="settings.xml#listitem">
  878.     <content>
  879.       <children>
  880.         <xul:listcell type="checkbox" xbl:inherits="label,crop,checked,disabled,flexlabel"/>
  881.       </children>
  882.     </content>
  883.  
  884.     <implementation>
  885.       <property name="checked"
  886.                 onget="return this.getAttribute('checked') == 'true';">
  887.         <setter><![CDATA[
  888.           if (val)
  889.             this.setAttribute('checked', 'true');
  890.           else
  891.             this.removeAttribute('checked');
  892.           var event = document.createEvent('Events');
  893.           event.initEvent('CheckboxStateChange', false, true);
  894.           this.dispatchEvent(event);
  895.           return val;
  896.         ]]></setter>
  897.       </property>
  898.     </implementation>
  899.  
  900.     <handlers> 
  901.       <handler event="mousedown" button="0" action="if (!this.disabled) this.checked = !this.checked;"/>
  902.     </handlers>
  903.   </binding>
  904.   
  905.   <binding id="listitem-checkbox-iconic"
  906.            extends="settings.xml#listitem-checkbox">
  907.     <content>
  908.       <children>
  909.         <xul:listcell type="checkbox" class="listcell-iconic" xbl:inherits="label,image,crop,checked,disabled,flexlabel"/>
  910.       </children>
  911.     </content>
  912.   </binding>
  913.   
  914.   <binding id="listcell"
  915.            extends="settings.xml#listbox-base">
  916.     <content>
  917.       <children>
  918.         <xul:label class="listcell-label" xbl:inherits="value=label,flex=flexlabel,crop,disabled" flex="1" crop="right"/>
  919.       </children>
  920.     </content>
  921.   </binding>
  922.  
  923.   <binding id="listcell-iconic"
  924.            extends="settings.xml#listcell">
  925.     <content>
  926.       <children>
  927.         <xul:image class="listcell-icon" xbl:inherits="src=image"/>
  928.         <xul:label class="listcell-label" xbl:inherits="value=label,flex=flexlabel,crop,disabled" flex="1" crop="right"/>
  929.       </children>
  930.     </content>
  931.   </binding>
  932.  
  933.   <binding id="listcell-checkbox"
  934.            extends="settings.xml#listcell">
  935.     <content>
  936.       <children>
  937.         <xul:image class="listcell-check" xbl:inherits="checked,disabled"/>
  938.         <xul:label class="listcell-label" xbl:inherits="value=label,flex=flexlabelcrop,disabled" flex="1" crop="right"/>
  939.       </children>
  940.     </content>
  941.   </binding>
  942.  
  943.   <binding id="listcell-checkbox-iconic"
  944.            extends="settings.xml#listcell-checkbox">
  945.     <content>
  946.       <children>
  947.         <xul:image class="listcell-check" xbl:inherits="checked,disabled"/>
  948.         <xul:image class="listcell-icon" xbl:inherits="src=image"/>
  949.         <xul:label class="listcell-label" xbl:inherits="value=label,flex=flexlabelcrop,disabled" flex="1" crop="right"/>
  950.       </children>
  951.     </content>
  952.   </binding>
  953.  
  954.   <binding id="listhead"
  955.            extends="settings.xml#listbox-base">
  956.     <content>
  957.       <xul:listheaditem>
  958.         <children includes="listheader"/>
  959.       </xul:listheaditem>
  960.     </content>
  961.   </binding>
  962.   
  963.   <binding id="listheader" display="xul:button"
  964.            extends="settings.xml#listbox-base">
  965.     <content>
  966.       <xul:image class="listheader-icon"/>
  967.       <xul:label class="listheader-label" xbl:inherits="value=label,crop" flex="1" crop="right"/>
  968.       <xul:image class="listheader-sortdirection" xbl:inherits="sortDirection"/>
  969.     </content>
  970.   </binding>
  971.  
  972. </bindings>
  973.  
  974.