From 176c76c4310bfbba64d1f1f0f8679de5dbcbe78e Mon Sep 17 00:00:00 2001 From: alecpl <alec@alec.pl> Date: Fri, 18 Jun 2010 14:30:35 -0400 Subject: [PATCH] - unset env.messages on mailbox change to save some browser's memory --- program/js/app.js | 167 +++++++++++++++++++++++++++++++++---------------------- 1 files changed, 100 insertions(+), 67 deletions(-) diff --git a/program/js/app.js b/program/js/app.js index 3921fab..402e1f9 100644 --- a/program/js/app.js +++ b/program/js/app.js @@ -203,7 +203,7 @@ 'open', 'mark', 'edit', 'viewsource', 'download', 'print', 'load-attachment', 'load-headers']; if (this.env.action=='show' || this.env.action=='preview') { - this.enable_command(this.env.message_commands, true); + this.enable_command(this.env.message_commands, this.env.uid); if (this.env.next_uid) { this.enable_command('nextmessage', 'lastmessage', true); @@ -243,7 +243,7 @@ this.init_messageform(); } // show printing dialog - else if (this.env.action == 'print') + else if (this.env.action == 'print' && this.env.uid) window.print(); // get unread count for each mailbox @@ -1243,7 +1243,11 @@ var boffset = bw.ie ? -document.documentElement.scrollTop : this.initialBodyScrollTop; var moffset = this.initialListScrollTop-this.gui_objects.folderlist.parentNode.scrollTop; var toffset = -moffset-boffset; - var li, div, pos, mouse; + var li, div, pos, mouse, check, oldclass, + layerclass = 'draglayernormal'; + + if (this.contact_list && this.contact_list.draglayer) + oldclass = this.contact_list.draglayer.attr('class'); mouse = rcube_event.get_mouse_pos(e); pos = this.env.folderlist_coords; @@ -1256,6 +1260,8 @@ this.env.folder_coords[this.env.last_folder_target].on = 0; this.env.last_folder_target = null; } + if (layerclass != oldclass && this.contact_list && this.contact_list.draglayer) + this.contact_list.draglayer.attr('class', layerclass); return; } @@ -1263,7 +1269,7 @@ for (var k in this.env.folder_coords) { pos = this.env.folder_coords[k]; if (mouse.x >= pos.x1 && mouse.x < pos.x2 && mouse.y >= pos.y1 && mouse.y < pos.y2){ - if (this.check_droptarget(k)) { + if ((check = this.check_droptarget(k))) { li = this.get_folder_li(k); div = $(li.getElementsByTagName('div')[0]); @@ -1286,6 +1292,7 @@ $(li).addClass('droptarget'); this.env.folder_coords[k].on = 1; this.env.last_folder_target = k; + layerclass = 'draglayer' + (check > 1 ? 'copy' : 'normal'); } else { // Clear target, otherwise drag end will trigger move into last valid droptarget this.env.last_folder_target = null; } @@ -1295,6 +1302,9 @@ this.env.folder_coords[k].on = 0; } } + + if (layerclass != oldclass && this.contact_list && this.contact_list.draglayer) + this.contact_list.draglayer.attr('class', layerclass); } }; @@ -1485,13 +1495,13 @@ if (this.env.messages[row.uid]) this.env.messages[row.uid].expanded = row.expanded; }; - + this.msglist_set_coltypes = function(list) { var i, found, name, cols = list.list.tHead.rows[0].cells; - + this.env.coltypes = []; - + for (i=0; i<cols.length; i++) if (cols[i].id && cols[i].id.match(/^rcm/)) { name = cols[i].id.replace(/^rcm/, ''); @@ -1501,21 +1511,35 @@ if ((found = $.inArray('flag', this.env.coltypes)) >= 0) this.set_env('flagged_col', found); + if ((found = $.inArray('subject', this.env.coltypes)) >= 0) + this.set_env('subject_col', found); + this.http_post('save-pref', { '_name':'list_cols', '_value':this.env.coltypes }); }; this.check_droptarget = function(id) { + var allow = false, copy = false; + if (this.task == 'mail') - return (this.env.mailboxes[id] && this.env.mailboxes[id].id != this.env.mailbox && !this.env.mailboxes[id].virtual); - else if (this.task == 'addressbook') - return (id != this.env.source && this.env.contactfolders[id] && !this.env.contactfolders[id].readonly && - !(!this.env.source && this.env.contactfolders[id].group) && - !(this.env.contactfolders[id].type == 'group' && this.env.contactfolders[this.env.source].readonly) && - !(this.env.contactfolders[id].type == 'group' && this.env.contactfolders[id].source != this.env.source) && - !(this.env.contactfolders[id].type == 'group' && this.env.contactfolders[id].id == this.env.group)); + allow = (this.env.mailboxes[id] && this.env.mailboxes[id].id != this.env.mailbox && !this.env.mailboxes[id].virtual); else if (this.task == 'settings') - return (id != this.env.folder); + allow = (id != this.env.folder); + else if (this.task == 'addressbook') { + if (id != this.env.source && this.env.contactfolders[id]) { + if (this.env.contactfolders[id].type == 'group') { + var target_abook = this.env.contactfolders[id].source; + allow = this.env.contactfolders[id].id != this.env.group && !this.env.contactfolders[target_abook].readonly; + copy = target_abook != this.env.source; + } + else { + allow = !this.env.contactfolders[id].readonly; + copy = true; + } + } + } + + return allow ? (copy ? 2 : 1) : 0; }; @@ -1570,7 +1594,9 @@ depth: flags.depth?flags.depth:0, unread_children: flags.unread_children?flags.unread_children:0, parent_uid: flags.parent_uid?flags.parent_uid:0, - selected: this.select_all_mode || this.message_list.in_selection(uid) + selected: this.select_all_mode || this.message_list.in_selection(uid), + // flags from plugins + flags: flags.extra_flags }); var c, tree = expando = '', @@ -1727,16 +1753,13 @@ name = oldcols[i] == 'to' ? 'from' : oldcols[i]; idx = $.inArray(name, cols); if (idx != -1) { - newcols[newcols.length] = name; + newcols.push(name); delete cols[idx]; - } - else if (name == 'threads') { - delete oldcols[i]; } } for (i=0; i<cols.length; i++) if (cols[i]) - newcols[newcols.length] = cols[i]; + newcols.push(cols[i]); if (newcols.join() != oldcols.join()) { update = 1; @@ -1873,6 +1896,7 @@ this.env.current_page = page; this.select_all_mode = false; this.show_contentframe(false); + this.env.messages = {}; } if (mbox != this.env.mailbox || (mbox == this.env.mailbox && !page && !sort)) @@ -2237,8 +2261,6 @@ rows[uid].forwarded = status; else if (flag == 'flagged') rows[uid].flagged = status; - -// this.env.messages[uid] = rows[uid]; }; // set message row status, class and icon @@ -3455,7 +3477,7 @@ for (i=0; i < a_results.length; i++) { text = typeof a_results[i] == 'object' ? a_results[i].name : a_results[i]; li = document.createElement('LI'); - li.innerHTML = text.replace(new RegExp('('+s_val+')', 'ig'), '##$1%%').replace(/</g, '<').replace(/>/g, '>').replace(/##([^%]+)%%/g, '<b>$1</b>'); + li.innerHTML = text.replace(new RegExp('('+RegExp.escape(s_val)+')', 'ig'), '##$1%%').replace(/</g, '<').replace(/>/g, '>').replace(/##([^%]+)%%/g, '<b>$1</b>'); li.onmouseover = function(){ ref.ksearch_select(this); }; li.onmouseup = function(){ ref.ksearch_click(this) }; li._rcm_id = i; @@ -3633,10 +3655,24 @@ if (!cid) cid = this.contact_list.get_selection().join(','); - if (to.type == 'group') - this.http_post('group-addmembers', '_cid='+urlencode(cid)+'&_source='+urlencode(this.env.source)+'&_gid='+urlencode(to.id)); - else if (to.id != this.env.source && cid && this.env.address_sources[to.id] && !this.env.address_sources[to.id].readonly) - this.http_post('copy', '_cid='+urlencode(cid)+'&_source='+urlencode(this.env.source)+'&_to='+urlencode(to.id)+(this.env.group ? '&_gid='+urlencode(this.env.group) : '')); + if (to.type == 'group' && to.source == this.env.source) { + this.http_post('group-addmembers', '_cid='+urlencode(cid) + + '&_source='+urlencode(this.env.source) + + '&_gid='+urlencode(to.id)); + } + else if (to.type == 'group' && !this.env.address_sources[to.source].readonly) { + this.http_post('copy', '_cid='+urlencode(cid) + + '&_source='+urlencode(this.env.source) + + '&_to='+urlencode(to.source) + + '&_togid='+urlencode(to.id) + + (this.env.group ? '&_gid='+urlencode(this.env.group) : '')); + } + else if (to.id != this.env.source && cid && this.env.address_sources[to.id] && !this.env.address_sources[to.id].readonly) { + this.http_post('copy', '_cid='+urlencode(cid) + + '&_source='+urlencode(this.env.source) + + '&_to='+urlencode(to.id) + + (this.env.group ? '&_gid='+urlencode(this.env.group) : '')); + } }; @@ -4566,58 +4602,54 @@ // for reordering column array (Konqueror workaround) // and for setting some message list global variables this.set_message_coltypes = function(coltypes, repl) - { + { this.env.coltypes = coltypes; // set correct list titles - var thead = this.gui_objects.messagelist ? this.gui_objects.messagelist.tHead : null; + var thead = this.gui_objects.messagelist ? this.gui_objects.messagelist.tHead : null, + cell, col, n, len; // replace old column headers - if (thead && repl) { - for (var cell, c=0; c < repl.length; c++) { - cell = thead.rows[0].cells[c]; - if (!cell) { + if (thead) { + if (repl) { + var th = document.createElement('thead'), + tr = document.createElement('tr'); + for (c=0, len=repl.length; c < len; c++) { cell = document.createElement('td'); - thead.rows[0].appendChild(cell); + cell.innerHTML = repl[c].html; + if (repl[c].id) cell.id = repl[c].id; + if (repl[c].className) cell.className = repl[c].className; + tr.appendChild(cell); } - cell.innerHTML = repl[c].html; - if (repl[c].id) cell.id = repl[c].id; - if (repl[c].className) cell.className = repl[c].className; + th.appendChild(tr); + thead.parentNode.replaceChild(th, thead); + } + + for (n=0, len=this.env.coltypes.length; n<len; n++) { + col = this.env.coltypes[n]; + if ((cell = thead.rows[0].cells[n]) && (col=='from' || col=='to')) { + cell.id = 'rcm'+col; + // if we have links for sorting, it's a bit more complicated... + if (cell.firstChild && cell.firstChild.tagName.toLowerCase()=='a') { + cell = cell.firstChild; + cell.onclick = function(){ return rcmail.command('sort', this.__col, this); }; + cell.__col = col; + } + cell.innerHTML = this.get_label(col); + } } } - - var cell, col, n; - for (n=0; thead && n<this.env.coltypes.length; n++) { - col = this.env.coltypes[n]; - if ((cell = thead.rows[0].cells[n]) && (col=='from' || col=='to')) { - // if we have links for sorting, it's a bit more complicated... - if (cell.firstChild && cell.firstChild.tagName.toLowerCase()=='a') { - cell.firstChild.innerHTML = this.get_label(this.env.coltypes[n]); - cell.firstChild.onclick = function(){ return rcmail.command('sort', this.__col, this); }; - cell.firstChild.__col = col; - } - else - cell.innerHTML = this.get_label(this.env.coltypes[n]); - - cell.id = 'rcm'+col; - } - } - - // remove excessive columns - for (var i=n+1; thead && i<thead.rows[0].cells.length; i++) - thead.rows[0].removeChild(thead.rows[0].cells[i]); this.env.subject_col = null; this.env.flagged_col = null; - var found; - if ((found = $.inArray('subject', this.env.coltypes)) >= 0) { - this.set_env('subject_col', found); + if ((n = $.inArray('subject', this.env.coltypes)) >= 0) { + this.set_env('subject_col', n); if (this.message_list) - this.message_list.subject_col = found; + this.message_list.subject_col = n; } - if ((found = $.inArray('flag', this.env.coltypes)) >= 0) - this.set_env('flagged_col', found); + if ((n = $.inArray('flag', this.env.coltypes)) >= 0) + this.set_env('flagged_col', n); this.message_list.init_header(); }; @@ -4896,7 +4928,7 @@ querystring += (querystring ? '&' : '') + '_remote=1'; var url = this.env.comm_path + '&_action=' + action + '&' + querystring; - + // send request console.log('HTTP GET: ' + url); $.get(url, { _unlock:(lock?1:0) }, function(data){ ref.http_response(data); }, 'json'); @@ -4991,7 +5023,8 @@ this.enable_command(this.env.message_commands, 'purge', 'expunge', 'select-all', 'select-none', 'sort', 'expand-all', 'expand-unread', 'collapse-all', false); } - this.triggerEvent('listupdate', { folder:this.env.mailbox, rowcount:this.message_list.rowcount }); + if (this.message_list) + this.triggerEvent('listupdate', { folder:this.env.mailbox, rowcount:this.message_list.rowcount }); } break; -- Gitblit v1.9.1