1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 'use strict'; 6 7 /** 8 * A stack of overlays that display itself and handle mouse events. 9 * TODO(kaznacheev) Consider disbanding this class and moving 10 * the functionality to individual objects that display anything or handle 11 * mouse events. 12 * @constructor 13 */ 14 function ImageBuffer() { 15 this.overlays_ = []; 16 } 17 18 /** 19 * TODO(JSDOC). 20 * @param {ImageBuffer.Overlay} overlay // TODO(JSDOC). 21 */ 22 ImageBuffer.prototype.addOverlay = function(overlay) { 23 var zIndex = overlay.getZIndex(); 24 // Store the overlays in the ascending Z-order. 25 var i; 26 for (i = 0; i != this.overlays_.length; i++) { 27 if (zIndex < this.overlays_[i].getZIndex()) break; 28 } 29 this.overlays_.splice(i, 0, overlay); 30 }; 31 32 /** 33 * TODO(JSDOC). 34 * @param {ImageBuffer.Overlay} overlay // TODO(JSDOC). 35 */ 36 ImageBuffer.prototype.removeOverlay = function(overlay) { 37 for (var i = 0; i != this.overlays_.length; i++) { 38 if (this.overlays_[i] == overlay) { 39 this.overlays_.splice(i, 1); 40 return; 41 } 42 } 43 throw new Error('Cannot remove overlay ' + overlay); 44 }; 45 46 /** 47 * Draws overlays in the ascending Z-order. 48 */ 49 ImageBuffer.prototype.draw = function() { 50 for (var i = 0; i != this.overlays_.length; i++) { 51 this.overlays_[i].draw(); 52 } 53 }; 54 55 /** 56 * Searches for a cursor style in the descending Z-order. 57 * @param {number} x X coordinate for cursor. 58 * @param {number} y Y coordinate for cursor. 59 * @param {boolean} mouseDown If mouse button is down. 60 * @return {string} A value for style.cursor CSS property. 61 */ 62 ImageBuffer.prototype.getCursorStyle = function(x, y, mouseDown) { 63 for (var i = this.overlays_.length - 1; i >= 0; i--) { 64 var style = this.overlays_[i].getCursorStyle(x, y, mouseDown); 65 if (style) return style; 66 } 67 return 'default'; 68 }; 69 70 /** 71 * Searches for a click handler in the descending Z-order. 72 * @param {number} x X coordinate for click event. 73 * @param {number} y Y coordinate for click event. 74 * @return {boolean} True if handled. 75 */ 76 ImageBuffer.prototype.onClick = function(x, y) { 77 for (var i = this.overlays_.length - 1; i >= 0; i--) { 78 if (this.overlays_[i].onClick(x, y)) return true; 79 } 80 return false; 81 }; 82 83 /** 84 * Searches for a drag handler in the descending Z-order. 85 * @param {number} x Event X coordinate. 86 * @param {number} y Event Y coordinate. 87 * @param {boolean} touch True if it's a touch event, false if mouse. 88 * @return {function(number,number)} A function to be called on mouse drag. 89 */ 90 ImageBuffer.prototype.getDragHandler = function(x, y, touch) { 91 for (var i = this.overlays_.length - 1; i >= 0; i--) { 92 var handler = this.overlays_[i].getDragHandler(x, y, touch); 93 if (handler) 94 return handler; 95 } 96 return null; 97 }; 98 99 /** 100 * Searches for an action for the double tap enumerating 101 * layers in the descending Z-order. 102 * @param {number} x X coordinate of the event. 103 * @param {number} y Y coordinate of the event. 104 * @return {ImageBuffer.DoubleTapAction} Action to perform as result. 105 */ 106 ImageBuffer.prototype.getDoubleTapAction = function(x, y) { 107 for (var i = this.overlays_.length - 1; i >= 0; i--) { 108 var action = this.overlays_[i].getDoubleTapAction(x, y); 109 if (action != ImageBuffer.DoubleTapAction.NOTHING) 110 return action; 111 } 112 return ImageBuffer.DoubleTapAction.NOTHING; 113 }; 114 115 /** 116 * Possible double tap actions. 117 * @enum 118 */ 119 ImageBuffer.DoubleTapAction = { 120 NOTHING: 0, 121 COMMIT: 1, 122 CANCEL: 2 123 }; 124 125 /** 126 * ImageBuffer.Overlay is a pluggable extension that modifies the outlook 127 * and the behavior of the ImageBuffer instance. 128 * @class 129 */ 130 ImageBuffer.Overlay = function() {}; 131 132 /** 133 * TODO(JSDOC). 134 * @return {number} // TODO(JSDOC). 135 */ 136 ImageBuffer.Overlay.prototype.getZIndex = function() { return 0 }; 137 138 /** 139 * TODO(JSDOC). 140 */ 141 ImageBuffer.Overlay.prototype.draw = function() {}; 142 143 /** 144 * TODO(JSDOC). 145 * @param {number} x X coordinate for cursor. 146 * @param {number} y Y coordinate for cursor. 147 * @param {boolean} mouseDown If mouse button is down. 148 * @return {?string} A value for style.cursor CSS property or null for 149 * default. 150 */ 151 ImageBuffer.Overlay.prototype.getCursorStyle = function(x, y, mouseDown) { 152 return null; 153 }; 154 155 /** 156 * TODO(JSDOC). 157 * @param {number} x // TODO(JSDOC). 158 * @param {number} y // TODO(JSDOC). 159 * @return {boolean} // TODO(JSDOC). 160 */ 161 ImageBuffer.Overlay.prototype.onClick = function(x, y) { 162 return false; 163 }; 164 165 /** 166 * TODO(JSDOC). 167 * @param {number} x Event X coordinate. 168 * @param {number} y Event Y coordinate. 169 * @param {boolean} touch True if it's a touch event, false if mouse. 170 * @return {function(number,number)} A function to be called on mouse drag. 171 */ 172 ImageBuffer.Overlay.prototype.getDragHandler = function(x, y, touch) { 173 return null; 174 }; 175 176 /** 177 * TODO(JSDOC). 178 * @param {number} x // TODO(JSDOC). 179 * @param {number} y // TODO(JSDOC). 180 * @return {ImageBuffer.DoubleTapAction} // TODO(JSDOC). 181 */ 182 ImageBuffer.Overlay.prototype.getDoubleTapAction = function(x, y) { 183 return ImageBuffer.DoubleTapAction.NOTHING; 184 }; 185