/* * (c) Copyright Ascensio System SIA 2010-2015 * * This program is a free software product. You can redistribute it and/or * modify it under the terms of the GNU Affero General Public License (AGPL) * version 3 as published by the Free Software Foundation. In accordance with * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect * that Ascensio System SIA expressly excludes the warranty of non-infringement * of any third-party rights. * * This program is distributed WITHOUT ANY WARRANTY; without even the implied * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html * * You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia, * EU, LV-1021. * * The interactive user interfaces in modified source and object code versions * of the Program must display Appropriate Legal Notices, as required under * Section 5 of the GNU AGPL version 3. * * Pursuant to Section 7(b) of the License you must retain the original Product * logo when distributing the program. Pursuant to Section 7(e) we decline to * grant you any rights under trademark law for use of our trademarks. * * All the Product's GUI elements, including illustrations and icon sets, as * well as technical writing content are licensed under the terms of the * Creative Commons Attribution-ShareAlike 4.0 International. See the License * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode * */ "use strict"; var FrozenAreaType = { Top: "Top", Bottom: "Bottom", Left: "Left", Right: "Right", Center: "Center", LeftTop: "LeftTop", RightTop: "RightTop", LeftBottom: "LeftBottom", RightBottom: "RightBottom" }; 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; var convertMetrics = _this.worksheet.objectRender.convertMetric; _this.initRange = function () { switch (_this.type) { case FrozenAreaType.Top: if (!_this.frozenCell.col && _this.frozenCell.row) { _this.range = new asc_Range(0, 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; 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) { case FrozenAreaType.Top: 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; case FrozenAreaType.LeftTop: 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; 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 = { x: 0, y: 0, w: 0, h: 0, r: 0, b: 0 }; rect.x = _this.worksheet.getCellLeftRelative(_this.range.c1, 0); rect.y = _this.worksheet.getCellTopRelative(_this.range.r1, 0); rect.w = _this.worksheet.getCellLeftRelative(_this.range.c2, 0) + _this.worksheet.getColumnWidth(_this.range.c2, 0) - rect.x; rect.h = _this.worksheet.getCellTopRelative(_this.range.r2, 0) + _this.worksheet.getRowHeight(_this.range.r2, 0) - rect.y; rect.r = rect.x + rect.w; rect.b = rect.y + rect.h; 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; 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.getRect2 = function () { var rect = { x: 0, y: 0, w: 0, h: 0 }; rect.x = _this.worksheet.getCellLeftRelative(_this.range.c1, 0); rect.y = _this.worksheet.getCellTopRelative(_this.range.r1, 0); rect.w = _this.worksheet.getCellLeftRelative(_this.range.c2, 0) + _this.worksheet.getColumnWidth(_this.range.c2, 0) - rect.x; rect.h = _this.worksheet.getCellTopRelative(_this.range.r2, 0) + _this.worksheet.getRowHeight(_this.range.r2, 0) - rect.y; return rect; }; _this.getFirstVisible = function () { var fv = { col: 0, row: 0 }; switch (_this.type) { 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; 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; 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) { 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 () { var scroll = 0; var fv = _this.getFirstVisible(); var headerPx = _this.worksheet.getCellTop(0, 0); switch (_this.type) { case FrozenAreaType.Top: scroll = headerPx; break; case FrozenAreaType.Bottom: scroll = -convertMetrics((_this.worksheet.rows[fv.row].top - _this.worksheet.rows[_this.frozenCell.row].top), 1, 0) + headerPx; break; case FrozenAreaType.Left: case FrozenAreaType.Right: scroll = -convertMetrics((_this.worksheet.rows[fv.row].top - _this.worksheet.cellsTop), 1, 0) + headerPx; break; case FrozenAreaType.LeftTop: case FrozenAreaType.RightTop: scroll = headerPx; break; case FrozenAreaType.LeftBottom: case FrozenAreaType.RightBottom: scroll = -convertMetrics((_this.worksheet.rows[fv.row].top - _this.worksheet.rows[_this.frozenCell.row].top), 1, 0) + headerPx; break; case FrozenAreaType.Center: scroll = -convertMetrics((_this.worksheet.rows[fv.row].top - _this.worksheet.cellsTop), 1, 0) + headerPx; break; } return scroll; }; _this.getHorizontalScroll = function () { var scroll = 0; var fv = _this.getFirstVisible(); var headerPx = _this.worksheet.getCellLeft(0, 0); switch (_this.type) { case FrozenAreaType.Top: case FrozenAreaType.Bottom: scroll = -convertMetrics((_this.worksheet.cols[fv.col].left - _this.worksheet.cellsLeft), 1, 0) + headerPx; break; case FrozenAreaType.Left: scroll = headerPx; break; case FrozenAreaType.Right: scroll = -convertMetrics((_this.worksheet.cols[fv.col].left - _this.worksheet.cols[_this.frozenCell.col].left), 1, 0) + headerPx; break; case FrozenAreaType.LeftTop: case FrozenAreaType.LeftBottom: scroll = headerPx; break; case FrozenAreaType.RightTop: case FrozenAreaType.RightBottom: scroll = -convertMetrics((_this.worksheet.cols[fv.col].left - _this.worksheet.cols[_this.frozenCell.col].left), 1, 0) + headerPx; break; case FrozenAreaType.Center: scroll = -convertMetrics((_this.worksheet.cols[fv.col].left - _this.worksheet.cellsLeft), 1, 0) + headerPx; break; } return scroll; }; _this.clip = function (canvas) { var rect = _this.getRect2(); 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.drawObject = function (object) { var canvas = _this.worksheet.objectRender.getDrawingCanvas(); _this.setTransform(canvas.shapeCtx, canvas.shapeOverlayCtx, canvas.autoShapeTrack); _this.clip(canvas.shapeCtx); object.graphicObject.draw(canvas.shapeCtx); if ((object.graphicObject.lockType != undefined) && (object.graphicObject.lockType != c_oAscLockTypes.kLockTypeNone)) { 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.setTransform = function (shapeCtx, shapeOverlayCtx, autoShapeTrack) { 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(); } }; _this.initRange(); } function DrawingArea(ws) { var _this = this; var asc = window["Asc"]; var api = asc["editor"]; _this.worksheet = ws; _this.frozenPlaces = []; _this.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)); } } }; _this.clear = function () { _this.worksheet.drawingGraphicCtx.clear(); }; _this.drawObject = function (object) { for (var i = 0; i < _this.frozenPlaces.length; i++) { if (_this.frozenPlaces[i].isObjectInside(object)) { _this.frozenPlaces[i].drawObject(object); } } }; _this.reinitRanges = function () { for (var i = 0; i < _this.frozenPlaces.length; i++) { _this.frozenPlaces[i].initRange(); } }; _this.drawSelection = function (drawingDocument) { var canvas = _this.worksheet.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; _this.worksheet.overlayCtx.clear(); _this.worksheet.overlayGraphicCtx.clear(); _this.worksheet._drawCollaborativeElements(false); if (!_this.worksheet.objectRender.controller.selectedObjects.length && !api.isStartAddShape) { _this.worksheet._drawSelection(); } var chart; var controller = _this.worksheet.objectRender.controller; var selected_objects = controller.selection.groupSelection ? controller.selection.groupSelection.selectedObjects : controller.selectedObjects; if (selected_objects.length === 1 && selected_objects[0].getObjectType() === historyitem_type_ChartSpace) { chart = selected_objects[0]; _this.worksheet.objectRender.selectDrawingObjectRange(chart); } for (var i = 0; i < _this.frozenPlaces.length; i++) { _this.frozenPlaces[i].setTransform(shapeCtx, shapeOverlayCtx, autoShapeTrack); _this.frozenPlaces[i].clip(shapeOverlayCtx); if (null == drawingDocument.m_oDocumentRenderer) { if (drawingDocument.m_bIsSelection) { if (drawingDocument.m_bIsSelection) { 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(); } ctx.globalAlpha = 1; _this.worksheet.objectRender.controller.drawSelection(drawingDocument); if (_this.worksheet.objectRender.controller.needUpdateOverlay()) { trackOverlay.Show(); shapeOverlayCtx.put_GlobalAlpha(true, 0.5); _this.worksheet.objectRender.controller.drawTracks(shapeOverlayCtx); shapeOverlayCtx.put_GlobalAlpha(true, 1); } } else { ctx.fillStyle = "rgba(51,102,204,255)"; ctx.beginPath(); for (var j = drawingDocument.m_lDrawingFirst; j <= drawingDocument.m_lDrawingEnd; j++) { var drawPage = drawingDocument.m_arrPages[j].drawingPage; drawingDocument.m_oDocumentRenderer.DrawSelection(j, trackOverlay, drawPage.left, drawPage.top, drawPage.right - drawPage.left, drawPage.bottom - drawPage.top); } ctx.globalAlpha = 0.2; ctx.fill(); ctx.beginPath(); ctx.globalAlpha = 1; } _this.frozenPlaces[i].restore(shapeOverlayCtx); } }; _this.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; }; }