diff options
Diffstat (limited to '')
-rw-r--r-- | content/manager/createAccount.js | 244 | ||||
-rw-r--r-- | content/manager/createAccount.xhtml | 97 | ||||
-rw-r--r-- | content/manager/editAccountOverlay.js | 56 | ||||
-rw-r--r-- | content/manager/editAccountOverlay.xhtml | 154 |
4 files changed, 551 insertions, 0 deletions
diff --git a/content/manager/createAccount.js b/content/manager/createAccount.js new file mode 100644 index 0000000..72c266b --- /dev/null +++ b/content/manager/createAccount.js @@ -0,0 +1,244 @@ +/* + * This file is part of EAS-4-TbSync. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + + "use strict"; + +var { TbSync } = ChromeUtils.import("chrome://tbsync/content/tbsync.jsm"); + +const eas = TbSync.providers.eas; + +var tbSyncEasNewAccount = { + + startTime: 0, + maxTimeout: 30, + validating: false, + + onClose: function () { + //disallow closing of wizard while validating + return !this.validating; + }, + + onCancel: function (event) { + //disallow closing of wizard while validating + if (this.validating) { + event.preventDefault(); + } + }, + + onLoad: function () { + this.providerData = new TbSync.ProviderData("eas"); + + this.elementName = document.getElementById('tbsync.newaccount.name'); + this.elementUser = document.getElementById('tbsync.newaccount.user'); + this.elementUrl = document.getElementById('tbsync.newaccount.url'); + this.elementPass = document.getElementById('tbsync.newaccount.password'); + this.elementServertype = document.getElementById('tbsync.newaccount.servertype'); + + document.getElementById("tbsync.newaccount.wizard").getButton("back").hidden = true; + this.onUserDropdown(); + + document.getElementById("tbsync.error").hidden = true; + document.getElementById("tbsync.spinner").hidden = true; + + document.addEventListener("wizardfinish", tbSyncEasNewAccount.onFinish.bind(this)); + document.addEventListener("wizardcancel", tbSyncEasNewAccount.onCancel.bind(this)); + // bug https://bugzilla.mozilla.org/show_bug.cgi?id=1618252 + document.getElementById('tbsync.newaccount.wizard')._adjustWizardHeader(); + }, + + onUnload: function () { + }, + + onUserTextInput: function () { + document.getElementById("tbsync.error").hidden = true; + switch (this.elementServertype.value) { + case "select": + document.getElementById("tbsync.newaccount.wizard").getButton("finish").disabled = true; + break; + + case "auto": + document.getElementById("tbsync.newaccount.wizard").getButton("finish").disabled = (this.elementName.value.trim() == "" || this.elementUser.value == "" || this.elementPass.value == ""); + break; + + case "office365": + document.getElementById("tbsync.newaccount.wizard").getButton("finish").disabled = (this.elementName.value.trim() == "" || this.elementUser.value == ""); + break; + + case "custom": + default: + document.getElementById("tbsync.newaccount.wizard").getButton("finish").disabled = (this.elementName.value.trim() == "" || this.elementUser.value == "" || this.elementPass.value == "" || this.elementUrl.value.trim() == ""); + break; + } + }, + + onUserDropdown: function () { + if (this.elementServertype) { + switch (this.elementServertype.value) { + case "select": + document.getElementById('tbsync.newaccount.user.box').hidden = true; + document.getElementById('tbsync.newaccount.url.box').hidden = true; + document.getElementById('tbsync.newaccount.password.box').hidden = true; + document.getElementById("tbsync.newaccount.wizard").getButton("finish").label = TbSync.getString("newaccount.add_custom","eas"); + break; + + case "auto": + document.getElementById('tbsync.newaccount.user.box').hidden = false; + document.getElementById('tbsync.newaccount.url.box').hidden = true; + document.getElementById('tbsync.newaccount.password.box').hidden = false; + document.getElementById("tbsync.newaccount.wizard").getButton("finish").label = TbSync.getString("newaccount.add_auto","eas"); + break; + + case "office365": + document.getElementById('tbsync.newaccount.user.box').hidden = false; + document.getElementById('tbsync.newaccount.url.box').hidden = true; + document.getElementById('tbsync.newaccount.password.box').hidden = true; + document.getElementById("tbsync.newaccount.wizard").getButton("finish").label = TbSync.getString("newaccount.add_custom","eas"); + break; + + case "custom": + default: + document.getElementById('tbsync.newaccount.user.box').hidden = false; + document.getElementById('tbsync.newaccount.url.box').hidden = false; + document.getElementById('tbsync.newaccount.password.box').hidden = false; + document.getElementById("tbsync.newaccount.wizard").getButton("finish").label = TbSync.getString("newaccount.add_custom","eas"); + break; + } + this.onUserTextInput(); + //document.getElementById("tbsync.newaccount.name").focus(); + } + }, + + onFinish: function (event) { + if (document.getElementById("tbsync.newaccount.wizard").getButton("finish").disabled == false) { + //initiate validation of server connection + this.validate(); + } + event.preventDefault(); + }, + + validate: async function () { + let user = this.elementUser.value; + let servertype = this.elementServertype.value; + let accountname = this.elementName.value.trim(); + + let url = (servertype == "custom") ?this.elementUrl.value.trim() : ""; + let password = (servertype == "auto" || servertype == "custom") ? this.elementPass.value : ""; + + if ((servertype == "auto" || servertype == "office365") && user.split("@").length != 2) { + alert(TbSync.getString("autodiscover.NeedEmail","eas")) + return; + } + + this.validating = true; + let error = ""; + + //document.getElementById("tbsync.newaccount.wizard").canRewind = false; + document.getElementById("tbsync.error").hidden = true; + document.getElementById("tbsync.newaccount.wizard").getButton("cancel").disabled = true; + document.getElementById("tbsync.newaccount.wizard").getButton("finish").disabled = true; + document.getElementById("tbsync.newaccount.name").disabled = true; + document.getElementById("tbsync.newaccount.user").disabled = true; + document.getElementById("tbsync.newaccount.password").disabled = true; + document.getElementById("tbsync.newaccount.servertype").disabled = true; + + tbSyncEasNewAccount.startTime = Date.now(); + tbSyncEasNewAccount.updateAutodiscoverStatus(); + document.getElementById("tbsync.spinner").hidden = false; + + //do autodiscover + if (servertype == "office365" || servertype == "auto") { + let updateTimer = Components.classes["@mozilla.org/timer;1"].createInstance(Components.interfaces.nsITimer); + updateTimer.initWithCallback({notify : function () {tbSyncEasNewAccount.updateAutodiscoverStatus()}}, 1000, 3); + + if (servertype == "office365") { + let v2 = await eas.network.getServerConnectionViaAutodiscoverV2JsonRequest("https://autodiscover-s.outlook.com/autodiscover/autodiscover.json?Email="+encodeURIComponent(user)+"&Protocol=ActiveSync"); + let oauthData = eas.network.getOAuthObj({ host: v2.server, user, accountname, servertype }); + if (oauthData) { + // ask for token + document.getElementById("tbsync.spinner").hidden = true; + let _rv = {}; + if (await oauthData.asyncConnect(_rv)) { + password = _rv.tokens; + } else { + error = TbSync.getString("status." + _rv.error, "eas"); + } + document.getElementById("tbsync.spinner").hidden = false; + url=v2.server; + } else { + error = TbSync.getString("status.404", "eas"); + } + } else { + let result = await eas.network.getServerConnectionViaAutodiscover(user, password, tbSyncEasNewAccount.maxTimeout*1000); + if (result.server) { + user = result.user; + url = result.server; + } else { + error = result.error; // is a localized string + } + } + + updateTimer.cancel(); + } + + //now validate the information + if (!error) { + if (!password) error = TbSync.getString("status.401", "eas"); + } + + //add if valid + if (!error) { + tbSyncEasNewAccount.addAccount(user, password, servertype, accountname, url); + } + + //end validation + document.getElementById("tbsync.newaccount.name").disabled = false; + document.getElementById("tbsync.newaccount.user").disabled = false; + document.getElementById("tbsync.newaccount.password").disabled = false; + document.getElementById("tbsync.newaccount.servertype").disabled = false; + document.getElementById("tbsync.newaccount.wizard").getButton("cancel").disabled = false; + document.getElementById("tbsync.newaccount.wizard").getButton("finish").disabled = false; + document.getElementById("tbsync.spinner").hidden = true; + //document.getElementById("tbsync.newaccount.wizard").canRewind = true; + + this.validating = false; + + //close wizard, if done + if (!error) { + document.getElementById("tbsync.newaccount.wizard").cancel(); + } else { + document.getElementById("tbsync.error.message").textContent = error; + document.getElementById("tbsync.error").hidden = false; + } + }, + + updateAutodiscoverStatus: function () { + let offset = Math.round(((Date.now() - tbSyncEasNewAccount.startTime)/1000)); + let timeout = (offset>2) ? " (" + (tbSyncEasNewAccount.maxTimeout - offset) + ")" : ""; + + document.getElementById('tbsync.newaccount.autodiscoverstatus').value = TbSync.getString("autodiscover.Querying","eas") + timeout; + }, + + addAccount (user, password, servertype, accountname, url) { + let newAccountEntry = this.providerData.getDefaultAccountEntries(); + newAccountEntry.user = user; + newAccountEntry.servertype = servertype; + + if (url) { + //if no protocoll is given, prepend "https://" + if (url.substring(0,4) != "http" || url.indexOf("://") == -1) url = "https://" + url.split("://").join("/"); + newAccountEntry.host = eas.network.stripAutodiscoverUrl(url); + newAccountEntry.https = (url.substring(0,5) == "https"); + } + + // Add the new account. + let newAccountData = this.providerData.addAccount(accountname, newAccountEntry); + eas.network.getAuthData(newAccountData).updateLoginData(user, password); + + window.close(); + } +}; diff --git a/content/manager/createAccount.xhtml b/content/manager/createAccount.xhtml new file mode 100644 index 0000000..73acf13 --- /dev/null +++ b/content/manager/createAccount.xhtml @@ -0,0 +1,97 @@ +<?xml version="1.0" encoding="UTF-8"?> +<?xml-stylesheet href="chrome://global/skin/global.css" type="text/css"?> + +<window + xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" + xmlns:html="http://www.w3.org/1999/xhtml" + onload="tbSyncEasNewAccount.onLoad();" + onunload="tbSyncEasNewAccount.onUnload();" + onclose="return tbSyncEasNewAccount.onClose()" > + + <linkset> + <html:link rel="localization" href="toolkit/global/wizard.ftl"/> + </linkset> + + <script type="application/javascript" src="chrome://eas4tbsync/content/manager/createAccount.js"/> + <script type="application/javascript" src="chrome://eas4tbsync/content/locales.js"/> + + <wizard + title="__EAS4TBSYNCMSG_add.title__" + id="tbsync.newaccount.wizard"> + + <wizardpage onFirstPage="true" label="__EAS4TBSYNCMSG_add.shortdescription__"> + <description style="width: 350px">__EAS4TBSYNCMSG_add.description__</description> + + <richlistbox height="250" id="tbsync.newaccount.servertype" seltype="single" style="margin-top:1ex" onselect="tbSyncEasNewAccount.onUserDropdown();"> + <richlistitem value="auto" style="padding: 4px"> + <vbox><image src="chrome://eas4tbsync/content/skin/eas32.png" style="margin:1ex" /></vbox> + <vbox flex="1"> + <label class="header" value="__EAS4TBSYNCMSG_servertype.auto__" /> + <description>__EAS4TBSYNCMSG_servertype.description.auto__</description> + </vbox> + </richlistitem> + + <richlistitem value="custom" style="padding: 4px"> + <vbox><image src="chrome://eas4tbsync/content/skin/eas32.png" style="margin:1ex" /></vbox> + <vbox flex="1"> + <label class="header" value="__EAS4TBSYNCMSG_servertype.custom__" /> + <description>__EAS4TBSYNCMSG_servertype.description.custom__</description> + </vbox> + </richlistitem> + + <richlistitem value="office365" style="padding: 4px"> + <vbox><image src="chrome://eas4tbsync/content/skin/365_32.png" style="margin:1ex" /></vbox> + <vbox flex="1"> + <label class="header" value="__EAS4TBSYNCMSG_servertype.office365__" /> + <description>__EAS4TBSYNCMSG_servertype.description.office365__</description> + </vbox> + </richlistitem> + </richlistbox> + + <html:table style="margin-top:1em"> + <html:tr> + <html:td width="33%"><vbox pack="center"><label value="__EAS4TBSYNCMSG_add.name__" /></vbox></html:td> + <html:td width="67%"><html:input id="tbsync.newaccount.name" oninput="tbSyncEasNewAccount.onUserTextInput();"/></html:td> + </html:tr> + <html:tr id="tbsync.newaccount.user.box"> + <html:td><vbox pack="center"><label value="__EAS4TBSYNCMSG_add.user__" /></vbox></html:td> + <html:td><html:input id="tbsync.newaccount.user" oninput="tbSyncEasNewAccount.onUserTextInput();"/></html:td> + </html:tr> + <html:tr id="tbsync.newaccount.password.box"> + <html:td><vbox pack="center"><label value="__EAS4TBSYNCMSG_add.password__" /></vbox></html:td> + <html:td><html:input id="tbsync.newaccount.password" type="password" oninput="tbSyncEasNewAccount.onUserTextInput();"/></html:td> + </html:tr> + <html:tr id="tbsync.newaccount.url.box"> + <html:td><vbox pack="center"><label value="__EAS4TBSYNCMSG_add.url__" /></vbox></html:td> + <html:td><html:input id="tbsync.newaccount.url" oninput="tbSyncEasNewAccount.onUserTextInput();" tooltiptext="__EAS4TBSYNCMSG_add.urldescription__"/></html:td> + </html:tr> + + <!--html:tr style="height:40px; margin-top:1ex;margin-bottom:1ex;"> + <html:td><vbox pack="center"></vbox></html:td> + <html:td><vbox pack="center"></vbox></html:td> + </html:tr--> + </html:table> + + <vbox flex="1"> + </vbox> + <hbox id="tbsync.spinner"> + <image src="chrome://tbsync/content/skin/spinner.gif" style="margin-left:1em" width="16" height="16"/> + <label id='tbsync.newaccount.autodiscoverstatus' value="" /> + </hbox> + + <vbox id="tbsync.error" style="width: 450px;"> + <description id="tbsync.error.message" flex="1" style="font-weight: bold;"></description> + <vbox> + <button + id="tbsync.error.link" + label="__EAS4TBSYNCMSG_manager.ShowEventLog__" + oncommand="TbSync.eventlog.open();"/> + </vbox> + </vbox> + + + </wizardpage> + + </wizard> + +</window> diff --git a/content/manager/editAccountOverlay.js b/content/manager/editAccountOverlay.js new file mode 100644 index 0000000..7fdc18f --- /dev/null +++ b/content/manager/editAccountOverlay.js @@ -0,0 +1,56 @@ +/* + * This file is part of EAS-4-TbSync. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +"use strict"; + +const eas = TbSync.providers.eas; + +var tbSyncEditAccountOverlay = { + + onload: function (window, accountData) { + this.accountData = accountData; + + // special treatment for configuration label, which is a permanent setting and will not change by switching modes + let configlabel = window.document.getElementById("tbsync.accountsettings.label.config"); + if (configlabel) { + configlabel.setAttribute("value", TbSync.getString("config.custom", "eas")); + } + }, + + stripHost: function (document) { + let host = document.getElementById('tbsync.AccountPropertys.pref.host').value; + if (host.indexOf("https://") == 0) { + host = host.replace("https://",""); + document.getElementById('tbsync.AccountPropertys.pref.https').checked = true; + this.accountData.setAccountProperty("https", true); + } else if (host.indexOf("http://") == 0) { + host = host.replace("http://",""); + document.getElementById('tbsync.AccountPropertys.pref.https').checked = false; + this.accountData.setAccountProperty("https", false); + } + + while (host.endsWith("/")) { host = host.slice(0,-1); } + document.getElementById('tbsync.AccountPropertys.pref.host').value = host + this.accountData.setAccountProperty("host", host); + }, + + deleteFolder: function() { + let folderList = document.getElementById("tbsync.accountsettings.folderlist"); + if (folderList.selectedItem !== null && !folderList.disabled) { + let folderData = folderList.selectedItem.folderData; + + //only trashed folders can be purged (for example O365 does not show deleted folders but also does not allow to purge them) + if (!eas.tools.parentIsTrash(folderData)) return; + + if (folderData.getFolderProperty("selected")) window.alert(TbSync.getString("deletefolder.notallowed::" + folderData.getFolderProperty("foldername"), "eas")); + else if (window.confirm(TbSync.getString("deletefolder.confirm::" + folderData.getFolderProperty("foldername"), "eas"))) { + folderData.sync({syncList: false, syncJob: "deletefolder"}); + } + } + } +}; diff --git a/content/manager/editAccountOverlay.xhtml b/content/manager/editAccountOverlay.xhtml new file mode 100644 index 0000000..dc37731 --- /dev/null +++ b/content/manager/editAccountOverlay.xhtml @@ -0,0 +1,154 @@ +<?xml version="1.0"?> +<?xml-stylesheet href="chrome://tbsync/content/skin/fix_dropdown_1534697.css" type="text/css"?> + +<overlay + id="tbSyncAccountConfig" + xmlns:html="http://www.w3.org/1999/xhtml"> + + <script type="application/javascript" src="chrome://eas4tbsync/content/manager/editAccountOverlay.js"/> + <script type="application/javascript" src="chrome://eas4tbsync/content/locales.js"/> + + <menuitem + id="TbSync.eas.FolderListContextMenuDelete" + label="__EAS4TBSYNCMSG_pref.ShowTrashedFolders__" + class="menuitem-iconic" + image="chrome://tbsync/content/skin/trash16.png" + appendto="tbsync.accountsettings.FolderListContextMenu" + oncommand="tbSyncEditAccountOverlay.deleteFolder();"/> + + <tab id="manager.tabs.accountsettings" label="__EAS4TBSYNCMSG_manager.tabs.accountsettings__" appendto="manager.tabs" /> + <tab id="manager.tabs.syncsettings" label="__EAS4TBSYNCMSG_manager.tabs.syncsettings__" appendto="manager.tabs" /> + + <tabpanel id="manager.tabpanels.accountsettings" appendto="manager.tabpanels" flex="1" orient="vertical"><!-- ACCOUNT SETTINGS --> + <vbox flex="1"> + <label class="header lockIfConnected" style="margin-left:0; margin-bottom:1ex;" value="" id="tbsync.accountsettings.label.config" /> + <html:table flex="1"> + <html:tr> + <html:td style="margin-right:1ex;"> + <vbox pack="center"> + <label style="text-align:left" control="tbsync.accountsettings.pref.accountname" value="__EAS4TBSYNCMSG_pref.AccountName__" /> + </vbox> + </html:td> + <html:td width="100%"> + <html:input id="tbsync.accountsettings.pref.accountname" /> + </html:td> + </html:tr> + + <html:tr> + <html:td style="margin-right:1ex;" > + <vbox pack="center"> + <label class="lockIfConnected" style="text-align:left" control="tbsync.accountsettings.pref.user" value="__EAS4TBSYNCMSG_pref.UserName__" /> + </vbox> + </html:td> + <html:td> + <html:input class="lockIfConnected" tooltiptext="__EAS4TBSYNCMSG_pref.UserNameDescription__" id="tbsync.accountsettings.pref.user" /> + </html:td> + </html:tr> + + <html:tr> + <html:td style="margin-right:1ex;" > + <vbox pack="center"> + <label class="lockIfConnected" style="text-align:left" control="tbsync.accountsettings.pref.host" value="__EAS4TBSYNCMSG_pref.ServerName__" /> + </vbox> + </html:td> + <html:td> + <html:input class="lockIfConnected" tooltiptext="__EAS4TBSYNCMSG_pref.ServerNameDescription__" id="tbsync.accountsettings.pref.host" onblur="tbSyncEditAccountOverlay.stripHost(document);" /> + </html:td> + </html:tr> + + <html:tr> + <html:td style="margin-right:1ex;" > + <hbox/> + </html:td> + <html:td> + <checkbox class="lockIfConnected" style="margin-bottom:1ex" id="tbsync.accountsettings.pref.https" label="__EAS4TBSYNCMSG_pref.usehttps__" /> + </html:td> + </html:tr> + + <html:tr> + <html:td style="margin-right:1ex;" > + <vbox id="asversion.hook" pack="center"> + <label class="lockIfConnected" style="text-align:left" control="tbsync.accountsettings.pref.asversionselected" value="__EAS4TBSYNCMSG_pref.ActiveSyncVersion__" /> + </vbox> + </html:td> + <html:td> + <menulist flex="0" id="tbsync.accountsettings.pref.asversionselected" class="lockIfConnected"> + <menupopup id="asversion.popup"> + <menuitem label="__EAS4TBSYNCMSG_pref.autodetect__" value="auto" /> + <menuitem label="v2.5" value="2.5" /> + <menuitem label="v14.0" value="14.0" /> + </menupopup> + </menulist> + </html:td> + </html:tr> + + <html:tr> + <html:td style="margin-right:1ex;" > + <label class="lockIfConnected" style="text-align:left" value="__EAS4TBSYNCMSG_pref.DeviceId__" /> + </html:td> + <html:td> + <label value="" disabled="true" id="tbsync.accountsettings.pref.deviceId" /> + </html:td> + </html:tr> + </html:table> + + <vbox flex="1" /> + <vbox class="showIfConnected"> + <hbox> + <vbox pack="center"><image src="chrome://tbsync/content/skin/info16.png" /></vbox> + <description flex="1">__EAS4TBSYNCMSG_manager.lockedsettings.description__</description> + </hbox> + </vbox> + + </vbox> + </tabpanel> + + <tabpanel id="manager.tabpanels.syncsettings" appendto="manager.tabpanels" flex="1" orient="vertical"><!-- SYNC SETTINGS --> + <vbox flex="1"> + <label style="margin-left:0; margin-bottom: 1ex;" class="header lockIfConnected" value="__EAS4TBSYNCMSG_pref.generaloptions__"/> + <vbox> + <checkbox class="lockIfConnected" id="tbsync.accountsettings.pref.provision" label="__EAS4TBSYNCMSG_pref.provision__" /> + </vbox> + + <label style="margin-left:0; margin-bottom: 1ex; margin-top: 3ex" class="header lockIfConnected" value="__EAS4TBSYNCMSG_pref.contactoptions__"/> + <vbox> + <checkbox class="lockIfConnected" id="tbsync.accountsettings.pref.displayoverride" label="__EAS4TBSYNCMSG_pref.displayoverride__" /> + <hbox align="center"> + <description id="separator.hook" class="lockIfConnected" flex="0">__EAS4TBSYNCMSG_pref.seperator.description__</description> + <menulist id="tbsync.accountsettings.pref.seperator" class="lockIfConnected"> + <menupopup id="separator.popup"> + <menuitem label="__EAS4TBSYNCMSG_pref.seperator.linebreak__" value="10" /> + <menuitem label="__EAS4TBSYNCMSG_pref.seperator.comma__" value="44" /> + </menupopup> + </menulist> + </hbox> + </vbox> + + <label style="margin-left:0; margin-bottom: 1ex; margin-top: 3ex" class="header lockIfConnected" value="__EAS4TBSYNCMSG_pref.calendaroptions__"/> + <vbox> + <hbox align="center"> + <description id="synclimit.hook" class="lockIfConnected" flex="0">__EAS4TBSYNCMSG_pref.synclimit.description__</description> + <menulist id="tbsync.accountsettings.pref.synclimit" class="lockIfConnected"> + <menupopup id="synclimit.popup"> + <menuitem label="__EAS4TBSYNCMSG_pref.synclimit.all__" value="0" /> + <menuitem label="__EAS4TBSYNCMSG_pref.synclimit.2weeks__" value="4" /> + <menuitem label="__EAS4TBSYNCMSG_pref.synclimit.1month__" value="5" /> + <menuitem label="__EAS4TBSYNCMSG_pref.synclimit.3month__" value="6" /> + <menuitem label="__EAS4TBSYNCMSG_pref.synclimit.6month__" value="7" /> + </menupopup> + </menulist> + </hbox> + </vbox> + + + <vbox flex="1" /> + <vbox class="showIfConnected"> + <hbox> + <vbox pack="center"><image src="chrome://tbsync/content/skin/info16.png" /></vbox> + <description flex="1">__EAS4TBSYNCMSG_manager.lockedsettings.description__</description> + </hbox> + </vbox> + </vbox> + </tabpanel> + +</overlay> |