/* * (c) Copyright Ascensio System SIA 2010-2014 * * This program is a free software product. You can redistribute it and/or * modify it under the terms of the GNU Affero General Public License (AGPL) * version 3 as published by the Free Software Foundation. In accordance with * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect * that Ascensio System SIA expressly excludes the warranty of non-infringement * of any third-party rights. * * This program is distributed WITHOUT ANY WARRANTY; without even the implied * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html * * You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia, * EU, LV-1021. * * The interactive user interfaces in modified source and object code versions * of the Program must display Appropriate Legal Notices, as required under * Section 5 of the GNU AGPL version 3. * * Pursuant to Section 7(b) of the License you must retain the original Product * logo when distributing the program. Pursuant to Section 7(e) we decline to * grant you any rights under trademark law for use of our trademarks. * * All the Product's GUI elements, including illustrations and icon sets, as * well as technical writing content are licensed under the terms of the * Creative Commons Attribution-ShareAlike 4.0 International. See the License * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode * */ function CTab(pos, type) { this.pos = pos; this.type = type; } 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; function CHorRulerRepaintChecker() { this.Width = 0; this.Height = 0; this.Type = 0; this.MarginLeft = 0; this.MarginRight = 0; this.tableCols = new Array(); this.marginsLeft = new Array(); this.marginsRight = new Array(); this.BlitAttack = false; this.BlitLeft = 0; this.BlitIndentLeft = 0; this.BlitIndentLeftFirst = 0; this.BlitIndentRight = 0; this.BlitDefaultTab = 0; this.BlitTabs = null; this.BlitMarginLeftInd = 0; this.BlitMarginRightInd = 0; } function CVerRulerRepaintChecker() { this.Width = 0; this.Height = 0; this.Type = 0; this.MarginTop = 0; this.MarginBottom = 0; this.HeaderTop = 0; this.HeaderBottom = 0; this.rowsY = new Array(); this.rowsH = new Array(); this.BlitAttack = false; this.BlitTop = 0; } function RulerCorrectPosition(val, mm_1_8, mm_1_4) { if (global_keyboardEvent.AltKey) { return val; } return (((val + mm_1_8) / mm_1_4) >> 0) * mm_1_4; } function CHorRuler() { this.m_oPage = null; this.m_nTop = 0; this.m_nBottom = 0; this.m_dDefaultTab = 12.5; this.m_arrTabs = new Array(); 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_oCanvas = null; this.m_dZoom = 1; this.DragType = 0; 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.DragTablePos = -1; this.TableMarginLeft = 0; this.TableMarginRight = 0; this.m_oWordControl = null; this.RepaintChecker = new CHorRulerRepaintChecker(); this.m_bIsMouseDown = false; this.IsCanMoveMargins = true; this.IsCanMoveAnyMarkers = true; this.IsDrawAnyMarkers = true; this.InitTablePict = function () { var _data = g_memory.ctx.createImageData(7, 8); var _px = _data.data; var is2 = false; var black_level = 100; for (var j = 0; j < 8; j++) { var ind = j * 4 * 7; if (is2) { for (i = 0; i < 7; i++) { _px[ind++] = black_level; _px[ind++] = black_level; _px[ind++] = black_level; _px[ind++] = 255; } } else { var is22 = false; for (var i = 0; i < 7; i++) { if (is22) { _px[ind++] = black_level; _px[ind++] = black_level; _px[ind++] = black_level; _px[ind++] = 255; } else { _px[ind++] = 255; _px[ind++] = 255; _px[ind++] = 255; _px[ind++] = 255; } is22 = !is22; } } is2 = !is2; } return _data; }; this.InitTablePict2 = function () { var _data = g_memory.ctx.createImageData(7, 8); var _px = _data.data; var is2 = false; var black_level = 100; for (var j = 0; j < 8; j++) { var ind = j * 4 * 7; if (is2) { for (i = 0; i < 7; i++) { _px[ind++] = black_level; _px[ind++] = black_level; _px[ind++] = black_level; _px[ind++] = 255; } } else { var is22 = false; for (var i = 0; i < 7; i++) { if (is22) { _px[ind++] = black_level; _px[ind++] = black_level; _px[ind++] = black_level; _px[ind++] = 255; } else { _px[ind++] = 255; _px[ind++] = 255; _px[ind++] = 255; _px[ind++] = 255; } is22 = !is22; } } is2 = !is2; } var _data2 = g_memory.ctx.createImageData(14, 16); var _px2 = _data2.data; var _sI = 0; var _sI2 = 0; for (var j = 0; j < 8; j++) { var _oldsI = _sI; for (var i = 0; i < 7; i++) { _px2[_sI2++] = _px[_sI]; _px2[_sI2++] = _px[_sI]; _px2[_sI2++] = _px[_sI]; _px2[_sI2++] = _px[_sI]; _px2[_sI2++] = _px[_sI++]; _px2[_sI2++] = _px[_sI++]; _px2[_sI2++] = _px[_sI++]; _px2[_sI2++] = _px[_sI++]; } _sI = _oldsI; for (var i = 0; i < 7; i++) { _px2[_sI2++] = _px[_sI]; _px2[_sI2++] = _px[_sI]; _px2[_sI2++] = _px[_sI]; _px2[_sI2++] = _px[_sI]; _px2[_sI2++] = _px[_sI++]; _px2[_sI2++] = _px[_sI++]; _px2[_sI2++] = _px[_sI++]; _px2[_sI2++] = _px[_sI++]; } } return _data2; }; this.CheckTableSprite = function (is_retina) { if (null != this.tableSprite) { if (!is_retina && this.tableSprite.width == 7) { return; } if (is_retina && this.tableSprite.width == 14) { return; } } if (!is_retina) { this.tableSprite = this.InitTablePict(); } else { this.tableSprite = this.InitTablePict2(); } }; this.tableSprite = null; this.CheckCanvas = function () { this.m_dZoom = this.m_oWordControl.m_nZoomValue / 100; this.IsRetina = this.m_oWordControl.bIsRetinaSupport; this.CheckTableSprite(this.IsRetina); var dKoef_mm_to_pix = g_dKoef_mm_to_pix * this.m_dZoom; if (this.IsRetina) { dKoef_mm_to_pix *= 2; } var widthNew = dKoef_mm_to_pix * this.m_oPage.width_mm; var _width = 10 + widthNew; if (this.IsRetina) { _width += 10; } var _height = 8 * g_dKoef_mm_to_pix; if (this.IsRetina) { _height *= 2; } 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) { if (null == cachedPage || undefined == cachedPage) { return; } this.m_oPage = cachedPage; var width = this.CheckCanvas(); if (this.IsRetina) { width >>= 1; } if (0 == this.DragType) { this.m_dMarginLeft = cachedPage.margin_left; this.m_dMarginRight = cachedPage.margin_right; } var checker = this.RepaintChecker; var markup = this.m_oTableMarkup; if (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; } } } } } } } checker.Width = width; checker.Type = this.CurrentObjectType; checker.BlitAttack = true; var dKoef_mm_to_pix = g_dKoef_mm_to_pix * this.m_dZoom; this.m_nTop = (1.8 * g_dKoef_mm_to_pix) >> 0; this.m_nBottom = (5.2 * g_dKoef_mm_to_pix) >> 0; var context = this.m_oCanvas.getContext("2d"); if (!this.IsRetina) { context.setTransform(1, 0, 0, 1, 5, 0); } else { context.setTransform(2, 0, 0, 2, 10, 0); } context.fillStyle = "#B0B0B0"; context.fillRect(0, 0, this.m_oCanvas.width, this.m_oCanvas.height); var left_margin = 0; var right_margin = 0; 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; } 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; } } } context.fillStyle = "#EDEDED"; context.fillRect(left_margin + 0.5, this.m_nTop + 0.5, right_margin - left_margin, this.m_nBottom - this.m_nTop); var intW = width >> 0; context.strokeStyle = "#929292"; context.lineWidth = 1; context.strokeRect(0.5, this.m_nTop + 0.5, Math.max(intW - 1, 1), this.m_nBottom - this.m_nTop); context.beginPath(); context.moveTo(left_margin + 0.5, this.m_nTop + 0.5); context.lineTo(left_margin + 0.5, this.m_nBottom - 0.5); context.moveTo(right_margin + 0.5, this.m_nTop + 0.5); context.lineTo(right_margin + 0.5, this.m_nBottom - 0.5); context.stroke(); context.beginPath(); context.strokeStyle = "#585B5E"; context.fillStyle = "#585B5E"; var mm_1_4 = 10 * dKoef_mm_to_pix / 4; var lCount1 = ((width - left_margin) / mm_1_4) >> 0; var lCount2 = (left_margin / mm_1_4) >> 0; var middleVert = (this.m_nTop + this.m_nBottom) / 2; var part1 = 1; var part2 = 2.5; context.font = "7pt Arial"; var index = 0; var num = 0; for (var i = 1; i < lCount1; i++) { var lXPos = ((left_margin + i * mm_1_4) >> 0) + 0.5; index++; if (index == 4) { index = 0; } if (0 == index) { num++; var strNum = "" + num; var lWidthText = context.measureText(strNum).width; lXPos -= (lWidthText / 2); context.fillText(strNum, lXPos, this.m_nBottom - 3); } else { if (1 == index) { context.beginPath(); context.moveTo(lXPos, middleVert - part1); context.lineTo(lXPos, middleVert + part1); context.stroke(); } else { if (2 == index) { context.beginPath(); context.moveTo(lXPos, middleVert - part2); context.lineTo(lXPos, middleVert + part2); context.stroke(); } else { context.beginPath(); context.moveTo(lXPos, middleVert - part1); context.lineTo(lXPos, middleVert + part1); context.stroke(); } } } } index = 0; num = 0; for (var i = 1; i <= lCount2; i++) { var lXPos = ((left_margin - i * mm_1_4) >> 0) + 0.5; index++; if (index == 4) { index = 0; } if (0 == index) { num++; var strNum = "" + num; var lWidthText = context.measureText(strNum).width; lXPos -= (lWidthText / 2); context.fillText(strNum, lXPos, this.m_nBottom - 3); } else { if (1 == index) { context.beginPath(); context.moveTo(lXPos, middleVert - part1); context.lineTo(lXPos, middleVert + part1); context.stroke(); } else { if (2 == index) { context.beginPath(); context.moveTo(lXPos, middleVert - part2); context.lineTo(lXPos, middleVert + part2); context.stroke(); } else { context.beginPath(); context.moveTo(lXPos, middleVert - part1); context.lineTo(lXPos, middleVert + part1); context.stroke(); } } } } if (null != markup) { var _count = markup.Cols.length; if (0 != _count) { context.fillStyle = "#B0B0B0"; context.strokeStyle = "#929292"; var _offset = markup.X; for (var i = 0; i <= _count; i++) { var __xID = 0; if (!this.IsRetina) { __xID = (2.5 + _offset * dKoef_mm_to_pix) >> 0; } else { __xID = ((2.5 + _offset * dKoef_mm_to_pix) * 2) >> 0; } var __yID = this.m_nBottom - 10; if (this.IsRetina) { __yID <<= 1; } if (0 == i) { context.putImageData(this.tableSprite, __xID, __yID); _offset += markup.Cols[i]; continue; } if (i == _count) { context.putImageData(this.tableSprite, __xID, __yID); break; } var __x = (((_offset - markup.Margins[i - 1].Right) * dKoef_mm_to_pix) >> 0) + 0.5; var __r = (((_offset + markup.Margins[i].Left) * dKoef_mm_to_pix) >> 0) + 0.5; context.fillRect(__x, this.m_nTop + 0.5, __r - __x, this.m_nBottom - this.m_nTop); context.strokeRect(__x, this.m_nTop + 0.5, __r - __x, this.m_nBottom - this.m_nTop); if (!this.IsRetina) { context.putImageData(this.tableSprite, __xID, __yID); } else { context.putImageData(this.tableSprite, __xID, __yID); } _offset += markup.Cols[i]; } } } }; 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 () { 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; }; this.OnMouseMove = function (left, top, e) { var word_control = this.m_oWordControl; check_MouseMoveEvent(e); 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 - 5 * g_dKoef_mm_to_pix - left - word_control.X - word_control.m_oMainContent.AbsolutePosition.L * 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) { _margin_left = this.TableMarginLeft; _margin_right = this.TableMarginRight; } switch (this.DragType) { case 0: var position = this.CheckMouseType(_x, _y); if ((1 == position) || (2 == position) || (8 == position)) { word_control.m_oDrawingDocument.SetCursorType("w-resize"); } else { word_control.m_oDrawingDocument.SetCursorType("default"); } break; case 1: var newVal = RulerCorrectPosition(_x, mm_1_8, mm_1_4); 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 2: var newVal = RulerCorrectPosition(_x, mm_1_8, mm_1_4); 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 3: var newVal = RulerCorrectPosition(_x, mm_1_8, mm_1_4); var min = 0; if (this.m_dIndentLeftFirst < this.m_dIndentLeft) { min = this.m_dIndentLeft - this.m_dIndentLeftFirst; } if (newVal < min) { newVal = this.m_dIndentLeft_old; } var 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)); } var newIndent = newVal - _margin_left; this.m_dIndentLeftFirst = (this.m_dIndentLeftFirst - this.m_dIndentLeft) + newIndent; this.m_dIndentLeft = newIndent; word_control.UpdateHorRulerBack(); var pos = left + (_margin_left + this.m_dIndentLeft) * dKoef_mm_to_pix; word_control.m_oOverlayApi.VertLine(pos); break; case 4: var newVal = RulerCorrectPosition(_x, mm_1_8, mm_1_4); if (newVal < 0) { newVal = 0; } var max = _margin_right - 20; if (0 < this.m_dIndentRight) { max -= this.m_dIndentRight; } if (newVal > max) { newVal = Math.max(max, _margin_left + this.m_dIndentLeft_old); } this.m_dIndentLeft = newVal - _margin_left; word_control.UpdateHorRulerBack(); var pos = left + (_margin_left + this.m_dIndentLeft) * dKoef_mm_to_pix; word_control.m_oOverlayApi.VertLine(pos); break; case 5: var newVal = RulerCorrectPosition(_x, mm_1_8, mm_1_4); if (newVal < 0) { newVal = 0; } var max = _margin_right - 20; if (0 < this.m_dIndentRight) { max -= this.m_dIndentRight; } if (newVal > max) { newVal = Math.max(max, _margin_left + this.m_dIndentLeftFirst_old); } this.m_dIndentLeftFirst = newVal - _margin_left; word_control.UpdateHorRulerBack(); var pos = left + (_margin_left + this.m_dIndentLeftFirst) * dKoef_mm_to_pix; word_control.m_oOverlayApi.VertLine(pos); break; case 6: var newVal = RulerCorrectPosition(_x, mm_1_8, mm_1_4); if (newVal > (this.m_oPage.width_mm)) { newVal = this.m_oPage.width_mm; } var 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); } this.m_dIndentRight = _margin_right - newVal; word_control.UpdateHorRulerBack(); var pos = left + (_margin_right - this.m_dIndentRight) * dKoef_mm_to_pix; word_control.m_oOverlayApi.VertLine(pos); break; case 7: var newVal = RulerCorrectPosition(_x, mm_1_8, mm_1_4); this.m_dCurrentTabNewPosition = newVal - _margin_left; var pos = left + (_margin_left + this.m_dCurrentTabNewPosition) * dKoef_mm_to_pix; if (_y <= 3 || _y > 5.6) { this.IsDrawingCurTab = false; word_control.m_oOverlayApi.Clear(); } else { this.IsDrawingCurTab = true; } word_control.UpdateHorRulerBack(); if (this.IsDrawingCurTab) { word_control.m_oOverlayApi.VertLine(pos); } break; case 8: var newVal = RulerCorrectPosition(_x, mm_1_8, mm_1_4); 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; } }; this.CheckMouseType = function (x, y, isMouseDown) { 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) { _margin_left = this.TableMarginLeft; _margin_right = this.TableMarginRight; } if (this.IsCanMoveAnyMarkers) { if (y >= 3 && y <= _bottom) { var _count_tabs = this.m_arrTabs.length; for (var i = 0; i < _count_tabs; i++) { var _pos = _margin_left + this.m_arrTabs[i].pos; if ((x >= (_pos - 1)) && (x <= (_pos + 1))) { if (true === isMouseDown) { this.m_lCurrentTab = i; } return 7; } } } var dCenterX = _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 3; } else { if ((y > (_bottom - var3)) && (y < _bottom)) { return 4; } } } dCenterX = _margin_right - this.m_dIndentRight; var1 = dCenterX - 1; var4 = dCenterX + 1; if ((x >= var1) && (x <= var4)) { if ((y > (_bottom - var3)) && (y < _bottom)) { return 6; } } dCenterX = _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 1; } } return 5; } } } if (this.CurrentObjectType == RULER_OBJECT_TYPE_PARAGRAPH && this.IsCanMoveMargins) { if (y >= _top && y <= _bottom) { if (Math.abs(x - this.m_dMarginLeft) < 1) { return 1; } else { if (Math.abs(x - this.m_dMarginRight) < 1) { return 2; } } } } else { if (this.CurrentObjectType == RULER_OBJECT_TYPE_TABLE) { 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 8; } if (i == _count) { break; } pos += markup.Cols[i]; } } } } return 0; }; this.OnMouseDown = function (left, top, e) { var word_control = this.m_oWordControl; check_MouseDownEvent(e); 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 _x = global_mouseEvent.X - 5 * g_dKoef_mm_to_pix - left - word_control.X - word_control.m_oMainContent.AbsolutePosition.L * 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); var _margin_left = this.m_dMarginLeft; var _margin_right = this.m_dMarginRight; if (this.CurrentObjectType == RULER_OBJECT_TYPE_TABLE) { _margin_left = this.TableMarginLeft; _margin_right = this.TableMarginRight; } this.m_bIsMouseDown = true; switch (this.DragType) { case 1: var pos = left + _margin_left * dKoef_mm_to_pix; word_control.m_oOverlayApi.VertLine(pos); break; case 2: var pos = left + _margin_right * dKoef_mm_to_pix; word_control.m_oOverlayApi.VertLine(pos); break; case 3: var pos = left + (_margin_left + this.m_dIndentLeft) * 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 4: var pos = left + (_margin_left + this.m_dIndentLeft) * dKoef_mm_to_pix; word_control.m_oOverlayApi.VertLine(pos); this.m_dIndentLeft_old = this.m_dIndentLeft; break; case 5: var pos = left + (_margin_left + this.m_dIndentLeftFirst) * dKoef_mm_to_pix; word_control.m_oOverlayApi.VertLine(pos); this.m_dIndentLeftFirst_old = this.m_dIndentLeftFirst; break; case 6: var pos = left + (_margin_right - this.m_dIndentRight) * dKoef_mm_to_pix; word_control.m_oOverlayApi.VertLine(pos); this.m_dIndentRight_old = this.m_dIndentRight; break; case 7: var pos = left + (_margin_left + this.m_arrTabs[this.m_lCurrentTab].pos) * dKoef_mm_to_pix; word_control.m_oOverlayApi.VertLine(pos); break; case 8: 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); break; } if (0 == this.DragType) { var _top = 1.8; var _bottom = 5.2; if (_y >= 3 && _y <= _bottom && _x >= _margin_left && _x <= _margin_right) { var _new_tab_pos = _x - _margin_left; var mm_1_4 = 10 / 4; var mm_1_8 = mm_1_4 / 2; var _new_tab_pos = RulerCorrectPosition(_new_tab_pos, mm_1_8, mm_1_4); this.m_arrTabs[this.m_arrTabs.length] = new CTab(_new_tab_pos, word_control.m_nTabsType); word_control.UpdateHorRuler(); this.m_lCurrentTab = this.m_arrTabs.length - 1; this.DragType = 7; this.m_dCurrentTabNewPosition = _new_tab_pos; var pos = left + (_margin_left + _new_tab_pos) * 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; var lockedElement = check_MouseUpEvent(e); this.m_dIndentLeft_old = -10000; this.m_dIndentLeftFirst_old = -10000; this.m_dIndentRight_old = -10000; if (7 != this.DragType) { word_control.UpdateHorRuler(); } var _margin_left = this.m_dMarginLeft; var _margin_right = this.m_dMarginRight; if (this.CurrentObjectType == RULER_OBJECT_TYPE_TABLE) { _margin_left = this.TableMarginLeft; _margin_right = this.TableMarginRight; } switch (this.DragType) { case 1: case 2: this.SetMarginProperties(); break; case 3: case 4: case 5: case 6: this.SetPrProperties(); break; case 7: var _y = (global_mouseEvent.Y - word_control.Y) * g_dKoef_pix_to_mm; if (_y <= 3 || _y > 5.6 || this.m_dCurrentTabNewPosition < 0 || (this.m_dCurrentTabNewPosition + _margin_left) > _margin_right) { this.m_arrTabs.splice(this.m_lCurrentTab, 1); } else { this.m_arrTabs[this.m_lCurrentTab].pos = this.m_dCurrentTabNewPosition; } this.m_lCurrentTab = -1; this.CorrectTabs(); this.m_oWordControl.UpdateHorRuler(); this.SetTabsProperties(); break; case 8: this.SetTableProperties(); this.DragTablePos = -1; break; } if (7 == this.DragType) { word_control.UpdateHorRuler(); } this.IsDrawingCurTab = true; this.DragType = 0; this.m_bIsMouseDown = false; }; this.OnMouseUpExternal = function () { var word_control = this.m_oWordControl; this.m_dIndentLeft_old = -10000; this.m_dIndentLeftFirst_old = -10000; this.m_dIndentRight_old = -10000; if (7 != this.DragType) { word_control.UpdateHorRuler(); } var _margin_left = this.m_dMarginLeft; var _margin_right = this.m_dMarginRight; if (this.CurrentObjectType == RULER_OBJECT_TYPE_TABLE) { _margin_left = this.TableMarginLeft; _margin_right = this.TableMarginRight; } switch (this.DragType) { case 1: case 2: this.SetMarginProperties(); break; case 3: case 4: case 5: case 6: this.SetPrProperties(); break; case 7: var _y = (global_mouseEvent.Y - word_control.Y) * g_dKoef_pix_to_mm; if (_y <= 3 || _y > 5.6 || this.m_dCurrentTabNewPosition < 0 || (this.m_dCurrentTabNewPosition + _margin_left) > _margin_right) { this.m_arrTabs.splice(this.m_lCurrentTab, 1); } else { this.m_arrTabs[this.m_lCurrentTab].pos = this.m_dCurrentTabNewPosition; } this.m_lCurrentTab = -1; this.CorrectTabs(); this.m_oWordControl.UpdateHorRuler(); this.SetTabsProperties(); break; case 8: this.SetTableProperties(); this.DragTablePos = -1; break; } if (7 == this.DragType) { word_control.UpdateHorRuler(); } this.IsDrawingCurTab = true; this.DragType = 0; this.m_bIsMouseDown = false; }; this.SetTabsProperties = function () { var _arr = new CParaTabs(); var _c = this.m_arrTabs.length; for (var i = 0; i < _c; i++) { if (this.m_arrTabs[i].type == g_tabtype_left) { _arr.Add(new CParaTab(tab_Left, this.m_arrTabs[i].pos)); } else { if (this.m_arrTabs[i].type == g_tabtype_right) { _arr.Add(new CParaTab(tab_Right, this.m_arrTabs[i].pos)); } else { if (this.m_arrTabs[i].type == g_tabtype_center) { _arr.Add(new CParaTab(tab_Center, this.m_arrTabs[i].pos)); } } } } if (false === this.m_oWordControl.m_oLogicDocument.Document_Is_SelectionLocked(changestype_Paragraph_Properties)) { this.m_oWordControl.m_oLogicDocument.Create_NewHistoryPoint(); this.m_oWordControl.m_oLogicDocument.Set_ParagraphTabs(_arr); } }; this.SetPrProperties = function () { if (false === this.m_oWordControl.m_oLogicDocument.Document_Is_SelectionLocked(changestype_Paragraph_Properties)) { this.m_oWordControl.m_oLogicDocument.Create_NewHistoryPoint(); this.m_oWordControl.m_oLogicDocument.Set_ParagraphIndent({ Left: this.m_dIndentLeft, Right: this.m_dIndentRight, FirstLine: (this.m_dIndentLeftFirst - this.m_dIndentLeft) }); this.m_oWordControl.m_oLogicDocument.Document_UpdateInterfaceState(); } }; this.SetMarginProperties = function () { if (false === this.m_oWordControl.m_oLogicDocument.Document_Is_SelectionLocked(changestype_Document_SectPr)) { this.m_oWordControl.m_oLogicDocument.Create_NewHistoryPoint(); this.m_oWordControl.m_oLogicDocument.Set_DocumentMargin({ Left: this.m_dMarginLeft, Right: this.m_dMarginRight }); } }; this.SetTableProperties = function () { if (false === this.m_oWordControl.m_oLogicDocument.Document_Is_SelectionLocked(changestype_Table_Properties)) { this.m_oWordControl.m_oLogicDocument.Create_NewHistoryPoint(); this.m_oTableMarkup.CorrectTo(); this.m_oTableMarkup.Table.Update_TableMarkupFromRuler(this.m_oTableMarkup, true, this.DragTablePos); this.m_oTableMarkup.CorrectFrom(); this.m_oWordControl.m_oLogicDocument.Document_UpdateInterfaceState(); } }; this.BlitToMain = function (left, top, htmlElement) { var _margin_left = this.m_dMarginLeft; var _margin_right = this.m_dMarginRight; if (this.CurrentObjectType == RULER_OBJECT_TYPE_TABLE) { _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.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.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 = new Array(); 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 }; } } if (!this.IsRetina) { context.drawImage(this.m_oCanvas, 5, 0, this.m_oCanvas.width - 10, this.m_oCanvas.height, left, 0, this.m_oCanvas.width - 10, this.m_oCanvas.height); } else { context.drawImage(this.m_oCanvas, 10, 0, this.m_oCanvas.width - 20, this.m_oCanvas.height, left << 1, 0, this.m_oCanvas.width - 20, this.m_oCanvas.height); context.setTransform(2, 0, 0, 2, 0, 0); } if (!this.IsDrawAnyMarkers) { return; } var dKoef_mm_to_pix = g_dKoef_mm_to_pix * this.m_dZoom; var dCenterX = 0; var var1 = 0; var var2 = 0; var var3 = 0; var var4 = 0; var _positon_y = this.m_nBottom - 5; context.strokeStyle = "#81878F"; var2 = parseInt(1.4 * g_dKoef_mm_to_pix); var3 = parseInt(1 * g_dKoef_mm_to_pix); checker.BlitMarginLeftInd = _margin_left; checker.BlitMarginRightInd = _margin_right; context.fillStyle = "#CDD1D6"; if ((-10000 != this.m_dIndentLeft_old) && (this.m_dIndentLeft_old != this.m_dIndentLeft)) { dCenterX = left + (_margin_left + this.m_dIndentLeft_old) * dKoef_mm_to_pix; var1 = parseInt(dCenterX - 1 * g_dKoef_mm_to_pix) - 0.5; var4 = parseInt(dCenterX + 1 * g_dKoef_mm_to_pix) + 0.5; context.beginPath(); context.moveTo(var1, this.m_nBottom + 0.5); context.lineTo(var4, this.m_nBottom + 0.5); context.lineTo(var4, this.m_nBottom + 0.5 + var2); context.lineTo(var1, this.m_nBottom + 0.5 + var2); context.lineTo(var1, this.m_nBottom + 0.5); context.lineTo(var1, this.m_nBottom + 0.5 - var3); context.lineTo((var1 + var4) / 2, this.m_nBottom - var2 * 1.2); context.lineTo(var4, this.m_nBottom + 0.5 - var3); context.lineTo(var4, this.m_nBottom + 0.5); context.fill(); context.stroke(); } if ((-10000 != this.m_dIndentLeftFirst_old) && (this.m_dIndentLeftFirst_old != this.m_dIndentLeftFirst)) { dCenterX = left + (_margin_left + this.m_dIndentLeftFirst_old) * dKoef_mm_to_pix; var1 = parseInt(dCenterX - 1 * g_dKoef_mm_to_pix) - 0.5; var4 = parseInt(dCenterX + 1 * g_dKoef_mm_to_pix) + 0.5; context.beginPath(); context.moveTo(var1, this.m_nTop + 0.5); context.lineTo(var1, this.m_nTop + 0.5 - var3); context.lineTo(var4, this.m_nTop + 0.5 - var3); context.lineTo(var4, this.m_nTop + 0.5); context.lineTo((var1 + var4) / 2, this.m_nTop + var2 * 1.2); context.closePath(); context.fill(); context.stroke(); } if ((-10000 != this.m_dIndentRight_old) && (this.m_dIndentRight_old != this.m_dIndentRight)) { dCenterX = left + (_margin_right - this.m_dIndentRight_old) * dKoef_mm_to_pix; var1 = parseInt(dCenterX - 1 * g_dKoef_mm_to_pix) - 0.5; var4 = parseInt(dCenterX + 1 * g_dKoef_mm_to_pix) + 0.5; context.beginPath(); context.moveTo(var1, this.m_nBottom + 0.5); context.lineTo(var4, this.m_nBottom + 0.5); context.lineTo(var4, this.m_nBottom + 0.5 - var3); context.lineTo((var1 + var4) / 2, this.m_nBottom - var2 * 1.2); context.lineTo(var1, this.m_nBottom + 0.5 - var3); context.closePath(); context.fill(); context.stroke(); } if (-1 != this.m_lCurrentTab) { var _tab = this.m_arrTabs[this.m_lCurrentTab]; var _x = parseInt((_margin_left + _tab.pos) * dKoef_mm_to_pix) + left; var _old_w = context.lineWidth; context.lineWidth = 2; switch (_tab.type) { case g_tabtype_left: context.beginPath(); context.moveTo(_x, _positon_y); context.lineTo(_x, _positon_y + 5); context.lineTo(_x + 5, _positon_y + 5); context.stroke(); break; case g_tabtype_right: context.beginPath(); context.moveTo(_x, _positon_y); context.lineTo(_x, _positon_y + 5); context.lineTo(_x - 5, _positon_y + 5); context.stroke(); break; case g_tabtype_center: context.beginPath(); context.moveTo(_x, _positon_y); context.lineTo(_x, _positon_y + 5); context.moveTo(_x - 5, _positon_y + 5); context.lineTo(_x + 5, _positon_y + 5); context.stroke(); break; default: break; } context.lineWidth = _old_w; } 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.fillStyle = "#E7E7E7"; dCenterX = left + (_margin_left + this.m_dIndentLeft) * dKoef_mm_to_pix; var1 = parseInt(dCenterX - 1 * g_dKoef_mm_to_pix) - 0.5; var4 = parseInt(dCenterX + 1 * g_dKoef_mm_to_pix) + 0.5; context.beginPath(); context.moveTo(var1, this.m_nBottom + 0.5); context.lineTo(var4, this.m_nBottom + 0.5); context.lineTo(var4, this.m_nBottom + 0.5 + var2); context.lineTo(var1, this.m_nBottom + 0.5 + var2); context.lineTo(var1, this.m_nBottom + 0.5); context.lineTo(var1, this.m_nBottom + 0.5 - var3); context.lineTo((var1 + var4) / 2, this.m_nBottom - var2 * 1.2); context.lineTo(var4, this.m_nBottom + 0.5 - var3); context.lineTo(var4, this.m_nBottom + 0.5); context.fill(); context.stroke(); dCenterX = left + (_margin_right - this.m_dIndentRight) * dKoef_mm_to_pix; var1 = parseInt(dCenterX - 1 * g_dKoef_mm_to_pix) - 0.5; var4 = parseInt(dCenterX + 1 * g_dKoef_mm_to_pix) + 0.5; context.beginPath(); context.moveTo(var1, this.m_nBottom + 0.5); context.lineTo(var4, this.m_nBottom + 0.5); context.lineTo(var4, this.m_nBottom + 0.5 - var3); context.lineTo((var1 + var4) / 2, this.m_nBottom - var2 * 1.2); context.lineTo(var1, this.m_nBottom + 0.5 - var3); context.closePath(); context.fill(); context.stroke(); dCenterX = left + (_margin_left + this.m_dIndentLeftFirst) * dKoef_mm_to_pix; var1 = parseInt(dCenterX - 1 * g_dKoef_mm_to_pix) - 0.5; var4 = parseInt(dCenterX + 1 * g_dKoef_mm_to_pix) + 0.5; context.beginPath(); context.moveTo(var1, this.m_nTop + 0.5); context.lineTo(var1, this.m_nTop + 0.5 - var3); context.lineTo(var4, this.m_nTop + 0.5 - var3); context.lineTo(var4, this.m_nTop + 0.5); context.lineTo((var1 + var4) / 2, this.m_nTop + var2 * 1.2); context.closePath(); context.fill(); context.stroke(); } var position_default_tab = this.m_dDefaultTab; _positon_y = this.m_nBottom + 1.5; var _min_default_value = Math.max(0, this.m_dMaxTab); while (true) { if ((_margin_left + position_default_tab) > this.m_dMarginRight) { break; } if (position_default_tab < _min_default_value) { position_default_tab += this.m_dDefaultTab; continue; } var _x = parseInt((_margin_left + position_default_tab) * dKoef_mm_to_pix) + left + 0.5; context.beginPath(); context.moveTo(_x, _positon_y); context.lineTo(_x, _positon_y + 3); context.stroke(); position_default_tab += this.m_dDefaultTab; } var _len_tabs = this.m_arrTabs.length; if (0 != _len_tabs) { context.strokeStyle = "#000000"; context.lineWidth = 2; _positon_y = this.m_nBottom - 5; for (var i = 0; i < _len_tabs; i++) { var tab = this.m_arrTabs[i]; var _x = 0; if (i == this.m_lCurrentTab) { if (!this.IsDrawingCurTab) { continue; } _x = parseInt((_margin_left + this.m_dCurrentTabNewPosition) * dKoef_mm_to_pix) + left; } else { if (tab.pos < 0 || tab.pos > this.m_dMarginRight) { continue; } _x = parseInt((_margin_left + tab.pos) * dKoef_mm_to_pix) + left; } switch (tab.type) { case g_tabtype_left: context.beginPath(); context.moveTo(_x, _positon_y); context.lineTo(_x, _positon_y + 5); context.lineTo(_x + 5, _positon_y + 5); context.stroke(); break; case g_tabtype_right: context.beginPath(); context.moveTo(_x, _positon_y); context.lineTo(_x, _positon_y + 5); context.lineTo(_x - 5, _positon_y + 5); context.stroke(); break; case g_tabtype_center: context.beginPath(); context.moveTo(_x, _positon_y); context.lineTo(_x, _positon_y + 5); context.moveTo(_x - 5, _positon_y + 5); context.lineTo(_x + 5, _positon_y + 5); context.stroke(); break; default: break; } } } } }; } function CVerRuler() { this.m_oPage = null; this.m_nLeft = 0; this.m_nRight = 0; this.m_dMarginTop = 20; this.m_dMarginBottom = 250; this.m_oCanvas = null; this.m_dZoom = 1; this.DragType = 0; 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(); this.IsCanMoveMargins = true; this.m_oWordControl = null; this.IsRetina = false; this.CheckCanvas = function () { this.m_dZoom = this.m_oWordControl.m_nZoomValue / 100; this.IsRetina = this.m_oWordControl.bIsRetinaSupport; var dKoef_mm_to_pix = g_dKoef_mm_to_pix * this.m_dZoom; if (this.IsRetina) { dKoef_mm_to_pix *= 2; } var heightNew = dKoef_mm_to_pix * this.m_oPage.height_mm; var _height = 10 + heightNew; if (this.IsRetina) { _height += 10; } var _width = 5 * g_dKoef_mm_to_pix; if (this.IsRetina) { _width *= 2; } 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) { if (null == cachedPage || undefined == cachedPage) { return; } this.m_oPage = cachedPage; var height = this.CheckCanvas(); if (this.IsRetina) { height >>= 1; } if (0 == this.DragType) { this.m_dMarginTop = cachedPage.margin_top; this.m_dMarginBottom = cachedPage.margin_bottom; } var checker = this.RepaintChecker; var markup = this.m_oTableMarkup; if (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; } } } } } } checker.Height = height; checker.Type = this.CurrentObjectType; checker.BlitAttack = true; var dKoef_mm_to_pix = g_dKoef_mm_to_pix * this.m_dZoom; this.m_nLeft = (0.8 * g_dKoef_mm_to_pix) >> 0; this.m_nRight = (4.2 * g_dKoef_mm_to_pix) >> 0; var context = this.m_oCanvas.getContext("2d"); if (!this.IsRetina) { context.setTransform(1, 0, 0, 1, 0, 5); } else { context.setTransform(2, 0, 0, 2, 0, 10); } context.fillStyle = "#B0B0B0"; 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; } } } } if (bottom_margin > top_margin) { context.fillStyle = "#EDEDED"; context.fillRect(this.m_nLeft + 0.5, top_margin + 0.5, this.m_nRight - this.m_nLeft, bottom_margin - top_margin); } var intH = height >> 0; context.strokeStyle = "#929292"; context.lineWidth = 1; context.strokeRect(this.m_nLeft + 0.5, 0.5, this.m_nRight - this.m_nLeft, Math.max(intH - 1, 1)); context.beginPath(); context.moveTo(this.m_nLeft + 0.5, top_margin + 0.5); context.lineTo(this.m_nRight - 0.5, top_margin + 0.5); context.moveTo(this.m_nLeft + 0.5, bottom_margin + 0.5); context.lineTo(this.m_nRight - 0.5, bottom_margin + 0.5); context.stroke(); context.beginPath(); context.strokeStyle = "#585B5E"; context.fillStyle = "#585B5E"; var mm_1_4 = 10 * dKoef_mm_to_pix / 4; var lCount1 = ((height - top_margin) / mm_1_4) >> 0; var lCount2 = (top_margin / mm_1_4) >> 0; var middleHor = (this.m_nLeft + this.m_nRight) / 2; var part1 = 1; var part2 = 2.5; context.font = "7pt Arial"; var index = 0; var num = 0; for (var i = 1; i < lCount1; i++) { var lYPos = ((top_margin + i * mm_1_4) >> 0) + 0.5; index++; if (index == 4) { index = 0; } if (0 == index) { num++; var strNum = "" + num; var lWidthText = context.measureText(strNum).width; context.translate(middleHor, lYPos); context.rotate(-Math.PI / 2); context.fillText(strNum, -lWidthText / 2, 4); if (!this.IsRetina) { context.setTransform(1, 0, 0, 1, 0, 5); } else { context.setTransform(2, 0, 0, 2, 0, 10); } } else { if (1 == index) { context.beginPath(); context.moveTo(middleHor - part1, lYPos); context.lineTo(middleHor + part1, lYPos); context.stroke(); } else { if (2 == index) { context.beginPath(); context.moveTo(middleHor - part2, lYPos); context.lineTo(middleHor + part2, lYPos); context.stroke(); } else { context.beginPath(); context.moveTo(middleHor - part1, lYPos); context.lineTo(middleHor + part1, lYPos); context.stroke(); } } } } index = 0; num = 0; for (var i = 1; i <= lCount2; i++) { var lYPos = ((top_margin - i * mm_1_4) >> 0) + 0.5; index++; if (index == 4) { index = 0; } if (0 == index) { num++; var strNum = "" + num; var lWidthText = context.measureText(strNum).width; context.translate(middleHor, lYPos); context.rotate(-Math.PI / 2); context.fillText(strNum, -lWidthText / 2, 4); if (!this.IsRetina) { context.setTransform(1, 0, 0, 1, 0, 5); } else { context.setTransform(2, 0, 0, 2, 0, 10); } } else { if (1 == index) { context.beginPath(); context.moveTo(middleHor - part1, lYPos); context.lineTo(middleHor + part1, lYPos); context.stroke(); } else { if (2 == index) { context.beginPath(); context.moveTo(middleHor - part2, lYPos); context.lineTo(middleHor + part2, lYPos); context.stroke(); } else { context.beginPath(); context.moveTo(middleHor - part1, lYPos); context.lineTo(middleHor + part1, lYPos); context.stroke(); } } } } if ((this.CurrentObjectType == RULER_OBJECT_TYPE_TABLE) && (null != markup)) { var dKoef_mm_to_pix = g_dKoef_mm_to_pix * this.m_dZoom; 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) + 0.5; var end_dark = 0; context.fillStyle = "#B0B0B0"; context.strokeStyle = "#929292"; var _x = this.m_nLeft + 0.5; 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) + 0.5; context.fillRect(_x, start_dark, _w, Math.max(end_dark - start_dark, 7)); context.strokeRect(_x, start_dark, _w, Math.max(end_dark - start_dark, 7)); start_dark = (((markup.Rows[i].Y + markup.Rows[i].H) * dKoef_mm_to_pix) >> 0) + 0.5; } } }; this.OnMouseMove = function (left, top, e) { var word_control = this.m_oWordControl; check_MouseMoveEvent(e); 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 ((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(_y, mm_1_8, mm_1_4); 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(_y, mm_1_8, mm_1_4); 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(_y, mm_1_8, mm_1_4); 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(_y, mm_1_8, mm_1_4); 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(_y, mm_1_8, mm_1_4); 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; check_MouseDownEvent(e); 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.m_oMainContent.AbsolutePosition.L; this.DragType = this.CheckMouseType(_x, _y); 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 = check_MouseUpEvent(e); this.m_oWordControl.m_oOverlayApi.Clear(); switch (this.DragType) { case 1: case 2: this.SetMarginProperties(); break; case 3: case 4: this.SetHeaderProperties(); break; case 5: this.SetTableProperties(); this.DragTablePos = -1; break; } this.DragType = 0; }; this.OnMouseUpExternal = function () { this.m_oWordControl.m_oOverlayApi.Clear(); switch (this.DragType) { case 1: case 2: this.SetMarginProperties(); break; case 3: case 4: this.SetHeaderProperties(); break; case 5: this.SetTableProperties(); this.DragTablePos = -1; break; } this.DragType = 0; }; this.BlitToMain = function (left, top, htmlElement) { if (!this.RepaintChecker.BlitAttack && top == this.RepaintChecker.BlitTop) { return; } this.RepaintChecker.BlitTop = top; this.RepaintChecker.BlitAttack = false; htmlElement.width = htmlElement.width; var context = htmlElement.getContext("2d"); if (null != this.m_oCanvas) { if (!this.IsRetina) { context.drawImage(this.m_oCanvas, 0, 5, this.m_oCanvas.width, this.m_oCanvas.height - 10, 0, top, this.m_oCanvas.width, this.m_oCanvas.height - 10); } else { context.drawImage(this.m_oCanvas, 0, 10, this.m_oCanvas.width, this.m_oCanvas.height - 20, 0, top << 1, this.m_oCanvas.width, this.m_oCanvas.height - 20); } } }; this.SetMarginProperties = function () { if (false === this.m_oWordControl.m_oLogicDocument.Document_Is_SelectionLocked(changestype_Document_SectPr)) { this.m_oWordControl.m_oLogicDocument.Create_NewHistoryPoint(); this.m_oWordControl.m_oLogicDocument.Set_DocumentMargin({ Top: this.m_dMarginTop, Bottom: this.m_dMarginBottom }); } }; this.SetHeaderProperties = function () { if (false === this.m_oWordControl.m_oLogicDocument.Document_Is_SelectionLocked(changestype_HdrFtr)) { this.m_oWordControl.m_oLogicDocument.Create_NewHistoryPoint(); this.m_oWordControl.m_oLogicDocument.Document_SetHdrFtrBounds(this.header_top, this.header_bottom); } }; this.SetTableProperties = function () { if (false === this.m_oWordControl.m_oLogicDocument.Document_Is_SelectionLocked(changestype_Table_Properties)) { this.m_oWordControl.m_oLogicDocument.Create_NewHistoryPoint(); this.m_oTableMarkup.CorrectTo(); this.m_oTableMarkup.Table.Update_TableMarkupFromRuler(this.m_oTableMarkup, false, this.DragTablePos); this.m_oTableMarkup.CorrectFrom(); } }; }