|
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
|