Files
DocumentServer-v-9.2.0/sdkjs/common/Charts/DrawingArea.js
Yajbir Singh f1b860b25c
Some checks failed
check / markdownlint (push) Has been cancelled
check / spellchecker (push) Has been cancelled
updated
2025-12-11 19:03:17 +05:30

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);