[ Index ] |
|
Code source de eGroupWare 1.2.106-2 |
1 /* 2 DynAPI Distribution 3 DynKeyEvent Extensions 4 5 The DynAPI Distribution is distributed under the terms of the GNU LGPL license. 6 7 Requirements: 8 dynapi.api 9 */ 10 function DynKeyEvent(type,src) { 11 this.DynEvent = DynEvent; 12 this.DynEvent(type,src); 13 this.charKey=null; 14 }; 15 var p=dynapi.setPrototype('DynKeyEvent','DynEvent'); 16 p.getKey=function() { 17 return this.charKey; 18 }; 19 DynKeyEvent._keyEventListener=function(e) { 20 var dynobj=this._dynobj; 21 if(!dynobj) 22 return true; 23 var dyndoc=dynobj.doc._dynobj; 24 if(!dyndoc) return true; 25 if(!e) var e=dyndoc.frame.event; 26 27 var evt=new DynKeyEvent(e.type,dynobj); 28 evt.which=(e.keyCode)?e.keyCode:e.which; 29 var key=String.fromCharCode(evt.which).toLowerCase(); 30 if((key>='a'&&key<='z')||(key>='0'&&key<='9')) evt.charKey=key; 31 evt.spaceKey=(evt.which==32); 32 evt.enterKey=(evt.which==13); 33 evt.tabKey=(evt.which==9||evt.which==65289); 34 evt.leftKey=(evt.which==37||evt.which==52||evt.which==100||evt.which==65460); 35 evt.rightKey=(evt.which==39||evt.which==54||evt.which==102||evt.which==65462); 36 evt.upKey=(evt.which==38||evt.which==56||evt.which==104||evt.which==65464); 37 evt.downKey=(evt.which==40||evt.which==50||evt.which==98||evt.which==65458); 38 evt.altKey=(e.modifiers)?false:(e.altKey||e.altLeft||evt.which==18||evt.which==57388); 39 evt.ctrlKey=(e.modifiers)?(e.modifiers&Event.CONTROL_MASK):(e.ctrlKey||e.ctrlLeft||evt.which==17||evt.which==57391); 40 evt.shiftKey=(e.modifiers)?(e.modifiers&Event.SHIFT_MASK):(e.shiftKey||e.shiftLeft||evt.which==16||evt.which==57390); 41 42 dynobj.invokeEvent(evt.type,evt); 43 if(evt.defaultValue==false) { 44 if(e.cancelBubble) e.cancelBubble=true; 45 if(e.stopPropagation) e.stopPropagation(); 46 } 47 return evt.defaultValue; 48 }; 49 50 TabManager={}; 51 TabManager._c=0; // Current tab manager index. 52 TabManager._all=[]; 53 TabManager._active=false; 54 TabManager._activeTimeout=function() { // Prevent duplcate keydown events in NS4. 55 TabManager._active=true; 56 setTimeout('TabManager._active=false;',25); 57 }; 58 TabManager._getForm=null; 59 TabManager.getForm=function(p) { // Prevent default tab focus in Mozilla. 60 if(TabManager._getForm) return; 61 TabManager._getForm=p; 62 var html='<form name="__frm" onsubmit="return false;"><input name="__tab" size=1></form>'; 63 return p.addChild(new DynLayer(html),'__lyr'); 64 }; 65 TabManager._grabFocus=function() { 66 var form=TabManager._getForm.__lyr; 67 setTimeout(form+'.doc.forms.__frm.__tab.focus();',0); 68 }; 69 TabManager._el={}; 70 TabManager._el.onkeydown=function(e) { 71 if(TabManager._getForm) { // User must have inserted TabManager form. 72 if(TabManager._active) return; 73 TabManager._activeTimeout(); 74 } 75 var i1,o1,l1,i2,o2,l2; 76 var nextKey=(e.tabKey||e.rightKey); 77 var prevKey=((e.shiftKey&&e.tabKey)||e.leftKey); 78 var submitKey=(e.enterKey||e.spaceKey); 79 i1=TabManager._c; o1=TabManager._all[i1]; l1=TabManager._all.length; 80 i2=o1._tabGroup._c; o2=o1._tabGroup._all[i2]; l2=o1._tabGroup._all.length; 81 if(nextKey||prevKey) { // Cycle group. 82 if(o2._hasFocusEvents) o2.setFocus(false,o2._focusBubble); 83 else o2.invokeEvent('blur'); 84 if(prevKey) i2=(i2==0)?l2-1:i2-1; 85 else i2=(i2==l2-1)?0:i2+1; 86 o2=o1._tabGroup._all[i2]; o1._tabGroup._c=i2; 87 if(o2._hasFocusEvents) o2.setFocus(true,o2._focusBubble); 88 else o2.invokeEvent('focus'); 89 } 90 else if(e.upKey||e.downKey) { // Cycle manager. 91 if(o2._hasFocusEvents) o2.setFocus(false,o2._focusBubble); 92 else o2.invokeEvent('blur'); 93 if(e.upKey) i1=(i1==0)?l1-1:i1-1; 94 else i1=(i1==l1-1)?0:i1+1; 95 o1=TabManager._all[i1]; TabManager._c=i1; 96 i2=o1._tabGroup._c; 97 o2=o1._tabGroup._all[i2]; 98 if(o2._hasFocusEvents) o2.setFocus(true,o2._focusBubble); 99 else o2.invokeEvent('focus'); 100 } else if(submitKey) { 101 o2.invokeEvent('submit'); 102 } 103 e.preventDefault(); 104 if(TabManager._getForm) TabManager._grabFocus(); 105 }; 106 DynElement.prototype.createTabManager=function() { 107 var p=this, c=p.children; if(!c) return; 108 var args=(arguments.length)?arguments:c; 109 var l=args.length, s; if(!l) return; 110 if(p._tabGroup) delete p._tabGroup; 111 p._tabGroup={ _c:0, _all:[] }; 112 for(var i=0;i<l;i++) { 113 c=args[i]; 114 p._tabGroup._all[i]=c; 115 c._hasTabManager=true; 116 if(!c._submitFn) { 117 s=c.id.replace(/-/g,'.')+'()'; // Element id callback. 118 c._submitFn=s; 119 } 120 } 121 l=TabManager._all.length; TabManager._all[l]=p; 122 if(l==0) dynapi.onLoad(function() { 123 dynapi.document.addEventListener(TabManager._el); 124 }); 125 }; 126 DynElement.prototype.updateTabManager=function() { 127 var tm=TabManager, all=tm._all[TabManager._c]; if(!all) return; 128 var old=all._tabGroup; if(!old||old._all[old._c]==this) return; 129 var p=this.parent, l; 130 var tg=(p&&p._tabGroup)?p._tabGroup:null; if(!tg) return; 131 l=tg._all.length; 132 for(var i=0;i<l;i++) if(tg._all[i]==this) { tg._c=i; break; } 133 l=tm._all.length; 134 for(var i=0;i<l;i++) if(tm._all[i]==p) { tm._c=i; break; } 135 }; 136 DynElement.prototype.addTabListeners=function(el) { 137 if(el&&this._tabGroup) { 138 var a=this._tabGroup._all; 139 for(var i in a) a[i].addEventListener(el); 140 } 141 }; 142 DynElement.prototype.addSubmitFn=function(fn) { 143 if(fn) this._submitFn=fn; 144 }; 145 DynElement.prototype.callSubmitFn=function() { 146 var f=this._submitFn; 147 if(typeof(f)=='function') f(); 148 else if(typeof(f)=='string') eval(f); 149 }; 150 151 DynElement.prototype.captureKeyEvents=function() { 152 // This impossibilitates Inheritance... changing to the same aproach as captureMouseEvents 153 //var elm=(this.getClassName()=='DynLayer')?this.elm:this.doc; 154 var elm; 155 156 if (this.getKeyEventElement) elm = this.getKeyEventElement(); 157 else elm=(this.getClassName()=='DynDocument')?this.doc:this.elm; 158 159 //if(!elm||this._hasKeyEvents) return true; 160 if (!elm) return true; 161 if(elm.addEventListener) { 162 elm.addEventListener("keydown",DynKeyEvent._keyEventListener,false); 163 elm.addEventListener("keypress",DynKeyEvent._keyEventListener,false); 164 elm.addEventListener("keyup",DynKeyEvent._keyEventListener,false); 165 elm.addEventListener("blur",DynKeyEvent._keyEventListener,false); 166 elm.addEventListener("focus",DynKeyEvent._keyEventListener,false); 167 } 168 else { 169 if(elm.captureEvents) 170 elm.captureEvents(Event.KEYPRESS|Event.KEYDOWN|Event.KEYUP); 171 elm.onblur=elm.onfocus=elm.onkeydown=elm.onkeypress=elm.onkeyup=DynKeyEvent._keyEventListener; 172 } 173 this._hasKeyEvents=true; 174 return false; 175 }; 176 DynElement.prototype.releaseKeyEvents=function() { 177 var elm=(this.getClassName()=='DynLayer')?this.elm:this.doc; 178 if(!elm||!this._hasKeyEvents) return true; 179 if(elm.removeEventListener) { 180 elm.removeEventListener("keydown",DynKeyEvent._keyEventListener,false); 181 elm.removeEventListener("keypress",DynKeyEvent._keyEventListener,false); 182 elm.removeEventListener("keyup",DynKeyEvent._keyEventListener,false); 183 } 184 else { 185 if(elm.releaseEvents) 186 elm.releaseEvents(Event.KEYPRESS|Event.KEYDOWN|Event.KEYUP); 187 elm.onkeydown=elm.onkeypress=elm.onkeyup=null; 188 } 189 this._hasKeyEvents=false; 190 return false; 191 }; 192 193 DynDocument.prototype.captureHotKey = function(key,fn){ 194 var klst=((key+'').toLowerCase()).split('+'); 195 klst.sort(); 196 key=klst.join('+'); 197 if(!this._hotKeys){ 198 this._hotKeys={}; 199 this._keyDn={}; 200 this._keyLst=''; 201 this.captureKeyEvents(); 202 this.addEventListener({ 203 onkeydown:function(e){ 204 var k = e.which; 205 var o = e.getSource(); 206 // to-do: add opera v7 key code (57xxx), e.g 57388 207 if (k==13) k="enter"; 208 else if(k==27) k="esc"; 209 else if(k==45) k="insert"; 210 else if(k==46) k="delete"; 211 else if(k==36) k="home"; 212 else if(k==35) k="end"; 213 else if(k==33) k="pgup"; 214 else if(k==34) k="pgdn"; 215 else if(k==38) k="up"; 216 else if(k==40) k="down"; 217 else if(k==37) k="left"; 218 else if(k==39) k="right"; 219 else if(e.altKey && !o._keyDn['alt']) k="alt"; 220 else if(e.ctrlKey && !o._keyDn['ctrl']) k="ctrl"; 221 else if(e.shiftKey && !o._keyDn['shift']) k="shift"; 222 else k=(String.fromCharCode(k)).toLowerCase(); 223 if(!o._keyDn[k]) { 224 // store new key in keyDn array 225 o._keyLst+=(((o._keyLst)? '+':'')+k); // build key list 226 var ar=o._keyLst.split('+'); 227 ar.sort(); 228 o._keyLst=ar.join('+'); 229 o._keyDn[k]=true; 230 } 231 k=o._hotKeys[o._keyLst]; 232 if(k){ 233 o._keyLst='';o._keyDn={}; 234 if(typeof(k)=='string') return eval(k); else return k(); 235 } 236 }, 237 onkeyup:function(e){ 238 var o=e.getSource(); 239 o._keyLst='';o._keyDn={}; 240 } 241 }); 242 } 243 this._hotKeys[key]=fn; 244 }; 245 DynDocument.prototype.releaseHotKey = function(key){ 246 if(this._hotKeys) delete this._hotKeys[key]; 247 }; 248
titre
Description
Corps
titre
Description
Corps
titre
Description
Corps
titre
Corps
Généré le : Sun Feb 25 17:20:01 2007 | par Balluche grâce à PHPXref 0.7 |