From 19577698176df4583cbaecba41c83371c3a368da Mon Sep 17 00:00:00 2001
From: Aleksander Machniak <alec@alec.pl>
Date: Sat, 26 Jul 2014 04:16:02 -0400
Subject: [PATCH] Handle clicks on list parent element from the list widget

---
 program/js/list.js |   21 ++++++++++++++-------
 1 files changed, 14 insertions(+), 7 deletions(-)

diff --git a/program/js/list.js b/program/js/list.js
index 5492c0a..cdb1a46 100644
--- a/program/js/list.js
+++ b/program/js/list.js
@@ -61,12 +61,13 @@
   this.keyboard = false;
   this.toggleselect = false;
   this.aria_listbox = false;
+  this.parent_focus = true;
 
   this.drag_active = false;
   this.col_drag_active = false;
   this.column_fixed = null;
-  this.last_selected = 0;
-  this.shift_start = 0;
+  this.last_selected = null;
+  this.shift_start = null;
   this.focused = false;
   this.drag_mouse_start = null;
   this.dblclick_time = 500; // default value on MS Windows is 500
@@ -104,11 +105,13 @@
       $(this.list).attr('aria-multiselectable', 'true');
   }
 
+  var me = this;
+
   if (this.tbody) {
     this.rows = {};
     this.rowcount = 0;
 
-    var r, len, rows = this.tbody.childNodes, me = this;
+    var r, len, rows = this.tbody.childNodes;
 
     for (r=0, len=rows.length; r<len; r++) {
       this.rowcount += this.init_row(rows[r]) ? 1 : 0;
@@ -125,6 +128,10 @@
       $(this.list).attr('tabindex', '0')
         .on('focus', function(e){ me.focus(e); });
     }
+  }
+
+  if (this.parent_focus) {
+    this.list.parentNode.onclick = function(e) { me.focus(e); };
   }
 
   return this;
@@ -293,7 +300,7 @@
 
   this.rows = {};
   this.rowcount = 0;
-  this.last_selected = 0;
+  this.last_selected = null;
 
   if (sel)
     this.clear_selection();
@@ -939,13 +946,13 @@
     this.multi_selecting = true;
   }
 
-  if (this.last_selected != 0 && this.rows[this.last_selected]) {
+  if (this.last_selected && this.rows[this.last_selected]) {
     $(this.rows[this.last_selected].obj).removeClass('focused')
       .find(this.col_tagname()).eq(this.subject_col).removeAttr('tabindex');
   }
 
   // unselect if toggleselect is active and the same row was clicked again
-  if (this.toggleselect && in_selection_before) {
+  if (this.toggleselect && in_selection_before && !mod_key) {
     this.clear_selection();
   }
   // trigger event if selection changed
@@ -1171,7 +1178,7 @@
 
   if (num_select && !this.selection.length && !no_event) {
     this.triggerEvent('select');
-    this.last_selected = 0;
+    this.last_selected = null;
   }
 },
 

--
Gitblit v1.9.1