Files
DocumentServer-v-9.2.0/sdkjs/slide/Drawing/DrawingDocument.js
T
Yajbir Singh f1b860b25c
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

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