mirror of
https://github.com/coderaiser/cloudcmd.git
synced 2026-01-23 10:45:47 +00:00
fixed bug with scrolling in opera and firefox
This commit is contained in:
parent
ea938a51a0
commit
f4ba5598da
4 changed files with 1884 additions and 1869 deletions
|
|
@ -126,6 +126,8 @@ time was changed.
|
|||
|
||||
* Fixed bug with old browsers suport.
|
||||
|
||||
* Fixed bug with scrolling in opera and firefox.
|
||||
|
||||
|
||||
2012.12.12, Version 0.1.8
|
||||
|
||||
|
|
|
|||
2594
lib/client/dom.js
2594
lib/client/dom.js
File diff suppressed because it is too large
Load diff
543
lib/client/ie.js
543
lib/client/ie.js
|
|
@ -1,272 +1,273 @@
|
|||
/* script, fixes ie */
|
||||
//var Util, DOM, jQuery;
|
||||
|
||||
(function(Util, DOM, $){
|
||||
'use strict';
|
||||
|
||||
if(!window.XMLHttpRequest || !document.head)
|
||||
DOM.ajax = $.ajax;
|
||||
|
||||
/* setting head ie6 - ie8 */
|
||||
if(!document.head){
|
||||
document.head = $('head')[0];
|
||||
|
||||
/*
|
||||
{name: '', src: ' ',func: '', style: '', id: '', parent: '',
|
||||
async: false, inner: 'id{color:red, }, class:'', not_append: false}
|
||||
*/
|
||||
DOM.cssSet = function(pParams_o){
|
||||
var lElement = '<style ';
|
||||
|
||||
if (pParams_o.id) lElement += 'id=' + pParams_o.id + ' ';
|
||||
if (pParams_o.style) lElement += 'style=' + pParams_o.style + ' ';
|
||||
if (pParams_o.className) lElement += 'class=' + pParams_o.className;
|
||||
if (pParams_o.inner)lElement += '>' + pParams_o.inner;
|
||||
|
||||
lElement +='</style>';
|
||||
|
||||
return $(lElement)
|
||||
.appendTo(pParams_o.parent || document.head);
|
||||
};
|
||||
}
|
||||
|
||||
/* setting function context (this) */
|
||||
Util.bind = function(pFunction, pContext){
|
||||
var lRet;
|
||||
|
||||
lRet = $.proxy(pFunction, pContext);
|
||||
|
||||
return lRet;
|
||||
};
|
||||
|
||||
/*
|
||||
* typeof callback === "function" should not be used,
|
||||
* as older browsers may report objects to be a function,
|
||||
* which they are not
|
||||
*/
|
||||
Util.isFunction = $.isFunction;
|
||||
|
||||
if (!document.addEventListener)
|
||||
/**
|
||||
* safe add event listener on ie
|
||||
* @param pType
|
||||
* @param pListener
|
||||
*/
|
||||
DOM.addListener = function(pType, pListener, pCapture, pElement){
|
||||
var lRet;
|
||||
|
||||
if(!pElement)
|
||||
pElement = window;
|
||||
|
||||
lRet = $(pElement).bind(pType, null, pListener);
|
||||
|
||||
return lRet;
|
||||
};
|
||||
|
||||
if(!document.removeEventListener){
|
||||
DOM.removeListener = function(pType, pListener, pCapture, pElement){
|
||||
var lRet;
|
||||
|
||||
if(!pElement)
|
||||
pElement = window;
|
||||
|
||||
$(pElement).unbind(pType, pListener);
|
||||
|
||||
return lRet;
|
||||
};
|
||||
}
|
||||
|
||||
if(!document.getElementsByClassName){
|
||||
DOM.getByClass = function(pClass, pElement){
|
||||
var lClass = '.' + pClass,
|
||||
lResult;
|
||||
|
||||
if(pElement)
|
||||
lResult = $(pElement).find(lClass);
|
||||
else lResult = $.find(lClass);
|
||||
|
||||
return lResult;
|
||||
};
|
||||
}
|
||||
|
||||
/* function polyfill webkit standart function */
|
||||
DOM.scrollIntoViewIfNeeded = function(pElement, centerIfNeeded){
|
||||
if(!window.getComputedStyle)
|
||||
return;
|
||||
/*
|
||||
https://gist.github.com/2581101
|
||||
*/
|
||||
centerIfNeeded = arguments.length === 0 ? true : !!centerIfNeeded;
|
||||
|
||||
var parent = pElement.parentNode,
|
||||
parentComputedStyle = window.getComputedStyle(parent, null),
|
||||
parentBorderTopWidth =
|
||||
parseInt(parentComputedStyle.getPropertyValue('border-top-width'), 10),
|
||||
|
||||
parentBorderLeftWidth =
|
||||
parseInt(parentComputedStyle.getPropertyValue('border-left-width'), 10),
|
||||
|
||||
overTop = pElement.offsetTop - parent.offsetTop < parent.scrollTop,
|
||||
overBottom =
|
||||
(pElement.offsetTop -
|
||||
parent.offsetTop +
|
||||
pElement.clientHeight -
|
||||
parentBorderTopWidth) >
|
||||
(parent.scrollTop + parent.clientHeight),
|
||||
|
||||
overLeft = pElement.offsetLeft -
|
||||
parent.offsetLeft < parent.scrollLeft,
|
||||
|
||||
overRight =
|
||||
(pElement.offsetLeft -
|
||||
parent.offsetLeft +
|
||||
pElement.clientWidth -
|
||||
parentBorderLeftWidth) >
|
||||
(parent.scrollLeft + parent.clientWidth),
|
||||
|
||||
alignWithTop = overTop && !overBottom;
|
||||
|
||||
if ((overTop || overBottom) && centerIfNeeded)
|
||||
parent.scrollTop =
|
||||
pElement.offsetTop -
|
||||
parent.offsetTop -
|
||||
parent.clientHeight / 2 -
|
||||
parentBorderTopWidth +
|
||||
pElement.clientHeight / 2;
|
||||
|
||||
if ((overLeft || overRight) && centerIfNeeded)
|
||||
parent.scrollLeft =
|
||||
pElement.offsetLeft -
|
||||
parent.offsetLeft -
|
||||
parent.clientWidth / 2 -
|
||||
parentBorderLeftWidth +
|
||||
pElement.clientWidth / 2;
|
||||
|
||||
if ( (overTop || overBottom || overLeft || overRight) &&
|
||||
!centerIfNeeded)
|
||||
pElement.scrollIntoView(alignWithTop);
|
||||
};
|
||||
|
||||
if(!document.body.classList){
|
||||
DOM.addClass = function(pElement, pClass){
|
||||
var lSpaceChar = '',
|
||||
lClassName = pElement.className,
|
||||
lRet_b = true;
|
||||
|
||||
if(lClassName) lSpaceChar = ' ';
|
||||
|
||||
if( lClassName.indexOf(pClass) < 0 )
|
||||
pElement.className += lSpaceChar + pClass;
|
||||
else
|
||||
lRet_b = false;
|
||||
};
|
||||
|
||||
DOM.removeClass = function(pElement, pClass){
|
||||
var lClassName = pElement.className;
|
||||
|
||||
if(lClassName.length > pClass.length)
|
||||
pElement.className = lClassName.replace(pClass, '');
|
||||
};
|
||||
}
|
||||
|
||||
if(!window.JSON){
|
||||
Util.parseJSON = $.parseJSON;
|
||||
|
||||
/* https://gist.github.com/754454 */
|
||||
Util.stringifyJSON = function(pObj){
|
||||
var lRet;
|
||||
|
||||
if (!Util.isObject(pObj) || pObj === null) {
|
||||
// simple data type
|
||||
if (Util.isString(pObj)) pObj = '"' + pObj + '"';
|
||||
lRet = String(pObj);
|
||||
} else {
|
||||
// recurse array or object
|
||||
var n, v, json = [], isArray = Util.isArray(pObj);
|
||||
|
||||
for (n in pObj) {
|
||||
v = pObj[n];
|
||||
|
||||
if (pObj.hasOwnProperty(n)) {
|
||||
if (Util.isString(v))
|
||||
v = '"' + v + '"';
|
||||
else if (v && Util.isObject(v))
|
||||
v = DOM.stringifyJSON(v);
|
||||
|
||||
json.push((isArray ? "" : '"' + n + '":') + String(v));
|
||||
}
|
||||
}
|
||||
lRet = (isArray ? "[" : "{") + String(json) + (isArray ? "]" : "}");
|
||||
}
|
||||
|
||||
return lRet;
|
||||
};
|
||||
}
|
||||
|
||||
if(!window.localStorage){
|
||||
var Cache = function(){
|
||||
/* приватный переключатель возможности работы с кэшем */
|
||||
var CacheAllowed,
|
||||
Data = {};
|
||||
|
||||
/* функция проверяет возможно ли работать с кэшем каким-либо образом */
|
||||
this.isAllowed = function(){
|
||||
return CacheAllowed;
|
||||
};
|
||||
|
||||
this.setAllowed = function(){
|
||||
CacheAllowed = true;
|
||||
};
|
||||
|
||||
this.UnSetAllowed = function(){
|
||||
CacheAllowed = false;
|
||||
};
|
||||
|
||||
/** remove element */
|
||||
this.remove = function(pItem){
|
||||
var lRet = this;
|
||||
if(CacheAllowed)
|
||||
delete Data[pItem];
|
||||
|
||||
return lRet;
|
||||
};
|
||||
|
||||
/** если доступен localStorage и
|
||||
* в нём есть нужная нам директория -
|
||||
* записываем данные в него
|
||||
*/
|
||||
this.set = function(pName, pData){
|
||||
var lRet = this;
|
||||
|
||||
if(CacheAllowed && pName && pData)
|
||||
Data[pName] = pData;
|
||||
|
||||
return lRet;
|
||||
},
|
||||
|
||||
/** Если доступен Cache принимаем из него данные*/
|
||||
this.get = function(pName){
|
||||
var lRet = false;
|
||||
|
||||
if(CacheAllowed)
|
||||
lRet = Data[pName];
|
||||
|
||||
return lRet;
|
||||
},
|
||||
|
||||
/** функция чистит весь кэш для всех каталогов*/
|
||||
this.clear = function(){
|
||||
var lRet = this;
|
||||
|
||||
if(CacheAllowed)
|
||||
Data = {};
|
||||
|
||||
return lRet;
|
||||
};
|
||||
};
|
||||
|
||||
DOM.Cache = new Cache();
|
||||
}
|
||||
|
||||
|
||||
/* script, fixes ie */
|
||||
//var Util, DOM, jQuery;
|
||||
|
||||
(function(Util, DOM, $){
|
||||
'use strict';
|
||||
|
||||
if(!window.XMLHttpRequest || !document.head)
|
||||
DOM.ajax = $.ajax;
|
||||
|
||||
/* setting head ie6 - ie8 */
|
||||
if(!document.head){
|
||||
document.head = $('head')[0];
|
||||
|
||||
/*
|
||||
{name: '', src: ' ',func: '', style: '', id: '', parent: '',
|
||||
async: false, inner: 'id{color:red, }, class:'', not_append: false}
|
||||
*/
|
||||
DOM.cssSet = function(pParams_o){
|
||||
var lElement = '<style ';
|
||||
|
||||
if (pParams_o.id) lElement += 'id=' + pParams_o.id + ' ';
|
||||
if (pParams_o.style) lElement += 'style=' + pParams_o.style + ' ';
|
||||
if (pParams_o.className) lElement += 'class=' + pParams_o.className;
|
||||
if (pParams_o.inner)lElement += '>' + pParams_o.inner;
|
||||
|
||||
lElement +='</style>';
|
||||
|
||||
return $(lElement)
|
||||
.appendTo(pParams_o.parent || document.head);
|
||||
};
|
||||
}
|
||||
|
||||
/* setting function context (this) */
|
||||
Util.bind = function(pFunction, pContext){
|
||||
var lRet;
|
||||
|
||||
lRet = $.proxy(pFunction, pContext);
|
||||
|
||||
return lRet;
|
||||
};
|
||||
|
||||
/*
|
||||
* typeof callback === "function" should not be used,
|
||||
* as older browsers may report objects to be a function,
|
||||
* which they are not
|
||||
*/
|
||||
Util.isFunction = $.isFunction;
|
||||
|
||||
if (!document.addEventListener)
|
||||
/**
|
||||
* safe add event listener on ie
|
||||
* @param pType
|
||||
* @param pListener
|
||||
*/
|
||||
DOM.addListener = function(pType, pListener, pCapture, pElement){
|
||||
var lRet;
|
||||
|
||||
if(!pElement)
|
||||
pElement = window;
|
||||
|
||||
lRet = $(pElement).bind(pType, null, pListener);
|
||||
|
||||
return lRet;
|
||||
};
|
||||
|
||||
if(!document.removeEventListener){
|
||||
DOM.removeListener = function(pType, pListener, pCapture, pElement){
|
||||
var lRet;
|
||||
|
||||
if(!pElement)
|
||||
pElement = window;
|
||||
|
||||
$(pElement).unbind(pType, pListener);
|
||||
|
||||
return lRet;
|
||||
};
|
||||
}
|
||||
|
||||
if(!document.getElementsByClassName){
|
||||
DOM.getByClass = function(pClass, pElement){
|
||||
var lClass = '.' + pClass,
|
||||
lResult;
|
||||
|
||||
if(pElement)
|
||||
lResult = $(pElement).find(lClass);
|
||||
else lResult = $.find(lClass);
|
||||
|
||||
return lResult;
|
||||
};
|
||||
}
|
||||
|
||||
DOM.scrollByPages = Util.retFalse;
|
||||
/* function polyfill webkit standart function */
|
||||
DOM.scrollIntoViewIfNeeded = function(pElement, centerIfNeeded){
|
||||
if(!window.getComputedStyle)
|
||||
return;
|
||||
/*
|
||||
https://gist.github.com/2581101
|
||||
*/
|
||||
centerIfNeeded = arguments.length === 0 ? true : !!centerIfNeeded;
|
||||
|
||||
var parent = pElement.parentNode,
|
||||
parentComputedStyle = window.getComputedStyle(parent, null),
|
||||
parentBorderTopWidth =
|
||||
parseInt(parentComputedStyle.getPropertyValue('border-top-width'), 10),
|
||||
|
||||
parentBorderLeftWidth =
|
||||
parseInt(parentComputedStyle.getPropertyValue('border-left-width'), 10),
|
||||
|
||||
overTop = pElement.offsetTop - parent.offsetTop < parent.scrollTop,
|
||||
overBottom =
|
||||
(pElement.offsetTop -
|
||||
parent.offsetTop +
|
||||
pElement.clientHeight -
|
||||
parentBorderTopWidth) >
|
||||
(parent.scrollTop + parent.clientHeight),
|
||||
|
||||
overLeft = pElement.offsetLeft -
|
||||
parent.offsetLeft < parent.scrollLeft,
|
||||
|
||||
overRight =
|
||||
(pElement.offsetLeft -
|
||||
parent.offsetLeft +
|
||||
pElement.clientWidth -
|
||||
parentBorderLeftWidth) >
|
||||
(parent.scrollLeft + parent.clientWidth),
|
||||
|
||||
alignWithTop = overTop && !overBottom;
|
||||
|
||||
if ((overTop || overBottom) && centerIfNeeded)
|
||||
parent.scrollTop =
|
||||
pElement.offsetTop -
|
||||
parent.offsetTop -
|
||||
parent.clientHeight / 2 -
|
||||
parentBorderTopWidth +
|
||||
pElement.clientHeight / 2;
|
||||
|
||||
if ((overLeft || overRight) && centerIfNeeded)
|
||||
parent.scrollLeft =
|
||||
pElement.offsetLeft -
|
||||
parent.offsetLeft -
|
||||
parent.clientWidth / 2 -
|
||||
parentBorderLeftWidth +
|
||||
pElement.clientWidth / 2;
|
||||
|
||||
if ( (overTop || overBottom || overLeft || overRight) &&
|
||||
!centerIfNeeded)
|
||||
pElement.scrollIntoView(alignWithTop);
|
||||
};
|
||||
|
||||
if(!document.body.classList){
|
||||
DOM.addClass = function(pElement, pClass){
|
||||
var lSpaceChar = '',
|
||||
lClassName = pElement.className,
|
||||
lRet_b = true;
|
||||
|
||||
if(lClassName) lSpaceChar = ' ';
|
||||
|
||||
if( lClassName.indexOf(pClass) < 0 )
|
||||
pElement.className += lSpaceChar + pClass;
|
||||
else
|
||||
lRet_b = false;
|
||||
};
|
||||
|
||||
DOM.removeClass = function(pElement, pClass){
|
||||
var lClassName = pElement.className;
|
||||
|
||||
if(lClassName.length > pClass.length)
|
||||
pElement.className = lClassName.replace(pClass, '');
|
||||
};
|
||||
}
|
||||
|
||||
if(!window.JSON){
|
||||
Util.parseJSON = $.parseJSON;
|
||||
|
||||
/* https://gist.github.com/754454 */
|
||||
Util.stringifyJSON = function(pObj){
|
||||
var lRet;
|
||||
|
||||
if (!Util.isObject(pObj) || pObj === null) {
|
||||
// simple data type
|
||||
if (Util.isString(pObj)) pObj = '"' + pObj + '"';
|
||||
lRet = String(pObj);
|
||||
} else {
|
||||
// recurse array or object
|
||||
var n, v, json = [], isArray = Util.isArray(pObj);
|
||||
|
||||
for (n in pObj) {
|
||||
v = pObj[n];
|
||||
|
||||
if (pObj.hasOwnProperty(n)) {
|
||||
if (Util.isString(v))
|
||||
v = '"' + v + '"';
|
||||
else if (v && Util.isObject(v))
|
||||
v = DOM.stringifyJSON(v);
|
||||
|
||||
json.push((isArray ? "" : '"' + n + '":') + String(v));
|
||||
}
|
||||
}
|
||||
lRet = (isArray ? "[" : "{") + String(json) + (isArray ? "]" : "}");
|
||||
}
|
||||
|
||||
return lRet;
|
||||
};
|
||||
}
|
||||
|
||||
if(!window.localStorage){
|
||||
var Cache = function(){
|
||||
/* приватный переключатель возможности работы с кэшем */
|
||||
var CacheAllowed,
|
||||
Data = {};
|
||||
|
||||
/* функция проверяет возможно ли работать с кэшем каким-либо образом */
|
||||
this.isAllowed = function(){
|
||||
return CacheAllowed;
|
||||
};
|
||||
|
||||
this.setAllowed = function(){
|
||||
CacheAllowed = true;
|
||||
};
|
||||
|
||||
this.UnSetAllowed = function(){
|
||||
CacheAllowed = false;
|
||||
};
|
||||
|
||||
/** remove element */
|
||||
this.remove = function(pItem){
|
||||
var lRet = this;
|
||||
if(CacheAllowed)
|
||||
delete Data[pItem];
|
||||
|
||||
return lRet;
|
||||
};
|
||||
|
||||
/** если доступен localStorage и
|
||||
* в нём есть нужная нам директория -
|
||||
* записываем данные в него
|
||||
*/
|
||||
this.set = function(pName, pData){
|
||||
var lRet = this;
|
||||
|
||||
if(CacheAllowed && pName && pData)
|
||||
Data[pName] = pData;
|
||||
|
||||
return lRet;
|
||||
},
|
||||
|
||||
/** Если доступен Cache принимаем из него данные*/
|
||||
this.get = function(pName){
|
||||
var lRet = false;
|
||||
|
||||
if(CacheAllowed)
|
||||
lRet = Data[pName];
|
||||
|
||||
return lRet;
|
||||
},
|
||||
|
||||
/** функция чистит весь кэш для всех каталогов*/
|
||||
this.clear = function(){
|
||||
var lRet = this;
|
||||
|
||||
if(CacheAllowed)
|
||||
Data = {};
|
||||
|
||||
return lRet;
|
||||
};
|
||||
};
|
||||
|
||||
DOM.Cache = new Cache();
|
||||
}
|
||||
|
||||
|
||||
})(Util, DOM, jQuery);
|
||||
|
|
@ -1,308 +1,308 @@
|
|||
var CloudCommander, Util, DOM;
|
||||
(function(CloudCmd, Util, DOM){
|
||||
"use strict";
|
||||
|
||||
DOM.Images.hideLoad();
|
||||
|
||||
/* private property set or set key binding */
|
||||
var keyBinded;
|
||||
|
||||
/* Key constants*/
|
||||
CloudCmd.KEY = {
|
||||
TAB : 9,
|
||||
ENTER : 13,
|
||||
ESC : 27,
|
||||
|
||||
PAGE_UP : 33,
|
||||
PAGE_DOWN : 34,
|
||||
END : 35,
|
||||
HOME : 36,
|
||||
UP : 38,
|
||||
DOWN : 40,
|
||||
|
||||
Delete : 46,
|
||||
|
||||
D : 68,
|
||||
|
||||
G : 71,
|
||||
|
||||
O : 79,
|
||||
Q : 81,
|
||||
R : 82,
|
||||
S : 83,
|
||||
T : 84,
|
||||
|
||||
F2 : 113,
|
||||
F3 : 114,
|
||||
F4 : 115,
|
||||
F10 : 121,
|
||||
|
||||
TRA : 192 /* Typewritten Reverse Apostrophe (`) */
|
||||
};
|
||||
|
||||
var KEY = CloudCmd.KEY;
|
||||
|
||||
CloudCmd.KeyBinding = {};
|
||||
|
||||
var KeyBinding = CloudCmd.KeyBinding;
|
||||
|
||||
KeyBinding.get = function(){return keyBinded;};
|
||||
|
||||
KeyBinding.set = function(){keyBinded = true;};
|
||||
|
||||
KeyBinding.unSet = function(){keyBinded = false;};
|
||||
|
||||
KeyBinding.init = function(){
|
||||
/* saving state of tabs varibles */
|
||||
var lTabPanel = {
|
||||
left : 0,
|
||||
right : 0
|
||||
|
||||
};
|
||||
|
||||
var key_event = function(pEvent){
|
||||
/* получаем выдленный файл*/
|
||||
var lCurrentFile = DOM.getCurrentFile(), i;
|
||||
/* если клавиши можно обрабатывать*/
|
||||
if(keyBinded && pEvent){
|
||||
var lKeyCode = pEvent.keyCode;
|
||||
|
||||
/* open configuration window */
|
||||
if(lKeyCode === KEY.O && pEvent.altKey){
|
||||
console.log('openning config window...');
|
||||
|
||||
DOM.Images.showLoad({top: true});
|
||||
|
||||
Util.exec(CloudCmd.Config);
|
||||
}
|
||||
|
||||
else if(lKeyCode === KEY.G && pEvent.altKey)
|
||||
Util.exec(CloudCmd.GitHub);
|
||||
|
||||
else if(lKeyCode === KEY.D && pEvent.altKey){
|
||||
Util.exec(CloudCmd.DropBox);
|
||||
DOM.preventDefault(pEvent);
|
||||
}
|
||||
|
||||
/* если нажали таб:
|
||||
* переносим курсор на
|
||||
* правую панель, если
|
||||
* мы были на левой и
|
||||
* наоборот
|
||||
*/
|
||||
else if(lKeyCode === KEY.TAB){
|
||||
console.log('Tab pressed');
|
||||
|
||||
Util.tryCatchLog(function(){
|
||||
/* changing parent panel of curent-file */
|
||||
var lPanel = DOM.getPanel(),
|
||||
lId = lPanel.id;
|
||||
|
||||
lTabPanel[lId] = lCurrentFile;
|
||||
|
||||
lPanel = DOM.getPanel({active:false});
|
||||
lId = lPanel.id;
|
||||
|
||||
if(lTabPanel[lId])
|
||||
DOM.setCurrentFile(lTabPanel[lId]);
|
||||
else{
|
||||
var lFirstFileOnList = DOM.getByTag('li', lPanel)[2];
|
||||
|
||||
DOM.setCurrentFile(lFirstFileOnList);
|
||||
}
|
||||
});
|
||||
|
||||
DOM.preventDefault(pEvent);//запрет на дальнейшее действие
|
||||
}
|
||||
else if(lKeyCode === KEY.Delete)
|
||||
DOM.promptRemoveCurrent(lCurrentFile);
|
||||
|
||||
/* if f3 or shift+f3 or alt+f3 pressed */
|
||||
else if(lKeyCode === KEY.F3){
|
||||
var lEditor = CloudCmd[pEvent.shiftKey ?
|
||||
'Viewer' : 'Editor'];
|
||||
|
||||
Util.exec(lEditor, true);
|
||||
|
||||
DOM.preventDefault(pEvent);
|
||||
}
|
||||
|
||||
/* if f4 pressed */
|
||||
else if(lKeyCode === KEY.F4) {
|
||||
DOM.Images.showLoad();
|
||||
|
||||
Util.exec(CloudCmd.Editor);
|
||||
|
||||
DOM.preventDefault(pEvent);
|
||||
}
|
||||
else if(lKeyCode === KEY.F10 && pEvent.shiftKey){
|
||||
Util.exec(CloudCmd.Menu);
|
||||
|
||||
DOM.preventDefault(pEvent);
|
||||
}
|
||||
|
||||
else if (lKeyCode === KEY.TRA){
|
||||
DOM.Images.showLoad({top: true});
|
||||
Util.exec(CloudCmd.Terminal);
|
||||
}
|
||||
/* навигация по таблице файлов *
|
||||
* если нажали клавишу вверх *
|
||||
* выделяем предыдущую строку */
|
||||
else if(lKeyCode === KEY.UP){
|
||||
DOM.setCurrentFile( lCurrentFile.previousSibling );
|
||||
DOM.preventDefault( pEvent );
|
||||
}
|
||||
|
||||
/* если нажали клавишу в низ *
|
||||
* выделяем следующую строку */
|
||||
else if(lKeyCode === KEY.DOWN){
|
||||
DOM.setCurrentFile( lCurrentFile.nextSibling );
|
||||
DOM.preventDefault( pEvent );
|
||||
}
|
||||
|
||||
/* если нажали клавишу Home *
|
||||
* переходим к самому верхнему *
|
||||
* элементу */
|
||||
else if(lKeyCode === KEY.HOME){
|
||||
DOM.setCurrentFile( lCurrentFile.parentElement.firstChild );
|
||||
DOM.preventDefault(pEvent);
|
||||
}
|
||||
|
||||
/* если нажали клавишу End
|
||||
* выделяем последний элемент
|
||||
*/
|
||||
else if(lKeyCode === KEY.END){
|
||||
DOM.setCurrentFile( lCurrentFile.parentElement.lastElementChild );
|
||||
DOM.preventDefault( pEvent );
|
||||
}
|
||||
|
||||
/* если нажали клавишу page down
|
||||
* проматываем экран
|
||||
*/
|
||||
else if(lKeyCode === KEY.PAGE_DOWN){
|
||||
DOM.getPanel().scrollByPages(1);
|
||||
|
||||
for(i=0; i<30; i++){
|
||||
if(!lCurrentFile.nextSibling) break;
|
||||
|
||||
lCurrentFile = lCurrentFile.nextSibling;
|
||||
}
|
||||
DOM.setCurrentFile(lCurrentFile);
|
||||
DOM.preventDefault(pEvent);
|
||||
}
|
||||
|
||||
/* если нажали клавишу page up
|
||||
* проматываем экран
|
||||
*/
|
||||
else if(lKeyCode === KEY.PAGE_UP){
|
||||
DOM.getPanel().scrollByPages(-1);
|
||||
|
||||
var lC = lCurrentFile,
|
||||
tryCatch = function(pCurrentFile){
|
||||
Util.tryCatch(function(){
|
||||
return pCurrentFile
|
||||
.previousSibling
|
||||
.previousSibling
|
||||
.previousSibling
|
||||
.previousSibling;
|
||||
});
|
||||
};
|
||||
|
||||
for(i = 0; i < 30; i++){
|
||||
if(!lC.previousSibling || tryCatch(lC) ) break;
|
||||
|
||||
lC = lC.previousSibling;
|
||||
}
|
||||
DOM.setCurrentFile(lC);
|
||||
DOM.preventDefault(pEvent);
|
||||
}
|
||||
|
||||
/* если нажали Enter - открываем папку*/
|
||||
else if(lKeyCode === KEY.ENTER)
|
||||
Util.exec(CloudCmd._loadDir());
|
||||
|
||||
/* если нажали <ctr>+r
|
||||
* обновляем страницу,
|
||||
* загружаем содержимое каталога
|
||||
* при этом данные берём всегда с
|
||||
* сервера, а не из кэша
|
||||
* (обновляем кэш)
|
||||
*/
|
||||
else if(lKeyCode === KEY.R && pEvent.ctrlKey){
|
||||
console.log('<ctrl>+r pressed\n' +
|
||||
'reloading page...\n' +
|
||||
'press <alt>+q to remove all key-handlers');
|
||||
|
||||
/* Программно нажимаем на кнопку перезагрузки
|
||||
* содержимого каталога
|
||||
*/
|
||||
var lRefreshIcon = DOM.getRefreshButton();
|
||||
if(lRefreshIcon){
|
||||
/* получаем название файла*/
|
||||
var lSelectedName = DOM.getCurrentName(lCurrentFile);
|
||||
|
||||
/* если нашли элемент нажимаем него
|
||||
* а если не можем - нажимаем на
|
||||
* ссылку, на которую повешен eventHandler
|
||||
* onclick
|
||||
*/
|
||||
|
||||
Util.exec( DOM.getListener(lRefreshIcon) );
|
||||
CloudCmd._currentToParent(lSelectedName);
|
||||
|
||||
DOM.preventDefault();
|
||||
}
|
||||
}
|
||||
|
||||
/* если нажали <ctrl>+d чистим кэш */
|
||||
else if(lKeyCode === KEY.D && pEvent.ctrlKey){
|
||||
Util.log('<ctrl>+d pressed\n' +
|
||||
'clearing cache...\n' +
|
||||
'press <alt>+q to remove all key-handlers');
|
||||
|
||||
DOM.Cache.clear();
|
||||
DOM.preventDefault();
|
||||
}
|
||||
|
||||
/* если нажали <alt>+q
|
||||
* убираем все обработчики
|
||||
* нажатий клавиш
|
||||
*/
|
||||
else if(lKeyCode === KEY.Q && pEvent.altKey){
|
||||
console.log('<alt>+q pressed\n' +
|
||||
'<ctrl>+r reload key-handerl - removed' +
|
||||
'<ctrl>+s clear cache key-handler - removed'+
|
||||
'press <alt>+s to to set them');
|
||||
|
||||
/* обработчик нажатий клавиш снят*/
|
||||
keyBinded = false;
|
||||
|
||||
pEvent.preventDefault();//запрет на дальнейшее действие
|
||||
}
|
||||
}
|
||||
|
||||
/* если нажали <alt>+s
|
||||
* устанавливаем все обработчики
|
||||
* нажатий клавиш
|
||||
*/
|
||||
else if(pEvent.keyCode === KEY.S && pEvent.altKey){
|
||||
/* обрабатываем нажатия на клавиши*/
|
||||
keyBinded = true;
|
||||
|
||||
console.log('<alt>+s pressed\n' +
|
||||
'<ctrl>+r reload key-handerl - set\n' +
|
||||
'<ctrl>+s clear cache key-handler - set\n' +
|
||||
'press <alt>+q to remove them');
|
||||
|
||||
pEvent.preventDefault();//запрет на дальнейшее действие
|
||||
}
|
||||
};
|
||||
|
||||
/* добавляем обработчик клавишь */
|
||||
DOM.addKeyListener(key_event);
|
||||
|
||||
/* клавиши назначены*/
|
||||
keyBinded = true;
|
||||
};
|
||||
|
||||
var CloudCommander, Util, DOM;
|
||||
(function(CloudCmd, Util, DOM){
|
||||
"use strict";
|
||||
|
||||
DOM.Images.hideLoad();
|
||||
|
||||
/* private property set or set key binding */
|
||||
var keyBinded;
|
||||
|
||||
/* Key constants*/
|
||||
CloudCmd.KEY = {
|
||||
TAB : 9,
|
||||
ENTER : 13,
|
||||
ESC : 27,
|
||||
|
||||
PAGE_UP : 33,
|
||||
PAGE_DOWN : 34,
|
||||
END : 35,
|
||||
HOME : 36,
|
||||
UP : 38,
|
||||
DOWN : 40,
|
||||
|
||||
Delete : 46,
|
||||
|
||||
D : 68,
|
||||
|
||||
G : 71,
|
||||
|
||||
O : 79,
|
||||
Q : 81,
|
||||
R : 82,
|
||||
S : 83,
|
||||
T : 84,
|
||||
|
||||
F2 : 113,
|
||||
F3 : 114,
|
||||
F4 : 115,
|
||||
F10 : 121,
|
||||
|
||||
TRA : 192 /* Typewritten Reverse Apostrophe (`) */
|
||||
};
|
||||
|
||||
var KEY = CloudCmd.KEY;
|
||||
|
||||
CloudCmd.KeyBinding = {};
|
||||
|
||||
var KeyBinding = CloudCmd.KeyBinding;
|
||||
|
||||
KeyBinding.get = function(){return keyBinded;};
|
||||
|
||||
KeyBinding.set = function(){keyBinded = true;};
|
||||
|
||||
KeyBinding.unSet = function(){keyBinded = false;};
|
||||
|
||||
KeyBinding.init = function(){
|
||||
/* saving state of tabs varibles */
|
||||
var lTabPanel = {
|
||||
left : 0,
|
||||
right : 0
|
||||
|
||||
};
|
||||
|
||||
var key_event = function(pEvent){
|
||||
/* получаем выдленный файл*/
|
||||
var lCurrentFile = DOM.getCurrentFile(), i;
|
||||
/* если клавиши можно обрабатывать*/
|
||||
if(keyBinded && pEvent){
|
||||
var lKeyCode = pEvent.keyCode;
|
||||
|
||||
/* open configuration window */
|
||||
if(lKeyCode === KEY.O && pEvent.altKey){
|
||||
console.log('openning config window...');
|
||||
|
||||
DOM.Images.showLoad({top: true});
|
||||
|
||||
Util.exec(CloudCmd.Config);
|
||||
}
|
||||
|
||||
else if(lKeyCode === KEY.G && pEvent.altKey)
|
||||
Util.exec(CloudCmd.GitHub);
|
||||
|
||||
else if(lKeyCode === KEY.D && pEvent.altKey){
|
||||
Util.exec(CloudCmd.DropBox);
|
||||
DOM.preventDefault(pEvent);
|
||||
}
|
||||
|
||||
/* если нажали таб:
|
||||
* переносим курсор на
|
||||
* правую панель, если
|
||||
* мы были на левой и
|
||||
* наоборот
|
||||
*/
|
||||
else if(lKeyCode === KEY.TAB){
|
||||
console.log('Tab pressed');
|
||||
|
||||
Util.tryCatchLog(function(){
|
||||
/* changing parent panel of curent-file */
|
||||
var lPanel = DOM.getPanel(),
|
||||
lId = lPanel.id;
|
||||
|
||||
lTabPanel[lId] = lCurrentFile;
|
||||
|
||||
lPanel = DOM.getPanel({active:false});
|
||||
lId = lPanel.id;
|
||||
|
||||
if(lTabPanel[lId])
|
||||
DOM.setCurrentFile(lTabPanel[lId]);
|
||||
else{
|
||||
var lFirstFileOnList = DOM.getByTag('li', lPanel)[2];
|
||||
|
||||
DOM.setCurrentFile(lFirstFileOnList);
|
||||
}
|
||||
});
|
||||
|
||||
DOM.preventDefault(pEvent);//запрет на дальнейшее действие
|
||||
}
|
||||
else if(lKeyCode === KEY.Delete)
|
||||
DOM.promptRemoveCurrent(lCurrentFile);
|
||||
|
||||
/* if f3 or shift+f3 or alt+f3 pressed */
|
||||
else if(lKeyCode === KEY.F3){
|
||||
var lEditor = CloudCmd[pEvent.shiftKey ?
|
||||
'Viewer' : 'Editor'];
|
||||
|
||||
Util.exec(lEditor, true);
|
||||
|
||||
DOM.preventDefault(pEvent);
|
||||
}
|
||||
|
||||
/* if f4 pressed */
|
||||
else if(lKeyCode === KEY.F4) {
|
||||
DOM.Images.showLoad();
|
||||
|
||||
Util.exec(CloudCmd.Editor);
|
||||
|
||||
DOM.preventDefault(pEvent);
|
||||
}
|
||||
else if(lKeyCode === KEY.F10 && pEvent.shiftKey){
|
||||
Util.exec(CloudCmd.Menu);
|
||||
|
||||
DOM.preventDefault(pEvent);
|
||||
}
|
||||
|
||||
else if (lKeyCode === KEY.TRA){
|
||||
DOM.Images.showLoad({top: true});
|
||||
Util.exec(CloudCmd.Terminal);
|
||||
}
|
||||
/* навигация по таблице файлов *
|
||||
* если нажали клавишу вверх *
|
||||
* выделяем предыдущую строку */
|
||||
else if(lKeyCode === KEY.UP){
|
||||
DOM.setCurrentFile( lCurrentFile.previousSibling );
|
||||
DOM.preventDefault( pEvent );
|
||||
}
|
||||
|
||||
/* если нажали клавишу в низ *
|
||||
* выделяем следующую строку */
|
||||
else if(lKeyCode === KEY.DOWN){
|
||||
DOM.setCurrentFile( lCurrentFile.nextSibling );
|
||||
DOM.preventDefault( pEvent );
|
||||
}
|
||||
|
||||
/* если нажали клавишу Home *
|
||||
* переходим к самому верхнему *
|
||||
* элементу */
|
||||
else if(lKeyCode === KEY.HOME){
|
||||
DOM.setCurrentFile( lCurrentFile.parentElement.firstChild );
|
||||
DOM.preventDefault(pEvent);
|
||||
}
|
||||
|
||||
/* если нажали клавишу End
|
||||
* выделяем последний элемент
|
||||
*/
|
||||
else if(lKeyCode === KEY.END){
|
||||
DOM.setCurrentFile( lCurrentFile.parentElement.lastElementChild );
|
||||
DOM.preventDefault( pEvent );
|
||||
}
|
||||
|
||||
/* если нажали клавишу page down
|
||||
* проматываем экран
|
||||
*/
|
||||
else if(lKeyCode === KEY.PAGE_DOWN){
|
||||
DOM.scrollByPages( DOM.getPanel(), 1 );
|
||||
|
||||
for(i=0; i<30; i++){
|
||||
if(!lCurrentFile.nextSibling) break;
|
||||
|
||||
lCurrentFile = lCurrentFile.nextSibling;
|
||||
}
|
||||
DOM.setCurrentFile(lCurrentFile);
|
||||
DOM.preventDefault(pEvent);
|
||||
}
|
||||
|
||||
/* если нажали клавишу page up
|
||||
* проматываем экран
|
||||
*/
|
||||
else if(lKeyCode === KEY.PAGE_UP){
|
||||
DOM.scrollByPages( DOM.getPanel(), -1 );
|
||||
|
||||
var lC = lCurrentFile,
|
||||
tryCatch = function(pCurrentFile){
|
||||
Util.tryCatch(function(){
|
||||
return pCurrentFile
|
||||
.previousSibling
|
||||
.previousSibling
|
||||
.previousSibling
|
||||
.previousSibling;
|
||||
});
|
||||
};
|
||||
|
||||
for(i = 0; i < 30; i++){
|
||||
if(!lC.previousSibling || tryCatch(lC) ) break;
|
||||
|
||||
lC = lC.previousSibling;
|
||||
}
|
||||
DOM.setCurrentFile(lC);
|
||||
DOM.preventDefault(pEvent);
|
||||
}
|
||||
|
||||
/* если нажали Enter - открываем папку*/
|
||||
else if(lKeyCode === KEY.ENTER)
|
||||
Util.exec(CloudCmd._loadDir());
|
||||
|
||||
/* если нажали <ctr>+r
|
||||
* обновляем страницу,
|
||||
* загружаем содержимое каталога
|
||||
* при этом данные берём всегда с
|
||||
* сервера, а не из кэша
|
||||
* (обновляем кэш)
|
||||
*/
|
||||
else if(lKeyCode === KEY.R && pEvent.ctrlKey){
|
||||
console.log('<ctrl>+r pressed\n' +
|
||||
'reloading page...\n' +
|
||||
'press <alt>+q to remove all key-handlers');
|
||||
|
||||
/* Программно нажимаем на кнопку перезагрузки
|
||||
* содержимого каталога
|
||||
*/
|
||||
var lRefreshIcon = DOM.getRefreshButton();
|
||||
if(lRefreshIcon){
|
||||
/* получаем название файла*/
|
||||
var lSelectedName = DOM.getCurrentName(lCurrentFile);
|
||||
|
||||
/* если нашли элемент нажимаем него
|
||||
* а если не можем - нажимаем на
|
||||
* ссылку, на которую повешен eventHandler
|
||||
* onclick
|
||||
*/
|
||||
|
||||
Util.exec( DOM.getListener(lRefreshIcon) );
|
||||
CloudCmd._currentToParent(lSelectedName);
|
||||
|
||||
DOM.preventDefault();
|
||||
}
|
||||
}
|
||||
|
||||
/* если нажали <ctrl>+d чистим кэш */
|
||||
else if(lKeyCode === KEY.D && pEvent.ctrlKey){
|
||||
Util.log('<ctrl>+d pressed\n' +
|
||||
'clearing cache...\n' +
|
||||
'press <alt>+q to remove all key-handlers');
|
||||
|
||||
DOM.Cache.clear();
|
||||
DOM.preventDefault();
|
||||
}
|
||||
|
||||
/* если нажали <alt>+q
|
||||
* убираем все обработчики
|
||||
* нажатий клавиш
|
||||
*/
|
||||
else if(lKeyCode === KEY.Q && pEvent.altKey){
|
||||
console.log('<alt>+q pressed\n' +
|
||||
'<ctrl>+r reload key-handerl - removed' +
|
||||
'<ctrl>+s clear cache key-handler - removed'+
|
||||
'press <alt>+s to to set them');
|
||||
|
||||
/* обработчик нажатий клавиш снят*/
|
||||
keyBinded = false;
|
||||
|
||||
pEvent.preventDefault();//запрет на дальнейшее действие
|
||||
}
|
||||
}
|
||||
|
||||
/* если нажали <alt>+s
|
||||
* устанавливаем все обработчики
|
||||
* нажатий клавиш
|
||||
*/
|
||||
else if(pEvent.keyCode === KEY.S && pEvent.altKey){
|
||||
/* обрабатываем нажатия на клавиши*/
|
||||
keyBinded = true;
|
||||
|
||||
console.log('<alt>+s pressed\n' +
|
||||
'<ctrl>+r reload key-handerl - set\n' +
|
||||
'<ctrl>+s clear cache key-handler - set\n' +
|
||||
'press <alt>+q to remove them');
|
||||
|
||||
pEvent.preventDefault();//запрет на дальнейшее действие
|
||||
}
|
||||
};
|
||||
|
||||
/* добавляем обработчик клавишь */
|
||||
DOM.addKeyListener(key_event);
|
||||
|
||||
/* клавиши назначены*/
|
||||
keyBinded = true;
|
||||
};
|
||||
|
||||
})(CloudCommander, Util, DOM);
|
||||
Loading…
Add table
Add a link
Reference in a new issue