/* * * (c) Copyright Ascensio System Limited 2010-2016 * * 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 * */ /** * Toolbar.js * * Created by Alexander Yuzhin on 3/31/14 * Copyright (c) 2014 Ascensio System SIA. All rights reserved. * */ define([ 'core', 'common/main/lib/component/Window', 'common/main/lib/view/CopyWarningDialog', 'common/main/lib/view/ImageFromUrlDialog', 'spreadsheeteditor/main/app/view/Toolbar', 'spreadsheeteditor/main/app/collection/TableTemplates', 'spreadsheeteditor/main/app/view/HyperlinkSettingsDialog', 'spreadsheeteditor/main/app/view/TableOptionsDialog', 'spreadsheeteditor/main/app/view/NamedRangeEditDlg', 'spreadsheeteditor/main/app/view/NamedRangePasteDlg', 'spreadsheeteditor/main/app/view/NameManagerDlg' ], function () { 'use strict'; SSE.Controllers.Toolbar = Backbone.Controller.extend(_.extend({ models: [], collections: [], views: [ 'Toolbar' ], initialize: function() { var me = this; this.addListeners({ 'Statusbar': { 'sheet:changed': _.bind(this.onApiSheetChanged, this) }, 'LeftMenu': { 'settings:apply': _.bind(this.applyFormulaSettings, this) } }); this.editMode = true; this._isAddingShape = false; this._state = { prstyle: undefined, clrtext: undefined, pralign: undefined, clrback: undefined, valign: undefined, can_undo: undefined, can_redo: undefined, bold: undefined, italic: undefined, underline: undefined, wrap: undefined, merge: undefined, filter: undefined, angle: undefined, controlsdisabled: { rows: undefined, cols: undefined, cells_right: undefined, cells_down: undefined, filters: undefined }, selection_type: undefined, tablestylename: undefined, tablename: undefined, namedrange_locked: false, fontsize: undefined }; var checkInsertAutoshape = function(e, action) { var cmp = $(e.target), cmp_sdk = cmp.closest('#editor_sdk'), btn_id = cmp.closest('button').attr('id'); if (btn_id===undefined) btn_id = cmp.closest('.btn-group').attr('id'); if (me.api && me.api.asc_isAddAutoshape() ) { if (cmp_sdk.length <=0 || action == 'cancel') { if ( me.toolbar.btnInsertText.pressed && btn_id != me.toolbar.btnInsertText.id || me.toolbar.btnInsertShape.pressed && btn_id != me.toolbar.btnInsertShape.id ) { me._isAddingShape = false; me._addAutoshape(false); me.toolbar.btnInsertShape.toggle(false, true); me.toolbar.btnInsertText.toggle(false, true); Common.NotificationCenter.trigger('edit:complete', me.toolbar); } else if ( me.toolbar.btnInsertShape.pressed && btn_id == me.toolbar.btnInsertShape.id) { _.defer(function(){ me.api.asc_endAddShape(); Common.NotificationCenter.trigger('edit:complete', me.toolbar); }, 100); } } } }; this.checkInsertAutoshape = function(cmp) { checkInsertAutoshape({}, cmp.action); }; this._addAutoshape = function(isstart, type) { if (this.api) { if (isstart) { this.api.asc_startAddShape(type); $(document.body).on('mouseup', checkInsertAutoshape); } else { this.api.asc_endAddShape(); $(document.body).off('mouseup', checkInsertAutoshape); } } }; this.onApiEndAddShape = function() { if (this.toolbar.btnInsertShape.pressed) this.toolbar.btnInsertShape.toggle(false, true); if (this.toolbar.btnInsertText.pressed) this.toolbar.btnInsertText.toggle(false, true); $(document.body).off('mouseup', checkInsertAutoshape); }; }, onLaunch: function() { // Create toolbar view this.toolbar = this.createView('Toolbar'); this.toolbar.on('render:after', _.bind(this.onToolbarAfterRender, this)); }, onToolbarAfterRender: function(toolbar) { var me = this; /** * UI Events */ toolbar.btnNewDocument.on('click', _.bind(this.onNewDocument, this)); toolbar.btnOpenDocument.on('click', _.bind(this.onOpenDocument, this)); toolbar.btnPrint.on('click', _.bind(this.onPrint, this)); toolbar.btnSave.on('click', _.bind(this.onSave, this)); toolbar.btnUndo.on('click', _.bind(this.onUndo, this)); toolbar.btnRedo.on('click', _.bind(this.onRedo, this)); toolbar.btnCopy.on('click', _.bind(this.onCopyPaste, this, true)); toolbar.btnPaste.on('click', _.bind(this.onCopyPaste, this, false)); toolbar.btnIncFontSize.on('click', _.bind(this.onIncreaseFontSize, this)); toolbar.btnDecFontSize.on('click', _.bind(this.onDecreaseFontSize, this)); toolbar.btnBold.on('click', _.bind(this.onBold, this)); toolbar.btnItalic.on('click', _.bind(this.onItalic, this)); toolbar.btnUnderline.on('click', _.bind(this.onUnderline, this)); toolbar.btnTextColor.on('click', _.bind(this.onTextColor, this)); toolbar.btnBackColor.on('click', _.bind(this.onBackColor, this)); toolbar.mnuTextColorPicker.on('select', _.bind(this.onTextColorSelect, this)); toolbar.mnuBackColorPicker.on('select', _.bind(this.onBackColorSelect, this)); toolbar.btnBorders.on('click', _.bind(this.onBorders, this)); toolbar.btnBorders.menu.on('item:click', _.bind(this.onBordersMenu, this)); toolbar.mnuBorderWidth.on('item:toggle', _.bind(this.onBordersWidth, this)); toolbar.mnuBorderColorPicker.on('select', _.bind(this.onBordersColor, this)); toolbar.btnAlignLeft.on('click', _.bind(this.onHorizontalAlign, this, 'left')); toolbar.btnAlignCenter.on('click', _.bind(this.onHorizontalAlign, this, 'center')); toolbar.btnAlignRight.on('click', _.bind(this.onHorizontalAlign, this, 'right')); toolbar.btnAlignJust.on('click', _.bind(this.onHorizontalAlign, this, 'justify')); toolbar.btnHorizontalAlign.menu.on('item:click', _.bind(this.onHorizontalAlignMenu, this)); toolbar.btnVerticalAlign.menu.on('item:click', _.bind(this.onVerticalAlignMenu, this)); toolbar.btnMerge.on('click', _.bind(this.onMergeCellsMenu, this, toolbar.btnMerge.menu, toolbar.btnMerge.menu.items[0])); toolbar.btnMerge.menu.on('item:click', _.bind(this.onMergeCellsMenu, this)); toolbar.btnAlignTop.on('click', _.bind(this.onVerticalAlign, this, 'top')); toolbar.btnAlignMiddle.on('click', _.bind(this.onVerticalAlign, this, 'center')); toolbar.btnAlignBottom.on('click', _.bind(this.onVerticalAlign, this, 'bottom')); toolbar.btnWrap.on('click', _.bind(this.onWrap, this)); toolbar.btnTextOrient.menu.on('item:click', _.bind(this.onTextOrientationMenu, this)); toolbar.btnInsertImage.menu.on('item:click', _.bind(this.onInsertImageMenu, this)); toolbar.btnInsertHyperlink.on('click', _.bind(this.onHyperlink, this)); toolbar.btnInsertChart.on('click', _.bind(this.onInsertChart, this)); toolbar.btnEditChart.on('click', _.bind(this.onInsertChart, this)); toolbar.btnInsertText.on('click', _.bind(this.onBtnInsertTextClick, this)); toolbar.btnInsertText.menu.on('item:click', _.bind(this.onInsertTextClick, this)); toolbar.btnInsertShape.menu.on('hide:after', _.bind(this.onInsertShapeHide, this)); toolbar.btnSortDown.on('click', _.bind(this.onSortType, this, 'ascending')); toolbar.btnSortUp.on('click', _.bind(this.onSortType, this, 'descending')); toolbar.mnuitemSortAZ.on('click', _.bind(this.onSortType, this, 'ascending')); toolbar.mnuitemSortZA.on('click', _.bind(this.onSortType, this, 'descending')); toolbar.btnSetAutofilter.on('click', _.bind(this.onAutoFilter, this)); toolbar.mnuitemAutoFilter.on('click', _.bind(this.onAutoFilter, this)); toolbar.btnClearAutofilter.on('click', _.bind(this.onClearFilter, this)); toolbar.mnuitemClearFilter.on('click', _.bind(this.onClearFilter, this)); toolbar.btnSearch.on('click', _.bind(this.onSearch, this)); toolbar.btnTableTemplate.menu.on('show:after', _.bind(this.onTableTplMenuOpen, this)); toolbar.btnPercentStyle.on('click', _.bind(this.onNumberFormat, this)); toolbar.btnCurrencyStyle.on('click', _.bind(this.onNumberFormat, this)); toolbar.btnDecDecimal.on('click', _.bind(this.onDecrement, this)); toolbar.btnIncDecimal.on('click', _.bind(this.onIncrement, this)); toolbar.btnInsertFormula.on('click', _.bind(this.onInsertFormulaMenu, this)); toolbar.btnSettings.on('click', _.bind(this.onAdvSettingsClick, this)); toolbar.btnInsertFormula.menu.on('item:click', _.bind(this.onInsertFormulaMenu, this)); toolbar.btnNamedRange.menu.on('item:click', _.bind(this.onNamedRangeMenu, this)); toolbar.btnNamedRange.menu.on('show:after', _.bind(this.onNamedRangeMenuOpen, this)); toolbar.btnClearStyle.menu.on('item:click', _.bind(this.onClearStyleMenu, this)); toolbar.btnAddCell.menu.on('item:click', _.bind(this.onCellInsertMenu, this)); toolbar.btnCopyStyle.on('toggle', _.bind(this.onCopyStyleToggle, this)); toolbar.btnDeleteCell.menu.on('item:click', _.bind(this.onCellDeleteMenu, this)); toolbar.btnColorSchemas.menu.on('item:click', _.bind(this.onColorSchemaClick, this)); toolbar.cmbFontName.on('selected', _.bind(this.onFontNameSelect, this)); toolbar.cmbFontName.on('show:after', _.bind(this.onComboOpen, this, true)); toolbar.cmbFontName.on('hide:after', _.bind(this.onHideMenus, this)); toolbar.cmbFontName.on('combo:blur', _.bind(this.onComboBlur, this)); toolbar.cmbFontName.on('combo:focusin', _.bind(this.onComboOpen, this, false)); toolbar.cmbFontSize.on('selected', _.bind(this.onFontSizeSelect, this)); toolbar.cmbFontSize.on('changed:before', _.bind(this.onFontSizeChanged, this, true)); toolbar.cmbFontSize.on('changed:after', _.bind(this.onFontSizeChanged, this, false)); toolbar.cmbFontSize.on('show:after', _.bind(this.onComboOpen, this, true)); toolbar.cmbFontSize.on('hide:after', _.bind(this.onHideMenus, this)); toolbar.cmbFontSize.on('combo:blur', _.bind(this.onComboBlur, this)); toolbar.cmbFontSize.on('combo:focusin', _.bind(this.onComboOpen, this, false)); if (toolbar.mnuZoomIn) toolbar.mnuZoomIn.on('click', _.bind(this.onZoomInClick, this)); if (toolbar.mnuZoomOut) toolbar.mnuZoomOut.on('click', _.bind(this.onZoomOutClick, this)); toolbar.btnShowMode.menu.on('item:click', _.bind(this.onHideMenu, this)); toolbar.listStyles.on('click', _.bind(this.onListStyleSelect, this)); toolbar.btnNumberFormat.menu.on('item:click', _.bind(this.onNumberFormatMenu, this)); toolbar.btnCurrencyStyle.menu.on('item:click', _.bind(this.onNumberFormatMenu, this)); toolbar.mnuitemCompactToolbar.on('toggle', _.bind(this.onChangeViewMode, this)); $('#id-toolbar-menu-new-fontcolor').on('click', _.bind(this.onNewTextColor, this)); $('#id-toolbar-menu-new-paracolor').on('click', _.bind(this.onNewBackColor, this)); $('#id-toolbar-menu-new-bordercolor').on('click', _.bind(this.onNewBorderColor, this)); _.each(toolbar.btnNumberFormat.menu.items, function(item) { if (item.menu) { item.menu.on('item:click', _.bind(me.onNumberFormatMenu, me)); } }); this.onSetupCopyStyleButton(); }, setApi: function(api) { this.api = api; this.api.asc_registerCallback('asc_onInitTablePictures', _.bind(this.onApiInitTableTemplates, this)); this.api.asc_registerCallback('asc_onInitEditorStyles', _.bind(this.onApiInitEditorStyles, this)); this.api.asc_registerCallback('asc_onCoAuthoringDisconnect',_.bind(this.onApiCoAuthoringDisconnect, this)); Common.NotificationCenter.on('api:disconnect', _.bind(this.onApiCoAuthoringDisconnect, this)); this.api.asc_registerCallback('asc_onLockDefNameManager', _.bind(this.onLockDefNameManager, this)); }, onNewDocument: function(btn, e) { if (this.api) this.api.asc_openNewDocument(); Common.NotificationCenter.trigger('edit:complete', this.toolbar); Common.component.Analytics.trackEvent('ToolBar', 'New Document'); }, onOpenDocument: function(btn, e) { if (this.api) this.api.asc_loadDocumentFromDisk(); Common.NotificationCenter.trigger('edit:complete', this.toolbar); Common.component.Analytics.trackEvent('ToolBar', 'Open Document'); }, onPrint: function(e) { Common.NotificationCenter.trigger('print', this.toolbar); }, onSave: function(e) { if (this.api) { var isModified = this.api.asc_isDocumentCanSave(); var isSyncButton = $('.btn-icon', this.toolbar.btnSave.cmpEl).hasClass('btn-synch'); if (!isModified && !isSyncButton) return; this.api.asc_Save(); } // Common.NotificationCenter.trigger('edit:complete', this.toolbar); Common.component.Analytics.trackEvent('Save'); Common.component.Analytics.trackEvent('ToolBar', 'Save'); }, onUndo: function(btn, e) { if (this.api) this.api.asc_Undo(); Common.NotificationCenter.trigger('edit:complete', this.toolbar); Common.component.Analytics.trackEvent('ToolBar', 'Undo'); }, onRedo: function(btn, e) { if (this.api) this.api.asc_Redo(); Common.NotificationCenter.trigger('edit:complete', this.toolbar); Common.component.Analytics.trackEvent('ToolBar', 'Redo'); }, onCopyPaste: function(copy, e) { var me = this; if (me.api) { if (typeof window['AscDesktopEditor'] === 'object') { copy ? me.api.asc_Copy() : me.api.asc_Paste(); Common.NotificationCenter.trigger('edit:complete', me.toolbar); } else { var value = Common.localStorage.getItem("sse-hide-copywarning"); if (!(value && parseInt(value) == 1)) { (new Common.Views.CopyWarningDialog({ handler: function(dontshow) { copy ? me.api.asc_Copy() : me.api.asc_Paste(); if (dontshow) Common.localStorage.setItem("sse-hide-copywarning", 1); Common.NotificationCenter.trigger('edit:complete', me.toolbar); } })).show(); } else { copy ? me.api.asc_Copy() : me.api.asc_Paste(); Common.NotificationCenter.trigger('edit:complete', me.toolbar); } } Common.component.Analytics.trackEvent('ToolBar', 'Copy Warning'); } else { Common.NotificationCenter.trigger('edit:complete', me.toolbar); } }, onIncreaseFontSize: function(e) { if (this.api) this.api.asc_increaseFontSize(); Common.NotificationCenter.trigger('edit:complete', this.toolbar, {restorefocus:true}); Common.component.Analytics.trackEvent('ToolBar', 'Font Size'); }, onDecreaseFontSize: function(e) { if (this.api) this.api.asc_decreaseFontSize(); Common.NotificationCenter.trigger('edit:complete', this.toolbar, {restorefocus:true}); Common.component.Analytics.trackEvent('ToolBar', 'Font Size'); }, onBold: function(btn, e) { this._state.bold = undefined; if (this.api) this.api.asc_setCellBold(btn.pressed); Common.NotificationCenter.trigger('edit:complete', this.toolbar, {restorefocus:true}); Common.component.Analytics.trackEvent('ToolBar', 'Bold'); }, onItalic: function(btn, e) { this._state.italic = undefined; if (this.api) this.api.asc_setCellItalic(btn.pressed); Common.NotificationCenter.trigger('edit:complete', this.toolbar, {restorefocus:true}); Common.component.Analytics.trackEvent('ToolBar', 'Italic'); }, onUnderline: function(btn, e) { this._state.underline = undefined; if (this.api) this.api.asc_setCellUnderline(btn.pressed); Common.NotificationCenter.trigger('edit:complete', this.toolbar, {restorefocus:true}); Common.component.Analytics.trackEvent('ToolBar', 'Underline'); }, onTextColor: function() { this.toolbar.mnuTextColorPicker.trigger('select', this.toolbar.mnuTextColorPicker, this.toolbar.mnuTextColorPicker.currentColor, true); }, onBackColor: function() { this.toolbar.mnuBackColorPicker.trigger('select', this.toolbar.mnuBackColorPicker, this.toolbar.mnuBackColorPicker.currentColor, true); }, onTextColorSelect: function(picker, color, fromBtn) { this._state.clrtext_asccolor = this._state.clrtext = undefined; var clr = (typeof(color) == 'object') ? color.color : color; this.toolbar.btnTextColor.currentColor = color; $('.btn-color-value-line', this.toolbar.btnTextColor.cmpEl).css('background-color', '#' + clr); this.toolbar.mnuTextColorPicker.currentColor = color; if (this.api) { this.toolbar.btnTextColor.ischanged = (fromBtn!==true); this.api.asc_setCellTextColor(Common.Utils.ThemeColor.getRgbColor(color)); this.toolbar.btnTextColor.ischanged = false; } Common.NotificationCenter.trigger('edit:complete', this.toolbar, {restorefocus:true}); Common.component.Analytics.trackEvent('ToolBar', 'Text Color'); }, onBackColorSelect: function(picker, color, fromBtn) { this._state.clrshd_asccolor = this._state.clrback = undefined; var clr = (typeof(color) == 'object') ? color.color : color; this.toolbar.btnBackColor.currentColor = color; $('.btn-color-value-line', this.toolbar.btnBackColor.cmpEl).css('background-color', clr == 'transparent' ? 'transparent' : '#' + clr); this.toolbar.mnuBackColorPicker.currentColor = color; if (this.api) { this.toolbar.btnBackColor.ischanged = (fromBtn!==true); this.api.asc_setCellBackgroundColor(color == 'transparent' ? null : Common.Utils.ThemeColor.getRgbColor(color)); this.toolbar.btnBackColor.ischanged = false; } Common.component.Analytics.trackEvent('ToolBar', 'Background Color'); }, onNewTextColor: function(picker, color) { this.toolbar.mnuTextColorPicker.addNewColor(); }, onNewBackColor: function(picker, color) { this.toolbar.mnuBackColorPicker.addNewColor(); }, onNewBorderColor: function(picker, color) { this.toolbar.btnBorders.menu.hide(); this.toolbar.btnBorders.toggle(false, true); this.toolbar.mnuBorderColorPicker.addNewColor(); }, onBorders: function(btn) { var menuItem; _.each(btn.menu.items, function(item) { if (btn.options.borderId == item.options.borderId) { menuItem = item; return false; } }); if (menuItem) { this.onBordersMenu(btn.menu, menuItem); } }, onBordersMenu: function(menu, item) { var me = this; if (me.api && !_.isUndefined(item.options.borderId)) { var btnBorders = me.toolbar.btnBorders, new_borders = [], bordersWidth = btnBorders.options.borderswidth, bordersColor = btnBorders.options.borderscolor; if (btnBorders.rendered) { var iconEl = $('.btn-icon', btnBorders.cmpEl); if (iconEl) { iconEl.removeClass(btnBorders.options.icls); btnBorders.options.icls = item.options.icls; iconEl.addClass(btnBorders.options.icls); } } btnBorders.options.borderId = item.options.borderId; if (item.options.borderId == 'inner') { new_borders[Asc.c_oAscBorderOptions.InnerV] = new Asc.asc_CBorder(bordersWidth, bordersColor); new_borders[Asc.c_oAscBorderOptions.InnerH] = new Asc.asc_CBorder(bordersWidth, bordersColor); } else if (item.options.borderId == 'all') { new_borders[Asc.c_oAscBorderOptions.InnerV] = new Asc.asc_CBorder(bordersWidth, bordersColor); new_borders[Asc.c_oAscBorderOptions.InnerH] = new Asc.asc_CBorder(bordersWidth, bordersColor); new_borders[Asc.c_oAscBorderOptions.Left] = new Asc.asc_CBorder(bordersWidth, bordersColor); new_borders[Asc.c_oAscBorderOptions.Top] = new Asc.asc_CBorder(bordersWidth, bordersColor); new_borders[Asc.c_oAscBorderOptions.Right] = new Asc.asc_CBorder(bordersWidth, bordersColor); new_borders[Asc.c_oAscBorderOptions.Bottom] = new Asc.asc_CBorder(bordersWidth, bordersColor); } else if (item.options.borderId == 'outer') { new_borders[Asc.c_oAscBorderOptions.Left] = new Asc.asc_CBorder(bordersWidth, bordersColor); new_borders[Asc.c_oAscBorderOptions.Top] = new Asc.asc_CBorder(bordersWidth, bordersColor); new_borders[Asc.c_oAscBorderOptions.Right] = new Asc.asc_CBorder(bordersWidth, bordersColor); new_borders[Asc.c_oAscBorderOptions.Bottom] = new Asc.asc_CBorder(bordersWidth, bordersColor); } else if (item.options.borderId != 'none') { new_borders[item.options.borderId] = new Asc.asc_CBorder(bordersWidth, bordersColor); } me.api.asc_setCellBorders(new_borders); Common.NotificationCenter.trigger('edit:complete', me.toolbar); Common.component.Analytics.trackEvent('ToolBar', 'Borders'); } }, onBordersWidth: function(menu, item, state) { if (state) { $('#id-toolbar-mnu-item-border-width .menu-item-icon').css('border-width', (item.value == 'thin' ? 1 : (item.value == 'medium' ? 2 : 3)) + 'px'); this.toolbar.btnBorders.options.borderswidth = item.value; Common.NotificationCenter.trigger('edit:complete', this.toolbar); Common.component.Analytics.trackEvent('ToolBar', 'Border Width'); } }, onBordersColor: function(picker, color) { $('#id-toolbar-mnu-item-border-color .menu-item-icon').css('border-color', '#' + ((typeof(color) == 'object') ? color.color : color)); this.toolbar.mnuBorderColor.onUnHoverItem(); this.toolbar.btnBorders.options.borderscolor = Common.Utils.ThemeColor.getRgbColor(color); this.toolbar.mnuBorderColorPicker.currentColor = color; Common.NotificationCenter.trigger('edit:complete', this.toolbar); Common.component.Analytics.trackEvent('ToolBar', 'Border Color'); }, onHorizontalAlign: function(type, btn, e) { this._state.pralign = undefined; if (this.api) { this.api.asc_setCellAlign(!btn.pressed ? 'left' : type); this.toolbar.btnWrap.allowDepress = !(type == 'justify'); } Common.NotificationCenter.trigger('edit:complete', this.toolbar); Common.component.Analytics.trackEvent('ToolBar', 'Horizontal align'); }, onHorizontalAlignMenu: function(menu, item) { var btnHorizontalAlign = this.toolbar.btnHorizontalAlign, iconEl = $('.btn-icon', btnHorizontalAlign.cmpEl); if (iconEl) { iconEl.removeClass(btnHorizontalAlign.options.icls); btnHorizontalAlign.options.icls = !item.checked ? 'btn-align-left' : item.options.icls; iconEl.addClass(btnHorizontalAlign.options.icls); } this._state.pralign = undefined; if (this.api) this.api.asc_setCellAlign(!item.checked ? 'left' : item.value); this.toolbar.btnWrap.allowDepress = !(item.value == 'justify'); Common.NotificationCenter.trigger('edit:complete', this.toolbar); Common.component.Analytics.trackEvent('ToolBar', 'Horizontal Align'); }, onVerticalAlignMenu: function(menu, item) { var btnVerticalAlign = this.toolbar.btnVerticalAlign, iconEl = $('.btn-icon', btnVerticalAlign.cmpEl); if (iconEl) { iconEl.removeClass(btnVerticalAlign.options.icls); btnVerticalAlign.options.icls = !item.checked ? 'btn-valign-bottom' : item.options.icls; iconEl.addClass(btnVerticalAlign.options.icls); } this._state.valign = undefined; if (this.api) this.api.asc_setCellVertAlign(!item.checked ? 'bottom' : item.value); Common.NotificationCenter.trigger('edit:complete', this.toolbar); Common.component.Analytics.trackEvent('ToolBar', 'Vertical Align'); }, onVerticalAlign: function(type, btn, e) { this._state.valign = undefined; if (this.api) { this.api.asc_setCellVertAlign(!btn.pressed ? 'bottom' : type); } Common.NotificationCenter.trigger('edit:complete', this.toolbar); Common.component.Analytics.trackEvent('ToolBar', 'Vertical align'); }, onMergeCellsMenu: function(menu, item) { var me = this; function doMergeCells(how) { me._state.merge = undefined; me.api.asc_mergeCells(how); Common.NotificationCenter.trigger('edit:complete', me.toolbar); Common.component.Analytics.trackEvent('ToolBar', 'Merge'); } if (me.api) { var merged = me.api.asc_getCellInfo().asc_getFlags().asc_getMerge(); if (!merged && me.api.asc_mergeCellsDataLost(item.value)) { Common.UI.warning({ msg: me.warnMergeLostData, buttons: ['yes', 'no'], primary: 'yes', callback: function(btn) { if (btn == 'yes') { doMergeCells(item.value); } else { me.toolbar.btnMerge.toggle(false, true); Common.NotificationCenter.trigger('edit:complete', me.toolbar); Common.component.Analytics.trackEvent('ToolBar', 'Merge'); } } }); } else { doMergeCells(item.value); } } Common.NotificationCenter.trigger('edit:complete', this.toolbar); Common.component.Analytics.trackEvent('ToolBar', 'Merge cells'); }, onWrap: function(btn, e) { this._state.wrap = undefined; if (this.api) this.api.asc_setCellTextWrap(btn.pressed); Common.NotificationCenter.trigger('edit:complete', this.toolbar); Common.component.Analytics.trackEvent('ToolBar', 'Wrap'); }, onTextOrientationMenu: function(menu, item) { var angle = 0; switch (item.value) { case 'countcw': angle = 45; break; case 'clockwise': angle = -45; break; case 'rotateup': angle = 90; break; case 'rotatedown': angle = -90; break; } this._state.angle = undefined; if (this.api) this.api.asc_setCellAngle(angle); Common.NotificationCenter.trigger('edit:complete', this.toolbar); Common.component.Analytics.trackEvent('ToolBar', 'Text orientation'); }, onInsertImageMenu: function(menu, item, e) { if (item.value === 'file') { this.toolbar.fireEvent('insertimage', this.toolbar); if (this.api) this.api.asc_addImage(); Common.NotificationCenter.trigger('edit:complete', this.toolbar); Common.component.Analytics.trackEvent('ToolBar', 'Image'); } else { var me = this; (new Common.Views.ImageFromUrlDialog({ handler: function(result, value) { if (result == 'ok') { if (me.api) { var checkUrl = value.replace(/\s/g, ''); if (!_.isEmpty(checkUrl)) { me.toolbar.fireEvent('insertimage', me.toolbar); me.api.asc_addImageDrawingObject(checkUrl); Common.component.Analytics.trackEvent('ToolBar', 'Image'); } else { Common.UI.warning({ msg: this.textEmptyImgUrl }); } } Common.NotificationCenter.trigger('edit:complete', me.toolbar); } } })).show(); } }, onHyperlink: function(btn) { var me = this; var win, props; if (me.api) { var wc = me.api.asc_getWorksheetsCount(), i = -1, items = []; while (++i < wc) { if (!this.api.asc_isWorksheetHidden(i)) { items.push({displayValue: me.api.asc_getWorksheetName(i), value: me.api.asc_getWorksheetName(i)}); } } var handlerDlg = function(dlg, result) { if (result == 'ok') { props = dlg.getSettings(); me.api.asc_insertHyperlink(props); } Common.NotificationCenter.trigger('edit:complete', me.toolbar); }; var cell = me.api.asc_getCellInfo(), seltype = cell.asc_getFlags().asc_getSelectionType(); props = cell.asc_getHyperlink(); win = new SSE.Views.HyperlinkSettingsDialog({ api: me.api, handler: handlerDlg }); win.show(); win.setSettings({ sheets : items, currentSheet: me.api.asc_getWorksheetName(me.api.asc_getActiveWorksheetIndex()), props : props, text : cell.asc_getText(), isLock : cell.asc_getFlags().asc_getLockText(), allowInternal: (seltype!==Asc.c_oAscSelectionType.RangeImage && seltype!==Asc.c_oAscSelectionType.RangeShape && seltype!==Asc.c_oAscSelectionType.RangeShapeText && seltype!==Asc.c_oAscSelectionType.RangeChart && seltype!==Asc.c_oAscSelectionType.RangeChartText) }); } Common.component.Analytics.trackEvent('ToolBar', 'Add Hyperlink'); }, onInsertChart: function(btn) { if (!this.editMode) return; var me = this, info = me.api.asc_getCellInfo(); if (info.asc_getFlags().asc_getSelectionType()!=Asc.c_oAscSelectionType.RangeImage) { var win, props; if (me.api){ props = me.api.asc_getChartObject(); if (props) { var ischartedit = ( me.toolbar.mode.isEditDiagram || info.asc_getFlags().asc_getSelectionType() == Asc.c_oAscSelectionType.RangeChart || info.asc_getFlags().asc_getSelectionType() == Asc.c_oAscSelectionType.RangeChartText); (new SSE.Views.ChartSettingsDlg( { chartSettings: props, api: me.api, handler: function(result, value) { if (result == 'ok') { if (me.api) { (ischartedit) ? me.api.asc_editChartDrawingObject(value.chartSettings) : me.api.asc_addChartDrawingObject(value.chartSettings); } } Common.NotificationCenter.trigger('edit:complete', me.toolbar); } })).show(); } } } }, onBtnInsertTextClick: function(btn, e) { if (this.api) this._addAutoshape(btn.pressed, 'textRect'); if (this.toolbar.btnInsertShape.pressed) this.toolbar.btnInsertShape.toggle(false, true); Common.NotificationCenter.trigger('edit:complete', this.toolbar, this.toolbar.btnInsertShape); Common.component.Analytics.trackEvent('ToolBar', 'Add Text'); }, onInsertTextClick: function(menu, item, e) { if (item.value === 'text') { if (this.api) this._addAutoshape(true, 'textRect'); this.toolbar.btnInsertText.toggle(true, true); if (this.toolbar.btnInsertShape.pressed) this.toolbar.btnInsertShape.toggle(false, true); Common.NotificationCenter.trigger('edit:complete', this.toolbar, this.toolbar.btnInsertShape); Common.component.Analytics.trackEvent('ToolBar', 'Add Text'); } }, onInsertShapeHide: function(btn, e) { if (this.toolbar.btnInsertShape.pressed && !this._isAddingShape) { this.toolbar.btnInsertShape.toggle(false, true); } this._isAddingShape = false; Common.NotificationCenter.trigger('edit:complete', this.toolbar); }, onSortType: function(type, btn) { if (this.api) this.api.asc_sortColFilter(type, ''); }, onSearch: function(type, btn) { this.getApplication().getController('LeftMenu').showSearchDlg(true); }, onAutoFilter: function(btn) { var state = this._state.filter; this._state.filter = undefined; if (this.api){ if (this._state.tablename || state) this.api.asc_changeAutoFilter(this._state.tablename, Asc.c_oAscChangeFilterOptions.filter, !state); else this.api.asc_addAutoFilter(); } Common.NotificationCenter.trigger('edit:complete', this.toolbar); Common.component.Analytics.trackEvent('ToolBar', 'Auto filter'); }, onClearFilter: function(btn) { if (this.api) this.api.asc_clearFilter(); Common.NotificationCenter.trigger('edit:complete', this.toolbar); Common.component.Analytics.trackEvent('ToolBar', 'Clear filter'); }, onNumberFormat: function(btn) { if (this.api) { var format = btn.options.formatId; if (btn.options.formatId == this.toolbar.ascFormatOptions.Accounting){ var value = Common.localStorage.getItem("sse-settings-reg-settings"); value = (value!==null) ? parseInt(value) : ((this.toolbar.mode.lang) ? parseInt(Common.util.LanguageInfo.getLocalLanguageCode(this.toolbar.mode.lang)) : 0x0409); format = this.api.asc_getLocaleCurrency(value); } this.api.asc_setCellFormat(format); } Common.NotificationCenter.trigger('edit:complete', this.toolbar); Common.component.Analytics.trackEvent('ToolBar', 'Number Format'); }, onNumberFormatMenu: function(menu, item) { if (this.api) this.api.asc_setCellFormat(item.value); Common.NotificationCenter.trigger('edit:complete', this.toolbar); Common.component.Analytics.trackEvent('ToolBar', 'Number Format'); }, onDecrement: function(btn) { if (this.api) this.api.asc_decreaseCellDigitNumbers(); Common.NotificationCenter.trigger('edit:complete', this.toolbar); Common.component.Analytics.trackEvent('ToolBar', 'Decrement'); }, onIncrement: function(btn) { if (this.api) this.api.asc_increaseCellDigitNumbers(); Common.NotificationCenter.trigger('edit:complete', this.toolbar); Common.component.Analytics.trackEvent('ToolBar', 'Increment'); }, onInsertFormulaMenu: function(menu, item, e) { if (this.api) { if (item.value === 'more') { var controller = this.getApplication().getController('FormulaDialog'); if (controller) { this.api.asc_enableKeyEvents(false); controller.showDialog(); } } else { item.value = item.value || 'SUM'; this.api.asc_insertFormula(this.api.asc_getFormulaLocaleName(item.value), Asc.c_oAscPopUpSelectorType.Func, true); Common.NotificationCenter.trigger('edit:complete', this.toolbar); Common.component.Analytics.trackEvent('ToolBar', 'Insert formula'); } } }, onNamedRangeMenu: function(menu, item, e) { if (this.api) { var me = this; if (item.value === 'paste') { (new SSE.Views.NamedRangePasteDlg({ handler: function(result, settings) { if (result == 'ok' && settings) { me.api.asc_insertFormula(settings.asc_getName(), settings.asc_getIsTable() ? Asc.c_oAscPopUpSelectorType.Table : Asc.c_oAscPopUpSelectorType.Range, false); Common.component.Analytics.trackEvent('ToolBar', 'Paste Named Range'); } Common.NotificationCenter.trigger('edit:complete', me.toolbar); }, ranges: me.api.asc_getDefinedNames(Asc.c_oAscGetDefinedNamesList.WorksheetWorkbook) // names only for current sheet and workbook })).show(); Common.component.Analytics.trackEvent('ToolBar', 'Paste Named Range'); } else { var wc = me.api.asc_getWorksheetsCount(), i = -1, items = [], sheetNames = []; if (item.value === 'new') { if (this._state.namedrange_locked) { Common.NotificationCenter.trigger('namedrange:locked'); return; } while (++i < wc) { if (!this.api.asc_isWorksheetHidden(i)) { items.push({displayValue: me.api.asc_getWorksheetName(i), value: i}); } } (new SSE.Views.NamedRangeEditDlg({ api: me.api, handler: function(result, settings) { if (result == 'ok' && settings) { me.api.asc_setDefinedNames(settings); Common.component.Analytics.trackEvent('ToolBar', 'New Named Range'); } Common.NotificationCenter.trigger('edit:complete', me.toolbar); }, sheets : items, props : me.api.asc_getDefaultDefinedName(), isEdit : false })).show(); } else { var cellEditor = this.getApplication().getController('CellEditor'); while (++i < wc) { if (!this.api.asc_isWorksheetHidden(i)) { sheetNames[i] = me.api.asc_getWorksheetName(i); items.push({displayValue: sheetNames[i], value: i}); } } (new SSE.Views.NameManagerDlg({ api: me.api, handler: function(result) { Common.component.Analytics.trackEvent('ToolBar', 'Name Manager'); Common.NotificationCenter.trigger('edit:complete', me.toolbar); }, locked: me._state.namedrange_locked, sheets: items, sheetNames: sheetNames, ranges: me.api.asc_getDefinedNames(Asc.c_oAscGetDefinedNamesList.All), props : me.api.asc_getDefaultDefinedName(), sort : cellEditor.rangeListSort })).on('close', function(win){ cellEditor.rangeListSort = win.getSettings(); }).show(); } } } }, onNamedRangeMenuOpen: function() { if (this.api) { var names = this.api.asc_getDefinedNames(Asc.c_oAscGetDefinedNamesList.WorksheetWorkbook); this.toolbar.btnNamedRange.menu.items[2].setDisabled(names.length<1); } }, onClearStyleMenu: function(menu, item, e) { if (this.api) this.api.asc_emptyCells(item.value); Common.NotificationCenter.trigger('edit:complete', this.toolbar); Common.component.Analytics.trackEvent('ToolBar', 'Clear'); }, onCopyStyleToggle: function(btn, state, e) { if (this.api) this.api.asc_formatPainter(state ? 1 : 0); Common.NotificationCenter.trigger('edit:complete', this.toolbar); this.modeAlwaysSetStyle = state; }, onCellInsertMenu: function(menu, item, e) { if (this.api) this.api.asc_insertCells(item.value); Common.NotificationCenter.trigger('edit:complete', this.toolbar); Common.component.Analytics.trackEvent('ToolBar', 'Cell insert'); }, onCellDeleteMenu: function(menu, item, e) { if (this.api) this.api.asc_deleteCells(item.value); Common.NotificationCenter.trigger('edit:complete', this.toolbar); Common.component.Analytics.trackEvent('ToolBar', 'Cell delete'); }, onColorSchemaClick: function(menu, item) { if (this.api) { this.api.asc_ChangeColorScheme(item.value); Common.component.Analytics.trackEvent('ToolBar', 'Color Scheme'); } Common.NotificationCenter.trigger('edit:complete', this.toolbar); }, onComboBlur: function() { Common.NotificationCenter.trigger('edit:complete', this.toolbar); }, onFontNameSelect: function(combo, record) { if (this.api) { if (record.isNewFont) { Common.UI.warning({ width: 500, closable: false, msg: this.confirmAddFontName, buttons: ['yes', 'no'], primary: 'yes', callback: _.bind(function(btn) { if (btn == 'yes') { this.api.asc_setCellFontName(record.name); Common.component.Analytics.trackEvent('ToolBar', 'Font Name'); } else { this.toolbar.cmbFontName.setValue(this.api.asc_getCellInfo().asc_getFont().asc_getName()); } Common.NotificationCenter.trigger('edit:complete', this.toolbar, {restorefocus:true}); }, this) }); } else { this.api.asc_setCellFontName(record.name); Common.component.Analytics.trackEvent('ToolBar', 'Font Name'); } } Common.NotificationCenter.trigger('edit:complete', this.toolbar, {restorefocus:true}); }, onComboOpen: function(needfocus, combo) { _.delay(function() { var input = $('input', combo.cmpEl).select(); if (needfocus) input.focus(); else if (!combo.isMenuOpen()) input.one('mouseup', function (e) { e.preventDefault(); }); }, 10); }, onFontSizeSelect: function(combo, record) { this._state.fontsize = undefined; if (this.api) this.api.asc_setCellFontSize(record.value); Common.NotificationCenter.trigger('edit:complete', this.toolbar, {restorefocus:true}); Common.component.Analytics.trackEvent('ToolBar', 'Font Size'); }, onFontSizeChanged: function(before, combo, record, e) { var value, me = this; if (before) { var item = combo.store.findWhere({ displayValue: record.value }); if (!item) { value = /^\+?(\d*\.?\d+)$|^\+?(\d+\.?\d*)$/.exec(record.value); if (!value) { value = this._getApiTextSize(); Common.UI.warning({ msg: this.textFontSizeErr, callback: function() { _.defer(function(btn) { me.api.asc_enableKeyEvents(false); $('input', combo.cmpEl).focus(); }) } }); combo.setRawValue(value); e.preventDefault(); return false; } } } else { value = parseFloat(record.value); value = value > 409 ? 409 : value < 1 ? 1 : Math.floor((value+0.4)*2)/2; combo.setRawValue(value); this._state.fontsize = undefined; if (this.api) this.api.asc_setCellFontSize(value); Common.NotificationCenter.trigger('edit:complete', this.toolbar); } }, onAdvSettingsClick: function(btn, e) { this.toolbar.fireEvent('file:settings', this); btn.cmpEl.blur(); }, onZoomInClick: function(btn) { if (this.api) { var f = Math.floor(this.api.asc_getZoom() * 10)/10; f += .1; if (f > 0 && !(f > 2.)) { this.api.asc_setZoom(f); } } Common.NotificationCenter.trigger('edit:complete', this.toolbar); }, onZoomOutClick: function(btn) { if (this.api) { var f = Math.ceil(this.api.asc_getZoom() * 10)/10; f -= .1; if (!(f < .5)) { this.api.asc_setZoom(f); } } Common.NotificationCenter.trigger('edit:complete', this.toolbar); }, onHideMenu: function(menu, item) { var params = {}, option; switch(item.value) { case 'title': params.title = item.checked; option = 'sse-hidden-title'; break; case 'formula': params.formula = item.checked; option = 'sse-hidden-formula'; break; case 'headings': params.headings = item.checked; break; case 'gridlines': params.gridlines = item.checked; break; } this.hideElements(params); option && Common.localStorage.setItem(option, item.checked); Common.NotificationCenter.trigger('edit:complete', this.toolbar); }, onListStyleSelect: function(combo, record) { this._state.prstyle = undefined; if (this.api) { this.api.asc_setCellStyle(record.get('name')); Common.NotificationCenter.trigger('edit:complete', this.toolbar); Common.component.Analytics.trackEvent('ToolBar', 'Style'); } }, createDelayedElements: function() { var me = this; this.api.asc_registerCallback('asc_onShowChartDialog', _.bind(this.onApiChartDblClick, this)); this.api.asc_registerCallback('asc_onCanUndoChanged', _.bind(this.onApiCanRevert, this, 'undo')); this.api.asc_registerCallback('asc_onCanRedoChanged', _.bind(this.onApiCanRevert, this, 'redo')); this.api.asc_registerCallback('asc_onEditCell', _.bind(this.onApiEditCell, this)); this.api.asc_registerCallback('asc_onEndAddShape', _.bind(this.onApiEndAddShape, this)); this.api.asc_registerCallback('asc_onZoomChanged', _.bind(this.onApiZoomChange, this)); this.api.asc_registerCallback('asc_onSheetsChanged', _.bind(this.onApiSheetChanged, this)); this.api.asc_registerCallback('asc_onStopFormatPainter', _.bind(this.onApiStyleChange, this)); this.api.asc_registerCallback('asc_onUpdateSheetViewSettings', _.bind(this.onApiSheetChanged, this)); Common.util.Shortcuts.delegateShortcuts({ shortcuts: { 'command+l,ctrl+l': function(e) { if (me.editMode) { var cellinfo = me.api.asc_getCellInfo(), filterinfo = cellinfo.asc_getAutoFilterInfo(); if (!filterinfo || filterinfo.asc_getTableName()===null) me._setTableFormat(me.toolbar.mnuTableTemplatePicker.store.at(23).get('name')); } return false; }, 'command+shift+l,ctrl+shift+l': function(e) { var state = me._state.filter; me._state.filter = undefined; if (me.editMode && me.api) { if (me._state.tablename || state) me.api.asc_changeAutoFilter(me._state.tablename, Asc.c_oAscChangeFilterOptions.filter, !state); else me.api.asc_addAutoFilter(); } return false; }, 'command+s,ctrl+s': function (e) { me.onSave(); e.preventDefault(); e.stopPropagation(); }, 'command+k,ctrl+k': function (e) { if (me.editMode && !me.toolbar.mode.isEditMailMerge && !me.toolbar.mode.isEditDiagram && !me.api.isCellEdited) me.onHyperlink(); e.preventDefault(); } } }); this.wrapOnSelectionChanged = _.bind(this.onApiSelectionChanged, this); this.api.asc_registerCallback('asc_onSelectionChanged', this.wrapOnSelectionChanged); this.onApiSelectionChanged(this.api.asc_getCellInfo()); this.api.asc_registerCallback('asc_onEditorSelectionChanged', _.bind(this.onApiEditorSelectionChanged, this)); this.attachToControlEvents(); this.onApiSheetChanged(); this.applyFormulaSettings(); Common.NotificationCenter.on('cells:range', _.bind(this.onCellsRange, this)); }, onChangeViewMode: function(item, compact) { var me = this, toolbarFull = $('#id-toolbar-full'), toolbarShort = $('#id-toolbar-short'); me.toolbar.isCompactView = compact; if (toolbarFull && toolbarShort) { me.api.asc_unregisterCallback('asc_onSelectionChanged', me.wrapOnSelectionChanged); if (compact) { toolbarShort.css({ display: 'table' }); toolbarFull.css({ display: 'none' }); toolbarShort.parent().css({ height: '41px' }); me.toolbar.rendererComponents('short'); } else { toolbarShort.css({ display: 'none' }); toolbarFull.css({ display: 'table' }); toolbarShort.parent().css({ height: '67px' }); me.toolbar.rendererComponents('full'); // layout styles _.defer(function(){ var listStylesVisible = (me.toolbar.listStyles.rendered); if (me.toolbar.listStyles.menuPicker.store.length > 0 && listStylesVisible){ me.toolbar.listStyles.fillComboView(me.toolbar.listStyles.menuPicker.getSelectedRec(), true); } }, 100); } me._state.coauthdisable = undefined; me.api.asc_registerCallback('asc_onSelectionChanged', me.wrapOnSelectionChanged); me.onApiSelectionChanged(me.api.asc_getCellInfo()); Common.localStorage.setItem('sse-toolbar-compact', compact ? 1 : 0); Common.NotificationCenter.trigger('layout:changed', 'toolbar'); } }, fillTableTemplates: function() { var me = this; function createPicker(element, menu) { var picker = new Common.UI.DataView({ el: element, parentMenu : menu, restoreHeight: 300, style: 'max-height: 300px;', store: me.getCollection('TableTemplates'), itemTemplate: _.template('