DocumentServer/OfficeWeb/apps/documenteditor/mobile/app/plugin/Pinchemu.js
nikolay ivanov a8be6b9e72 init repo
2014-07-05 18:22:49 +00:00

229 lines
8.9 KiB
JavaScript

/*
* (c) Copyright Ascensio System SIA 2010-2014
*
* This program is a free software product. You can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License (AGPL)
* version 3 as published by the Free Software Foundation. In accordance with
* Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
* that Ascensio System SIA expressly excludes the warranty of non-infringement
* of any third-party rights.
*
* This program is distributed WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
*
* You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia,
* EU, LV-1021.
*
* The interactive user interfaces in modified source and object code versions
* of the Program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU AGPL version 3.
*
* Pursuant to Section 7(b) of the License you must retain the original Product
* logo when distributing the program. Pursuant to Section 7(e) we decline to
* grant you any rights under trademark law for use of our trademarks.
*
* All the Product's GUI elements, including illustrations and icon sets, as
* well as technical writing content are licensed under the terms of the
* Creative Commons Attribution-ShareAlike 4.0 International. See the License
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
*
*/
Ext.define("DE.plugin.Pinchemu", {
extend: "Ext.Component",
alias: "plugin.pinchemu",
config: {
helpers: true
},
init: function (cmp) {
var self = this;
self.touchHelpers = [];
self.touchHelpers[0] = Ext.create("Ext.Button", {
top: 0,
left: 0,
style: "opacity: 0.6;",
iconMask: true,
round: true,
hidden: true
});
self.touchHelpers[1] = Ext.create("Ext.Button", {
top: 0,
left: 0,
style: "opacity: 0.6;",
iconMask: true,
round: true,
hidden: true
});
Ext.Viewport.add(self.touchHelpers[0]);
Ext.Viewport.add(self.touchHelpers[1]);
self.cmp = cmp;
self.cmp.on({
scope: self,
painted: self.initPinchsim
});
},
initPinchsim: function () {
var self = this;
this.pinchStarted = false;
var item = self.cmp;
if (!item.pinchSimEnabled) {
if (item.rendered) {
self.initHandlers(item);
} else {
item.on({
painted: self.initHandlers
});
}
}
},
initHandlers: function (item) {
var self = this;
item.element.on({
scope: self,
touchstart: function (ev) {
if ((ev.event.ctrlKey || ev.event.shiftKey) && self.pinchStarted === false) {
self.pinchStarted = true;
if (ev.event.ctrlKey) {
self.zoomStart = 100;
self.zoomDirection = 1;
} else {
if (ev.event.shiftKey) {
self.zoomStart = 340;
self.zoomDirection = -1;
}
}
self.zoomFactor = 1;
self.onTouchStart(item, ev);
}
},
touchend: function (ev) {
if (self.pinchStarted) {
self.pinchStarted = false;
self.onTouchEnd(item, ev);
}
},
touchcancel: function (ev) {
if (self.pinchStarted) {
self.pinchStarted = false;
self.onTouchEnd(item, ev);
}
},
touchmove: function (ev) {
if ((ev.event.ctrlKey || ev.event.shiftKey) && this.pinchStarted === true) {
self.onTouchMove(item, ev);
} else {
if (self.pinchStarted) {
self.pinchStarted = false;
self.onTouchEnd(item, ev);
}
}
}
});
item.pinchSimEnabled = true;
},
showHelpers: function (ev) {
var touches = ev.touches;
if (typeof touches === "object" && this.getHelpers()) {
this.moveHelpers(touches);
this.setHelpersArrows(ev);
this.touchHelpers[0].show();
this.touchHelpers[1].show();
}
},
setHelpersArrows: function (ev) {
if (ev.event.ctrlKey) {
this.touchHelpers[0].setIconCls("arrow_right");
this.touchHelpers[1].setIconCls("arrow_left");
} else {
this.touchHelpers[0].setIconCls("arrow_left");
this.touchHelpers[1].setIconCls("arrow_right");
}
},
moveHelpers: function (touches) {
this.touchHelpers[0].setTop(touches[0].point.y);
this.touchHelpers[0].setLeft(touches[0].point.x);
this.touchHelpers[1].setTop(touches[1].point.y);
this.touchHelpers[1].setLeft(touches[1].point.x);
},
hideHelpers: function () {
this.touchHelpers[0].hide();
this.touchHelpers[1].hide();
},
convertEvent: function (ev) {
var self = this;
var touches = Array.prototype.slice.call(ev.touches);
if (!touches) {
touches = self.lastTouches;
}
ev.touches = touches;
if (touches.length > 0) {
if (!self.touchStartPoint) {
var startX = touches[0].point.x;
var startY = touches[0].point.y;
var startPageX = touches[0].pageX;
var startPageY = touches[0].pageY;
touches[0].point.x = touches[0].point.x + self.zoomStart / 2;
touches[0].pageX = touches[0].pageX + self.zoomStart / 2;
touches[1] = {};
touches[1].identifier = 2;
touches[1].pageX = startPageX - self.zoomStart / 2;
touches[1].pageY = startPageY;
touches[1].point = touches[0].point.clone();
touches[1].point.x = startX - self.zoomStart / 2;
touches[1].point.y = touches[0].point.y;
touches[1].target = touches[0].target;
touches[1].targets = touches[0].targets;
touches[1].timeStamp = touches[0].timeStamp;
this.touchStartPoint = {
x: startX,
y: startY,
pageX: startPageX,
pageY: startPageY,
distance: touches[0].point.getDistanceTo(touches[1].point)
};
} else {
touches[0].point = self.lastTouches[0].point.clone();
touches[0].point.x = Ext.Number.constrain(self.lastTouches[0].point.x + self.zoomFactor * self.zoomDirection, self.touchStartPoint.x + self.zoomFactor);
touches[0].pageX = Ext.Number.constrain(self.lastTouches[0].pageX + self.zoomFactor * self.zoomDirection, self.touchStartPoint.x + self.zoomFactor);
touches[1] = {};
touches[1].point = self.lastTouches[1].point.clone();
touches[1].point.x = Ext.Number.constrain(self.lastTouches[1].point.x - self.zoomFactor * self.zoomDirection, self.touchStartPoint.x + self.zoomFactor);
touches[1].pageX = Ext.Number.constrain(self.lastTouches[1].pageX - self.zoomFactor * self.zoomDirection, self.touchStartPoint.x + self.zoomFactor);
touches[1].pageY = self.lastTouches[1].pageY;
touches[1].target = touches[0].target;
touches[1].targets = touches[0].targets;
touches[1].timeStamp = touches[0].timeStamp;
}
self.lastTouches = touches;
}
ev.scale = self.getNewScale(ev);
return ev;
},
getNewScale: function (ev) {
var self = this;
if (ev.touches.length > 0) {
var newDistance = ev.touches[0].point.getDistanceTo(ev.touches[1].point);
self.lastScale = newDistance / self.touchStartPoint.distance;
return self.lastScale;
} else {
return self.lastScale;
}
},
onTouchStart: function () {
this.lastScale = 1;
var ev = this.convertEvent(arguments[1]);
this.showHelpers(ev);
},
onTouchMove: function () {
var ev = this.convertEvent(arguments[1]);
this.lastTouches = Array.prototype.slice.call(ev.touches);
this.moveHelpers(ev.touches);
},
onTouchEnd: function () {
var ev = this.convertEvent(arguments[1]);
this.hideHelpers();
this.touchStartPoint = null;
this.lastTouches = null;
this.lastScale = null;
}
});