1<!DOCTYPE html>
2<!--
3Copyright (c) 2013 The Chromium Authors. All rights reserved.
4Use of this source code is governed by a BSD-style license that can be
5found in the LICENSE file.
6-->
7
8<link rel="import" href="/tracing/base/task.html">
9<link rel="import" href="/tracing/ui/tracks/track.html">
10<link rel="import" href="/tracing/core/filter.html">
11<link rel="import" href="/tracing/ui/base/ui.html">
12
13<script>
14'use strict';
15
16tr.exportTo('tr.ui.tracks', function() {
17  var Task = tr.b.Task;
18
19  /**
20   * A generic track that contains other tracks as its children.
21   * @constructor
22   */
23  var ContainerTrack = tr.ui.b.define('container-track', tr.ui.tracks.Track);
24  ContainerTrack.prototype = {
25    __proto__: tr.ui.tracks.Track.prototype,
26
27    decorate: function(viewport) {
28      tr.ui.tracks.Track.prototype.decorate.call(this, viewport);
29    },
30
31    detach: function() {
32      this.textContent = '';
33    },
34
35    get tracks_() {
36      var tracks = [];
37      for (var i = 0; i < this.children.length; i++) {
38        if (this.children[i] instanceof tr.ui.tracks.Track)
39          tracks.push(this.children[i]);
40      }
41      return tracks;
42    },
43
44    drawTrack: function(type) {
45      this.tracks_.forEach(function(track) {
46        track.drawTrack(type);
47      });
48    },
49
50    /**
51     * Adds items intersecting the given range to a selection.
52     * @param {number} loVX Lower X bound of the interval to search, in
53     *     viewspace.
54     * @param {number} hiVX Upper X bound of the interval to search, in
55     *     viewspace.
56     * @param {number} loY Lower Y bound of the interval to search, in
57     *     viewspace space.
58     * @param {number} hiY Upper Y bound of the interval to search, in
59     *     viewspace space.
60     * @param {Selection} selection Selection to which to add results.
61     */
62    addIntersectingEventsInRangeToSelection: function(
63        loVX, hiVX, loY, hiY, selection) {
64      for (var i = 0; i < this.tracks_.length; i++) {
65        var trackClientRect = this.tracks_[i].getBoundingClientRect();
66        var a = Math.max(loY, trackClientRect.top);
67        var b = Math.min(hiY, trackClientRect.bottom);
68        if (a <= b)
69          this.tracks_[i].addIntersectingEventsInRangeToSelection(
70              loVX, hiVX, loY, hiY, selection);
71      }
72
73      tr.ui.tracks.Track.prototype.addIntersectingEventsInRangeToSelection.
74          apply(this, arguments);
75    },
76
77    addEventsToTrackMap: function(eventToTrackMap) {
78      for (var i = 0; i < this.children.length; ++i)
79        this.children[i].addEventsToTrackMap(eventToTrackMap);
80    },
81
82    addAllEventsMatchingFilterToSelection: function(filter, selection) {
83      for (var i = 0; i < this.tracks_.length; i++)
84        this.tracks_[i].addAllEventsMatchingFilterToSelection(
85            filter, selection);
86    },
87
88    addAllEventsMatchingFilterToSelectionAsTask: function(filter, selection) {
89      var task = new Task();
90      for (var i = 0; i < this.tracks_.length; i++) {
91        task.subTask(function(i) { return function() {
92          this.tracks_[i].addAllEventsMatchingFilterToSelection(
93              filter, selection);
94        } }(i), this);
95      }
96      return task;
97    },
98
99    addClosestEventToSelection: function(
100        worldX, worldMaxDist, loY, hiY, selection) {
101      for (var i = 0; i < this.tracks_.length; i++) {
102        var trackClientRect = this.tracks_[i].getBoundingClientRect();
103        var a = Math.max(loY, trackClientRect.top);
104        var b = Math.min(hiY, trackClientRect.bottom);
105        if (a <= b) {
106          this.tracks_[i].addClosestEventToSelection(
107              worldX, worldMaxDist, loY, hiY, selection);
108        }
109      }
110
111      tr.ui.tracks.Track.prototype.addClosestEventToSelection.
112          apply(this, arguments);
113    },
114
115    addContainersToTrackMap: function(containerToTrackMap) {
116      this.tracks_.forEach(function(track) {
117        track.addContainersToTrackMap(containerToTrackMap);
118      });
119    },
120
121    clearTracks_: function() {
122      this.tracks_.forEach(function(track) {
123        this.removeChild(track);
124      }, this);
125    }
126  };
127
128  return {
129    ContainerTrack: ContainerTrack
130  };
131});
132</script>
133