DocumentServer/OfficeWeb/sdk/Excel/model/CellComment.js
nikolay ivanov a8be6b9e72 init repo
2014-07-05 18:22:49 +00:00

1612 lines
66 KiB
JavaScript

/*
* (c) Copyright Ascensio System SIA 2010-2014
*
* This program is a free software product. You can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License (AGPL)
* version 3 as published by the Free Software Foundation. In accordance with
* Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
* that Ascensio System SIA expressly excludes the warranty of non-infringement
* of any third-party rights.
*
* This program is distributed WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
*
* You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia,
* EU, LV-1021.
*
* The interactive user interfaces in modified source and object code versions
* of the Program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU AGPL version 3.
*
* Pursuant to Section 7(b) of the License you must retain the original Product
* logo when distributing the program. Pursuant to Section 7(e) we decline to
* grant you any rights under trademark law for use of our trademarks.
*
* All the Product's GUI elements, including illustrations and icon sets, as
* well as technical writing content are licensed under the terms of the
* Creative Commons Attribution-ShareAlike 4.0 International. See the License
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
*
*/
function asc_CCommentCoords(obj) {
var _this = this;
if (obj) {
_this.nRow = obj.nRow;
_this.nCol = obj.nCol;
_this.nLeft = obj.nLeft;
_this.nLeftOffset = obj.nLeftOffset;
_this.nTop = obj.nTop;
_this.nTopOffset = obj.nTopOffset;
_this.nRight = obj.nRight;
_this.nRightOffset = obj.nRightOffset;
_this.nBottom = obj.nBottom;
_this.nBottomOffset = obj.nBottomOffset;
_this.dLeftMM = obj.dLeftMM;
_this.dTopMM = obj.dTopMM;
_this.dLeftPX = obj.dLeftPX;
_this.dReverseLeftPX = obj.dReverseLeftPX;
_this.dTopPX = obj.dTopPX;
_this.dWidthMM = obj.dWidthMM;
_this.dHeightMM = obj.dHeightMM;
_this.dWidthPX = obj.dWidthPX;
_this.dHeightPX = obj.dHeightPX;
_this.bMoveWithCells = obj.bMoveWithCells;
_this.bSizeWithCells = obj.bSizeWithCells;
} else {
_this.nRow = null;
_this.nCol = null;
_this.nLeft = null;
_this.nLeftOffset = null;
_this.nTop = null;
_this.nTopOffset = null;
_this.nRight = null;
_this.nRightOffset = null;
_this.nBottom = null;
_this.nBottomOffset = null;
_this.dLeftMM = null;
_this.dTopMM = null;
_this.dLeftPX = null;
_this.dReverseLeftPX = null;
_this.dTopPX = null;
_this.dWidthMM = null;
_this.dHeightMM = null;
_this.dWidthPX = null;
_this.dHeightPX = null;
_this.bMoveWithCells = false;
_this.bSizeWithCells = false;
}
}
asc_CCommentCoords.prototype = {
asc_setRow: function (val) {
this.nRow = val;
},
asc_getRow: function () {
return this.nRow;
},
asc_setCol: function (val) {
this.nCol = val;
},
asc_getCol: function () {
return this.nCol;
},
asc_setLeft: function (val) {
this.nLeft = val;
},
asc_getLeft: function () {
return this.nLeft;
},
asc_setLeftOffset: function (val) {
this.nLeftOffset = val;
},
asc_getLeftOffset: function () {
return this.nLeftOffset;
},
asc_setTop: function (val) {
this.nTop = val;
},
asc_getTop: function () {
return this.nTop;
},
asc_setTopOffset: function (val) {
this.nTopOffset = val;
},
asc_getTopOffset: function () {
return this.nTopOffset;
},
asc_setRight: function (val) {
this.nRight = val;
},
asc_getRight: function () {
return this.nRight;
},
asc_setRightOffset: function (val) {
this.nRightOffset = val;
},
asc_getRightOffset: function () {
return this.nRightOffset;
},
asc_setBottom: function (val) {
this.nBottom = val;
},
asc_getBottom: function () {
return this.nBottom;
},
asc_setBottomOffset: function (val) {
this.nBottomOffset = val;
},
asc_getBottomOffset: function () {
return this.nBottomOffset;
},
asc_setLeftMM: function (val) {
this.dLeftMM = val;
},
asc_getLeftMM: function () {
return this.dLeftMM;
},
asc_setLeftPX: function (val) {
this.dLeftPX = val;
},
asc_getLeftPX: function () {
return this.dLeftPX;
},
asc_setReverseLeftPX: function (val) {
this.dReverseLeftPX = val;
},
asc_getReverseLeftPX: function () {
return this.dReverseLeftPX;
},
asc_setTopMM: function (val) {
this.dTopMM = val;
},
asc_getTopMM: function () {
return this.dTopMM;
},
asc_setTopPX: function (val) {
this.dTopPX = val;
},
asc_getTopPX: function () {
return this.dTopPX;
},
asc_setWidthMM: function (val) {
this.dWidthMM = val;
},
asc_getWidthMM: function () {
return this.dWidthMM;
},
asc_setHeightMM: function (val) {
this.dHeightMM = val;
},
asc_getHeightMM: function () {
return this.dHeightMM;
},
asc_setWidthPX: function (val) {
this.dWidthPX = val;
},
asc_getWidthPX: function () {
return this.dWidthPX;
},
asc_setHeightPX: function (val) {
this.dHeightPX = val;
},
asc_getHeightPX: function () {
return this.dHeightPX;
},
asc_setMoveWithCells: function (val) {
this.bMoveWithCells = val;
},
asc_getMoveWithCells: function () {
return this.bMoveWithCells;
},
asc_setSizeWithCells: function (val) {
this.bSizeWithCells = val;
},
asc_getSizeWithCells: function () {
return this.bSizeWithCells;
}
};
window["Asc"]["asc_CCommentCoords"] = window["Asc"].asc_CCommentCoords = asc_CCommentCoords;
prot = asc_CCommentCoords.prototype;
prot["asc_setRow"] = prot.asc_setRow;
prot["asc_getRow"] = prot.asc_getRow;
prot["asc_setCol"] = prot.asc_setCol;
prot["asc_setCol"] = prot.asc_setCol;
prot["asc_setLeft"] = prot.asc_setLeft;
prot["asc_getLeft"] = prot.asc_getLeft;
prot["asc_setLeftOffset"] = prot.asc_setLeftOffset;
prot["asc_getLeftOffset"] = prot.asc_getLeftOffset;
prot["asc_setTop"] = prot.asc_setTop;
prot["asc_getTop"] = prot.asc_getTop;
prot["asc_setTopOffset"] = prot.asc_setTopOffset;
prot["asc_getTopOffset"] = prot.asc_getTopOffset;
prot["asc_setRight"] = prot.asc_setRight;
prot["asc_getRight"] = prot.asc_getRight;
prot["asc_setRightOffset"] = prot.asc_setRightOffset;
prot["asc_getRightOffset"] = prot.asc_getRightOffset;
prot["asc_setBottom"] = prot.asc_setBottom;
prot["asc_getBottom"] = prot.asc_getBottom;
prot["asc_setBottomOffset"] = prot.asc_setBottomOffset;
prot["asc_getBottomOffset"] = prot.asc_getBottomOffset;
prot["asc_setLeftMM"] = prot.asc_setLeftMM;
prot["asc_getLeftMM"] = prot.asc_getLeftMM;
prot["asc_setLeftPX"] = prot.asc_setLeftPX;
prot["asc_getLeftPX"] = prot.asc_getLeftPX;
prot["asc_setTopMM"] = prot.asc_setTopMM;
prot["asc_getTopMM"] = prot.asc_getTopMM;
prot["asc_setTopPX"] = prot.asc_setTopPX;
prot["asc_getTopPX"] = prot.asc_getTopPX;
prot["asc_setWidthMM"] = prot.asc_setWidthMM;
prot["asc_getWidthMM"] = prot.asc_getWidthMM;
prot["asc_setHeightMM"] = prot.asc_setHeightMM;
prot["asc_getHeightMM"] = prot.asc_getHeightMM;
prot["asc_setWidthPX"] = prot.asc_setWidthPX;
prot["asc_getWidthPX"] = prot.asc_getWidthPX;
prot["asc_setHeightPX"] = prot.asc_setHeightPX;
prot["asc_getHeightPX"] = prot.asc_getHeightPX;
prot["asc_setMoveWithCells"] = prot.asc_setMoveWithCells;
prot["asc_getMoveWithCells"] = prot.asc_getMoveWithCells;
prot["asc_setSizeWithCells"] = prot.asc_setSizeWithCells;
prot["asc_getSizeWithCells"] = prot.asc_getSizeWithCells;
function asc_CCommentData(obj) {
var _this = this;
_this.Properties = {
wsId: 0,
nCol: 1,
nRow: 2,
nId: 3,
nLevel: 5,
sText: 6,
sQuoteText: 7,
sTime: 8,
sUserId: 9,
sUserName: 10,
bDocument: 11,
bSolved: 12,
aReplies: 13,
bHidden: 14
};
if (obj) {
_this.bHidden = obj.bHidden;
_this.wsId = obj.wsId;
_this.nCol = obj.nCol;
_this.nRow = obj.nRow;
_this.nId = obj.nId;
_this.oParent = obj.oParent;
_this.nLevel = (_this.oParent == null) ? 0 : _this.oParent.asc_getLevel() + 1;
_this.sText = obj.sText;
_this.sQuoteText = obj.sQuoteText;
_this.sTime = obj.sTime;
_this.sUserId = obj.sUserId;
_this.sUserName = obj.sUserName;
_this.bDocument = obj.bDocument;
_this.bSolved = obj.bSolved;
_this.aReplies = [];
for (var i = 0; i < obj.aReplies.length; i++) {
var item = new asc_CCommentData(obj.aReplies[i]);
_this.aReplies.push(item);
}
} else {
_this.bHidden = false;
_this.wsId = null;
_this.nCol = 0;
_this.nRow = 0;
_this.nId = null;
_this.oParent = null;
_this.nLevel = 0;
_this.sText = "";
_this.sQuoteText = "";
_this.sTime = "";
_this.sUserId = "";
_this.sUserName = "";
_this.bDocument = true;
_this.bSolved = false;
_this.aReplies = [];
}
_this.setId = function () {
if (_this.bDocument) {
_this.nId = "doc_" + guid();
} else {
_this.nId = "sheet" + _this.wsId + "_" + guid();
}
};
function guid() {
function S4() {
return (((1 + Math.random()) * 65536) | 0).toString(16).substring(1);
}
return (S4() + S4() + "-" + S4() + "-" + S4() + "-" + S4() + "-" + S4() + S4() + S4());
}
}
asc_CCommentData.prototype = {
asc_putQuoteText: function (val) {
this.sQuoteText = val;
},
asc_getQuoteText: function () {
return this.sQuoteText;
},
asc_putRow: function (val) {
this.nRow = val;
},
asc_getRow: function () {
return this.nRow;
},
asc_putCol: function (val) {
this.nCol = val;
},
asc_getCol: function () {
return this.nCol;
},
asc_putId: function (val) {
this.nId = val;
},
asc_getId: function () {
return this.nId;
},
asc_putLevel: function (val) {
this.nLevel = val;
},
asc_getLevel: function () {
return this.nLevel;
},
asc_putParent: function (obj) {
this.oParent = obj;
},
asc_getParent: function () {
return this.oParent;
},
asc_putText: function (val) {
this.sText = val;
},
asc_getText: function () {
return this.sText;
},
asc_putTime: function (val) {
this.sTime = val;
},
asc_getTime: function () {
return this.sTime;
},
asc_putUserId: function (val) {
this.sUserId = val;
},
asc_getUserId: function () {
return this.sUserId;
},
asc_putUserName: function (val) {
this.sUserName = val;
},
asc_getUserName: function () {
return this.sUserName;
},
asc_putDocumentFlag: function (val) {
this.bDocument = val;
},
asc_getDocumentFlag: function () {
return this.bDocument;
},
asc_putHiddenFlag: function (val) {
this.bHidden = val;
},
asc_getHiddenFlag: function () {
return this.bHidden;
},
asc_putSolved: function (val) {
this.bSolved = val;
},
asc_getSolved: function () {
return this.bSolved;
},
asc_getRepliesCount: function () {
return this.aReplies.length;
},
asc_getReply: function (index) {
return this.aReplies[index];
},
asc_addReply: function (oReply) {
oReply.asc_putParent(this);
oReply.asc_putDocumentFlag(this.asc_getDocumentFlag());
oReply.asc_putLevel((oReply.oParent == null) ? 0 : oReply.oParent.asc_getLevel() + 1);
oReply.wsId = (oReply.oParent == null) ? -1 : oReply.oParent.wsId;
oReply.setId();
oReply.asc_putCol(this.nCol);
oReply.asc_putRow(this.nRow);
this.aReplies.push(oReply);
return oReply;
},
getType: function () {
return UndoRedoDataTypes.CommentData;
},
getProperties: function () {
return this.Properties;
},
getProperty: function (nType) {
switch (nType) {
case this.Properties.wsId:
return this.wsId;
break;
case this.Properties.nCol:
return this.nCol;
break;
case this.Properties.nRow:
return this.nRow;
break;
case this.Properties.nId:
return this.nId;
break;
case this.Properties.nLevel:
return this.nLevel;
break;
case this.Properties.sText:
return this.sText;
break;
case this.Properties.sQuoteText:
return this.sQuoteText;
break;
case this.Properties.sTime:
return this.sTime;
break;
case this.Properties.sUserId:
return this.sUserId;
break;
case this.Properties.sUserName:
return this.sUserName;
break;
case this.Properties.bDocument:
return this.bDocument;
break;
case this.Properties.bSolved:
return this.bSolved;
break;
case this.Properties.aReplies:
return this.aReplies;
break;
case this.Properties.bHidden:
return this.bHidden;
break;
}
},
setProperty: function (nType, value) {
switch (nType) {
case this.Properties.wsId:
this.wsId = value;
break;
case this.Properties.nCol:
this.nCol = value;
break;
case this.Properties.nRow:
this.nRow = value;
break;
case this.Properties.nId:
this.nId = value;
break;
case this.Properties.nLevel:
this.nLevel = value;
break;
case this.Properties.sText:
this.sText = value;
break;
case this.Properties.sQuoteText:
this.sQuoteText = value;
break;
case this.Properties.sTime:
this.sTime = value;
break;
case this.Properties.sUserId:
this.sUserId = value;
break;
case this.Properties.sUserName:
this.sUserName = value;
break;
case this.Properties.bDocument:
this.bDocument = value;
break;
case this.Properties.bSolved:
this.bSolved = value;
break;
case this.Properties.aReplies:
this.aReplies = value;
break;
case this.Properties.bHidden:
this.bHidden = value;
break;
}
},
applyCollaborative: function (nSheetId, collaborativeEditing) {
if (!this.bDocument) {
this.nCol = collaborativeEditing.getLockMeColumn2(nSheetId, this.nCol);
this.nRow = collaborativeEditing.getLockMeRow2(nSheetId, this.nRow);
}
}
};
window["Asc"]["asc_CCommentData"] = window["Asc"].asc_CCommentData = asc_CCommentData;
prot = asc_CCommentData.prototype;
prot["asc_putRow"] = prot.asc_putRow;
prot["asc_getRow"] = prot.asc_getRow;
prot["asc_putCol"] = prot.asc_putCol;
prot["asc_getCol"] = prot.asc_getCol;
prot["asc_putId"] = prot.asc_putId;
prot["asc_getId"] = prot.asc_getId;
prot["asc_putLevel"] = prot.asc_putLevel;
prot["asc_getLevel"] = prot.asc_getLevel;
prot["asc_putParent"] = prot.asc_putParent;
prot["asc_getParent"] = prot.asc_getParent;
prot["asc_putText"] = prot.asc_putText;
prot["asc_getText"] = prot.asc_getText;
prot["asc_putQuoteText"] = prot.asc_putQuoteText;
prot["asc_getQuoteText"] = prot.asc_getQuoteText;
prot["asc_putTime"] = prot.asc_putTime;
prot["asc_getTime"] = prot.asc_getTime;
prot["asc_putUserId"] = prot.asc_putUserId;
prot["asc_getUserId"] = prot.asc_getUserId;
prot["asc_putUserName"] = prot.asc_putUserName;
prot["asc_getUserName"] = prot.asc_getUserName;
prot["asc_putDocumentFlag"] = prot.asc_putDocumentFlag;
prot["asc_getDocumentFlag"] = prot.asc_getDocumentFlag;
prot["asc_putHiddenFlag"] = prot.asc_putHiddenFlag;
prot["asc_getHiddenFlag"] = prot.asc_getHiddenFlag;
prot["asc_putSolved"] = prot.asc_putSolved;
prot["asc_getSolved"] = prot.asc_getSolved;
prot["asc_getRepliesCount"] = prot.asc_getRepliesCount;
prot["asc_getReply"] = prot.asc_getReply;
prot["asc_addReply"] = prot.asc_addReply;
function CompositeCommentData() {
var _this = this;
_this.commentBefore = null;
_this.commentAfter = null;
_this.Properties = {
commentBefore: 0,
commentAfter: 1
};
}
CompositeCommentData.prototype = {
getType: function () {
return UndoRedoDataTypes.CompositeCommentData;
},
getProperties: function () {
return this.Properties;
},
getProperty: function (nType) {
switch (nType) {
case this.Properties.commentBefore:
return this.commentBefore;
break;
case this.Properties.commentAfter:
return this.commentAfter;
break;
}
},
setProperty: function (nType, value) {
switch (nType) {
case this.Properties.commentBefore:
this.commentBefore = value;
break;
case this.Properties.commentAfter:
this.commentAfter = value;
break;
}
}
};
function asc_CCellCommentator(currentSheet) {
var _this = this;
var asc = window["Asc"];
var asc_Range = asc.Range;
var asc_CCollaborativeRange = asc.asc_CCollaborativeRange;
var isViewerMode = function () {
return _this.worksheet._trigger("getViewerMode");
};
_this.worksheet = currentSheet;
_this.overlayCtx = currentSheet.overlayCtx;
_this.drawingCtx = currentSheet.drawingCtx;
_this.bShow = true;
_this.commentIconColor = "#FF9000";
_this.commentBorderColor = "#C7C7C7";
_this.commentTextColor = "#000000";
_this.commentFillColor = "#FFFF00";
_this.commentBorderWidth = 1;
_this.commentPadding = 4;
_this.minAreaWidth = 160;
_this.minAreaHeight = 80;
_this.aComments = [];
_this.aCommentCoords = [];
_this.lastSelectedId = null;
_this.bSaveHistory = true;
_this.isLockedComment = function (oComment, lockByDefault, callbackFunc) {
var _this = this;
var lockInfo;
var model = _this.worksheet.model;
var sheetId = model.getId();
var objectGuid = oComment.asc_getId();
if (objectGuid) {
if (false === _this.worksheet.collaborativeEditing.isCoAuthoringExcellEnable()) {
if ($.isFunction(callbackFunc)) {
callbackFunc(true);
}
return;
}
if (lockByDefault) {
_this.worksheet.collaborativeEditing.onStartCheckLock();
}
if (!oComment.asc_getDocumentFlag()) {
var c = oComment.asc_getCol();
var r = oComment.asc_getRow();
var c1, r1, c2, r2;
var mergedRange = model.getMergedByCell(r, c);
if (mergedRange) {
c1 = mergedRange.c1;
r1 = mergedRange.r1;
c2 = mergedRange.c2;
r2 = mergedRange.r2;
} else {
c1 = c2 = c;
r1 = r2 = r;
}
lockInfo = _this.worksheet.collaborativeEditing.getLockInfo(c_oAscLockTypeElem.Range, null, sheetId, new asc_CCollaborativeRange(c1, r1, c2, r2));
} else {
lockInfo = _this.worksheet.collaborativeEditing.getLockInfo(c_oAscLockTypeElem.Object, null, sheetId, objectGuid);
}
if (false === _this.worksheet.collaborativeEditing.getCollaborativeEditing()) {
if ($.isFunction(callbackFunc)) {
callbackFunc(true);
}
callbackFunc = undefined;
}
if (false !== _this.worksheet.collaborativeEditing.getLockIntersection(lockInfo, c_oAscLockTypes.kLockTypeMine, false)) {
if ($.isFunction(callbackFunc)) {
callbackFunc(true);
}
return;
} else {
if (false !== _this.worksheet.collaborativeEditing.getLockIntersection(lockInfo, c_oAscLockTypes.kLockTypeOther, false)) {
if ($.isFunction(callbackFunc)) {
callbackFunc(false);
}
return;
}
}
if (lockByDefault) {
_this.worksheet.collaborativeEditing.addCheckLock(lockInfo);
_this.worksheet.collaborativeEditing.onEndCheckLock(callbackFunc);
} else {
if ($.isFunction(callbackFunc)) {
callbackFunc(true);
}
}
}
};
_this.callLockComments = function (range) {
if (range) {
for (var i = 0; i < _this.aComments.length; i++) {
var comment = _this.aComments[i];
if ((comment.nCol >= range.c1) && (comment.nCol <= range.c2) && (comment.nRow >= range.r1) && (comment.nRow <= range.r2)) {
_this.worksheet.model.workbook.handlers.trigger("asc_onLockComment", comment.asc_getId(), comment.asc_getUserId());
}
}
}
};
_this.unlockComments = function () {
for (var i = 0; i < _this.aComments.length; i++) {
_this.worksheet.model.workbook.handlers.trigger("asc_onUnLockComment", _this.aComments[i].asc_getId());
}
};
_this.tryUnlockComment = function (id) {
for (var i = 0; i < _this.aComments.length; i++) {
if (_this.aComments[i].asc_getId() == id) {
_this.worksheet.model.workbook.handlers.trigger("asc_onUnLockComment", id);
break;
}
}
};
_this.moveRangeComments = function (rangeFrom, rangeTo) {
if (rangeFrom && rangeTo) {
var colOffset = rangeTo.c1 - rangeFrom.c1;
var rowOffset = rangeTo.r1 - rangeFrom.r1;
_this.worksheet.model.workbook.handlers.trigger("asc_onHideComment");
for (var i = 0; i < _this.aComments.length; i++) {
var comment = _this.aComments[i];
if ((comment.nCol >= rangeFrom.c1) && (comment.nCol <= rangeFrom.c2) && (comment.nRow >= rangeFrom.r1) && (comment.nRow <= rangeFrom.r2)) {
var commentBefore = new asc_CCommentData(comment);
comment.nCol += colOffset;
comment.nRow += rowOffset;
var cellAddress = new CellAddress(comment.nRow, comment.nCol, 0);
comment.sQuoteText = cellAddress.getID() + " : " + _this.worksheet.model.getCell(cellAddress).getValueWithFormat();
_this.worksheet.model.workbook.handlers.trigger("asc_onChangeCommentData", comment.asc_getId(), comment);
var commentAfter = new asc_CCommentData(comment);
var compositeComment = new CompositeCommentData();
compositeComment.commentBefore = commentBefore;
compositeComment.commentAfter = commentAfter;
History.Create_NewPoint();
History.Add(g_oUndoRedoComment, historyitem_Comment_Change, _this.worksheet.model.getId(), null, compositeComment);
}
}
}
};
_this.deleteCommentsRange = function (range) {
if (range) {
var aCommentId = [];
for (var i = 0; i < _this.aComments.length; ++i) {
var comment = _this.aComments[i];
if ((comment.nCol >= range.c1) && (comment.nCol <= range.c2) && (comment.nRow >= range.r1) && (comment.nRow <= range.r2)) {
aCommentId.push(comment.asc_getId());
}
}
History.StartTransaction();
for (var i = 0; i < aCommentId.length; i++) {
_this.asc_removeComment(aCommentId[i]);
}
History.EndTransaction();
}
};
_this.addCommentSerialize = function (oComment) {
var _this = this;
if (oComment) {
if (!oComment.bDocument && (oComment.nCol != null) && (oComment.nRow != null)) {
var cellAddress = new CellAddress(oComment.nRow, oComment.nCol, 0);
oComment.sQuoteText = cellAddress.getID() + " : " + _this.worksheet.model.getCell(cellAddress).getValueWithFormat();
}
_this.aComments.push(oComment);
}
};
_this.getCommentsXY = function (x, y) {
var _this = this;
var findCol = _this.worksheet._findColUnderCursor(_this.pxToPt(x), true);
var findRow = _this.worksheet._findRowUnderCursor(_this.pxToPt(y), true);
return (findCol && findRow) ? _this.asc_getComments(findCol.col, findRow.row) : [];
};
_this.drawCommentCells = function () {
if (isViewerMode()) {
return;
}
if (!_this.bShow) {
return;
}
var fvr = _this.worksheet.getFirstVisibleRow();
var fvc = _this.worksheet.getFirstVisibleCol();
var lvr = _this.worksheet.getLastVisibleRow();
var lvc = _this.worksheet.getLastVisibleCol();
var drawCells = [];
function getCellId(col, row) {
return (col + "_" + row);
}
for (var i = 0; i < _this.aComments.length; i++) {
var commentCell = _this.aComments[i];
var mergedRange = _this.worksheet.model.getMergedByCell(commentCell.nRow, commentCell.nCol);
var drawCol = mergedRange ? mergedRange.c2 : commentCell.nCol;
var drawRow = mergedRange ? mergedRange.r1 : commentCell.nRow;
if (commentCell.asc_getDocumentFlag() || commentCell.asc_getHiddenFlag() || commentCell.asc_getSolved() || (drawCol < fvc) || (drawRow < fvr) || (drawCol > lvc) || (drawRow > lvr)) {
continue;
}
var cellId = getCellId(commentCell.nCol, commentCell.nRow);
if (drawCells[cellId]) {
continue;
}
var metrics = _this.getCellMetrics(drawCol, drawRow);
if (!metrics.result || (metrics.width <= 0) || (metrics.height <= 0)) {
continue;
}
this.drawingCtx.beginPath();
this.drawingCtx.setFillStyle(this.commentIconColor);
this.drawingCtx.moveTo(this.pxToPt(metrics.left + metrics.width - 7), this.pxToPt(metrics.top));
this.drawingCtx.lineTo(this.pxToPt(metrics.left + metrics.width - 1), this.pxToPt(metrics.top));
this.drawingCtx.lineTo(this.pxToPt(metrics.left + metrics.width - 1), this.pxToPt(metrics.top + 6));
this.drawingCtx.closePath();
this.drawingCtx.fill();
drawCells[cellId] = cellId;
}
};
_this.getTextMetrics = function (text, units) {
var _this = this;
var metrics = {
width: 0,
height: 0
};
if (text && text.length && ((typeof(text) == "string") || (typeof(text) == "number"))) {
var textOptions = _this.overlayCtx.measureText(text, units);
metrics.width = textOptions.width;
metrics.height = textOptions.lineHeight;
}
return metrics;
};
_this.getCellMetrics = function (col, row) {
var metrics = {
top: 0,
left: 0,
width: 0,
height: 0,
result: false
};
var fvr = _this.worksheet.getFirstVisibleRow();
var fvc = _this.worksheet.getFirstVisibleCol();
var mergedRange = _this.worksheet.model.getMergedByCell(row, col);
if (mergedRange && (fvc < mergedRange.c2) && (fvr < mergedRange.r2)) {
var startCol = (mergedRange.c1 > fvc) ? mergedRange.c1 : fvc;
var startRow = (mergedRange.r1 > fvr) ? mergedRange.r1 : fvr;
metrics.top = _this.worksheet.getCellTop(startRow, 0) - _this.worksheet.getCellTop(fvr, 0) + _this.worksheet.getCellTop(0, 0);
metrics.left = _this.worksheet.getCellLeft(startCol, 0) - _this.worksheet.getCellLeft(fvc, 0) + _this.worksheet.getCellLeft(0, 0);
for (var i = startCol; i <= mergedRange.c2; i++) {
metrics.width += _this.worksheet.getColumnWidth(i, 0);
}
for (var i = startRow; i <= mergedRange.r2; i++) {
metrics.height += _this.worksheet.getRowHeight(i, 0);
}
metrics.result = true;
} else {
if ((fvr <= row) && (fvc <= col)) {
metrics.top = _this.worksheet.getCellTop(row, 0) - _this.worksheet.getCellTop(fvr, 0) + _this.worksheet.getCellTop(0, 0);
metrics.left = _this.worksheet.getCellLeft(col, 0) - _this.worksheet.getCellLeft(fvc, 0) + _this.worksheet.getCellLeft(0, 0);
metrics.width = _this.worksheet.getColumnWidth(col, 0);
metrics.height = _this.worksheet.getRowHeight(row, 0);
metrics.result = true;
}
}
return metrics;
};
_this.updateCommentPosition = function () {
var _this = this;
if (_this.lastSelectedId) {
var comment = _this.asc_findComment(_this.lastSelectedId);
if (comment) {
var commentList = _this.asc_getComments(comment.asc_getCol(), comment.asc_getRow());
if (commentList.length) {
_this.drawCommentCells();
var coords = _this.getCommentsCoords(commentList);
var indexes = [];
for (var i = 0; i < commentList.length; i++) {
indexes.push(commentList[i].asc_getId());
}
var metrics = _this.getCellMetrics(comment.asc_getCol(), comment.asc_getRow());
_this.worksheet.model.workbook.handlers.trigger("asc_onUpdateCommentPosition", indexes, (metrics.result ? coords.asc_getLeftPX() : -1), (metrics.result ? coords.asc_getTopPX() : -1), (metrics.result ? coords.asc_getReverseLeftPX() : -1));
}
}
}
};
_this.updateCommentsDependencies = function (bInsert, operType, updateRange) {
var bChange = true;
var UpdatePair = function (comment, bChange) {
this.comment = comment;
this.bChange = bChange;
};
var aChangedComments = [];
function updateCommentsList(aComments) {
if (aComments.length) {
_this.bSaveHistory = false;
for (var i = 0; i < aComments.length; i++) {
if (aComments[i].bChange) {
_this.asc_changeComment(aComments[i].comment.asc_getId(), aComments[i].comment, true);
} else {
_this.asc_removeComment(aComments[i].comment.asc_getId());
}
}
_this.bSaveHistory = true;
_this.drawCommentCells();
}
}
if (bInsert) {
switch (operType) {
case c_oAscInsertOptions.InsertCellsAndShiftDown:
for (var i = 0; i < _this.aComments.length; i++) {
var comment = new asc_CCommentData(_this.aComments[i]);
if ((comment.nRow >= updateRange.r1) && (comment.nCol >= updateRange.c1) && (comment.nCol <= updateRange.c2)) {
comment.nRow += updateRange.r2 - updateRange.r1 + 1;
aChangedComments.push(new UpdatePair(comment, true));
}
}
updateCommentsList(aChangedComments);
break;
case c_oAscInsertOptions.InsertCellsAndShiftRight:
for (var i = 0; i < _this.aComments.length; i++) {
var comment = new asc_CCommentData(_this.aComments[i]);
if ((comment.nCol >= updateRange.c1) && (comment.nRow >= updateRange.r1) && (comment.nRow <= updateRange.r2)) {
comment.nCol += updateRange.c2 - updateRange.c1 + 1;
aChangedComments.push(new UpdatePair(comment, true));
}
}
updateCommentsList(aChangedComments);
break;
case c_oAscInsertOptions.InsertColumns:
for (var i = 0; i < _this.aComments.length; i++) {
var comment = new asc_CCommentData(_this.aComments[i]);
if (comment.nCol >= updateRange.c1) {
comment.nCol += updateRange.c2 - updateRange.c1 + 1;
aChangedComments.push(new UpdatePair(comment, true));
}
}
updateCommentsList(aChangedComments);
break;
case c_oAscInsertOptions.InsertRows:
for (var i = 0; i < _this.aComments.length; i++) {
var comment = new asc_CCommentData(_this.aComments[i]);
if (comment.nRow >= updateRange.r1) {
comment.nRow += updateRange.r2 - updateRange.r1 + 1;
aChangedComments.push(new UpdatePair(comment, true));
}
}
updateCommentsList(aChangedComments);
break;
}
} else {
switch (operType) {
case "deleteAllComments":
for (var i = 0; i < _this.aComments.length; i++) {
var comment = new asc_CCommentData(_this.aComments[i]);
if ((updateRange.c1 <= comment.nCol) && (updateRange.c2 >= comment.nCol) && (comment.nRow >= updateRange.r1) && (comment.nRow <= updateRange.r2)) {
aChangedComments.push(new UpdatePair(comment, false));
}
}
updateCommentsList(aChangedComments);
break;
case c_oAscDeleteOptions.DeleteCellsAndShiftTop:
for (var i = 0; i < _this.aComments.length; i++) {
var comment = new asc_CCommentData(_this.aComments[i]);
if ((comment.nRow > updateRange.r1) && (comment.nCol >= updateRange.c1) && (comment.nCol <= updateRange.c2)) {
comment.nRow -= updateRange.r2 - updateRange.r1 + 1;
aChangedComments.push(new UpdatePair(comment, true));
} else {
if ((updateRange.c1 <= comment.nCol) && (updateRange.c2 >= comment.nCol) && (comment.nRow >= updateRange.r1) && (comment.nRow <= updateRange.r2)) {
aChangedComments.push(new UpdatePair(comment, false));
}
}
}
updateCommentsList(aChangedComments);
break;
case c_oAscDeleteOptions.DeleteCellsAndShiftLeft:
for (var i = 0; i < _this.aComments.length; i++) {
var comment = new asc_CCommentData(_this.aComments[i]);
if ((comment.nCol > updateRange.c2) && (comment.nRow >= updateRange.r1) && (comment.nRow <= updateRange.r2)) {
comment.nCol -= updateRange.c2 - updateRange.c1 + 1;
aChangedComments.push(new UpdatePair(comment, true));
} else {
if ((updateRange.c1 <= comment.nCol) && (updateRange.c2 >= comment.nCol) && (comment.nRow >= updateRange.r1) && (comment.nRow <= updateRange.r2)) {
aChangedComments.push(new UpdatePair(comment, false));
}
}
}
updateCommentsList(aChangedComments);
break;
case c_oAscDeleteOptions.DeleteColumns:
for (var i = 0; i < _this.aComments.length; i++) {
var comment = new asc_CCommentData(_this.aComments[i]);
if (comment.nCol > updateRange.c2) {
comment.nCol -= updateRange.c2 - updateRange.c1 + 1;
aChangedComments.push(new UpdatePair(comment, true));
} else {
if ((updateRange.c1 <= comment.nCol) && (updateRange.c2 >= comment.nCol)) {
aChangedComments.push(new UpdatePair(comment, false));
}
}
}
updateCommentsList(aChangedComments);
break;
case c_oAscDeleteOptions.DeleteRows:
for (var i = 0; i < _this.aComments.length; i++) {
var comment = new asc_CCommentData(_this.aComments[i]);
if (comment.nRow > updateRange.r2) {
comment.nRow -= updateRange.r2 - updateRange.r1 + 1;
aChangedComments.push(new UpdatePair(comment, true));
} else {
if ((updateRange.r1 <= comment.nRow) && (updateRange.r2 >= comment.nRow)) {
aChangedComments.push(new UpdatePair(comment, false));
}
}
}
updateCommentsList(aChangedComments);
break;
}
}
};
_this.showHideComments = function (bHide, bColumn, start, stop) {
var aChangedComments = [];
function updateCommentsList(aComments) {
if (aComments.length) {
History.StartTransaction();
for (var i = 0; i < aComments.length; i++) {
_this.asc_changeComment(aComments[i].asc_getId(), aComments[i]);
}
History.EndTransaction();
_this.drawCommentCells();
}
}
for (var i = 0; i < _this.aComments.length; i++) {
var comment = new asc_CCommentData(_this.aComments[i]);
if (bColumn) {
if ((comment.nCol >= start) && (comment.nCol <= stop)) {
comment.asc_putHiddenFlag(bHide);
aChangedComments.push(comment);
}
} else {
if ((comment.nRow >= start) && (comment.nRow <= stop)) {
comment.asc_putHiddenFlag(bHide);
aChangedComments.push(comment);
}
}
}
updateCommentsList(aChangedComments);
};
_this.sortComments = function (activeRange, changes) {
if (changes && activeRange) {
function updateCommentsList(aComments) {
if (aComments.length) {
History.StartTransaction();
for (var i = 0; i < aComments.length; i++) {
_this.asc_changeComment(aComments[i].asc_getId(), aComments[i], true);
}
History.EndTransaction();
_this.drawCommentCells();
}
}
var aChangedComments = [];
for (var i = 0; i < changes.places.length; i++) {
var list = _this.asc_getComments(activeRange.c1, changes.places[i].from);
for (var j = 0; j < list.length; j++) {
var comment = new asc_CCommentData(list[j]);
comment.nRow = changes.places[i].to;
aChangedComments.push(comment);
}
}
updateCommentsList(aChangedComments);
}
};
_this.resetLastSelectedId = function () {
_this.cleanLastSelection();
_this.lastSelectedId = null;
};
_this.cleanLastSelection = function () {
if (_this.lastSelectedId) {
var lastComment = _this.asc_findComment(_this.lastSelectedId);
if (lastComment) {
var lastMetrics = _this.getCellMetrics(lastComment.nCol, lastComment.nRow);
if (lastMetrics.result) {
var extraOffset = 1;
_this.overlayCtx.clearRect(_this.pxToPt(lastMetrics.left), _this.pxToPt(lastMetrics.top), _this.pxToPt(lastMetrics.width - extraOffset), _this.pxToPt(lastMetrics.height - extraOffset));
}
}
}
};
_this.calcCommentsCoords = function (bSave) {
_this.aCommentCoords = [];
for (var i = 0; i < _this.aComments.length; i++) {
var commentCell = _this.aComments[i];
if (!_this.commentCoordsExist(commentCell.asc_getCol(), commentCell.asc_getRow())) {
var commentList = _this.asc_getComments(commentCell.asc_getCol(), commentCell.asc_getRow());
if (bSave && (commentCell.asc_getCol() == 0) && (commentCell.asc_getRow() == 0)) {
var documentComments = _this.asc_getDocumentComments();
for (var j = 0; j < documentComments.length; j++) {
commentList.push(documentComments[j]);
}
}
if (commentList.length) {
_this.aCommentCoords.push(_this.getCommentsCoords(commentList));
}
}
}
};
_this.getCommentsCoords = function (comments) {
var _this = this;
var coords = new asc_CCommentCoords();
function calcCommentArea(comment, coords) {
var originalFont = _this.overlayCtx.getFont();
var outputFont = originalFont.clone();
outputFont.Bold = true;
outputFont.FontSize = 9;
_this.overlayCtx.setFont(outputFont);
var txtMetrics = _this.getTextMetrics(comment.sUserName, 1);
coords.dHeightPX += _this.ptToPx(txtMetrics.height);
var userWidth = _this.ptToPx(txtMetrics.width);
if (coords.dWidthPX < userWidth) {
coords.dWidthPX = userWidth;
}
txtMetrics = _this.getTextMetrics(comment.sTime, 1);
coords.dHeightPX += _this.ptToPx(txtMetrics.height);
var timeWidth = _this.ptToPx(txtMetrics.width);
if (coords.dWidthPX < timeWidth) {
coords.dWidthPX = timeWidth;
}
outputFont.Bold = false;
outputFont.FontSize = 9;
_this.overlayCtx.setFont(outputFont);
var commentSpl = comment.sText.split("\n");
for (var i = 0; i < commentSpl.length; i++) {
txtMetrics = _this.getTextMetrics(commentSpl[i], 1);
coords.dHeightPX += _this.ptToPx(txtMetrics.height);
var lineWidth = _this.ptToPx(txtMetrics.width);
if (coords.dWidthPX < lineWidth) {
coords.dWidthPX = lineWidth;
}
}
for (var i = 0; i < comment.aReplies.length; i++) {
calcCommentArea(comment.aReplies[i], coords);
}
if (coords.dWidthPX < _this.minAreaWidth) {
coords.dWidthPX = _this.minAreaWidth;
}
if (coords.dHeightPX < _this.minAreaHeight) {
coords.dHeightPX = _this.minAreaHeight;
}
coords.dWidthMM = _this.pxToMm(coords.dWidthPX);
coords.dHeightMM = _this.pxToMm(coords.dHeightPX);
var headerRowOffPx = _this.worksheet.getCellTop(0, 0);
var headerColOffPx = _this.worksheet.getCellLeft(0, 0);
coords.nCol = comment.nCol;
coords.nRow = comment.nRow;
var mergedRange = _this.worksheet.model.getMergedByCell(comment.nRow, comment.nCol);
coords.nLeft = (mergedRange ? mergedRange.c2 : comment.nCol) + 1;
if (!_this.worksheet.cols[coords.nLeft]) {
_this.worksheet.expandColsOnScroll(true);
_this.worksheet._trigger("reinitializeScrollX");
}
coords.nTop = mergedRange ? mergedRange.r1 : comment.nRow;
coords.nLeftOffset = 0;
coords.nTopOffset = 0;
var fvr = _this.worksheet.getFirstVisibleRow();
var fvc = _this.worksheet.getFirstVisibleCol();
coords.dReverseLeftPX = _this.worksheet.getCellLeft(comment.nCol, 0) - _this.worksheet.getCellLeft(fvc, 0) + headerColOffPx;
coords.dLeftPX = _this.worksheet.getCellLeft(coords.nLeft, 0) - _this.worksheet.getCellLeft(fvc, 0) + headerColOffPx;
coords.dTopPX = _this.worksheet.getCellTop(coords.nTop, 0) - _this.worksheet.getCellTop(fvr, 0) + headerRowOffPx;
var fvrPx = _this.worksheet.getCellTop(0, 0);
if (coords.dTopPX < fvrPx) {
coords.dTopPX = fvrPx;
}
coords.dLeftMM = _this.worksheet.getCellLeft(coords.nLeft, 3) - _this.worksheet.getCellLeft(fvc, 3);
coords.dTopMM = _this.worksheet.getCellTop(coords.nTop, 3) - _this.worksheet.getCellTop(fvr, 3);
var findCol = _this.worksheet._findColUnderCursor(_this.worksheet.getCellLeft(coords.nLeft, 1) + _this.pxToPt(coords.dWidthPX + headerColOffPx) - _this.worksheet.getCellLeft(fvc, 1), true);
var findRow = _this.worksheet._findRowUnderCursor(_this.worksheet.getCellTop(coords.nTop, 1) + _this.pxToPt(coords.dHeightPX + headerRowOffPx) - _this.worksheet.getCellTop(fvr, 1), true);
coords.nRight = findCol ? findCol.col : 0;
coords.nBottom = findRow ? findRow.row : 0;
coords.nRightOffset = _this.worksheet.getCellLeft(coords.nLeft, 0) + coords.nLeftOffset + coords.dWidthPX + headerColOffPx - _this.worksheet.getCellLeft(coords.nRight, 0);
coords.nBottomOffset = _this.worksheet.getCellTop(coords.nTop, 0) + coords.nTopOffset + coords.dHeightPX + headerRowOffPx - _this.worksheet.getCellTop(coords.nBottom, 0);
_this.overlayCtx.setFont(originalFont);
}
for (var i = 0; i < comments.length; i++) {
calcCommentArea(comments[i], coords);
}
if (comments.length) {
coords.dWidthPX += _this.commentPadding * 2;
coords.dWidthMM = _this.pxToMm(coords.dWidthPX);
coords.dHeightPX += _this.commentPadding * 2;
coords.dHeightMM = _this.pxToMm(coords.dHeightPX);
}
return coords;
};
_this.commentCoordsExist = function (col, row) {
var result = false;
for (var i = 0; i < _this.aCommentCoords.length; i++) {
if ((col == _this.aCommentCoords[i].nCol) && (row == _this.aCommentCoords[i].nRow)) {
return true;
}
}
return result;
};
_this.prepareCommentsToSave = function () {
_this.calcCommentsCoords(true);
};
_this.cleanSelectedComment = function () {
if (_this.lastSelectedId) {
var comment = _this.asc_findComment(_this.lastSelectedId);
if (comment && !comment.asc_getDocumentFlag() && !comment.asc_getSolved()) {
var metrics = _this.getCellMetrics(comment.asc_getCol(), comment.asc_getRow());
if (metrics.result) {
var x = _this.pxToPt(metrics.left);
var y = _this.pxToPt(metrics.top);
var w = _this.pxToPt(metrics.width);
var h = _this.pxToPt(metrics.height);
_this.overlayCtx.clearRect(x, y, w, h);
}
}
}
};
_this.pxToPt = function (val) {
var tmp = Asc.round(val) * _this.ascCvtRatio(0, 1);
return tmp > 0 ? tmp : 0;
};
_this.ptToPx = function (val) {
var tmp = val * _this.ascCvtRatio(1, 0);
return tmp;
};
_this.mmToPx = function (val) {
var tmp = val * _this.ascCvtRatio(3, 0);
return tmp;
};
_this.pxToMm = function (val) {
var tmp = val * _this.ascCvtRatio(0, 3);
return tmp;
};
_this.ascCvtRatio = function (fromUnits, toUnits) {
return Asc.getCvtRatio(fromUnits, toUnits, _this.overlayCtx.getPPIX());
};
}
asc_CCellCommentator.prototype = {
asc_showComments: function () {
var _this = this;
_this.bShow = true;
_this.drawCommentCells();
},
asc_hideComments: function () {
var _this = this;
_this.bShow = false;
_this.drawCommentCells();
_this.worksheet.model.workbook.handlers.trigger("asc_onHideComment");
},
asc_showComment: function (id, bNew) {
var _this = this;
var comment = _this.asc_findComment(id);
if (comment) {
function callbackFunc(result) {
if (!result) {
_this.worksheet.model.workbook.handlers.trigger("asc_onLockComment", comment.asc_getId(), comment.asc_getUserId());
} else {
_this.worksheet.model.workbook.handlers.trigger("asc_onUnLockComment", comment.asc_getId());
}
var commentList = _this.asc_getComments(comment.asc_getCol(), comment.asc_getRow());
var coords = _this.getCommentsCoords(commentList);
var indexes = [];
for (var i = 0; i < commentList.length; i++) {
indexes.push(commentList[i].asc_getId());
}
if (indexes.length) {
if (_this.lastSelectedId != id) {
_this.worksheet.model.workbook.handlers.trigger("asc_onHideComment");
}
_this.worksheet.model.workbook.handlers.trigger("asc_onShowComment", indexes, coords.asc_getLeftPX(), coords.asc_getTopPX(), coords.asc_getReverseLeftPX(), bNew);
_this.drawCommentCells();
}
_this.lastSelectedId = id;
}
_this.isLockedComment(comment, false, callbackFunc);
} else {
_this.lastSelectedId = null;
}
},
asc_selectComment: function (id, bMove) {
var _this = this;
var comment = _this.asc_findComment(id);
_this.cleanLastSelection();
_this.lastSelectedId = null;
if (comment && !comment.asc_getDocumentFlag() && !comment.asc_getSolved()) {
_this.lastSelectedId = id;
var col = comment.asc_getCol();
var row = comment.asc_getRow();
var vr = _this.worksheet.visibleRange;
if (bMove) {
if ((row < vr.r1) || (row > vr.r2)) {
var offset = row - vr.r1 - Math.round((vr.r2 - vr.r1) / 2);
_this.worksheet.scrollVertical(offset);
_this.worksheet._trigger("reinitializeScrollY");
}
if ((col < vr.c1) || (col > vr.c2)) {
var offset = col - vr.c1 - Math.round((vr.c2 - vr.c1) / 2);
_this.worksheet.scrollHorizontal(offset);
_this.worksheet._trigger("reinitializeScrollX");
}
}
var metrics = _this.getCellMetrics(col, row);
if (metrics.result) {
var rangeOffset = 0;
var extraOffset = 1;
var x = _this.pxToPt(metrics.left + rangeOffset);
var y = _this.pxToPt(metrics.top + rangeOffset);
var w = _this.pxToPt(metrics.width - extraOffset - rangeOffset);
var h = _this.pxToPt(metrics.height - extraOffset - rangeOffset);
_this.overlayCtx.ctx.globalAlpha = 0.2;
_this.overlayCtx.beginPath();
_this.overlayCtx.clearRect(x, y, w, h);
_this.overlayCtx.setFillStyle(_this.commentFillColor);
_this.overlayCtx.fillRect(x, y, w, h);
_this.overlayCtx.ctx.globalAlpha = 1;
}
}
},
asc_findComment: function (id) {
var _this = this;
function checkCommentId(id, commentObject) {
if (commentObject.asc_getId() == id) {
return commentObject;
}
for (var i = 0; i < commentObject.aReplies.length; i++) {
var comment = checkCommentId(id, commentObject.aReplies[i]);
if (comment) {
return comment;
}
}
}
for (var i = 0; i < _this.aComments.length; i++) {
var commentCell = _this.aComments[i];
var obj = checkCommentId(id, commentCell);
if (obj) {
return obj;
}
}
return null;
},
asc_addComment: function (comment) {
var _this = this;
var oComment = comment;
var bChange = false;
oComment.wsId = _this.worksheet.model.getId();
oComment.setId();
if (!oComment.bDocument) {
var selectedCell = _this.worksheet.getSelectedRange();
var oFirst = selectedCell.getFirst();
oComment.asc_putCol(oFirst.col - 1);
oComment.asc_putRow(oFirst.row - 1);
var existComments = _this.asc_getComments(oComment.nCol, oComment.nRow);
if (existComments.length) {
oComment = existComments[0];
bChange = true;
} else {
if ((oComment.nCol != null) && (oComment.nRow != null)) {
var cellAddress = new CellAddress(oComment.nRow, oComment.nCol, 0);
oComment.sQuoteText = cellAddress.getID() + " : " + _this.worksheet.model.getCell(cellAddress).getValueWithFormat();
}
}
}
function callbackFunc(result) {
if (!result) {
_this.worksheet.model.workbook.handlers.trigger("asc_onLockComment", oComment.asc_getId(), oComment.asc_getUserId());
return;
} else {
_this.worksheet.model.workbook.handlers.trigger("asc_onUnLockComment", oComment.asc_getId());
if (!bChange) {
History.Create_NewPoint();
History.Add(g_oUndoRedoComment, historyitem_Comment_Add, _this.worksheet.model.getId(), null, new asc_CCommentData(oComment));
_this.aComments.push(oComment);
_this.drawCommentCells();
}
_this.worksheet.model.workbook.handlers.trigger("asc_onAddComment", oComment.asc_getId(), oComment);
}
}
_this.isLockedComment(oComment, true, callbackFunc);
},
asc_changeComment: function (id, oComment, bChangeCoords) {
var _this = this;
var comment = _this.asc_findComment(id);
function callbackFunc(result) {
if (!result) {
_this.worksheet.model.workbook.handlers.trigger("asc_onLockComment", comment.asc_getId(), comment.asc_getUserId());
return;
} else {
_this.worksheet.model.workbook.handlers.trigger("asc_onUnLockComment", comment.asc_getId());
var commentBefore = new asc_CCommentData(comment);
if (comment) {
if (bChangeCoords) {
comment.asc_putCol(oComment.asc_getCol());
comment.asc_putRow(oComment.asc_getRow());
}
comment.asc_putText(oComment.asc_getText());
comment.asc_putQuoteText(oComment.asc_getQuoteText());
comment.asc_putUserId(oComment.asc_getUserId());
comment.asc_putUserName(oComment.asc_getUserName());
comment.asc_putTime(oComment.asc_getTime());
comment.asc_putSolved(oComment.asc_getSolved());
comment.asc_putHiddenFlag(oComment.asc_getHiddenFlag());
comment.aReplies = [];
if (!comment.bDocument && (comment.nCol != null) && (comment.nRow != null)) {
var cellAddress = new CellAddress(comment.nRow, comment.nCol, 0);
comment.sQuoteText = cellAddress.getID() + " : " + _this.worksheet.model.getCell(cellAddress).getValueWithFormat();
}
var count = oComment.asc_getRepliesCount();
for (var i = 0; i < count; i++) {
comment.asc_addReply(oComment.asc_getReply(i));
}
_this.worksheet.model.workbook.handlers.trigger("asc_onChangeCommentData", comment.asc_getId(), comment);
}
if (_this.bSaveHistory) {
var commentAfter = new asc_CCommentData(comment);
var compositeComment = new CompositeCommentData();
compositeComment.commentBefore = commentBefore;
compositeComment.commentAfter = commentAfter;
History.Create_NewPoint();
History.Add(g_oUndoRedoComment, historyitem_Comment_Change, _this.worksheet.model.getId(), null, compositeComment);
}
_this.drawCommentCells();
}
}
_this.isLockedComment(comment, true, callbackFunc);
},
asc_removeComment: function (id) {
var _this = this;
var comment = _this.asc_findComment(id);
function callbackFunc(result) {
if (!result) {
_this.worksheet.model.workbook.handlers.trigger("asc_onLockComment", comment.asc_getId(), oComment.asc_getUserId());
return;
} else {
_this.worksheet.model.workbook.handlers.trigger("asc_onUnLockComment", comment.asc_getId());
if (comment) {
if (comment.oParent) {
for (var i = 0; i < comment.oParent.aReplies.length; i++) {
if (comment.asc_getId() == comment.oParent.aReplies[i].asc_getId()) {
if (_this.bSaveHistory) {
History.Create_NewPoint();
History.Add(g_oUndoRedoComment, historyitem_Comment_Remove, _this.worksheet.model.getId(), null, new asc_CCommentData(comment.oParent.aReplies[i]));
}
comment.oParent.aReplies.splice(i, 1);
bResult = true;
break;
}
}
} else {
for (var i = 0; i < _this.aComments.length; i++) {
if (comment.asc_getId() == _this.aComments[i].asc_getId()) {
if (_this.bSaveHistory) {
History.Create_NewPoint();
History.Add(g_oUndoRedoComment, historyitem_Comment_Remove, _this.worksheet.model.getId(), null, new asc_CCommentData(_this.aComments[i]));
}
_this.aComments.splice(i, 1);
bResult = true;
break;
}
}
_this.worksheet.draw();
}
_this.drawCommentCells();
_this.worksheet.model.workbook.handlers.trigger("asc_onRemoveComment", id);
}
}
}
_this.isLockedComment(comment, true, callbackFunc);
},
asc_getComments: function (col, row) {
var comments = [];
var _this = this;
var _col = col,
_row = row,
mergedRange = null;
var length = _this.aComments.length;
if (!this.bShow) {
return comments;
}
if (0 < length) {
if (null == _col || null == _row) {
var selectedCell = _this.worksheet.getSelectedRange();
var oFirst = selectedCell.getFirst();
_col = oFirst.col - 1;
_row = oFirst.row - 1;
} else {
mergedRange = _this.worksheet.model.getMergedByCell(row, col);
}
for (var i = 0; i < length; i++) {
var commentCell = _this.aComments[i];
if (!commentCell.asc_getDocumentFlag() && !commentCell.asc_getHiddenFlag() && (commentCell.nLevel == 0)) {
if (!mergedRange) {
if ((_col == commentCell.nCol) && (_row == commentCell.nRow)) {
comments.push(commentCell);
}
} else {
if ((commentCell.nCol >= mergedRange.c1) && (commentCell.nRow >= mergedRange.r1) && (commentCell.nCol <= mergedRange.c2) && (commentCell.nRow <= mergedRange.r2)) {
comments.push(commentCell);
}
}
}
}
}
return comments;
},
asc_getDocumentComments: function () {
var comments = [];
for (var i = 0; i < this.aComments.length; i++) {
var commentCell = this.aComments[i];
if ((commentCell.nLevel == 0) && commentCell.asc_getDocumentFlag()) {
comments.push(commentCell);
}
}
return comments;
},
Undo: function (type, data) {
var _this = this;
switch (type) {
case historyitem_Comment_Add:
if (data.oParent) {
var parentComment = _this.asc_findComment(data.oParent.asc_getId());
for (var i = 0; i < parentComment.aReplies.length; i++) {
if (parentComment.aReplies[i].asc_getId() == data.asc_getId()) {
parentComment.aReplies.splice(i, 1);
break;
}
}
} else {
for (var i = 0; i < _this.aComments.length; i++) {
if (_this.aComments[i].asc_getId() == data.asc_getId()) {
_this.aComments.splice(i, 1);
_this.worksheet.model.workbook.handlers.trigger("asc_onRemoveComment", data.asc_getId());
break;
}
}
}
break;
case historyitem_Comment_Remove:
if (data.oParent) {
var parentComment = _this.asc_findComment(data.oParent.asc_getId());
parentComment.aReplies.push(data);
} else {
_this.aComments.push(data);
_this.worksheet.model.workbook.handlers.trigger("asc_onAddComment", data.asc_getId(), data);
}
break;
case historyitem_Comment_Change:
if (data.commentAfter.oParent) {
var parentComment = _this.asc_findComment(data.commentAfter.oParent.asc_getId());
for (var i = 0; i < parentComment.aReplies.length; i++) {
if (parentComment.aReplies[i].asc_getId() == data.asc_getId()) {
parentComment.aReplies.splice(i, 1);
parentComment.aReplies.push(data.commentBefore);
break;
}
}
} else {
for (var i = 0; i < _this.aComments.length; i++) {
if (_this.aComments[i].asc_getId() == data.commentAfter.asc_getId()) {
_this.aComments.splice(i, 1);
_this.aComments.push(data.commentBefore);
_this.worksheet.model.workbook.handlers.trigger("asc_onChangeCommentData", data.commentBefore.asc_getId(), data.commentBefore);
break;
}
}
}
break;
}
},
Redo: function (type, data) {
var _this = this;
switch (type) {
case historyitem_Comment_Add:
if (data.oParent) {
var parentComment = _this.asc_findComment(data.oParent.asc_getId());
parentComment.aReplies.push(data);
} else {
_this.aComments.push(data);
_this.worksheet.model.workbook.handlers.trigger("asc_onAddComment", data.asc_getId(), data);
}
break;
case historyitem_Comment_Remove:
if (data.oParent) {
var parentComment = _this.asc_findComment(data.oParent.asc_getId());
for (var i = 0; i < parentComment.aReplies.length; i++) {
if (parentComment.aReplies[i].asc_getId() == data.asc_getId()) {
parentComment.aReplies.splice(i, 1);
break;
}
}
} else {
for (var i = 0; i < _this.aComments.length; i++) {
if (_this.aComments[i].asc_getId() == data.asc_getId()) {
_this.aComments.splice(i, 1);
_this.worksheet.model.workbook.handlers.trigger("asc_onRemoveComment", data.asc_getId());
break;
}
}
}
break;
case historyitem_Comment_Change:
if (data.commentBefore.oParent) {
var parentComment = _this.asc_findComment(data.commentBefore.oParent.asc_getId());
for (var i = 0; i < parentComment.aReplies.length; i++) {
if (parentComment.aReplies[i].asc_getId() == data.asc_getId()) {
parentComment.aReplies.splice(i, 1);
parentComment.aReplies.push(data.commentAfter);
break;
}
}
} else {
for (var i = 0; i < _this.aComments.length; i++) {
if (_this.aComments[i].asc_getId() == data.commentBefore.asc_getId()) {
_this.aComments.splice(i, 1);
_this.aComments.push(data.commentAfter);
_this.worksheet.model.workbook.handlers.trigger("asc_onChangeCommentData", data.commentAfter.asc_getId(), data.commentAfter);
break;
}
}
}
break;
}
}
};
window["Asc"]["asc_CCellCommentator"] = window["Asc"].asc_CCellCommentator = asc_CCellCommentator;
prot = asc_CCellCommentator.prototype;
prot["asc_showComments"] = prot.asc_showComments;
prot["asc_hideComments"] = prot.asc_hideComments;
prot["asc_selectComment"] = prot.asc_selectComment;
prot["asc_showComment"] = prot.asc_showComment;
prot["asc_findComment"] = prot.asc_findComment;
prot["asc_addComment"] = prot.asc_addComment;
prot["asc_changeComment"] = prot.asc_changeComment;
prot["asc_removeComment"] = prot.asc_removeComment;
prot["asc_getComments"] = prot.asc_getComments;
prot["asc_getDocumentComments"] = prot.asc_getDocumentComments;