DocumentServer/OfficeWeb/sdk/Word/Drawing/Rulers.js
nikolay ivanov a8be6b9e72 init repo
2014-07-05 18:22:49 +00:00

1914 lines
80 KiB
JavaScript

/*
* (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();
}
};
}