// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. var DetailsView = (function() { 'use strict'; // We inherit from DivView. var superClass = DivView; /** * The DetailsView displays the "log" view. This class keeps track of the * selected SourceEntries, and repaints when they change. * * @constructor */ function DetailsView(boxId) { superClass.call(this, boxId); this.sourceEntries_ = []; // Map of source IDs to their corresponding DIVs. this.sourceIdToDivMap_ = {}; // True when there's an asychronous repaint outstanding. this.outstandingRepaint_ = false; // ID of source entry we should jump to after the oustanding repaint. // 0 if none, or there's no such repaint. this.outstandingScrollToId_ = 0; } // The delay between updates to repaint. var REPAINT_TIMEOUT_MS = 50; DetailsView.prototype = { // Inherit the superclass's methods. __proto__: superClass.prototype, setData: function(sourceEntries) { // Make a copy of the array (in case the caller mutates it), and sort it // by the source ID. this.sourceEntries_ = createSortedCopy_(sourceEntries); // Repaint the view. if (this.isVisible() && !this.outstandingRepaint_) { this.outstandingRepaint_ = true; window.setTimeout(this.repaint.bind(this), REPAINT_TIMEOUT_MS); } }, repaint: function() { this.outstandingRepaint_ = false; this.sourceIdToDivMap_ = {}; this.getNode().innerHTML = ''; var node = this.getNode(); for (var i = 0; i < this.sourceEntries_.length; ++i) { if (i != 0) addNode(node, 'hr'); var sourceEntry = this.sourceEntries_[i]; var div = addNode(node, 'div'); div.className = 'log-source-entry'; var p = addNode(div, 'p'); addNodeWithText(p, 'h4', sourceEntry.getSourceId() + ': ' + sourceEntry.getSourceTypeString()); if (sourceEntry.getDescription()) addNodeWithText(p, 'h4', sourceEntry.getDescription()); var logEntries = sourceEntry.getLogEntries(); var startDate = timeutil.convertTimeTicksToDate(logEntries[0].time); var startTimeDiv = addNodeWithText(p, 'div', 'Start Time: '); timeutil.addNodeWithDate(startTimeDiv, startDate); sourceEntry.printAsText(div); this.sourceIdToDivMap_[sourceEntry.getSourceId()] = div; } if (this.outstandingScrollToId_) { this.scrollToSourceId(this.outstandingScrollToId_); this.outstandingScrollToId_ = 0; } }, show: function(isVisible) { superClass.prototype.show.call(this, isVisible); if (isVisible) { this.repaint(); } else { this.getNode().innerHTML = ''; } }, /** * Scrolls to the source indicated by |sourceId|, if displayed. If a * repaint is outstanding, waits for it to complete before scrolling. */ scrollToSourceId: function(sourceId) { if (this.outstandingRepaint_) { this.outstandingScrollToId_ = sourceId; return; } var div = this.sourceIdToDivMap_[sourceId]; if (div) div.scrollIntoView(); } }; function createSortedCopy_(origArray) { var sortedArray = origArray.slice(0); sortedArray.sort(function(a, b) { return a.getSourceId() - b.getSourceId(); }); return sortedArray; } return DetailsView; })();