1 <bindings xmlns="http://www.mozilla.org/xbl"
  2     xmlns:xbl="http://www.mozilla.org/xbl"
  3     xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
  4 
  5   <binding id="buttonmenu" display="xul:menu" 
  6            extends="chrome://global/content/bindings/toolbarbutton.xml#toolbarbutton">
  7     <content>
  8       <children includes="observes|template|menupopup|tooltip"/>
  9       <xul:image class="toolbarbutton-icon" xbl:inherits="validate,src=image,toolbarmode,buttonstyle"/>
 10       <xul:label class="toolbarbutton-text" crop="right" flex="1"
 11                  xbl:inherits="value=label,accesskey,crop,dragover-top,toolbarmode,buttonstyle"/>
 12     </content>
 13   </binding>
 14 
 15   <!-- borrowed from Hit-a-Hint by Pekka P. Sillanpaa (c) -->
 16   <binding id="keyinputbox">
 17     <resources>
 18        <stylesheet src="chrome://fireinput/skin/fireinput.css"/>
 19     </resources>
 20     <content>
 21       <xul:textbox xbl:inherits="size" 
 22                    readonly="true" 
 23                    class="keyinputbox" 
 24                    onkeydown="parentNode.onKeyDown(event);"
 25                    onkeyup="parentNode.stopEvent(event);return false;"
 26                    onkeypress="parentNode.stopEvent(event);return false;"
 27                    onfocus="style.background='#faa';"
 28                    onblur="style.background='#fff';"
 29                    />
 30     </content>
 31     <implementation>
 32       <!-- Stores the keyCode and modifiers in a single value -->
 33       <property name="combinedValue"
 34                 onset="return this.setCombinedValue(val);"
 35                 onget="return this.getCombinedValue();"/>
 36       <property name="allowModifiers"
 37                 onset="return this.setAttribute('allowmodifiers',val);"
 38                 onget="return this.getAttribute('allowmodifiers');"/>
 39                 <!-- onset="return this.updateAttr('modifiers',val);" -->
 40       <property name="modifiers"
 41                 onget="return this.getAttribute('modifiers');"/>
 42                 <!-- onset="return this.updateAttr('keycode',val);" -->
 43       <property name="keyCode"
 44                 onget="return this.getAttribute('keycode');"/>
 45 
 46 
 47       <constructor>
 48         if (this.getAttribute('keycode') != '')
 49           this.updateDisplay();
 50       </constructor>
 51 
 52       <method name="updateAttr">
 53         <parameter name="attr"/>
 54         <parameter name="value"/>
 55         <body>
 56           <![CDATA[
 57             if (attr == 'modifiers' && this.getAttribute('allowmodifiers') == 'false')
 58               return false;
 59             this.setAttribute(attr, value);
 60             this.updateDisplay();
 61             return true;
 62           ]]>
 63         </body>
 64       </method>
 65 
 66       <method name="updateDisplay">
 67         <body>
 68           document.getAnonymousNodes(this)[0].value = this.keyString();
 69         </body>
 70       </method>
 71 
 72       <!-- Returns a displayable representation of the keyCode and modifier values -->
 73       <method name="keyString">
 74         <body>
 75           <![CDATA[
 76             var str = '';
 77             var parts;
 78             var modifiers = this.getAttribute('modifiers');
 79             var keyCode = this.getAttribute('keycode');
 80             if (keyCode == '') return '未设';
 81             str += (modifiers & Event.CONTROL_MASK)?'Ctrl+':'';
 82             str += (modifiers & Event.ALT_MASK)?'Alt+':'';
 83             str += (modifiers & Event.SHIFT_MASK)?'Shift+':'';
 84             str += (modifiers & Event.META_MASK)?'Meta+':''; 
 85             if(keyCodeMapper!=null)
 86                 return str + keyCodeMapper[keyCode];
 87             // If no name is set, just use the keyCode
 88             return str + keyCode;   
 89           ]]>
 90         </body>
 91       </method>
 92 
 93       <method name="onKeyDown">
 94         <parameter name="event"/>
 95         <body>
 96           if (event.keyCode == Event.prototype.DOM_VK_META ||
 97               event.keyCode == Event.prototype.DOM_VK_SHIFT ||
 98               event.keyCode == Event.prototype.DOM_VK_CONTROL ||
 99               event.keyCode == Event.prototype.DOM_VK_ALT)
100               return;
101           this.setKey(event);
102           this.stopEvent(event);
103         </body>
104       </method>
105 
106       <method name="stopEvent">
107         <parameter name="event"/>
108         <body>
109           event.preventDefault();
110           event.stopPropagation();
111         </body>
112       </method>
113 
114 
115 
116       <method name="setKey">
117         <parameter name="event"/>
118         <body>
119           if(event.keyCode=="8"){
120             this.updateAttr('keycode',"");
121             this.updateAttr('modifiers',0);
122           }else{
123             this.updateAttr('keycode',event.keyCode);
124             this.updateAttr('modifiers',this.getModifiers(event));
125           }
126           this.updateDisplay();
127         </body>
128       </method>
129 
130 
131       <method name="getModifiers">
132         <parameter name="event"/>
133         <body>
134           return event.altKey * Event.ALT_MASK |
135                  event.ctrlKey * Event.CONTROL_MASK |
136                  event.shiftKey * Event.SHIFT_MASK |
137                  event.metaKey * Event.META_MASK;
138         </body>
139       </method>
140       <!-- Returns a string that can be used in the 'modifiers' attribute of the
141            XUL <key> element -->
142       <method name="getModifierString">
143         <body>
144           <![CDATA[
145             var arr = new Array();
146             var modifiers = this.getAttribute('modifiers');
147             if (modifiers & Event.CONTROL_MASK) arr.push('accel');
148             if (modifiers & Event.SHIFT_MASK) arr.push('shift');
149             if (modifiers & Event.ALT_MASK) arr.push('alt');
150             if (modifiers & Event.META_MASK) arr.push('meta');
151             return arr.join(',');
152           ]]>
153         </body>
154       </method>
155       <method name="setCombinedValue">
156         <parameter name="value"/>
157         <body>
158           <![CDATA[
159             if(value=="0"){
160                 this.updateAttr('modifiers', 0);
161                 this.updateAttr('keycode', "");
162             }else{
163                 this.updateAttr('modifiers', value & 0xF);
164                 this.updateAttr('keycode', value >> 4);
165             }   
166           ]]>
167         </body>
168       </method>
169 
170       <method name="getCombinedValue">
171         <body>
172           <![CDATA[
173             return this.keyCode << 4 | this.modifiers;
174           ]]>
175         </body>
176       </method>
177     </implementation>
178   </binding>
179 </bindings>


syntax highlighted by Code2HTML, v. 0.9.1