[ Index ]
 

Code source de eGroupWare 1.2.106-2

Accédez au Source d'autres logiciels libresSoutenez Angelica Josefina !

title

Body

[fermer]

/phpgwapi/js/dynapi/api/ext/ -> dynkeyevent.js (source)

   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  


Généré le : Sun Feb 25 17:20:01 2007 par Balluche grâce à PHPXref 0.7