<!DOCTYPE html>
<!--
Copyright (c) 2013 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.
-->

<link rel="import" href="/core/analysis/object_snapshot_view.html">
<link rel="import" href="/core/analysis/object_instance_view.html">
<link rel="import" href="/core/tracks/multi_row_track.html">
<link rel="import" href="/core/tracks/object_instance_track.html">
<link rel="import" href="/base/sorted_array_utils.html">
<link rel="import" href="/base/ui.html">
<script>
'use strict';

tr.exportTo('tr.c.tracks', function() {
  /**
   * A track that displays a ObjectInstanceGroup.
   * @constructor
   * @extends {ContainerTrack}
   */
  var ObjectInstanceGroupTrack = tr.b.ui.define(
      'object-instance-group-track', tr.c.tracks.MultiRowTrack);

  ObjectInstanceGroupTrack.prototype = {

    __proto__: tr.c.tracks.MultiRowTrack.prototype,

    decorate: function(viewport) {
      tr.c.tracks.MultiRowTrack.prototype.decorate.call(this, viewport);
      this.classList.add('object-instance-group-track');
      this.objectInstances_ = undefined;
    },

    get objectInstances() {
      return this.itemsToGroup;
    },

    set objectInstances(objectInstances) {
      this.setItemsToGroup(objectInstances);
    },

    addSubTrack_: function(objectInstances) {
      var hasMultipleRows = this.subRows.length > 1;
      var track = new tr.c.tracks.ObjectInstanceTrack(this.viewport);
      track.objectInstances = objectInstances;
      this.appendChild(track);
      return track;
    },

    buildSubRows_: function(objectInstances) {
      objectInstances.sort(function(x, y) {
        return x.creationTs - y.creationTs;
      });

      var subRows = [];
      for (var i = 0; i < objectInstances.length; i++) {
        var objectInstance = objectInstances[i];

        var found = false;
        for (var j = 0; j < subRows.length; j++) {
          var subRow = subRows[j];
          var lastItemInSubRow = subRow[subRow.length - 1];
          if (objectInstance.creationTs >= lastItemInSubRow.deletionTs) {
            found = true;
            subRow.push(objectInstance);
            break;
          }
        }
        if (!found) {
          var subRow = [objectInstance];
          subRows.push(subRow);
        }
      }
      return subRows;
    },
    updateHeadingAndTooltip_: function() {
    }
  };

  return {
    ObjectInstanceGroupTrack: ObjectInstanceGroupTrack
  };
});
</script>
