// 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}); }, }); })();