/* * (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"; // Import var c_oAscDocumentUnits = Asc.c_oAscDocumentUnits; var global_mouseEvent = AscCommon.global_mouseEvent; var g_dKoef_pix_to_mm = AscCommon.g_dKoef_pix_to_mm; var g_dKoef_mm_to_pix = AscCommon.g_dKoef_mm_to_pix; function CTab(pos, type, leader) { this.pos = pos; this.type = type; this.leader = leader; } var g_array_objects_length = 1; var RULER_OBJECT_TYPE_PARAGRAPH = 1; var RULER_OBJECT_TYPE_HEADER = 2; var RULER_OBJECT_TYPE_FOOTER = 4; var RULER_OBJECT_TYPE_TABLE = 8; var RULER_OBJECT_TYPE_COLUMNS = 16; function CHorRulerRepaintChecker() { // zoom/section check this.Width = 0; this.Height = 0; // ruler type check this.Type = 0; // margin check this.MarginLeft = 0; this.MarginRight = 0; // table column check this.tableCols = []; this.marginsLeft = []; this.marginsRight = []; this.columns = null; // CColumnsMarkup // blit to main params this.BlitAttack = false; this.BlitLeft = 0; this.BlitIndentLeft = 0; this.BlitIndentLeftFirst = 0; this.BlitIndentRight = 0; this.BlitDefaultTab = 0; this.BlitTabs = null; this.BlitRtl = false; this.BlitMarginLeftInd = 0; this.BlitMarginRightInd = 0; } function CVerRulerRepaintChecker() { // zoom/section check this.Width = 0; this.Height = 0; // ruler type check this.Type = 0; // margin check this.MarginTop = 0; this.MarginBottom = 0; // header/footer check this.HeaderTop = 0; this.HeaderBottom = 0; // table column check this.rowsY = []; this.rowsH = []; // blit params this.BlitAttack = false; this.BlitTop = 0; } function RulerCorrectPosition(_ruler, val, margin) { if (AscCommon.global_keyboardEvent.AltKey) return val; var mm_1_4 = 10 / 4; if (_ruler.Units == c_oAscDocumentUnits.Inch) mm_1_4 = 25.4 / 16; else if (_ruler.Units == c_oAscDocumentUnits.Point) mm_1_4 = 25.4 / 12; var mm_1_8 = mm_1_4 / 2; if (undefined === margin) return (((val + mm_1_8) / mm_1_4) >> 0) * mm_1_4; if (val >= margin) return margin + (((val - margin + mm_1_8) / mm_1_4) >> 0) * mm_1_4; return margin + (((val - margin - mm_1_8) / mm_1_4) >> 0) * mm_1_4; } function RulerCheckSimpleChanges() { this.X = -1; this.Y = -1; this.IsSimple = true; this.IsDown = false; } RulerCheckSimpleChanges.prototype = { Clear : function() { this.X = -1; this.Y = -1; this.IsSimple = true; this.IsDown = false; }, Reinit : function() { this.X = global_mouseEvent.X; this.Y = global_mouseEvent.Y; this.IsSimple = true; this.IsDown = true; }, CheckMove : function() { if (!this.IsDown) return; if (!this.IsSimple) return; if (Math.abs(global_mouseEvent.X - this.X) > 0 || Math.abs(global_mouseEvent.Y - this.Y) > 0) this.IsSimple = false; } }; (function(){ AscWord.RULER_DRAG_TYPE = { none : 0, leftMargin : 1, rightMargin : 2, leftFirstInd : 3, leftInd : 4, firstInd : 5, rightInd : 6, tab : 7, table : 8, columnSize : 9, columnPos : 10 }; })(); function CHorRuler() { this.m_oPage = null; // текущая страница. Нужна для размеров и маргинов в режиме RULER_OBJECT_TYPE_PARAGRAPH this.m_nTop = 0; // начало прямогулольника линейки this.m_nBottom = 0; // конец прямоугольника линейки // реализация tab'ов this.m_dDefaultTab = 12.5; this.m_arrTabs = []; this.m_lCurrentTab = -1; this.m_dCurrentTabNewPosition = -1; this.m_dMaxTab = 0; this.IsDrawingCurTab = true; // это подсказка для пользователя - будет ли оставлен таб после отпускания мышки, или будет выкинут this.m_dMarginLeft = 20; this.m_dMarginRight = 190; this.m_dIndentLeft = 10; this.m_dIndentRight = 20; this.m_dIndentLeftFirst = 20; this.m_bRtl = false; this.m_oCanvas = null; this.m_dZoom = 1; this.DragType = AscWord.RULER_DRAG_TYPE.none; this.DragTypeMouseDown = AscWord.RULER_DRAG_TYPE.none; this.m_dIndentLeft_old = -10000; this.m_dIndentLeftFirst_old = -10000; this.m_dIndentRight_old = -10000; // отдельные настройки для текущего объекта линейки this.CurrentObjectType = RULER_OBJECT_TYPE_PARAGRAPH; this.m_oTableMarkup = null; this.m_oColumnMarkup = null; this.DragTablePos = -1; this.TableMarginLeft = 0; this.TableMarginLeftTrackStart = 0; this.TableMarginRight = 0; this.m_oWordControl = null; this.RepaintChecker = new CHorRulerRepaintChecker(); this.m_bIsMouseDown = false; // presentations addons this.IsCanMoveMargins = true; this.IsCanMoveAnyMarkers = true; this.IsDrawAnyMarkers = true; this.SimpleChanges = new RulerCheckSimpleChanges(); this.Units = c_oAscDocumentUnits.Millimeter; this.DrawTablePict = function() { var ctx = g_memory.ctx; var dPR = AscCommon.AscBrowser.retinaPixelRatio; var isNeedRedraw = (dPR - Math.floor(dPR)) >= 0.5 ? true : false; var roundDPR = isNeedRedraw ? Math.floor(dPR) : Math.round(dPR); var canvasWidth = (isNeedRedraw && dPR >= 1 ) ? Math.round(7 * (Math.floor(dPR) + 0.5)) : 7 * (isNeedRedraw ? dPR : ( dPR >= 1 ? Math.round(dPR) : dPR)), canvasHeight = (isNeedRedraw && dPR >= 1) ? Math.round(8 * (Math.floor(dPR) + 0.5)) : 8 * (isNeedRedraw ? dPR : ( dPR >= 1 ? Math.round(dPR) : dPR)); if (null != this.tableSprite) { if (ctx.canvas.width == canvasWidth) return; } ctx.canvas.width = canvasWidth; ctx.canvas.height = canvasHeight; ctx.beginPath(); ctx.fillStyle = '#ffffff'; ctx.strokeStyle = '#ffffff'; ctx.stroke(); ctx.rect(0,0,ctx.canvas.width, ctx.canvas.height) ctx.fill(); ctx.beginPath(); ctx.strokeStyle = '#646464'; ctx.lineWidth = roundDPR; var step = isNeedRedraw ? Math.round(dPR): ctx.lineWidth; for (var i = 0; i < 7 * ctx.canvas.width; i += step + ctx.lineWidth) { ctx.moveTo(0, 0.5 * ctx.lineWidth + step + i); ctx.lineTo(ctx.canvas.width, 0.5 * ctx.lineWidth + step + i); ctx.stroke(); } for (var i = 0; i < 8 * ctx.canvas.height; i += step + ctx.lineWidth) { ctx.moveTo(0.5 * ctx.lineWidth + step + i, 0); ctx.lineTo(0.5 * ctx.lineWidth + step + i, ctx.canvas.height); ctx.stroke(); } return ctx.canvas; } this.tableSprite = null; this.CheckCanvas = function() { this.m_dZoom = this.m_oWordControl.m_nZoomValue / 100; var dPR = AscCommon.AscBrowser.retinaPixelRatio; var tablePict = this.DrawTablePict(); if (tablePict) this.tableSprite = tablePict; var dKoef_mm_to_pix = g_dKoef_mm_to_pix * this.m_dZoom; dKoef_mm_to_pix *= dPR; var widthNew = dKoef_mm_to_pix * this.m_oPage.width_mm; var _width = 10 * Math.round(dPR) + widthNew; if (dPR > 1) _width += Math.round(dPR); var _height = 8 * g_dKoef_mm_to_pix * dPR; var intW = _width >> 0; var intH = _height >> 0; if (null == this.m_oCanvas) { this.m_oCanvas = document.createElement('canvas'); this.m_oCanvas.width = intW; this.m_oCanvas.height = intH; } else { var oldW = this.m_oCanvas.width; var oldH = this.m_oCanvas.height; if ((oldW != intW) || (oldH != intH)) { delete this.m_oCanvas; this.m_oCanvas = document.createElement('canvas'); this.m_oCanvas.width = intW; this.m_oCanvas.height = intH; } } return widthNew; } this.CreateBackground = function(cachedPage, isattack) { if (window["NATIVE_EDITOR_ENJINE"]) return; if (null == cachedPage || undefined == cachedPage) return; this.m_oPage = cachedPage; var width = this.CheckCanvas(); if (0 == this.DragType) { this.m_dMarginLeft = cachedPage.margin_left; this.m_dMarginRight = cachedPage.margin_right; } // check old state var checker = this.RepaintChecker; var markup = this.m_oTableMarkup; if (this.CurrentObjectType == RULER_OBJECT_TYPE_COLUMNS) markup = this.m_oColumnMarkup; if (isattack !== true && this.CurrentObjectType == checker.Type && width == checker.Width) { if (this.CurrentObjectType == RULER_OBJECT_TYPE_PARAGRAPH) { if (this.m_dMarginLeft == checker.MarginLeft && this.m_dMarginRight == checker.MarginRight) return; } else if (this.CurrentObjectType == RULER_OBJECT_TYPE_TABLE) { var oldcount = checker.tableCols.length; var newcount = 1 + markup.Cols.length; if (oldcount == newcount) { var arr1 = checker.tableCols; var arr2 = markup.Cols; if (arr1[0] == markup.X) { var _break = false; for (var i = 1; i < newcount; i++) { if (arr1[i] != arr2[i - 1]) { _break = true; break; } } if (!_break) { --newcount; var _margs = markup.Margins; for (var i = 0; i < newcount; i++) { if (_margs[i].Left != checker.marginsLeft[i] || _margs[i].Right != checker.marginsRight[i]) { _break = true; break; } } if (!_break) return; } } } } else if (this.CurrentObjectType == RULER_OBJECT_TYPE_COLUMNS) { if (this.m_oColumnMarkup.X == checker.columns.X) { if (markup.EqualWidth == checker.columns.EqualWidth) { if (markup.EqualWidth) { if (markup.Num == checker.columns.Num && markup.Space == checker.columns.Space && markup.R == checker.columns.R) return; } else { var _arr1 = markup.Cols; var _arr2 = checker.columns.Cols; if (_arr1 && _arr2 && _arr1.length == _arr2.length) { var _len = _arr1.length; var _index = 0; for (_index = 0; _index < _len; _index++) { if (_arr1[_index].W != _arr2[_index].W || _arr1[_index].Space != _arr2[_index].Space) break; } if (_index == _len) return; } } } } } } //console.log("horizontal"); checker.Width = width; checker.Type = this.CurrentObjectType; checker.BlitAttack = true; var dPR = AscCommon.AscBrowser.retinaPixelRatio; var dKoef_mm_to_pix = g_dKoef_mm_to_pix * this.m_dZoom * dPR; // не править !!! this.m_nTop = Math.round(6 * dPR);//(1.8 * g_dKoef_mm_to_pix) >> 0; this.m_nBottom = Math.round(19 * dPR);//(5.2 * g_dKoef_mm_to_pix) >> 0; var context = this.m_oCanvas.getContext('2d'); context.setTransform(1, 0, 0, 1, 5 * Math.round( dPR), 0); context.fillStyle = GlobalSkin.BackgroundColor; context.fillRect(0, 0, this.m_oCanvas.width, this.m_oCanvas.height); // промежуток между маргинами var left_margin = 0; var right_margin = 0; let isRtl = false; if (this.CurrentObjectType == RULER_OBJECT_TYPE_PARAGRAPH) { left_margin = (this.m_dMarginLeft * dKoef_mm_to_pix) >> 0; right_margin = (this.m_dMarginRight * dKoef_mm_to_pix) >> 0; checker.MarginLeft = this.m_dMarginLeft; checker.MarginRight = this.m_dMarginRight; isRtl = this.m_bRtl; } else if (this.CurrentObjectType == RULER_OBJECT_TYPE_TABLE && null != markup) { var _cols = checker.tableCols; if (0 != _cols.length) _cols.splice(0, _cols.length); _cols[0] = markup.X; var _ml = checker.marginsLeft; if (0 != _ml.length) _ml.splice(0, _ml.length); var _mr = checker.marginsRight; if (0 != _mr.length) _mr.splice(0, _mr.length); var _count_ = markup.Cols.length; for (var i = 0; i < _count_; i++) { _cols[i + 1] = markup.Cols[i]; _ml[i] = markup.Margins[i].Left; _mr[i] = markup.Margins[i].Right; } if (0 != _count_) { var _start = 0; for (var i = 0; i < _count_; i++) { _start += markup.Cols[i]; } left_margin = ((markup.X + markup.Margins[0].Left) * dKoef_mm_to_pix) >> 0; right_margin = ((markup.X + _start - markup.Margins[markup.Margins.length - 1].Right) * dKoef_mm_to_pix) >> 0; } } else if (this.CurrentObjectType == RULER_OBJECT_TYPE_COLUMNS && null != markup) { left_margin = (markup.X * dKoef_mm_to_pix) >> 0; right_margin = (markup.R * dKoef_mm_to_pix) >> 0; checker.MarginLeft = this.m_dMarginLeft; checker.MarginRight = this.m_dMarginRight; checker.columns = this.m_oColumnMarkup.CreateDuplicate(); } var indent = 0.5 * Math.round(dPR); context.fillStyle = GlobalSkin.RulerLight; context.fillRect(left_margin + indent, this.m_nTop + indent, right_margin - left_margin, this.m_nBottom - this.m_nTop); var intW = width >> 0; if (true) { context.beginPath(); context.fillStyle = GlobalSkin.RulerDark; context.fillRect(indent, this.m_nTop + indent, left_margin, this.m_nBottom - this.m_nTop); context.fillRect(right_margin + indent, this.m_nTop + indent, Math.max(intW - right_margin, 1), this.m_nBottom - this.m_nTop); context.beginPath(); } // рамка //context.shadowBlur = 0; //context.shadowColor = "#81878F"; context.beginPath(); context.lineWidth = Math.round(dPR); context.strokeStyle = GlobalSkin.RulerTextColor; context.fillStyle = GlobalSkin.RulerTextColor; let mm_1_4 = 10 * dKoef_mm_to_pix / 4; let inch_1_8 = 25.4 * dKoef_mm_to_pix / 8; let point_1_12 = 25.4 * dKoef_mm_to_pix / 12; var middleVert = (this.m_nTop + this.m_nBottom) / 2; var part1 = 1.5 * Math.round(dPR); var part2 = 2.5 * Math.round(dPR); context.font = Math.round(7 * dPR) + "pt Arial"; let _bottom = this.m_nBottom; function drawLayoutMM(x, step, count) { let isDraw1_4 = Math.abs(step) > 7; let index = 0; let num = 0; for (let i = 1; i <= count; ++i) { let lXPos = ((x + i * step) >> 0) + indent; index++; if (index === 4) index = 0; if (0 === index) { num++; // number let strNum = "" + num; let lWidthText = context.measureText(strNum).width; lXPos -= (lWidthText / 2.0); context.fillText(strNum, lXPos, _bottom - Math.round(3 * dPR)); } else if (1 === index && isDraw1_4) { // 1/4 context.beginPath(); context.moveTo(lXPos, middleVert - part1); context.lineTo(lXPos, middleVert + part1); context.stroke(); } else if (2 === index) { // 1/2 context.beginPath(); context.moveTo(lXPos, middleVert - part2); context.lineTo(lXPos, middleVert + part2); context.stroke(); } else if (isDraw1_4) { // 1/4 context.beginPath(); context.moveTo(lXPos, middleVert - part1); context.lineTo(lXPos, middleVert + part1); context.stroke(); } } } function drawLayoutInch(x, step, count) { let isDraw1_8 = Math.abs(step) > 8; let index = 0; let num = 0; for (let i = 1; i <= count; ++i) { let lXPos = ((x + i * step) >> 0) + indent; index++; if (index === 8) index = 0; if (0 === index) { num++; // number let strNum = "" + num; let lWidthText = context.measureText(strNum).width; lXPos -= (lWidthText / 2.0); context.fillText(strNum, lXPos, _bottom - Math.round(3 * dPR)); } else if (4 === index) { // 1/2 context.beginPath(); context.moveTo(lXPos, middleVert - part2); context.lineTo(lXPos, middleVert + part2); context.stroke(); } else if (isDraw1_8) { // 1/8 context.beginPath(); context.moveTo(lXPos, middleVert - part1); context.lineTo(lXPos, middleVert + part1); context.stroke(); } } } function drawLayoutPt(x, step, count) { let isDraw1_12 = Math.abs(step) > 5; let index = 0; let num = 0; for (let i = 1; i <= count; ++i) { let lXPos = ((x + i * step) >> 0) + indent; index++; if (index === 12) index = 0; if (0 === index || 6 === index) { num++; // number let strNum = "" + (num * 36); let lWidthText = context.measureText(strNum).width; lXPos -= (lWidthText / 2.0); context.fillText(strNum, lXPos, _bottom - Math.round(3 * dPR)); } else if (isDraw1_12) { // 1/12 context.beginPath(); context.moveTo(lXPos, middleVert - part1); context.lineTo(lXPos, middleVert + part1); context.stroke(); } } } let step = point_1_12; let drawFunc = null; if (this.Units === c_oAscDocumentUnits.Millimeter) { step = mm_1_4; drawFunc = drawLayoutMM; } else if (this.Units === c_oAscDocumentUnits.Inch) { step = inch_1_8; drawFunc = drawLayoutInch; } else if (this.Units === c_oAscDocumentUnits.Point) { step = point_1_12; drawFunc = drawLayoutPt; } if (drawFunc) { let zeroX = isRtl ? right_margin : left_margin; let rCount = isRtl ? ((width - right_margin) / step) >> 0 : (((width - left_margin) / step) >> 0) - 1; let lCount = isRtl ? ((right_margin / step) >> 0) - 1 : left_margin / step >> 0; drawFunc(zeroX, step, rCount); drawFunc(zeroX, -step, lCount); } if (null != markup && this.CurrentObjectType == RULER_OBJECT_TYPE_TABLE) { var _count = markup.Cols.length; if (0 != _count) { context.fillStyle = GlobalSkin.RulerDark; context.strokeStyle = GlobalSkin.RulerOutline; var _offset = markup.X; for (var i = 0; i <= _count; i++) { var __xID = 0; __xID = (-2.5 * dPR + _offset * dKoef_mm_to_pix) >> 0; var __yID = this.m_nBottom - Math.round(10 * dPR); if (0 == i) { context.drawImage(this.tableSprite, __xID, __yID); _offset += markup.Cols[i]; continue; } if (i == _count) { context.drawImage(this.tableSprite, __xID, __yID); break; } var __x = (((_offset - markup.Margins[i-1].Right) * dKoef_mm_to_pix) >> 0) + indent; var __r = (((_offset + markup.Margins[i].Left) * dKoef_mm_to_pix) >> 0) + indent; context.fillRect(__x, this.m_nTop + indent, __r - __x, this.m_nBottom - this.m_nTop); context.strokeRect(__x, this.m_nTop + indent, __r - __x, this.m_nBottom - this.m_nTop); context.drawImage(this.tableSprite, __xID, __yID); _offset += markup.Cols[i]; } } } if (null != markup && this.CurrentObjectType == RULER_OBJECT_TYPE_COLUMNS) { var _array = markup.EqualWidth ? [] : markup.Cols; if (markup.EqualWidth) { var _w = ((markup.R - markup.X) - markup.Space * (markup.Num - 1)) / markup.Num; for (var i = 0; i < markup.Num; i++) { var _cur = new CColumnsMarkupColumn(); _cur.W = _w; _cur.Space = markup.Space; _array.push(_cur); } } var _count = _array.length; if (0 != _count) { context.fillStyle = GlobalSkin.RulerDark; context.strokeStyle = GlobalSkin.RulerOutline; var _offsetX = markup.X; for (var i = 0; i < _count; i++) { var __xTmp = _offsetX + _array[i].W; var __rTmp = __xTmp + _array[i].Space; var _offset = (__xTmp + __rTmp) / 2; if (i == (_count - 1)) continue; var __xID = 0; __xID = ((2.5 + _offset * dKoef_mm_to_pix)) * dPR >> 0; var __yID = this.m_nBottom - Math.round(10 * dPR); var __x = ((__xTmp * dKoef_mm_to_pix) >> 0) + indent; var __r = ((__rTmp * dKoef_mm_to_pix) >> 0) + indent; context.fillRect(__x, this.m_nTop + indent, __r - __x, this.m_nBottom - this.m_nTop); context.strokeRect(__x, this.m_nTop + indent, __r - __x, this.m_nBottom - this.m_nTop); if (!markup.EqualWidth) context.drawImage(this.tableSprite, __xID, __yID); if ((__r - __x) > 10) { context.fillStyle = GlobalSkin.RulerLight; context.strokeStyle = GlobalSkin.RulerMarkersOutlineColor; var roundV1 = Math.round(3 * dPR); var roundV2 = Math.round(6 * dPR); context.fillRect(__x + roundV1, this.m_nTop + indent + roundV1, roundV1, this.m_nBottom - this.m_nTop - roundV2); context.fillRect(__r - roundV2, this.m_nTop + indent + roundV1, roundV1, this.m_nBottom - this.m_nTop - roundV2); context.strokeRect(__x + roundV1, this.m_nTop + indent + roundV1, roundV1, this.m_nBottom - this.m_nTop - roundV2); context.strokeRect(__r - roundV2, this.m_nTop + indent + roundV1, roundV1, this.m_nBottom - this.m_nTop - roundV2); context.fillStyle = GlobalSkin.RulerDark; context.strokeStyle = GlobalSkin.RulerOutline; } _offsetX += (_array[i].W + _array[i].Space); } } } context.beginPath(); context.strokeStyle = GlobalSkin.RulerOutline; context.strokeRect(indent, this.m_nTop + indent, Math.max(intW - 1, 1), this.m_nBottom - this.m_nTop); context.beginPath(); context.moveTo(left_margin + indent, this.m_nTop + indent); context.lineTo(left_margin + indent, this.m_nBottom - indent); context.moveTo(right_margin + indent, this.m_nTop + indent); context.lineTo(right_margin + indent, this.m_nBottom - indent); context.stroke(); } this.CorrectTabs = function() { this.m_dMaxTab = 0; var _old_c = this.m_arrTabs.length; if (0 == _old_c) return; var _old = this.m_arrTabs; var _new = []; for (var i = 0; i < _old_c; i++) { for (var j = i + 1; j < _old_c; j++) { if (_old[j].pos < _old[i].pos) { var temp = _old[i]; _old[i] = _old[j]; _old[j] = temp; } } } var _new_len = 0; _new[_new_len++] = _old[0]; for (var i = 1; i < _old_c; i++) { if (_new[_new_len - 1].pos != _old[i].pos) _new[_new_len++] = _old[i]; } this.m_arrTabs = null; this.m_arrTabs = _new; this.m_dMaxTab = this.m_arrTabs[_new_len - 1].pos; } this.CalculateMargins = function() { if (this.CurrentObjectType == RULER_OBJECT_TYPE_TABLE) { this.TableMarginLeft = 0; this.TableMarginRight = 0; var markup = this.m_oTableMarkup; var margin_left = markup.X; var _col = markup.CurCol; for (var i = 0; i < _col; i++) margin_left += markup.Cols[i]; this.TableMarginLeft = margin_left + markup.Margins[_col].Left; this.TableMarginRight = margin_left + markup.Cols[_col] - markup.Margins[_col].Right; } else if (this.CurrentObjectType == RULER_OBJECT_TYPE_COLUMNS) { this.TableMarginLeft = 0; this.TableMarginRight = 0; var markup = this.m_oColumnMarkup; if (markup.EqualWidth) { var _w = ((markup.R - markup.X) - markup.Space * (markup.Num - 1)) / markup.Num; this.TableMarginLeft = markup.X + (_w + markup.Space) * markup.CurCol; this.TableMarginRight = this.TableMarginLeft + _w; } else { var margin_left = markup.X; var _col = markup.CurCol; for (var i = 0; i < _col; i++) margin_left += (markup.Cols[i].W + markup.Cols[i].Space); this.TableMarginLeft = margin_left; this.TableMarginRight = margin_left + markup.Cols[_col].W; var _x = markup.X; var _len = markup.Cols.length; for (var i = 0; i < _len; i++) { _x += markup.Cols[i].W; if (i != (_len - 1)) _x += markup.Cols[i].Space; } markup.R = _x; } } } this.OnMouseMove = function(left, top, e) { var word_control = this.m_oWordControl; AscCommon.check_MouseMoveEvent(e); this.SimpleChanges.CheckMove(); // теперь определяем позицию относительно самой линейки. Все в миллиметрах var hor_ruler = word_control.m_oTopRuler_horRuler; var dKoefPxToMM = 100 * g_dKoef_pix_to_mm / word_control.m_nZoomValue; var _x = global_mouseEvent.X - left - word_control.X - word_control.GetMainContentBounds().L * g_dKoef_mm_to_pix; if (!word_control.m_oApi.isRtlInterface) _x -= 5 * g_dKoef_mm_to_pix; _x *= dKoefPxToMM; var _y = (global_mouseEvent.Y - word_control.Y) * g_dKoef_pix_to_mm; var dKoef_mm_to_pix = g_dKoef_mm_to_pix * this.m_dZoom; var mm_1_4 = 10 / 4; var mm_1_8 = mm_1_4 / 2; var _margin_left = this.m_dMarginLeft; var _margin_right = this.m_dMarginRight; if (this.CurrentObjectType == RULER_OBJECT_TYPE_TABLE || this.CurrentObjectType == RULER_OBJECT_TYPE_COLUMNS) { _margin_left = this.TableMarginLeft; _margin_right = this.TableMarginRight; } var _presentations = false; if (word_control.EditorType === "presentations") _presentations = true; switch (this.DragType) { case AscWord.RULER_DRAG_TYPE.none: { var position = this.CheckMouseType(_x, _y); if ((1 == position) || (2 == position) || (8 == position) || (9 == position) || (10 == position)) word_control.m_oDrawingDocument.SetCursorType("w-resize"); else word_control.m_oDrawingDocument.SetCursorType("default"); break; } case AscWord.RULER_DRAG_TYPE.leftMargin: { var newVal = RulerCorrectPosition(this, _x, _margin_left); if (newVal < 0) newVal = 0; var max = this.m_dMarginRight - 20; if (0 < this.m_dIndentRight) max = (this.m_dMarginRight - this.m_dIndentRight - 20); if (newVal > max) newVal = max; var _max_ind = Math.max(this.m_dIndentLeft, this.m_dIndentLeftFirst); if ((newVal + _max_ind) > max) newVal = max - _max_ind; this.m_dMarginLeft = newVal; word_control.UpdateHorRulerBack(); var pos = left + this.m_dMarginLeft * dKoef_mm_to_pix; word_control.m_oOverlayApi.VertLine(pos); word_control.m_oDrawingDocument.SetCursorType("w-resize"); break; } case AscWord.RULER_DRAG_TYPE.rightMargin: { var newVal = RulerCorrectPosition(this, _x, _margin_left); var min = this.m_dMarginLeft; if ((this.m_dMarginLeft + this.m_dIndentLeft) > min) min = this.m_dMarginLeft + this.m_dIndentLeft; if ((this.m_dMarginLeft + this.m_dIndentLeftFirst) > min) min = this.m_dMarginLeft + this.m_dIndentLeftFirst; min += 20; if (newVal < min) newVal = min; if (newVal > this.m_oPage.width_mm) newVal = this.m_oPage.width_mm; if ((newVal - this.m_dIndentRight) < min) newVal = min + this.m_dIndentRight; this.m_dMarginRight = newVal; word_control.UpdateHorRulerBack(); var pos = left + this.m_dMarginRight * dKoef_mm_to_pix; word_control.m_oOverlayApi.VertLine(pos); word_control.m_oDrawingDocument.SetCursorType("w-resize"); break; } case AscWord.RULER_DRAG_TYPE.leftFirstInd: { let newVal = RulerCorrectPosition(this, _x, this.m_bRtl ? _margin_right : _margin_left); if (this.m_bRtl) { let max = this.m_oPage.width_mm; if (_presentations) max = _margin_right; else if (this.m_dIndentLeftFirst < this.m_dIndentLeft) max = this.m_oPage.width_mm - (this.m_dIndentLeft - this.m_dIndentLeftFirst); if (newVal > max) newVal = max; let min = _margin_left; if (this.m_dIndentRight > 0) min = _margin_left + this.m_dIndentRight; if (this.m_dIndentLeftFirst > this.m_dIndentLeft) min += this.m_dIndentLeftFirst - this.m_dIndentLeft; if (newVal < min + 20) newVal = Math.min(min + 20, _margin_right - this.m_dIndentLeft_old); let newIndent = _margin_right - newVal; this.m_dIndentLeftFirst = (this.m_dIndentLeftFirst - this.m_dIndentLeft) + newIndent; this.m_dIndentLeft = newIndent; } else { let min = 0; if (_presentations) min = _margin_left; else if (this.m_dIndentLeftFirst < this.m_dIndentLeft) min = this.m_dIndentLeft - this.m_dIndentLeftFirst; if (newVal < min) newVal = min; let max = _margin_right; if (0 < this.m_dIndentRight) max = _margin_right - this.m_dIndentRight; if (this.m_dIndentLeftFirst > this.m_dIndentLeft) max = max + (this.m_dIndentLeft - this.m_dIndentLeftFirst); if (newVal > (max - 20)) newVal = Math.max(max - 20, (this.m_dIndentLeft_old + _margin_left)); let newIndent = newVal - _margin_left; this.m_dIndentLeftFirst = (this.m_dIndentLeftFirst - this.m_dIndentLeft) + newIndent; this.m_dIndentLeft = newIndent; } let pos = left + newVal * dKoef_mm_to_pix; word_control.UpdateHorRulerBack(); word_control.m_oOverlayApi.VertLine(pos); break; } case AscWord.RULER_DRAG_TYPE.leftInd: { let newVal = RulerCorrectPosition(this, _x, this.m_bRtl ? _margin_right : _margin_left); if (newVal < 0) newVal = 0; if (this.m_bRtl) { if (newVal > (this.m_oPage.width_mm)) newVal = this.m_oPage.width_mm; let min = Math.max(_margin_left, _margin_left + this.m_dIndentRight) + 20; if (_presentations) { if (newVal > _margin_right) newVal = _margin_right; } if (newVal < min) newVal = Math.min(min, _margin_right - this.m_dIndentLeft_old); this.m_dIndentLeft = _margin_right - newVal; } else { let max = _margin_right - 20; if (0 < this.m_dIndentRight) max -= this.m_dIndentRight; if (_presentations) { if (newVal < _margin_left) newVal = _margin_left; } if (newVal > max) newVal = Math.max(max, _margin_left + this.m_dIndentLeft_old); this.m_dIndentLeft = newVal - _margin_left; } let pos = left + newVal * dKoef_mm_to_pix; word_control.UpdateHorRulerBack(); word_control.m_oOverlayApi.VertLine(pos); break; } case AscWord.RULER_DRAG_TYPE.firstInd: { let newVal = RulerCorrectPosition(this, _x, this.m_bRtl ? _margin_right : _margin_left); if (newVal < 0) newVal = 0; if (this.m_bRtl) { if (newVal > (this.m_oPage.width_mm)) newVal = this.m_oPage.width_mm; let min = 20 + Math.max(_margin_left, _margin_left + this.m_dIndentRight); if (_presentations) { if (newVal > _margin_right) newVal = _margin_right; } if (newVal < min) newVal = Math.min(min, _margin_right - this.m_dIndentLeftFirst_old); this.m_dIndentLeftFirst = _margin_right - newVal; } else { let max = _margin_right - 20; if (0 < this.m_dIndentRight) max -= this.m_dIndentRight; if (_presentations) { if (newVal < _margin_left) newVal = _margin_left; } if (newVal > max) newVal = Math.max(max, _margin_left + this.m_dIndentLeftFirst_old); this.m_dIndentLeftFirst = newVal - _margin_left; } let pos = left + newVal * dKoef_mm_to_pix; word_control.UpdateHorRulerBack(); word_control.m_oOverlayApi.VertLine(pos); break; } case AscWord.RULER_DRAG_TYPE.rightInd: { let newVal = RulerCorrectPosition(this, _x, this.m_bRtl ? _margin_right : _margin_left); if (newVal > (this.m_oPage.width_mm)) newVal = this.m_oPage.width_mm; if (newVal < 0) newVal = 0; if (this.m_bRtl) { let max = -20 + Math.min(_margin_right, _margin_right - this.m_dIndentLeft, _margin_right - this.m_dIndentLeftFirst); if (newVal > max) newVal = Math.max(max, _margin_left + this.m_dIndentRight_old); if (_presentations && newVal < _margin_left) newVal = _margin_left; this.m_dIndentRight = newVal - _margin_left; } else { let min = _margin_left; if ((_margin_left + this.m_dIndentLeft) > min) min = _margin_left + this.m_dIndentLeft; if ((_margin_left + this.m_dIndentLeftFirst) > min) min = _margin_left + this.m_dIndentLeftFirst; min += 20; if (newVal < min) newVal = Math.min(min, _margin_right - this.m_dIndentRight_old); if (_presentations) { if (newVal > _margin_right) newVal = _margin_right; } this.m_dIndentRight = _margin_right - newVal; } let pos = left + newVal * dKoef_mm_to_pix; word_control.UpdateHorRulerBack(); word_control.m_oOverlayApi.VertLine(pos); break; } case AscWord.RULER_DRAG_TYPE.tab: { let newVal = RulerCorrectPosition(this, _x, this.m_bRtl ? _margin_right : _margin_left); this.m_dCurrentTabNewPosition = this.m_bRtl ? _margin_right - newVal : newVal - _margin_left; if (_y <= 3 || _y > 5.6) { this.IsDrawingCurTab = false; word_control.OnUpdateOverlay(); } else { this.IsDrawingCurTab = true; let offset = this.m_bRtl ? _margin_right - this.m_dCurrentTabNewPosition : _margin_left + this.m_dCurrentTabNewPosition; let pos = left + offset * dKoef_mm_to_pix; word_control.m_oOverlayApi.VertLine(pos); } word_control.UpdateHorRulerBack(); break; } case AscWord.RULER_DRAG_TYPE.table: { var newVal = RulerCorrectPosition(this, _x, this.TableMarginLeftTrackStart); // сначала определим граничные условия var _min = 0; var _max = this.m_oPage.width_mm; var markup = this.m_oTableMarkup; var _left = 0; if (this.DragTablePos > 0) { var start = markup.X; for (var i = 1; i < this.DragTablePos; i++) start += markup.Cols[i - 1]; _left = start; start += markup.Margins[this.DragTablePos - 1].Left; start += markup.Margins[this.DragTablePos - 1].Right; _min = start; } if (newVal < _min) newVal = _min; if (newVal > _max) newVal = _max; if (0 == this.DragTablePos) { markup.X = newVal; } else { markup.Cols[this.DragTablePos - 1] = newVal - _left; } this.CalculateMargins(); word_control.UpdateHorRulerBack(); var pos = left + newVal * dKoef_mm_to_pix; word_control.m_oOverlayApi.VertLine(pos); break; } case AscWord.RULER_DRAG_TYPE.columnSize: { var newVal = RulerCorrectPosition(this, _x, this.TableMarginLeftTrackStart); // сначала определим граничные условия var markup = this.m_oColumnMarkup; if (markup.EqualWidth) { if (0 == this.DragTablePos) { var _min = 0; var _max = markup.R - markup.Num * 10 - (markup.Num - 1) * markup.Space; if (newVal < _min) newVal = _min; if (newVal > _max) newVal = _max; markup.X = newVal; } else if ((2 * markup.Num - 1) == this.DragTablePos) { var _min = markup.X + markup.Num * 10 + (markup.Num - 1) * markup.Space; var _max = this.m_oPage.width_mm; if (newVal < _min) newVal = _min; if (newVal > _max) newVal = _max; markup.R = newVal; } else { var bIsLeftSpace = ((this.DragTablePos & 1) == 1); var _spaceMax = (markup.R - markup.X - 10 * markup.Num) / (markup.Num - 1); var _col = ((this.DragTablePos + 1) >> 1); var _center = _col * (markup.R - markup.X + markup.Space) / markup.Num - markup.Space / 2; newVal -= markup.X; if (bIsLeftSpace) { var _min = _center - _spaceMax / 2; var _max = _center; if (newVal < _min) newVal = _min; if (newVal > _max) newVal = _max; markup.Space = Math.abs((newVal - _center) * 2); } else { var _min = _center; var _max = _center + _spaceMax / 2; if (newVal < _min) newVal = _min; if (newVal > _max) newVal = _max; markup.Space = Math.abs((newVal - _center) * 2); } newVal += markup.X; } } else { var bIsLeftSpace = ((this.DragTablePos & 1) == 1); var nSpaceNumber = ((this.DragTablePos + 1) >> 1); var _min = 0; var _max = this.m_oPage.width_mm; if (0 == nSpaceNumber) { _max = markup.X + markup.Cols[0].W - 10; if (newVal < _min) newVal = _min; if (newVal > _max) newVal = _max; var _delta = markup.X - newVal; markup.X -= _delta; markup.Cols[0].W += _delta; } else { var _offsetX = markup.X; for (var i = 0; i < nSpaceNumber; i++) { _min = _offsetX; _offsetX += markup.Cols[i].W; if (!bIsLeftSpace || i != (nSpaceNumber - 1)) { _min = _offsetX; _offsetX += markup.Cols[i].Space; } } if (bIsLeftSpace) { if (nSpaceNumber != markup.Num) _max = _min + markup.Cols[nSpaceNumber - 1].W + markup.Cols[nSpaceNumber - 1].Space; var _natMin = _min + 10; if (newVal < _natMin) newVal = _natMin; if (newVal > _max) newVal = _max; markup.Cols[nSpaceNumber - 1].W = newVal - _min; markup.Cols[nSpaceNumber - 1].Space = _max - newVal; if (nSpaceNumber == markup.Num) { markup.R = newVal; } } else { _max = _min + markup.Cols[nSpaceNumber - 1].Space + markup.Cols[nSpaceNumber].W; var _natMax = _max - 10; if (newVal < _min) newVal = _min; if (newVal > _natMax) newVal = _natMax; markup.Cols[nSpaceNumber - 1].Space = newVal - _min; markup.Cols[nSpaceNumber].W = _max - newVal; } } } this.CalculateMargins(); word_control.UpdateHorRulerBack(); var pos = left + newVal * dKoef_mm_to_pix; word_control.m_oOverlayApi.VertLine(pos); break; } case AscWord.RULER_DRAG_TYPE.columnPos: { var newVal = RulerCorrectPosition(this, _x, this.TableMarginLeftTrackStart); // сначала определим граничные условия var markup = this.m_oColumnMarkup; var _min = markup.X; for (var i = 0; i < this.DragTablePos; i++) { _min += (markup.Cols[i].W + markup.Cols[i].Space); } var _max = _min + markup.Cols[this.DragTablePos].W + markup.Cols[this.DragTablePos].Space; _max += markup.Cols[this.DragTablePos + 1].W; var _space = markup.Cols[this.DragTablePos].Space; var _natMin = _min + _space / 2 + 10; var _natMax = _max - _space / 2 - 10; if (newVal < _natMin) newVal = _natMin; if (newVal > _natMax) newVal = _natMax; var _delta = newVal - (_min + markup.Cols[this.DragTablePos].W + markup.Cols[this.DragTablePos].Space / 2); markup.Cols[this.DragTablePos].W += _delta; markup.Cols[this.DragTablePos + 1].W -= _delta; this.CalculateMargins(); word_control.UpdateHorRulerBack(); var pos = left + newVal * dKoef_mm_to_pix; word_control.m_oOverlayApi.VertLine(pos); break; } } } this.CheckMouseType = function(x, y, isMouseDown, isNegative) { // проверяем где находимся var _top = 1.8; var _bottom = 5.2; var _margin_left = this.m_dMarginLeft; var _margin_right = this.m_dMarginRight; if (this.CurrentObjectType == RULER_OBJECT_TYPE_TABLE || this.CurrentObjectType == RULER_OBJECT_TYPE_COLUMNS) { _margin_left = this.TableMarginLeft; _margin_right = this.TableMarginRight; } var posL = _margin_left; if ((_margin_left + this.m_dIndentLeft) > posL) posL = _margin_left + this.m_dIndentLeft; if ((_margin_left + this.m_dIndentLeftFirst) > posL) posL = _margin_left + this.m_dIndentLeftFirst; var posR = _margin_right; if (this.m_dIndentRight > 0) posR = _margin_right - this.m_dIndentRight; if (this.IsCanMoveAnyMarkers && posL < posR) { // tabs if (y >= 3 && y <= _bottom) { for (let i = 0, tabCount = this.m_arrTabs.length; i < tabCount; ++i) { var _pos = this.m_bRtl ? _margin_right - this.m_arrTabs[i].pos : _margin_left + this.m_arrTabs[i].pos; if ((x >= (_pos - 1)) && (x <= (_pos + 1))) { if (true === isMouseDown) this.m_lCurrentTab = i; return AscWord.RULER_DRAG_TYPE.tab; } } } // left indent var dCenterX = this.m_bRtl ? _margin_right - this.m_dIndentLeft : _margin_left + this.m_dIndentLeft; var var1 = dCenterX - 1; var var2 = 1.4; var var3 = 1.5; var var4 = dCenterX + 1; if ((x >= var1) && (x <= var4)) { if ((y >= _bottom) && (y < (_bottom + var2))) return AscWord.RULER_DRAG_TYPE.leftFirstInd; else if ((y > (_bottom - var3)) && (y < _bottom)) return AscWord.RULER_DRAG_TYPE.leftInd; } // right indent dCenterX = this.m_bRtl ? _margin_left + this.m_dIndentRight : _margin_right - this.m_dIndentRight; var1 = dCenterX - 1; var4 = dCenterX + 1; if ((x >= var1) && (x <= var4)) { if ((y > (_bottom - var3)) && (y < _bottom)) return AscWord.RULER_DRAG_TYPE.rightInd; } // first line indent dCenterX = this.m_bRtl ? _margin_right - this.m_dIndentLeftFirst : _margin_left + this.m_dIndentLeftFirst; var1 = dCenterX - 1; var4 = dCenterX + 1; if ((x >= var1) && (x <= var4)) { if ((y > (_top - 1)) && (y < (_top + 1.68))) { if (0 == this.m_dIndentLeftFirst && 0 == this.m_dIndentLeft && this.CurrentObjectType == RULER_OBJECT_TYPE_PARAGRAPH && this.IsCanMoveMargins) { if (y > (_top + 1)) return this.m_bRtl ? AscWord.RULER_DRAG_TYPE.rightMargin : AscWord.RULER_DRAG_TYPE.leftMargin; } return AscWord.RULER_DRAG_TYPE.firstInd; } } } var isColumnsInside = false; var isColumnsInside2 = false; var isTableInside = false; if (this.CurrentObjectType == RULER_OBJECT_TYPE_PARAGRAPH && this.IsCanMoveMargins) { if (y >= _top && y <= _bottom) { // внутри линейки if (Math.abs(x - this.m_dMarginLeft) < 1) { return AscWord.RULER_DRAG_TYPE.leftMargin; } else if (Math.abs(x - this.m_dMarginRight) < 1) { return AscWord.RULER_DRAG_TYPE.rightMargin; } if (isNegative) { if (x < this.m_dMarginLeft) return -AscWord.RULER_DRAG_TYPE.leftMargin; if (x > this.m_dMarginRight) return -AscWord.RULER_DRAG_TYPE.rightMargin; } } } else if (this.CurrentObjectType == RULER_OBJECT_TYPE_TABLE) { var nTI_x = 0; var nTI_r = 0; if (y >= _top && y <= _bottom) { var markup = this.m_oTableMarkup; var pos = markup.X; var _count = markup.Cols.length; for (var i = 0; i <= _count; i++) { if (Math.abs(x - pos) < 1) { this.DragTablePos = i; return AscWord.RULER_DRAG_TYPE.table; } if (i == _count) { nTI_r = pos; break; } if (i == 0) { nTI_x = pos; } pos += markup.Cols[i]; } } if (x > nTI_x && x < nTI_r) isTableInside = true; } else if (this.CurrentObjectType == RULER_OBJECT_TYPE_COLUMNS) { if (y >= _top && y <= _bottom) { var markup = this.m_oColumnMarkup; var nCI_x = markup.X; var nCI_r = nCI_x; if (markup.EqualWidth) { var _w = ((markup.R - markup.X) - markup.Space * (markup.Num - 1)) / markup.Num; var _x = markup.X; var _index = 0; for (var i = 0; i < markup.Num; i++) { if (0 == i) { if (Math.abs(x - _x) < 1) { this.DragTablePos = _index; return AscWord.RULER_DRAG_TYPE.columnSize; } } else { if (x < _x + 1 && x > _x - 2) { this.DragTablePos = _index; return AscWord.RULER_DRAG_TYPE.columnSize; } } ++_index; _x += _w; nCI_r = _x; if (i == markup.Num - 1) { if (Math.abs(x - _x) < 1) { this.DragTablePos = _index; return AscWord.RULER_DRAG_TYPE.columnSize; } } else { if (x < _x + 2 && x > _x - 1) { this.DragTablePos = _index; return AscWord.RULER_DRAG_TYPE.columnSize; } if (x > _x && x < (_x + markup.Space)) isColumnsInside = true; } ++_index; _x += markup.Space; } } else { var _x = markup.X; var _index = 0; for (var i = 0; i < markup.Cols.length; i++) { if (0 == i) { if (Math.abs(x - _x) < 1) { this.DragTablePos = _index; return AscWord.RULER_DRAG_TYPE.columnSize; } } else { if (x < _x + 1 && x > _x - 2) { this.DragTablePos = _index; return AscWord.RULER_DRAG_TYPE.columnSize; } } ++_index; _x += markup.Cols[i].W; nCI_r = _x; if (i == markup.Num - 1) { if (Math.abs(x - _x) < 1) { this.DragTablePos = _index; return AscWord.RULER_DRAG_TYPE.columnSize; } } else { if (x < _x + 2 && x > _x - 1) { this.DragTablePos = _index; return AscWord.RULER_DRAG_TYPE.columnSize; } } if (i != markup.Cols.length - 1) { if (Math.abs(x - (_x + markup.Cols[i].Space / 2)) < 1) { this.DragTablePos = i; return AscWord.RULER_DRAG_TYPE.columnPos; } if (x > _x && x < (_x + markup.Cols[i].Space)) isColumnsInside = true; } ++_index; _x += markup.Cols[i].Space; } } if (x > nCI_x && x < nCI_r) isColumnsInside2 = true; } } if (isNegative) { if (isColumnsInside) return -AscWord.RULER_DRAG_TYPE.columnSize; // если вникуда - то ВСЕГДА margins return -AscWord.RULER_DRAG_TYPE.leftMargin; if (isColumnsInside2) return 0; if ((y >= _top && y <= _bottom) && !isTableInside) { if (x < _margin_left) return -AscWord.RULER_DRAG_TYPE.leftMargin; if (x > _margin_right) return -AscWord.RULER_DRAG_TYPE.rightMargin; } } return AscWord.RULER_DRAG_TYPE.none; } this.OnMouseDown = function(left, top, e) { var word_control = this.m_oWordControl; if (true === word_control.m_oApi.isStartAddShape) { word_control.m_oApi.sync_EndAddShape(); word_control.m_oApi.sync_StartAddShapeCallback(false); } if (true === word_control.m_oApi.isInkDrawerOn()) { word_control.m_oApi.stopInkDrawer(); } AscCommon.check_MouseDownEvent(e, true); global_mouseEvent.LockMouse(); this.SimpleChanges.Reinit(); var dKoefPxToMM = 100 * g_dKoef_pix_to_mm / word_control.m_nZoomValue; var dKoef_mm_to_pix = g_dKoef_mm_to_pix * this.m_dZoom; var _x = global_mouseEvent.X - left - word_control.X - word_control.GetMainContentBounds().L * g_dKoef_mm_to_pix; if (!word_control.m_oApi.isRtlInterface) _x -= 5 * g_dKoef_mm_to_pix; _x *= dKoefPxToMM; var _y = (global_mouseEvent.Y - word_control.Y) * g_dKoef_pix_to_mm; this.DragType = this.CheckMouseType(_x, _y, true, true); if (this.DragType < 0) { this.DragTypeMouseDown = -this.DragType; this.DragType = AscWord.RULER_DRAG_TYPE.none; } else { this.DragTypeMouseDown = this.DragType; } if (global_mouseEvent.ClickCount > 1) { var eventType = ""; switch (this.DragTypeMouseDown) { case AscWord.RULER_DRAG_TYPE.leftMargin: case AscWord.RULER_DRAG_TYPE.rightMargin: { eventType = "margins"; break; } case AscWord.RULER_DRAG_TYPE.leftFirstInd: case AscWord.RULER_DRAG_TYPE.leftInd: case AscWord.RULER_DRAG_TYPE.firstInd: case AscWord.RULER_DRAG_TYPE.rightInd: { eventType = "indents"; break; } case AscWord.RULER_DRAG_TYPE.tab: { eventType = "tabs"; break; } case AscWord.RULER_DRAG_TYPE.table: { eventType = "tables"; break; } case AscWord.RULER_DRAG_TYPE.columnSize: case AscWord.RULER_DRAG_TYPE.columnPos: { eventType = "columns"; break; } } if (eventType != "") { word_control.m_oApi.sendEvent("asc_onRulerDblClick", eventType); this.DragType = AscWord.RULER_DRAG_TYPE.none; this.OnMouseUp(left, top, e); return; } } var _margin_left = this.m_dMarginLeft; var _margin_right = this.m_dMarginRight; if (this.CurrentObjectType == RULER_OBJECT_TYPE_TABLE || this.CurrentObjectType == RULER_OBJECT_TYPE_COLUMNS) { _margin_left = this.TableMarginLeft; _margin_right = this.TableMarginRight; } this.m_bIsMouseDown = true; switch (this.DragType) { case AscWord.RULER_DRAG_TYPE.leftMargin: { var pos = left + _margin_left * dKoef_mm_to_pix; word_control.m_oOverlayApi.VertLine(pos); break; } case AscWord.RULER_DRAG_TYPE.rightMargin: { var pos = left + _margin_right * dKoef_mm_to_pix; word_control.m_oOverlayApi.VertLine(pos); break; } case AscWord.RULER_DRAG_TYPE.leftFirstInd: { let offset = this.m_bRtl ? (_margin_right - this.m_dIndentLeft) : (_margin_left + this.m_dIndentLeft); let pos = left + offset * dKoef_mm_to_pix; word_control.m_oOverlayApi.VertLine(pos); this.m_dIndentLeft_old = this.m_dIndentLeft; this.m_dIndentLeftFirst_old = this.m_dIndentLeftFirst; break; } case AscWord.RULER_DRAG_TYPE.leftInd: { let offset = this.m_bRtl ? (_margin_right - this.m_dIndentLeft) : (_margin_left + this.m_dIndentLeft); let pos = left + offset * dKoef_mm_to_pix; word_control.m_oOverlayApi.VertLine(pos); this.m_dIndentLeft_old = this.m_dIndentLeft; break; } case AscWord.RULER_DRAG_TYPE.firstInd: { let offset = this.m_bRtl ? (_margin_right - this.m_dIndentLeftFirst) : (_margin_left + this.m_dIndentLeftFirst); let pos = left + offset * dKoef_mm_to_pix; word_control.m_oOverlayApi.VertLine(pos); this.m_dIndentLeftFirst_old = this.m_dIndentLeftFirst; break; } case AscWord.RULER_DRAG_TYPE.rightInd: { let offset = this.m_bRtl ? (_margin_left + this.m_dIndentRight) : (_margin_right - this.m_dIndentRight); let pos = left + offset * dKoef_mm_to_pix; word_control.m_oOverlayApi.VertLine(pos); this.m_dIndentRight_old = this.m_dIndentRight; break; } case AscWord.RULER_DRAG_TYPE.tab: { let offset = this.m_bRtl ? (_margin_right - this.m_arrTabs[this.m_lCurrentTab].pos) : (_margin_left + this.m_arrTabs[this.m_lCurrentTab].pos); let pos = left + offset * dKoef_mm_to_pix; word_control.m_oOverlayApi.VertLine(pos); this.m_dCurrentTabNewPosition = this.m_arrTabs[this.m_lCurrentTab].pos; break; } case AscWord.RULER_DRAG_TYPE.table: { var markup = this.m_oTableMarkup; var pos = markup.X; var _count = markup.Cols.length; for (var i = 0; i < this.DragTablePos; i++) { pos += markup.Cols[i]; } pos = left + pos * dKoef_mm_to_pix; word_control.m_oOverlayApi.VertLine(pos); this.TableMarginLeftTrackStart = this.TableMarginLeft; break; } case AscWord.RULER_DRAG_TYPE.columnSize: { var markup = this.m_oColumnMarkup; var pos = 0; if (markup.EqualWidth) { var _w = ((markup.R - markup.X) - markup.Space * (markup.Num - 1)) / markup.Num; var _x = markup.X + (this.DragTablePos >> 1) * (_w + markup.Space); if (this.DragTablePos & 1 == 1) _x += _w; pos = _x; } else { var _x = markup.X; var _index = 0; for (var i = 0; i < markup.Cols.length && _index < this.DragTablePos; i++) { if (_index == this.DragTablePos) break; ++_index; _x += markup.Cols[i].W; if (_index == this.DragTablePos) break; ++_index; _x += markup.Cols[i].Space; } pos = _x; } pos = left + pos * dKoef_mm_to_pix; word_control.m_oOverlayApi.VertLine(pos); this.TableMarginLeftTrackStart = markup.X; break; } case AscWord.RULER_DRAG_TYPE.columnPos: { var markup = this.m_oColumnMarkup; var pos = markup.X; var _index = 0; for (var i = 0; i < markup.Cols.length && i < this.DragTablePos; i++) { if (_index == this.DragTablePos) break; pos += markup.Cols[i].W; pos += markup.Cols[i].Space; } if (this.DragTablePos < markup.Cols.length) { pos += markup.Cols[this.DragTablePos].W; pos += markup.Cols[this.DragTablePos].Space / 2; } pos = left + pos * dKoef_mm_to_pix; word_control.m_oOverlayApi.VertLine(pos); this.TableMarginLeftTrackStart = markup.X; break; } } if (AscWord.RULER_DRAG_TYPE.none === this.DragType) { let posT = 3; let posB = 5.2; let posL = this.m_bRtl ? _margin_left + this.m_dIndentRight : _margin_left + this.m_dIndentLeft; let posR = this.m_bRtl ? _margin_right - this.m_dIndentRight : _margin_right - this.m_dIndentLeft; if (posT <= _y && _y <= posB && posL <= _x && _x <= posR) { let newVal = RulerCorrectPosition(this, _x, this.m_bRtl ? _margin_right : _margin_left); let tabPos = this.m_bRtl ? _margin_right - newVal : newVal - _margin_left; let tabType = word_control.m_nTabsType; if (this.m_bRtl) { if (tab_Left === tabType) tabType = tab_Right; else if (tab_Right === tabType) tabType = tab_Left; } this.m_arrTabs[this.m_arrTabs.length] = new CTab(tabPos, tabType); word_control.UpdateHorRuler(); this.m_lCurrentTab = this.m_arrTabs.length - 1; this.DragType = AscWord.RULER_DRAG_TYPE.tab; this.m_dCurrentTabNewPosition = tabPos; let pos = left + newVal * dKoef_mm_to_pix; word_control.m_oOverlayApi.VertLine(pos); } } word_control.m_oDrawingDocument.LockCursorTypeCur(); } this.OnMouseUp = function(left, top, e) { var word_control = this.m_oWordControl; this.m_oWordControl.OnUpdateOverlay(); var lockedElement = AscCommon.check_MouseUpEvent(e); this.m_dIndentLeft_old = -10000; this.m_dIndentLeftFirst_old = -10000; this.m_dIndentRight_old = -10000; if (AscWord.RULER_DRAG_TYPE.tab !== this.DragType) { word_control.UpdateHorRuler(); //word_control.m_oOverlayApi.UnShow(); } var _margin_left = this.m_dMarginLeft; var _margin_right = this.m_dMarginRight; if (this.CurrentObjectType == RULER_OBJECT_TYPE_TABLE || this.CurrentObjectType == RULER_OBJECT_TYPE_COLUMNS) { _margin_left = this.TableMarginLeft; _margin_right = this.TableMarginRight; } switch (this.DragType) { case AscWord.RULER_DRAG_TYPE.leftMargin: case AscWord.RULER_DRAG_TYPE.rightMargin: { if (!this.SimpleChanges.IsSimple) this.SetMarginProperties(); break; } case AscWord.RULER_DRAG_TYPE.leftFirstInd: case AscWord.RULER_DRAG_TYPE.leftInd: case AscWord.RULER_DRAG_TYPE.firstInd: case AscWord.RULER_DRAG_TYPE.rightInd: { if (!this.SimpleChanges.IsSimple) this.SetPrProperties(); else word_control.OnUpdateOverlay(); break; } case AscWord.RULER_DRAG_TYPE.tab: { // смотрим, сохраняем ли таб var _y = (global_mouseEvent.Y - word_control.Y) * g_dKoef_pix_to_mm; if (_y <= 3 || _y > 5.6 || this.m_dCurrentTabNewPosition < this.m_dIndentLeft || this.m_dCurrentTabNewPosition > _margin_right - _margin_left - this.m_dIndentRight) { if (-1 !== this.m_lCurrentTab) this.m_arrTabs.splice(this.m_lCurrentTab, 1); } else { if (this.m_lCurrentTab < this.m_arrTabs.length) this.m_arrTabs[this.m_lCurrentTab].pos = this.m_dCurrentTabNewPosition; } this.m_lCurrentTab = -1; this.CorrectTabs(); this.m_oWordControl.UpdateHorRuler(); this.SetTabsProperties(); break; } case AscWord.RULER_DRAG_TYPE.table: { if (!this.SimpleChanges.IsSimple) this.SetTableProperties(); this.DragTablePos = -1; break; } case AscWord.RULER_DRAG_TYPE.columnSize: case AscWord.RULER_DRAG_TYPE.columnPos: { if (!this.SimpleChanges.IsSimple) this.SetColumnsProperties(); this.DragTablePos = -1; break; } } if (AscWord.RULER_DRAG_TYPE.tab === this.DragType) { word_control.UpdateHorRuler(); //word_control.m_oOverlayApi.UnShow(); } this.IsDrawingCurTab = true; this.DragType = 0; this.m_bIsMouseDown = false; this.m_oWordControl.m_oDrawingDocument.UnlockCursorType(); this.SimpleChanges.Clear(); } this.OnMouseUpExternal = function() { var word_control = this.m_oWordControl; this.m_oWordControl.OnUpdateOverlay(); this.m_dIndentLeft_old = -10000; this.m_dIndentLeftFirst_old = -10000; this.m_dIndentRight_old = -10000; if (AscWord.RULER_DRAG_TYPE.tab !== this.DragType) { word_control.UpdateHorRuler(); //word_control.m_oOverlayApi.UnShow(); } var _margin_left = this.m_dMarginLeft; var _margin_right = this.m_dMarginRight; if (this.CurrentObjectType == RULER_OBJECT_TYPE_TABLE || this.CurrentObjectType == RULER_OBJECT_TYPE_COLUMNS) { _margin_left = this.TableMarginLeft; _margin_right = this.TableMarginRight; } switch (this.DragType) { case AscWord.RULER_DRAG_TYPE.leftMargin: case AscWord.RULER_DRAG_TYPE.rightMargin: { if (!this.SimpleChanges.IsSimple) this.SetMarginProperties(); break; } case AscWord.RULER_DRAG_TYPE.leftFirstInd: case AscWord.RULER_DRAG_TYPE.leftInd: case AscWord.RULER_DRAG_TYPE.firstInd: case AscWord.RULER_DRAG_TYPE.rightInd: { if (!this.SimpleChanges.IsSimple) this.SetPrProperties(); break; } case AscWord.RULER_DRAG_TYPE.tab: { // смотрим, сохраняем ли таб var _y = (global_mouseEvent.Y - word_control.Y) * g_dKoef_pix_to_mm; if (_y <= 3 || _y > 5.6 || this.m_dCurrentTabNewPosition < this.m_dIndentLeft || this.m_dCurrentTabNewPosition > _margin_right - _margin_left - this.m_dIndentRight) { if (-1 !== this.m_lCurrentTab) this.m_arrTabs.splice(this.m_lCurrentTab, 1); } else { if (this.m_lCurrentTab < this.m_arrTabs.length) this.m_arrTabs[this.m_lCurrentTab].pos = this.m_dCurrentTabNewPosition; } this.m_lCurrentTab = -1; this.CorrectTabs(); this.m_oWordControl.UpdateHorRuler(); this.SetTabsProperties(); break; } case AscWord.RULER_DRAG_TYPE.table: { if (!this.SimpleChanges.IsSimple) this.SetTableProperties(); this.DragTablePos = -1; break; } case AscWord.RULER_DRAG_TYPE.columnSize: case AscWord.RULER_DRAG_TYPE.columnPos: { if (!this.SimpleChanges.IsSimple) this.SetColumnsProperties(); this.DragTablePos = -1; break; } } if (AscWord.RULER_DRAG_TYPE.tab === this.DragType) { word_control.UpdateHorRuler(); //word_control.m_oOverlayApi.UnShow(); } this.IsDrawingCurTab = true; this.DragType = 0; this.m_bIsMouseDown = false; this.m_oWordControl.m_oDrawingDocument.UnlockCursorType(); this.SimpleChanges.Clear(); } this.SetTabsProperties = function() { // потом заменить на объекты CTab (когда Илюха реализует не только левые табы) var _arr = new CParaTabs(); var _c = this.m_arrTabs.length; for (var i = 0; i < _c; i++) { if (this.m_arrTabs[i].type == tab_Left || this.m_arrTabs[i].type == tab_Right || this.m_arrTabs[i].type == tab_Center) _arr.Add(new CParaTab(this.m_arrTabs[i].type, this.m_arrTabs[i].pos, this.m_arrTabs[i].leader)); } if (false === this.m_oWordControl.m_oLogicDocument.Document_Is_SelectionLocked(AscCommon.changestype_Paragraph_Properties)) { this.m_oWordControl.m_oLogicDocument.StartAction(AscDFH.historydescription_Document_SetParagraphTabs); this.m_oWordControl.m_oLogicDocument.SetParagraphTabs(_arr); this.m_oWordControl.m_oLogicDocument.FinalizeAction(); } this.m_oWordControl.m_oLogicDocument.UpdateSelection(); this.m_oWordControl.m_oLogicDocument.UpdateInterface(); } this.SetPrProperties = function(isTemporary) { let left = this.m_dIndentLeft; let right = this.m_dIndentRight; let firstLine = this.m_dIndentLeftFirst - this.m_dIndentLeft; let logicDocument = this.m_oWordControl.m_oLogicDocument; if (logicDocument.IsSelectionLocked(AscCommon.changestype_Paragraph_Properties)) { logicDocument.UpdateSelection(); logicDocument.UpdateInterface(); return; } isTemporary = isTemporary && logicDocument.IsDocumentEditor(); if (isTemporary) logicDocument.TurnOff_InterfaceEvents(); logicDocument.StartAction(AscDFH.historydescription_Document_SetParagraphIndentFromRulers); logicDocument.SetParagraphIndent({ Left : left, Right : right, FirstLine : firstLine }); logicDocument.UpdateInterface(); logicDocument.Recalculate(); logicDocument.FinalizeAction(); if (isTemporary) { AscCommon.History.SetLastPointTemporary(); logicDocument.TurnOn_InterfaceEvents(); } } this.SetMarginProperties = function() { if ( false === this.m_oWordControl.m_oLogicDocument.Document_Is_SelectionLocked(AscCommon.changestype_Document_SectPr) ) { this.m_oWordControl.m_oLogicDocument.StartAction(AscDFH.historydescription_Document_SetDocumentMargin_Hor); this.m_oWordControl.m_oLogicDocument.SetDocumentMargin( { Left : this.m_dMarginLeft, Right : this.m_dMarginRight }, true); this.m_oWordControl.m_oLogicDocument.FinalizeAction(); } this.m_oWordControl.m_oLogicDocument.UpdateSelection(); this.m_oWordControl.m_oLogicDocument.UpdateInterface(); } this.SetTableProperties = function() { if ( false === this.m_oWordControl.m_oLogicDocument.Document_Is_SelectionLocked(AscCommon.changestype_Table_Properties) ) { this.m_oWordControl.m_oLogicDocument.StartAction(AscDFH.historydescription_Document_SetTableMarkup_Hor); this.m_oTableMarkup.CorrectTo(); this.m_oTableMarkup.Table.Update_TableMarkupFromRuler(this.m_oTableMarkup, true, this.DragTablePos); if (this.m_oTableMarkup) this.m_oTableMarkup.CorrectFrom(); this.m_oWordControl.m_oLogicDocument.UpdateRulers(); this.m_oWordControl.m_oLogicDocument.FinalizeAction(); } this.m_oWordControl.m_oLogicDocument.UpdateSelection(); this.m_oWordControl.m_oLogicDocument.UpdateInterface(); } this.SetColumnsProperties = function() { this.m_oWordControl.m_oLogicDocument.Update_ColumnsMarkupFromRuler(this.m_oColumnMarkup); } this.BlitToMain = function(left, top, htmlElement) { var dPR = AscCommon.AscBrowser.retinaPixelRatio; left = Math.round(dPR * left); var _margin_left = this.m_dMarginLeft; var _margin_right = this.m_dMarginRight; if (this.CurrentObjectType == RULER_OBJECT_TYPE_TABLE || this.CurrentObjectType == RULER_OBJECT_TYPE_COLUMNS) { _margin_left = this.TableMarginLeft; _margin_right = this.TableMarginRight; } var checker = this.RepaintChecker; if (!checker.BlitAttack && left == checker.BlitLeft && !this.m_bIsMouseDown) { if (checker.BlitIndentLeft == this.m_dIndentLeft && checker.BlitIndentLeftFirst == this.m_dIndentLeftFirst && checker.BlitIndentRight == this.m_dIndentRight && checker.BlitRtl === this.m_bRtl && checker.BlitDefaultTab == this.m_dDefaultTab && _margin_left == checker.BlitMarginLeftInd && _margin_right == checker.BlitMarginRightInd) { // осталось проверить только табы кастомные var _count1 = 0; if (null != checker.BlitTabs) _count1 = checker.BlitTabs.length; var _count2 = this.m_arrTabs.length; if (_count1 == _count2) { var bIsBreak = false; for (var ii = 0; ii < _count1; ii++) { if ((checker.BlitTabs[ii].type != this.m_arrTabs[ii].type) || (checker.BlitTabs[ii].pos != this.m_arrTabs[ii].pos)) { bIsBreak = true; break; } } if (false === bIsBreak) return; } } } checker.BlitAttack = false; htmlElement.width = htmlElement.width; var context = htmlElement.getContext('2d'); context.setTransform(1, 0, 0, 1, 0, 0); if (null != this.m_oCanvas) { checker.BlitLeft = left; checker.BlitRtl = this.m_bRtl; checker.BlitIndentLeft = this.m_dIndentLeft; checker.BlitIndentLeftFirst = this.m_dIndentLeftFirst; checker.BlitIndentRight = this.m_dIndentRight; checker.BlitDefaultTab = this.m_dDefaultTab; checker.BlitTabs = null; if (0 != this.m_arrTabs.length) { checker.BlitTabs = []; var _len = this.m_arrTabs.length; for (var ii = 0; ii < _len; ii++) { checker.BlitTabs[ii] = { type: this.m_arrTabs[ii].type, pos: this.m_arrTabs[ii].pos }; } } var roundDPR = Math.round(dPR); var indent = 0.5 * roundDPR; //context.drawImage(this.m_oCanvas, left - 5, 0, this.m_oCanvas.width, this.m_oCanvas.height, // 0, 0, this.m_oCanvas.width, this.m_oCanvas.height); context.drawImage(this.m_oCanvas, 5 * roundDPR, 0, this.m_oCanvas.width - 10 * roundDPR, this.m_oCanvas.height, left, 0, this.m_oCanvas.width - 10 * roundDPR, this.m_oCanvas.height); if (!this.IsDrawAnyMarkers) return; var dKoef_mm_to_pix = g_dKoef_mm_to_pix * this.m_dZoom * dPR; var dCenterX = 0; var var2 = 0; var var3 = 0; // не менять!!! var2 = 5 * dPR;//(1.4 * g_dKoef_mm_to_pix) >> 0; var3 = 3 * dPR;//(1 * g_dKoef_mm_to_pix) >> 0; checker.BlitMarginLeftInd = _margin_left; checker.BlitMarginRightInd = _margin_right; var _1mm_to_pix = g_dKoef_mm_to_pix * dPR; let top = this.m_nTop; let bottom = this.m_nBottom; let isRtl = this.m_bRtl; function blitLeftInd(ind, isRtl) { let offset = isRtl ? (_margin_right - ind) : (_margin_left + ind); let dCenterX = left + offset * dKoef_mm_to_pix; let var1 = parseInt(dCenterX - _1mm_to_pix) - indent + Math.round(dPR) - 1; let var4 = parseInt(dCenterX + _1mm_to_pix) + indent + Math.round(dPR) - 1; if (0 !== ((var1 - var4 + Math.round(dPR)) & 1)) var4 += 1; context.beginPath(); context.lineWidth = Math.round(dPR); context.moveTo(var1, bottom + indent); context.lineTo(var4, bottom + indent); context.lineTo(var4, bottom + indent + Math.round(var2)); context.lineTo(var1, bottom + indent + Math.round(var2)); context.lineTo(var1, bottom + indent); context.lineTo(var1, bottom + indent - Math.round(var3)); context.lineTo((var1 + var4) / 2, bottom - Math.round(var2 * 1.2)); context.lineTo(var4, bottom + indent - Math.round(var3)); context.lineTo(var4, bottom + indent); context.fill(); context.stroke(); } function blitFirstInd(ind, isRtl) { let offset = isRtl ? (_margin_right - ind) : (_margin_left + ind); dCenterX = left + offset * dKoef_mm_to_pix; let var1 = parseInt(dCenterX - _1mm_to_pix) - indent + Math.round(dPR) - 1; let var4 = parseInt(dCenterX + _1mm_to_pix) + indent + Math.round(dPR) - 1; if (0 !== ((var1 - var4 + Math.round(dPR)) & 1)) var4 += 1; // first line indent context.beginPath(); context.lineWidth = Math.round(dPR); context.moveTo(var1, top + indent); context.lineTo(var1, top + indent - Math.round(var3)); context.lineTo(var4, top + indent - Math.round(var3)); context.lineTo(var4, top + indent); context.lineTo((var1 + var4) / 2, top + Math.round(var2 * 1.2)); context.closePath(); context.fill(); context.stroke(); } function blitRightInd(ind, isRtl) { let offset = isRtl ? (_margin_left + ind) : (_margin_right - ind); dCenterX = left + offset * dKoef_mm_to_pix; let var1 = parseInt(dCenterX - _1mm_to_pix) - indent + Math.round(dPR) - 1; let var4 = parseInt(dCenterX + _1mm_to_pix) + indent + Math.round(dPR) - 1; if (0 !== ((var1 - var4 + Math.round(dPR)) & 1)) var4 += 1; context.beginPath(); context.lineWidth = Math.round(dPR); context.moveTo(var1, bottom + indent); context.lineTo(var4, bottom + indent); context.lineTo(var4, bottom + indent - Math.round(var3)); context.lineTo((var1 + var4) / 2, bottom - Math.round(var2 * 1.2)); context.lineTo(var1, bottom + indent - Math.round(var3)); context.closePath(); context.fill(); context.stroke(); } function blitLeftTab(x, y) { context.beginPath(); context.moveTo(x, y); context.lineTo(x, y + Math.round(5 * dPR)); context.lineTo(x + Math.round(5 * dPR), y + Math.round(5 * dPR)); context.stroke(); } function blitRightTab(x, y) { context.beginPath(); context.moveTo(x, y); context.lineTo(x, y + Math.round(5 * dPR)); context.lineTo(x - Math.round(5 * dPR), y + Math.round(5 * dPR)); context.stroke(); } function blitCenterTab(x, y) { context.beginPath(); context.moveTo(x, y); context.lineTo(x, y + Math.round(5 * dPR)); context.moveTo(x - Math.round(5 * dPR), y + Math.round(5 * dPR)); context.lineTo(x + Math.round(5 * dPR), y + Math.round(5 * dPR)); context.stroke(); } function blitTab(tabPos, tabType) { let x = parseInt((isRtl ? (_margin_right - tabPos) : (_margin_left + tabPos)) * dKoef_mm_to_pix) + left; let y = bottom - 5 * dPR; let lineW = context.lineWidth; context.lineWidth = 2 * roundDPR; if (tab_Left === tabType) { if (isRtl) blitRightTab(x, y); else blitLeftTab(x, y); } else if (tab_Right === tabType) { if (isRtl) blitLeftTab(x, y); else blitRightTab(x, y); } else if (tab_Center === tab_Center) { blitCenterTab(x, y); } context.lineWidth = lineW; } // old position -------------------------------------- context.strokeStyle = GlobalSkin.RulerMarkersOutlineColorOld; context.fillStyle = GlobalSkin.RulerMarkersFillColorOld; if (-10000 !== this.m_dIndentLeft_old && this.m_dIndentLeft_old !== this.m_dIndentLeft) blitLeftInd(this.m_dIndentLeft_old, this.m_bRtl); if (-10000 !== this.m_dIndentLeftFirst_old && this.m_dIndentLeftFirst_old !== this.m_dIndentLeftFirst) blitFirstInd(this.m_dIndentLeftFirst_old, this.m_bRtl); if (-10000 !== this.m_dIndentRight_old && this.m_dIndentRight_old !== this.m_dIndentRight) blitRightInd(this.m_dIndentRight_old, this.m_bRtl); context.strokeStyle = GlobalSkin.RulerTabsColorOld; if (-1 !== this.m_lCurrentTab && this.m_lCurrentTab < this.m_arrTabs.length) { var _tab = this.m_arrTabs[this.m_lCurrentTab]; blitTab(_tab.pos, _tab.type); } // --------------------------------------------------- // рисуем инденты, только если они корректны var posL = _margin_left; if ((_margin_left + this.m_dIndentLeft) > posL) posL = _margin_left + this.m_dIndentLeft; if ((_margin_left + this.m_dIndentLeftFirst) > posL) posL = _margin_left + this.m_dIndentLeftFirst; var posR = _margin_right; if (this.m_dIndentRight > 0) posR = _margin_right - this.m_dIndentRight; if (posL < posR) { context.strokeStyle = GlobalSkin.RulerMarkersOutlineColor; context.fillStyle = GlobalSkin.RulerMarkersFillColor; blitLeftInd(this.m_dIndentLeft, this.m_bRtl); blitRightInd(this.m_dIndentRight, this.m_bRtl) blitFirstInd(this.m_dIndentLeftFirst, this.m_bRtl); } // теперь рисуем табы ---------------------------------------- // default var position_default_tab = this.m_dDefaultTab; let _positon_y = this.m_nBottom + Math.round(1.5 * dPR); var _min_default_value = Math.max(0, this.m_dMaxTab); if (this.m_dDefaultTab > 0.01) { if (this.m_bRtl) { while (_margin_right - position_default_tab > this.m_dMarginLeft) { if (position_default_tab < _min_default_value) { position_default_tab += this.m_dDefaultTab; continue; } let _x = parseInt((_margin_right - position_default_tab) * dKoef_mm_to_pix) + left + indent; context.beginPath(); context.moveTo(_x, _positon_y); context.lineTo(_x, _positon_y + Math.round(3 * dPR)); context.stroke(); position_default_tab += this.m_dDefaultTab; } } else { while (_margin_left + position_default_tab < this.m_dMarginRight) { if (position_default_tab < _min_default_value) { position_default_tab += this.m_dDefaultTab; continue; } let _x = parseInt((_margin_left + position_default_tab) * dKoef_mm_to_pix) + left + indent; context.beginPath(); context.moveTo(_x, _positon_y); context.lineTo(_x, _positon_y + Math.round(3 * dPR)); context.stroke(); position_default_tab += this.m_dDefaultTab; } } } // custom tabs context.strokeStyle = GlobalSkin.RulerTabsColor; for (let i = 0, tabCount = this.m_arrTabs.length; i < tabCount; ++i) { let tab = this.m_arrTabs[i]; let tabPos = tab.pos; if (i === this.m_lCurrentTab) { if (!this.IsDrawingCurTab) continue; // рисуем вместо него - позицию нового tabPos = this.m_dCurrentTabNewPosition; } else if (tab.pos < this.m_dIndentLeft) { continue; } blitTab(tabPos, tab.type); } // ----------------------------------------------------------- } } this.UpdateParaInd = function(paraInd, isRtl) { if (!paraInd) return 0; let left = undefined !== paraInd.Left ? paraInd.Left : 0; let right = undefined !== paraInd.Right ? paraInd.Right : 0; let firstLine = undefined !== paraInd.FirstLine ? left + paraInd.FirstLine : 0; let update = 0; if (Math.abs(this.m_dIndentLeft - left) > AscWord.EPSILON) { this.m_dIndentLeft = left; update |= 1; } if (Math.abs(this.m_dIndentLeftFirst - firstLine) > AscWord.EPSILON) { this.m_dIndentLeftFirst = firstLine; update |= 1; } if (Math.abs(this.m_dIndentRight - right) > AscWord.EPSILON) { this.m_dIndentRight = right; update |= 1; } if (this.m_bRtl !== isRtl) { this.m_bRtl = isRtl; update |= 1; update |= 2; } return update; }; } function CVerRuler() { this.m_oPage = null; this.m_nLeft = 0; // значения в пикселах - смещение до самой линейки this.m_nRight = 0; // значения в пикселах - смещение до самой линейки // (т.е. ширина линейки в пикселах = (this.m_nRight - this.m_nLeft)) this.m_dMarginTop = 20; this.m_dMarginBottom = 250; this.m_oCanvas = null; this.m_dZoom = 1; this.DragType = 0; // 0 - none // 1 - top margin, 2 - bottom margin // 3 - header_top, 4 - header_bottom // 5 - table rows // отдельные настройки для текущего объекта линейки this.CurrentObjectType = RULER_OBJECT_TYPE_PARAGRAPH; this.m_oTableMarkup = null; this.header_top = 0; this.header_bottom = 0; this.DragTablePos = -1; this.RepaintChecker = new CVerRulerRepaintChecker(); // presentations addons this.IsCanMoveMargins = true; this.m_oWordControl = null; this.SimpleChanges = new RulerCheckSimpleChanges(); this.Units = c_oAscDocumentUnits.Millimeter; this.CheckCanvas = function() { this.m_dZoom = this.m_oWordControl.m_nZoomValue / 100; var dPR = AscCommon.AscBrowser.retinaPixelRatio; var dKoef_mm_to_pix = g_dKoef_mm_to_pix * this.m_dZoom * dPR; var heightNew = dKoef_mm_to_pix * this.m_oPage.height_mm; var _height = Math.round(10 * dPR) + heightNew; if (dPR > 1) _height += Math.round(dPR); var _width = 5 * g_dKoef_mm_to_pix * dPR; var intW = _width >> 0; var intH = _height >> 0; if (null == this.m_oCanvas) { this.m_oCanvas = document.createElement('canvas'); this.m_oCanvas.width = intW; this.m_oCanvas.height = intH; } else { var oldW = this.m_oCanvas.width; var oldH = this.m_oCanvas.height; if ((oldW != intW) || (oldH != intH)) { delete this.m_oCanvas; this.m_oCanvas = document.createElement('canvas'); this.m_oCanvas.width = intW; this.m_oCanvas.height = intH; } } return heightNew; } this.CreateBackground = function(cachedPage, isattack) { if (window["NATIVE_EDITOR_ENJINE"]) return; if (null == cachedPage || undefined == cachedPage) return; this.m_oPage = cachedPage; var height = this.CheckCanvas(); if (0 == this.DragType) { this.m_dMarginTop = cachedPage.margin_top; this.m_dMarginBottom = cachedPage.margin_bottom; } // check old state var checker = this.RepaintChecker; var markup = this.m_oTableMarkup; if (isattack !== true && this.CurrentObjectType == checker.Type && height == checker.Height) { if (this.CurrentObjectType == RULER_OBJECT_TYPE_PARAGRAPH) { if (this.m_dMarginTop == checker.MarginTop && this.m_dMarginBottom == checker.MarginBottom) return; } else if (this.CurrentObjectType == RULER_OBJECT_TYPE_HEADER || this.CurrentObjectType == RULER_OBJECT_TYPE_FOOTER) { if (this.header_top == checker.HeaderTop && this.header_bottom == checker.HeaderBottom) return; } else if (this.CurrentObjectType == RULER_OBJECT_TYPE_TABLE) { var oldcount = checker.rowsY.length; var newcount = markup.Rows.length; if (oldcount == newcount) { var arr1 = checker.rowsY; var arr2 = checker.rowsH; var rows = markup.Rows; var _break = false; for (var i = 0; i < oldcount; i++) { if ((arr1[i] != rows[i].Y) || (arr2[i] != rows[i].H)) { _break = true; break; } } if (!_break) return; } } } //console.log("vertical"); checker.Height = height; checker.Type = this.CurrentObjectType; checker.BlitAttack = true; var dPR = AscCommon.AscBrowser.retinaPixelRatio; var dKoef_mm_to_pix = g_dKoef_mm_to_pix * this.m_dZoom * dPR; // не править !!! this.m_nLeft = Math.round(3 * dPR);//(0.8 * g_dKoef_mm_to_pix) >> 0; this.m_nRight = Math.round(15 * dPR);//(4.2 * g_dKoef_mm_to_pix) >> 0; var context = this.m_oCanvas.getContext('2d'); context.setTransform(1, 0, 0, 1, 0, Math.round(5 * dPR)); context.fillStyle = GlobalSkin.BackgroundColor; context.fillRect(0, 0, this.m_oCanvas.width, this.m_oCanvas.height); var top_margin = 0; var bottom_margin = 0; if (RULER_OBJECT_TYPE_PARAGRAPH == this.CurrentObjectType) { top_margin = (this.m_dMarginTop * dKoef_mm_to_pix) >> 0; bottom_margin = (this.m_dMarginBottom * dKoef_mm_to_pix) >> 0; checker.MarginTop = this.m_dMarginTop; checker.MarginBottom = this.m_dMarginBottom; } else if (RULER_OBJECT_TYPE_HEADER == this.CurrentObjectType || RULER_OBJECT_TYPE_FOOTER == this.CurrentObjectType) { top_margin = (this.header_top * dKoef_mm_to_pix) >> 0; bottom_margin = (this.header_bottom * dKoef_mm_to_pix) >> 0; checker.HeaderTop = this.header_top; checker.HeaderBottom = this.header_bottom; } else if (RULER_OBJECT_TYPE_TABLE == this.CurrentObjectType) { var _arr1 = checker.rowsY; var _arr2 = checker.rowsH; if (0 != _arr1.length) _arr1.splice(0, _arr1.length); if (0 != _arr2.length) _arr2.splice(0, _arr2.length); var _count = this.m_oTableMarkup.Rows.length; for (var i = 0; i < _count; i++) { _arr1[i] = markup.Rows[i].Y; _arr2[i] = markup.Rows[i].H; } if (_count != 0) { top_margin = (markup.Rows[0].Y * dKoef_mm_to_pix) >> 0; bottom_margin = ((markup.Rows[_count - 1].Y + markup.Rows[_count - 1].H) * dKoef_mm_to_pix) >> 0; } } var indent = 0.5 * Math.round(dPR); if (bottom_margin > top_margin) { context.fillStyle = GlobalSkin.RulerLight; context.fillRect(this.m_nLeft + indent, top_margin + indent, this.m_nRight - this.m_nLeft, bottom_margin - top_margin); } var intH = height >> 0; if (true) { context.beginPath(); context.fillStyle = GlobalSkin.RulerDark; context.fillRect(this.m_nLeft + indent, indent, this.m_nRight - this.m_nLeft, top_margin); context.fillRect(this.m_nLeft + indent, bottom_margin + indent, this.m_nRight - this.m_nLeft, Math.max(intH - bottom_margin, 1)); context.beginPath(); } context.beginPath(); context.lineWidth = Math.round(dPR); context.strokeStyle = GlobalSkin.RulerTextColor; context.fillStyle = GlobalSkin.RulerTextColor; var mm_1_4 = 10 * dKoef_mm_to_pix / 4; var isDraw1_4 = (mm_1_4 > 7) ? true : false; var inch_1_8 = 25.4 * dKoef_mm_to_pix / 8; var middleHor = (this.m_nLeft + this.m_nRight) / 2; var part1 = dPR; var part2 = 2.5 * dPR; var l_part1 = Math.floor(middleHor - part1); var r_part1 = Math.ceil(middleHor + part1); var l_part2 = Math.floor(middleHor - part2); var r_part2 = Math.ceil(middleHor + part2); context.font = Math.round(7 * dPR) + "pt Arial"; if (this.Units == c_oAscDocumentUnits.Millimeter) { var lCount1 = ((height - top_margin) / mm_1_4) >> 0; var lCount2 = (top_margin / mm_1_4) >> 0; var index = 0; var num = 0; for (var i = 1; i < lCount1; i++) { var lYPos = ((top_margin + i * mm_1_4) >> 0) + indent; index++; if (index == 4) index = 0; if (0 == index) { num++; // number var strNum = "" + num; var lWidthText = context.measureText(strNum).width; context.translate(middleHor, lYPos); context.rotate(-Math.PI / 2); context.fillText(strNum, -lWidthText / 2.0, Math.round(4 * dPR)); context.setTransform(1, 0, 0, 1, 0, Math.round(5 * dPR)); } else if (1 == index && isDraw1_4) { // 1/4 context.beginPath(); context.moveTo(l_part1, lYPos); context.lineTo(r_part1, lYPos); context.stroke(); } else if (2 == index) { // 1/2 context.beginPath(); context.moveTo(l_part2, lYPos); context.lineTo(r_part2, lYPos); context.stroke(); } else if (isDraw1_4) { // 1/4 context.beginPath(); context.moveTo(l_part1, lYPos); context.lineTo(r_part1, lYPos); context.stroke(); } } index = 0; num = 0; for (var i = 1; i <= lCount2; i++) { var lYPos = ((top_margin - i * mm_1_4) >> 0) + indent; index++; if (index == 4) index = 0; if (0 == index) { num++; // number var strNum = "" + num; var lWidthText = context.measureText(strNum).width; context.translate(middleHor, lYPos); context.rotate(-Math.PI / 2); context.fillText(strNum, -lWidthText / 2.0, Math.round(4 * dPR)); context.setTransform(1, 0, 0, 1, 0, Math.round(5 * dPR)); } else if (1 == index && isDraw1_4) { // 1/4 context.beginPath(); context.moveTo(l_part1, lYPos); context.lineTo(r_part1, lYPos); context.stroke(); } else if (2 == index) { // 1/2 context.beginPath(); context.moveTo(l_part2, lYPos); context.lineTo(r_part2, lYPos); context.stroke(); } else if (isDraw1_4) { // 1/4 context.beginPath(); context.moveTo(l_part1, lYPos); context.lineTo(r_part1, lYPos); context.stroke(); } } } else if (this.Units == c_oAscDocumentUnits.Inch) { var lCount1 = ((height - top_margin) / inch_1_8) >> 0; var lCount2 = (top_margin / inch_1_8) >> 0; var index = 0; var num = 0; for (var i = 1; i < lCount1; i++) { var lYPos = ((top_margin + i * inch_1_8) >> 0) + indent; index++; if (index == 8) index = 0; if (0 == index) { num++; // number var strNum = "" + num; var lWidthText = context.measureText(strNum).width; context.translate(middleHor, lYPos); context.rotate(-Math.PI / 2); context.fillText(strNum, -lWidthText / 2.0, Math.round(4 * dPR)); context.setTransform(1, 0, 0, 1, 0, Math.round(5 * dPR)); } else if (4 == index) { // 1/2 context.beginPath(); context.moveTo(l_part2, lYPos); context.lineTo(r_part2, lYPos); context.stroke(); } else if (inch_1_8 > 8) { // 1/8 context.beginPath(); context.moveTo(l_part1, lYPos); context.lineTo(r_part1, lYPos); context.stroke(); } } index = 0; num = 0; for (var i = 1; i <= lCount2; i++) { var lYPos = ((top_margin - i * inch_1_8) >> 0) + indent; index++; if (index == 8) index = 0; if (0 == index) { num++; // number var strNum = "" + num; var lWidthText = context.measureText(strNum).width; context.translate(middleHor, lYPos); context.rotate(-Math.PI / 2); context.fillText(strNum, -lWidthText / 2.0, Math.round(4 * dPR)); context.setTransform(1, 0, 0, 1, 0, Math.round(5 * dPR)); } else if (4 == index) { // 1/2 context.beginPath(); context.moveTo(middleHor - part2, lYPos); context.lineTo(middleHor + part2, lYPos); context.stroke(); } else if (inch_1_8 > 8) { // 1/8 context.beginPath(); context.moveTo(middleHor - part1, lYPos); context.lineTo(middleHor + part1, lYPos); context.stroke(); } } } else if (this.Units == c_oAscDocumentUnits.Point) { var point_1_12 = 25.4 * dKoef_mm_to_pix / 12; var lCount1 = ((height - top_margin) / point_1_12) >> 0; var lCount2 = (top_margin / point_1_12) >> 0; var index = 0; var num = 0; for (var i = 1; i < lCount1; i++) { var lYPos = ((top_margin + i * point_1_12) >> 0) + indent; index++; if (index == 12) index = 0; if (0 == index || 6 == index) { num++; // number var strNum = "" + (num * 36); var lWidthText = context.measureText(strNum).width; context.translate(middleHor, lYPos); context.rotate(-Math.PI / 2); context.fillText(strNum, -lWidthText / 2.0, Math.round(4 * dPR)); context.setTransform(1, 0, 0, 1, 0, Math.round(5 * dPR)); } else if (point_1_12 > 5) { // 1/8 context.beginPath(); context.moveTo(l_part1, lYPos); context.lineTo(r_part1, lYPos); context.stroke(); } } index = 0; num = 0; for (var i = 1; i <= lCount2; i++) { var lYPos = ((top_margin - i * point_1_12) >> 0) + indent; index++; if (index == 12) index = 0; if (0 == index || 6 == index) { num++; // number var strNum = "" + (num * 36); var lWidthText = context.measureText(strNum).width; context.translate(middleHor, lYPos); context.rotate(-Math.PI / 2); context.fillText(strNum, -lWidthText / 2.0, Math.round(4 * dPR)); context.setTransform(1, 0, 0, 1, 0, Math.round(5 * dPR)); } else if (point_1_12 > 5) { // 1/8 context.beginPath(); context.moveTo(l_part1, lYPos); context.lineTo(r_part1, lYPos); context.stroke(); } } } if ((this.CurrentObjectType == RULER_OBJECT_TYPE_TABLE) && (null != markup)) { var dPR = AscCommon.AscBrowser.retinaPixelRatio; var dKoef_mm_to_pix = g_dKoef_mm_to_pix * this.m_dZoom * dPR; // не будет нулевых таблиц. var _count = markup.Rows.length; if (0 == _count) return; var start_dark = (((markup.Rows[0].Y + markup.Rows[0].H) * dKoef_mm_to_pix) >> 0) + indent; var end_dark = 0; context.fillStyle = GlobalSkin.RulerDark; context.strokeStyle = GlobalSkin.RulerOutline; var _x = this.m_nLeft + indent; var _w = this.m_nRight - this.m_nLeft; for (var i = 1; i < _count; i++) { end_dark = ((markup.Rows[i].Y * dKoef_mm_to_pix) >> 0) + indent; context.fillRect(_x, start_dark, _w, Math.max(end_dark - start_dark, Math.round(7 * dPR))); context.strokeRect(_x, start_dark, _w, Math.max(end_dark - start_dark, Math.round(7 * dPR))); start_dark = (((markup.Rows[i].Y + markup.Rows[i].H) * dKoef_mm_to_pix) >> 0) + indent; } } // рамка context.beginPath(); context.strokeStyle = GlobalSkin.RulerOutline; context.strokeRect(this.m_nLeft + indent, indent, this.m_nRight - this.m_nLeft, Math.max(intH - 1, 1)); context.beginPath(); context.moveTo(this.m_nLeft + indent, top_margin + indent); context.lineTo(this.m_nRight - indent, top_margin + indent); context.moveTo(this.m_nLeft + indent, bottom_margin + indent); context.lineTo(this.m_nRight - indent, bottom_margin + indent); context.stroke(); } this.OnMouseMove = function(left, top, e) { var word_control = this.m_oWordControl; AscCommon.check_MouseMoveEvent(e); this.SimpleChanges.CheckMove(); var ver_ruler = word_control.m_oLeftRuler_vertRuler; var dKoefPxToMM = 100 * g_dKoef_pix_to_mm / word_control.m_nZoomValue; // теперь определяем позицию относительно самой линейки. Все в миллиметрах var _y = global_mouseEvent.Y - 7 * g_dKoef_mm_to_pix - top - word_control.Y; _y *= dKoefPxToMM; var _x = left * g_dKoef_pix_to_mm; var dKoef_mm_to_pix = g_dKoef_mm_to_pix * this.m_dZoom; var mm_1_4 = 10 / 4; var mm_1_8 = mm_1_4 / 2; switch (this.DragType) { case 0: { if (this.CurrentObjectType == RULER_OBJECT_TYPE_PARAGRAPH) { if (this.IsCanMoveMargins && ((Math.abs(_y - this.m_dMarginTop) < 1) || (Math.abs(_y - this.m_dMarginBottom) < 1))) word_control.m_oDrawingDocument.SetCursorType("s-resize"); else word_control.m_oDrawingDocument.SetCursorType("default"); } else if (this.CurrentObjectType == RULER_OBJECT_TYPE_HEADER) { if ((Math.abs(_y - this.header_top) < 1) || (Math.abs(_y - this.header_bottom) < 1)) word_control.m_oDrawingDocument.SetCursorType("s-resize"); else word_control.m_oDrawingDocument.SetCursorType("default"); } else if (this.CurrentObjectType == RULER_OBJECT_TYPE_FOOTER) { if (Math.abs(_y - this.header_top) < 1) word_control.m_oDrawingDocument.SetCursorType("s-resize"); else word_control.m_oDrawingDocument.SetCursorType("default"); } else if (this.CurrentObjectType == RULER_OBJECT_TYPE_TABLE) { var type = this.CheckMouseType(2, _y); if (type == 5) word_control.m_oDrawingDocument.SetCursorType("s-resize"); else word_control.m_oDrawingDocument.SetCursorType("default"); } break; } case 1: { var newVal = RulerCorrectPosition(this, _y, this.m_dMarginTop); if (newVal > (this.m_dMarginBottom - 30)) newVal = this.m_dMarginBottom - 30; if (newVal < 0) newVal = 0; this.m_dMarginTop = newVal; word_control.UpdateVerRulerBack(); var pos = top + this.m_dMarginTop * dKoef_mm_to_pix; word_control.m_oOverlayApi.HorLine(pos); word_control.m_oDrawingDocument.SetCursorType("s-resize"); break; } case 2: { var newVal = RulerCorrectPosition(this, _y, this.m_dMarginTop); if (newVal < (this.m_dMarginTop + 30)) newVal = this.m_dMarginTop + 30; if (newVal > this.m_oPage.height_mm) newVal = this.m_oPage.height_mm; this.m_dMarginBottom = newVal; word_control.UpdateVerRulerBack(); var pos = top + this.m_dMarginBottom * dKoef_mm_to_pix; word_control.m_oOverlayApi.HorLine(pos); word_control.m_oDrawingDocument.SetCursorType("s-resize"); break; } case 3: { var newVal = RulerCorrectPosition(this, _y, this.m_dMarginTop); if (newVal > this.header_bottom) newVal = this.header_bottom; if (newVal < 0) newVal = 0; this.header_top = newVal; word_control.UpdateVerRulerBack(); var pos = top + this.header_top * dKoef_mm_to_pix; word_control.m_oOverlayApi.HorLine(pos); word_control.m_oDrawingDocument.SetCursorType("s-resize"); break; } case 4: { var newVal = RulerCorrectPosition(this, _y, this.m_dMarginTop); if (newVal < 0) newVal = 0; if (newVal > this.m_oPage.height_mm) newVal = this.m_oPage.height_mm; this.header_bottom = newVal; word_control.UpdateVerRulerBack(); var pos = top + this.header_bottom * dKoef_mm_to_pix; word_control.m_oOverlayApi.HorLine(pos); word_control.m_oDrawingDocument.SetCursorType("s-resize"); break; } case 5: { // сначала нужно определить минимум и максимум сдвига var _min = 0; var _max = this.m_oPage.height_mm; if (0 < this.DragTablePos) { _min = this.m_oTableMarkup.Rows[this.DragTablePos - 1].Y; } if (this.DragTablePos < this.m_oTableMarkup.Rows.length) { _max = this.m_oTableMarkup.Rows[this.DragTablePos].Y + this.m_oTableMarkup.Rows[this.DragTablePos].H; } var newVal = RulerCorrectPosition(this, _y, this.m_dMarginTop); if (newVal < _min) newVal = _min; if (newVal > _max) newVal = _max; if (0 == this.DragTablePos) { var _bottom = this.m_oTableMarkup.Rows[0].Y + this.m_oTableMarkup.Rows[0].H; this.m_oTableMarkup.Rows[0].Y = newVal; this.m_oTableMarkup.Rows[0].H = _bottom - newVal; } else { var oldH = this.m_oTableMarkup.Rows[this.DragTablePos - 1].H; this.m_oTableMarkup.Rows[this.DragTablePos - 1].H = newVal - this.m_oTableMarkup.Rows[this.DragTablePos - 1].Y; var delta = this.m_oTableMarkup.Rows[this.DragTablePos - 1].H - oldH; for (var i = this.DragTablePos; i < this.m_oTableMarkup.Rows.length; i++) { this.m_oTableMarkup.Rows[i].Y += delta; } } word_control.UpdateVerRulerBack(); var pos = top + newVal * dKoef_mm_to_pix; word_control.m_oOverlayApi.HorLine(pos); word_control.m_oDrawingDocument.SetCursorType("s-resize"); } } } this.CheckMouseType = function(x, y) { // проверяем где находимся if (this.IsCanMoveMargins === false) return 0; if (x >= 0.8 && x <= 4.2) { // внутри линейки if (this.CurrentObjectType == RULER_OBJECT_TYPE_PARAGRAPH) { if (Math.abs(y - this.m_dMarginTop) < 1) { return 1; } else if (Math.abs(y - this.m_dMarginBottom) < 1) { return 2; } } else if (this.CurrentObjectType == RULER_OBJECT_TYPE_HEADER) { if (Math.abs(y - this.header_top) < 1) { return 3; } else if (Math.abs(y - this.header_bottom) < 1) { return 4; } } else if (this.CurrentObjectType == RULER_OBJECT_TYPE_FOOTER) { if (Math.abs(y - this.header_top) < 1) { return 3; } } else if (this.CurrentObjectType == RULER_OBJECT_TYPE_TABLE && null != this.m_oTableMarkup) { // не будет нулевых таблиц. var markup = this.m_oTableMarkup; var _count = markup.Rows.length; if (0 == _count) return 0; var _start = markup.Rows[0].Y; var _end = _start - 2; for (var i = 0; i <= _count; i++) { if (i == _count) { _end = markup.Rows[i - 1].Y + markup.Rows[i - 1].H; _start = _end + 2; } else if (i != 0) { _end = markup.Rows[i - 1].Y + markup.Rows[i - 1].H; _start = markup.Rows[i].Y; } if ((_end - 1) < y && y < (_start + 1)) { this.DragTablePos = i; return 5; } } } } return 0; } this.OnMouseDown = function(left, top, e) { var word_control = this.m_oWordControl; if (true === word_control.m_oApi.isStartAddShape) { word_control.m_oApi.sync_EndAddShape(); word_control.m_oApi.sync_StartAddShapeCallback(false); } if (true === word_control.m_oApi.isInkDrawerOn()) { word_control.m_oApi.stopInkDrawer(); } AscCommon.check_MouseDownEvent(e, true); this.SimpleChanges.Reinit(); global_mouseEvent.LockMouse(); var dKoefPxToMM = 100 * g_dKoef_pix_to_mm / word_control.m_nZoomValue; var dKoef_mm_to_pix = g_dKoef_mm_to_pix * this.m_dZoom; var _y = global_mouseEvent.Y - 7 * g_dKoef_mm_to_pix - top - word_control.Y; _y *= dKoefPxToMM; var _x = (global_mouseEvent.X - word_control.X) * g_dKoef_pix_to_mm - word_control.GetMainContentBounds().L - word_control.GetVertRulerLeft(); this.DragType = this.CheckMouseType(_x, _y); this.DragTypeMouseDown = this.DragType; if (global_mouseEvent.ClickCount > 1) { var eventType = ""; switch (this.DragTypeMouseDown) { case 5: eventType = "tables"; break; default: eventType = "margins"; break; } if (eventType != "") { word_control.m_oApi.sendEvent("asc_onRulerDblClick", eventType); this.DragType = 0; this.OnMouseUp(left, top, e); return; } } switch (this.DragType) { case 1: { var pos = top + this.m_dMarginTop * dKoef_mm_to_pix; word_control.m_oOverlayApi.HorLine(pos); break; } case 2: { var pos = top + this.m_dMarginBottom * dKoef_mm_to_pix; word_control.m_oOverlayApi.HorLine(pos); break; } case 3: { var pos = top + this.header_top * dKoef_mm_to_pix; word_control.m_oOverlayApi.HorLine(pos); break; } case 4: { var pos = top + this.header_bottom * dKoef_mm_to_pix; word_control.m_oOverlayApi.HorLine(pos); break; } case 5: { var pos = 0; if (0 == this.DragTablePos) { pos = top + this.m_oTableMarkup.Rows[0].Y * dKoef_mm_to_pix; word_control.m_oOverlayApi.HorLine(pos); } else { pos = top + (this.m_oTableMarkup.Rows[this.DragTablePos - 1].Y + this.m_oTableMarkup.Rows[this.DragTablePos - 1].H) * dKoef_mm_to_pix; word_control.m_oOverlayApi.HorLine(pos); } } } word_control.m_oDrawingDocument.LockCursorTypeCur(); } this.OnMouseUp = function(left, top, e) { var lockedElement = AscCommon.check_MouseUpEvent(e); //this.m_oWordControl.m_oOverlayApi.UnShow(); this.m_oWordControl.OnUpdateOverlay(); switch (this.DragType) { case 1: case 2: { if (!this.SimpleChanges.IsSimple) this.SetMarginProperties(); break; } case 3: case 4: { if (!this.SimpleChanges.IsSimple) this.SetHeaderProperties(); break; } case 5: { if (!this.SimpleChanges.IsSimple) this.SetTableProperties(); this.DragTablePos = -1; break; } } this.DragType = 0; this.m_oWordControl.m_oDrawingDocument.UnlockCursorType(); this.SimpleChanges.Clear(); } this.OnMouseUpExternal = function() { //this.m_oWordControl.m_oOverlayApi.UnShow(); this.m_oWordControl.OnUpdateOverlay(); switch (this.DragType) { case 1: case 2: { if (!this.SimpleChanges.IsSimple) this.SetMarginProperties(); break; } case 3: case 4: { if (!this.SimpleChanges.IsSimple) this.SetHeaderProperties(); break; } case 5: { if (!this.SimpleChanges.IsSimple) this.SetTableProperties(); this.DragTablePos = -1; break; } } this.DragType = 0; this.m_oWordControl.m_oDrawingDocument.UnlockCursorType(); this.SimpleChanges.Clear(); } this.BlitToMain = function(left, top, htmlElement) { if (!this.RepaintChecker.BlitAttack && top == this.RepaintChecker.BlitTop) return; var dPR = AscCommon.AscBrowser.retinaPixelRatio; top = Math.round(top * dPR); this.RepaintChecker.BlitTop = top; this.RepaintChecker.BlitAttack = false; htmlElement.width = htmlElement.width; var context = htmlElement.getContext('2d'); if (null != this.m_oCanvas) { context.drawImage(this.m_oCanvas, 0, Math.round(5 * dPR), this.m_oCanvas.width, this.m_oCanvas.height - Math.round(10 * dPR), 0, top, this.m_oCanvas.width, this.m_oCanvas.height - Math.round(10 * dPR)); } } // выставление параметров логическому документу this.SetMarginProperties = function() { if ( false === this.m_oWordControl.m_oLogicDocument.Document_Is_SelectionLocked(AscCommon.changestype_Document_SectPr) ) { this.m_oWordControl.m_oLogicDocument.StartAction(AscDFH.historydescription_Document_SetDocumentMargin_Ver); this.m_oWordControl.m_oLogicDocument.SetDocumentMargin( { Top : this.m_dMarginTop, Bottom : this.m_dMarginBottom }, true); this.m_oWordControl.m_oLogicDocument.FinalizeAction(); } } this.SetHeaderProperties = function() { if ( false === this.m_oWordControl.m_oLogicDocument.Document_Is_SelectionLocked(AscCommon.changestype_HdrFtr) ) { // TODO: в данной функции при определенных параметрах может меняться верхнее поле. Поэтому, надо // вставить проверку на залоченность с типом changestype_Document_SectPr this.m_oWordControl.m_oLogicDocument.StartAction(AscDFH.historydescription_Document_SetHdrFtrBounds); this.m_oWordControl.m_oLogicDocument.Document_SetHdrFtrBounds(this.header_top, this.header_bottom); this.m_oWordControl.m_oLogicDocument.FinalizeAction(); } } this.SetTableProperties = function() { if ( false === this.m_oWordControl.m_oLogicDocument.Document_Is_SelectionLocked(AscCommon.changestype_Table_Properties) ) { this.m_oWordControl.m_oLogicDocument.StartAction(AscDFH.historydescription_Document_SetTableMarkup_Ver); this.m_oTableMarkup.CorrectTo(); this.m_oTableMarkup.Table.Update_TableMarkupFromRuler(this.m_oTableMarkup, false, this.DragTablePos); if (this.m_oTableMarkup) this.m_oTableMarkup.CorrectFrom(); this.m_oWordControl.m_oLogicDocument.FinalizeAction(); } } }