From 3fe6943237ed498a150ced8da93a96be3d9eebd3 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Mon, 3 Sep 2012 07:04:30 -0400 Subject: [PATCH] fixed bug with scrollIntoViewIfNeeded, when up key pressed --- client.js | 10 + lib/client/ie.js | 37 +- lib/client/keyBinding.js | 745 +++++++++++++++++++-------------------- lib/cloudfunc.js | 2 +- 4 files changed, 419 insertions(+), 375 deletions(-) diff --git a/client.js b/client.js index 229af0ea..269577ec 100644 --- a/client.js +++ b/client.js @@ -737,6 +737,16 @@ CloudClient.Utils = (function(){ lPanel.className = 'panel hidden'; }; + this.scrollIntoViewIfNeeded = function(pElement){ + var lOk = true; + if(pElement && pElement.scrollIntoViewIfNeeded) + pElement.scrollIntoViewIfNeeded(); + else lOk = false; + + return lOk; + }; + + this.CloudStatus = []; this.addCloudStatus = function(pStatus){ diff --git a/lib/client/ie.js b/lib/client/ie.js index 06942853..3f77bf91 100644 --- a/lib/client/ie.js +++ b/lib/client/ie.js @@ -57,8 +57,43 @@ var CloudCommander, $; if (pParams_o.inner)lElement += '>' + pParams_o.inner; lElement +=''; + return $(lElement) .appendTo(pParams_o.parent || document.head); - }, + + + this.scrollIntoViewIfNeeded = function(el){ + /* + * http://www.performantdesign.com/2009/08/26/scrollintoview-but-only-if-out-of-view/ + */ + var topOfPage = window.pageYOffset || + document.documentElement.scrollTop || + document.body.scrollTop; + + var heightOfPage = window.innerHeight || + document.documentElement.clientHeight || + document.body.clientHeight; + + var elY = 0; + var elH = 0; + + if (document.layers) { // NS4 + elY = el.y; + elH = el.height; + } + else { + for(var p = el; p && p.tagName != 'BODY'; p = p.offsetParent) + elY += p.offsetTop; + + elH = el.offsetHeight; + } + + if ((topOfPage + heightOfPage) < (elY + elH)) + el.scrollIntoView(false); + + else if (elY < topOfPage) + el.scrollIntoView(true); + }; + })(); \ No newline at end of file diff --git a/lib/client/keyBinding.js b/lib/client/keyBinding.js index 0a5f51ca..795e05ad 100644 --- a/lib/client/keyBinding.js +++ b/lib/client/keyBinding.js @@ -1,374 +1,373 @@ -var CloudCommander; - -/* Key constants*/ -CloudCommander.KEY = { - TAB : 9, - ENTER : 13, - ESC : 27, - - PPAGE_UP : 33, - PAGE_DOWN : 34, - END : 35, - HOME : 36, - UP : 38, - DOWN : 40, - - D : 68, - - O : 79, - Q : 81, - R : 82, - S : 83, - - F2 : 113, - F3 : 114, - F4 : 115, - F10 : 121 -}; - -CloudCommander.keyBinding = (function(){ - "use strict"; - - var Util = new CloudCommander.Utils(); - - /* saving state of tabs varibles */ - var lTabPanel = { - left : 0, - right : 0 - - }; - - var lKEY = CloudCommander.KEY; - - var key_event = function(event){ - /* получаем выдленный файл*/ - var lCurrentFile = Util.getCurrentFile(), - lName, i; - /* если клавиши можно обрабатывать*/ - if(CloudCommander.keyBinded && event){ - - /* open configuration window */ - if(event.keyCode === lKEY.O && event.altKey){ - console.log('openning config window...'); - - Util.Images.showLoad(); - if (typeof CloudCommander.Config === 'function') - CloudCommander.Config(); - - } - - /* если нажали таб: - * переносим курсор на - * правую панель, если - * мы были на левой и - * наоборот - */ - if(event.keyCode === lKEY.TAB){ - console.log('Tab pressed'); - - try{ - /* changing parent panel of curent-file */ - var lPanel = Util.getPanel(); - var lId = lPanel.id; - - lTabPanel[lId] = lCurrentFile; - - lPanel = Util.getPanel({active:false}); - lId = lPanel.id; - - - if(lTabPanel[lId]) - Util.setCurrentFile(lTabPanel[lId]); - else{ - var lFirstFileOnList = Util.getByTag('li', lPanel)[2]; - - Util.setCurrentFile(lFirstFileOnList); - } - - }catch(error){console.log(error);} - - event.preventDefault();//запрет на дальнейшее действие - } - /* if f2 pressed */ - else if(event.keyCode === lKEY.F2){ - - } - - /* if f3 or shift+f3 pressed */ - else if(event.keyCode === lKEY.F3){ - Util.Images.showLoad(); - if(event.shiftKey && - typeof CloudCommander.Viewer === 'function') - CloudCommander.Viewer(lCurrentFile); - - else if (typeof CloudCommander.Editor === 'function') - CloudCommander.Editor(lCurrentFile, true); - - event.preventDefault();//запрет на дальнейшее действие - } - - /* if alt+f3 pressed */ - else if(event.keyCode === lKEY.F3 && - event.altKey){ - Util.Images.showLoad(); - if (typeof CloudCommander.Terminal === 'function') - CloudCommander.Terminal(); - - event.preventDefault();//запрет на дальнейшее действие - } - - /* if f4 pressed */ - else if(event.keyCode === lKEY.F4) { - Util.Images.showLoad(); - - if (typeof CloudCommander.Editor === 'function') - CloudCommander.Editor(lCurrentFile); - - event.preventDefault();//запрет на дальнейшее действие - } - else if(event.keyCode === lKEY.F10 && - event.shiftKey){ - if (typeof CloudCommander.Menu === 'function') - CloudCommander.Menu(); - - event.preventDefault();//запрет на дальнейшее действие - } - /* навигация по таблице файлов*/ - /* если нажали клавишу вверх*/ - else if(event.keyCode === lKEY.UP){ - /* если ненайдены выделенные файлы - выходим*/ - if(!lCurrentFile) return; - - /* если это строка существет и - * если она не заголовок - * файловой таблицы - */ - lCurrentFile = lCurrentFile.previousSibling; - if(lCurrentFile){ - /* выделяем предыдущую строку*/ - Util.setCurrentFile(lCurrentFile); - - /* scrolling to current file*/ - lCurrentFile = lCurrentFile.previousSibling; - if(lCurrentFile) - lCurrentFile.scrollIntoViewIfNeeded(); - } - - event.preventDefault();//запрет на дальнейшее действие - } - - /* если нажали клавишу в низ*/ - else if(event.keyCode === lKEY.DOWN){ - /* если ненайдены выделенные файлы - выходим*/ - if(!lCurrentFile)return; - - /* если это не последняя строка */ - if(lCurrentFile.nextSibling){ - /* выделяем следующую строку*/ - Util.setCurrentFile(lCurrentFile.nextSibling); - - /* scrolling to current file*/ - lCurrentFile.nextSibling.scrollIntoViewIfNeeded(); - - event.preventDefault();//запрет на дальнейшее действие - } - } - - /* если нажали клавишу Home - * переходим к самому верхнему - * элементу - */ - else if(event.keyCode === lKEY.HOME){ - /* получаем первый элемент - * пропускаем путь и заголовки столбиков - * выделяем верхий файл - */ - Util.setCurrentFile(lCurrentFile - .parentElement.children[2]); - - /* move scrollbar to top */ - Util.getPanel().scrollByLines(-100000000000000); - - event.preventDefault();//запрет на дальнейшее действие - } - - /* если нажали клавишу End - * выделяем последний элемент - */ - else if( event.keyCode === lKEY.END){ - /* выделяем самый нижний файл */ - Util.setCurrentFile(lCurrentFile - .parentElement.lastElementChild); - - /* move scrollbar to bottom*/ - Util.getPanel().scrollByLines(100000000000000); - - event.preventDefault();//запрет на дальнейшее действие - } - - /* если нажали клавишу page down - * проматываем экран - */ - else if(event.keyCode === lKEY.PAGE_DOWN){ - Util.getPanel().scrollByPages(1); - - for(i=0; i<30; i++){ - if(!lCurrentFile.nextSibling) break; - - lCurrentFile = lCurrentFile.nextSibling; - } - Util.setCurrentFile(lCurrentFile); - - event.preventDefault();//запрет на дальнейшее действие - } - - /* если нажали клавишу page up - * проматываем экран - */ - else if(event.keyCode === lKEY.PAGE_UP){ - Util.getPanel().scrollByPages(-1); - - for(i=0; i<30; i++){ - if(!lCurrentFile.previousSibling) break; - else try{ - lCurrentFile - .previousSibling - .previousSibling - .previousSibling - .previousSibling; - } - catch(pError){ - break; - } - lCurrentFile = lCurrentFile.previousSibling; - } - Util.setCurrentFile(lCurrentFile); - - event.preventDefault();//запрет на дальнейшее действие - } - - /* если нажали Enter - открываем папку*/ - else if(event.keyCode === lKEY.ENTER){ - /* если ненайдены выделенные файлы - выходим*/ - if(!lCurrentFile)return; - - /* из него достаём спан с именем файла*/ - lName = Util.getByClass('name', lCurrentFile); - /* если нету (что вряд ли) - выходим*/ - if(!lName)return false; - /* достаём все ссылки*/ - var lATag = Util.getByTag('a', lName[0]); - /* если нету - выходим */ - if(!lATag)return false; - - /* вызываем ajaxload привязанный через changelinks - * пробуем нажать на ссылку, если не получиться - * (opera, ie), вызываем событие onclick, - */ - - if(lCurrentFile.onclick)lCurrentFile.onclick(true); - else try{ - lATag[0].click(); - } - catch(error){ - console.log(error); - } - - event.preventDefault();//запрет на дальнейшее действие - } - - /* если нажали +r - * обновляем страницу, - * загружаем содержимое каталога - * при этом данные берём всегда с - * сервера, а не из кэша - * (обновляем кэш) - */ - else if(event.keyCode === lKEY.R && - event.ctrlKey){ - console.log('+r pressed'); - console.log('reloading page...'); - console.log('press +q to remove all key-handlers'); - /* Программно нажимаем на кнопку перезагрузки - * содержимого каталога - */ - var lRefreshIcon = Util.getRefreshButton(); - if(lRefreshIcon){ - /* получаем название файла*/ - var lSelectedName = Util - .getByTag('a', lCurrentFile)[0].textContent; - - /* если нашли элемент нажимаем него - * а если не можем - нажимаем на - * ссылку, на которую повешен eventHandler - * onclick - */ - lRefreshIcon.onclick(); - - CloudCommander._currentToParent(lSelectedName); - - event.preventDefault();//запрет на дальнейшее действие - } - } - - /* если нажали +d чистим кэш */ - else if(event.keyCode === lKEY.D && - event.ctrlKey){ - console.log('+d pressed'); - console.log('clearing cache...'); - console.log('press +q to remove all key-handlers'); - - var lClearCache = Util.getById('clear-cache'); - if(lClearCache && lClearCache.onclick) - lClearCache.onclick(); - - event.preventDefault();//запрет на дальнейшее действие - } - - /* если нажали +q - * убираем все обработчики - * нажатий клавиш - */ - else if(event.keyCode === lKEY.Q && - event.altKey){ - //document.removeEventListener('keydown', key_event,false); - console.log('+q pressed'); - console.log('+r reload key-handerl - removed'); - console.log('+s clear cache key-handler - removed'); - console.log('press +s to to set them'); - - /* обработчик нажатий клавиш снят*/ - CloudCommander.keyBinded = false; - - event.preventDefault();//запрет на дальнейшее действие - } - } - - /* если нажали +s - * устанавливаем все обработчики - * нажатий клавиш - */ - else if(event.keyCode === lKEY.S && - event.altKey){ - /* обрабатываем нажатия на клавиши*/ - CloudCommander.keyBinded = true; - - console.log('+s pressed'); - console.log('+r reload key-handerl - set'); - console.log('+s clear cache key-handler - set'); - console.log('press +q to remove them'); - - event.preventDefault();//запрет на дальнейшее действие - } - - return false; - }; - - /* добавляем обработчик клавишь */ - if(document.addEventListener) - document.addEventListener('keydown', key_event,false); - else document.onkeydown = key_event; - - /* клавиши назначены*/ - CloudCommander.keyBinded=true; +var CloudCommander; + +/* Key constants*/ +CloudCommander.KEY = { + TAB : 9, + ENTER : 13, + ESC : 27, + + PPAGE_UP : 33, + PAGE_DOWN : 34, + END : 35, + HOME : 36, + UP : 38, + DOWN : 40, + + D : 68, + + O : 79, + Q : 81, + R : 82, + S : 83, + + F2 : 113, + F3 : 114, + F4 : 115, + F10 : 121 +}; + +CloudCommander.keyBinding = (function(){ + "use strict"; + + var Util = new CloudCommander.Utils(); + + /* saving state of tabs varibles */ + var lTabPanel = { + left : 0, + right : 0 + + }; + + var lKEY = CloudCommander.KEY; + + var key_event = function(event){ + /* получаем выдленный файл*/ + var lCurrentFile = Util.getCurrentFile(), + lName, i; + /* если клавиши можно обрабатывать*/ + if(CloudCommander.keyBinded && event){ + + /* open configuration window */ + if(event.keyCode === lKEY.O && event.altKey){ + console.log('openning config window...'); + + Util.Images.showLoad(); + if (typeof CloudCommander.Config === 'function') + CloudCommander.Config(); + + } + + /* если нажали таб: + * переносим курсор на + * правую панель, если + * мы были на левой и + * наоборот + */ + if(event.keyCode === lKEY.TAB){ + console.log('Tab pressed'); + + try{ + /* changing parent panel of curent-file */ + var lPanel = Util.getPanel(); + var lId = lPanel.id; + + lTabPanel[lId] = lCurrentFile; + + lPanel = Util.getPanel({active:false}); + lId = lPanel.id; + + + if(lTabPanel[lId]) + Util.setCurrentFile(lTabPanel[lId]); + else{ + var lFirstFileOnList = Util.getByTag('li', lPanel)[2]; + + Util.setCurrentFile(lFirstFileOnList); + } + + }catch(error){console.log(error);} + + event.preventDefault();//запрет на дальнейшее действие + } + /* if f2 pressed */ + else if(event.keyCode === lKEY.F2){ + + } + + /* if f3 or shift+f3 pressed */ + else if(event.keyCode === lKEY.F3){ + Util.Images.showLoad(); + if(event.shiftKey && + typeof CloudCommander.Viewer === 'function') + CloudCommander.Viewer(lCurrentFile); + + else if (typeof CloudCommander.Editor === 'function') + CloudCommander.Editor(lCurrentFile, true); + + event.preventDefault();//запрет на дальнейшее действие + } + + /* if alt+f3 pressed */ + else if(event.keyCode === lKEY.F3 && + event.altKey){ + Util.Images.showLoad(); + if (typeof CloudCommander.Terminal === 'function') + CloudCommander.Terminal(); + + event.preventDefault();//запрет на дальнейшее действие + } + + /* if f4 pressed */ + else if(event.keyCode === lKEY.F4) { + Util.Images.showLoad(); + + if (typeof CloudCommander.Editor === 'function') + CloudCommander.Editor(lCurrentFile); + + event.preventDefault();//запрет на дальнейшее действие + } + else if(event.keyCode === lKEY.F10 && + event.shiftKey){ + if (typeof CloudCommander.Menu === 'function') + CloudCommander.Menu(); + + event.preventDefault();//запрет на дальнейшее действие + } + /* навигация по таблице файлов*/ + /* если нажали клавишу вверх*/ + else if(event.keyCode === lKEY.UP){ + /* если ненайдены выделенные файлы - выходим*/ + if(!lCurrentFile) return; + + /* если это строка существет и + * если она не заголовок + * файловой таблицы + */ + lCurrentFile = lCurrentFile.previousSibling; + if(lCurrentFile){ + /* выделяем предыдущую строку*/ + Util.setCurrentFile(lCurrentFile); + + /* scrolling to current file*/ + Util.scrollIntoViewIfNeeded(lCurrentFile); + } + + event.preventDefault();//запрет на дальнейшее действие + } + + /* если нажали клавишу в низ*/ + else if(event.keyCode === lKEY.DOWN){ + /* если ненайдены выделенные файлы - выходим*/ + if(!lCurrentFile)return; + + lCurrentFile = lCurrentFile.nextSibling; + /* если это не последняя строка */ + if(lCurrentFile){ + /* выделяем следующую строку*/ + Util.setCurrentFile(lCurrentFile); + + /* scrolling to current file*/ + Util.scrollIntoViewIfNeeded(lCurrentFile); + + event.preventDefault();//запрет на дальнейшее действие + } + } + + /* если нажали клавишу Home + * переходим к самому верхнему + * элементу + */ + else if(event.keyCode === lKEY.HOME){ + /* получаем первый элемент + * пропускаем путь и заголовки столбиков + * выделяем верхий файл + */ + Util.setCurrentFile(lCurrentFile + .parentElement.children[2]); + + /* move scrollbar to top */ + Util.getPanel().scrollByLines(-100000000000000); + + event.preventDefault();//запрет на дальнейшее действие + } + + /* если нажали клавишу End + * выделяем последний элемент + */ + else if( event.keyCode === lKEY.END){ + /* выделяем самый нижний файл */ + Util.setCurrentFile(lCurrentFile + .parentElement.lastElementChild); + + /* move scrollbar to bottom*/ + Util.getPanel().scrollByLines(100000000000000); + + event.preventDefault();//запрет на дальнейшее действие + } + + /* если нажали клавишу page down + * проматываем экран + */ + else if(event.keyCode === lKEY.PAGE_DOWN){ + Util.getPanel().scrollByPages(1); + + for(i=0; i<30; i++){ + if(!lCurrentFile.nextSibling) break; + + lCurrentFile = lCurrentFile.nextSibling; + } + Util.setCurrentFile(lCurrentFile); + + event.preventDefault();//запрет на дальнейшее действие + } + + /* если нажали клавишу page up + * проматываем экран + */ + else if(event.keyCode === lKEY.PAGE_UP){ + Util.getPanel().scrollByPages(-1); + + for(i=0; i<30; i++){ + if(!lCurrentFile.previousSibling) break; + else try{ + lCurrentFile + .previousSibling + .previousSibling + .previousSibling + .previousSibling; + } + catch(pError){ + break; + } + lCurrentFile = lCurrentFile.previousSibling; + } + Util.setCurrentFile(lCurrentFile); + + event.preventDefault();//запрет на дальнейшее действие + } + + /* если нажали Enter - открываем папку*/ + else if(event.keyCode === lKEY.ENTER){ + /* если ненайдены выделенные файлы - выходим*/ + if(!lCurrentFile)return; + + /* из него достаём спан с именем файла*/ + lName = Util.getByClass('name', lCurrentFile); + /* если нету (что вряд ли) - выходим*/ + if(!lName)return false; + /* достаём все ссылки*/ + var lATag = Util.getByTag('a', lName[0]); + /* если нету - выходим */ + if(!lATag)return false; + + /* вызываем ajaxload привязанный через changelinks + * пробуем нажать на ссылку, если не получиться + * (opera, ie), вызываем событие onclick, + */ + + if(lCurrentFile.onclick)lCurrentFile.onclick(true); + else try{ + lATag[0].click(); + } + catch(error){ + console.log(error); + } + + event.preventDefault();//запрет на дальнейшее действие + } + + /* если нажали +r + * обновляем страницу, + * загружаем содержимое каталога + * при этом данные берём всегда с + * сервера, а не из кэша + * (обновляем кэш) + */ + else if(event.keyCode === lKEY.R && + event.ctrlKey){ + console.log('+r pressed'); + console.log('reloading page...'); + console.log('press +q to remove all key-handlers'); + /* Программно нажимаем на кнопку перезагрузки + * содержимого каталога + */ + var lRefreshIcon = Util.getRefreshButton(); + if(lRefreshIcon){ + /* получаем название файла*/ + var lSelectedName = Util + .getByTag('a', lCurrentFile)[0].textContent; + + /* если нашли элемент нажимаем него + * а если не можем - нажимаем на + * ссылку, на которую повешен eventHandler + * onclick + */ + lRefreshIcon.onclick(); + + CloudCommander._currentToParent(lSelectedName); + + event.preventDefault();//запрет на дальнейшее действие + } + } + + /* если нажали +d чистим кэш */ + else if(event.keyCode === lKEY.D && + event.ctrlKey){ + console.log('+d pressed'); + console.log('clearing cache...'); + console.log('press +q to remove all key-handlers'); + + var lClearCache = Util.getById('clear-cache'); + if(lClearCache && lClearCache.onclick) + lClearCache.onclick(); + + event.preventDefault();//запрет на дальнейшее действие + } + + /* если нажали +q + * убираем все обработчики + * нажатий клавиш + */ + else if(event.keyCode === lKEY.Q && + event.altKey){ + //document.removeEventListener('keydown', key_event,false); + console.log('+q pressed'); + console.log('+r reload key-handerl - removed'); + console.log('+s clear cache key-handler - removed'); + console.log('press +s to to set them'); + + /* обработчик нажатий клавиш снят*/ + CloudCommander.keyBinded = false; + + event.preventDefault();//запрет на дальнейшее действие + } + } + + /* если нажали +s + * устанавливаем все обработчики + * нажатий клавиш + */ + else if(event.keyCode === lKEY.S && + event.altKey){ + /* обрабатываем нажатия на клавиши*/ + CloudCommander.keyBinded = true; + + console.log('+s pressed'); + console.log('+r reload key-handerl - set'); + console.log('+s clear cache key-handler - set'); + console.log('press +q to remove them'); + + event.preventDefault();//запрет на дальнейшее действие + } + + return false; + }; + + /* добавляем обработчик клавишь */ + if(document.addEventListener) + document.addEventListener('keydown', key_event,false); + else document.onkeydown = key_event; + + /* клавиши назначены*/ + CloudCommander.keyBinded=true; }); \ No newline at end of file diff --git a/lib/cloudfunc.js b/lib/cloudfunc.js index 733b5851..92a37c3c 100644 --- a/lib/cloudfunc.js +++ b/lib/cloudfunc.js @@ -219,7 +219,7 @@ CloudFunc.getUserUIDsAndNames=function(pPasswd_s){ * возвращаеться массив каталогов * @url - адрес каталога */ -CloudFunc._getDirPath=function(url) +CloudFunc._getDirPath = function(url) { var folders=[]; var i=0;