// Copyright (c) 2010 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. /** * The DetailsView handles the tabbed view that displays either the "log" or * "timeline" view. This class keeps track of what the current view is, and * invalidates the specific view each time the selected data has changed. * * @constructor */ function DetailsView(tabHandlesContainerId, logTabId, timelineTabId, logBoxId, timelineBoxId) { TabSwitcherView.call(this, tabHandlesContainerId); this.logView_ = new DetailsLogView(logBoxId); this.timelineView_ = new DetailsTimelineView(timelineBoxId); this.addTab(logTabId, this.logView_, true); this.addTab(timelineTabId, this.timelineView_, true); // Default to the log view. this.switchToTab(logTabId, null); }; inherits(DetailsView, TabSwitcherView); // The delay between updates to repaint. DetailsView.REPAINT_TIMEOUT_MS = 50; /** * Updates the data this view is using. */ DetailsView.prototype.setData = function(currentData) { // Make a copy of the array (in case the caller mutates it), and sort it // by the source ID. var sortedCurrentData = DetailsView.createSortedCopy_(currentData); for (var i = 0; i < this.tabs_.length; ++i) this.tabs_[i].contentView.setData(sortedCurrentData); }; DetailsView.createSortedCopy_ = function(origArray) { var sortedArray = origArray.slice(0); sortedArray.sort(function(a, b) { return a.getSourceId() - b.getSourceId(); }); return sortedArray; }; //----------------------------------------------------------------------------- /** * Base class for the Log view and Timeline view. * * @constructor */ function DetailsSubView(boxId) { DivView.call(this, boxId); this.sourceEntries_ = []; } inherits(DetailsSubView, DivView); DetailsSubView.prototype.setData = function(sourceEntries) { this.sourceEntries_ = sourceEntries; // Repaint the view. if (this.isVisible() && !this.outstandingRepaint_) { this.outstandingRepaint_ = true; window.setTimeout(this.repaint.bind(this), DetailsView.REPAINT_TIMEOUT_MS); } }; DetailsSubView.prototype.repaint = function() { this.outstandingRepaint_ = false; this.getNode().innerHTML = ''; }; DetailsSubView.prototype.show = function(isVisible) { DetailsSubView.superClass_.show.call(this, isVisible); if (isVisible) { this.repaint(); } else { this.getNode().innerHTML = ''; } }; //----------------------------------------------------------------------------- /** * Subview that is displayed in the log tab. * @constructor */ function DetailsLogView(boxId) { DetailsSubView.call(this, boxId); } inherits(DetailsLogView, DetailsSubView); DetailsLogView.prototype.repaint = function() { DetailsLogView.superClass_.repaint.call(this); PaintLogView(this.sourceEntries_, this.getNode()); }; //----------------------------------------------------------------------------- /** * Subview that is displayed in the timeline tab. * @constructor */ function DetailsTimelineView(boxId) { DetailsSubView.call(this, boxId); } inherits(DetailsTimelineView, DetailsSubView); DetailsTimelineView.prototype.repaint = function() { DetailsTimelineView.superClass_.repaint.call(this); PaintTimelineView(this.sourceEntries_, this.getNode()); };