diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml index e886cb8..05b4a37 100644 --- a/.github/workflows/docker-image.yml +++ b/.github/workflows/docker-image.yml @@ -21,5 +21,4 @@ jobs: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} repository: xbeeant/oo-unlimit - tags: latest, 7.3.3.50 - + tags: latest diff --git a/.gitpod.yml b/.gitpod.yml deleted file mode 100644 index 6c59e39..0000000 --- a/.gitpod.yml +++ /dev/null @@ -1,8 +0,0 @@ -# This configuration file was automatically generated by Gitpod. -# Please adjust to your needs (see https://www.gitpod.io/docs/config-gitpod-file) -# and commit this file to your remote git repository to share the goodness with others. - -tasks: - - init: make - - diff --git a/Dockerfile b/Dockerfile index f9c5e34..460d57d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ -ARG product_version=7.3.3 -ARG build_number=50 +ARG product_version=7.1.1 +ARG build_number=23 ARG oo_root='/var/www/onlyoffice/documentserver' ## Setup @@ -13,7 +13,6 @@ ENV BUILD_NUMBER=${build_number} ARG build_deps="git make g++ nodejs npm" RUN apt-get update && apt-get install -y ${build_deps} -#RUN npm config set registry https://registry.npm.taobao.org RUN npm install -g pkg grunt grunt-cli WORKDIR /build @@ -27,32 +26,19 @@ ARG tag=v${PRODUCT_VERSION}.${BUILD_NUMBER} RUN git clone --quiet --branch $tag --depth 1 https://github.com/ONLYOFFICE/build_tools.git /build/build_tools RUN git clone --quiet --branch $tag --depth 1 https://github.com/ONLYOFFICE/server.git /build/server -# Working mobile editor -RUN git clone --quiet --depth 1 https://github.com/ONLYOFFICE/sdkjs.git /build/sdkjs -RUN git clone --quiet --depth 1 https://github.com/ONLYOFFICE/web-apps.git /build/web-apps - -## Build -FROM clone-stage as path-stage - -# patch -COPY web-apps.patch /build/web-apps.patch -RUN cd /build/web-apps && git apply /build/web-apps.patch - - COPY server.patch /build/server.patch -RUN cd /build/server && git apply --ignore-space-change --ignore-whitespace /build/server.patch +RUN cd /build/server && git apply /build/server.patch +# Clone old version of sdk and webapp to get an old version of the mobile editor - -#COPY convertermaster.js /build/server/FileConverter/sources/convertermaster.js -#COPY license.js /build/server/Common/sources/license.js -#COPY Makefile /build/server/Makefile -#COPY server.js /build/server/DocService/sources/server.js -#COPY constants.js /build/server/Common/srouces/constants.js -#COPY tenantManager.js /build/server/Common/srouces/tenantManager.js +ARG tag=v6.3.1.79 # Working mobile editor +RUN git clone --quiet --branch $tag --depth 1 https://github.com/ONLYOFFICE/sdkjs.git /build/sdkjs +RUN git clone --quiet --branch $tag --depth 1 https://github.com/ONLYOFFICE/web-apps.git /build/web-apps +COPY web-apps.patch /build/ +RUN cd /build/web-apps && git apply /build/web-apps.patch ## Build -FROM path-stage as build-stage +FROM clone-stage as build-stage # build server with license checks patched WORKDIR /build/server diff --git a/server.patch b/server.patch index f217d02..1278c2d 100644 --- a/server.patch +++ b/server.patch @@ -1,80 +1,96 @@ diff --git a/Common/sources/constants.js b/Common/sources/constants.js -index 65d4c6f..39a7e56 100644 +index 0663ead..490582a 100644 --- a/Common/sources/constants.js +++ b/Common/sources/constants.js -@@ -83,7 +83,7 @@ exports.LICENSE_RESULT = { - UsersViewCountOS: 15 - }; - --exports.LICENSE_CONNECTIONS = 20; -+exports.LICENSE_CONNECTIONS = 9999; - exports.LICENSE_EXPIRE_USERS_ONE_DAY = 24 * 60 * 60; // day in seconds - - exports.AVS_OFFICESTUDIO_FILE_UNKNOWN = 0x0000; +@@ -75,7 +75,7 @@ exports.LICENSE_RESULT = { + ExpiredLimited: 11 + }; + +-exports.LICENSE_CONNECTIONS = 20; ++exports.LICENSE_CONNECTIONS = 9999; + exports.LICENSE_EXPIRE_USERS_ONE_DAY = 24 * 60 * 60; // day in seconds + + exports.AVS_OFFICESTUDIO_FILE_UNKNOWN = 0x0000; diff --git a/Common/sources/license.js b/Common/sources/license.js -index 1b617c6..8fa7b53 100644 +index c273afe..8786f62 100644 --- a/Common/sources/license.js +++ b/Common/sources/license.js -@@ -45,24 +45,24 @@ exports.readLicense = function*() { - count: 1, - type: c_LR.Success, - light: false, -- packageType: constants.PACKAGE_TYPE_OS, -+ packageType: constants.PACKAGE_TYPE_I, - mode: constants.LICENSE_MODE.None, -- branding: false, -+ branding: true, - connections: constants.LICENSE_CONNECTIONS, - connectionsView: constants.LICENSE_CONNECTIONS, -- customization: false, -- advancedApi: false, -- usersCount: 0, -- usersViewCount: 0, -+ customization: true, -+ advancedApi: true, -+ usersCount: constants.LICENSE_CONNECTIONS, -+ usersViewCount: constants.LICENSE_CONNECTIONS, - usersExpire: constants.LICENSE_EXPIRE_USERS_ONE_DAY, -- hasLicense: false, -- plugins: false, -+ hasLicense: true, -+ plugins: true, - buildDate: oBuildDate, - startDate: startDate, -- endDate: null, -+ endDate: new Date("2099-01-01T23:59:59.000Z"), - customerId: "", -- alias: "" -+ alias: "community" - }, null]; - }; - --exports.packageType = constants.PACKAGE_TYPE_OS; -+exports.packageType = constants.PACKAGE_TYPE_I; +@@ -45,20 +45,20 @@ exports.readLicense = function*() { + count: 1, + type: c_LR.Success, + light: false, +- packageType: constants.PACKAGE_TYPE_OS, ++ packageType: constants.PACKAGE_TYPE_I, + mode: constants.LICENSE_MODE.None, +- branding: false, ++ branding: true, + connections: constants.LICENSE_CONNECTIONS, +- customization: false, +- usersCount: 0, ++ customization: true, ++ usersCount: constants.LICENSE_CONNECTIONS, + usersExpire: constants.LICENSE_EXPIRE_USERS_ONE_DAY, +- hasLicense: false, +- plugins: false, ++ hasLicense: true, ++ plugins: true, + buildDate: oBuildDate, + startDate: startDate, +- endDate: null, +- customerId: "" ++ customerId: "", ++ endDate: new Date("2099-01-01T23:59:59.000Z") + }, null]; + }; + +-exports.packageType = constants.PACKAGE_TYPE_OS; ++exports.packageType = constants.PACKAGE_TYPE_I; +diff --git a/DocService/sources/DocsCoServer.js b/DocService/sources/DocsCoServer.js +index b654c9c..31bdf2d 100644 +--- a/DocService/sources/DocsCoServer.js ++++ b/DocService/sources/DocsCoServer.js +@@ -165,7 +165,7 @@ let connections = []; // Активные соединения + let lockDocumentsTimerId = {};//to drop connection that can't unlockDocument + let pubsub; + let queue; +-let licenseInfo = {type: constants.LICENSE_RESULT.Error, light: false, branding: false, customization: false, plugins: false}; ++let licenseInfo = license.readLicense().next().value[0]; + let licenseOriginal = null; + let shutdownFlag = false; + let expDocumentsStep = gc.getCronStep(cfgExpDocumentsCron); +@@ -3328,7 +3328,7 @@ exports.install = function(server, callbackFunction) { + }); + }; + exports.setLicenseInfo = function(data, original ) { +- licenseInfo = data; ++ logger.debug('Not updating license info', data); + licenseOriginal = original; + }; + exports.getLicenseInfo = function() { diff --git a/DocService/sources/server.js b/DocService/sources/server.js -index 5c744f6..edfb423 100644 +index ccc232b..7c4e80d 100644 --- a/DocService/sources/server.js +++ b/DocService/sources/server.js -@@ -110,7 +110,6 @@ if (!(cfgTokenEnableBrowser && cfgTokenEnableRequestInbox && cfgTokenEnableReque - - if (!tenantManager.isMultitenantMode()) { - updateLicense(); -- fs.watchFile(cfgLicenseFile, updateLicense); - setInterval(updateLicense, 86400000); +@@ -147,7 +147,6 @@ try { + } catch (e) { + logger.warn('Failed to subscribe to plugin folder updates. When changing the list of plugins, you must restart the server. https://nodejs.org/docs/latest/api/fs.html#fs_availability'); } +-fs.watchFile(configCommon.get('license').get('license_file'), updateLicense); + setInterval(updateLicense, 86400000); + // Если захочется использовать 'development' и 'production', diff --git a/FileConverter/sources/convertermaster.js b/FileConverter/sources/convertermaster.js -index 2a0b366..96468f9 100644 +index 2c4526f..ec07464 100644 --- a/FileConverter/sources/convertermaster.js +++ b/FileConverter/sources/convertermaster.js -@@ -93,7 +93,6 @@ if (cluster.isMaster) { - updateLicense(); - - if (!tenantManager.isMultitenantMode()) { -- fs.watchFile(cfgLicenseFile, updateLicense); - setInterval(updateLicense, 86400000); - } - } else { +@@ -85,7 +85,6 @@ if (cluster.isMaster) { + + updateLicense(); + +- fs.watchFile(configCommon.get('license').get('license_file'), updateLicense); + setInterval(updateLicense, 86400000); + } else { + const converter = require('./converter'); diff --git a/Makefile b/Makefile index e8e1308..23f7e2e 100644 --- a/Makefile diff --git a/web-apps.patch b/web-apps.patch index e657ef0..8c0b4d2 100644 --- a/web-apps.patch +++ b/web-apps.patch @@ -1,51 +1,1586 @@ -From 692bef4561ef9978c6b8663dd618211bf526b69f Mon Sep 17 00:00:00 2001 -From: Beeant <huangxb0512@gmail.com> -Date: Sat, 24 Sep 2022 21:39:36 +0800 -Subject: [PATCH] build: license +From b99b3c2013521042374601e514d9e91c93372016 Mon Sep 17 00:00:00 2001 +From: Alexander Hofbauer <alex@derhofbauer.at> +Date: Sat, 3 Jul 2021 08:29:29 +0200 +Subject: [PATCH] Revert "disable mobile editing" +partially brings back mobile editing, especially via: + + - 631cea5e0683c472ec5070f9f73f628def1fa259 + - ae69d00eb7ca8874d7d645289f7bfecce2af5d37 + - 35ea66e4407b8c948d5f5bb75b96c93a719ef210 + - 19e4859e1051fe16697272be3bacaacc06cc9f40 + - dc46e1b97f6aa80eb3b5039c5a13ab10637115ac + - 1ed80f9497222038da8845985786f5f0f4f5ad79 + - 2ab911a439c904a1e1da81283b77639a1f1aa6b1 --- - apps/documenteditor/mobile/src/lib/patch.jsx | 2 +- - apps/presentationeditor/mobile/src/lib/patch.jsx | 2 +- - apps/spreadsheeteditor/mobile/src/lib/patch.jsx | 2 +- - 3 files changed, 3 insertions(+), 3 deletions(-) + .../mobile/app/controller/Main.js | 9 +-- + .../mobile/app/controller/add/AddImage.js | 7 ++ + .../mobile/app/controller/add/AddOther.js | 63 +++++++++++++++++- + .../mobile/app/controller/add/AddShape.js | 7 ++ + .../mobile/app/controller/add/AddTable.js | 26 +++++++- + .../mobile/app/controller/edit/EditChart.js | 32 +++++++++- + .../app/controller/edit/EditParagraph.js | 54 +++++++++++++++- + .../mobile/app/controller/edit/EditShape.js | 20 ++++++ + .../mobile/app/controller/edit/EditTable.js | 25 ++++++++ + .../mobile/app/controller/edit/EditText.js | 34 +++++++++- + .../mobile/app/controller/Main.js | 5 +- + .../mobile/app/controller/add/AddImage.js | 7 ++ + .../mobile/app/controller/add/AddLink.js | 61 +++++++++++++++++- + .../mobile/app/controller/add/AddShape.js | 7 ++ + .../mobile/app/controller/add/AddSlide.js | 34 +++++++++- + .../mobile/app/controller/add/AddTable.js | 31 ++++++++- + .../mobile/app/controller/edit/EditChart.js | 26 +++++++- + .../mobile/app/controller/edit/EditShape.js | 16 +++++ + .../mobile/app/controller/edit/EditSlide.js | 45 ++++++++++++- + .../mobile/app/controller/edit/EditTable.js | 23 +++++++ + .../mobile/app/controller/edit/EditText.js | 42 +++++++++++- + .../mobile/app/controller/Main.js | 5 +- + .../mobile/app/controller/add/AddChart.js | 4 ++ + .../mobile/app/controller/add/AddFunction.js | 41 +++++++++++- + .../mobile/app/controller/add/AddLink.js | 47 +++++++++++++- + .../mobile/app/controller/add/AddOther.js | 10 +++ + .../mobile/app/controller/add/AddShape.js | 6 ++ + .../mobile/app/controller/edit/EditCell.js | 45 ++++++++++++- + .../mobile/app/controller/edit/EditChart.js | 64 ++++++++++++++++++- + .../mobile/app/controller/edit/EditShape.js | 19 ++++++ + 30 files changed, 786 insertions(+), 29 deletions(-) -diff --git a/apps/documenteditor/mobile/src/lib/patch.jsx b/apps/documenteditor/mobile/src/lib/patch.jsx -index 963aca451..1ee48e856 100644 ---- a/apps/documenteditor/mobile/src/lib/patch.jsx -+++ b/apps/documenteditor/mobile/src/lib/patch.jsx -@@ -4,7 +4,7 @@ const EditorUIController = () => { - }; +diff --git a/apps/documenteditor/mobile/app/controller/Main.js b/apps/documenteditor/mobile/app/controller/Main.js +index b53ab6578..661444a9c 100644 +--- a/apps/documenteditor/mobile/app/controller/Main.js ++++ b/apps/documenteditor/mobile/app/controller/Main.js +@@ -289,7 +289,7 @@ define([ + docInfo.asc_putIsEnabledMacroses(!!enable); + enable = !this.editorConfig.customization || (this.editorConfig.customization.plugins!==false); + docInfo.asc_putIsEnabledPlugins(!!enable); +- ++ + var type = /^(?:(pdf|djvu|xps))$/.exec(data.doc.fileType); + if (type && typeof type[1] === 'string') { + this.permissions.edit = this.permissions.review = false; +@@ -843,7 +843,7 @@ define([ + Common.Utils.UserInfoParser.setParser(me.appOptions.canUseReviewPermissions); + Common.Utils.UserInfoParser.setCurrentName(me.appOptions.user.fullname); + me.appOptions.canUseReviewPermissions && Common.Utils.UserInfoParser.setReviewPermissions(me.permissions.reviewGroups, me.editorConfig.customization.reviewPermissions); +- ++ + me.applyModeCommonElements(); + me.applyModeEditorElements(); - EditorUIController.isSupportEditFeature = () => { -- return false -+ return true - }; +@@ -1244,6 +1244,7 @@ define([ + }, - EditorUIController.getToolbarOptions = () => { -diff --git a/apps/presentationeditor/mobile/src/lib/patch.jsx b/apps/presentationeditor/mobile/src/lib/patch.jsx -index ec7b37a2c..bfd879583 100644 ---- a/apps/presentationeditor/mobile/src/lib/patch.jsx -+++ b/apps/presentationeditor/mobile/src/lib/patch.jsx -@@ -1,6 +1,6 @@ + onSendThemeColors: function(colors, standart_colors) { ++ Common.Utils.ThemeColor.setColors(colors, standart_colors); + }, - const EditorUIController = () => null; + onAdvancedOptions: function(type, advOptions, mode, formatOptions) { +@@ -1449,7 +1450,7 @@ define([ + }, --EditorUIController.isSupportEditFeature = () => false; -+EditorUIController.isSupportEditFeature = () => true; + isSupportEditFeature: function() { +- return false; ++ return true; + }, - export default EditorUIController; -diff --git a/apps/spreadsheeteditor/mobile/src/lib/patch.jsx b/apps/spreadsheeteditor/mobile/src/lib/patch.jsx -index ec7b37a2c..bfd879583 100644 ---- a/apps/spreadsheeteditor/mobile/src/lib/patch.jsx -+++ b/apps/spreadsheeteditor/mobile/src/lib/patch.jsx -@@ -1,6 +1,6 @@ + onRunAutostartMacroses: function() { +@@ -1658,4 +1659,4 @@ define([ + errorLang: 'The interface language is not loaded.<br>Please contact your Document Server administrator.' + } + })(), DE.Controllers.Main || {})) +-}); +\ No newline at end of file ++}); +diff --git a/apps/documenteditor/mobile/app/controller/add/AddImage.js b/apps/documenteditor/mobile/app/controller/add/AddImage.js +index 16ab14528..0a5faaa2d 100644 +--- a/apps/documenteditor/mobile/app/controller/add/AddImage.js ++++ b/apps/documenteditor/mobile/app/controller/add/AddImage.js +@@ -98,6 +98,10 @@ define([ - const EditorUIController = () => null; + onInsertByFile: function (e) { + DE.getController('AddContainer').hideModal(); ++ ++ if (this.api) { ++ this.api.asc_addImage(); ++ } + }, --EditorUIController.isSupportEditFeature = () => false; -+EditorUIController.isSupportEditFeature = () => true; + onUrlChange: function (e) { +@@ -114,6 +118,9 @@ define([ + if (!_.isEmpty(value)) { + if ((/((^https?)|(^ftp)):\/\/.+/i.test(value))) { + DE.getController('AddContainer').hideModal(); ++ _.defer(function () { ++ me.api.AddImageUrl(value); ++ }); + } else { + uiApp.alert(me.txtNotUrl, me.notcriticalErrorTitle); + } +diff --git a/apps/documenteditor/mobile/app/controller/add/AddOther.js b/apps/documenteditor/mobile/app/controller/add/AddOther.js +index 9dca563e3..ff5fc6bc8 100644 +--- a/apps/documenteditor/mobile/app/controller/add/AddOther.js ++++ b/apps/documenteditor/mobile/app/controller/add/AddOther.js +@@ -238,7 +238,40 @@ define([ + }, - export default EditorUIController; + onClickInsertFootnote: function() { +- DE.getController('AddContainer').hideModal(); ++ var me = this, ++ format = $('input[name="doc-footnote-format"]:checked').data('value'), ++ start = $('#start-at-footnote .item-after label').text(), ++ position = $('input[name="doc-footnote-pos"]:checked').data('value'), ++ props = new Asc.CAscFootnotePr(), ++ isEndNote = (position === 2); ++ ++ var startTo10; ++ if (me.fromCustomFormat) { ++ startTo10 = parseInt(me.fromCustomFormat(start)); ++ } else { ++ startTo10 = me.api.asc_GetFootnoteProps().get_NumStart(); ++ } ++ props.put_Pos(position); ++ props.put_NumFormat(format); ++ props.put_NumStart(startTo10); ++ props.put_NumRestart(Asc.c_oAscFootnoteRestart.Continuous); ++ ++ if (me.api) { ++ if (isEndNote) { ++ me.api.asc_SetEndnoteProps(props, false); ++ } else { ++ me.api.asc_SetFootnoteProps(props, false); ++ } ++ ++ setTimeout(function() { ++ if (isEndNote) { ++ me.api.asc_AddEndnote(); ++ } else { ++ me.api.asc_AddFootnote(); ++ } ++ }, 1); ++ DE.getController('AddContainer').hideModal(); ++ } + }, + + onFormatFootnoteChange: function(e) { +@@ -299,6 +332,32 @@ define([ + }, + + onInsertLink: function (e) { ++ var me = this, ++ url = $('#add-link-url input').val(), ++ display = $('#add-link-display input').val(), ++ tip = $('#add-link-tip input').val(), ++ urltype = me.api.asc_getUrlType($.trim(url)), ++ isEmail = (urltype == 2); ++ ++ if (urltype < 1) { ++ uiApp.alert(me.txtNotUrl); ++ return; ++ } ++ ++ url = url.replace(/^\s+|\s+$/g,''); ++ ++ if (! /(((^https?)|(^ftp)):\/\/)|(^mailto:)/i.test(url) ) ++ url = (isEmail ? 'mailto:' : 'http://' ) + url; ++ ++ url = url.replace(new RegExp("%20",'g')," "); ++ ++ var props = new Asc.CHyperlinkProperty(); ++ props.put_Value(url); ++ props.put_Text(_.isEmpty(display) ? url : display); ++ props.put_ToolTip(tip); ++ ++ me.api.add_Hyperlink(props); ++ + DE.getController('AddContainer').hideModal(); + }, + +@@ -472,4 +531,4 @@ define([ + notcriticalErrorTitle: 'Warning' + } + })(), DE.Controllers.AddOther || {})) +-}); +\ No newline at end of file ++}); +diff --git a/apps/documenteditor/mobile/app/controller/add/AddShape.js b/apps/documenteditor/mobile/app/controller/add/AddShape.js +index 32047d3dd..c8345c7af 100644 +--- a/apps/documenteditor/mobile/app/controller/add/AddShape.js ++++ b/apps/documenteditor/mobile/app/controller/add/AddShape.js +@@ -215,6 +215,13 @@ define([ + }, + + onShapeClick: function (e) { ++ var me = this, ++ $target = $(e.currentTarget); ++ ++ if ($target && me.api) { ++ me.api.AddShapeOnCurrentPage($target.data('type')); ++ } ++ + DE.getController('AddContainer').hideModal(); + }, + +diff --git a/apps/documenteditor/mobile/app/controller/add/AddTable.js b/apps/documenteditor/mobile/app/controller/add/AddTable.js +index fef864537..a9dd39cf6 100644 +--- a/apps/documenteditor/mobile/app/controller/add/AddTable.js ++++ b/apps/documenteditor/mobile/app/controller/add/AddTable.js +@@ -74,6 +74,8 @@ define([ + setApi: function (api) { + var me = this; + me.api = api; ++ ++ me.api.asc_registerCallback('asc_onInitTableTemplates', _.bind(me.onApiInitTemplates, me)); + }, + + onLaunch: function () { +@@ -81,6 +83,12 @@ define([ + }, + + initEvents: function () { ++ if (!this._initDefaultStyles) { ++ this._initDefaultStyles = true; ++ ++ this.api.asc_GetDefaultTableStyles(); ++ } ++ + $('#add-table li').single('click', _.buffered(this.onStyleClick, 100, this)); + }, + +@@ -159,10 +167,26 @@ define([ + return this._styles; + }, + ++ // API handlers ++ ++ onApiInitTemplates: function(templates) { ++ var me = this; ++ if (this._styles.length < 1) { ++ _.each(templates, function(template) { ++ me._styles.push({ ++ imageUrl : template.asc_getImage(), ++ templateId : template.asc_getId() ++ }); ++ }); ++ ++ this.getView('AddTable').render(); ++ } ++ }, ++ + textTableSize: 'Table Size', + textColumns: 'Columns', + textRows: 'Rows', + textCancel: 'Cancel' + } + })(), DE.Controllers.AddTable || {})) +-}); +\ No newline at end of file ++}); +diff --git a/apps/documenteditor/mobile/app/controller/edit/EditChart.js b/apps/documenteditor/mobile/app/controller/edit/EditChart.js +index b2cc3d9cd..8b27b1c8c 100644 +--- a/apps/documenteditor/mobile/app/controller/edit/EditChart.js ++++ b/apps/documenteditor/mobile/app/controller/edit/EditChart.js +@@ -135,6 +135,7 @@ define([ + me.api = api; + + me.api.asc_registerCallback('asc_onFocusObject', _.bind(me.onApiFocusObject, me)); ++ me.api.asc_registerCallback('asc_onUpdateChartStyles', _.bind(me.onApiUpdateChartStyles, me)); + }, + + onLaunch: function () { +@@ -301,6 +302,23 @@ define([ + // Handlers + + onType: function (e) { ++ var me = this, ++ $target = $(e.currentTarget), ++ type = $target.data('type'); ++ ++ var image = new Asc.asc_CImgProperty(), ++ chart = me._chartObject.get_ChartProperties(); ++ ++ chart.changeType(type); ++ image.put_ChartProperties(chart); ++ ++ me.api.ImgApply(image); ++ ++ $('.chart-types li').removeClass('active'); ++ $target.addClass('active'); ++ ++ // Force update styles ++ me._updateChartStyles(me.api.asc_getChartPreviews(chart.getType())); + }, + + onStyle: function (e) { +@@ -309,7 +327,7 @@ define([ + type = $target.data('type'); + + if (!me._chartObject) return; +- ++ + var image = new Asc.asc_CImgProperty(), + chart = me._chartObject.get_ChartProperties(); + +@@ -549,9 +567,19 @@ define([ + _shapeObject = getTopObject(shapes); + }, + ++ onApiUpdateChartStyles: function () { ++ if (this.api && this._chartObject && this._chartObject.get_ChartProperties()) { ++ this._updateChartStyles(this.api.asc_getChartPreviews(this._chartObject.get_ChartProperties().getType())); ++ } ++ }, ++ + // Helpers + + _updateChartStyles: function(styles) { ++ Common.SharedSettings.set('chartstyles', styles); ++ Common.NotificationCenter.trigger('chartstyles:load', styles); ++ ++ $('#tab-chart-style li').single('click', _.bind(this.onStyle, this)); + }, + + _uiTransformByWrap: function(type) { +@@ -582,4 +610,4 @@ define([ + } + }; + })(), DE.Controllers.EditChart || {})) +-}); +\ No newline at end of file ++}); +diff --git a/apps/documenteditor/mobile/app/controller/edit/EditParagraph.js b/apps/documenteditor/mobile/app/controller/edit/EditParagraph.js +index 114601e6a..778d62bdd 100644 +--- a/apps/documenteditor/mobile/app/controller/edit/EditParagraph.js ++++ b/apps/documenteditor/mobile/app/controller/edit/EditParagraph.js +@@ -75,6 +75,7 @@ define([ + }); + + this._styles = []; ++ this._stack = []; + this._styleThumbSize = undefined; + this._paragraphObject = undefined; + }, +@@ -82,6 +83,12 @@ define([ + setApi: function (api) { + var me = this; + me.api = api; ++ ++ me.api.asc_setParagraphStylesSizes(330, 38); ++ ++ me.api.asc_registerCallback('asc_onInitEditorStyles', _.bind(me.onApiInitEditorStyles, me)); ++ me.api.asc_registerCallback('asc_onFocusObject', _.bind(me.onApiFocusObject, me)); ++ me.api.asc_registerCallback('asc_onParaStyleName', _.bind(me.onApiParagraphStyleChange, me)); + }, + + onLaunch: function () { +@@ -128,7 +135,7 @@ define([ + if (selectedElements && _.isArray(selectedElements)) { + for (var i = selectedElements.length - 1; i >= 0; i--) { + if (Asc.c_oAscTypeSelectElement.Paragraph == selectedElements[i].get_ObjectType()) { +- _paragraphProperty = selectedElements[i].get_ObjectValue(); ++ _paragraphProperty = selectedElements[i].get_ObjectValue(); + break; + } + } +@@ -363,10 +370,53 @@ define([ + + // API handlers + ++ onApiFocusObject: function (objects) { ++ this._stack = objects; ++ ++ var paragraphs = []; ++ ++ _.each(this._stack, function(object) { ++ if (object.get_ObjectType() == Asc.c_oAscTypeSelectElement.Paragraph) { ++ paragraphs.push(object); ++ } ++ }); ++ ++ if (paragraphs.length > 0) { ++ var object = paragraphs[paragraphs.length - 1]; // get top ++ this._paragraphObject = object.get_ObjectValue(); ++ } else { ++ this._paragraphObject = undefined; ++ } ++ }, ++ ++ onApiInitEditorStyles: function (styles) { ++ window.styles_loaded = false; ++ ++ if (styles.length < 1) { ++ return; ++ } ++ ++ var me = this; ++ this._styles = []; ++ this._styleThumbSize = { ++ width : styles.STYLE_THUMBNAIL_WIDTH, ++ height : styles.STYLE_THUMBNAIL_HEIGHT ++ }; ++ ++ _.each(styles.get_MergedStyles(), function(style) { ++ me._styles.push({ ++ image : style.asc_getImage(), ++ name : style.get_Name() ++ }); ++ }); ++ ++ window.styles_loaded = true; ++ }, ++ + onApiParagraphStyleChange: function(name) { + _styleName = name; + $('#paragraph-list input[name=paragraph-style]').val([_styleName]); + } + } + })(), DE.Controllers.EditParagraph || {})) +-}); +\ No newline at end of file ++}); +diff --git a/apps/documenteditor/mobile/app/controller/edit/EditShape.js b/apps/documenteditor/mobile/app/controller/edit/EditShape.js +index 996c13543..76a4e68a1 100644 +--- a/apps/documenteditor/mobile/app/controller/edit/EditShape.js ++++ b/apps/documenteditor/mobile/app/controller/edit/EditShape.js +@@ -302,9 +302,29 @@ define([ + }, + + onReorder: function (e) { ++ var $target = $(e.currentTarget), ++ type = $target.data('type'); ++ ++ var properties = new Asc.asc_CImgProperty(); ++ ++ if ('all-up' == type) { ++ properties.put_ChangeLevel(Asc.c_oAscChangeLevel.BringToFront); ++ } else if ('all-down' == type) { ++ properties.put_ChangeLevel(Asc.c_oAscChangeLevel.SendToBack); ++ } else if ('move-up' == type) { ++ properties.put_ChangeLevel(Asc.c_oAscChangeLevel.BringForward); ++ } else if ('move-down' == type) { ++ properties.put_ChangeLevel(Asc.c_oAscChangeLevel.BringBackward); ++ } ++ ++ this.api.ImgApply(properties); + }, + + onReplace: function (e) { ++ var $target = $(e.currentTarget), ++ type = $target.data('type'); ++ ++ this.api.ChangeShapeType(type); + }, + + onWrapType: function (e) { +diff --git a/apps/documenteditor/mobile/app/controller/edit/EditTable.js b/apps/documenteditor/mobile/app/controller/edit/EditTable.js +index c94825acb..02cb7557d 100644 +--- a/apps/documenteditor/mobile/app/controller/edit/EditTable.js ++++ b/apps/documenteditor/mobile/app/controller/edit/EditTable.js +@@ -123,6 +123,9 @@ define([ + setApi: function (api) { + var me = this; + me.api = api; ++ ++ me.api.asc_registerCallback('asc_onFocusObject', _.bind(me.onApiFocusObject, me)); ++ me.api.asc_registerCallback('asc_onInitTableTemplates', _.bind(me.onApiInitTemplates, me)); + }, + + onLaunch: function () { +@@ -131,6 +134,15 @@ define([ + + initEvents: function () { + var me = this; ++ ++ $('#table-remove-all').single('click', _.bind(function(){me.api.remTable(); me._closeIfNeed()}, me)); ++ $('#insert-column-left').single('click', _.bind(function(){me.api.addColumnLeft(); me._closeIfNeed()}, me)); ++ $('#insert-column-right').single('click', _.bind(function(){me.api.addColumnRight(); me._closeIfNeed()}, me)); ++ $('#insert-row-above').single('click', _.bind(function(){me.api.addRowAbove(); me._closeIfNeed()}, me)); ++ $('#insert-row-below').single('click', _.bind(function(){me.api.addRowBelow(); me._closeIfNeed()}, me)); ++ $('#remove-column').single('click', _.bind(function(){me.api.remColumn(); me._closeIfNeed()}, me)); ++ $('#remove-row').single('click', _.bind(function(){me.api.remRow(); me._closeIfNeed()}, me)); ++ + me.initSettings(); + }, + +@@ -638,6 +650,19 @@ define([ + } + }, + ++ onApiInitTemplates: function(templates) { ++ var styles = []; ++ ++ _.each(templates, function(template){ ++ styles.push({ ++ imageUrl : template.asc_getImage(), ++ templateId : template.asc_getId() ++ }); ++ }); ++ ++ this.getView('EditTable').updateStyles(styles); ++ }, ++ + // Helpers + + _closeIfNeed: function () { +diff --git a/apps/documenteditor/mobile/app/controller/edit/EditText.js b/apps/documenteditor/mobile/app/controller/edit/EditText.js +index 08f0ba0af..5126050f1 100644 +--- a/apps/documenteditor/mobile/app/controller/edit/EditText.js ++++ b/apps/documenteditor/mobile/app/controller/edit/EditText.js +@@ -78,6 +78,21 @@ define([ + setApi: function (api) { + var me = this; + me.api = api; ++ ++ me.api.asc_registerCallback('asc_onInitEditorFonts', _.bind(me.onApiLoadFonts, me)); ++ me.api.asc_registerCallback('asc_onFocusObject', _.bind(me.onApiFocusObject, me)); ++ me.api.asc_registerCallback('asc_onFontFamily', _.bind(me.onApiChangeFont, me)); ++ me.api.asc_registerCallback('asc_onFontSize', _.bind(me.onApiFontSize, me)); ++ me.api.asc_registerCallback('asc_onBold', _.bind(me.onApiBold, me)); ++ me.api.asc_registerCallback('asc_onItalic', _.bind(me.onApiItalic, me)); ++ me.api.asc_registerCallback('asc_onUnderline', _.bind(me.onApiUnderline, me)); ++ me.api.asc_registerCallback('asc_onStrikeout', _.bind(me.onApiStrikeout, me)); ++ me.api.asc_registerCallback('asc_onVerticalAlign', _.bind(me.onApiVerticalAlign, me)); ++ me.api.asc_registerCallback('asc_onListType', _.bind(me.onApiBullets, me)); ++ me.api.asc_registerCallback('asc_onPrAlign', _.bind(me.onApiParagraphAlign, me)); ++ me.api.asc_registerCallback('asc_onTextColor', _.bind(me.onApiTextColor, me)); ++ me.api.asc_registerCallback('asc_onParaSpacingLine', _.bind(me.onApiLineSpacing, me)); ++ me.api.asc_registerCallback('asc_onTextShd', _.bind(me.onApiTextShd, me)); + }, + + onLaunch: function () { +@@ -396,6 +411,23 @@ define([ + + // API handlers + ++ onApiLoadFonts: function (fonts, select) { ++ var me = this; ++ ++ _.each(fonts, function(font) { ++ var fontId = font.asc_getFontId(); ++ me._fontsArray.push({ ++ id : fontId, ++ name : font.asc_getFontName(), ++ // displayValue: font.asc_getFontName(), ++ imgidx : font.asc_getFontThumbnail(), ++ type : font.asc_getFontType() ++ }); ++ }); ++ ++ Common.NotificationCenter.trigger('fonts:load', this._fontsArray, select); ++ }, ++ + onApiFocusObject: function (objects) { + _stack = objects; + +@@ -555,4 +587,4 @@ define([ + textPt: 'pt' + } + })(), DE.Controllers.EditText || {})) +-}); +\ No newline at end of file ++}); +diff --git a/apps/presentationeditor/mobile/app/controller/Main.js b/apps/presentationeditor/mobile/app/controller/Main.js +index 012b4ce3d..c36e6396a 100644 +--- a/apps/presentationeditor/mobile/app/controller/Main.js ++++ b/apps/presentationeditor/mobile/app/controller/Main.js +@@ -1190,6 +1190,7 @@ define([ + }, + + onSendThemeColors: function(colors, standart_colors) { ++ Common.Utils.ThemeColor.setColors(colors, standart_colors); + }, + + onFocusObject: function(SelectedObjects) { +@@ -1350,7 +1351,7 @@ define([ + }, + + isSupportEditFeature: function() { +- return false; ++ return true; + }, + + onRunAutostartMacroses: function() { +@@ -1588,4 +1589,4 @@ define([ + errorLang: 'The interface language is not loaded.<br>Please contact your Document Server administrator.' + } + })(), PE.Controllers.Main || {})) +-}); +\ No newline at end of file ++}); +diff --git a/apps/presentationeditor/mobile/app/controller/add/AddImage.js b/apps/presentationeditor/mobile/app/controller/add/AddImage.js +index d95a8859a..617152918 100644 +--- a/apps/presentationeditor/mobile/app/controller/add/AddImage.js ++++ b/apps/presentationeditor/mobile/app/controller/add/AddImage.js +@@ -95,6 +95,10 @@ define([ + + onInsertByFile: function (e) { + PE.getController('AddContainer').hideModal(); ++ ++ if (this.api) { ++ this.api.asc_addImage(); ++ } + }, + + onUrlChange: function (e) { +@@ -111,6 +115,9 @@ define([ + if (!_.isEmpty(value)) { + if ((/((^https?)|(^ftp)):\/\/.+/i.test(value))) { + PE.getController('AddContainer').hideModal(); ++ _.defer(function () { ++ me.api.AddImageUrl(value); ++ }); + } else { + uiApp.alert(me.txtNotUrl, me.notcriticalErrorTitle); + } +diff --git a/apps/presentationeditor/mobile/app/controller/add/AddLink.js b/apps/presentationeditor/mobile/app/controller/add/AddLink.js +index ee2a12938..624df79c0 100644 +--- a/apps/presentationeditor/mobile/app/controller/add/AddLink.js ++++ b/apps/presentationeditor/mobile/app/controller/add/AddLink.js +@@ -169,6 +169,65 @@ define([ + // Handlers + + onInsertLink: function (e) { ++ var display = $('#add-link-display input').val(), ++ tip = $('#add-link-tip input').val(), ++ props = new Asc.CHyperlinkProperty(), ++ def_display = ''; ++ ++ if (this._linkType==c_oHyperlinkType.WebLink) { ++ var url = $('#add-link-url input').val(), ++ urltype = this.api.asc_getUrlType($.trim(url)), ++ isEmail = (urltype == 2); ++ if (urltype < 1) { ++ uiApp.alert(this.txtNotUrl); ++ return; ++ } ++ ++ url = url.replace(/^\s+|\s+$/g,''); ++ if (! /(((^https?)|(^ftp)):\/\/)|(^mailto:)/i.test(url) ) ++ url = (isEmail ? 'mailto:' : 'http://' ) + url; ++ url = url.replace(new RegExp("%20",'g')," "); ++ ++ props.put_Value( url ); ++ props.put_ToolTip(tip); ++ def_display = url; ++ } else { ++ var url = "ppaction://hlink"; ++ var slidetip = ''; ++ switch (this._slideLink) { ++ case 0: ++ url = url + "showjump?jump=nextslide"; ++ slidetip = this.textNext; ++ break; ++ case 1: ++ url = url + "showjump?jump=previousslide"; ++ slidetip = this.textPrev; ++ break; ++ case 2: ++ url = url + "showjump?jump=firstslide"; ++ slidetip = this.textFirst; ++ break; ++ case 3: ++ url = url + "showjump?jump=lastslide"; ++ slidetip = this.textLast; ++ break; ++ case 4: ++ url = url + "sldjumpslide" + this._slideNum; ++ slidetip = this.textSlide + ' ' + (this._slideNum+1); ++ break; ++ } ++ props.put_Value( url ); ++ props.put_ToolTip(_.isEmpty(tip) ? slidetip : tip); ++ def_display = slidetip; ++ } ++ ++ if (!$('#add-link-display').hasClass('disabled')) { ++ props.put_Text(_.isEmpty(display) ? def_display : display); ++ } else ++ props.put_Text(null); ++ ++ this.api.add_Hyperlink(props); ++ + PE.getController('AddContainer').hideModal(); + }, + +@@ -213,4 +272,4 @@ define([ + notcriticalErrorTitle: 'Warning' + } + })(), PE.Controllers.AddLink || {})) +-}); +\ No newline at end of file ++}); +diff --git a/apps/presentationeditor/mobile/app/controller/add/AddShape.js b/apps/presentationeditor/mobile/app/controller/add/AddShape.js +index be2ef1ecf..12c4c9f17 100644 +--- a/apps/presentationeditor/mobile/app/controller/add/AddShape.js ++++ b/apps/presentationeditor/mobile/app/controller/add/AddShape.js +@@ -212,6 +212,13 @@ define([ + }, + + onShapeClick: function (e) { ++ var me = this, ++ $target = $(e.currentTarget); ++ ++ if ($target && me.api) { ++ me.api.AddShapeOnCurrentPage($target.data('type')); ++ } ++ + PE.getController('AddContainer').hideModal(); + }, + +diff --git a/apps/presentationeditor/mobile/app/controller/add/AddSlide.js b/apps/presentationeditor/mobile/app/controller/add/AddSlide.js +index 4ffccc101..4e5148d90 100644 +--- a/apps/presentationeditor/mobile/app/controller/add/AddSlide.js ++++ b/apps/presentationeditor/mobile/app/controller/add/AddSlide.js +@@ -63,6 +63,7 @@ define([ + setApi: function (api) { + var me = this; + me.api = api; ++ me.api.asc_registerCallback('asc_onUpdateLayout', _.bind(me.onUpdateLayout, me)); + }, + + onLaunch: function () { +@@ -76,6 +77,12 @@ define([ + }, + + onLayoutClick: function (e) { ++ var me = this, ++ $target = $(e.currentTarget), ++ type = $target.data('type'); ++ ++ me.api.AddSlide(type); ++ + PE.getController('AddContainer').hideModal(); + }, + +@@ -83,7 +90,32 @@ define([ + + getLayouts: function () { + return this._layouts; ++ }, ++ ++ // API handlers ++ ++ onUpdateLayout: function(layouts){ ++ var me = this; ++ this._layouts = []; ++ if (!_.isEmpty(layouts)){ ++ _.each(layouts, function(layout) { ++ var name = layout.get_Name(); ++ me._layouts.push({ ++ imageUrl : layout.get_Image(), ++ title : (name !== '') ? name : PE.getController('Main').layoutNames[layout.getType()], ++ itemWidth : layout.get_Width(), ++ itemHeight : layout.get_Height(), ++ idx : layout.getIndex() ++ }); ++ }); ++ } ++ ++ Common.SharedSettings.set('slidelayouts', this._layouts); ++ Common.NotificationCenter.trigger('slidelayouts:load', this._layouts); ++ ++ this.getView('AddSlide').updateLayouts(this._layouts); ++ $('#add-slide .slide-layout li').single('click', _.buffered(me.onLayoutClick, 100, me)); + } + } + })(), PE.Controllers.AddSlide || {})) +-}); +\ No newline at end of file ++}); +diff --git a/apps/presentationeditor/mobile/app/controller/add/AddTable.js b/apps/presentationeditor/mobile/app/controller/add/AddTable.js +index 193e9ea59..7fa075c05 100644 +--- a/apps/presentationeditor/mobile/app/controller/add/AddTable.js ++++ b/apps/presentationeditor/mobile/app/controller/add/AddTable.js +@@ -57,15 +57,27 @@ define([ + initialize: function () { + this._styles = []; + this._initDefaultStyles = false; ++ ++ //TODO is this needed? Common.NotificationCenter.on('addcontainer:show', _.bind(this.initEvents, this)); + }, + + setApi: function (api) { + var me = this; + me.api = api; ++ ++ me.api.asc_registerCallback('asc_onInitTableTemplates', _.bind(me.onApiInitTemplates, me)); + }, + + initEvents: function () { + var me = this; ++ ++ if (!me._initDefaultStyles) { ++ me._initDefaultStyles = true; ++ me._styles = []; ++ ++ me.api.asc_GetDefaultTableStyles && me.api.asc_GetDefaultTableStyles(); ++ } ++ + $('.page[data-page="addother-insert-table"] li').single('click', _.buffered(me.onStyleClick, 100, me)); + }, + +@@ -142,10 +154,27 @@ define([ + + // API handlers + ++ onApiInitTemplates: function(templates){ ++ var me = this; ++ if (this._styles.length < 1) { ++ _.each(templates, function(template) { ++ me._styles.push({ ++ imageUrl : template.asc_getImage(), ++ templateId : template.asc_getId() ++ }); ++ }); ++ ++ this.getView('AddTable').render(); ++ } ++ ++ Common.SharedSettings.set('tablestyles', this._styles); ++ Common.NotificationCenter.trigger('tablestyles:load', this._styles); ++ }, ++ + textTableSize: 'Table Size', + textColumns: 'Columns', + textRows: 'Rows', + textCancel: 'Cancel' + } + })(), PE.Controllers.AddTable || {})) +-}); +\ No newline at end of file ++}); +diff --git a/apps/presentationeditor/mobile/app/controller/edit/EditChart.js b/apps/presentationeditor/mobile/app/controller/edit/EditChart.js +index c80df4edc..0d5642e6c 100644 +--- a/apps/presentationeditor/mobile/app/controller/edit/EditChart.js ++++ b/apps/presentationeditor/mobile/app/controller/edit/EditChart.js +@@ -106,6 +106,7 @@ define([ + me.api = api; + + me.api.asc_registerCallback('asc_onFocusObject', _.bind(me.onApiFocusObject, me)); ++ me.api.asc_registerCallback('asc_onUpdateChartStyles', _.bind(me.onApiUpdateChartStyles, me)); + }, + + onLaunch: function () { +@@ -233,6 +234,19 @@ define([ + // Handlers + + onType: function (e) { ++ var me = this, ++ $target = $(e.currentTarget), ++ type = $target.data('type'); ++ ++ var chart = new Asc.CAscChartProp(); ++ chart.changeType(type); ++ me.api.ChartApply(chart); ++ ++ $('.chart-types li').removeClass('active'); ++ $target.addClass('active'); ++ ++ // Force update styles ++ me._updateChartStyles(me.api.asc_getChartPreviews(chart.getType())); + }, + + onStyle: function (e) { +@@ -395,9 +409,19 @@ define([ + _shapeObject = getTopObject(shapes); + }, + ++ onApiUpdateChartStyles: function () { ++ if (this.api && this._chartObject) { ++ this._updateChartStyles(this.api.asc_getChartPreviews(this._chartObject.getType())); ++ } ++ }, ++ + // Helpers + + _updateChartStyles: function(styles) { ++ Common.SharedSettings.set('chartstyles', styles); ++ Common.NotificationCenter.trigger('chartstyles:load', styles); ++ ++ $('#tab-chart-style li').single('click', _.bind(this.onStyle, this)); + }, + + _closeIfNeed: function () { +@@ -420,4 +444,4 @@ define([ + } + }; + })(), PE.Controllers.EditChart || {})) +-}); +\ No newline at end of file ++}); +diff --git a/apps/presentationeditor/mobile/app/controller/edit/EditShape.js b/apps/presentationeditor/mobile/app/controller/edit/EditShape.js +index aa22af261..1c23e264d 100644 +--- a/apps/presentationeditor/mobile/app/controller/edit/EditShape.js ++++ b/apps/presentationeditor/mobile/app/controller/edit/EditShape.js +@@ -235,6 +235,18 @@ define([ + }, + + onReorder: function (e) { ++ var $target = $(e.currentTarget), ++ type = $target.data('type'); ++ ++ if ('all-up' == type) { ++ this.api.shapes_bringToFront(); ++ } else if ('all-down' == type) { ++ this.api.shapes_bringToBack(); ++ } else if ('move-up' == type) { ++ this.api.shapes_bringForward(); ++ } else if ('move-down' == type) { ++ this.api.shapes_bringBackward(); ++ } + }, + + onAlign: function (e) { +@@ -261,6 +273,10 @@ define([ + }, + + onReplace: function (e) { ++ var $target = $(e.currentTarget), ++ type = $target.data('type'); ++ ++ this.api.ChangeShapeType(type); + }, + + onBorderSize: function (e) { +diff --git a/apps/presentationeditor/mobile/app/controller/edit/EditSlide.js b/apps/presentationeditor/mobile/app/controller/edit/EditSlide.js +index eaceadccd..0275e300d 100644 +--- a/apps/presentationeditor/mobile/app/controller/edit/EditSlide.js ++++ b/apps/presentationeditor/mobile/app/controller/edit/EditSlide.js +@@ -89,6 +89,7 @@ define([ + me.api = api; + + me.api.asc_registerCallback('asc_onFocusObject', _.bind(me.onApiFocusObject, me)); ++ me.api.asc_registerCallback('asc_onInitEditorStyles', _.bind(me.onApiInitEditorStyles, me)); + me.api.asc_registerCallback('asc_onUpdateThemeIndex', _.bind(me.onApiUpdateThemeIndex, me)); + }, + +@@ -217,9 +218,22 @@ define([ + // Handlers + + onLayoutClick: function (e) { ++ var me = this, ++ $target = $(e.currentTarget), ++ type = $target.data('type'); ++ ++ me.api.ChangeLayout(type); + }, + + onThemeClick: function (e) { ++ var me = this, ++ $target = $(e.currentTarget), ++ type = $target.data('type'); ++ ++ $('.container-edit .slide-theme div').removeClass('active'); ++ $target.addClass('active'); ++ ++ me.api.ChangeTheme(type); + }, + + onRemoveSlide: function () { +@@ -380,6 +394,35 @@ define([ + } + }, + ++ onApiInitEditorStyles: function(themes) { ++ if (themes) { ++ window.styles_loaded = false; ++ ++ var me = this, ++ defaultThemes = themes[0] || [], ++ docThemes = themes[1] || []; ++ ++ this._themes = []; ++ ++ _.each(defaultThemes, function(theme, index) { ++ me._themes.push({ ++ themeId : theme.get_Index(), ++ offsety : index * 38 ++ }); ++ }); ++ ++ _.each(docThemes, function(theme) { ++ me._themes.push({ ++ imageUrl: theme.get_Image(), ++ themeId : theme.get_Index(), ++ offsety : 0 ++ }); ++ }); ++ ++ window.styles_loaded = true; ++ } ++ }, ++ + onApiUpdateThemeIndex: function(themeId) { + _themeId = themeId; + $('.container-edit .slide-theme .row div').removeClass('active'); +@@ -410,4 +453,4 @@ define([ + textSec: 's' + }; + })(), PE.Controllers.EditSlide || {})) +-}); +\ No newline at end of file ++}); +diff --git a/apps/presentationeditor/mobile/app/controller/edit/EditTable.js b/apps/presentationeditor/mobile/app/controller/edit/EditTable.js +index 280165d27..4e44175a5 100644 +--- a/apps/presentationeditor/mobile/app/controller/edit/EditTable.js ++++ b/apps/presentationeditor/mobile/app/controller/edit/EditTable.js +@@ -112,6 +112,9 @@ define([ + setApi: function (api) { + var me = this; + me.api = api; ++ ++ me.api.asc_registerCallback('asc_onFocusObject', _.bind(me.onApiFocusObject, me)); ++ me.api.asc_registerCallback('asc_onInitTableTemplates', _.bind(me.onApiInitTemplates, me)); + }, + + onLaunch: function () { +@@ -121,6 +124,13 @@ define([ + initEvents: function () { + var me = this; + ++ $('#table-remove-all').single('click', _.bind(function(){me.api.remTable(); me._closeIfNeed()}, me)); ++ $('#insert-column-left').single('click', _.bind(function(){me.api.addColumnLeft(); me._closeIfNeed()}, me)); ++ $('#insert-column-right').single('click', _.bind(function(){me.api.addColumnRight(); me._closeIfNeed()}, me)); ++ $('#insert-row-above').single('click', _.bind(function(){me.api.addRowAbove(); me._closeIfNeed()}, me)); ++ $('#insert-row-below').single('click', _.bind(function(){me.api.addRowBelow(); me._closeIfNeed()}, me)); ++ $('#remove-column').single('click', _.bind(function(){me.api.remColumn(); me._closeIfNeed()}, me)); ++ $('#remove-row').single('click', _.bind(function(){me.api.remRow(); me._closeIfNeed()}, me)); + $('#table-options-margins input').single('change touchend', _.buffered(me.onOptionMargin, 100, me)); + $('#table-options-margins input').single('input', _.bind(me.onOptionMarginChanging, me)); + +@@ -538,6 +548,19 @@ define([ + }); + + return tableExist; ++ }, ++ ++ onApiInitTemplates: function(templates) { ++ var styles = []; ++ ++ _.each(templates, function(template){ ++ styles.push({ ++ imageUrl : template.asc_getImage(), ++ templateId : template.asc_getId() ++ }); ++ }); ++ ++ this.getView('EditTable').updateStyles(styles); + } + } + })(), PE.Controllers.EditTable || {})) +diff --git a/apps/presentationeditor/mobile/app/controller/edit/EditText.js b/apps/presentationeditor/mobile/app/controller/edit/EditText.js +index 116758067..e40fde1ac 100644 +--- a/apps/presentationeditor/mobile/app/controller/edit/EditText.js ++++ b/apps/presentationeditor/mobile/app/controller/edit/EditText.js +@@ -80,6 +80,30 @@ define([ + setApi: function (api) { + var me = this; + me.api = api; ++ ++ me.api.asc_registerCallback('asc_onInitEditorFonts', _.bind(me.onApiLoadFonts, me)); ++ me.api.asc_registerCallback('asc_onFocusObject', _.bind(me.onApiFocusObject, me)); ++ me.api.asc_registerCallback('asc_onFontFamily', _.bind(me.onApiChangeFont, me)); ++ me.api.asc_registerCallback('asc_onFontSize', _.bind(me.onApiFontSize, me)); ++ me.api.asc_registerCallback('asc_onBold', _.bind(me.onApiBold, me)); ++ me.api.asc_registerCallback('asc_onItalic', _.bind(me.onApiItalic, me)); ++ me.api.asc_registerCallback('asc_onUnderline', _.bind(me.onApiUnderline, me)); ++ me.api.asc_registerCallback('asc_onStrikeout', _.bind(me.onApiStrikeout, me)); ++ me.api.asc_registerCallback('asc_onVerticalAlign', _.bind(me.onApiVerticalAlign, me)); ++ me.api.asc_registerCallback('asc_onTextColor', _.bind(me.onApiTextColor, me)); ++ ++ me.api.asc_registerCallback('asc_onListType', _.bind(me.onApiBullets, me)); ++ me.api.asc_registerCallback('asc_onPrAlign', _.bind(me.onApiParagraphAlign, me)); ++ me.api.asc_registerCallback('asc_canIncreaseIndent', _.bind(me.onApiCanIncreaseIndent, me)); ++ me.api.asc_registerCallback('asc_canDecreaseIndent', _.bind(me.onApiCanDecreaseIndent, me)); ++ me.api.asc_registerCallback('asc_onLineSpacing', _.bind(me.onApiLineSpacing, me)); ++ me.api.asc_registerCallback('asc_onVerticalTextAlign', _.bind(me.onApiVerticalTextAlign, me)); ++ ++ // me.api.asc_registerCallback('asc_onUpdateThemeIndex', _.bind(this.onApiUpdateThemeIndex, this)); ++ // me.api.asc_registerCallback('asc_onCanGroup', _.bind(this.onApiCanGroup, this)); ++ // me.api.asc_registerCallback('asc_onCanUnGroup', _.bind(this.onApiCanUnGroup, this)); ++ // me.api.asc_registerCallback('asc_onPresentationSize', _.bind(this.onApiPageSize, this)); ++ // me.api.asc_registerCallback('asc_onInitEditorStyles', _.bind(this.onApiInitEditorStyles, this)); + }, + + onLaunch: function () { +@@ -472,6 +496,22 @@ define([ + + // API handlers + ++ onApiLoadFonts: function (fonts, select) { ++ var me = this; ++ _.each(fonts, function(font) { ++ var fontId = font.asc_getFontId(); ++ me._fontsArray.push({ ++ id : fontId, ++ name : font.asc_getFontName(), ++// displayValue: font.asc_getFontName(), ++ imgidx : font.asc_getFontThumbnail(), ++ type : font.asc_getFontType() ++ }); ++ }); ++ ++ Common.NotificationCenter.trigger('fonts:load', this._fontsArray, select); ++ }, ++ + onApiFocusObject: function (objects) { + _stack = objects; + +@@ -619,4 +659,4 @@ define([ + textPt: 'pt' + } + })(), PE.Controllers.EditText || {})) +-}); +\ No newline at end of file ++}); +diff --git a/apps/spreadsheeteditor/mobile/app/controller/Main.js b/apps/spreadsheeteditor/mobile/app/controller/Main.js +index 71f96d868..883eca8cd 100644 +--- a/apps/spreadsheeteditor/mobile/app/controller/Main.js ++++ b/apps/spreadsheeteditor/mobile/app/controller/Main.js +@@ -1332,6 +1332,7 @@ define([ + }, + + onSendThemeColors: function(colors, standart_colors) { ++ Common.Utils.ThemeColor.setColors(colors, standart_colors); + }, + + onAdvancedOptions: function(type, advOptions, mode, formatOptions) { +@@ -1553,7 +1554,7 @@ define([ + }, + + isSupportEditFeature: function() { +- return false; ++ return true; + }, + + onRunAutostartMacroses: function() { +@@ -1810,4 +1811,4 @@ define([ + errorLang: 'The interface language is not loaded.<br>Please contact your Document Server administrator.' + } + })(), SSE.Controllers.Main || {})) +-}); +\ No newline at end of file ++}); +diff --git a/apps/spreadsheeteditor/mobile/app/controller/add/AddChart.js b/apps/spreadsheeteditor/mobile/app/controller/add/AddChart.js +index bb91e2c39..58015d747 100644 +--- a/apps/spreadsheeteditor/mobile/app/controller/add/AddChart.js ++++ b/apps/spreadsheeteditor/mobile/app/controller/add/AddChart.js +@@ -78,6 +78,10 @@ define([ + + onInsertChart: function (type) { + SSE.getController('AddContainer').hideModal(); ++ ++ var settings = this.api.asc_getChartObject(); ++ settings.changeType(type); ++ this.api.asc_addChartDrawingObject(settings); + }, + + txtDiagramTitle: 'Chart Title', +diff --git a/apps/spreadsheeteditor/mobile/app/controller/add/AddFunction.js b/apps/spreadsheeteditor/mobile/app/controller/add/AddFunction.js +index 2f8e89353..964438c17 100644 +--- a/apps/spreadsheeteditor/mobile/app/controller/add/AddFunction.js ++++ b/apps/spreadsheeteditor/mobile/app/controller/add/AddFunction.js +@@ -112,17 +112,52 @@ define([ + + editorLang = (editorLang ? editorLang : 'en').split(/[\-\_]/)[0].toLowerCase(); + +- var localizationFunctionsDesc = function (data) {}; ++ var localizationFunctionsDesc = function (data) { ++ var jsonDesc = {}, ++ view = me.getView('AddFunction'); ++ ++ me.fd = data; ++ ++ try { ++ jsonDesc = JSON.parse(me.fd); ++ } catch (e) { ++ jsonDesc = me.fd ++ } ++ ++ var grouparr = me.api.asc_getFormulasInfo(); ++ for (var g in grouparr) { ++ var group = grouparr[g]; ++ var groupname = group.asc_getGroupName(); ++ var funcarr = group.asc_getFormulasArray(); ++ ++ for (var f in funcarr) { ++ var func = funcarr[f]; ++ var _name = func.asc_getName(); ++ functions[_name] = { ++ type: _name, ++ group: groupname, ++ caption: func.asc_getLocaleName(), ++ args: (jsonDesc && jsonDesc[_name]) ? jsonDesc[_name].a : '', ++ descr: (jsonDesc && jsonDesc[_name]) ? jsonDesc[_name].d : '' ++ }; ++ } ++ } ++ ++ view.setFunctions(functions, editorLang); ++ view.render(); ++ }; + + $.getJSON(Common.Utils.String.format("{0}/{1}_desc.json", "resources/l10n/functions", editorLang), function(json) { + localizationFunctionsDesc(json); + }).fail(function() { +- localizationFunctionsDesc(fd); ++ localizationFunctionsDesc(me.fd); + }); + }, + + onInsertFunction: function (type) { + SSE.getController('AddContainer').hideModal(); ++ ++ this.api.asc_insertFormula(this.api.asc_getFormulaLocaleName(type), Asc.c_oAscPopUpSelectorType.Func, true); + }, + + onFunctionInfo: function (type) { +@@ -130,4 +165,4 @@ define([ + } + } + })(), SSE.Controllers.AddFunction || {})) +-}); +\ No newline at end of file ++}); +diff --git a/apps/spreadsheeteditor/mobile/app/controller/add/AddLink.js b/apps/spreadsheeteditor/mobile/app/controller/add/AddLink.js +index de4821e92..100de77e8 100644 +--- a/apps/spreadsheeteditor/mobile/app/controller/add/AddLink.js ++++ b/apps/spreadsheeteditor/mobile/app/controller/add/AddLink.js +@@ -171,6 +171,51 @@ define([ + }, + + onInsertLink: function(args){ ++ var link = new Asc.asc_CHyperlink(); ++ ++ if ( args.type == 'ext' ) { ++ var url = args.url, ++ urltype = this.api.asc_getUrlType($.trim(url)), ++ isEmail = (urltype == 2); ++ ++ if (urltype < 1) { ++ uiApp.alert(this.txtNotUrl); ++ return; ++ } ++ ++ url = url.replace(/^\s+|\s+$/g,''); ++ ++ if (! /(((^https?)|(^ftp)):\/\/)|(^mailto:)/i.test(url) ) ++ url = (isEmail ? 'mailto:' : 'http://' ) + url; ++ ++ url = url.replace(new RegExp("%20",'g')," "); ++ ++ link.asc_setType(Asc.c_oAscHyperlinkType.WebLink); ++ link.asc_setHyperlinkUrl(url); ++ display = url; ++ } else { ++ var isValid = /^[A-Z]+[1-9]\d*:[A-Z]+[1-9]\d*$/.test(args.url); ++ ++ if (!isValid) ++ isValid = /^[A-Z]+[1-9]\d*$/.test(args.url); ++ ++ if (!isValid) { ++ uiApp.alert(this.textInvalidRange); ++ return; ++ } ++ ++ link.asc_setType(Asc.c_oAscHyperlinkType.RangeLink); ++ link.asc_setSheet(args.sheet); ++ link.asc_setRange(args.url); ++ ++ var display = args.sheet + '!' + args.url; ++ } ++ ++ link.asc_setText(args.text == null ? null : !!args.text ? args.text : display); ++ link.asc_setTooltip(args.tooltip); ++ ++ this.api.asc_insertHyperlink(link); ++ + SSE.getController('AddContainer').hideModal(); + }, + +@@ -179,4 +224,4 @@ define([ + notcriticalErrorTitle: 'Warning' + } + })(), SSE.Controllers.AddLink || {})) +-}); +\ No newline at end of file ++}); +diff --git a/apps/spreadsheeteditor/mobile/app/controller/add/AddOther.js b/apps/spreadsheeteditor/mobile/app/controller/add/AddOther.js +index dd1096405..776d18f92 100644 +--- a/apps/spreadsheeteditor/mobile/app/controller/add/AddOther.js ++++ b/apps/spreadsheeteditor/mobile/app/controller/add/AddOther.js +@@ -174,6 +174,10 @@ define([ + if (!_.isEmpty(url)) { + if ((/((^https?)|(^ftp)):\/\/.+/i.test(url))) { + SSE.getController('AddContainer').hideModal(); ++ ++ _.defer(function () { ++ me.api.asc_addImageDrawingObject(url); ++ }); + } else { + uiApp.alert(me.txtNotUrl, me.notcriticalErrorTitle); + } +@@ -182,6 +186,7 @@ define([ + } + } else { + SSE.getController('AddContainer').hideModal(); ++ this.api.asc_addImage(); + } + }, + +@@ -190,6 +195,11 @@ define([ + }, + + onInsertFilter: function(checked) { ++ var formatTableInfo = this.api.asc_getCellInfo().asc_getFormatTableInfo(); ++ var tablename = (formatTableInfo) ? formatTableInfo.asc_getTableName() : undefined; ++ if (checked) ++ this.api.asc_addAutoFilter(); else ++ this.api.asc_changeAutoFilter(tablename, Asc.c_oAscChangeFilterOptions.filter, checked); + }, + + onError: function(id, level, errData) { +diff --git a/apps/spreadsheeteditor/mobile/app/controller/add/AddShape.js b/apps/spreadsheeteditor/mobile/app/controller/add/AddShape.js +index b7a1cbcf2..b3411de3b 100644 +--- a/apps/spreadsheeteditor/mobile/app/controller/add/AddShape.js ++++ b/apps/spreadsheeteditor/mobile/app/controller/add/AddShape.js +@@ -211,6 +211,12 @@ define([ + }, + + onShapeClick: function (e) { ++ var $target = $(e.currentTarget); ++ ++ if ($target && this.api) { ++ this.api.asc_addShapeOnSheet($target.data('type')); ++ } ++ + SSE.getController('AddContainer').hideModal(); + }, + +diff --git a/apps/spreadsheeteditor/mobile/app/controller/edit/EditCell.js b/apps/spreadsheeteditor/mobile/app/controller/edit/EditCell.js +index ef9666471..d75035de8 100644 +--- a/apps/spreadsheeteditor/mobile/app/controller/edit/EditCell.js ++++ b/apps/spreadsheeteditor/mobile/app/controller/edit/EditCell.js +@@ -85,8 +85,10 @@ define([ + + me.api.asc_setThumbnailStylesSizes(me._styleSize.width, me._styleSize.height); + ++ me.api.asc_registerCallback('asc_onInitEditorFonts', _.bind(me.onApiLoadFonts, me)); + me.api.asc_registerCallback('asc_onSelectionChanged', _.bind(me.onApiSelectionChanged, me)); + me.api.asc_registerCallback('asc_onEditorSelectionChanged', _.bind(me.onApiEditorSelectionChanged, me)); ++ me.api.asc_registerCallback('asc_onInitEditorStyles', _.bind(me.onApiInitEditorStyles, me)); + }, + + setMode: function (mode) { +@@ -349,6 +351,15 @@ define([ + me.initTextFormat(); + }, + ++ onApiInitEditorStyles: function(styles){ ++ window.styles_loaded = false; ++ this._cellStyles = styles; ++ ++ this.getView('EditCell').renderStyles(styles); ++ ++ window.styles_loaded = true; ++ }, ++ + // Handlers + + onFontSize: function (e) { +@@ -448,6 +459,10 @@ define([ + }, + + onCellFormat: function (e) { ++ var $target = $(e.currentTarget), ++ type = decodeURIComponent(atob($target.data('type'))); ++ ++ this.api.asc_setCellFormat(type); + }, + + onBorderStyle: function (e) { +@@ -483,10 +498,38 @@ define([ + + // API handlers + ++ onApiLoadFonts: function(fonts, select) { ++ var me = this; ++ _.each(fonts, function(font) { ++ var fontId = font.asc_getFontId(); ++ me._fontsArray.push({ ++ id : fontId, ++ name : font.asc_getFontName(), ++// displayValue: font.asc_getFontName(), ++ imgidx : font.asc_getFontThumbnail(), ++ type : font.asc_getFontType() ++ }); ++ }); ++ ++ Common.NotificationCenter.trigger('fonts:load', this._fontsArray, select); ++ }, ++ + onApiEditorSelectionChanged: function(fontObj) { ++ if (!this._isEdit) { ++ return; ++ } ++ ++ this._fontInfo = fontObj; ++ this.initFontSettings(fontObj); + }, + + onApiSelectionChanged: function(cellInfo) { ++ if (!this._isEdit) { ++ return; ++ } ++ ++ this._cellInfo = cellInfo; ++ this.initCellSettings(cellInfo); + }, + + // Helpers +@@ -559,4 +602,4 @@ define([ + textPt: 'pt' + } + })(), SSE.Controllers.EditCell || {})) +-}); +\ No newline at end of file ++}); +diff --git a/apps/spreadsheeteditor/mobile/app/controller/edit/EditChart.js b/apps/spreadsheeteditor/mobile/app/controller/edit/EditChart.js +index 0bacfd0e2..5fa56e946 100644 +--- a/apps/spreadsheeteditor/mobile/app/controller/edit/EditChart.js ++++ b/apps/spreadsheeteditor/mobile/app/controller/edit/EditChart.js +@@ -107,7 +107,13 @@ define([ + var me = this; + me.api = api; + ++ me.api.asc_registerCallback('asc_onSelectionChanged', _.bind(me.onApiSelectionChanged, me)); + me.api.asc_registerCallback('asc_onFocusObject', _.bind(me.onApiFocusObject, me)); ++ ++ me.api.asc_registerCallback('asc_onUpdateChartStyles', _.bind(me.onApiUpdateChartStyles, me)); ++ // me.api.asc_registerCallback('asc_onSelectionChanged', _.bind(me.onApiSelectionChanged, me)); ++ // me.api.asc_registerCallback('asc_onEditorSelectionChanged', _.bind(me.onApiEditorSelectionChanged, me)); ++ // me.api.asc_registerCallback('asc_onInitEditorStyles', _.bind(me.onApiInitEditorStyles, me)); // TODO: It does not work until the error in the SDK + }, + + setMode: function (mode) { +@@ -166,7 +172,7 @@ define([ + }, + + getChart: function () { +- return _chartObject; ++ return this._chartObject; + }, + + initRootPage: function () { +@@ -564,9 +570,41 @@ define([ + }, + + onType: function (e) { ++ var me = this, ++ $target = $(e.currentTarget), ++ type = $target.data('type'); ++ ++ $('.chart-types li').removeClass('active'); ++ $target.addClass('active'); ++ ++ _.defer(function() { ++ var image = new Asc.asc_CImgProperty(), ++ chart = me._chartObject.get_ChartProperties(); ++ ++ chart.changeType(type); ++ image.put_ChartProperties(chart); ++ ++ me.api.asc_setGraphicObjectProps(image); ++ ++ // Force update styles ++ me._updateChartStyles(me.api.asc_getChartPreviews(chart.getType())); ++ ++ me.updateAxisProps(type); ++ }); + }, + + onStyle: function (e) { ++ var me = this, ++ $target = $(e.currentTarget), ++ type = $target.data('type'); ++ ++ var image = new Asc.asc_CImgProperty(), ++ chart = this._chartObject.get_ChartProperties(); ++ ++ chart.putStyle(type); ++ image.put_ChartProperties(chart); ++ ++ me.api.asc_setGraphicObjectProps(image); + }, + + onFillColor:function (palette, color) { +@@ -906,6 +944,28 @@ define([ + + // API handlers + ++ onApiUpdateChartStyles: function () { ++ if (this.api && this._chartObject && this._chartObject.get_ChartProperties()) { ++ this._updateChartStyles(this.api.asc_getChartPreviews(this._chartObject.get_ChartProperties().getType())); ++ } ++ }, ++ ++ onApiSelectionChanged: function(info) { ++ if (!this._isEdit) { ++ return; ++ } ++ ++ var me = this, ++ selectedObjects = [], ++ selectType = info.asc_getSelectionType(); ++ ++ if (selectType == Asc.c_oAscSelectionType.RangeChart) { ++ selectedObjects = me.api.asc_getGraphicObjectProps(); ++ } ++ ++ me.onApiFocusObject(selectedObjects); ++ }, ++ + onApiFocusObject: function (objects) { + _stack = objects; + +@@ -1057,4 +1117,4 @@ define([ + textFit: 'Fit Width' + } + })(), SSE.Controllers.EditChart || {})) +-}); +\ No newline at end of file ++}); +diff --git a/apps/spreadsheeteditor/mobile/app/controller/edit/EditShape.js b/apps/spreadsheeteditor/mobile/app/controller/edit/EditShape.js +index 83e225529..5f701a46d 100644 +--- a/apps/spreadsheeteditor/mobile/app/controller/edit/EditShape.js ++++ b/apps/spreadsheeteditor/mobile/app/controller/edit/EditShape.js +@@ -242,9 +242,28 @@ define([ + }, + + onReorder: function(e) { ++ var $target = $(e.currentTarget), ++ type = $target.data('type'), ++ ascType; ++ ++ if (type == 'all-up') { ++ ascType = Asc.c_oAscDrawingLayerType.BringToFront; ++ } else if (type == 'all-down') { ++ ascType = Asc.c_oAscDrawingLayerType.SendToBack; ++ } else if (type == 'move-up') { ++ ascType = Asc.c_oAscDrawingLayerType.BringForward; ++ } else { ++ ascType = Asc.c_oAscDrawingLayerType.SendBackward; ++ } ++ ++ this.api.asc_setSelectedDrawingObjectLayer(ascType); + }, + + onReplace: function (e) { ++ var $target = $(e.currentTarget), ++ type = $target.data('type'); ++ ++ this.api.asc_changeShapeType(type); + }, + + onBorderSize: function (e) { -- -2.31.1.windows.1 - +2.32.0.rc2