diff options
Diffstat (limited to 'program/js/list.js')
-rw-r--r-- | program/js/list.js | 136 |
1 files changed, 73 insertions, 63 deletions
diff --git a/program/js/list.js b/program/js/list.js index 1457382a4..660b74d85 100644 --- a/program/js/list.js +++ b/program/js/list.js @@ -88,10 +88,8 @@ init: function() this.frame = this.list.parentNode; // set body events - if (this.keyboard) { - rcube_event.add_listener({event:bw.opera?'keypress':'keydown', object:this, method:'key_press'}); - rcube_event.add_listener({event:'keydown', object:this, method:'key_down'}); - } + if (this.keyboard) + rcube_event.add_listener({event:'keydown', object:this, method:'key_press'}); } }, @@ -528,6 +526,7 @@ collapse_all: function(row) return false; }, + expand_all: function(row) { var depth, new_row, r; @@ -563,6 +562,7 @@ expand_all: function(row) return false; }, + update_expando: function(uid, expanded) { var expando = document.getElementById('rcmexpando' + uid); @@ -735,7 +735,7 @@ select_first: function(mod_key) /** - * Select last row + * Select last row */ select_last: function(mod_key) { @@ -756,25 +756,13 @@ select_last: function(mod_key) /** * Add all childs of the given row to selection */ -select_childs: function(uid) +select_children: function(uid) { - if (!this.rows[uid] || !this.rows[uid].has_children) - return; + var i, children = this.row_children(uid), len = children.length; - var depth = this.rows[uid].depth, - row = this.rows[uid].obj.nextSibling; - - while (row) { - if (row.nodeType == 1) { - if ((r = this.rows[row.uid])) { - if (!r.depth || r.depth <= depth) - break; - if (!this.in_selection(r.uid)) - this.select_row(r.uid, CONTROL_KEY); - } - } - row = row.nextSibling; - } + for (i=0; i<len; i++) + if (!this.in_selection(children[i])) + this.select_row(children[i], CONTROL_KEY); }, @@ -932,17 +920,22 @@ get_single_selection: function() */ highlight_row: function(id, multiple) { - if (this.rows[id] && !multiple) { + if (!this.rows[id]) + return; + + if (!multiple) { if (this.selection.length > 1 || !this.in_selection(id)) { this.clear_selection(); this.selection[0] = id; $(this.rows[id].obj).addClass('selected'); } } - else if (this.rows[id]) { + else { if (!this.in_selection(id)) { // select row - this.selection[this.selection.length] = id; + this.selection.push(id); $(this.rows[id].obj).addClass('selected'); + if (!this.rows[id].expanded) + this.highlight_children(id, true); } else { // unselect row var p = $.inArray(id, this.selection), @@ -951,12 +944,30 @@ highlight_row: function(id, multiple) this.selection = a_pre.concat(a_post); $(this.rows[id].obj).removeClass('selected').removeClass('unfocused'); + if (!this.rows[id].expanded) + this.highlight_children(id, false); } } }, /** + * Highlight/unhighlight all childs of the given row + */ +highlight_children: function(id, status) +{ + var i, selected, + children = this.row_children(id), len = children.length; + + for (i=0; i<len; i++) { + selected = this.in_selection(children[i]); + if ((status && !selected) || (!status && selected)) + this.highlight_row(children[i], true); + } +}, + + +/** * Handler for keyboard events */ key_press: function(e) @@ -994,49 +1005,22 @@ key_press: function(e) case 35: // End this.select_last(mod_key); return rcube_event.cancel(e); - default: - this.key_pressed = keyCode; - this.modkey = mod_key; - this.triggerEvent('keypress'); - this.modkey = 0; - - if (this.key_pressed == this.BACKSPACE_KEY) - return rcube_event.cancel(e); - } - - return true; -}, - -/** - * Handler for keydown events - */ -key_down: function(e) -{ - var target = e.target || {}; - if (this.focused != true || target.nodeName == 'INPUT' || target.nodeName == 'TEXTAREA' || target.nodeName == 'SELECT') - return true; - - switch (rcube_event.get_keycode(e)) { case 27: if (this.drag_active) - return this.drag_mouse_up(e); + return this.drag_mouse_up(e); if (this.col_drag_active) { this.selected_column = null; return this.column_drag_mouse_up(e); } + return rcube_event.cancel(e); + default: + this.key_pressed = keyCode; + this.modkey = mod_key; + this.triggerEvent('keypress'); + this.modkey = 0; - case 40: - case 38: - case 63233: - case 63232: - case 61: - case 107: - case 109: - case 32: - if (!rcube_event.get_modifier(e) && this.focused) + if (this.key_pressed == this.BACKSPACE_KEY) return rcube_event.cancel(e); - - default: } return true; @@ -1129,7 +1113,7 @@ drag_mouse_move: function(e) else return rcube_event.cancel(e); } - + if (this.drag_start) { // check mouse movement, of less than 3 pixels, don't start dragging var m = rcube_event.get_mouse_pos(e); @@ -1146,8 +1130,8 @@ drag_mouse_move: function(e) var n, uid, selection = $.merge([], this.selection); for (n in selection) { uid = selection[n]; - if (this.rows[uid].has_children && !this.rows[uid].expanded) - this.select_childs(uid); + if (!this.rows[uid].expanded) + this.select_children(uid); } // reset content @@ -1368,6 +1352,32 @@ column_drag_mouse_up: function(e) /** + * Returns IDs of all rows in a thread (except root) for specified root + */ +row_children: function(uid) +{ + if (!this.rows[uid] || !this.rows[uid].has_children) + return []; + + var res = [], depth = this.rows[uid].depth, + row = this.rows[uid].obj.nextSibling; + + while (row) { + if (row.nodeType == 1) { + if ((r = this.rows[row.uid])) { + if (!r.depth || r.depth <= depth) + break; + res.push(r.uid); + } + } + row = row.nextSibling; + } + + return res; +}, + + +/** * Creates a layer for drag&drop over iframes */ add_dragfix: function() |