1383 lines
40 KiB
JavaScript
1383 lines
40 KiB
JavaScript
/*
|
||
* (c) Copyright Ascensio System SIA 2010-2024
|
||
*
|
||
* 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 20A-6 Ernesta Birznieka-Upish
|
||
* street, Riga, Latvia, EU, LV-1050.
|
||
*
|
||
* 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
|
||
*
|
||
*/
|
||
|
||
"use strict";
|
||
(/**
|
||
* @param {Window} window
|
||
* @param {undefined} undefined
|
||
*/
|
||
function (window, undefined)
|
||
{
|
||
// Import
|
||
var global_mouseEvent = AscCommon.global_mouseEvent;
|
||
var AscBrowser = AscCommon.AscBrowser;
|
||
|
||
/**
|
||
* @extends {AscCommon.CMobileDelegateSimple}
|
||
*/
|
||
function CMobileDelegateEditorCell(_manager)
|
||
{
|
||
this.Name = "cell";
|
||
this.WB = _manager.Api.wb;
|
||
this.DrawingDocument = this.WB.model.getDrawingDocument();
|
||
|
||
this.Offset = { X: 0, Y: 0};
|
||
this.Size = { W : 0, H : 0 };
|
||
|
||
AscCommon.CMobileDelegateSimple.call(this, _manager);
|
||
}
|
||
|
||
CMobileDelegateEditorCell.prototype = Object.create(AscCommon.CMobileDelegateSimple.prototype);
|
||
CMobileDelegateEditorCell.prototype.constructor = CMobileDelegateEditorCell;
|
||
CMobileDelegateEditorCell.prototype.Resize = function()
|
||
{
|
||
let _element = document.getElementById("editor_sdk");
|
||
let pos = AscCommon.UI.getBoundingClientRect(_element);
|
||
this.Offset.X = pos.x || pos.left;
|
||
this.Offset.Y = pos.y || pos.top;
|
||
|
||
this.Size.W = _element.offsetWidth;
|
||
this.Size.H = _element.offsetHeight;
|
||
};
|
||
CMobileDelegateEditorCell.prototype.ConvertCoordsToCursor = function(x, y, page, isGlobal, isNoCell)
|
||
{
|
||
var _res = this.WB.ConvertLogicToXY(x, y);
|
||
var _point = {X: _res.X, Y: _res.Y, Page: 0, DrawPage: 0};
|
||
|
||
if (AscBrowser.isCustomScaling())
|
||
{
|
||
if (isNoCell === true)
|
||
{
|
||
_point.X /= AscCommon.AscBrowser.retinaPixelRatio;
|
||
_point.Y /= AscCommon.AscBrowser.retinaPixelRatio;
|
||
}
|
||
else
|
||
{
|
||
_point.X /= AscCommon.AscBrowser.retinaPixelRatio;
|
||
_point.Y /= AscCommon.AscBrowser.retinaPixelRatio;
|
||
|
||
_point.X = _point.X >> 0;
|
||
_point.Y = _point.Y >> 0;
|
||
}
|
||
}
|
||
|
||
if (isGlobal !== false)
|
||
{
|
||
_point.X += this.Offset.X;
|
||
_point.Y += this.Offset.Y;
|
||
}
|
||
|
||
return _point;
|
||
};
|
||
CMobileDelegateEditorCell.prototype.ConvertCoordsFromCursor = function(x, y)
|
||
{
|
||
var _x = (x - this.Offset.X) * AscCommon.AscBrowser.retinaPixelRatio;
|
||
var _y = (y - this.Offset.Y) * AscCommon.AscBrowser.retinaPixelRatio;
|
||
|
||
var _res = this.WB.ConvertXYToLogic(_x, _y);
|
||
var _point = {X: _res.X, Y: _res.Y, Page: 0, DrawPage: 0};
|
||
return _point;
|
||
};
|
||
CMobileDelegateEditorCell.prototype.GetZoomFit = function()
|
||
{
|
||
// min zoom
|
||
return 50;
|
||
};
|
||
CMobileDelegateEditorCell.prototype.GetZoom = function()
|
||
{
|
||
return 100 * this.Api.asc_getZoom();
|
||
};
|
||
CMobileDelegateEditorCell.prototype.SetZoom = function(_value)
|
||
{
|
||
if (!this.useDelayZoom)
|
||
return this.Api.asc_setZoom(_value / 100);
|
||
|
||
AscCommon.PaintMessageLoop.prototype.delayRun(this, function(){
|
||
this.Api.asc_setZoom(_value / 100);
|
||
});
|
||
};
|
||
CMobileDelegateEditorCell.prototype.GetScrollerSize = function()
|
||
{
|
||
return {
|
||
W : this.WB.element.clientWidth + this.WB.controller.hsbMax,
|
||
H : this.WB.element.clientHeight + this.WB.controller.vsbMax
|
||
};
|
||
};
|
||
CMobileDelegateEditorCell.prototype.GetSelectionTransform = function()
|
||
{
|
||
if (this.WB.getWorksheet().objectRender.controller.selectedObjects.length == 0)
|
||
return null;
|
||
return this.WB.getWorksheet().objectRender.controller.drawingDocument.SelectionMatrix;
|
||
};
|
||
CMobileDelegateEditorCell.prototype.GetScrollerParent = function()
|
||
{
|
||
return this.WB.element;
|
||
};
|
||
CMobileDelegateEditorCell.prototype.GetObjectTrack = function(x, y, page, bSelected, bText)
|
||
{
|
||
if (this.WB.getCellEditMode())
|
||
{
|
||
var _coords = this.WB.ConvertLogicToXY(x, y);
|
||
|
||
AscCommon.global_mouseEvent.KoefPixToMM = 5;
|
||
var _cursor = this.WB.getWorksheet().getCursorTypeFromXY(_coords.X, _coords.Y);
|
||
AscCommon.global_mouseEvent.KoefPixToMM = 1;
|
||
if (_cursor.target == AscCommonExcel.c_oTargetType.MoveResizeRange)
|
||
return true;
|
||
}
|
||
var tx = (global_mouseEvent.X - this.Offset.X) * AscCommon.AscBrowser.retinaPixelRatio;
|
||
var ty = (global_mouseEvent.Y - this.Offset.Y) * AscCommon.AscBrowser.retinaPixelRatio;
|
||
var oWS = this.WB.getWorksheet();
|
||
var oObjectRender = oWS.objectRender;
|
||
return oObjectRender.isPointInDrawingObjects3(tx, ty, page, bSelected, bText);
|
||
};
|
||
CMobileDelegateEditorCell.prototype.GetSelectionRectsBounds = function()
|
||
{
|
||
var _selection = this.WB.GetSelectionRectsBounds(true);
|
||
|
||
if (_selection)
|
||
{
|
||
var _obj = {
|
||
Start : { X: _selection.X, Y: _selection.Y, W: _selection.W, H: _selection.H, Page: 0 },
|
||
End : { X: _selection.X, Y: _selection.Y, W: _selection.W, H: _selection.H, Page: 0 },
|
||
Type : _selection.T
|
||
};
|
||
|
||
var _captionSize;
|
||
switch (_selection.T)
|
||
{
|
||
case Asc.c_oAscSelectionType.RangeCol:
|
||
{
|
||
_captionSize = this.WB.GetCaptionSize();
|
||
_obj.Start.Y = _obj.End.Y = -_captionSize.H;
|
||
_obj.Start.H = _obj.End.H = _captionSize.H;
|
||
break;
|
||
}
|
||
case Asc.c_oAscSelectionType.RangeRow:
|
||
{
|
||
_captionSize = this.WB.GetCaptionSize();
|
||
_obj.Start.X = _obj.End.X = -_captionSize.W;
|
||
_obj.Start.W = _obj.End.W = _captionSize.W;
|
||
break;
|
||
}
|
||
default:
|
||
break;
|
||
}
|
||
return _obj;
|
||
}
|
||
|
||
return this.WB.getWorksheet().objectRender.controller.GetSelectionBounds();
|
||
};
|
||
CMobileDelegateEditorCell.prototype.ScrollTo = function(_scroll)
|
||
{
|
||
var pos;
|
||
var _api = this.WB;
|
||
|
||
let needInit = false;
|
||
let isSmoothScrolling = _api.getSmoothScrolling();
|
||
if ('v' === _scroll.directionLocked)
|
||
{
|
||
pos = -_scroll.y / _api.controller.settings.hscrollStep;
|
||
if (-_scroll.y >= -_scroll.maxScrollY) {
|
||
needInit = isSmoothScrolling;
|
||
pos += 1;
|
||
}
|
||
_api._onScrollY(pos, needInit, true);
|
||
}
|
||
else if ('h' === _scroll.directionLocked)
|
||
{
|
||
pos = -_scroll.x / _api.controller.settings.vscrollStep;
|
||
if (-_scroll.x >= -_scroll.maxScrollX) {
|
||
needInit = isSmoothScrolling;
|
||
pos += 1;
|
||
}
|
||
_api._onScrollX(pos, needInit, true);
|
||
}
|
||
else if ('n' === _scroll.directionLocked)
|
||
{
|
||
pos = -_scroll.y / _api.controller.settings.hscrollStep;
|
||
if (-_scroll.y >= -_scroll.maxScrollY) {
|
||
needInit = isSmoothScrolling;
|
||
pos += 1;
|
||
}
|
||
_api._onScrollY(pos, needInit, true);
|
||
|
||
pos = -_scroll.x / _api.controller.settings.vscrollStep;
|
||
if (-_scroll.x >= -_scroll.maxScrollX) {
|
||
needInit = isSmoothScrolling;
|
||
pos += 1;
|
||
}
|
||
_api._onScrollX(pos, needInit, true);
|
||
}
|
||
};
|
||
CMobileDelegateEditorCell.prototype.GetContextMenuType = function()
|
||
{
|
||
var _mode = AscCommon.MobileTouchContextMenuType.None;
|
||
|
||
var _controller = this.WB.getWorksheet().objectRender.controller;
|
||
var _selection = this.WB.GetSelectionRectsBounds();
|
||
|
||
if (!_controller.IsSelectionUse() && !_selection)
|
||
_mode = AscCommon.MobileTouchContextMenuType.Target;
|
||
|
||
if (_controller.GetSelectionBounds() || _selection)
|
||
_mode = AscCommon.MobileTouchContextMenuType.Select;
|
||
|
||
if (_mode == 0 && _controller.getSelectedObjectsBounds())
|
||
_mode = AscCommon.MobileTouchContextMenuType.Object;
|
||
|
||
return _mode;
|
||
};
|
||
CMobileDelegateEditorCell.prototype.IsInObject = function()
|
||
{
|
||
var _controller = this.WB.getWorksheet().objectRender.controller;
|
||
return (null != _controller.getSelectedObjectsBounds(true));
|
||
};
|
||
CMobileDelegateEditorCell.prototype.GetContextMenuInfo = function(info)
|
||
{
|
||
info.Clear();
|
||
var _info = null;
|
||
var _transform = null;
|
||
|
||
var _x = 0;
|
||
var _y = 0;
|
||
|
||
var _controller = this.WB.getWorksheet().objectRender.controller;
|
||
var _target = _controller.IsSelectionUse();
|
||
var _selection = this.WB.GetSelectionRectsBounds();
|
||
|
||
if (!_target && !_selection)
|
||
{
|
||
_info = {
|
||
X : this.DrawingDocument.m_dTargetX,
|
||
Y : this.DrawingDocument.m_dTargetY,
|
||
Page : this.DrawingDocument.m_lTargetPage
|
||
};
|
||
|
||
_transform = this.DrawingDocument.TextMatrix;
|
||
if (_transform)
|
||
{
|
||
_x = _transform.TransformPointX(_info.X, _info.Y);
|
||
_y = _transform.TransformPointY(_info.X, _info.Y);
|
||
|
||
_info.X = _x;
|
||
_info.Y = _y;
|
||
}
|
||
info.targetPos = _info;
|
||
return;
|
||
}
|
||
|
||
var _select = _controller.GetSelectionBounds();
|
||
if (_select)
|
||
{
|
||
var _rect1 = _select.Start;
|
||
var _rect2 = _select.End;
|
||
|
||
_info = {
|
||
X1 : _rect1.X,
|
||
Y1 : _rect1.Y,
|
||
Page1 : _rect1.Page,
|
||
X2 : _rect2.X + _rect2.W,
|
||
Y2 : _rect2.Y + _rect2.H,
|
||
Page2 : _rect2.Page
|
||
};
|
||
|
||
_transform = this.DrawingDocument.SelectionMatrix;
|
||
|
||
if (_transform)
|
||
{
|
||
_x = _transform.TransformPointX(_info.X1, _info.Y1);
|
||
_y = _transform.TransformPointY(_info.X1, _info.Y1);
|
||
_info.X1 = _x;
|
||
_info.Y1 = _y;
|
||
|
||
_x = _transform.TransformPointX(_info.X2, _info.Y2);
|
||
_y = _transform.TransformPointY(_info.X2, _info.Y2);
|
||
_info.X2 = _x;
|
||
_info.Y2 = _y;
|
||
}
|
||
|
||
info.selectText = _info;
|
||
return;
|
||
}
|
||
else if (_selection)
|
||
{
|
||
info.selectCell = {
|
||
X : _selection.X,
|
||
Y : _selection.Y,
|
||
W : _selection.W,
|
||
H : _selection.H
|
||
};
|
||
return;
|
||
}
|
||
|
||
var _object_bounds = _controller.getSelectedObjectsBounds();
|
||
if (_object_bounds)
|
||
{
|
||
info.objectBounds = {
|
||
X : _object_bounds.minX,
|
||
Y : _object_bounds.minY,
|
||
R : _object_bounds.maxX,
|
||
B : _object_bounds.maxY,
|
||
Page : _object_bounds.pageIndex
|
||
};
|
||
}
|
||
};
|
||
CMobileDelegateEditorCell.prototype.GetContextMenuPosition = function()
|
||
{
|
||
var _controller = this.WB.getWorksheet().objectRender.controller;
|
||
|
||
var _posX = 0;
|
||
var _posY = 0;
|
||
var _page = 0;
|
||
var _transform = null;
|
||
var tmpX, tmpY, tmpX2, tmpY2;
|
||
var _pos = null;
|
||
|
||
var _mode = 0;
|
||
|
||
var _target = _controller.IsSelectionUse();
|
||
var _selection = this.WB.GetSelectionRectsBounds();
|
||
|
||
if (!_target && !_selection)
|
||
{
|
||
_posX = this.DrawingDocument.m_dTargetX;
|
||
_posY = this.DrawingDocument.m_dTargetY;
|
||
_page = this.DrawingDocument.m_lTargetPage;
|
||
_transform = this.DrawingDocument.TextMatrix;
|
||
|
||
if (_transform)
|
||
{
|
||
tmpX = _transform.TransformPointX(_posX, _posY);
|
||
tmpY = _transform.TransformPointY(_posX, _posY);
|
||
}
|
||
else
|
||
{
|
||
tmpX = _posX;
|
||
tmpY = _posY;
|
||
}
|
||
|
||
_pos = this.ConvertCoordsToCursor(tmpX, tmpY, _page);
|
||
_posX = _pos.X;
|
||
_posY = _pos.Y;
|
||
|
||
_mode = 1;
|
||
}
|
||
|
||
var _select = _controller.GetSelectionBounds();
|
||
if (_select)
|
||
{
|
||
var _rect1 = _select.Start;
|
||
var _rect2 = _select.End;
|
||
|
||
tmpX = _rect1.X;
|
||
tmpY = _rect1.Y;
|
||
tmpX2 = _rect2.X + _rect2.W;
|
||
tmpY2 = _rect2.Y + _rect2.H;
|
||
|
||
_transform = this.DrawingDocument.SelectionMatrix;
|
||
|
||
if (_transform)
|
||
{
|
||
_posX = _transform.TransformPointX(tmpX, tmpY);
|
||
_posY = _transform.TransformPointY(tmpX, tmpY);
|
||
|
||
tmpX = _posX;
|
||
tmpY = _posY;
|
||
|
||
_posX = _transform.TransformPointX(tmpX2, tmpY2);
|
||
_posY = _transform.TransformPointY(tmpX2, tmpY2);
|
||
|
||
tmpX2 = _posX;
|
||
tmpY2 = _posY;
|
||
}
|
||
|
||
_pos = this.ConvertCoordsToCursor(tmpX, tmpY, _rect1.Page);
|
||
_posX = _pos.X;
|
||
_posY = _pos.Y;
|
||
|
||
_pos = this.ConvertCoordsToCursor(tmpX2, tmpY2, _rect2.Page);
|
||
_posX += _pos.X;
|
||
_posX = _posX >> 1;
|
||
|
||
_mode = 2;
|
||
}
|
||
else if (_selection)
|
||
{
|
||
tmpX = _selection.X;
|
||
tmpY = _selection.Y;
|
||
tmpX2 = _selection.X + _selection.W;
|
||
tmpY2 = _selection.Y + _selection.H;
|
||
|
||
_pos = this.ConvertCoordsToCursor(tmpX, tmpY, 0);
|
||
_posX = _pos.X;
|
||
_posY = _pos.Y;
|
||
|
||
_pos = this.ConvertCoordsToCursor(tmpX2, tmpY2, 0);
|
||
_posX += _pos.X;
|
||
_posX = _posX >> 1;
|
||
|
||
_mode = 2;
|
||
}
|
||
|
||
var _object_bounds = _controller.getSelectedObjectsBounds(true);
|
||
if (_object_bounds)
|
||
{
|
||
_pos = this.ConvertCoordsToCursor(_object_bounds.minX, _object_bounds.minY, _object_bounds.pageIndex);
|
||
_posX = _pos.X;
|
||
_posY = _pos.Y;
|
||
|
||
_pos = this.ConvertCoordsToCursor(_object_bounds.maxX, _object_bounds.maxY, _object_bounds.pageIndex);
|
||
_posX += _pos.X;
|
||
_posX = _posX >> 1;
|
||
|
||
_mode = 3;
|
||
}
|
||
|
||
_posX -= this.Offset.X;
|
||
_posY -= this.Offset.Y;
|
||
return { X : _posX, Y : _posY, Mode : _mode };
|
||
};
|
||
|
||
CMobileDelegateEditorCell.prototype._convertLogicToEvent = function(e, x, y, page)
|
||
{
|
||
var _e = {};
|
||
var _pos = this.ConvertCoordsToCursor(x, y, 0);
|
||
|
||
_e.pageX = _pos.X / AscBrowser.zoom;
|
||
_e.pageY = _pos.Y / AscBrowser.zoom;
|
||
|
||
_e.altKey = global_mouseEvent.AltKey;
|
||
_e.shiftKey = global_mouseEvent.ShiftKey;
|
||
_e.ctrlKey = global_mouseEvent.CtrlKey;
|
||
|
||
_e.button = global_mouseEvent.Button;
|
||
return _e;
|
||
};
|
||
CMobileDelegateEditorCell.prototype.Logic_OnMouseDown = function(e, x, y, page)
|
||
{
|
||
return this.Api.controller._onMouseDown(this._convertLogicToEvent(e, x, y, page));
|
||
};
|
||
CMobileDelegateEditorCell.prototype.Logic_OnMouseMove = function(e, x, y, page)
|
||
{
|
||
return this.Api.controller._onMouseMove(this._convertLogicToEvent(e, x, y, page));
|
||
};
|
||
CMobileDelegateEditorCell.prototype.Logic_OnMouseUp = function(e, x, y, page)
|
||
{
|
||
return this.Api.controller._onMouseUp(this._convertLogicToEvent(e, x, y, page));
|
||
};
|
||
CMobileDelegateEditorCell.prototype.extendPointerEvent = function(e)
|
||
{
|
||
try {
|
||
e.button = 0;
|
||
} catch(err) {
|
||
}
|
||
};
|
||
CMobileDelegateEditorCell.prototype.Drawing_OnMouseDown = function(e)
|
||
{
|
||
this.extendPointerEvent(e);
|
||
return this.Api.controller._onMouseDown(e);
|
||
};
|
||
CMobileDelegateEditorCell.prototype.Drawing_OnMouseMove = function(e)
|
||
{
|
||
this.extendPointerEvent(e);
|
||
return this.Api.controller._onMouseMove(e);
|
||
};
|
||
CMobileDelegateEditorCell.prototype.Drawing_OnMouseUp = function(e)
|
||
{
|
||
this.extendPointerEvent(e);
|
||
return this.Api.controller._onMouseUp(e);
|
||
};
|
||
|
||
/**
|
||
* @extends {AscCommon.CMobileTouchManagerBase}
|
||
*/
|
||
function CMobileTouchManager(_config)
|
||
{
|
||
AscCommon.CMobileTouchManagerBase.call(this, _config || {});
|
||
}
|
||
|
||
|
||
CMobileTouchManager.prototype = Object.create(AscCommon.CMobileTouchManagerBase.prototype);
|
||
CMobileTouchManager.prototype.constructor = CMobileTouchManager;
|
||
CMobileTouchManager.prototype.Init = function(_api)
|
||
{
|
||
this.Api = _api;
|
||
|
||
// создаем делегата. инициализация его - ПОСЛЕ создания iScroll
|
||
this.delegate = new CMobileDelegateEditorCell(this);
|
||
var _element = this.delegate.GetScrollerParent();
|
||
this.CreateScrollerDiv(_element);
|
||
|
||
this.iScroll = new window.IScrollMobile(_element, {
|
||
scrollbars: true,
|
||
mouseWheel: !this.isDesktopMode,
|
||
interactiveScrollbars: true,
|
||
shrinkScrollbars: 'scale',
|
||
fadeScrollbars: true,
|
||
scrollX : true,
|
||
scroller_id : this.iScrollElement,
|
||
bounce : false,
|
||
eventsElement : this.eventsElement,
|
||
click : false,
|
||
transparentIndicators : this.isDesktopMode
|
||
});
|
||
|
||
this.delegate.Init();
|
||
|
||
// никаких таблиц
|
||
this.TableTrackEnabled = false;
|
||
|
||
this.CellEditorType = Asc.c_oAscCellEditorState.editEnd;
|
||
|
||
var _that = this;
|
||
this.Api.asc_registerCallback('asc_onEditCell', function(_state) {
|
||
_that.CellEditorType = _state;
|
||
});
|
||
};
|
||
|
||
CMobileTouchManager.prototype.MoveCursorToPoint = function()
|
||
{
|
||
// TODO:
|
||
};
|
||
|
||
CMobileTouchManager.prototype.onTouchStart = function(e)
|
||
{
|
||
let activeElement = document.activeElement;
|
||
if (activeElement && activeElement.nodeName)
|
||
{
|
||
let nameActive = activeElement.nodeName.toUpperCase();
|
||
if ("INPUT" == nameActive || "TEXTAREA" == nameActive)
|
||
{
|
||
if (activeElement !== AscCommon.g_inputContext.HtmlArea)
|
||
activeElement.blur();
|
||
}
|
||
}
|
||
|
||
var _e = e.touches ? e.touches[0] : e;
|
||
this.IsTouching = true;
|
||
AscCommon.g_inputContext.enableVirtualKeyboard();
|
||
|
||
this.checkPointerMultiTouchAdd(e);
|
||
|
||
global_mouseEvent.KoefPixToMM = 5;
|
||
AscCommon.check_MouseDownEvent(_e, true);
|
||
global_mouseEvent.KoefPixToMM = 1;
|
||
global_mouseEvent.LockMouse();
|
||
this.ClearContextMenu();
|
||
|
||
this.MoveAfterDown = false;
|
||
this.TimeDown = new Date().getTime();
|
||
|
||
var bIsKoefPixToMM = false;
|
||
var _matrix = this.delegate.GetSelectionTransform();
|
||
if (_matrix && global_MatrixTransformer.IsIdentity(_matrix))
|
||
_matrix = null;
|
||
|
||
let touchesCount = e.touches ? e.touches.length : this.getPointerCount();
|
||
let isLockedTouch = false;
|
||
|
||
if (touchesCount > 1)
|
||
{
|
||
if (AscCommon.MobileTouchMode.None !== this.Mode &&
|
||
AscCommon.MobileTouchMode.Scroll !== this.Mode)
|
||
{
|
||
isLockedTouch = true;
|
||
}
|
||
}
|
||
|
||
if (!isLockedTouch)
|
||
{
|
||
if (!this.CheckSelectTrack())
|
||
{
|
||
bIsKoefPixToMM = this.CheckObjectTrack();
|
||
}
|
||
}
|
||
|
||
if (!isLockedTouch && (2 === touchesCount))
|
||
{
|
||
this.Mode = AscCommon.MobileTouchMode.Zoom;
|
||
}
|
||
|
||
if (this.Mode == AscCommon.MobileTouchMode.None)
|
||
this.CheckSelectTrackObject();
|
||
|
||
// если не используем этот моус даун - то уменьшаем количество кликов
|
||
switch (this.Mode)
|
||
{
|
||
case AscCommon.MobileTouchMode.None:
|
||
case AscCommon.MobileTouchMode.Scroll:
|
||
case AscCommon.MobileTouchMode.InlineObj:
|
||
case AscCommon.MobileTouchMode.FlowObj:
|
||
case AscCommon.MobileTouchMode.Zoom:
|
||
case AscCommon.MobileTouchMode.Cursor:
|
||
case AscCommon.MobileTouchMode.TableMove:
|
||
case AscCommon.MobileTouchMode.SelectTrack:
|
||
{
|
||
// так как был уже check, нужно уменьшить количество кликов
|
||
if (global_mouseEvent.ClickCount > 0)
|
||
global_mouseEvent.ClickCount--;
|
||
break;
|
||
}
|
||
default:
|
||
break;
|
||
}
|
||
|
||
var isPreventDefault = false;
|
||
switch (this.Mode)
|
||
{
|
||
case AscCommon.MobileTouchMode.Select: // in cell select too
|
||
case AscCommon.MobileTouchMode.InlineObj:
|
||
case AscCommon.MobileTouchMode.FlowObj:
|
||
case AscCommon.MobileTouchMode.Zoom:
|
||
case AscCommon.MobileTouchMode.TableMove:
|
||
case AscCommon.MobileTouchMode.SelectTrack:
|
||
{
|
||
isPreventDefault = true;
|
||
break;
|
||
}
|
||
case AscCommon.MobileTouchMode.None:
|
||
case AscCommon.MobileTouchMode.Scroll:
|
||
{
|
||
isPreventDefault = !this.CheckObjectText();
|
||
break;
|
||
}
|
||
default:
|
||
{
|
||
break;
|
||
}
|
||
}
|
||
|
||
switch (this.Mode)
|
||
{
|
||
case AscCommon.MobileTouchMode.None:
|
||
{
|
||
this.Mode = AscCommon.MobileTouchMode.Scroll;
|
||
this.DownPoint = this.delegate.ConvertCoordsFromCursor(global_mouseEvent.X, global_mouseEvent.Y);
|
||
|
||
this.DownPointOriginal.X = global_mouseEvent.X;
|
||
this.DownPointOriginal.Y = global_mouseEvent.Y;
|
||
|
||
this.iScroll._start(e);
|
||
|
||
break;
|
||
}
|
||
case AscCommon.MobileTouchMode.Scroll:
|
||
{
|
||
// ничего не меняем, просто перемещаем точку
|
||
this.DownPoint = this.delegate.ConvertCoordsFromCursor(global_mouseEvent.X, global_mouseEvent.Y);
|
||
this.DownPointOriginal.X = global_mouseEvent.X;
|
||
this.DownPointOriginal.Y = global_mouseEvent.Y;
|
||
|
||
this.iScroll._start(e);
|
||
|
||
break;
|
||
}
|
||
case AscCommon.MobileTouchMode.Select:
|
||
{
|
||
// сдвиг на чуток, чтобы не попасть на "перемещение" ячеек
|
||
var epsilonForCell = 1.5;
|
||
var _x1 = this.RectSelect1.x + epsilonForCell;
|
||
var _y1 = this.RectSelect1.y + epsilonForCell;
|
||
|
||
var _x2 = this.RectSelect2.x + this.RectSelect2.w - epsilonForCell;
|
||
var _y2 = this.RectSelect2.y + this.RectSelect2.h - epsilonForCell;
|
||
|
||
if (this.RectSelectType === Asc.c_oAscSelectionType.RangeCol || this.RectSelectType === Asc.c_oAscSelectionType.RangeRow)
|
||
AscCommon.global_mouseEvent.KoefPixToMM = -10; // чтобы не попасть в движения
|
||
|
||
if (1 == this.DragSelect)
|
||
{
|
||
global_mouseEvent.Button = 0;
|
||
|
||
if (!_matrix)
|
||
{
|
||
this.delegate.Logic_OnMouseDown(global_mouseEvent, _x2, _y2, this.PageSelect2);
|
||
}
|
||
else
|
||
{
|
||
var __X = _matrix.TransformPointX(_x2, _y2);
|
||
var __Y = _matrix.TransformPointY(_x2, _y2);
|
||
|
||
this.delegate.Logic_OnMouseDown(global_mouseEvent, __X, __Y, this.PageSelect2);
|
||
}
|
||
|
||
this.delegate.Drawing_OnMouseMove(_e);
|
||
}
|
||
else if (2 == this.DragSelect)
|
||
{
|
||
global_mouseEvent.Button = 0;
|
||
|
||
if (!_matrix)
|
||
{
|
||
this.delegate.Logic_OnMouseDown(global_mouseEvent, _x1, _y1, this.PageSelect1);
|
||
}
|
||
else
|
||
{
|
||
var __X = _matrix.TransformPointX(_x1, _y1);
|
||
var __Y = _matrix.TransformPointY(_x1, _y1);
|
||
|
||
this.delegate.Logic_OnMouseDown(global_mouseEvent, __X, __Y, this.PageSelect1);
|
||
}
|
||
|
||
this.delegate.Drawing_OnMouseMove(_e);
|
||
}
|
||
break;
|
||
}
|
||
case AscCommon.MobileTouchMode.InlineObj:
|
||
{
|
||
break;
|
||
}
|
||
case AscCommon.MobileTouchMode.FlowObj:
|
||
case AscCommon.MobileTouchMode.SelectTrack:
|
||
{
|
||
if (bIsKoefPixToMM || this.Mode == AscCommon.MobileTouchMode.SelectTrack)
|
||
{
|
||
global_mouseEvent.KoefPixToMM = 5;
|
||
}
|
||
|
||
if (this.Mode == AscCommon.MobileTouchMode.SelectTrack)
|
||
this.delegate.Drawing_OnMouseMove(e.touches ? e.touches[0] : e);
|
||
|
||
this.delegate.Drawing_OnMouseDown(e.touches ? e.touches[0] : e);
|
||
global_mouseEvent.KoefPixToMM = 1;
|
||
break;
|
||
}
|
||
case AscCommon.MobileTouchMode.Zoom:
|
||
{
|
||
this.Api.asc_closeCellEditor();
|
||
|
||
this.ZoomDistance = this.getPointerDistance(e);
|
||
this.ZoomValue = this.delegate.GetZoom();
|
||
|
||
break;
|
||
}
|
||
case AscCommon.MobileTouchMode.Cursor:
|
||
{
|
||
this.Mode = AscCommon.MobileTouchMode.Scroll;
|
||
this.DownPoint = this.delegate.ConvertCoordsFromCursor(global_mouseEvent.X, global_mouseEvent.Y);
|
||
break;
|
||
}
|
||
}
|
||
|
||
if (AscCommon.AscBrowser.isAndroid)
|
||
isPreventDefault = false;
|
||
|
||
if (this.Api.isViewMode || isPreventDefault)
|
||
AscCommon.stopEvent(e);
|
||
|
||
return false;
|
||
};
|
||
CMobileTouchManager.prototype.onTouchMove = function(e)
|
||
{
|
||
this.checkPointerMultiTouchAdd(e);
|
||
|
||
var _e = e.touches ? e.touches[0] : e;
|
||
if (this.Mode != AscCommon.MobileTouchMode.FlowObj && this.Mode != AscCommon.MobileTouchMode.TableMove)
|
||
AscCommon.check_MouseMoveEvent(e.touches ? e.touches[0] : e);
|
||
|
||
if (!this.MoveAfterDown)
|
||
{
|
||
if (Math.abs(this.DownPointOriginal.X - global_mouseEvent.X) > this.MoveMinDist ||
|
||
Math.abs(this.DownPointOriginal.Y - global_mouseEvent.Y) > this.MoveMinDist)
|
||
{
|
||
this.MoveAfterDown = true;
|
||
}
|
||
}
|
||
|
||
switch (this.Mode)
|
||
{
|
||
case AscCommon.MobileTouchMode.Cursor:
|
||
{
|
||
this.MoveCursorToPoint(true);
|
||
break;
|
||
}
|
||
case AscCommon.MobileTouchMode.Scroll:
|
||
{
|
||
var _newTime = new Date().getTime();
|
||
if ((_newTime - this.TimeDown) > this.ReadingGlassTime && !this.MoveAfterDown)
|
||
{
|
||
this.Mode = AscCommon.MobileTouchMode.Cursor;
|
||
this.MoveCursorToPoint(false);
|
||
}
|
||
else
|
||
{
|
||
this.iScroll._move(e);
|
||
AscCommon.stopEvent(e);
|
||
}
|
||
break;
|
||
}
|
||
case AscCommon.MobileTouchMode.Zoom:
|
||
{
|
||
var isTouch2 = ((e.touches && 2 == e.touches.length) || (2 == this.getPointerCount()));
|
||
if (!isTouch2)
|
||
{
|
||
this.Mode = AscCommon.MobileTouchMode.None;
|
||
return;
|
||
}
|
||
|
||
var zoomCurrentDist = this.getPointerDistance(e);
|
||
|
||
if (zoomCurrentDist == 0)
|
||
zoomCurrentDist = 1;
|
||
|
||
var _zoomFix = this.ZoomValue / 100;
|
||
var _zoomCur = _zoomFix * (zoomCurrentDist / this.ZoomDistance);
|
||
|
||
_zoomCur = (_zoomCur * 100) >> 0;
|
||
if (_zoomCur < this.ZoomValueMin)
|
||
_zoomCur = this.ZoomValueMin;
|
||
else if (_zoomCur > this.ZoomValueMax)
|
||
_zoomCur = this.ZoomValueMax;
|
||
|
||
this.delegate.SetZoom(_zoomCur);
|
||
AscCommon.stopEvent(e);
|
||
break;
|
||
}
|
||
case AscCommon.MobileTouchMode.InlineObj:
|
||
{
|
||
break;
|
||
}
|
||
case AscCommon.MobileTouchMode.FlowObj:
|
||
case AscCommon.MobileTouchMode.SelectTrack:
|
||
{
|
||
this.delegate.Drawing_OnMouseMove(e.touches ? e.touches[0] : e);
|
||
AscCommon.stopEvent(e);
|
||
break;
|
||
}
|
||
case AscCommon.MobileTouchMode.Select:
|
||
{
|
||
// во время движения может смениться порядок ректов
|
||
global_mouseEvent.ClickCount = 1;
|
||
this.delegate.Drawing_OnMouseMove(_e);
|
||
AscCommon.stopEvent(e);
|
||
break;
|
||
}
|
||
default:
|
||
break;
|
||
}
|
||
};
|
||
CMobileTouchManager.prototype.onTouchEnd = function(e)
|
||
{
|
||
this.IsTouching = false;
|
||
|
||
var _e = e.changedTouches ? e.changedTouches[0] : e;
|
||
if (this.Mode != AscCommon.MobileTouchMode.FlowObj && this.Mode != AscCommon.MobileTouchMode.TableMove)
|
||
{
|
||
AscCommon.check_MouseUpEvent(_e);
|
||
}
|
||
|
||
var isCheckContextMenuMode = true;
|
||
|
||
var isCheckContextMenuSelect = false;
|
||
var isCheckContextMenuCursor = (this.Mode == AscCommon.MobileTouchMode.Cursor);
|
||
|
||
var isPreventDefault = false;
|
||
switch (this.Mode)
|
||
{
|
||
case AscCommon.MobileTouchMode.Select: // in cell select too
|
||
case AscCommon.MobileTouchMode.Scroll:
|
||
case AscCommon.MobileTouchMode.InlineObj:
|
||
case AscCommon.MobileTouchMode.FlowObj:
|
||
case AscCommon.MobileTouchMode.Zoom:
|
||
case AscCommon.MobileTouchMode.TableMove:
|
||
case AscCommon.MobileTouchMode.SelectTrack:
|
||
{
|
||
isPreventDefault = true;
|
||
break;
|
||
}
|
||
default:
|
||
{
|
||
break;
|
||
}
|
||
}
|
||
|
||
switch (this.Mode)
|
||
{
|
||
case AscCommon.MobileTouchMode.Cursor:
|
||
{
|
||
// ничего не делаем. курсор уже установлен
|
||
this.Mode = AscCommon.MobileTouchMode.None;
|
||
break;
|
||
}
|
||
case AscCommon.MobileTouchMode.Scroll:
|
||
{
|
||
if (!this.MoveAfterDown)
|
||
{
|
||
global_mouseEvent.Button = 0;
|
||
global_mouseEvent.KoefPixToMM = 5;
|
||
this.delegate.Drawing_OnMouseDown(_e);
|
||
this.delegate.Drawing_OnMouseUp(_e);
|
||
global_mouseEvent.KoefPixToMM = 1;
|
||
this.Api.sendEvent("asc_onTapEvent", e);
|
||
|
||
var typeMenu = this.delegate.GetContextMenuType();
|
||
if (typeMenu === AscCommon.MobileTouchContextMenuType.Target ||
|
||
(typeMenu === AscCommon.MobileTouchContextMenuType.Select && this.delegate.IsInObject()))
|
||
isPreventDefault = false;
|
||
}
|
||
else
|
||
{
|
||
// нужно запускать анимацию скролла, если она есть
|
||
// TODO:
|
||
isCheckContextMenuMode = false;
|
||
this.iScroll._end(e);
|
||
}
|
||
|
||
this.Mode = AscCommon.MobileTouchMode.None;
|
||
break;
|
||
}
|
||
case AscCommon.MobileTouchMode.Zoom:
|
||
{
|
||
this.Mode = AscCommon.MobileTouchMode.None;
|
||
isCheckContextMenuMode = false;
|
||
break;
|
||
}
|
||
case AscCommon.MobileTouchMode.InlineObj:
|
||
{
|
||
// TODO:
|
||
break;
|
||
}
|
||
case AscCommon.MobileTouchMode.FlowObj:
|
||
case AscCommon.MobileTouchMode.SelectTrack:
|
||
{
|
||
// TODO:
|
||
this.delegate.Drawing_OnMouseUp(e.changedTouches ? e.changedTouches[0] : e);
|
||
this.Mode = AscCommon.MobileTouchMode.None;
|
||
|
||
var typeMenu = this.delegate.GetContextMenuType();
|
||
if (typeMenu === AscCommon.MobileTouchContextMenuType.Target ||
|
||
(typeMenu === AscCommon.MobileTouchContextMenuType.Select && this.delegate.IsInObject()))
|
||
isPreventDefault = false;
|
||
|
||
break;
|
||
}
|
||
case AscCommon.MobileTouchMode.Select:
|
||
{
|
||
// ничего не нужно делать
|
||
this.DragSelect = 0;
|
||
this.Mode = AscCommon.MobileTouchMode.None;
|
||
this.delegate.Drawing_OnMouseUp(_e);
|
||
//AscCommon.stopEvent(e);
|
||
isCheckContextMenuSelect = true;
|
||
break;
|
||
}
|
||
default:
|
||
break;
|
||
}
|
||
|
||
this.checkPointerMultiTouchRemove(e);
|
||
|
||
if (true)
|
||
{
|
||
// нужно послать мув в никуда, чтобы сбросить состояния (схема, где все решает мув а не даун)
|
||
var _e = {};
|
||
|
||
_e.pageX = -1000;
|
||
_e.pageY = -1000;
|
||
|
||
_e.altKey = false;
|
||
_e.shiftKey = false;
|
||
_e.ctrlKey = false;
|
||
|
||
_e.button = 0;
|
||
|
||
this.delegate.Api.controller._onMouseMove(_e);
|
||
}
|
||
|
||
if (this.CellEditorType === Asc.c_oAscCellEditorState.editFormula)
|
||
isPreventDefault = false;
|
||
|
||
if (this.Api.isViewMode || isPreventDefault)
|
||
{
|
||
if (!AscCommon.g_inputContext.isHardCheckKeyboard)
|
||
AscCommon.g_inputContext.preventVirtualKeyboard(e);
|
||
}
|
||
|
||
if (AscCommon.g_inputContext.isHardCheckKeyboard)
|
||
isPreventDefault ? AscCommon.g_inputContext.preventVirtualKeyboard_Hard() : AscCommon.g_inputContext.enableVirtualKeyboard_Hard();
|
||
|
||
if (true !== this.iScroll.isAnimating && (this.CellEditorType != Asc.c_oAscCellEditorState.editFormula))
|
||
this.CheckContextMenuTouchEnd(isCheckContextMenuMode, isCheckContextMenuSelect, isCheckContextMenuCursor);
|
||
|
||
if (!isPreventDefault && this.Api.isMobileVersion && !this.Api.isUseOldMobileVersion())
|
||
this.showKeyboard(true);
|
||
|
||
return false;
|
||
};
|
||
|
||
CMobileTouchManager.prototype.mainOnTouchStart = function(e)
|
||
{
|
||
if (AscCommon.g_inputContext && AscCommon.g_inputContext.externalChangeFocus())
|
||
return;
|
||
this.removeHandlersOnClick();
|
||
return this.onTouchStart(e);
|
||
};
|
||
CMobileTouchManager.prototype.mainOnTouchMove = function(e)
|
||
{
|
||
return this.onTouchMove(e);
|
||
};
|
||
CMobileTouchManager.prototype.mainOnTouchEnd = function(e)
|
||
{
|
||
let res = this.onTouchEnd(e);
|
||
this.checkDesktopModeContextMenuEnd(e);
|
||
return res;
|
||
};
|
||
|
||
// отрисовка текстового селекта
|
||
CMobileTouchManager.prototype.CheckSelect = function(overlay, color, drDocument)
|
||
{
|
||
if (!this.desktopTouchState)
|
||
return;
|
||
|
||
if (!this.SelectEnabled)
|
||
return;
|
||
|
||
if(!overlay)
|
||
{
|
||
return;
|
||
}
|
||
|
||
this.CheckSelectRects();
|
||
if (null == this.RectSelect1 || null == this.RectSelect2)
|
||
return;
|
||
|
||
var _matrix = this.delegate.GetSelectionTransform();
|
||
var ctx = overlay.m_oContext;
|
||
|
||
ctx.lineWidth = 2;
|
||
if (undefined === color)
|
||
{
|
||
ctx.strokeStyle = "#146FE1";
|
||
ctx.fillStyle = "#146FE1";
|
||
}
|
||
else
|
||
{
|
||
ctx.strokeStyle = "rgba(" + color.r + "," + color.g + "," + color.b + "," + color.a + ")";
|
||
ctx.fillStyle = "rgba(" + color.r + "," + color.g + "," + color.b + "," + color.a + ")";
|
||
}
|
||
|
||
var _koef = AscCommon.AscBrowser.retinaPixelRatio;
|
||
|
||
var _oldGlobalAlpha = ctx.globalAlpha;
|
||
ctx.globalAlpha = 1.0;
|
||
|
||
if (!_matrix || global_MatrixTransformer.IsIdentity(_matrix))
|
||
{
|
||
var pos1 = this.delegate.ConvertCoordsToCursor(this.RectSelect1.x, this.RectSelect1.y, this.PageSelect1, false, true);
|
||
var pos2 = this.delegate.ConvertCoordsToCursor(this.RectSelect1.x, this.RectSelect1.y + this.RectSelect1.h, this.PageSelect1, false, true);
|
||
|
||
var pos3 = this.delegate.ConvertCoordsToCursor(this.RectSelect2.x + this.RectSelect2.w, this.RectSelect2.y, this.PageSelect2, false, true);
|
||
var pos4 = this.delegate.ConvertCoordsToCursor(this.RectSelect2.x + this.RectSelect2.w, this.RectSelect2.y + this.RectSelect2.h, this.PageSelect2, false, true);
|
||
|
||
if (undefined === color)
|
||
{
|
||
ctx.beginPath();
|
||
|
||
ctx.moveTo((_koef * pos1.X) >> 0, (_koef * pos1.Y) >> 0);
|
||
ctx.lineTo((_koef * pos2.X) >> 0, (_koef * pos2.Y) >> 0);
|
||
|
||
ctx.moveTo((_koef * pos3.X) >> 0, (_koef * pos3.Y) >> 0);
|
||
ctx.lineTo((_koef * pos4.X) >> 0, (_koef * pos4.Y) >> 0);
|
||
|
||
ctx.stroke();
|
||
}
|
||
|
||
ctx.beginPath();
|
||
|
||
var _offset = (undefined === color) ? 5 : 0;
|
||
|
||
if (this.RectSelectType === Asc.c_oAscSelectionType.RangeCol)
|
||
{
|
||
pos2.Y = pos4.Y = (pos2.Y - pos1.Y);
|
||
pos1.Y = pos3.Y = 0;
|
||
|
||
ctx.beginPath();
|
||
|
||
var _x1C = ((_koef * pos1.X + 0.5) >> 0) - 1;
|
||
var _x2C = ((_koef * pos3.X + 1.5) >> 0) - 1;
|
||
|
||
ctx.moveTo(_x1C, (_koef * pos1.Y) >> 0);
|
||
ctx.lineTo(_x1C, (_koef * pos2.Y) >> 0);
|
||
|
||
ctx.moveTo(_x2C, (_koef * pos3.Y) >> 0);
|
||
ctx.lineTo(_x2C, (_koef * pos4.Y) >> 0);
|
||
|
||
ctx.stroke();
|
||
ctx.beginPath();
|
||
|
||
if (_x2C > (_x1C + 10 * _koef))
|
||
{
|
||
var _y1 = ((_koef * pos1.Y) >> 0) + 2 * _koef;
|
||
var _y2 = ((_koef * pos2.Y) >> 0) - 2 * _koef;
|
||
|
||
if (_y2 > _y1)
|
||
{
|
||
ctx.moveTo(_x2C - 2 * _koef, _y1);
|
||
ctx.lineTo(_x2C - 2 * _koef, _y2);
|
||
|
||
ctx.lineTo(_x2C - 6 * _koef, _y2);
|
||
ctx.lineTo(_x2C - 6 * _koef, _y1);
|
||
ctx.closePath();
|
||
}
|
||
}
|
||
|
||
ctx.fill();
|
||
|
||
ctx.beginPath();
|
||
|
||
overlay.CheckPoint(_x1C, pos1.Y);
|
||
overlay.CheckPoint(_x2C, pos4.Y);
|
||
|
||
var _yC = _koef * (this.delegate.Size.H + pos4.Y) / 2;
|
||
overlay.AddEllipse(_x1C, _yC, _koef * AscCommon.MOBILE_SELECT_TRACK_ROUND / 2);
|
||
overlay.AddEllipse(_x2C, _yC, _koef * AscCommon.MOBILE_SELECT_TRACK_ROUND / 2);
|
||
ctx.fill();
|
||
}
|
||
else if (this.RectSelectType === Asc.c_oAscSelectionType.RangeRow)
|
||
{
|
||
pos3.X = pos4.X = (pos3.X - pos1.X);
|
||
pos1.X = pos2.X = 0;
|
||
|
||
ctx.beginPath();
|
||
|
||
var _y1C = ((_koef * pos1.Y + 0.5) >> 0) - 1;
|
||
var _y2C = ((_koef * pos2.Y + 1.5) >> 0) - 1;
|
||
|
||
ctx.moveTo((_koef * pos1.X) >> 0, _y1C);
|
||
ctx.lineTo((_koef * pos3.X) >> 0, _y1C);
|
||
|
||
ctx.moveTo((_koef * pos2.X) >> 0, _y2C);
|
||
ctx.lineTo((_koef * pos4.X) >> 0, _y2C);
|
||
|
||
ctx.stroke();
|
||
ctx.beginPath();
|
||
|
||
if (_y2C > (_y1C + 10 * _koef))
|
||
{
|
||
var _x1 = ((_koef * pos1.X) >> 0) + 2 * _koef;
|
||
var _x2 = ((_koef * pos3.X) >> 0) - 2 * _koef;
|
||
|
||
if (_x2 > _x1)
|
||
{
|
||
ctx.moveTo(_x1, _y2C - 2 * _koef);
|
||
ctx.lineTo(_x2, _y2C - 2 * _koef);
|
||
|
||
ctx.lineTo(_x2, _y2C - 6 * _koef);
|
||
ctx.lineTo(_x1, _y2C - 6 * _koef);
|
||
ctx.closePath();
|
||
}
|
||
}
|
||
|
||
ctx.fill();
|
||
|
||
ctx.beginPath();
|
||
|
||
overlay.CheckPoint(pos1.X, _y1C);
|
||
overlay.CheckPoint(pos4.X, _y2C);
|
||
|
||
var _xC = _koef * (this.delegate.Size.W + pos4.X) / 2;
|
||
overlay.AddEllipse(_xC, _y1C, _koef * AscCommon.MOBILE_SELECT_TRACK_ROUND / 2);
|
||
overlay.AddEllipse(_xC, _y2C, _koef * AscCommon.MOBILE_SELECT_TRACK_ROUND / 2);
|
||
ctx.fill();
|
||
}
|
||
else
|
||
{
|
||
overlay.AddEllipse(_koef * pos1.X, _koef * (pos1.Y - _offset), _koef * AscCommon.MOBILE_SELECT_TRACK_ROUND / 2);
|
||
overlay.AddEllipse(_koef * pos4.X, _koef * (pos4.Y + _offset), _koef * AscCommon.MOBILE_SELECT_TRACK_ROUND / 2);
|
||
ctx.fill();
|
||
}
|
||
|
||
ctx.beginPath();
|
||
}
|
||
else
|
||
{
|
||
var _xx11 = _matrix.TransformPointX(this.RectSelect1.x, this.RectSelect1.y);
|
||
var _yy11 = _matrix.TransformPointY(this.RectSelect1.x, this.RectSelect1.y);
|
||
|
||
var _xx12 = _matrix.TransformPointX(this.RectSelect1.x, this.RectSelect1.y + this.RectSelect1.h);
|
||
var _yy12 = _matrix.TransformPointY(this.RectSelect1.x, this.RectSelect1.y + this.RectSelect1.h);
|
||
|
||
var _xx21 = _matrix.TransformPointX(this.RectSelect2.x + this.RectSelect2.w, this.RectSelect2.y);
|
||
var _yy21 = _matrix.TransformPointY(this.RectSelect2.x + this.RectSelect2.w, this.RectSelect2.y);
|
||
|
||
var _xx22 = _matrix.TransformPointX(this.RectSelect2.x + this.RectSelect2.w, this.RectSelect2.y + this.RectSelect2.h);
|
||
var _yy22 = _matrix.TransformPointY(this.RectSelect2.x + this.RectSelect2.w, this.RectSelect2.y + this.RectSelect2.h);
|
||
|
||
var pos1 = this.delegate.ConvertCoordsToCursor(_xx11, _yy11, this.PageSelect1, false);
|
||
var pos2 = this.delegate.ConvertCoordsToCursor(_xx12, _yy12, this.PageSelect1, false);
|
||
|
||
var pos3 = this.delegate.ConvertCoordsToCursor(_xx21, _yy21, this.PageSelect2, false);
|
||
var pos4 = this.delegate.ConvertCoordsToCursor(_xx22, _yy22, this.PageSelect2, false);
|
||
|
||
if (undefined === color)
|
||
{
|
||
ctx.beginPath();
|
||
|
||
ctx.moveTo(_koef * pos1.X, _koef * pos1.Y);
|
||
ctx.lineTo(_koef * pos2.X, _koef * pos2.Y);
|
||
|
||
ctx.moveTo(_koef * pos3.X, _koef * pos3.Y);
|
||
ctx.lineTo(_koef * pos4.X, _koef * pos4.Y);
|
||
|
||
ctx.lineWidth = 2;
|
||
ctx.stroke();
|
||
}
|
||
|
||
ctx.beginPath();
|
||
|
||
if (undefined === color)
|
||
{
|
||
var ex01 = _matrix.TransformPointX(0, 0);
|
||
var ey01 = _matrix.TransformPointY(0, 0);
|
||
|
||
var ex11 = _matrix.TransformPointX(0, 1);
|
||
var ey11 = _matrix.TransformPointY(0, 1);
|
||
|
||
var _len = Math.sqrt((ex11 - ex01) * (ex11 - ex01) + (ey11 - ey01) * (ey11 - ey01));
|
||
if (_len == 0)
|
||
_len = 0.01;
|
||
|
||
var ex = 5 * (ex11 - ex01) / _len;
|
||
var ey = 5 * (ey11 - ey01) / _len;
|
||
|
||
var _x1 = (pos1.X - ex) >> 0;
|
||
var _y1 = (pos1.Y - ey) >> 0;
|
||
|
||
var _x2 = (pos4.X + ex) >> 0;
|
||
var _y2 = (pos4.Y + ey) >> 0;
|
||
|
||
overlay.AddEllipse(_koef * _x1, _koef * _y1, _koef * AscCommon.MOBILE_SELECT_TRACK_ROUND / 2);
|
||
overlay.AddEllipse(_koef * _x2, _koef * _y2, _koef * AscCommon.MOBILE_SELECT_TRACK_ROUND / 2);
|
||
}
|
||
else
|
||
{
|
||
overlay.AddEllipse(_koef * pos1.X, _koef * pos1.Y, _koef * AscCommon.MOBILE_SELECT_TRACK_ROUND / 2);
|
||
overlay.AddEllipse(_koef * pos4.X, _koef * pos4.Y, _koef * AscCommon.MOBILE_SELECT_TRACK_ROUND / 2);
|
||
}
|
||
ctx.fill();
|
||
|
||
ctx.beginPath();
|
||
}
|
||
|
||
ctx.globalAlpha = _oldGlobalAlpha;
|
||
};
|
||
|
||
CMobileTouchManager.prototype.CheckSelectTrack = function()
|
||
{
|
||
if (this.RectSelectType !== Asc.c_oAscSelectionType.RangeRow && this.RectSelectType !== Asc.c_oAscSelectionType.RangeCol)
|
||
return AscCommon.CMobileTouchManagerBase.prototype.CheckSelectTrack.call(this);
|
||
|
||
// проверим на попадание в селект - это может произойти на любом mode
|
||
if (null != this.RectSelect1 && null != this.RectSelect2)
|
||
{
|
||
var pos1 = null;
|
||
var pos4 = null;
|
||
|
||
var _pos = this.delegate.ConvertCoordsToCursor(0, 0, 0, false);
|
||
|
||
if (this.RectSelectType === Asc.c_oAscSelectionType.RangeCol)
|
||
{
|
||
var Y = this.delegate.ConvertCoordsFromCursor(0, this.delegate.Offset.Y + (this.delegate.Size.H + _pos.Y) / 2).Y;
|
||
pos1 = this.delegate.ConvertCoordsToCursor(this.RectSelect1.x, Y, this.PageSelect1);
|
||
pos4 = this.delegate.ConvertCoordsToCursor(this.RectSelect2.x + this.RectSelect2.w, Y, this.PageSelect2);
|
||
}
|
||
else
|
||
{
|
||
var X = this.delegate.ConvertCoordsFromCursor(this.delegate.Offset.X + (this.delegate.Size.W + _pos.X) / 2, 0).X;
|
||
pos1 = this.delegate.ConvertCoordsToCursor(X, this.RectSelect1.y, this.PageSelect1);
|
||
pos4 = this.delegate.ConvertCoordsToCursor(X, this.RectSelect2.y + this.RectSelect2.h, this.PageSelect2);
|
||
}
|
||
|
||
if (Math.abs(pos1.X - global_mouseEvent.X) < this.TrackTargetEps && Math.abs(pos1.Y - global_mouseEvent.Y) < this.TrackTargetEps)
|
||
{
|
||
this.Mode = AscCommon.MobileTouchMode.Select;
|
||
this.DragSelect = 1;
|
||
}
|
||
else if (Math.abs(pos4.X - global_mouseEvent.X) < this.TrackTargetEps && Math.abs(pos4.Y - global_mouseEvent.Y) < this.TrackTargetEps)
|
||
{
|
||
this.Mode = AscCommon.MobileTouchMode.Select;
|
||
this.DragSelect = 2;
|
||
}
|
||
}
|
||
|
||
return (this.Mode == AscCommon.MobileTouchMode.Select);
|
||
};
|
||
|
||
CMobileTouchManager.prototype.CheckSelectTrackObject = function()
|
||
{
|
||
if (!this.delegate.WB.IsSelectionUse())
|
||
return;
|
||
|
||
if (null != this.RectSelect1 && null != this.RectSelect2)
|
||
{
|
||
var pos1 = this.delegate.ConvertCoordsToCursor(this.RectSelect1.x, this.RectSelect1.y, this.PageSelect1);
|
||
var pos4 = this.delegate.ConvertCoordsToCursor(this.RectSelect2.x + this.RectSelect2.w, this.RectSelect2.y + this.RectSelect2.h, this.PageSelect2);
|
||
|
||
if (this.RectSelectType === Asc.c_oAscSelectionType.RangeCol)
|
||
{
|
||
// только правая граница
|
||
if (Math.abs(pos4.X - global_mouseEvent.X) < this.TrackTargetEps)
|
||
{
|
||
if (pos4.X > global_mouseEvent.X)
|
||
this.Mode = AscCommon.MobileTouchMode.SelectTrack;
|
||
}
|
||
}
|
||
else if (this.RectSelectType === Asc.c_oAscSelectionType.RangeRow)
|
||
{
|
||
// только нижняя граница
|
||
if (Math.abs(pos4.Y - global_mouseEvent.Y) < this.TrackTargetEps)
|
||
{
|
||
if (pos4.Y > global_mouseEvent.Y)
|
||
this.Mode = AscCommon.MobileTouchMode.SelectTrack;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if (Math.abs(pos1.X - global_mouseEvent.X) < this.TrackTargetEps && global_mouseEvent.Y > pos1.Y && global_mouseEvent.Y < pos4.Y)
|
||
this.Mode = AscCommon.MobileTouchMode.SelectTrack;
|
||
else if (Math.abs(pos4.X - global_mouseEvent.X) < this.TrackTargetEps && global_mouseEvent.Y > pos1.Y && global_mouseEvent.Y < pos4.Y)
|
||
this.Mode = AscCommon.MobileTouchMode.SelectTrack;
|
||
else if (Math.abs(pos1.Y - global_mouseEvent.Y) < this.TrackTargetEps && global_mouseEvent.X > pos1.X && global_mouseEvent.X < pos4.X)
|
||
this.Mode = AscCommon.MobileTouchMode.SelectTrack;
|
||
else if (Math.abs(pos4.Y - global_mouseEvent.Y) < this.TrackTargetEps && global_mouseEvent.X > pos1.X && global_mouseEvent.X < pos4.X)
|
||
this.Mode = AscCommon.MobileTouchMode.SelectTrack;
|
||
}
|
||
}
|
||
return (this.Mode == AscCommon.MobileTouchMode.SelectTrack);
|
||
};
|
||
|
||
//--------------------------------------------------------export----------------------------------------------------
|
||
window['AscCommonExcel'] = window['AscCommonExcel'] || {};
|
||
window['AscCommonExcel'].CMobileTouchManager = CMobileTouchManager;
|
||
})(window);
|