]> git.donarmstrong.com Git - roundcube.git/blobdiff - program/js/list.js
Imported Upstream version 0.1.1
[roundcube.git] / program / js / list.js
index 23a9c349ccd9c48d8c0e40665b02d27309690e15..2b3c7a8f66529c582b6c0f26fe89cc40fee27d10 100644 (file)
@@ -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 @@ function rcube_list_widget(list, p)
   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,11 +134,14 @@ clear: function(sel)
 /**
  * '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,12 +208,13 @@ blur: function()
  */
 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 @@ drag_row: function(e, id)
   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 @@ click_row: function(e, id)
 {
   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 @@ select_row: function(id, mod_key, with_mouse)
   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 @@ select_row: function(id, mod_key, with_mouse)
         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 @@ select_row: function(id, mod_key, with_mouse)
   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 @@ select_all: function(filter)
   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 @@ select_all: function(filter)
     }
   }
 
-  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 @@ select_all: function(filter)
  */
 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 @@ highlight_row: function(id, multiple)
 {
   if (this.rows[id] && !multiple)
   {
-    this.clear_selection();
-    this.selection[0] = id;
-    this.set_classname(this.rows[id].obj, 'selected', true)
+    if (this.selection.length > 1 || !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 @@ key_press: function(e)
   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 @@ key_press: function(e)
       break;
 
     default:
+      this.shiftkey = e.shiftKey;
       this.key_pressed = keyCode;
       this.trigger_event('keypress');
   }
@@ -584,7 +623,7 @@ drag_mouse_move: function(e)
   
     // get subjects of selectedd messages
     var names = '';
-    var c, node, 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,13 +637,20 @@ drag_mouse_move: function(e)
         obj = this.rows[this.selection[n]].obj;
         subject = '';
 
-        for(c=0; c<obj.childNodes.length; c++)
-          if (obj.childNodes[c].nodeName=='TD' && (node = obj.childNodes[c].firstChild) && (node.nodeType==3 || node.nodeName=='A'))
+        for(c=0, i=0; i<obj.childNodes.length; i++)
+        {
+          if (obj.childNodes[i].nodeName == 'TD')
           {
-            subject = node.nodeType==3 ? node.data : node.innerHTML;
-            names += (subject.length > 50 ? subject.substring(0, 50)+'...' : subject) + '<br />';
-            break;
+            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++;
           }
+        }
       }
     }