Changeset 5357

Show
Ignore:
Timestamp:
08/22/06 13:00:00 (2 years ago)
Author:
alex
Message:

merging unified key handling patch from Doug Hays, IBM, CCLA on file

Location:
trunk/src
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • trunk/src/event.js

    r5069 r5357  
    173173 
    174174        this.connect = function(){ 
     175                // summary: 
     176                //      dojo.event.connect is the glue that holds most Dojo-based 
     177                //      applications together. 
    175178                if(arguments.length == 1){ 
    176179                        var ao = arguments[0]; 
    177180                }else{ 
    178181                        var ao = interpolateArgs(arguments, true); 
     182                } 
     183                if(dojo.lang.isString(ao.srcFunc) && (ao.srcFunc.toLowerCase() == "onkey") ){ 
     184                        if(dojo.render.html.ie){ 
     185                                ao.srcFunc = "onkeydown"; 
     186                                this.connect(ao); 
     187                        } 
     188                        ao.srcFunc = "onkeypress"; 
    179189                } 
    180190 
     
    232242        this.connectBefore = function(){ 
    233243                var args = ["before"]; 
    234                 for(var i = 0; i < arguments.length; i++) { args.push(arguments[i]); } 
     244                for(var i = 0; i < arguments.length; i++){ args.push(arguments[i]); } 
    235245                return this.connect.apply(this, args); 
    236246        } 
     
    238248        this.connectAround = function(){ 
    239249                var args = ["around"]; 
    240                 for(var i = 0; i < arguments.length; i++) { args.push(arguments[i]); } 
     250                for(var i = 0; i < arguments.length; i++){ args.push(arguments[i]); } 
    241251                return this.connect.apply(this, args); 
    242252        } 
     
    279289 
    280290        this.disconnect = function(){ 
    281                 var ao = interpolateArgs(arguments, true); 
     291                if(arguments.length == 1){ 
     292                        var ao = arguments[0]; 
     293                }else{ 
     294                        var ao = interpolateArgs(arguments, true); 
     295                } 
    282296                if(!ao.adviceFunc){ return; } // nothing to disconnect 
     297                if(dojo.lang.isString(ao.srcFunc) && (ao.srcFunc.toLowerCase() == "onkey") ){ 
     298                        if(dojo.render.html.ie){ 
     299                                ao.srcFunc = "onkeydown"; 
     300                                this.disconnect(ao); 
     301                        } 
     302                        ao.srcFunc = "onkeypress"; 
     303                } 
    283304                var mjp = dojo.event.MethodJoinPoint.getForMethod(ao.srcObj, ao.srcFunc); 
    284305                return mjp.removeAdvice(ao.adviceObj, ao.adviceFunc, ao.adviceType, ao.once); 
     
    292313// exactly one of these is created whenever a method with a joint point is run, 
    293314// if there is at least one 'around' advice. 
    294 dojo.event.MethodInvocation = function(join_point, obj, args) { 
     315dojo.event.MethodInvocation = function(join_point, obj, args){ 
    295316        this.jp_ = join_point; 
    296317        this.object = obj; 
     
    303324} 
    304325 
    305 dojo.event.MethodInvocation.prototype.proceed = function() { 
     326dojo.event.MethodInvocation.prototype.proceed = function(){ 
    306327        this.around_index++; 
    307328        if(this.around_index >= this.jp_.around.length){ 
     
    326347} 
    327348 
    328 dojo.event.MethodJoinPoint.getForMethod = function(obj, methname) { 
     349dojo.event.MethodJoinPoint.getForMethod = function(obj, methname){ 
    329350        // if(!(methname in obj)){ 
    330351        if(!obj){ obj = dj_global; } 
     
    406427        disconnect: dojo.lang.forward("unintercept"), 
    407428 
    408         run: function() { 
     429        run: function(){ 
    409430                var obj = this.object||dj_global; 
    410431                var args = arguments; 
  • trunk/src/event/browser.js

    r5022 r5357  
    9595                if(!capture){ var capture = false; } 
    9696                evtName = evtName.toLowerCase(); 
     97                if( (evtName == "onkey") || (evtName == "key") ){ 
     98                        if(dojo.render.html.ie){ 
     99                                this.removeListener(node, "onkeydown", fp, capture); 
     100                        } 
     101                        evtName = "onkeypress"; 
     102                } 
    97103                if(evtName.substr(0,2)=="on"){ evtName = evtName.substr(2); } 
    98104                // FIXME: this is mostly a punt, we aren't actually doing anything on IE 
     
    106112                if(!capture){ var capture = false; } 
    107113                evtName = evtName.toLowerCase(); 
     114                if( (evtName == "onkey") || (evtName == "key") ){ 
     115                        if(dojo.render.html.ie){ 
     116                                this.addListener(node, "onkeydown", fp, capture, dontFix); 
     117                        } 
     118                        evtName = "onkeypress"; 
     119                } 
    108120                if(evtName.substr(0,2)!="on"){ evtName = "on"+evtName; } 
    109121 
     
    172184                KEY_BACKSPACE: 8, 
    173185                KEY_TAB: 9, 
     186                KEY_CLEAR: 12, 
    174187                KEY_ENTER: 13, 
    175188                KEY_SHIFT: 16, 
     
    190203                KEY_INSERT: 45, 
    191204                KEY_DELETE: 46, 
     205                KEY_HELP: 47, 
    192206                KEY_LEFT_WINDOW: 91, 
    193207                KEY_RIGHT_WINDOW: 92, 
    194208                KEY_SELECT: 93, 
     209                KEY_NUMPAD_0: 96, 
     210                KEY_NUMPAD_1: 97, 
     211                KEY_NUMPAD_2: 98, 
     212                KEY_NUMPAD_3: 99, 
     213                KEY_NUMPAD_4: 100, 
     214                KEY_NUMPAD_5: 101, 
     215                KEY_NUMPAD_6: 102, 
     216                KEY_NUMPAD_7: 103, 
     217                KEY_NUMPAD_8: 104, 
     218                KEY_NUMPAD_9: 105, 
     219                KEY_NUMPAD_MULTIPLY: 106, 
     220                KEY_NUMPAD_PLUS: 107, 
     221                KEY_NUMPAD_ENTER: 108, 
     222                KEY_NUMPAD_MINUS: 109, 
     223                KEY_NUMPAD_PERIOD: 110, 
     224                KEY_NUMPAD_DIVIDE: 111, 
    195225                KEY_F1: 112, 
    196226                KEY_F2: 113, 
     
    205235                KEY_F11: 122, 
    206236                KEY_F12: 123, 
     237                KEY_F13: 124, 
     238                KEY_F14: 125, 
     239                KEY_F15: 126, 
    207240                KEY_NUM_LOCK: 144, 
    208241                KEY_SCROLL_LOCK: 145 
     
    225258                        evt.keys = this.revKeys; 
    226259                        // FIXME: how can we eliminate this iteration? 
    227                         for(var key in this.keys) { 
     260                        for(var key in this.keys){ 
    228261                                evt[key] = this.keys[key]; 
    229262                        } 
    230                         if((dojo.render.html.ie)&&(evt["type"] == "keypress")){ 
    231                                 evt.charCode = evt.keyCode; 
    232                         } 
    233                 } 
    234          
     263                        if(evt["type"] == "keydown" && dojo.render.html.ie){ 
     264                                switch(evt.keyCode){ 
     265                                        case evt.KEY_SHIFT: 
     266                                        case evt.KEY_CTRL: 
     267                                        case evt.KEY_ALT: 
     268                                        case evt.KEY_CAPS_LOCK: 
     269                                        case evt.KEY_LEFT_WINDOW: 
     270                                        case evt.KEY_RIGHT_WINDOW: 
     271                                        case evt.KEY_SELECT: 
     272                                        case evt.KEY_NUM_LOCK: 
     273                                        case evt.KEY_SCROLL_LOCK: 
     274                                        // I'll get these in keypress after the OS munges them based on numlock 
     275                                        case evt.KEY_NUMPAD_0: 
     276                                        case evt.KEY_NUMPAD_1: 
     277                                        case evt.KEY_NUMPAD_2: 
     278                                        case evt.KEY_NUMPAD_3: 
     279                                        case evt.KEY_NUMPAD_4: 
     280                                        case evt.KEY_NUMPAD_5: 
     281                                        case evt.KEY_NUMPAD_6: 
     282                                        case evt.KEY_NUMPAD_7: 
     283                                        case evt.KEY_NUMPAD_8: 
     284                                        case evt.KEY_NUMPAD_9: 
     285                                        case evt.KEY_NUMPAD_PERIOD: 
     286                                                break; // just ignore the keys that can morph 
     287                                        case evt.KEY_NUMPAD_MULTIPLY: 
     288                                        case evt.KEY_NUMPAD_PLUS: 
     289                                        case evt.KEY_NUMPAD_ENTER: 
     290                                        case evt.KEY_NUMPAD_MINUS: 
     291                                        case evt.KEY_NUMPAD_DIVIDE: 
     292                                                break; // I could handle these but just pick them up in keypress 
     293                                        case evt.KEY_PAUSE: 
     294                                        case evt.KEY_TAB: 
     295                                        case evt.KEY_BACKSPACE: 
     296                                        case evt.KEY_ENTER: 
     297                                        case evt.KEY_ESCAPE: 
     298                                        case evt.KEY_PAGE_UP: 
     299                                        case evt.KEY_PAGE_DOWN: 
     300                                        case evt.KEY_END: 
     301                                        case evt.KEY_HOME: 
     302                                        case evt.KEY_LEFT_ARROW: 
     303                                        case evt.KEY_UP_ARROW: 
     304                                        case evt.KEY_RIGHT_ARROW: 
     305                                        case evt.KEY_DOWN_ARROW: 
     306                                        case evt.KEY_INSERT: 
     307                                        case evt.KEY_DELETE: 
     308                                        case evt.KEY_F1: 
     309                                        case evt.KEY_F2: 
     310                                        case evt.KEY_F3: 
     311                                        case evt.KEY_F4: 
     312                                        case evt.KEY_F5: 
     313                                        case evt.KEY_F6: 
     314                                        case evt.KEY_F7: 
     315                                        case evt.KEY_F8: 
     316                                        case evt.KEY_F9: 
     317                                        case evt.KEY_F10: 
     318                                        case evt.KEY_F11: 
     319                                        case evt.KEY_F12: 
     320                                        case evt.KEY_F12: 
     321                                        case evt.KEY_F13: 
     322                                        case evt.KEY_F14: 
     323                                        case evt.KEY_F15: 
     324                                        case evt.KEY_CLEAR: 
     325                                        case evt.KEY_HELP: 
     326                                                evt.key = evt.keyCode; 
     327                                                break; 
     328                                        default: 
     329                                                if(evt.ctrlKey || evt.altKey){ 
     330                                                        var unifiedCharCode = evt.keyCode; 
     331                                                        // if lower case but keycode is uppercase, convert it 
     332                                                        if(unifiedCharCode >= 65 && unifiedCharCode <= 90 && evt.shiftKey == false){ 
     333                                                                unifiedCharCode += 32; 
     334                                                        } 
     335                                                        if(unifiedCharCode >= 1 && unifiedCharCode <= 26 && evt.ctrlKey){ 
     336                                                                unifiedCharCode += 96; // 001-032 = ctrl+[a-z] 
     337                                                        } 
     338                                                        evt.key = String.fromCharCode(unifiedCharCode); 
     339                                                } 
     340                                } 
     341                        } else if(evt["type"] == "keypress"){ 
     342                                if(dojo.render.html.opera){ 
     343                                        if(evt.which == 0){ 
     344                                                evt.key = evt.keyCode; 
     345                                        }else if(evt.which > 0){ 
     346                                                switch(evt.which){ 
     347                                                        case evt.KEY_SHIFT: 
     348                                                        case evt.KEY_CTRL: 
     349                                                        case evt.KEY_ALT: 
     350                                                        case evt.KEY_CAPS_LOCK: 
     351                                                        case evt.KEY_NUM_LOCK: 
     352                                                        case evt.KEY_SCROLL_LOCK: 
     353                                                                break; 
     354                                                        case evt.KEY_PAUSE: 
     355                                                        case evt.KEY_TAB: 
     356                                                        case evt.KEY_BACKSPACE: 
     357                                                        case evt.KEY_ENTER: 
     358                                                        case evt.KEY_ESCAPE: 
     359                                                                evt.key = evt.which; 
     360                                                                break; 
     361                                                        default: 
     362                                                                var unifiedCharCode = evt.which; 
     363                                                                if((evt.ctrlKey || evt.altKey || evt.metaKey) && (evt.which >= 65 && evt.which <= 90 && evt.shiftKey == false)){ 
     364                                                                        unifiedCharCode += 32; 
     365                                                                } 
     366                                                                evt.key = String.fromCharCode(unifiedCharCode); 
     367                                                } 
     368                                        } 
     369                                }else if(dojo.render.html.ie){ // catch some IE keys that are hard to get in keyDown 
     370                                        // key combinations were handled in onKeyDown 
     371                                        if(!evt.ctrlKey && !evt.altKey && evt.keyCode >= evt.KEY_SPACE){ 
     372                                                evt.key = String.fromCharCode(evt.keyCode); 
     373                                        } 
     374                                }else if(dojo.render.html.safari){ 
     375                                        switch(evt.keyCode){ 
     376                                                case 63232: evt.key = evt.KEY_UP_ARROW; break; 
     377                                                case 63233: evt.key = evt.KEY_DOWN_ARROW; break; 
     378                                                case 63234: evt.key = evt.KEY_LEFT_ARROW; break; 
     379                                                case 63235: evt.key = evt.KEY_RIGHT_ARROW; break; 
     380                                                default:  
     381                                                        evt.key = evt.charCode > 0 ? String.fromCharCode(evt.charCode) : evt.keyCode; 
     382                                        } 
     383                                }else{ 
     384                                        evt.key = evt.charCode > 0 ? String.fromCharCode(evt.charCode) : evt.keyCode; 
     385                                } 
     386                        } 
     387                } 
    235388                if(dojo.render.html.ie){ 
    236389                        if(!evt.target){ evt.target = evt.srcElement; } 
     
    257410        } 
    258411 
    259         this.stopEvent = function(ev) { 
     412        this.stopEvent = function(ev){ 
    260413                if(window.event){ 
    261414                        ev.returnValue = false;