DocumentServer/OfficeWeb/sdk/Word/Drawing/Controls.js
2015-04-28 17:59:00 +03:00

382 lines
14 KiB
JavaScript

/*
* (c) Copyright Ascensio System SIA 2010-2015
*
* This program is a free software product. You can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License (AGPL)
* version 3 as published by the Free Software Foundation. In accordance with
* Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
* that Ascensio System SIA expressly excludes the warranty of non-infringement
* of any third-party rights.
*
* This program is distributed WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
*
* You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia,
* EU, LV-1021.
*
* The interactive user interfaces in modified source and object code versions
* of the Program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU AGPL version 3.
*
* Pursuant to Section 7(b) of the License you must retain the original Product
* logo when distributing the program. Pursuant to Section 7(e) we decline to
* grant you any rights under trademark law for use of our trademarks.
*
* All the Product's GUI elements, including illustrations and icon sets, as
* well as technical writing content are licensed under the terms of the
* Creative Commons Attribution-ShareAlike 4.0 International. See the License
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
*
*/
"use strict";
function CBounds() {
this.L = 0;
this.T = 0;
this.R = 0;
this.B = 0;
this.isAbsL = false;
this.isAbsT = false;
this.isAbsR = false;
this.isAbsB = false;
this.AbsW = -1;
this.AbsH = -1;
this.SetParams = function (_l, _t, _r, _b, abs_l, abs_t, abs_r, abs_b, absW, absH) {
this.L = _l;
this.T = _t;
this.R = _r;
this.B = _b;
this.isAbsL = abs_l;
this.isAbsT = abs_t;
this.isAbsR = abs_r;
this.isAbsB = abs_b;
this.AbsW = absW;
this.AbsH = absH;
};
}
function CAbsolutePosition() {
this.L = 0;
this.T = 0;
this.R = 0;
this.B = 0;
}
var g_anchor_left = 1;
var g_anchor_top = 2;
var g_anchor_right = 4;
var g_anchor_bottom = 8;
function CControl() {
this.Bounds = new CBounds();
this.Anchor = g_anchor_left | g_anchor_top;
this.Name = null;
this.Parent = null;
this.TabIndex = null;
this.HtmlElement = null;
this.AbsolutePosition = new CBounds();
this.Resize = function (_width, _height, api) {
if ((null == this.Parent) || (null == this.HtmlElement)) {
return;
}
var _x = 0;
var _y = 0;
var _r = 0;
var _b = 0;
var hor_anchor = (this.Anchor & 5);
var ver_anchor = (this.Anchor & 10);
if (g_anchor_left == hor_anchor) {
if (this.Bounds.isAbsL) {
_x = this.Bounds.L;
} else {
_x = (this.Bounds.L * _width / 1000);
}
if (-1 != this.Bounds.AbsW) {
_r = _x + this.Bounds.AbsW;
} else {
if (this.Bounds.isAbsR) {
_r = (_width - this.Bounds.R);
} else {
_r = this.Bounds.R * _width / 1000;
}
}
} else {
if (g_anchor_right == hor_anchor) {
if (this.Bounds.isAbsR) {
_r = (_width - this.Bounds.R);
} else {
_r = (this.Bounds.R * _width / 1000);
}
if (-1 != this.Bounds.AbsW) {
_x = _r - this.Bounds.AbsW;
} else {
if (this.Bounds.isAbsL) {
_x = this.Bounds.L;
} else {
_x = this.Bounds.L * _width / 1000;
}
}
} else {
if ((g_anchor_left | g_anchor_right) == hor_anchor) {
if (this.Bounds.isAbsL) {
_x = this.Bounds.L;
} else {
_x = (this.Bounds.L * _width / 1000);
}
if (this.Bounds.isAbsR) {
_r = (_width - this.Bounds.R);
} else {
_r = (this.Bounds.R * _width / 1000);
}
} else {
_x = this.Bounds.L;
_r = this.Bounds.R;
}
}
}
if (g_anchor_top == ver_anchor) {
if (this.Bounds.isAbsT) {
_y = this.Bounds.T;
} else {
_y = (this.Bounds.T * _height / 1000);
}
if (-1 != this.Bounds.AbsH) {
_b = _y + this.Bounds.AbsH;
} else {
if (this.Bounds.isAbsB) {
_b = (_height - this.Bounds.B);
} else {
_b = this.Bounds.B * _height / 1000;
}
}
} else {
if (g_anchor_bottom == ver_anchor) {
if (this.Bounds.isAbsB) {
_b = (_height - this.Bounds.B);
} else {
_b = (this.Bounds.B * _height / 1000);
}
if (-1 != this.Bounds.AbsH) {
_y = _b - this.Bounds.AbsH;
} else {
if (this.Bounds.isAbsT) {
_y = this.Bounds.T;
} else {
_y = this.Bounds.T * _height / 1000;
}
}
} else {
if ((g_anchor_top | g_anchor_bottom) == ver_anchor) {
if (this.Bounds.isAbsT) {
_y = this.Bounds.T;
} else {
_y = (this.Bounds.T * _height / 1000);
}
if (this.Bounds.isAbsB) {
_b = (_height - this.Bounds.B);
} else {
_b = (this.Bounds.B * _height / 1000);
}
} else {
_y = this.Bounds.T;
_b = this.Bounds.B;
}
}
}
if (_r < _x) {
_r = _x;
}
if (_b < _y) {
_b = _y;
}
this.AbsolutePosition.L = _x;
this.AbsolutePosition.T = _y;
this.AbsolutePosition.R = _r;
this.AbsolutePosition.B = _b;
this.HtmlElement.style.left = ((_x * g_dKoef_mm_to_pix + 0.5) >> 0) + "px";
this.HtmlElement.style.top = ((_y * g_dKoef_mm_to_pix + 0.5) >> 0) + "px";
this.HtmlElement.style.width = (((_r - _x) * g_dKoef_mm_to_pix + 0.5) >> 0) + "px";
this.HtmlElement.style.height = (((_b - _y) * g_dKoef_mm_to_pix + 0.5) >> 0) + "px";
if (api !== undefined && api.CheckRetinaElement && api.CheckRetinaElement(this.HtmlElement)) {
var _W = ((_r - _x) * g_dKoef_mm_to_pix + 0.5) >> 0;
var _H = ((_b - _y) * g_dKoef_mm_to_pix + 0.5) >> 0;
this.HtmlElement.width = _W << 1;
this.HtmlElement.height = _H << 1;
} else {
this.HtmlElement.width = ((_r - _x) * g_dKoef_mm_to_pix + 0.5) >> 0;
this.HtmlElement.height = ((_b - _y) * g_dKoef_mm_to_pix + 0.5) >> 0;
}
};
this.GetCSS_width = function () {
return ((this.AbsolutePosition.R - this.AbsolutePosition.L) * g_dKoef_mm_to_pix + 0.5) >> 0;
};
this.GetCSS_height = function () {
return ((this.AbsolutePosition.B - this.AbsolutePosition.T) * g_dKoef_mm_to_pix + 0.5) >> 0;
};
}
function CControlContainer() {
this.Bounds = new CBounds();
this.Anchor = g_anchor_left | g_anchor_top;
this.Name = null;
this.Parent = null;
this.TabIndex = null;
this.HtmlElement = null;
this.AbsolutePosition = new CBounds();
this.Controls = [];
this.AddControl = function (ctrl) {
ctrl.Parent = this;
this.Controls[this.Controls.length] = ctrl;
};
this.Resize = function (_width, _height, api) {
if (null == this.Parent) {
this.AbsolutePosition.L = 0;
this.AbsolutePosition.T = 0;
this.AbsolutePosition.R = _width;
this.AbsolutePosition.B = _height;
if (null != this.HtmlElement) {
var lCount = this.Controls.length;
for (var i = 0; i < lCount; i++) {
this.Controls[i].Resize(_width, _height, api);
}
}
return;
}
var _x = 0;
var _y = 0;
var _r = 0;
var _b = 0;
var hor_anchor = (this.Anchor & 5);
var ver_anchor = (this.Anchor & 10);
if (g_anchor_left == hor_anchor) {
if (this.Bounds.isAbsL) {
_x = this.Bounds.L;
} else {
_x = (this.Bounds.L * _width / 1000);
}
if (-1 != this.Bounds.AbsW) {
_r = _x + this.Bounds.AbsW;
} else {
if (this.Bounds.isAbsR) {
_r = (_width - this.Bounds.R);
} else {
_r = this.Bounds.R * _width / 1000;
}
}
} else {
if (g_anchor_right == hor_anchor) {
if (this.Bounds.isAbsR) {
_r = (_width - this.Bounds.R);
} else {
_r = (this.Bounds.R * _width / 1000);
}
if (-1 != this.Bounds.AbsW) {
_x = _r - this.Bounds.AbsW;
} else {
if (this.Bounds.isAbsL) {
_x = this.Bounds.L;
} else {
_x = this.Bounds.L * _width / 1000;
}
}
} else {
if ((g_anchor_left | g_anchor_right) == hor_anchor) {
if (this.Bounds.isAbsL) {
_x = this.Bounds.L;
} else {
_x = (this.Bounds.L * _width / 1000);
}
if (this.Bounds.isAbsR) {
_r = (_width - this.Bounds.R);
} else {
_r = (this.Bounds.R * _width / 1000);
}
} else {
_x = this.Bounds.L;
_r = this.Bounds.R;
}
}
}
if (g_anchor_top == ver_anchor) {
if (this.Bounds.isAbsT) {
_y = this.Bounds.T;
} else {
_y = (this.Bounds.T * _height / 1000);
}
if (-1 != this.Bounds.AbsH) {
_b = _y + this.Bounds.AbsH;
} else {
if (this.Bounds.isAbsB) {
_b = (_height - this.Bounds.B);
} else {
_b = this.Bounds.B * _height / 1000;
}
}
} else {
if (g_anchor_bottom == ver_anchor) {
if (this.Bounds.isAbsB) {
_b = (_height - this.Bounds.B);
} else {
_b = (this.Bounds.B * _height / 1000);
}
if (-1 != this.Bounds.AbsH) {
_y = _b - this.Bounds.AbsH;
} else {
if (this.Bounds.isAbsT) {
_y = this.Bounds.T;
} else {
_y = this.Bounds.T * _height / 1000;
}
}
} else {
if ((g_anchor_top | g_anchor_bottom) == ver_anchor) {
if (this.Bounds.isAbsT) {
_y = this.Bounds.T;
} else {
_y = (this.Bounds.T * _height / 1000);
}
if (this.Bounds.isAbsB) {
_b = (_height - this.Bounds.B);
} else {
_b = (this.Bounds.B * _height / 1000);
}
} else {
_y = this.Bounds.T;
_b = this.Bounds.B;
}
}
}
if (_r < _x) {
_r = _x;
}
if (_b < _y) {
_b = _y;
}
this.AbsolutePosition.L = _x;
this.AbsolutePosition.T = _y;
this.AbsolutePosition.R = _r;
this.AbsolutePosition.B = _b;
this.HtmlElement.style.left = ((_x * g_dKoef_mm_to_pix + 0.5) >> 0) + "px";
this.HtmlElement.style.top = ((_y * g_dKoef_mm_to_pix + 0.5) >> 0) + "px";
this.HtmlElement.style.width = (((_r - _x) * g_dKoef_mm_to_pix + 0.5) >> 0) + "px";
this.HtmlElement.style.height = (((_b - _y) * g_dKoef_mm_to_pix + 0.5) >> 0) + "px";
var lCount = this.Controls.length;
for (var i = 0; i < lCount; i++) {
this.Controls[i].Resize(_r - _x, _b - _y, api);
}
};
this.GetCSS_width = function () {
return ((this.AbsolutePosition.R - this.AbsolutePosition.L) * g_dKoef_mm_to_pix + 0.5) >> 0;
};
this.GetCSS_height = function () {
return ((this.AbsolutePosition.B - this.AbsolutePosition.T) * g_dKoef_mm_to_pix + 0.5) >> 0;
};
}
function CreateControlContainer(name) {
var ctrl = new CControlContainer();
ctrl.Name = name;
ctrl.HtmlElement = document.getElementById(name);
return ctrl;
}
function CreateControl(name) {
var ctrl = new CControl();
ctrl.Name = name;
ctrl.HtmlElement = document.getElementById(name);
return ctrl;
}