blob: 3728481be17e09a0b110c86a820303f353d26479 [file] [log] [blame]
<!DOCTYPE html>
<!--
Copyright 2015 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/ui/extras/drive/comment_element.html">
<polymer-element name='tr-ui-e-drive-comments-side-panel'
extends='tr-ui-side-panel'>
<template>
<style>
:host {
flex-direction: column;
display: flex;
width: 290px;
overflow-y: scroll;
overflow-x: hidden;
background-color: #eee;
}
toolbar {
flex: 0 0 auto;
border-bottom: 1px solid black;
display: flex;
}
result-area {
flex: 1 1 auto;
display: block;
min-height: 0;
padding: 4px;
}
#comments-textarea-container {
display: flex;
}
#commentinput {
width: 100%;
}
</style>
<toolbar id='toolbar'></toolbar>
<result-area id='result_area'>
<template repeat="{{ comment in comments_ }}">
<tr-ui-e-drive-comment-element comment="{{comment}}"
on-click="{{commentClick}}">
</tr-ui-e-drive-comment-element>
</template>
<div id="comments-textarea-container">
<textarea id="commentinput" on-focus='{{textAreaFocus}}'
on-blur='{{textAreaBlur}}'
on-keypress="{{textareaKeypress}}"></textarea>
</div>
</result-area>
</template>
<script>
'use strict';
Polymer({
ready: function() {
this.rangeOfInterest_ = new tr.b.Range();
this.selection_ = undefined;
this.comments_ = [];
this.annotationFromComment_ = undefined;
this.textAreaFocused = false;
},
setCommentProvider: function(commentProvider) {
this.commentProvider_ = commentProvider;
},
attached: function() {
if (this.commentProvider_ === undefined) {
this.commentProvider_ =
new tr.ui.e.drive.analysis.DefaultCommentProvider();
}
this.commentProvider_.attachToElement(this);
},
detached: function() {
this.commentProvider_.detachFromElement();
},
commentClick: function(event, detail, sender) {
var anchor = sender.comment.anchor;
if (anchor === undefined)
return;
var uiState =
JSON.parse(anchor).a[0][tr.ui.e.drive.constants.ANCHOR_NAME];
var myEvent = new CustomEvent('navigateToUIState', { detail:
new tr.ui.b.UIState(new tr.model.Location(uiState.location.xWorld,
uiState.location.yComponents),
uiState.scaleX)
});
document.dispatchEvent(myEvent);
if (this.annotationFromComment_)
this.model.removeAnnotation(this.annotationFromComment_);
var loc = new tr.model.Location(uiState.location.xWorld,
uiState.location.yComponents);
var text = sender.comment.author.displayName + ': ' +
sender.comment.content;
this.annotationFromComment_ =
new tr.model.CommentBoxAnnotation(loc, text);
this.model.addAnnotation(this.annotationFromComment_);
},
textareaKeypress: function(event, detail, sender) {
// Check for return key.
if (event.keyCode === 13 && !event.ctrlKey) {
this.commentProvider_.addComment(this.$.commentinput.value);
this.$.commentinput.value = '';
}
event.stopPropagation();
return true;
},
textAreaFocus: function(event) {
this.textAreaFocused = true;
},
textAreaBlur: function(event) {
this.textAreaFocused = false;
},
get rangeOfInterest() {
return this.rangeOfInterest_;
},
set rangeOfInterest(rangeOfInterest) {
this.rangeOfInterest_ = rangeOfInterest;
this.updateContents_();
},
get currentRangeOfInterest() {
if (this.rangeOfInterest_.isEmpty)
return this.model_.bounds;
else
return this.rangeOfInterest_;
},
get model() {
return this.model_;
},
set model(model) {
this.model_ = model;
this.updateContents_();
},
set selection(selection) {
this.selection_ = selection;
},
updateContents_: function() {
this.commentProvider_.updateComments();
},
supportsModel: function(m) {
if (m === undefined) {
return {
supported: false,
reason: 'Unknown tracing model'
};
}
return {
supported: true
};
},
get textLabel() {
return 'Comments';
}
});
</script>
</polymer-element>