diff --git a/apps/documenteditor/main/app/view/DocumentHolder.js b/apps/documenteditor/main/app/view/DocumentHolder.js index 39f7e3c01..1f5daa93f 100644 --- a/apps/documenteditor/main/app/view/DocumentHolder.js +++ b/apps/documenteditor/main/app/view/DocumentHolder.js @@ -2264,6 +2264,43 @@ define([ } }); + var menuImgReplace = new Common.UI.MenuItem({ + caption : me.textReplace, + menu : new Common.UI.Menu({ + menuAlign: 'tl-tr', + items: [ + new Common.UI.MenuItem({ + caption : this.textFromFile + }).on('click', function(item) { + setTimeout(function(){ + if (me.api) me.api.ChangeImageFromFile(); + me.fireEvent('editcomplete', me); + }, 10); + }), + new Common.UI.MenuItem({ + caption : this.textFromUrl + }).on('click', function(item) { + var me = this; + (new Common.Views.ImageFromUrlDialog({ + handler: function(result, value) { + if (result == 'ok') { + if (me.api) { + var checkUrl = value.replace(/ /g, ''); + if (!_.isEmpty(checkUrl)) { + var props = new Asc.asc_CImgProperty(); + props.put_ImageUrl(checkUrl); + me.api.ImgApply(props); + } + } + } + me.fireEvent('editcomplete', me); + } + })).show(); + }) + ] + }) + }); + var menuImgCopy = new Common.UI.MenuItem({ caption : me.textCopy, value : 'copy' @@ -2341,13 +2378,19 @@ define([ menuChartEdit.setVisible(!_.isNull(value.imgProps.value.get_ChartProperties()) && !onlyCommonProps); - me.menuOriginalSize.setVisible(value.imgProps.isOnlyImg); - me.pictureMenu.items[10].setVisible(menuChartEdit.isVisible() || me.menuOriginalSize.isVisible()); + me.menuOriginalSize.setVisible(value.imgProps.isOnlyImg || !value.imgProps.isChart && !value.imgProps.isShape); + + var pluginGuid = value.imgProps.value.asc_getPluginGuid(); + menuImgReplace.setVisible(value.imgProps.isOnlyImg && (pluginGuid===null || pluginGuid===undefined)); + if (menuImgReplace.isVisible()) + menuImgReplace.setDisabled(islocked || pluginGuid===null); var islocked = value.imgProps.locked || (value.headerProps!==undefined && value.headerProps.locked); if (menuChartEdit.isVisible()) menuChartEdit.setDisabled(islocked || value.imgProps.value.get_SeveralCharts()); + me.pictureMenu.items[14].setVisible(menuChartEdit.isVisible()); + me.menuOriginalSize.setDisabled(islocked || value.imgProps.value.get_ImageUrl()===null || value.imgProps.value.get_ImageUrl()===undefined); menuImageAdvanced.setDisabled(islocked); menuImageAlign.setDisabled( islocked || (wrapping == Asc.c_oAscWrapStyle2.Inline) ); @@ -2390,6 +2433,7 @@ define([ me.menuImageWrap, { caption: '--' }, me.menuOriginalSize, + menuImgReplace, menuChartEdit, { caption: '--' }, menuImageAdvanced @@ -3729,7 +3773,10 @@ define([ textTOCSettings: 'Table of contents settings', textTOC: 'Table of contents', textRefreshField: 'Refresh field', - txtPasteSourceFormat: 'Keep source formatting' + txtPasteSourceFormat: 'Keep source formatting', + textReplace: 'Replace image', + textFromUrl: 'From URL', + textFromFile: 'From File' }, DE.Views.DocumentHolder || {})); }); \ No newline at end of file diff --git a/apps/documenteditor/main/locale/en.json b/apps/documenteditor/main/locale/en.json index 7a23eb73b..c88209c03 100644 --- a/apps/documenteditor/main/locale/en.json +++ b/apps/documenteditor/main/locale/en.json @@ -1023,6 +1023,9 @@ "DE.Views.DocumentHolder.txtUngroup": "Ungroup", "DE.Views.DocumentHolder.updateStyleText": "Update %1 style", "DE.Views.DocumentHolder.vertAlignText": "Vertical Alignment", + "DE.Views.DocumentHolder.textReplace": "Replace image", + "DE.Views.DocumentHolder.textFromUrl": "From URL", + "DE.Views.DocumentHolder.textFromFile": "From File", "DE.Views.DropcapSettingsAdvanced.cancelButtonText": "Cancel", "DE.Views.DropcapSettingsAdvanced.okButtonText": "Ok", "DE.Views.DropcapSettingsAdvanced.strBorders": "Borders & Fill", diff --git a/apps/presentationeditor/main/app/view/DocumentHolder.js b/apps/presentationeditor/main/app/view/DocumentHolder.js index 3724351ad..cc234fcf6 100644 --- a/apps/presentationeditor/main/app/view/DocumentHolder.js +++ b/apps/presentationeditor/main/app/view/DocumentHolder.js @@ -2723,6 +2723,43 @@ define([ } }); + var menuImgReplace = new Common.UI.MenuItem({ + caption : me.textReplace, + menu : new Common.UI.Menu({ + menuAlign: 'tl-tr', + items: [ + new Common.UI.MenuItem({ + caption : this.textFromFile + }).on('click', function(item) { + setTimeout(function(){ + if (me.api) me.api.ChangeImageFromFile(); + me.fireEvent('editcomplete', me); + }, 10); + }), + new Common.UI.MenuItem({ + caption : this.textFromUrl + }).on('click', function(item) { + var me = this; + (new Common.Views.ImageFromUrlDialog({ + handler: function(result, value) { + if (result == 'ok') { + if (me.api) { + var checkUrl = value.replace(/ /g, ''); + if (!_.isEmpty(checkUrl)) { + var props = new Asc.asc_CImgProperty(); + props.put_ImageUrl(checkUrl); + me.api.ImgApply(props); + } + } + } + me.fireEvent('editcomplete', me); + } + })).show(); + }) + ] + }) + }); + /** coauthoring begin **/ var menuAddCommentPara = new Common.UI.MenuItem({ caption : me.addCommentText @@ -3117,18 +3154,23 @@ define([ mnuGroupImg.setDisabled(!me.api.canGroup()); } - var imgdisabled = (value.imgProps!==undefined && value.imgProps.locked), + var isimage = (_.isUndefined(value.shapeProps) || value.shapeProps.value.get_FromImage()) && _.isUndefined(value.chartProps), + imgdisabled = (value.imgProps!==undefined && value.imgProps.locked), shapedisabled = (value.shapeProps!==undefined && value.shapeProps.locked), chartdisabled = (value.chartProps!==undefined && value.chartProps.locked), - disabled = imgdisabled || shapedisabled || chartdisabled || (value.slideProps!==undefined && value.slideProps.locked); + disabled = imgdisabled || shapedisabled || chartdisabled || (value.slideProps!==undefined && value.slideProps.locked), + pluginGuid = (value.imgProps) ? value.imgProps.value.asc_getPluginGuid() : null; // image properties - menuImgOriginalSize.setVisible((_.isUndefined(value.shapeProps) || value.shapeProps.value.get_FromImage()) && _.isUndefined(value.chartProps)); - + menuImgOriginalSize.setVisible(isimage); if (menuImgOriginalSize.isVisible()) menuImgOriginalSize.setDisabled(disabled || _.isNull(value.imgProps.value.get_ImageUrl()) || _.isUndefined(value.imgProps.value.get_ImageUrl())); - menuImageAdvanced.setVisible((_.isUndefined(value.shapeProps) || value.shapeProps.value.get_FromImage()) && _.isUndefined(value.chartProps)); + menuImgReplace.setVisible(isimage && (pluginGuid===null || pluginGuid===undefined)); + if (menuImgReplace.isVisible()) + menuImgReplace.setDisabled(disabled || pluginGuid===null); + + menuImageAdvanced.setVisible(isimage); menuShapeAdvanced.setVisible(_.isUndefined(value.imgProps) && _.isUndefined(value.chartProps)); menuChartEdit.setVisible(_.isUndefined(value.imgProps) && !_.isUndefined(value.chartProps) && (_.isUndefined(value.shapeProps) || value.shapeProps.isChart)); menuImgShapeSeparator.setVisible(menuImageAdvanced.isVisible() || menuShapeAdvanced.isVisible() || menuChartEdit.isVisible()); @@ -3155,6 +3197,7 @@ define([ menuImgShapeAlign, menuImgShapeSeparator, menuImgOriginalSize, + menuImgReplace, menuImageAdvanced, menuShapeAdvanced ,menuChartEdit @@ -3399,7 +3442,10 @@ define([ txtPasteSourceFormat: 'Keep source formatting', txtPasteDestFormat: 'Use destination theme', textDistributeRows: 'Distribute rows', - textDistributeCols: 'Distribute columns' + textDistributeCols: 'Distribute columns', + textReplace: 'Replace image', + textFromUrl: 'From URL', + textFromFile: 'From File' }, PE.Views.DocumentHolder || {})); }); \ No newline at end of file diff --git a/apps/presentationeditor/main/app/view/ImageSettings.js b/apps/presentationeditor/main/app/view/ImageSettings.js index f132d85c5..189eb1188 100644 --- a/apps/presentationeditor/main/app/view/ImageSettings.js +++ b/apps/presentationeditor/main/app/view/ImageSettings.js @@ -174,7 +174,7 @@ define([ this.btnOriginalSize.setDisabled(props.get_ImageUrl()===null || props.get_ImageUrl()===undefined || this._locked); var pluginGuid = props.asc_getPluginGuid(); - value = (pluginGuid !== null && pluginGuid !== undefined); + value = (pluginGuid !== null && pluginGuid !== undefined); // undefined - only images are selected, null - selected images and ole-objects if (this._state.isOleObject!==value) { this.btnInsertFromUrl.setVisible(!value); this.btnInsertFromFile.setVisible(!value); diff --git a/apps/presentationeditor/main/locale/en.json b/apps/presentationeditor/main/locale/en.json index f5726569e..5df9b4cc1 100644 --- a/apps/presentationeditor/main/locale/en.json +++ b/apps/presentationeditor/main/locale/en.json @@ -901,6 +901,9 @@ "PE.Views.DocumentHolder.txtUnderbar": "Bar under text", "PE.Views.DocumentHolder.txtUngroup": "Ungroup", "PE.Views.DocumentHolder.vertAlignText": "Vertical Alignment", + "PE.Views.DocumentHolder.textReplace": "Replace image", + "PE.Views.DocumentHolder.textFromUrl": "From URL", + "PE.Views.DocumentHolder.textFromFile": "From File", "PE.Views.DocumentPreview.goToSlideText": "Go to Slide", "PE.Views.DocumentPreview.slideIndexText": "Slide {0} of {1}", "PE.Views.DocumentPreview.txtClose": "Close slideshow", diff --git a/apps/spreadsheeteditor/main/app/controller/DocumentHolder.js b/apps/spreadsheeteditor/main/app/controller/DocumentHolder.js index a0045ae27..50b3e0d5e 100644 --- a/apps/spreadsheeteditor/main/app/controller/DocumentHolder.js +++ b/apps/spreadsheeteditor/main/app/controller/DocumentHolder.js @@ -194,6 +194,8 @@ define([ view.textInShapeMenu.on('render:after', _.bind(me.onTextInShapeAfterRender, me)); view.menuSignatureEditSign.on('click', _.bind(me.onSignatureClick, me)); view.menuSignatureEditSetup.on('click', _.bind(me.onSignatureClick, me)); + view.menuImgOriginalSize.on('click', _.bind(me.onOriginalSizeClick, me)); + view.menuImgReplace.menu.on('item:click', _.bind(me.onImgReplace, me)); } else { view.menuViewCopy.on('click', _.bind(me.onCopyPaste, me)); view.menuViewUndo.on('click', _.bind(me.onUndo, me)); @@ -1314,6 +1316,15 @@ define([ documentHolder.pmiImgPaste.setDisabled(isObjLocked); documentHolder.mnuImgAdvanced.setVisible(isimagemenu && (!isshapemenu || isimageonly) && !ischartmenu); documentHolder.mnuImgAdvanced.setDisabled(isObjLocked); + documentHolder.menuImgOriginalSize.setVisible(isimagemenu && (!isshapemenu || isimageonly) && !ischartmenu); + if (documentHolder.mnuImgAdvanced.imageInfo) + documentHolder.menuImgOriginalSize.setDisabled(isObjLocked || documentHolder.mnuImgAdvanced.imageInfo.get_ImageUrl()===null || documentHolder.mnuImgAdvanced.imageInfo.get_ImageUrl()===undefined); + + var pluginGuid = (documentHolder.mnuImgAdvanced.imageInfo) ? documentHolder.mnuImgAdvanced.imageInfo.asc_getPluginGuid() : null; + documentHolder.menuImgReplace.setVisible(isimageonly && (pluginGuid===null || pluginGuid===undefined)); + documentHolder.menuImgReplace.setDisabled(isObjLocked || pluginGuid===null); + + var isInSign = !!signGuid; documentHolder.menuSignatureEditSign.setVisible(isInSign); @@ -2598,6 +2609,50 @@ define([ } }, + onOriginalSizeClick: function(item) { + if (this.api){ + var imgsize = this.api.asc_getOriginalImageSize(); + var w = imgsize.asc_getImageWidth(); + var h = imgsize.asc_getImageHeight(); + + var properties = new Asc.asc_CImgProperty(); + properties.asc_putWidth(w); + properties.asc_putHeight(h); + this.api.asc_setGraphicObjectProps(properties); + + Common.NotificationCenter.trigger('edit:complete', this.documentHolder); + Common.component.Analytics.trackEvent('DocumentHolder', 'Set Image Original Size'); + } + }, + + onImgReplace: function(menu, item) { + var me = this; + if (this.api) { + if (item.value == 'file') { + setTimeout(function(){ + if (me.api) me.api.asc_changeImageFromFile(); + Common.NotificationCenter.trigger('edit:complete', me.documentHolder); + }, 10); + } else { + (new Common.Views.ImageFromUrlDialog({ + handler: function(result, value) { + if (result == 'ok') { + if (me.api) { + var checkUrl = value.replace(/ /g, ''); + if (!_.isEmpty(checkUrl)) { + var props = new Asc.asc_CImgProperty(); + props.asc_putImageUrl(checkUrl); + me.api.asc_setGraphicObjectProps(props); + } + } + } + Common.NotificationCenter.trigger('edit:complete', me.documentHolder); + } + })).show(); + } + } + }, + SetDisabled: function(state, canProtect) { this._isDisabled = state; this._canProtect = canProtect; diff --git a/apps/spreadsheeteditor/main/app/view/DocumentHolder.js b/apps/spreadsheeteditor/main/app/view/DocumentHolder.js index f11572a1a..5de45e66d 100644 --- a/apps/spreadsheeteditor/main/app/view/DocumentHolder.js +++ b/apps/spreadsheeteditor/main/app/view/DocumentHolder.js @@ -489,6 +489,21 @@ define([ me.menuSignatureEditSetup = new Common.UI.MenuItem({caption: this.strSetup, value: 2 }); me.menuEditSignSeparator = new Common.UI.MenuItem({ caption: '--' }); + me.menuImgOriginalSize = new Common.UI.MenuItem({ + caption : me.originalSizeText + }); + + me.menuImgReplace = new Common.UI.MenuItem({ + caption : me.textReplace, + menu : new Common.UI.Menu({ + menuAlign: 'tl-tr', + items: [ + new Common.UI.MenuItem({caption : this.textFromFile, value: 'file'}), + new Common.UI.MenuItem({caption : this.textFromUrl, value: 'url'}) + ] + }) + }); + this.imgMenu = new Common.UI.Menu({ items: [ me.pmiImgCut, @@ -525,6 +540,8 @@ define([ me.mnuShapeSeparator, me.mnuChartEdit, me.mnuShapeAdvanced, + me.menuImgOriginalSize, + me.menuImgReplace, me.mnuImgAdvanced ] }); @@ -811,7 +828,11 @@ define([ strSign: 'Sign', strDetails: 'Signature Details', strSetup: 'Signature Setup', - strDelete: 'Remove Signature' + strDelete: 'Remove Signature', + originalSizeText: 'Default Size', + textReplace: 'Replace image', + textFromUrl: 'From URL', + textFromFile: 'From File' }, SSE.Views.DocumentHolder || {})); }); \ No newline at end of file diff --git a/apps/spreadsheeteditor/main/locale/en.json b/apps/spreadsheeteditor/main/locale/en.json index 310d57d59..5ffb3a807 100644 --- a/apps/spreadsheeteditor/main/locale/en.json +++ b/apps/spreadsheeteditor/main/locale/en.json @@ -1168,6 +1168,10 @@ "SSE.Views.DocumentHolder.txtUngroup": "Ungroup", "SSE.Views.DocumentHolder.txtWidth": "Width", "SSE.Views.DocumentHolder.vertAlignText": "Vertical Alignment", + "SSE.Views.DocumentHolder.originalSizeText": "Default Size", + "SSE.Views.DocumentHolder.textReplace": "Replace image", + "SSE.Views.DocumentHolder.textFromUrl": "From URL", + "SSE.Views.DocumentHolder.textFromFile": "From File", "SSE.Views.FileMenu.btnBackCaption": "Go to Documents", "SSE.Views.FileMenu.btnCloseMenuCaption": "Close Menu", "SSE.Views.FileMenu.btnCreateNewCaption": "Create New",