thomascube
2008-03-09 c5418bd82c081d7c89012f2d6e497535224ad29d
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,13 +32,17 @@
  this.rows = [];
  this.selection = [];
  
  this.subject_col = -1;
  this.shiftkey = false;
  this.multiselect = 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;
@@ -93,7 +97,7 @@
init_row: function(row)
{
  // make references in internal array and set event handlers
  if (row && String(row.id).match(/rcmrow([0-9]+)/))
  if (row && String(row.id).match(/rcmrow([a-z0-9\-_=]+)/i))
  {
    var p = this;
    var uid = RegExp.$1;
@@ -115,22 +119,27 @@
/**
 *
 */
clear: function()
clear: function(sel)
{
  var tbody = document.createElement('TBODY');
  this.list.insertBefore(tbody, this.list.tBodies[0]);
  this.list.removeChild(this.list.tBodies[1]);
  this.rows = new Array();
  this.rows = new Array();
  if (sel) this.clear_selection();
},
/**
 * '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;
},
@@ -198,11 +207,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)
@@ -214,7 +224,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'});
  }
@@ -230,7 +240,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)
    {
@@ -270,7 +284,7 @@
    return false;
  var last_selected_row = this.rows[this.last_selected];
  var new_row = last_selected_row && last_selected_row.obj.nextSibling;
  var new_row = last_selected_row ? last_selected_row.obj.nextSibling : null;
  while (new_row && (new_row.nodeType != 1 || new_row.style.display == 'none'))
    new_row = new_row.nextSibling;
@@ -283,7 +297,7 @@
    return false;
  var last_selected_row = this.rows[this.last_selected];
  var new_row = last_selected_row && last_selected_row.obj.previousSibling;
  var new_row = last_selected_row ? last_selected_row.obj.previousSibling : null;
  while (new_row && (new_row.nodeType != 1 || new_row.style.display == 'none'))
    new_row = new_row.previousSibling;
@@ -297,6 +311,9 @@
  var select_before = this.selection.join(',');
  if (!this.multiselect)
    mod_key = 0;
  if (!this.shift_start)
    this.shift_start = id
  if (!mod_key)
  {
@@ -308,13 +325,12 @@
    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:
@@ -322,7 +338,7 @@
        break;
      default:
        this.highlight_row(id, false);
        this.highlight_row(id, false);
        break;
    }
  }
@@ -334,8 +350,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);
},
@@ -412,7 +439,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)
@@ -424,7 +452,11 @@
    }
  }
  return true;
  // trigger event if selection changed
  if (this.selection.join(',') != select_before)
    this.trigger_event('select');
  return true;
},
@@ -433,14 +465,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');
},
@@ -472,9 +508,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])
  {
@@ -514,6 +553,7 @@
      break;
    default:
      this.shiftkey = e.shiftKey;
      this.key_pressed = keyCode;
      this.trigger_event('keypress');
  }
@@ -578,7 +618,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
@@ -592,12 +632,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++;
          }
        }
      }
    }