diff options
Diffstat (limited to 'Software/.jxbrowser-data/Cache/f_00003f')
| -rw-r--r-- | Software/.jxbrowser-data/Cache/f_00003f | 3342 |
1 files changed, 3342 insertions, 0 deletions
diff --git a/Software/.jxbrowser-data/Cache/f_00003f b/Software/.jxbrowser-data/Cache/f_00003f new file mode 100644 index 000000000..47da68a70 --- /dev/null +++ b/Software/.jxbrowser-data/Cache/f_00003f @@ -0,0 +1,3342 @@ +Polymer({ is : "ti-rov-panel", + behaviors: [ + Polymer.IronResizableBehavior + ], + + properties: { + dashboardVersion : { + type : String, + value : '1.0' + }, + allModules : { + type: Array, + value: function() { return [];} + }, + viewableModules : { + type: Array, + value: [] + }, + favoriteModules : { + type: Array, + value: [] + }, + favoriteTocItems : { + type: Array, + value: function() { return [];} + }, + curTocModules : { + type: Array, + value: function() { return [];} + }, + tocItems : { + type: Array, + value: function() { return [];} + }, + allModulesVisible : { + type: Boolean, + value: false + }, + dashboards : { + type: Object + }, + rovData : { + type: Object, + value: function() { return {};} + }, + matchedModules : { + type: Array, + value: function() { return [];} + }, + matchedModuleNames : { + type: Array, + value: function() { return [];} + }, + filterValue : { + type: String, + value: '' + }, + showFilterButtonLeft : { + type: Boolean, + value: false + }, + showFilterButtonRight : { + type: Boolean, + value: false + }, + viewList : { + type: Object, + value: function() { return {};} + }, + toggleIcon : { + type: String, + value: 'chevron-left' + }, + toggleTooltip : { + type: String, + value: 'Hide Modules' + }, + rovModuleViews : { + type: Array, + value: function() { return [];} + }, + dashboardNames : { + type: Array, + value: function() { return [];} + }, + refreshInterval : { + type : Number, + value : 1000 + }, + dataTimeoutPeriod : { + type : Number, + value : 10000 + }, + connectTimeoutPeriod : { + type : Number, + value : 20000 + }, + repeatHandle : { + type : Number, + value : 0 + }, + confirmTitle : { + type : String, + value : '' + }, + confirmLabel : { + type : String, + value : '' + }, + confirmProps : { + type : Object, + value : {} + }, + rovSettings : { + type: Object, + value: {} + }, + inRepeatRefresh : { + type: Boolean, + value: false + }, + favoriteMenuItem : { + type: String, + value: '' + }, + statusItems : { + type: Array, + value: [] + }, + rovInit : { + type: Object, + value: {} + }, + connectMessage : { + type: String, + value: '' + }, + currentDashboard : { + type: String, + value: '' + }, + exeName : { + type: String, + value: '' + }, + viewToTopList : { + type: Array, + value: [] + }, + curModsLabel : { + type: String, + value: 'Viewable Modules' + }, + otherModsLabels : { + type: Array, + value: [] + }, + rovViews : { + type: Array, + value: function() { return [];} + }, + enableOtherViews : { + type: Boolean, + value: false + }, + otherViews : { + type: Array, + value: [] + }, + addOnMrus : { + type: Array, + value: [] + }, + commLinkMrus : { + type: Array, + value: [] + }, + exeMrus : { + type: Array, + value: [] + }, + viewsStorageItems : { + type: Array, + value: [] + }, + dashboardConflicts : { + type: Array, + value: [] + }, + overwriteDashboardsItems : { + type: Array, + value: [] + }, + addOnsHash : { + type: Array, + value: [] + }, + ccs7 : { + type: Boolean, + value: false + }, + /* addOn views tooltips were being cached for this.otherViews + * to workaround, use this array to display this.otherViews in dialogs, + * setting it to this.otherViews before showing the dialog and + * then setting it to empty when the dialog is closed + */ + dlgOtherViews : { + type: Array, + value: [] + }, + panelWidth : { + type: Number, + value: -1 + }, + viewContainer : { + type : Object, + value : {} + }, + useCurrentProgram : { + type : String, + value : '<Use the program currently being debugged>' + }, + inited : { + type: Boolean, + value: false + }, + dragData : { + type: Array, + value: [] + }, + discoveredAddOns : { + type: Array, + value: [] + }, + dlgDiscoveredAddOns : { + type: Array, + value: [] + }, + autoConnectMessage : { + type : String, + value : '' + }, + introMessage : { + type: String, + value: '' + }, + introModulesMessage : { + type: String, + value: '' + } + }, + listeners: { + 'iron-resize': 'onIronResize' + }, + attached : function () { + this.set('dashboards', rovUtils.getLocalStorageObject('dashboards-storage')); + var favoritesStorage = rovUtils.getLocalStorageObject('favorites-storage'); + if (Object.keys(favoritesStorage).length > 0) { + this.set('favoriteModules', favoritesStorage); + } + this.set('rovInit', rovUtils.getLocalStorageObject('rovInit-storage')); + this.setRovSettings(rovUtils.getLocalStorageObject('rovSettings-storage')); + if (this.rovInit.autoConnect) { + this.autoConnect(); + } + else { + this.showConnectDialog(); + } + this.$.rovDrawerPanel.disableEdgeSwipe = true; + this.$.rovDrawerPanel.disableSwipe = true; + this.viewContainer = this.$.rovHeaderPanel.$.mainContainer; + this.$.openDashboardFileButton.hidden = !this.ccs7; + this.$.overflowOpenDashboardFileButton.hidden = !this.ccs7; + /* initial toolbar state */ + this.$.rovTitle.hidden = false; + this.$.titleSpan.hidden = true; + this.$.dashboardDiv.hidden = true; + }, + ready : function () { + this.ccs7 = window.ccs7_browser; + this.rovData = document.querySelector('#rovData'); + }, + addDiscoveredAddOnClicked : function (e) { + var selected = []; + var listItems = this.$.discoveredAddOnsList.items; + for (var i = 0; i < listItems.length; i++) { + if (listItems[i].lastElementChild.checked) { + selected.push({path: this.dlgDiscoveredAddOns[i].path, + root: this.dlgDiscoveredAddOns[i].root, + name: this.dlgDiscoveredAddOns[i].name, + elem: listItems[i].firstElementChild, + index: i}); + } + } + for (var i = 0; i < selected.length; i++) { + var path = this.parseAddOnPath(selected[i].path); + this.addOnsHash[path] = selected[i]; + this.importHref(path, + function(e){ + var key = this.getAddOnHashKey(e.target.outerHTML); + var item = this.addOnsHash[key]; + if (this.createAddOn(e, item.path, item.root)) { + item.elem.checked = false; + } + this.syncDiscoveredAddOnsList(); + this.sanityCheckSelectAllBox('selectAllCurrentAddOnsCheckbox', 'curAddOnsList'); + }, + function(e){ + var key = this.getAddOnHashKey(e.target.outerHTML); + this.addOnsHash[key].href = 'error'; + this.showStatus('Error importing ' + e.target.href, 'error'); + } + ); + } + }, + addFavorite : function (mod) { + var tempModules = rovUtils.shallowCopy(this.favoriteModules); + tempModules.push(mod); + this.set('favoriteModules', tempModules); + this.set('favoriteTocItems', this.makeModulesToc(this.favoriteModules)); + rovUtils.setLocalStorageObject('favorites-storage', this.favoriteModules); + }, + addOnDoneClicked : function (e) { + var dialog = document.getElementById('manageAddOnsDialog'); + if (dialog) { + /* clean up */ + this.$.curAddOnsList.selected = -1; + this.$.discoveredAddOnsList.selected = -1; + this.$.removeAddOnButton.disabled = true; + this.$.selectAllCurrentAddOnsCheckbox.checked = false; + this.$.selectAllDiscoveredAddOnsCheckbox.checked = false; + this.$.addDiscoveredAddOnButton.disabled = true; + this.$.loadAddOnButton.disabled = true; + this.showAddOnInput(false); + if (this.$.addOnErrorToast.opened) { + this.$.addOnErrorToast.text = ''; + this.$.addOnErrorToast.close(); + } + this.$.addOnInput.value = ''; + dialog.close(); + this.set('dlgOtherViews', []); + this.set('dlgDiscoveredAddOns', []); + } + }, + addOnErrorCloseClicked : function(e) { + this.$.addOnErrorToast.close(); + this.$.addOnErrorToast.text = ''; + }, + addOnKeyPress : function (e) { + var keyCode = e.keyCode || e.which; + if (keyCode === 13 && this.$.addOnInput.value != '') { + this.loadAddOnClicked(e); + } + }, + addOnOnInput : function (e) { + if (this.$.addOnErrorToast.opened) { + this.$.addOnErrorToast.text = ''; + this.$.addOnErrorToast.close(); + } + this.$.loadAddOnButton.disabled = e.currentTarget.value == ''; + }, + addOnMruSelected : function (e) { + this.mruSelected(e); + if (this.$.addOnErrorToast.opened) { + this.$.addOnErrorToast.text = ''; + this.$.addOnErrorToast.close(); + } + this.$.loadAddOnButton.disabled = false; + }, + addOnViewsClicked : function (e) { + var dialog = document.getElementById('manageAddOnsDialog'); + if (dialog) { + this.set('dlgOtherViews', this.otherViews); + this.set('dlgDiscoveredAddOns', this.discoveredAddOns); + this.$.selectAllCurrentAddOnsCheckbox.disabled = (this.dlgOtherViews.length == 0); + this.populateDiscoveredAddOns(); + this.$.selectAllDiscoveredAddOnsCheckbox.disabled = (this.dlgDiscoveredAddOns.length == 0); + dialog.open(); + dialog.style.zIndex = String(this.getMaxZindex() + 1); + this.$.addOnInput.value = ''; + if (this.$.addOnErrorToast.opened) { + this.$.addOnErrorToast.text = ''; + this.$.addOnErrorToast.close(); + } + } + }, + autoConnect : function () { + var exe = (this.ccs7 && this.rovInit.noExe) ? '' : this.rovInit.exe; + var dialog = this.$.autoConnectProgressDialog; + if (dialog) { + dialog.open(); + dialog.style.zIndex = String(this.getMaxZindex() + 1); + if (!this.rovInit.progressInfo) { + this.rovInit.progressInfo = {}; + this.rovInit.progressInfo.min = 0; + this.rovInit.progressInfo.max = 10; + this.rovInit.progressInfo.step = 1; + } + this.$.autoConnectProgress.min = this.rovInit.progressInfo.min; + this.$.autoConnectProgress.max = this.rovInit.progressInfo.max; + this.$.autoConnectProgress.step = this.rovInit.progressInfo.step; + this.rovInit.progressInfo.notifyCount = 0; + this.$.autoConnectProgress.value = this.rovInit.progressInfo.step; + var exeName = exe; + if (exeName.length > 0) { + exeName = exeName.replace(/\\/g, '/'); + exeName = exeName.substr(exeName.lastIndexOf('/') + 1); + this.exeName = exeName; + exeName += ', '; + } + this.autoConnectMessage = 'Connecting to ' + exeName + this.rovInit.commLink; + this.connectMessage = 'Working...'; + } + this.initRov(exe, this.rovInit.commLink); + }, + averageIntroProgess : function () { + if (!this.rovInit.progressInfo.average) { + this.rovInit.progressInfo.average = this.rovInit.progressInfo.notifyCount; + this.rovInit.progressInfo.numLoads = 1; + + } + else { + /* cumulative moving average */ + this.rovInit.progressInfo.average = (this.rovInit.progressInfo.notifyCount + + (this.rovInit.progressInfo.numLoads * this.rovInit.progressInfo.average)) / + ++this.rovInit.progressInfo.numLoads; + + } + this.rovInit.progressInfo.max = this.rovInit.progressInfo.average + this.rovInit.progressInfo.step; + }, + checkForMissingDashboardAddOns : function (dashboard) { + for (var i = 0; i < dashboard.length; i++) { + if (dashboard[i].elemName) { /* is otherView */ + if (!this.otherViewsHaveElem(dashboard[i].elemName)) { + this.loadMissingDashboardAddOn(dashboard[i], false); + } + } + } + }, + clearAllLocalStorage: function () { + rovUtils.setLocalStorageObject('dashboards-storage', null); + rovUtils.setLocalStorageObject('favorites-storage', null); + rovUtils.setLocalStorageObject('rovInit-storage', null); + rovUtils.setLocalStorageObject('rovSettings-storage', null); + rovUtils.setLocalStorageObject('viewsData-storage', null); + if (this.$.manageStorageDialog.opened) { + this.$.manageStorageDialog.close(); + } + }, + clearAllStorageClicked : function (e) { + this.confirmDialog('Clear all ROV storage', 'Are you sure?', 'clearAll'); + }, + clearAViewChecked : function (e) { + if (!this.$.manageStorageDialog.opened) { + return; + } + this.listItemWithSelectAllOptionClicked(e, 'selectAllViewsStorageCheckbox', + 'viewsStorageList'); + this.enableChecklistDialogActionButton(e, 'viewsStorageList', + 'clearViewStorageButton'); + }, + clearFavorite : function(idx) { + /* modifying 'favoriteModules' directly didn't work, only first item was displayed */ + var tempModules = rovUtils.shallowCopy(this.favoriteModules); + tempModules.splice(idx, 1); + this.set('favoriteModules', tempModules); + this.set('favoriteTocItems', this.makeModulesToc(this.favoriteModules)); + rovUtils.setLocalStorageObject('favorites-storage', this.favoriteModules); + }, + clearFavoriteConfirm : function (mod) { + var idx = this.favoriteModules.indexOf(mod); + var title = 'Remove Favorite'; + var label = 'Remove ' + this.favoriteModules[idx] + ' ?'; + this.confirmDialog(title, label, 'favorite', idx); + }, + clearViewStorageClicked : function (e) { + var viewsStorage = rovUtils.getLocalStorageObject('viewsData-storage'); + var listItems = this.$.viewsStorageList.items; + for (var i = 0; i < listItems.length; i++) { + if (listItems[i].lastElementChild.checked) { + viewsStorage[listItems[i].innerText.trim()] = null; + listItems[i].lastElementChild.checked = false; + } + } + rovUtils.setLocalStorageObject('viewsData-storage', viewsStorage); + /* repopulate list */ + var keys = Object.keys(viewsStorage); + var nonNullKeys = []; + for (var i = 0; i < keys.length; i++) { + if (viewsStorage[keys[i]]) { + nonNullKeys.push(keys[i]); + } + } + if (nonNullKeys.length > 0) { + nonNullKeys.sort(); + this.set('viewsStorageItems', nonNullKeys); + this.$.clearViewStorageButton.disabled = true; + } + else { + this.$.manageStorageDialog.close(); + } + this.$.selectAllViewsStorageCheckbox.checked = false; + this.$.selectAllViewsStorageCheckbox.disabled = nonNullKeys.length == 0; + }, + closeAllClicked : function () { + this.closeAllViews(); + }, + closeAllViews : function() { + var ids = []; + for (var i = 0; i < this.rovModuleViews.length; i++) { + ids.push(this.rovModuleViews[i].id); + } + for (var i = 0; i < this.rovViews.length; i++) { + ids.push(this.rovViews[i].id); + } + for (var i = 0; i < ids.length; i++) { + this.closeView(ids[i]); + } + }, + closeView : function(viewId) { + var rovViews = []; + var found = false; + for (var i = 0; i < this.rovModuleViews.length; i++) { + if (this.rovModuleViews[i].id != viewId) { + rovViews.push(rovUtils.shallowCopy(this.rovModuleViews[i])); + } + else { + found = true; + } + } + if (found) { + this.rovModuleViews = rovViews; + } + else { + rovViews = []; + found = false; + for (var i = 0; i < this.rovViews.length; i++) { + if (this.rovViews[i].id != viewId) { + rovViews.push(rovUtils.shallowCopy(this.rovViews[i])); + } + else { + found = true; + } + } + if (found) { + this.rovViews = rovViews; + } + } + var chNodes = Polymer.dom(this.$.contentDiv).childNodes; + for (var i = 0; i < chNodes.length; i++) { + if (chNodes[i].id == viewId) { + contentDiv.removeChild(chNodes[i]); + Polymer.dom.flush(); + break; + } + } + this.toolbarButtonsState(); + this.dashboardButtonsState(); + }, + confirmDialog : function(title, label, objName, sel) { + var dialog = document.getElementById('confirmDialog'); + if (dialog) { + this.confirmProps = {}; + this.confirmProps.objName = objName; + this.confirmProps.sel = sel; + this.confirmTitle = title; + this.confirmLabel = label; + dialog.open(); + dialog.style.zIndex = String(this.getMaxZindex() + 2); + } + }, + confirmOkClicked : function (e) { + this.$.confirmDialog.close(); + if (this.confirmProps.objName == 'dashboard') { + this.deleteDashboard(this.confirmProps.sel); + } + else if (this.confirmProps.objName == 'favorite') { + this.clearFavorite(this.confirmProps.sel); + } + else if (this.confirmProps.objName == 'dashboardConflict') { + this.saveDroppedDashboard(this.confirmProps.sel.name, + this.confirmProps.sel.dashboard, + this.confirmProps.sel.show); + } + else if (this.confirmProps.objName == 'clearAll') { + this.clearAllLocalStorage(); + } + }, + connectClicked : function (e) { + this.rovInit.autoConnectChecked = this.$.autoConnectCheckbox.checked; + rovUtils.setLocalStorageObject('rovInit-storage', this.rovInit); + this.$.connectMessageDiv.hidden = true; + var useProgram = this.$.exeInput.value == this.useCurrentProgram; + var exeInvalid = !useProgram && this.$.exeInput.value.length == 0; + var commLinkInvalid = this.$.commLinkInput.value.length == 0; + this.$.exeInputInvalid.hidden = !exeInvalid; + this.$.commLinkInputInvalid.hidden = !commLinkInvalid; + if (exeInvalid || commLinkInvalid) { + return; + } + if (!useProgram) { + var exe = this.$.exeInput.value.replace(/\\/g, '/'); + if (exe.indexOf('/') >= 0) { + exe = exe.substr(exe.lastIndexOf('/') + 1); + } + this.exeName = exe; + this.connectMessage = 'Connecting to ' + this.exeName + ', ' + this.$.commLinkInput.value; + } + else { + this.connectMessage = 'Connecting to ' + this.$.commLinkInput.value; + } + this.$.connectErrorIcon.hidden = true; + this.$.connectMessageDiv.hidden = false; + this.$.connectProgress.hidden = false; + this.$.connectButton.disabled = true; + this.initRov(useProgram ? '' : this.$.exeInput.value, this.$.commLinkInput.value); + this.rovInit.progressInfo.notifyCount = 0; + this.$.connectProgress.value = this.rovInit.progressInfo.step; + }, + connectKeyPress : function (e) { + var keyCode = e.keyCode || e.which; + if (keyCode === 13 && this.$.connectButton.disabled == false) { + this.connectClicked(e); + } + }, + createAddOn : function (e, path, root) { + var addOn = {}; + addOn.path = path; + addOn.root = root; + addOn.element = this.getImportedAddOnId(e.target.import.activeElement); + var elem = document.createElement(addOn.element); + if (elem.viewName == undefined || elem.textContent.length == 0) { + this.$.addOnErrorToast.text = 'Error creating element <' + addOn.element + '>'; + this.$.addOnErrorToast.fitInto = this.$.manageAddOnsDialog; + this.$.addOnErrorToast.open(); + Polymer.dom.flush(); + return (false); + } + addOn.name = elem.viewName; + addOn.href = e.target.href; + var other = (this.otherViews.length > 0) ? rovUtils.shallowCopy(this.otherViews) : []; + other.unshift(addOn); + this.set('otherViews', other); + this.set('dlgOtherViews', other); + this.$.curAddOnsTemplate.render(); + this.$.selectAllCurrentAddOnsCheckbox.disabled = (this.dlgOtherViews.length == 0); + this.$.curAddOnsList.selected = -1; + this.$.removeAddOnButton.disabled = true; + if (!this.enableOtherViews) { + this.enableOtherViews = true; + if (this.$$('#otherViewsButton')) { + this.$$('#otherViewsButton').disabled = true; + } + } + this.saveAddOnMru(addOn.path); + var rovSettings = rovUtils.getLocalStorageObject('rovSettings-storage'); + rovSettings.otherViews = this.otherViews; + rovUtils.setLocalStorageObject('rovSettings-storage', rovSettings); + return (true); + }, + curAddOnClicked : function (e) { + if (!this.$.manageAddOnsDialog.opened) { + return; + } + this.listItemWithSelectAllOptionClicked(e, 'selectAllCurrentAddOnsCheckbox', + 'curAddOnsList'); + this.enableChecklistDialogActionButton(e, 'curAddOnsList', + 'removeAddOnButton'); + }, + dashboardButtonsState : function() { + var hasSavedDashboards = this.hasSavedDashboards(); + this.enableOpenDashboardButton(hasSavedDashboards); + this.$.deleteDashboardButton.disabled = !hasSavedDashboards; + this.$.overflowDeleteDashboardButton.disabled = this.$.deleteDashboardButton.disabled; + this.$.exportDashboardsClicked.hidden = !hasSavedDashboards; + var allViewsLength = this.rovModuleViews.length + this.rovViews.length; + this.$.openDashboardFileButton.disabled = false; + this.$.overflowOpenDashboardFileButton.disabled = this.$.openDashboardFileButton.disabled; + this.$.saveDashboardButton.disabled = allViewsLength == 0; + this.$.overflowSaveDashboardButton.disabled = this.$.saveDashboardButton.disabled; + if (allViewsLength == 0) { + this.setCurrentDashboard(''); + } + }, + dashboardConflictsDialog : function () { + var dialog = document.getElementById('overwriteDashboardsDialog'); + if (dialog) { + var names = []; + for (var i = 0; i < this.dashboardConflicts.length; i++) { + names.push(this.dashboardConflicts[i].name); + } + names.sort(); + this.set('overwriteDashboardsItems', names); + dialog.open(); + dialog.style.zIndex = String(this.getMaxZindex() + 10); + + /* Init checkboxes and clear selection button */ + var listItems = this.$.overwriteDashboardsList.items; + for (var i = 0; i < listItems.length; i++) { + listItems[i].lastElementChild.checked = true; + } + this.$.overwriteDashboardsList.selected = -1; + this.$.overwriteDashboardsButton.disabled = false; + } + }, + dashboardDrag : function (e) { + if (e.preventDefault) { + e.preventDefault(); + } + if (this.ccs7) { + return; + } + if (this.isOverOpenButton(e)) { + e.dataTransfer.dropEffect = 'copy'; + // e.dataTransfer.effectAllowed = 'copy'; + this.enableOpenDashboardButton(true, 'dodgerblue'); + } + else { + this.enableOpenDashboardButton(this.hasSavedDashboards()); + } + }, + dashboardDragEnter : function (e) { + this.dashboardDrag(e); + }, + dashboardDragOver : function (e) { + this.dashboardDrag(e); + }, + dashboardFileLoaded : function (file, e) { + var valid = false; + var error = null; + try { + var dashboard = JSON.parse(e.target.result); + if (rovUtils.isArray(dashboard)) { + if (dashboard[0].moduleName || dashboard[0].elemName) { + valid = true; + var name = dashboard.pop(); + var savedDashboards = Object.keys(this.dashboards); + if (savedDashboards.length > 0 && savedDashboards.indexOf(name) >= 0) { + this.confirmDialog('Overwite dashboard', + 'Overwite ' + name + ' ?', + 'dashboardConflict', + {name: name, dashboard: dashboard, + show: true, file: file}); + } + else { + this.saveDroppedDashboard(name, dashboard, true); + } + } + else if (dashboard[0].fileName && dashboard[0].numDashboards) { + valid = true; + dashboard.shift(); + this.dashboardsArrayLoaded(dashboard); + } + } + } + catch (e) { + error = e; + } + if (!valid) { + this.showStatus(file.name + ' is not a valid dashboard file', 'error'); + } + if (error) { + this.showStatus(error, 'error'); + } + }, + dashboardsArrayLoaded : function (dashboardsArr) { + var savedDashboards = Object.keys(this.dashboards); + this.dashboardConflicts = []; + for (var i = 0; i < dashboardsArr.length; i++) { + var name = dashboardsArr[i].pop(); + if (savedDashboards.length > 0 && savedDashboards.indexOf(name) >= 0) { + this.dashboardConflicts.push({name: name, dashboard: dashboardsArr[i], file: null}); + } + else { + this.dashboards[name] = dashboardsArr[i]; + rovUtils.setLocalStorageObject('dashboards-storage', this.dashboards); + if (savedDashboards.length == 0) { + this.enableOpenDashboardButton(true); + this.$.deleteDashboardButton.disabled = false; + } + this.showStatus('Saved dashboard ' + name, 'info'); + } + } + if (this.dashboardConflicts.length > 0) { + this.resolveSaveDashboardsConflicts(); + } + }, + /* + * dashboard storage { + * id : '', + * moduleName : '', + * viewName : '', + * left : '', + * top : '', + * width : '', + * height : '', + * zIndex : '' + * } + * + */ + dashboardSelected : function(e) { + var dialog = e.target.offsetParent; + if (dialog) { + var sel = e.currentTarget.selectedItem.textContent.trim(); + this.$.dashboardNamesMenu.selected = -1; + if (dialog.name == 'Open' || dialog.name == 'Intro') { + if (dialog.name == 'Intro') { + this.$.introDialog.close(); + } + dialog.close(); + /* Get the original dashboard in case one in memory has been changed */ + var dashboards = rovUtils.getLocalStorageObject('dashboards-storage'); + var dashboard = dashboards[sel] ? dashboards[sel] : this.dashboards[sel]; /* defensive */ + this.showDashboard(dashboard, sel); + } + else if (dialog.name == 'Delete') { + this.confirmDialog('Delete dashboard', + 'Delete ' + sel + ' ?', + 'dashboard', sel); + } + else if (dialog.name == 'Save') { + dialog.close(); + this.$.saveDashboardInput.value = sel; + this.$.saveDashboardComment.value = this.dashboards[sel][0].comment ? + this.dashboards[sel][0].comment : ''; + } + } + }, + dataOptionsClicked : function (e) { + var dialog = document.getElementById('dataOptionsDialog'); + if (dialog) { + dialog.addEventListener('iron-overlay-closed', function() { + var reason = this.closingReason; + return (false); + }); + dialog.open(); + dialog.style.left = this.isNarrow() ? '0px': rovUtils.leftPaneWidth + 'px'; + dialog.style.zIndex = String(this.getMaxZindex() + 1); + this.$.repeatRefreshInput.value = String(this.refreshInterval); + this.$.repeatRefreshInputInvalid.hidden = true; + this.$.dataTimeoutInput.value = String(this.dataTimeoutPeriod); + this.$.dataTimeoutInputInvalid.hidden = true; + this.$.connectTimeoutInput.value = String(this.connectTimeoutPeriod); + this.$.connectTimeoutInputInvalid.hidden = true; + } + }, + dataOptionsKeyPress : function (e) { + var keyCode = e.keyCode || e.which; + if (keyCode === 13 && this.$.repeatRefreshInput.value != '' && this.$.dataTimeoutInput.value != '') { + this.saveDataOptionsOkClicked(e); + } + }, + dataViewsShowing : function () { + var count = this.moduleViewsShowing(); + for (var i = 0; i < this.rovViews.length; i++) { + var elem = this.getViewById(this.rovViews[i].id); + if (elem) { + if (elem.hasViewableContent && elem.hasViewableContent()) { + ++count; + } + } + else { + console.error('Undefined view, id: ' + this.rovViews[i].id); + } + } + return (count); + }, + debuggerEvent : function (event) { + if (event == 'TargetHalt') { + if (this.inRepeatRefresh) { + this.stopRepeatRefresh(true); + } + this.refreshAllClicked(); + } + }, + deleteDashboard : function(sel) { + this.$.listDashboardsDialog.close(); + var dashboards = {}; + for (var name in this.dashboards) { + if (name != sel) { + dashboards[name] = this.dashboards[name]; + } + } + if (sel == this.currentDashboard) { + this.setCurrentDashboard(''); + } + this.dashboards = dashboards; + rovUtils.setLocalStorageObject('dashboards-storage', this.dashboards); + this.dashboardButtonsState(); + }, + deleteDashboardClicked : function(e) { + this.listDashboardsDialog('Delete', e); + }, + destroyClickedElement : function(event) { + document.body.removeChild(event.target); + }, + dialogCloseClicked : function (e) { + var dlgId = e.target.id.replace(/Close/, ''); + this.$[dlgId].cancel(e); + }, + dialogClosed : function (e) { + /* re-enable toolbar buttons */ + this.$.rovOptionsButton.disabled = false; + this.$.dashboardOverflowDialogButton.disabled = false; + if (this.$$('#otherViewsButton')) { + this.$$('#otherViewsButton').disabled = false; + } + this.toolbarButtonsState(); + this.dashboardButtonsState(); + }, + dialogOpened : function () { + /* disable toolbar buttons */ + this.$.viewToTopButton.disabled = true; + this.$.saveAllButton.disabled = true; + this.$.repeatRefreshButton.disabled = true; + this.$.overflowRepeatRefreshButton.disabled = true; + this.$.refreshAllButton.disabled = true; + this.$.overflowRefreshAllButton.disabled = true; + this.$.closeAllButton.disabled = true; + this.$.overflowCloseAllButton.disabled = true; + this.$.titleOverflowDialogButton.disabled = true; + if (this.$$('#otherViewsButton')) { + this.$$('#otherViewsButton').disabled = true; + } + + this.$.rovOptionsButton.disabled = true; + this.$.dashboardOverflowDialogButton.disabled = true; + this.enableOpenDashboardButton(false); + this.$.deleteDashboardButton.disabled = true; + this.$.saveDashboardButton.disabled = true; + this.$.openDashboardFileButton.disabled = true; + }, + discoverAddOns : function () { + this.$.rediscoverAddOnButton.disabled = true; + this.rovData.discoverAddOns(this); + }, + discoverAddOnsCallback : function (res, addOns) { + if (res == null) { + var discoveredAddOns = []; + for (var i = 0; i < addOns.length; i++) { + discoveredAddOns.push({path : addOns[i].path, + root : addOns[i].root, + name : addOns[i].name}); + } + this.set('discoveredAddOns', discoveredAddOns); + if (this.$.manageAddOnsDialog.opened) { + this.populateDiscoveredAddOns(); + var listItems = this.$.discoveredAddOnsList.items; + for (var j = 0; j < listItems.length; j++) { + listItems[j].lastElementChild.checked = false; + } + this.$.addDiscoveredAddOnButton.disabled = true; + this.$.selectAllDiscoveredAddOnsCheckbox.checked = false; + this.$.selectAllDiscoveredAddOnsCheckbox.disabled = (discoveredAddOns.length == 0); + } + } + else { + if (this.$.manageAddOnsDialog.opened) { + this.$.addOnErrorToast.text = res; + this.$.addOnErrorToast.fitInto = this.$.manageAddOnsDialog; + this.$.addOnErrorToast.open(); + return (false); + } + else { + this.showStatus(res, 'error'); + return (false); + } + } + this.$.rediscoverAddOnButton.disabled = false; + return (true); + }, + discoveredAddOnClicked : function (e) { + if (!this.$.manageAddOnsDialog.opened) { + return; + } + this.listItemWithSelectAllOptionClicked(e, 'selectAllDiscoveredAddOnsCheckbox', + 'discoveredAddOnsList'); + this.enableChecklistDialogActionButton(e, 'discoveredAddOnsList', + 'addDiscoveredAddOnButton'); + }, + dlgClicked : function(e) { + e.currentTarget.style.zIndex = String(this.getMaxZindex() + 1); + }, + enableChecklistDialogActionButton : function (e, checklistId, buttonId) { + var btnDisabled = true; + if (e && e.currentTarget.checked) { + btnDisabled = false; + } + else { + var listItems = this.$[checklistId].items; + for (var i = 0; i < listItems.length; i++) { + if (listItems[i].lastElementChild.checked) { + btnDisabled = false; + break; + } + } + } + this.$[buttonId].disabled = btnDisabled; + }, + enableOpenDashboardButton : function (enable, color) { + if (enable) { + this.$.openDashboardButton.style.color = color ? color : tiRovStyles.titleToolbarColor; + this.$.openDashboardButton.style.cursor = 'pointer'; + this.$.openDashboardButton.title = 'Open a dashboard'; + } + else { + this.$.openDashboardButton.style.color = tiRovStyles.titleToolbarDisabledColor; + this.$.openDashboardButton.style.cursor = 'default'; + this.$.openDashboardButton.title = ''; + } + this.$.overflowOpenDashboardButton.style.color = this.$.openDashboardButton.style.color; + this.$.overflowOpenDashboardButton.style.cursor = this.$.openDashboardButton.style.cursor; + this.$.overflowOpenDashboardButton.title = this.$.openDashboardButton.title; + }, + exeInputClicked : function (e) { + this.$.exeInput.$.input.select(); + }, + exportADashboardChecked : function (e) { + if (!this.$.exportDashboardsDialog.opened) { + return; + } + this.listItemWithSelectAllOptionClicked(e, 'selectAllExportDashboardsCheckbox', + 'exportDashboardsList'); + if (this.$.exportDashboardsInput.value == '') { + this.$.exportDashboardsButton.disabled = true; + } + else { + this.enableChecklistDialogActionButton(e, 'exportDashboardsList', + 'exportDashboardsButton'); + } + }, + exportDashboard : function(dashName, dashArr) { + dashArr.push(dashName); + var textToWrite = JSON.stringify(dashArr, null, '\t'); + dashArr.pop(); + var fileNameToSaveAs = (dashName + '.rov.json'); + rovUtils.downloadText(textToWrite, fileNameToSaveAs); + }, + exportDashboards : function(fileName, dashboardsArr) { + var fileNameToSaveAs = (fileName + '.rov.json'); + dashboardsArr.unshift({fileName: fileNameToSaveAs, numDashboards: dashboardsArr.length}); + var textToWrite = JSON.stringify(dashboardsArr, null, '\t'); + rovUtils.downloadText(textToWrite, fileNameToSaveAs); + }, + exportDashboardsButtonClicked : function (e) { + var fileName = this.$.exportDashboardsInput.value; + var checkedDashboards = []; + var listItems = this.$.exportDashboardsList.items; + for (var i = 0; i < listItems.length; i++) { + if (listItems[i].lastElementChild.checked) { + checkedDashboards.push(listItems[i].innerText.trim()); + } + } + var dashArr = []; + for (var i = 0; i < checkedDashboards.length; i++) { + var dashboard = this.dashboards[checkedDashboards[i]]; + dashboard.push(checkedDashboards[i]); + dashArr.push(rovUtils.shallowCopy(dashboard)); + dashboard.pop(); + } + this.$.exportDashboardsDialog.close(); + this.$.exportDashboardsList.selected = -1; + this.$.exportDashboardsInput.value = ''; + this.$.exportDashboardsButton.disabled = true; + this.exportDashboards(fileName, dashArr); + }, + exportDashboardsClicked : function (e) { + this.initDashboardsDialogList(); + var dialog = this.$.exportDashboardsDialog; + if (dialog) { + dialog.open(); + dialog.style.left = this.isNarrow() ? '0px': rovUtils.leftPaneWidth + 'px'; + dialog.style.zIndex = String(this.getMaxZindex() + 10); + + /* Init checkboxes and clear selection button */ + var listItems = this.$.exportDashboardsList.items; + for (var i = 0; i < listItems.length; i++) { + listItems[i].lastElementChild.checked = true; + } + this.$.exportDashboardsList.selected = -1; + this.$.exportDashboardsInput.value = ''; + this.$.exportDashboardsButton.disabled = true; + } + }, + exportDashboardsKeyPress : function (e) { + var keyCode = e.keyCode || e.which; + if (keyCode === 13 && this.$.exportDashboardsButton.disabled == false) { + this.exportDashboardsButtonClicked(e); + } + }, + exportDashboardsOnInput : function (e) { + if (e.currentTarget.value == '') { + this.$.exportDashboardsButton.disabled = true; + } + else { + this.enableChecklistDialogActionButton(null, 'exportDashboardsList', + 'exportDashboardsButton'); + } + }, + filterLeftClicked : function(e) { + this.set('showFilterButtonRight', true); + this.set('showFilterButtonLeft', false); + }, + filterModules : function(filterStr) { + var exp = RegExp('^' + filterStr, 'i'); + var filterArr = (this.curModsLabel == 'All Modules') ? this.allModules : this.viewableModules; + var foundModules = []; + for (var i = 0; i < filterArr.length; i++) { + if (String(filterArr[i]).search(exp) == 0) { + foundModules.push(filterArr[i]); + } + } + if (foundModules.length == 0 && filterStr.length > 2) { + exp = RegExp(filterStr + '$', 'i'); + var exp2 = RegExp(filterStr, 'i'); + for (var i = 0; i < filterArr.length; i++) { + if (String(filterArr[i]).search(exp) > 0) { + foundModules.push(filterArr[i]); + } + else if (String(filterArr[i]).search(exp2) > 0) { + foundModules.push(filterArr[i]); + } + } + } + var equal = rovUtils.strArrCompare(this.curTocModules, foundModules); + if (!equal) { + this.set('curTocModules', foundModules); + this.set('tocItems', this.makeModulesToc(foundModules)); + } + return (!equal); + }, + filterModulesChanged : function(e) { + this.filterValue = e.currentTarget.value; + this.filterModules(this.filterValue); + }, + filterRightClicked : function(e) { + if (this.allModules.length > 0) { + this.set('showFilterButtonRight', false); + this.set('showFilterButtonLeft', true); + } + }, + getAddOnHashKey : function (href) { + var key = href; + key = key.substr(key.indexOf('href=') + 6); + return (key.substr(0, key.indexOf('"'))); + }, + getAddOnInfo : function (elemName, path) { + var info = null; + for (var i = 0; i < this.otherViews.length; i++) { + if (this.otherViews[i].element == elemName && this.otherViews[i].path == path) { + info = this.otherViews[i]; + break; + } + } + return (info); + }, + getAllModules : function () { + return (this.allModules); + }, + getImportedAddOnId : function (activeElement) { + for (var i = 0; i < activeElement.children.length; i++) { + if (activeElement.children[i].localName == 'dom-module') { + return (activeElement.children[i].id); + } + } + return (''); + }, + getMaxZindex : function () { + var max = 0; + for (var i = 0; i < this.rovModuleViews.length; i++) { + var elem = this.getViewById(this.rovModuleViews[i].id); + if (elem.style.zIndex != '') { + if (Number(elem.style.zIndex) > max) { + max = Number(elem.style.zIndex); + } + } + } + for (var i = 0; i < this.rovViews.length; i++) { + var elem = this.getViewById(this.rovViews[i].id); + if (elem.style.zIndex != '') { + if (Number(elem.style.zIndex) > max) { + max = Number(elem.style.zIndex); + } + } + } + return (max); + }, + getNewClickedViewPosition : function () { + var offset = (this.rovModuleViews.length + this.rovViews.length - 1) * 28; + var left = offset; + var top = offset; + if (this.viewContainer.scrollLeft > 0) { + left += this.viewContainer.scrollLeft; + } + if (this.viewContainer.scrollTop > 0) { + top += this.viewContainer.scrollTop; + } + return ({left : left, top : top}); + }, + getNewModuleViewId : function () { + var maxId = -1; + for (var i = 0; i < this.rovModuleViews.length; i++) { + var arr = this.rovModuleViews[i].id.split('_'); + if (Number(arr[1]) > maxId) { + maxId = Number(arr[1]); + } + } + return ('rovModuleView_' + (maxId + 1)); + }, + getNewViewId : function () { + var maxId = -1; + for (var i = 0; i < this.rovViews.length; i++) { + var arr = this.rovViews[i].id.split('_'); + if (Number(arr[1]) > maxId) { + maxId = Number(arr[1]); + } + } + return ('rovView_' + (maxId + 1)); + }, + getRovData : function () { + return (this.rovData); + }, + getTocIndex : function (id, tocItems) { + var index = -1; + for (var i = 0; i < tocItems.length; i++) { + if (tocItems[i].id == id) { + index = i; + break; + } + } + return (index); + }, + getViewableModules : function () { + return (this.viewableModules); + }, + getViewById : function(viewId) { + var view; + var chNodes = Polymer.dom(this.$.contentDiv).childNodes; + for (var i = 0; i < chNodes.length; i++) { + if (chNodes[i].id == viewId) { + view = chNodes[i]; + break; + } + } + if (view == undefined) { + console.error('getViewById, undefined view, id: ' + viewId); + for (var i = 0; i < chNodes.length; i++) { + console.log(' child node[' + i + '] '+ chNodes[i]); + } + } + return (view); + }, + getViewList : function () { + return (this.viewList); + }, + getViewListCallback : function (error, viewList) { + if (error == null) { + this.viewList = viewList; + var keys = Object.keys(this.viewList); + var viewTabs; + for (var i = 0; i < keys.length; i++) { + this.allModules.push(keys[i]); + viewTabs = rovUtils.getViewTabs(this.viewList, keys[i]); + if (viewTabs.length > 1) { + this.viewableModules.push(keys[i]); + } + } + this.setCurModsList(this.curModsLabel); + } + else { + alert(error); + } + this.discoverAddOns(); + if (this.rovInit.showIntro != false) { + this.introDialog(); + } + }, + getViewSaveData : function (elem) { + var viewData = elem.onSaveView(); + var info = {}; + if (elem.moduleName) { + info.module = elem.moduleName; + } + info.view = elem.viewName; + if (elem.argsId) { + var viewArgs = elem.getViewArgs(elem.argsId); + if (viewArgs) { + info.args = {}; + for (var i = 0; i < viewArgs.args.length; i++) { + info.args[viewArgs.args[i].name] = viewArgs.args[i].value; + } + } + } + return (JSON.stringify([info, viewData], null, '\t')); + }, + hasSavedDashboards : function (e) { + return (Object.keys(this.dashboards).length > 0); + }, + hasView : function(moduleName, viewName) { + var viewTabs = rovUtils.getViewTabs(this.viewList, moduleName); + var found = false; + for (var i = 0; i < viewTabs.length; i++) { + if (viewName == viewTabs[i].name) { + found = true; + break; + } + } + return (found); + }, + hasViewsStorage : function () { + var viewsStorage = rovUtils.getLocalStorageObject('viewsData-storage'); + var keys = Object.keys(viewsStorage); + for (var i = 0; i < keys.length; i++) { + if (viewsStorage[keys[i]]) { + return (true); + } + } + return (false); + }, + hideStatus : function () { + this.$.statusConsole.hidden = true; + this.statusItems = []; + }, + initDashboardsDialogList : function () { + var namesSort = []; + for (var name in this.dashboards) { + namesSort.push(name); + } + namesSort.sort(); + var namesArr = []; + for (var i = 0; i < namesSort.length; i++) { + namesArr.push({name : namesSort[i], comment : this.dashboards[namesSort[i]][0].comment}); + } + this.dashboardNames = namesArr; + }, + initRov : function (exe, commLink) { + var fullPath = exe + '?' + 'comm=' + (commLink == 'Debugger' ? 'DSLite' : commLink); + if ((commLink == 'DSLite' || commLink == 'Debugger') && window.ti != undefined) { + fullPath = fullPath + ":" + window.ti.debug.cloudagent.dsPort; + } + this.rovData.setExecutable(fullPath, this); + }, + introDashboardsClicked : function(event) { + if (this.hasSavedDashboards()) { + this.initDashboardsDialogList(); + var dialog = document.getElementById('introListDashboardsDialog'); + if (dialog) { + dialog.name = 'Intro'; + dialog.style.left = rovUtils.leftPaneWidth + event.currentTarget.offsetLeft + 4 + 'px'; + dialog.style.top = 43 + event.currentTarget.offsetTop + event.currentTarget.clientHeight - 5 + 'px'; + dialog.style.width = event.currentTarget.clientWidth + 'px'; + dialog.open(); + var introDialog = document.getElementById('introDialog'); + dialog.style.zIndex = String(Number(introDialog.style.zIndex) + 1); + this.$.introDashboardNamesMenu.selected = -1; + } + } + else { + this.openDashboardFileClicked(); + this.$.introDialog.close(); + } + }, + introDialog : function () { + var dialog = this.$.introDialog; + if (dialog) { + dialog.name = 'Intro'; + dialog.open(); + dialog.style.position = 'fixed'; + dialog.style.left = rovUtils.leftPaneWidth + 'px !important'; + dialog.style.top = '48px !important'; + this.introMessage = 'Welcome to Runtime Object View. To begin'; + this.introModulesMessage = 'click on a module'; + if (this.hasSavedDashboards() || this.ccs7) { + this.introMessage += ', either'; + } + else { + this.introModulesMessage += ' in this list'; + this.$.introOr.hidden = true; + this.$.introDashboardsButton.hidden = true; + } + } + }, + introDialogClosed : function (e) { + this.dialogClosed(); + this.rovInit.showIntro = !this.$.noIntroCheckbox.checked; + rovUtils.setLocalStorageObject('rovInit-storage', this.rovInit); + }, + isADragDropFile : function (e) { + if (e.dataTransfer.types) { + return (e.dataTransfer.types[0] == 'Files' || + e.dataTransfer.types[0] == 'public.file-url'); + } + else if (e.dataTransfer.files) { + return (e.dataTransfer.files.length == 1); + } + return (false); + }, + isDiscoveredAddOn : function (path) { + var lowerPath = this.parseAddOnPath(path).toLowerCase(); + for (var i = 0; i < this.discoveredAddOns.length; i++) { + var lowerOther = this.parseAddOnPath(this.discoveredAddOns[i].path).toLowerCase(); + if (lowerOther == lowerPath) { + return (true); + } + } + return (false); + }, + isDupAddOn : function (path) { + var lowerPath = path.toLowerCase(); + for (var i = 0; i < this.otherViews.length; i++) { + if (lowerPath == this.otherViews[i].path.toLowerCase()) { + return (true); + } + } + return (false); + }, + isNarrow : function () { + return (this.$.rovDrawerPanel.narrow); + }, + isOverOpenButton : function (e) { + return ((e.target.id == 'openDashboardButton' || + e.target.id == 'overflowOpenDashboardButton' || + (e.target.id == 'icon' && e.target.icon == 'dashboard')) && + this.isADragDropFile(e)); + }, + listDashboardsDialog : function(dlgName, event) { + this.initDashboardsDialogList(); + var id = (dlgName == 'Save') ? 'listSavedDashboardsDialog' : 'listDashboardsDialog'; + var dialog = document.getElementById(id); + if (dialog) { + dialog.name = dlgName; + if (dlgName == 'Save') { + dialog.style.left = event.x + 'px'; + dialog.style.top = (event.y + 14) + 'px'; + } + else if (dlgName == 'Open' || dlgName == 'Delete') { + dialog.style.marginRight = '0px'; + dialog.style.marginLeft = '0px'; + if (event.currentTarget.id.indexOf('overflow') == 0) { + dialog.style.left = ''; + dialog.style.right = '4px'; + dialog.style.top = (event.currentTarget.id.indexOf('overflow') == 0) ? (event.y - 4) + 'px' : '24px'; + } + else { + dialog.style.right = ''; + dialog.style.left = (event.x - 34) + 'px'; + dialog.style.top = '24px'; + } + } + dialog.open(); + if (dlgName == 'Save') { + var saveDialog = document.getElementById('saveDashboardDialog'); + dialog.style.zIndex = String(Number(saveDialog.style.zIndex) + 1); + this.$.listSavedDashboardsMenu.selected = -1; + } + else { + dialog.style.zIndex = String(this.getMaxZindex() + 2); + this.$.dashboardNamesMenu.selected = -1; + } + } + }, + listDashboardsDialogClosed : function () { + if (this.$.dashboardOverflowDialog.opened) { + this.$.dashboardOverflowDialog.close(); + } + }, + listItemWithSelectAllOptionClicked : function (e, selectAllCheckboxId, checkListId) { + if (!e.currentTarget.checked) { + if (this.$[selectAllCheckboxId].checked) { + this.$[selectAllCheckboxId].checked = false; + } + } + else { + this.sanityCheckSelectAllBox(selectAllCheckboxId, checkListId); + } + this.$[checkListId].selected = -1; + }, + loadAddOnClicked : function (e) { + if (this.$.addOnErrorToast.opened) { + this.$.addOnErrorToast.text = ''; + this.$.addOnErrorToast.close(); + } + var path = this.parseAddOnPath(this.$.addOnInput.value); + if (this.isDupAddOn(path)) { + this.$.addOnErrorToast.text = path + ' has already been added'; + this.$.addOnErrorToast.fitInto = this.$.manageAddOnsDialog; + this.$.addOnErrorToast.open(); + return; + } + this.addOnInputPath = this.$.addOnInput.value; + this.importHref(path, + function(e) { + if (this.createAddOn(e, this.addOnInputPath)) { + this.$.addOnInput.value = ''; + this.syncDiscoveredAddOnsList(); + this.sanityCheckSelectAllBox('selectAllCurrentAddOnsCheckbox', + 'curAddOnsList'); + } + }, + function(e){ + this.$.addOnErrorToast.text = 'Error importing ' + e.target.href; + this.$.addOnErrorToast.fitInto = this.$.manageAddOnsDialog; + this.$.addOnErrorToast.open(); + } + ); + }, + loadMissingDashboardAddOn : function(dashboardAddOnView, showIt) { + var path = this.parseAddOnPath(dashboardAddOnView.elemPath); + this.addOnsHash[path] = dashboardAddOnView; + this.importHref(path, + function(e){ + var key = this.getAddOnHashKey(e.target.outerHTML); + var dashboardItem = this.addOnsHash[key]; + var elem = document.createElement(dashboardItem.elemName); + if (elem.viewName == undefined || elem.textContent.length == 0) { + this.showStatus('Error creating ' + dashboardItem.viewName + ' element', 'error'); + Polymer.dom.flush(); + } + else { + var addOn = {}; + addOn.element = dashboardItem.elemName; + addOn.path = dashboardItem.elemPath; + addOn.root = dashboardItem.elemRoot; + addOn.name = elem.viewName; + addOn.href = e.target.href; + if (showIt) { + this.newDashboardRovView(dashboardItem); + } + var other = (this.otherViews.length > 0) ? rovUtils.shallowCopy(this.otherViews) : []; + other.push(addOn); + this.set('otherViews', other); + this.enableOtherViews = true; + var rovSettings = rovUtils.getLocalStorageObject('rovSettings-storage'); + rovSettings.otherViews = this.otherViews; + rovUtils.setLocalStorageObject('rovSettings-storage', rovSettings); + } + }, + function(e){ + var dashboardItem = this.addOnsHash[this.getAddOnHashKey(e.target.outerHTML)]; + this.showStatus('Error importing ' + dashboardItem.viewName + ' at ' + e.target.href, 'error'); + } + ); + }, + manageStorageKeyPress : function (e) { + var keyCode = e.keyCode || e.which; + if (keyCode === 13) { + if (!this.$.clearViewStorageButton.disabled) { + this.clearViewStorageClicked(); + } + if (this.$.manageStorageDialog.opened) { + this.$.manageStorageDialog.close(); + } + } + }, + makeModulesToc : function(modules) { + var info = rovUtils.getPackagesInfo(modules); + var modulesToc = []; + /* Get all units and sort by name */ + var units = []; + for (var i = 0; i < info.pkgNames.length; i++) { + var pkg = info.pkgs[info.pkgNames[i]]; + for (var j = 0; j < pkg.units.length; j++) { + pkg.units[j].qual = info.pkgNames[i]; + units.push(pkg.units[j]); + } + } + units.sort(rovUtils.objNameCompare); + + var i = 0; + while (i < units.length - 1) { + if (units[i + 1].name == units[i].name) { + var j = i + 1; + var uSame = [units[i], units[j]]; + while (j < units.length - 1) { + if (units[j + 1].name == units[j].name) { + uSame.push(units[++j]); + } + else { + ++j; + break; + } + } + uSame.sort(rovUtils.objQualCompare); + + var tocItem = {}; + tocItem.name = units[i].name; + if (uSame.length) { + tocItem.id = units[i].name; + tocItem.hasDups = true; + tocItem.expanded = false; + tocItem.dups = []; + for (k = 0; k < uSame.length; k++) { + var dup = {}; + dup.name = uSame[k].qual; + dup.id = uSame[k].qual + '.' + uSame[k].name; + tocItem.dups.push(dup); + } + + } + else { + tocItem.id = units[i].qual + '.' + units[i].name; + } + modulesToc.push(tocItem); + i = j; + continue; + } + else { + var tocItem = {}; + tocItem.name = units[i].name; + tocItem.id = units[i].qual + '.' + units[i].name; + modulesToc.push(tocItem); + } + ++i; + } + if (i == units.length - 1 && + (i == 0 || (i > 0 && units[i].name != units[i - 1].name))) { + var tocItem = {}; + tocItem.name = units[i].name; + tocItem.id = units[i].qual + '.' + units[i].name; + modulesToc.push(tocItem); + } + return (modulesToc); + }, + modClicked : function(e) { + if (this.$.introDialog.opened) { + this.$.introDialog.close(); + } + var viewsData = rovUtils.getLocalStorageObject('viewsData-storage'); + var moduleName = e.currentTarget.id; + var viewName = null; + var viewArgs = null; + if (viewsData[moduleName]) { + viewName = viewsData[moduleName].defaultViewName; + viewArgs = viewsData[moduleName].viewArgs; + } + else if (this.viewList[moduleName]) { + var viewTabs = rovUtils.getViewTabs(this.viewList, moduleName); + viewName = viewTabs[0].name; + } + var elem = this.newModuleView(moduleName, viewName, false, viewArgs); + elem.style.zIndex = String(this.getMaxZindex() + 1); + var offset = this.getNewClickedViewPosition(); + if (offset.left > 0) { + elem.style.left = offset.left + 'px'; + } + if (offset.top > 0) { + elem.style.top = offset.top + 'px'; + } + var key = moduleName + '.' + viewName; + if (viewsData[key] && viewsData[key].width) { + elem.$.viewPaperCard.style.width = viewsData[key].width; + elem.$.viewPaperCard.style.height = viewsData[key].height; + elem.$.viewContentDiv.style.position = 'absolute'; + } + }, + modContextMenu : function (e) { + e.preventDefault(); + if (this.allModulesVisible) { + var idx = this.favoriteModules.indexOf(e.currentTarget.id); + this.favoriteMenuItem = idx == -1 ? 'Add to' : 'Remove from'; + } + else { + this.favoriteMenuItem = 'Remove from'; + } + this.favoriteMenuItem += ' Favorite Modules'; + var dialog = this.$.modContextDialog; + dialog.style.left = event.x + 'px'; + dialog.style.top = event.y + 'px'; + dialog.selectedMod = e.currentTarget.id; + dialog.open(); + }, + modContextMenuItemClicked : function (e) { + var selectedMod = this.$.modContextDialog.selectedMod; + var menuItem = e.currentTarget.textContent; + this.$.modContextDialog.close(); + if (menuItem.indexOf('Add') == 0) { + this.addFavorite(selectedMod); + } + else { + this.clearFavoriteConfirm(selectedMod); + } + }, + modulesViewItemSelected : function (e) { + var sel = e.currentTarget.selectedItem.textContent.trim(); + this.$.selectModulesViewMenu.selected = -1; + var dialog = this.$.selectModulesViewDialog; + if (dialog) { + dialog.close(); + } + this.setCurModsList(sel); + var rovSettings = rovUtils.getLocalStorageObject('rovSettings-storage'); + rovSettings.curModsLabel = sel; + rovUtils.setLocalStorageObject('rovSettings-storage', rovSettings); + }, + moduleViewsShowing : function () { + var count = 0; + for (var i = 0; i < this.rovModuleViews.length; i++) { + var elem = this.getViewById(this.rovModuleViews[i].id); + if (elem) { + if (elem.viewIsShowing || elem.viewSelected) { + ++count; + } + } + else { + console.error('Undefined view, id: ' + this.rovModuleViews[i].id); + } + } + return (count); + }, + mruClicked : function (e) { + var dlgId = e.currentTarget.id.replace(/Button/, 'Dialog'); + var dialog = document.getElementById(dlgId); + if (dialog) { + dialog.open(); + dialog.style.left = (event.x + 4) + 'px'; + dialog.style.top = (event.y + 14) + 'px'; + } + }, + mruSelected : function (e) { + var pre = e.currentTarget.id.replace(/MruMenu/, ''); + var sel = e.currentTarget.selectedItem.textContent.trim(); + this.$[e.currentTarget.id].selected = -1; + this.$[pre + 'MruDialog'].close(); + this.$[pre + 'Input'].value = sel; + }, + multiDashboardFileLoaded : function (file, done, e) { + var valid = false; + var error = null; + try { + var dashboard = JSON.parse(e.target.result); + if (rovUtils.isArray(dashboard) && + (dashboard[0].moduleName || dashboard[0].elemName)) { + valid = true; + var name = dashboard.pop(); + var savedDashboards = Object.keys(this.dashboards); + if (savedDashboards.length > 0 && savedDashboards.indexOf(name) >= 0) { + this.dashboardConflicts.push({name: name, dashboard: dashboard, file: file}); + } + else { + this.dashboards[name] = dashboard; + rovUtils.setLocalStorageObject('dashboards-storage', this.dashboards); + if (savedDashboards.length == 0) { + this.enableOpenDashboardButton(true); + this.$.deleteDashboardButton.disabled = false; + } + this.showStatus('Saved dashboard ' + name, 'info'); + } + } + } + catch (e) { + error = e; + } + if (!valid) { + this.showStatus(file.name + ' is not a valid dashboard file', 'error'); + } + if (error) { + this.showStatus(error, 'error'); + } + if (done && this.dashboardConflicts.length > 0) { + this.resolveSaveDashboardsConflicts(); + } + }, + newDashboardRovView : function (dashboardItem) { + var view = this.newRovView(dashboardItem.elemName, dashboardItem.elemPath, dashboardItem.elemRoot); + view.style.left = dashboardItem.left + 'px'; + view.style.top = dashboardItem.top + 'px'; + view.$.viewPaperCard.style.width = dashboardItem.width; + view.$.viewPaperCard.style.height = dashboardItem.height; + view.style.zIndex = dashboardItem.zIndex; + }, + newModuleView : function(moduleName, viewName, dashboardViewsData, viewArgs) { + var rovViews = []; + if (this.rovModuleViews.length > 0) { + for (var i = 0; i < this.rovModuleViews.length; i++) { + rovViews.push(rovUtils.shallowCopy(this.rovModuleViews[i])); + } + } + var newView = {}; + newView.id = this.getNewModuleViewId(); + rovViews.push(newView); + this.rovModuleViews = rovViews; + + var view = document.createElement('ti-rov-view'); + view.setAttribute('id', newView.id); + if (dashboardViewsData) { + view.dashboardView = true; + view.viewsData = dashboardViewsData; + } + if (viewArgs) { + view.viewArgs = viewArgs; + } + + /* this triggers moduleNameChanged() in ti-rov-view.js */ + view.moduleName = moduleName; + + Polymer.dom(this.$.contentDiv).appendChild(view); + Polymer.dom.flush(); + if (viewName) { + view.showView(viewName, false, false, true); + } + this.toolbarButtonsState(); + this.dashboardButtonsState(); + return (view); + }, + newRovView : function(elemName, elemPath, elemRoot, toTop) { + var rovViews = []; + if (this.rovViews.length > 0) { + for (var i = 0; i < this.rovViews.length; i++) { + rovViews.push(rovUtils.shallowCopy(this.rovViews[i])); + } + } + var newView = {}; + newView.id = this.getNewViewId(); + rovViews.push(newView); + this.rovViews = rovViews; + + var elem = document.createElement(elemName); + elem.setAttribute('id', newView.id); + elem.name = elemName; + elem.path = elemPath; + elem.root = elemRoot; + + Polymer.dom(this.$.contentDiv).appendChild(elem); + Polymer.dom.flush(); + this.toolbarButtonsState(); + this.dashboardButtonsState(); + if (toTop) { + elem.style.zIndex = String(this.getMaxZindex() + 1); + } + return (elem); + }, + onIronResize: function(e) { /* height only resize */ + if (!this.inited || this.panelWidth == this.$.rovDrawerPanel.offsetWidth) { + return; + } + if (!this.$.rovDrawerPanel.narrow) { + if (this.$.rovDrawerPanel.offsetWidth < 875 && + (this.$.rovDrawerPanel.offsetWidth < this.panelWidth || this.panelWidth == -1)) { + + this.toggleDrawerClicked(); + } + else { + this.toolbarResponseToResize(false); + } + } + else { + this.toolbarResponseToResize(true); + } + this.panelWidth = this.$.rovDrawerPanel.offsetWidth; + }, + openDashboardClicked : function(e) { + if (this.hasSavedDashboards()) { + this.listDashboardsDialog('Open', e); + } + }, + openDashboardDrop : function (e) { + this.dashboardButtonsState(); + if (this.isADragDropFile(e)) { + e.preventDefault(); + var files = e.dataTransfer.files; + if (files.length == 1) { + var reader = new FileReader(); + reader.onload = this.dashboardFileLoaded.bind(this, files[0]); + reader.readAsText(files[0]); + } + else { + this.dashboardConflicts = []; + for (var i = 0; i < files.length; i++) { + var reader = new FileReader(); + reader.onload = this.multiDashboardFileLoaded.bind(this, files[i], i == (files.length - 1)); + reader.readAsText(files[i]); + } + } + if (this.$.dashboardOverflowDialog.opened) { + this.$.dashboardOverflowDialog.close(); + } + } + else { + alert('Not a valid dashboard file'); + } + }, + openDashboardFileClicked : function (e) { + this.$.openDashboardFileInput.value = ''; + this.$.openDashboardFileInput.click(); + }, + openDashboardFileSelected : function (e) { + var files = e.currentTarget.files; + if (files.length == 1) { + if (files[0].name.match(/\.rov\.json$/) != null) { + var reader = new FileReader(); + reader.onload = this.dashboardFileLoaded.bind(this, files[0]); + reader.readAsText(files[0]); + } + else { + this.showStatus(files[0].name + ' is not a valid dashboard file', 'error'); + } + this.$.openDashboardFileInput.value = ''; + } + }, + otherViewsDialog : function(event) { + var dialog = document.getElementById('otherViewsDialog'); + if (dialog) { + this.set('dlgOtherViews', this.otherViews); + /* 24 is the padding + 10 */ + dialog.style.left = (event.x - 34) + 'px'; + dialog.open(); + dialog.style.zIndex = String(this.getMaxZindex() + 1); + if (this.$.otherViewsMenu.selected != undefined) { + this.$.otherViewsMenu.selected = -1; + } + } + }, + otherViewsDialogClosed : function(e) { + this.set('dlgOtherViews', []); + }, + otherViewSelected : function(e) { + var elemName = e.detail.item.id; + var elemInfo = this.getAddOnInfo(elemName, e.detail.item.title); + var elem = this.newRovView(elemName, elemInfo.path, elemInfo.root, true); + this.$.otherViewsMenu.selected = -1; + var dialog = document.getElementById('otherViewsDialog'); + if (dialog) { + dialog.close(); + } + var offset = this.getNewClickedViewPosition(); + if (offset.left > 0) { + elem.style.left = offset.left + 'px'; + } + if (offset.top > 0) { + elem.style.top = offset.top + 'px'; + } + }, + otherViewsHaveElem : function (elemName) { + for (var i = 0; i < this.otherViews.length; i++) { + if (this.otherViews[i].element == elemName) { + return (true); + } + } + return (false); + }, + overflowToolbarButtonClicked : function (e) { + var dialogId = e.currentTarget.id.replace(/Button/, ''); + var dialog = this.$[dialogId]; + if (dialog.opened) { + dialog.close(); + } + else { + dialog.open(); + dialog.style.zIndex = String(this.getMaxZindex() + 1); + } + }, + overwriteADashboardChecked : function (e) { + if (!this.$.overwriteDashboardsDialog.opened) { + return; + } + this.enableChecklistDialogActionButton(e, 'overwriteDashboardsList', + 'overwriteDashboardsButton'); + }, + overwriteDashboardsClicked : function (e) { + var listItems = this.$.overwriteDashboardsList.items; + /* make list of checked and unchecked items */ + var checked = []; + var unchecked = []; + for (var i = 0; i < listItems.length; i++) { + if (listItems[i].lastElementChild.checked) { + checked.push(listItems[i].innerText.trim()); + listItems[i].lastElementChild.checked = false; + } + else { + unchecked.push(listItems[i].innerText.trim()); + } + } + /* save all checked dashboards */ + for (var i = 0; i < this.dashboardConflicts.length; i++) { + if (checked.indexOf(this.dashboardConflicts[i].name) >= 0) { + this.saveDroppedDashboard(this.dashboardConflicts[i].name, + this.dashboardConflicts[i].dashboard, + false); + } + } + if (unchecked.length > 0) { /* redisplay unchecked dashboards */ + unchecked.sort(); + this.set('overwriteDashboardsItems', unchecked); + this.$.overwriteDashboardsButton.disabled = true; + } + else { + this.$.overwriteDashboardsDialog.close(); + } + }, + overwriteDashboardsKeyPress : function (e) { + var keyCode = e.keyCode || e.which; + if (keyCode === 13) { + if (!this.$.overwriteDashboardsButton.disabled) { + this.overwriteDashboardsClicked(); + } + if (this.$.overwriteDashboardsDialog.opened) { + this.$.overwriteDashboardsDialog.close(); + } + } + }, + parseAddOnPath : function (path) { + /* If path does not end in '.html', assume it is either the + * add on files directory, or the add on .html file with the + * '.html' missing. + */ + if (path) { + if (path.search(/\.html$/) == -1) { + path = path.replace(/\\/g,'/'); + if (path.search(/\/$/) > 0) { + path = path.slice(0, -1); + } + /* Get the add on files directory from the path */ + if (path.indexOf('/') != -1) { + var dirName = path.substr(path.lastIndexOf('/')); + /* Also check if full name was entered w/o '.html' at the end */ + var checkStr = path.slice(0, dirName.length * -1); + var rgex = new RegExp(dirName + '$'); + if (checkStr.search(rgex) == -1) { + /* Is just the directory, append it before adding '.html' */ + path += dirName; + } + } + else { + path = path + '/' + path; + } + path += '.html'; + } + path = path.replace(/([^:])\/\/+/g, '$1/'); /* clean any dup '/' */ + } + return (path); + }, + parseDiscoveredAddOn : function (addOn) { + var parsed = addOn.replace(/\\/g,'/').replace(/\.html$/, ''); + return (parsed.substr(parsed.lastIndexOf('/') + 1)); + }, + populateDiscoveredAddOns : function () { + var addOns = []; + for (var i = 0; i < this.discoveredAddOns.length; i++) { + if (!this.isDupAddOn(this.discoveredAddOns[i].path)) { + addOns.push(this.discoveredAddOns[i]); + } + } + this.set('dlgDiscoveredAddOns', addOns); + this.$.discoveredAddOnsTemplate.render(); + }, + queryViewSearchModules : function(module, searchArr) { + /* First, search for exact match */ + var foundArr = []; + if (searchArr.indexOf(module) >= 0) { + foundArr.push({module : module}); + } + else { + /* If not found, try case insensitive and suffixes */ + var exp = RegExp(module + '$', 'i'); + var exp2 = RegExp(module, 'i'); + for (var i = 0; i < searchArr.length; i++) { + if (searchArr[i].search(exp) >= 0) { + foundArr.push({module : searchArr[i]}); + } + else if (searchArr[i].search(exp2) >= 0) { + foundArr.push({module : searchArr[i]}); + } + } + } + return (foundArr); + }, + rediscoverAddOnsClicked : function (e) { + this.discoverAddOns(); + }, + refreshAllClicked : function() { + for (var i = 0; i < this.rovModuleViews.length; i++) { + var elem = this.getViewById(this.rovModuleViews[i].id); + if (elem.viewName) { + elem.showView(elem.viewName, true, false); + } + } + /* Notify any other views */ + for (var i = 0; i < this.rovViews.length; i++) { + var view = this.getViewById(this.rovViews[i].id); + if (view && view.onRefresh) { + view.onRefresh(); + } + } + }, + removeAddOnClicked : function (e) { + var otherViews = []; + var listItems = this.$.curAddOnsList.items; + for (var i = 0; i < listItems.length; i++) { + if (!listItems[i].lastElementChild.checked) { + for (var j = 0; j < this.otherViews.length; j++) { + if (this.otherViews[j].path == listItems[i].firstElementChild.title) { + otherViews.push(this.otherViews[j]); + break; + } + } + } + else { + listItems[i].lastElementChild.checked = false; + } + } + this.set('otherViews', otherViews); + this.set('dlgOtherViews', otherViews); + this.syncDiscoveredAddOnsList(); + this.$.removeAddOnButton.disabled = true; + this.$.selectAllCurrentAddOnsCheckbox.checked = false; + this.$.selectAllCurrentAddOnsCheckbox.disabled = (this.dlgOtherViews.length == 0); + this.$.curAddOnsList.selected = -1; + this.enableOtherViews = this.otherViews.length > 0; + var rovSettings = rovUtils.getLocalStorageObject('rovSettings-storage'); + rovSettings.otherViews = this.otherViews; + rovUtils.setLocalStorageObject('rovSettings-storage', rovSettings); + }, + repeatRefreshAll: function () { + if (this.repeatHandle != 0) { + if (this.dataViewsShowing() > 0) { + this.refreshAllClicked(); + this.repeatHandle = this.async(this.repeatRefreshAll, this.refreshInterval); + } + else { + this.repeatHandle = 0; + this.stopRepeatRefresh(true); + this.toolbarButtonsState(); + } + } + }, + repeatRefreshClicked : function () { + this.inRepeatRefresh = true; + this.$.refreshAllButton.disabled = true; + this.$.overflowRefreshAllButton.disabled = true; + if (this.repeatHandle == 0) { + this.refreshAllClicked(); + this.repeatHandle = this.async(this.repeatRefreshAll, this.refreshInterval); + } + }, + resolveSaveDashboardsConflicts : function() { + if (this.dashboardConflicts.length == 1) { + this.confirmDialog('Overwite dashboard', + 'Overwite ' + this.dashboardConflicts[0].name + ' ?', + 'dashboardConflict', + {name: this.dashboardConflicts[0].name, + dashboard: this.dashboardConflicts[0].dashboard, + show: false}); + } + else { + this.dashboardConflictsDialog(); + } + }, + rovOptionsClicked : function(e) { + var dialog = this.$.rovOptionsMenuDialog; + if (dialog) { + dialog.open(); + dialog.style.zIndex = String(this.getMaxZindex() + 1); + + /* set disabled state of storage options button */ +// this.$.storageOptionsDialog.disabled = !this.hasViewsStorage(); + + /* show/disable connect dialog at startup */ + this.$.showConnectDialogCheckbox.checked = !this.rovInit.autoConnect; + } + }, + rovOptionsItemSelected : function (e) { + var selected = e.currentTarget.selectedItem.id; + this.$.rovOptionsMenu.selected = -1; + this.$.rovOptionsMenuDialog.close(); + if (selected != 'showConnectDialogItem') { + this[selected](e); /* id of the item is the function name */ + } + }, + sanityCheckAddOns : function () { + if (this.otherViews.length) { + var others = []; + var errFound = false; + for (var i = 0; i < this.otherViews.length; i++) { + if (this.otherViews[i].href != 'error') { + others.push(this.otherViews[i]); + } + else if (!errFound) { + errFound = true; + } + } + if (errFound) { + this.otherViews = rovUtils.shallowCopy(others); + var rovSettings = rovUtils.getLocalStorageObject('rovSettings-storage'); + rovSettings.otherViews = this.otherViews; + rovUtils.setLocalStorageObject('rovSettings-storage', rovSettings); + } + } + }, + sanityCheckSelectAllBox : function (selectAllCheckboxId, checkListId) { + var allChecked = true; + var listItems = this.$[checkListId].items; + for (var i = 0; i < listItems.length; i++) { + if (!listItems[i].lastElementChild.checked) { + allChecked = false; + break; + } + } + this.$[selectAllCheckboxId].checked = allChecked && listItems.length > 0; + this.$[selectAllCheckboxId].disabled = (listItems.length == 0); + }, + saveAddOnMru : function (addOnPath) { + if (!this.isDiscoveredAddOn(addOnPath)) { + this.saveMru(addOnPath, this.addOnMrus.indexOf(addOnPath), 'addOnMrus', + rovUtils.shallowCopy(this.addOnMrus)); + } + }, + saveAllViews : function (e) { + var textToWrite = ''; + for (var i = 0; i < this.rovModuleViews.length; i++) { + var elem = this.getViewById(this.rovModuleViews[i].id); + if (elem.viewName) { + textToWrite += this.getViewSaveData(elem) + '\n\n'; + } + } + /* Notify any other views */ + for (var i = 0; i < this.rovViews.length; i++) { + var elem = this.getViewById(this.rovViews[i].id); + if (elem && elem.onSaveView) { + textToWrite += this.getViewSaveData(elem) + '\n\n'; + } + } + var fileNameToSaveAs = this.currentDashboard != '' ? this.currentDashboard : 'currentViews'; + fileNameToSaveAs = fileNameToSaveAs.replace(/ /g,'_') + '.rod.json'; + rovUtils.downloadText(textToWrite, fileNameToSaveAs); + }, + saveCommLinkMru : function (commLink) { + if (this.ccs7) { + this.commLinkMrus.shift(); /* remove 'Debugger' from top */ + } + var lwrCommLink = commLink.toLowerCase(); + var index = -1; + for (var i = 0; i < this.commLinkMrus.length; i++) { + if (this.commLinkMrus[i].toLowerCase() == lwrCommLink) { + index = i; + break; + } + } + this.saveMru(commLink, index, 'commLinkMrus', rovUtils.shallowCopy(this.commLinkMrus)); + }, + saveDashboardClicked : function(e) { + if (this.$.dashboardOverflowDialog.opened) { + this.$.dashboardOverflowDialog.close(); + } + var dialog = document.getElementById('saveDashboardDialog'); + if (dialog) { + dialog.addEventListener('iron-overlay-closed', function() { + var reason = this.closingReason; + return (false); + }); + dialog.open(); + dialog.style.zIndex = String(this.getMaxZindex() + 1); + this.$.saveDashboardInput.value = this.currentDashboard; + if (this.currentDashboard != '' && this.dashboards[this.currentDashboard][0].comment) { + this.$.saveDashboardComment.value = this.dashboards[this.currentDashboard][0].comment; + } + else { + this.$.saveDashboardComment.value = ''; + } + this.$.showSavedDashboardsButton.disabled = !this.hasSavedDashboards(); + this.$.exportDashboardCheckbox.checked = false; + } + }, + saveDashboardKeyPress : function (e) { + var keyCode = e.keyCode || e.which; + if (keyCode === 13 && this.$.saveDashboardInput.value != '') { + this.saveDashboardOkClicked(e); + } + }, + saveDashboardOkClicked : function (e) { + var dashName = this.$.saveDashboardInput.value; + if (dashName.length) { + this.$.saveDashboardInput.value = ''; + var dashComment = this.$.saveDashboardComment.value; + this.$.saveDashboardComment.value = ''; + var exportChecked = this.$.exportDashboardCheckbox.checked; + this.$.saveDashboardDialog.close(); + var dashArr = []; + for (var i = 0; i < this.rovModuleViews.length; i++) { + var elem = this.getViewById(this.rovModuleViews[i].id); + elem.setDashboardView(true); + var elemObj = {}; + elemObj.id = elem.id; + elemObj.moduleName = elem.moduleName; + elemObj.viewName = elem.viewName; + elemObj.viewsData = {}; + if (elem.viewName) { + elemObj.viewsData[elem.moduleName + '.' + elem.viewName] = + elem.getViewsData()[elem.moduleName + '.' + elem.viewName]; + } + if (elem.viewArgs) { + elemObj.viewArgs = elem.viewArgs; + } + elemObj.left = elem.offsetLeft; + elemObj.top = elem.offsetTop; + elemObj.width = elem.$.viewPaperCard.offsetWidth; + elemObj.height = elem.$.viewPaperCard.offsetHeight; + elemObj.zIndex = elem.style.zIndex; + elemObj.dashboardVersion = this.dashboardVersion; + dashArr.push(elemObj); + /* If any changes are made to the fields here, make sure to change */ + /* the dashboard version property!!!!!!!!! */ + } + for (var i = 0; i < this.rovViews.length; i++) { + var elem = this.getViewById(this.rovViews[i].id); + var elemObj = {}; + elemObj.elemName = elem.name; + elemObj.elemPath = elem.path; + elemObj.elemRoot = elem.root; + elemObj.id = elem.id; + elemObj.viewName = elem.viewName; + elemObj.left = elem.offsetLeft; + elemObj.top = elem.offsetTop; + elemObj.width = elem.$.viewPaperCard.style.width; + elemObj.height = elem.$.viewPaperCard.style.height; + elemObj.zIndex = elem.style.zIndex; + elemObj.dashboardVersion = this.dashboardVersion; + dashArr.push(elemObj); + /* If any changes are made to the fields here, make sure to change */ + /* the dashboard version property!!!!!!!!! */ + } + dashArr[0].comment = dashComment; + this.dashboards[dashName] = dashArr; + this.setCurrentDashboard(dashName); + rovUtils.setLocalStorageObject('dashboards-storage', this.dashboards); + if (exportChecked) { + this.exportDashboard(dashName, dashArr); + } + this.dashboardButtonsState(); + } + }, + saveDataOptionsOkClicked: function(e) { + this.$.repeatRefreshInputInvalid.hidden = true; + this.$.dataTimeoutInputInvalid.hidden = true; + var invalidInterval = false; + var invalidDataTimeout = false; + var invalidConnectTimeout = false; + var interval = this.$.repeatRefreshInput.value; + var dataTimeout = this.$.dataTimeoutInput.value; + var connectTimeout = this.$.connectTimeoutInput.value; + if (!interval.match(/^[1-9][0-9]*$/)) { + invalidInterval = true; + this.$.repeatRefreshInputInvalid.hidden = false; + } + if (!dataTimeout.match(/^[1-9][0-9]*$/)) { + invalidDataTimeout = true; + this.$.dataTimeoutInputInvalid.hidden = false; + } + if (!connectTimeout.match(/^[1-9][0-9]*$/)) { + invalidConnectTimeout = true; + this.$.connectTimeoutInputInvalid.hidden = false; + } + if (!invalidInterval && !invalidDataTimeout && !invalidConnectTimeout) { + this.refreshInterval = Number(interval); + this.dataTimeoutPeriod = Number(dataTimeout); + this.connectTimeoutPeriod = Number(connectTimeout); + this.rovData.setRequestTimeout(dataTimeout); + this.rovData.setConnectTimeout(connectTimeout); + var rovSettings = rovUtils.getLocalStorageObject('rovSettings-storage'); + rovSettings.refreshInterval = this.refreshInterval; + rovSettings.dataTimeoutPeriod = this.dataTimeoutPeriod; + rovSettings.connectTimeoutPeriod = this.connectTimeoutPeriod; + rovUtils.setLocalStorageObject('rovSettings-storage', rovSettings); + this.$.dataOptionsDialog.close(); + } + }, + saveDroppedDashboard : function (name, dashboard, show) { + this.dashboards[name] = dashboard; + rovUtils.setLocalStorageObject('dashboards-storage', this.dashboards); + if (show) { + this.showDashboard(dashboard, name); + } + else { + this.dashboardButtonsState(); + } + this.showStatus('Saved dashboard: ' + name, 'info'); + }, + saveExeMru : function (exe) { + if (this.ccs7) { + this.exeMrus.shift(); /* remove 'use current program' from top */ + } + exe = exe.replace(/\\/g, '/'); + var lwrExe = exe.toLowerCase(); + var index = -1; + for (var i = 0; i < this.exeMrus.length; i++) { + if (this.exeMrus[i].toLowerCase() == lwrExe) { + index = i; + break; + } + } + this.saveMru(exe, index, 'exeMrus', rovUtils.shallowCopy(this.exeMrus)); + }, + saveMru : function (mru, mruIndex, mrusProp, mrusArr) { + if (mruIndex > 0) { + mrusArr.splice(mruIndex, 1); + mrusArr.unshift(mru); + } + else if (mruIndex < 0) { + mrusArr.unshift(mru); + } + if (mrusArr.length > 8) { + while (mrusArr.length > 8) { + mrusArr.pop(); + } + } + this.set(mrusProp, mrusArr); + var rovSettings = rovUtils.getLocalStorageObject('rovSettings-storage'); + rovSettings[mrusProp] = this[mrusProp]; + rovUtils.setLocalStorageObject('rovSettings-storage', rovSettings); + }, + selectAllClicked : function (e, checklistId, actionButtonId) { + var listItems = this.$[checklistId].items; + for (var i = 0; i < listItems.length; i++) { + if (!listItems[i].lastElementChild.disabled) { + listItems[i].lastElementChild.checked = e.currentTarget.checked; + } + } + if (actionButtonId) { + this.$[actionButtonId].disabled = !e.currentTarget.checked; + } + }, + selectAllCurrentAddOnsClicked : function (e) { + if (!this.$.manageAddOnsDialog.opened) { + return; + } + this.selectAllClicked(e, 'curAddOnsList', 'removeAddOnButton'); + }, + selectAllDiscoveredAddOnsClicked : function (e) { + if (!this.$.manageAddOnsDialog.opened) { + return; + } + this.selectAllClicked(e, 'discoveredAddOnsList', 'addDiscoveredAddOnButton'); + }, + selectAllExportDashboardsClicked : function (e) { + if (!this.$.exportDashboardsDialog.opened) { + return; + } + this.selectAllClicked(e, 'exportDashboardsList'); + this.$.exportDashboardsButton.disabled = !e.currentTarget.checked || + this.$.exportDashboardsInput.value == ''; + }, + selectAllViewStorageClicked : function(e) { + if (!this.$.manageStorageDialog.opened) { + return; + } + this.selectAllClicked(e, 'viewsStorageList', 'clearViewStorageButton'); + }, + selectModulesViewDialogClicked : function (e) { + if (this.allModules.length > 0) { + var dialog = this.$.selectModulesViewDialog; + if (dialog) { + dialog.style.left = (e.x) + 'px'; + dialog.open(); + this.$.selectModulesViewMenu.selected = -1; + } + } + }, + setCurModsList : function (label) { + if (label != 'Favorite Modules') { + this.set('showFilterButtonRight', true); + this.set('showFilterButtonLeft', false); + this.set('allModulesVisible', true); + this.set('curModsLabel', label); + if (label == 'Viewable Modules') { + this.set('otherModsLabels', ['All Modules', 'Favorite Modules']); + var curModules = this.viewableModules; + } + else { + this.set('otherModsLabels', ['Favorite Modules', 'Viewable Modules']); + var curModules = this.allModules; + } + this.set('curTocModules', curModules); + this.set('tocItems', this.makeModulesToc(curModules)); + } + else { + this.set('allModulesVisible', false); + if (this.favoriteModules.length > 0 && this.favoriteTocItems.length == 0) { + this.set('favoriteTocItems', this.makeModulesToc(this.favoriteModules)); + } + this.set('curModsLabel', label); + this.set('otherModsLabels', ['All Modules', 'Viewable Modules']); + } + if (this.allModulesVisible && this.filterValue!= '') { + this.filterModules(this.filterValue); + } + }, + setCurrentDashboard : function (name) { + this.currentDashboard = name; + if (name == '') { + this.$.currentDashboardDiv.title = ''; + } + else { + this.$.currentDashboardDiv.title = this.dashboards[name][0].comment ? + this.dashboards[name][0].comment : + 'Current dashboard'; + } + }, + setExecutableCallback : function (resObj) { + var res = resObj.resStr; + if (res != 'OK') { + if (this.$.connectDialog.hidden == false) { + this.$.connectButton.disabled = false; + this.connectMessage = res; + this.$.connectErrorIcon.hidden = false; + this.$.connectMessageDiv.hidden = false; + this.$.connectProgress.hidden = true; + } + else if (this.$.autoConnectProgressDialog.opened) { + this.$.autoConnectProgressDialog.close(); + if (this.rovInit.autoConnect) { + this.rovInit.autoConnect = false; + rovUtils.setLocalStorageObject('rovInit-storage', this.rovInit); + } + this.showConnectDialog(res); + } + else { + this.showStatus(res, 'error'); + } + return; + } + if (this.$.connectDialog.hidden == false) { + this.rovInit.exe = this.$.exeInput.value; + this.rovInit.commLink = this.$.commLinkInput.value; + this.rovInit.autoConnect = this.$.autoConnectCheckbox.checked; + this.rovInit.noExe = this.$.exeInput.value == this.useCurrentProgram; + this.averageIntroProgess(); + rovUtils.setLocalStorageObject('rovInit-storage', this.rovInit); + this.$.connectDialog.hidden = true; + this.$.connectDialog.style.display = 'none'; + } + else if (this.$.autoConnectProgressDialog.opened) { + this.averageIntroProgess(); + rovUtils.setLocalStorageObject('rovInit-storage', this.rovInit); + this.$.autoConnectProgressDialog.close(); + } + if (this.exeName == '' && resObj.exeName.length > 0) { + var exe = resObj.exeName.replace(/\\/g, '/'); + this.$.rovTitleToolbar.title = exe; + this.exeName = exe.substr(exe.lastIndexOf('/') + 1); + } + else { + this.$.rovTitleToolbar.title = this.rovInit.exe; + } + document.title = "ROV: " + this.exeName; + if (resObj.coreName && resObj.coreName.length > 0) { + document.title += ' - ' + resObj.coreName; + this.$.rovTitleToolbar.title += ' - ' + resObj.coreName; + } + if (window.rov_setTitle) { + window.rov_setTitle(document.title); + } + + /* Enable toolbars */ + this.$.toggleDrawerBtn.disabled = false; + this.$.rovOptionsButton.disabled = false; + this.$.dashboardOverflowDialogButton.disabled = false; + this.$.openDashboardButton.disabled = false; + this.$.overflowOpenDashboardButton.disabled = false; + this.panelWidth = this.$.rovDrawerPanel.offsetWidth; + this.toolbarResponseToResize(false); + this.dashboardButtonsState(); + this.toolbarButtonsState(); + this.sanityCheckAddOns(); + if (!this.ccs7 || !this.rovInit.noExe) { + this.saveExeMru(this.rovInit.exe); + } + else if (exe) { + this.saveExeMru(exe); + } + if (this.rovInit.commLink != 'Debugger') { + this.saveCommLinkMru(this.rovInit.commLink); + } + this.rovData.getViewList(this); + this.inited = true; + }, + setExecutableProgressCallback : function (res) { + if (this.$.connectDialog.hidden == false && this.$.connectProgress.hidden == false) { + this.$.connectProgress.value += this.rovInit.progressInfo.step; + ++this.rovInit.progressInfo.notifyCount; + } + else if (this.$.connectDialog.hidden == true && this.rovInit.autoConnect) { + this.$.autoConnectProgress.value += this.rovInit.progressInfo.step; + ++this.rovInit.progressInfo.notifyCount; + } + this.connectMessage = res; + }, + setRovSettings : function(rovSettings) { + this.set('rovSettings', rovSettings); + if (this.rovSettings.refreshInterval) { + this.refreshInterval = this.rovSettings.refreshInterval; + } + if (this.rovSettings.dataTimeoutPeriod) { + this.dataTimeoutPeriod = this.rovSettings.dataTimeoutPeriod; + this.rovData.setRequestTimeout(this.dataTimeoutPeriod); + } + if (this.rovSettings.connectTimeoutPeriod) { + this.connectTimeoutPeriod = this.rovSettings.connectTimeoutPeriod; + this.rovData.setConnectTimeout(this.connectTimeoutPeriod); + } + if (this.rovSettings.curModsLabel) { + this.curModsLabel = this.rovSettings.curModsLabel; + if (this.curModsLabel == 'All Modules' || this.curModsLabel == 'Viewable Modules') { + this.set('allModulesVisible', true); + this.set('showFilterButtonRight', true); + this.set('showFilterButtonLeft', false); + } + } + if (this.rovSettings.otherViews) { + this.otherViews = rovUtils.shallowCopy(this.rovSettings.otherViews); + for (var i = 0; i < this.otherViews.length; i++) { + var path = this.parseAddOnPath(this.otherViews[i].path); + this.addOnsHash[path] = this.otherViews[i]; + this.importHref(path, + function(e){ + var key = this.getAddOnHashKey(e.target.outerHTML); + var importedElem = this.getImportedAddOnId(e.target.import.activeElement); + if (this.addOnsHash[key].element == importedElem) { + this.addOnsHash[key].href = e.target.href; + } + else { + this.addOnsHash[key].href = 'error'; + this.showStatus('Error importing <' + this.addOnsHash[key].element + '> at ' + e.target.href, 'error'); + this.showStatus('Element mismatch <' + this.addOnsHash[key].element + '> vs <' + importedElem + '>'); + } + }, + function(e){ + var key = this.getAddOnHashKey(e.target.outerHTML); + this.addOnsHash[key].href = 'error'; + this.showStatus('Error importing ' + e.target.href, 'error'); + } + ); + } + } + if (this.rovSettings.addOnMrus) { + this.addOnMrus = rovUtils.shallowCopy(this.rovSettings.addOnMrus); + } + if (this.rovSettings.exeMrus) { + this.exeMrus = rovUtils.shallowCopy(this.rovSettings.exeMrus); + } + if (this.rovSettings.commLinkMrus) { + this.commLinkMrus = rovUtils.shallowCopy(this.rovSettings.commLinkMrus); + } + }, + showAddOnInput : function (show) { + this.$.manageAddOnsDialog.style.height = show ? '270px' : '240px'; + this.$.showAddOnInput.disabled = show; + this.$.hideAddOnInput.hidden = + this.$.addOnMruButton.hidden = + this.$.addOnInput.hidden = + this.$.loadAddOnButton.hidden = !show; + this.$.closeManageAddOnsDialogButton.style.marginTop = show ? '10px' : '0px'; + if (show) { + this.$.addOnInput.focus(); + } + }, + showAddOnInputClicked : function (e) { + var show = e.currentTarget.id.indexOf('show') != -1; + this.showAddOnInput(show); + }, + showConnectDialog : function (autoConnectError) { + this.$.connectMessageDiv.hidden = true; + this.$.commLinkInputInvalid.hidden = true; + this.$.exeInputInvalid.hidden = true; + if (this.rovInit.exe) { + this.$.exeInput.value = this.rovInit.exe; + } + else if (this.ccs7) { + this.$.exeInput.value = this.useCurrentProgram; + } + if (this.rovInit.commLink) { + this.$.commLinkInput.value = this.rovInit.commLink; + } + else if (this.ccs7) { + this.$.commLinkInput.value = 'Debugger'; + } + if (this.ccs7) { + var exeMrus = [this.useCurrentProgram]; + for (var i = 0; i < this.exeMrus.length; i++) { + exeMrus.push(this.exeMrus[i]); + } + this.set('exeMrus', exeMrus); + + var commLinkMrus = ['Debugger']; + for (i = 0; i < this.commLinkMrus.length; i++) { + if (this.commLinkMrus[i] != 'Debugger') { + commLinkMrus.push(this.commLinkMrus[i]); + } + } + this.set('commLinkMrus', commLinkMrus); + } + this.$.autoConnectCheckbox.checked = (this.rovInit.autoConnectChecked) == true ? true : false; + if (!this.rovInit.progressInfo) { + this.rovInit.progressInfo = {}; + this.rovInit.progressInfo.min = 0; + this.rovInit.progressInfo.max = 10; + this.rovInit.progressInfo.step = 1; + } + this.$.connectProgress.min = this.rovInit.progressInfo.min; + this.$.connectProgress.max = this.rovInit.progressInfo.max; + this.$.connectProgress.step = this.rovInit.progressInfo.step; + this.$.connectProgress.value = 0; + this.$.connectButton.disabled = false; + if (autoConnectError) { + this.connectMessage = autoConnectError; + this.$.connectErrorIcon.hidden = false; + this.$.connectMessageDiv.hidden = false; + this.$.connectProgress.hidden = true; + } + this.$.connectDialog.hidden = false; + this.$.connectDialog.style.display = 'inline-block'; + }, + showConnectDialogChecked : function (e) { + this.$.rovOptionsMenu.selected = -1; + this.rovInit.autoConnect = !e.currentTarget.checked; + rovUtils.setLocalStorageObject('rovInit-storage', this.rovInit); + }, + showDashboard : function (dashboard, dashName) { + if (dashboard.length > 0 && + (!dashboard[0].dashboardVersion || + dashboard[0].dashboardVersion != this.dashboardVersion)) { + this.showStatus('Incompatible dashboard', 'warning'); + } + this.closeAllViews(); + this.setCurrentDashboard(dashName); + for (var i = 0; i < dashboard.length; i++) { + if (dashboard[i].moduleName) { + if (this.allModules.indexOf(dashboard[i].moduleName) >= 0) { + var view = this.newModuleView(dashboard[i].moduleName, dashboard[i].viewName, + dashboard[i].viewsData, dashboard[i].viewArgs); + view.style.left = dashboard[i].left + 'px'; + view.style.top = dashboard[i].top + 'px'; + view.$.viewContentDiv.style.position = 'absolute'; + view.$.viewPaperCard.style.width = dashboard[i].width + 'px'; + view.$.viewPaperCard.style.height = dashboard[i].height + 'px'; + view.style.zIndex = dashboard[i].zIndex; + } + else { + this.showStatus('Module ' + dashboard[i].moduleName + ' is not present in ' + document.title, 'warning'); + } + } + else if (dashboard[i].elemName) { /* is otherView */ + if (!this.otherViewsHaveElem(dashboard[i].elemName)) { + this.loadMissingDashboardAddOn(dashboard[i], true); + } + else { + this.newDashboardRovView(dashboard[i]); } + } + } + }, + showSavedDashboardsClicked : function (event) { + this.listDashboardsDialog('Save', event); + }, + showStatus : function (message, type) { + var statusItems = []; + if (this.statusItems.length > 0) { + statusItems = rovUtils.shallowCopy(this.statusItems); + } + var statusItem = {}; + if (!type) { + statusItem.iconHidden = true; + statusItem.style = 'margin-left:33px'; + } + else { + statusItem.style = ''; + statusItem.iconHidden = false; + if (type == 'warning') { + statusItem.icon = 'warning'; + statusItem.iconStyle = 'color:goldenrod;--iron-icon-stroke-color:black'; + statusItem.iconClass = 'consoleWarningIcon'; + } + else if (type == 'error') { + statusItem.icon = 'error'; + statusItem.iconStyle = 'color:red'; + statusItem.iconClass = 'consoleErrorIcon'; + } + else if (type == 'info') { + statusItem.icon = 'info-outline'; + statusItem.iconStyle = 'color:blue'; + statusItem.iconClass = 'consoleStatusIcon'; + } + } + statusItem.message = message; + statusItems.push(statusItem); + var fontInfo = tiRovStyles.rovContentFontSize + 'pt ' + 'Open Sans'; + var consoleWidth = 0; + for (var i = 0; i < statusItems.length; i++) { + var width = rovUtils.getStringWidth(statusItems[i].message, fontInfo); + if (width > consoleWidth) { + consoleWidth = width; + } + } + consoleWidth += 24; + var maxWidth = this.isNarrow() ? document.documentElement.clientWidth : (document.documentElement.clientWidth - rovUtils.leftPaneWidth); + if (consoleWidth >= maxWidth) { + consoleWidth = maxWidth - 2; + } + this.$.statusConsole.style.width = String(consoleWidth) + 'px'; + if (statusItems.length > 10) { + if (this.$.statusConsole.style.overflowY != 'auto') { + this.$.statusConsole.style.overflowY = 'auto'; + } + this.$.statusConsole.style.height = String(11 * 24) + 'px'; + } + this.set('statusItems', statusItems); + this.$.statusConsole.hidden = false; + }, + snapCorner : function (event, id, xOffset, yOffset, elem, top, left, right, bottom, allViews) { + var cornerFound = false; + for (var i = 0; i < allViews.length; i++) { + if (allViews[i].id != id) { + var siblingElem = this.getViewById(allViews[i].id); + if (siblingElem.style.top == '') { + var siblingTop = siblingElem.clientTop; + var siblingLeft = siblingElem.clientLeft; + } + else { + var siblingTop = Number(siblingElem.style.top.replace(/px/, '')); + var siblingLeft = Number(siblingElem.style.left.replace(/px/, '')); + } + var siblingRight = siblingLeft + siblingElem.clientWidth; + var siblingBottom = siblingTop + siblingElem.clientHeight; + if (left > siblingRight - 20 && left < siblingRight + 20) { /* elem left edge at sibling right edge */ + if (top > siblingTop - 20 && top < siblingTop + 20) { /* elem top left -> sibling top right */ + top = siblingTop; + left = siblingLeft + siblingElem.clientWidth + 1; + cornerFound = true; + } + else if (top > siblingBottom - 20 && top < siblingBottom + 20) { /* elem top left -> sibling bottom right */ + top = siblingBottom - 8; + left = siblingLeft + siblingElem.clientWidth + 1; + cornerFound = true; + } + else if (bottom > siblingTop - 20 && bottom < siblingTop + 20) { /* elem bottom left -> sibling top right */ + top = siblingTop - elem.clientHeight + 7; + left = siblingLeft + siblingElem.clientWidth + 1; + cornerFound = true; + } + else if (bottom > siblingBottom - 20 && bottom < siblingBottom + 20) { /* elem bottom left -> sibling bottom right */ + top = siblingBottom - elem.clientHeight; + left = siblingLeft + siblingElem.clientWidth + 1; + cornerFound = true; + } + } + else if (right > siblingLeft - 20 && right < siblingLeft + 20) { /* elem right edge at sibling left edge */ + if (top > siblingTop - 20 && top < siblingTop + 20) { /* elem top right -> sibling top left */ + top = siblingTop; + left = siblingLeft - elem.clientWidth - 1; + cornerFound = true; + } + else if (top > siblingBottom - 20 && top < siblingBottom + 20) { /* elem top right -> sibling bottom left */ + top = siblingBottom - 8; + left = siblingLeft - elem.clientWidth - 1; + cornerFound = true; + } + else if (bottom > siblingBottom - 20 && bottom < siblingBottom + 20) { /* elem bottom right -> sibling bottom left */ + top = siblingBottom - elem.clientHeight; + left = siblingLeft - elem.clientWidth - 1; + cornerFound = true; + } + else if (bottom > siblingTop - 20 && bottom < siblingTop + 20) { /* elem bottom right -> sibling top left */ + top = siblingTop - elem.clientHeight + 7; + left = siblingLeft - elem.clientWidth - 1; + cornerFound = true; + } + } + if (!cornerFound) { + if (top > siblingBottom - 30 && top < siblingBottom + 20) { /* elem top edge at sibling bottom edge */ + if (left > siblingLeft - 20 && left < siblingLeft + 20) { /* elem top left -> sibling bottom left */ + top = siblingBottom - 8; + left = siblingLeft; + cornerFound = true; + } + else if (right > siblingRight - 20 && right < siblingRight + 20) { /* elem top right -> sibling bottom right */ + top = siblingBottom - 8; + left = siblingRight - elem.clientWidth - 1; + cornerFound = true; + } + } + else if (bottom > siblingTop - 20 && bottom < siblingTop + 20) { /* elem bottom edge at sibling top edge */ + if (left > siblingLeft - 20 && left < siblingLeft + 20) { /* elem bottom left -> sibling top left */ + top = siblingTop - elem.clientHeight + 7; + left = siblingLeft; + cornerFound = true; + } + else if (right > siblingRight - 20 && right < siblingRight + 20) { /* elem bottom right -> sibling top right */ + top = siblingTop - elem.clientHeight + 7; + left = siblingRight - elem.clientWidth - 1; + cornerFound = true; + } + } + } + if (cornerFound) { + break; + } + } + } + return ({top : top, + left : left, + cornerFound : cornerFound, + leftAssigned : false, + topAssigned : false}); + }, + snapEdge : function (event, id, xOffset, yOffset, elem, top, left, right, bottom, allViews) { + var topAssigned = false; + var leftAssigned = false; + for (var i = 0; i < allViews.length; i++) { + if (allViews[i].id != id) { + var siblingElem = this.getViewById(allViews[i].id); + if (siblingElem.style.top == '') { + var siblingTop = siblingElem.clientTop; + var siblingLeft = siblingElem.clientLeft; + } + else { + var siblingTop = Number(siblingElem.style.top.replace(/px/, '')); + var siblingLeft = Number(siblingElem.style.left.replace(/px/, '')); + } + var siblingRight = siblingLeft + siblingElem.clientWidth; + var siblingBottom = siblingTop + siblingElem.clientHeight; + if (left > siblingRight - 20 && left < siblingRight + 20) { /* elem left edge -> sibling right edge */ + left = siblingLeft + siblingElem.clientWidth + 1; + leftAssigned = true; + } + else if (top > siblingBottom - 30 && top < siblingBottom + 20) { /* elem top edge -> sibling bottom edge */ + top = siblingBottom - 8; + topAssigned = true; + } + else if (right > siblingLeft - 20 && right < siblingLeft + 20) { /* elem right edge -> sibling left edge */ + left = siblingLeft - elem.clientWidth - 1; + leftAssigned = true; + } + else if (bottom > siblingTop - 20 && bottom < siblingTop + 20) { /* elem bottom edge -> sibling top edge */ + top = siblingTop - elem.clientHeight + 7; + topAssigned = true; + } + } + if (leftAssigned || topAssigned) { + break; + } + } + return ({top : top, + left : left, + cornerFound : false, + leftAssigned : leftAssigned, + topAssigned : topAssigned}); + }, + stopRepeatRefresh : function (cancelAll) { + this.inRepeatRefresh = false; + this.$.repeatRefreshButton.disabled = + this.$.refreshAllButton.disabled = (this.dataViewsShowing() < 1); + this.$.overflowRepeatRefreshButton.disabled = this.$.repeatRefreshButton.disabled; + this.$.overflowRefreshAllButton.disabled = this.$.refreshAllButton.disabled; + if (this.repeatHandle != 0) { + var handle = this.repeatHandle; + this.repeatHandle = 0; + this.cancelAsync(handle); + } + if (cancelAll) { + this.rovData.cancelAllPendingRequests(); + } + }, + stopRepeatRefreshClicked : function () { + this.stopRepeatRefresh(true); + }, + storableRovViewsShowing : function() { + var count = 0; + for (var i = 0; i < this.rovViews.length; i++) { + var elem = this.getViewById(this.rovViews[i].id); + if (elem) { + if (elem.hasStorableContent && elem.hasStorableContent()) { + ++count; + } + } + } + return (count); + }, + storageOptionsDialog : function (e) { + var dialog = document.getElementById('manageStorageDialog'); + if (dialog) { + var viewsStorage = rovUtils.getLocalStorageObject('viewsData-storage'); + var keys = Object.keys(viewsStorage); + var nonNullKeys = []; + var maxWidth = 0; + for (var i = 0; i < keys.length; i++) { + if (viewsStorage[keys[i]]) { + nonNullKeys.push(keys[i]); + var width = rovUtils.getStringWidth(keys[i]); + if (width > maxWidth) { + maxWidth = width; + } + } + } + nonNullKeys.sort(); + this.set('viewsStorageItems', nonNullKeys); + dialog.open(); + this.$.viewsStorageList.style.width = maxWidth + 'px'; + dialog.style.left = this.isNarrow() ? '0px': rovUtils.leftPaneWidth + 'px'; + dialog.style.zIndex = String(this.getMaxZindex() + 10); + + /* Init checkboxes and clear selection button */ + var listItems = this.$.viewsStorageList.items; + for (var i = 0; i < listItems.length; i++) { + listItems[i].lastElementChild.checked = false; + } + this.$.viewsStorageList.selected = -1; + this.$.clearViewStorageButton.disabled = true; + this.$.selectAllViewsStorageCheckbox.checked = false; + this.$.selectAllViewsStorageCheckbox.disabled = nonNullKeys.length == 0; + } + }, + subMenuClicked : function (event) { + if (this.allModulesVisible) { + var index = this.getTocIndex(event.currentTarget.id, this.tocItems); + if (index >= 0) { + var str = 'tocItems.' + index + '.expanded'; + this.set(str, !this.tocItems[index].expanded); + } + } + else { + var index = this.getTocIndex(event.currentTarget.id, this.favoriteTocItems); + if (index >= 0) { + var str = 'favoriteTocItems.' + index + '.expanded'; + this.set(str, !this.favoriteTocItems[index].expanded); + } + } + }, + syncDiscoveredAddOnsList : function () { + var hash = []; + var listItems = this.$.discoveredAddOnsList.items; + for (var i = 0; i < listItems.length; i++) { + hash[listItems[i].lastElementChild.title] = {}; + hash[listItems[i].lastElementChild.title].checked = listItems[i].lastElementChild.checked; + } + var addOns = []; + for (var i = 0; i < this.discoveredAddOns.length; i++) { + if (!this.isDupAddOn(this.discoveredAddOns[i].path)) { + addOns.push(this.discoveredAddOns[i]); + if (!hash[this.discoveredAddOns[i].path]) { + hash[this.discoveredAddOns[i].path] = {}; + hash[this.discoveredAddOns[i].path].checked = false; + } + } + } + this.set('dlgDiscoveredAddOns', addOns); + this.$.discoveredAddOnsTemplate.render(); + listItems = this.$.discoveredAddOnsList.items; + var foundUnchecked = false; + var foundChecked = false; + for (var i = 0; i < listItems.length; i++) { + listItems[i].lastElementChild.checked = hash[listItems[i].lastElementChild.title].checked; + if (!foundUnchecked && !listItems[i].lastElementChild.checked) { + foundUnchecked = true; + } + if (!foundChecked && listItems[i].lastElementChild.checked) { + foundChecked = true; + } + } + this.$.discoveredAddOnsTemplate.render(); + this.$.selectAllDiscoveredAddOnsCheckbox.checked = !foundUnchecked && this.dlgDiscoveredAddOns.length > 0; + this.$.selectAllDiscoveredAddOnsCheckbox.disabled = (this.dlgDiscoveredAddOns.length == 0); + this.$.addDiscoveredAddOnButton.disabled = !foundChecked; + }, + toggleDrawerClicked : function (e) { + var narrow = !this.$.rovDrawerPanel.narrow; + this.$.rovDrawerPanel._responsiveChange(narrow); + this.set('toggleIcon', narrow ? 'chevron-right' : 'chevron-left'); + this.set('toggleTooltip', narrow ? 'Show modules list' : 'Hide modules list'); + this.$.rovTitle.hidden = narrow; + this.$.titleSpan.style.left = narrow ? '30px' : '210px'; + this.toolbarResponseToResize(narrow); + }, + toolbarButtonsState : function() { + var allViewsLength = this.rovModuleViews.length + this.rovViews.length; + this.$.viewToTopButton.disabled = allViewsLength <= 1; + this.$.saveAllButton.disabled = (this.moduleViewsShowing() + this.storableRovViewsShowing()) < 1; + this.$.repeatRefreshButton.disabled = this.$.refreshAllButton.disabled = + (this.dataViewsShowing() < 1 || this.repeatHandle != 0); + this.$.overflowRepeatRefreshButton.disabled = this.$.repeatRefreshButton.disabled; + this.$.overflowRefreshAllButton.disabled = this.$.refreshAllButton.disabled; + this.$.closeAllButton.disabled = allViewsLength == 0; + this.$.overflowCloseAllButton.disabled = this.$.closeAllButton.disabled; + this.$.titleOverflowDialogButton.disabled = this.$.overflowRefreshAllButton.disabled && this.$.overflowCloseAllButton.disabled; + if (this.$.titleOverflowDialogButton.disabled && + this.$.titleOverflowDialog.opened) { + this.$.titleOverflowDialog.close(); + } + if (allViewsLength == 0) { + this.setCurrentDashboard(''); + } + this.enableOtherViews = this.otherViews.length > 0; + }, + toolbarDragEnter : function (e) { + this.dashboardDrag(e); + }, + toolbarDragOver : function (e) { + this.dashboardDrag(e); + }, + toolbarResponseToResize : function (narrow) { + var panelWidth = this.$.rovDrawerPanel.offsetWidth; + if (!narrow) { + if (panelWidth < 775) { + this.$.rovTitle.hidden = true; + this.$.titleSpan.style.left = '30px'; + } + else { + this.$.rovTitle.hidden = false; + this.$.titleSpan.style.left = '210px'; + } + this.$.titleSpan.hidden = panelWidth < 455; + this.$.dashboardDiv.hidden = panelWidth < 585; + if (panelWidth >= 215 && panelWidth < 300) { + this.$.titleOverflowDialogButton.style.left = '14px'; + this.$.titleOverflowDialog.style.left = '194px'; + } + if (panelWidth < 215) { + this.$.rovOptionsButton.hidden = true; + this.$.titleOverflowDialogButton.hidden = true; + this.$.dashboardOverflowDialogButton.hidden = true; + } + else if (panelWidth < 250) { + this.$.rovOptionsButton.hidden = true; + this.$.titleOverflowDialogButton.hidden = false; + this.$.dashboardOverflowDialogButton.hidden = true; + } + else if (panelWidth < 275) { + this.$.rovOptionsButton.hidden = true; + this.$.titleOverflowDialogButton.hidden = false; + this.$.dashboardOverflowDialogButton.hidden = false; + this.$.dashboardOverflowDialogButton.style.right = '0px'; + this.$.dashboardOverflowDialog.style.right = '0px'; + } + else { + this.$.titleOverflowDialogButton.hidden = !this.$.titleSpan.hidden; + this.$.dashboardOverflowDialogButton.hidden = !this.$.dashboardDiv.hidden; + if (panelWidth < 300) { + this.$.rovOptionsButton.hidden = true; + this.$.dashboardOverflowDialogButton.style.right = '16px'; + this.$.dashboardOverflowDialog.style.right = '12px'; + } + else { + this.$.rovOptionsButton.hidden = false; + if (!this.$.titleOverflowDialogButton.hidden) { + this.$.titleOverflowDialogButton.style.left = '24px'; + this.$.titleOverflowDialog.style.left = '206px'; + } + if (panelWidth < 480 && this.$.titleOverflowDialogButton.hidden) { + this.$.rovOptionsButton.style.right = '5px'; + this.$.dashboardOverflowDialogButton.style.right = '25px'; + this.$.dashboardOverflowDialog.style.right = '21px'; + } + else { + this.$.rovOptionsButton.style.right = '12px'; + if (!this.$.dashboardOverflowDialogButton.hidden) { + this.$.dashboardOverflowDialogButton.style.right = '40px'; + this.$.dashboardOverflowDialog.style.right = '36px'; + } + } + } + } + } + else { + this.$.rovOptionsButton.hidden = false; + this.$.dashboardDiv.hidden = panelWidth < 400; + this.$.dashboardOverflowDialogButton.hidden = !this.$.dashboardDiv.hidden; + this.$.titleSpan.hidden = panelWidth < 265; + this.$.titleOverflowDialogButton.hidden = !this.$.titleSpan.hidden; + if (panelWidth < 300) { + if (!this.$.titleOverflowDialogButton.hidden) { + this.$.titleOverflowDialogButton.style.left = '24px'; + this.$.titleOverflowDialog.style.left = '206px'; + } + else { + this.$.titleSpan.style.left = '18px'; + } + this.$.rovOptionsButton.style.right = '2px'; + this.$.dashboardOverflowDialogButton.style.right = '28px'; + this.$.dashboardOverflowDialog.style.right = '24px'; + } + else { + this.$.titleSpan.style.left = '30px'; + this.$.rovOptionsButton.style.right = '12px'; + this.$.dashboardOverflowDialogButton.style.right = '40px'; + this.$.dashboardOverflowDialog.style.right = '36px'; + } + } + if (this.$.listDashboardsDialog.opened && + (this.$.listDashboardsDialog.name == 'Open' || this.$.listDashboardsDialog.name == 'Delete')) { + this.$.listDashboardsDialog.close(); + } + if (this.$.dashboardOverflowDialogButton.hidden && + this.$.dashboardOverflowDialog.opened) { + this.$.dashboardOverflowDialog.close(); + } + if (this.$.titleOverflowDialogButton.hidden && + this.$.titleOverflowDialog.opened) { + this.$.titleOverflowDialog.close(); + } + }, + viewDragEnd : function (event) { + if (!rovUtils.validDragElement(event.target)) { + return; + } + var elem = this.getViewById(event.target.parentElement.dataHost.id); + if (elem.$.viewContentDiv) { /* re-enable mouse events in content */ + elem.$.viewContentDiv.style.pointerEvents = ''; + } + }, + viewDragEnter : function (event) { + if (!rovUtils.validDragElement(event.target)) { + return; + } + event.preventDefault(); + }, + viewDragOver : function (event) { + if (!rovUtils.validDragElement(event.target)) { + return; + } + if (event.target.id == 'contentDiv' || event.target.id == 'mainContainer' || + event.target.id.indexOf('rovModuleView_') >= 0 || + event.target.id.indexOf('rovView_') >= 0) { + + event.preventDefault(); + } + }, + viewDragStart : function (event) { + if (event.target.id != 'dragDiv') { + if (rovUtils.validDragElement(event.target)) { + event.preventDefault(); + } + return; + } + var id = event.target.parentElement.dataHost.id; + var elem = this.getViewById(id); + /* disable mouse events in content when dragging over our own view */ + if (elem.$.viewContentDiv) { + elem.$.viewContentDiv.style.pointerEvents = 'none'; + } + var rect = elem.getBoundingClientRect(); + var cyOffset = String(event.screenY - event.clientY); + var cxOffset = String(event.screenX - event.clientX); + var data = [id, String(rect.left + this.viewContainer.scrollLeft), String(rect.top + this.viewContainer.scrollTop), cyOffset, cxOffset].join(','); + this.dragData = data; + event.dataTransfer.setData('text', data); + event.dataTransfer.effectAllowed = 'all'; + event.dataTransfer.dropEffect = 'move'; + var img = new Image(); + img.src = './client/images/dragger.png'; + img.alt = ''; + event.dataTransfer.setDragImage(img, 0, 0); + }, + viewDrop : function (event) { + var data = event.dataTransfer.getData('text'); + if (!data || data.length == 0 || data.indexOf('cell: ') == 0) { + return; + } + event.preventDefault(); + data = data.split(','); + var id = data[0]; + var begClientX = Number(data[1]); + var begClientY = Number(data[2]); + var xOffset = Number(event.clientX) - begClientX + this.viewContainer.scrollLeft; + var yOffset = Number(event.clientY) - begClientY + this.viewContainer.scrollTop; + if (begClientY + yOffset < 48) { + yOffset = 48 - begClientY; + } + this.viewDropDisplay(event, id, xOffset, yOffset); + }, + viewDropDisplay : function (event, id, xOffset, yOffset) { + var elem = this.getViewById(id); + var top; + var left; + if (elem.style.top == '') { + top = yOffset; + left = xOffset; + } + else { + top = Number(elem.style.top.replace(/px/, '')); + left = Number(elem.style.left.replace(/px/, '')); + top = top + yOffset; + left = left + xOffset; + } + var right = left + elem.clientWidth; + var bottom = top + elem.clientHeight - 10; + var allViews = []; + for (var i = 0; i < this.rovModuleViews.length; i++) { + allViews.push(this.rovModuleViews[i]); + } + for (var i = 0; i < this.rovViews.length; i++) { + allViews.push(this.rovViews[i]); + } + var snapObj = this.snapCorner(event, id, xOffset, yOffset, elem, top, left, right, bottom, allViews); + if (!snapObj.cornerFound) { + snapObj = this.snapEdge(event, id, xOffset, yOffset, elem, top, left, right, bottom, allViews); + } + if (!snapObj.cornerFound && !snapObj.topAssigned) { + snapObj.top -= 8; /* -8 for cursor arrow */ + } + elem.style.top = snapObj.top + 'px'; + elem.style.left = snapObj.left + 'px'; + elem.style.zIndex = String(this.getMaxZindex() + 1); + }, + viewToTopDialog : function(event) { + this.viewToTopList = []; + var viewList = []; + for (var i = 0; i < this.rovModuleViews.length; i++) { + var listItem = {}; + var elem = this.getViewById(this.rovModuleViews[i].id); + listItem.name = elem.shortModuleName; + listItem.fullName = elem.moduleName + ' ' + elem.viewName; + listItem.id = elem.id; + viewList.push(listItem); + } + for (var i = 0; i < this.rovViews.length; i++) { + var listItem = {}; + var elem = this.getViewById(this.rovViews[i].id); + listItem.name = elem.viewName; + listItem.fullName = elem.viewName; + listItem.id = elem.id; + viewList.push(listItem); + } + this.set('viewToTopList', viewList); + var dialog = document.getElementById('listViewsDialog'); + if (dialog) { + /* 24 is the padding + 10 */ + dialog.style.left = (event.x - 34) + 'px'; + dialog.open(); + dialog.style.zIndex = String(this.getMaxZindex() + 1); + if (this.$.viewToTopMenu.selected != undefined) { + this.$.viewToTopMenu.selected = -1; + } + } + }, + viewToTopMenuItemSelected : function (e) { + var elem = this.getViewById(e.detail.item.id); + if (elem) { + elem.style.zIndex = String(this.getMaxZindex() + 1); + } + this.$.viewToTopMenu.selected = -1; + var dialog = document.getElementById('listViewsDialog'); + if (dialog) { + dialog.close(); + } + } +}); |
