ccos-cli
Version:
This is a command line interface toolkit. It is used for generating and managing example code for CoocaaOS running on Skyworth/Coocaa TV webos API.
585 lines (538 loc) • 15.6 kB
JavaScript
function debug(str) {
// var debug = $("#debug");
// if(debug.length == 0){
// $("<div id='debug'></div>").appendTo($("body"));
// }
// $("#debug").html($("#debug").html() + str);
}
function coocaakeymap(buts, curlink, hover, getVal, setVal, keyDownEvent){
this.linkbuttons = $(buts);
for(var l = this.linkbuttons.length -1 ; l>=0; l--){
var i = this.linkbuttons[l];
if(i.getAttribute("data-no-foucs") == "true"){
this.linkbuttons.splice(i,1);
}
}
if(this.linkbuttons.length == 0){
this.linkbuttons = $("body");
}
var c = $(curlink);
if(c.length != 0){
for(var x = 0; x < this.linkbuttons.length; x ++){
if(this.linkbuttons.get(x) == c.get(0)){
this.curLink = c;
break;
}
}
}
if(this.curLink == null){
for(var i = 0; i <this.linkbuttons.length; i++ ){
if($(this.linkbuttons[i]).is(":visible")){
this.curLink = $(this.linkbuttons[i]);
break;
}
}
}
this.keyDownEvent = keyDownEvent || function(){};
this.hoverClass = hover ? hover : "hover";
this.input = null;
this.setHeightLight(this);
this.setVal = setVal || function(val){
$(this).val(val);
};
this.getVal = getVal ||function(){
return $(this).val();
};
var _this = this;
//设置只读属性
//$(buts).attr('readonly',true);
//设置鼠标事件
//$(buts).unbind("click").bind("click", function(){_this.handleClick(this); });
$(buts).unbind("keyinput").bind('keyinput', this.handleInputVal);
$(window).unbind("keydown").bind('keydown', function(ev){_this.keyHandler(_this, ev);});
this.cmd = [];
this.iscmd = false;
this.debugCmd = {
"cmd3739373938384040": function(){
var info = "访问地址:" + window.location.href;
coocaa.alert(info,function(){
_this.handlerKeydown();
return true;
});
},
"cmd3737393938384040":function(){
var info = "版本号:" + coocaa.version;
coocaa.alert(info,function(){
_this.handlerKeydown();
return true;
});
}
};
}
//移除焦点元素
coocaakeymap.prototype.remove = function(wh){
this.linkbuttons = this.linkbuttons.not(wh);
};
//添加焦点元素
coocaakeymap.prototype.add = function(wh){
this.linkbuttons = this.linkbuttons.add(wh);
};
coocaakeymap.prototype.handlerKeydown = function(){
var _this = this;
$(window).unbind("keydown").bind("keydown", function(ev){_this.keyHandler(_this, ev);});
}
coocaakeymap.prototype.triggerCmd = function(code){
if(this.debugCmd == null || this.iscmd == false || this.debugCmd == null){
return;
}
this.cmd.push(code);
if(this.cmd.length > 10){
this.cmd = [];
return;
}
var cmd = "cmd" + this.cmd.join("");
if(typeof(this.debugCmd[cmd]) =="function"){
this.cmd = [];
this.iscmd = false;
this.debugCmd[cmd]();
}
};
coocaakeymap.prototype.setFocus = function(obj){
//传入null则聚焦到第一个可见元素
if(obj.length == 0){
return;
}
if(!obj.is(":visible")){
obj = null;
}
this.curLink = obj;
this.setHeightLight(this);
};
coocaakeymap.prototype.handleClick = function(obj){
this.setFocus($(obj));
this.curLink.trigger("itemClick");
};
coocaakeymap.prototype.keyHandler = function(_this, ev){
//var ev = event;
var curKey = ev.keyCode;
debug("<br/>");
debug("keyCode = " + ev.keyCode);
debug("<br/>");
debug(+new Date());
debug("<br/>");
_this.curLink.trigger("beforekeyinput", [curKey,ev, _this]);
if(_this.input != null && _this.curLink.get(0) == _this.input.get(0)){
//ev.stopPropagation();
debug("开始执行keyinput事件");
_this.input.trigger("keyinput", [curKey,_this]);
}
var lastLink = _this.curLink;
_this.curLink.trigger("afterkeyinput", [curKey,ev, _this]);
if(_this.iscmd == true){
_this.triggerCmd(curKey);
}
//禁止select 左右上下 改变选项
//var tag = _this.curLink.get(0).tagName;
//if(tag == "SELECT" || tag == "INPUT"){
// ev.preventDefault();
//}
if(ev.isPropagationStopped() == false){
switch(curKey){
case 8:// 遥控器删除
_this.iscmd = true;
_this.cmd = [];
if(curKey == 8){
ev.preventDefault();
}
break;
case 27: // esc返回
break;
case 37: // left
//判断输入点的位置
_this.moveLeft();
ev.stopPropagation();
break;
case 38: // up
_this.moveUp();
ev.stopPropagation();
break;
case 39: // right
_this.moveRight();
ev.stopPropagation();
break;
case 40: // down
_this.moveDown();
ev.stopPropagation();
break;
case 13: // enter
_this.curLink.trigger("itemClick");
break;
}
}
if(lastLink != _this.curLink){
lastLink.trigger("blur");
_this.curLink.trigger("focus");
}
this.keyDownEvent(ev);
};
coocaakeymap.prototype.setHeightLight = function(_this){
if(_this.curLink == null){
//将第一个可见元素设置为焦点元素
for(var i = 0; i <_this.linkbuttons.length; i++ ){
if($(_this.linkbuttons[i]).is(":visible")){
_this.curLink = $(_this.linkbuttons[i]);
break;
}
}
}
_this.linkbuttons.attr("readonly", true);
var hover = _this.hoverClass;
_this.linkbuttons.removeClass(hover);
_this.curLink.addClass(hover);
var curLink = _this.curLink;
var type = curLink.attr('type');
_this.input = null;
//if ($.browser.mozilla && $.browser.version == "1.9.0.10") {
//} else {
// 如果是输入框就聚焦
if (type == 'text' || type == 'password') {
//curLink.get(0).focus();
} else {
}
if($(_this.curLink).hasClass("input")){
_this.input = $(_this.curLink);
}
//}
//将焦点赋给文档
$(document).focus();
this.curLink.trigger("itemSelected");
};
coocaakeymap.prototype.moveLeft = function(){
var _this = this;
//如果有leftTarget 标识,直接聚焦到标识所属元素
if(_this.curLink.attr("leftTarget")){
var link = $(_this.curLink.attr("leftTarget"));
if(link.size() > 0){
_this.curLink = link;
_this.setHeightLight(_this);
return;
}
}
var curLink = _this.curLink;
var xthis;
var upCoincide;
var downCoincide;
var diffDistance = 99999;
var mx = curLink.offset().left;
var my = curLink.offset().top;
var objNoCoincide = curLink;
var diffNoCoincide = 99999;
var prev = _this.curLink.prev();
while(prev.length > 0){
//查找相邻的节点
if(_this.linkbuttons.index(prev) != -1){
curLink = prev;
break;
}else{
prev = prev.prev();
}
}
if(_this.curLink == curLink){
_this.linkbuttons.each(function () {
xthis = $(this);
if(xthis.is(":hidden") || xthis.css("visibility") == 'hidden'){
return true;
}
nx = xthis.offset().left;
ny = xthis.offset().top;
// debug("x:" + nx + " --- y:" + ny);
// 如果2个box有重叠,则计算x最近的即可
upCoincide = ny <= my && ny + xthis.height() > my;
downCoincide = ny >= my && ny < my + curLink.height();
if (nx < mx && (upCoincide || downCoincide)) {
xdist = mx - nx;
if (xdist < diffDistance) {
diffDistance = xdist;
curLink = xthis;
}
}
if (nx < mx) {
// 向左边移动的时候,如果在目标上边,计算右下角,否则计算左上角
if (ny >= my)
xdist = _this.lineDistance(nx + xthis.width(), ny, mx, my);
else
xdist = _this.lineDistance(nx + xthis.width(), ny + xthis.height(),
mx, my);
if (xdist < diffNoCoincide) {
diffNoCoincide = xdist;
objNoCoincide = xthis;
curLink = xthis;
}
}
});
}
//
_this.curLink = curLink;
_this.setHeightLight(_this);
};
coocaakeymap.prototype.lineDistance = function(x1, y1, x2, y2) {
var xs = 0;
var ys = 0;
xs = Math.abs(x1 - x2);
xs = xs * xs;
ys = Math.abs(y1 - y2);
ys = ys * ys;
return Math.sqrt(xs + ys);
};
coocaakeymap.prototype.moveRight = function(){
var _this = this;
// 如果有rightTarget标识,直接聚焦到标识所属元素
if(_this.curLink.attr("rightTarget")){
var link = $(_this.curLink.attr("rightTarget"));
if(link.size() > 0){
_this.curLink = link;
_this.setHeightLight(_this);
return;
}
}
var curLink = _this.curLink;
var xthis;
var upCoincide;
var downCoincide;
var diffDistance = 99999;
var mx = curLink.offset().left;
var my = curLink.offset().top;
var tarLink = curLink;
var objNoCoincide = curLink;
var diffNoCoincide = 99999;
var next = _this.curLink.next();
while(next.length > 0){
if(_this.linkbuttons.index(next) != -1){
curLink = next;
break;
}else{
next = next.next();
}
}
if(_this.curLink == curLink){
_this.linkbuttons.each(function () {
xthis = $(this);
if(xthis.is(":hidden") || xthis.css("visibility") == 'hidden'){
return true;
}
nx = xthis.offset().left;
ny = xthis.offset().top;
upCoincide = ny <= my && ny + xthis.height() > my;
downCoincide = ny >= my && ny < my + curLink.height();
if (nx > mx && (upCoincide || downCoincide)) {
xdist = nx - mx;
if (xdist < diffDistance) {
//debug(xthis.html() + "xdist:" + xdist);
diffDistance = xdist;
curLink = xthis;
}
}
if (nx > mx) {
//向右边移动的时候,如果在目标上边,计算目标左下角,否则计算左上角
if (ny >= my)
xdist = _this.lineDistance(nx, ny, mx + tarLink.width(), my);
else
xdist = _this.lineDistance(nx, ny + xthis.height(), mx + tarLink.width(), my);
if (xdist < diffNoCoincide) {
diffNoCoincide = xdist;
objNoCoincide = xthis;
curLink = xthis;
}
}
});
}
_this.curLink = curLink;
_this.setHeightLight(_this);
};
coocaakeymap.prototype.moveUp = function(){
var _this = this;
//如果有 upTarget 标识,直接聚焦到标识所属元素
if(_this.curLink.attr("upTarget")){
var link = $(_this.curLink.attr("upTarget"));
if(link.size() > 0){
_this.curLink = link;
_this.setHeightLight(_this);
return;
}
}
var curLink = _this.curLink;
var xthis;
var leftCoincide;
var rightCoincide;
var diffDistance = 99999;
var mx = curLink.offset().left;
var my = curLink.offset().top;
var tarLink = curLink;
var objNoCoincide = curLink;
var diffNoCoincide = 99999;
var findF = false;
_this.linkbuttons.each(function () {
xthis = $(this);
if(xthis.is(":hidden") || xthis.css("visibility") == 'hidden'){
return true;
}
nx = xthis.offset().left;
ny = xthis.offset().top;
//先找重叠的,直接算Y坐标
leftCoincide = nx <= mx && nx + xthis.width() > mx;
rightCoincide = nx >= mx && mx + tarLink.width() > nx;
if (ny < my && (leftCoincide || rightCoincide)) {
xdist = my - ny;
if (xdist < diffDistance) {
diffDistance = xdist;
curLink = xthis;
}
findF = true;
}else if(findF == false){
///这里找距离最短的,不在乎是否有重叠
if (ny < my) {
//向上移动的时候,如果在目标右边,计算左下角,否则计算右下角
if (nx >= mx)
xdist = _this.lineDistance(nx, ny + xthis.height(), mx, my);
else
xdist = _this.lineDistance(nx + xthis.width(), ny + xthis.height(), mx, my);
if (xdist < diffNoCoincide) {
diffNoCoincide = xdist;
objNoCoincide = xthis;
curLink = xthis;
}
}
}
});
_this.curLink = curLink;
_this.setHeightLight(_this);
};
coocaakeymap.prototype.moveDown = function(){
var _this = this;
//如果有 downTarget 标识,直接聚焦到标识所属元素
if(_this.curLink.attr("downTarget")){
var link = $(_this.curLink.attr("downTarget"));
if(link.size() > 0){
_this.curLink = link;
_this.setHeightLight(_this);
return;
}
}
var curLink = _this.curLink;
var xthis;
var leftCoincide;
var rightCoincide;
var diffDistance = 99999;
var mx = curLink.offset().left;
var my = curLink.offset().top;
var tarLink = curLink;
var objNoCoincide = curLink;
var diffNoCoincide = 99999;
var findF = false;
_this.linkbuttons.each(function () {
xthis = $(this);
if(xthis.is(":hidden") || xthis.css("visibility") == 'hidden'){
return true;
}
nx = xthis.offset().left;
ny = xthis.offset().top;
leftCoincide = nx <= mx && nx + xthis.width() > mx;
rightCoincide = nx >= mx && mx + tarLink.width() > nx;
if (ny > my && (leftCoincide || rightCoincide)) {
xdist = ny - my;
if (xdist < diffDistance) {
diffDistance = xdist;
curLink = xthis;
}
findF = true;
}else if(findF == false){
if (ny > my) {
//xdist = lineDistance(nx, ny, mx, my);
//向下移动的时候,如果在目标右边,计算左下角,否则计算右下角
if (nx >= mx)
xdist = _this.lineDistance(nx, ny, mx, my + tarLink.height());
else
xdist = _this.lineDistance(nx + xthis.width(), ny, mx, my + tarLink.height());
if (xdist < diffNoCoincide) {
diffNoCoincide = xdist;
objNoCoincide = xthis;
curLink = xthis;
}
}
}
});
_this.curLink = curLink;
_this.setHeightLight(_this);
};
coocaakeymap.prototype.handleInputVal = function(ev, code, map){
if(typeof map.setVal != 'function' || typeof map.getVal != 'function'){
return;
}
var _this = map;
var char = "";
switch(code){
case 48: // key 0
case 49: // 1
case 50:
case 51:
case 52:
case 53:
case 54:
case 55:
case 56:
case 57:
//输入法输入
if($(this).attr("readonly") == undefined){
return;
}
//ev.isPropagationStopped();
char = String.fromCharCode(code);
var old = _this.getVal.call(this);
if(typeof $(this).attr("maxlength") != "nudefined"){
var length = old.length;
var maxlength = parseInt($(this).attr("maxlength"));
if(maxlength <= length){
return;
}
}
_this.setVal.call(this, old + char);
break;
case 96:
case 97:
case 98:
case 99:
case 100:
case 101:
case 102:
case 103:
case 104:
case 105:
//输入法输入
if($(this).attr("readonly") == undefined){
return;
}
//ev.isPropagationStopped();
var c = code - 48;
char = String.fromCharCode(c);
var old = _this.getVal.call(this);
if(typeof $(this).attr("maxlength") != "nudefined"){
var length = old.length;
var maxlength = parseInt($(this).attr("maxlength"));
if(maxlength <= length){
return;
}
}
_this.setVal.call(this, old + char);
break;
case 8:
case 0:
//ev.isPropagationStopped();
var old = _this.getVal.call(this);
if(old.length > 0){
_this.setVal.call(this, old.substring(0, old.length - 1));
}
return;
case 13://回车键
break;
}
};