431 lines
19 KiB
JavaScript
431 lines
19 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 NewShapeTrack(presetGeom, startX, startY, theme, master, layout, slide, pageIndex) {
|
|
this.presetGeom = presetGeom;
|
|
this.startX = startX;
|
|
this.startY = startY;
|
|
this.x = null;
|
|
this.y = null;
|
|
this.extX = null;
|
|
this.extY = null;
|
|
this.arrowsCount = 0;
|
|
this.transform = new CMatrix();
|
|
this.pageIndex = pageIndex;
|
|
this.theme = theme;
|
|
ExecuteNoHistory(function () {
|
|
var style;
|
|
if (presetGeom.indexOf("WithArrow") > -1) {
|
|
presetGeom = presetGeom.substr(0, presetGeom.length - 9);
|
|
this.presetGeom = presetGeom;
|
|
this.arrowsCount = 1;
|
|
}
|
|
if (presetGeom.indexOf("WithTwoArrows") > -1) {
|
|
presetGeom = presetGeom.substr(0, presetGeom.length - 13);
|
|
this.presetGeom = presetGeom;
|
|
this.arrowsCount = 2;
|
|
}
|
|
var spDef = theme.spDef;
|
|
if (presetGeom !== "textRect") {
|
|
if (spDef && spDef.style) {
|
|
style = spDef.style.createDuplicate();
|
|
} else {
|
|
style = CreateDefaultShapeStyle(this.presetGeom);
|
|
}
|
|
} else {
|
|
style = CreateDefaultTextRectStyle();
|
|
}
|
|
var brush = theme.getFillStyle(style.fillRef.idx);
|
|
style.fillRef.Color.Calculate(theme, slide, layout, master, {
|
|
R: 0,
|
|
G: 0,
|
|
B: 0,
|
|
A: 255
|
|
});
|
|
var RGBA = style.fillRef.Color.RGBA;
|
|
if (style.fillRef.Color.color) {
|
|
if (brush.fill && (brush.fill.type === FILL_TYPE_SOLID)) {
|
|
brush.fill.color = style.fillRef.Color.createDuplicate();
|
|
}
|
|
}
|
|
var pen = theme.getLnStyle(style.lnRef.idx, style.lnRef.Color);
|
|
style.lnRef.Color.Calculate(theme, slide, layout, master);
|
|
RGBA = style.lnRef.Color.RGBA;
|
|
if (presetGeom === "textRect") {
|
|
var ln, fill;
|
|
ln = new CLn();
|
|
ln.w = 6350;
|
|
ln.Fill = new CUniFill();
|
|
ln.Fill.fill = new CSolidFill();
|
|
ln.Fill.fill.color = new CUniColor();
|
|
ln.Fill.fill.color.color = new CPrstColor();
|
|
ln.Fill.fill.color.color.id = "black";
|
|
fill = new CUniFill();
|
|
fill.fill = new CSolidFill();
|
|
fill.fill.color = new CUniColor();
|
|
fill.fill.color.color = new CSchemeColor();
|
|
fill.fill.color.color.id = 12;
|
|
pen.merge(ln);
|
|
brush.merge(fill);
|
|
}
|
|
if (this.arrowsCount > 0) {
|
|
pen.setTailEnd(new EndArrow());
|
|
pen.tailEnd.setType(LineEndType.Arrow);
|
|
pen.tailEnd.setLen(LineEndSize.Mid);
|
|
if (this.arrowsCount === 2) {
|
|
pen.setHeadEnd(new EndArrow());
|
|
pen.headEnd.setType(LineEndType.Arrow);
|
|
pen.headEnd.setLen(LineEndSize.Mid);
|
|
}
|
|
}
|
|
if (presetGeom !== "textRect") {
|
|
if (spDef && spDef.spPr) {
|
|
if (spDef.spPr.Fill) {
|
|
brush.merge(spDef.spPr.Fill);
|
|
}
|
|
if (spDef.spPr.ln) {
|
|
pen.merge(spDef.spPr.ln);
|
|
}
|
|
}
|
|
}
|
|
var geometry = CreateGeometry(presetGeom !== "textRect" ? presetGeom : "rect");
|
|
if (pen.Fill) {
|
|
pen.Fill.calculate(theme, slide, layout, master, RGBA);
|
|
}
|
|
brush.calculate(theme, slide, layout, master, RGBA);
|
|
this.isLine = this.presetGeom === "line";
|
|
this.overlayObject = new OverlayObject(geometry, 5, 5, brush, pen, this.transform);
|
|
this.shape = null;
|
|
},
|
|
this, []);
|
|
this.track = function (e, x, y) {
|
|
var real_dist_x = x - this.startX;
|
|
var abs_dist_x = Math.abs(real_dist_x);
|
|
var real_dist_y = y - this.startY;
|
|
var abs_dist_y = Math.abs(real_dist_y);
|
|
this.flipH = false;
|
|
this.flipV = false;
|
|
if (this.isLine) {
|
|
if (x < this.startX) {
|
|
this.flipH = true;
|
|
}
|
|
if (y < this.startY) {
|
|
this.flipV = true;
|
|
}
|
|
}
|
|
if (! (e.CtrlKey || e.ShiftKey) || (e.CtrlKey && !e.ShiftKey && this.isLine)) {
|
|
this.extX = abs_dist_x >= MIN_SHAPE_SIZE ? abs_dist_x : (this.isLine ? 0 : MIN_SHAPE_SIZE);
|
|
this.extY = abs_dist_y >= MIN_SHAPE_SIZE ? abs_dist_y : (this.isLine ? 0 : MIN_SHAPE_SIZE);
|
|
if (real_dist_x >= 0) {
|
|
this.x = this.startX;
|
|
} else {
|
|
this.x = abs_dist_x >= MIN_SHAPE_SIZE ? x : this.startX - this.extX;
|
|
}
|
|
if (real_dist_y >= 0) {
|
|
this.y = this.startY;
|
|
} else {
|
|
this.y = abs_dist_y >= MIN_SHAPE_SIZE ? y : this.startY - this.extY;
|
|
}
|
|
} else {
|
|
if (e.CtrlKey && !e.ShiftKey) {
|
|
if (abs_dist_x >= MIN_SHAPE_SIZE_DIV2) {
|
|
this.x = this.startX - abs_dist_x;
|
|
this.extX = 2 * abs_dist_x;
|
|
} else {
|
|
this.x = this.startX - MIN_SHAPE_SIZE_DIV2;
|
|
this.extX = MIN_SHAPE_SIZE;
|
|
}
|
|
if (abs_dist_y >= MIN_SHAPE_SIZE_DIV2) {
|
|
this.y = this.startY - abs_dist_y;
|
|
this.extY = 2 * abs_dist_y;
|
|
} else {
|
|
this.y = this.startY - MIN_SHAPE_SIZE_DIV2;
|
|
this.extY = MIN_SHAPE_SIZE;
|
|
}
|
|
} else {
|
|
if (!e.CtrlKey && e.ShiftKey) {
|
|
var new_width, new_height;
|
|
var prop_coefficient = (typeof SHAPE_ASPECTS[this.presetGeom] === "number" ? SHAPE_ASPECTS[this.presetGeom] : 1);
|
|
if (abs_dist_y === 0) {
|
|
new_width = abs_dist_x > MIN_SHAPE_SIZE ? abs_dist_x : MIN_SHAPE_SIZE;
|
|
new_height = abs_dist_x / prop_coefficient;
|
|
} else {
|
|
var new_aspect = abs_dist_x / abs_dist_y;
|
|
if (new_aspect >= prop_coefficient) {
|
|
new_width = abs_dist_x;
|
|
new_height = abs_dist_x / prop_coefficient;
|
|
} else {
|
|
new_height = abs_dist_y;
|
|
new_width = abs_dist_y * prop_coefficient;
|
|
}
|
|
}
|
|
if (new_width < MIN_SHAPE_SIZE || new_height < MIN_SHAPE_SIZE) {
|
|
var k_wh = new_width / new_height;
|
|
if (new_height < MIN_SHAPE_SIZE && new_width < MIN_SHAPE_SIZE) {
|
|
if (new_height < new_width) {
|
|
new_height = MIN_SHAPE_SIZE;
|
|
new_width = new_height * k_wh;
|
|
} else {
|
|
new_width = MIN_SHAPE_SIZE;
|
|
new_height = new_width / k_wh;
|
|
}
|
|
} else {
|
|
if (new_height < MIN_SHAPE_SIZE) {
|
|
new_height = MIN_SHAPE_SIZE;
|
|
new_width = new_height * k_wh;
|
|
} else {
|
|
new_width = MIN_SHAPE_SIZE;
|
|
new_height = new_width / k_wh;
|
|
}
|
|
}
|
|
}
|
|
this.extX = new_width;
|
|
this.extY = new_height;
|
|
if (real_dist_x >= 0) {
|
|
this.x = this.startX;
|
|
} else {
|
|
this.x = this.startX - this.extX;
|
|
}
|
|
if (real_dist_y >= 0) {
|
|
this.y = this.startY;
|
|
} else {
|
|
this.y = this.startY - this.extY;
|
|
}
|
|
if (this.isLine) {
|
|
var angle = Math.atan2(real_dist_y, real_dist_x);
|
|
if (angle >= 0 && angle <= Math.PI / 8 || angle <= 0 && angle >= -Math.PI / 8 || angle >= 7 * Math.PI / 8 && angle <= Math.PI) {
|
|
this.extY = 0;
|
|
this.y = this.startY;
|
|
} else {
|
|
if (angle >= 3 * Math.PI / 8 && angle <= 5 * Math.PI / 8 || angle <= -3 * Math.PI / 8 && angle >= -5 * Math.PI / 8) {
|
|
this.extX = 0;
|
|
this.x = this.startX;
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
var new_width, new_height;
|
|
var prop_coefficient = (typeof SHAPE_ASPECTS[this.presetGeom] === "number" ? SHAPE_ASPECTS[this.presetGeom] : 1);
|
|
if (abs_dist_y === 0) {
|
|
new_width = abs_dist_x > MIN_SHAPE_SIZE_DIV2 ? abs_dist_x * 2 : MIN_SHAPE_SIZE;
|
|
new_height = new_width / prop_coefficient;
|
|
} else {
|
|
var new_aspect = abs_dist_x / abs_dist_y;
|
|
if (new_aspect >= prop_coefficient) {
|
|
new_width = abs_dist_x * 2;
|
|
new_height = new_width / prop_coefficient;
|
|
} else {
|
|
new_height = abs_dist_y * 2;
|
|
new_width = new_height * prop_coefficient;
|
|
}
|
|
}
|
|
if (new_width < MIN_SHAPE_SIZE || new_height < MIN_SHAPE_SIZE) {
|
|
var k_wh = new_width / new_height;
|
|
if (new_height < MIN_SHAPE_SIZE && new_width < MIN_SHAPE_SIZE) {
|
|
if (new_height < new_width) {
|
|
new_height = MIN_SHAPE_SIZE;
|
|
new_width = new_height * k_wh;
|
|
} else {
|
|
new_width = MIN_SHAPE_SIZE;
|
|
new_height = new_width / k_wh;
|
|
}
|
|
} else {
|
|
if (new_height < MIN_SHAPE_SIZE) {
|
|
new_height = MIN_SHAPE_SIZE;
|
|
new_width = new_height * k_wh;
|
|
} else {
|
|
new_width = MIN_SHAPE_SIZE;
|
|
new_height = new_width / k_wh;
|
|
}
|
|
}
|
|
}
|
|
this.extX = new_width;
|
|
this.extY = new_height;
|
|
this.x = this.startX - this.extX * 0.5;
|
|
this.y = this.startY - this.extY * 0.5;
|
|
}
|
|
}
|
|
}
|
|
this.overlayObject.updateExtents(this.extX, this.extY);
|
|
this.transform.Reset();
|
|
var hc = this.extX * 0.5;
|
|
var vc = this.extY * 0.5;
|
|
global_MatrixTransformer.TranslateAppend(this.transform, -hc, -vc);
|
|
if (this.flipH) {
|
|
global_MatrixTransformer.ScaleAppend(this.transform, -1, 1);
|
|
}
|
|
if (this.flipV) {
|
|
global_MatrixTransformer.ScaleAppend(this.transform, 1, -1);
|
|
}
|
|
global_MatrixTransformer.TranslateAppend(this.transform, this.x + hc, this.y + vc);
|
|
};
|
|
this.draw = function (overlay) {
|
|
if (isRealNumber(this.pageIndex) && overlay.SetCurrentPage) {
|
|
overlay.SetCurrentPage(this.pageIndex);
|
|
}
|
|
this.overlayObject.draw(overlay);
|
|
};
|
|
this.getShape = function (bFromWord, DrawingDocument, drawingObjects) {
|
|
var shape = new CShape();
|
|
if (drawingObjects) {
|
|
shape.setDrawingObjects(drawingObjects);
|
|
}
|
|
shape.setSpPr(new CSpPr());
|
|
shape.spPr.setParent(shape);
|
|
shape.spPr.setXfrm(new CXfrm());
|
|
if (bFromWord) {
|
|
shape.setWordShape(true);
|
|
}
|
|
var xfrm = shape.spPr.xfrm;
|
|
xfrm.setParent(shape.spPr);
|
|
var x, y;
|
|
if (bFromWord) {
|
|
x = 0;
|
|
y = 0;
|
|
} else {
|
|
x = this.x;
|
|
y = this.y;
|
|
}
|
|
xfrm.setOffX(x);
|
|
xfrm.setOffY(y);
|
|
xfrm.setExtX(this.extX);
|
|
xfrm.setExtY(this.extY);
|
|
xfrm.setFlipH(this.flipH);
|
|
xfrm.setFlipV(this.flipV);
|
|
shape.setBDeleted(false);
|
|
if (this.presetGeom === "textRect") {
|
|
shape.spPr.setGeometry(CreateGeometry("rect"));
|
|
shape.spPr.geometry.setParent(shape.spPr);
|
|
var fill, ln;
|
|
if (!drawingObjects || !drawingObjects.cSld) {
|
|
shape.setStyle(CreateDefaultTextRectStyle());
|
|
fill = new CUniFill();
|
|
fill.setFill(new CSolidFill());
|
|
fill.fill.setColor(new CUniColor());
|
|
fill.fill.color.setColor(new CSchemeColor());
|
|
fill.fill.color.color.setId(12);
|
|
shape.spPr.setFill(fill);
|
|
ln = new CLn();
|
|
ln.setW(6350);
|
|
ln.setFill(new CUniFill());
|
|
ln.Fill.setFill(new CSolidFill());
|
|
ln.Fill.fill.setColor(new CUniColor());
|
|
ln.Fill.fill.color.setColor(new CPrstColor());
|
|
ln.Fill.fill.color.color.setId("black");
|
|
shape.spPr.setLn(ln);
|
|
} else {
|
|
fill = new CUniFill();
|
|
fill.setFill(new CNoFill());
|
|
shape.spPr.setFill(fill);
|
|
}
|
|
if (bFromWord) {
|
|
shape.setTextBoxContent(new CDocumentContent(shape, DrawingDocument, 0, 0, 0, 0, false, false, false));
|
|
var body_pr = new CBodyPr();
|
|
body_pr.setDefault();
|
|
shape.setBodyPr(body_pr);
|
|
} else {
|
|
shape.setTxBody(new CTextBody());
|
|
var content = new CDocumentContent(shape.txBody, DrawingDocument, 0, 0, 0, 0, false, false, true);
|
|
shape.txBody.setParent(shape);
|
|
shape.txBody.setContent(content);
|
|
var body_pr = new CBodyPr();
|
|
body_pr.setDefault();
|
|
shape.txBody.setBodyPr(body_pr);
|
|
}
|
|
} else {
|
|
shape.spPr.setGeometry(CreateGeometry(this.presetGeom));
|
|
shape.spPr.geometry.setParent(shape.spPr);
|
|
shape.setStyle(CreateDefaultShapeStyle(this.presetGeom));
|
|
if (this.arrowsCount > 0) {
|
|
var ln = new CLn();
|
|
ln.setTailEnd(new EndArrow());
|
|
ln.tailEnd.setType(LineEndType.Arrow);
|
|
ln.tailEnd.setLen(LineEndSize.Mid);
|
|
if (this.arrowsCount === 2) {
|
|
ln.setHeadEnd(new EndArrow());
|
|
ln.headEnd.setType(LineEndType.Arrow);
|
|
ln.headEnd.setLen(LineEndSize.Mid);
|
|
}
|
|
shape.spPr.setLn(ln);
|
|
}
|
|
var spDef = this.theme && this.theme.spDef;
|
|
if (spDef) {
|
|
if (spDef.style) {
|
|
shape.setStyle(spDef.style.createDuplicate());
|
|
}
|
|
if (spDef.spPr) {
|
|
if (spDef.spPr.Fill) {
|
|
shape.spPr.setFill(spDef.spPr.Fill.createDuplicate());
|
|
}
|
|
if (spDef.spPr.ln) {
|
|
if (shape.spPr.ln) {
|
|
shape.spPr.ln.merge(spDef.spPr.ln);
|
|
} else {
|
|
shape.spPr.setLn(spDef.spPr.ln.createDuplicate());
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
shape.x = this.x;
|
|
shape.y = this.y;
|
|
return shape;
|
|
};
|
|
this.getBounds = function () {
|
|
var boundsChecker = new CSlideBoundsChecker();
|
|
this.draw(boundsChecker);
|
|
var tr = this.transform;
|
|
var arr_p_x = [];
|
|
var arr_p_y = [];
|
|
arr_p_x.push(tr.TransformPointX(0, 0));
|
|
arr_p_y.push(tr.TransformPointY(0, 0));
|
|
arr_p_x.push(tr.TransformPointX(this.extX, 0));
|
|
arr_p_y.push(tr.TransformPointY(this.extX, 0));
|
|
arr_p_x.push(tr.TransformPointX(this.extX, this.extY));
|
|
arr_p_y.push(tr.TransformPointY(this.extX, this.extY));
|
|
arr_p_x.push(tr.TransformPointX(0, this.extY));
|
|
arr_p_y.push(tr.TransformPointY(0, this.extY));
|
|
arr_p_x.push(boundsChecker.Bounds.min_x);
|
|
arr_p_x.push(boundsChecker.Bounds.max_x);
|
|
arr_p_y.push(boundsChecker.Bounds.min_y);
|
|
arr_p_y.push(boundsChecker.Bounds.max_y);
|
|
boundsChecker.Bounds.min_x = Math.min.apply(Math, arr_p_x);
|
|
boundsChecker.Bounds.max_x = Math.max.apply(Math, arr_p_x);
|
|
boundsChecker.Bounds.min_y = Math.min.apply(Math, arr_p_y);
|
|
boundsChecker.Bounds.max_y = Math.max.apply(Math, arr_p_y);
|
|
boundsChecker.Bounds.posX = this.x;
|
|
boundsChecker.Bounds.posY = this.y;
|
|
boundsChecker.Bounds.extX = this.extX;
|
|
boundsChecker.Bounds.extY = this.extY;
|
|
return boundsChecker.Bounds;
|
|
};
|
|
} |