From d7c226ca1bbab8bcf994d9f4c921178beef81ba7 Mon Sep 17 00:00:00 2001 From: alecpl <alec@alec.pl> Date: Wed, 02 Apr 2008 10:20:16 -0400 Subject: [PATCH] http://trac.roundcube.net/ticket/1484838 --- program/js/list.js | 101 +++++++++++++++++++++++++++++++++++++------------- 1 files changed, 74 insertions(+), 27 deletions(-) diff --git a/program/js/list.js b/program/js/list.js index 7195858..02c872f 100644 --- a/program/js/list.js +++ b/program/js/list.js @@ -3,7 +3,7 @@ | RoundCube List Widget | | | | This file is part of the RoundCube Webmail client | - | Copyright (C) 2006, RoundCube Dev, - Switzerland | + | Copyright (C) 2006-2008, RoundCube Dev, - Switzerland | | Licensed under the GNU GPL | | | +-----------------------------------------------------------------------+ @@ -32,15 +32,18 @@ this.rows = []; this.selection = []; + this.subject_col = -1; this.shiftkey = false; - this.multiselect = false; + this.multi_selecting = false; this.draggable = false; this.keyboard = false; + this.toggleselect = false; this.dont_select = false; this.drag_active = false; this.last_selected = 0; + this.shift_start = 0; this.in_selection_before = false; this.focused = false; this.drag_mouse_start = null; @@ -131,10 +134,13 @@ /** * 'remove' message row from list (just hide it) */ -remove_row: function(uid) +remove_row: function(uid, sel_next) { if (this.rows[uid].obj) this.rows[uid].obj.style.display = 'none'; + + if (sel_next) + this.select_next(); this.rows[uid] = null; }, @@ -202,11 +208,12 @@ */ drag_row: function(e, id) { - this.in_selection_before = this.in_selection(id) ? id : false; - // don't do anything (another action processed before) - if (this.dont_select) + var evtarget = rcube_event.get_target(e); + if (this.dont_select || (evtarget && (evtarget.tagName == 'INPUT' || evtarget.tagName == 'IMG'))) return false; + + this.in_selection_before = this.in_selection(id) ? id : false; // selects currently unselected row if (!this.in_selection_before) @@ -218,7 +225,7 @@ if (this.draggable && this.selection.length) { this.drag_start = true; - this.drag_mouse_start = rcube_event.get_mouse_pos(e); + this.drag_mouse_start = rcube_event.get_mouse_pos(e); rcube_event.add_listener({element:document, event:'mousemove', object:this, method:'drag_mouse_move'}); rcube_event.add_listener({element:document, event:'mouseup', object:this, method:'drag_mouse_up'}); } @@ -234,7 +241,11 @@ { var now = new Date().getTime(); var mod_key = rcube_event.get_modifier(e); - + var evtarget = rcube_event.get_target(e); + + if ((evtarget && (evtarget.tagName == 'INPUT' || evtarget.tagName == 'IMG'))) + return false; + // don't do anything (another action processed before) if (this.dont_select) { @@ -301,24 +312,27 @@ var select_before = this.selection.join(','); if (!this.multiselect) mod_key = 0; + + if (!this.shift_start) + this.shift_start = id if (!mod_key) { this.shift_start = id; this.highlight_row(id, false); + this.multi_selecting = false; } else { switch (mod_key) { case SHIFT_KEY: - this.shift_select(id, false); + this.shift_select(id, false); break; case CONTROL_KEY: - this.shift_start = id; if (!with_mouse) - this.highlight_row(id, true); + this.highlight_row(id, true); break; case CONTROL_SHIFT_KEY: @@ -326,9 +340,10 @@ break; default: - this.highlight_row(id, false); + this.highlight_row(id, false); break; } + this.multi_selecting = true; } // trigger event if selection changed @@ -338,8 +353,19 @@ if (this.last_selected != 0 && this.rows[this.last_selected]) this.set_classname(this.rows[this.last_selected].obj, 'focused', false); + // unselect if toggleselect is active and the same row was clicked again + if (this.toggleselect && this.last_selected == id) + { + this.clear_selection(); + id = null; + } + else + this.set_classname(this.rows[id].obj, 'focused', true); + + if (!this.selection.length) + this.shift_start = null; + this.last_selected = id; - this.set_classname(this.rows[id].obj, 'focused', true); }, @@ -416,7 +442,8 @@ if (!this.rows || !this.rows.length) return false; - // reset selection first + // reset but remember selection first + var select_before = this.selection.join(','); this.clear_selection(); for (var n in this.rows) @@ -428,7 +455,13 @@ } } - return true; + // trigger event if selection changed + if (this.selection.join(',') != select_before) + this.trigger_event('select'); + + this.focus(); + + return true; }, @@ -437,14 +470,18 @@ */ clear_selection: function() { - for(var n=0; n<this.selection.length; n++) + var num_select = this.selection.length; + for (var n=0; n<this.selection.length; n++) if (this.rows[this.selection[n]]) { this.set_classname(this.rows[this.selection[n]].obj, 'selected', false); this.set_classname(this.rows[this.selection[n]].obj, 'unfocused', false); } - this.selection = new Array(); + this.selection = new Array(); + + if (num_select) + this.trigger_event('select'); }, @@ -476,9 +513,12 @@ { if (this.rows[id] && !multiple) { - this.clear_selection(); - this.selection[0] = id; - this.set_classname(this.rows[id].obj, 'selected', true) + if (!this.in_selection(id)) + { + this.clear_selection(); + this.selection[0] = id; + this.set_classname(this.rows[id].obj, 'selected', true); + } } else if (this.rows[id]) { @@ -508,8 +548,6 @@ if (this.focused != true) return true; - this.shiftkey = e.shiftKey; - var keyCode = document.layers ? e.which : document.all ? event.keyCode : document.getElementById ? e.keyCode : 0; var mod_key = rcube_event.get_modifier(e); switch (keyCode) @@ -520,6 +558,7 @@ break; default: + this.shiftkey = e.shiftKey; this.key_pressed = keyCode; this.trigger_event('keypress'); } @@ -584,7 +623,7 @@ // get subjects of selectedd messages var names = ''; - var c, subject, obj; + var c, i, node, subject, obj; for(var n=0; n<this.selection.length; n++) { if (n>12) // only show 12 lines @@ -598,12 +637,20 @@ obj = this.rows[this.selection[n]].obj; subject = ''; - for(c=0; c<obj.childNodes.length; c++) - if (!subject && obj.childNodes[c].nodeName=='TD' && obj.childNodes[c].firstChild && obj.childNodes[c].firstChild.nodeType==3) + for(c=0, i=0; i<obj.childNodes.length; i++) + { + if (obj.childNodes[i].nodeName == 'TD') { - subject = obj.childNodes[c].firstChild.data; - names += (subject.length > 50 ? subject.substring(0, 50)+'...' : subject) + '<br />'; + if (((node = obj.childNodes[i].firstChild) && (node.nodeType==3 || node.nodeName=='A')) && + (this.subject_col < 0 || (this.subject_col >= 0 && this.subject_col == c))) + { + subject = node.nodeType==3 ? node.data : node.innerHTML; + names += (subject.length > 50 ? subject.substring(0, 50)+'...' : subject) + '<br />'; + break; + } + c++; } + } } } -- Gitblit v1.9.1