| /** | 
 |  * @license | 
 |  * Copyright (C) 2016 The Android Open Source Project | 
 |  * | 
 |  * Licensed under the Apache License, Version 2.0 (the "License"); | 
 |  * you may not use this file except in compliance with the License. | 
 |  * You may obtain a copy of the License at | 
 |  * | 
 |  * http://www.apache.org/licenses/LICENSE-2.0 | 
 |  * | 
 |  * Unless required by applicable law or agreed to in writing, software | 
 |  * distributed under the License is distributed on an "AS IS" BASIS, | 
 |  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
 |  * See the License for the specific language governing permissions and | 
 |  * limitations under the License. | 
 |  */ | 
 | (function() { | 
 |   'use strict'; | 
 |  | 
 |   Polymer({ | 
 |     is: 'gr-selection-action-box', | 
 |  | 
 |     /** | 
 |      * Fired when the comment creation action was taken (hotkey, click). | 
 |      * | 
 |      * @event create-comment | 
 |      */ | 
 |  | 
 |     properties: { | 
 |       keyEventTarget: { | 
 |         type: Object, | 
 |         value() { return document.body; }, | 
 |       }, | 
 |       range: { | 
 |         type: Object, | 
 |         value: { | 
 |           startLine: NaN, | 
 |           startChar: NaN, | 
 |           endLine: NaN, | 
 |           endChar: NaN, | 
 |         }, | 
 |       }, | 
 |       positionBelow: Boolean, | 
 |       side: { | 
 |         type: String, | 
 |         value: '', | 
 |       }, | 
 |     }, | 
 |  | 
 |     behaviors: [ | 
 |       Gerrit.KeyboardShortcutBehavior, | 
 |     ], | 
 |  | 
 |     listeners: { | 
 |       mousedown: '_handleMouseDown', // See https://crbug.com/gerrit/4767 | 
 |     }, | 
 |  | 
 |     keyBindings: { | 
 |       c: '_handleCKey', | 
 |     }, | 
 |  | 
 |     placeAbove(el) { | 
 |       Polymer.dom.flush(); | 
 |       const rect = this._getTargetBoundingRect(el); | 
 |       const boxRect = this.$.tooltip.getBoundingClientRect(); | 
 |       const parentRect = this.parentElement.getBoundingClientRect(); | 
 |       this.style.top = | 
 |           rect.top - parentRect.top - boxRect.height - 6 + 'px'; | 
 |       this.style.left = | 
 |           rect.left - parentRect.left + (rect.width - boxRect.width) / 2 + 'px'; | 
 |     }, | 
 |  | 
 |     placeBelow(el) { | 
 |       Polymer.dom.flush(); | 
 |       const rect = this._getTargetBoundingRect(el); | 
 |       const boxRect = this.$.tooltip.getBoundingClientRect(); | 
 |       const parentRect = this.parentElement.getBoundingClientRect(); | 
 |       this.style.top = | 
 |           rect.top - parentRect.top + boxRect.height - 6 + 'px'; | 
 |       this.style.left = | 
 |           rect.left - parentRect.left + (rect.width - boxRect.width) / 2 + 'px'; | 
 |     }, | 
 |  | 
 |     _getTargetBoundingRect(el) { | 
 |       let rect; | 
 |       if (el instanceof Text) { | 
 |         const range = document.createRange(); | 
 |         range.selectNode(el); | 
 |         rect = range.getBoundingClientRect(); | 
 |         range.detach(); | 
 |       } else { | 
 |         rect = el.getBoundingClientRect(); | 
 |       } | 
 |       return rect; | 
 |     }, | 
 |  | 
 |     _handleCKey(e) { | 
 |       if (this.shouldSuppressKeyboardShortcut(e) || | 
 |           this.modifierPressed(e)) { return; } | 
 |  | 
 |       e.preventDefault(); | 
 |       this._fireCreateComment(); | 
 |     }, | 
 |  | 
 |     _handleMouseDown(e) { | 
 |       if (e.button !== 0) { return; } // 0 = main button | 
 |       e.preventDefault(); | 
 |       e.stopPropagation(); | 
 |       this._fireCreateComment(); | 
 |     }, | 
 |  | 
 |     _fireCreateComment() { | 
 |       this.fire('create-comment', {side: this.side, range: this.range}); | 
 |     }, | 
 |   }); | 
 | })(); |