<!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/base/color_scheme.html">
<link rel="import" href="/tracing/base/iteration_helpers.html">
<link rel="import" href="/tracing/base/sorted_array_utils.html">
<link rel="import" href="/tracing/base/unit.html">
<link rel="import" href="/tracing/base/utils.html">
<link rel="import" href="/tracing/model/event_set.html">
<link rel="import" href="/tracing/model/model.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/value/ui/scalar_span.html">

<dom-module id='tr-ui-a-single-thread-time-slice-sub-view'>
  <template>
    <style>
    table {
      border-collapse: collapse;
      border-width: 0;
      margin-bottom: 25px;
      width: 100%;
    }

    table tr > td:first-child {
      padding-left: 2px;
    }

    table tr > td {
      padding: 2px 4px 2px 4px;
      vertical-align: text-top;
      width: 150px;
    }

    table td td {
      padding: 0 0 0 0;
      width: auto;
    }
    tr {
      vertical-align: top;
    }

    tr:nth-child(2n+0) {
      background-color: #e2e2e2;
    }
    </style>
    <table>
      <tr>
        <td>Running process:</td><td id="process-name"></td>
      </tr>
      <tr>
        <td>Running thread:</td><td id="thread-name"></td>
      </tr>
      <tr>
        <td>State:</td>
        <td><b><span id="state"></span></b></td>
      </tr>
      <tr>
        <td>Start:</td>
        <td>
          <tr-v-ui-scalar-span id="start">
          </tr-v-ui-scalar-span>
        </td>
      </tr>
      <tr>
        <td>Duration:</td>
        <td>
          <tr-v-ui-scalar-span id="duration">
          </tr-v-ui-scalar-span>
        </td>
      </tr>

      <tr>
        <td>On CPU:</td><td id="on-cpu"></td>
      </tr>

      <tr>
        <td>Running instead:</td><td id="running-instead"></td>
      </tr>

      <tr>
        <td>Args:</td><td id="args"></td>
      </tr>
    </table>
  </template>
</dom-module>
<script>
'use strict';

Polymer({
  is: 'tr-ui-a-single-thread-time-slice-sub-view',
  behaviors: [tr.ui.analysis.AnalysisSubView],

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

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

  set selection(selection) {
    var timeSlice = tr.b.getOnlyElement(selection);

    if (!(timeSlice instanceof tr.model.ThreadTimeSlice))
      throw new Error('Only supports thread time slices');

    this.currentSelection_ = selection;

    var thread = timeSlice.thread;

    var root = Polymer.dom(this.root);
    Polymer.dom(root.querySelector('#state')).textContent =
        timeSlice.title;
    var stateColor = tr.b.ColorScheme.colorsAsStrings[timeSlice.colorId];
    root.querySelector('#state').style.backgroundColor = stateColor;

    Polymer.dom(root.querySelector('#process-name')).textContent =
        thread.parent.userFriendlyName;
    Polymer.dom(root.querySelector('#thread-name')).textContent =
        thread.userFriendlyName;

    root.querySelector('#start').setValueAndUnit(
        timeSlice.start, tr.b.Unit.byName.timeStampInMs);
    root.querySelector('#duration').setValueAndUnit(
        timeSlice.duration, tr.b.Unit.byName.timeDurationInMs);

    var onCpuEl = root.querySelector('#on-cpu');
    Polymer.dom(onCpuEl).textContent = '';
    var runningInsteadEl = root.querySelector('#running-instead');
    if (timeSlice.cpuOnWhichThreadWasRunning) {
      Polymer.dom(runningInsteadEl.parentElement).removeChild(runningInsteadEl);

      var cpuLink = document.createElement('tr-ui-a-analysis-link');
      cpuLink.selection = new tr.model.EventSet(
          timeSlice.getAssociatedCpuSlice());
      Polymer.dom(cpuLink).textContent =
          timeSlice.cpuOnWhichThreadWasRunning.userFriendlyName;
      Polymer.dom(onCpuEl).appendChild(cpuLink);
    } else {
      Polymer.dom(onCpuEl.parentElement).removeChild(onCpuEl);

      var cpuSliceThatTookCpu = timeSlice.getCpuSliceThatTookCpu();
      if (cpuSliceThatTookCpu) {
        var cpuLink = document.createElement('tr-ui-a-analysis-link');
        cpuLink.selection = new tr.model.EventSet(cpuSliceThatTookCpu);
        if (cpuSliceThatTookCpu.thread)
          Polymer.dom(cpuLink).textContent =
              cpuSliceThatTookCpu.thread.userFriendlyName;
        else
          Polymer.dom(cpuLink).textContent = cpuSliceThatTookCpu.title;
        Polymer.dom(runningInsteadEl).appendChild(cpuLink);
      } else {
        Polymer.dom(runningInsteadEl.parentElement).removeChild(
            runningInsteadEl);
      }
    }

    var argsEl = root.querySelector('#args');
    if (tr.b.dictionaryKeys(timeSlice.args).length > 0) {
      var argsView =
          document.createElement('tr-ui-a-generic-object-view');
      argsView.object = timeSlice.args;

      argsEl.parentElement.style.display = '';
      Polymer.dom(argsEl).textContent = '';
      Polymer.dom(argsEl).appendChild(argsView);
    } else {
      argsEl.parentElement.style.display = 'none';
    }
  }
});

tr.ui.analysis.AnalysisSubView.register(
    'tr-ui-a-single-thread-time-slice-sub-view',
    tr.model.ThreadTimeSlice,
    {
      multi: false,
      title: 'Thread Timeslice',
    });
</script>
