942 lines
31 KiB
JavaScript
942 lines
31 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) {
|
|
|
|
//-----------------------------------------------------------------------------------
|
|
// Drawing area manager
|
|
//-----------------------------------------------------------------------------------
|
|
|
|
var sFrozenImageUrl = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAICAQAAACSE13KAAAAH0lEQVQI12NgV2L6+YuJAYh+M4n/YuL8y8DAwsDABABYogY5EHbuKgAAAABJRU5ErkJggg==';
|
|
var sFrozenImageRotUrl = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAABCAYAAADjAO9DAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAnSURBVBhXY2ZnZ1f6+/cvNwMDAwcQs4mLizOLiooyf/jwAchlYAAAc8kGpR10sBYAAAAASUVORK5CYII=';
|
|
var SHADOW_LENGTH = 8;
|
|
// Type
|
|
var FrozenAreaType = {
|
|
|
|
Top : "Top",
|
|
Bottom : "Bottom",
|
|
Left : "Left",
|
|
Right : "Right",
|
|
Center : "Center", // Default without frozen places
|
|
|
|
LeftTop : "LeftTop",
|
|
RightTop : "RightTop",
|
|
LeftBottom : "LeftBottom",
|
|
RightBottom : "RightBottom"
|
|
};
|
|
|
|
// Frozen place
|
|
function FrozenPlace(ws, type) {
|
|
var log = false;
|
|
var _this = this;
|
|
var asc = window["Asc"];
|
|
var asc_Range = asc.Range;
|
|
|
|
_this.worksheet = ws;
|
|
_this.type = type;
|
|
_this.range = null;
|
|
_this.frozenCell = {
|
|
col: _this.worksheet.topLeftFrozenCell ? _this.worksheet.topLeftFrozenCell.getCol0() : 0,
|
|
row: _this.worksheet.topLeftFrozenCell ? _this.worksheet.topLeftFrozenCell.getRow0() : 0
|
|
};
|
|
_this.isValid = true;
|
|
|
|
// Methods
|
|
_this.initRange = function() {
|
|
switch (_this.type) {
|
|
|
|
case FrozenAreaType.Top: {
|
|
if (!_this.frozenCell.col && _this.frozenCell.row)
|
|
_this.range = new asc_Range(_this.worksheet.getFirstVisibleCol(), 0, _this.worksheet.getLastVisibleCol(), _this.frozenCell.row - 1);
|
|
else
|
|
_this.isValid = false;
|
|
}
|
|
break;
|
|
|
|
case FrozenAreaType.Bottom: {
|
|
if (!_this.frozenCell.col && _this.frozenCell.row)
|
|
_this.range = new asc_Range(0, _this.worksheet.getFirstVisibleRow(), _this.worksheet.getLastVisibleCol(), _this.worksheet.getLastVisibleRow());
|
|
else
|
|
_this.isValid = false;
|
|
}
|
|
break;
|
|
|
|
case FrozenAreaType.Left: {
|
|
if (_this.frozenCell.col && !_this.frozenCell.row)
|
|
_this.range = new asc_Range(0, 0, _this.frozenCell.col - 1, _this.worksheet.getLastVisibleRow());
|
|
else
|
|
_this.isValid = false;
|
|
}
|
|
break;
|
|
|
|
case FrozenAreaType.Right: {
|
|
if (_this.frozenCell.col && !_this.frozenCell.row)
|
|
_this.range = new asc_Range(_this.worksheet.getFirstVisibleCol(), 0, _this.worksheet.getLastVisibleCol(), _this.worksheet.getLastVisibleRow());
|
|
else
|
|
_this.isValid = false;
|
|
}
|
|
break;
|
|
|
|
case FrozenAreaType.Center: {
|
|
if (!_this.frozenCell.col && !_this.frozenCell.row)
|
|
_this.range = new asc_Range(_this.worksheet.getFirstVisibleCol(true), _this.worksheet.getFirstVisibleRow(true), _this.worksheet.getLastVisibleCol(), _this.worksheet.getLastVisibleRow());
|
|
else
|
|
_this.isValid = false;
|
|
}
|
|
break;
|
|
|
|
// Other
|
|
case FrozenAreaType.LeftTop: {
|
|
if (_this.frozenCell.col && _this.frozenCell.row)
|
|
_this.range = new asc_Range(0, 0, _this.frozenCell.col - 1, _this.frozenCell.row - 1);
|
|
else
|
|
_this.isValid = false;
|
|
}
|
|
break;
|
|
|
|
case FrozenAreaType.RightTop: {
|
|
if (_this.frozenCell.col && _this.frozenCell.row)
|
|
_this.range = new asc_Range(_this.worksheet.getFirstVisibleCol(), 0, _this.worksheet.getLastVisibleCol(), _this.frozenCell.row - 1);
|
|
else
|
|
_this.isValid = false;
|
|
}
|
|
break;
|
|
|
|
case FrozenAreaType.LeftBottom: {
|
|
if (_this.frozenCell.col && _this.frozenCell.row)
|
|
_this.range = new asc_Range(0, _this.worksheet.getFirstVisibleRow(), _this.frozenCell.col - 1, _this.worksheet.getLastVisibleRow());
|
|
else
|
|
_this.isValid = false;
|
|
}
|
|
break;
|
|
|
|
case FrozenAreaType.RightBottom: {
|
|
if (_this.frozenCell.col && _this.frozenCell.row)
|
|
_this.range = new asc_Range(_this.worksheet.getFirstVisibleCol(), _this.worksheet.getFirstVisibleRow(), _this.worksheet.getLastVisibleCol(), _this.worksheet.getLastVisibleRow());
|
|
else
|
|
_this.isValid = false;
|
|
}
|
|
break;
|
|
}
|
|
};
|
|
|
|
_this.getVisibleRange = function() {
|
|
var vr = _this.range.clone();
|
|
var fv = _this.getFirstVisible();
|
|
|
|
switch (_this.type) {
|
|
// Two places
|
|
case FrozenAreaType.Top: {
|
|
// without changes
|
|
}
|
|
break;
|
|
case FrozenAreaType.Bottom: {
|
|
vr.r1 = fv.row;
|
|
vr.r2 = _this.worksheet.getLastVisibleRow();
|
|
}
|
|
break;
|
|
case FrozenAreaType.Left: {
|
|
vr.r1 = fv.row;
|
|
vr.r2 = _this.worksheet.getLastVisibleRow();
|
|
}
|
|
break;
|
|
case FrozenAreaType.Right: {
|
|
vr.c1 = fv.col;
|
|
vr.c2 = _this.worksheet.getLastVisibleCol();
|
|
}
|
|
break;
|
|
|
|
// Four places
|
|
case FrozenAreaType.LeftTop: {
|
|
// without changes
|
|
}
|
|
break;
|
|
case FrozenAreaType.RightTop: {
|
|
vr.c1 = fv.col;
|
|
vr.c2 = _this.worksheet.getLastVisibleCol();
|
|
}
|
|
break;
|
|
case FrozenAreaType.LeftBottom: {
|
|
vr.r1 = fv.row;
|
|
vr.r2 = _this.worksheet.getLastVisibleRow();
|
|
}
|
|
break;
|
|
case FrozenAreaType.RightBottom: {
|
|
vr.c1 = fv.col;
|
|
vr.c2 = _this.worksheet.getLastVisibleCol();
|
|
vr.r1 = fv.row;
|
|
vr.r2 = _this.worksheet.getLastVisibleRow();
|
|
}
|
|
break;
|
|
|
|
// No frozen areas
|
|
case FrozenAreaType.Center: {
|
|
vr.c1 = fv.col;
|
|
vr.c2 = _this.worksheet.getLastVisibleCol();
|
|
vr.r1 = fv.row;
|
|
vr.r2 = _this.worksheet.getLastVisibleRow();
|
|
}
|
|
break;
|
|
}
|
|
return vr;
|
|
};
|
|
|
|
_this.getRect = function(bEvent) {
|
|
var rect = _this.worksheet.rangeToRectRel(_this.range, 0);
|
|
switch (_this.type) {
|
|
|
|
case FrozenAreaType.Top:
|
|
{
|
|
rect.w = +Infinity;
|
|
rect.r = +Infinity;
|
|
if(bEvent)
|
|
{
|
|
rect.x = -Infinity;
|
|
rect.y = -Infinity;
|
|
}
|
|
break;
|
|
}
|
|
|
|
case FrozenAreaType.Bottom:
|
|
{
|
|
rect.w = +Infinity;
|
|
rect.h = +Infinity;
|
|
rect.r = +Infinity;
|
|
rect.b = +Infinity;
|
|
|
|
if(bEvent)
|
|
{
|
|
rect.x = -Infinity;
|
|
}
|
|
break;
|
|
}
|
|
|
|
case FrozenAreaType.Left:
|
|
{
|
|
rect.h = +Infinity;
|
|
rect.b = +Infinity;
|
|
|
|
if(bEvent)
|
|
{
|
|
rect.x = -Infinity;
|
|
rect.y = -Infinity;
|
|
}
|
|
break;
|
|
}
|
|
|
|
case FrozenAreaType.Right:
|
|
{
|
|
|
|
rect.w = +Infinity;
|
|
rect.h = +Infinity;
|
|
rect.r = +Infinity;
|
|
rect.b = +Infinity;
|
|
|
|
if(bEvent)
|
|
{
|
|
rect.y = -Infinity;
|
|
}
|
|
break;
|
|
}
|
|
|
|
case FrozenAreaType.Center:
|
|
{
|
|
rect.w = +Infinity;
|
|
rect.h = +Infinity;
|
|
rect.r = +Infinity;
|
|
rect.b = +Infinity;
|
|
if(bEvent)
|
|
{
|
|
rect.x = -Infinity;
|
|
rect.y = -Infinity;
|
|
}
|
|
break;
|
|
}
|
|
// Other
|
|
case FrozenAreaType.LeftTop:
|
|
{
|
|
if(bEvent)
|
|
{
|
|
rect.x = -Infinity;
|
|
rect.y = -Infinity;
|
|
}
|
|
break;
|
|
}
|
|
|
|
case FrozenAreaType.RightTop:
|
|
{
|
|
rect.w = +Infinity;
|
|
rect.r = +Infinity;
|
|
if(bEvent)
|
|
{
|
|
rect.y = -Infinity;
|
|
}
|
|
break;
|
|
}
|
|
|
|
case FrozenAreaType.LeftBottom:
|
|
{
|
|
rect.h = +Infinity;
|
|
rect.b = +Infinity;
|
|
if(bEvent)
|
|
{
|
|
rect.x = -Infinity;
|
|
}
|
|
break;
|
|
}
|
|
|
|
case FrozenAreaType.RightBottom:
|
|
{
|
|
rect.w = +Infinity;
|
|
rect.h = +Infinity;
|
|
rect.r = +Infinity;
|
|
rect.b = +Infinity;
|
|
break;
|
|
}
|
|
}
|
|
|
|
return rect;
|
|
};
|
|
|
|
_this.getFirstVisible = function() {
|
|
var fv = { col: 0, row: 0 };
|
|
|
|
switch (_this.type) {
|
|
// Two places
|
|
case FrozenAreaType.Top: {
|
|
fv.col = _this.worksheet.getFirstVisibleCol();
|
|
}
|
|
break;
|
|
|
|
case FrozenAreaType.Bottom: {
|
|
fv.col = _this.worksheet.getFirstVisibleCol();
|
|
fv.row = _this.worksheet.getFirstVisibleRow();
|
|
}
|
|
break;
|
|
|
|
case FrozenAreaType.Left: {
|
|
fv.row = _this.worksheet.getFirstVisibleRow();
|
|
}
|
|
break;
|
|
|
|
case FrozenAreaType.Right: {
|
|
fv.col = _this.worksheet.getFirstVisibleCol();
|
|
fv.row = _this.worksheet.getFirstVisibleRow();
|
|
}
|
|
break;
|
|
|
|
// Four places
|
|
case FrozenAreaType.LeftTop: {
|
|
}
|
|
break;
|
|
|
|
case FrozenAreaType.RightTop: {
|
|
fv.col = _this.worksheet.getFirstVisibleCol();
|
|
}
|
|
break;
|
|
|
|
case FrozenAreaType.LeftBottom: {
|
|
fv.row = _this.worksheet.getFirstVisibleRow();
|
|
}
|
|
break;
|
|
|
|
case FrozenAreaType.RightBottom: {
|
|
fv.col = _this.worksheet.getFirstVisibleCol();
|
|
fv.row = _this.worksheet.getFirstVisibleRow();
|
|
}
|
|
break;
|
|
|
|
// No frozen areas
|
|
case FrozenAreaType.Center: {
|
|
fv.col = _this.worksheet.getFirstVisibleCol();
|
|
fv.row = _this.worksheet.getFirstVisibleRow();
|
|
}
|
|
break;
|
|
}
|
|
|
|
return fv;
|
|
};
|
|
|
|
_this.isPointInside = function(x, y, bEvent)
|
|
{
|
|
var rect = _this.getRect(bEvent);
|
|
var result = (x >= rect.x ) && (y >= rect.y) && (x <= rect.r) && (y <= rect.b);
|
|
if ( log && result )
|
|
console.log( x + "," + y + " in " + _this.type);
|
|
return result;
|
|
};
|
|
|
|
_this.isCellInside = function(cell) {
|
|
var result = false;
|
|
if (cell && _this.range) {
|
|
var cellRange = new asc_Range(cell.col, cell.row, cell.col, cell.row);
|
|
result = _this.range.isIntersect(cellRange);
|
|
}
|
|
return result;
|
|
};
|
|
|
|
_this.isObjectInside = function(object) {
|
|
// TODO Нужно учитывать collOff, rowOff
|
|
|
|
var boundsFromTo = object.boundsFromTo;
|
|
var objectRange = new asc_Range(boundsFromTo.from.col, boundsFromTo.from.row, boundsFromTo.to.col, boundsFromTo.to.row);
|
|
return _this.range.isIntersect(objectRange);
|
|
};
|
|
|
|
_this.getVerticalScroll = function() {
|
|
|
|
// No scroll for Top, LeftTop, RightTop
|
|
var scroll = 0;
|
|
var fv = _this.getFirstVisible();
|
|
var headerPx = _this.worksheet._getRowTop(0);
|
|
|
|
switch (_this.type) {
|
|
// Two places
|
|
case FrozenAreaType.Top: {
|
|
scroll = headerPx;
|
|
}
|
|
break;
|
|
|
|
case FrozenAreaType.Bottom: {
|
|
scroll = -(_this.worksheet._getRowTop(fv.row) - _this.worksheet._getRowTop(_this.frozenCell.row) + _this.worksheet.getScrollCorrect()) + headerPx;
|
|
}
|
|
break;
|
|
|
|
case FrozenAreaType.Left:
|
|
case FrozenAreaType.Right: {
|
|
scroll = -(_this.worksheet._getRowTop(fv.row) - _this.worksheet.cellsTop + _this.worksheet.getScrollCorrect()) + headerPx;
|
|
}
|
|
break;
|
|
|
|
// Four places
|
|
case FrozenAreaType.LeftTop:
|
|
case FrozenAreaType.RightTop: {
|
|
scroll = headerPx;
|
|
}
|
|
break;
|
|
|
|
case FrozenAreaType.LeftBottom:
|
|
case FrozenAreaType.RightBottom: {
|
|
scroll = -(_this.worksheet._getRowTop(fv.row) - _this.worksheet._getRowTop(_this.frozenCell.row) + _this.worksheet.getScrollCorrect()) + headerPx;
|
|
}
|
|
break;
|
|
|
|
// No frozen areas
|
|
case FrozenAreaType.Center: {
|
|
scroll = -(_this.worksheet._getRowTop(fv.row) - _this.worksheet.cellsTop + _this.worksheet.getScrollCorrect()) + headerPx;
|
|
}
|
|
break;
|
|
}
|
|
return scroll;
|
|
};
|
|
|
|
_this.getHorizontalScroll = function() {
|
|
|
|
// No scroll for Left, LeftTop, LeftBottom
|
|
var scroll = 0;
|
|
var fv = _this.getFirstVisible();
|
|
var headerPx = _this.worksheet._getColLeft(0);
|
|
|
|
switch (_this.type) {
|
|
// Two places
|
|
case FrozenAreaType.Top:
|
|
case FrozenAreaType.Bottom: {
|
|
scroll = -(_this.worksheet._getColLeft(fv.col) - _this.worksheet.cellsLeft + _this.worksheet.getHorizontalScrollCorrect()) + headerPx;
|
|
}
|
|
break;
|
|
|
|
case FrozenAreaType.Left: {
|
|
scroll = headerPx;
|
|
}
|
|
break;
|
|
|
|
case FrozenAreaType.Right: {
|
|
scroll = -(_this.worksheet._getColLeft(fv.col) - _this.worksheet._getColLeft(_this.frozenCell.col) + _this.worksheet.getHorizontalScrollCorrect()) + headerPx;
|
|
}
|
|
break;
|
|
|
|
// Four places
|
|
case FrozenAreaType.LeftTop:
|
|
case FrozenAreaType.LeftBottom: {
|
|
scroll = headerPx;
|
|
}
|
|
break;
|
|
|
|
case FrozenAreaType.RightTop:
|
|
case FrozenAreaType.RightBottom: {
|
|
scroll = -(_this.worksheet._getColLeft(fv.col) - _this.worksheet._getColLeft(_this.frozenCell.col) + _this.worksheet.getHorizontalScrollCorrect()) + headerPx;
|
|
}
|
|
break;
|
|
|
|
// No frozen areas
|
|
case FrozenAreaType.Center: {
|
|
scroll = -(_this.worksheet._getColLeft(fv.col) - _this.worksheet.cellsLeft + _this.worksheet.getHorizontalScrollCorrect()) + headerPx;
|
|
}
|
|
break;
|
|
}
|
|
return _this.worksheet.getRightToLeft() ? -scroll : scroll;
|
|
};
|
|
|
|
_this.clip = function(canvas, rect) {
|
|
canvas.m_oContext.save();
|
|
canvas.m_oContext.beginPath();
|
|
canvas.m_oContext.rect(rect.x, rect.y, rect.w, rect.h);
|
|
canvas.m_oContext.clip();
|
|
// этот сэйв нужен для восстановления сложных вложенных клипов
|
|
canvas.m_oContext.save();
|
|
};
|
|
|
|
_this.restore = function(canvas) {
|
|
canvas.m_oContext.restore();
|
|
// этот рестор нужен для восстановления сложных вложенных клипов
|
|
canvas.m_oContext.restore();
|
|
};
|
|
_this.getUpdateRect = function (oRect) {
|
|
let oUpdateRect = _this.worksheet.rangeToRectAbs(_this.range, 3);
|
|
if(oRect) {
|
|
oUpdateRect = oUpdateRect.intersection(oRect);
|
|
}
|
|
return oUpdateRect;
|
|
}
|
|
_this._updateGraphicCanvas = function (fCallback, oRect) {
|
|
var oUpdateRect = _this.getUpdateRect(oRect);
|
|
if (!oUpdateRect) {
|
|
return;
|
|
}
|
|
var canvas = _this.worksheet.objectRender.getDrawingCanvas();
|
|
_this.setTransform(canvas.shapeCtx, canvas.shapeOverlayCtx, canvas.autoShapeTrack);
|
|
|
|
var oClipRect;
|
|
if(!oRect) {
|
|
oClipRect = _this.worksheet.rangeToRectRel(_this.range, 0, true);
|
|
}
|
|
else {
|
|
var oT = canvas.shapeCtx.m_oCoordTransform;
|
|
var l = (oT.TransformPointX(oUpdateRect.l, oUpdateRect.t) >> 0) - 1;
|
|
var t = (oT.TransformPointY(oUpdateRect.l, oUpdateRect.t) >> 0) - 1;
|
|
var r = (oT.TransformPointX(oUpdateRect.r, oUpdateRect.b) >> 0) + 1;
|
|
var b = (oT.TransformPointY(oUpdateRect.r, oUpdateRect.b) >> 0) + 1;
|
|
oClipRect = new AscFormat.CGraphicBounds(l, t, r, b);
|
|
}
|
|
|
|
_this.clip(canvas.shapeCtx, oClipRect);
|
|
canvas.shapeCtx.updatedRect = oUpdateRect;
|
|
fCallback(canvas.shapeCtx);
|
|
canvas.shapeCtx.updatedRect = null;
|
|
_this.restore(canvas.shapeCtx);
|
|
}
|
|
_this.drawObject = function(object, oRect) {
|
|
this._updateGraphicCanvas(function (graphics) {
|
|
object.draw(graphics);
|
|
if ( (object.graphicObject.lockType !== undefined) && (object.graphicObject.lockType !== AscCommon.c_oAscLockTypes.kLockTypeNone) ) {
|
|
var oApi = Asc['editor'];
|
|
if(oApi){
|
|
if (!oApi.collaborativeEditing.getFast() || object.graphicObject.lockType !== AscCommon.c_oAscLockTypes.kLockTypeMine){
|
|
graphics.SetIntegerGrid(false);
|
|
graphics.transform3(object.graphicObject.transform, false);
|
|
graphics.DrawLockObjectRect(object.graphicObject.lockType, 0, 0, object.graphicObject.extX, object.graphicObject.extY );
|
|
graphics.reset();
|
|
graphics.SetIntegerGrid(true);
|
|
}
|
|
}
|
|
}
|
|
}, oRect);
|
|
};
|
|
_this.drawDropDown = function(object, oRect) {
|
|
this._updateGraphicCanvas(function (graphics) {
|
|
object.drawDropDown(graphics);
|
|
});
|
|
};
|
|
|
|
_this.updateRange = function(object, oRange) {
|
|
var oClipRange = _this.range.intersectionSimple(oRange);
|
|
if(!oClipRange) {
|
|
return;
|
|
}
|
|
var canvas = _this.worksheet.objectRender.getDrawingCanvas();
|
|
_this.setTransform(canvas.shapeCtx, canvas.shapeOverlayCtx, canvas.autoShapeTrack);
|
|
_this.clip(canvas.shapeCtx, _this.worksheet.rangeToRectRel(oClipRange, 0, true));
|
|
canvas.shapeCtx.updatedRect = _this.worksheet.rangeToRectAbs(oClipRange, 3);
|
|
//For debug
|
|
// canvas.shapeCtx.p_color(0, 0, 0, 255);
|
|
// canvas.shapeCtx.p_width(5);
|
|
// canvas.shapeCtx.rect(oRect.x, oRect.y, oRect.w, oRect.h);
|
|
// canvas.shapeCtx.ds();
|
|
object.draw(canvas.shapeCtx);
|
|
canvas.shapeCtx.updatedRect = null;
|
|
|
|
// Lock
|
|
if ( (object.graphicObject.lockType !== undefined) && (object.graphicObject.lockType !== AscCommon.c_oAscLockTypes.kLockTypeNone) ) {
|
|
var oApi = Asc['editor'];
|
|
if(oApi){
|
|
if (!oApi.collaborativeEditing.getFast() || object.graphicObject.lockType !== AscCommon.c_oAscLockTypes.kLockTypeMine){
|
|
canvas.shapeCtx.SetIntegerGrid(false);
|
|
canvas.shapeCtx.transform3(object.graphicObject.transform, false);
|
|
canvas.shapeCtx.DrawLockObjectRect(object.graphicObject.lockType, 0, 0, object.graphicObject.extX, object.graphicObject.extY );
|
|
canvas.shapeCtx.reset();
|
|
canvas.shapeCtx.SetIntegerGrid(true);
|
|
}
|
|
}
|
|
}
|
|
_this.restore(canvas.shapeCtx);
|
|
};
|
|
|
|
_this.drawFrozenPaneBorderHor = function(autoShapeTrack, y, left, right) {
|
|
if(Asc.editor.asc_getFrozenPaneBorderType() === Asc.c_oAscFrozenPaneBorderType.shadow) {
|
|
var nH = SHADOW_LENGTH;
|
|
if(AscCommon.AscBrowser.isRetina) {
|
|
nH = AscCommon.AscBrowser.convertToRetinaValue(nH, true);
|
|
}
|
|
autoShapeTrack.m_oOverlay.CheckPoint1(left, y - nH);
|
|
autoShapeTrack.m_oOverlay.CheckPoint2(right, y + nH);
|
|
autoShapeTrack.drawImage(sFrozenImageUrl, left, y, right, nH);
|
|
}
|
|
else {
|
|
autoShapeTrack.m_oOverlay.DrawFrozenPlaceHorLine(y, left, right);
|
|
}
|
|
};
|
|
|
|
_this.drawFrozenPaneBorderVer = function(autoShapeTrack, x, top, bottom) {
|
|
if(Asc.editor.asc_getFrozenPaneBorderType() === Asc.c_oAscFrozenPaneBorderType.shadow) {
|
|
var nW = SHADOW_LENGTH;
|
|
if(AscCommon.AscBrowser.isRetina) {
|
|
nW = AscCommon.AscBrowser.convertToRetinaValue(nW, true);
|
|
}
|
|
autoShapeTrack.m_oOverlay.CheckPoint1(x - nW, top);
|
|
autoShapeTrack.m_oOverlay.CheckPoint2(x + nW, bottom);
|
|
autoShapeTrack.drawImage(sFrozenImageRotUrl, _this.worksheet.checkRtl(x), top, nW, bottom);
|
|
}
|
|
else {
|
|
autoShapeTrack.m_oOverlay.DrawFrozenPlaceVerLine(_this.worksheet.checkRtl(x), top, bottom);
|
|
}
|
|
};
|
|
_this.drawSelection = function(drawingDocument, shapeCtx, shapeOverlayCtx, autoShapeTrack, trackOverlay) {
|
|
|
|
var ctx = trackOverlay.m_oContext;
|
|
_this.setTransform(shapeCtx, shapeOverlayCtx, autoShapeTrack, trackOverlay);
|
|
// Clip
|
|
_this.clip(shapeOverlayCtx, _this.worksheet.rangeToRectRel(_this.range, 0, true));
|
|
if (drawingDocument.m_bIsSelection) {
|
|
if (!window["IS_NATIVE_EDITOR"]) {
|
|
drawingDocument.SelectionMatrix = null;
|
|
trackOverlay.m_oControl.HtmlElement.style.display = "block";
|
|
|
|
if (null == trackOverlay.m_oContext) {
|
|
trackOverlay.m_oContext = trackOverlay.m_oControl.HtmlElement.getContext('2d');
|
|
}
|
|
}
|
|
|
|
drawingDocument.private_StartDrawSelection(trackOverlay);
|
|
this.worksheet.objectRender.controller.drawTextSelection();
|
|
drawingDocument.private_EndDrawSelection();
|
|
this.worksheet.handlers.trigger("drawMobileSelection", trackOverlay, undefined);
|
|
}
|
|
|
|
if (drawingDocument.MathTrack.IsActive())
|
|
{
|
|
drawingDocument.DrawMathTrack(trackOverlay);
|
|
}
|
|
ctx.globalAlpha = 1.0;
|
|
this.worksheet.objectRender.controller.drawSelection(drawingDocument);
|
|
if ( this.worksheet.objectRender.controller.needUpdateOverlay() ) {
|
|
trackOverlay.Show();
|
|
autoShapeTrack.Graphics.put_GlobalAlpha(true, 0.5);
|
|
this.worksheet.objectRender.controller.drawTracks(autoShapeTrack);
|
|
autoShapeTrack.Graphics.put_GlobalAlpha(true, 1);
|
|
_this.restore(autoShapeTrack);
|
|
}
|
|
// Restore
|
|
_this.restore(autoShapeTrack);
|
|
};
|
|
|
|
_this.setTransform = function(shapeCtx, shapeOverlayCtx, autoShapeTrack, trackOverlay) {
|
|
|
|
if ( shapeCtx && shapeOverlayCtx && autoShapeTrack ) {
|
|
|
|
var x = _this.getHorizontalScroll();
|
|
var y = _this.getVerticalScroll();
|
|
|
|
shapeCtx.m_oCoordTransform.tx = x;
|
|
shapeCtx.m_oCoordTransform.ty = y;
|
|
shapeCtx.CalculateFullTransform();
|
|
|
|
shapeOverlayCtx.m_oCoordTransform.tx = x;
|
|
shapeOverlayCtx.m_oCoordTransform.ty = y;
|
|
shapeOverlayCtx.CalculateFullTransform();
|
|
|
|
autoShapeTrack.Graphics.m_oCoordTransform.tx = x;
|
|
autoShapeTrack.Graphics.m_oCoordTransform.ty = y;
|
|
autoShapeTrack.Graphics.CalculateFullTransform();
|
|
_this.worksheet.objectRender.controller.recalculateCurPos();
|
|
}
|
|
if(trackOverlay && trackOverlay.m_oHtmlPage)
|
|
{
|
|
var width = trackOverlay.m_oHtmlPage.drawingPage.right - trackOverlay.m_oHtmlPage.drawingPage.left;
|
|
var height = trackOverlay.m_oHtmlPage.drawingPage.bottom - trackOverlay.m_oHtmlPage.drawingPage.top;
|
|
trackOverlay.m_oHtmlPage.drawingPage.left = x;
|
|
trackOverlay.m_oHtmlPage.drawingPage.top = y;
|
|
trackOverlay.m_oHtmlPage.drawingPage.right = x + width;
|
|
trackOverlay.m_oHtmlPage.drawingPage.bottom = y + height;
|
|
}
|
|
};
|
|
|
|
_this.drawPaneBorder = function(autoShapeTrack) {
|
|
var fLeft, fTop, fRight, fBottom;
|
|
if(_this.type === FrozenAreaType.Bottom){
|
|
fTop = this.worksheet._getRowTop(_this.frozenCell.row);
|
|
fLeft = 0;
|
|
this.drawFrozenPaneBorderHor(autoShapeTrack, fTop, fLeft, autoShapeTrack.Graphics.m_lWidthPix);
|
|
}
|
|
else if(_this.type === FrozenAreaType.Right){
|
|
fTop = 0;
|
|
fLeft = this.worksheet._getColLeft(_this.frozenCell.col);
|
|
this.drawFrozenPaneBorderVer(autoShapeTrack, fLeft, fTop, autoShapeTrack.Graphics.m_lHeightPix);
|
|
}
|
|
else if(_this.type === FrozenAreaType.RightBottom){
|
|
//autoShapeTrack.Graphics.put_GlobalAlpha(true, 1);
|
|
fTop = this.worksheet._getRowTop(_this.frozenCell.row);
|
|
fLeft = this.worksheet._getColLeft(_this.frozenCell.col);
|
|
|
|
this.drawFrozenPaneBorderHor(autoShapeTrack, fTop, fLeft, autoShapeTrack.Graphics.m_lWidthPix);
|
|
this.drawFrozenPaneBorderVer(autoShapeTrack, fLeft, fTop, autoShapeTrack.Graphics.m_lHeightPix);
|
|
}
|
|
else if(_this.type === FrozenAreaType.LeftBottom){
|
|
fTop = this.worksheet._getRowTop(_this.frozenCell.row);
|
|
fLeft = 0;
|
|
fRight = this.worksheet._getColLeft(_this.frozenCell.col);
|
|
|
|
this.drawFrozenPaneBorderHor(autoShapeTrack, fTop, fLeft, fRight);
|
|
}
|
|
else if(_this.type === FrozenAreaType.RightTop){
|
|
fTop = 0;
|
|
fLeft = this.worksheet._getColLeft(_this.frozenCell.col);
|
|
fBottom = this.worksheet._getRowTop(_this.frozenCell.row);
|
|
this.drawFrozenPaneBorderVer(autoShapeTrack, fLeft, fTop, fBottom);
|
|
}
|
|
};
|
|
|
|
// Range constructor
|
|
_this.initRange();
|
|
}
|
|
|
|
// Container
|
|
function DrawingArea(ws) {
|
|
|
|
var asc = window["Asc"];
|
|
this.api = asc["editor"];
|
|
|
|
this.worksheet = ws;
|
|
this.frozenPlaces = [];
|
|
}
|
|
|
|
DrawingArea.prototype.init = function() {
|
|
this.frozenPlaces = [];
|
|
if ( this.worksheet ) {
|
|
var place;
|
|
if ( this.worksheet.topLeftFrozenCell ) {
|
|
place = new FrozenPlace(this.worksheet, FrozenAreaType.Top);
|
|
if ( place.isValid )
|
|
this.frozenPlaces.push(place);
|
|
place = new FrozenPlace(this.worksheet, FrozenAreaType.Bottom);
|
|
if ( place.isValid )
|
|
this.frozenPlaces.push(place);
|
|
place = new FrozenPlace(this.worksheet, FrozenAreaType.Left);
|
|
if ( place.isValid )
|
|
this.frozenPlaces.push(place);
|
|
place = new FrozenPlace(this.worksheet, FrozenAreaType.Right);
|
|
if ( place.isValid )
|
|
this.frozenPlaces.push(place);
|
|
|
|
place = new FrozenPlace(this.worksheet, FrozenAreaType.LeftTop);
|
|
if ( place.isValid )
|
|
this.frozenPlaces.push(place);
|
|
place = new FrozenPlace(this.worksheet, FrozenAreaType.RightTop);
|
|
if ( place.isValid )
|
|
this.frozenPlaces.push(place);
|
|
place = new FrozenPlace(this.worksheet, FrozenAreaType.LeftBottom);
|
|
if ( place.isValid )
|
|
this.frozenPlaces.push(place);
|
|
place = new FrozenPlace(this.worksheet, FrozenAreaType.RightBottom);
|
|
if ( place.isValid )
|
|
this.frozenPlaces.push(place);
|
|
}
|
|
else
|
|
this.frozenPlaces.push(new FrozenPlace(this.worksheet, FrozenAreaType.Center));
|
|
}
|
|
};
|
|
|
|
DrawingArea.prototype.clear = function() {
|
|
this.worksheet.drawingGraphicCtx.clear();
|
|
};
|
|
DrawingArea.prototype.clearRect = function(oRect) {
|
|
var canvas = this.worksheet.objectRender.getDrawingCanvas();
|
|
var oT = canvas.shapeCtx.m_oCoordTransform;
|
|
var l = (oT.TransformPointX(oRect.l, oRect.t) >> 0) - 1;
|
|
var t = (oT.TransformPointY(oRect.l, oRect.t) >> 0) - 1;
|
|
var r = (oT.TransformPointX(oRect.r, oRect.b) >> 0) + 1;
|
|
var b = (oT.TransformPointY(oRect.r, oRect.b) >> 0) + 1;
|
|
canvas.shapeCtx.m_oContext.clearRect(l, t, r - l, b - t);
|
|
};
|
|
|
|
DrawingArea.prototype.drawObject = function(object, oRect) {
|
|
for ( var i = 0; i < this.frozenPlaces.length; i++ ) {
|
|
if ( this.frozenPlaces[i].isObjectInside(object) ) {
|
|
this.frozenPlaces[i].drawObject(object, oRect);
|
|
}
|
|
}
|
|
};
|
|
DrawingArea.prototype.drawDropDown = function(object, oRect) {
|
|
for ( var i = 0; i < this.frozenPlaces.length; i++ ) {
|
|
this.frozenPlaces[i].drawDropDown(object, oRect);
|
|
}
|
|
};
|
|
DrawingArea.prototype.updateRange = function(object, oRange) {
|
|
for ( var i = 0; i < this.frozenPlaces.length; i++ ) {
|
|
if ( this.frozenPlaces[i].isObjectInside(object) ) {
|
|
this.frozenPlaces[i].updateRange(object, oRange);
|
|
}
|
|
}
|
|
};
|
|
|
|
DrawingArea.prototype.reinitRanges = function() {
|
|
for ( var i = 0; i < this.frozenPlaces.length; i++ ) {
|
|
this.frozenPlaces[i].initRange();
|
|
}
|
|
};
|
|
DrawingArea.prototype.convertCoordsToCursorWR = function(x, y) {
|
|
let oFrozenPlace = this.frozenPlaces[0];
|
|
let oWS = this.worksheet;
|
|
let canvas = oWS.objectRender.getDrawingCanvas();
|
|
let shapeCtx = canvas.shapeCtx;
|
|
let nXT = AscCommon.AscBrowser.convertToRetinaValue(shapeCtx.m_oCoordTransform.sx * x + oFrozenPlace.getHorizontalScroll(), false);
|
|
let nYT = AscCommon.AscBrowser.convertToRetinaValue(shapeCtx.m_oCoordTransform.sy * y + oFrozenPlace.getVerticalScroll(), false);
|
|
return {X: nXT, Y: nYT, Error: false};
|
|
};
|
|
|
|
DrawingArea.prototype.drawSelection = function(drawingDocument) {
|
|
var oWS = this.worksheet;
|
|
var canvas = oWS.objectRender.getDrawingCanvas();
|
|
var shapeCtx = canvas.shapeCtx;
|
|
var shapeOverlayCtx = canvas.shapeOverlayCtx;
|
|
var autoShapeTrack = canvas.autoShapeTrack;
|
|
var trackOverlay = canvas.trackOverlay;
|
|
|
|
var ctx = trackOverlay.m_oContext;
|
|
trackOverlay.Clear();
|
|
drawingDocument.Overlay = trackOverlay;
|
|
|
|
oWS.overlayGraphicCtx.clear();
|
|
oWS._drawCollaborativeElements(autoShapeTrack);
|
|
|
|
var controller = oWS.objectRender.controller;
|
|
if ( controller.selectedObjects.length || this.api.isStartAddShape || this.api.isInkDrawerOn()) {
|
|
oWS.cleanSelection();
|
|
oWS._drawSelection();
|
|
}
|
|
var chart = controller.getChartForRangesDrawing();
|
|
if(chart) {
|
|
oWS.objectRender.selectDrawingObjectRange(chart);
|
|
}
|
|
for ( var i = 0; i < this.frozenPlaces.length; i++ ) {
|
|
this.frozenPlaces[i].drawSelection(drawingDocument, shapeCtx, shapeOverlayCtx, autoShapeTrack, trackOverlay);
|
|
}
|
|
|
|
this.drawFrozenPaneBorders(autoShapeTrack);
|
|
var oWatermark = this.api.watermarkDraw;
|
|
if(oWatermark) {
|
|
oWatermark.zoom = 1.0;
|
|
oWatermark.Generate();
|
|
if(oWatermark.width > 0 && oWatermark.height > 0) {
|
|
let nOffsetY = oWS.cellsTop;
|
|
while (nOffsetY < ctx.canvas.height) {
|
|
let nOffsetX = oWS.cellsLeft;
|
|
while (nOffsetX < ctx.canvas.width) {
|
|
oWatermark.Draw(ctx, nOffsetX, nOffsetY, oWatermark.width, oWatermark.height);
|
|
nOffsetX += oWatermark.width;
|
|
}
|
|
nOffsetY += oWatermark.height;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (this.api) {
|
|
const oDrawingDocument = this.api.getDrawingDocument();
|
|
if (oDrawingDocument && oDrawingDocument.placeholders.objects.length) {
|
|
const oRect = {};
|
|
const nOffsetX = 2 * oWS.cellsLeft - oWS._getColLeft(oWS.visibleRange.c1);
|
|
const nOffsetY = 2 * oWS.cellsTop - oWS._getRowTop(oWS.visibleRange.r1);
|
|
oRect.left = nOffsetX;
|
|
oRect.right = nOffsetX + ctx.canvas.width;
|
|
oRect.top = nOffsetY;
|
|
oRect.bottom = nOffsetY + ctx.canvas.height;
|
|
var pxToMm = Asc.getCvtRatio(0/*mm*/, 3/*px*/, oWS._getPPIX());
|
|
ctx.save();
|
|
ctx.beginPath();
|
|
ctx.rect(oWS.cellsLeft, oWS.cellsTop, ctx.canvas.width, ctx.canvas.height);
|
|
ctx.clip();
|
|
oDrawingDocument.placeholders.draw(trackOverlay, oWS.workbook.model.nActive, oRect, ctx.canvas.width * pxToMm, ctx.canvas.height * pxToMm);
|
|
ctx.restore();
|
|
}
|
|
}
|
|
};
|
|
|
|
DrawingArea.prototype.drawFrozenPaneBorders = function(autoShapeTrack) {
|
|
for ( var i = 0; i < this.frozenPlaces.length; i++ ) {
|
|
this.frozenPlaces[i].drawPaneBorder(autoShapeTrack);
|
|
}
|
|
};
|
|
|
|
DrawingArea.prototype.getOffsets = function(x, y, bEvents) {
|
|
for ( var i = 0; i < this.frozenPlaces.length; i++ ) {
|
|
if ( this.frozenPlaces[i].isPointInside(x, y, bEvents) ) {
|
|
return { x: this.frozenPlaces[i].getHorizontalScroll(), y: this.frozenPlaces[i].getVerticalScroll() }
|
|
}
|
|
}
|
|
return null;
|
|
};
|
|
|
|
//--------------------------------------------------------export----------------------------------------------------
|
|
window['AscFormat'] = window['AscFormat'] || {};
|
|
window['AscCommonExcel'] = window['AscCommonExcel'] || {};
|
|
window['AscFormat'].DrawingArea = DrawingArea;
|
|
|
|
window["AscCommonExcel"].sFrozenImageUrl = sFrozenImageUrl;
|
|
window["AscCommonExcel"].sFrozenImageRotUrl = sFrozenImageRotUrl;
|
|
})(window);
|