diff --git a/ChangeLog b/ChangeLog
index 4cef859b..de3b183d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -50,6 +50,8 @@ from storage folder.
* Fixed Util.time and Util.timeEnd
+* Added ability to select files with Insert key.
+
2012.03.01, Version 0.1.9
diff --git a/cloudcmd.js b/cloudcmd.js
index 5f3cbd35..d2e44b49 100644
--- a/cloudcmd.js
+++ b/cloudcmd.js
@@ -32,11 +32,10 @@
PATH_TMPL = HTMLDIR + 'path.html',
- Template, PathTemplate,
+ FileTemplate, PathTemplate,
FS = CloudFunc.FS;
- /* reinit main dir os if we on
- * Win32 should be backslashes */
+ /* reinit main dir os if we on Win32 should be backslashes */
DIR = main.DIR;
readConfig(init);
@@ -46,8 +45,7 @@
* additional processing of index file
*/
function indexProcessing(pData){
- var lReplace_s,
- lData = pData.data,
+ var lData = pData.data,
lAdditional = pData.additional;
/*
@@ -56,9 +54,9 @@
* минифицированый
*/
if(Minify.allowed.css){
- var lPath = '/' + Util.removeStr(Minify.MinFolder, DIR);
- lReplace_s = '';
- lData = Util.removeStr(lData, lReplace_s)
+ var lPath = '/' + Util.removeStr(Minify.MinFolder, DIR),
+ lReplace = '';
+ lData = Util.removeStr(lData, lReplace)
.replace('/css/style.css', lPath + 'all.min.css');
}
@@ -131,7 +129,7 @@
/**
* rest interface
- * @pConnectionData {request, responce}
+ * @pParams pConnectionData {request, responce}
*/
function rest(pConnectionData){
return Util.exec(main.rest, pConnectionData);
@@ -200,7 +198,7 @@
if(pErrors)
Util.log(pErrors);
else{
- Template = pFiles[FILE_TMPL].toString();
+ FileTemplate = pFiles[FILE_TMPL].toString();
PathTemplate = pFiles[PATH_TMPL].toString();
if(Config.ssl)
@@ -312,7 +310,7 @@
p.name = Minify.allowed.html ? Minify.getName(INDEX) : INDEX;
fs.readFile(p.name, function(pError, pData){
if(!pError){
- var lPanel = CloudFunc.buildFromJSON(pJSON, Template, PathTemplate),
+ var lPanel = CloudFunc.buildFromJSON(pJSON, FileTemplate, PathTemplate),
lList = '
' +
'';
diff --git a/css/style.css b/css/style.css
index 38271fae..c838cb9e 100644
--- a/css/style.css
+++ b/css/style.css
@@ -1,352 +1,356 @@
-/*
-@import url(//fonts.googleapis.com/css?family=Droid+Sans+Mono);
-*/
-
-/* символьный шрифт от гитхаба*/
-@font-face {
- font-family: "GeneralFoundicons";
- src: url('/font/general_foundicons.woff') format('woff');
- font-weight: normal;
- font-style: normal;
-}
-
-/* http://fontello.com/ */
-@font-face {
- font-family: 'Fontello';
- src: url("/font/fontello.eot");
- src: url("/font/fontello.eot?#iefix") format('embedded-opentype'), url("/font/fontello.woff") format('woff'), url("/font/fontello.ttf") format('truetype'), url("/font/fontello.svg#cloudcmd") format('svg');
- font-weight: normal;
- font-style: normal;
-}
-
-@font-face {
- font-family: 'Droid Sans Mono';
- font-style: normal;
- font-weight: normal;
- src: local('Droid Sans Mono'), local('DroidSansMono'), url('//themes.googleusercontent.com/static/fonts/droidsansmono/v4/ns-m2xQYezAtqh7ai59hJUYuTAAIFFn5GTWtryCmBQ4.woff') format('woff');
-}
-
-body{
- font:16px "Droid Sans Mono";
- background-color:white;
-}
-
-.path-icon{
- position: relative;
- top: 3px;
- left: -4px;
- display: inline-block;
- /* размер иконки и позиция на png-файле*/
- width: 15px;
- height: 15px;
- font-family:'FoundationIconsGeneralEnclosed';
- font-size:30px;
- color: #46A4C3;/*#55BF3F; green*/
- text-shadow:black 0 2px 1px;
-}
-.path-icon:hover{
- cursor:pointer;
-}
-.path-icon:active{
- position: relative;
- top: 4px;
- text-shadow:black 0 0 1px;
-}
-.icon{
- display:inline-block;
- width:16px;
- height:16px;
- margin-left:0.5%;
- /* font-family: 'GeneralFoundicons'; */
- font-family: 'Fontello';
-}
-.error::before{
- position: relative;
- font-size: 14px;
- color: rgb(222, 41, 41);
- cursor :default;
- content: '\2757';
-}
-.loading{
- position:relative;
- top:1px;
- background:url(/img/spinner.gif);
-}
-.error:hover{
- color:rgb(222, 41, 41);
- color:rgba(222, 41, 41, 0.81);
-}
-.refresh-icon{
- background:url(/img/panel_refresh.png) no-repeat;
-}
-.refresh-icon:active{
- /*background-position-y: -15px;*/
- background:url(/img/panel_refresh.png) 0 -15px no-repeat;
-}
-
-.cmd-button{
- width: 10%;
- margin: 20px 2px 0 2px;
- overflow: hidden;
- color: rgb(49,123,249);
- text-overflow: ellipsis;
- white-space: nowrap;
- background-color: white;
- border: 1.5px solid rgba(49,123,249,.40);
-}
-
-.cmd-button:hover{
- border: 1.5px solid rgb(0,0,0);
-}
-
-.cmd-button:active{
- color: white;
- background-color: rgb(49,123,249);
-}
-
-.clear-cache{
- margin-right: 6px;
- margin-left: 7px;
- background:url(/img/console_clear.png) -4px -4px no-repeat;
-}
-.clear-cache:active{
- top:5px;
-}
-
-.links{
- color:red;
-}
-
-.mini-icon {
- position: relative;
- top: 2px;
- left: -5px;
- float: left;
- width: 16px;
- height: 16px;
- margin-left: 6px;
- /* отступ перед картинкой
- * для нормального отображения
- * рамки
- */
-}
-/* уменьшаем отступ
- * между между иконкой и
- * именем файла во время
- * установления курсора
- */
-.current-file > .mini-icon{
- left: -6px;
-}
-/* freeupex */
-.directory{
- /*list-style-image*/
- background-image:url('/img/dir.png');
- background-position: 0 0;
- background-repeat: no-repeat;
-}
-.text-file{
- /*list-style-image*/
- background-image:url('/img/txt.png');
- background-position: 0 0;
- background-repeat: no-repeat;
-}
-#fm{
- height: 90%;
- margin: 26px 26px 0 26px;
-}
-.fm-header{
- font-weight: bold;
-}
-#path{
- margin-left:1.5%;
-}
-.left, #left{
- float:left;
-}
-/* фон файла, на котором курсор*/
-.current-file{
- border: 1.5px solid rgba(49, 123, 249, .40);
-}
-.selected-file{
- color:white;
- background-color: rgb(49, 123, 249);
- background-color: rgba(49, 123, 249, .40);
-}
-
-.right, #right{
- float:right;
-}
-.panel{
- width: 46%;
- overflow-y: auto;
- border: 1.5px solid rgba(49, 123, 249, .40);
-}
-#keyspanel{
- text-align: center;
-}
-/* информация о файлах и папках*/
-.name{
- float: left;
- width: 37%;
- /* если длина имени файла больше 16 символов
- * отрезаем лишнее, оставляя лишь 16,
- * и добавляем две точки и тайтл
- */
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
-}
-.size{
- float:left;
- width:16%;
- /* Ставим отступ, что бы
- * size не налазил на uid
- * (owner)
- */
- margin-right: 27px;
- /* Ставим выравнивание,
- * что бы размер был в
- * одной ровной колонке
- */
- text-align: right;
-}
-.mode{
- float: right;
- width: 25%;
-}
-
-/* changin ul to panel for high speed parsing*/
-.panel, li{
- list-style-type:none;
- /* making cursor just arrow,
- * not text editing cursor
- */
- cursor:default;
-}
-button{
- width:10%;
-}
-a{
- text-decoration:none;
-}
-a:hover, a:active {
- color: #06e;
- cursor:pointer;
-}
-
-/* Если размер окна очень маленький
- * располагаем имя и атрибуты файла
- * друг-под-другом
-*/
-/* responsive design */
-@media only screen and (max-width: 600px){
- .panel{
- width:94% !important;
- }
- /* если правая панель не помещаеться - прячем её */
- #right{
- display:none;
- }
- /* текущий файл под курсором */
- .current-file{
- background-color: rgb(49, 123, 249);
- background-color: rgba(49, 123, 249, .40);
- color:white;
- }
- /* делаем иконки под курсом белыми*/
- .current-file > .mini-icon{
- color:white;
- }
- .current-file > .text-file::before{
- color:white;
- }
-
- .fm-header{
- display:none;
- }
-
- /* меняем иконки на шрифтовые*/
- .mini-icon {
- color: rgb(246, 224, 124);
- color: rgba(246, 224, 124, 0.56);
- font: 60px 'Fontello';
- width: 40%;
- height: 0;
- margin-left: 0;
- float: right;
- position: relative;
- top: 10px
- }
- .directory::before{
- content: '\1f4c1';
- }
- .text-file::before{
- color: rgb(26, 224, 124);
- color: rgba(26, 224, 124, 0.56);
- content: '\1f4c4';
- }
- .text-file{
- background-image:none;
- }
-
- /* убираем заголовок*/
- .fm_header{
- display:none;
- }
- .mode,.size,.owner{
- /* располагаем элементы
- * один под другим
- */
- display: table;
- float: none;
- width: 0;
-
- text-align: left;
- }
- /* выводим заголовки рядом с полями */
- .name::before{
- content: 'name:';
- font-weight: bold;
- font-size: 13px;
- }
- .mode::before{
- content: 'mode:';
- font-weight: bold;
- font-size: 13px;
- }
- .size::before{
- content: 'size:';
- font-weight: bold;
- font-size: 13px;
- }
- .owner::before{
- content: 'owner:';
- font-weight: bold;
- font-size: 13px;
- }
-
- .name{
- float: none;
- width:100%;
- font-size: 18px;
- }
-}
-@media only screen and (min-width: 601px) and (max-width: 785px){
- .panel{
- width:94% !important;
- }
- #right{
- display:none;
- }
-}
-
-@media only screen and (min-width:786px) and (max-width: 1155px){
- .panel{
- width:94% !important;
- }
- /* если правая панель не помещаеться - прячем её */
- #right{
- display:none;
- }
+/*
+@import url(//fonts.googleapis.com/css?family=Droid+Sans+Mono);
+*/
+
+/* символьный шрифт от гитхаба*/
+@font-face {
+ font-family: "GeneralFoundicons";
+ src: url('/font/general_foundicons.woff') format('woff');
+ font-weight: normal;
+ font-style: normal;
+}
+
+/* http://fontello.com/ */
+@font-face {
+ font-family: 'Fontello';
+ src: url("/font/fontello.eot");
+ src: url("/font/fontello.eot?#iefix") format('embedded-opentype'), url("/font/fontello.woff") format('woff'), url("/font/fontello.ttf") format('truetype'), url("/font/fontello.svg#cloudcmd") format('svg');
+ font-weight: normal;
+ font-style: normal;
+}
+
+@font-face {
+ font-family: 'Droid Sans Mono';
+ font-style: normal;
+ font-weight: normal;
+ src: local('Droid Sans Mono'), local('DroidSansMono'), url('//themes.googleusercontent.com/static/fonts/droidsansmono/v4/ns-m2xQYezAtqh7ai59hJUYuTAAIFFn5GTWtryCmBQ4.woff') format('woff');
+}
+
+body{
+ font:16px "Droid Sans Mono";
+ background-color:white;
+}
+
+.path-icon{
+ position: relative;
+ top: 3px;
+ left: -4px;
+ display: inline-block;
+ /* размер иконки и позиция на png-файле*/
+ width: 15px;
+ height: 15px;
+ font-family:'FoundationIconsGeneralEnclosed';
+ font-size:30px;
+ color: #46A4C3;/*#55BF3F; green*/
+ text-shadow:black 0 2px 1px;
+}
+.path-icon:hover{
+ cursor:pointer;
+}
+.path-icon:active{
+ position: relative;
+ top: 4px;
+ text-shadow:black 0 0 1px;
+}
+.icon{
+ display:inline-block;
+ width:16px;
+ height:16px;
+ margin-left:0.5%;
+ /* font-family: 'GeneralFoundicons'; */
+ font-family: 'Fontello';
+}
+.error::before{
+ position: relative;
+ font-size: 14px;
+ color: rgb(222, 41, 41);
+ cursor :default;
+ content: '\2757';
+}
+.loading{
+ position:relative;
+ top:1px;
+ background:url(/img/spinner.gif);
+}
+.error:hover{
+ color:rgb(222, 41, 41);
+ color:rgba(222, 41, 41, 0.81);
+}
+.refresh-icon{
+ background:url(/img/panel_refresh.png) no-repeat;
+}
+.refresh-icon:active{
+ /*background-position-y: -15px;*/
+ background:url(/img/panel_refresh.png) 0 -15px no-repeat;
+}
+
+.cmd-button{
+ width: 10%;
+ margin: 20px 2px 0 2px;
+ overflow: hidden;
+ color: rgb(49,123,249);
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ background-color: white;
+ border: 1.5px solid rgba(49,123,249,.40);
+}
+
+.cmd-button:hover{
+ border: 1.5px solid rgb(0,0,0);
+}
+
+.cmd-button:active{
+ color: white;
+ background-color: rgb(49,123,249);
+}
+
+.clear-cache{
+ margin-right: 6px;
+ margin-left: 7px;
+ background:url(/img/console_clear.png) -4px -4px no-repeat;
+}
+.clear-cache:active{
+ top:5px;
+}
+
+.links{
+ color:red;
+}
+
+.mini-icon {
+ position: relative;
+ top: 2px;
+ left: -5px;
+ float: left;
+ width: 16px;
+ height: 16px;
+ margin-left: 6px;
+ /* отступ перед картинкой
+ * для нормального отображения
+ * рамки
+ */
+}
+/* уменьшаем отступ
+ * между между иконкой и
+ * именем файла во время
+ * установления курсора
+ */
+.current-file > .mini-icon{
+ left: -6px;
+}
+/* freeupex */
+.directory{
+ /*list-style-image*/
+ background-image:url('/img/dir.png');
+ background-position: 0 0;
+ background-repeat: no-repeat;
+}
+.text-file{
+ /*list-style-image*/
+ background-image:url('/img/txt.png');
+ background-position: 0 0;
+ background-repeat: no-repeat;
+}
+#fm{
+ height: 90%;
+ margin: 26px 26px 0 26px;
+}
+.fm-header{
+ font-weight: bold;
+}
+#path{
+ margin-left:1.5%;
+}
+.left, #left{
+ float:left;
+}
+/* фон файла, на котором курсор*/
+.current-file{
+ border: 1.5px solid rgba(49, 123, 249, .40);
+}
+.selected-file{
+ color:white;
+ background-color: rgb(49, 123, 249);
+ background-color: rgba(49, 123, 249, .40);
+}
+
+.selected-file .name > a{
+ color:white;
+}
+
+.right, #right{
+ float:right;
+}
+.panel{
+ width: 46%;
+ overflow-y: auto;
+ border: 1.5px solid rgba(49, 123, 249, .40);
+}
+#keyspanel{
+ text-align: center;
+}
+/* информация о файлах и папках*/
+.name{
+ float: left;
+ width: 37%;
+ /* если длина имени файла больше 16 символов
+ * отрезаем лишнее, оставляя лишь 16,
+ * и добавляем две точки и тайтл
+ */
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+.size{
+ float:left;
+ width:16%;
+ /* Ставим отступ, что бы
+ * size не налазил на uid
+ * (owner)
+ */
+ margin-right: 27px;
+ /* Ставим выравнивание,
+ * что бы размер был в
+ * одной ровной колонке
+ */
+ text-align: right;
+}
+.mode{
+ float: right;
+ width: 25%;
+}
+
+/* changin ul to panel for high speed parsing*/
+.panel, li{
+ list-style-type:none;
+ /* making cursor just arrow,
+ * not text editing cursor
+ */
+ cursor:default;
+}
+button{
+ width:10%;
+}
+a{
+ text-decoration:none;
+}
+a:hover, a:active {
+ color: #06e;
+ cursor:pointer;
+}
+
+/* Если размер окна очень маленький
+ * располагаем имя и атрибуты файла
+ * друг-под-другом
+*/
+/* responsive design */
+@media only screen and (max-width: 600px){
+ .panel{
+ width:94% !important;
+ }
+ /* если правая панель не помещаеться - прячем её */
+ #right{
+ display:none;
+ }
+ /* текущий файл под курсором */
+ .current-file{
+ background-color: rgb(49, 123, 249);
+ background-color: rgba(49, 123, 249, .40);
+ color:white;
+ }
+ /* делаем иконки под курсом белыми*/
+ .current-file > .mini-icon{
+ color:white;
+ }
+ .current-file > .text-file::before{
+ color:white;
+ }
+
+ .fm-header{
+ display:none;
+ }
+
+ /* меняем иконки на шрифтовые*/
+ .mini-icon {
+ color: rgb(246, 224, 124);
+ color: rgba(246, 224, 124, 0.56);
+ font: 60px 'Fontello';
+ width: 40%;
+ height: 0;
+ margin-left: 0;
+ float: right;
+ position: relative;
+ top: 10px
+ }
+ .directory::before{
+ content: '\1f4c1';
+ }
+ .text-file::before{
+ color: rgb(26, 224, 124);
+ color: rgba(26, 224, 124, 0.56);
+ content: '\1f4c4';
+ }
+ .text-file{
+ background-image:none;
+ }
+
+ /* убираем заголовок*/
+ .fm_header{
+ display:none;
+ }
+ .mode,.size,.owner{
+ /* располагаем элементы
+ * один под другим
+ */
+ display: table;
+ float: none;
+ width: 0;
+
+ text-align: left;
+ }
+ /* выводим заголовки рядом с полями */
+ .name::before{
+ content: 'name:';
+ font-weight: bold;
+ font-size: 13px;
+ }
+ .mode::before{
+ content: 'mode:';
+ font-weight: bold;
+ font-size: 13px;
+ }
+ .size::before{
+ content: 'size:';
+ font-weight: bold;
+ font-size: 13px;
+ }
+ .owner::before{
+ content: 'owner:';
+ font-weight: bold;
+ font-size: 13px;
+ }
+
+ .name{
+ float: none;
+ width:100%;
+ font-size: 18px;
+ }
+}
+@media only screen and (min-width: 601px) and (max-width: 785px){
+ .panel{
+ width:94% !important;
+ }
+ #right{
+ display:none;
+ }
+}
+
+@media only screen and (min-width:786px) and (max-width: 1155px){
+ .panel{
+ width:94% !important;
+ }
+ /* если правая панель не помещаеться - прячем её */
+ #right{
+ display:none;
+ }
}
\ No newline at end of file
diff --git a/json/config.json b/json/config.json
index 3a8b6f66..adfe121a 100644
--- a/json/config.json
+++ b/json/config.json
@@ -3,7 +3,7 @@
"appcache" : false,
"minification" : {
"js" : false,
- "css" : true,
+ "css" : false,
"html" : true,
"img" : true
},
diff --git a/lib/client/dom.js b/lib/client/dom.js
index 027fb4ea..82a6de74 100644
--- a/lib/client/dom.js
+++ b/lib/client/dom.js
@@ -4,6 +4,7 @@ var CloudCommander, Util, DOM = {}, CloudFunc;
'use strict';
var CURRENT_FILE = 'current-file',
+ SELECTED_FILE = 'selected-file',
XMLHTTP,
Title,
@@ -150,9 +151,10 @@ var CloudCommander, Util, DOM = {}, CloudFunc;
var lClassList = pElement.classList;
if(lClassList){
- if( !lClassList.contains(pClass) )
+ lRet = !lClassList.contains(pClass);
+
+ if( lRet )
lClassList.add(pClass);
- lRet = true;
}
}
@@ -964,11 +966,22 @@ var CloudCommander, Util, DOM = {}, CloudFunc;
* @pCurrentFile
*/
DOM.getCurrentFile = function(){
- var lRet = DOM.getByClass(CURRENT_FILE )[0];
+ var lRet = DOM.getByClass( CURRENT_FILE )[0];
return lRet;
};
+ /**
+ * unified way to get current file
+ *
+ * @pCurrentFile
+ */
+ DOM.getSelectedFiles = function(){
+ var lRet = DOM.getByClass(SELECTED_FILE);
+
+ return lRet.length ? lRet : !lRet;
+ };
+
/**
* get size
* @pCurrentFile
@@ -1120,7 +1133,33 @@ var CloudCommander, Util, DOM = {}, CloudFunc;
return lRet;
};
+
+ /**
+ * select current file
+ * @param pCurrent
+ */
+ DOM.selectFile = function(pCurrent){
+ var lCurrent = pCurrent || DOM.getCurrentFile(),
+ lRet = DOM.addClass(pCurrent, SELECTED_FILE);
+ if(!lRet)
+ DOM.unSelectFile(lCurrent);
+
+ return lRet;
+ };
+
+ /**
+ * unselect current file
+ * @param pCurrent
+ */
+ DOM.unSelectFile = function(pCurrent){
+ var lCurrent = pCurrent || DOM.getCurrentFile(),
+ lRet = DOM.removeClass(lCurrent, SELECTED_FILE);
+
+ return lRet;
+ };
+
+
/**
* setting history wrapper
*/
diff --git a/lib/client/keyBinding.js b/lib/client/keyBinding.js
index fc530c15..4eef7573 100644
--- a/lib/client/keyBinding.js
+++ b/lib/client/keyBinding.js
@@ -18,7 +18,8 @@ var CloudCommander, Util, DOM;
UP : 38,
DOWN : 40,
- Delete : 46,
+ INSERT : 45,
+ DELETE : 46,
D : 68,
@@ -87,7 +88,7 @@ var CloudCommander, Util, DOM;
}
else if(lKeyCode >= KEY.F1 && lKeyCode <= KEY.TRA ||
- lKeyCode >= KEY.TAB && lKeyCode <= KEY.Delete)
+ lKeyCode >= KEY.TAB && lKeyCode <= KEY.DELETE)
switch(lKeyCode){
case KEY.TAB:
@@ -111,7 +112,12 @@ var CloudCommander, Util, DOM;
DOM.preventDefault(pEvent);//запрет на дальнейшее действие
break;
- case KEY.Delete:
+ case KEY.INSERT:
+ DOM.selectFile(lCurrentFile);
+ DOM.setCurrentFile( lCurrentFile.nextSibling );
+ break;
+
+ case KEY.DELETE:
if(pEvent.shiftKey){
var lUrl = DOM.getCurrentPath(lCurrentFile);