/* * (c) Copyright Ascensio System SIA 2010-2024 * * This program is a free software product. You can redistribute it and/or * modify it under the terms of the GNU Affero General Public License (AGPL) * version 3 as published by the Free Software Foundation. In accordance with * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect * that Ascensio System SIA expressly excludes the warranty of non-infringement * of any third-party rights. * * This program is distributed WITHOUT ANY WARRANTY; without even the implied * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html * * You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish * street, Riga, Latvia, EU, LV-1050. * * The interactive user interfaces in modified source and object code versions * of the Program must display Appropriate Legal Notices, as required under * Section 5 of the GNU AGPL version 3. * * Pursuant to Section 7(b) of the License you must retain the original Product * logo when distributing the program. Pursuant to Section 7(e) we decline to * grant you any rights under trademark law for use of our trademarks. * * All the Product's GUI elements, including illustrations and icon sets, as * well as technical writing content are licensed under the terms of the * Creative Commons Attribution-ShareAlike 4.0 International. See the License * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode * */ /** * Toolbar.js * * Toolbar controller * * Created on 4/16/14 * */ define([ 'core', 'common/main/lib/component/Window', 'presentationeditor/main/app/collection/SlideThemes', 'presentationeditor/main/app/controller/Transitions', 'presentationeditor/main/app/controller/Animation', 'presentationeditor/main/app/view/Toolbar', 'presentationeditor/main/app/view/SlideSizeSettings', 'presentationeditor/main/app/view/define' ], function () { 'use strict'; PE.Controllers.Toolbar = Backbone.Controller.extend(_.extend({ models: [], collections: [ 'SlideThemes' ], views: [ 'Toolbar' ], initialize: function() { this._state = { activated: false, themeId: undefined, bullets: {type:undefined, subtype:undefined}, prcontrolsdisable:undefined, slidecontrolsdisable:undefined, slidelayoutdisable:undefined, shapecontrolsdisable:undefined, no_paragraph: undefined, no_text: undefined, no_object: undefined, no_drawing_objects: undefined, clrtext: undefined, linespace: undefined, pralign: undefined, valign: undefined, vtextalign: undefined, can_undo: undefined, can_redo: undefined, bold: undefined, italic: undefined, strike: undefined, underline: undefined, can_group: undefined, can_ungroup: undefined, lock_doc: undefined, changeslide_inited: false, no_slides:undefined, can_increase: undefined, can_decrease: undefined, can_hyper: undefined, zoom_type: undefined, zoom_percent: undefined, fontsize: undefined, in_equation: undefined, in_chart: false, no_columns: false, clrhighlight: undefined, can_copycut: undefined, needCallApiBullets: undefined, isLockedSlideHeaderAppyToAll: false, customPluginItems: undefined, activeTab: 'home', viewMode: 'normal' }; this._isAddingShape = false; this.slideSizeArr = [ { size: [9144000, 6858000], ratio: 6858000/9144000, type: Asc.c_oAscSlideSZType.SzScreen4x3}, { size: [12192000, 6858000], ratio: 6858000/12192000, type: Asc.c_oAscSlideSZType.SzCustom} ]; this.currentPageSize = { type: Asc.c_oAscSlideSZType.SzCustom, width: 0, height: 0, firstNum: 1 }; this.flg = {}; this.diagramEditor = null; this.editMode = true; this.externalData = { stackRequests: [], stackResponse: [], callback: undefined, linkStatus: {} }; this.addListeners({ 'Toolbar': { 'insert:image' : this.onInsertImageClick.bind(this), 'insert:text-btn' : this.onBtnInsertTextClick.bind(this), 'insert:text-menu' : this.onMenuInsertTextClick.bind(this), 'insert:textart' : this.onInsertTextart.bind(this), 'insert:shape' : this.onInsertShape.bind(this), 'add:slide' : this.onAddSlide.bind(this), 'duplicate:slide' : this.onDuplicateSlide.bind(this), 'duplicate:check' : this.onDuplicateCheck.bind(this), 'change:slide' : this.onChangeSlide.bind(this), 'change:compact' : this.onClickChangeCompact, 'add:chart' : this.onSelectChart, 'insert:smartart' : this.onInsertSmartArt, 'smartart:mouseenter': this.mouseenterSmartArt, 'smartart:mouseleave': this.mouseleaveSmartArt, 'tab:active' : this.onActiveTab.bind(this), 'tab:active:before' : this.onBeforeActiveTab.bind(this), 'tab:collapse' : this.onTabCollapse.bind(this) }, 'DocumentHolder': { 'smartart:mouseenter': this.mouseenterSmartArt, 'smartart:mouseleave': this.mouseleaveSmartArt, }, 'FileMenu': { 'menu:hide': this.onFileMenu.bind(this, 'hide'), 'menu:show': this.onFileMenu.bind(this, 'show') }, 'Common.Views.Header': { 'print': function (opts) { var _main = this.getApplication().getController('Main'); _main.onPrint(); }, 'print-quick': function (opts) { var _main = this.getApplication().getController('Main'); _main.onPrintQuick(); }, 'save': function (opts) { this.api.asc_Save(); }, 'undo': this.onUndo, 'redo': this.onRedo, 'startover': function(opts) { this.onPreview(0); }, 'downloadas': function (opts) { var _main = this.getApplication().getController('Main'); var _file_type = _main.document.fileType, _format; if ( !!_file_type ) { _format = Asc.c_oAscFileType[ _file_type.toUpperCase() ]; } var _supported = [ Asc.c_oAscFileType.PPTX, Asc.c_oAscFileType.ODP, Asc.c_oAscFileType.PDFA, Asc.c_oAscFileType.POTX, Asc.c_oAscFileType.OTP, Asc.c_oAscFileType.PPTM, Asc.c_oAscFileType.PNG, Asc.c_oAscFileType.JPG ]; if ( !_format || _supported.indexOf(_format) < 0 ) _format = Asc.c_oAscFileType.PDF; _main.api.asc_DownloadAs(new Asc.asc_CDownloadOptions(_format)); }, 'go:editor': function() { Common.Gateway.requestEditRights(); } }, 'ViewTab': { 'toolbar:setcompact': this.onChangeCompactView.bind(this), 'viewmode:change': this.onChangeViewMode.bind(this) } }); Common.NotificationCenter.on('toolbar:collapse', _.bind(function () { this.toolbar.collapse(); }, this)); Common.NotificationCenter.on('tab:set-active', _.bind(function(action){ this.toolbar.setTab(action); this.onChangeCompactView(null, false, true); }, this)); var me = this; var checkInsertAutoshape = function(e) { 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 (btn_id===undefined) btn_id = cmp.closest('.combo-dataview').attr('id'); if (cmp.attr('id') != 'editor_sdk' && cmp_sdk.length<=0) { if ( me.toolbar.btnsInsertText.pressed() && !me.toolbar.btnsInsertText.contains(btn_id) || me.toolbar.cmbsInsertShape.some(function(cmb) { return cmb.isComboViewRecActive() && cmb.id !== btn_id; })) { me._isAddingShape = false; me._addAutoshape(false); me.toolbar.btnsInsertText.toggle(false, true); me.toolbar.cmbsInsertShape.forEach(function(cmb) { cmb.deactivateRecords(); }); Common.NotificationCenter.trigger('edit:complete', me.toolbar); } } }; this.onApiEndAddShape = function() { this.toolbar.fireEvent('insertshape', this.toolbar); if ( this.toolbar.btnsInsertText.pressed() ) { this.toolbar.btnsInsertText.toggle(false, true); this.toolbar.btnsInsertText.forEach(function(button) { button.menu.clearAll(true); }); } this.toolbar.cmbsInsertShape.forEach(function(cmb) { if (cmb.isComboViewRecActive()) cmb.deactivateRecords(); }); $(document.body).off('mouseup', checkInsertAutoshape); }; this._addAutoshape = function(isstart, type) { if (this.api) { if (isstart) { this.api.StartAddShape(type, true); $(document.body).on('mouseup', checkInsertAutoshape); } else { this.api.StartAddShape('', false); $(document.body).off('mouseup', checkInsertAutoshape); } } }; }, onLaunch: function() { var me = this; // Create toolbar view me.toolbar = me.createView('Toolbar'); Common.NotificationCenter.on('app:ready', me.onAppReady.bind(me)); Common.NotificationCenter.on('app:face', me.onAppShowed.bind(me)); PE.getCollection('ShapeGroups').bind({ reset: me.onResetAutoshapes.bind(this) }); PE.getCollection('SlideLayouts').bind({ reset: me.onResetSlides.bind(this) }); }, setMode: function(mode) { var _main = this.getApplication().getController('Main'), me = this; this.mode = mode; this.toolbar.applyLayout(mode); var url = 'https://www.onlyoffice.com/blog/2025/10/docs-9-1-released'; Common.UI.FeaturesManager.isFeatureEnabled('featuresTips', true) && Common.UI.TooltipManager.addTips({ 'commentFilter' : {name: 'help-tip-comment-filter', placement: 'bottom-right', text: this.helpCommentFilter, header: this.helpCommentFilterHeader, target: '#comments-btn-sort', maxwidth: 300, closable: false, isNewFeature: true, link: {text: _main.textLearnMore, url: url}}, 'masterTab' : {name: 'pe-help-tip-master-tab', placement: 'bottom-right', offset: {x: Common.UI.isRTL() ? -10 : 10, y: 0}, text: this.helpMasterTab, header: this.helpMasterTabHeader, target: 'li.ribtab #slideMaster', automove: true, maxwidth: 300, closable: false, isNewFeature: true, link: {text: _main.textLearnMore, url: url}}, 'chartElements' : {name: 'help-tip-chart-elements', placement: 'bottom', text: this.helpChartElements, header: this.helpChartElementsHeader, target: '#id-document-holder-btn-chart-element', maxwidth: 300, automove: true, noHighlight: true, noArrow: true, closable: false, isNewFeature: true, link: {text: _main.textLearnMore, url: url}} }); Common.UI.TooltipManager.addTips({ 'refreshFile' : {text: _main.textUpdateVersion, header: _main.textUpdating, target: '#toolbar', maxwidth: 'none', showButton: false, automove: true, noHighlight: true, noArrow: true, multiple: true}, 'disconnect' : {text: _main.textConnectionLost, header: _main.textDisconnect, target: '#toolbar', maxwidth: 'none', showButton: false, automove: true, noHighlight: true, noArrow: true, multiple: true}, 'updateVersion' : {text: _main.errorUpdateVersionOnDisconnect, header: _main.titleUpdateVersion, target: '#toolbar', maxwidth: 600, showButton: false, automove: true, noHighlight: true, noArrow: true, multiple: true}, 'sessionIdle' : {text: _main.errorSessionIdle, target: '#toolbar', maxwidth: 600, showButton: false, automove: true, noHighlight: true, noArrow: true, multiple: true}, 'sessionToken' : {text: _main.errorSessionToken, target: '#toolbar', maxwidth: 600, showButton: false, automove: true, noHighlight: true, noArrow: true, multiple: true} }); }, attachUIEvents: function(toolbar) { /** * UI Events */ const me = this; toolbar.btnPreview.on('click', _.bind(me.onPreviewBtnClick, me)); toolbar.btnPreview.menu.on('item:click', _.bind(me.onPreviewItemClick, me)); toolbar.btnPreview.on('disabled', _.bind(me.onBtnChangeState, me, 'startover:disabled')); toolbar.btnPrint.on('click', _.bind(this.onPrint, this)); toolbar.btnPrint.on('disabled', _.bind(this.onBtnChangeState, this, 'print:disabled')); toolbar.btnPrint.menu && toolbar.btnPrint.menu.on('item:click', _.bind(this.onPrintMenu, this)); toolbar.btnSave.on('click', _.bind(this.onSave, this)); toolbar.btnUndo.on('click', _.bind(this.onUndo, this)); toolbar.btnUndo.on('disabled', _.bind(this.onBtnChangeState, this, 'undo:disabled')); toolbar.btnRedo.on('click', _.bind(this.onRedo, this)); toolbar.btnRedo.on('disabled', _.bind(this.onBtnChangeState, this, 'redo:disabled')); toolbar.btnCopy.on('click', _.bind(this.onCopyPaste, this, 'copy')); toolbar.btnPaste.on('click', _.bind(this.onCopyPaste, this, 'paste')); toolbar.btnCut.on('click', _.bind(this.onCopyPaste, this, 'cut')); toolbar.btnSelectAll.on('click', _.bind(this.onSelectAll, this)); toolbar.btnReplace.on('click', _.bind(this.onReplace, this)); toolbar.btnIncFontSize.on('click', _.bind(this.onIncrease, this)); toolbar.btnDecFontSize.on('click', _.bind(this.onDecrease, 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.btnStrikeout.on('click', _.bind(this.onStrikeout, this)); toolbar.btnSuperscript.on('click', _.bind(this.onSuperscript, this)); toolbar.btnSubscript.on('click', _.bind(this.onSubscript, this)); toolbar.btnHorizontalAlign.menu.on('item:click', _.bind(this.onMenuHorizontalAlignSelect, this)); toolbar.btnVerticalAlign.menu.on('item:click', _.bind(this.onMenuVerticalAlignSelect, this)); toolbar.btnDecLeftOffset.on('click', _.bind(this.onDecOffset, this)); toolbar.btnIncLeftOffset.on('click', _.bind(this.onIncOffset, this)); toolbar.mnuChangeCase.on('item:click', _.bind(this.onChangeCase, this)); toolbar.btnMarkers.on('click', _.bind(this.onMarkers, this)); toolbar.btnNumbers.on('click', _.bind(this.onNumbers, this)); toolbar.mnuMarkerSettings.on('click', _.bind(this.onMarkerSettingsClick, this, 0)); toolbar.mnuNumberSettings.on('click', _.bind(this.onMarkerSettingsClick, this, 1)); 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)); toolbar.mnuMarkersPicker.on('item:click', _.bind(this.onSelectBullets, this, toolbar.btnMarkers)); toolbar.mnuNumbersPicker.on('item:click', _.bind(this.onSelectBullets, this, toolbar.btnNumbers)); toolbar.btnMarkers.menu.on('show:after', _.bind(this.onListShowAfter, this, 0, toolbar.mnuMarkersPicker)); toolbar.btnNumbers.menu.on('show:after', _.bind(this.onListShowAfter, this, 1, toolbar.mnuNumbersPicker)); toolbar.btnFontColor.on('click', _.bind(this.onBtnFontColor, this)); toolbar.btnFontColor.on('color:select', _.bind(this.onSelectFontColor, this)); toolbar.btnFontColor.on('eyedropper:start', _.bind(this.onEyedropperStart, this)); toolbar.btnFontColor.on('eyedropper:end', _.bind(this.onEyedropperEnd, this)); this.mode.isEdit && Common.NotificationCenter.on('eyedropper:start', _.bind(this.eyedropperStart, this)); toolbar.btnHighlightColor.on('click', _.bind(this.onBtnHighlightColor, this)); toolbar.mnuHighlightColorPicker.on('select', _.bind(this.onSelectHighlightColor, this)); toolbar.mnuHighlightTransparent.on('click', _.bind(this.onHighlightTransparentClick, this)); toolbar.btnLineSpace.menu.on('item:toggle', _.bind(this.onLineSpaceToggle, this)); toolbar.btnLineSpace.menu.on('item:click', _.bind(this.onLineSpaceClick, this)); toolbar.btnColumns.menu.on('item:click', _.bind(this.onColumnsSelect, this)); toolbar.btnColumns.menu.on('show:before', _.bind(this.onBeforeColumns, this)); toolbar.btnTextDir.menu.on('item:click', _.bind(this.onTextDirClick, this)); toolbar.btnShapeAlign.menu.on('item:click', _.bind(this.onShapeAlign, this)); toolbar.btnShapeAlign.menu.on('show:before', _.bind(this.onBeforeShapeAlign, this)); toolbar.btnShapeArrange.menu.on('item:click', _.bind(this.onShapeArrange, this)); toolbar.btnShapesMerge.menu.on('item:click', _.bind(this.onClickMenuShapesMerge, this)); toolbar.btnShapesMerge.menu.on('show:before', _.bind(this.onBeforeShapesMerge, this)); toolbar.btnInsertHyperlink.on('click', _.bind(this.onHyperlinkClick, this)); toolbar.mnuTablePicker.on('select', _.bind(this.onTablePickerSelect, this)); toolbar.btnInsertTable.menu.on('item:click', _.bind(this.onInsertTableClick, this)); toolbar.btnClearStyle.on('click', _.bind(this.onClearStyleClick, this)); toolbar.btnCopyStyle.on('toggle', _.bind(this.onCopyStyleToggle, this)); toolbar.btnColorSchemas.menu.on('item:click', _.bind(this.onColorSchemaClick, this)); toolbar.btnColorSchemas.menu.on('show:after', _.bind(this.onColorSchemaShow, this)); toolbar.btnSlideSize.menu.on('item:click', _.bind(this.onSlideSize, this)); toolbar.listTheme.on('click', _.bind(this.onListThemeSelect, this)); toolbar.btnInsertEquation.on('click', _.bind(this.onInsertEquationClick, this)); toolbar.btnInsertSymbol.menu.items[2].on('click', _.bind(this.onInsertSymbolClick, this)); toolbar.mnuInsertSymbolsPicker.on('item:click', _.bind(this.onInsertSymbolItemClick, this)); toolbar.btnEditHeader.on('click', _.bind(this.onEditHeaderClick, this, 'header')); toolbar.btnInsDateTime.on('click', _.bind(this.onEditHeaderClick, this, 'datetime')); toolbar.btnInsSlideNum.on('click', _.bind(this.onEditHeaderClick, this, 'slidenum')); Common.Gateway.on('insertimage', _.bind(this.insertImage, this)); toolbar.btnInsAudio && toolbar.btnInsAudio.on('click', _.bind(this.onAddAudio, this)); toolbar.btnInsVideo && toolbar.btnInsVideo.on('click', _.bind(this.onAddVideo, this)); this.onSetupCopyStyleButton(); this.onBtnChangeState('undo:disabled', toolbar.btnUndo, toolbar.btnUndo.isDisabled()); this.onBtnChangeState('redo:disabled', toolbar.btnRedo, toolbar.btnRedo.isDisabled()); this.onBtnChangeState('save:disabled', toolbar.btnSave, toolbar.btnSave.isDisabled()); }, setApi: function(api) { this.api = api; if (this.mode.isEdit) { this.toolbar.setApi(api); this.api.asc_registerCallback('asc_onFontSize', _.bind(this.onApiFontSize, this)); this.api.asc_registerCallback('asc_onBold', _.bind(this.onApiBold, this)); this.api.asc_registerCallback('asc_onItalic', _.bind(this.onApiItalic, this)); this.api.asc_registerCallback('asc_onUnderline', _.bind(this.onApiUnderline, this)); this.api.asc_registerCallback('asc_onStrikeout', _.bind(this.onApiStrikeout, this)); this.api.asc_registerCallback('asc_onVerticalAlign', _.bind(this.onApiVerticalAlign, this)); Common.NotificationCenter.on('fonts:change', _.bind(this.onApiChangeFont, this)); this.api.asc_registerCallback('asc_onCanUndo', _.bind(this.onApiCanRevert, this, 'undo')); this.api.asc_registerCallback('asc_onCanRedo', _.bind(this.onApiCanRevert, this, 'redo')); this.api.asc_registerCallback('asc_onPaintFormatChanged', _.bind(this.onApiStyleChange, this)); this.api.asc_registerCallback('asc_onListType', _.bind(this.onApiBullets, this)); this.api.asc_registerCallback('asc_canIncreaseIndent', _.bind(this.onApiCanIncreaseIndent, this)); this.api.asc_registerCallback('asc_canDecreaseIndent', _.bind(this.onApiCanDecreaseIndent, this)); this.api.asc_registerCallback('asc_onLineSpacing', _.bind(this.onApiLineSpacing, this)); this.api.asc_registerCallback('asc_onPrAlign', _.bind(this.onApiParagraphAlign, this)); this.api.asc_registerCallback('asc_onVerticalTextAlign', _.bind(this.onApiVerticalTextAlign, this)); this.api.asc_registerCallback('asc_onCanAddHyperlink', _.bind(this.onApiCanAddHyperlink, this)); this.api.asc_registerCallback('asc_onTextColor', _.bind(this.onApiTextColor, this)); this.api.asc_registerCallback('asc_onMarkerFormatChanged', _.bind(this.onApiStartHighlight, this)); this.api.asc_registerCallback('asc_onTextHighLight', _.bind(this.onApiHighlightColor, this)); this.api.asc_registerCallback('asc_onUpdateThemeIndex', _.bind(this.onApiUpdateThemeIndex, this)); this.api.asc_registerCallback('asc_onEndAddShape', _.bind(this.onApiEndAddShape, this)); this.api.asc_registerCallback('asc_onCanGroup', _.bind(this.onApiCanGroup, this)); this.api.asc_registerCallback('asc_onCanUnGroup', _.bind(this.onApiCanUnGroup, this)); this.api.asc_registerCallback('asc_onPresentationSize', _.bind(this.onApiPageSize, 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_onZoomChange', _.bind(this.onApiZoomChange, this)); this.api.asc_registerCallback('asc_onFocusObject', _.bind(this.onApiFocusObject, this)); this.api.asc_registerCallback('asc_onLockDocumentProps', _.bind(this.onApiLockDocumentProps, this)); this.api.asc_registerCallback('asc_onUnLockDocumentProps', _.bind(this.onApiUnLockDocumentProps, this)); this.api.asc_registerCallback('asc_onLockDocumentTheme', _.bind(this.onApiLockDocumentTheme, this)); this.api.asc_registerCallback('asc_onUnLockDocumentTheme', _.bind(this.onApiUnLockDocumentTheme, this)); this.api.asc_registerCallback('asc_onInitEditorStyles', _.bind(this.onApiInitEditorStyles, this)); this.api.asc_registerCallback('asc_onCountPages', _.bind(this.onApiCountPages, this)); this.api.asc_registerCallback('asc_onMathTypes', _.bind(this.onApiMathTypes, this)); this.api.asc_registerCallback('asc_onContextMenu', _.bind(this.onContextMenu, this)); this.api.asc_registerCallback('asc_onTextLanguage', _.bind(this.onTextLanguage, this)); Common.NotificationCenter.on('storage:image-load', _.bind(this.openImageFromStorage, this)); Common.NotificationCenter.on('storage:image-insert', _.bind(this.insertImageFromStorage, this)); this.api.asc_registerCallback('asc_onCanCopyCut', _.bind(this.onApiCanCopyCut, this)); this.api.asc_registerCallback('asc_onBeginSmartArtPreview', _.bind(this.onApiBeginSmartArtPreview, this)); this.api.asc_registerCallback('asc_onAddSmartArtPreview', _.bind(this.onApiAddSmartArtPreview, this)); this.api.asc_registerCallback('asc_onEndSmartArtPreview', _.bind(this.onApiEndSmartArtPreview, this)); this.api.asc_registerCallback('asc_onLockSlideHdrFtrApplyToAll', _.bind(this.onApiLockSlideHdrFtrApplyToAll, this, true)); this.api.asc_registerCallback('asc_onUnLockSlideHdrFtrApplyToAll', _.bind(this.onApiLockSlideHdrFtrApplyToAll, this, false)); this.api.asc_registerCallback('asc_onTextDirection', _.bind(this.onApiTextDirection, this)); } else if (this.mode.isRestrictedEdit) { this.api.asc_registerCallback('asc_onCountPages', _.bind(this.onApiCountPagesRestricted, this)); } this.api.asc_registerCallback('onPluginToolbarMenu', _.bind(this.onPluginToolbarMenu, this)); this.api.asc_registerCallback('onPluginToolbarCustomMenuItems', _.bind(this.onPluginToolbarCustomMenuItems, this)); this.api.asc_registerCallback('onPluginUpdateToolbarMenu', _.bind(this.onPluginUpdateToolbarMenu, this)); Common.NotificationCenter.on('document:ready', _.bind(this.onDocumentReady, this)); }, onChangeCompactView: function(view, compact, suppressSave) { this.toolbar.setFolded(compact); this.toolbar.fireEvent('view:compact', [this.toolbar, compact]); compact && this.onTabCollapse(); !suppressSave && Common.localStorage.setBool(this.mode.isEdit ? "pe-compact-toolbar" : "pe-view-compact-toolbar", compact); Common.NotificationCenter.trigger('layout:changed', 'toolbar'); Common.NotificationCenter.trigger('edit:complete', this.toolbar); }, onClickChangeCompact: function (from) { if ( from != 'file' ) { var me = this; Common.Utils.asyncCall(function () { me.onChangeCompactView(null, !me.toolbar.isCompact()); }); } }, onContextMenu: function() { this.toolbar.collapse(); }, onApiChangeFont: function(font) { !Common.Utils.ModalWindow.isVisible() && this.toolbar.cmbFontName.onApiChangeFont(font); }, onApiFontSize: function(size) { if (this._state.fontsize !== size) { this.toolbar.cmbFontSize.setValue(size); this._state.fontsize = size; } }, onApiBold: function(on) { if (this._state.bold !== on) { this.toolbar.btnBold.toggle(on === true, true); this._state.bold = on; } }, onApiItalic: function(on) { if (this._state.italic !== on) { this.toolbar.btnItalic.toggle(on === true, true); this._state.italic = on; } }, onApiUnderline: function(on) { if (this._state.underline !== on) { this.toolbar.btnUnderline.toggle(on === true, true); this._state.underline = on; } }, onApiStrikeout: function(on) { if (this._state.strike !== on) { this.toolbar.btnStrikeout.toggle(on === true, true); this._state.strike = on; } }, onApiVerticalAlign: function(typeBaseline) { if (this._state.valign !== typeBaseline) { this.toolbar.btnSuperscript.toggle(typeBaseline==Asc.vertalign_SuperScript, true); this.toolbar.btnSubscript.toggle(typeBaseline==Asc.vertalign_SubScript, true); this._state.valign = typeBaseline; } }, onApiCanRevert: function(which, can) { if (which=='undo') { if (this._state.can_undo !== can) { this.toolbar.lockToolbar(Common.enumLock.undoLock, !can, {array: [this.toolbar.btnUndo]}); if (this._state.activated) this._state.can_undo = can; } } else { if (this._state.can_redo !== can) { this.toolbar.lockToolbar(Common.enumLock.redoLock, !can, {array: [this.toolbar.btnRedo]}); if (this._state.activated) this._state.can_redo = can; } } }, onApiCanIncreaseIndent: function(value) { if (this._state.can_increase !== value) { this.toolbar.lockToolbar(Common.enumLock.incIndentLock, !value, {array: [this.toolbar.btnIncLeftOffset]}); if (this._state.activated) this._state.can_increase = value; } }, onApiCanDecreaseIndent: function(value) { if (this._state.can_decrease !== value) { this.toolbar.lockToolbar(Common.enumLock.decIndentLock, !value, {array: [this.toolbar.btnDecLeftOffset]}); if (this._state.activated) this._state.can_decrease = value; } }, updateBulletTip: function(view, title) { if (view) { var tip = $(view.el).data('bs.tooltip'); if (tip) { tip.options.title = title; tip.$tip.find('.tooltip-inner').text(title); } } }, onApiBullets: function(v) { if (!(this.toolbar.mnuMarkersPicker && this.toolbar.mnuMarkersPicker.store)) { this._state.needCallApiBullets = v; return; } this._state.needCallApiBullets = undefined; if (this._state.bullets.type !== v.get_ListType() || this._state.bullets.subtype !== v.get_ListSubType() || v.get_ListType()===0 && v.get_ListSubType()===0x1000) { this._state.bullets.type = v.get_ListType(); this._state.bullets.subtype = v.get_ListSubType(); var rec = this.toolbar.mnuMarkersPicker.store.at(8), drawDefBullet = (rec.get('data').subtype===0x1000) && (this._state.bullets.type===1 || this._state.bullets.subtype!==0x1000); this._clearBullets(); switch(this._state.bullets.type) { case 0: var idx; if (this._state.bullets.subtype!==0x1000) idx = this._state.bullets.subtype; else { // custom var bullet = v.asc_getListCustom(); if (bullet) { var type = bullet.asc_getType(); if (type == Asc.asc_PreviewBulletType.char) { var symbol = bullet.asc_getChar(); if (symbol) { var custombullet = new Asc.asc_CBullet(); custombullet.asc_putSymbol(symbol); custombullet.asc_putFont(bullet.asc_getSpecialFont()); rec.get('data').subtype = 0x1000; rec.set('customBullet', custombullet); rec.set('numberingInfo', JSON.stringify(custombullet.asc_getJsonBullet())); rec.set('tip', ''); this.toolbar.mnuMarkersPicker.dataViewItems && this.updateBulletTip(this.toolbar.mnuMarkersPicker.dataViewItems[8], ''); drawDefBullet = false; idx = 8; } } else if (type == Asc.asc_PreviewBulletType.image) { var id = bullet.asc_getImageId(); if (id) { var custombullet = new Asc.asc_CBullet(); custombullet.asc_fillBulletImage(id); rec.get('data').subtype = 0x1000; rec.set('customBullet', custombullet); rec.set('numberingInfo', JSON.stringify(custombullet.asc_getJsonBullet())); rec.set('tip', ''); this.toolbar.mnuMarkersPicker.dataViewItems && this.updateBulletTip(this.toolbar.mnuMarkersPicker.dataViewItems[8], ''); drawDefBullet = false; idx = 8; } } } } (idx!==undefined) ? this.toolbar.mnuMarkersPicker.selectByIndex(idx, true) : this.toolbar.mnuMarkersPicker.deselectAll(true); this.toolbar.btnMarkers.toggle(true, true); this.toolbar.mnuNumbersPicker.deselectAll(true); break; case 1: var idx = 0; switch(this._state.bullets.subtype) { case 1: idx = 4; break; case 2: idx = 5; break; case 3: idx = 6; break; case 4: idx = 1; break; case 5: idx = 2; break; case 6: idx = 3; break; case 7: idx = 7; break; } this.toolbar.btnNumbers.toggle(true, true); this.toolbar.mnuNumbersPicker.selectByIndex(idx, true); this.toolbar.mnuMarkersPicker.deselectAll(true); break; } if (drawDefBullet) { rec.get('data').subtype = 8; rec.set('numberingInfo', this.toolbar._markersArr[8]); rec.set('tip', this.toolbar.tipMarkersDash); this.toolbar.mnuMarkersPicker.dataViewItems && this.updateBulletTip(this.toolbar.mnuMarkersPicker.dataViewItems[8], this.toolbar.tipMarkersDash); } } }, onApiParagraphAlign: function(v) { if (this._state.pralign !== v) { this._state.pralign = v; var index = -1, align, btnHorizontalAlign = this.toolbar.btnHorizontalAlign; switch (v) { case 0: index = 2; align = 'btn-align-right'; break; case 1: index = 0; align = 'btn-align-left'; break; case 2: index = 1; align = 'btn-align-center'; break; case 3: index = 3; align = 'btn-align-just'; break; default: index = -255; align = 'btn-align-left'; break; } if (!(index < 0)) { btnHorizontalAlign.menu.items[index].setChecked(true); } else if (index == -255) { btnHorizontalAlign.menu.clearAll(true); } if ( btnHorizontalAlign.rendered && btnHorizontalAlign.$icon ) { btnHorizontalAlign.$icon.removeClass(btnHorizontalAlign.options.icls).addClass(align); btnHorizontalAlign.options.icls = align; } } }, onApiVerticalTextAlign: function(v) { if (this._state.vtextalign !== v) { this._state.vtextalign = v; var index = -1, align = '', btnVerticalAlign = this.toolbar.btnVerticalAlign; switch (v) { case Asc.c_oAscVAlign.Top: index = 0; align = 'btn-align-top'; break; case Asc.c_oAscVAlign.Center: index = 1; align = 'btn-align-middle'; break; case Asc.c_oAscVAlign.Bottom: index = 2; align = 'btn-align-bottom'; break; default: index = -255; align = 'btn-align-middle'; break; } if (!(index < 0)) { btnVerticalAlign.menu.items[index].setChecked(true); } else if (index == -255) { btnVerticalAlign.menu.clearAll(true); } if ( btnVerticalAlign.rendered && btnVerticalAlign.$icon ) { btnVerticalAlign.$icon.removeClass(btnVerticalAlign.options.icls).addClass(align); btnVerticalAlign.options.icls = align; } } }, onApiLineSpacing: function(vc) { var line = (vc.get_Line() === null || vc.get_LineRule() === null || vc.get_LineRule() != 1) ? -1 : vc.get_Line(); if (this._state.linespace !== line) { this._state.linespace = line; var mnuLineSpace = this.toolbar.btnLineSpace.menu; mnuLineSpace.clearAll(true); if (line<0) return; if ( Math.abs(line-1.)<0.0001 ) mnuLineSpace.items[0].setChecked(true, true); else if ( Math.abs(line-1.15)<0.0001 ) mnuLineSpace.items[1].setChecked(true, true); else if ( Math.abs(line-1.5)<0.0001 ) mnuLineSpace.items[2].setChecked(true, true); else if ( Math.abs(line-2)<0.0001 ) mnuLineSpace.items[3].setChecked(true, true); else if ( Math.abs(line-2.5)<0.0001 ) mnuLineSpace.items[4].setChecked(true, true); else if ( Math.abs(line-3)<0.0001 ) mnuLineSpace.items[5].setChecked(true, true); } }, onApiCanAddHyperlink: function(value) { if (this._state.can_hyper !== value && this.editMode) { this.toolbar.lockToolbar(Common.enumLock.hyperlinkLock, !value, {array: [this.toolbar.btnInsertHyperlink]}); if (this._state.activated) this._state.can_hyper = value; } }, onApiPageSize: function(width, height, type, firstNum) { if (Math.abs(this.currentPageSize.width - width) > 0.001 || Math.abs(this.currentPageSize.height - height) > 0.001 || this.currentPageSize.type !== type) { this.currentPageSize.width = width; this.currentPageSize.height = height; this.currentPageSize.type = type; var ratio = height/width; var idx = -1; for (var i = 0; i < this.slideSizeArr.length; i++) { if (Math.abs(this.slideSizeArr[i].ratio - ratio) < 0.001 ) { idx = i; break; } } this.toolbar.btnSlideSize.menu.items[0].setChecked(idx == 0); this.toolbar.btnSlideSize.menu.items[1].setChecked(idx == 1); } (firstNum!==undefined) && (this.currentPageSize.firstNum = firstNum); }, onApiCountPages: function(count) { if (this._state.no_slides !== (count<=0)) { this._state.no_slides = (count<=0); this.toolbar.lockToolbar(Common.enumLock.noSlides, this._state.no_slides, {array: this.toolbar.paragraphControls}); this.toolbar.lockToolbar(Common.enumLock.noSlides, this._state.no_slides, {array: this.toolbar.cmbsInsertShape.concat([ this.toolbar.btnChangeSlide, this.toolbar.btnPreview, this.toolbar.btnPrint, this.toolbar.btnCopy, this.toolbar.btnCut, this.toolbar.btnSelectAll, this.toolbar.btnReplace, this.toolbar.btnPaste, this.toolbar.btnCopyStyle, this.toolbar.btnInsertTable, this.toolbar.btnInsertChart, this.toolbar.btnInsertSmartArt, this.toolbar.btnColorSchemas, this.toolbar.btnShapeAlign, this.toolbar.btnShapesMerge, this.toolbar.btnShapeArrange, this.toolbar.btnSlideSize, this.toolbar.listTheme, this.toolbar.btnEditHeader, this.toolbar.btnInsDateTime, this.toolbar.btnInsSlideNum ])}); this.toolbar.lockToolbar(Common.enumLock.noSlides, this._state.no_slides, { array: this.toolbar.btnsInsertImage.concat(this.toolbar.btnsInsertText, this.toolbar.btnInsertEquation, this.toolbar.btnInsertTextArt, this.toolbar.btnInsAudio, this.toolbar.btnInsVideo) }); if (this.btnsComment) this.toolbar.lockToolbar(Common.enumLock.noSlides, this._state.no_slides, { array: this.btnsComment }); if (this.btnsDrawTab) this.toolbar.lockToolbar(Common.enumLock.noSlides, this._state.no_slides, { array: this.btnsDrawTab }); } }, onApiCountPagesRestricted: function(count) { if (this._state.no_slides !== (count<=0)) { this._state.no_slides = (count<=0); if (this.btnsComment) this.toolbar.lockToolbar(Common.enumLock.noSlides, this._state.no_slides, { array: this.btnsComment }); } }, onApiFocusObject: function(selectedObjects) { if (!this.editMode) return; var me = this, pr, sh, i = -1,type, paragraph_locked = undefined, shape_locked = undefined, slide_deleted = undefined, slide_layout_lock = undefined, no_paragraph = true, no_text = true, no_object = true, no_drawing_objects = this.api.asc_getSelectedDrawingObjectsCount()<1, in_equation = false, in_chart = false, in_para = false, layout_index = -1, no_columns = false, in_smartart = false, in_smartart_internal = false, in_slide_master = false; while (++i < selectedObjects.length) { type = selectedObjects[i].get_ObjectType(); pr = selectedObjects[i].get_ObjectValue(); if (type == Asc.c_oAscTypeSelectElement.Paragraph) { paragraph_locked = pr.get_Locked(); no_paragraph = false; no_text = false; in_para = true; } else if (type == Asc.c_oAscTypeSelectElement.Slide) { slide_deleted = pr.get_LockDelete(); slide_layout_lock = pr.get_LockLayout(); layout_index = pr.get_LayoutIndex(); in_slide_master = pr.get_IsMasterSelected(); } else if (type == Asc.c_oAscTypeSelectElement.Image || type == Asc.c_oAscTypeSelectElement.Shape || type == Asc.c_oAscTypeSelectElement.Chart || type == Asc.c_oAscTypeSelectElement.Table) { shape_locked = pr.get_Locked(); no_object = false; if (type == Asc.c_oAscTypeSelectElement.Table || type == Asc.c_oAscTypeSelectElement.Shape && !pr.get_FromImage()) { no_text = false; } if (type == Asc.c_oAscTypeSelectElement.Table || type == Asc.c_oAscTypeSelectElement.Shape && !pr.get_FromImage() && !pr.get_FromChart()) { no_paragraph = false; } if (type == Asc.c_oAscTypeSelectElement.Chart) { in_chart = true; no_columns = true; } if (type == Asc.c_oAscTypeSelectElement.Shape) { var shapetype = pr.asc_getType(); if (shapetype=='line' || shapetype=='bentConnector2' || shapetype=='bentConnector3' || shapetype=='bentConnector4' || shapetype=='bentConnector5' || shapetype=='curvedConnector2' || shapetype=='curvedConnector3' || shapetype=='curvedConnector4' || shapetype=='curvedConnector5' || shapetype=='straightConnector1') no_columns = true; if (pr.get_FromSmartArt()) in_smartart = true; if (pr.get_FromSmartArtInternal()) in_smartart_internal = true; } if (type == Asc.c_oAscTypeSelectElement.Image || type == Asc.c_oAscTypeSelectElement.Table) no_columns = true; } else if (type === Asc.c_oAscTypeSelectElement.Math) { in_equation = true; } } if (in_chart !== this._state.in_chart) { this.toolbar.btnInsertChart.updateHint(in_chart ? this.toolbar.tipChangeChart : this.toolbar.tipInsertChart); this._state.in_chart = in_chart; } this.toolbar.lockToolbar(Common.enumLock.noParagraphObject, !in_para, {array: [me.toolbar.btnLineSpace]}); this.toolbar.lockToolbar(Common.enumLock.cantMergeShape, !this.api.asc_canMergeSelectedShapes(), { array: [this.toolbar.btnShapesMerge] }); if (this._state.prcontrolsdisable !== paragraph_locked) { if (this._state.activated) this._state.prcontrolsdisable = paragraph_locked; if (paragraph_locked!==undefined) this.toolbar.lockToolbar(Common.enumLock.paragraphLock, paragraph_locked, {array: me.toolbar.paragraphControls}); this.toolbar.lockToolbar(Common.enumLock.paragraphLock, paragraph_locked===true, {array: [me.toolbar.btnInsDateTime, me.toolbar.btnInsSlideNum, me.toolbar.btnInsertEquation]}); } if (this._state.no_paragraph !== no_paragraph) { if (this._state.activated) this._state.no_paragraph = no_paragraph; this.toolbar.lockToolbar(Common.enumLock.noParagraphSelected, no_paragraph, {array: me.toolbar.paragraphControls}); this.toolbar.lockToolbar(Common.enumLock.noParagraphSelected, no_paragraph, {array: [me.toolbar.btnCopyStyle]}); } if (this._state.no_text !== no_text) { if (this._state.activated) this._state.no_text = no_text; this.toolbar.lockToolbar(Common.enumLock.noTextSelected, no_text, {array: me.toolbar.paragraphControls}); } if (this._state.no_object !== no_object ) { if (this._state.activated) this._state.no_object = no_object; this.toolbar.lockToolbar(Common.enumLock.noObjectSelected, no_object, {array: [me.toolbar.btnVerticalAlign ]}); } if (this._state.no_drawing_objects !== no_drawing_objects ) { if (this._state.activated) this._state.no_drawing_objects = no_drawing_objects; this.toolbar.lockToolbar(Common.enumLock.noDrawingObjects, no_drawing_objects, {array: [me.toolbar.btnShapeAlign, me.toolbar.btnShapeArrange, me.toolbar.btnShapesMerge]}); } if (shape_locked!==undefined && this._state.shapecontrolsdisable !== shape_locked) { if (this._state.activated) this._state.shapecontrolsdisable = shape_locked; this.toolbar.lockToolbar(Common.enumLock.shapeLock, shape_locked, {array: me.toolbar.shapeControls.concat(me.toolbar.paragraphControls)}); } if (shape_locked===undefined && !this._state.no_drawing_objects) { // several tables selected this.toolbar.lockToolbar(Common.enumLock.shapeLock, false, {array: me.toolbar.shapeControls}); } if (slide_layout_lock !== undefined && this._state.slidelayoutdisable !== slide_layout_lock ) { if (this._state.activated) this._state.slidelayoutdisable = slide_layout_lock; this.toolbar.lockToolbar(Common.enumLock.slideLock, slide_layout_lock, {array: [me.toolbar.btnChangeSlide]}); } if (slide_deleted !== undefined && this._state.slidecontrolsdisable !== slide_deleted) { if (this._state.activated) this._state.slidecontrolsdisable = slide_deleted; this.toolbar.lockToolbar(Common.enumLock.slideDeleted, slide_deleted, {array: me.toolbar.slideOnlyControls.concat(me.toolbar.paragraphControls)}); } if (this._state.in_equation !== in_equation) { if (this._state.activated) this._state.in_equation = in_equation; this.toolbar.lockToolbar(Common.enumLock.inEquation, in_equation, {array: [me.toolbar.btnSuperscript, me.toolbar.btnSubscript]}); } if (this._state.no_columns !== no_columns) { if (this._state.activated) this._state.no_columns = no_columns; this.toolbar.lockToolbar(Common.enumLock.noColumns, no_columns, {array: [me.toolbar.btnColumns]}); } if (this.toolbar.btnChangeSlide) { if (this.toolbar.btnChangeSlide.mnuSlidePicker) this.toolbar.btnChangeSlide.mnuSlidePicker.options.layout_index = layout_index; else this.toolbar.btnChangeSlide.mnuSlidePicker = {options: {layout_index: layout_index}}; } if (this._state.in_smartart !== in_smartart) { this.toolbar.lockToolbar(Common.enumLock.inSmartart, in_smartart, {array: me.toolbar.paragraphControls}); this._state.in_smartart = in_smartart; } if (this._state.in_smartart_internal !== in_smartart_internal) { this.toolbar.lockToolbar(Common.enumLock.inSmartartInternal, in_smartart_internal, {array: me.toolbar.paragraphControls}); this._state.in_smartart_internal = in_smartart_internal; this.toolbar.mnuArrangeFront.setDisabled(in_smartart_internal); this.toolbar.mnuArrangeBack.setDisabled(in_smartart_internal); this.toolbar.mnuArrangeForward.setDisabled(in_smartart_internal); this.toolbar.mnuArrangeBackward.setDisabled(in_smartart_internal); } }, onApiStyleChange: function(v) { this.toolbar.btnCopyStyle.toggle(v, true); this.modeAlwaysSetStyle = false; }, onApiUpdateThemeIndex: function(v) { if (this._state.themeId !== v) { var listStyle = this.toolbar.listTheme, listStylesVisible = (listStyle.rendered); if (listStylesVisible) { listStyle.suspendEvents(); var styleRec = listStyle.menuPicker.store.findWhere({ themeId: v }); this._state.themeId = (listStyle.menuPicker.store.length>0) ? v : undefined; listStyle.menuPicker.selectRecord(styleRec); listStyle.resumeEvents(); } } }, onApiCanGroup: function(value) { if (this._state.can_group!==value) { this.toolbar.mnuGroupShapes.setDisabled(!value); if (this._state.activated) this._state.can_group = value; } }, onApiCanUnGroup: function(value) { if (this._state.can_ungroup!==value) { this.toolbar.mnuUnGroupShapes.setDisabled(!value); if (this._state.activated) this._state.can_ungroup = value; } }, onApiLockDocumentProps: function() { if (this._state.lock_doc!==true) { this.toolbar.lockToolbar(Common.enumLock.docPropsLock, true, {array: [this.toolbar.btnSlideSize]}); if (this._state.activated) this._state.lock_doc = true; } }, onApiUnLockDocumentProps: function() { if (this._state.lock_doc!==false) { this.toolbar.lockToolbar(Common.enumLock.docPropsLock, false, {array: [this.toolbar.btnSlideSize]}); if (this._state.activated) this._state.lock_doc = false; } }, onApiLockDocumentTheme: function() { this.toolbar.lockToolbar(Common.enumLock.themeLock, true, {array: [this.toolbar.btnColorSchemas, this.toolbar.listTheme]}); }, onApiUnLockDocumentTheme: function() { this.toolbar.lockToolbar(Common.enumLock.themeLock, false, {array: [this.toolbar.btnColorSchemas, this.toolbar.listTheme]}); }, onApiCoAuthoringDisconnect: function(enableDownload) { this.toolbar.setMode({isDisconnected:true, enableDownload: !!enableDownload}); this.editMode = false; }, onApiZoomChange: function(percent, type) {}, onApiInitEditorStyles: function(themes) { if (themes) { this._onInitEditorThemes(themes[0], themes[1]); } }, onNewDocument: function(btn, e) { if (this.api) this.api.OpenNewDocument(); Common.NotificationCenter.trigger('edit:complete', this.toolbar); Common.component.Analytics.trackEvent('ToolBar', 'New Document'); }, onOpenDocument: function(btn, e) { if (this.api) this.api.LoadDocumentFromDisk(); Common.NotificationCenter.trigger('edit:complete', this.toolbar); Common.component.Analytics.trackEvent('ToolBar', 'Open Document'); }, onAddSlide: function(type) { if ( this.api) { this.api.AddSlide(type); Common.NotificationCenter.trigger('edit:complete', this.toolbar); Common.component.Analytics.trackEvent('ToolBar', 'Add Slide'); } }, onDuplicateSlide: function() { if ( this.api) { this.api.DublicateSlide(); Common.NotificationCenter.trigger('edit:complete', this.toolbar); Common.component.Analytics.trackEvent('ToolBar', 'Duplicate Slide'); } }, onDuplicateCheck: function(menu) { if (this.api) menu.items[2].setDisabled(this.api.getCountPages()<1); }, onChangeSlide: function(type) { if (this.api) { this.api.ChangeLayout(type); Common.NotificationCenter.trigger('edit:complete', this.toolbar); Common.component.Analytics.trackEvent('ToolBar', 'Change Layout'); } }, onPreview: function(slidenum, presenter, isCurrent) { Common.NotificationCenter.trigger('preview:start', _.isNumber(slidenum) ? slidenum : 0, presenter, false, isCurrent); }, onPreviewBtnClick: function(btn, e) { this.onPreview(this.api.getCurrentPage(), false, true); }, onPreviewItemClick: function(menu, item) { switch (item.value) { case 0: this.onPreview(0, false, false); break; case 1: this.onPreview(this.api.getCurrentPage(), false, true); break; case 2: this.onPreview(0, true, false); break; case 3: var win, me = this, selectedElements = me.api.getSelectedElements(), loop = false; if (selectedElements && _.isArray(selectedElements)){ for (var i=0; i-1, interfaceLang: me.toolbar.mode.lang, handler: function(result, value) { if (result == 'ok') { if (me.api) { props.asc_putBullet(value); me.api.paraApply(props); } } Common.NotificationCenter.trigger('edit:complete', me.toolbar); } })).show(); } }, onComboBlur: function() { Common.NotificationCenter.trigger('edit:complete', this.toolbar); }, onFontNameSelect: function(combo, record) { if (this.api) { if (record.isNewFont) { !Common.Utils.ModalWindow.isVisible() && Common.UI.warning({ width: 500, msg: this.confirmAddFontName, buttons: ['yes', 'no'], primary: 'yes', callback: _.bind(function(btn) { if (btn == 'yes') { this.api.put_TextPrFontName(record.name); Common.component.Analytics.trackEvent('ToolBar', 'Font Name'); } else { this.toolbar.cmbFontName.setValue(this.api.get_TextProps().get_TextPr().get_FontFamily().get_Name()); } Common.NotificationCenter.trigger('edit:complete', this.toolbar); }, this) }); } else { this.api.put_TextPrFontName(record.name); Common.component.Analytics.trackEvent('ToolBar', 'Font Name'); } } Common.NotificationCenter.trigger('edit:complete', this.toolbar); }, onComboOpen: function(needfocus, combo, e, params) { if (params && params.fromKeyDown) return; _.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.put_TextPrFontSize(record.value); Common.NotificationCenter.trigger('edit:complete', this.toolbar); 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(); setTimeout(function(){ Common.UI.warning({ msg: me.textFontSizeErr, callback: function() { _.defer(function(btn) { $('input', combo.cmpEl).focus(); }) } }); }, 1); combo.setRawValue(value); e.preventDefault(); return false; } } } else { value = Common.Utils.String.parseFloat(record.value); value = value > 300 ? 300 : value < 1 ? 1 : Math.floor((value+0.4)*2)/2; combo.setRawValue(value); this._state.fontsize = undefined; if (this.api) { this.api.put_TextPrFontSize(value); } Common.NotificationCenter.trigger('edit:complete', this.toolbar); } }, onListShowAfter: function(type, picker) { var store = picker.store; var arr = []; store.each(function(item){ arr.push({ numberingInfo: {bullet: item.get('numberingInfo')==='undefined' ? undefined : JSON.parse(item.get('numberingInfo'))}, divId: item.get('id') }); }); if (this.api && this.api.SetDrawImagePreviewBulletForMenu) { this.api.SetDrawImagePreviewBulletForMenu(arr, type); } }, onSelectBullets: function(btn, picker, itemView, record) { var rawData = {}, isPickerSelect = _.isFunction(record.toJSON); if (isPickerSelect){ if (record.get('selected')) { rawData = record.toJSON(); } else { // record deselected return; } } else { rawData = record; } if (btn) { btn.toggle(rawData.data.subtype !== -1, true); } if (this.api){ if (rawData.data.type===0 && rawData.data.subtype===0x1000) {// custom bullet var bullet = rawData.customBullet; if (bullet) { var selectedElements = this.api.getSelectedElements(); if (selectedElements && _.isArray(selectedElements)) { for (var i = 0; i< selectedElements.length; i++) { if (Asc.c_oAscTypeSelectElement.Paragraph == selectedElements[i].get_ObjectType()) { var props = selectedElements[i].get_ObjectValue(); props.asc_putBullet(bullet); this.api.paraApply(props); break; } } } } } else this.api.put_ListType(rawData.data.type, rawData.data.subtype); } Common.NotificationCenter.trigger('edit:complete', this.toolbar); Common.component.Analytics.trackEvent('ToolBar', 'List Type'); }, onLineSpaceToggle: function(menu, item, state, e) { if (!!state) { this._state.linespace = undefined; if (this.api) this.api.put_PrLineSpacing(c_paragraphLinerule.LINERULE_AUTO, item.value); Common.NotificationCenter.trigger('edit:complete', this.toolbar); Common.component.Analytics.trackEvent('ToolBar', 'Line Spacing'); } }, onLineSpaceClick: function(menu, item) { if (item.value==='options') { this.getApplication().getController('RightMenu').onRightMenuOpen(Common.Utils.documentSettingsType.Paragraph); Common.NotificationCenter.trigger('edit:complete', this.toolbar); } }, onColumnsSelect: function(menu, item) { if (_.isUndefined(item.value)) return; this._state.columns = undefined; if (this.api) { if (item.value == 'advanced') { var win, me = this; var selectedElements = me.api.getSelectedElements(); if (selectedElements && selectedElements.length>0){ var elType, elValue; for (var i = selectedElements.length - 1; i >= 0; i--) { elType = selectedElements[i].get_ObjectType(); elValue = selectedElements[i].get_ObjectValue(); if (Asc.c_oAscTypeSelectElement.Shape == elType) { var win = new PE.Views.ShapeSettingsAdvanced( { shapeProps: elValue, slideSize: PE.getController('Toolbar').currentPageSize, handler: function(result, value) { if (result == 'ok') { if (me.api) { me.api.ShapeApply(value.shapeProps); } } Common.NotificationCenter.trigger('edit:complete', me.toolbar); } }); win.show(); win.setActiveCategory(5); break; } } } } else if (item.checked) { var props = new Asc.asc_CShapeProperty(), cols = item.value; props.asc_putColumnNumber(cols+1); this.api.ShapeApply(props); } } Common.NotificationCenter.trigger('edit:complete', this.toolbar); Common.component.Analytics.trackEvent('ToolBar', 'Insert Columns'); }, onBeforeColumns: function() { var index = -1; var selectedElements = this.api.getSelectedElements(); if (selectedElements && selectedElements.length>0){ var elType, elValue; for (var i = selectedElements.length - 1; i >= 0; i--) { if (Asc.c_oAscTypeSelectElement.Shape == selectedElements[i].get_ObjectType()) { var value = selectedElements[i].get_ObjectValue().asc_getColumnNumber(); if (value<4) index = value-1; break; } } } if (this._state.columns === index) return; if (index < 0) this.toolbar.btnColumns.menu.clearAll(true); else this.toolbar.btnColumns.menu.items[index].setChecked(true); this._state.columns = index; }, onTextDirClick: function(menu, item) { this.api && this.api.asc_setRtlTextDirection(!!item.value); Common.NotificationCenter.trigger('edit:complete', this.toolbar); }, onApiTextDirection: function (isRtl){ var toolbar = this.toolbar, oldRtl = toolbar.btnTextDir.options.dirRtl, newRtl = !!isRtl; if (oldRtl !== newRtl) { toolbar.btnTextDir.changeIcon({ next: newRtl ? 'btn-rtl' : 'btn-ltr', curr: oldRtl ? 'btn-rtl' : 'btn-ltr' }); toolbar.btnMarkers.changeIcon({ next: newRtl ? 'btn-setmarkers-rtl' : 'btn-setmarkers', curr: oldRtl ? 'btn-setmarkers-rtl' : 'btn-setmarkers' }); toolbar.btnNumbers.changeIcon({ next: newRtl ? 'btn-numbering-rtl' : 'btn-numbering', curr: oldRtl ? 'btn-numbering-rtl' : 'btn-numbering' }); toolbar.btnDecLeftOffset.cmpEl && toolbar.btnDecLeftOffset.cmpEl[newRtl ? 'addClass' : 'removeClass']('icon-mirrored') toolbar.btnIncLeftOffset.cmpEl && toolbar.btnIncLeftOffset.cmpEl[newRtl ? 'addClass' : 'removeClass']('icon-mirrored') toolbar.btnTextDir.options.dirRtl = !!isRtl; } }, onBeforeShapeAlign: function() { var value = this.api.asc_getSelectedDrawingObjectsCount(), slide_checked = Common.Utils.InternalSettings.get("pe-align-to-slide") || false; this.toolbar.mniAlignObjects.setDisabled(value<2); this.toolbar.mniAlignObjects.setChecked(value>1 && !slide_checked, true); this.toolbar.mniAlignToSlide.setChecked(value<2 || slide_checked, true); this.toolbar.mniDistribHor.setDisabled(value<3 && this.toolbar.mniAlignObjects.isChecked()); this.toolbar.mniDistribVert.setDisabled(value<3 && this.toolbar.mniAlignObjects.isChecked()); }, onShapeAlign: function(menu, item) { if (this.api) { var value = this.toolbar.mniAlignToSlide.isChecked() ? Asc.c_oAscObjectsAlignType.Slide : Asc.c_oAscObjectsAlignType.Selected; if (item.value>-1 && item.value < 6) { this.api.put_ShapesAlign(item.value, value); Common.component.Analytics.trackEvent('ToolBar', 'Shape Align'); } else if (item.value == 6) { this.api.DistributeHorizontally(value); Common.component.Analytics.trackEvent('ToolBar', 'Distribute'); } else if (item.value == 7){ this.api.DistributeVertically(value); Common.component.Analytics.trackEvent('ToolBar', 'Distribute'); } Common.NotificationCenter.trigger('edit:complete', this.toolbar); } }, onShapeArrange: function(menu, item) { if (this.api) { switch (item.value) { case 1: this.api.shapes_bringToFront(); Common.component.Analytics.trackEvent('ToolBar', 'Shape Arrange'); break; case 2: this.api.shapes_bringToBack(); Common.component.Analytics.trackEvent('ToolBar', 'Shape Arrange'); break; case 3: this.api.shapes_bringForward(); Common.component.Analytics.trackEvent('ToolBar', 'Shape Arrange'); break; case 4: this.api.shapes_bringBackward(); Common.component.Analytics.trackEvent('ToolBar', 'Shape Arrange'); break; case 5: this.api.groupShapes(); Common.component.Analytics.trackEvent('ToolBar', 'Shape Group'); break; case 6: this.api.unGroupShapes(); Common.component.Analytics.trackEvent('ToolBar', 'Shape UnGroup'); break; } Common.NotificationCenter.trigger('edit:complete', this.toolbar); } }, onBeforeShapesMerge: function() { this.toolbar.btnShapesMerge.menu.getItems(true).forEach(function (item) { item.setDisabled(!this.api.asc_canMergeSelectedShapes(item.value)); }, this); }, onClickMenuShapesMerge: function (menu, item) { if (item && item.value) { this.api.asc_mergeSelectedShapes(item.value); Common.component.Analytics.trackEvent('ToolBar', 'Shapes Merge'); } Common.NotificationCenter.trigger('edit:complete', this.toolbar); }, onHyperlinkClick: function(btn) { var me = this, win, props, text; if (me.api){ var handlerDlg = function(dlg, result) { if (result == 'ok') { props = dlg.getSettings(); (text!==false) ? me.api.add_Hyperlink(props) : me.api.change_Hyperlink(props); } Common.NotificationCenter.trigger('edit:complete', me.toolbar); }; text = me.api.can_AddHyperlink(); var _arr = []; for (var i=0; i0) && this.api.AddImageUrl(data._urls, undefined, data.token);// for loading from storage Common.component.Analytics.trackEvent('ToolBar', 'Image'); } }, insertImage: function(data) { // gateway if (data && (data.url || data.images)) { data.url && console.log("Obsolete: The 'url' parameter of the 'insertImage' method is deprecated. Please use 'images' parameter instead."); var arr = []; if (data.images && data.images.length>0) { for (var i=0; i0) return; var me = this, equationsStore = this.getApplication().getCollection('EquationGroups'); var onShowAfter = function(menu) { for (var i = 0; i < equationsStore.length; ++i) { var equationPicker = new Common.UI.DataViewSimple({ el: $('#id-toolbar-menu-equationgroup' + i), parentMenu: menu.items[i].menu, store: equationsStore.at(i).get('groupStore'), scrollAlwaysVisible: true, itemTemplate: _.template( '
' + '
' + '
') }); equationPicker.on('item:click', function(picker, item, record, e) { if (me.api) { if (record) me.api.asc_AddMath(record.get('data').equationType); if (me.toolbar.btnsInsertText.pressed()) { me.toolbar.btnsInsertText.toggle(false, true); } if (e.type !== 'click') me.toolbar.btnInsertEquation.menu.hide(); Common.NotificationCenter.trigger('edit:complete', me.toolbar, me.toolbar.btnInsertEquation); Common.component.Analytics.trackEvent('ToolBar', 'Add Equation'); } }); } menu.off('show:after', onShowAfter); }; me.toolbar.btnInsertEquation.menu.on('show:after', onShowAfter); for (var i = 0; i < equationsStore.length; ++i) { var equationGroup = equationsStore.at(i); var menuItem = new Common.UI.MenuItem({ caption: equationGroup.get('groupName'), menu: new Common.UI.Menu({ menuAlign: 'tl-tr', items: [ { template: _.template('') } ] }) }); me.toolbar.btnInsertEquation.menu.addItem(menuItem, true); } }, onInsertEquationClick: function() { if (this.api) { this.api.asc_AddMath(); Common.component.Analytics.trackEvent('ToolBar', 'Add Equation'); } Common.NotificationCenter.trigger('edit:complete', this.toolbar, this.toolbar.btnInsertEquation); }, onInsertSymbolClick: function() { if (this.api) { var me = this, selected = me.api.asc_GetSelectedText(), win = new Common.Views.SymbolTableDialog({ api: me.api, lang: me.toolbar.mode.lang, type: 1, special: true, buttons: [{value: 'ok', caption: this.textInsert}, 'close'], font: selected && selected.length>0 ? me.api.get_TextProps().get_TextPr().get_FontFamily().get_Name() : undefined, symbol: selected && selected.length>0 ? selected.charAt(0) : undefined, handler: function(dlg, result, settings) { if (result == 'ok') { me.insertSymbol(settings.font, settings.code, settings.special, settings.speccharacter); } else Common.NotificationCenter.trigger('edit:complete', me.toolbar); } }); win.show(); win.on('symbol:dblclick', function(cmp, result, settings) { me.insertSymbol(settings.font, settings.code, settings.special, settings.speccharacter); }); } }, onInsertSymbolItemClick: function(picker, item, record, e) { if (this.api && record) this.insertSymbol(record.get('font') , record.get('symbol'), record.get('special')); }, insertSymbol: function(fontRecord, symbol, special, specCharacter){ var font = fontRecord ? fontRecord: this.api.get_TextProps().get_TextPr().get_FontFamily().get_Name(); this.api.asc_insertSymbol(font, symbol, special); !specCharacter && this.toolbar.saveSymbol(symbol, font); }, onApiMathTypes: function(equation) { this._equationTemp = equation; var me = this; var onShowBefore = function(menu) { me.onMathTypes(me._equationTemp); if (me._equationTemp && me._equationTemp.get_Data().length>0) me.fillEquations(); me.toolbar.btnInsertEquation.menu.off('show:before', onShowBefore); }; me.toolbar.btnInsertEquation.menu.on('show:before', onShowBefore); }, onMathTypes: function(equation) { equation = equation || this._equationTemp; var equationgrouparray = [], equationsStore = this.getCollection('EquationGroups'); if (equationsStore.length>0) return; // equations groups var c_oAscMathMainTypeStrings = {}; // [translate, count cells, scroll] c_oAscMathMainTypeStrings[Common.define.c_oAscMathMainType.Symbol ] = [this.textSymbols, 11, false, 'svg-icon-symbols']; c_oAscMathMainTypeStrings[Common.define.c_oAscMathMainType.Fraction ] = [this.textFraction, 4, false, 'svg-icon-fraction']; c_oAscMathMainTypeStrings[Common.define.c_oAscMathMainType.Script ] = [this.textScript, 4, false, 'svg-icon-script']; c_oAscMathMainTypeStrings[Common.define.c_oAscMathMainType.Radical ] = [this.textRadical, 4, false, 'svg-icon-radical']; c_oAscMathMainTypeStrings[Common.define.c_oAscMathMainType.Integral ] = [this.textIntegral, 3, true, 'svg-icon-integral']; c_oAscMathMainTypeStrings[Common.define.c_oAscMathMainType.LargeOperator] = [this.textLargeOperator, 5, true, 'svg-icon-largeOperator']; c_oAscMathMainTypeStrings[Common.define.c_oAscMathMainType.Bracket ] = [this.textBracket, 4, true, 'svg-icon-bracket']; c_oAscMathMainTypeStrings[Common.define.c_oAscMathMainType.Function ] = [this.textFunction, 3, true, 'svg-icon-function']; c_oAscMathMainTypeStrings[Common.define.c_oAscMathMainType.Accent ] = [this.textAccent, 4, false, 'svg-icon-accent']; c_oAscMathMainTypeStrings[Common.define.c_oAscMathMainType.LimitLog ] = [this.textLimitAndLog, 3, false, 'svg-icon-limAndLog']; c_oAscMathMainTypeStrings[Common.define.c_oAscMathMainType.Operator ] = [this.textOperator, 4, false, 'svg-icon-operator']; c_oAscMathMainTypeStrings[Common.define.c_oAscMathMainType.Matrix ] = [this.textMatrix, 4, true, 'svg-icon-matrix']; // equations sub groups // equations types var translationTable = {}, name = '', translate = ''; for (name in Common.define.c_oAscMathType) { if (Common.define.c_oAscMathType.hasOwnProperty(name)) { var arr = name.split('_'); if (arr.length==2 && arr[0]=='Symbol') { translate = 'txt' + arr[0] + '_' + arr[1].toLocaleLowerCase(); } else translate = 'txt' + name; translationTable[Common.define.c_oAscMathType[name]] = this[translate]; } } var i,id = 0, count = 0, length = 0, width = 0, height = 0, store = null, list = null, eqStore = null, eq = null, data; if (equation) { data = equation.get_Data(); count = data.length; if (count) { for (var j = 0; j < count; ++j) { var group = data[j]; id = group.get_Id(); width = group.get_W(); height = group.get_H(); store = new Backbone.Collection([], { model: PE.Models.EquationModel }); if (store) { var allItemsCount = 0, itemsCount = 0, ids = 0, arr = []; length = group.get_Data().length; for (i = 0; i < length; ++i) { eqStore = group.get_Data()[i]; itemsCount = eqStore.get_Data().length; for (var p = 0; p < itemsCount; ++p) { eq = eqStore.get_Data()[p]; ids = eq.get_Id(); translate = ''; if (translationTable.hasOwnProperty(ids)) { translate = translationTable[ids]; } arr.push({ data : {equationType: ids}, tip : translate, allowSelected : true, selected : false, width : eqStore.get_W(), height : eqStore.get_H(), posX : -eq.get_X(), posY : -eq.get_Y() }); } allItemsCount += itemsCount; } store.add(arr); width = c_oAscMathMainTypeStrings[id][1] * (width + 10); // 4px margin + 4px margin + 1px border + 1px border var normHeight = parseInt(370 / (height + 10)) * (height + 10); equationgrouparray.push({ groupName : c_oAscMathMainTypeStrings[id][0], groupStore : store, groupWidth : width, groupHeight : normHeight, groupHeightStr : c_oAscMathMainTypeStrings[id][2] ? ' height:'+ normHeight +'px!important; ' : '', groupIcon: c_oAscMathMainTypeStrings[id][3] }); } } equationsStore.add(equationgrouparray); // this.fillEquations(); } } }, updateThemeColors: function() { if (Common.Utils.ThemeColor.getEffectColors()===undefined) return; var updateColors = function(picker, defaultColorIndex) { if (picker) { var clr; var effectcolors = Common.Utils.ThemeColor.getEffectColors(); if (!effectcolors) return; for (var i = 0; i < effectcolors.length; i++) { if (typeof(picker.currentColor) == 'object' && clr === undefined && picker.currentColor.effectId == effectcolors[i].effectId) clr = effectcolors[i]; } picker.updateColors(effectcolors, Common.Utils.ThemeColor.getStandartColors()); if (picker.currentColor === undefined) { picker.currentColor = effectcolors[defaultColorIndex]; } else if ( clr!==undefined ) { picker.currentColor = clr; } } }; updateColors(this.toolbar.mnuFontColorPicker, 1); if (this.toolbar.btnFontColor.currentColor===undefined) { this.toolbar.btnFontColor.currentColor = this.toolbar.mnuFontColorPicker.currentColor ? this.toolbar.mnuFontColorPicker.currentColor.color || this.toolbar.mnuFontColorPicker.currentColor : this.toolbar.mnuFontColorPicker.currentColor; this.toolbar.btnFontColor.setColor(this.toolbar.btnFontColor.currentColor); } if (this._state.clrtext_asccolor!==undefined) { this._state.clrtext = undefined; this.onApiTextColor(this._state.clrtext_asccolor); } this._state.clrtext_asccolor = undefined; }, _onInitEditorThemes: function(editorThemes/*array */, documentThemes) { var me = this; window.styles_loaded = false; if (!me.toolbar.listTheme) { me.themes = [ editorThemes, documentThemes ]; return; } var defaultThemes = editorThemes || [], docThemes = documentThemes || []; me.toolbar.listTheme.menuPicker.store.reset([]); // remove all var themeStore = this.getCollection('SlideThemes'), mainController = this.getApplication().getController('Main'); if (themeStore) { var arr1 = [], arr2 = []; _.each(defaultThemes, function(theme, index) { var tip = mainController.translationTable[(theme.get_Name() || '').toLocaleLowerCase()] || theme.get_Name(); arr1.push(new Common.UI.DataViewModel({ uid : Common.UI.getId(), themeId : theme.get_Index(), tip : tip, offsety : index * 40 })); arr2.push({ uid : Common.UI.getId(), themeId : theme.get_Index(), tip : tip, offsety : index * 40 }); }); _.each(docThemes, function(theme) { var image = theme.get_Image(), tip = mainController.translationTable[(theme.get_Name() || '').toLocaleLowerCase()] || theme.get_Name(); arr1.push(new Common.UI.DataViewModel({ imageUrl: image, uid : Common.UI.getId(), themeId : theme.get_Index(), tip : tip, offsety : 0 })); arr2.push({ imageUrl: image, uid : Common.UI.getId(), themeId : theme.get_Index(), tip : tip, offsety : 0 }); }); themeStore.reset(arr1); me.toolbar.listTheme.menuPicker.store.reset(arr2); } if (me.toolbar.listTheme.menuPicker.store.length > 0 && me.toolbar.listTheme.rendered){ me.toolbar.listTheme.fillComboView(me.toolbar.listTheme.menuPicker.store.at(0), true); Common.NotificationCenter.trigger('edit:complete', this); } this._state.themeId = undefined; window.styles_loaded = true; }, onHideMenus: function(e){ Common.NotificationCenter.trigger('edit:complete', this.toolbar); }, onSetupCopyStyleButton: function () { this.modeAlwaysSetStyle = false; var me = this; Common.NotificationCenter.on({ 'edit:complete': function () { if (me.api && me.modeAlwaysSetStyle) { me.api.SetPaintFormat(AscCommon.c_oAscFormatPainterState.kOff); me.toolbar.btnCopyStyle.toggle(false, true); me.modeAlwaysSetStyle = false; } } }); $(me.toolbar.btnCopyStyle.cmpEl).dblclick(function () { if (me.api) { me.modeAlwaysSetStyle = true; me.toolbar.btnCopyStyle.toggle(true, true); me.api.SetPaintFormat(AscCommon.c_oAscFormatPainterState.kMultiple); } }); }, activateControls: function() { this.onApiPageSize(this.api.get_PresentationWidth(), this.api.get_PresentationHeight()); this.toolbar.lockToolbar(Common.enumLock.disableOnStart, false, {array: this.toolbar.slideOnlyControls.concat(this.toolbar.shapeControls)}); this.toolbar.lockToolbar(Common.enumLock.copyLock, this._state.can_copycut!==true, {array: [this.toolbar.btnCopy, this.toolbar.btnCut]}); this._state.activated = true; }, DisableToolbar: function(disable, viewMode) { if (viewMode!==undefined) this.editMode = !viewMode; disable = disable || !this.editMode; var mask = $('.toolbar-mask'); if (disable && mask.length>0 || !disable && mask.length==0) return; var toolbar = this.toolbar; toolbar.hideMoreBtns(); toolbar.$el.find('.toolbar').toggleClass('masked', disable); if (toolbar.btnAddSlide) // toolbar buttons are rendered this.toolbar.lockToolbar(Common.enumLock.menuFileOpen, disable, {array: [toolbar.btnAddSlide, toolbar.btnChangeSlide, toolbar.btnPreview]}); var hkComments = Common.Utils.isMac ? 'command+alt+a' : 'alt+h', hkPreview = Common.Utils.isMac ? 'command+shift+enter' : 'ctrl+f5'; if(disable) { mask = $("
").appendTo(toolbar.$el.find('.toolbar')); Common.util.Shortcuts.suspendEvents('command+k, ctrl+k, ' + hkPreview + ', ' + hkComments); } else { mask.remove(); Common.util.Shortcuts.resumeEvents('command+k, ctrl+k, ' + hkPreview + ', ' + hkComments); } }, createDelayedElements: function() { this.toolbar.createDelayedElements(); this.attachUIEvents(this.toolbar); this._state.needCallApiBullets && this.onApiBullets(this._state.needCallApiBullets); Common.Utils.injectSvgIcons(); }, onAppShowed: function (config) { var me = this; var editmode = config.isEdit, compactview = !editmode; if ( Common.localStorage.itemExists(editmode ? "pe-compact-toolbar" : "pe-view-compact-toolbar") ) { compactview = Common.localStorage.getBool(editmode ? "pe-compact-toolbar" : "pe-view-compact-toolbar"); } else if (config.customization) { compactview = editmode ? !!config.customization.compactToolbar : config.customization.compactToolbar!==false; } Common.Utils.InternalSettings.set('toolbar-active-tab', !editmode && !compactview); me.toolbar.render(_.extend({compactview: editmode ? compactview : true}, config)); var tab = {action: 'review', caption: me.toolbar.textTabCollaboration, layoutname: 'toolbar-collaboration', dataHintTitle: 'U'}; var $panel = me.getApplication().getController('Common.Controllers.ReviewChanges').createToolbarPanel(); if ( $panel ) { me.toolbar.addTab(tab, $panel, 5); me.toolbar.setVisible('review', (config.isEdit || config.canViewReview || config.canCoAuthoring && config.canComments) && Common.UI.LayoutManager.isElementVisible('toolbar-collaboration')); } if ( config.isEdit ) { me.toolbar.setMode(config); var drawtab = me.getApplication().getController('Common.Controllers.Draw'); drawtab.setApi(me.api).setMode(config); $panel = drawtab.createToolbarPanel(); if ($panel) { tab = {action: 'draw', caption: me.toolbar.textTabDraw, extcls: 'canedit', layoutname: 'toolbar-draw', dataHintTitle: 'C'}; me.toolbar.addTab(tab, $panel, 2); me.toolbar.setVisible('draw', Common.UI.LayoutManager.isElementVisible('toolbar-draw')); me.btnsDrawTab = drawtab.getView().getButtons(); Array.prototype.push.apply(me.toolbar.lockControls, me.btnsDrawTab); Array.prototype.push.apply(me.toolbar.slideOnlyControls, me.btnsDrawTab); } var transitController = me.getApplication().getController('Transitions'); transitController.setApi(me.api).setConfig({toolbar: me,mode:config}).createToolbarPanel(); Array.prototype.push.apply(me.toolbar.lockControls,transitController.getView().getButtons()); Array.prototype.push.apply(me.toolbar.slideOnlyControls,transitController.getView().getButtons()); var animationController = me.getApplication().getController('Animation'); animationController.setApi(me.api).setConfig({toolbar: me,mode:config}).createToolbarPanel(); Array.prototype.push.apply(me.toolbar.slideOnlyControls,animationController.getView().getButtons()); tab = {caption: me.toolbar.textTabSlideMaster, action: 'slideMaster', extcls: config.isEdit ? 'canedit' : '', layoutname: 'toolbar-slidemaster', dataHintTitle: 'M'}; var slideMasterTab = me.getApplication().getController('SlideMasterTab'); slideMasterTab.setApi(me.api).setConfig({toolbar: me, mode: config}); $panel = slideMasterTab.createToolbarPanel(); if ($panel) { var visible = Common.UI.LayoutManager.isElementVisible('toolbar-slidemaster'); me.toolbar.addTab(tab, $panel, 6); me.toolbar.setVisible('slideMaster', !visible); !editmode && !compactview && visible && Common.Utils.InternalSettings.set('toolbar-active-tab', 'view'); // need to activate later Array.prototype.push.apply(me.toolbar.lockControls, slideMasterTab.getView('SlideMasterTab').getButtons()); Array.prototype.push.apply(me.toolbar.slideOnlyControls, slideMasterTab.getView('SlideMasterTab').getButtons()); } me.toolbar.btnSave.on('disabled', _.bind(me.onBtnChangeState, me, 'save:disabled')); if (!config.compactHeader) { // hide 'print' and 'save' buttons group and next separator me.toolbar.btnPrint.$el.parents('.group').hide().next().hide(); // hide 'undo' and 'redo' buttons and get container var $box = me.toolbar.btnUndo.$el.hide().next().hide().parent(); // move 'paste' button to the container instead of 'undo' and 'redo' me.toolbar.btnPaste.$el.detach().appendTo($box); me.toolbar.btnPaste.$el.find('button').attr('data-hint-direction', 'bottom'); me.toolbar.btnCopy.$el.removeClass('split'); me.toolbar.processPanelVisible(null, true); } if ( config.canProtect && config.isDesktopApp ) { if (config.isSignatureSupport || config.isPasswordSupport) { // don't add protect panel to toolbar tab = {action: 'protect', caption: me.toolbar.textTabProtect, layoutname: 'toolbar-protect', dataHintTitle: 'T'}; $panel = me.getApplication().getController('Common.Controllers.Protection').createToolbarPanel(); if ($panel) { me.toolbar.addTab(tab, $panel, 8); me.toolbar.setVisible('protect', Common.UI.LayoutManager.isElementVisible('toolbar-protect')); } } } me.getApplication().getController('Common.Controllers.ExternalLinks').setConfig({toolbar: me}).setApi(me.api); } else { me.getApplication().getController('Common.Controllers.Draw').setApi(me.api).setMode(config); } tab = {caption: me.toolbar.textTabView, action: 'view', extcls: config.isEdit ? 'canedit' : '', layoutname: 'toolbar-view', dataHintTitle: 'W'}; var viewtab = me.getApplication().getController('ViewTab'); viewtab.setApi(me.api).setConfig({toolbar: me, mode: config}); $panel = viewtab.createToolbarPanel(); if ($panel) { var visible = Common.UI.LayoutManager.isElementVisible('toolbar-view'); me.toolbar.addTab(tab, $panel, 9); me.toolbar.setVisible('view', visible); !editmode && !compactview && visible && Common.Utils.InternalSettings.set('toolbar-active-tab', 'view'); // need to activate later } }, onAppReady: function (config) { var me = this; me.appOptions = config; this.btnsComment = []; if ( config.canCoAuthoring && config.canComments ) { var _set = Common.enumLock; this.btnsComment = Common.Utils.injectButtons(this.toolbar.$el.find('.slot-comment'), 'tlbtn-addcomment-', 'toolbar__icon btn-big-add-comment', me.toolbar.capBtnComment, [_set.lostConnect, _set.noSlides, _set.slideMasterMode], undefined, undefined, undefined, '1', 'bottom', 'small'); if ( this.btnsComment.length ) { var _comments = PE.getController('Common.Controllers.Comments').getView(); Array.prototype.push.apply(me.toolbar.lockControls, this.btnsComment); Common.UI.LayoutManager.addControls(this.btnsComment); this.btnsComment.forEach(function (btn) { btn.updateHint( _comments.textHintAddComment ); btn.on('click', function (btn, e) { Common.NotificationCenter.trigger('app:comment:add', 'toolbar'); }); if (btn.cmpEl.closest('#review-changes-panel').length>0) btn.setCaption(me.toolbar.capBtnAddComment); }, this); if (_comments.buttonAddNew) { _comments.buttonAddNew.options.lock = [ _set.lostConnect, _set.noSlides ]; this.btnsComment.add(_comments.buttonAddNew); } this.toolbar.lockToolbar(Common.enumLock.noSlides, this._state.no_slides, { array: this.btnsComment }); } } Common.Utils.asyncCall(function () { if ( config.isEdit ) { } }); }, onFileMenu: function (opts) { if ( opts == 'show' ) { if ( !this.toolbar.isTabActive('file') ) this.toolbar.setTab('file'); } else { if ( this.toolbar.isTabActive('file') ) this.toolbar.setTab(); } }, onTextLanguage: function(langId) { this._state.lang = langId; }, onAddAudio: function() { this.api && this.api.asc_AddAudio(); }, onAddVideo: function() { this.api && this.api.asc_AddVideo(); }, onApiCanCopyCut: function(can) { if (this._state.can_copycut !== can) { this.toolbar.lockToolbar(Common.enumLock.copyLock, !can, {array: [this.toolbar.btnCopy, this.toolbar.btnCut]}); this._state.can_copycut = can; } }, mouseenterSmartArt: function (groupName, menu) { if (this.smartArtGenerating === undefined) { this.generateSmartArt(groupName, menu); } else { this.delayedSmartArt = groupName; this.delayedSmartArtMenu = menu; } }, mouseleaveSmartArt: function (groupName) { if (this.delayedSmartArt === groupName) { this.delayedSmartArt = undefined; } }, generateSmartArt: function (groupName, menu) { this.docHolderMenu = menu; this.api.asc_generateSmartArtPreviews(groupName); }, onApiBeginSmartArtPreview: function (type) { this.smartArtGenerating = type; this.smartArtGroups = this.docHolderMenu ? this.docHolderMenu.items : this.toolbar.btnInsertSmartArt.menu.getItems(true); var menuPicker = _.findWhere(this.smartArtGroups, {value: type}).menuPicker; menuPicker.loaded = true; this.smartArtData = Common.define.smartArt.getSmartArtData(); }, onApiAddSmartArtPreview: function (previews) { previews.forEach(_.bind(function (preview) { var image = preview.asc_getImage(), sectionId = preview.asc_getSectionId(), section = _.findWhere(this.smartArtData, {sectionId: sectionId}), item = _.findWhere(section.items, {type: image.asc_getName()}), menu = _.findWhere(this.smartArtGroups, {value: sectionId}), menuPicker = menu.menuPicker, pickerItem = menuPicker.store.findWhere({isLoading: true}); if (pickerItem) { pickerItem.set('isLoading', false, {silent: true}); pickerItem.set('value', item.type, {silent: true}); pickerItem.set('imageUrl', image.asc_getImage(), {silent: true}); pickerItem.set('tip', item.tip); } this.currentSmartArtCategoryMenu = menu; }, this)); }, onApiEndSmartArtPreview: function () { this.smartArtGenerating = undefined; if (this.currentSmartArtCategoryMenu) { this.currentSmartArtCategoryMenu.menu.alignPosition(); this.currentSmartArtCategoryMenu.cmpEl && this.currentSmartArtCategoryMenu.cmpEl.attr('data-preview-loaded', true); } if (this.delayedSmartArt !== undefined) { var delayedSmartArt = this.delayedSmartArt; this.delayedSmartArt = undefined; this.generateSmartArt(delayedSmartArt, this.delayedSmartArtMenu); } }, onApiLockSlideHdrFtrApplyToAll: function(isLocked) { this._state.isLockedSlideHeaderAppyToAll = isLocked; }, onInsertSmartArt: function (value) { if (this.api) { this.api.asc_createSmartArt(value); } }, eyedropperStart: function () { if (this.toolbar.btnCopyStyle.pressed) { this.toolbar.btnCopyStyle.toggle(false, true); this.api.SetPaintFormat(AscCommon.c_oAscFormatPainterState.kOff); this.modeAlwaysSetStyle = false; } if (this.toolbar.btnHighlightColor.pressed) this.toolbar.btnHighlightColor.toggle(false, true); }, onEyedropperStart: function (btn) { this.toolbar._isEyedropperStart = true; this.api.asc_startEyedropper(_.bind(btn.eyedropperEnd, btn)); }, onEyedropperEnd: function () { this.toolbar._isEyedropperStart = false; }, onPluginToolbarMenu: function(data) { var api = this.api; this.toolbar && Array.prototype.push.apply(this.toolbar.lockControls, Common.UI.LayoutManager.addCustomControls(this.toolbar, data, function(guid, value, pressed) { api && api.onPluginToolbarMenuItemClick(guid, value, pressed); })); }, onPluginToolbarCustomMenuItems: function(action, data) { if (!this._isDocReady) { this._state.customPluginData = (this._state.customPluginData || []).concat([{action: action, data: data}]); return; } var api = this.api; this.toolbar && Common.UI.LayoutManager.addCustomMenuItems(action, data, function(guid, value) { api && api.onPluginContextMenuItemClick(guid, value); }); }, onPluginUpdateToolbarMenu: function(data) { var api = this.api; this.toolbar && Array.prototype.push.apply(this.toolbar.lockControls, Common.UI.LayoutManager.addCustomControls(this.toolbar, data, function(guid, value, pressed) { api && api.onPluginToolbarMenuItemClick(guid, value, pressed); }, true)); }, onDocumentReady: function() { this._isDocReady = true; var me = this; this._state.customPluginData && this._state.customPluginData.forEach(function(plugin) { me.onPluginToolbarCustomMenuItems(plugin.action, plugin.data); }); this._state.customPluginData = null; }, onChangeViewMode: function (mode) { // master or normal var isMaster = mode==='master'; this.toolbar.$el.find('.master-slide-mode')[isMaster?'show':'hide'](); this.toolbar.$el.find('.normal-mode')[!isMaster?'show':'hide'](); this.toolbar.lockToolbar(Common.enumLock.slideMasterMode, isMaster, { array: this.btnsComment.concat([this.toolbar.btnInsertHyperlink]) }); this._state.viewMode = mode; if (isMaster) { Common.NotificationCenter.trigger('tab:visible', 'slideMaster', true); this.toolbar.setTab('slideMaster'); setTimeout(function() { Common.UI.TooltipManager.showTip('masterTab'); }, 100); } else { Common.NotificationCenter.trigger('tab:visible', 'slideMaster', false); this.toolbar.setTab('home'); this.showStaticElements(); } Common.NotificationCenter.trigger('tab:visible', 'transit', !isMaster); Common.NotificationCenter.trigger('tab:visible', 'animate', !isMaster); }, onActiveTab: function(tab) { (tab !== 'slideMaster') && Common.UI.TooltipManager.closeTip('masterTab'); }, onBeforeActiveTab: function(tab) { this._state.activeTab = tab; this.showStaticElements(); }, onTabCollapse: function(tab) { }, showStaticElements: function() { var me = this; var showingStaticElements = [ { el: this.toolbar.btnAddSlide ? this.toolbar.btnAddSlide.$el.closest('.group') : null, tabs: ['home', 'design', 'ins'], viewMode: 'normal' }, { el: this.toolbar.btnChangeSlide ? this.toolbar.btnChangeSlide.$el.closest('.group') : null, tabs: ['home', 'design'], viewMode: 'normal' }, { el: this.toolbar.btnAddSlideMaster ? this.toolbar.btnAddSlideMaster.$el.closest('.group') : null, tabs: ['home', 'design', 'ins'], viewMode: 'master' } ]; var countShowingButtons = 0; showingStaticElements.forEach(function(item) { if(!item.el) return; if(item.tabs.includes(me._state.activeTab) && (item.viewMode === me._state.viewMode || !item.viewMode)) { item.el.show(); countShowingButtons += 1; } else item.el.hide(); }); this.toolbar.$el.find('#id-toolbar-separator-end-static')[countShowingButtons > 0 ? 'show' : 'hide'](); } }, PE.Controllers.Toolbar || {})); });