Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / ui / file_manager / gallery / js / image_editor / image_buffer.js
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 };