| 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 |
| |
+-----------------------------------------------------------------------+
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;
/**
* '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;
},
*/
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)
{
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'});
}
{
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)
{
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:
break;
default:
- this.highlight_row(id, false);
+ this.highlight_row(id, false);
break;
}
+ this.multi_selecting = true;
}
// trigger event if selection changed
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);
},
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)
}
}
- return true;
+ // trigger event if selection changed
+ if (this.selection.join(',') != select_before)
+ this.trigger_event('select');
+
+ this.focus();
+
+ return true;
},
*/
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');
},
{
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])
{
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)
break;
default:
+ this.shiftkey = e.shiftKey;
this.key_pressed = keyCode;
this.trigger_event('keypress');
}
// 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
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++;
}
+ }
}
}