<!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="/tracing/model/event_set.html">
<link rel="import" href="/tracing/ui/analysis/analysis_link.html">
<link rel="import" href="/tracing/ui/analysis/analysis_sub_view.html">
<link rel="import" href="/tracing/ui/analysis/generic_object_view.html">
<link rel="import" href="/tracing/ui/analysis/object_instance_view.html">
<link rel="import" href="/tracing/ui/analysis/object_snapshot_view.html">
<link rel="import" href="/tracing/ui/analysis/single_event_sub_view.html">
<link rel="import" href="/tracing/value/ui/scalar_span.html">
<link rel="import" href="/tracing/value/unit.html">

<polymer-element name="tr-ui-a-single-object-snapshot-sub-view"
    extends="tr-ui-a-sub-view">
  <template>
    <style>
    #args {
      white-space: pre;
    }

    :host {
      overflow: auto;
      display: flex;
    }

    ::content * {
      -webkit-user-select: text;
    }

    ::content .title {
      border-bottom: 1px solid rgb(128, 128, 128);
      font-size: 110%;
      font-weight: bold;
    }

    ::content td, th {
      font-family: monospace;
      vertical-align: top;
    }
    </style>
    <content></content>
  </template>
  <script>
  'use strict';

  Polymer({
    created: function() {
      this.currentSelection_ = undefined;
    },

    get requiresTallView() {
      if (this.children.length === 0)
        return false;
      if (this.children[0] instanceof tr.ui.analysis.ObjectSnapshotView)
        return this.children[0].requiresTallView;
    },

    get selection() {
      return this.currentSelection_;
    },

    set selection(selection) {
      if (selection.length !== 1)
        throw new Error('Only supports single item selections');
      if (!(selection[0] instanceof tr.model.ObjectSnapshot))
        throw new Error('Only supports object instances');

      this.textContent = '';
      this.currentSelection_ = selection;

      var snapshot = selection[0];

      var typeInfo = tr.ui.analysis.ObjectSnapshotView.getTypeInfo(
          snapshot.objectInstance.category, snapshot.objectInstance.typeName);
      if (typeInfo) {
        var customView = new typeInfo.constructor();
        this.appendChild(customView);
        customView.modelEvent = snapshot;
      } else {
        this.appendGenericAnalysis_(snapshot);
      }
    },

    appendGenericAnalysis_: function(snapshot) {
      var instance = snapshot.objectInstance;

      this.textContent = '';

      var titleEl = document.createElement('div');
      titleEl.classList.add('title');
      titleEl.appendChild(document.createTextNode('Snapshot of '));
      this.appendChild(titleEl);

      var instanceLinkEl = document.createElement('tr-ui-a-analysis-link');
      instanceLinkEl.selection = new tr.model.EventSet(instance);
      titleEl.appendChild(instanceLinkEl);

      titleEl.appendChild(document.createTextNode(' @ '));

      titleEl.appendChild(tr.v.ui.createScalarSpan(snapshot.ts, {
        unit: tr.v.Unit.byName.timeStampInMs,
        ownerDocument: this.ownerDocument
      }));

      var tableEl = document.createElement('table');
      this.appendChild(tableEl);

      var rowEl = document.createElement('tr');
      tableEl.appendChild(rowEl);

      var labelEl = document.createElement('td');
      labelEl.textContent = 'args:';
      rowEl.appendChild(labelEl);

      var argsEl = document.createElement('td');
      argsEl.id = 'args';
      rowEl.appendChild(argsEl);

      var objectViewEl = document.createElement('tr-ui-a-generic-object-view');
      objectViewEl.object = snapshot.args;
      argsEl.appendChild(objectViewEl);
    }
  });
  </script>
</polymer-element>
