From e70b3b24fc8ac7b54a820ae87ce8f4af4043125e Mon Sep 17 00:00:00 2001 From: alecpl <alec@alec.pl> Date: Thu, 09 Oct 2008 02:25:43 -0400 Subject: [PATCH] - send set_unread_count() only when changing /Seen status --- program/js/list.js | 127 ++++++++++++++++++++++++++++++++++-------- 1 files changed, 102 insertions(+), 25 deletions(-) diff --git a/program/js/list.js b/program/js/list.js index eceb1a9..62d4732 100644 --- a/program/js/list.js +++ b/program/js/list.js @@ -26,11 +26,13 @@ // static contants this.ENTER_KEY = 13; this.DELETE_KEY = 46; + this.BACKSPACE_KEY = 8; this.list = list ? list : null; this.frame = null; this.rows = []; this.selection = []; + this.rowcount = 0; this.subject_col = -1; this.shiftkey = false; @@ -49,7 +51,7 @@ this.drag_mouse_start = null; this.dblclick_time = 600; this.row_init = function(){}; - this.events = { click:[], dblclick:[], select:[], keypress:[], dragstart:[], dragend:[] }; + this.events = { click:[], dblclick:[], select:[], keypress:[], dragstart:[], dragmove:[], dragend:[] }; // overwrite default paramaters if (p && typeof(p)=='object') @@ -69,6 +71,7 @@ if (this.list && this.list.tBodies[0]) { this.rows = new Array(); + this.rowcount = 0; var row; for(var r=0; r<this.list.tBodies[0].childNodes.length; r++) @@ -81,13 +84,16 @@ } this.init_row(row); + this.rowcount++; } this.frame = this.list.parentNode; // set body events - if (this.keyboard) - rcube_event.add_listener({element:document, event:'keydown', object:this, method:'key_press'}); + if (this.keyboard) { + rcube_event.add_listener({element:document, event:'keyup', object:this, method:'key_press'}); + rcube_event.add_listener({element:document, event:'keydown', object:this, method:'key_down'}); + } } }, @@ -126,6 +132,7 @@ this.list.insertBefore(tbody, this.list.tBodies[0]); this.list.removeChild(this.list.tBodies[1]); this.rows = new Array(); + this.rowcount = 0; if (sel) this.clear_selection(); }, @@ -143,6 +150,7 @@ this.select_next(); this.rows[uid] = null; + this.rowcount--; }, @@ -159,12 +167,13 @@ tbody.appendChild(row); this.init_row(row); + this.rowcount++; }, /** - * Set focur to the list + * Set focus to the list */ focus: function(e) { @@ -212,7 +221,11 @@ var evtarget = rcube_event.get_target(e); if (this.dont_select || (evtarget && (evtarget.tagName == 'INPUT' || evtarget.tagName == 'IMG'))) return false; - + + // accept right-clicks + if (rcube_event.get_button(e) == 2) + return true; + this.in_selection_before = this.in_selection(id) ? id : false; // selects currently unselected row @@ -277,7 +290,7 @@ /** - * get next and previous rows that are not hidden + * get next/previous/last rows that are not hidden */ get_next_row: function() { @@ -305,8 +318,24 @@ return new_row; }, +get_last_row: function() +{ + if (this.rowcount) + { + var rows = this.list.tBodies[0].rows; -// selects or unselects the proper row depending on the modifier key pressed + for(var i=rows.length-1; i>=0; i--) + if(rows[i].id && String(rows[i].id).match(/rcmrow([a-z0-9\-_=]+)/i) && this.rows[RegExp.$1] != null) + return RegExp.$1; + } + + return null; +}, + + +/** + * selects or unselects the proper row depending on the modifier key pressed + */ select_row: function(id, mod_key, with_mouse) { var select_before = this.selection.join(','); @@ -398,6 +427,9 @@ */ shift_select: function(id, control) { + if (!this.rows[this.shift_start] || !this.selection.length) + this.shift_start = id; + var from_rowIndex = this.rows[this.shift_start].obj.rowIndex; var to_rowIndex = this.rows[id].obj.rowIndex; @@ -466,21 +498,36 @@ /** - * Unselect all selected rows + * Unselect selected row(s) */ -clear_selection: function() +clear_selection: function(id) { var num_select = this.selection.length; - for (var n=0; n<this.selection.length; n++) - if (this.rows[this.selection[n]]) + + // one row + if (id) { - this.set_classname(this.rows[this.selection[n]].obj, 'selected', false); - this.set_classname(this.rows[this.selection[n]].obj, 'unfocused', false); + for (var n=0; n<this.selection.length; n++) + if (this.selection[n] == id) + { + this.selection.splice(n,1); + break; + } + } + // all rows + else + { + 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) + if (num_select && !this.selection.length) this.trigger_event('select'); }, @@ -545,22 +592,47 @@ */ key_press: function(e) { - if (this.focused != true) + if (this.focused != true) return true; - var keyCode = document.layers ? e.which : document.all ? event.keyCode : document.getElementById ? e.keyCode : 0; + var keyCode = rcube_event.get_keycode(e); var mod_key = rcube_event.get_modifier(e); switch (keyCode) { case 40: case 38: + case 63233: // "down", in safari keypress + case 63232: // "up", in safari keypress + // Stop propagation so that the browser doesn't scroll + rcube_event.cancel(e); return this.use_arrow_key(keyCode, mod_key); - break; - default: this.shiftkey = e.shiftKey; this.key_pressed = keyCode; this.trigger_event('keypress'); + + if (this.key_pressed == this.BACKSPACE_KEY) + return rcube_event.cancel(e); + } + + return true; +}, + +/** + * Handler for keydown events + */ +key_down: function(e) +{ + switch (rcube_event.get_keycode(e)) + { + case 40: + case 38: + case 63233: + case 63232: + if (!rcube_event.get_modifier(e) && this.focused) + return rcube_event.cancel(e); + + default: } return true; @@ -573,9 +645,11 @@ use_arrow_key: function(keyCode, mod_key) { var new_row; - if (keyCode == 40) // down arrow key pressed + // 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) // up arrow key pressed + else if (keyCode == 38 || keyCode == 63232) // up arrow key pressed new_row = this.get_prev_row(); if (new_row) @@ -619,7 +693,7 @@ return false; if (!this.draglayer) - this.draglayer = new rcube_layer('rcmdraglayer', {x:0, y:0, width:300, vis:0, zindex:2000}); + this.draglayer = new rcube_layer('rcmdraglayer', {x:0, y:0, vis:0, zindex:2000}); // get subjects of selectedd messages var names = ''; @@ -665,6 +739,7 @@ { var pos = rcube_event.get_mouse_pos(e); this.draglayer.move(pos.x+20, pos.y-5); + this.trigger_event('dragmove', e); } this.drag_start = false; @@ -689,6 +764,8 @@ rcube_event.remove_listener({element:document, event:'mousemove', object:this, method:'drag_mouse_move'}); rcube_event.remove_listener({element:document, event:'mouseup', object:this, method:'drag_mouse_up'}); + this.focus(); + return rcube_event.cancel(e); }, @@ -743,12 +820,12 @@ * This will execute all registered event handlers * @private */ -trigger_event: function(evt) +trigger_event: function(evt, p) { if (this.events[evt] && this.events[evt].length) { for (var i=0; i<this.events[evt].length; i++) if (typeof(this.events[evt][i]) == 'function') - this.events[evt][i](this); + this.events[evt][i](this, p); } } -- Gitblit v1.9.1