From: Raymond I. <xw...@us...> - 2003-03-30 17:13:58
|
Update of /cvsroot/dynapi/dynapi3x/src/api/ext In directory sc8-pr-cvs1:/tmp/cvs-serv11568/src/api/ext Modified Files: dynkeyevent.js Log Message: uploaded by raymond - includes kevin's patches Index: dynkeyevent.js =================================================================== RCS file: /cvsroot/dynapi/dynapi3x/src/api/ext/dynkeyevent.js,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -r1.1.1.1 -r1.2 *** dynkeyevent.js 10 Feb 2003 22:35:54 -0000 1.1.1.1 --- dynkeyevent.js 30 Mar 2003 17:13:21 -0000 1.2 *************** *** 1 **** ! /* DynAPI Distribution Key Event Extensions by Henrik Våglin (hv...@ya...) The DynAPI Distribution is distributed under the terms of the GNU LGPL license. Requirements: dynapi.api [dynlayer, dyndocument, browser] dynapi.event [listeners] */ function DynKeyEvent() { this.DynEvent = DynEvent; this.DynEvent(); }; var p = dynapi.setPrototype('DynKeyEvent','DynEvent'); p.getKey=function() { return this.charKey; }; p.bubbleEvent=function() { if (!this.bubble||this.src.isDynDocument||this.src.parent==null) return; this.src=this.src.parent; this.src.invokeEvent(this.type,this); this.bubbleEvent(); return; }; DynKeyEvent.EventMethod = function(e) { var dynobject=this._dynobj; if (!dynobject) return true; dynobject = dynobject._dyndoc; if (!dynobject) return true; if(dynapi.ua.def) { if (dynapi.ua.ie) var e=dynobject.frame.event; else if (e.eventPhase!=3) return false; e.cancelBubble=true; } if(dynapi.ua.def) var realsrc = MouseEvent._getContainerLayerOf(dynapi.ua.ie?e.srcElement:e.target)||dynobject; else if(dynapi.ua.ns4) var realsrc=e.target._dynobj; if (!realsrc) return false; var evt=DynKeyEvent._e evt.type=e.type evt.src=realsrc; evt.browserReturn=true; evt.bubble=true; evt.which=(dynapi.ua.ns4)?e.which:e.keyCode; var curKey = String.fromCharCode(evt.which).toLowerCase(); if (((curKey>='a')&&(curKey<='z'))||((curKey>='0')&&(curKey<='9'))) evt.charKey=curKey; evt.altKey=(dynapi.ua.ns4)? false:(e.altKey||e.altLeft||e.keyCode==18||e.keyCode==57388); evt.ctrlKey=(dynapi.ua.ns4)?(e.modifiers & Event.CONTROL_MASK):(e.ctrlKey||e.ctrlLeft||e.keyCode==17||e.keyCode==57391); evt.shiftKey=(dynapi.ua.ns4)?(e.modifiers & Event.SHIFT_MASK):(e.shiftKey||e.shiftLeft||e.keyCode==16||e.keyCode==57390); evt.orig=e; realsrc.invokeEvent(evt.type,evt); evt.bubbleEvent(); return evt.browserReturn; }; DynKeyEvent._e=new DynKeyEvent(); DynDocument.prototype.captureKeyEvents=function() { if(dynapi.ua.def && !dynapi.ua.ie) { this.doc.addEventListener("keydown",DynKeyEvent.EventMethod,false); this.doc.addEventListener("keyup",DynKeyEvent.EventMethod,false); this.doc.addEventListener("keypress",DynKeyEvent.EventMethod,false); } else { if (dynapi.ua.ns4) this.doc.captureEvents(Event.KEYPRESS | Event.KEYDOWN | Event.KEYUP); this.doc.onkeypress=this.doc.onkeydown=this.doc.onkeyup=DynKeyEvent.EventMethod; } }; DynDocument.prototype.releaseKeyEvents=function() { if(dynapi.ua.def&&!dynapi.ua.ie) { this.doc.removeEventListener("keydown",DynKeyEvent.EventMethod,false); this.doc.removeEventListener("keyup",DynKeyEvent.EventMethod,false); this.doc.removeEventListener("keypress",DynKeyEvent.EventMethod,false); } else { if (dynapi.ua.ns4) this.doc.releaseEvents(Event.KEYPRESS | Event.KEYDOWN | Event.KEYUP); this.doc.onkeypress=this.doc.onkeydown=this.doc.onkeyup=null; } }; DynDocument.prototype.captureHotKey = function(key,fn){ var klst=((key+'').toLowerCase()).split('+'); klst.sort(); key=klst.join('+'); if(!this._hotKeys){ this._hotKeys={}; this._keyDn={}; this._keyLst=''; this.captureKeyEvents(); this.addEventListener({ onkeydown:function(e){ var k = e.which; var o = e.getSource(); // to-do: add opera v7 key code (57xxx), e.g 57388 if (k==13) k="enter"; else if(k==27) k="esc"; else if(k==45) k="inert"; else if(k==46) k="delete"; else if(k==36) k="home"; else if(k==35) k="end"; else if(k==33) k="pgup"; else if(k==34) k="pgdn"; else if(k==38) k="up"; else if(k==40) k="down"; else if(k==37) k="left"; else if(k==39) k="right"; else if(e.altKey && !o._keyDn['alt']) k="alt"; else if(e.ctrlKey && !o._keyDn['ctrl']) k="ctrl"; else if(e.shiftKey && !o._keyDn['shift']) k="shift"; else k=(String.fromCharCode(k)).toLowerCase(); if(!o._keyDn[k]) { // store new key in keyDn array o._keyLst+=(((o._keyLst)? '+':'')+k); // build key list var ar=o._keyLst.split('+'); ar.sort(); o._keyLst=ar.join('+'); o._keyDn[k]=true; } k=o._hotKeys[o._keyLst]; if(k){ o._keyLst='';o._keyDn={}; if(typeof(k)=='string') return eval(k); else return k(); } }, onkeyup:function(e){ var o=e.getSource(); o._keyLst='';o._keyDn={}; } }); } this._hotKeys[key]=fn; }; DynDocument.prototype.releaseHotKey = function(key){ if(this._hotKeys) delete(this._hotKeys[key]); }; DynLayer.prototype.captureKeyEvents=function() { if(!this.elm) return; if(dynapi.ua.def&&!dynapi.ua.ie) { this.elm.addEventListener("keydown",DynKeyEvent.EventMethod,false); this.elm.addEventListener("keyup",DynKeyEvent.EventMethod,false); this.elm.addEventListener("keypress",DynKeyEvent.EventMethod,false); } else { if (dynapi.ua.ns4) this.elm.captureEvents(Event.KEYPRESS | Event.KEYDOWN | Event.KEYUP); this.elm.onkeypress=this.elm.onkeydown=this.elm.onkeyup=DynKeyEvent.EventMethod; } }; DynLayer.prototype.releaseKeyEvents=function() { if(!this.elm) return; if(dynapi.ua.def&&!dynapi.ua.ie) { this.elm.removeEventListener("keydown",DynKeyEvent.EventMethod,false); this.elm.removeEventListener("keyup",DynKeyEvent.EventMethod,false); this.elm.removeEventListener("keypress",DynKeyEvent.EventMethod,false); } else { if (dynapi.ua.ns4) this.elm.releaseEvents(Event.KEYPRESS | Event.KEYDOWN | Event.KEYUP); this.elm.onkeypress=this.elm.onkeydown=this.elm.onkeyup=null; } }; /* Overwrite methods to support key events. */ DynObject.prototype.assignKeyEvents = function() { if (this._hasMouseEvents) this.captureKeyEvents(); var l=this.children.length;; for (var i=0; i<l; i++) this.children[i].assignKeyEvents(); }; DynObject.prototype._OldK_addEventListener = DynObject.prototype.addEventListener; DynObject.prototype.addEventListener = function(l) { var r = this._OldK_addEventListener(l); if(this._hasMouseEvents && this.created) this.captureKeyEvents(); return r; }; DynObject.prototype._OldK_removeEventListener = DynObject.prototype.removeEventListener; DynObject.prototype.removeEventListener = function(l) { var r = this._OldK_removeEventListener(l); if(!this._hasMouseEvents) this.releaseKeyEvents(); return r; }; DynObject.prototype._OldK_removeAllEventListeners = DynObject.prototype.removeAllEventListeners; DynObject.prototype.removeAllEventListeners = function() { var r = this._OldK_removeAllEventListeners(); this.releaseKeyEvents(); return r; }; \ No newline at end of file --- 1 ---- ! /* DynAPI Distribution Key Event Extensions by Henrik Våglin (hv...@ya...) The DynAPI Distribution is distributed under the terms of the GNU LGPL license. requires: Dynlayer */ function DynKeyEvent(type,src) { this.DynEvent = DynEvent; this.DynEvent(type,src); this.charKey=null; this.bubble=true; }; var p = dynapi.setPrototype('DynKeyEvent','DynEvent'); p.getKey=function() { return this.charKey; }; //p.bubbleEvent=function() { // if (!this.bubble||this.src.isDynDocument||this.src.parent==null) return; // this.src=this.src.parent; // this.src.invokeEvent(this.type,this); // this.bubbleEvent(); // return; DynKeyEvent._getContainerLayerOf = function(element) { if (!element) return null; while (!element._dynobj && element.parentNode && element.parentNode!=element) element = element.parentNode; return element._dynobj; }; //DynKeyEvent.EventMethod = function(e) { DynKeyEvent._eventListener = function(e) { var dynobject=this._dynobj; if (!dynobject) return true; // dynobject = dynobject._dyndoc; // if (!dynobject) return true; var dyndoc = dynobject.doc._dynobj; if (!dyndoc) return true; if(dynapi.ua.def) { // if (dynapi.ua.ie) var e=dynobject.frame.event; if (dynapi.ua.ie) var e=dyndoc.frame.event; else if (e.eventPhase!=3) return false; e.cancelBubble=true; } // if(dynapi.ua.def) var realsrc = MouseEvent._getContainerLayerOf(dynapi.ua.ie?e.srcElement:e.target)||dynobject; if(dynapi.ua.def) var realsrc = DynKeyEvent._getContainerLayerOf(dynapi.ua.ie?e.srcElement:e.target)||dynobject; else if(dynapi.ua.ns4) var realsrc=e.target._dynobj; if (!realsrc) return false; // var evt=DynKeyEvent._e // evt.type=e.type // evt.src=realsrc; // evt.browserReturn=true; // evt.bubble=true; var evt=new DynKeyEvent(e.type,realsrc); evt.which=(dynapi.ua.ns4)?e.which:e.keyCode; var curKey = String.fromCharCode(evt.which).toLowerCase(); if (((curKey>='a')&&(curKey<='z'))||((curKey>='0')&&(curKey<='9'))) evt.charKey=curKey; evt.altKey=(dynapi.ua.ns4)? false:(e.altKey||e.altLeft||e.keyCode==18||e.keyCode==57388); evt.ctrlKey=(dynapi.ua.ns4)?(e.modifiers & Event.CONTROL_MASK):(e.ctrlKey||e.ctrlLeft||e.keyCode==17||e.keyCode==57391); evt.shiftKey=(dynapi.ua.ns4)?(e.modifiers & Event.SHIFT_MASK):(e.shiftKey||e.shiftLeft||e.keyCode==16||e.keyCode==57390); // evt.orig=e; realsrc.invokeEvent(evt.type,evt); // evt.bubbleEvent(); // return evt.browserReturn; return evt.defaultValue; }; //DynKeyEvent._e=new DynKeyEvent(); //DynDocument.prototype.captureKeyEvents=function() { DynElement.prototype.captureKeyEvents=function() { var elm=(this.getClassName()=='DynLayer')?this.elm:this.doc; if(!elm) return; this._hasKeyEvents=true; if(dynapi.ua.def && !dynapi.ua.ie) { // this.doc.addEventListener("keydown",DynKeyEvent.EventMethod,false); // this.doc.addEventListener("keyup",DynKeyEvent.EventMethod,false); // this.doc.addEventListener("keypress",DynKeyEvent.EventMethod,false); elm.addEventListener("keydown",DynKeyEvent._eventListener,false); elm.addEventListener("keyup",DynKeyEvent._eventListener,false); elm.addEventListener("keypress",DynKeyEvent._eventListener,false); } else { // if (dynapi.ua.ns4) this.doc.captureEvents(Event.KEYPRESS | Event.KEYDOWN | Event.KEYUP); // this.doc.onkeypress=this.doc.onkeydown=this.doc.onkeyup=DynKeyEvent.EventMethod; if (dynapi.ua.ns4) elm.captureEvents(Event.KEYPRESS | Event.KEYDOWN | Event.KEYUP); elm.onkeypress=elm.onkeydown=elm.onkeyup=DynKeyEvent._eventListener; } }; //DynDocument.prototype.releaseKeyEvents=function() { DynElement.prototype.releaseKeyEvents=function() { var elm=(this.getClassName()=='DynLayer')?this.elm:this.doc; if(!elm) return; this._hasKeyEvents=false; if(dynapi.ua.def&&!dynapi.ua.ie) { // this.doc.removeEventListener("keydown",DynKeyEvent.EventMethod,false); // this.doc.removeEventListener("keyup",DynKeyEvent.EventMethod,false); // this.doc.removeEventListener("keypress",DynKeyEvent.EventMethod,false); elm.removeEventListener("keydown",DynKeyEvent._eventListener,false); elm.removeEventListener("keyup",DynKeyEvent._eventListener,false); elm.removeEventListener("keypress",DynKeyEvent._eventListener,false); } else { // if (dynapi.ua.ns4) this.doc.releaseEvents(Event.KEYPRESS | Event.KEYDOWN | Event.KEYUP); // this.doc.onkeypress=this.doc.onkeydown=this.doc.onkeyup=null; if (dynapi.ua.ns4) elm.releaseEvents(Event.KEYPRESS | Event.KEYDOWN | Event.KEYUP); elm.onkeypress=elm.onkeydown=elm.onkeyup=null; } }; DynDocument.prototype.captureHotKey = function(key,fn){ var klst=((key+'').toLowerCase()).split('+'); klst.sort(); key=klst.join('+'); if(!this._hotKeys){ this._hotKeys={}; this._keyDn={}; this._keyLst=''; this.captureKeyEvents(); this.addEventListener({ onkeydown:function(e){ var k = e.which; var o = e.getSource(); // to-do: add opera v7 key code (57xxx), e.g 57388 if (k==13) k="enter"; else if(k==27) k="esc"; else if(k==45) k="insert"; else if(k==46) k="delete"; else if(k==36) k="home"; else if(k==35) k="end"; else if(k==33) k="pgup"; else if(k==34) k="pgdn"; else if(k==38) k="up"; else if(k==40) k="down"; else if(k==37) k="left"; else if(k==39) k="right"; else if(e.altKey && !o._keyDn['alt']) k="alt"; else if(e.ctrlKey && !o._keyDn['ctrl']) k="ctrl"; else if(e.shiftKey && !o._keyDn['shift']) k="shift"; else k=(String.fromCharCode(k)).toLowerCase(); if(!o._keyDn[k]) { // store new key in keyDn array o._keyLst+=(((o._keyLst)? '+':'')+k); // build key list var ar=o._keyLst.split('+'); ar.sort(); o._keyLst=ar.join('+'); o._keyDn[k]=true; } k=o._hotKeys[o._keyLst]; if(k){ o._keyLst='';o._keyDn={}; if(typeof(k)=='string') return eval(k); else return k(); } }, onkeyup:function(e){ var o=e.getSource(); o._keyLst='';o._keyDn={}; } }); } this._hotKeys[key]=fn; }; DynDocument.prototype.releaseHotKey = function(key){ if(this._hotKeys) delete this._hotKeys[key]; }; //DynLayer.prototype.captureKeyEvents=function() { // if(!this.elm) return; // if(dynapi.ua.def&&!dynapi.ua.ie) { // this.elm.addEventListener("keydown",DynKeyEvent.EventMethod,false); // this.elm.addEventListener("keyup",DynKeyEvent.EventMethod,false); // this.elm.addEventListener("keypress",DynKeyEvent.EventMethod,false); // } // else { // if (dynapi.ua.ns4) this.elm.captureEvents(Event.KEYPRESS | Event.KEYDOWN | Event.KEYUP); // this.elm.onkeypress=this.elm.onkeydown=this.elm.onkeyup=DynKeyEvent.EventMethod; // } //}; //DynLayer.prototype.releaseKeyEvents=function() { // if(!this.elm) return; // if(dynapi.ua.def&&!dynapi.ua.ie) { // this.elm.removeEventListener("keydown",DynKeyEvent.EventMethod,false); // this.elm.removeEventListener("keyup",DynKeyEvent.EventMethod,false); // this.elm.removeEventListener("keypress",DynKeyEvent.EventMethod,false); // } // else { // if (dynapi.ua.ns4) this.elm.releaseEvents(Event.KEYPRESS | Event.KEYDOWN | Event.KEYUP); // this.elm.onkeypress=this.elm.onkeydown=this.elm.onkeyup=null; // } //}; /* Overwrite methods to support key events. */ //DynObject.prototype.assignKeyEvents = function() { // if (this._hasMouseEvents) this.captureKeyEvents(); // var l=this.children.length;; // for (var i=0; i<l; i++) this.children[i].assignKeyEvents(); //}; //DynObject.prototype._OldK_addEventListener = DynObject.prototype.addEventListener; //DynObject.prototype.addEventListener = function(l) { // var r = this._OldK_addEventListener(l); // if(this._hasMouseEvents && this.created) this.captureKeyEvents(); // return r; //}; //DynObject.prototype._OldK_removeEventListener = DynObject.prototype.removeEventListener; //DynObject.prototype.removeEventListener = function(l) { // var r = this._OldK_removeEventListener(l); // if(!this._hasMouseEvents) this.releaseKeyEvents(); // return r; //}; //DynObject.prototype._OldK_removeAllEventListeners = DynObject.prototype.removeAllEventListeners; //DynObject.prototype.removeAllEventListeners = function() { // var r = this._OldK_removeAllEventListeners(); // this.releaseKeyEvents(); // return r; //}; \ No newline at end of file |