<!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/base/ui.html">
<link rel="import" href="/tracing/ui/brushing_state_controller.html">

<dom-module id='tr-ui-a-analysis-link'>
  <template>
    <style>
    :host {
      display: inline;
      cursor: pointer;
      cursor: pointer;
      white-space: nowrap;
    }
    a {
      text-decoration: underline;
    }
    </style>
    <a href="{{href}}" on-click="onClicked_" on-mouseenter="onMouseEnter_" on-mouseleave="onMouseLeave_"><content></content></a>

  </template>
</dom-module>
<script>
'use strict';

Polymer({
  is: 'tr-ui-a-analysis-link',

  properties: {
    href: {
      type: String
    }
  },

  listeners: {
    'click': 'onClicked_',
    'mouseenter': 'onMouseEnter_',
    'mouseleave': 'onMouseLeave_'
  },

  ready: function() {
    this.selection_ = undefined;
  },

  attached: function() {
    // Save an instance of the controller since it's going to be used in
    // detached() where it can no longer be obtained.
    this.controller_ =
        tr.c.BrushingStateController.getControllerForElement(this);
  },

  detached: function() {
    // Reset highlights.
    this.clearHighlight_();
    this.controller_ = undefined;
  },

  set color(c) {
    this.style.color = c;
  },

  /**
   * @return {*|function():*}
   */
  get selection() {
    return this.selection_;
  },

  /**
   * |selection| can be anything except a function, or else a function that
   * can return anything.
   *
   * In the context of trace_viewer, |selection| is typically an EventSet,
   * whose events will be highlighted by trace_viewer when this link is
   * clicked or mouse-entered.
   *
   * If |selection| is not a function, then it will be dispatched to this
   * link's embedder via a RequestSelectionChangeEvent when this link is
   * clicked or mouse-entered.
   *
   * If |selection| is a function, then it will be called when this link is
   * clicked or mouse-entered, and its result will be dispatched to this
   * link's embedder via a RequestSelectionChangeEvent.
   *
   * @param {*|function():*} selection
   */
  set selection(selection) {
    this.selection_ = selection;
    Polymer.dom(this).textContent = selection.userFriendlyName;
  },

  setSelectionAndContent: function(selection, opt_textContent) {
    this.selection_ = selection;
    if (opt_textContent)
      Polymer.dom(this).textContent = opt_textContent;
  },

  /**
   * If |selection| is a function, call it and return the result.
   * Otherwise return |selection| directly.
   *
   * @return {*}
   */
  getCurrentSelection_: function() {
    // Gets the current selection, invoking the selection function if needed.
    if (typeof this.selection_ === 'function')
      return this.selection_();
    return this.selection_;
  },

  setHighlight_: function(opt_eventSet) {
    if (this.controller_)
      this.controller_.changeAnalysisLinkHoveredEvents(opt_eventSet);
  },

  clearHighlight_: function(opt_eventSet) {
    this.setHighlight_();
  },

  onClicked_: function(clickEvent) {
    if (!this.selection_)
      return;

    clickEvent.stopPropagation();

    var event = new tr.model.RequestSelectionChangeEvent();
    event.selection = this.getCurrentSelection_();
    this.dispatchEvent(event);
  },

  onMouseEnter_: function() {
    this.setHighlight_(this.getCurrentSelection_());
  },

  onMouseLeave_: function() {
    this.clearHighlight_();
  }
});
</script>
