/*
* (c) Copyright Ascensio System SIA 2010-2015
*
* This program is a free software product. You can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License (AGPL)
* version 3 as published by the Free Software Foundation. In accordance with
* Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
* that Ascensio System SIA expressly excludes the warranty of non-infringement
* of any third-party rights.
*
* This program is distributed WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
*
* You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia,
* EU, LV-1021.
*
* The interactive user interfaces in modified source and object code versions
* of the Program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU AGPL version 3.
*
* Pursuant to Section 7(b) of the License you must retain the original Product
* logo when distributing the program. Pursuant to Section 7(e) we decline to
* grant you any rights under trademark law for use of our trademarks.
*
* All the Product's GUI elements, including illustrations and icon sets, as
* well as technical writing content are licensed under the terms of the
* Creative Commons Attribution-ShareAlike 4.0 International. See the License
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
*
*/
define(["core", "irregularstack", "common/main/lib/component/Window", "common/main/lib/component/LoadMask", "common/main/lib/component/Tooltip", "common/main/lib/controller/Fonts", "spreadsheeteditor/main/app/collection/ShapeGroups", "spreadsheeteditor/main/app/collection/TableTemplates", "spreadsheeteditor/main/app/controller/FormulaDialog", "spreadsheeteditor/main/app/view/OpenDialog"], function () {
SSE.Controllers.Main = Backbone.Controller.extend(_.extend((function () {
var InitApplication = -254;
var ApplyEditRights = -255;
var LoadingDocument = -256;
var mapCustomizationElements = {
about: "button#left-btn-about",
feedback: "button#left-btn-support",
goback: "#fm-btn-back > a, #header-back > div"
};
return {
models: [],
collections: ["ShapeGroups", "TableTemplates"],
views: [],
initialize: function () {},
onLaunch: function () {
window.asc_CCommentData = window.Asc.asc_CCommentData || window.asc_CCommentData;
window.storagename = "table";
this._state = {};
if (!Common.Utils.isBrowserSupported()) {
Common.Utils.showBrowserRestriction();
Common.Gateway.reportError(undefined, this.unsupportedBrowserErrorText);
return;
} else {}
var value = window.localStorage.getItem("sse-settings-fontrender");
if (value === null) {
value = window.devicePixelRatio > 1 ? "1" : "3";
}
this.api = new Asc.spreadsheet_api("editor_sdk", "ce-cell-content");
this.api.asc_setFontRenderingMode(parseInt(value));
this.api.asc_Init("../../../sdk/Fonts/");
this.api.asc_registerCallback("asc_onOpenDocumentProgress", _.bind(this.onOpenDocument, this));
this.api.asc_registerCallback("asc_onEndAction", _.bind(this.onLongActionEnd, this));
this.api.asc_registerCallback("asc_onError", _.bind(this.onError, this));
this.api.asc_registerCallback("asc_onСoAuthoringDisconnect", _.bind(this.onCoAuthoringDisconnect, this));
this.api.asc_registerCallback("asc_onAdvancedOptions", _.bind(this.onAdvancedOptions, this));
this.api.asc_registerCallback("asc_onDocumentUpdateVersion", _.bind(this.onUpdateVersion, this));
Common.NotificationCenter.on("api:disconnect", _.bind(this.onCoAuthoringDisconnect, this));
this.stackLongActions = new Common.IrregularStack({
strongCompare: this._compareActionStrong,
weakCompare: this._compareActionWeak
});
this.stackLongActions.push({
id: InitApplication,
type: c_oAscAsyncActionType.BlockInteraction
});
this.isShowOpenDialog = false;
this.editorConfig = {};
Common.Gateway.on("init", _.bind(this.loadConfig, this));
Common.Gateway.on("showmessage", _.bind(this.onExternalMessage, this));
Common.Gateway.on("opendocument", _.bind(this.loadDocument, this));
Common.Gateway.on("internalcommand", _.bind(this.onInternalCommand, this));
Common.Gateway.ready();
this.getApplication().getController("Viewport").setApi(this.api);
var me = this;
$(document.body).on("focus", "input, textarea:not(#ce-cell-content)", function (e) {
if (e && e.target && e.target.id && e.target.id === "clipboard-helper-text") {
me.api.asc_enableKeyEvents(true);
return;
}
if (this.isAppDisabled === true) {
return;
}
me.api.asc_enableKeyEvents(false);
});
$("#editor_sdk").focus(function (e) {
if (this.isAppDisabled === true) {
return;
}
if (!me.isModalShowed) {
me.api.asc_enableKeyEvents(true);
}
});
$(document.body).on("blur", "input, textarea", function (e) {
if (this.isAppDisabled === true) {
return;
}
if (!me.isModalShowed) {
me.api.asc_enableKeyEvents(true);
}
});
Common.NotificationCenter.on({
"modal:show": function (e) {
me.isModalShowed = true;
me.api.asc_enableKeyEvents(false);
},
"modal:close": function (dlg) {
if (dlg && dlg.$lastmodal && dlg.$lastmodal.size() < 1) {
me.isModalShowed = false;
me.api.asc_enableKeyEvents(true);
}
},
"modal:hide": function (dlg) {
if (dlg && dlg.$lastmodal && dlg.$lastmodal.size() < 1) {
me.isModalShowed = false;
me.api.asc_enableKeyEvents(true);
}
},
"edit:complete": _.bind(this.onEditComplete, this),
"settings:unitschanged": _.bind(this.unitsChanged, this)
});
this.initNames();
Common.util.Shortcuts.delegateShortcuts({
shortcuts: {
"command+s,ctrl+s": _.bind(function (e) {
e.preventDefault();
e.stopPropagation();
},
this)
}
});
},
loadConfig: function (data) {
this.editorConfig = $.extend(this.editorConfig, data.config);
if ((this.editorConfig.user === undefined || this.editorConfig.user === null)) {
this.editorConfig.user = {};
if (this.editorConfig.users) {
this.editorConfig.userId = this.editorConfig.userId || 0;
for (var i = 0; i < this.editorConfig.users.length; i++) {
if (this.editorConfig.users[i].id === this.editorConfig.userId) {
this.editorConfig.user = {
id: this.editorConfig.users[i].id,
name: this.editorConfig.users[i].username
};
break;
}
}
}
}
this.editorConfig.user.id = this.editorConfig.user.id || ("uid-" + Date.now());
this.editorConfig.user.name = this.editorConfig.user.name || this.textAnonymous;
this.appOptions = {};
this.appOptions.user = this.editorConfig.user;
this.appOptions.canBack = this.editorConfig.nativeApp !== true && this.editorConfig.canBackToFolder === true;
this.appOptions.nativeApp = this.editorConfig.nativeApp === true;
this.appOptions.isDesktopApp = this.editorConfig.targetApp == "desktop";
this.appOptions.canCreateNew = !_.isEmpty(this.editorConfig.createUrl) && !this.appOptions.isDesktopApp;
this.appOptions.canOpenRecent = this.editorConfig.nativeApp !== true && this.editorConfig.recent !== undefined && !this.appOptions.isDesktopApp;
this.appOptions.templates = this.editorConfig.templates;
this.appOptions.recent = this.editorConfig.recent;
this.appOptions.createUrl = this.editorConfig.createUrl;
this.appOptions.lang = this.editorConfig.lang;
this.appOptions.canAutosave = -1;
this.appOptions.canAnalytics = false;
this.appOptions.sharingSettingsUrl = this.editorConfig.sharingSettingsUrl;
this.appOptions.isEditDiagram = this.editorConfig.mode == "editdiagram";
this.appOptions.customization = this.editorConfig.customization;
this.headerView = this.getApplication().getController("Viewport").getView("Common.Views.Header");
this.headerView.setCanBack(this.editorConfig.canBackToFolder === true);
if (this.editorConfig.lang) {
this.api.asc_setLocale(this.editorConfig.lang);
}
},
loadDocument: function (data) {
this.appOptions.spreadsheet = data.doc;
this.permissions = {};
var docInfo = {};
if (data.doc) {
this.permissions = _.extend(this.permissions, data.doc.permissions);
docInfo.Id = data.doc.key;
docInfo.Url = data.doc.url;
docInfo.Title = data.doc.title;
docInfo.Format = data.doc.fileType;
docInfo.Options = data.doc.options;
docInfo.UserId = this.editorConfig.user.id;
docInfo.UserName = this.editorConfig.user.name;
docInfo.VKey = data.doc.vkey;
docInfo.Origin = data.doc.origin;
docInfo.CallbackUrl = this.editorConfig.callbackUrl;
this.headerView.setDocumentCaption(data.doc.title);
}
if (this.appOptions.isEditDiagram) {
this.onEditorPermissions(undefined);
} else {
this.api.asc_registerCallback("asc_onGetEditorPermissions", _.bind(this.onEditorPermissions, this));
this.api.asc_setDocInfo(docInfo);
this.api.asc_getEditorPermissions();
}
},
onProcessSaveResult: function (data) {
this.api.asc_OnSaveEnd(data.result);
if (data && data.result === false) {
Common.UI.error({
title: this.criticalErrorTitle,
msg: _.isEmpty(data.message) ? this.errorProcessSaveResult : data.message
});
}
},
onProcessRightsChange: function (data) {
if (data && data.enabled === false) {
this.api.asc_coAuthoringDisconnect();
this.getApplication().getController("LeftMenu").leftMenu.getMenu("file").panels["rights"].onLostEditRights();
Common.UI.warning({
title: this.notcriticalErrorTitle,
msg: _.isEmpty(data.message) ? this.warnProcessRightsChange : data.message
});
}
},
onProcessMouse: function (data) {
if (data.type == "mouseup") {
var editor = document.getElementById("editor_sdk");
if (editor) {
var rect = editor.getBoundingClientRect();
var event = window.event || arguments.callee.caller.arguments[0];
this.api.asc_onMouseUp(event, data.x - rect.left, data.y - rect.top);
}
}
},
goBack: function () {
Common.Gateway.goBack();
},
onEditComplete: function (cmp, opts) {
if (opts && opts.restorefocus && this.api.isCEditorFocused) {
this.formulaInput.blur();
this.formulaInput.focus();
} else {
this.getApplication().getController("DocumentHolder").getView("DocumentHolder").focus();
this.api.isCEditorFocused = false;
}
},
onLongActionBegin: function (type, id) {
var action = {
id: id,
type: type
};
this.stackLongActions.push(action);
this.setLongActionView(action);
},
onLongActionEnd: function (type, id) {
var action = {
id: id,
type: type
};
this.stackLongActions.pop(action);
this.headerView.setDocumentCaption(this.api.asc_getDocumentName());
this.updateWindowTitle(this.api.asc_isDocumentModified(), true);
if (type === c_oAscAsyncActionType.BlockInteraction && id == c_oAscAsyncAction.Open) {
Common.Gateway.internalMessage("documentReady", {});
this.onDocumentReady();
}
action = this.stackLongActions.get({
type: c_oAscAsyncActionType.Information
});
action && this.setLongActionView(action);
if (id == c_oAscAsyncAction.Save) {
this.toolbarView.synchronizeChanges();
}
action = this.stackLongActions.get({
type: c_oAscAsyncActionType.BlockInteraction
});
if (action) {
this.setLongActionView(action);
} else {
this.loadMask && this.loadMask.hide();
if (type == c_oAscAsyncActionType.BlockInteraction) {
this.onEditComplete(this.loadMask, {
restorefocus: true
});
}
}
},
setLongActionView: function (action) {
var title = "";
switch (action.id) {
case c_oAscAsyncAction.Open:
title = this.openTitleText;
break;
case c_oAscAsyncAction.Save:
title = this.saveTitleText;
break;
case c_oAscAsyncAction.LoadDocumentFonts:
title = this.loadFontsTitleText;
break;
case c_oAscAsyncAction.LoadDocumentImages:
title = this.loadImagesTitleText;
break;
case c_oAscAsyncAction.LoadFont:
title = this.loadFontTitleText;
break;
case c_oAscAsyncAction.LoadImage:
title = this.loadImageTitleText;
break;
case c_oAscAsyncAction.DownloadAs:
title = this.downloadTitleText;
break;
case c_oAscAsyncAction.Print:
title = this.printTitleText;
break;
case c_oAscAsyncAction.UploadImage:
title = this.uploadImageTitleText;
break;
case c_oAscAsyncAction.Recalc:
title = this.titleRecalcFormulas;
break;
case c_oAscAsyncAction.SlowOperation:
title = this.textPleaseWait;
break;
case c_oAscAsyncAction["PrepareToSave"]:
title = this.savePreparingText;
break;
case ApplyEditRights:
title = this.txtEditingMode;
break;
case LoadingDocument:
title = this.loadingDocumentTitleText;
break;
}
if (action.type == c_oAscAsyncActionType.BlockInteraction) { ! this.loadMask && (this.loadMask = new Common.UI.LoadMask({
owner: $("#viewport")
}));
this.loadMask.setTitle(title);
if (!this.isShowOpenDialog) {
this.loadMask.show();
}
}
},
onApplyEditRights: function (data) {
if (data) {
if (data.allowed) {
this.onLongActionBegin(c_oAscAsyncActionType["BlockInteraction"], ApplyEditRights);
this.appOptions.isEdit = true;
var me = this;
setTimeout(function () {
me.applyModeCommonElements();
me.applyModeEditorElements("view");
me.api.asc_setViewerMode(false);
var application = me.getApplication();
var documentHolderController = application.getController("DocumentHolder");
application.getController("LeftMenu").setMode(me.appOptions).createDelayedElements();
Common.NotificationCenter.trigger("layout:changed", "main");
var timer_sl = setInterval(function () {
if (window.styles_loaded) {
clearInterval(timer_sl);
documentHolderController.getView("DocumentHolder").createDelayedElements();
documentHolderController.resetApi();
application.getController("Toolbar").createDelayedElements();
application.getController("RightMenu").createDelayedElements();
application.getController("Statusbar").getView("Statusbar").update();
application.getController("CellEditor").setMode(me.appOptions);
me.api.asc_registerCallback("asc_onInitEditorShapes", _.bind(me.fillAutoShapes, me));
me.api.asc_registerCallback("asc_onSaveUrl", _.bind(me.onSaveUrl, me));
me.api.asc_registerCallback("asc_onDocumentModifiedChanged", _.bind(me.onDocumentModifiedChanged, me));
me.api.asc_registerCallback("asc_onDocumentCanSaveChanged", _.bind(me.onDocumentCanSaveChanged, me));
me.updateThemeColors();
application.getController("FormulaDialog").setApi(me.api);
}
},
50);
},
50);
} else {
Common.UI.info({
title: this.requestEditFailedTitleText,
msg: data.message || this.requestEditFailedMessageText
});
}
}
},
onDocumentReady: function () {
if (this._isDocReady) {
return;
}
var me = this,
value, tips = [];
me._isDocReady = true;
me.hidePreloader();
me.onLongActionEnd(c_oAscAsyncActionType["BlockInteraction"], LoadingDocument);
value = this.appOptions.isEditDiagram ? 100 : window.localStorage.getItem("sse-settings-zoom");
this.api.asc_setZoom(!value ? 1 : parseInt(value) / 100);
value = window.localStorage.getItem("sse-settings-livecomment");
this.isLiveCommenting = !(value !== null && parseInt(value) == 0);
this.isLiveCommenting ? this.api.asc_showComments() : this.api.asc_hideComments();
me.api.asc_registerCallback("asc_onStartAction", _.bind(me.onLongActionBegin, me));
me.api.asc_registerCallback("asc_onConfirmAction", _.bind(me.onConfirmAction, me));
me.api.asc_registerCallback("asc_onActiveSheetChanged", _.bind(me.onActiveSheetChanged, me));
var application = me.getApplication();
me.headerView.setDocumentCaption(me.api.asc_getDocumentName());
me.updateWindowTitle(me.api.asc_isDocumentModified(), true);
var toolbarController = application.getController("Toolbar"),
statusbarController = application.getController("Statusbar"),
documentHolderController = application.getController("DocumentHolder"),
rightmenuController = application.getController("RightMenu"),
leftmenuController = application.getController("LeftMenu"),
celleditorController = application.getController("CellEditor"),
statusbarView = statusbarController.getView("Statusbar"),
leftMenuView = leftmenuController.getView("LeftMenu"),
documentHolderView = documentHolderController.getView("DocumentHolder"),
chatController = application.getController("Common.Controllers.Chat");
leftMenuView.getMenu("file").loadDocument({
doc: me.appOptions.spreadsheet
});
leftmenuController.setMode(me.appOptions).createDelayedElements().setApi(me.api);
leftMenuView.disableMenu("all", false);
if (!me.appOptions.isEditDiagram && me.appOptions.canBranding) {
me.getApplication().getController("LeftMenu").leftMenu.getMenu("about").setLicInfo(me.editorConfig.customization);
}
documentHolderController.setApi(me.api).loadConfig({
config: me.editorConfig
});
celleditorController.setApi(me.api).setMode(this.appOptions);
celleditorController.onApiCellSelection(me.api.asc_getCellInfo());
chatController.setApi(this.api).setMode(this.appOptions);
statusbarController.createDelayedElements();
statusbarController.setApi(me.api);
documentHolderView.setApi(me.api);
statusbarView.update();
this.formulaInput = celleditorController.getView("CellEditor").$el.find("textarea");
if (me.appOptions.isEdit) {
if (me.needToUpdateVersion) {
Common.NotificationCenter.trigger("api:disconnect");
toolbarController.onApiCoAuthoringDisconnect();
}
var timer_sl = setInterval(function () {
if (window.styles_loaded || me.appOptions.isEditDiagram) {
clearInterval(timer_sl);
Common.NotificationCenter.trigger("comments:updatefilter", {
property: "uid",
value: new RegExp("^(doc_|sheet" + me.api.asc_getActiveWorksheetId() + "_)")
});
documentHolderView.createDelayedElements();
toolbarController.createDelayedElements();
rightmenuController.createDelayedElements();
if (!me.appOptions.isEditDiagram) {
me.api.asc_registerCallback("asc_onInitEditorShapes", _.bind(me.fillAutoShapes, me));
me.updateThemeColors();
}
me.api.asc_registerCallback("asc_onSaveUrl", _.bind(me.onSaveUrl, me));
me.api.asc_registerCallback("asc_onDocumentModifiedChanged", _.bind(me.onDocumentModifiedChanged, me));
me.api.asc_registerCallback("asc_onDocumentCanSaveChanged", _.bind(me.onDocumentCanSaveChanged, me));
var formulasDlgController = application.getController("FormulaDialog");
if (formulasDlgController) {
formulasDlgController.setApi(me.api);
}
if (me.needToUpdateVersion) {
toolbarController.onApiCoAuthoringDisconnect();
}
}
},
50);
}
if (me.appOptions.canAutosave) {
value = window.localStorage.getItem("sse-settings-autosave");
value = (value !== null) ? parseInt(value) : 1;
} else {
value = 0;
}
me.api.asc_setAutoSaveGap(value);
if (me.appOptions.canAnalytics) {
Common.component.Analytics.initialize("UA-12442749-13", "Spreadsheet Editor");
}
Common.Gateway.on("applyeditrights", _.bind(me.onApplyEditRights, me));
Common.Gateway.on("processsaveresult", _.bind(me.onProcessSaveResult, me));
Common.Gateway.on("processrightschange", _.bind(me.onProcessRightsChange, me));
Common.Gateway.on("processmouse", _.bind(me.onProcessMouse, me));
$(document).on("contextmenu", _.bind(me.onContextMenu, me));
if ( !! window["AscDesktopEditor"]) {
Common.Utils.isIE9m && tips.push(me.warnBrowserIE9); ! Common.Utils.isGecko && !me.appOptions.isEditDiagram && !me.appOptions.nativeApp && (Math.abs(me.getBrowseZoomLevel() - 1) > 0.1) && tips.push(Common.Utils.String.platformKey(me.warnBrowserZoom, "{0}"));
if (tips.length) {
me.showTips(tips);
}
}
},
onOpenDocument: function (progress) {
var elem = document.getElementById("loadmask-text");
var proc = (progress.CurrentFont + progress.CurrentImage) / (progress.FontsCount + progress.ImagesCount);
proc = this.textLoadingDocument + ": " + Math.round(proc * 100) + "%";
elem ? elem.innerHTML = proc : this.loadMask.setTitle(proc);
},
onEditorPermissions: function (params) {
if (params) {
this.permissions.edit !== false && (this.permissions.edit = params.asc_getCanEdit());
this.permissions.download !== false && (this.permissions.download = params.asc_getCanDownload());
this.appOptions.canAutosave = this.editorConfig.canAutosave !== false && params.asc_getIsAutosaveEnable();
this.appOptions.canAnalytics = params.asc_getIsAnalyticsEnable();
this.appOptions.canCoAuthoring = true;
this.appOptions.canLicense = params.asc_getCanLicense ? params.asc_getCanLicense() : false;
this.appOptions.canComments = this.appOptions.canLicense && !((typeof(this.editorConfig.customization) == "object") && this.editorConfig.customization.comments === false);
this.appOptions.canChat = this.appOptions.canLicense && !((typeof(this.editorConfig.customization) == "object") && this.editorConfig.customization.chat === false);
this.appOptions.canBranding = params.asc_getCanBranding() && (typeof(this.editorConfig.customization) == "object");
if (this.appOptions.canBranding) {
this.headerView.setBranding(this.editorConfig.customization);
}
}
this.appOptions.canEdit = this.permissions.edit === true;
this.appOptions.isEdit = this.permissions.edit === true && this.editorConfig.mode !== "view";
this.appOptions.canDownload = !this.appOptions.nativeApp && (this.permissions.download !== undefined ? this.permissions.download : true);
this.applyModeCommonElements();
this.applyModeEditorElements();
this.api.asc_setViewerMode(!this.appOptions.isEdit);
this.appOptions.isEditDiagram ? this.api.asc_LoadEmptyDocument() : this.api.asc_LoadDocument();
if (!this.appOptions.isEdit) {
this.hidePreloader();
this.onLongActionBegin(c_oAscAsyncActionType.BlockInteraction, LoadingDocument);
}
},
applyModeCommonElements: function () {
window.editor_elements_prepared = true;
var value = window.localStorage.getItem("sse-hidden-title");
value = this.appOptions.isEdit && (value !== null && parseInt(value) == 1);
var app = this.getApplication(),
viewport = app.getController("Viewport").getView("Viewport"),
statusbarView = app.getController("Statusbar").getView("Statusbar");
if (this.headerView) {
this.headerView.setHeaderCaption(this.appOptions.isEdit ? "Spreadsheet Editor" : "Spreadsheet Viewer");
this.headerView.setVisible(!this.appOptions.nativeApp && !value && !this.appOptions.isDesktopApp && !this.appOptions.isEditDiagram);
}
viewport && viewport.setMode(this.appOptions, true);
statusbarView && statusbarView.setMode(this.appOptions);
app.getController("DocumentHolder").setMode(this.appOptions);
if (this.appOptions.isEditDiagram) {
statusbarView.hide();
app.getController("LeftMenu").getView("LeftMenu").hide();
$(window).mouseup(function (e) {
Common.Gateway.internalMessage("processMouse", {
event: "mouse:up"
});
}).mousemove($.proxy(function (e) {
if (this.isDiagramDrag) {
Common.Gateway.internalMessage("processMouse", {
event: "mouse:move",
pagex: e.pageX,
pagey: e.pageY
});
}
},
this));
}
if (this.api) {
var translateChart = new Asc.asc_CChartTranslate();
translateChart.asc_setTitle(this.txtDiagramTitle);
translateChart.asc_setXAxis(this.txtXAxis);
translateChart.asc_setYAxis(this.txtYAxis);
translateChart.asc_setSeries(this.txtSeries);
this.api.asc_setChartTranslate(translateChart);
}
if (!this.appOptions.isEditDiagram) {
this.api.asc_registerCallback("asc_onSendThemeColors", _.bind(this.onSendThemeColors, this));
}
},
applyModeEditorElements: function (prevmode) {
if (this.appOptions.isEdit) {
var me = this,
application = this.getApplication(),
toolbarController = application.getController("Toolbar"),
statusbarController = application.getController("Statusbar"),
rightmenuController = application.getController("RightMenu"),
printController = application.getController("Print"),
commentsController = application.getController("Common.Controllers.Comments"),
fontsControllers = application.getController("Common.Controllers.Fonts");
fontsControllers && fontsControllers.setApi(me.api);
toolbarController && toolbarController.setApi(me.api);
if (commentsController) {
commentsController.setMode(this.appOptions);
commentsController.setConfig({
config: me.editorConfig,
sdkviewname: "#ws-canvas-outer",
hintmode: true
},
me.api);
}
rightmenuController && rightmenuController.setApi(me.api);
printController && printController.setApi(me.api);
if (statusbarController) {
statusbarController.getView("Statusbar").changeViewMode(true);
}
if (prevmode == "view") {
if (commentsController) {
Common.NotificationCenter.trigger("comments:updatefilter", {
property: "uid",
value: new RegExp("^(doc_|sheet" + this.api.asc_getActiveWorksheetId() + "_)")
});
}
}
var viewport = this.getApplication().getController("Viewport").getView("Viewport");
viewport.applyEditorMode();
this.toolbarView = toolbarController.getView("Toolbar");
_.each([this.toolbarView, rightmenuController.getView("RightMenu")], function (view) {
if (view) {
view.setMode(me.appOptions);
view.setApi(me.api);
}
});
if (this.toolbarView) {
this.toolbarView.on("insertimage", _.bind(me.onInsertImage, me));
this.toolbarView.on("insertshape", _.bind(me.onInsertShape, me));
this.toolbarView.on("insertchart", _.bind(me.onInsertChart, me));
}
var value = window.localStorage.getItem("sse-settings-unit");
Common.Utils.Metric.setCurrentMetric((value !== null) ? parseInt(value) : Common.Utils.Metric.c_MetricUnits.cm);
if (!me.appOptions.isEditDiagram) {
var options = {};
JSON.parse(window.localStorage.getItem("sse-hidden-title")) && (options.title = true);
JSON.parse(window.localStorage.getItem("sse-hidden-formula")) && (options.formula = true);
JSON.parse(window.localStorage.getItem("sse-hidden-headings")) && (options.headings = true);
application.getController("Toolbar").hideElements(options);
} else {
rightmenuController.getView("RightMenu").hide();
}
if (me.stackLongActions.exist({
id: ApplyEditRights,
type: c_oAscAsyncActionType["BlockInteraction"]
})) {
me.onLongActionEnd(c_oAscAsyncActionType["BlockInteraction"], ApplyEditRights);
} else {
if (!this._isDocReady) {
me.hidePreloader();
me.onLongActionBegin(c_oAscAsyncActionType["BlockInteraction"], LoadingDocument);
}
}
window.onbeforeunload = _.bind(me.onBeforeUnload, me);
}
},
onExternalMessage: function (msg) {
if (msg) {
var tip = msg.msg.charAt(0).toUpperCase() + msg.msg.substring(1),
title = (msg.severity.indexOf("error") >= 0) ? this.criticalErrorTitle : this.notcriticalErrorTitle;
this.showTips([tip], false, title);
Common.component.Analytics.trackEvent("External Error", msg.title);
}
},
onError: function (id, level, errData) {
this.hidePreloader();
this.onLongActionEnd(c_oAscAsyncActionType.BlockInteraction, LoadingDocument);
var config = {
closable: false
};
switch (id) {
case c_oAscError.ID.Unknown:
config.msg = this.unknownErrorText;
break;
case c_oAscError.ID.ConvertationTimeout:
config.msg = this.convertationTimeoutText;
break;
case c_oAscError.ID.ConvertationError:
config.msg = this.convertationErrorText;
break;
case c_oAscError.ID.DownloadError:
config.msg = this.downloadErrorText;
break;
case c_oAscError.ID.UplImageSize:
config.msg = this.uploadImageSizeMessage;
break;
case c_oAscError.ID.UplImageExt:
config.msg = this.uploadImageExtMessage;
break;
case c_oAscError.ID.UplImageFileCount:
config.msg = this.uploadImageFileCountMessage;
break;
case c_oAscError.ID.PastInMergeAreaError:
config.msg = this.pastInMergeAreaError;
break;
case c_oAscError.ID.FrmlWrongCountParentheses:
config.msg = this.errorWrongBracketsCount;
break;
case c_oAscError.ID.FrmlWrongOperator:
config.msg = this.errorWrongOperator;
break;
case c_oAscError.ID.FrmlWrongMaxArgument:
config.msg = this.errorCountArgExceed;
break;
case c_oAscError.ID.FrmlWrongCountArgument:
config.msg = this.errorCountArg;
break;
case c_oAscError.ID.FrmlWrongFunctionName:
config.msg = this.errorFormulaName;
break;
case c_oAscError.ID.FrmlAnotherParsingError:
config.msg = this.errorFormulaParsing;
break;
case c_oAscError.ID.FrmlWrongArgumentRange:
config.msg = this.errorArgsRange;
break;
case c_oAscError.ID.UnexpectedGuid:
config.msg = this.errorUnexpectedGuid;
break;
case c_oAscError.ID.Database:
config.msg = this.errorDatabaseConnection;
break;
case c_oAscError.ID.FileRequest:
config.msg = this.errorFileRequest;
break;
case c_oAscError.ID.FileVKey:
config.msg = this.errorFileVKey;
break;
case c_oAscError.ID.StockChartError:
config.msg = this.errorStockChart;
break;
case c_oAscError.ID.DataRangeError:
config.msg = this.errorDataRange;
break;
case c_oAscError.ID.FrmlOperandExpected:
config.msg = this.errorOperandExpected;
break;
case c_oAscError.ID.VKeyEncrypt:
config.msg = this.errorKeyEncrypt;
break;
case c_oAscError.ID.KeyExpire:
config.msg = this.errorKeyExpire;
break;
case c_oAscError.ID.UserCountExceed:
config.msg = this.errorUsersExceed;
break;
case c_oAscError.ID.CannotMoveRange:
config.msg = this.errorMoveRange;
break;
case c_oAscError.ID.UplImageUrl:
config.msg = this.errorBadImageUrl;
break;
case c_oAscError.ID.CoAuthoringDisconnect:
config.msg = this.errorCoAuthoringDisconnect;
break;
case c_oAscError.ID.ConvertationPassword:
config.msg = this.errorFilePassProtect;
break;
case c_oAscError.ID.AutoFilterDataRangeError:
config.msg = this.errorAutoFilterDataRange;
break;
case c_oAscError.ID.AutoFilterChangeFormatTableError:
config.msg = this.errorAutoFilterChangeFormatTable;
break;
case c_oAscError.ID.AutoFilterChangeError:
config.msg = this.errorAutoFilterChange;
break;
case c_oAscError.ID.CannotFillRange:
config.msg = this.errorFillRange;
break;
case c_oAscError.ID.UserDrop:
config.msg = this.errorUserDrop;
break;
default:
config.msg = this.errorDefaultMessage.replace("%1", id);
break;
}
if (level == c_oAscError.Level.Critical) {
Common.Gateway.reportError(id, config.msg);
config.title = this.criticalErrorTitle;
config.iconCls = "error";
if (this.editorConfig.canBackToFolder) {
config.msg += "
" + this.criticalErrorExtText;
config.callback = function (btn) {
if (btn == "ok") {
Common.Gateway.goBack();
}
};
}
} else {
config.title = this.notcriticalErrorTitle;
config.iconCls = "warn";
config.buttons = ["ok"];
config.callback = _.bind(function (btn) {
this.onEditComplete();
},
this);
}
if ($(".asc-window.modal.alert:visible").length < 1) {
Common.UI.alert(config);
Common.component.Analytics.trackEvent("Internal Error", id.toString());
}
},
onCoAuthoringDisconnect: function () {
this.getApplication().getController("Viewport").getView("Viewport").setMode({
isDisconnected: true
});
},
getBrowseZoomLevel: function () {
if (Common.Utils.isIE) {
return screen.logicalXDPI / screen.deviceXDPI;
} else {
var zoom = window.outerWidth / document.documentElement.clientWidth;
if (Common.Utils.isSafari) {
zoom = Math.floor(zoom * 10) / 10;
}
return zoom;
}
},
showTips: function (strings, autohide, title) {
var me = this;
if (!strings.length) {
return;
}
if (typeof(strings) != "object") {
strings = [strings];
}
function showNextTip() {
var str_tip = strings.shift();
if (str_tip) {
str_tip += me.textCloseTip;
tooltip.setTitle(str_tip);
tooltip.show();
}
}
if (!this.tooltip) {
this.tooltip = new Common.UI.Tooltip({
owner: this.toolbarView,
hideonclick: true,
placement: "bottom",
cls: "main-info",
offset: 30
});
}
var tooltip = this.tooltip;
tooltip.on("tooltip:hide", function () {
setTimeout(showNextTip, 300);
});
showNextTip();
},
updateWindowTitle: function (change, force) {
if (this._state.isDocModified !== change || force) {
var title = this.defaultTitleText;
if (!_.isEmpty(this.headerView.getDocumentCaption())) {
title = this.headerView.getDocumentCaption() + " - " + title;
}
if (change) {
if (!_.isUndefined(title)) {
title = "* " + title;
this.headerView.setDocumentCaption(this.headerView.getDocumentCaption() + "*", true);
}
} else {
this.headerView.setDocumentCaption(this.headerView.getDocumentCaption());
}
if (window.document.title != title) {
window.document.title = title;
}
this._state.isDocModified = change;
}
},
onDocumentChanged: function () {},
onDocumentModifiedChanged: function (change) {
this.updateWindowTitle(change);
Common.Gateway.setDocumentModified(change);
if (this.toolbarView && this.api) {
var isSyncButton = $(".btn-icon", this.toolbarView.btnSave.cmpEl).hasClass("btn-synch");
var cansave = this.api.asc_isDocumentCanSave();
if (this.toolbarView.btnSave.isDisabled() !== (!cansave && !isSyncButton)) {
this.toolbarView.btnSave.setDisabled(!cansave);
}
}
},
onDocumentCanSaveChanged: function (isCanSave) {
if (this.toolbarView) {
var isSyncButton = $(".btn-icon", this.toolbarView.btnSave.cmpEl).hasClass("btn-synch");
if (this.toolbarView.btnSave.isDisabled() !== (!isCanSave && !isSyncButton)) {
this.toolbarView.btnSave.setDisabled(!isCanSave && !isSyncButton);
}
}
},
onBeforeUnload: function () {
var isEdit = this.permissions.edit === true && this.editorConfig.mode !== "view" && this.editorConfig.mode !== "editdiagram";
if (isEdit && this.api.asc_isDocumentModified()) {
return this.leavePageText;
}
},
hidePreloader: function () {
if ( !! this.appOptions.customization && !this.appOptions.customization.done) {
this.appOptions.customization.done = true;
Common.Utils.applyCustomization(this.appOptions.customization, mapCustomizationElements);
}
this.stackLongActions.pop({
id: InitApplication,
type: c_oAscAsyncActionType.BlockInteraction
});
Common.NotificationCenter.trigger("layout:changed", "main");
$("#loading-mask").hide().remove();
},
onSaveUrl: function (url) {
Common.Gateway.save(url);
},
onUpdateVersion: function (callback) {
var me = this;
me.needToUpdateVersion = true;
me.onLongActionEnd(c_oAscAsyncActionType["BlockInteraction"], LoadingDocument);
Common.UI.error({
msg: this.errorUpdateVersion,
callback: function () {
_.defer(function () {
Common.Gateway.updateVersion();
if (callback) {
callback.call(me);
}
me.onLongActionBegin(c_oAscAsyncActionType["BlockInteraction"], LoadingDocument);
});
}
});
},
onAdvancedOptions: function (advOptions) {
if (advOptions.asc_getOptionId() == c_oAscAdvancedOptionsID.CSV) {
var me = this;
var dlg = new SSE.Views.OpenDialog({
codepages: advOptions.asc_getOptions().asc_getCodePages(),
settings: advOptions.asc_getOptions().asc_getRecommendedSettings(),
handler: function (encoding, delimiter) {
me.isShowOpenDialog = false;
if (me && me.api) {
me.api.asc_setAdvancedOptions(c_oAscAdvancedOptionsID.CSV, new Asc.asc_CCSVAdvancedOptions(encoding, delimiter));
me.loadMask && me.loadMask.show();
}
}
});
this.isShowOpenDialog = true;
this.loadMask && this.loadMask.hide();
this.onLongActionEnd(c_oAscAsyncActionType.BlockInteraction, LoadingDocument);
dlg.show();
}
},
onActiveSheetChanged: function (index) {
if (!this.appOptions.isEditDiagram && window.editor_elements_prepared) {
this.application.getController("Statusbar").selectTab(index);
if (this.appOptions.isEdit) {
Common.NotificationCenter.trigger("comments:updatefilter", {
property: "uid",
value: new RegExp("^(doc_|sheet" + this.api.asc_getWorksheetId(index) + "_)")
},
false);
}
}
},
onConfirmAction: function (id, apiCallback) {
if (id == c_oAscConfirm.ConfirmReplaceRange) {
var me = this;
Common.UI.warning({
closable: false,
title: this.notcriticalErrorTitle,
msg: this.confirmMoveCellRange,
buttons: ["yes", "no"],
callback: _.bind(function (btn) {
if (apiCallback) {
apiCallback(btn === "ok");
}
if (btn == "ok") {
me.onEditComplete(me.application.getController("DocumentHolder").getView("DocumentHolder"));
}
},
this)
});
}
},
initNames: function () {
this.shapeGroupNames = [this.txtBasicShapes, this.txtFiguredArrows, this.txtMath, this.txtCharts, this.txtStarsRibbons, this.txtCallouts, this.txtButtons, this.txtRectangles, this.txtLines];
},
fillAutoShapes: function (groupNames, shapes) {
if (_.isEmpty(shapes) || _.isEmpty(groupNames) || shapes.length != groupNames.length) {
return;
}
var me = this,
shapegrouparray = [],
shapeStore = this.getCollection("ShapeGroups");
shapeStore.reset();
var groupscount = groupNames.length;
_.each(groupNames, function (groupName, index) {
var store = new Backbone.Collection([], {
model: SSE.Models.ShapeModel
});
var cols = (shapes[index].length) > 18 ? 7 : 6,
height = Math.ceil(shapes[index].length / cols) * 35 + 3,
width = 30 * cols;
_.each(shapes[index], function (shape, idx) {
store.add({
imageUrl: shape.Image,
data: {
shapeType: shape.Type
},
tip: me.textShape + " " + (idx + 1),
allowSelected: false,
selected: false
});
});
shapegrouparray.push({
groupName: me.shapeGroupNames[index],
groupStore: store,
groupWidth: width,
groupHeight: height
});
});
if (groupscount > 0) {
var store = new Backbone.Collection([], {
model: SSE.Models.ShapeModel
});
var cols = (shapes[groupscount - 1].length - 3) > 18 ? 7 : 6,
height = Math.ceil((shapes[groupscount - 1].length - 3) / cols) * 35 + 3,
width = 30 * cols;
for (var i = 0; i < shapes[groupscount - 1].length - 3; i++) {
var shape = shapes[groupscount - 1][i];
store.add({
imageUrl: shape.Image,
data: {
shapeType: shape.Type
},
allowSelected: false,
selected: false
});
}
shapegrouparray.push({
groupName: me.shapeGroupNames[groupscount - 1],
groupStore: store,
groupWidth: width,
groupHeight: height
});
}
shapeStore.add(shapegrouparray);
setTimeout(function () {
me.getApplication().getController("Toolbar").fillAutoShapes();
},
50);
},
updateThemeColors: function () {
var me = this;
setTimeout(function () {
me.getApplication().getController("RightMenu").UpdateThemeColors();
},
50);
setTimeout(function () {
me.getApplication().getController("Toolbar").updateThemeColors();
},
50);
setTimeout(function () {
me.getApplication().getController("Statusbar").updateThemeColors();
},
50);
},
onSendThemeColors: function (colors, standart_colors) {
Common.Utils.ThemeColor.setColors(colors, standart_colors);
if (window.styles_loaded && !this.appOptions.isEditDiagram) {
this.updateThemeColors();
}
},
loadLanguages: function () {},
onInsertImage: function () {
this.getApplication().getController("RightMenu").onInsertImage();
},
onInsertChart: function () {
this.getApplication().getController("RightMenu").onInsertChart();
},
onInsertShape: function () {
this.getApplication().getController("RightMenu").onInsertShape();
},
onInternalCommand: function (data) {
if (data) {
switch (data.command) {
case "setChartData":
this.setChartData(data.data);
break;
case "getChartData":
this.getChartData();
break;
case "clearChartData":
this.clearChartData();
break;
case "setAppDisabled":
this.isAppDisabled = data.data;
this.api.asc_enableKeyEvents(false);
break;
case "queryClose":
if ($("body .asc-window:visible").length === 0) {
Common.Gateway.internalMessage("canClose", {
mr: data.data.mr,
answer: true
});
}
break;
case "window:drag":
this.isDiagramDrag = data.data;
break;
case "processmouse":
this.onProcessMouse(data.data);
break;
}
}
},
setChartData: function (chart) {
if (typeof chart === "object" && this.api) {
this.api.asc_addChartDrawingObject(chart);
}
},
getChartData: function () {
if (this.api) {
var chartData = this.api.asc_getWordChartObject();
if (typeof chartData === "object") {
Common.Gateway.internalMessage("chartData", {
data: chartData
});
}
}
},
clearChartData: function () {
this.api && this.api.asc_cleanWorksheet();
},
unitsChanged: function (m) {
var value = window.localStorage.getItem("sse-settings-unit");
Common.Utils.Metric.setCurrentMetric((value !== null) ? parseInt(value) : Common.Utils.Metric.c_MetricUnits.cm);
this.getApplication().getController("RightMenu").updateMetricUnit();
this.getApplication().getController("Print").getView("MainSettingsPrint").updateMetricUnit();
},
_compareActionStrong: function (obj1, obj2) {
return obj1.id === obj2.id && obj1.type === obj2.type;
},
_compareActionWeak: function (obj1, obj2) {
return obj1.type === obj2.type;
},
onContextMenu: function (event) {
var canCopyAttr = event.target.getAttribute("data-can-copy"),
isInputEl = (event.target instanceof HTMLInputElement) || (event.target instanceof HTMLTextAreaElement);
if ((isInputEl && canCopyAttr === "false") || (!isInputEl && canCopyAttr !== "true")) {
event.stopPropagation();
event.preventDefault();
return false;
}
},
leavePageText: "You have unsaved changes in this document. Click 'Stay on this Page' then 'Save' to save them. Click 'Leave this Page' to discard all the unsaved changes.",
criticalErrorTitle: "Error",
notcriticalErrorTitle: "Warning",
errorDefaultMessage: "Error code: %1",
criticalErrorExtText: 'Press "Ok" to to back to document list.',
openTitleText: "Opening Document",
openTextText: "Opening document...",
saveTitleText: "Saving Document",
saveTextText: "Saving document...",
loadFontsTitleText: "Loading Data",
loadFontsTextText: "Loading data...",
loadImagesTitleText: "Loading Images",
loadImagesTextText: "Loading images...",
loadFontTitleText: "Loading Data",
loadFontTextText: "Loading data...",
loadImageTitleText: "Loading Image",
loadImageTextText: "Loading image...",
downloadTitleText: "Downloading Document",
downloadTextText: "Downloading document...",
printTitleText: "Printing Document",
printTextText: "Printing document...",
uploadImageTitleText: "Uploading Image",
uploadImageTextText: "Uploading image...",
savePreparingText: "Preparing to save",
savePreparingTitle: "Preparing to save. Please wait...",
loadingDocumentTitleText: "Loading Document",
uploadImageSizeMessage: "Maximium image size limit exceeded.",
uploadImageExtMessage: "Unknown image format.",
uploadImageFileCountMessage: "No images uploaded.",
reloadButtonText: "Reload Page",
unknownErrorText: "Unknown error.",
convertationTimeoutText: "Convertation timeout exceeded.",
convertationErrorText: "Convertation failed.",
downloadErrorText: "Download failed.",
unsupportedBrowserErrorText: "Your browser is not supported.",
requestEditFailedTitleText: "Access denied",
requestEditFailedMessageText: "Someone is editing this document right now. Please try again later.",
warnBrowserZoom: "Your browser's current zoom setting is not fully supported. Please reset to the default zoom by pressing Ctrl+0.",
warnBrowserIE9: "The application has low capabilities on IE9. Use IE10 or higher",
pastInMergeAreaError: "Cannot change part of a merged cell",
titleRecalcFormulas: "Calculating formulas...",
textRecalcFormulas: "Calculating formulas...",
textPleaseWait: "It's working hard. Please wait...",
errorWrongBracketsCount: "Found an error in the formula entered.
Wrong cout of brackets.",
errorWrongOperator: "Found an error in the formula entered.
Wrong operator.",
errorCountArgExceed: "Found an error in the formula entered.
Count of arguments exceeded.",
errorCountArg: "Found an error in the formula entered.
Invalid number of arguments.",
errorFormulaName: "Found an error in the formula entered.
Incorrect formula name.",
errorFormulaParsing: "Internal error while the formula parsing.",
errorArgsRange: "Found an error in the formula entered.
Incorrect arguments range.",
errorUnexpectedGuid: "External error.
Unexpected Guid. Please, contact support.",
errorDatabaseConnection: "External error.
Database connection error. Please, contact support.",
errorFileRequest: "External error.
File Request. Please, contact support.",
errorFileVKey: "External error.
Incorrect securety key. Please, contact support.",
errorStockChart: "Incorrect row order. To build a stock chart place the data on the sheet in the following order:
opening price, max price, min price, closing price.",
errorDataRange: "Incorrect data range.",
errorOperandExpected: "Operand expected",
errorKeyEncrypt: "Unknown key descriptor",
errorKeyExpire: "Key descriptor expired",
errorUsersExceed: "Count of users was exceed",
errorMoveRange: "Cann't change a part of merged cell",
errorBadImageUrl: "Image url is incorrect",
errorCoAuthoringDisconnect: "Server connection lost. You can't edit anymore.",
errorFilePassProtect: "The document is password protected.",
txtEditingMode: "Set editing mode...",
textLoadingDocument: "LOADING DOCUMENT",
textConfirm: "Confirmation",
confirmMoveCellRange: "The destination cell's range can contain data. Continue the operation?",
textYes : "Yes",
textNo: "No",
textAnonymous: "Anonymous",
txtBasicShapes: "Basic Shapes",
txtFiguredArrows: "Figured Arrows",
txtMath: "Math",
txtCharts: "Charts",
txtStarsRibbons: "Stars & Ribbons",
txtCallouts: "Callouts",
txtButtons: "Buttons",
txtRectangles: "Rectangles",
txtLines: "Lines",
txtDiagramTitle: "Diagram Title",
txtXAxis: "X Axis",
txtYAxis: "Y Axis",
txtSeries: "Seria",
warnProcessRightsChange: "You have been denied the right to edit the file.",
errorProcessSaveResult: "Saving is failed.",
errorAutoFilterDataRange: "The operation could not be done for the selected range of cells.
Select a uniform data range inside or outside the table and try again.",
errorAutoFilterChangeFormatTable: "The operation could not be done for the selected cells as you cannot move a part of the table.
Select another data range so that the whole table was shifted and try again.",
errorAutoFilterChange: "The operation is not allowed, as it is attempting to shift cells in a table on your worksheet.",
textCloseTip: "\nClick to close the tip.",
textShape: "Shape",
errorFillRange: "Could not fill the selected range of cells.
All the merged cells need to be the same size.",
errorUpdateVersion: "The file version has been changed. The page will be reloaded.",
defaultTitleText: "ONLYOFFICE Spreadsheet Editor",
errorUserDrop: "The file cannot be accessed right now."
};
})(), SSE.Controllers.Main || {}));
});