Files
Yajbir Singh f1b860b25c
check / markdownlint (push) Has been cancelled
check / spellchecker (push) Has been cancelled
updated
2025-12-11 19:03:17 +05:30

3742 lines
124 KiB
JavaScript

/*
* (c) Copyright Ascensio System SIA 2010-2024
*
* This program is a free software product. You can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License (AGPL)
* version 3 as published by the Free Software Foundation. In accordance with
* Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
* that Ascensio System SIA expressly excludes the warranty of non-infringement
* of any third-party rights.
*
* This program is distributed WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
*
* You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish
* street, Riga, Latvia, EU, LV-1050.
*
* The interactive user interfaces in modified source and object code versions
* of the Program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU AGPL version 3.
*
* Pursuant to Section 7(b) of the License you must retain the original Product
* logo when distributing the program. Pursuant to Section 7(e) we decline to
* grant you any rights under trademark law for use of our trademarks.
*
* All the Product's GUI elements, including illustrations and icon sets, as
* well as technical writing content are licensed under the terms of the
* Creative Commons Attribution-ShareAlike 4.0 International. See the License
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
*
*/
"use strict";
// 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();
}
}
}