Thomas Bruederli
2014-01-20 1bbf8c48868efb87baab7ae71721f2c9ad408e65
program/js/list.js
@@ -20,7 +20,7 @@
/**
 * Roundcube List Widget class
 * @contructor
 * @constructor
 */
function rcube_list_widget(list, p)
{
@@ -32,10 +32,6 @@
  this.list = list ? list : null;
  this.tagname = this.list ? this.list.nodeName.toLowerCase() : 'table';
  this.id_regexp = /^rcmrow([a-z0-9\-_=\+\/]+)/i;
  this.thead;
  this.tbody;
  this.fixed_header;
  this.frame = null;
  this.rows = {};
  this.selection = [];
  this.rowcount = 0;
@@ -101,6 +97,8 @@
    if (this.keyboard)
      rcube_event.add_listener({event:'keydown', object:this, method:'key_press'});
  }
  return this;
},
@@ -109,11 +107,15 @@
 */
init_row: function(row)
{
  // make references in internal array and set event handlers
  if (row && String(row.id).match(this.id_regexp)) {
    var self = this,
      uid = RegExp.$1;
  var uid;
  if (row && (uid = $(row).data('uid')))
    row.uid = uid;
  else if (row && String(row.id).match(this.id_regexp))
    row.uid = RegExp.$1;
  // make references in internal array and set event handlers
  if (row && row.uid) {
    var self = this, uid = row.uid;
    this.rows[uid] = {uid:uid, id:row.id, obj:row};
    // set eventhandlers to table row
@@ -293,6 +295,7 @@
    if (row.id) domrow.id = row.id;
    if (row.className) domrow.className = row.className;
    if (row.style) $.extend(domrow.style, row.style);
    if (row.uid) $(domrow).data('uid', row.uid);
    for (var domcell, col, i=0; row.cols && i < row.cols.length; i++) {
      col = row.cols[i];
@@ -380,6 +383,20 @@
      $(this.rows[id].obj).removeClass('selected focused').addClass('unfocused');
    }
  }
},
/**
 * Set/unset the given column as hidden
 */
hide_column: function(col, hide)
{
  var method = hide ? 'addClass' : 'removeClass';
  if (this.fixed_header)
    $(this.row_tagname()+' '+this.col_tagname()+'.'+col, this.fixed_header)[method]('hidden');
  $(this.row_tagname()+' '+this.col_tagname()+'.'+col, this.list)[method]('hidden');
},
@@ -577,7 +594,7 @@
    row.expanded = true;
    depth = row.depth;
    new_row = row.obj.nextSibling;
    this.update_expando(row.uid, true);
    this.update_expando(row.id, true);
    this.triggerEvent('expandcollapse', { uid:row.uid, expanded:row.expanded, obj:row.obj });
  }
  else {
@@ -627,7 +644,7 @@
    row.expanded = false;
    depth = row.depth;
    new_row = row.obj.nextSibling;
    this.update_expando(row.uid);
    this.update_expando(row.id);
    this.triggerEvent('expandcollapse', { uid:row.uid, expanded:row.expanded, obj:row.obj });
    // don't collapse sub-root tree in multiexpand mode 
@@ -649,7 +666,7 @@
          $(new_row).css('display', 'none');
        if (r.has_children && r.expanded) {
          r.expanded = false;
          this.update_expando(r.uid, false);
          this.update_expando(r.id, false);
          this.triggerEvent('expandcollapse', { uid:r.uid, expanded:r.expanded, obj:new_row });
        }
      }
@@ -671,7 +688,7 @@
    row.expanded = true;
    depth = row.depth;
    new_row = row.obj.nextSibling;
    this.update_expando(row.uid, true);
    this.update_expando(row.id, true);
    this.triggerEvent('expandcollapse', { uid:row.uid, expanded:row.expanded, obj:row.obj });
  }
  else {
@@ -688,7 +705,7 @@
        $(new_row).css('display', '');
        if (r.has_children && !r.expanded) {
          r.expanded = true;
          this.update_expando(r.uid, true);
          this.update_expando(r.id, true);
          this.triggerEvent('expandcollapse', { uid:r.uid, expanded:r.expanded, obj:new_row });
        }
      }
@@ -702,9 +719,9 @@
},
update_expando: function(uid, expanded)
update_expando: function(id, expanded)
{
  var expando = document.getElementById('rcmexpando' + uid);
  var expando = document.getElementById('rcmexpando' + id);
  if (expando)
    expando.className = expanded ? 'expanded' : 'collapsed';
},
@@ -1067,7 +1084,7 @@
  if (deep !== false && res.length) {
    for (var uid, uids, i=0, len=res.length; i<len; i++) {
      uid = res[i];
      if (this.rows[uid].has_children && !this.rows[uid].expanded) {
      if (this.rows[uid] && this.rows[uid].has_children && !this.rows[uid].expanded) {
        uids = this.row_children(uid);
        for (var j=0, uids_len=uids.length; j<uids_len; j++) {
          uid = uids[j];
@@ -1152,6 +1169,7 @@
key_press: function(e)
{
  var target = e.target || {};
  if (this.focused != true || target.nodeName == 'INPUT' || target.nodeName == 'TEXTAREA' || target.nodeName == 'SELECT')
    return true;
@@ -1173,11 +1191,9 @@
    case 37: // Left arrow key
    case 39: // Right arrow key
    case 107: // Plus sign on a numeric keypad
    case 109: // Minus sign on a numeric keypad
      // Stop propagation
      rcube_event.cancel(e);
      var ret = this.use_plusminus_key(keyCode, mod_key);
      var ret = this.use_arrow_key(keyCode, mod_key);
      this.key_pressed = keyCode;
      this.modkey = mod_key;
      this.triggerEvent('keypress');
@@ -1222,55 +1238,49 @@
 */
use_arrow_key: function(keyCode, mod_key)
{
  var new_row;
  var new_row,
    selected_row = this.rows[this.last_selected];
  // Safari uses the nonstandard keycodes 63232/63233 for up/down, if we're
  // using the keypress event (but not the keydown or keyup event).
  if (keyCode == 40 || keyCode == 63233) // down arrow key pressed
    new_row = this.get_next_row();
  else if (keyCode == 38 || keyCode == 63232) // up arrow key pressed
    new_row = this.get_prev_row();
  else {
    if (!selected_row || !selected_row.has_children)
      return;
    // expand
    if (keyCode == 39) {
      if (selected_row.expanded)
        return;
      if (mod_key == CONTROL_KEY || this.multiexpand)
        this.expand_all(selected_row);
      else
        this.expand(selected_row);
    }
    // collapse
    else {
      if (!selected_row.expanded)
        return;
      if (mod_key == CONTROL_KEY || this.multiexpand)
        this.collapse_all(selected_row);
      else
        this.collapse(selected_row);
    }
    this.update_expando(selected_row.id, selected_row.expanded);
    return false;
  }
  if (new_row) {
    this.select_row(new_row.uid, mod_key, false);
    this.scrollto(new_row.uid);
  }
  return false;
},
/**
 * Special handling method for +/- keys
 */
use_plusminus_key: function(keyCode, mod_key)
{
  var selected_row = this.rows[this.last_selected];
  if (!selected_row || !selected_row.has_children)
    return;
  // expand
  if (keyCode == 39 || keyCode == 107) {
    if (selected_row.expanded)
      return;
    if (mod_key == CONTROL_KEY || this.multiexpand)
      this.expand_all(selected_row);
    else
      this.expand(selected_row);
  }
  // collapse
  else {
    if (!selected_row.expanded)
      return;
    if (mod_key == CONTROL_KEY || this.multiexpand)
      this.collapse_all(selected_row);
    else
      this.collapse(selected_row);
  }
  this.update_expando(selected_row.uid, selected_row.expanded);
  return false;
},