Files
DocumentServer-v-9.2.0/sdkjs/slide/Drawing/DrawingDocument.js
Yajbir Singh f1b860b25c
Some checks failed
check / markdownlint (push) Has been cancelled
check / spellchecker (push) Has been cancelled
updated
2025-12-11 19:03:17 +05:30

8043 lines
227 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* (c) Copyright Ascensio System SIA 2010-2024
*
* This program is a free software product. You can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License (AGPL)
* version 3 as published by the Free Software Foundation. In accordance with
* Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
* that Ascensio System SIA expressly excludes the warranty of non-infringement
* of any third-party rights.
*
* This program is distributed WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
*
* You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish
* street, Riga, Latvia, EU, LV-1050.
*
* The interactive user interfaces in modified source and object code versions
* of the Program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU AGPL version 3.
*
* Pursuant to Section 7(b) of the License you must retain the original Product
* logo when distributing the program. Pursuant to Section 7(e) we decline to
* grant you any rights under trademark law for use of our trademarks.
*
* All the Product's GUI elements, including illustrations and icon sets, as
* well as technical writing content are licensed under the terms of the
* Creative Commons Attribution-ShareAlike 4.0 International. See the License
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
*
*/
"use strict";
// Import
var CColor = AscCommon.CColor;
var g_oTextMeasurer = AscCommon.g_oTextMeasurer;
var global_keyboardEvent = AscCommon.global_keyboardEvent;
var global_mouseEvent = AscCommon.global_mouseEvent;
var History = AscCommon.History;
var global_MatrixTransformer = AscCommon.global_MatrixTransformer;
var g_dKoef_pix_to_mm = AscCommon.g_dKoef_pix_to_mm;
var g_dKoef_mm_to_pix = AscCommon.g_dKoef_mm_to_pix;
const thumbnailsPositionMap = AscCommon.thumbnailsPositionMap;
var FontStyle = AscFonts.FontStyle;
var g_fontApplication = AscFonts.g_fontApplication;
var ImageLoadStatus = AscFonts.ImageLoadStatus;
var FOCUS_OBJECT_THUMBNAILS = 0;
var FOCUS_OBJECT_MAIN = 1;
var FOCUS_OBJECT_NOTES = 2;
var FOCUS_OBJECT_ANIM_PANE = 3;
AscCommon.FOCUS_OBJECT_THUMBNAILS = FOCUS_OBJECT_THUMBNAILS;
AscCommon.FOCUS_OBJECT_MAIN = FOCUS_OBJECT_MAIN;
AscCommon.FOCUS_OBJECT_NOTES = FOCUS_OBJECT_NOTES;
AscCommon.FOCUS_OBJECT_ANIM_PANE = FOCUS_OBJECT_ANIM_PANE;
var COMMENT_WIDTH = 18;
var COMMENT_HEIGHT = 16;
const LAYOUT_SCALE = 0.87;
// text measurer wrapper
AscCommon.CTextMeasurer.prototype.GetAscender = function()
{
var UnitsPerEm = this.m_oManager.m_lUnits_Per_Em;
//var Ascender = this.m_oManager.m_lAscender;
var Ascender = ( 0 !== this.m_oManager.m_lLineHeight ) ? 1.2 * UnitsPerEm * this.m_oManager.m_lAscender / this.m_oManager.m_lLineHeight : this.m_oManager.m_lAscender;
return Ascender * this.m_oLastFont.SetUpSize / UnitsPerEm * g_dKoef_pt_to_mm;
};
AscCommon.CTextMeasurer.prototype.GetDescender = function()
{
var UnitsPerEm = this.m_oManager.m_lUnits_Per_Em;
//var Descender = this.m_oManager.m_lDescender;
var Descender = ( 0 !== this.m_oManager.m_lLineHeight ) ? 1.2 * UnitsPerEm * this.m_oManager.m_lDescender / this.m_oManager.m_lLineHeight : this.m_oManager.m_lDescender;
return Descender * this.m_oLastFont.SetUpSize / UnitsPerEm * g_dKoef_pt_to_mm;
};
AscCommon.CTextMeasurer.prototype.GetHeight = function()
{
var UnitsPerEm = this.m_oManager.m_lUnits_Per_Em;
//var Height = this.m_oManager.m_lLineHeight;
var Height = ( 0 !== this.m_oManager.m_lLineHeight ) ? 1.2 * UnitsPerEm : this.m_oManager.m_lLineHeight;
return Height * this.m_oLastFont.SetUpSize / UnitsPerEm * g_dKoef_pt_to_mm;
};
function CTableOutlineDr()
{
this.TableOutline = null;
this.Counter = 0;
this.bIsNoTable = true;
this.bIsTracked = false;
this.CurPos = null;
this.TrackTablePos = 0; // 0 - left_top, 1 - right_top, 2 - right_bottom, 3 - left_bottom
this.TrackOffsetX = 0;
this.TrackOffsetY = 0;
this.InlinePos = null;
this.IsChangeSmall = true;
this.ChangeSmallPoint = null;
this.TableMatrix = null;
this.CurrentPageIndex = null;
this.checkMouseDown = function (pos, word_control)
{
if (null == this.TableOutline)
return false;
var _table_track = this.TableOutline;
var _d = 13 * g_dKoef_pix_to_mm * 100 / word_control.m_nZoomValue;
this.IsChangeSmall = true;
this.ChangeSmallPoint = pos;
this.CurPos = {X: this.ChangeSmallPoint.X, Y: this.ChangeSmallPoint.Y, Page: this.ChangeSmallPoint.Page};
this.TrackOffsetX = 0;
this.TrackOffsetY = 0;
if (!this.TableMatrix || global_MatrixTransformer.IsIdentity(this.TableMatrix))
{
if (word_control.MobileTouchManager)
{
var _move_point = word_control.MobileTouchManager.TableMovePoint;
if (_move_point == null || pos.Page != _table_track.PageNum)
return false;
var _pos1 = word_control.m_oDrawingDocument.ConvertCoordsToCursorWR(pos.X, pos.Y, pos.Page);
var _pos2 = word_control.m_oDrawingDocument.ConvertCoordsToCursorWR(_move_point.X, _move_point.Y, pos.Page);
var _eps = word_control.MobileTouchManager.TrackTargetEps;
var _offset1 = word_control.MobileTouchManager.TableRulersRectOffset;
var _offset2 = _offset1 + word_control.MobileTouchManager.TableRulersRectSize;
if ((_pos1.X >= (_pos2.X - _offset2 - _eps)) && (_pos1.X <= (_pos2.X - _offset1 + _eps)) &&
(_pos1.Y >= (_pos2.Y - _offset2 - _eps)) && (_pos1.Y <= (_pos2.Y - _offset1 + _eps)))
{
this.TrackTablePos = 0;
return true;
}
return false;
}
switch (this.TrackTablePos)
{
case 1:
{
var _x = _table_track.X + _table_track.W;
var _b = _table_track.Y;
var _y = _b - _d;
var _r = _x + _d;
if ((pos.X > _x) && (pos.X < _r) && (pos.Y > _y) && (pos.Y < _b))
{
this.TrackOffsetX = pos.X - _x;
this.TrackOffsetY = pos.Y - _b;
this.CurPos.X -= this.TrackOffsetX;
this.CurPos.Y -= this.TrackOffsetY;
return true;
}
return false;
}
case 2:
{
var _x = _table_track.X + _table_track.W;
var _y = _table_track.Y + _table_track.H;
var _r = _x + _d;
var _b = _y + _d;
if ((pos.X > _x) && (pos.X < _r) && (pos.Y > _y) && (pos.Y < _b))
{
this.TrackOffsetX = pos.X - _x;
this.TrackOffsetY = pos.Y - _y;
return true;
}
return false;
}
case 3:
{
var _r = _table_track.X;
var _x = _r - _d;
var _y = _table_track.Y + _table_track.H;
var _b = _y + _d;
if ((pos.X > _x) && (pos.X < _r) && (pos.Y > _y) && (pos.Y < _b))
{
this.TrackOffsetX = pos.X - _r;
this.TrackOffsetY = pos.Y - _y;
this.CurPos.X -= this.TrackOffsetX;
this.CurPos.Y -= this.TrackOffsetY;
return true;
}
return false;
}
case 0:
default:
{
var _r = _table_track.X;
var _b = _table_track.Y;
var _x = _r - _d;
var _y = _b - _d;
if ((pos.X > _x) && (pos.X < _r) && (pos.Y > _y) && (pos.Y < _b))
{
this.TrackOffsetX = pos.X - _r;
this.TrackOffsetY = pos.Y - _b;
this.CurPos.X -= this.TrackOffsetX;
this.CurPos.Y -= this.TrackOffsetY;
return true;
}
return false;
}
}
}
else
{
if (word_control.MobileTouchManager)
{
var _invert = global_MatrixTransformer.Invert(this.TableMatrix);
var _posx = _invert.TransformPointX(pos.X, pos.Y);
var _posy = _invert.TransformPointY(pos.X, pos.Y);
var _move_point = word_control.MobileTouchManager.TableMovePoint;
if (_move_point == null || pos.Page != _table_track.PageNum)
return false;
var _koef = g_dKoef_pix_to_mm * 100 / word_control.m_nZoomValue;
var _eps = word_control.MobileTouchManager.TrackTargetEps * _koef;
var _offset1 = word_control.MobileTouchManager.TableRulersRectOffset * _koef;
var _offset2 = _offset1 + word_control.MobileTouchManager.TableRulersRectSize * _koef;
if ((_posx >= (_move_point.X - _offset2 - _eps)) && (_posx <= (_move_point.X - _offset1 + _eps)) &&
(_posy >= (_move_point.Y - _offset2 - _eps)) && (_posy <= (_move_point.Y - _offset1 + _eps)))
{
this.TrackTablePos = 0;
return true;
}
return false;
}
var _invert = global_MatrixTransformer.Invert(this.TableMatrix);
var _posx = _invert.TransformPointX(pos.X, pos.Y);
var _posy = _invert.TransformPointY(pos.X, pos.Y);
switch (this.TrackTablePos)
{
case 1:
{
var _x = _table_track.X + _table_track.W;
var _b = _table_track.Y;
var _y = _b - _d;
var _r = _x + _d;
if ((_posx > _x) && (_posx < _r) && (_posy > _y) && (_posy < _b))
{
this.TrackOffsetX = _posx - _x;
this.TrackOffsetY = _posy - _b;
this.CurPos.X -= this.TrackOffsetX;
this.CurPos.Y -= this.TrackOffsetY;
return true;
}
return false;
}
case 2:
{
var _x = _table_track.X + _table_track.W;
var _y = _table_track.Y + _table_track.H;
var _r = _x + _d;
var _b = _y + _d;
if ((_posx > _x) && (_posx < _r) && (_posy > _y) && (_posy < _b))
{
this.TrackOffsetX = _posx - _x;
this.TrackOffsetY = _posy - _y;
this.CurPos.X -= this.TrackOffsetX;
this.CurPos.Y -= this.TrackOffsetY;
return true;
}
return false;
}
case 3:
{
var _r = _table_track.X;
var _x = _r - _d;
var _y = _table_track.Y + _table_track.H;
var _b = _y + _d;
if ((_posx > _x) && (_posx < _r) && (_posy > _y) && (_posy < _b))
{
this.TrackOffsetX = _posx - _r;
this.TrackOffsetY = _posy - _y;
this.CurPos.X -= this.TrackOffsetX;
this.CurPos.Y -= this.TrackOffsetY;
return true;
}
return false;
}
case 0:
default:
{
var _r = _table_track.X;
var _b = _table_track.Y;
var _x = _r - _d;
var _y = _b - _d;
if ((_posx > _x) && (_posx < _r) && (_posy > _y) && (_posy < _b))
{
this.TrackOffsetX = _posx - _r;
this.TrackOffsetY = _posy - _b;
this.CurPos.X -= this.TrackOffsetX;
this.CurPos.Y -= this.TrackOffsetY;
return true;
}
return false;
}
}
}
return false;
};
this.checkMouseUp = function (X, Y, word_control)
{
this.bIsTracked = false;
if (null == this.TableOutline || (true === this.IsChangeSmall) || word_control.m_oApi.isViewMode)
return false;
var _d = 13 * g_dKoef_pix_to_mm * 100 / word_control.m_nZoomValue;
var _outline = this.TableOutline;
var _table = _outline.Table;
_table.MoveCursorToStartPos();
_table.Document_SetThisElementCurrent(true);
if (!_table.Is_Inline())
{
var pos;
switch (this.TrackTablePos)
{
case 1:
{
var _w_pix = this.TableOutline.W * g_dKoef_mm_to_pix * word_control.m_nZoomValue / 100;
pos = word_control.m_oDrawingDocument.ConvertCoordsFromCursor2(X - _w_pix, Y);
break;
}
case 2:
{
var _w_pix = this.TableOutline.W * g_dKoef_mm_to_pix * word_control.m_nZoomValue / 100;
var _h_pix = this.TableOutline.H * g_dKoef_mm_to_pix * word_control.m_nZoomValue / 100;
pos = word_control.m_oDrawingDocument.ConvertCoordsFromCursor2(X - _w_pix, Y - _h_pix);
break;
}
case 3:
{
var _h_pix = this.TableOutline.H * g_dKoef_mm_to_pix * word_control.m_nZoomValue / 100;
pos = word_control.m_oDrawingDocument.ConvertCoordsFromCursor2(X, Y - _h_pix);
break;
}
case 0:
default:
{
pos = word_control.m_oDrawingDocument.ConvertCoordsFromCursor2(X, Y);
break;
}
}
var NearestPos = word_control.m_oLogicDocument.Get_NearestPos(pos.Page, pos.X - this.TrackOffsetX, pos.Y - this.TrackOffsetY);
_table.Move(pos.X - this.TrackOffsetX, pos.Y - this.TrackOffsetY, pos.Page, NearestPos);
_outline.X = pos.X - this.TrackOffsetX;
_outline.Y = pos.Y - this.TrackOffsetY;
_outline.PageNum = pos.Page;
}
else
{
if (null != this.InlinePos)
{
// inline move
_table.Move(this.InlinePos.X, this.InlinePos.Y, this.InlinePos.Page, this.InlinePos);
}
}
};
this.checkMouseMove = function (X, Y, word_control)
{
if (null == this.TableOutline)
return false;
if (true === this.IsChangeSmall)
{
var _pos = word_control.m_oDrawingDocument.ConvertCoordsFromCursor2(X, Y);
var _dist = 15 * g_dKoef_pix_to_mm * 100 / word_control.m_nZoomValue;
if ((Math.abs(_pos.X - this.ChangeSmallPoint.X) < _dist) && (Math.abs(_pos.Y - this.ChangeSmallPoint.Y) < _dist) && (_pos.Page == this.ChangeSmallPoint.Page))
{
this.CurPos = {
X: this.ChangeSmallPoint.X,
Y: this.ChangeSmallPoint.Y,
Page: this.ChangeSmallPoint.Page
};
switch (this.TrackTablePos)
{
case 1:
{
this.CurPos.X -= this.TableOutline.W;
break;
}
case 2:
{
this.CurPos.X -= this.TableOutline.W;
this.CurPos.Y -= this.TableOutline.H;
break;
}
case 3:
{
this.CurPos.Y -= this.TableOutline.H;
break;
}
case 0:
default:
{
break;
}
}
this.CurPos.X -= this.TrackOffsetX;
this.CurPos.Y -= this.TrackOffsetY;
return;
}
this.IsChangeSmall = false;
this.TableOutline.Table.RemoveSelection();
this.TableOutline.Table.MoveCursorToStartPos();
editor.WordControl.m_oLogicDocument.Document_UpdateSelectionState();
}
var _d = 13 * g_dKoef_pix_to_mm * 100 / word_control.m_nZoomValue;
switch (this.TrackTablePos)
{
case 1:
{
var _w_pix = this.TableOutline.W * g_dKoef_mm_to_pix * word_control.m_nZoomValue / 100;
this.CurPos = word_control.m_oDrawingDocument.ConvertCoordsFromCursor2(X - _w_pix, Y);
break;
}
case 2:
{
var _w_pix = this.TableOutline.W * g_dKoef_mm_to_pix * word_control.m_nZoomValue / 100;
var _h_pix = this.TableOutline.H * g_dKoef_mm_to_pix * word_control.m_nZoomValue / 100;
this.CurPos = word_control.m_oDrawingDocument.ConvertCoordsFromCursor2(X - _w_pix, Y - _h_pix);
break;
}
case 3:
{
var _h_pix = this.TableOutline.H * g_dKoef_mm_to_pix * word_control.m_nZoomValue / 100;
this.CurPos = word_control.m_oDrawingDocument.ConvertCoordsFromCursor2(X, Y - _h_pix);
break;
}
case 0:
default:
{
this.CurPos = word_control.m_oDrawingDocument.ConvertCoordsFromCursor2(X, Y);
break;
}
}
this.CurPos.X -= this.TrackOffsetX;
this.CurPos.Y -= this.TrackOffsetY;
};
this.CheckStartTrack = function (word_control, transform)
{
this.TableMatrix = null;
if (transform)
this.TableMatrix = transform.CreateDublicate();
if (!this.TableMatrix || global_MatrixTransformer.IsIdentity(this.TableMatrix))
{
var pos = word_control.m_oDrawingDocument.ConvertCoordsToCursor(this.TableOutline.X, this.TableOutline.Y, this.TableOutline.PageNum, true);
var _x0 = word_control.m_oEditor.AbsolutePosition.L;
var _y0 = word_control.m_oEditor.AbsolutePosition.T;
if (pos.X < _x0 && pos.Y < _y0)
{
this.TrackTablePos = 2;
}
else if (pos.X < _x0)
{
this.TrackTablePos = 1;
}
else if (pos.Y < _y0)
{
this.TrackTablePos = 3;
}
else
{
this.TrackTablePos = 0;
}
}
else
{
var _x = this.TableOutline.X;
var _y = this.TableOutline.Y;
var _r = _x + this.TableOutline.W;
var _b = _y + this.TableOutline.H;
var x0 = transform.TransformPointX(_x, _y);
var y0 = transform.TransformPointY(_x, _y);
var x1 = transform.TransformPointX(_r, _y);
var y1 = transform.TransformPointY(_r, _y);
var x2 = transform.TransformPointX(_r, _b);
var y2 = transform.TransformPointY(_r, _b);
var x3 = transform.TransformPointX(_x, _b);
var y3 = transform.TransformPointY(_x, _b);
var _x0 = word_control.m_oEditor.AbsolutePosition.L * g_dKoef_mm_to_pix;
var _y0 = word_control.m_oEditor.AbsolutePosition.T * g_dKoef_mm_to_pix;
var _x1 = word_control.m_oEditor.AbsolutePosition.R * g_dKoef_mm_to_pix;
var _y1 = word_control.m_oEditor.AbsolutePosition.B * g_dKoef_mm_to_pix;
var pos0 = word_control.m_oDrawingDocument.ConvertCoordsToCursor(x0, y0, this.TableOutline.PageNum, true);
if (pos0.X > _x0 && pos0.X < _x1 && pos0.Y > _y0 && pos0.Y < _y1)
{
this.TrackTablePos = 0;
return;
}
pos0 = word_control.m_oDrawingDocument.ConvertCoordsToCursor(x1, y1, this.TableOutline.PageNum, true);
if (pos0.X > _x0 && pos0.X < _x1 && pos0.Y > _y0 && pos0.Y < _y1)
{
this.TrackTablePos = 1;
return;
}
pos0 = word_control.m_oDrawingDocument.ConvertCoordsToCursor(x3, y3, this.TableOutline.PageNum, true);
if (pos0.X > _x0 && pos0.X < _x1 && pos0.Y > _y0 && pos0.Y < _y1)
{
this.TrackTablePos = 3;
return;
}
pos0 = word_control.m_oDrawingDocument.ConvertCoordsToCursor(x2, y2, this.TableOutline.PageNum, true);
if (pos0.X > _x0 && pos0.X < _x1 && pos0.Y > _y0 && pos0.Y < _y1)
{
this.TrackTablePos = 2;
return;
}
this.TrackTablePos = 0;
}
};
}
function CDrawingPage()
{
this.left = 0;
this.top = 0;
this.right = 0;
this.bottom = 0;
this.cachedImage = null;
}
function CDrawingCollaborativeTarget(DrawingDocument)
{
AscCommon.CDrawingCollaborativeTargetBase.call(this);
this.Page = -1;
this.DrawingDocument = DrawingDocument;
}
CDrawingCollaborativeTarget.prototype = Object.create(AscCommon.CDrawingCollaborativeTargetBase.prototype);
CDrawingCollaborativeTarget.prototype.IsFocusOnNotes = function() {
return this.DrawingDocument.m_oWordControl.m_oLogicDocument.IsFocusOnNotes();
};
CDrawingCollaborativeTarget.prototype.GetZoom = function()
{
if(this.IsFocusOnNotes())
{
return 1.0;
}
return this.DrawingDocument.m_oWordControl.m_nZoomValue / 100;
};
CDrawingCollaborativeTarget.prototype.ConvertCoords = function(x, y)
{
if (this.IsFocusOnNotes())
{
var oNotesApi = this.DrawingDocument.m_oWordControl.m_oNotesApi;
var _offsetX = oNotesApi.OffsetX;
return { X : (AscCommon.AscBrowser.convertToRetinaValue(_offsetX) + x * g_dKoef_mm_to_pix), Y : (y * g_dKoef_mm_to_pix - oNotesApi.Scroll) };
}
return this.DrawingDocument.ConvertCoordsToCursor(x, y);
};
CDrawingCollaborativeTarget.prototype.GetMobileTouchManager = function()
{
return this.DrawingDocument.m_oWordControl.MobileTouchManager;
};
CDrawingCollaborativeTarget.prototype.GetParentElement = function()
{
if(this.IsFocusOnNotes())
{
return this.DrawingDocument.m_oWordControl.m_oNotesContainer.HtmlElement;
}
return this.DrawingDocument.m_oWordControl.m_oMainView.HtmlElement;
};
CDrawingCollaborativeTarget.prototype.CheckPosition = function(_x, _y, _size, _page, _transform)
{
this.Transform = _transform;
this.Size = _size;
this.X = _x;
this.Y = _y;
this.Page = _page;
this.Update();
};
CDrawingCollaborativeTarget.prototype.CheckStyleDisplay = function()
{
if (this.DrawingDocument.m_oWordControl.m_oApi.isReporterMode)
{
this.HtmlElement.style.display = "none";
return;
}
if (this.HtmlElement.style.display != "block")
{
this.HtmlElement.style.display = "block";
}
if (this.HtmlElement.style.zIndex != 7)
{
this.HtmlElement.style.zIndex = 7;
}
};
CDrawingCollaborativeTarget.prototype.CheckNeedDraw = function()
{
if (this.Page != this.DrawingDocument.SlideCurrent)
{
this.HtmlElement.style.display = "none";
return false;
}
return true;
};
function CDrawingDocument()
{
AscCommon.g_oHtmlCursor.register(AscCommon.Cursors.MarkerFormat, "14 8", "pointer");
AscCommon.g_oHtmlCursor.register(AscCommon.Cursors.TableEraser, "8 19", "pointer");
this.IsLockObjectsEnable = false;
// presentation
this.m_oWordControl = null;
this.m_oLogicDocument = null;
this.IsEmptyPresentation = false;
this.SlideCurrent = -1;
this.SlideCurrectRect = new CDrawingPage();
this.MasterCurrent = -1;
this.LayoutCurrent = -1;
this.isTabButtonShow = true;
// target
this.m_lTimerTargetId = -1;
this.m_dTargetX = -1;
this.m_dTargetY = -1;
this.m_dTargetSize = 1;
this.m_dTargetAscent = 0;
this.TargetHtmlElement = null;
this.TargetHtmlElementLeft = 0;
this.TargetHtmlElementTop = 0;
this.TargetHtmlElementOnSlide = true;
this.UpdateTargetFromPaint = false;
this.NeedTarget = true;
this.TextMatrix = null;
this.TargetShowFlag = false;
this.TargetShowNeedFlag = false;
this.m_lTimerUpdateTargetID = -1;
this.m_tempX = 0;
this.m_tempY = 0;
this.m_tempPageIndex = 0;
this.TargetCursorColor = {R : 0, G : 0, B : 0};
this.CollaborativeTargets = [];
this.CollaborativeTargetsUpdateTasks = [];
this.m_sLockedCursorType = "";
// select
this.m_bIsSelection = false;
this.SelectionMatrix = null;
// search
this.m_bIsSearching = false;
this.CurrentSearchNavi = null;
// tracks
this.MathTrack = new AscCommon.CMathTrack();
this.TableOutlineDr = new CTableOutlineDr();
this.HorVerAnchors = [];
this.InlineTextTrackEnabled = false;
this.InlineTextTrack = null;
this.InlineTextTrackPage = -1;
this.InlineTextInNotes = false;
this.AutoShapesTrack = null;
// draw
this.m_oCacheManager = new CCacheManager(true);
// hit
this.CanvasHit = document.createElement('canvas');
this.CanvasHit.width = 10;
this.CanvasHit.height = 10;
this.CanvasHitContext = this.CanvasHit.getContext('2d');
// interface ui
this.GuiControlColorsMap = null;
this.IsSendStandartColors = false;
this.GuiCanvasFillTextureParentId = "";
this.GuiCanvasFillTexture = null;
this.GuiCanvasFillTextureCtx = null;
this.LastDrawingUrl = "";
this.GuiCanvasFillTextureParentIdSlide = "";
this.GuiCanvasFillTextureSlide = null;
this.GuiCanvasFillTextureCtxSlide = null;
this.LastDrawingUrlSlide = "";
this.GuiCanvasFillTextureParentIdTextArt = "";
this.GuiCanvasFillTextureTextArt = null;
this.GuiCanvasFillTextureCtxTextArt = null;
this.LastDrawingUrlTextArt = "";
this.TableStylesLastTheme = null;
this.TableStylesLastColorScheme = null;
this.TableStylesLastColorMap = null;
this.TableStylesLastLook = null;
// transitions
this.TransitionSlide = new CTransitionAnimation(null);
//all images on start
this.LoadingImages = [];
// notes
this.isDrawingNotes = false;
// metafile
this.m_lCurrentRendererPage = -1;
this.m_oDocRenderer = null;
this.m_bOldShowMarks = false;
// placeholders
this.placeholders = new AscCommon.DrawingPlaceholders(this);
var oThis = this;
// methods ---
// target
this.GetSlidesCount = function()
{
return Asc.editor.getCountSlides();
};
this.MoveTargetInInputContext = function()
{
if (AscCommon.g_inputContext)
AscCommon.g_inputContext.move(this.TargetHtmlElementLeft, this.TargetHtmlElementTop);
};
this.GetTargetColor = function(isFocusOnSlide)
{
if (false !== isFocusOnSlide)
return this.TargetCursorColor;
// check dark theme
if (AscCommon.GlobalSkin.Type !== "dark" || (this.TargetCursorColor.R > 10 || this.TargetCursorColor.R > 10 || this.TargetCursorColor.R > 10))
return this.TargetCursorColor;
return { R : 255 - this.TargetCursorColor.R, G : 255 - this.TargetCursorColor.G, B : 255 - this.TargetCursorColor.B };
};
this.SetTargetColor = function(r, g, b)
{
this.TargetCursorColor.R = r;
this.TargetCursorColor.G = g;
this.TargetCursorColor.B = b;
};
this.SetCursorType = function(sType, Data)
{
let elem = this.m_oWordControl.m_oMainContent.HtmlElement;
if (this.m_oWordControl.DemonstrationManager.Mode)
elem = this.m_oWordControl.DemonstrationManager.Canvas;
if ("" === this.m_sLockedCursorType)
{
elem.style.cursor = AscCommon.g_oHtmlCursor.value(sType);
}
else
elem.style.cursor = AscCommon.g_oHtmlCursor.value(this.m_sLockedCursorType);
if ("undefined" === typeof(Data) || null === Data)
Data = new AscCommon.CMouseMoveData();
editor.sync_MouseMoveCallback(Data);
};
this.LockCursorType = function(sType)
{
this.m_sLockedCursorType = sType;
this.m_oWordControl.m_oMainContent.HtmlElement.style.cursor = AscCommon.g_oHtmlCursor.value(this.m_sLockedCursorType);
};
this.LockCursorTypeCur = function()
{
this.m_sLockedCursorType = this.m_oWordControl.m_oMainContent.HtmlElement.style.cursor;
};
this.UnlockCursorType = function()
{
this.m_sLockedCursorType = "";
};
this.TargetStart = function()
{
if (this.m_lTimerTargetId != -1)
clearInterval(this.m_lTimerTargetId);
this.m_lTimerTargetId = setInterval(oThis.DrawTarget, 500);
};
this.TargetEnd = function()
{
if (!this.TargetShowFlag)
return;
this.TargetShowFlag = false;
this.TargetShowNeedFlag = false;
clearInterval(this.m_lTimerTargetId);
this.m_lTimerTargetId = -1;
this.TargetHtmlElement.style.display = "none";
};
this.UpdateTargetNoAttack = function()
{
if (null == this.m_oWordControl)
return;
this.CheckTargetDraw(this.m_dTargetX, this.m_dTargetY, !this.m_oLogicDocument.IsFocusOnNotes());
};
this.CheckTargetDraw = function(x, y, isFocusOnSlide)
{
function roundPxForScale(value) {
return ((value * AscCommon.AscBrowser.retinaPixelRatio) >> 0) / AscCommon.AscBrowser.retinaPixelRatio;
}
var isReporter = this.m_oWordControl.m_oApi.isReporterMode;
if (this.TargetHtmlElementOnSlide != isFocusOnSlide)
{
if (this.TargetHtmlElementOnSlide)
{
this.m_oWordControl.m_oMainView.HtmlElement.removeChild(this.TargetHtmlElement);
this.m_oWordControl.m_oNotesContainer.HtmlElement.appendChild(this.TargetHtmlElement);
this.TargetHtmlElement.style.zIndex = isReporter ? 0 : 9;
AscCommon.g_inputContext.TargetOffsetY = (this.m_oWordControl.m_oNotesContainer.AbsolutePosition.T * AscCommon.g_dKoef_mm_to_pix) >> 0;
}
else
{
this.m_oWordControl.m_oNotesContainer.HtmlElement.removeChild(this.TargetHtmlElement);
this.m_oWordControl.m_oMainView.HtmlElement.appendChild(this.TargetHtmlElement);
this.TargetHtmlElement.style.zIndex = isReporter ? 0 : 9;
AscCommon.g_inputContext.TargetOffsetY = 0;
}
this.TargetHtmlElementOnSlide = isFocusOnSlide;
}
else if (!this.TargetHtmlElementOnSlide)
{
AscCommon.g_inputContext.TargetOffsetY = (this.m_oWordControl.m_oNotesContainer.AbsolutePosition.T * AscCommon.g_dKoef_mm_to_pix) >> 0;
}
var targetZoom = isFocusOnSlide ? this.m_oWordControl.m_nZoomValue : 100;
var oldW = this.TargetHtmlElement.width;
var oldH = this.TargetHtmlElement.height;
var newW = 2;
var newH = (this.m_dTargetSize * targetZoom * g_dKoef_mm_to_pix / 100) >> 0;
this.TargetHtmlElement.style.transformOrigin = "top left";
if (oldW !== newW || oldH !== newH)
{
var pixNewW = roundPxForScale(newW);
this.TargetHtmlElement.style.width = pixNewW + "px";
this.TargetHtmlElement.style.height = newH + "px";
this.TargetHtmlElement.oldColor = null;
}
var oldColor = this.TargetHtmlElement.oldColor;
var newColor = this.GetTargetColor(isFocusOnSlide);
if (!oldColor ||
oldColor.R !== newColor.R ||
oldColor.G !== newColor.G ||
oldColor.B !== newColor.B)
{
this.TargetHtmlElement.style.backgroundColor = "rgb(" + newColor.R + "," + newColor.G + "," + newColor.B + ")";
this.TargetHtmlElement.oldColor = { R : newColor.R, G : newColor.G, B : newColor.B };
}
if (null == this.TextMatrix || global_MatrixTransformer.IsIdentity2(this.TextMatrix))
{
if (null != this.TextMatrix)
{
x += this.TextMatrix.tx;
y += this.TextMatrix.ty;
}
var pos = this.ConvertCoordsToCursor(x, y);
if (!isFocusOnSlide)
{
pos.X = x * g_dKoef_mm_to_pix + AscCommon.AscBrowser.convertToRetinaValue(this.m_oWordControl.m_oNotesApi.OffsetX);
pos.Y = y * g_dKoef_mm_to_pix - this.m_oWordControl.m_oNotesApi.Scroll;
}
this.TargetHtmlElementLeft = roundPxForScale(pos.X);
this.TargetHtmlElementTop = roundPxForScale(pos.Y);
this.TargetHtmlElement.style["transform"] = "";
this.TargetHtmlElement.style["msTransform"] = "";
this.TargetHtmlElement.style["mozTransform"] = "";
this.TargetHtmlElement.style["webkitTransform"] = "";
if ((!this.m_oWordControl.m_oApi.isMobileVersion && !AscCommon.AscBrowser.isSafariMacOs) || !AscCommon.AscBrowser.isWebkit)
{
this.TargetHtmlElement.style.left = this.TargetHtmlElementLeft + "px";
this.TargetHtmlElement.style.top = this.TargetHtmlElementTop + "px";
}
else
{
this.TargetHtmlElement.style.left = "0px";
this.TargetHtmlElement.style.top = "0px";
this.TargetHtmlElement.style["webkitTransform"] = "matrix(1, 0, 0, 1, " + oThis.TargetHtmlElementLeft + "," + oThis.TargetHtmlElementTop + ")";
}
}
else
{
var x1 = this.TextMatrix.TransformPointX(x, y);
var y1 = this.TextMatrix.TransformPointY(x, y);
var pos1 = this.ConvertCoordsToCursor(x1, y1);
pos1.X -= (newW / 2);
this.TargetHtmlElementLeft = pos1.X >> 0;
this.TargetHtmlElementTop = pos1.Y >> 0;
var transform = "matrix(" + this.TextMatrix.sx + ", " + this.TextMatrix.shy + ", " + this.TextMatrix.shx + ", " +
this.TextMatrix.sy + ", " + pos1.X + ", " + pos1.Y + ")";
this.TargetHtmlElement.style.left = "0px";
this.TargetHtmlElement.style.top = "0px";
this.TargetHtmlElement.style["transform"] = transform;
this.TargetHtmlElement.style["msTransform"] = transform;
this.TargetHtmlElement.style["mozTransform"] = transform;
this.TargetHtmlElement.style["webkitTransform"] = transform;
}
this.MoveTargetInInputContext();
};
this.UpdateTarget = function(x, y, pageIndex)
{
if (this.m_oWordControl)
this.m_oWordControl.m_oApi.checkLastWork();
this.m_oWordControl.m_oLogicDocument.Set_TargetPos(x, y, pageIndex);
if (pageIndex != this.SlideCurrent && !this.m_oWordControl.DemonstrationManager.Mode)
{
// сначала выставим страницу
this.m_oWordControl.GoToPage(pageIndex);
}
if (this.UpdateTargetFromPaint === false)
{
this.UpdateTargetCheck = true;
return;
}
var isTargetOnNotes = this.m_oLogicDocument.IsFocusOnNotes();
var targetZoom = isTargetOnNotes ? 100 : this.m_oWordControl.m_nZoomValue;
/// detect need scrolling
var targetSize = Number(this.m_dTargetSize * targetZoom * g_dKoef_mm_to_pix / 100);
var pos = null;
var _x = x;
var _y = y;
if (this.TextMatrix)
{
_x = this.TextMatrix.TransformPointX(x, y);
_y = this.TextMatrix.TransformPointY(x, y);
}
this.m_dTargetX = x;
this.m_dTargetY = y;
if (!isTargetOnNotes)
{
// focus ton slide
pos = this.ConvertCoordsToCursor(_x, _y);
var _ww = this.m_oWordControl.m_oEditor.HtmlElement.width;
var _hh = this.m_oWordControl.m_oEditor.HtmlElement.height;
_ww /= AscCommon.AscBrowser.retinaPixelRatio;
_hh /= AscCommon.AscBrowser.retinaPixelRatio;
var boxX = 0;
var boxY = 0;
var boxR = _ww - 2;
var boxB = _hh - targetSize;
var nValueScrollHor = 0;
if (pos.X < boxX)
{
nValueScrollHor = (this.m_oWordControl.m_dScrollX + pos.X - boxX) >> 0;
}
if (pos.X > boxR)
{
nValueScrollHor = (this.m_oWordControl.m_dScrollX + pos.X - boxR) >> 0;
}
var nValueScrollVer = 0;
if (pos.Y < boxY)
{
nValueScrollVer = (this.m_oWordControl.m_dScrollY + pos.Y - boxY) >> 0;
}
if (pos.Y > boxB)
{
nValueScrollVer = (this.m_oWordControl.m_dScrollY + pos.Y - boxB) >> 0;
}
/// check scroll
var isNeedScroll = false;
if (0 != nValueScrollHor && this.m_oWordControl.m_oScrollHorApi)
{
isNeedScroll = true;
this.m_oWordControl.m_bIsUpdateTargetNoAttack = true;
if (nValueScrollHor > this.m_oWordControl.m_dScrollX_max)
nValueScrollHor = this.m_oWordControl.m_dScrollX_max;
if (0 > nValueScrollHor)
nValueScrollHor = 0;
if (this.m_oWordControl.m_oTimerScrollSelect == -1)
this.m_oWordControl.m_oScrollHorApi.scrollToX(nValueScrollHor, false);
}
if (0 != nValueScrollVer)
{
isNeedScroll = true;
this.m_oWordControl.m_bIsUpdateTargetNoAttack = true;
if (nValueScrollVer > this.m_oWordControl.SlideScrollMAX)
nValueScrollVer = this.m_oWordControl.SlideScrollMAX - 1;
if (this.m_oWordControl.SlideScrollMIN > nValueScrollVer)
nValueScrollVer = this.m_oWordControl.SlideScrollMIN;
if (this.m_oWordControl.m_oTimerScrollSelect == -1)
this.m_oWordControl.m_oScrollVerApi.scrollToY(nValueScrollVer, false);
}
if (true == isNeedScroll)
{
this.m_oWordControl.m_bIsUpdateTargetNoAttack = true;
this.m_oWordControl.OnScroll();
return;
}
}
else if (this.m_oWordControl.m_oNotesApi)
{
var yPos = _y * g_dKoef_mm_to_pix - this.m_oWordControl.m_oNotesApi.Scroll;
var _hh = this.m_oWordControl.m_oNotes.HtmlElement.height;
_hh /= AscCommon.AscBrowser.retinaPixelRatio;
var boxY = 0;
var targetSizeAscent = (this.m_dTargetAscent * g_dKoef_mm_to_pix) >> 0;
var boxB = _hh - (targetSize - targetSizeAscent);
if (boxB < 0)
boxB = _hh;
yPos += targetSizeAscent;
var nValueScrollVer = 0;
if (yPos < boxY)
{
nValueScrollVer = (this.m_oWordControl.m_oNotesApi.Scroll + yPos - boxY) >> 0;
}
if (yPos > boxB)
{
nValueScrollVer = (this.m_oWordControl.m_oNotesApi.Scroll + yPos - boxB) >> 0;
}
/// check scroll
if (0 != nValueScrollVer)
{
this.m_oWordControl.m_bIsUpdateTargetNoAttack = true;
this.m_oWordControl.m_oScrollNotes_.scrollToY(nValueScrollVer, false);
this.m_oWordControl.OnScroll();
return;
}
}
this.CheckTargetDraw(x, y, !isTargetOnNotes);
};
this.SetTargetSize = function(size, ascent)
{
this.m_dTargetSize = size;
this.m_dTargetAscent = (undefined === ascent) ? 0 : ascent;
};
this.DrawTarget = function()
{
let isNeedTarget = (0 != oThis.GetSlidesCount()) && oThis.NeedTarget && !oThis.TransitionSlide.IsPlaying();
let isShow = false;
if (isNeedTarget)
{
let api = oThis.m_oWordControl.m_oApi;
if (api.isBlurEditor)
isShow = true;
else if (api.isViewMode || api.isRestrictionView())
isShow = true;
else if ("block" !== oThis.TargetHtmlElement.style.display)
isShow = true;
}
oThis.TargetHtmlElement.style.display = isShow ? "block" : "none";
};
this.isDrawTargetGlass = function()
{
let isActive = true;
let api = oThis.m_oWordControl.m_oApi;
if (api.isBlurEditor)
isActive = false;
else if (api.isViewMode || api.isRestrictionView())
isActive = false;
if (-1 === this.m_lTimerTargetId)
isActive = false;
return isActive;
};
this.TargetShow = function()
{
this.TargetShowNeedFlag = true;
};
this.CheckTargetShow = function()
{
if (this.TargetShowFlag && this.TargetShowNeedFlag)
{
this.TargetHtmlElement.style.display = "block";
this.TargetShowNeedFlag = false;
return;
}
if (!this.TargetShowNeedFlag)
return;
this.TargetShowNeedFlag = false;
if (-1 == this.m_lTimerTargetId)
this.TargetStart();
if (oThis.NeedTarget)
this.TargetHtmlElement.style.display = "block";
this.TargetShowFlag = true;
};
this.UpdateTargetTransform = function(matrix)
{
this.TextMatrix = matrix;
};
this.MultiplyTargetTransform = function (matrix)
{
if (!this.TextMatrix)
this.TextMatrix = matrix;
else if (matrix)
{
this.TextMatrix.Multiply(matrix, AscCommon.MATRIX_ORDER_PREPEND);
}
};
// select
this.SelectEnabled = function(bIsEnabled)
{
this.m_bIsSelection = bIsEnabled;
if (false === this.m_bIsSelection)
{
this.SelectClear();
this.m_oWordControl.OnUpdateOverlay();
this.m_oWordControl.m_oOverlayApi.m_oContext.globalAlpha = 1.0;
}
};
this.SelectClear = function()
{
this.m_oWordControl.OnUpdateOverlay();
};
this.AddPageSelection = function(pageIndex, x, y, width, height)
{
if (null == this.SelectionMatrix)
this.SelectionMatrix = this.TextMatrix;
if (pageIndex < 0 || pageIndex != this.SlideCurrent || Math.abs(width) < 0.001 || Math.abs(height) < 0.001)
return;
var dPR = AscCommon.AscBrowser.retinaPixelRatio;
var xDst = this.SlideCurrectRect.left * dPR;
var yDst = this.SlideCurrectRect.top * dPR;
var wDst = (this.SlideCurrectRect.right - this.SlideCurrectRect.left) * dPR;
var hDst = (this.SlideCurrectRect.bottom - this.SlideCurrectRect.top) * dPR;
var indent = 0.5 * Math.round(dPR);
var dKoefX = wDst / this.m_oLogicDocument.GetWidthMM();
var dKoefY = hDst / this.m_oLogicDocument.GetHeightMM();
var overlay = this.m_oWordControl.m_oOverlayApi;
if (this.m_oWordControl.IsNotesSupported() && this.m_oWordControl.m_oNotesApi && this.m_oLogicDocument.IsFocusOnNotes())
{
overlay = this.m_oWordControl.m_oNotesApi.m_oOverlayApi;
xDst = this.m_oWordControl.m_oNotesApi.OffsetX;
yDst = -dPR * this.m_oWordControl.m_oNotesApi.Scroll;
dKoefX = g_dKoef_mm_to_pix * dPR;
dKoefY = g_dKoef_mm_to_pix * dPR;
}
if (null == this.TextMatrix || global_MatrixTransformer.IsIdentity(this.TextMatrix))
{
var _x = ((xDst + dKoefX * x + indent) >> 0) - indent;
var _y = ((yDst + dKoefY * y + indent) >> 0) - indent;
var _r = ((xDst + dKoefX * (x + width) + indent) >> 0) - indent;
var _b = ((yDst + dKoefY * (y + height) + indent) >> 0) - indent;
if (_x < overlay.min_x)
overlay.min_x = _x;
if (_r > overlay.max_x)
overlay.max_x = _r;
if (_y < overlay.min_y)
overlay.min_y = _y;
if (_b > overlay.max_y)
overlay.max_y = _b;
overlay.m_oContext.rect(_x, _y, _r - _x + 1, _b - _y + 1);
}
else
{
var _x1 = this.TextMatrix.TransformPointX(x, y);
var _y1 = this.TextMatrix.TransformPointY(x, y);
var _x2 = this.TextMatrix.TransformPointX(x + width, y);
var _y2 = this.TextMatrix.TransformPointY(x + width, y);
var _x3 = this.TextMatrix.TransformPointX(x + width, y + height);
var _y3 = this.TextMatrix.TransformPointY(x + width, y + height);
var _x4 = this.TextMatrix.TransformPointX(x, y + height);
var _y4 = this.TextMatrix.TransformPointY(x, y + height);
var x1 = xDst + dKoefX * _x1;
var y1 = yDst + dKoefY * _y1;
var x2 = xDst + dKoefX * _x2;
var y2 = yDst + dKoefY * _y2;
var x3 = xDst + dKoefX * _x3;
var y3 = yDst + dKoefY * _y3;
var x4 = xDst + dKoefX * _x4;
var y4 = yDst + dKoefY * _y4;
if (global_MatrixTransformer.IsIdentity2(this.TextMatrix))
{
x1 = (x1 >> 0) + indent;
y1 = (y1 >> 0) + indent;
x2 = (x2 >> 0) + indent;
y2 = (y2 >> 0) + indent;
x3 = (x3 >> 0) + indent;
y3 = (y3 >> 0) + indent;
x4 = (x4 >> 0) + indent;
y4 = (y4 >> 0) + indent;
}
overlay.CheckPoint(x1, y1);
overlay.CheckPoint(x2, y2);
overlay.CheckPoint(x3, y3);
overlay.CheckPoint(x4, y4);
var ctx = overlay.m_oContext;
ctx.moveTo(x1, y1);
ctx.lineTo(x2, y2);
ctx.lineTo(x3, y3);
ctx.lineTo(x4, y4);
ctx.closePath();
}
};
this.SelectShow = function()
{
this.m_oWordControl.OnUpdateOverlay();
};
this.OnSelectEnd = function()
{
};
// search
this.SearchClear = function()
{
let SlidesCount = this.GetSlidesCount();
for (var i = 0; i < SlidesCount; i++)
{
this.Slide.searchingArray.splice(0, this.Slide.searchingArray.length);
}
this.m_oWordControl.m_oOverlayApi.Clear();
this.m_bIsSearching = false;
this.CurrentSearchNavi = null;
};
this.AddPageSearch = function(findText, rects)
{
var _len = rects.length;
if (_len == 0)
return;
if (this.m_oWordControl.m_oOverlay.HtmlElement.style.display == "none")
{
this.m_oWordControl.ShowOverlay();
this.m_oWordControl.m_oOverlayApi.m_oContext.globalAlpha = 0.2;
}
var navigator = {Page : rects[0].PageNum, Place : rects.slice(0, _len)};
var _find = {text : findText, navigator : navigator};
this.m_oWordControl.m_oApi.sync_SearchFoundCallback(_find);
var is_update = false;
var _pages = this.m_oLogicDocument.Slides;
for (var i = 0; i < _len; i++)
{
var r = rects[i];
_pages[r.PageNum].searchingArray[_pages[r.PageNum].searchingArray.length] = r;
if (r.PageNum >= this.m_lDrawingFirst && r.PageNum <= this.m_lDrawingEnd)
is_update = true;
}
if (is_update)
this.m_oWordControl.OnUpdateOverlay();
};
this.StartSearch = function()
{
this.SearchClear();
if (this.m_bIsSelection)
this.m_oWordControl.OnUpdateOverlay();
this.m_bIsSearching = true;
this.CurrentSearchNavi = null;
};
this.EndSearch = function(bIsChange)
{
if (bIsChange)
{
this.SearchClear();
this.m_bIsSearching = false;
this.m_oWordControl.OnUpdateOverlay();
}
else
{
this.m_bIsSearching = true;
this.m_oWordControl.OnUpdateOverlay();
}
this.m_oWordControl.m_oApi.sync_SearchEndCallback();
};
this.DrawSearch = function(overlay)
{
var xDst = this.SlideCurrectRect.left;
var yDst = this.SlideCurrectRect.top;
var wDst = this.SlideCurrectRect.right - this.SlideCurrectRect.left;
var hDst = this.SlideCurrectRect.bottom - this.SlideCurrectRect.top;
var dKoefX = wDst / this.m_oLogicDocument.GetWidthMM();
var dKoefY = hDst / this.m_oLogicDocument.GetHeightMM();
var ctx = overlay.m_oContext;
var searchingArray = this.m_oLogicDocument.Slides[this.SlideCurrent].searchingArray;
for (var i = 0; i < searchingArray.length; i++)
{
var place = searchingArray[i];
if (undefined === place.Ex)
{
var _x = ((xDst + dKoefX * place.X) >> 0) - 0.5;
var _y = ((yDst + dKoefY * place.Y) >> 0) - 0.5;
var _w = ((dKoefX * place.W) >> 0) + 1;
var _h = ((dKoefY * place.H) >> 0) + 1;
if (_x < overlay.min_x)
overlay.min_x = _x;
if ((_x + _w) > overlay.max_x)
overlay.max_x = _x + _w;
if (_y < overlay.min_y)
overlay.min_y = _y;
if ((_y + _h) > overlay.max_y)
overlay.max_y = _y + _h;
ctx.rect(_x, _y, _w, _h);
}
else
{
var _x1 = (xDst + dKoefX * place.X) >> 0;
var _y1 = (yDst + dKoefY * place.Y) >> 0;
var x2 = place.X + place.W * place.Ex;
var y2 = place.Y + place.W * place.Ey;
var _x2 = (xDst + dKoefX * x2) >> 0;
var _y2 = (yDst + dKoefY * y2) >> 0;
var x3 = x2 - place.H * place.Ey;
var y3 = y2 + place.H * place.Ex;
var _x3 = (xDst + dKoefX * x3) >> 0;
var _y3 = (yDst + dKoefY * y3) >> 0;
var x4 = place.X - place.H * place.Ey;
var y4 = place.Y + place.H * place.Ex;
var _x4 = (xDst + dKoefX * x4) >> 0;
var _y4 = (yDst + dKoefY * y4) >> 0;
overlay.CheckPoint(_x1, _y1);
overlay.CheckPoint(_x2, _y2);
overlay.CheckPoint(_x3, _y3);
overlay.CheckPoint(_x4, _y4);
ctx.moveTo(_x1, _y1);
ctx.lineTo(_x2, _y2);
ctx.lineTo(_x3, _y3);
ctx.lineTo(_x4, _y4);
ctx.lineTo(_x1, _y1);
}
}
};
this.DrawSearchCur = function(overlay, place)
{
var xDst = this.SlideCurrectRect.left;
var yDst = this.SlideCurrectRect.top;
var wDst = this.SlideCurrectRect.right - this.SlideCurrectRect.left;
var hDst = this.SlideCurrectRect.bottom - this.SlideCurrectRect.top;
var dKoefX = wDst / this.m_oLogicDocument.GetWidthMM();
var dKoefY = hDst / this.m_oLogicDocument.GetHeightMM();
var ctx = overlay.m_oContext;
if (undefined === place.Ex)
{
var _x = ((xDst + dKoefX * place.X) >> 0) - 0.5;
var _y = ((yDst + dKoefY * place.Y) >> 0) - 0.5;
var _w = ((dKoefX * place.W) >> 0) + 1;
var _h = ((dKoefY * place.H) >> 0) + 1;
if (_x < overlay.min_x)
overlay.min_x = _x;
if ((_x + _w) > overlay.max_x)
overlay.max_x = _x + _w;
if (_y < overlay.min_y)
overlay.min_y = _y;
if ((_y + _h) > overlay.max_y)
overlay.max_y = _y + _h;
ctx.rect(_x, _y, _w, _h);
}
else
{
var _x1 = (xDst + dKoefX * place.X) >> 0;
var _y1 = (yDst + dKoefY * place.Y) >> 0;
var x2 = place.X + place.W * place.Ex;
var y2 = place.Y + place.W * place.Ey;
var _x2 = (xDst + dKoefX * x2) >> 0;
var _y2 = (yDst + dKoefY * y2) >> 0;
var x3 = x2 - place.H * place.Ey;
var y3 = y2 + place.H * place.Ex;
var _x3 = (xDst + dKoefX * x3) >> 0;
var _y3 = (yDst + dKoefY * y3) >> 0;
var x4 = place.X - place.H * place.Ey;
var y4 = place.Y + place.H * place.Ex;
var _x4 = (xDst + dKoefX * x4) >> 0;
var _y4 = (yDst + dKoefY * y4) >> 0;
overlay.CheckPoint(_x1, _y1);
overlay.CheckPoint(_x2, _y2);
overlay.CheckPoint(_x3, _y3);
overlay.CheckPoint(_x4, _y4);
ctx.moveTo(_x1, _y1);
ctx.lineTo(_x2, _y2);
ctx.lineTo(_x3, _y3);
ctx.lineTo(_x4, _y4);
ctx.lineTo(_x1, _y1);
}
};
// recalculate
this.OnStartRecalculate = function(pageCount)
{
if (this.m_oWordControl)
this.m_oWordControl.m_oApi.checkLastWork();
};
this.OnRecalculateSlide = function(index)
{
let thpages = this.m_oWordControl.Thumbnails.m_arrPages;
if (thpages.length > index)
{
thpages[index].IsRecalc = true;
}
if (this.m_oWordControl && this.m_oWordControl.MobileTouchManager)
{
this.m_oWordControl.MobileTouchManager.ClearContextMenu();
}
if (this.TransitionSlide && this.TransitionSlide.IsPlaying())
this.TransitionSlide.End(true);
editor.sendEvent("asc_onDocumentChanged");
if (true === this.m_bIsSearching)
{
this.SearchClear();
this.m_oWordControl.OnUpdateOverlay();
this.SendChangeDocumentToApi(true);
}
if (index === this.SlideCurrent)
{
this.m_oWordControl.Thumbnails.LockMainObjType = true;
// так как серега посылает по сто раз - делаем такую заглушку ---------------------
this.m_oWordControl.SlideDrawer.CheckSlide(this.SlideCurrent);
this.m_oWordControl.CalculateDocumentSize(false);
// --------------------------------------------------------------------------------
this.m_oWordControl.OnScroll();
this.m_oWordControl.Thumbnails.LockMainObjType = false;
}
if(Asc.editor.isSlideShow())
{
let oDemonstration = Asc.editor.getDemoManager();
if(oDemonstration && oDemonstration.SlideNum === index)
{
oDemonstration.Redraw();
}
}
};
this.OnEndRecalculate = function()
{
if (this.m_oWordControl)
this.m_oWordControl.m_oApi.checkLastWork();
this.m_oWordControl.Thumbnails.LockMainObjType = true;
this.SlidesCount = this.m_oLogicDocument.GetSlidesCount();
this.m_oWordControl.CalculateDocumentSize();
this.m_oWordControl.m_oApi.sync_countPagesCallback(this.SlidesCount);
this.m_oWordControl.Thumbnails.LockMainObjType = false;
};
this.UpdateThumbnailsAttack = function()
{
this.m_oWordControl.Thumbnails.RecalculateAll();
};
this.ChangePageAttack = function(pageIndex)
{
if (pageIndex != this.SlideCurrent)
return;
this.StopRenderingPage(pageIndex);
this.m_oWordControl.OnScroll();
};
this.StopRenderingPage = function(pageIndex)
{
return;
};
this.ClearCachePages = function()
{
if (this.m_oWordControl.m_oApi.bInit_word_control && 0 <= this.SlideCurrent)
this.m_oWordControl.SlideDrawer.CheckSlide(this.SlideCurrent);
};
this.FirePaint = function()
{
//this.m_oWordControl.OnScroll();
this.m_oWordControl.Thumbnails.LockMainObjType = true;
// так как серега посылает по сто раз - делаем такую заглушку ---------------------
this.m_oWordControl.SlideDrawer.CheckSlide(this.SlideCurrent);
this.m_oWordControl.CalculateDocumentSize(false);
// --------------------------------------------------------------------------------
this.m_oWordControl.OnScroll();
this.m_oWordControl.Thumbnails.LockMainObjType = false;
};
// interface ui
this.InitGuiCanvasTextProps = function(div_id)
{
var _div_elem = document.getElementById(div_id);
if (null != this.GuiCanvasTextProps)
{
var elem = _div_elem.getElementsByTagName('canvas');
if (elem.length == 0)
{
_div_elem.appendChild(this.GuiCanvasTextProps);
}
else
{
var _width = parseInt(_div_elem.offsetWidth);
var _height = parseInt(_div_elem.offsetHeight);
if (0 == _width)
_width = 300;
if (0 == _height)
_height = 80;
this.GuiCanvasTextProps.style.width = _width + "px";
this.GuiCanvasTextProps.style.height = _height + "px";
}
var old_width = this.GuiCanvasTextProps.width;
var old_height = this.GuiCanvasTextProps.height;
AscCommon.calculateCanvasSize(this.GuiCanvasTextProps);
if (old_width !== this.GuiCanvasTextProps.width || old_height !== this.GuiCanvasTextProps.height)
this.GuiLastTextProps = null;
}
else
{
this.GuiCanvasTextProps = document.createElement('canvas');
this.GuiCanvasTextProps.style.position = "absolute";
this.GuiCanvasTextProps.style.left = "0px";
this.GuiCanvasTextProps.style.top = "0px";
var _width = parseInt(_div_elem.offsetWidth);
var _height = parseInt(_div_elem.offsetHeight);
if (0 == _width)
_width = 300;
if (0 == _height)
_height = 80;
this.GuiCanvasTextProps.style.width = _width + "px";
this.GuiCanvasTextProps.style.height = _height + "px";
AscCommon.calculateCanvasSize(this.GuiCanvasTextProps);
_div_elem.appendChild(this.GuiCanvasTextProps);
}
};
this.DrawGuiCanvasTextProps = function(props)
{
var bIsChange = false;
if (null == this.GuiLastTextProps)
{
bIsChange = true;
this.GuiLastTextProps = new Asc.asc_CParagraphProperty();
this.GuiLastTextProps.Subscript = props.Subscript;
this.GuiLastTextProps.Superscript = props.Superscript;
this.GuiLastTextProps.SmallCaps = props.SmallCaps;
this.GuiLastTextProps.AllCaps = props.AllCaps;
this.GuiLastTextProps.Strikeout = props.Strikeout;
this.GuiLastTextProps.DStrikeout = props.DStrikeout;
this.GuiLastTextProps.TextSpacing = props.TextSpacing;
this.GuiLastTextProps.Position = props.Position;
}
else
{
if (this.GuiLastTextProps.Subscript != props.Subscript)
{
this.GuiLastTextProps.Subscript = props.Subscript;
bIsChange = true;
}
if (this.GuiLastTextProps.Superscript != props.Superscript)
{
this.GuiLastTextProps.Superscript = props.Superscript;
bIsChange = true;
}
if (this.GuiLastTextProps.SmallCaps != props.SmallCaps)
{
this.GuiLastTextProps.SmallCaps = props.SmallCaps;
bIsChange = true;
}
if (this.GuiLastTextProps.AllCaps != props.AllCaps)
{
this.GuiLastTextProps.AllCaps = props.AllCaps;
bIsChange = true;
}
if (this.GuiLastTextProps.Strikeout != props.Strikeout)
{
this.GuiLastTextProps.Strikeout = props.Strikeout;
bIsChange = true;
}
if (this.GuiLastTextProps.DStrikeout != props.DStrikeout)
{
this.GuiLastTextProps.DStrikeout = props.DStrikeout;
bIsChange = true;
}
if (this.GuiLastTextProps.TextSpacing != props.TextSpacing)
{
this.GuiLastTextProps.TextSpacing = props.TextSpacing;
bIsChange = true;
}
if (this.GuiLastTextProps.Position != props.Position)
{
this.GuiLastTextProps.Position = props.Position;
bIsChange = true;
}
}
if (undefined !== this.GuiLastTextProps.Position && isNaN(this.GuiLastTextProps.Position))
this.GuiLastTextProps.Position = undefined;
if (undefined !== this.GuiLastTextProps.TextSpacing && isNaN(this.GuiLastTextProps.TextSpacing))
this.GuiLastTextProps.TextSpacing = undefined;
if (!bIsChange)
return;
AscFormat.ExecuteNoHistory(function(){
var _oldTurn = editor.isViewMode;
editor.isViewMode = true;
var docContent = new CDocumentContent(this.m_oWordControl.m_oLogicDocument, this.m_oWordControl.m_oDrawingDocument, 0, 0, 1000, 1000, false, false, true);
var par = docContent.Content[0];
par.MoveCursorToStartPos();
par.Set_Pr(new CParaPr());
var _textPr = new CTextPr();
_textPr.FontFamily = {Name : "Arial", Index : -1};
_textPr.FontSize = (AscCommon.AscBrowser.convertToRetinaValue(11 << 1, true) >> 0) * 0.5;
_textPr.RFonts.SetAll("Arial");
_textPr.Strikeout = this.GuiLastTextProps.Strikeout;
if (true === this.GuiLastTextProps.Subscript)
_textPr.VertAlign = AscCommon.vertalign_SubScript;
else if (true === this.GuiLastTextProps.Superscript)
_textPr.VertAlign = AscCommon.vertalign_SuperScript;
else
_textPr.VertAlign = AscCommon.vertalign_Baseline;
_textPr.DStrikeout = this.GuiLastTextProps.DStrikeout;
_textPr.Caps = this.GuiLastTextProps.AllCaps;
_textPr.SmallCaps = this.GuiLastTextProps.SmallCaps;
_textPr.Spacing = this.GuiLastTextProps.TextSpacing;
_textPr.Position = this.GuiLastTextProps.Position;
var parRun = new ParaRun(par);
parRun.Set_Pr(_textPr);
parRun.AddText("Hello World");
par.AddToContent(0, parRun);
docContent.Recalculate_Page(0, true);
var baseLineOffset = par.Lines[0].Y;
var _bounds = par.Get_PageBounds(0);
var ctx = this.GuiCanvasTextProps.getContext('2d');
var _wPx = this.GuiCanvasTextProps.width;
var _hPx = this.GuiCanvasTextProps.height;
var _wMm = _wPx * g_dKoef_pix_to_mm;
var _hMm = _hPx * g_dKoef_pix_to_mm;
ctx.fillStyle = "#FFFFFF";
ctx.fillRect(0, 0, _wPx, _hPx);
var _pxBoundsW = par.Lines[0].Ranges[0].W * g_dKoef_mm_to_pix;//(_bounds.Right - _bounds.Left) * g_dKoef_mm_to_pix;
var _pxBoundsH = (_bounds.Bottom - _bounds.Top) * g_dKoef_mm_to_pix;
if (this.GuiLastTextProps.Position !== undefined && this.GuiLastTextProps.Position != null && this.GuiLastTextProps.Position != 0)
{
// TODO: нужна высота без учета Position
// _pxBoundsH -= (this.GuiLastTextProps.Position * g_dKoef_mm_to_pix);
}
if (_pxBoundsH < _hPx && _pxBoundsW < _wPx)
{
// рисуем линию
var _lineY = (((_hPx + _pxBoundsH) / 2) >> 0) + 0.5;
var _lineW = (((_wPx - _pxBoundsW) / 4) >> 0);
ctx.strokeStyle = "#000000";
ctx.lineWidth = 1;
ctx.beginPath();
ctx.moveTo(0, _lineY);
ctx.lineTo(_lineW, _lineY);
ctx.moveTo(_wPx - _lineW, _lineY);
ctx.lineTo(_wPx, _lineY);
ctx.stroke();
ctx.beginPath();
}
var _yOffset = (((_hPx + _pxBoundsH) / 2) - baseLineOffset * g_dKoef_mm_to_pix) >> 0;
var _xOffset = ((_wPx - _pxBoundsW) / 2) >> 0;
var graphics = new AscCommon.CGraphics();
graphics.init(ctx, _wPx, _hPx, _wMm, _hMm);
graphics.m_oFontManager = AscCommon.g_fontManager;
graphics.m_oCoordTransform.tx = _xOffset;
graphics.m_oCoordTransform.ty = _yOffset;
graphics.transform(1, 0, 0, 1, 0, 0);
var old_marks = this.m_oWordControl.m_oApi.ShowParaMarks;
this.m_oWordControl.m_oApi.ShowParaMarks = false;
par.Draw(0, graphics);
this.m_oWordControl.m_oApi.ShowParaMarks = old_marks;
editor.isViewMode = _oldTurn;
}, this, []);
};
this.CheckGuiControlColors = function(bIsAttack)
{
let oPresentation = this.m_oWordControl.m_oLogicDocument;
let oTheme = oPresentation.Get_Theme();
let oClrMap = oPresentation.Get_ColorMap();
if(!oTheme || !oClrMap) return;
let arr_colors = new Array(10);
let rgba = {R : 0, G : 0, B : 0, A : 255};
// bg1,tx1,bg2,tx2,accent1 - accent6
let array_colors_types = [6, 15, 7, 16, 0, 1, 2, 3, 4, 5];
let _count = array_colors_types.length;
let color = new AscFormat.CUniColor();
color.color = new AscFormat.CSchemeColor();
for (let i = 0; i < _count; ++i)
{
color.color.id = array_colors_types[i];
color.Calculate(oTheme, null, null, null, rgba, oClrMap);
let _rgba = color.RGBA;
arr_colors[i] = new Asc.asc_CColor(_rgba.R, _rgba.G, _rgba.B);
arr_colors[i].setColorSchemeId(color.color.id);
}
// теперь проверим
let bIsSend = false;
if (this.GuiControlColorsMap != null)
{
for (let i = 0; i < _count; ++i)
{
let _color1 = this.GuiControlColorsMap[i];
let _color2 = arr_colors[i];
if ((_color1.r != _color2.r) || (_color1.g != _color2.g) || (_color1.b != _color2.b))
{
bIsSend = true;
break;
}
}
}
else
{
this.GuiControlColorsMap = new Array(_count);
bIsSend = true;
}
if (bIsSend || (bIsAttack === true))
{
for (let i = 0; i < _count; ++i)
{
this.GuiControlColorsMap[i] = arr_colors[i];
}
this.SendControlColors(bIsAttack);
}
};
this.SendControlColors = function(bIsAttack)
{
let standart_colors = null;
if (!this.IsSendStandartColors || (bIsAttack === true))
{
let standartColors = AscCommon.g_oStandartColors;
let _c_s = standartColors.length;
standart_colors = new Array(_c_s);
for (var i = 0; i < _c_s; ++i)
{
standart_colors[i] = new Asc.asc_CColor(standartColors[i].R, standartColors[i].G, standartColors[i].B);
}
this.IsSendStandartColors = true;
}
let _count = this.GuiControlColorsMap.length;
let _ret_array = new Array(_count * 6);
let _cur_index = 0;
let array_colors_types = [6, 15, 7, 16, 0, 1, 2, 3, 4, 5];
for (let i = 0; i < _count; ++i)
{
let _color_src = this.GuiControlColorsMap[i];
_ret_array[_cur_index] = new Asc.asc_CColor(_color_src.r, _color_src.g, _color_src.b);
_ret_array[_cur_index].setColorSchemeId(array_colors_types[i]);
_cur_index++;
// теперь с модификаторами
let _count_mods = 5;
for (let j = 0; j < _count_mods; ++j)
{
let dst_mods = new AscFormat.CColorModifiers();
dst_mods.Mods = AscCommon.GetDefaultMods(_color_src.r, _color_src.g, _color_src.b, j + 1, 0);
let _rgba = {R : _color_src.r, G : _color_src.g, B : _color_src.b, A : 255};
dst_mods.Apply(_rgba);
let oColor = new Asc.asc_CColor(_rgba.R, _rgba.G, _rgba.B);
oColor.put_effectValue(dst_mods.getEffectValue());
oColor.setColorSchemeId(array_colors_types[i]);
_ret_array[_cur_index] = oColor;
_cur_index++;
}
}
this.m_oWordControl.m_oApi.sync_SendThemeColors(_ret_array, standart_colors);
};
this.DrawGuiImage = function (oTexture, oCtx, sUrl, sLastDrawingUrl)
{
let _width = oTexture.width;
let _height = oTexture.height;
oCtx.clearRect(0, 0, _width, _height);
if (!sLastDrawingUrl)
return;
let _img = Asc.editor.ImageLoader.map_image_index[AscCommon.getFullImageSrc2(sUrl)];
if (_img != undefined && _img.Image != null && _img.Status != ImageLoadStatus.Loading)
{
let _x = 0;
let _y = 0;
let _w = Math.max(_img.Image.width, 1);
let _h = Math.max(_img.Image.height, 1);
let dAspect1 = _width / _height;
let dAspect2 = _w / _h;
_w = _width;
_h = _height;
if (dAspect1 >= dAspect2)
{
_w = dAspect2 * _height;
_x = (_width - _w) / 2;
}
else
{
_h = _w / dAspect2;
_y = (_height - _h) / 2;
}
oCtx.drawImage(_img.Image, _x, _y, _w, _h);
}
else
{
if(_img && _img.Status === ImageLoadStatus.Loading)
{
}
else
{
oCtx.lineWidth = 1;
oCtx.beginPath();
oCtx.moveTo(0, 0);
oCtx.lineTo(_width, _height);
oCtx.moveTo(_width, 0);
oCtx.lineTo(0, _height);
oCtx.strokeStyle = "#FF0000";
oCtx.stroke();
oCtx.beginPath();
oCtx.moveTo(0, 0);
oCtx.lineTo(_width, 0);
oCtx.lineTo(_width, _height);
oCtx.lineTo(0, _height);
oCtx.closePath();
oCtx.strokeStyle = "#000000";
oCtx.stroke();
oCtx.beginPath();
}
}
};
this.DrawImageTextureFillShape = function(url)
{
if (this.GuiCanvasFillTexture == null)
{
this.InitGuiCanvasShape(this.GuiCanvasFillTextureParentId);
}
if (this.GuiCanvasFillTexture == null || this.GuiCanvasFillTextureCtx == null || url == this.LastDrawingUrl)
return;
this.LastDrawingUrl = url;
this.DrawGuiImage(this.GuiCanvasFillTexture, this.GuiCanvasFillTextureCtx, url, this.LastDrawingUrl);
if(url)
{
let _img = Asc.editor.ImageLoader.map_image_index[AscCommon.getFullImageSrc2(url)];
if (!(_img && _img.Image && _img.Status !== ImageLoadStatus.Loading))
this.LastDrawingUrl = "";
}
};
this.DrawImageTextureFillSlide = function(url)
{
if (this.GuiCanvasFillTextureSlide == null)
{
this.InitGuiCanvasSlide(this.GuiCanvasFillTextureParentIdSlide);
}
if (this.GuiCanvasFillTextureSlide == null || this.GuiCanvasFillTextureCtxSlide == null || url == this.LastDrawingUrlSlide)
return;
this.LastDrawingUrlSlide = url;
this.DrawGuiImage(this.GuiCanvasFillTextureSlide, this.GuiCanvasFillTextureCtxSlide, url, this.LastDrawingUrlSlide);
if(url)
{
let _img = Asc.editor.ImageLoader.map_image_index[AscCommon.getFullImageSrc2(url)];
if (!(_img && _img.Image && _img.Status !== ImageLoadStatus.Loading))
this.LastDrawingUrlSlide = "";
}
};
this.DrawImageTextureFillTextArt = function(url)
{
if (this.GuiCanvasFillTextureTextArt == null)
{
this.InitGuiCanvasTextArt(this.GuiCanvasFillTextureParentIdTextArt);
}
if (this.GuiCanvasFillTextureTextArt == null || this.GuiCanvasFillTextureCtxTextArt == null || url == this.LastDrawingUrlTextArt)
return;
this.LastDrawingUrlTextArt = url;
this.DrawGuiImage(this.GuiCanvasFillTextureTextArt, this.GuiCanvasFillTextureCtxTextArt, url, this.LastDrawingUrlTextArt);
if(url)
{
let _img = Asc.editor.ImageLoader.map_image_index[AscCommon.getFullImageSrc2(url)];
if (!(_img && _img.Image && _img.Status !== ImageLoadStatus.Loading))
this.LastDrawingUrlTextArt = "";
}
};
this.InitGuiCanvasShape = function(div_id)
{
if (null != this.GuiCanvasFillTexture)
{
var _div_elem = document.getElementById(this.GuiCanvasFillTextureParentId);
if (!_div_elem)
_div_elem.removeChild(this.GuiCanvasFillTexture);
this.GuiCanvasFillTexture = null;
this.GuiCanvasFillTextureCtx = null;
}
this.GuiCanvasFillTextureParentId = div_id;
var _div_elem = document.getElementById(this.GuiCanvasFillTextureParentId);
if (!_div_elem)
return;
this.GuiCanvasFillTexture = document.createElement('canvas');
this.GuiCanvasFillTexture.width = parseInt(_div_elem.style.width);
this.GuiCanvasFillTexture.height = parseInt(_div_elem.style.height);
this.LastDrawingUrl = "";
this.GuiCanvasFillTextureCtx = this.GuiCanvasFillTexture.getContext('2d');
_div_elem.appendChild(this.GuiCanvasFillTexture);
};
this.InitGuiCanvasSlide = function(div_id)
{
if (null != this.GuiCanvasFillTextureSlide)
{
var _div_elem = document.getElementById(this.GuiCanvasFillTextureParentIdSlide);
if (!_div_elem)
_div_elem.removeChild(this.GuiCanvasFillTextureSlide);
this.GuiCanvasFillTextureSlide = null;
this.GuiCanvasFillTextureCtxSlide = null;
}
this.GuiCanvasFillTextureParentIdSlide = div_id;
var _div_elem = document.getElementById(this.GuiCanvasFillTextureParentIdSlide);
if (!_div_elem)
return;
this.GuiCanvasFillTextureSlide = document.createElement('canvas');
this.GuiCanvasFillTextureSlide.width = parseInt(_div_elem.style.width);
this.GuiCanvasFillTextureSlide.height = parseInt(_div_elem.style.height);
this.LastDrawingUrlSlide = "";
this.GuiCanvasFillTextureCtxSlide = this.GuiCanvasFillTextureSlide.getContext('2d');
_div_elem.appendChild(this.GuiCanvasFillTextureSlide);
};
this.InitGuiCanvasTextArt = function(div_id)
{
if (null != this.GuiCanvasFillTextureTextArt)
{
var _div_elem = document.getElementById(this.GuiCanvasFillTextureParentIdTextArt);
if (!_div_elem)
_div_elem.removeChild(this.GuiCanvasFillTextureTextArt);
this.GuiCanvasFillTextureTextArt = null;
this.GuiCanvasFillTextureCtxTextArt = null;
}
this.GuiCanvasFillTextureParentIdTextArt = div_id;
var _div_elem = document.getElementById(this.GuiCanvasFillTextureParentIdTextArt);
if (!_div_elem)
return;
this.GuiCanvasFillTextureTextArt = document.createElement('canvas');
this.GuiCanvasFillTextureTextArt.width = parseInt(_div_elem.style.width);
this.GuiCanvasFillTextureTextArt.height = parseInt(_div_elem.style.height);
this.LastDrawingUrlTextArt = "";
this.GuiCanvasFillTextureCtxTextArt = this.GuiCanvasFillTextureTextArt.getContext('2d');
_div_elem.appendChild(this.GuiCanvasFillTextureTextArt);
};
this.CheckTableStyles = function(tableLook)
{
// сначала проверим, подписан ли кто на этот евент
// а то во вьюере не стоит ничего посылать
if (!this.m_oWordControl.m_oApi.asc_checkNeedCallback("asc_onInitTableTemplates"))
return;
var isChanged = this.m_oWordControl.m_oLogicDocument.CheckNeedUpdateTableStyles(tableLook);
if(!isChanged)
{
return;
}
this.m_oWordControl.m_oApi.sync_InitEditorTableStyles();
};
this.CheckTableStylesDefault = function ()
{
let tableLook = new AscCommon.CTableLook(true, true, false, false, true, false);
return this.CheckTableStyles(tableLook);
};
this.GetTableStylesPreviews = function(bUseDefault)
{
return (new AscCommon.CTableStylesPreviewGenerator(this.m_oWordControl.m_oLogicDocument)).GetAllPreviews(bUseDefault);
};
this.GetTableLook = function(isDefault)
{
let oTableLook;
if (isDefault)
{
oTableLook = new AscCommon.CTableLook();
oTableLook.SetDefault();
}
else
{
oTableLook = this.TableStylesLastLook;
}
return oTableLook;
};
// ruler
this.Set_RulerState_Table = function(markup, transform)
{
this.TabButtonEnable(true);
var hor_ruler = this.m_oWordControl.m_oHorRuler;
var ver_ruler = this.m_oWordControl.m_oVerRuler;
hor_ruler.CurrentObjectType = RULER_OBJECT_TYPE_TABLE;
hor_ruler.m_oTableMarkup = markup.CreateDublicate();
hor_ruler.m_oColumnMarkup = null;
hor_ruler.CalculateMargins();
ver_ruler.CurrentObjectType = RULER_OBJECT_TYPE_TABLE;
ver_ruler.m_oTableMarkup = markup.CreateDublicate();
if (transform)
{
hor_ruler.m_oTableMarkup.TransformX = transform.tx;
hor_ruler.m_oTableMarkup.TransformY = transform.ty;
ver_ruler.m_oTableMarkup.TransformX = transform.tx;
ver_ruler.m_oTableMarkup.TransformY = transform.ty;
hor_ruler.m_oTableMarkup.CorrectFrom();
ver_ruler.m_oTableMarkup.CorrectFrom();
}
hor_ruler.CalculateMargins();
this.TableOutlineDr.CurrentPageIndex = this.m_lCurrentPage;
if (0 <= this.SlideCurrent && this.SlideCurrent < this.GetSlidesCount())
{
this.m_oWordControl.CreateBackgroundHorRuler();
this.m_oWordControl.CreateBackgroundVerRuler();
}
if (!this.m_oWordControl.IsEnabledRulerMarkers)
{
this.m_oWordControl.EnableRulerMarkers();
}
else
{
this.m_oWordControl.UpdateHorRuler();
}
this.m_oWordControl.UpdateVerRuler();
if (this.m_oWordControl.MobileTouchManager)
{
this.m_oWordControl.MobileTouchManager.TableStartTrack_Check = true;
markup.Table.StartTrackTable();
this.m_oWordControl.MobileTouchManager.TableStartTrack_Check = false;
}
};
this.Set_RulerState_Paragraph = function(obj, margins)
{
this.TabButtonEnable((margins !== undefined) ? true : false);
var hor_ruler = this.m_oWordControl.m_oHorRuler;
var ver_ruler = this.m_oWordControl.m_oVerRuler;
//if (hor_ruler.CurrentObjectType == RULER_OBJECT_TYPE_PARAGRAPH && ver_ruler.CurrentObjectType == RULER_OBJECT_TYPE_PARAGRAPH)
// return;
hor_ruler.CurrentObjectType = RULER_OBJECT_TYPE_PARAGRAPH;
hor_ruler.m_oTableMarkup = null;
hor_ruler.m_oColumnMarkup = null;
ver_ruler.CurrentObjectType = RULER_OBJECT_TYPE_PARAGRAPH;
ver_ruler.m_oTableMarkup = null;
// вообще надо посмотреть... может и был параграф до этого.
// тогда вэкграунд перерисовывать не нужно. Только надо знать, на той же странице это было или нет
if (-1 != this.SlideCurrent)
{
this.m_oWordControl.CreateBackgroundHorRuler(margins);
this.m_oWordControl.CreateBackgroundVerRuler(margins);
}
if (!this.m_oWordControl.IsEnabledRulerMarkers && margins !== undefined)
this.m_oWordControl.EnableRulerMarkers();
else if (this.m_oWordControl.IsEnabledRulerMarkers && margins === undefined)
this.m_oWordControl.DisableRulerMarkers();
else
{
this.m_oWordControl.UpdateHorRuler();
this.m_oWordControl.UpdateVerRuler();
}
};
this.Set_RulerState_HdrFtr = function(bHeader, Y0, Y1)
{
this.TabButtonEnable(true);
var hor_ruler = this.m_oWordControl.m_oHorRuler;
var ver_ruler = this.m_oWordControl.m_oVerRuler;
hor_ruler.CurrentObjectType = RULER_OBJECT_TYPE_PARAGRAPH;
hor_ruler.m_oTableMarkup = null;
hor_ruler.m_oColumnMarkup = null;
ver_ruler.CurrentObjectType = (true === bHeader) ? RULER_OBJECT_TYPE_HEADER : RULER_OBJECT_TYPE_FOOTER;
ver_ruler.header_top = Y0;
ver_ruler.header_bottom = Y1;
ver_ruler.m_oTableMarkup = null;
// вообще надо посмотреть... может и бал параграф до этого.
// тогда вэкграунд перерисовывать не нужно. Только надо знать, на той же странице это было или нет
if (-1 != this.m_lCurrentPage)
{
this.m_oWordControl.CreateBackgroundHorRuler();
this.m_oWordControl.CreateBackgroundVerRuler();
}
this.m_oWordControl.UpdateHorRuler();
this.m_oWordControl.UpdateVerRuler();
};
this.Set_RulerState_Columns = function (markup)
{
this.TabButtonEnable(true);
var hor_ruler = this.m_oWordControl.m_oHorRuler;
var ver_ruler = this.m_oWordControl.m_oVerRuler;
hor_ruler.CurrentObjectType = RULER_OBJECT_TYPE_COLUMNS;
hor_ruler.m_oTableMarkup = null;
hor_ruler.m_oColumnMarkup = markup.CreateDuplicate();
ver_ruler.CurrentObjectType = RULER_OBJECT_TYPE_PARAGRAPH;
ver_ruler.m_oTableMarkup = null;
this.TableOutlineDr.TableMatrix = null;
this.TableOutlineDr.CurrentPageIndex = this.m_lCurrentPage;
hor_ruler.CalculateMargins();
if (0 <= this.m_lCurrentPage && this.m_lCurrentPage < this.m_lPagesCount)
{
this.m_oWordControl.CreateBackgroundHorRuler();
this.m_oWordControl.CreateBackgroundVerRuler();
}
this.m_oWordControl.UpdateHorRuler();
this.m_oWordControl.UpdateVerRuler();
};
this.Update_ParaTab = function(Default_Tab, ParaTabs)
{
var hor_ruler = this.m_oWordControl.m_oHorRuler;
var __tabs = ParaTabs.Tabs;
if (undefined === __tabs)
__tabs = ParaTabs;
var _len = __tabs.length;
if ((Default_Tab == hor_ruler.m_dDefaultTab) && (hor_ruler.m_arrTabs.length == _len) && (_len == 0))
{
// потом можно и проверить сами табы
return;
}
hor_ruler.m_dDefaultTab = Default_Tab;
hor_ruler.m_arrTabs = [];
var _ar = hor_ruler.m_arrTabs;
for (var i = 0; i < _len; i++)
{
if (__tabs[i].Value == tab_Left || __tabs[i].Value == tab_Center || __tabs[i].Value == tab_Right)
_ar[i] = new CTab(__tabs[i].Pos, __tabs[i].Value);
else
{
// не должно такого быть. но приходит
_ar[i] = new CTab(__tabs[i].Pos, tab_Left);
}
}
hor_ruler.CorrectTabs();
this.m_oWordControl.UpdateHorRuler();
};
this.UpdateTableRuler = function(isCols, index, position)
{
var dKoef_mm_to_pix = g_dKoef_mm_to_pix * this.m_oWordControl.m_nZoomValue / 100;
if (false === isCols)
{
var markup = this.m_oWordControl.m_oVerRuler.m_oTableMarkup;
if (markup == null)
return;
position += markup.TransformY;
if (0 == index)
{
var delta = position - markup.Rows[0].Y;
markup.Rows[0].Y = position;
markup.Rows[0].H -= delta;
}
else
{
var delta = (markup.Rows[index - 1].Y + markup.Rows[index - 1].H) - position;
markup.Rows[index - 1].H -= delta;
if (index != markup.Rows.length)
{
markup.Rows[index].Y -= delta;
markup.Rows[index].H += delta;
}
}
if ("none" == this.m_oWordControl.m_oOverlay.HtmlElement.style.display)
this.m_oWordControl.ShowOverlay();
this.m_oWordControl.UpdateVerRulerBack();
this.m_oWordControl.m_oOverlayApi.HorLine(this.SlideCurrectRect.top + position * dKoef_mm_to_pix);
}
else
{
var markup = this.m_oWordControl.m_oHorRuler.m_oTableMarkup;
if (markup == null)
return;
position += markup.TransformX;
if (0 == index)
{
markup.X = position;
}
else
{
var _start = markup.X;
for (var i = 0; i < (index - 1); i++)
{
_start += markup.Cols[i];
}
var _old = markup.Cols[index - 1];
markup.Cols[index - 1] = position - _start;
if (index != markup.Cols.length)
{
markup.Cols[index] += (_old - markup.Cols[index - 1]);
}
}
if ("none" == this.m_oWordControl.m_oOverlay.HtmlElement.style.display)
this.m_oWordControl.ShowOverlay();
this.m_oWordControl.UpdateHorRulerBack();
this.m_oWordControl.m_oOverlayApi.VertLine(this.SlideCurrectRect.left + position * dKoef_mm_to_pix);
}
};
this.TabButtonEnable = function(isEnabled)
{
if (this.isTabButtonShow == isEnabled)
return;
this.isTabButtonShow = isEnabled;
if (this.m_oWordControl && this.m_oWordControl.m_oLeftRuler_buttonsTabs)
{
this.m_oWordControl.m_oLeftRuler_buttonsTabs.HtmlElement.style.display = this.isTabButtonShow ? "block" : "none";
}
};
this.CorrectRulerPosition = function(pos)
{
if (global_keyboardEvent.AltKey)
return pos;
return ((pos / 2.5 + 0.5) >> 0) * 2.5;
};
// coords
this.ConvertCoordsToAnotherPage = function(x, y)
{
return {X : x, Y : y};
};
this.ConvertCoordsFromCursor2 = function(x, y)
{
var wc = this.m_oWordControl;
var _x = x - wc.X - (wc.m_oMainParent.AbsolutePosition.L + wc.m_oMainView.AbsolutePosition.L) * g_dKoef_mm_to_pix;
var _y = y - wc.Y - (wc.m_oMainParent.AbsolutePosition.T + wc.m_oMainView.AbsolutePosition.T) * g_dKoef_mm_to_pix;
var dKoef = (100 * g_dKoef_pix_to_mm / wc.m_nZoomValue);
var Pos = {X : 0, Y : 0, Page : this.SlideCurrent};
if (this.SlideCurrent != -1)
{
var rect = this.SlideCurrectRect;
var x_mm = (_x - rect.left) * dKoef;
var y_mm = (_y - rect.top) * dKoef;
Pos.X = x_mm;
Pos.Y = y_mm;
}
return Pos;
};
this.ConvertCoordsToCursorWR = function(x, y, pageIndex, transform, isMainAttack)
{
var wc = this.m_oWordControl;
var _x = x;
var _y = y;
if (transform)
{
_x = transform.TransformPointX(x, y);
_y = transform.TransformPointY(x, y);
}
if (isMainAttack || !wc.m_oLogicDocument.IsFocusOnNotes())
{
if (wc.DemonstrationManager.Mode)
{
return wc.DemonstrationManager.convertCoordsToCursorWR(_x, _y);
}
var dKoef = (this.m_oWordControl.m_nZoomValue * g_dKoef_mm_to_pix / 100);
var x_pix = (this.SlideCurrectRect.left + _x * dKoef + (wc.m_oMainParent.AbsolutePosition.L + wc.m_oMainView.AbsolutePosition.L) * g_dKoef_mm_to_pix) >> 0;
var y_pix = (this.SlideCurrectRect.top + _y * dKoef + (wc.m_oMainParent.AbsolutePosition.T + wc.m_oMainView.AbsolutePosition.T) * g_dKoef_mm_to_pix) >> 0;
return {X: x_pix, Y: y_pix, Error: false};
}
else
{
var x_pix = (_x * g_dKoef_mm_to_pix + 10 + (wc.m_oMainParent.AbsolutePosition.L + wc.m_oBottomPanesContainer.AbsolutePosition.L + wc.m_oNotesContainer.AbsolutePosition.L) * g_dKoef_mm_to_pix) >> 0;
var y_pix = (_y * g_dKoef_mm_to_pix + (wc.m_oMainParent.AbsolutePosition.T + wc.m_oBottomPanesContainer.AbsolutePosition.T + wc.m_oNotesContainer.AbsolutePosition.T) * g_dKoef_mm_to_pix) >> 0;
return {X: x_pix, Y: y_pix, Error: false};
}
};
this.ConvertAnimPaneCoordsToCursor = function(x, y)
{
const wc = this.m_oWordControl;
const x_pix = (x * g_dKoef_mm_to_pix + (wc.m_oMainParent.AbsolutePosition.L + wc.m_oBottomPanesContainer.AbsolutePosition.L + wc.m_oAnimationPaneContainer.AbsolutePosition.L) * g_dKoef_mm_to_pix) >> 0;
const y_pix = (y * g_dKoef_mm_to_pix + (wc.m_oMainParent.AbsolutePosition.T + wc.m_oBottomPanesContainer.AbsolutePosition.T + wc.m_oAnimationPaneContainer.AbsolutePosition.T) * g_dKoef_mm_to_pix) >> 0;
return {X: x_pix, Y: y_pix, Error: false};
};
this.ConvertCoordsToCursor3 = function (x, y, isGlobal)
{
var wc = this.m_oWordControl;
var dKoef = (wc.m_nZoomValue * g_dKoef_mm_to_pix / 100);
var _x = 0;
var _y = 0;
if (isGlobal)
{
_x = wc.X;
_y = wc.Y;
_x += (wc.m_oMainParent.AbsolutePosition.L + wc.m_oMainView.AbsolutePosition.L) * g_dKoef_mm_to_pix;
_y += (wc.m_oMainParent.AbsolutePosition.T + wc.m_oMainView.AbsolutePosition.T) * g_dKoef_mm_to_pix;
}
var x_pix = (this.SlideCurrectRect.left + x * dKoef + _x) >> 0;
var y_pix = (this.SlideCurrectRect.top + y * dKoef + _y) >> 0;
return {X: x_pix, Y: y_pix, Error: false};
};
this.ConvertCoordsToCursorWR_Comment = function(x, y)
{
var wc = this.m_oWordControl;
var dKoef = (wc.m_nZoomValue * g_dKoef_mm_to_pix / 100);
var x_pix = (this.SlideCurrectRect.left + x * dKoef + wc.m_oMainView.AbsolutePosition.L * g_dKoef_mm_to_pix) >> 0;
var y_pix = (this.SlideCurrectRect.top + y * dKoef + wc.m_oMainView.AbsolutePosition.T * g_dKoef_mm_to_pix) >> 0;
x_pix += COMMENT_WIDTH;
y_pix += ((COMMENT_HEIGHT / 3) >> 0);
return {X : x_pix, Y : y_pix, Error : false};
};
this.ConvertCoordsToCursor = function(x, y)
{
var dKoef = (this.m_oWordControl.m_nZoomValue * g_dKoef_mm_to_pix / 100);
var x_pix = (this.SlideCurrectRect.left + x * dKoef) >> 0;
var y_pix = (this.SlideCurrectRect.top + y * dKoef) >> 0;
return {X : x_pix, Y : y_pix, Error : false};
};
this.GetDotsPerMM = function(value)
{
if (!this.isDrawingNotes)
return value * this.m_oWordControl.m_nZoomValue * g_dKoef_mm_to_pix / 100;
return value * g_dKoef_mm_to_pix;
};
this.GetMMPerDot = function(value)
{
return value / this.GetDotsPerMM(1);
};
this.GetVisibleMMHeight = function()
{
var pixHeigth = this.m_oWordControl.m_oEditor.HtmlElement.height;
pixHeigth /= AscCommon.AscBrowser.retinaPixelRatio;
var pixBetweenPages = 20 * (this.m_lDrawingEnd - this.m_lDrawingFirst);
return (pixHeigth - pixBetweenPages) * g_dKoef_pix_to_mm * 100 / this.m_oWordControl.m_nZoomValue;
};
// tracks
this.StartTrackTable = function (obj, transform)
{
if (this.m_oWordControl.MobileTouchManager)
{
if (!this.m_oWordControl.MobileTouchManager.TableStartTrack_Check)
return;
}
this.TableOutlineDr.TableOutline = obj;
this.TableOutlineDr.Counter = 0;
this.TableOutlineDr.bIsNoTable = false;
this.TableOutlineDr.CheckStartTrack(this.m_oWordControl, transform);
if (this.m_oWordControl.MobileTouchManager)
this.m_oWordControl.OnUpdateOverlay();
};
this.EndTrackTable = function (pointer, bIsAttack)
{
if (this.TableOutlineDr.TableOutline != null)
{
if (pointer == this.TableOutlineDr.TableOutline.Table || bIsAttack)
{
this.TableOutlineDr.TableOutline = null;
this.TableOutlineDr.Counter = 0;
}
}
};
this.StartTrackAutoshape = function()
{
this.m_oWordControl.ShowOverlay();
};
this.EndTrackAutoShape = function()
{
this.m_oWordControl.OnUpdateOverlay();
};
this.DrawMathTrack = function (overlay)
{
if (!this.MathTrack.IsActive())
return;
if(!this.TextMatrix)
return;
overlay.Show();
let nIndex, nCount;
let oPath;
let dKoefX, dKoefY;
let PathLng = this.MathTrack.GetPolygonsCount();
let xDst, yDst, wDst, hDst;
let bIsMain = !this.m_oLogicDocument.IsFocusOnNotes();
if(bIsMain)
{
xDst = this.SlideCurrectRect.left;
yDst = this.SlideCurrectRect.top;
wDst = this.SlideCurrectRect.right - this.SlideCurrectRect.left;
hDst = this.SlideCurrectRect.bottom - this.SlideCurrectRect.top;
dKoefX = wDst / this.m_oLogicDocument.GetWidthMM();
dKoefY = hDst / this.m_oLogicDocument.GetHeightMM();
}
else
{
xDst = this.m_oWordControl.m_oNotesApi.OffsetX;
yDst = - this.m_oWordControl.m_oNotesApi.Scroll;
dKoefX = g_dKoef_mm_to_pix;
dKoefY = g_dKoef_mm_to_pix;
}
let oTextMatrix = this.TextMatrix;
for (nIndex = 0; nIndex < PathLng; nIndex++)
{
oPath = this.MathTrack.GetPolygon(nIndex);
this.MathTrack.Draw(overlay, oPath, 0, 0, "#939393", dKoefX, dKoefY, xDst, yDst, oTextMatrix);
this.MathTrack.Draw(overlay, oPath, 1, 1, "#FFFFFF", dKoefX, dKoefY, xDst, yDst, oTextMatrix);
}
for (nIndex = 0, nCount = this.MathTrack.GetSelectPathsCount(); nIndex < nCount; nIndex++)
{
oPath = this.MathTrack.GetSelectPath(nIndex);
this.MathTrack.DrawSelectPolygon(overlay, oPath, dKoefX, dKoefY, xDst, yDst, oTextMatrix);
}
};
this.Update_MathTrack = function (IsActive, IsContentActive, oMath)
{
let PixelError;
if(this.m_oLogicDocument.IsFocusOnNotes())
{
PixelError = 3 / g_dKoef_mm_to_pix;
}
else
{
PixelError = this.GetMMPerDot(3);
}
this.MathTrack.Update(IsActive, IsContentActive, oMath, PixelError);
};
this.DrawVerAnchor = function(pageNum, xPos, bIsFromDrawings)
{
if (undefined === bIsFromDrawings)
{
if (this.m_oWordControl.m_oApi.ShowSmartGuides)
{
this.HorVerAnchors.push({Type : 0, Pos : xPos});
}
return;
}
var _pos = this.ConvertCoordsToCursor(xPos, 0);
if (_pos.Error === false)
{
this.m_oWordControl.m_oOverlayApi.DashLineColor = "#FF0000";
this.m_oWordControl.m_oOverlayApi.VertLine2(_pos.X);
this.m_oWordControl.m_oOverlayApi.DashLineColor = "#000000";
}
};
this.DrawHorAnchor = function(pageNum, yPos, bIsFromDrawings)
{
if (undefined === bIsFromDrawings)
{
if (this.m_oWordControl.m_oApi.ShowSmartGuides)
{
this.HorVerAnchors.push({Type : 1, Pos : yPos});
}
return;
}
var _pos = this.ConvertCoordsToCursor(0, yPos);
if (_pos.Error === false)
{
this.m_oWordControl.m_oOverlayApi.DashLineColor = "#FF0000";
this.m_oWordControl.m_oOverlayApi.HorLine2(_pos.Y);
this.m_oWordControl.m_oOverlayApi.DashLineColor = "#000000";
}
};
this.DrawHorVerAnchor = function()
{
for (var i = 0; i < this.HorVerAnchors.length; i++)
{
var _anchor = this.HorVerAnchors[i];
if (_anchor.Type == 0)
this.DrawVerAnchor(0, _anchor.Pos, true);
else
this.DrawHorAnchor(0, _anchor.Pos, true);
}
this.HorVerAnchors.splice(0, this.HorVerAnchors.length);
};
this.StartTrackText = function ()
{
this.InlineTextTrackEnabled = true;
this.InlineTextTrack = null;
this.InlineTextTrackPage = -1;
this.InlineTextInNotes = false;
};
this.EndTrackText = function (isOnlyMoveTarget)
{
this.InlineTextTrackEnabled = false;
if (true !== isOnlyMoveTarget)
this.m_oWordControl.m_oLogicDocument.OnEndTextDrag(this.InlineTextTrack, AscCommon.global_keyboardEvent.CtrlKey);
else if (this.InlineTextTrack)
{
var Paragraph = this.InlineTextTrack.Paragraph;
Paragraph.Cursor_MoveToNearPos(this.InlineTextTrack);
Paragraph.Document_SetThisElementCurrent(false);
this.m_oWordControl.m_oLogicDocument.Document_UpdateSelectionState();
this.m_oWordControl.m_oLogicDocument.Document_UpdateInterfaceState();
this.m_oWordControl.m_oLogicDocument.Document_UpdateRulersState();
}
this.InlineTextTrack = null;
this.InlineTextTrackPage = -1;
this.InlineTextInNotes = false;
};
this.IsTrackText = function ()
{
return this.InlineTextTrackEnabled;
};
this.CancelTrackText = function ()
{
this.InlineTextTrackEnabled = false;
this.InlineTextTrack = null;
this.InlineTextTrackPage = -1;
this.InlineTextInNotes = false;
};
this.DrawTrack = function(type, matrix, left, top, width, height, isLine, canRotate, isNoMove, isDrawHandles)
{
this.AutoShapesTrack.DrawTrack(type, matrix, left, top, width, height, isLine, canRotate, isNoMove, isDrawHandles);
};
this.DrawTrackSelectShapes = function(x, y, w, h)
{
this.AutoShapesTrack.DrawTrackSelectShapes(x, y, w, h);
};
this.DrawAdjustment = function(matrix, x, y, bTextWarp)
{
this.AutoShapesTrack.DrawAdjustment(matrix, x, y, bTextWarp);
};
// metafile
this.RenderDocument = function(Renderer)
{
let SlidesCount = this.GetSlidesCount();
for (let i = 0; i < SlidesCount; i++)
{
Renderer.BeginPage(this.m_oLogicDocument.GetWidthMM(), this.m_oLogicDocument.GetHeightMM());
this.m_oLogicDocument.DrawPage(i, Renderer);
Renderer.EndPage();
}
};
this.ToRenderer = function()
{
var Renderer = new AscCommon.CDocumentRenderer();
Renderer.InitPicker(AscCommon.g_oTextMeasurer.m_oManager);
Renderer.IsNoDrawingEmptyPlaceholder = true;
Renderer.VectorMemoryForPrint = new AscCommon.CMemory();
var old_marks = this.m_oWordControl.m_oApi.ShowParaMarks;
this.m_oWordControl.m_oApi.ShowParaMarks = false;
this.RenderDocument(Renderer);
this.m_oWordControl.m_oApi.ShowParaMarks = old_marks;
var ret = Renderer.Memory.GetBase64Memory();
// DEBUG
//console.log(ret);
return ret;
};
this.ToRenderer2 = function()
{
var Renderer = new AscCommon.CDocumentRenderer();
Renderer.InitPicker(AscCommon.g_oTextMeasurer.m_oManager);
var old_marks = this.m_oWordControl.m_oApi.ShowParaMarks;
this.m_oWordControl.m_oApi.ShowParaMarks = false;
var ret = "";
let SlidesCount = this.GetSlidesCount();
for (var i = 0; i < SlidesCount; i++)
{
Renderer.BeginPage(this.m_oLogicDocument.GetWidthMM(), this.m_oLogicDocument.GetHeightMM());
this.m_oLogicDocument.DrawPage(i, Renderer);
Renderer.EndPage();
ret += Renderer.Memory.GetBase64Memory();
Renderer.Memory.Seek(0);
}
this.m_oWordControl.m_oApi.ShowParaMarks = old_marks;
return ret;
};
this.ToRendererPart = function(noBase64, isSelection)
{
var watermark = this.m_oWordControl.m_oApi.watermarkDraw;
let oPresentation = this.m_oWordControl.m_oLogicDocument;
var pagescount = oPresentation.IsVisioEditor() ? oPresentation.GetSlidesCount() : oPresentation.Slides.length;
if (-1 == this.m_lCurrentRendererPage)
{
if (watermark)
watermark.StartRenderer();
this.m_oDocRenderer = new AscCommon.CDocumentRenderer();
this.m_oDocRenderer.InitPicker(AscCommon.g_oTextMeasurer.m_oManager);
this.m_oDocRenderer.VectorMemoryForPrint = new AscCommon.CMemory();
this.m_lCurrentRendererPage = 0;
this.m_bOldShowMarks = this.m_oWordControl.m_oApi.ShowParaMarks;
this.m_oWordControl.m_oApi.ShowParaMarks = false;
this.m_oDocRenderer.IsNoDrawingEmptyPlaceholder = true;
}
var start = this.m_lCurrentRendererPage;
var end = pagescount - 1;
var renderer = this.m_oDocRenderer;
renderer.Memory.Seek(0);
renderer.VectorMemoryForPrint.ClearNoAttack();
renderer.DocInfo(this.m_oWordControl.m_oApi.asc_getCoreProps());
for (var i = start; i <= end; i++)
{
if ((true === isSelection && !this.m_oLogicDocument.IsMasterMode()) && !this.m_oWordControl.Thumbnails.isSelectedPage(i))
continue;
if (oPresentation.IsVisioEditor())
{
//todo override
renderer.BeginPage(this.m_oLogicDocument.GetWidthMM(), this.m_oLogicDocument.GetHeightMM());
this.m_oLogicDocument.DrawPage(i, renderer);
renderer.EndPage();
}
else
{
let oSlide = this.m_oLogicDocument.Slides[i];
if (!oSlide.isVisible())
continue;
renderer.BeginPage(this.m_oLogicDocument.GetWidthMM(), this.m_oLogicDocument.GetHeightMM());
oSlide.draw(renderer);
renderer.EndPage();
}
if (watermark)
watermark.DrawOnRenderer(renderer, this.m_oLogicDocument.GetWidthMM(), this.m_oLogicDocument.GetHeightMM());
}
if (end == -1)
{
renderer.BeginPage(this.m_oLogicDocument.GetWidthMM(), this.m_oLogicDocument.GetHeightMM());
renderer.EndPage()
}
this.m_lCurrentRendererPage = end + 1;
if (this.m_lCurrentRendererPage >= pagescount)
{
if (watermark)
watermark.EndRenderer();
this.m_lCurrentRendererPage = -1;
this.m_oDocRenderer = null;
this.m_oWordControl.m_oApi.ShowParaMarks = this.m_bOldShowMarks;
}
if (noBase64) {
return renderer.Memory.GetData();
} else {
return renderer.Memory.GetBase64Memory();
}
};
// common
this.Start_CollaborationEditing = function()
{
this.IsLockObjectsEnable = true;
this.m_oWordControl.OnRePaintAttack();
};
this.IsMobileVersion = function()
{
if (this.m_oWordControl.MobileTouchManager)
return true;
return false;
};
this.SendChangeDocumentToApi = function(bIsAttack)
{
if (bIsAttack || !this.m_bIsSendApiDocChanged)
{
this.m_bIsSendApiDocChanged = true;
this.m_oWordControl.m_oApi.SetDocumentModified(true);
this.m_oWordControl.m_oApi.sendEvent("asc_onDocumentChanged");
}
};
this.CloseFile = function ()
{
this.IsEmptyPresentation = true;
this.SlideCurrent = -1;
this.ClearCachePages();
this.FirePaint();
};
this.IsCursorInTableCur = function(x, y, page, checkArea)
{
var _table = this.TableOutlineDr.TableOutline;
if (_table == null)
return false;
if (page != _table.PageNum)
return false;
var _dist = this.TableOutlineDr.mover_size * g_dKoef_pix_to_mm;
_dist *= (100 / this.m_oWordControl.m_nZoomValue);
var _x = _table.X;
var _y = _table.Y;
var _r = _x + _table.W;
var _b = _y + _table.H;
if ((x > (_x - _dist)) && (x < _r) && (y > (_y - _dist)) && (y < _b))
{
if ((x < _x && y < _y) || (checkArea && (x < _x || y < _y)))
return true;
}
return false;
};
this.SetCurrentPage = function(PageIndex)
{
if (PageIndex >= this.GetSlidesCount())
return;
if (this.SlideCurrent == PageIndex)
return;
this.SlideCurrent = PageIndex;
this.m_oWordControl.SetCurrentPage();
};
// вот оооочень важные функции. она выкидывает из кэша неиспользуемые шрифты
this.CheckFontCache = function()
{
var map_used = this.m_oWordControl.m_oLogicDocument.Document_CreateFontMap();
var _measure_map = g_oTextMeasurer.m_oManager.m_oFontsCache.Fonts;
var _drawing_map = AscCommon.g_fontManager.m_oFontsCache.Fonts;
var map_keys = {};
var api = this.m_oWordControl.m_oApi;
for (var i in map_used)
{
var key = AscFonts.GenerateMapId(api, g_fontApplication.GetFontInfoName(map_used[i].Name), map_used[i].Style, map_used[i].Size);
map_keys[key] = true;
}
// а теперь просто пробегаем по кэшам и удаляем ненужное
for (var i in _measure_map)
{
if (map_keys[i] == undefined)
{
//_measure_map[i] = undefined;
delete _measure_map[i];
}
}
for (var i in _drawing_map)
{
if (map_keys[i] == undefined)
{
//_drawing_map[i] = undefined;
if (null != _drawing_map[i])
_drawing_map[i].Destroy();
delete _drawing_map[i];
}
}
};
this.CheckFontNeeds = function()
{
var map_keys = this.m_oWordControl.m_oLogicDocument.Document_Get_AllFontNames();
var dstfonts = [];
for (var i in map_keys)
{
dstfonts[dstfonts.length] = new AscFonts.CFont(i);
}
AscFonts.FontPickerByCharacter.extendFonts(dstfonts);
this.m_oWordControl.m_oLogicDocument.Fonts = dstfonts;
return;
};
// comments
this.GetCommentWidth = function(type)
{
var _index = 0;
if ((type & 0x02) == 0x02)
_index = 2;
if ((type & 0x01) == 0x01)
_index += 1;
return AscCommon.g_comment_image_offsets[_index][2] * g_dKoef_pix_to_mm * 100 / this.m_oWordControl.m_nZoomValue;
};
this.GetCommentHeight = function(type)
{
var _index = 0;
if ((type & 0x02) == 0x02)
_index = 2;
if ((type & 0x01) == 0x01)
_index += 1;
return AscCommon.g_comment_image_offsets[_index][3] * g_dKoef_pix_to_mm * 100 / this.m_oWordControl.m_nZoomValue;
};
// collaborative targets
this.Collaborative_UpdateTarget = function(_id, _shortId, _x, _y, _size, _page, _transform, is_from_paint)
{
if (is_from_paint !== true)
{
this.CollaborativeTargetsUpdateTasks.push([_id, _shortId, _x, _y, _size, _page, _transform]);
return;
}
for (var i = 0; i < this.CollaborativeTargets.length; i++)
{
if (_id == this.CollaborativeTargets[i].Id)
{
this.CollaborativeTargets[i].CheckPosition(_x, _y, _size, _page, _transform);
return;
}
}
var _target = new CDrawingCollaborativeTarget(this);
_target.Id = _id;
_target.ShortId = _shortId;
_target.CheckPosition(_x, _y, _size, _page, _transform);
this.CollaborativeTargets[this.CollaborativeTargets.length] = _target;
};
this.Collaborative_RemoveTarget = function(_id)
{
var i = 0;
for (i = 0; i < this.CollaborativeTargets.length; i++)
{
if (_id == this.CollaborativeTargets[i].Id)
{
this.CollaborativeTargets[i].Remove(this);
this.CollaborativeTargets.splice(i, 1);
i--;
}
}
for (i = 0; i < this.CollaborativeTargetsUpdateTasks.length; i++)
{
var _tmp = this.CollaborativeTargetsUpdateTasks[i];
if (_tmp[0] == _id)
{
this.CollaborativeTargetsUpdateTasks.splice(i, 1);
i--;
}
}
};
this.Collaborative_TargetsUpdate = function(bIsChangePosition)
{
var _len_tasks = this.CollaborativeTargetsUpdateTasks.length;
var i = 0;
for (i = 0; i < _len_tasks; i++)
{
var _tmp = this.CollaborativeTargetsUpdateTasks[i];
this.Collaborative_UpdateTarget(_tmp[0], _tmp[1], _tmp[2], _tmp[3], _tmp[4], _tmp[5], _tmp[6], true);
}
if (_len_tasks != 0)
this.CollaborativeTargetsUpdateTasks.splice(0, _len_tasks);
if (bIsChangePosition)
{
for (i = 0; i < this.CollaborativeTargets.length; i++)
{
this.CollaborativeTargets[i].Update(this);
}
}
};
this.Collaborative_GetTargetPosition = function(UserId)
{
for (var i = 0; i < this.CollaborativeTargets.length; i++)
{
if (UserId == this.CollaborativeTargets[i].Id)
return {X : this.CollaborativeTargets[i].HtmlElementX, Y : this.CollaborativeTargets[i].HtmlElementY};
}
return null;
};
// notes
this.Notes_GetWidth = function()
{
if (!this.m_oWordControl.IsNotesSupported())
return 0;
if (!this.m_oWordControl.m_oNotesApi)
return 0;
return this.m_oWordControl.m_oNotesApi.GetNotesWidth();
};
this.Notes_OnRecalculate = function(slideNum, width, height)
{
if (!this.m_oWordControl.IsNotesSupported())
return;
if (!this.m_oWordControl.m_oNotesApi)
return;
this.m_oWordControl.m_oNotesApi.OnRecalculateNote(slideNum, width, height);
};
// mouse events
this.checkMouseDown_Drawing = function (pos)
{
var oWordControl = this.m_oWordControl;
var bIsReturn = false;
if (!this.isButtonsDisabled() && this.placeholders.onPointerDown(pos, this.SlideCurrectRect, this.m_oLogicDocument.GetWidthMM(), this.m_oLogicDocument.GetHeightMM()))
{
bIsReturn = true;
this.m_oWordControl.onMouseUpMainSimple();
}
if (bIsReturn)
{
oWordControl.OnUpdateOverlay();
oWordControl.EndUpdateOverlay();
}
return bIsReturn;
};
this.checkMouseMove_Drawing = function (pos)
{
var oWordControl = this.m_oWordControl;
var bIsReturn = false;
if (this.InlineTextTrackEnabled)
{
if (-1 != oWordControl.m_oTimerScrollSelect)
{
clearInterval(oWordControl.m_oTimerScrollSelect);
oWordControl.m_oTimerScrollSelect = -1;
}
this.InlineTextTrack = oWordControl.m_oLogicDocument.Get_NearestPos(pos.Page, pos.X, pos.Y, pos.isNotes);
this.InlineTextTrackPage = pos.Page;
this.InlineTextInNotes = pos.isNotes ? true : false;
bIsReturn = true;
}
else
{
if(!AscCommon.global_mouseEvent.IsLocked)
{
if (!this.isButtonsDisabled() && this.placeholders.onPointerMove(pos, this.SlideCurrectRect, this.m_oLogicDocument.GetWidthMM(), this.m_oLogicDocument.GetHeightMM()))
{
oWordControl.OnUpdateOverlay();
oWordControl.EndUpdateOverlay();
bIsReturn = true;
}
}
}
if (bIsReturn)
{
oWordControl.OnUpdateOverlay();
oWordControl.EndUpdateOverlay();
}
return bIsReturn;
};
this.isButtonsDisabled = function()
{
return Asc.editor.isEyedropperStarted() || Asc.editor.isDrawInkMode();
};
this.checkMouseUp_Drawing = function (pos)
{
var oWordControl = this.m_oWordControl;
var bIsReturn = false;
if (this.InlineTextTrackEnabled)
{
this.InlineTextTrack = oWordControl.m_oLogicDocument.Get_NearestPos(pos.Page, pos.X, pos.Y, pos.isNotes);
this.InlineTextTrackPage = pos.Page;
this.InlineTextInNotes = pos.isNotes ? true : false;
this.EndTrackText();
bIsReturn = true;
}
else if (!this.isButtonsDisabled() && this.placeholders.onPointerUp(pos, this.SlideCurrectRect, this.m_oLogicDocument.GetWidthMM(), this.m_oLogicDocument.GetHeightMM()))
bIsReturn = true;
if (bIsReturn)
{
oWordControl.OnUpdateOverlay();
oWordControl.EndUpdateOverlay();
}
return bIsReturn;
};
this.GetCurSld = function()
{
return this.m_oWordControl.Thumbnails.GetCurSld();
};
this.OnStartImagesLoading = function(aImages)
{
this.LoadingImages = [].concat(aImages);
};
this.CheckRasterImageOnScreen = function (src)
{
const oPresentation = oThis.m_oWordControl.m_oLogicDocument;
const oDemonstrationManager = oThis.m_oWordControl.DemonstrationManager;
let sCheckImage = AscCommon.getFullImageSrc2(src);
if (oDemonstrationManager && oDemonstrationManager.Mode) {
const oSlide = oDemonstrationManager.GetCurrentSlide();
if (oSlide && oSlide.checkImageDraw(sCheckImage)) {
const oPlayer = oSlide.getAnimationPlayer();
if (oPlayer) {
oPlayer.clearImageCache(sCheckImage);
}
oDemonstrationManager.Resize(true);
}
}
let oCurSlide = oPresentation.GetCurrentSlide();
if(!oCurSlide)
return;
let bRedraw = false;
let nCurIdx = oPresentation.GetSlideIndex(oCurSlide);
if(oCurSlide.checkImageDraw(sCheckImage))
{
this.OnRecalculateSlide(nCurIdx);
bRedraw = true;
}
//check visible thumbnails
let oWordControl = oThis.m_oWordControl;
let oThumbnails = oWordControl.Thumbnails;
let nStart = oThumbnails.m_lDrawingFirst;
let nEnd = oThumbnails.m_lDrawingEnd;
for(let nIdx = nStart; nIdx <= nEnd; ++nIdx)
{
if(nIdx !== nCurIdx)
{
let oSlide = oPresentation.GetSlide(nIdx);
if(oSlide && oSlide.checkImageDraw(sCheckImage))
{
this.OnRecalculateSlide(nIdx);
bRedraw = true;
}
}
}
if(bRedraw)
{
this.OnEndRecalculate();
}
for(let nImg = 0; nImg < this.LoadingImages.length; ++nImg)
{
if(this.LoadingImages[nImg] === sCheckImage)
{
this.LoadingImages.splice(nImg, 1);
break;
}
}
if(this.LoadingImages.length === 0)
{
oWordControl.CheckLayouts(true);
oPresentation.SendThemesThumbnails();
this.DrawImageTextureFillShape(this.LastDrawingUrl);
this.DrawImageTextureFillSlide(this.LastDrawingUrlSlide);
this.DrawImageTextureFillTextArt(this.LastDrawingUrlTextArt);
}
};
}
function CThPage()
{
this.PageIndex = -1;
this.left = 0;
this.top = 0;
this.right = 0;
this.bottom = 0;
this.IsRecalc = false;
this.cachedImage = null;
this.IsSelected = false;
this.IsFocused = false;
}
CThPage.prototype.Draw = function(context, xDst, yDst, wDst, hDst)
{
if (wDst <= 0 || hDst <= 0)
return;
if (null != this.cachedImage)
{
// потом посмотреть на кусочную отрисовку
context.drawImage(this.cachedImage.image, xDst, yDst, wDst, hDst);
}
else
{
context.fillStyle = "#FFFFFF";
context.fillRect(xDst, yDst, wDst, hDst);
}
};
CThPage.prototype.Hit = function (x, y) {
return (
x >= this.left &&
x <= this.right &&
y >= this.top &&
y <= this.bottom
);
};
CThPage.prototype.SetRecalc = function(bValue)
{
this.IsRecalc = bValue;
};
CThPage.prototype.GetRecalc = function(bValue)
{
return this.IsRecalc;
};
CThPage.prototype.SetSelected = function(bValue)
{
this.IsSelected = bValue;
};
CThPage.prototype.SetFocused = function(bValue)
{
this.IsFocused = bValue;
};
CThPage.prototype.IsPageSelected = function()
{
return this.IsSelected;
};
CThPage.prototype.GetPosition = function()
{
return this.Position;
};
function DrawBackground(graphics, unifill, w, h)
{
// первым делом рисуем белый рект!
if (true)
{
// ну какой-то бэкграунд должен быть
graphics.SetIntegerGrid(false);
var _l = 0;
var _t = 0;
var _r = (0 + w);
var _b = (0 + h);
graphics._s();
graphics._m(_l, _t);
graphics._l(_r, _t);
graphics._l(_r, _b);
graphics._l(_l, _b);
graphics._z();
graphics.b_color1(255, 255, 255, 255);
graphics.df();
graphics._e();
}
if (unifill == null || unifill.fill == null)
return;
graphics.SetIntegerGrid(false);
var _shape = AscFormat.ExecuteNoHistory(function(){ return new AscFormat.CShape();}, this, [], false);
_shape.brush = unifill;
_shape.pen = null;
_shape.TransformMatrix = new AscCommon.CMatrix();
_shape.extX = w;
_shape.extY = h;
_shape.bounds.reset(0, 0, w, h);
_shape.check_bounds = function(checker)
{
checker._s();
checker._m(0, 0);
checker._l(this.extX, 0);
checker._l(this.extX, this.extY);
checker._l(0, this.extY);
checker._z();
checker._e();
};
var shape_drawer = new AscCommon.CShapeDrawer();
shape_drawer.fromShape2(_shape, graphics, null);
shape_drawer.draw(null);
}
function CMouseDownTrack(Thumbnails)
{
this.Thumbnails = Thumbnails;
this.SetDefault();
}
CMouseDownTrack.prototype.Check = function()
{
if(this.Started)
{
let aThPages = this.Thumbnails.m_arrPages;
if(!aThPages[this.Page])
{
this.Reset();
}
}
};
CMouseDownTrack.prototype.SetDefault = function()
{
this.Started = false;
this.StartedSimple = true;
this.Page = -1;
this.X = -1;
this.Y = -1;
this.Position = -1;
};
CMouseDownTrack.prototype.Reset = function()
{
this.SetDefault();
};
CMouseDownTrack.prototype.Start = function(Page, X, Y)
{
this.Started = true;
this.StartedSimple = true;
this.Page = Page;
this.X = X;
this.Y = Y;
};
CMouseDownTrack.prototype.IsStarted = function()
{
this.Check();
return this.Started;
};
CMouseDownTrack.prototype.IsSimple = function()
{
this.Check();
return this.StartedSimple;
};
CMouseDownTrack.prototype.IsDragged = function()
{
return this.IsStarted() && !this.IsSimple() && this.GetPosition() !== -1;
};
CMouseDownTrack.prototype.ResetSimple = function(Position)
{
this.StartedSimple = false;
this.Position = Position;
};
CMouseDownTrack.prototype.SetPosition = function(Position)
{
this.Position = Position;
};
CMouseDownTrack.prototype.GetPosition = function()
{
this.Check();
return this.Position;
};
CMouseDownTrack.prototype.GetPage = function()
{
this.Check();
return this.Page;
};
CMouseDownTrack.prototype.GetX = function()
{
this.Check();
return this.X;
};
CMouseDownTrack.prototype.GetY = function()
{
this.Check();
return this.Y;
};
CMouseDownTrack.prototype.IsMoved = function(X, Y)
{
this.Check();
if (Math.abs(this.X - X) > 10 || Math.abs(this.Y - Y) > 10)
return true;
return false;
};
CMouseDownTrack.prototype.IsSamePos = function()
{
this.Check();
return this.Position === this.Page || this.Position === (this.Page + 1);
};
function CThPosBase(oThumbnails)
{
this.thumbnails = oThumbnails;
}
CThPosBase.prototype.Increment = function() {};
CThPosBase.prototype.Decrement = function() {};
CThPosBase.prototype.IsLess = function(oPos)
{
return false;
};
CThPosBase.prototype.IsGreater = function(oPos)
{
return false;
};
CThPosBase.prototype.IsLessOrEqual = function(oPos)
{
return this.IsLess(oPos) || this.IsEqual(oPos);
};
CThPosBase.prototype.IsGreaterOrEqual = function(oPos)
{
return this.IsGreater(oPos) || this.IsEqual(oPos);
};
CThPosBase.prototype.IsEqual = function(oPos)
{
return false;
};
CThPosBase.prototype.Copy = function()
{
return new CThPosBase(this.thumbnails);
};
CThPosBase.prototype.GetPage = function()
{
return this.thumbnails.GetPage(this);
};
CThPosBase.prototype.GetSld = function()
{
return null;
};
CThPosBase.prototype.GetPresentation = function()
{
return Asc.editor.WordControl.m_oLogicDocument;
};
function CSlideThPos(oThumbnails)
{
CThPosBase.call(this, oThumbnails);
this.Idx = -1;
}
AscFormat.InitClassWithoutType(CSlideThPos, CThPosBase);
CSlideThPos.prototype.Check = function()
{
let aThs = this.thumbnails.slides;
let nMaxIdx = aThs.length - 1;
let nMinIdx = Math.min(nMaxIdx, 0);
this.Idx = Math.max(nMinIdx, Math.min(this.Idx, nMaxIdx));
};
CSlideThPos.prototype.Increment = function()
{
++this.Idx;
this.Check();
};
CSlideThPos.prototype.Decrement = function()
{
--this.Idx;
this.Check();
};
CSlideThPos.prototype.IsLess = function(oPos)
{
return this.Idx < oPos.Idx;
};
CSlideThPos.prototype.IsGreater = function(oPos)
{
return this.Idx > oPos.Idx;
};
CSlideThPos.prototype.IsEqual = function(oPos)
{
return this.Idx === oPos.Idx;
};
CSlideThPos.prototype.Copy = function()
{
let oPos = new CSlideThPos(this.thumbnails);
oPos.Idx = this.Idx;
return oPos;
};
CSlideThPos.prototype.GetSld = function()
{
return this.GetPresentation().Slides[this.Idx];
};
function CMasterThPos(oThumbnails)
{
CThPosBase.call(this, oThumbnails);
this.MasterIdx = -1;
this.LayoutIdx = -1;
}
AscFormat.InitClassWithoutType(CMasterThPos, CThPosBase);
CMasterThPos.prototype.Check = function()
{
let nOldMasterIdx = this.MasterIdx;
let aThs = this.thumbnails.masters;
let nMaxMasterIdx = aThs.length - 1;
let nMinMasterIdx = Math.min(nMaxMasterIdx, 0);
this.MasterIdx = Math.max(nMinMasterIdx, Math.min(this.MasterIdx, nMaxMasterIdx));
if(this.MasterIdx !== nOldMasterIdx)
{
this.LayoutIdx = -1;
return;
}
if(this.LayoutIdx === -1)
{
return;
}
let oMasterTh = aThs[this.MasterIdx];
let aLayoutsTh = oMasterTh.layoutPages;
let nMaxLayoutIdx = aLayoutsTh.length - 1;
let nMinLayoutIdx = Math.min(nMaxLayoutIdx, 0);
this.LayoutIdx = Math.max(nMinLayoutIdx, Math.min(this.LayoutIdx, nMaxLayoutIdx));
};
CMasterThPos.prototype.Increment = function()
{
let oMasterThs = this.thumbnails.GetMasterThumbnails(this.MasterIdx);
let nLayoutsCount = oMasterThs.GetLayoutsCount();
if(this.LayoutIdx + 1 < nLayoutsCount)
{
++this.LayoutIdx;
}
else
{
if(this.MasterIdx + 1 < this.thumbnails.GetMastersCount())
{
++this.MasterIdx;
this.LayoutIdx = - 1;
}
}
};
CMasterThPos.prototype.Decrement = function()
{
if(this.LayoutIdx > -1)
{
--this.LayoutIdx;
return;
}
this.MasterIdx = Math.max(-1, this.MasterIdx - 1);
let oMasterThs = this.thumbnails.GetMasterThumbnails(this.MasterIdx);
if(oMasterThs)
{
this.LayoutIdx = oMasterThs.GetLayoutsCount() - 1;
}
};
CMasterThPos.prototype.IsLess = function(oPos)
{
if(this.MasterIdx > oPos.MasterIdx) return false;
if(this.MasterIdx < oPos.MasterIdx) return true;
return this.LayoutIdx < oPos.LayoutIdx;
};
CMasterThPos.prototype.IsGreater = function(oPos)
{
return !this.IsLess(oPos) && !this.IsEqual(oPos);
};
CMasterThPos.prototype.IsEqual = function(oPos)
{
return (oPos.MasterIdx === this.MasterIdx && oPos.LayoutIdx === this.LayoutIdx);
};
CMasterThPos.prototype.Copy = function()
{
let oPos = new CMasterThPos(this.thumbnails);
oPos.MasterIdx = this.MasterIdx;
oPos.LayoutIdx = this.LayoutIdx;
return oPos;
};
CMasterThPos.prototype.GetSld = function()
{
let oPresentation = this.GetPresentation();
let oMaster = oPresentation.slideMasters[this.MasterIdx];
if(!oMaster) return null;
if(this.LayoutIdx === -1) {
return oMaster;
}
return oMaster.sldLayoutLst[this.LayoutIdx];
};
function CThumbnailsBase() {
this.curPos = this.GetIterator();
this.firstVisible = this.GetIterator();
this.lastVisible = this.GetIterator();
}
CThumbnailsBase.prototype.GetIterator = function()
{
throw new Error();
};
CThumbnailsBase.prototype.SetSlideRecalc = function (idx) {
let oTh = this.GetPage(idx);
if(oTh)
{
oTh.SetRecalc(true);
}
};
CThumbnailsBase.prototype.GetPage = function (oIdx) {
return null;
};
CThumbnailsBase.prototype.SelectAll = function()
{
this.IteratePages(this.GetStartPos(), this.GetEndPos(), function(oPage) {
oPage.SetSelected(true);
return false;
});
};
CThumbnailsBase.prototype.FindThUnderCursor = function(X, Y)
{
this.IteratePages(this.GetStartPos(), this.GetEndPos(), function(oPage) {
if(oPage.Hit(X, Y))
{
return oPage;
}
});
};
CThumbnailsBase.prototype.ResetSelection = function()
{
this.IteratePages(this.GetStartPos(), this.GetEndPos(), function(oPage) {
oPage.SetSelected(false);
return false;
});
};
CThumbnailsBase.prototype.SetAllFocused = function(bValue)
{
this.IteratePages(this.GetStartPos(), this.GetEndPos(), function(oPage) {
oPage.SetFocused(bValue);
return false;
});
};
CThumbnailsBase.prototype.SetAllRecalc = function (bValue) {
this.IteratePages(this.GetStartPos(), this.GetEndPos(), function(oPage) {
oPage.SetRecalc(bValue);
return false;
});
};
CThumbnailsBase.prototype.SelectRange = function(oStartPos, oEndPos)
{
this.SetSelectionRange(oStartPos, oEndPos, true);
};
CThumbnailsBase.prototype.SetSelectionRange = function(oStartPos, oEndPos, bValue)
{
this.IteratePages(oStartPos, oEndPos, function(oPage) {
oPage.SetSelected(bValue);
return false;
});
};
CThumbnailsBase.prototype.GetStartPos = function()
{
throw new Error();
};
CThumbnailsBase.prototype.GetEndPos = function()
{
throw new Error();
};
CThumbnailsBase.prototype.IteratePages = function(oStartPos, oEndPos, fAction)
{
if(oStartPos.IsLessOrEqual(oEndPos))
{
for(let oPos = oStartPos.Copy(); oPos.IsLessOrEqual(oEndPos); oPos.Increment())
{
let oPage = oPos.GetPage();
if(!oPage)
return null;
if(oPage)
{
let oResult = fAction(oPos.GetPage());
if(oResult)
{
return oResult;
}
}
}
}
return null;
};
CThumbnailsBase.prototype.GetPagesCount = function()
{
let nCount = 0;
this.IteratePages(this.GetStartPos(), this.GetEndPos(), function(oPage) {
nCount++;
return false;
});
return nCount;
};
CThumbnailsBase.prototype.ConvertCoords2 = function(X, Y)
{
let pages_count = this.GetPagesCount();
if (0 == pages_count)
return -1;
let oStartPos = this.GetStartPos();
let oEndPos = this.GetEndPos();
let _min = Math.abs(Y - this.GetStartPos().GetPage().top);
let _MinPositionPage = 0;
this.IteratePages(oStartPos, oEndPos, function(oPage) {
let _min1 = Math.abs(Y - oPage.top);
let _min2 = Math.abs(Y - oPage.bottom);
if (_min1 < _min)
{
_min = _min1;
_MinPositionPage = oPage.GetPosition();
}
if (_min2 < _min)
{
_min = _min2;
_MinPositionPage = oPage.GetPosition().Increment();
}
});
return _MinPositionPage;
};
CThumbnailsBase.prototype.GetPagePosition = function(oPageIdx)
{
let oPage = this.GetPage(oPageIdx);
if(!oPage) return null;
let _ret = {
X: AscCommon.AscBrowser.convertToRetinaValue(oPage.left),
Y: AscCommon.AscBrowser.convertToRetinaValue(oPage.top),
W: AscCommon.AscBrowser.convertToRetinaValue(oPage.right - oPage.left),
H: AscCommon.AscBrowser.convertToRetinaValue(oPage.bottom - oPage.top)
};
return _ret;
};
CThumbnailsBase.prototype.GetCurSld = function()
{
return this.curPos.GetSld();
};
CThumbnailsBase.prototype.IndexToPos = function(nIndex)
{
return null;
};
CThumbnailsBase.prototype.PosToIndex = function(oPos)
{
return null;
};
function CSlidesThumbnails() {
CThumbnailsBase.call(this);
this.slides = [];
}
AscFormat.InitClassWithoutType(CSlidesThumbnails, CThumbnailsBase);
CSlidesThumbnails.prototype.GetIterator = function()
{
return new CSlideThPos(this);
};
CSlidesThumbnails.prototype.clear = function ()
{
this.slides.length = 0;
this.cusSlide = -1;
this.firstVisible = -1;
this.lastVisible = -1;
};
CSlidesThumbnails.prototype.GetStartPos = function()
{
let oPos = this.GetIterator();
oPos.Idx = Math.min(0, this.slides.length - 1);
return oPos;
};
CSlidesThumbnails.prototype.GetEndPos = function()
{
let oPos = this.GetIterator();
oPos.Idx = this.slides.length - 1;
return oPos;
};
CSlidesThumbnails.prototype.IndexToPos = function(nIndex)
{
let oPos = this.GetIterator();
oPos.Idx = nIndex;
return oPos;
};
CSlidesThumbnails.prototype.PosToIndex = function(oPos)
{
if(!oPos) return -1;
return oPos.Idx;
};
function CMastersThumbnails()
{
CThumbnailsBase.call(this);
this.masters = [];
}
AscFormat.InitClassWithoutType(CMastersThumbnails, CThumbnailsBase);
CMastersThumbnails.prototype.clear = function ()
{
for(let nIdx = 0; nIdx < this.masters.length; ++nIdx)
{
this.masters[nIdx].preDelete();
}
this.masters.length = 0;
};
CMastersThumbnails.prototype.GetPage = function(oPos)
{
if(!Asc.Format.isRealObject(oPos)) return null;
let oMasterTh = this.masters[oPos.MasterIdx];
if(!oMasterTh) return null;
return oMasterTh.GetPage(oPos);
};
CMastersThumbnails.prototype.GetMastersCount = function ()
{
return this.masters.length;
};
CMastersThumbnails.prototype.GetMasterThumbnails = function (nIdx)
{
return this.masters[nIdx] || null;
};
CMastersThumbnails.prototype.GetIterator = function()
{
return new CMasterThPos(this);
};
CMastersThumbnails.prototype.GetStartPos = function()
{
let oPos = this.GetIterator();
oPos.MasterIdx = Math.min(0, this.masters.length - 1);
};
CMastersThumbnails.prototype.GetEndPos = function()
{
let oPos = this.GetIterator();
oPos.MasterIdx = this.masters.length - 1;
let oMasterThs = this.GetMasterThumbnails(oPos.MasterIdx);
if(oMasterThs)
{
oPos.LayoutIdx = oMasterThs.GetLayoutsCount() - 1;
}
return oPos;
};
CMastersThumbnails.prototype.IndexToPos = function(nIndex)
{
let nIdx = 0;
let oPosition = null;
this.IteratePages(this.GetStartPos(), this.GetEndPos(), function(oPage, oPos) {
if(nIdx === nIndex) {
oPosition = oPos;
return true;
}
++nIdx;
});
return oPosition;
};
CSlidesThumbnails.prototype.PosToIndex = function(oPos)
{
let nIdx = -1;
this.IteratePages(this.GetStartPos(), this.GetEndPos(), function(oPage, oPosition) {
++nIdx;
if(oPos.IsEqual(oPosition)) {
return true;
}
return false;
});
return nIdx;
};
function CMasterThumbnails(oMaster)
{
this.master = oMaster;
this.masterPage = null;//new CThPage()
this.layoutPages = [];//new CThPage()[]
this.id = this.master.Id;
let oThis = this;
Asc.editor.attachEvent("slideMasterUpdate", function (oMaster) {
if(oMaster === this.master) {
oThis.update();
}
}, this.id);
this.update();
}
CMasterThumbnails.prototype.GetPage = function(oPos)
{
if(!oPos) return null;
return this.layoutPages[oPos.LayoutIdx] || this.masterPage;
};
CMasterThumbnails.prototype.GetLayoutsCount = function()
{
return this.layoutPages.length;
};
CMasterThumbnails.prototype.preDelete = function() {
Asc.editor.detachEvent("slideMasterUpdate", this.id);
};
CMasterThumbnails.prototype.update = function() {
if(!this.masterPage) {
this.masterPage = new CThPage();
}
let aLayouts = this.master.sldLayoutLst;
this.layoutPages.length = 0;
for(let nIdx = 0; nIdx < aLayouts.length; ++nIdx) {
this.layoutPages.push(new CThPage());
}
};
function CThumbnailsManager(editorPage)
{
this.isInit = false;
this.lastPixelRatio = 0;
this.m_oFontManager = new AscFonts.CFontManager();
this.m_bIsScrollVisible = true;
// cached measure
this.DigitWidths = [];
// skin
this.backgroundColor = "#B0B0B0";
this.overColor = "#D3D3D3";
this.selectColor = "#FFD86B";
this.selectoverColor = "#FFE065";
this.const_offset_x = 0;
this.const_offset_y = 0;
this.const_offset_r = 4;
this.const_offset_b = 0;
this.const_border_w = 4;
// size & position
this.SlideWidth = 297;
this.SlideHeight = 210;
this.m_dScrollY = 0;
this.m_dScrollY_max = 0;
this.m_bIsUpdate = false;
//regular mode
this.thumbnails = new CSlidesThumbnails();
this.m_nCurrentPage = -1;
this.m_arrPages = [];
this.m_lDrawingFirst = -1;
this.m_lDrawingEnd = -1;
this.bIsEmptyDrawed = false;
this.m_oCacheManager = new CCacheManager(true);
this.FocusObjType = FOCUS_OBJECT_MAIN;
this.LockMainObjType = false;
this.SelectPageEnabled = true;
this.MouseDownTrack = new CMouseDownTrack(this);
this.MouseTrackCommonImage = null;
this.MouseThumbnailsAnimateScrollTopTimer = -1;
this.MouseThumbnailsAnimateScrollBottomTimer = -1;
this.ScrollerHeight = 0;
this.ScrollerWidth = 0;
this.m_oWordControl = editorPage;
var oThis = this;
this.IsMasterMode = function() {
return Asc.editor.isMasterMode();
};
// init
this.Init = function()
{
this.isInit = true;
this.m_oFontManager.Initialize(true);
this.m_oFontManager.SetHintsProps(true, true);
this.InitCheckOnResize();
this.MouseTrackCommonImage = document.createElement("canvas");
var _im_w = 9;
var _im_h = 9;
this.MouseTrackCommonImage.width = _im_w;
this.MouseTrackCommonImage.height = _im_h;
var _ctx = this.MouseTrackCommonImage.getContext('2d');
var _data = _ctx.createImageData(_im_w, _im_h);
var _pixels = _data.data;
var _ind = 0;
for (var j = 0; j < _im_h; ++j)
{
var _off1 = (j > (_im_w >> 1)) ? (_im_w - j - 1) : j;
var _off2 = _im_w - _off1 - 1;
for (var r = 0; r < _im_w; ++r)
{
if (r <= _off1 || r >= _off2)
{
_pixels[_ind++] = 183;
_pixels[_ind++] = 183;
_pixels[_ind++] = 183;
_pixels[_ind++] = 255;
} else
{
_pixels[_ind + 3] = 0;
_ind += 4;
}
}
}
_ctx.putImageData(_data, 0, 0);
};
this.InitCheckOnResize = function()
{
if (!this.isInit)
return;
if (Math.abs(this.lastPixelRatio - AscCommon.AscBrowser.retinaPixelRatio) < 0.01)
return;
this.lastPixelRatio = AscCommon.AscBrowser.retinaPixelRatio;
this.SetFont({
FontFamily: {Name: "Arial", Index: -1},
Italic: false,
Bold: false,
FontSize: Math.round(10 * AscCommon.AscBrowser.retinaPixelRatio)
});
// измеряем все цифры
for (var i = 0; i < 10; i++)
{
var _meas = this.m_oFontManager.MeasureChar(("" + i).charCodeAt(0));
if (_meas)
this.DigitWidths[i] = _meas.fAdvanceX * 25.4 / 96;
else
this.DigitWidths[i] = 10;
}
if (Asc.editor.getThumbnailsPosition() === thumbnailsPositionMap.bottom) {
this.const_offset_x = Math.round(this.lastPixelRatio * 17);
this.const_offset_r = this.const_offset_y;
this.const_offset_b = Math.round(this.lastPixelRatio * 10);
this.const_border_w = Math.round(this.lastPixelRatio * 7);
} else {
this.const_offset_y = Math.round(this.lastPixelRatio * 17);
this.const_offset_b = this.const_offset_y;
this.const_offset_r = Math.round(this.lastPixelRatio * 10);
this.const_border_w = Math.round(this.lastPixelRatio * 7);
}
};
this.initEvents = function()
{
var control = this.m_oWordControl.m_oThumbnails.HtmlElement;
AscCommon.addMouseEvent(control, "down", this.onMouseDown);
AscCommon.addMouseEvent(control, "move", this.onMouseMove);
AscCommon.addMouseEvent(control, "up", this.onMouseUp);
control.onmouseout = this.onMouseLeave;
control.onmousewheel = this.onMouseWhell;
if (control.addEventListener)
{
control.addEventListener("DOMMouseScroll", this.onMouseWhell, false);
}
};
this.GetPageByPos = function(oPos)
{
return this.thumbnails.GetPage(oPos);
};
this.GetSlidesCount = function()
{
return Asc.editor.getCountSlides();
};
this.SetFont = function(font)
{
font.FontFamily.Name = g_fontApplication.GetFontFileWeb(font.FontFamily.Name, 0).m_wsFontName;
if (-1 == font.FontFamily.Index)
font.FontFamily.Index = AscFonts.g_map_font_index[font.FontFamily.Name];
if (font.FontFamily.Index == undefined || font.FontFamily.Index == -1)
return;
var bItalic = true === font.Italic;
var bBold = true === font.Bold;
var oFontStyle = FontStyle.FontStyleRegular;
if (!bItalic && bBold)
oFontStyle = FontStyle.FontStyleBold;
else if (bItalic && !bBold)
oFontStyle = FontStyle.FontStyleItalic;
else if (bItalic && bBold)
oFontStyle = FontStyle.FontStyleBoldItalic;
g_fontApplication.LoadFont(font.FontFamily.Name, AscCommon.g_font_loader, this.m_oFontManager, font.FontSize, oFontStyle, 96, 96);
};
this.SetSlideRecalc = function (nIdx)
{
this.thumbnails.SetSlideRecalc(nIdx);
};
this.SelectAll = function()
{
this.thumbnails.SelectAll();
this.OnUpdateOverlay();
};
this.GetFirstSelectedType = function()
{
return this.m_oWordControl.m_oLogicDocument.GetFirstSelectedType();
};
this.GetSlideType = function(nIdx)
{
return this.m_oWordControl.m_oLogicDocument.GetSlideType(nIdx);
};
this.IsMixedSelection = function()
{
return this.m_oWordControl.m_oLogicDocument.IsMixedSelection();
};
// events
this.onMouseDown = function (e) {
const mobileTouchManager = oThis.m_oWordControl ? oThis.m_oWordControl.MobileTouchManagerThumbnails : null;
if (mobileTouchManager && mobileTouchManager.checkTouchEvent(e, true)) {
mobileTouchManager.startTouchingInProcess();
const res = mobileTouchManager.mainOnTouchStart(e);
mobileTouchManager.stopTouchingInProcess();
return res;
}
if (oThis.m_oWordControl) {
oThis.m_oWordControl.m_oApi.checkInterfaceElementBlur();
oThis.m_oWordControl.m_oApi.checkLastWork();
// после fullscreen возможно изменение X, Y после вызова Resize.
oThis.m_oWordControl.checkBodyOffset();
}
AscCommon.stopEvent(e);
if (AscCommon.g_inputContext && AscCommon.g_inputContext.externalChangeFocus())
return;
var control = oThis.m_oWordControl.m_oThumbnails.HtmlElement;
if (global_mouseEvent.IsLocked == true && global_mouseEvent.Sender != control) {
// кто-то зажал мышку. кто-то другой
return false;
}
AscCommon.check_MouseDownEvent(e);
global_mouseEvent.LockMouse();
const oPresentation = oThis.m_oWordControl.m_oLogicDocument;
let nStartHistoryIndex = oPresentation.History.Index;
function checkSelectionEnd() {
if (nStartHistoryIndex === oPresentation.History.Index) {
Asc.editor.sendEvent("asc_onSelectionEnd");
}
}
oThis.m_oWordControl.m_oApi.sync_EndAddShape();
if (global_mouseEvent.Sender != control) {
// такого быть не должно
return false;
}
if (global_mouseEvent.Button == undefined)
global_mouseEvent.Button = 0;
oThis.SetFocusElement(FOCUS_OBJECT_THUMBNAILS);
var pos = oThis.ConvertCoords(global_mouseEvent.X, global_mouseEvent.Y);
if (pos.Page == -1) {
if (global_mouseEvent.Button == 2) {
oThis.showContextMenu(false);
}
checkSelectionEnd();
return false;
}
if (global_keyboardEvent.CtrlKey && !oThis.m_oWordControl.m_oApi.isReporterMode) {
if (oThis.m_arrPages[pos.Page].IsSelected === true) {
oThis.m_arrPages[pos.Page].IsSelected = false;
var arr = oThis.GetSelectedArray();
if (0 == arr.length) {
oThis.m_arrPages[pos.Page].IsSelected = true;
oThis.ShowPage(pos.Page);
} else {
oThis.OnUpdateOverlay();
oThis.SelectPageEnabled = false;
oThis.m_oWordControl.GoToPage(arr[0]);
oThis.SelectPageEnabled = true;
oThis.ShowPage(arr[0]);
}
} else {
if (oThis.GetFirstSelectedType() === oThis.GetSlideType(pos.Page)) {
oThis.m_arrPages[pos.Page].IsSelected = true;
oThis.OnUpdateOverlay();
oThis.SelectPageEnabled = false;
oThis.m_oWordControl.GoToPage(pos.Page);
oThis.SelectPageEnabled = true;
oThis.ShowPage(pos.Page);
}
}
} else if (global_keyboardEvent.ShiftKey && !oThis.m_oWordControl.m_oApi.isReporterMode) {
var pages_count = oThis.m_arrPages.length;
for (var i = 0; i < pages_count; i++) {
oThis.m_arrPages[i].IsSelected = false;
}
var _max = pos.Page;
var _min = oThis.m_oWordControl.m_oDrawingDocument.SlideCurrent;
if (_min > _max) {
var _temp = _max;
_max = _min;
_min = _temp;
}
let nSlideType = oThis.GetSlideType(_min);
for (var i = _min; i <= _max; i++) {
if (nSlideType === oThis.GetSlideType(i)) {
oThis.m_arrPages[i].IsSelected = true;
}
}
oThis.OnUpdateOverlay();
oThis.ShowPage(pos.Page);
oPresentation.Document_UpdateInterfaceState();
} else if (0 == global_mouseEvent.Button || 2 == global_mouseEvent.Button) {
let isMouseDownOnAnimPreview = false;
if (0 == global_mouseEvent.Button) {
if (oThis.m_arrPages[pos.Page].animateLabelRect) // click on the current star, preview animation button, slide transition
{
let animateLabelRect = oThis.m_arrPages[pos.Page].animateLabelRect;
if (pos.X >= animateLabelRect.minX && pos.X <= animateLabelRect.maxX && pos.Y >= animateLabelRect.minY && pos.Y <= animateLabelRect.maxY)
isMouseDownOnAnimPreview = true
}
if (!isMouseDownOnAnimPreview) // приготавливаемся к треку
{
oThis.MouseDownTrack.Start(pos.Page, global_mouseEvent.X, global_mouseEvent.Y);
}
}
if (oThis.m_arrPages[pos.Page].IsSelected) {
let isStartedAnimPreview = (oThis.m_oWordControl.m_oLogicDocument.IsStartedPreview() || (oThis.m_oWordControl.m_oDrawingDocument.TransitionSlide && oThis.m_oWordControl.m_oDrawingDocument.TransitionSlide.IsPlaying()));
oThis.SelectPageEnabled = false;
oThis.m_oWordControl.GoToPage(pos.Page);
oThis.SelectPageEnabled = true;
if (!isStartedAnimPreview) {
if (isMouseDownOnAnimPreview) {
oThis.m_oWordControl.m_oApi.SlideTransitionPlay(function () { oThis.m_oWordControl.m_oApi.asc_StartAnimationPreview() });
}
}
if (oThis.m_oWordControl.m_oNotesApi.IsEmptyDraw) {
oThis.m_oWordControl.m_oNotesApi.IsEmptyDraw = false;
oThis.m_oWordControl.m_oNotesApi.IsRepaint = true;
}
if (global_mouseEvent.Button == 2 && !global_keyboardEvent.CtrlKey) {
oThis.showContextMenu(false);
}
checkSelectionEnd();
return false;
}
var pages_count = oThis.m_arrPages.length;
for (var i = 0; i < pages_count; i++) {
oThis.m_arrPages[i].IsSelected = false;
}
oThis.m_arrPages[pos.Page].IsSelected = true;
oThis.OnUpdateOverlay();
if (global_mouseEvent.Button == 0 && oThis.m_arrPages[pos.Page].animateLabelRect) // click on the current star, preview animation button, slide transition
{
let animateLabelRect = oThis.m_arrPages[pos.Page].animateLabelRect;
let isMouseDownOnAnimPreview = false;
if (pos.X >= animateLabelRect.minX && pos.X <= animateLabelRect.maxX && pos.Y >= animateLabelRect.minY && pos.Y <= animateLabelRect.maxY);
isMouseDownOnAnimPreview = true;
}
oThis.SelectPageEnabled = false;
oThis.m_oWordControl.GoToPage(pos.Page);
oThis.SelectPageEnabled = true;
if (isMouseDownOnAnimPreview) {
oThis.m_oWordControl.m_oApi.SlideTransitionPlay(function () { oThis.m_oWordControl.m_oApi.asc_StartAnimationPreview() });
}
oThis.ShowPage(pos.Page);
}
if (global_mouseEvent.Button == 2 && !global_keyboardEvent.CtrlKey) {
oThis.showContextMenu(false);
}
checkSelectionEnd();
return false;
};
this.onMouseMove = function(e)
{
let mobileTouchManager = oThis.m_oWordControl ? oThis.m_oWordControl.MobileTouchManagerThumbnails : null;
if (mobileTouchManager && mobileTouchManager.checkTouchEvent(e, true))
{
mobileTouchManager.startTouchingInProcess();
let res = mobileTouchManager.mainOnTouchMove(e);
mobileTouchManager.stopTouchingInProcess();
return res;
}
const isHorizontalThumbnails = Asc.editor.getThumbnailsPosition() === thumbnailsPositionMap.bottom;
if (oThis.m_oWordControl)
oThis.m_oWordControl.m_oApi.checkLastWork();
var control = oThis.m_oWordControl.m_oThumbnails.HtmlElement;
if (global_mouseEvent.IsLocked == true && global_mouseEvent.Sender != control)
{
// кто-то зажал мышку. кто-то другой
return;
}
AscCommon.check_MouseMoveEvent(e);
if (global_mouseEvent.Sender != control)
{
// такого быть не должно
return;
}
if (oThis.MouseDownTrack.IsStarted())
{
// это трек для перекидывания слайдов
if (oThis.MouseDownTrack.IsSimple() && !oThis.m_oWordControl.m_oApi.isViewMode)
{
if (Math.abs(oThis.MouseDownTrack.GetX() - global_mouseEvent.X) > 10 || Math.abs(oThis.MouseDownTrack.GetY() - global_mouseEvent.Y) > 10)
oThis.MouseDownTrack.ResetSimple(oThis.ConvertCoords2(global_mouseEvent.X, global_mouseEvent.Y));
}
else
{
if (!oThis.MouseDownTrack.IsSimple())
{
// нужно определить активная позиция между слайдами
oThis.MouseDownTrack.SetPosition(oThis.ConvertCoords2(global_mouseEvent.X, global_mouseEvent.Y));
}
}
oThis.OnUpdateOverlay();
// теперь нужно посмотреть, нужно ли проскроллить
if (oThis.m_bIsScrollVisible) {
const _X = global_mouseEvent.X - oThis.m_oWordControl.X;
const _Y = global_mouseEvent.Y - oThis.m_oWordControl.Y;
const _abs_pos = oThis.m_oWordControl.m_oThumbnails.AbsolutePosition;
const _XMax = (_abs_pos.R - _abs_pos.L) * g_dKoef_mm_to_pix;
const _YMax = (_abs_pos.B - _abs_pos.T) * g_dKoef_mm_to_pix;
const mousePos = isHorizontalThumbnails ? _X : _Y;
const maxPos = isHorizontalThumbnails ? _XMax : _YMax;
let _check_type = -1;
if (mousePos < 30) {
_check_type = 0;
} else if (mousePos >= (maxPos - 30)) {
_check_type = 1;
}
oThis.CheckNeedAnimateScrolls(_check_type);
}
if (!oThis.MouseDownTrack.IsSimple())
{
var cursor_dragged = "default";
if (AscCommon.AscBrowser.isWebkit)
cursor_dragged = "-webkit-grabbing";
else if (AscCommon.AscBrowser.isMozilla)
cursor_dragged = "-moz-grabbing";
oThis.m_oWordControl.m_oThumbnails.HtmlElement.style.cursor = cursor_dragged;
}
return;
}
var pos = oThis.ConvertCoords(global_mouseEvent.X, global_mouseEvent.Y);
var _is_old_focused = false;
var pages_count = oThis.m_arrPages.length;
for (var i = 0; i < pages_count; i++)
{
if (oThis.m_arrPages[i].IsFocused)
{
_is_old_focused = true;
oThis.m_arrPages[i].IsFocused = false;
}
}
var cursor_moved = "default";
if (pos.Page != -1)
{
oThis.m_arrPages[pos.Page].IsFocused = true;
oThis.OnUpdateOverlay();
cursor_moved = "pointer";
} else if (_is_old_focused)
{
oThis.OnUpdateOverlay();
}
oThis.m_oWordControl.m_oThumbnails.HtmlElement.style.cursor = cursor_moved;
};
this.onMouseUp = function(e, bIsWindow)
{
let mobileTouchManager = oThis.m_oWordControl ? oThis.m_oWordControl.MobileTouchManagerThumbnails : null;
if (mobileTouchManager && mobileTouchManager.checkTouchEvent(e, true))
{
mobileTouchManager.startTouchingInProcess();
let res = mobileTouchManager.mainOnTouchEnd(e);
mobileTouchManager.stopTouchingInProcess();
return res;
}
if (oThis.m_oWordControl)
oThis.m_oWordControl.m_oApi.checkLastWork();
var _oldSender = global_mouseEvent.Sender;
AscCommon.check_MouseUpEvent(e);
global_mouseEvent.UnLockMouse();
var control = oThis.m_oWordControl.m_oThumbnails.HtmlElement;
if (global_mouseEvent.Sender != control)
{
if (_oldSender != control || true !== bIsWindow)
{
// такого быть не должно
return;
}
}
oThis.CheckNeedAnimateScrolls(-1);
if (!oThis.MouseDownTrack.IsStarted())
return;
// теперь смотрим, просто ли это селект, или же это трек
if (oThis.MouseDownTrack.IsSimple())
{
if (oThis.MouseDownTrack.IsMoved(global_mouseEvent.X, global_mouseEvent.Y))
oThis.MouseDownTrack.ResetSimple(oThis.ConvertCoords2(global_mouseEvent.X, global_mouseEvent.Y));
}
if (oThis.MouseDownTrack.IsSimple())
{
// это просто селект
var pages_count = oThis.m_arrPages.length;
for (var i = 0; i < pages_count; i++)
{
oThis.m_arrPages[i].IsSelected = false;
}
oThis.m_arrPages[oThis.MouseDownTrack.GetPage()].IsSelected = true;
oThis.OnUpdateOverlay();
// послали уже на mouseDown
//oThis.SelectPageEnabled = false;
//oThis.m_oWordControl.GoToPage(oThis.MouseDownTrack.GetPage());
//oThis.SelectPageEnabled = true;
} else
{
// это трек
oThis.MouseDownTrack.SetPosition(oThis.ConvertCoords2(global_mouseEvent.X, global_mouseEvent.Y));
if (-1 !== oThis.MouseDownTrack.GetPosition() && (!oThis.MouseDownTrack.IsSamePos() || AscCommon.global_mouseEvent.CtrlKey))
{
// вызвать функцию апи для смены слайдов местами
var _array = oThis.GetSelectedArray();
oThis.m_oWordControl.m_oLogicDocument.shiftSlides(oThis.MouseDownTrack.GetPosition(), _array);
oThis.ClearCacheAttack();
}
oThis.OnUpdateOverlay();
}
oThis.MouseDownTrack.Reset();
oThis.onMouseMove(e);
};
this.onMouseLeave = function(e)
{
var pages_count = oThis.m_arrPages.length;
for (var i = 0; i < pages_count; i++)
{
oThis.m_arrPages[i].IsFocused = false;
}
oThis.OnUpdateOverlay();
};
this.onMouseWhell = function (e) {
if (false === this.m_bIsScrollVisible || !oThis.m_oWordControl.m_oScrollThumbApi)
return;
if (global_keyboardEvent.CtrlKey)
return;
if (undefined !== window["AscDesktopEditor"] && false === window["AscDesktopEditor"]["CheckNeedWheel"]())
return;
const delta = GetWheelDeltaY(e);
const isHorizontalOrientation = Asc.editor.getThumbnailsPosition() === thumbnailsPositionMap.bottom;
const isRightToLeft = Asc.editor.isRtlInterface;
isHorizontalOrientation
? oThis.m_oWordControl.m_oScrollThumbApi.scrollBy(isRightToLeft ? -delta : delta, 0)
: oThis.m_oWordControl.m_oScrollThumbApi.scrollBy(0, delta, false);
if (e.preventDefault)
e.preventDefault();
else
e.returnValue = false;
AscCommon.stopEvent(e);
return false;
};
this.onKeyDown = function(e)
{
var control = oThis.m_oWordControl.m_oThumbnails.HtmlElement;
if (global_mouseEvent.IsLocked == true && global_mouseEvent.Sender == control)
{
e.preventDefault();
return false;
}
AscCommon.check_KeyboardEvent(e);
let oApi = this.m_oWordControl.m_oApi;
let oPresentation = this.m_oWordControl.m_oLogicDocument;
let oDrawingDocument = this.m_oWordControl.m_oDrawingDocument;
let oEvent = global_keyboardEvent;
let nShortCutAction = oApi.getShortcut(oEvent);
let bReturnValue = false, bPreventDefault = true;
let sSelectedIdx;
let nStartHistoryIndex = oPresentation.History.Index;
switch (nShortCutAction)
{
case Asc.c_oAscPresentationShortcutType.EditSelectAll:
{
this.SelectAll();
bReturnValue = false;
bPreventDefault = true;
break;
}
case Asc.c_oAscPresentationShortcutType.EditUndo:
case Asc.c_oAscPresentationShortcutType.EditRedo:
{
bReturnValue = true;
bPreventDefault = false;
break;
}
case Asc.c_oAscPresentationShortcutType.Duplicate:
{
if (oPresentation.CanEdit())
{
oApi.DublicateSlide();
}
bReturnValue = false;
bPreventDefault = true;
break;
}
case Asc.c_oAscPresentationShortcutType.PrintPreviewAndPrint:
{
oApi.onPrint();
bReturnValue = false;
bPreventDefault = true;
break;
}
case Asc.c_oAscPresentationShortcutType.Save:
{
if (!oPresentation.IsViewMode())
{
oApi.asc_Save();
}
bReturnValue = false;
bPreventDefault = true;
break;
}
case Asc.c_oAscPresentationShortcutType.OpenContextMenu:
{
oThis.showContextMenu(true);
bReturnValue = false;
bPreventDefault = false;
break;
}
default:
{
break;
}
}
if (!nShortCutAction)
{
if (AscCommon.isCopyPasteEvent(oEvent)) {
return;
}
switch (oEvent.KeyCode)
{
case 13: // enter
{
if (oPresentation.CanEdit())
{
sSelectedIdx = this.GetSelectedArray();
bReturnValue = false;
bPreventDefault = true;
if (sSelectedIdx.length > 0)
{
this.m_oWordControl.GoToPage(sSelectedIdx[sSelectedIdx.length - 1]);
oPresentation.addNextSlide();
bPreventDefault = false;
}
}
break;
}
case 46: // delete
case 8: // backspace
{
if (oPresentation.CanEdit())
{
const arrSlides = oPresentation.GetSelectedSlideObjects();
if (!oApi.IsSupportEmptyPresentation)
{
if (arrSlides.length === oDrawingDocument.GetSlidesCount())
{
arrSlides.splice(0, 1);
}
}
if (arrSlides.length !== 0)
{
oPresentation.deleteSlides(arrSlides);
}
if (0 === oPresentation.GetSlidesCount())
{
this.m_bIsUpdate = true;
}
bReturnValue = false;
bPreventDefault = true;
}
break;
}
case 34: // PgDown
case 40: // bottom arrow
{
if (oEvent.CtrlKey && oEvent.ShiftKey)
{
oPresentation.moveSelectedSlidesToEnd();
} else if (oEvent.CtrlKey)
{
oPresentation.moveSlidesNextPos();
} else if (oEvent.ShiftKey)
{
this.CorrectShiftSelect(false, false);
} else
{
if (oDrawingDocument.SlideCurrent < oDrawingDocument.GetSlidesCount() - 1)
{
this.m_oWordControl.GoToPage(oDrawingDocument.SlideCurrent + 1);
}
}
break;
}
case 36: // home
{
if (!oEvent.ShiftKey)
{
if (oDrawingDocument.SlideCurrent > 0)
{
this.m_oWordControl.GoToPage(0);
}
} else
{
if (oDrawingDocument.SlideCurrent > 0)
{
this.CorrectShiftSelect(true, true);
}
}
break;
}
case 35: // end
{
var slidesCount = oDrawingDocument.GetSlidesCount();
if (!oEvent.ShiftKey)
{
if (oDrawingDocument.SlideCurrent !== (slidesCount - 1))
{
this.m_oWordControl.GoToPage(slidesCount - 1);
}
} else
{
if (oDrawingDocument.SlideCurrent !== (slidesCount - 1))
{
this.CorrectShiftSelect(false, true);
}
}
break;
}
case 33: // PgUp
case 38: // UpArrow
{
if (oEvent.CtrlKey && oEvent.ShiftKey)
{
oPresentation.moveSelectedSlidesToStart();
} else if (oEvent.CtrlKey)
{
oPresentation.moveSlidesPrevPos();
} else if (oEvent.ShiftKey)
{
this.CorrectShiftSelect(true, false);
} else
{
if (oDrawingDocument.SlideCurrent > 0)
{
this.m_oWordControl.GoToPage(oDrawingDocument.SlideCurrent - 1);
}
}
break;
}
case 77:
{
if (oEvent.CtrlKey)
{
if (oPresentation.CanEdit())
{
sSelectedIdx = this.GetSelectedArray();
if (sSelectedIdx.length > 0)
{
this.m_oWordControl.GoToPage(sSelectedIdx[sSelectedIdx.length - 1]);
oPresentation.addNextSlide();
bReturnValue = false;
} else if (this.GetSlidesCount() === 0)
{
oPresentation.addNextSlide();
this.m_oWordControl.GoToPage(0);
}
}
}
bReturnValue = false;
bPreventDefault = true;
break;
}
case 122:
case 123:
{
return;
}
default:
break;
}
}
if (bPreventDefault)
{
e.preventDefault();
}
if(nStartHistoryIndex === oPresentation.History.Index)
{
oApi.sendEvent("asc_onSelectionEnd");
}
return bReturnValue;
};
this.SetFocusElement = function(type)
{
if(this.FocusObjType === type)
return;
switch (type)
{
case FOCUS_OBJECT_MAIN:
{
this.FocusObjType = FOCUS_OBJECT_MAIN;
break;
}
case FOCUS_OBJECT_THUMBNAILS:
{
if (this.LockMainObjType)
return;
this.FocusObjType = FOCUS_OBJECT_THUMBNAILS;
if (this.m_oWordControl.m_oLogicDocument)
{
this.m_oWordControl.m_oLogicDocument.resetStateCurSlide(true);
}
break;
}
case FOCUS_OBJECT_ANIM_PANE:
{
this.FocusObjType = FOCUS_OBJECT_ANIM_PANE;
break;
}
case FOCUS_OBJECT_NOTES:
{
break;
}
default:
break;
}
};
// draw
this.ShowPage = function (pageNum) {
const scrollApi = this.m_oWordControl.m_oScrollThumbApi;
if (!scrollApi) return;
let startCoord, endCoord, visibleAreaSize, scrollTo, scrollBy;
if (Asc.editor.getThumbnailsPosition() === thumbnailsPositionMap.bottom) {
startCoord = this.m_arrPages[pageNum].left - this.const_border_w;
endCoord = this.m_arrPages[pageNum].right + this.const_border_w;
visibleAreaSize = this.m_oWordControl.m_oThumbnails.HtmlElement.width;
scrollTo = scrollApi.scrollToX.bind(scrollApi);
scrollBy = scrollApi.scrollByX.bind(scrollApi);
} else {
startCoord = this.m_arrPages[pageNum].top - this.const_border_w;
endCoord = this.m_arrPages[pageNum].bottom + this.const_border_w;
visibleAreaSize = this.m_oWordControl.m_oThumbnails.HtmlElement.height;
scrollTo = scrollApi.scrollToY.bind(scrollApi);
scrollBy = scrollApi.scrollByY.bind(scrollApi);
}
if (startCoord < 0) {
const size = endCoord - startCoord;
const shouldReversePageIndexes = Asc.editor.isRtlInterface &&
Asc.editor.getThumbnailsPosition() === thumbnailsPositionMap.bottom;
const pos = shouldReversePageIndexes
? (size + this.const_border_w) * (this.m_arrPages.length - pageNum - 1)
: (size + this.const_border_w) * pageNum;
scrollTo(pos);
} else if (endCoord > visibleAreaSize) {
scrollBy(endCoord + this.const_border_w - visibleAreaSize);
}
};
this.ClearCacheAttack = function()
{
var pages_count = this.m_arrPages.length;
for (var i = 0; i < pages_count; i++)
{
this.m_arrPages[i].IsRecalc = true;
}
this.m_bIsUpdate = true;
};
this.FocusRectDraw = function(ctx, x, y, r, b)
{
ctx.rect(x - this.const_border_w, y, r - x + this.const_border_w, b - y);
};
this.FocusRectFlat = function(_color, ctx, x, y, r, b, isFocus)
{
ctx.beginPath();
ctx.strokeStyle = _color;
var lineW = Math.round((isFocus ? 2 : 3) * AscCommon.AscBrowser.retinaPixelRatio);
var dist = Math.round(2 * AscCommon.AscBrowser.retinaPixelRatio);
ctx.lineWidth = lineW;
var extend = dist + (lineW / 2);
ctx.rect(x - extend, y - extend, r - x + (2 * extend), b - y + (2 * extend));
ctx.stroke();
ctx.beginPath();
};
this.OutlineRect = function(_color, ctx, x, y, r, b)
{
ctx.beginPath();
ctx.strokeStyle = "#C0C0C0";
const lineW = Math.max(1, Math.round(1 * AscCommon.AscBrowser.retinaPixelRatio));
ctx.lineWidth = lineW;
const extend = lineW / 2;
ctx.rect(x - extend, y - extend, r - x + (2 * extend), b - y + (2 * extend));
ctx.stroke();
ctx.beginPath();
};
this.DrawAnimLabel = function(oGraphics, nX, nY, oColor)
{
let fCX = function(nVal)
{
return AscCommon.AscBrowser.convertToRetinaValue(nVal, true) + nX;
};
let fCY = function(nVal)
{
return AscCommon.AscBrowser.convertToRetinaValue(nVal, true) + nY;
};
oGraphics.b_color1(oColor.R, oColor.G, oColor.B, 255);
oGraphics.SaveGrState();
oGraphics.SetIntegerGrid(true);
let oCtx = oGraphics.m_oContext;
oCtx.beginPath();
oCtx.moveTo(fCX(10.5), fCY(4));
oCtx.lineTo(fCX(12), fCY(8));
oCtx.lineTo(fCX(16), fCY(8));
oCtx.lineTo(fCX(12.5), fCY(10.5));
oCtx.lineTo(fCX(14), fCY(15));
oCtx.lineTo(fCX(10.5), fCY(12.5));
oCtx.lineTo(fCX(7), fCY(15));
oCtx.lineTo(fCX(8.5), fCY(10.5));
oCtx.lineTo(fCX(5), fCY(8));
oCtx.lineTo(fCX(9), fCY(8));
oCtx.lineTo(fCX(10.5), fCY(4));
oCtx.closePath();
oCtx.fill();
oCtx.beginPath();
oCtx.moveTo(fCX(6), fCY(5))
oCtx.lineTo(fCX(9), fCY(5));
oCtx.lineTo(fCX(9), fCY(4))
oCtx.lineTo(fCX(6), fCY(4));
oCtx.lineTo(fCX(6), fCY(5))
oCtx.closePath();
oCtx.fill();
oCtx.beginPath();
oCtx.moveTo(fCX(4), fCY(7));
oCtx.lineTo(fCX(8), fCY(7));
oCtx.lineTo(fCX(8), fCY(6));
oCtx.lineTo(fCX(4), fCY(6));
oCtx.lineTo(fCX(4), fCY(7));
oCtx.closePath();
oCtx.fill();
oCtx.beginPath();
oGraphics.RestoreGrState();
return {maxX: fCX(16), minX: fCX(4), maxY: fCY(15), minY: fCY(4)}
};
this.DrawPin = function(oGraphics, nX, nY, oColor, nAngle) {
const fCX = function(nVal)
{
return AscCommon.AscBrowser.convertToRetinaValue(nVal, true) + nX;
};
const fCY = function(nVal)
{
return AscCommon.AscBrowser.convertToRetinaValue(nVal, true) + nY;
};
const rotateAt = function(angle, x, y) {
oCtx.translate(fCX(x), fCY(y));
oCtx.rotate(AscCommon.deg2rad(angle));
oCtx.translate(-fCX(x), -fCY(y));
}
oGraphics.b_color1(oColor.R, oColor.G, oColor.B, 255);
oGraphics.SaveGrState();
oGraphics.SetIntegerGrid(true);
let oCtx = oGraphics.m_oContext;
oCtx.save();
oCtx.lineCap = 'round';
oCtx.lineWidth = AscCommon.AscBrowser.convertToRetinaValue(1, true);
rotateAt(nAngle, 5, 9);
oCtx.beginPath();
oCtx.moveTo(fCX(2), fCY(4));
oCtx.lineTo(fCX(8), fCY(4));
oCtx.closePath();
oCtx.stroke();
oCtx.beginPath();
oCtx.moveTo(fCX(3), fCY(4));
oCtx.lineTo(fCX(7), fCY(4));
oCtx.lineTo(fCX(7), fCY(7));
oCtx.lineTo(fCX(9), fCY(9));
oCtx.lineTo(fCX(9), fCY(10));
oCtx.lineTo(fCX(1), fCY(10));
oCtx.lineTo(fCX(1), fCY(9));
oCtx.lineTo(fCX(3), fCY(7));
oCtx.closePath();
oCtx.fill();
oCtx.beginPath();
oCtx.moveTo(fCX(5), fCY(10));
oCtx.lineTo(fCX(5), fCY(14));
oCtx.closePath();
oCtx.stroke();
rotateAt(-nAngle, 5, 9);
oCtx.beginPath();
oCtx.restore();
oGraphics.RestoreGrState();
};
this.OnPaint = function () {
if (!this.isThumbnailsShown()) {
return;
}
const canvas = this.m_oWordControl.m_oThumbnails.HtmlElement;
if (!canvas)
return;
this.m_oWordControl.m_oApi.clearEyedropperImgData();
const context = AscCommon.AscBrowser.getContext2D(canvas);
context.clearRect(0, 0, canvas.width, canvas.height);
const digitDistance = this.const_offset_x * g_dKoef_pix_to_mm;
const logicDocument = this.m_oWordControl.m_oLogicDocument;
const arrSlides = logicDocument.GetAllSlides();
for (let slideIndex = 0; slideIndex < this.GetSlidesCount(); slideIndex++) {
const page = this.m_arrPages[slideIndex];
const oSlide = arrSlides[slideIndex];
const slideType = oSlide.deleteLock.Lock.Get_Type();
const bLocked = slideType !== AscCommon.c_oAscLockTypes.kLockTypeMine && slideType !== AscCommon.c_oAscLockTypes.kLockTypeNone;
if (slideIndex < this.m_lDrawingFirst || slideIndex > this.m_lDrawingEnd) {
this.m_oCacheManager.UnLock(page.cachedImage);
page.cachedImage = null;
continue;
}
const font = {
FontFamily: { Name: "Arial", Index: -1 },
Italic: false,
Bold: false,
FontSize: Math.round(10 * AscCommon.AscBrowser.retinaPixelRatio)
};
// Create graphics drawer
const graphics = new AscCommon.CGraphics();
graphics.init(context, canvas.width, canvas.height, canvas.width * g_dKoef_pix_to_mm, canvas.height * g_dKoef_pix_to_mm);
graphics.m_oFontManager = this.m_oFontManager;
graphics.transform(1, 0, 0, 1, 0, 0);
graphics.SetFont(font);
page.Draw(context, page.left, page.top, page.right - page.left, page.bottom - page.top);
const slideNumber = logicDocument.GetSlideNumber(slideIndex);
if (slideNumber !== null) {
let currentSlideNumber = slideNumber;
let slideNumberTextWidth = 0;
while (currentSlideNumber !== 0) {
const lastDigit = currentSlideNumber % 10;
slideNumberTextWidth += this.DigitWidths[lastDigit];
currentSlideNumber = (currentSlideNumber / 10) >> 0;
}
// Draw slide number
const textColorHex = bLocked
? AscCommon.GlobalSkin.ThumbnailsLockColor
: AscCommon.GlobalSkin.ThumbnailsPageNumberText;
const textColor = AscCommon.RgbaHexToRGBA(textColorHex);
graphics.b_color1(textColor.R, textColor.G, textColor.B, 255);
const canvasWidthMm = canvas.width * g_dKoef_pix_to_mm;
const canvasHeightMm = canvas.height * g_dKoef_pix_to_mm;
let textPosX, textPosY;
if (Asc.editor.getThumbnailsPosition() === thumbnailsPositionMap.bottom) {
const textHeightMm = 10 * AscCommon.AscBrowser.retinaPixelRatio * g_dKoef_pix_to_mm;
textPosY = (page.top * g_dKoef_pix_to_mm + textHeightMm) / 2;
textPosX = Asc.editor.isRtlInterface
? page.right * g_dKoef_pix_to_mm - slideNumberTextWidth - 1 * AscCommon.AscBrowser.retinaPixelRatio
: page.left * g_dKoef_pix_to_mm + 1 * AscCommon.AscBrowser.retinaPixelRatio;
} else {
textPosY = page.top * g_dKoef_pix_to_mm + 3 * AscCommon.AscBrowser.retinaPixelRatio;
textPosX = Asc.editor.isRtlInterface
? canvasWidthMm - (digitDistance + slideNumberTextWidth) / 2
: (digitDistance - slideNumberTextWidth) / 2;
}
const textBounds = graphics.t("" + slideNumber, textPosX, textPosY, true);
// Draw stroke and background if slide is hidden
const oSlide = logicDocument.GetSlide(slideIndex);
if (oSlide && !oSlide.isVisible()) {
context.lineWidth = AscCommon.AscBrowser.convertToRetinaValue(1, true);
context.strokeStyle = textColorHex;
context.beginPath();
context.moveTo(textBounds.x - 3, textBounds.y);
context.lineTo(textBounds.r + 3, textBounds.b);
context.stroke();
context.beginPath();
context.fillStyle = AscCommon.GlobalSkin.BackgroundColorThumbnails;
context.globalAlpha = 0.5;
context.fillRect(page.left, page.top, page.right - page.left, page.bottom - page.top);
context.globalAlpha = 1;
}
// Draw animation label if slide has transition
page.animateLabelRect = null;
let nBottomBounds = textBounds.b;
if (logicDocument.isSlideAnimated(slideIndex)) {
let iconX, iconY;
if (Asc.editor.getThumbnailsPosition() === thumbnailsPositionMap.bottom) {
iconX = Asc.editor.isRtlInterface
? textBounds.x - 3 - AscCommon.AscBrowser.convertToRetinaValue(19, true)
: textBounds.r + 3;
iconY = (textBounds.y + textBounds.b) / 2 - AscCommon.AscBrowser.convertToRetinaValue(9.5, true);
} else {
iconX = (textBounds.x + textBounds.r) / 2 - AscCommon.AscBrowser.convertToRetinaValue(9.5, true);
iconY = nBottomBounds + 3;
}
const iconHeight = AscCommon.AscBrowser.convertToRetinaValue(15, true);
if (iconY + iconHeight < page.bottom) {
const labelCoords = this.DrawAnimLabel(graphics, iconX, iconY, textColor);
page.animateLabelRect = labelCoords;
nBottomBounds = labelCoords.maxY;
}
}
// Draw pin if masterSlide is preserved
if (logicDocument.isSlidePreserved(slideIndex)) {
const pinOriginalWidth = AscCommon.AscBrowser.convertToRetinaValue(8, true);
const pinOriginalHeight = AscCommon.AscBrowser.convertToRetinaValue(10, true);
const pinAngle = 45;
const pinSizes = AscFormat.fGetOuterRectangle(pinOriginalWidth, pinOriginalHeight, pinAngle);
let pinX, pinY;
if (Asc.editor.getThumbnailsPosition() === thumbnailsPositionMap.bottom) {
pinX = Asc.editor.isRtlInterface
? textBounds.x - 3 - pinSizes.width
: textBounds.r + 3 + pinSizes.width / 2;
pinY = textBounds.b - pinSizes.height;
} else {
pinX = (textBounds.x + textBounds.r) / 2 - pinSizes.width / 2;
pinY = nBottomBounds + 3;
}
let nIconH = pinSizes.height;
if (pinY + nIconH < page.bottom) {
this.DrawPin(graphics, pinX, pinY, textColor, pinAngle);
}
}
}
}
this.OnUpdateOverlay();
};
this.onCheckUpdate = function()
{
if (!this.isThumbnailsShown() || 0 == this.DigitWidths.length)
return;
if (this.m_oWordControl.m_oApi.isSaveFonts_Images)
return;
if (this.m_lDrawingFirst == -1 || this.m_lDrawingEnd == -1)
{
if (this.m_oWordControl.m_oDrawingDocument.IsEmptyPresentation)
{
if (!this.bIsEmptyDrawed)
{
this.bIsEmptyDrawed = true;
this.OnPaint();
}
return;
}
this.bIsEmptyDrawed = false;
return;
}
this.bIsEmptyDrawed = false;
if (!this.m_bIsUpdate)
{
// определяем, нужно ли пересчитать и закэшировать табнейл (хотя бы один)
for (var i = this.m_lDrawingFirst; i <= this.m_lDrawingEnd; i++)
{
var page = this.m_arrPages[i];
if (null == page.cachedImage || page.IsRecalc)
{
this.m_bIsUpdate = true;
break;
}
if ((page.cachedImage.image.width != (page.right - page.left)) || (page.cachedImage.image.height != (page.bottom - page.top)))
{
this.m_bIsUpdate = true;
break;
}
}
}
if (!this.m_bIsUpdate)
return;
for (var i = this.m_lDrawingFirst; i <= this.m_lDrawingEnd; i++)
{
var page = this.m_arrPages[i];
var w = page.right - page.left;
var h = page.bottom - page.top;
if (null != page.cachedImage)
{
if ((page.cachedImage.image.width != w) || (page.cachedImage.image.height != h) || page.IsRecalc)
{
this.m_oCacheManager.UnLock(page.cachedImage);
page.cachedImage = null;
}
}
if (null == page.cachedImage)
{
page.cachedImage = this.m_oCacheManager.Lock(w, h);
var g = new AscCommon.CGraphics();
g.IsNoDrawingEmptyPlaceholder = true;
g.IsThumbnail = true;
if (this.m_oWordControl.m_oLogicDocument.IsVisioEditor())
{
//todo override CThumbnailsManager
let SlideWidth = this.m_oWordControl.m_oLogicDocument.GetWidthMM(i);
let SlideHeight = this.m_oWordControl.m_oLogicDocument.GetHeightMM(i);
g.init(page.cachedImage.image.ctx, w, h, SlideWidth, SlideHeight);
}
else
{
g.init(page.cachedImage.image.ctx, w, h, this.SlideWidth, this.SlideHeight);
}
g.m_oFontManager = this.m_oFontManager;
g.transform(1, 0, 0, 1, 0, 0);
var bIsShowPars = this.m_oWordControl.m_oApi.ShowParaMarks;
this.m_oWordControl.m_oApi.ShowParaMarks = false;
this.m_oWordControl.m_oLogicDocument.DrawPage(i, g);
this.m_oWordControl.m_oApi.ShowParaMarks = bIsShowPars;
page.IsRecalc = false;
this.m_bIsUpdate = true;
break;
}
}
this.OnPaint();
this.m_bIsUpdate = false;
};
this.OnUpdateOverlay = function () {
if (!this.isThumbnailsShown())
return;
const canvas = this.m_oWordControl.m_oThumbnailsBack.HtmlElement;
if (canvas == null)
return;
if (this.m_oWordControl)
this.m_oWordControl.m_oApi.checkLastWork();
const context = canvas.getContext("2d");
const canvasWidth = canvas.width;
const canvasHeight = canvas.height;
this.drawThumbnailsBorders(context, canvasWidth, canvasHeight);
if (this.MouseDownTrack.IsDragged()) {
this.drawThumbnailsInsertionLine(context, canvasWidth, canvasHeight);
}
};
this.drawThumbnailsBorders = function (context, canvasWidth, canvasHeight) {
context.fillStyle = GlobalSkin.BackgroundColorThumbnails;
context.fillRect(0, 0, canvasWidth, canvasHeight);
const _style_select = GlobalSkin.ThumbnailsPageOutlineActive;
const _style_focus = GlobalSkin.ThumbnailsPageOutlineHover;
const _style_select_focus = GlobalSkin.ThumbnailsPageOutlineActive;
context.fillStyle = _style_select;
const oLogicDocument = this.m_oWordControl && this.m_oWordControl.m_oLogicDocument;
if (!oLogicDocument) {
return;
}
const arrSlides = oLogicDocument.GetAllSlides();
for (let i = 0; i < arrSlides.length; i++) {
const page = this.m_arrPages[i];
const oSlide = arrSlides[i];
const slideType = oSlide.deleteLock.Lock.Get_Type();
const bLocked = slideType !== AscCommon.c_oAscLockTypes.kLockTypeMine && slideType !== AscCommon.c_oAscLockTypes.kLockTypeNone;
let color = null;
let isFocus = false;
if (bLocked) {
color = AscCommon.GlobalSkin.ThumbnailsLockColor;
} else if (page.IsSelected && page.IsFocused) {
color = _style_select_focus;
} else if (page.IsSelected) {
color = _style_select;
} else if (page.IsFocused) {
color = _style_focus;
isFocus = true;
}
if (color) {
this.FocusRectFlat(color, context, page.left, page.top, page.right, page.bottom, isFocus);
} else {
this.OutlineRect(color, context, page.left, page.top, page.right, page.bottom);
}
}
};
this.drawThumbnailsInsertionLine = function (context, canvasWidth, canvasHeight) {
const isHorizontalThumbnails = Asc.editor.getThumbnailsPosition() === thumbnailsPositionMap.bottom;
const isRightToLeft = Asc.editor.isRtlInterface;
const nPosition = this.MouseDownTrack.GetPosition();
const oPage = this.m_arrPages[nPosition - 1];
context.strokeStyle = "#DEDEDE";
if (isHorizontalThumbnails) {
const containerRightBorder = editor.WordControl.m_oThumbnailsContainer.AbsolutePosition.R * AscCommon.AscBrowser.retinaPixelRatio * g_dKoef_mm_to_pix;
// x, topY & bottomY - coordinates of the insertion line itself
const x = oPage
? isRightToLeft
? (oPage.left - 1.5 * this.const_border_w) >> 0
: (oPage.right + 1.5 * this.const_border_w) >> 0
: isRightToLeft
? (containerRightBorder - this.const_offset_x / 2) >> 0
: (this.const_offset_x / 2) >> 0;
let topY, bottomY;
if (this.m_arrPages.length > 0) {
topY = this.m_arrPages[0].top + 4;
bottomY = this.m_arrPages[0].bottom - 4;
} else {
topY = 0;
bottomY = canvasHeight;
}
context.beginPath();
context.moveTo(x + 0.5, topY);
context.lineTo(x + 0.5, bottomY);
context.closePath();
context.lineWidth = 3;
context.stroke();
if (this.MouseTrackCommonImage) {
const commonImageWidth = this.MouseTrackCommonImage.width;
const commonImageHeight = this.MouseTrackCommonImage.height;
context.save();
context.translate(x, topY);
context.rotate(Math.PI / 2);
context.drawImage(
this.MouseTrackCommonImage,
0, 0,
commonImageWidth / 2, commonImageHeight,
-commonImageWidth, -commonImageHeight / 2,
commonImageWidth / 2, commonImageHeight
);
context.translate(bottomY - topY, 0);
context.drawImage(
this.MouseTrackCommonImage,
commonImageWidth / 2, 0,
commonImageWidth / 2, commonImageHeight,
commonImageWidth / 2, -commonImageHeight / 2,
commonImageWidth / 2, commonImageHeight
);
context.restore();
}
} else {
const y = oPage
? (oPage.bottom + 1.5 * this.const_border_w) >> 0
: this.const_offset_y / 2 >> 0;
let _left_pos = 0;
let _right_pos = canvasWidth;
if (this.m_arrPages.length > 0) {
_left_pos = this.m_arrPages[0].left + 4;
_right_pos = this.m_arrPages[0].right - 4;
}
context.lineWidth = 3;
context.beginPath();
context.moveTo(_left_pos, y + 0.5);
context.lineTo(_right_pos, y + 0.5);
context.stroke();
context.beginPath();
if (null != this.MouseTrackCommonImage) {
context.drawImage(
this.MouseTrackCommonImage,
0, 0,
(this.MouseTrackCommonImage.width + 1) >> 1, this.MouseTrackCommonImage.height,
_left_pos - this.MouseTrackCommonImage.width, y - (this.MouseTrackCommonImage.height >> 1),
(this.MouseTrackCommonImage.width + 1) >> 1, this.MouseTrackCommonImage.height
);
context.drawImage(
this.MouseTrackCommonImage,
this.MouseTrackCommonImage.width >> 1, 0,
(this.MouseTrackCommonImage.width + 1) >> 1, this.MouseTrackCommonImage.height,
_right_pos + (this.MouseTrackCommonImage.width >> 1), y - (this.MouseTrackCommonImage.height >> 1),
(this.MouseTrackCommonImage.width + 1) >> 1, this.MouseTrackCommonImage.height
);
}
}
};
// select
this.SelectSlides = function(aSelectedIdx, bReset)
{
if (aSelectedIdx.length > 0)
{
if(bReset === undefined || bReset)
{
for (let i = 0; i < this.m_arrPages.length; i++)
{
this.m_arrPages[i].IsSelected = false;
}
}
let nCount = aSelectedIdx.length;
let nSlideType = this.GetSlideType(aSelectedIdx[0]);
for (let nIdx = 0; nIdx < nCount; nIdx++)
{
if(this.GetSlideType(aSelectedIdx[nIdx]) === nSlideType)
{
let oPage = this.m_arrPages[aSelectedIdx[nIdx]];
if (oPage)
{
oPage.IsSelected = true;
}
}
}
this.OnUpdateOverlay();
}
};
this.GetSelectedSlidesRange = function()
{
var _min = this.m_oWordControl.m_oDrawingDocument.SlideCurrent;
var _max = _min;
var pages_count = this.m_arrPages.length;
for (var i = 0; i < pages_count; i++)
{
if (this.m_arrPages[i].IsSelected)
{
if (i < _min)
_min = i;
if (i > _max)
_max = i;
}
}
return {Min: _min, Max: _max};
};
this.GetSelectedArray = function()
{
var _array = [];
var pages_count = this.m_arrPages.length;
for (var i = 0; i < pages_count; i++)
{
if (this.m_arrPages[i].IsSelected)
{
_array[_array.length] = i;
}
}
return _array;
};
this.CorrectShiftSelect = function(isTop, isEnd)
{
var drDoc = this.m_oWordControl.m_oDrawingDocument;
var slidesCount = drDoc.GetSlidesCount();
var min_max = this.GetSelectedSlidesRange();
var _page = this.m_oWordControl.m_oDrawingDocument.SlideCurrent;
if (isEnd)
{
_page = isTop ? 0 : slidesCount - 1;
} else if (isTop)
{
if (min_max.Min != _page)
{
_page = min_max.Min - 1;
if (_page < 0)
_page = 0;
} else
{
_page = min_max.Max - 1;
if (_page < 0)
_page = 0;
}
} else
{
if (min_max.Min != _page)
{
_page = min_max.Min + 1;
if (_page >= slidesCount)
_page = slidesCount - 1;
} else
{
_page = min_max.Max + 1;
if (_page >= slidesCount)
_page = slidesCount - 1;
}
}
var _max = _page;
var _min = this.m_oWordControl.m_oDrawingDocument.SlideCurrent;
if (_min > _max)
{
var _temp = _max;
_max = _min;
_min = _temp;
}
for (var i = 0; i < _min; i++)
{
this.m_arrPages[i].IsSelected = false;
}
let nSlideType = this.GetSlideType(_min);
for (var i = _min; i <= _max; i++)
{
if(this.GetSlideType(i) === nSlideType)
{
this.m_arrPages[i].IsSelected = true;
}
}
for (var i = _max + 1; i < slidesCount; i++)
{
this.m_arrPages[i].IsSelected = false;
}
this.m_oWordControl.m_oLogicDocument.Document_UpdateInterfaceState();
this.OnUpdateOverlay();
this.ShowPage(_page);
};
this.SelectAll = function()
{
for (var i = 0; i < this.m_arrPages.length; i++)
{
this.m_arrPages[i].IsSelected = true;
}
this.UpdateInterface();
this.OnUpdateOverlay();
};
this.IsSlideHidden = function(aSelected)
{
var oPresentation = oThis.m_oWordControl.m_oLogicDocument;
for (var i = 0; i < aSelected.length; ++i)
{
if (oPresentation.IsVisibleSlide(aSelected[i]))
return false;
}
return true;
};
this.isSelectedPage = function(pageNum)
{
if (this.m_arrPages[pageNum] && this.m_arrPages[pageNum].IsSelected)
return true;
return false;
};
this.SelectPage = function (pageNum) {
if (!this.SelectPageEnabled)
return;
const pagesCount = this.m_arrPages.length;
if (pageNum < 0 || pageNum >= pagesCount)
return;
let bIsUpdate = false;
for (let i = 0; i < pagesCount; i++) {
if (this.m_arrPages[i].IsSelected === true && i != pageNum) {
bIsUpdate = true;
}
this.m_arrPages[i].IsSelected = false;
}
if (this.m_arrPages[pageNum].IsSelected === false) {
bIsUpdate = true;
}
this.m_arrPages[pageNum].IsSelected = true;
this.m_bIsUpdate = bIsUpdate;
if (bIsUpdate) {
this.ShowPage(pageNum);
}
};
// position
this.ConvertCoords = function (x, y) {
let posX, posY;
switch (Asc.editor.getThumbnailsPosition()) {
case thumbnailsPositionMap.left:
posX = x - this.m_oWordControl.X;
posY = y - this.m_oWordControl.Y;
break;
case thumbnailsPositionMap.right:
posX = x - this.m_oWordControl.X - this.m_oWordControl.Width + this.m_oWordControl.splitters[0].position * g_dKoef_mm_to_pix;
posY = y - this.m_oWordControl.Y;
break;
case thumbnailsPositionMap.bottom:
posX = x - this.m_oWordControl.X;
posY = y - this.m_oWordControl.Y - this.m_oWordControl.Height + this.m_oWordControl.splitters[0].position * g_dKoef_mm_to_pix;
break;
default:
posX = posY = 0; // just in case
break;
}
const convertedX = AscCommon.AscBrowser.convertToRetinaValue(posX, true);
const convertedY = AscCommon.AscBrowser.convertToRetinaValue(posY, true);
const pageIndex = this.m_arrPages.findIndex(function (page) {
return page.Hit(convertedX, convertedY);
});
return {
X: convertedX,
Y: convertedY,
Page: pageIndex
};
};
this.ConvertCoords2 = function (x, y) {
if (this.m_arrPages.length == 0)
return -1;
let posX, posY;
switch (Asc.editor.getThumbnailsPosition()) {
case thumbnailsPositionMap.left:
posX = x - this.m_oWordControl.X;
posY = y - this.m_oWordControl.Y;
break;
case thumbnailsPositionMap.right:
posX = x - this.m_oWordControl.X - this.m_oWordControl.Width + this.m_oWordControl.splitters[0].position * g_dKoef_mm_to_pix;
posY = y - this.m_oWordControl.Y;
break;
case thumbnailsPositionMap.bottom:
posX = x - this.m_oWordControl.X;
posY = y - this.m_oWordControl.Y - this.m_oWordControl.Height + this.m_oWordControl.splitters[0].position * g_dKoef_mm_to_pix;
break;
default:
posX = posY = 0; // just in case
break;
}
const convertedX = AscCommon.AscBrowser.convertToRetinaValue(posX, true);
const convertedY = AscCommon.AscBrowser.convertToRetinaValue(posY, true);
const absolutePosition = this.m_oWordControl.m_oThumbnails.AbsolutePosition;
const thControlWidth = (absolutePosition.R - absolutePosition.L) * g_dKoef_mm_to_pix * AscCommon.AscBrowser.retinaPixelRatio;
const thControlHeight = (absolutePosition.B - absolutePosition.T) * g_dKoef_mm_to_pix * AscCommon.AscBrowser.retinaPixelRatio;
if (convertedX < 0 || convertedX > thControlWidth || convertedY < 0 || convertedY > thControlHeight)
return -1;
const isHorizontalThumbnails = Asc.editor.getThumbnailsPosition() === thumbnailsPositionMap.bottom;
const isRightToLeft = Asc.editor.isRtlInterface;
let minDistance = Infinity;
let minPositionPage = 0;
for (let i = 0; i < this.m_arrPages.length; i++) {
const page = this.m_arrPages[i];
let distanceToStart, distanceToEnd;
if (isHorizontalThumbnails) {
if (isRightToLeft) {
distanceToStart = Math.abs(convertedX - page.right);
distanceToEnd = Math.abs(convertedX - page.left);
} else {
distanceToStart = Math.abs(convertedX - page.left);
distanceToEnd = Math.abs(convertedX - page.right);
}
} else {
distanceToStart = Math.abs(convertedY - page.top);
distanceToEnd = Math.abs(convertedY - page.bottom);
}
if (distanceToStart < minDistance) {
minDistance = distanceToStart;
minPositionPage = i;
}
if (distanceToEnd < minDistance) {
minDistance = distanceToEnd;
minPositionPage = i + 1;
}
}
return minPositionPage;
};
this.CalculatePlaces = function () {
if (!this.isThumbnailsShown())
return;
if (this.m_oWordControl && this.m_oWordControl.MobileTouchManagerThumbnails)
this.m_oWordControl.MobileTouchManagerThumbnails.ClearContextMenu();
const thumbnails = this.m_oWordControl.m_oThumbnails;
const thumbnailsCanvas = thumbnails.HtmlElement;
if (!thumbnailsCanvas)
return;
const canvasWidth = thumbnailsCanvas.width;
const canvasHeight = thumbnailsCanvas.height;
const thumbnailsWidthMm = thumbnails.AbsolutePosition.R - thumbnails.AbsolutePosition.L;
const thumbnailsHeightMm = thumbnails.AbsolutePosition.B - thumbnails.AbsolutePosition.T;
const pixelRatio = AscCommon.AscBrowser.retinaPixelRatio * g_dKoef_mm_to_pix;
const isVerticalThumbnails = Asc.editor.getThumbnailsPosition() === thumbnailsPositionMap.right
|| Asc.editor.getThumbnailsPosition() === thumbnailsPositionMap.left;
const isRightToLeft = Asc.editor.isRtlInterface;
let thSlideWidthPx, thSlideHeightPx;
let startOffset, supplement;
if (isVerticalThumbnails) {
thSlideWidthPx = (thumbnailsWidthMm * pixelRatio >> 0) - this.const_offset_x - this.const_offset_r;
thSlideHeightPx = (thSlideWidthPx * this.SlideHeight / this.SlideWidth) >> 0;
startOffset = this.const_offset_y;
} else {
thSlideHeightPx = (thumbnailsHeightMm * pixelRatio >> 0) - this.const_offset_y - this.const_offset_b;
thSlideWidthPx = (thSlideHeightPx * this.SlideWidth / this.SlideHeight) >> 0;
startOffset = this.const_offset_x;
}
if (this.m_bIsScrollVisible) {
const scrollApi = editor.WordControl.m_oScrollThumbApi;
if (scrollApi) {
this.m_dScrollY_max = isVerticalThumbnails ? scrollApi.getMaxScrolledY() : scrollApi.getMaxScrolledX();
this.m_dScrollY = isVerticalThumbnails ? scrollApi.getCurScrolledY() : scrollApi.getCurScrolledX();
}
}
const currentScrollPx = isRightToLeft && !isVerticalThumbnails
? this.m_dScrollY_max - this.m_dScrollY >> 0
: this.m_dScrollY >> 0;
let isFirstSlideFound = false;
let isLastSlideFound = false;
const totalSlidesCount = this.GetSlidesCount();
for (let slideIndex = 0; slideIndex < totalSlidesCount; slideIndex++) {
if (this.m_oWordControl.m_oLogicDocument.IsVisioEditor()) {
let visioSlideWidthMm = this.m_oWordControl.m_oLogicDocument.GetWidthMM(slideIndex);
let visioSlideHeightMm = this.m_oWordControl.m_oLogicDocument.GetHeightMM(slideIndex);
if (isVerticalThumbnails) {
thSlideHeightPx = (thSlideWidthPx * visioSlideHeightMm / visioSlideWidthMm) >> 0;
} else {
thSlideWidthPx = (thSlideHeightPx * visioSlideWidthMm / visioSlideHeightMm) >> 0;
}
}
if (slideIndex >= this.m_arrPages.length) {
this.m_arrPages[slideIndex] = new CThPage();
if (slideIndex === 0)
this.m_arrPages[0].IsSelected = true;
}
const slideData = this.m_oWordControl.m_oLogicDocument.GetSlide(slideIndex);
const slideRect = this.m_arrPages[slideIndex];
slideRect.pageIndex = slideIndex;
if (isVerticalThumbnails) {
slideRect.left = isRightToLeft ? this.const_offset_r : this.const_offset_x;
slideRect.top = startOffset - currentScrollPx;
slideRect.right = slideRect.left + thSlideWidthPx;
slideRect.bottom = slideRect.top + thSlideHeightPx;
if (!isFirstSlideFound) {
if ((startOffset + thSlideHeightPx) > currentScrollPx) {
this.m_lDrawingFirst = slideIndex;
isFirstSlideFound = true;
}
}
if (!isLastSlideFound) {
if (slideRect.top > canvasHeight) {
this.m_lDrawingEnd = slideIndex - 1;
isLastSlideFound = true;
}
}
supplement = (thSlideHeightPx + 3 * this.const_border_w);
} else {
slideRect.top = this.const_offset_y;
slideRect.bottom = slideRect.top + thSlideHeightPx;
if (isRightToLeft) {
slideRect.right = canvasWidth - startOffset + currentScrollPx;
slideRect.left = slideRect.right - thSlideWidthPx;
} else {
slideRect.left = startOffset - currentScrollPx;
slideRect.right = slideRect.left + thSlideWidthPx;
}
if (!isFirstSlideFound) {
if ((startOffset + thSlideWidthPx) > currentScrollPx) {
this.m_lDrawingFirst = slideIndex;
isFirstSlideFound = true;
}
}
if (!isLastSlideFound) {
const isHidden = isRightToLeft
? slideRect.right < 0
: slideRect.left > canvasWidth;
if (isHidden) {
this.m_lDrawingEnd = slideIndex - 1;
isLastSlideFound = true;
}
}
supplement = (thSlideWidthPx + 3 * this.const_border_w);
}
if (slideData.getObjectType() === AscDFH.historyitem_type_SlideLayout) {
const scaledWidth = (slideRect.right - slideRect.left) * LAYOUT_SCALE;
const scaledHeight = (slideRect.bottom - slideRect.top) * LAYOUT_SCALE;
if (isVerticalThumbnails) {
slideRect.bottom = (slideRect.top + scaledHeight) + 0.5 >> 0;
isRightToLeft
? slideRect.right = (slideRect.left + scaledWidth) + 0.5 >> 0
: slideRect.left = (slideRect.right - scaledWidth) + 0.5 >> 0;
supplement = scaledHeight + 3 * this.const_border_w;
} else {
slideRect.top = (slideRect.bottom - scaledHeight) + 0.5 >> 0;
isRightToLeft
? slideRect.left = (slideRect.right - scaledWidth) + 0.5 >> 0
: slideRect.right = (slideRect.left + scaledWidth) + 0.5 >> 0;
supplement = scaledWidth + 3 * this.const_border_w;
}
}
startOffset += supplement >> 0;
}
if (this.m_arrPages.length > totalSlidesCount)
this.m_arrPages.splice(totalSlidesCount, this.m_arrPages.length - totalSlidesCount);
if (!isLastSlideFound) {
this.m_lDrawingEnd = totalSlidesCount - 1;
}
};
this.GetThumbnailPagePosition = function (pageIndex) {
if (pageIndex < 0 || pageIndex >= this.m_arrPages.length)
return null;
const drawRect = this.m_arrPages[pageIndex];
return {
X: AscCommon.AscBrowser.convertToRetinaValue(drawRect.left),
Y: AscCommon.AscBrowser.convertToRetinaValue(drawRect.top),
W: AscCommon.AscBrowser.convertToRetinaValue(drawRect.right - drawRect.left),
H: AscCommon.AscBrowser.convertToRetinaValue(drawRect.bottom - drawRect.top)
};
};
this.getSpecialPasteButtonCoords = function (sSlideId) {
if (!sSlideId) return null;
const oPresentation = this.m_oWordControl.m_oLogicDocument;
const aSlides = oPresentation.GetAllSlides();
const nSlideIdx = aSlides.findIndex(function (slide) {
return slide.Get_Id() === sSlideId;
});
if (nSlideIdx === -1) return null;
const oRect = this.GetThumbnailPagePosition(nSlideIdx);
if (!oRect) return null;
const oThContainer = editor.WordControl.m_oThumbnailsContainer;
const isHidden = oThContainer.HtmlElement.style.display === "none";
const isHorizontalThumbnails = Asc.editor.getThumbnailsPosition() === thumbnailsPositionMap.bottom;
const offsetX = oThContainer.AbsolutePosition.L * g_dKoef_mm_to_pix;
const offsetY = oThContainer.AbsolutePosition.T * g_dKoef_mm_to_pix;
const coordX = isHidden
? 0
: oRect.X + oRect.W - AscCommon.specialPasteElemWidth;
const coordY = isHorizontalThumbnails
? oRect.Y - AscCommon.specialPasteElemHeight
: oRect.Y + oRect.H;
return {
X: offsetX + coordX,
Y: offsetY + coordY
};
};
// scroll
this.CheckNeedAnimateScrolls = function (type) {
switch (type) {
case -1:
if (this.MouseThumbnailsAnimateScrollTopTimer != -1) {
clearInterval(this.MouseThumbnailsAnimateScrollTopTimer);
this.MouseThumbnailsAnimateScrollTopTimer = -1;
}
if (this.MouseThumbnailsAnimateScrollBottomTimer != -1) {
clearInterval(this.MouseThumbnailsAnimateScrollBottomTimer);
this.MouseThumbnailsAnimateScrollBottomTimer = -1;
}
break;
case 0:
if (this.MouseThumbnailsAnimateScrollBottomTimer != -1) {
clearInterval(this.MouseThumbnailsAnimateScrollBottomTimer);
this.MouseThumbnailsAnimateScrollBottomTimer = -1;
}
if (this.MouseThumbnailsAnimateScrollTopTimer == -1) {
this.MouseThumbnailsAnimateScrollTopTimer = setInterval(this.OnScrollTrackTop, 50);
}
break;
case 1:
if (this.MouseThumbnailsAnimateScrollTopTimer != -1) {
clearInterval(this.MouseThumbnailsAnimateScrollTopTimer);
this.MouseThumbnailsAnimateScrollTopTimer = -1;
}
if (-1 == this.MouseThumbnailsAnimateScrollBottomTimer) {
this.MouseThumbnailsAnimateScrollBottomTimer = setInterval(this.OnScrollTrackBottom, 50);
}
break;
}
};
this.OnScrollTrackTop = function () {
Asc.editor.getThumbnailsPosition() === thumbnailsPositionMap.bottom
? oThis.m_oWordControl.m_oScrollThumbApi.scrollByX(-45)
: oThis.m_oWordControl.m_oScrollThumbApi.scrollByY(-45);
};
this.OnScrollTrackBottom = function () {
Asc.editor.getThumbnailsPosition() === thumbnailsPositionMap.bottom
? oThis.m_oWordControl.m_oScrollThumbApi.scrollByX(45)
: oThis.m_oWordControl.m_oScrollThumbApi.scrollByY(45);
};
this.thumbnailsScroll = function (sender, scrollPosition, maxScrollPosition, isAtTop, isAtBottom) {
if (false === this.m_oWordControl.m_oApi.bInit_word_control || false === this.m_bIsScrollVisible)
return;
this.m_dScrollY = Math.max(0, Math.min(scrollPosition, maxScrollPosition));
this.m_dScrollY_max = maxScrollPosition;
this.CalculatePlaces();
AscCommon.g_specialPasteHelper.SpecialPasteButton_Update_Position();
this.m_bIsUpdate = true;
if (!this.m_oWordControl.m_oApi.isMobileVersion)
this.SetFocusElement(FOCUS_OBJECT_THUMBNAILS);
};
// calculate
this.RecalculateAll = function()
{
this.SlideWidth = this.m_oWordControl.m_oLogicDocument.GetWidthMM();
this.SlideHeight = this.m_oWordControl.m_oLogicDocument.GetHeightMM();
this.CheckSizes();
this.ClearCacheAttack();
};
// size
this.CheckSizes = function () {
this.InitCheckOnResize();
if (!this.isThumbnailsShown())
return;
this.calculateThumbnailsOffsets();
const wordControl = this.m_oWordControl;
const dKoefToPix = AscCommon.AscBrowser.retinaPixelRatio * g_dKoef_mm_to_pix;
const isHorizontalOrientation = Asc.editor.getThumbnailsPosition() === thumbnailsPositionMap.bottom;
const dPosition = this.m_dScrollY_max != 0 ? this.m_dScrollY / this.m_dScrollY_max : 0;
// Width and Height of 'id_panel_thumbnails' in millimeters
const thumbnailsContainerWidth = wordControl.m_oThumbnailsContainer.AbsolutePosition.R - wordControl.m_oThumbnailsContainer.AbsolutePosition.L;
const thumbnailsContainerHeight = wordControl.m_oThumbnailsContainer.AbsolutePosition.B - wordControl.m_oThumbnailsContainer.AbsolutePosition.T;
let totalThumbnailsLength = this.calculateTotalThumbnailsLength(thumbnailsContainerWidth, thumbnailsContainerHeight);
const thumbnailsContainerLength = isHorizontalOrientation
? thumbnailsContainerWidth * dKoefToPix >> 0
: thumbnailsContainerHeight * dKoefToPix >> 0;
if (totalThumbnailsLength < thumbnailsContainerLength) {
// All thumbnails fit inside - no scroller needed
if (this.m_bIsScrollVisible && GlobalSkin.ThumbnailScrollWidthNullIfNoScrolling) {
wordControl.m_oThumbnails.Bounds.R = 0;
wordControl.m_oThumbnailsBack.Bounds.R = 0;
wordControl.m_oThumbnails_scroll.Bounds.AbsW = 0;
wordControl.m_oThumbnailsContainer.Resize(thumbnailsContainerWidth, thumbnailsContainerHeight, wordControl);
} else {
wordControl.m_oThumbnails_scroll.HtmlElement.style.display = 'none';
}
this.m_bIsScrollVisible = false;
this.m_dScrollY = isHorizontalOrientation && Asc.editor.isRtlInterface
? this.m_dScrollY_max
: 0;
} else {
// Scrollbar is needed
if (!this.m_bIsScrollVisible) {
if (GlobalSkin.ThumbnailScrollWidthNullIfNoScrolling) {
wordControl.m_oThumbnailsBack.Bounds.R = wordControl.ScrollWidthPx * dKoefToPix;
wordControl.m_oThumbnails.Bounds.R = wordControl.ScrollWidthPx * dKoefToPix;
const _width_mm_scroll = 10;
wordControl.m_oThumbnails_scroll.Bounds.AbsW = _width_mm_scroll * dKoefToPix;
} else if (!wordControl.m_oApi.isMobileVersion) {
wordControl.m_oThumbnails_scroll.HtmlElement.style.display = 'block';
}
const thumbnailsContainerParent = wordControl.m_oThumbnailsContainer.Parent; // editor.WordControl.m_oBody
wordControl.m_oThumbnailsContainer.Resize(
thumbnailsContainerParent.AbsolutePosition.R - thumbnailsContainerParent.AbsolutePosition.L,
thumbnailsContainerParent.AbsolutePosition.B - thumbnailsContainerParent.AbsolutePosition.T,
wordControl
);
}
this.m_bIsScrollVisible = true;
const thumbnailsWidth = wordControl.m_oThumbnails.AbsolutePosition.R - wordControl.m_oThumbnails.AbsolutePosition.L;
const thumbnailsHeight = wordControl.m_oThumbnails.AbsolutePosition.B - wordControl.m_oThumbnails.AbsolutePosition.T;
totalThumbnailsLength = this.calculateTotalThumbnailsLength(thumbnailsWidth, thumbnailsHeight);
const settings = this.getSettingsForScrollObject(totalThumbnailsLength);
if (wordControl.m_oScrollThumb_ && wordControl.m_oScrollThumb_.isHorizontalScroll === isHorizontalOrientation) {
wordControl.m_oScrollThumb_.Repos(settings);
} else {
const holder = wordControl.m_oThumbnails_scroll.HtmlElement;
const canvas = holder.getElementsByTagName('canvas')[0];
canvas && holder.removeChild(canvas);
wordControl.m_oScrollThumb_ = new AscCommon.ScrollObject('id_vertical_scroll_thmbnl', settings);
wordControl.m_oScrollThumbApi = wordControl.m_oScrollThumb_;
const eventName = isHorizontalOrientation ? 'scrollhorizontal' : 'scrollvertical';
wordControl.m_oScrollThumb_.bind(eventName, function (evt) {
const maxScrollPosition = isHorizontalOrientation ? evt.maxScrollX : evt.maxScrollY;
oThis.thumbnailsScroll(this, evt.scrollD, maxScrollPosition);
});
}
wordControl.m_oScrollThumb_.isHorizontalScroll = isHorizontalOrientation;
if (Asc.editor.isRtlInterface && isHorizontalOrientation && this.m_dScrollY_max === 0) {
wordControl.m_oScrollThumbApi.scrollToX(wordControl.m_oScrollThumbApi.maxScrollX);
}
}
if (this.m_bIsScrollVisible) {
const lPosition = (dPosition * wordControl.m_oScrollThumbApi.getMaxScrolledY()) >> 0;
wordControl.m_oScrollThumbApi.scrollToY(lPosition);
}
isHorizontalOrientation
? this.ScrollerWidth = totalThumbnailsLength
: this.ScrollerHeight = totalThumbnailsLength;
if (wordControl.MobileTouchManagerThumbnails) {
wordControl.MobileTouchManagerThumbnails.Resize();
}
this.CalculatePlaces();
AscCommon.g_specialPasteHelper.SpecialPasteButton_Update_Position();
this.m_bIsUpdate = true;
};
this.calculateThumbnailsOffsets = function () {
const isHorizontalOrientation = Asc.editor.getThumbnailsPosition() === thumbnailsPositionMap.bottom;
if (isHorizontalOrientation) {
this.const_offset_y = 25 + Math.round(9 * AscCommon.AscBrowser.retinaPixelRatio)
} else {
const _tmpDig = this.DigitWidths.length > 5 ? this.DigitWidths[5] : 0;
const dKoefToPix = AscCommon.AscBrowser.retinaPixelRatio * g_dKoef_mm_to_pix;
const slidesCount = this.GetSlidesCount();
const firstSlideNumber = this.m_oWordControl.m_oLogicDocument.getFirstSlideNumber();
const totalSlidesLength = String(slidesCount + firstSlideNumber).length;
this.const_offset_x = Math.max((_tmpDig * dKoefToPix * totalSlidesLength >> 0), 25) + Math.round(9 * AscCommon.AscBrowser.retinaPixelRatio);
}
};
this.calculateTotalThumbnailsLength = function (containerWidth, containerHeight) {
const dKoefToPix = AscCommon.AscBrowser.retinaPixelRatio * g_dKoef_mm_to_pix;
const oPresentation = this.m_oWordControl.m_oLogicDocument;
const slidesCount = this.GetSlidesCount();
const isHorizontalOrientation = Asc.editor.getThumbnailsPosition() === thumbnailsPositionMap.bottom;
let thumbnailHeight, thumbnailWidth;
if (isHorizontalOrientation) {
thumbnailHeight = (containerHeight * dKoefToPix >> 0) - (this.const_offset_y + this.const_offset_b);
thumbnailWidth = thumbnailHeight * this.SlideWidth / this.SlideHeight >> 0;
} else {
thumbnailWidth = (containerWidth * dKoefToPix >> 0) - (this.const_offset_x + this.const_offset_r);
thumbnailHeight = thumbnailWidth * this.SlideHeight / this.SlideWidth >> 0;
}
let cumulativeThumbnailLength = 0;
if (oPresentation.IsVisioEditor()) {
for (let nIdx = 0; nIdx < slidesCount; ++nIdx) {
const originalSlideWidth = oPresentation.GetWidthMM(nIdx);
const originalSlideHeight = oPresentation.GetHeightMM(nIdx);
const additionalLength = isHorizontalOrientation
? thumbnailHeight * originalSlideWidth / originalSlideHeight >> 0
: thumbnailWidth * originalSlideHeight / originalSlideWidth >> 0;;
cumulativeThumbnailLength += additionalLength;
}
} else if (this.IsMasterMode()) {
for (let nIdx = 0; nIdx < oPresentation.slideMasters.length; ++nIdx) {
const oMaster = oPresentation.slideMasters[nIdx];
const additionalLength = isHorizontalOrientation
? thumbnailWidth + oMaster.sldLayoutLst.length * thumbnailWidth * LAYOUT_SCALE
: thumbnailHeight + oMaster.sldLayoutLst.length * thumbnailHeight * LAYOUT_SCALE;
cumulativeThumbnailLength += additionalLength;
}
cumulativeThumbnailLength = Math.round(cumulativeThumbnailLength);
} else {
cumulativeThumbnailLength = isHorizontalOrientation
? thumbnailWidth * slidesCount
: thumbnailHeight * slidesCount;
}
const totalThumbnailsLength = isHorizontalOrientation
? 2 * this.const_offset_x + cumulativeThumbnailLength + (slidesCount > 0 ? (slidesCount - 1) * 3 * this.const_border_w : 0)
: 2 * this.const_offset_y + cumulativeThumbnailLength + (slidesCount > 0 ? (slidesCount - 1) * 3 * this.const_border_w : 0);
return totalThumbnailsLength;
};
this.getSettingsForScrollObject = function (totalContentLength) {
const settings = new AscCommon.ScrollSettings();
settings.screenW = this.m_oWordControl.m_oThumbnails.HtmlElement.width;
settings.screenH = this.m_oWordControl.m_oThumbnails.HtmlElement.height;
settings.showArrows = false;
settings.slimScroll = true;
settings.cornerRadius = 1;
settings.scrollBackgroundColor = GlobalSkin.BackgroundColorThumbnails;
settings.scrollBackgroundColorHover = GlobalSkin.BackgroundColorThumbnails;
settings.scrollBackgroundColorActive = GlobalSkin.BackgroundColorThumbnails;
settings.scrollerColor = GlobalSkin.ScrollerColor;
settings.scrollerHoverColor = GlobalSkin.ScrollerHoverColor;
settings.scrollerActiveColor = GlobalSkin.ScrollerActiveColor;
settings.arrowColor = GlobalSkin.ScrollArrowColor;
settings.arrowHoverColor = GlobalSkin.ScrollArrowHoverColor;
settings.arrowActiveColor = GlobalSkin.ScrollArrowActiveColor;
settings.strokeStyleNone = GlobalSkin.ScrollOutlineColor;
settings.strokeStyleOver = GlobalSkin.ScrollOutlineHoverColor;
settings.strokeStyleActive = GlobalSkin.ScrollOutlineActiveColor;
settings.targetColor = GlobalSkin.ScrollerTargetColor;
settings.targetHoverColor = GlobalSkin.ScrollerTargetHoverColor;
settings.targetActiveColor = GlobalSkin.ScrollerTargetActiveColor;
if (Asc.editor.getThumbnailsPosition() === thumbnailsPositionMap.bottom) {
settings.isHorizontalScroll = true;
settings.isVerticalScroll = false;
settings.contentW = totalContentLength;
} else {
settings.isHorizontalScroll = false;
settings.isVerticalScroll = true;
settings.contentH = totalContentLength;
}
return settings;
};
// interface
this.UpdateInterface = function()
{
this.m_oWordControl.m_oLogicDocument.Document_UpdateInterfaceState();
};
this.showContextMenu = function(bPosBySelect)
{
let sSelectedIdx = this.GetSelectedArray();
let oMenuPos;
let bIsSlideSelect = false;
if(bPosBySelect)
{
oMenuPos = this.GetThumbnailPagePosition(Math.min.apply(Math, sSelectedIdx));
bIsSlideSelect = sSelectedIdx.length > 0;
}
else
{
let oEditorCtrl = oThis.m_oWordControl;
let oThCtrlPos = oEditorCtrl.m_oThumbnails.AbsolutePosition;
oMenuPos = {
X: global_mouseEvent.X - ((oThCtrlPos.L * g_dKoef_mm_to_pix) >> 0) - oEditorCtrl.X,
Y: global_mouseEvent.Y - ((oThCtrlPos.T * g_dKoef_mm_to_pix) >> 0) - oEditorCtrl.Y
};
let pos = this.ConvertCoords(global_mouseEvent.X, global_mouseEvent.Y);
bIsSlideSelect = pos.Page !== -1;
}
if (oMenuPos)
{
const oLogicDocument = this.m_oWordControl.m_oLogicDocument;
let oFirstSlide = oLogicDocument.GetSlide(sSelectedIdx[0]);
let nType = Asc.c_oAscContextMenuTypes.Thumbnails;
if(oFirstSlide)
{
if(oFirstSlide.getObjectType() === AscDFH.historyitem_type_SlideLayout)
{
nType = Asc.c_oAscContextMenuTypes.Layout;
}
else if(oFirstSlide.getObjectType() === AscDFH.historyitem_type_SlideMaster)
{
nType = Asc.c_oAscContextMenuTypes.Master;
}
}
let oData =
{
Type: nType,
X_abs: oMenuPos.X,
Y_abs: oMenuPos.Y,
IsSlideSelect: bIsSlideSelect,
IsSlideHidden: this.IsSlideHidden(sSelectedIdx),
IsSlidePreserve: oLogicDocument.isPreserveSelectionSlides()
};
editor.sync_ContextMenuCallback(new AscCommonSlide.CContextMenuData(oData));
}
};
this.GetCurSld = function()
{
return this.thumbnails.GetCurSld();
};
}
CThumbnailsManager.prototype.isThumbnailsShown = function () {
const thumbnailsContainer = this.m_oWordControl.m_oThumbnailsContainer;
if (!thumbnailsContainer) return false;
const absolutePosition = thumbnailsContainer.AbsolutePosition;
const width = absolutePosition.R - absolutePosition.L;
const height = absolutePosition.B - absolutePosition.T;
const isHorizontalThumbnails = Asc.editor.getThumbnailsPosition() === thumbnailsPositionMap.bottom;
return isHorizontalThumbnails
? width >= 0 && height >= 1
: width >= 1 && height >= 0;
};
function CSlideDrawer()
{
this.m_oWordControl = null;
this.CONST_MAX_SLIDE_CACHE_SIZE = 104857600; // 100 megabytes
if (AscCommon.AscBrowser.isAppleDevices)
this.CONST_MAX_SLIDE_CACHE_SIZE = 16777216;
this.CONST_BORDER = 10; // in px
this.IsCached = false;
this.CachedCanvas = null;
this.CachedCanvasCtx = null;
this.BoundsChecker = new AscFormat.CSlideBoundsChecker();
this.BoundsChecker2 = new AscFormat.CSlideBoundsChecker();
this.CacheSlidePixW = 1;
this.CacheSlidePixH = 1;
this.bIsEmptyPresentation = false;
this.IsRecalculateSlide = false;
this.EmptyPresenattionTextHeight = 60;
// TODO: максимальная ширина всех линий и запас под локи
this.SlideEps = 20;
this.CheckRecalculateSlide = function()
{
if (this.IsRecalculateSlide)
{
this.IsRecalculateSlide = false;
this.m_oWordControl.m_oDrawingDocument.FirePaint();
}
}
this.CheckSlideSize = function(zoom, slideNum)
{
if (-1 == slideNum)
this.bIsEmptyPresentation = true;
var dKoef = zoom * g_dKoef_mm_to_pix / 100;
dKoef *= AscCommon.AscBrowser.retinaPixelRatio;
var w_mm = this.m_oWordControl.m_oLogicDocument.GetWidthMM();
var h_mm = this.m_oWordControl.m_oLogicDocument.GetHeightMM();
var w_px = (w_mm * dKoef) >> 0;
var h_px = (h_mm * dKoef) >> 0;
this.BoundsChecker2.init(w_px, h_px, w_mm, h_mm);
this.BoundsChecker2.transform(1, 0, 0, 1, 0, 0);
if (this.bIsEmptyPresentation)
{
this.BoundsChecker2._s();
this.BoundsChecker2._m(0, 0);
this.BoundsChecker2._l(w_mm, 0);
this.BoundsChecker2._l(w_mm, h_mm);
this.BoundsChecker2._l(0, h_mm);
this.BoundsChecker2._z();
return;
}
this.m_oWordControl.m_oLogicDocument.DrawPage(slideNum, this.BoundsChecker2);
}
this.CheckSlide = function(slideNum)
{
if (this.m_oWordControl.m_oApi.isReporterMode)
return;
if (this.m_oWordControl.m_oApi.isSaveFonts_Images)
{
this.IsRecalculateSlide = true;
return;
}
this.IsRecalculateSlide = false;
this.bIsEmptyPresentation = false;
if (-1 == slideNum)
this.bIsEmptyPresentation = true;
var dKoef = this.m_oWordControl.m_nZoomValue * g_dKoef_mm_to_pix / 100;
dKoef *= AscCommon.AscBrowser.retinaPixelRatio;
var w_mm = this.m_oWordControl.m_oLogicDocument.GetWidthMM();
var h_mm = this.m_oWordControl.m_oLogicDocument.GetHeightMM();
var w_px = (w_mm * dKoef) >> 0;
var h_px = (h_mm * dKoef) >> 0;
this.BoundsChecker.init(w_px, h_px, w_mm, h_mm);
this.BoundsChecker.transform(1, 0, 0, 1, 0, 0);
if (this.bIsEmptyPresentation)
{
this.BoundsChecker._s();
this.BoundsChecker._m(0, 0);
this.BoundsChecker._l(w_mm, 0);
this.BoundsChecker._l(w_mm, h_mm);
this.BoundsChecker._l(0, h_mm);
this.BoundsChecker._z();
return;
}
this.m_oWordControl.m_oLogicDocument.DrawPage(slideNum, this.BoundsChecker);
var bIsResize = this.m_oWordControl.CheckCalculateDocumentSize(this.BoundsChecker.Bounds);
if (true)
{
// поидее если был ресайз только
dKoef = this.m_oWordControl.m_nZoomValue * g_dKoef_mm_to_pix / 100;
dKoef *= AscCommon.AscBrowser.retinaPixelRatio;
w_mm = this.m_oWordControl.m_oLogicDocument.GetWidthMM();
h_mm = this.m_oWordControl.m_oLogicDocument.GetHeightMM();
w_px = (w_mm * dKoef) >> 0;
h_px = (h_mm * dKoef) >> 0;
}
// теперь смотрим, используем ли кэш для скролла
var _need_pix_width = this.BoundsChecker.Bounds.max_x - this.BoundsChecker.Bounds.min_x + 1 + 2 * this.SlideEps;
var _need_pix_height = this.BoundsChecker.Bounds.max_y - this.BoundsChecker.Bounds.min_y + 1 + 2 * this.SlideEps;
if (this.m_oWordControl.NoneRepaintPages)
return;
this.CacheSlidePixW = _need_pix_width;
this.CacheSlidePixH = _need_pix_height;
this.IsCached = false;
if (4 * _need_pix_width * _need_pix_height < this.CONST_MAX_SLIDE_CACHE_SIZE)
this.IsCached = true;
// See bug 68871
if (this.m_oWordControl.m_oApi.isMobileVersion)
this.IsCached = false;
if (this.IsCached)
{
// кэш используется. теперь нужно решить, нужно ли создать картинку, или управимся и старой
var _need_reinit_image = false;
if (null == this.CachedCanvas)
_need_reinit_image = true;
else
{
if (this.CachedCanvas.width < _need_pix_width || this.CachedCanvas.height < _need_pix_height)
_need_reinit_image = true;
}
if (_need_reinit_image)
{
// все равно перевыделяем память - сделаем небольшой задел, чтобы обезопасить
// себя от чувака, который будет быстро выдвигать/задвигать элемент на "чуть-чуть"
this.CachedCanvas = null;
this.CachedCanvas = document.createElement('canvas');
this.CachedCanvas.width = _need_pix_width + 100;
this.CachedCanvas.height = _need_pix_height + 100;
this.CachedCanvasCtx = AscCommon.AscBrowser.getContext2D(this.CachedCanvas);
}
else
{
// здесь просто нужно очистить место под новую отрисовку
this.CachedCanvasCtx.setTransform(1, 0, 0, 1, 0, 0);
this.CachedCanvasCtx.clearRect(0, 0, _need_pix_width, _need_pix_height);
}
// и сразу отрисуем его на кешированной картинке
var g = new AscCommon.CGraphics();
g.init(this.CachedCanvasCtx, w_px, h_px, w_mm, h_mm);
g.m_oFontManager = AscCommon.g_fontManager;
g.m_oCoordTransform.tx = -this.BoundsChecker.Bounds.min_x + this.SlideEps;
g.m_oCoordTransform.ty = -this.BoundsChecker.Bounds.min_y + this.SlideEps;
g.transform(1, 0, 0, 1, 0, 0);
if (this.m_oWordControl.m_oApi.isViewMode)
g.IsNoDrawingEmptyPlaceholderText = true;
this.m_oWordControl.m_oLogicDocument.DrawPage(slideNum, g);
}
else
{
if (null != this.CachedCanvas)
{
this.CachedCanvas = null;
this.CachedCanvasCtx = null;
}
}
}
this.DrawSlide = function(outputCtx, scrollX, scrollX_max, scrollY, scrollY_max, slideNum)
{
if (this.m_oWordControl.m_oApi.isReporterMode)
return;
var _rect = this.m_oWordControl.m_oDrawingDocument.SlideCurrectRect;
var _bounds = this.BoundsChecker.Bounds;
var _x = _rect.left + _bounds.min_x;
var _y = _rect.top + _bounds.min_y;
_x = ((_rect.left * AscCommon.AscBrowser.retinaPixelRatio) >> 0) + _bounds.min_x;
_y = ((_rect.top * AscCommon.AscBrowser.retinaPixelRatio) >> 0) + _bounds.min_y;
if (this.bIsEmptyPresentation)
{
var w_px = _bounds.max_x - _bounds.min_x + 1;
var h_px = _bounds.max_y - _bounds.min_y + 1;
outputCtx.lineWidth = 1;
outputCtx.strokeStyle = "#000000";
outputCtx.beginPath();
this.m_oWordControl.m_oDrawingDocument.AutoShapesTrack.AddRectDashClever(outputCtx, _x >> 0, _y >> 0, (_x + w_px) >> 0, (_y + h_px) >> 0, 2, 2, true);
outputCtx.beginPath();
outputCtx.fillStyle = "#3C3C3C";
var fontCtx = ((this.m_oWordControl.m_nZoomValue * 60 / 100) >> 0) + "px Arial";
outputCtx.font = fontCtx;
var text = AscCommon.translateManager.getValue("Click to add first slide");
var textWidth = outputCtx.measureText(text).width;
var xPos = ((_x >> 0) + ((w_px - textWidth) >> 1));
var yPos = ((_y >> 0) + ((h_px - this.EmptyPresenattionTextHeight) >> 1));
outputCtx.fillText(text, xPos, yPos);
return;
}
if (this.IsCached)
{
if (!this.m_oWordControl.NoneRepaintPages)
{
var w_px = (_bounds.max_x - _bounds.min_x + 1 + 2 * this.SlideEps) >> 0;
var h_px = (_bounds.max_y - _bounds.min_y + 1 + 2 * this.SlideEps) >> 0;
if (w_px > this.CachedCanvas.width)
w_px = this.CachedCanvas.width;
if (h_px > this.CachedCanvas.height)
h_px = this.CachedCanvas.height;
outputCtx.drawImage(this.CachedCanvas, 0, 0, w_px, h_px, (_x >> 0) - this.SlideEps, (_y >> 0) - this.SlideEps, w_px, h_px);
}
else
{
var w_px = (_bounds.max_x - _bounds.min_x + 1 + 2 * this.SlideEps) >> 0;
var h_px = (_bounds.max_y - _bounds.min_y + 1 + 2 * this.SlideEps) >> 0;
var w_px_src = this.CacheSlidePixW;
var h_px_src = this.CacheSlidePixH;
if (w_px_src > this.CachedCanvas.width)
w_px_src = this.CachedCanvas.width;
if (h_px_src > this.CachedCanvas.height)
h_px_src = this.CachedCanvas.height;
outputCtx.drawImage(this.CachedCanvas, 0, 0, w_px_src, h_px_src, (_x >> 0) - this.SlideEps, (_y >> 0) - this.SlideEps, w_px, h_px);
}
}
else
{
var dKoef = this.m_oWordControl.m_nZoomValue * g_dKoef_mm_to_pix / 100;
dKoef *= AscCommon.AscBrowser.retinaPixelRatio;
var w_mm = this.m_oWordControl.m_oLogicDocument.GetWidthMM();
var h_mm = this.m_oWordControl.m_oLogicDocument.GetHeightMM();
var w_px = (w_mm * dKoef) >> 0;
var h_px = (h_mm * dKoef) >> 0;
var g = new AscCommon.CGraphics();
g.init(outputCtx, w_px, h_px, w_mm, h_mm);
g.m_oFontManager = AscCommon.g_fontManager;
g.m_oCoordTransform.tx = _x - _bounds.min_x;
g.m_oCoordTransform.ty = _y - _bounds.min_y;
g.transform(1, 0, 0, 1, 0, 0);
if (this.m_oWordControl.m_oApi.isViewMode)
g.IsNoDrawingEmptyPlaceholderText = true;
this.m_oWordControl.m_oLogicDocument.DrawPage(slideNum, g);
}
if (this.m_oWordControl.m_oApi.watermarkDraw &&
!(this.m_oWordControl.DemonstrationManager && this.m_oWordControl.DemonstrationManager.Mode) &&
!this.m_oWordControl.m_oDrawingDocument.TransitionSlide.IsPlaying())
{
this.m_oWordControl.m_oApi.watermarkDraw.Draw(outputCtx,
AscCommon.AscBrowser.convertToRetinaValue(_rect.left, true),
AscCommon.AscBrowser.convertToRetinaValue(_rect.top, true),
AscCommon.AscBrowser.convertToRetinaValue(_rect.right - _rect.left, true),
AscCommon.AscBrowser.convertToRetinaValue(_rect.bottom - _rect.top, true));
}
}
}
function CreateScrollSettings(height, element, OffsetY)
{
var settings = new AscCommon.ScrollSettings();
settings.screenW = element.width;
settings.screenH = element.height;
settings.vscrollStep = 45;
settings.hscrollStep = 45;
settings.contentW = 1;
settings.contentH = 2 * OffsetY + ((height * g_dKoef_mm_to_pix) >> 0);
settings.scrollerMinHeight = 5;
settings.screenW = AscCommon.AscBrowser.convertToRetinaValue(settings.screenW);
settings.screenH = AscCommon.AscBrowser.convertToRetinaValue(settings.screenH);
settings.scrollBackgroundColor = GlobalSkin.ScrollBackgroundColor;
settings.scrollBackgroundColorHover = GlobalSkin.ScrollBackgroundColor;
settings.scrollBackgroundColorActive = GlobalSkin.ScrollBackgroundColor;
settings.scrollerColor = GlobalSkin.ScrollerColor;
settings.scrollerHoverColor = GlobalSkin.ScrollerHoverColor;
settings.scrollerActiveColor = GlobalSkin.ScrollerActiveColor;
settings.arrowColor = GlobalSkin.ScrollArrowColor;
settings.arrowHoverColor = GlobalSkin.ScrollArrowHoverColor;
settings.arrowActiveColor = GlobalSkin.ScrollArrowActiveColor;
settings.strokeStyleNone = GlobalSkin.ScrollOutlineColor;
settings.strokeStyleOver = GlobalSkin.ScrollOutlineHoverColor;
settings.strokeStyleActive = GlobalSkin.ScrollOutlineActiveColor;
settings.targetColor = GlobalSkin.ScrollerTargetColor;
settings.targetHoverColor = GlobalSkin.ScrollerTargetHoverColor;
settings.targetActiveColor = GlobalSkin.ScrollerTargetActiveColor;
return settings;
}
function CNotesDrawer(page)
{
this.Width = 0;
this.Height = 0;
this.HtmlPage = page;
this.TargetHtmlElement = document.getElementById('id_notes_target_cursor');
this.IsRepaint = false;
this.Slide = -1;
this.m_oOverlayApi = new AscCommon.COverlay();
this.m_oOverlayApi.m_oControl = this.HtmlPage.m_oNotesOverlay;
this.m_oOverlayApi.m_oHtmlPage = this.HtmlPage;
this.m_oOverlayApi.Clear();
this.m_oOverlayApi.getNotesOffsets = function()
{
return { X : this.m_oHtmlPage.m_oNotesApi.OffsetX, Y : AscCommon.AscBrowser.convertToRetinaValue(-this.m_oHtmlPage.m_oNotesApi.Scroll, true) };
};
this.OffsetX = 10;
this.OffsetY = 10;
this.Scroll = 0;
this.ScrollMax = 0;
this.fontManager = new AscFonts.CFontManager();
this.fontManager.Initialize(true);
this.fontManager.SetHintsProps(true, true);
this.m_oTimerScrollSelect = -1;
this.IsEmptyDrawCheck = false;
this.IsEmptyDraw = false;
var oThis = this;
this.Init = function()
{
var _elem = this.HtmlPage.m_oNotes;
var _elemOverlay = this.HtmlPage.m_oNotesOverlay;
_elem.HtmlElement.onmousedown = this.onMouseDown;
_elem.HtmlElement.onmousemove = this.onMouseMove;
_elem.HtmlElement.onmouseup = this.onMouseUp;
_elemOverlay.HtmlElement.onmousedown = this.onMouseDown;
_elemOverlay.HtmlElement.onmousemove = this.onMouseMove;
_elemOverlay.HtmlElement.onmouseup = this.onMouseUp;
this.HtmlPage.m_oNotesContainer.HtmlElement.onmousewheel = this.onMouseWhell;
if (this.HtmlPage.m_oNotesContainer.HtmlElement.addEventListener)
{
this.HtmlPage.m_oNotesContainer.HtmlElement.addEventListener("DOMMouseScroll", this.onMouseWhell, false);
}
};
// paint
this.CheckPaint = function()
{
if (this.IsRepaint)
this.OnPaint();
};
this.OnPaint = function()
{
var element = this.HtmlPage.m_oNotes.HtmlElement;
var ctx = AscCommon.AscBrowser.getContext2D(element);
ctx.clearRect(0, 0, element.width, element.height);
if (-1 == this.Slide || this.IsEmptyDraw)
{
this.IsRepaint = false;
return;
}
var dKoef = g_dKoef_mm_to_pix;
dKoef *= AscCommon.AscBrowser.retinaPixelRatio;
var w_mm = this.Width;
var h_mm = this.Height;
var w_px = (w_mm * dKoef) >> 0;
var h_px = (h_mm * dKoef) >> 0;
var g = new AscCommon.CGraphics();
g.init(ctx, w_px, h_px, w_mm, h_mm);
g.m_oFontManager = this.fontManager;
if (AscCommon.GlobalSkin.Type === "dark")
{
g.setDarkMode(1);
}
g.SaveGrState();
g.m_oCoordTransform.tx = this.OffsetX;
g.m_oCoordTransform.ty = AscCommon.AscBrowser.convertToRetinaValue(-this.Scroll, true);
g.transform(1, 0, 0, 1, 0, 0);
//g.IsNoDrawingEmptyPlaceholder = true;
//g.IsNoDrawingEmptyPlaceholderText = true;
if (this.HtmlPage.m_oApi.isViewMode)
g.IsNoDrawingEmptyPlaceholderText = true;
this.HtmlPage.m_oDrawingDocument.isDrawingNotes = true;
this.HtmlPage.m_oLogicDocument.Notes_Draw(this.Slide, g);
this.HtmlPage.m_oDrawingDocument.isDrawingNotes = false;
this.IsRepaint = false;
g.RestoreGrState();
};
// recalculate
this.OnRecalculateNote = function(slideNum, width, height)
{
var isChangedSlide = (this.Slide != slideNum) ? true : false;
this.Slide = slideNum;
this.Width = width;
this.Height = height;
this.IsRepaint = true;
if (window["NATIVE_EDITOR_ENJINE"])
return;
this.IsEmptyDraw = false;
if (this.HtmlPage.m_oApi.isReporterMode && this.IsEmptyDrawCheck && !this.HtmlPage.m_oLogicDocument.IsVisibleSlide(this.Slide))
{
height = 0;
this.IsEmptyDraw = true;
}
var settings = CreateScrollSettings(height, this.HtmlPage.m_oNotes.HtmlElement, this.OffsetY);
this.ScrollMax = Math.max(0, settings.contentH - settings.screenH);
if (this.Scroll > this.ScrollMax)
this.Scroll = this.ScrollMax;
document.getElementById('panel_right_scroll_notes').style.height = settings.contentH + "px";
if (this.HtmlPage.m_oScrollNotes_)
{
this.HtmlPage.m_oScrollNotes_.Repos(settings, undefined, true);
if (isChangedSlide)
this.HtmlPage.m_oScrollNotes_.scrollToY(0);
}
else
{
this.HtmlPage.m_oScrollNotes_ = new AscCommon.ScrollObject("id_vertical_scroll_notes", settings);
this.HtmlPage.m_oScrollNotes_.onLockMouse = function (evt)
{
AscCommon.check_MouseDownEvent(evt, true);
global_mouseEvent.LockMouse();
};
this.HtmlPage.m_oScrollNotes_.offLockMouse = function (evt)
{
AscCommon.check_MouseUpEvent(evt);
};
this.HtmlPage.m_oScrollNotes_.bind("scrollvertical", function (evt)
{
oThis.Scroll = (oThis.ScrollMax * evt.scrollD / Math.max(evt.maxScrollY, 1)) >> 0;
oThis.HtmlPage.m_bIsUpdateTargetNoAttack = true;
oThis.IsRepaint = true;
oThis.HtmlPage.StartUpdateOverlay();
oThis.HtmlPage.OnUpdateOverlay();
oThis.HtmlPage.EndUpdateOverlay();
});
}
};
// common
this.GetCurrentSlideNumber = function()
{
return oThis.GetDrawingDocument().SlideCurrent;
};
this.GetPresentation = function()
{
return oThis.HtmlPage.m_oLogicDocument;
};
this.GetDrawingDocument = function()
{
return oThis.HtmlPage.m_oDrawingDocument;
};
this.GetRelPos = function ()
{
var _x = global_mouseEvent.X - oThis.HtmlPage.X - ((oThis.HtmlPage.m_oMainParent.AbsolutePosition.L * g_dKoef_mm_to_pix + 0.5) >> 0);
var _y = global_mouseEvent.Y - oThis.HtmlPage.Y - ((oThis.HtmlPage.m_oNotesContainer.Parent.AbsolutePosition.T * g_dKoef_mm_to_pix + 0.5) >> 0);
return {X: _x, Y: _y};
};
this.GetPosition = function ()
{
var oPos = oThis.GetRelPos();
var _x = oPos.X;
var _y = oPos.Y;
_x -= oThis.OffsetX;
_y += oThis.Scroll;
_x *= g_dKoef_pix_to_mm;
_y *= g_dKoef_pix_to_mm;
return { Page : oThis.GetCurrentSlideNumber(), X : _x, Y : _y, isNotes : true };
};
this.GetNotesWidth = function()
{
var _pix_width = this.HtmlPage.m_oNotes.HtmlElement.width - AscCommon.AscBrowser.convertToRetinaValue(30, true);
if (_pix_width < 10)
_pix_width = 10;
_pix_width = AscCommon.AscBrowser.convertToRetinaValue(_pix_width);
if (window["NATIVE_EDITOR_ENJINE"] && _pix_width < 100) _pix_width = 100;
return _pix_width / g_dKoef_mm_to_pix;
};
// events
this.onMouseDown = function (e)
{
if (-1 == oThis.HtmlPage.m_oDrawingDocument.SlideCurrent)
return;
// после fullscreen возможно изменение X, Y после вызова Resize.
oThis.HtmlPage.checkBodyOffset();
AscCommon.check_MouseDownEvent(e, true);
global_mouseEvent.LockMouse();
oThis.HtmlPage.Thumbnails.SetFocusElement(FOCUS_OBJECT_MAIN);
if (-1 == oThis.m_oTimerScrollSelect)
{
oThis.m_oTimerScrollSelect = setInterval(oThis.onSelectWheel, 20);
}
var pos = oThis.GetPosition();
var ret = oThis.HtmlPage.m_oDrawingDocument.checkMouseDown_Drawing(pos);
if (ret === true)
{
AscCommon.stopEvent(e);
return;
}
oThis.HtmlPage.StartUpdateOverlay();
oThis.HtmlPage.m_oLogicDocument.Notes_OnMouseDown(global_mouseEvent, pos.X, pos.Y);
oThis.HtmlPage.EndUpdateOverlay();
};
this.onMouseMove = function (e, is_overlay_attack)
{
if (-1 == oThis.HtmlPage.m_oDrawingDocument.SlideCurrent)
return;
if (e)
AscCommon.check_MouseMoveEvent(e);
var pos = oThis.GetPosition();
var _x = pos.X;
var _y = pos.Y;
if (oThis.HtmlPage.m_oDrawingDocument.InlineTextTrackEnabled)
{
if (_y < 0)
return;
}
oThis.HtmlPage.StartUpdateOverlay();
if ((-1 != oThis.m_oTimerScrollSelect) || (is_overlay_attack === true))
oThis.HtmlPage.OnUpdateOverlay();
var is_drawing = oThis.HtmlPage.m_oDrawingDocument.checkMouseMove_Drawing(pos);
if (is_drawing === true)
return;
oThis.HtmlPage.m_oLogicDocument.Notes_OnMouseMove(global_mouseEvent, _x, _y);
oThis.HtmlPage.EndUpdateOverlay();
};
this.onMouseUp = function (e)
{
if (-1 == oThis.HtmlPage.m_oDrawingDocument.SlideCurrent)
return;
AscCommon.check_MouseUpEvent(e);
var pos = oThis.GetPosition();
var _x = pos.X;
var _y = pos.Y;
if (-1 != oThis.m_oTimerScrollSelect)
{
clearInterval(oThis.m_oTimerScrollSelect);
oThis.m_oTimerScrollSelect = -1;
}
if (oThis.HtmlPage.m_oDrawingDocument.InlineTextTrackEnabled)
{
if (_y < 0)
return;
}
oThis.HtmlPage.StartUpdateOverlay();
var is_drawing = oThis.HtmlPage.m_oDrawingDocument.checkMouseUp_Drawing(pos);
if (is_drawing === true)
return;
oThis.HtmlPage.m_oLogicDocument.Notes_OnMouseUp(global_mouseEvent, _x, _y);
oThis.HtmlPage.EndUpdateOverlay();
oThis.HtmlPage.m_bIsMouseLock = false;
};
this.onMouseWhell = function(e)
{
if (false === oThis.HtmlPage.m_oApi.bInit_word_control)
return;
var _ctrl = false;
if (e.metaKey !== undefined)
_ctrl = e.ctrlKey || e.metaKey;
else
_ctrl = e.ctrlKey;
if (true === _ctrl)
{
AscCommon.stopEvent(e);
return false;
}
var deltaY = GetWheelDeltaY(e);
if (0 != deltaY)
oThis.HtmlPage.m_oScrollNotes_.scrollBy(0, deltaY, false);
// здесь - имитируем моус мув ---------------------------
oThis.onMouseMove(CreateBrowserEventObject(), true);
// ------------------------------------------------------
AscCommon.stopEvent(e);
return false;
};
this.onSelectWheel = function()
{
if (false === oThis.HtmlPage.m_oApi.bInit_word_control)
return;
var _y = oThis.GetRelPos().Y;
var positionMinY = 0;
var positionMaxY = oThis.HtmlPage.m_oNotes.AbsolutePosition.B * g_dKoef_mm_to_pix;
var scrollYVal = 0;
if (_y < positionMinY)
{
var delta = 30;
if (20 > (positionMinY - _y))
delta = 10;
scrollYVal = -delta;
}
else if (_y > positionMaxY)
{
var delta = 30;
if (20 > (_y - positionMaxY))
delta = 10;
scrollYVal = delta;
}
if (0 != scrollYVal)
{
oThis.HtmlPage.m_oScrollNotes_.scrollByY(scrollYVal, false);
oThis.onMouseMove();
}
};
this.OnResize = function ()
{
if (this.HtmlPage.m_oLogicDocument)
{
var oldEmpty = this.IsEmptyDraw;
if (!this.HtmlPage.m_oLogicDocument.Notes_OnResize())
{
this.OnRecalculateNote(this.Slide, this.Width, this.Height);
this.HtmlPage.m_oLogicDocument.RecalculateCurPos();
}
this.IsEmptyDraw = oldEmpty;
}
};
}
function CAnimPaneDrawTask()
{
this.bDraw = false;
this.Rect = null;
}
CAnimPaneDrawTask.prototype.Check = function(oRect)
{
this.bDraw = true;
if(this.Rect)
{
if(!oRect)
{
this.Rect = null;
}
else
{
this.Rect.checkByOther(oRect);
}
}
};
CAnimPaneDrawTask.prototype.NeedRedraw = function()
{
return this.bDraw;
};
CAnimPaneDrawTask.prototype.Clear = function()
{
this.bDraw = false;
this.Rect = null;
};
CAnimPaneDrawTask.prototype.GetRect = function()
{
return this.Rect;
};
function GetWheelDeltaY(e)
{
var delta = 0;
var deltaX = 0;
var deltaY = 0;
if (undefined != e.wheelDelta && e.wheelDelta != 0)
{
//delta = (e.wheelDelta > 0) ? -45 : 45;
delta = -45 * e.wheelDelta / 120;
}
else if (undefined != e.detail && e.detail != 0)
{
//delta = (e.detail > 0) ? 45 : -45;
delta = 45 * e.detail / 3;
}
// New school multidimensional scroll (touchpads) deltas
deltaY = delta;
deltaY >>= 0;
return deltaY;
}
function CreateBrowserEventObject()
{
var _e = {};
_e.pageX = global_mouseEvent.X;
_e.pageY = global_mouseEvent.Y;
_e.clientX = global_mouseEvent.X;
_e.clientY = global_mouseEvent.Y;
_e.altKey = global_mouseEvent.AltKey;
_e.shiftKey = global_mouseEvent.ShiftKey;
_e.ctrlKey = global_mouseEvent.CtrlKey;
_e.metaKey = global_mouseEvent.CtrlKey;
_e.srcElement = global_mouseEvent.Sender;
return _e;
}
function CPaneDrawerBase(page, htmlElement, parentDrawer, pageControl)
{
this.parentDrawer = parentDrawer ? parentDrawer : null;
if(this.parentDrawer)
{
this.fontManager = this.parentDrawer.fontManager;
}
else
{
this.fontManager = new AscFonts.CFontManager();
this.fontManager.Initialize(true);
this.fontManager.SetHintsProps(true, true);
}
this.HtmlPage = page;
this.HtmlElement = htmlElement;
this.PageParentControl = pageControl;
this.DrawTask = new CAnimPaneDrawTask();
this.Control = null;
this.Scroll = 0;
this.ScrollMax = 0;
var oThis = this;
oThis.CreateControl = function()
{
};
oThis.CheckControl = function()
{
if(!oThis.HtmlPage.m_oApi.isDocumentLoadComplete)
{
return;
}
if(!oThis.Control)
{
if(oThis.HtmlPage.m_oLogicDocument)
{
oThis.CreateControl();
}
}
};
oThis.GetControl = function()
{
oThis.CheckControl();
return oThis.Control;
};
oThis.GetHtmlElement = function()
{
return oThis.HtmlElement;
};
oThis.CheckSubscribeMouseWheel = function()
{};
oThis.Init = function ()
{
var oHtmlElem = oThis.GetHtmlElement();
AscCommon.addMouseEvent(oHtmlElem, "up", oThis.onMouseUp);
oThis.CheckSubscribeMouseWheel();
};
oThis.GetCurrentSlideNumber = function ()
{
return oThis.GetDrawingDocument().SlideCurrent;
};
oThis.GetPresentation = function ()
{
return oThis.HtmlPage.m_oLogicDocument;
};
oThis.GetDrawingDocument = function ()
{
return oThis.HtmlPage.m_oDrawingDocument;
};
oThis.OnPaint = function ()
{
var oControl = oThis.GetControl();
if(!oControl)
{
return;
}
var element = oThis.GetHtmlElement();
var ctx = element.getContext('2d');
var dKoef = g_dKoef_mm_to_pix;
dKoef *= AscCommon.AscBrowser.retinaPixelRatio;
var w_mm = oThis.GetWidth();
var h_mm = oThis.GetHeight();
var w_px = (w_mm * dKoef) >> 0;
var h_px = (h_mm * dKoef) >> 0;
var g = new AscCommon.CGraphics();
g.init(ctx, w_px, h_px, w_mm, h_mm);
g.m_oCoordTransform.ty = AscCommon.AscBrowser.convertToRetinaValue(-oThis.Scroll, true);
g.m_oFontManager = oThis.fontManager;
var oUpdateRect = oThis.DrawTask.GetRect();
var oClipRect = null;
if(oUpdateRect)
{
var oT = g.m_oCoordTransform;
var l = (oT.TransformPointX(oUpdateRect.l, oUpdateRect.t) >> 0) - 1;
var t = (oT.TransformPointY(oUpdateRect.l, oUpdateRect.t) >> 0) - 1;
var r = (oT.TransformPointX(oUpdateRect.r, oUpdateRect.b) >> 0) + 1;
var b = (oT.TransformPointY(oUpdateRect.r, oUpdateRect.b) >> 0) + 1;
oClipRect = new AscFormat.CGraphicBounds(l, t, r, b);
ctx.clearRect(oClipRect.l, oClipRect.t, oClipRect.w, oClipRect.h);
g.updateRect = oUpdateRect;
}
else
{
ctx.clearRect(0, 0, element.width, element.height);
}
ctx.fillStyle = AscCommon.GlobalSkin.AnimPaneBackground;
ctx.fillRect(0, 0, element.width, element.height);
if(oClipRect)
{
ctx.save();
ctx.beginPath();
ctx.rect(oClipRect.x, oClipRect.y, oClipRect.w, oClipRect.h);
ctx.clip();
ctx.save();
}
g.SaveGrState();
if (AscCommon.GlobalSkin.Type === "dark")
{
g.setDarkMode(1);
}
oControl.draw(g);
g.RestoreGrState();
if(oClipRect)
{
ctx.restore();
ctx.restore();
}
};
oThis.CheckPaint = function ()
{
if(oThis.DrawTask.NeedRedraw())
{
oThis.OnPaint();
oThis.DrawTask.Clear();
}
};
oThis.IsPresentationEmpty = function ()
{
return -1 === oThis.GetCurrentSlideNumber();
};
oThis.GetPosition = function ()
{
let nLeftPos = oThis.HtmlPage.m_oMainParent.AbsolutePosition.L;
let nTopPos = oThis.HtmlPage.m_oBottomPanesContainer.AbsolutePosition.T;
nTopPos += oThis.HtmlPage.m_oAnimationPaneContainer.AbsolutePosition.T;
if(oThis.PageParentControl)
{
nLeftPos += oThis.PageParentControl.AbsolutePosition.L;
nTopPos += oThis.PageParentControl.AbsolutePosition.T;
}
let _x = global_mouseEvent.X - oThis.HtmlPage.X - ((nLeftPos * g_dKoef_mm_to_pix + 0.5) >> 0);
let _y = global_mouseEvent.Y - oThis.HtmlPage.Y - ((nTopPos * g_dKoef_mm_to_pix + 0.5) >> 0);
_y += oThis.Scroll;
_x *= g_dKoef_pix_to_mm;
_y *= g_dKoef_pix_to_mm;
return { Page : oThis.GetCurrentSlideNumber(), X : _x, Y : _y, isNotes : false };
};
oThis.onMouseDown = function (e)
{
if(oThis.IsPresentationEmpty())
return;
var oControl = oThis.GetControl();
if(!oControl)
{
return;
}
AscCommon.check_MouseDownEvent(e, true);
global_mouseEvent.LockMouse();
oThis.HtmlPage.Thumbnails.SetFocusElement(FOCUS_OBJECT_MAIN);
var pos = oThis.GetPosition(e);
var _x = pos.X;
var _y = pos.Y;
var ret = oThis.GetDrawingDocument().checkMouseDown_Drawing(pos);
if (ret === true)
{
AscCommon.stopEvent(e);
return;
}
oControl.onMouseDown(global_mouseEvent, _x, _y);
//oThis.GetPresentation().AnimPane_OnMouseDown(global_mouseEvent, _x, _y);
return oControl.hit(_x, _y);
};
oThis.onMouseMove = function (e)
{
if(oThis.IsPresentationEmpty())
return;
var oControl = oThis.GetControl();
if(!oControl)
{
return;
}
if (e)
AscCommon.check_MouseMoveEvent(e);
var pos = oThis.GetPosition(e);
var _x = pos.X;
var _y = pos.Y;
if (oThis.GetDrawingDocument().InlineTextTrackEnabled)
{
if (_y < 0)
return;
}
var is_drawing = oThis.GetDrawingDocument().checkMouseMove_Drawing(pos);
if (is_drawing === true)
return;
oControl.onMouseMove(global_mouseEvent, _x, _y);
//oThis.GetPresentation().AnimPane_OnMouseMove(global_mouseEvent, _x, _y);
};
oThis.onMouseUp = function (e)
{
if(oThis.IsPresentationEmpty())
return;
var oControl = oThis.GetControl();
if(!oControl)
{
return;
}
AscCommon.check_MouseUpEvent(e);
var pos = oThis.GetPosition(e);
var _x = pos.X;
var _y = pos.Y;
if (oThis.GetDrawingDocument().InlineTextTrackEnabled)
{
if (_y < 0)
return;
}
var is_drawing = oThis.GetDrawingDocument().checkMouseUp_Drawing(pos);
if (is_drawing === true)
return;
oControl.onMouseUp(global_mouseEvent, _x, _y);
//oThis.GetPresentation().AnimPane_OnMouseUp(global_mouseEvent, _x, _y);
oThis.HtmlPage.m_bIsMouseLock = false;
};
oThis.onMouseWhell = function(e)
{
// if (false === oThis.HtmlPage.m_oApi.bInit_word_control)
// return;
// var oControl = oThis.GetControl();
// if(!oControl)
// {
// return;
// }
//
// var deltaY = GetWheelDeltaY(e);
//
// if (0 != deltaY)
// {
// var pos = oThis.GetPosition(e);
// var _x = pos.X;
// var _y = pos.Y;
// oControl.onMouseWheel(global_mouseEvent, deltaY, _x, _y);
// }
//
//
// // здесь - имитируем моус мув ---------------------------
// var _e = CreateBrowserEventObject();
//
// oThis.onMouseMove(_e, true);
// // ------------------------------------------------------
//
// AscCommon.stopEvent(e);
return false;
};
oThis.onSelectWheel = function()
{
};
oThis.CheckScroll = function()
{};
oThis.OnResize = function ()
{
var oControl = oThis.GetControl();
if(!oControl)
{
return;
}
oControl.onResize();
oThis.CheckScroll();
};
oThis.OnAnimPaneChanged = function (oRect)
{
oThis.DrawTask.Check(oRect);
};
oThis.GetWidth = function()
{
return AscCommon.AscBrowser.convertToRetinaValue(oThis.GetHtmlElement().width) / g_dKoef_mm_to_pix;
};
oThis.GetHeight = function()
{
return AscCommon.AscBrowser.convertToRetinaValue(oThis.GetHtmlElement().height) / g_dKoef_mm_to_pix;
};
}
function CAnimPaneHeaderDrawer(page, htmlElement, parentDrawer)
{
CPaneDrawerBase.call(this, page, htmlElement, parentDrawer, page.m_oAnimPaneHeaderContainer);
var oThis = this;
oThis.CreateControl = function()
{
oThis.Control = new AscCommon.CAnimPaneHeader(this);
oThis.Control.onResize();
};
oThis.UpdateButtonsState = function () {
Asc.editor.asc_canStartAnimationPreview() ?
oThis.Control.playButton.enable() : oThis.Control.playButton.disable()
Asc.editor.asc_canMoveAnimationEarlier() ?
oThis.Control.moveUpButton.enable() : oThis.Control.moveUpButton.disable()
Asc.editor.asc_canMoveAnimationLater() ?
oThis.Control.moveDownButton.enable() : oThis.Control.moveDownButton.disable()
}
oThis.UpdateState = function () {
oThis.Control.checkLayout();
oThis.UpdateButtonsState();
}
}
function CAnimPaneListDrawer(page, htmlElement, parentDrawer)
{
CPaneDrawerBase.call(this, page, htmlElement, parentDrawer, page.m_oAnimPaneListContainer);
this.SlideNum = -1;
var oThis = this;
oThis.CreateControl = function()
{
oThis.Control = new AscCommon.CSeqListContainer(this);
oThis.Control.onResize();
};
oThis.CheckSubscribeMouseWheel = function()
{
if(oThis.parentDrawer)
{
var oHtmlElem = oThis.parentDrawer.GetHtmlElement();
oHtmlElem.onmousewheel = oThis.onMouseWhell;
if (oHtmlElem.addEventListener)
{
oHtmlElem.addEventListener("DOMMouseScroll", oThis.onMouseWhell, false);
}
}
};
oThis.onMouseWhell = function(e)
{
if (false === oThis.HtmlPage.m_oApi.bInit_word_control)
return;
var _ctrl = false;
if (e.metaKey !== undefined)
_ctrl = e.ctrlKey || e.metaKey;
else
_ctrl = e.ctrlKey;
if (true === _ctrl)
{
AscCommon.stopEvent(e);
return false;
}
var deltaY = GetWheelDeltaY(e);
if (0 != deltaY)
{
if(oThis.HtmlPage.m_oScrollAnim_)
{
oThis.HtmlPage.m_oScrollAnim_.scrollBy(0, deltaY, false);
}
}
// здесь - имитируем моус мув ---------------------------
oThis.onMouseMove(CreateBrowserEventObject(), true);
// ------------------------------------------------------
AscCommon.stopEvent(e);
return false;
};
oThis.OnUpdateList = function()
{
var settings = CreateScrollSettings(oThis.Control.getHeight(), oThis.HtmlElement, 0);
oThis.ScrollMax = Math.max(0, settings.contentH - settings.screenH);
if (oThis.Scroll > oThis.ScrollMax)
oThis.Scroll = oThis.ScrollMax;
document.getElementById('panel_right_scroll_notes').style.height = settings.contentH + "px";
var nCurSlideNum = oThis.Control.getSlideNum();
var bChangedSlide = false;
if(oThis.SlideNum !== nCurSlideNum)
{
bChangedSlide = true;
oThis.SlideNum = nCurSlideNum;
}
if (oThis.HtmlPage.m_oScrollAnim_)
{
oThis.HtmlPage.m_oScrollAnim_.Repos(settings, undefined, true);
if(bChangedSlide)
{
oThis.HtmlPage.m_oScrollAnim_.scrollToY(0);
}
}
else
{
oThis.HtmlPage.m_oScrollAnim_ = new AscCommon.ScrollObject("id_anim_list_scroll", settings);
oThis.HtmlPage.m_oScrollAnim_.onLockMouse = function (evt)
{
AscCommon.check_MouseDownEvent(evt, true);
global_mouseEvent.LockMouse();
};
oThis.HtmlPage.m_oScrollAnim_.offLockMouse = function (evt)
{
AscCommon.check_MouseUpEvent(evt);
};
oThis.HtmlPage.m_oScrollAnim_.bind("scrollvertical", function (evt)
{
oThis.Scroll = (oThis.ScrollMax * evt.scrollD / Math.max(evt.maxScrollY, 1)) >> 0;
oThis.DrawTask.Check(nCurSlideNum, null);
});
}
};
oThis.CheckScroll = function()
{
oThis.OnUpdateList();
};
}
function CAnimPaneTimelineDrawer(page, htmlElement, parentDrawer)
{
CPaneDrawerBase.call(this, page, htmlElement, parentDrawer, page.m_oAnimPaneTimelineContainer);
const oThis = this;
// this.oCurSlide = editor.WordControl.m_oLogicDocument.GetCurrentSlide();
this.oCurSlide = editor.WordControl.m_oLogicDocument ? editor.WordControl.m_oLogicDocument.GetCurrentSlide() : {};
oThis.CreateControl = function()
{
oThis.Control = new AscCommon.CTimelineContainer(this);
oThis.Control.onResize();
};
oThis.UpdateState = function () {
const timing = oThis.Control.getTiming()
timing && timing.hasEffects() ?
oThis.Control.show() : oThis.Control.hide()
const actualCurrentSlide = Asc.editor.WordControl.m_oLogicDocument.GetCurrentSlide();
if (this.oCurSlide !== actualCurrentSlide) {
this.oCurSlide = actualCurrentSlide;
oThis.Control.timeline.setStartTime(0);
oThis.Control.timeline.setScrollOffset(0);
}
}
}
function CAnimationPaneDrawer(page, htmlElement)
{
CPaneDrawerBase.call(this, page, htmlElement, null, null);
this.header = new CAnimPaneHeaderDrawer(page, page.m_oAnimPaneHeader.HtmlElement, this);
this.list = new CAnimPaneListDrawer(page, page.m_oAnimPaneList.HtmlElement, this);
this.timeline = new CAnimPaneTimelineDrawer(page, page.m_oAnimPaneTimeline.HtmlElement, this);
var oThis = this;
oThis.Init = function()
{
oThis.header.Init();
oThis.list.Init();
oThis.timeline.Init();
var oHtmlElem = oThis.GetHtmlElement();
AscCommon.addMouseEvent(oHtmlElem, "down", oThis.onMouseDown);
AscCommon.addMouseEvent(oHtmlElem, "move", oThis.onMouseMove);
AscCommon.addMouseEvent(oHtmlElem, "up", oThis.onMouseUp);
Asc.editor.asc_registerCallback('asc_onFocusObject', function () {
// Here we need to check if all animEffects havent been changed
// If they were - recalculate corresponding elements
// If they were not - redraw animItems based on "selected" state of effects
return AscFormat.ExecuteNoHistory(function () {
const seqListContainer = oThis.list.Control;
if (!seqListContainer) { return; }
// Compare number of sequences (main and interactive ones)
const timing = seqListContainer.getTiming();
const newSeqList = timing ? timing.getRootSequences() : [];
const oldSeqList = seqListContainer.seqList
? seqListContainer.seqList.children.map(function (animSequence) {
return animSequence.getSeq();
})
: [];
if (oldSeqList.length !== newSeqList.length) {
recalculateSeqListContainer();
return;
}
oldSeqList.some(function (_, nSeq) {
// Compare sequences by Id
const oldSeq = oldSeqList[nSeq];
const newSeq = newSeqList[nSeq];
if (oldSeq.Id !== newSeq.Id) {
recalculateSeqListContainer();
return true;
}
// Compare number of groups in current sequence
const oldSeqGroups = seqListContainer.seqList.children[nSeq].animGroups.map(function (animGroup) {
return animGroup.effects;
});
const newSeqGroupsAsObject = AscFormat.groupBy(
newSeq.getAllEffects(),
function (effect) { return effect.getIndexInSequence(); }
);
const newSeqGroups = Object.keys(newSeqGroupsAsObject).map(function (groupIndex) {
return newSeqGroupsAsObject[groupIndex];
})
if (oldSeqGroups.length !== newSeqGroups.length) {
recalculateSeqListContainer();
return true;
}
for (let nGroup = 0; nGroup < oldSeqGroups.length; ++nGroup) {
// Compare number of effects in current group
const oldSeqGroup = oldSeqGroups[nGroup];
const newSeqGroup = newSeqGroups[nGroup];
if (oldSeqGroup.length !== newSeqGroup.length) {
recalculateSeqListContainer();
return true;
}
for (let nEffect = 0; nEffect < oldSeqGroup.length; ++nEffect) {
// Compare effects in currect group by Id
const oldEffect = oldSeqGroup[nEffect];
const newEffect = newSeqGroup[nEffect];
if (oldEffect.Id !== newEffect.Id) {
recalculateSeqListContainer();
return true;
}
}
}
seqListContainer.seqList.forEachAnimItem(function (animItem) {
animItem.onUpdate();
})
return false;
});
function recalculateSeqListContainer() {
oThis.list.Control.seqList.recalculateChildren();
oThis.list.Control.seqList.recalculateChildrenLayout();
oThis.list.Control.recalculateChildrenLayout();
oThis.list.Control.onUpdate();
oThis.list.CheckScroll();
}
}, this, []);
});
Asc.editor.asc_registerCallback('asc_onFocusObject', function () {
/*
Update effectLabel if needed
(when shape name has been changed)
*/
AscFormat.ExecuteNoHistory(function () {
if (!oThis.list.Control) return;
let changedLabelsCount = 0;
oThis.list.Control.seqList.forEachAnimItem(function (animItem) {
if (animItem.effectLabel.string !== animItem.getEffectLabelText()) {
animItem.effectLabel.string = animItem.getEffectLabelText();
changedLabelsCount++;
}
});
if (changedLabelsCount > 0) {
oThis.list.Control.recalculateChildrenLayout();
}
}, this, []);
});
};
oThis.onMouseDown = function (e)
{
oThis.HtmlPage.Thumbnails.SetFocusElement(FOCUS_OBJECT_ANIM_PANE);
// Order matters
if (oThis.header.onMouseDown(e)) { return true }
if (oThis.timeline.onMouseDown(e)) { return true }
if (oThis.list.onMouseDown(e)) { return true }
return false;
};
oThis.onMouseMove = function (e)
{
oThis.sentMouseMoveData = null; // can be overwritten in onMouseMove's below
oThis.header.onMouseMove(e);
oThis.list.onMouseMove(e);
oThis.timeline.onMouseMove(e);
if (oThis.sentMouseMoveData === null) {
const data = new AscCommon.CMouseMoveData();
Asc.editor.sync_MouseMoveStartCallback();
Asc.editor.sync_MouseMoveCallback(data);
Asc.editor.sync_MouseMoveEndCallback();
}
};
oThis.onMouseUp = function (e)
{
};
oThis.onMouseWhell = function(e)
{
return oThis.list.onMouseWhell(e);
};
oThis.onSelectWheel = function()
{
};
oThis.OnResize = function ()
{
oThis.header.OnResize();
oThis.list.OnResize();
oThis.timeline.OnResize();
};
oThis.OnPaint = function ()
{
};
oThis.CheckPaint = function ()
{
oThis.header.CheckPaint();
oThis.list.CheckPaint();
oThis.timeline.CheckPaint();
};
oThis.UpdateState = function () {
if (!oThis.header.Control) { return }
oThis.header.UpdateState();
// TODO: oThis.list.UpdateState();
oThis.timeline.UpdateState();
};
oThis.SetCursorType = function(sType, Data) {
let elem = this.HtmlElement;
// if (Asc.editor.WordControl.DemonstrationManager.Mode)
// elem = Asc.editor.WordControl.DemonstrationManager.Canvas;
if (Asc.editor.WordControl.m_oDrawingDocument.m_sLockedCursorType === '') {
elem.style.cursor = AscCommon.g_oHtmlCursor.value(sType);
} else
elem.style.cursor = AscCommon.g_oHtmlCursor.value(this.m_sLockedCursorType);
if ("undefined" === typeof (Data) || null === Data)
Data = new AscCommon.CMouseMoveData();
Asc.editor.sync_MouseMoveStartCallback();
Asc.editor.sync_MouseMoveCallback(Data);
Asc.editor.sync_MouseMoveEndCallback();
};
}
CAnimationPaneDrawer.prototype = Object.create(CPaneDrawerBase);
//--------------------------------------------------------export----------------------------------------------------
window['AscCommon'] = window['AscCommon'] || {};
window['AscCommon'].CDrawingDocument = CDrawingDocument;
window['AscCommon'].g_comment_image = new Image();
window['AscCommon'].g_comment_image;
window['AscCommon'].g_comment_image.asc_complete = false;
window['AscCommon'].g_comment_image.onload = function()
{
window['AscCommon'].g_comment_image.asc_complete = true;
};
window['AscCommon'].g_comment_image.src = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAR0AAAAlCAMAAABI6s09AAAABGdBTUEAALGPC/xhBQAAAMBQTFRF2Ypk03pP0nZJ1oNb68Ku03hL1X9U7MWy1X9V9d7T3JNv5bCW0nZJ9uXc////8dPE+vDq5rSb5a6U4aOF5K6T2Idg////1HxR6r6o03lN0nZJ6Lef+u7p8NDA0ndK////78++0nZJ8dPE////0nZJ1HtP2Ihh////03hM////////3JVy0nZJ0nZJ9+Xc0nZJ////3JVy3JVx////////AAAA3Zh38tbJ3ZZ08dXH4qaJ5a6U9N3R+/Tw////0nZJQeZHfgAAADZ0Uk5TZJaoUk+v3lzdEi9hDlIbKVN8eY54xTTnc/NKegRg9EJm8WQz7+3EFPYoSKborlkmCqeoJ00ATKvZ0wAAA3tJREFUaN7dmOdi2jAUhelukjaQkkGCGIHYbDAYNYOh93+r2mZIsq6WwVHD+RfukWx93OtjUsCxHoaE0fAB7yWvHFCcjB6JRI+jCc7kzMVfSEzD5zWj5yFdPuSXDLm9C7/nVOMyX5SvnDwRhZ4mWZz5+Dd0yJoToevTK7jNLxHzByryRYZcqemzK0fkbbWWaPVGRqxTqVH6tJ8/XbBfGPPVjVtlT/Tr9t/ToZ+l6bR2l2hxdITJQfLil6/syjqRwonwkDrrVKqePu15fy5XWfTr9s/eO+I0EvlYnRFuz7VCRHF1ZSdHavfOEIaEUHBZE/0XJbjTmuWfyf7Ze0ckqjgWeh86AVaoKPrlrVb6ztGx7h2RKLesRa8UUcUiHei0MJ2KePMVgY4+rQJj/7fzy0YZ6h2AzuacTYCOee8cRKcq0qmm78YgrZCNH/1w2zvHnSyTHOT9mjQsUjreK7vbq0d38fhVnqp3PFXvePnSMclB3q9Jw4DS+XNHFvHuq0X82d013SWqMGIrwjSia6B3dgPJrczhuWNC3Io7onQ6jfk0wrNazOJLNzp0l7iS2IWK0Duoo+gdbmUOz52j08GUTqQwwrOYhkAShjEesSKfRuVA5jRZJsTTO1fgMK8AdHA4+AvCiSsAHMU0KgfyP6JThelUITo4rIaS9yiwIp/GTXGW3NsUKEInUdGpAE+cd56s+EjS10xJRT6N8oHMQOdqzOjKFR17yadxgwcufsTnTjY80mlUFD/kcyeTOhmKXfWbW5d1KtW1nKyu5WR1D6WTRb76rd9nnUr5lnR8Szq+Czq1+/j6L0t698sXel/3tbRTJtZp8KT/5dWUz51Kmo5Xc0Gn3bxJRmaPZ8kMy02zLTrBseKcJnRabZ4Ol4VCGnp+q+2CTpD802m2x7Pc/k7ZqB8ATiqJ02CyEO/XTVa8vws6OLjtM3g4OP3bAHSKcHinCR3er6PTbwfYCZ1EvS2eBE5P69zB6R2agzZp6I7OFo8eDoNH7jTPQZs0dEgnOvRUfWQLp3kO2qShSzo4jA89nYdHcJrnoE0aOqUTHXpgBEfvNM9B1j9goQxEv1s60aHN4Oid5jnI+gcQHOp3TAeH4TGd5jm470gKB9jfNR1nOZjCA8I5NToWOcjhgeGcHB2LHGTwSOCcHh2LHNz7ZXBOkI5FDmr9J0jHIgd1/n8LiumvxDAoYwAAAABJRU5ErkJggg==";
window['AscCommon'].g_comment_image_offsets = [
[5, 0, 16, 15],
[31, 0, 16, 15],
[57, 0, 19, 18],
[86, 0, 19, 18],
[115, 0, 32, 30],
[157, 0, 32, 30],
[199, 0, 38, 36],
[247, 0, 38, 36]
];