From bc35e865ae700b21ce6085aa33ba8354a2b09ac9 Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Wed, 30 Oct 2013 14:44:37 +0100 Subject: Fix Ctrl+click selection after recent refactorings of keyboard nawigation on list widget --- program/js/list.js | 40 +++++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/program/js/list.js b/program/js/list.js index 0f63c6dfc..15dd019e0 100644 --- a/program/js/list.js +++ b/program/js/list.js @@ -55,7 +55,6 @@ function rcube_list_widget(list, p) this.column_fixed = null; this.last_selected = 0; this.shift_start = 0; - this.in_selection_before = false; this.focused = false; this.drag_mouse_start = null; this.dblclick_time = 500; // default value on MS Windows is 500 @@ -405,20 +404,15 @@ drag_column: function(e, col) drag_row: function(e, id) { // don't do anything (another action processed before) - var evtarget = rcube_event.get_target(e), - tagname = evtarget.tagName.toLowerCase(); - - if (evtarget && (tagname == 'input' || tagname == 'img' || (tagname != 'a' && evtarget.onclick))) + if (!this.is_event_target(e)) return true; // accept right-clicks if (rcube_event.get_button(e) == 2) return true; - this.in_selection_before = e && e.istouch || this.in_selection(id) ? id : false; - // selects currently unselected row - if (!this.in_selection_before) { + if (e && e.istouch || this.in_selection(id)) { var mod_key = rcube_event.get_modifier(e); this.select_row(id, mod_key, false); } @@ -446,22 +440,18 @@ drag_row: function(e, id) */ click_row: function(e, id) { - var now = new Date().getTime(), - mod_key = rcube_event.get_modifier(e), - evtarget = rcube_event.get_target(e), - tagname = evtarget.tagName.toLowerCase(); - - if ((evtarget && (tagname == 'input' || tagname == 'img'))) + // don't do anything (another action processed before) + if (!this.is_event_target(e)) return true; - var dblclicked = now - this.rows[id].clicked < this.dblclick_time; + var now = new Date().getTime(), + dblclicked = now - this.rows[id].clicked < this.dblclick_time; - // selects/unselects currently selected row - if (!this.drag_active && this.in_selection_before == id && !dblclicked) - this.select_row(id, mod_key, true); + // selects (or unselects currently selected) row + if (!this.drag_active && !dblclicked) + this.select_row(id, rcube_event.get_modifier(e), true); this.drag_start = false; - this.in_selection_before = false; // row was double clicked if (this.rowcount && dblclicked && this.in_selection(id)) { @@ -482,6 +472,18 @@ click_row: function(e, id) }, +/** + * Check target of the current event + */ +is_event_target: function(e) +{ + var target = rcube_event.get_target(e), + tagname = target.tagName.toLowerCase(); + + return !(target && (tagname == 'input' || tagname == 'img' || (tagname != 'a' && target.onclick))); +}, + + /* * Returns thread root ID for specified row ID */ -- cgit v1.2.3