X-Git-Url: https://jfr.im/git/irc/quakenet/qwebirc.git/blobdiff_plain/1f06a70a688258220144ec59043885b411e37b7c..ea29e3d77bb6b6f11545dd02a43883def07ea869:/js/ui/baseuiwindow.js diff --git a/js/ui/baseuiwindow.js b/js/ui/baseuiwindow.js index b7b7683..22200ad 100644 --- a/js/ui/baseuiwindow.js +++ b/js/ui/baseuiwindow.js @@ -1,3 +1,12 @@ +qwebirc.ui.HILIGHT_NONE = 0; +qwebirc.ui.HILIGHT_ACTIVITY = 1; +qwebirc.ui.HILIGHT_SPEECH = 2; +qwebirc.ui.HILIGHT_US = 3; + +qwebirc.ui.MAXIMUM_LINES_PER_WINDOW = 1000; + +qwebirc.ui.WINDOW_LASTLINE = qwebirc.ui.WINDOW_QUERY | qwebirc.ui.WINDOW_MESSAGES | qwebirc.ui.WINDOW_CHANNEL | qwebirc.ui.WINDOW_STATUS; + qwebirc.ui.Window = new Class({ Implements: [Events], initialize: function(parentObject, client, type, name, identifier) { @@ -7,18 +16,28 @@ qwebirc.ui.Window = new Class({ this.active = false; this.client = client; this.identifier = identifier; - this.hilighted = false; + this.hilighted = qwebirc.ui.HILIGHT_NONE; this.scrolltimer = null; this.commandhistory = this.parentObject.commandhistory; this.scrolleddown = true; - //new CommandHistory(); - }, - updateNickList: function(nicks) { + this.scrollpos = null; + this.lastNickHash = new QHash(); + this.lastSelected = null; + this.subWindow = null; + this.closed = false; + + if(this.type & qwebirc.ui.WINDOW_LASTLINE) { + this.lastPositionLine = new Element("hr"); + this.lastPositionLine.addClass("lastpos"); + this.lastPositionLineInserted = false; + } }, updateTopic: function(topic, element) { - qwebirc.ui.Colourise("[" + topic + "]", element, this.client.exec, this.parentObject.urlDispatcher.bind(this.parentObject)); + qwebirc.ui.Colourise("[" + topic + "]", element, this.client.exec, this.parentObject.urlDispatcher.bind(this.parentObject), this); }, close: function() { + this.closed = true; + if($defined(this.scrolltimer)) { $clear(this.scrolltimer); this.scrolltimer = null; @@ -27,62 +46,143 @@ qwebirc.ui.Window = new Class({ this.parentObject.__closed(this); this.fireEvent("close", this); }, + subEvent: function(event) { + if($defined(this.subWindow)) + this.subWindow.fireEvent(event); + }, + setSubWindow: function(window) { + this.subWindow = window; + }, select: function() { + if(this.lastPositionLineInserted && !this.parentObject.uiOptions.LASTPOS_LINE) { + this.lines.removeChild(this.lastPositionLine); + this.lastPositionLineInserted = false; + } + this.active = true; this.parentObject.__setActiveWindow(this); if(this.hilighted) - this.setHilighted(false); - if(this.scrolleddown) - this.scrollToBottom(); + this.setHilighted(qwebirc.ui.HILIGHT_NONE); + + this.subEvent("select"); + this.resetScrollPos(); + this.lastSelected = new Date(); }, deselect: function() { - if(!this.parentObject.singleWindow) - this.scrolleddown = this.scrolledDown(); + this.subEvent("deselect"); + + this.setScrollPos(); if($defined(this.scrolltimer)) { $clear(this.scrolltimer); this.scrolltimer = null; } + if(this.type & qwebirc.ui.WINDOW_LASTLINE) + this.replaceLastPositionLine(); + this.active = false; }, + resetScrollPos: function() { + if(this.scrolleddown) { + this.scrollToBottom(); + } else if($defined(this.scrollpos)) { + this.getScrollParent().scrollTo(this.scrollpos.x, this.scrollpos.y); + } + }, + setScrollPos: function() { + if(!this.parentObject.singleWindow) { + this.scrolleddown = this.scrolledDown(); + this.scrollpos = this.lines.getScroll(); + } + }, addLine: function(type, line, colour, element) { - if(!this.active && !this.hilighted) - this.setHilighted(true); + var hilight = qwebirc.ui.HILIGHT_NONE; + var lhilight = false; + + if(type) { + hilight = qwebirc.ui.HILIGHT_ACTIVITY; + + if(type.match(/(NOTICE|ACTION|MSG)$/)) { + if(this.type == qwebirc.ui.WINDOW_QUERY || this.type == qwebirc.ui.WINDOW_MESSAGES) { + if(type.match(/^OUR/) || type.match(/NOTICE$/)) { + hilight = qwebirc.ui.HILIGHT_ACTIVITY; + } else { + hilight = qwebirc.ui.HILIGHT_US; + this.parentObject.beep(); + this.parentObject.flash(); + } + } + if(!type.match(/^OUR/) && this.client.hilightController.match(line["m"])) { + lhilight = true; + hilight = qwebirc.ui.HILIGHT_US; + this.parentObject.beep(); + this.parentObject.flash(); + } else if(hilight != qwebirc.ui.HILIGHT_US) { + hilight = qwebirc.ui.HILIGHT_SPEECH; + } + } + } + + if(!this.active && (hilight != qwebirc.ui.HILIGHT_NONE)) + this.setHilighted(hilight); + if(type) - line = this.parentObject.theme.message(type, line); + line = this.parentObject.theme.message(type, line, lhilight); - qwebirc.ui.Colourise(qwebirc.irc.IRCTimestamp(new Date()) + " " + line, element, this.client.exec, this.parentObject.urlDispatcher.bind(this.parentObject)); + var tsE = document.createElement("span"); + tsE.className = "timestamp"; + tsE.appendChild(document.createTextNode(qwebirc.irc.IRCTimestamp(new Date()) + " ")); + element.appendChild(tsE); + qwebirc.ui.Colourise(line, element, this.client.exec, this.parentObject.urlDispatcher.bind(this.parentObject), this); this.scrollAdd(element); }, errorMessage: function(message) { - this.addLine("", message, "red"); + this.addLine("", message, "warncolour"); + }, + infoMessage: function(type, message) { + if(message === undefined) { + this.addLine("", type, "infocolour"); + } else { + this.addLine(type, message, "infocolour"); + } }, setHilighted: function(state) { - this.hilighted = state; + if(state == qwebirc.ui.HILIGHT_NONE || state >= this.hilighted) + this.hilighted = state; }, scrolledDown: function() { if(this.scrolltimer) return true; var parent = this.lines; - - var prev = parent.getScroll(); - var prevbottom = parent.getScrollSize().y; - var prevsize = parent.getSize(); - - /* fixes an IE bug */ - if(prevbottom < prevsize.y) - prevbottom = prevsize.y; - - return prev.y + prevsize.y == prevbottom; + + var scrollPos = parent.getScroll().y; + var linesHeight = parent.getScrollSize().y; + var windowHeight = parent.clientHeight; + + /* + * fixes an IE bug: the scrollheight is less than the actual height + * when the div isn't full + */ + if(linesHeight < windowHeight) + linesHeight = windowHeight; + + return scrollPos + windowHeight >= linesHeight - 3; /* window of error */ }, - scrollToBottom: function() { - var parent = this.lines; - var scrollparent = parent; + getScrollParent: function() { + var scrollparent = this.lines; if($defined(this.scroller)) scrollparent = this.scroller; + return scrollparent; + }, + scrollToBottom: function() { + if(this.type == qwebirc.ui.WINDOW_CUSTOM || this.type == qwebirc.ui.WINDOW_CONNECT) + return; + + var parent = this.lines; + var scrollparent = this.getScrollParent(); scrollparent.scrollTo(parent.getScroll().x, parent.getScrollSize().y); }, @@ -93,18 +193,78 @@ qwebirc.ui.Window = new Class({ if($defined(element)) { var sd = this.scrolledDown(); parent.appendChild(element); - if(sd) { - if(this.scrolltimer) - $clear(this.scrolltimer); + if(parent.childNodes.length > qwebirc.ui.MAXIMUM_LINES_PER_WINDOW) + parent.removeChild(parent.firstChild); + + if(sd && !this.scrollTimer) this.scrolltimer = this.scrollAdd.delay(50, this, [null]); - } } else { this.scrollToBottom(); this.scrolltimer = null; } }, + updateNickList: function(nicks) { + var nickHash = new QHash(), present = new QSet(); + var added = []; + var lnh = this.lastNickHash; + + for(var i=0;i