cloudcmd/lib/client/keyBinding.js
2013-01-25 06:52:54 -05:00

308 lines
No EOL
14 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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;
};
})(CloudCommander, Util, DOM);