818 lines
38 KiB
JavaScript
818 lines
38 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
|
|||
|
*
|
|||
|
*/
|
|||
|
Ext.define("SSE.controller.DocumentHolder", {
|
|||
|
extend: "Ext.app.Controller",
|
|||
|
requires: [],
|
|||
|
views: ["DocumentHolder"],
|
|||
|
uses: ["SSE.view.AutoFilterDialog", "SSE.view.DigitalFilterDialog", "SSE.view.SetValueDialog", "SSE.view.ParagraphSettingsAdvanced", "SSE.view.HyperlinkSettings"],
|
|||
|
refs: [{
|
|||
|
ref: "documentHolder",
|
|||
|
selector: "ssedocumentholder"
|
|||
|
},
|
|||
|
{
|
|||
|
ref: "splitterMainMenu",
|
|||
|
selector: "#main-menu-splitter"
|
|||
|
}],
|
|||
|
init: function () {
|
|||
|
this.tooltips = {
|
|||
|
hyperlink: {},
|
|||
|
comment: {},
|
|||
|
coauth: {
|
|||
|
ttHeight: 20
|
|||
|
}
|
|||
|
};
|
|||
|
this.mouse = {};
|
|||
|
this.popupmenu = false;
|
|||
|
this.control({
|
|||
|
"ssedocumentholder": {
|
|||
|
resize: this._handleDocumentResize,
|
|||
|
afterrender: this._onAfterRender
|
|||
|
},
|
|||
|
"menu[group=menu-document]": {
|
|||
|
show: function () {
|
|||
|
this.popupmenu = true;
|
|||
|
if (this.tooltips.comment.editCommentId || this.tooltips.comment.viewCommentId) {
|
|||
|
this.tooltips.comment.viewCommentId = this.tooltips.comment.editCommentId = this.tooltips.comment.moveCommentId = undefined;
|
|||
|
this.getController("Common.controller.CommentsPopover").onApiHideComment();
|
|||
|
}
|
|||
|
},
|
|||
|
hide: function (cnt, eOpt) {
|
|||
|
this.popupmenu = false;
|
|||
|
this.getDocumentHolder().fireEvent("editcomplete", this.getDocumentHolder());
|
|||
|
}
|
|||
|
},
|
|||
|
"#view-main-menu": {
|
|||
|
panelbeforeshow: function (fullscreen) {
|
|||
|
this._isMenuHided = true;
|
|||
|
if (fullscreen !== true) {
|
|||
|
this.getSplitterMainMenu().show();
|
|||
|
this.getDocumentHolder().addCls("left-border");
|
|||
|
Ext.ComponentQuery.query("#infobox-container-cell-name")[0].addCls("left-border");
|
|||
|
}
|
|||
|
},
|
|||
|
panelbeforehide: function () {
|
|||
|
this._isMenuHided = true;
|
|||
|
},
|
|||
|
panelshow: function (panel, fullscreen) {
|
|||
|
this._isMenuHided = false;
|
|||
|
this._isFullscreenMenu = fullscreen;
|
|||
|
if (!fullscreen) {
|
|||
|
var me = this;
|
|||
|
me._handleDocumentResize(me.getDocumentHolder(), me.getDocumentHolder().getWidth(), me.getDocumentHolder().getHeight());
|
|||
|
if (!panel.isSizeInit) {
|
|||
|
panel.isSizeInit = true;
|
|||
|
var view = panel.down("dataview");
|
|||
|
if (view) {
|
|||
|
var nodes = view.getNodes(),
|
|||
|
width_parent = panel.getWidth();
|
|||
|
for (var item in nodes) {
|
|||
|
nodes[item].style["width"] = width_parent + "px";
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
},
|
|||
|
panelhide: function (panel, fullscreen) {
|
|||
|
this._isMenuHided = false;
|
|||
|
this._isFullscreenMenu = false;
|
|||
|
if (!fullscreen) {
|
|||
|
var me = this;
|
|||
|
me._handleDocumentResize(me.getDocumentHolder(), me.getDocumentHolder().getWidth(), me.getDocumentHolder().getHeight());
|
|||
|
me.getSplitterMainMenu().hide();
|
|||
|
me.getDocumentHolder().removeCls("left-border");
|
|||
|
Ext.ComponentQuery.query("#infobox-container-cell-name")[0].removeCls("left-border");
|
|||
|
}
|
|||
|
}
|
|||
|
},
|
|||
|
"#cmi-add-comment": {
|
|||
|
click: this._addComment
|
|||
|
},
|
|||
|
"menu[action=insert-cells]": {
|
|||
|
click: this.handleCellInsertMenu
|
|||
|
},
|
|||
|
"menu[action=delete-cells]": {
|
|||
|
click: this.handleCellDeleteMenu
|
|||
|
},
|
|||
|
"#cmi-sort-cells": {
|
|||
|
click: this.handleCellSortMenu
|
|||
|
},
|
|||
|
"#context-menu-cell": {
|
|||
|
click: this.handleCellsMenu
|
|||
|
},
|
|||
|
"#main-menu-splitter": {
|
|||
|
beforedragstart: function (obj, event) {
|
|||
|
return !event.currentTarget.disabled;
|
|||
|
},
|
|||
|
move: function (obj, x, y) {
|
|||
|
if (this._isMenuHided) {
|
|||
|
return;
|
|||
|
}
|
|||
|
var jsp_container, width_parent = obj.up("container").down("ssemainmenu").getWidth();
|
|||
|
if (width_parent > 40) {
|
|||
|
width_parent -= 40;
|
|||
|
Ext.ComponentQuery.query("dataview[group=scrollable]").forEach(function (list) {
|
|||
|
var nodes = list.getNodes();
|
|||
|
for (var item in nodes) {
|
|||
|
nodes[item].style["width"] = width_parent + "px";
|
|||
|
}
|
|||
|
list.getEl().setWidth(width_parent);
|
|||
|
jsp_container = list.getEl().down(".jspContainer");
|
|||
|
if (jsp_container) {
|
|||
|
jsp_container.setWidth(width_parent);
|
|||
|
list.getEl().down(".jspPane").setWidth(width_parent);
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
}
|
|||
|
},
|
|||
|
"menu[action=setting-hide]": {
|
|||
|
click: function (menu, item) {
|
|||
|
var current = this.api.asc_getSheetViewSettings();
|
|||
|
switch (item.action) {
|
|||
|
case "headers":
|
|||
|
current.asc_setShowRowColHeaders(item.checked);
|
|||
|
break;
|
|||
|
case "lines":
|
|||
|
current.asc_setShowGridLines(item.checked);
|
|||
|
break;
|
|||
|
}
|
|||
|
this.api.asc_setSheetViewSettings(current);
|
|||
|
}
|
|||
|
},
|
|||
|
"menuitem[group=popupparagraphvalign]": {
|
|||
|
click: this._onParagraphVAlign
|
|||
|
},
|
|||
|
"menuitem[action=image-grouping]": {
|
|||
|
click: function (btn) {
|
|||
|
this.api[btn.grouping ? "asc_groupGraphicsObjects" : "asc_unGroupGraphicsObjects"]();
|
|||
|
this.getDocumentHolder().fireEvent("editcomplete", this.getDocumentHolder());
|
|||
|
}
|
|||
|
},
|
|||
|
"menuitem[action=add-hyperlink-shape]": {
|
|||
|
click: this._handleAddHyperlink
|
|||
|
},
|
|||
|
"menuitem[action=remove-hyperlink-shape]": {
|
|||
|
click: this._handleRemoveHyperlink
|
|||
|
},
|
|||
|
"menuitem[action=remove-hyperlink]": {
|
|||
|
click: this._handleRemoveHyperlink
|
|||
|
},
|
|||
|
"menuitem[action=text-advanced]": {
|
|||
|
click: this._handleTextAdvanced
|
|||
|
}
|
|||
|
});
|
|||
|
this.wrapEvents = {
|
|||
|
apiShowComment: Ext.bind(this.onApiShowComment, this),
|
|||
|
apiHideComment: Ext.bind(this.onApiHideComment, this)
|
|||
|
};
|
|||
|
},
|
|||
|
setApi: function (o) {
|
|||
|
this.api = o;
|
|||
|
this.api.asc_registerCallback("asc_onMouseMove", Ext.bind(this.onApiMouseMove, this));
|
|||
|
this.api.asc_registerCallback("asc_onHideComment", this.wrapEvents.apiHideComment);
|
|||
|
this.api.asc_registerCallback("asc_onShowComment", this.wrapEvents.apiShowComment);
|
|||
|
this.api.asc_registerCallback("asc_onHyperlinkClick", Ext.bind(this.onHyperlinkClick, this));
|
|||
|
this.api.asc_registerCallback("asc_onSetAFDialog", Ext.bind(this.onAutofilter, this));
|
|||
|
this.api.asc_registerCallback("asc_onСoAuthoringDisconnect", Ext.bind(this.onCoAuthoringDisconnect, this));
|
|||
|
return this;
|
|||
|
},
|
|||
|
resetApi: function (api) {
|
|||
|
this.api.asc_unregisterCallback("asc_onHideComment", this.wrapEvents.apiHideComment);
|
|||
|
this.api.asc_unregisterCallback("asc_onShowComment", this.wrapEvents.apiShowComment);
|
|||
|
this.api.asc_registerCallback("asc_onHideComment", this.wrapEvents.apiHideComment);
|
|||
|
this.api.asc_registerCallback("asc_onShowComment", this.wrapEvents.apiShowComment);
|
|||
|
},
|
|||
|
onCoAuthoringDisconnect: function () {
|
|||
|
this.permissions.isEdit = false;
|
|||
|
},
|
|||
|
loadConfig: function (data) {
|
|||
|
this.editorConfig = data.config;
|
|||
|
},
|
|||
|
setMode: function (m) {
|
|||
|
this.permissions = m;
|
|||
|
},
|
|||
|
onApiMouseMove: function (dataarray) {
|
|||
|
if (!this._isFullscreenMenu && dataarray.length) {
|
|||
|
var index_hyperlink, index_comments, index_locked;
|
|||
|
for (var i = dataarray.length; i > 0; i--) {
|
|||
|
switch (dataarray[i - 1].asc_getType()) {
|
|||
|
case c_oAscMouseMoveType.Hyperlink:
|
|||
|
index_hyperlink = i;
|
|||
|
break;
|
|||
|
case c_oAscMouseMoveType.Comment:
|
|||
|
index_comments = i;
|
|||
|
break;
|
|||
|
case c_oAscMouseMoveType.LockedObject:
|
|||
|
index_locked = i;
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
var me = this;
|
|||
|
if (index_hyperlink) {
|
|||
|
var data = dataarray[index_hyperlink - 1];
|
|||
|
var props = data.asc_getHyperlink();
|
|||
|
if (props.asc_getType() == c_oAscHyperlinkType.WebLink) {
|
|||
|
var linkstr = props.asc_getTooltip();
|
|||
|
if (linkstr) {
|
|||
|
linkstr = Ext.String.htmlEncode(linkstr) + "<br><b>" + me.textCtrlClick + "</b>";
|
|||
|
} else {
|
|||
|
linkstr = props.asc_getHyperlinkUrl() + "<br><b>" + me.textCtrlClick + "</b>";
|
|||
|
}
|
|||
|
} else {
|
|||
|
linkstr = props.asc_getTooltip() || (props.asc_getSheet() + "!" + props.asc_getRange());
|
|||
|
}
|
|||
|
if (me.tooltips.hyperlink.ref && me.tooltips.hyperlink.ref.isVisible()) {
|
|||
|
if (me.tooltips.hyperlink.text != linkstr) {
|
|||
|
me.tooltips.hyperlink.ref.close();
|
|||
|
}
|
|||
|
}
|
|||
|
if (!me.tooltips.hyperlink.ref || !me.tooltips.hyperlink.ref.isVisible()) {
|
|||
|
me.tooltips.hyperlink.text = linkstr;
|
|||
|
me.tooltips.hyperlink.ref = Ext.create("Ext.tip.ToolTip", {
|
|||
|
closeAction: "destroy",
|
|||
|
dismissDelay: 2000,
|
|||
|
html: linkstr,
|
|||
|
listeners: {
|
|||
|
beforeclose: function () {
|
|||
|
me.tooltips.hyperlink.ref = undefined;
|
|||
|
me.tooltips.hyperlink.text = "";
|
|||
|
},
|
|||
|
hide: function () {
|
|||
|
me.tooltips.hyperlink.ref = undefined;
|
|||
|
me.tooltips.hyperlink.text = "";
|
|||
|
}
|
|||
|
}
|
|||
|
});
|
|||
|
me.tooltips.hyperlink.ref.show();
|
|||
|
var xy = me.tooltips.hyperlink.ref.getEl().getAlignToXY("editor_sdk", "tl?", [data.asc_getX() + 4, data.asc_getY() + 6]);
|
|||
|
me.tooltips.hyperlink.ref.showAt(xy);
|
|||
|
}
|
|||
|
}
|
|||
|
if (me.permissions.isEdit) {
|
|||
|
if (index_comments && !this.popupmenu) {
|
|||
|
data = dataarray[index_comments - 1];
|
|||
|
if (!me.tooltips.comment.editCommentId && me.tooltips.comment.moveCommentId != data.asc_getCommentIndexes()[0]) {
|
|||
|
me.tooltips.comment.moveCommentId = data.asc_getCommentIndexes()[0];
|
|||
|
if (me.tooltips.comment.moveCommentTimer) {
|
|||
|
clearTimeout(me.tooltips.comment.moveCommentTimer);
|
|||
|
}
|
|||
|
var idxs = data.asc_getCommentIndexes(),
|
|||
|
x = data.asc_getX(),
|
|||
|
y = data.asc_getY(),
|
|||
|
leftx = data.asc_getReverseX();
|
|||
|
me.tooltips.comment.moveCommentTimer = setTimeout(function () {
|
|||
|
if (me.tooltips.comment.moveCommentId && !me.tooltips.comment.editCommentId) {
|
|||
|
me.tooltips.comment.viewCommentId = me.tooltips.comment.moveCommentId;
|
|||
|
me.getController("Common.controller.CommentsPopover").onApiShowComment(idxs, x, y, leftx, false);
|
|||
|
}
|
|||
|
},
|
|||
|
400);
|
|||
|
}
|
|||
|
} else {
|
|||
|
me.tooltips.comment.moveCommentId = undefined;
|
|||
|
if (me.tooltips.comment.viewCommentId != undefined) {
|
|||
|
me.tooltips.comment = {};
|
|||
|
this.getController("Common.controller.CommentsPopover").onApiHideComment();
|
|||
|
}
|
|||
|
}
|
|||
|
if (index_locked) {
|
|||
|
data = dataarray[index_locked - 1];
|
|||
|
if (!me.tooltips.coauth.XY) {
|
|||
|
me._handleDocumentResize(me.getDocumentHolder(), me.getDocumentHolder().getWidth(), me.getDocumentHolder().getHeight());
|
|||
|
}
|
|||
|
if (me.tooltips.coauth.x_point != data.asc_getX() || me.tooltips.coauth.y_point != data.asc_getY()) {
|
|||
|
me.hideTips();
|
|||
|
me.tooltips.coauth.x_point = data.asc_getX();
|
|||
|
me.tooltips.coauth.y_point = data.asc_getY();
|
|||
|
var src = Ext.DomHelper.append(Ext.getBody(), {
|
|||
|
tag: "div",
|
|||
|
cls: "username-tip"
|
|||
|
},
|
|||
|
true);
|
|||
|
src.applyStyles({
|
|||
|
height: me.tooltips.coauth.ttHeight + "px",
|
|||
|
position: "absolute",
|
|||
|
zIndex: "19000",
|
|||
|
visibility: "visible"
|
|||
|
});
|
|||
|
me.tooltips.coauth.ref = src;
|
|||
|
var is_sheet_lock = data.asc_getLockedObjectType() == c_oAscMouseMoveLockedObjectType.Sheet || data.asc_getLockedObjectType() == c_oAscMouseMoveLockedObjectType.TableProperties;
|
|||
|
var showPoint = [me.tooltips.coauth.x_point + me.tooltips.coauth.XY[0], me.tooltips.coauth.y_point + me.tooltips.coauth.XY[1]]; ! is_sheet_lock && (showPoint[0] = me.tooltips.coauth.bodyWidth - showPoint[0]);
|
|||
|
if (showPoint[1] > me.tooltips.coauth.XY[1] && showPoint[1] + me.tooltips.coauth.ttHeight < me.tooltips.coauth.XY[1] + me.tooltips.coauth.apiHeight) {
|
|||
|
Ext.DomHelper.overwrite(src, me._getUserName(data.asc_getUserId()));
|
|||
|
src.applyStyles({
|
|||
|
visibility: "visible"
|
|||
|
});
|
|||
|
is_sheet_lock && src.applyStyles({
|
|||
|
top: showPoint[1] + "px",
|
|||
|
left: showPoint[0] + "px"
|
|||
|
}) || src.applyStyles({
|
|||
|
top: showPoint[1] + "px",
|
|||
|
right: showPoint[0] + "px"
|
|||
|
});
|
|||
|
}
|
|||
|
}
|
|||
|
} else {
|
|||
|
me.hideTips();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
},
|
|||
|
onApiHideComment: function () {
|
|||
|
this.tooltips.comment.viewCommentId = this.tooltips.comment.editCommentId = this.tooltips.comment.moveCommentId = undefined;
|
|||
|
},
|
|||
|
onApiShowComment: function (commentId, posX, posY, leftx, isnew) {
|
|||
|
commentId = commentId[0];
|
|||
|
if (this.tooltips.comment.viewCommentId) {
|
|||
|
this.tooltips.comment.viewCommentId = undefined;
|
|||
|
this.tooltips.comment.editCommentId = commentId;
|
|||
|
this.getController("Common.controller.CommentsPopover").makeCommentEditable(commentId);
|
|||
|
} else {
|
|||
|
if (this.tooltips.comment.editCommentId == commentId) {} else {
|
|||
|
this.tooltips.comment.editCommentId = commentId;
|
|||
|
if (isnew) {
|
|||
|
if (!this.getDocumentHolder().isLiveCommenting) {
|
|||
|
var mainMenuCmp = Ext.getCmp("view-main-menu");
|
|||
|
mainMenuCmp && mainMenuCmp.selectMenu("menuComments");
|
|||
|
}
|
|||
|
var popupComment = Ext.ComponentQuery.query("commoncommentspopover");
|
|||
|
if (popupComment.length) {
|
|||
|
popupComment = popupComment[0];
|
|||
|
popupComment.fireTransformToAdd();
|
|||
|
var dataView = popupComment.query("dataview")[0];
|
|||
|
if (dataView) {
|
|||
|
dataView.on("viewready", function () {
|
|||
|
popupComment.fireTransformToAdd();
|
|||
|
},
|
|||
|
this);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
},
|
|||
|
onHyperlinkClick: function (url) {
|
|||
|
var newDocumentPage = window.open(url, "_blank");
|
|||
|
if (newDocumentPage) {
|
|||
|
newDocumentPage.focus();
|
|||
|
}
|
|||
|
},
|
|||
|
_getUserName: function (id) {
|
|||
|
var usersStore = Ext.getStore("Common.store.Users");
|
|||
|
if (usersStore) {
|
|||
|
var rec = usersStore.findRecord("id", id);
|
|||
|
if (rec) {
|
|||
|
return Ext.String.ellipsis(Ext.String.htmlEncode(rec.get("username")), 25, true);
|
|||
|
}
|
|||
|
}
|
|||
|
return this.guestText;
|
|||
|
},
|
|||
|
hideTips: function () {
|
|||
|
if (this.tooltips.coauth.ref) {
|
|||
|
Ext.destroy(this.tooltips.coauth.ref);
|
|||
|
this.tooltips.coauth.ref = undefined;
|
|||
|
this.tooltips.coauth.x_point = undefined;
|
|||
|
this.tooltips.coauth.y_point = undefined;
|
|||
|
}
|
|||
|
},
|
|||
|
_handleDocumentResize: function (obj, width, height) {
|
|||
|
var me = this;
|
|||
|
setTimeout(function () {
|
|||
|
me.tooltips.coauth.XY = obj.getPosition();
|
|||
|
me.tooltips.coauth.apiHeight = height;
|
|||
|
me.tooltips.coauth.bodyWidth = Ext.getBody().getWidth();
|
|||
|
},
|
|||
|
10);
|
|||
|
},
|
|||
|
_onAfterRender: function (ct) {
|
|||
|
ct.addCls("top-border");
|
|||
|
document.body.onmousedown = Ext.bind(this._handleRightDown, this);
|
|||
|
document.body.onmouseup = Ext.bind(this._handleRightUp, this);
|
|||
|
var meEl = ct.getEl();
|
|||
|
meEl.on({
|
|||
|
contextmenu: {
|
|||
|
fn: this._showObjectMenu,
|
|||
|
preventDefault: true,
|
|||
|
scope: this
|
|||
|
},
|
|||
|
mousewheel: this._handleDocumentWheel,
|
|||
|
keydown: this._handleKeyDown,
|
|||
|
click: function (event, el) {
|
|||
|
if (this.api) {
|
|||
|
this.api.isTextAreaBlur = false;
|
|||
|
if (! (el instanceof HTMLTextAreaElement || el instanceof HTMLInputElement)) {
|
|||
|
this.getDocumentHolder().focus(false);
|
|||
|
}
|
|||
|
}
|
|||
|
},
|
|||
|
scope: this
|
|||
|
});
|
|||
|
Ext.getDoc().on("mousewheel", this._handleDocumentWheel, this);
|
|||
|
Ext.getDoc().on("keydown", this._handleDocumentKeyDown, this);
|
|||
|
},
|
|||
|
_handleDocumentWheel: function (event) {
|
|||
|
if (this.api) {
|
|||
|
var delta = event.getWheelDelta();
|
|||
|
if (event.ctrlKey) {
|
|||
|
var f = this.api.asc_getZoom();
|
|||
|
if (delta < 0) {
|
|||
|
f -= 0.1;
|
|||
|
if (! (f < 0.5)) {
|
|||
|
this.api.asc_setZoom(f);
|
|||
|
}
|
|||
|
} else {
|
|||
|
if (delta > 0) {
|
|||
|
f += 0.1;
|
|||
|
if (f > 0 && !(f > 2)) {
|
|||
|
this.api.asc_setZoom(f);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
event.stopEvent();
|
|||
|
}
|
|||
|
}
|
|||
|
},
|
|||
|
_handleDocumentKeyDown: function (event) {
|
|||
|
if (this.api) {
|
|||
|
var key = event.getKey();
|
|||
|
if ((event.ctrlKey || event.metaKey) && !event.shiftKey) {
|
|||
|
if (key === event.NUM_PLUS || (Ext.isOpera && key == 43)) {
|
|||
|
if (!this.api.isCellEdited) {
|
|||
|
var f = this.api.asc_getZoom() + 0.1;
|
|||
|
if (f > 0 && !(f > 2)) {
|
|||
|
this.api.asc_setZoom(f);
|
|||
|
}
|
|||
|
event.stopEvent();
|
|||
|
return false;
|
|||
|
}
|
|||
|
} else {
|
|||
|
if (key === event.NUM_MINUS || (Ext.isOpera && key == 45)) {
|
|||
|
if (!this.api.isCellEdited) {
|
|||
|
f = this.api.asc_getZoom() - 0.1;
|
|||
|
if (! (f < 0.5)) {
|
|||
|
this.api.asc_setZoom(f);
|
|||
|
}
|
|||
|
event.stopEvent();
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
},
|
|||
|
_handleRightDown: function (event, docElement, eOpts) {
|
|||
|
event.button == 0 && (this.mouse.isLeftButtonDown = true);
|
|||
|
event.button == 2 && (this.mouse.isRightButtonDown = true);
|
|||
|
},
|
|||
|
_handleRightUp: function (event, docElement, eOpts) {
|
|||
|
event.button == 0 && (this.mouse.isLeftButtonDown = false);
|
|||
|
},
|
|||
|
_handleKeyDown: function (event, docElement, eOpts) {
|
|||
|
if (event.getKey() == event.F10 && event.shiftKey) {
|
|||
|
event.stopEvent();
|
|||
|
this._showObjectMenu(event, docElement, eOpts);
|
|||
|
}
|
|||
|
},
|
|||
|
_showObjectMenu: function (event, docElement, eOpts) {
|
|||
|
if (this.api && this.permissions.isEdit && !this.mouse.isLeftButtonDown) {
|
|||
|
var iscellmenu, isrowmenu, iscolmenu, isallmenu, ischartmenu, isimagemenu, istextshapemenu;
|
|||
|
var holder = this.getDocumentHolder();
|
|||
|
var cellinfo = this.api.asc_getCellInfo();
|
|||
|
var seltype = cellinfo.asc_getFlags().asc_getSelectionType();
|
|||
|
switch (seltype) {
|
|||
|
case c_oAscSelectionType.RangeCells:
|
|||
|
iscellmenu = true;
|
|||
|
break;
|
|||
|
case c_oAscSelectionType.RangeRow:
|
|||
|
isrowmenu = true;
|
|||
|
break;
|
|||
|
case c_oAscSelectionType.RangeCol:
|
|||
|
iscolmenu = true;
|
|||
|
break;
|
|||
|
case c_oAscSelectionType.RangeMax:
|
|||
|
isallmenu = true;
|
|||
|
break;
|
|||
|
case c_oAscSelectionType.RangeImage:
|
|||
|
isimagemenu = true;
|
|||
|
break;
|
|||
|
case c_oAscSelectionType.RangeShape:
|
|||
|
isimagemenu = true;
|
|||
|
break;
|
|||
|
case c_oAscSelectionType.RangeShapeText:
|
|||
|
istextshapemenu = true;
|
|||
|
break;
|
|||
|
}
|
|||
|
if (isimagemenu) {
|
|||
|
holder.mnuUnGroupImg.setDisabled(!this.api.asc_canUnGroupGraphicsObjects());
|
|||
|
holder.mnuGroupImg.setDisabled(!this.api.asc_canGroupGraphicsObjects());
|
|||
|
this._showPopupMenu(holder.imgMenu, {},
|
|||
|
event, docElement, eOpts);
|
|||
|
} else {
|
|||
|
if (istextshapemenu) {
|
|||
|
holder.pmiTextAdvanced.textInfo = undefined;
|
|||
|
var SelectedObjects = this.api.asc_getGraphicObjectProps();
|
|||
|
for (var i = 0; i < SelectedObjects.length; i++) {
|
|||
|
var elType = SelectedObjects[i].asc_getObjectType();
|
|||
|
if (elType == c_oAscTypeSelectElement.Image) {
|
|||
|
var value = SelectedObjects[i].asc_getObjectValue();
|
|||
|
var align = value.asc_getVerticalTextAlign();
|
|||
|
holder.menuParagraphTop.setChecked(align == c_oAscVerticalTextAlign.TEXT_ALIGN_TOP);
|
|||
|
holder.menuParagraphCenter.setChecked(align == c_oAscVerticalTextAlign.TEXT_ALIGN_CTR);
|
|||
|
holder.menuParagraphBottom.setChecked(align == c_oAscVerticalTextAlign.TEXT_ALIGN_BOTTOM);
|
|||
|
} else {
|
|||
|
if (elType == c_oAscTypeSelectElement.Paragraph) {
|
|||
|
holder.pmiTextAdvanced.textInfo = SelectedObjects[i].asc_getObjectValue();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
var hyperinfo = cellinfo.asc_getHyperlink();
|
|||
|
holder.pmiInsHyperlinkShape.setVisible(this.api.asc_canAddShapeHyperlink() !== false);
|
|||
|
holder.pmiInsHyperlinkShape.cellInfo = cellinfo;
|
|||
|
holder.pmiInsHyperlinkShape.setText((hyperinfo) ? holder.editHyperlinkText : holder.txtInsHyperlink);
|
|||
|
holder.pmiRemoveHyperlinkShape.setVisible(hyperinfo !== undefined && hyperinfo !== null);
|
|||
|
holder.pmiTextAdvanced.setVisible(holder.pmiTextAdvanced.textInfo !== undefined);
|
|||
|
this._showPopupMenu(holder.textInShapeMenu, {},
|
|||
|
event, docElement, eOpts);
|
|||
|
} else {
|
|||
|
if ((seltype !== c_oAscSelectionType.RangeImage && seltype !== c_oAscSelectionType.RangeShape && seltype !== c_oAscSelectionType.RangeShapeText)) {
|
|||
|
holder.pmiInsertEntire.setVisible(isrowmenu || iscolmenu);
|
|||
|
holder.pmiDeleteEntire.setVisible(isrowmenu || iscolmenu);
|
|||
|
holder.pmiInsertCells.setVisible(iscellmenu);
|
|||
|
holder.pmiDeleteCells.setVisible(iscellmenu);
|
|||
|
holder.pmiSortCells.setVisible(iscellmenu || isallmenu);
|
|||
|
holder.pmiInsFunction.setVisible(iscellmenu);
|
|||
|
holder.pmiInsHyperlink.setVisible(iscellmenu);
|
|||
|
holder.pmiDelHyperlink.setVisible(false);
|
|||
|
if (iscellmenu) {
|
|||
|
if (cellinfo.asc_getHyperlink()) {
|
|||
|
holder.pmiInsHyperlink.setText(holder.editHyperlinkText);
|
|||
|
holder.pmiDelHyperlink.setVisible(true);
|
|||
|
} else {
|
|||
|
holder.pmiInsHyperlink.setText(holder.txtInsHyperlink);
|
|||
|
}
|
|||
|
}
|
|||
|
holder.pmiRowHeight.setVisible(isrowmenu || isallmenu);
|
|||
|
holder.pmiColumnWidth.setVisible(iscolmenu || isallmenu);
|
|||
|
holder.pmiEntireHide.setVisible(iscolmenu || isrowmenu);
|
|||
|
holder.pmiEntireShow.setVisible(iscolmenu || isrowmenu);
|
|||
|
holder.ssMenu.items.items[10].setVisible(iscellmenu && this.permissions.canCoAuthoring);
|
|||
|
holder.pmiAddComment.setVisible(iscellmenu && this.permissions.canCoAuthoring);
|
|||
|
holder.pmiCellMenuSeparator.setVisible(iscellmenu || isrowmenu || iscolmenu || isallmenu);
|
|||
|
holder.pmiEntireHide.isrowmenu = isrowmenu;
|
|||
|
holder.pmiEntireShow.isrowmenu = isrowmenu;
|
|||
|
this._showPopupMenu(holder.ssMenu, {},
|
|||
|
event, docElement, eOpts);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
this.mouse.isRightButtonDown = false;
|
|||
|
},
|
|||
|
_showPopupMenu: function (menu, value, event, docElement, eOpts) {
|
|||
|
if (Ext.isDefined(menu)) {
|
|||
|
Ext.menu.Manager.hideAll();
|
|||
|
var showPoint = event.getXY();
|
|||
|
if (!this.mouse.isRightButtonDown) {
|
|||
|
var coord = this.api.asc_getActiveCellCoord();
|
|||
|
var offset = $("#" + this.getDocumentHolder().id).offset();
|
|||
|
showPoint[0] = coord.asc_getX() + coord.asc_getWidth() + offset.left;
|
|||
|
showPoint[1] = (coord.asc_getY() < 0 ? 0 : coord.asc_getY()) + coord.asc_getHeight() + offset.top;
|
|||
|
} else {}
|
|||
|
if (Ext.isFunction(menu.initMenu)) {
|
|||
|
menu.initMenu(value);
|
|||
|
}
|
|||
|
menu.showAt(event.getXY());
|
|||
|
}
|
|||
|
},
|
|||
|
_addComment: function (item, e, eOpt) {
|
|||
|
var ascCommentData = new asc_CCommentData();
|
|||
|
var now = new Date(),
|
|||
|
timeZoneOffsetInMs = now.getTimezoneOffset() * 60000;
|
|||
|
if (ascCommentData) {
|
|||
|
ascCommentData.asc_putText("");
|
|||
|
ascCommentData.asc_putTime((now.getTime() - timeZoneOffsetInMs).toString());
|
|||
|
ascCommentData.asc_putUserId(this.editorConfig.user.id);
|
|||
|
ascCommentData.asc_putUserName(this.editorConfig.user.name);
|
|||
|
ascCommentData.asc_putDocumentFlag(false);
|
|||
|
ascCommentData.asc_putSolved(false);
|
|||
|
this.api.asc_addComment(ascCommentData);
|
|||
|
}
|
|||
|
},
|
|||
|
handleCellsMenu: function (menu, item) {
|
|||
|
if (item) {
|
|||
|
if (item.action == "insert-entire") {
|
|||
|
switch (this.api.asc_getCellInfo().asc_getFlags().asc_getSelectionType()) {
|
|||
|
case c_oAscSelectionType.RangeRow:
|
|||
|
this.api.asc_insertCells(c_oAscInsertOptions.InsertRows);
|
|||
|
break;
|
|||
|
case c_oAscSelectionType.RangeCol:
|
|||
|
this.api.asc_insertCells(c_oAscInsertOptions.InsertColumns);
|
|||
|
break;
|
|||
|
}
|
|||
|
} else {
|
|||
|
if (item.action == "delete-entire") {
|
|||
|
switch (this.api.asc_getCellInfo().asc_getFlags().asc_getSelectionType()) {
|
|||
|
case c_oAscSelectionType.RangeRow:
|
|||
|
this.api.asc_deleteCells(c_oAscDeleteOptions.DeleteRows);
|
|||
|
break;
|
|||
|
case c_oAscSelectionType.RangeCol:
|
|||
|
this.api.asc_deleteCells(c_oAscDeleteOptions.DeleteColumns);
|
|||
|
break;
|
|||
|
}
|
|||
|
} else {
|
|||
|
if (item.action == "row-height" || item.action == "column-width") {
|
|||
|
var me = this;
|
|||
|
var win = Ext.widget("setvaluedialog", {
|
|||
|
title: item.text,
|
|||
|
startvalue: item.action == "row-height" ? me.api.asc_getRowHeight() : me.api.asc_getColumnWidth(),
|
|||
|
maxvalue: 409,
|
|||
|
valuecaption: item.action == "row-height" ? this.txtHeight : this.txtWidth
|
|||
|
});
|
|||
|
win.addListener("onmodalresult", function (o, mr, v) {
|
|||
|
if (mr) {
|
|||
|
item.action == "row-height" ? me.api.asc_setRowHeight(v) : me.api.asc_setColumnWidth(v);
|
|||
|
}
|
|||
|
me.getDocumentHolder().fireEvent("editcomplete", me.getDocumentHolder());
|
|||
|
},
|
|||
|
me, {
|
|||
|
single: true
|
|||
|
});
|
|||
|
win.show();
|
|||
|
} else {
|
|||
|
if (item.action == "clear-all") {
|
|||
|
this.api.asc_emptyCells(c_oAscCleanOptions.All);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
},
|
|||
|
handleCellInsertMenu: function (menu, item) {
|
|||
|
this.api.asc_insertCells(item.kind);
|
|||
|
this.getDocumentHolder().fireEvent("editcomplete", this.getDocumentHolder());
|
|||
|
},
|
|||
|
handleCellDeleteMenu: function (menu, item) {
|
|||
|
this.api.asc_deleteCells(item.kind);
|
|||
|
this.getDocumentHolder().fireEvent("editcomplete", this.getDocumentHolder());
|
|||
|
},
|
|||
|
handleCellSortMenu: function (menu, item) {
|
|||
|
this.api.asc_sortColFilter(item.direction, "");
|
|||
|
},
|
|||
|
onAutofilter: function (config) {
|
|||
|
var me = this;
|
|||
|
var dlgFilter = Ext.widget("sseautofilterdialog", {});
|
|||
|
dlgFilter.addListener("onmodalresult", function (obj, mr, s) {
|
|||
|
if (mr == 1) {
|
|||
|
var sett = obj.getSettings();
|
|||
|
me.api.asc_applyAutoFilter("mainFilter", sett);
|
|||
|
} else {
|
|||
|
if (mr == 2) {
|
|||
|
dlgCustom.show();
|
|||
|
return;
|
|||
|
} else {
|
|||
|
if (mr == 3) {
|
|||
|
me.api.asc_sortColFilter(s, config.asc_getCellId());
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
me.mouse.isLeftButtonDown = me.mouse.isRightButtonDown = false;
|
|||
|
me.getDocumentHolder().fireEvent("editcomplete", me.getDocumentHolder());
|
|||
|
},
|
|||
|
this);
|
|||
|
dlgFilter.setSettings(config);
|
|||
|
dlgFilter.show();
|
|||
|
var dlgCustom = Ext.widget("ssedigitalfilterdialog", {});
|
|||
|
dlgCustom.setSettings(config);
|
|||
|
dlgCustom.addListener("onmodalresult", function (obj, mr, s) {
|
|||
|
if (mr == 1) {
|
|||
|
me.api.asc_applyAutoFilter("digitalFilter", obj.getSettings());
|
|||
|
}
|
|||
|
me.mouse.isLeftButtonDown = me.mouse.isRightButtonDown = false;
|
|||
|
me.getDocumentHolder().fireEvent("editcomplete", me.getDocumentHolder());
|
|||
|
},
|
|||
|
this);
|
|||
|
},
|
|||
|
onCellChanged: function (text, cursorPosition, isFormula, formulaPos, formulaName) {
|
|||
|
if (isFormula && text.length > 1) {
|
|||
|
var menu = this.getDocumentHolder().funcMenu;
|
|||
|
var arr = dlgFormulas.arrayFormula.filter(function (item) {
|
|||
|
return new RegExp("^" + text.substr(1), "i").test(item);
|
|||
|
});
|
|||
|
if (arr && arr.length) {
|
|||
|
var i = -1;
|
|||
|
while (++i < 5) {
|
|||
|
if (arr[i]) {
|
|||
|
menu.items.getAt(i).setText(arr[i]);
|
|||
|
menu.items.getAt(i).show();
|
|||
|
} else {
|
|||
|
menu.items.getAt(i).hide();
|
|||
|
}
|
|||
|
}
|
|||
|
var coord = this.api.asc_getActiveCellCoord();
|
|||
|
var xy = menu.show().getEl().getAlignToXY("editor_sdk", "tl?", [coord.asc_getX(), coord.asc_getY() + coord.asc_getHeight() + 4]);
|
|||
|
menu.showAt(xy);
|
|||
|
}
|
|||
|
}
|
|||
|
console.log("onCellChanged: " + text + ", " + cursorPosition + ", " + isFormula + ", " + formulaPos + ", " + formulaName);
|
|||
|
},
|
|||
|
_onParagraphVAlign: function (item, e) {
|
|||
|
var properties = new Asc.asc_CImgProperty();
|
|||
|
properties.asc_putVerticalTextAlign(item.valign);
|
|||
|
this.api.asc_setGraphicObjectProps(properties);
|
|||
|
},
|
|||
|
_handleAddHyperlink: function (item) {
|
|||
|
var me = this;
|
|||
|
var win, props;
|
|||
|
if (me.api && item) {
|
|||
|
var wc = me.api.asc_getWorksheetsCount(),
|
|||
|
i = -1;
|
|||
|
var items = [];
|
|||
|
while (++i < wc) {
|
|||
|
if (!this.api.asc_isWorksheetHidden(i)) {
|
|||
|
items.push([me.api.asc_getWorksheetName(i)]);
|
|||
|
}
|
|||
|
}
|
|||
|
win = Ext.widget("ssehyperlinksettings", {
|
|||
|
sheets: items
|
|||
|
});
|
|||
|
win.setSettings(item.cellInfo.asc_getHyperlink(), item.cellInfo.asc_getText(), item.cellInfo.asc_getFlags().asc_getLockText());
|
|||
|
}
|
|||
|
if (win) {
|
|||
|
win.addListener("onmodalresult", function (o, mr) {
|
|||
|
if (mr == 1) {
|
|||
|
props = win.getSettings();
|
|||
|
me.api.asc_insertHyperlink(props);
|
|||
|
}
|
|||
|
me.getDocumentHolder().fireEvent("editcomplete", me.getDocumentHolder());
|
|||
|
},
|
|||
|
false);
|
|||
|
win.show();
|
|||
|
}
|
|||
|
},
|
|||
|
_handleRemoveHyperlink: function () {
|
|||
|
if (this.api) {
|
|||
|
this.api.asc_removeHyperlink();
|
|||
|
this.getDocumentHolder().fireEvent("editcomplete", this.getDocumentHolder());
|
|||
|
}
|
|||
|
},
|
|||
|
_handleTextAdvanced: function (item) {
|
|||
|
var me = this;
|
|||
|
var win;
|
|||
|
if (me.api && item) {
|
|||
|
win = Ext.create("SSE.view.ParagraphSettingsAdvanced");
|
|||
|
win.updateMetricUnit();
|
|||
|
win.setSettings({
|
|||
|
paragraphProps: item.textInfo,
|
|||
|
api: me.api
|
|||
|
});
|
|||
|
}
|
|||
|
if (win) {
|
|||
|
win.addListener("onmodalresult", Ext.bind(function (o, mr, s) {
|
|||
|
if (mr == 1 && s) {
|
|||
|
me.api.asc_setGraphicObjectProps(s.paragraphProps);
|
|||
|
}
|
|||
|
},
|
|||
|
me), false);
|
|||
|
win.addListener("close", function () {
|
|||
|
me.getDocumentHolder().fireEvent("editcomplete", me.getDocumentHolder());
|
|||
|
},
|
|||
|
false);
|
|||
|
win.show();
|
|||
|
}
|
|||
|
},
|
|||
|
guestText: "Guest",
|
|||
|
textCtrlClick: "Press CTRL and click link",
|
|||
|
txtRowHeight: "Row Height",
|
|||
|
txtHeight: "Height",
|
|||
|
txtWidth: "Width",
|
|||
|
tipIsLocked: "This element is being edited by another user."
|
|||
|
});
|