diff --git a/js/app/models/InteractiveNode.js b/js/app/models/InteractiveNode.js index 975ca9f..41c19e0 100644 --- a/js/app/models/InteractiveNode.js +++ b/js/app/models/InteractiveNode.js @@ -89,13 +89,15 @@ Ext.define('amdaModel.InteractiveNode', { { this.callParent(arguments); this.set('nodeType',this.self.nodeType); - this.set('ownerTreeId',amdaUI.ExplorerUI.RESRC_TAB.TREE_ID); - // if id of this node have root category suffix - if (Ext.util.Format.substr(this.get('id'), -(amdaUI.ExplorerUI.CAT_SUFFIX.length), this.get('id').length) === amdaUI.ExplorerUI.CAT_SUFFIX) - { - // set the expanded property to true - this.set('expanded',true); - } + this.set('ownerTreeId',amdaUI.ExplorerUI.RESRC_TAB.TREE_ID); + if (this.get('id')) { // TODO why sometimes (delete in remote interoper tree) this.get('id') = undefined ? + // if id of this node have root category suffix + if (Ext.util.Format.substr(this.get('id'), -(amdaUI.ExplorerUI.CAT_SUFFIX.length), this.get('id').length) === amdaUI.ExplorerUI.CAT_SUFFIX) + { + // set the expanded property to true + this.set('expanded',true); + } + } }, /** diff --git a/js/app/models/RemoteParamNode.js b/js/app/models/RemoteParamNode.js index 7691607..05b1a28 100644 --- a/js/app/models/RemoteParamNode.js +++ b/js/app/models/RemoteParamNode.js @@ -3,152 +3,143 @@ * Name : RemoteParamNode.js * @class amdaModel.RemoteParamNode * @extends amdaModel.LocalParamNode - * @brief - * @author - * @version $Id: RemoteParamNode.js 2544 2014-10-03 10:21:56Z elena $ + * @author elena */ Ext.define('amdaModel.RemoteParamNode', { + extend: 'amdaModel.LocalParamNode', - extend: 'amdaModel.LocalParamNode', - - statics:{ - nodeType: 'remoteParam' - }, - - fields: [ - {name: 'isRemoteDataSet', type:'boolean', persist: false, defaultValue: false}, - {name: 'isSimulation', type:'boolean', defaultValue: false} - ], - - constructor : function(config){ - this.callParent(arguments); - //TODO only for INTEROPER TREE - if (!this.get('leaf')) this.set('allowDrag', false); - if (this.get('isParameter')) this.set('allowDrag',true); - if (this.get('leaf') && this.get('isSpectra')) this.set('iconCls', 'icon-spectra'); - if (this.get('disable')) { - this.set('cls', 'icon-disabled'); - this.set('allowDrag', false); - } - }, - - - allMenuItems : function() { - var menuItems = - [{ - fnId : 'dire-addData', - text : 'Add Data' - },{ - fnId : 'root-addData', - text : 'Add Data' - },{ - fnId : 'dire-deleteNode', - text : 'Delete Data' - },{ - fnId : 'root-collapseAll', - text : 'Close All' - }, { - fnId : 'dire-collapseAll', - text : 'Close All' - }, { - fnId : 'para-plotParam', - text : 'Plot Parameter', - hidden : true - }, { - fnId : 'para-downParam', - text : 'Download Parameter', - hidden : true - },{ - fnId : 'leaf-createAlias', - text : 'Create/Edit Alias' - }, { - fnId : 'leaf-createDerivedParam', - text : 'Create Derived Parameter' - },{ - fnId : 'leaf-deleteNode', - text : 'Delete Parameter' - },{ - fnId : 'leaf-plotParam', - text : 'Plot Parameter', - hidden : true - }, { - fnId : 'leaf-downParam', - text : 'Download Parameter', - hidden : true - }]; - - return menuItems; - } , - - onMenuItemClick : function(menu,item,event) { + statics:{ + nodeType: 'remoteParam' + }, - if (item) { - switch (item.fnId) { + fields: [{name: 'isRemoteDataSet', type:'boolean', persist: false, defaultValue: true}, + {name: 'isSimulation', type:'boolean', defaultValue: false}], + + constructor : function(config){ + this.callParent(arguments); + + //TODO only for INTEROPER TREE + if (!this.get('leaf')) this.set('allowDrag', false); + if (this.get('isParameter')) this.set('allowDrag',true); + if (this.get('leaf') && this.get('isSpectra')) this.set('iconCls', 'icon-spectra'); + + if (this.get('disable')) { + this.set('cls', 'icon-disabled'); + this.set('allowDrag', false); + } + }, - case 'root-collapseAll': - case 'dire-collapseAll': - if(this && !this.isLeaf()) { - this.collapse(true); - } - break; - case 'leaf-createDerivedParam': - this.createLeaf(this); - break; - case 'leaf-createAlias': - this.createAlias(this); - break; - case 'leaf-deleteNode': - case 'dire-deleteNode' : - this.deleteData(); - break; - case 'dire-addData': - case 'root-addData': - this.addData(); - break; - case 'leaf-plotParam': - case 'para-plotParam': - this.createPlot(this); - break; - case 'leaf-downParam': - case 'para-downParam': - this.createDownload(this); - break; - default: - break; - } - } - }, + allMenuItems : function() { + var menuItems = + [{ + fnId : 'dire-addData', + text : 'Add Data' + },{ + fnId : 'root-addData', + text : 'Add Data' + },{ + fnId : 'dire-deleteNode', + text : 'Delete Data' + },{ + fnId : 'root-collapseAll', + text : 'Close All' + }, { + fnId : 'dire-collapseAll', + text : 'Close All' + }, { + fnId : 'para-plotParam', + text : 'Plot Parameter', + hidden : true + }, { + fnId : 'para-downParam', + text : 'Download Parameter', + hidden : true + },{ + fnId : 'leaf-createAlias', + text : 'Create/Edit Alias' + }, { + fnId : 'leaf-createDerivedParam', + text : 'Create Derived Parameter' + },{ + fnId : 'leaf-deleteNode', + text : 'Delete Parameter' + },{ + fnId : 'leaf-plotParam', + text : 'Plot Parameter', + hidden : true + }, { + fnId : 'leaf-downParam', + text : 'Download Parameter', + hidden : true + }]; + + return menuItems; + }, - deleteData : function() { - // var parent = this.parentNode; - AmdaAction.deleteFromTree({nodeType: this.get('nodeType'), id : this.get('id')}, function(res,e){ - //TODO if () not error ?? - this.remove(); - this.destroy(); - },this); - }, + onMenuItemClick : function(menu,item,event) { + if (item) { + switch (item.fnId) { + case 'root-collapseAll': + case 'dire-collapseAll': + if(this && !this.isLeaf()) { + this.collapse(true); + } + break; + case 'leaf-createDerivedParam': + this.createLeaf(this); + break; + case 'leaf-createAlias': + this.createAlias(this); + break; + case 'leaf-deleteNode': + case 'dire-deleteNode' : + this.deleteData(); + break; + case 'dire-addData': + case 'root-addData': + this.addData(); + break; + case 'leaf-plotParam': + case 'para-plotParam': + this.createPlot(this); + break; + case 'leaf-downParam': + case 'para-downParam': + this.createDownload(this); + break; + default: + break; + } + } + }, - addData : function() { + deleteData : function() { + // var parent = this.parentNode; + AmdaAction.deleteFromTree({nodeType: this.get('nodeType'), id : this.get('id')}, function(res,e){ + //TODO if () not error ?? + this.remove(); + this.destroy(); + },this); + }, - if (this.get('disable')) return; + addData : function() { + if (this.get('disable')) return; - var me = this; - myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.interop.id, true, function (module) { - module.createWindow(me.getBaseId()); - }); + var me = this; + myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.interop.id, true, function (module) { + module.createWindow(me.getBaseId()); + }); }, -// Depth of Base Root Node = 3 : root, Parameters, Remote Parameters, BaseName - getBaseId : function() { - - if (this.getDepth() < 3) return 'root'; + // Depth of Base Root Node = 3 : root, Parameters, Remote Parameters, BaseName + getBaseId : function() { + if (this.getDepth() < 3) return 'root'; - var node = this; - while (node.getDepth() > 3) { - node = node.parentNode; + var node = this; + while (node.getDepth() > 3) { + node = node.parentNode; + } + return node.get('id'); } - return node.get('id'); - } - }); diff --git a/js/app/views/ExplorerUI.js b/js/app/views/ExplorerUI.js index 06d0a2a..6de154c 100644 --- a/js/app/views/ExplorerUI.js +++ b/js/app/views/ExplorerUI.js @@ -1,1116 +1,1089 @@ /** * Project : AMDA-NG4 * Name : ExplorerUI.js - * Description : Explorer Module UI definition (View) - * @class amdaUI.ExplorerUI + * @class amdaUI.ExplorerUI * @extends Ext.tab.Panel + * @class amdaUI.TreeToolColumn + * @extends Ext.tree.Column + * @class MyTreeEditor + * @extends Ext.grid.plugin.CellEditing * @brief Explorer View * @author CDA - * @version $Id: ExplorerUI.js 2544 2014-10-03 10:21:56Z elena $ */ Ext.define('amdaUI.TreeToolColumn', { - extend: 'Ext.tree.Column', - alias: 'widget.treetoolcolumn', - - /** - * Add more tools here. These will be on the prototype for all TreeToolColumns - */ - tools: { - 'info': 'js/resources/images/16x16/info_mini.png' - }, - - initComponent: function() - { - var me = this; - me.addEvents( 'toolclick' ); - me.callParent(); - me.on('toolclick', me.toolHandler, me); - }, - - renderer: function(value, metaData, record, rowIdx, colIdx, store, view) - { - var toolCol = view.getHeaderAtIndex(colIdx); - - if (!toolCol.toolIsVisible(record)) - return value; - - var toolId = 'tool-' + rowIdx + '-' + colIdx, - toolImg = toolCol.tools[toolCol.tool], - imgHtml = Ext.DomHelper.markup({ - id : toolId, - tag : 'img', - tooltype: toolCol.tool, - src : toolImg, - style : 'cursor:hand;' - }); - - return value + ' ' + imgHtml; - }, - - processEvent: function(type, view, cell, recordIndex, cellIndex, e) - { - if(type === "click" && e.target.tagName === "IMG") - { - var tooltype = e.target.getAttribute("tooltype"); - if(tooltype) - return this.fireEvent("toolclick", view, cell, recordIndex, cellIndex, e); - } - return this.fireEvent.apply(this, arguments); - }, - - /** - * Override this when you add columns to the tree... see example below - */ + extend: 'Ext.tree.Column', + alias: 'widget.treetoolcolumn', + + /** + * Add more tools here. These will be on the prototype for all TreeToolColumns + */ + tools: { + 'info': 'js/resources/images/16x16/info_mini.png' + }, + + initComponent: function() + { + var me = this; + me.addEvents('toolclick'); + me.callParent(); + me.on('toolclick', me.toolHandler, me); + }, + + renderer: function(value, metaData, record, rowIdx, colIdx, store, view) + { + var toolCol = view.getHeaderAtIndex(colIdx); + + if (!toolCol.toolIsVisible(record)) return value; + + var toolId = 'tool-' + rowIdx + '-' + colIdx, + toolImg = toolCol.tools[toolCol.tool], + imgHtml = Ext.DomHelper.markup({ + id : toolId, + tag : 'img', + tooltype: toolCol.tool, + src : toolImg, + style : 'cursor:hand;' + }); + + return value + ' ' + imgHtml; + }, + + processEvent: function(type, view, cell, recordIndex, cellIndex, e) + { + if(type === "click" && e.target.tagName === "IMG") + { + var tooltype = e.target.getAttribute("tooltype"); + if(tooltype) + return this.fireEvent("toolclick", view, cell, recordIndex, cellIndex, e); + } + return this.fireEvent.apply(this, arguments); + }, + + /** + * Override this when you add columns to the tree... see example below + */ // toolHandler: function() { // alert("override this"); // }, - toolIsVisible : function(record) { - return false; - } + toolIsVisible : function(record) { + return false; + } }); +// ExplorerUI Ext.define('amdaUI.ExplorerUI', { - - extend: 'Ext.tab.Panel', - alias : 'widget.panelExplorer', - - statics: - { - RESRC_TAB : { - TREE_ID:'resourcesTree', - TREE_TYPE:'resources' - }, - OPE_TAB : { - TREE_ID:'operationsTree', - TREE_TYPE:'operations' - }, - JOB_TAB : { - TREE_ID:'jobsTree', - TREE_TYPE:'jobs' - }, - - CAT_SUFFIX: '-treeBase', - ROOT_SUFFIX: '-treeRootNode', - SUB_ROOT_SUFFIX : 'RootNode', - - ITEM_KIND_ROOT : 'root', - ITEM_KIND_LEAF : 'leaf', - ITEM_KIND_DIRE : 'dire', - ITEM_KIND_PARA : 'para', - ITEM_KIND_MISS : 'miss' - }, - - initComponent : function (config) { - - var explorerModule = myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.explorer.id); - - var myConf = { - split : true, - width : '100%', - height : '100%', - autoScroll : true, - border : true, - header : false, - defaults : { - // applied to each contained panel - containerScroll : true - }, - stateful: true, - // stateId: 'tp1', - stateEvents: ['tabchange'], - getState: function() { - return { - activeTab: this.items.findIndex('id',this.getActiveTab().id) - }; - }, - applyState: function(s) { - this.setActiveTab(s.activeTab); - }, - // activeTab: 0, - items: [ - this.initTree(amdaUI.ExplorerUI.RESRC_TAB.TREE_TYPE), - this.initTree(amdaUI.ExplorerUI.OPE_TAB.TREE_TYPE), - this.initTree(amdaUI.ExplorerUI.JOB_TAB.TREE_TYPE) - ], - tbar : [ - { - xtype : 'combo', - fieldLabel: 'Filter', - labelWidth: 25, - width: 140, - store: explorerModule.filtersStore, - queryMode: 'local', - displayField: 'name', - valueField: 'id', - listeners : { - scope : this, - select: function(combo, records) { - AmdaAction.setCrtFilterId({id : records[0].get('id')}, - function (result, e) - { - var t = e.getTransaction(); - if (e.status) - { - if (result) - { - var explorerModule = myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.explorer.id); - if (explorerModule) - explorerModule.setCrtFilter(); - } - else - Ext.Msg.show( { - title : 'Filter', - msg : 'Cannot apply filter', - modal : true, - icon : Ext.Msg.ERROR, - buttons : Ext.Msg.OK - }); - } - else - { - // FAILURE - Ext.Msg.show({title:'Error System', msg: e.message, icon: Ext.MessageBox.ERROR, buttons: Ext.Msg.OK}); - } - },this); - } - } - }, - { - text: '', - iconCls : 'icon-parameters', - tooltip: { text: 'Edit Filter', align: 'bl-tl' }, - handler: function(t){ - myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.filters.id, true, function (module) { - module.createWindow(); - }); - } - }, - { - text: '', - iconCls : 'icon-remover', - tooltip: { text: 'Reset Filter', align: 'bl-tl' }, - handler: function(t){ - var explorerModule = myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.explorer.id); - explorerModule.resetFilter(); - } - }, '-', - { - xtype: 'displayfield', - fieldLabel: 'SortBy', - width: 40 - }, - { - text: 'Name', - scope : this, - tooltip: { text: 'Sort out AMDA DataBase Data by Mission Name', align: 'bl-tl' }, - pressed: true, - enableToggle : true, - toggleGroup: 'sorting', - handler: function(){ - var tree = Ext.getCmp(amdaUI.ExplorerUI.RESRC_TAB.TREE_ID); - tree.getStore().sort([ - { sorterFn: function(o1, o2){ - if (o1.get('nodeType') !== 'localParam') - return; - - return o1.get('text').toUpperCase() < o2.get('text').toUpperCase() ? -1 : 1; - } } ]); - this.updateFilter(); - } - }, - { - text: 'Target', - scope : this, - tooltip: { text: 'Sort out AMDA DataBase Data by Mission Main Target', align: 'bl-tl' }, - enableToggle : true, - toggleGroup: 'sorting', - handler: function(){ - var tree = Ext.getCmp(amdaUI.ExplorerUI.RESRC_TAB.TREE_ID); - tree.getStore().sort([{ property : 'rank' }]); - this.updateFilter(); - } - } - ] - }; - Ext.apply (this , Ext.apply (arguments, myConf)); - this.callParent(arguments); - }, - - initTree : function(treeType){ - - switch (treeType) { - case amdaUI.ExplorerUI.RESRC_TAB.TREE_TYPE: - treeId = amdaUI.ExplorerUI.RESRC_TAB.TREE_ID; - break; - case amdaUI.ExplorerUI.OPE_TAB.TREE_TYPE: - treeId = amdaUI.ExplorerUI.OPE_TAB.TREE_ID; - break; - case amdaUI.ExplorerUI.JOB_TAB.TREE_TYPE: - treeId = amdaUI.ExplorerUI.JOB_TAB.TREE_ID; - break; - default: - treeId = amdaUI.ExplorerUI.RESRC_TAB.TREE_ID; - break; - } - - var store = Ext.create('Ext.data.TreeStore', { - root: { - expanded: true, - nodeType : treeType - }, - model: 'amdaModel.AmdaNode', - sorters:[{ direction: 'DES' }, - { sorterFn: function(o1, o2){ - if (o1.get('nodeType') !== 'localParam') - return; - - return o1.get('text').toUpperCase() < o2.get('text').toUpperCase() ? -1 : 1; - } }], - listeners: { - beforeload: function(store, operation){ - store.proxy.extraParams = { - nodeType: operation.node.get('nodeType') - }; - } - } - - }); - - var menu = new Ext.menu.Menu(); - - var tree = Ext.create('Ext.tree.Panel', { - id : treeId, - title: treeType, - store: store, - rootVisible: false, - animate: false, - hideHeaders : true, - selModel: Ext.create('Ext.selection.TreeModel', { - // ignoreRightMouseSelection: true, - mode: 'MULTI' - }), - - viewConfig: - { - plugins: - { - ptype: 'treeviewdragdrop', - enableDrag:true, - enableDrop:true, - //TODO - BRE - Wait a fix for drag&drop issue - ddGroup:'explorerTree', - pluginId : 'ddplugin', - isValidDropPoint : function (node, position, dragZone, e, data) - { - if (!node || !data.item) { - return false; - } - - var view = this.view, - targetNode = view.getRecord(node), - draggedRecords = data.records, - dataLength = draggedRecords.length, - ln = draggedRecords.length, - i, record; - - // No drop position, or dragged records: invalid drop point - if (!(targetNode && position && dataLength)) { - return false; - } - - // If the targetNode is within the folder we are dragging - for (i = 0; i < ln; i++) { - record = draggedRecords[i]; - if (record.isNode && record.contains(targetNode)) { - return false; - } - } - - // Respect the allowDrop field on Tree nodes - if (position === 'append' && targetNode.get('allowDrop') === false) { - return false; - } - else if (position != 'append' && targetNode.parentNode.get('allowDrop') === false) { - return false; - } - - // If the target record is in the dragged dataset, then invalid drop - if (Ext.Array.contains(draggedRecords, targetNode)) { - return false; - } - - // - if (dataLength > 1) - return false; - var draggedRecord = draggedRecords[0]; - - // - switch (targetNode.data.nodeType) - { - case 'localParam' : - case 'remoteParam' : - case 'remoteSimuParam' : - case 'myData' : - return false; - default : - if (draggedRecord.data.id == targetNode.data.nodeType+'-treeRootNode') - return false; - if ((position == 'before') && (targetNode.data.id == targetNode.data.nodeType+'-treeRootNode')) - return false; - return (draggedRecord.data.nodeType == targetNode.data.nodeType); - } - return false; - }, - onViewRender : function(view) - { - var me = this; - - view.on('itemupdate', function(record,index,node,opts) - { - var forceHide = false; - var crtRec = record.parentNode; - while (crtRec && !forceHide) - { - if (crtRec.get('filtered')) - forceHide = crtRec.get('filtered'); - crtRec = crtRec.parentNode; - } - tree.setNodesVisibility(record,forceHide); - tree.applyDisableToNode(record); - }); - - view.on('itemadd', function(records,index,node,opts) - { - Ext.each(records,function (rec) - { - tree.applyFilterToNode(rec); - tree.applyDisableToNode(rec); - }); - - }); - - view.on('afteritemexpand', function(record,index,node,opts) - { - var forceHide = false; - var crtRec = record.parentNode; - while (crtRec && !forceHide) - { - if (crtRec.get('filtered')) - forceHide = crtRec.get('filtered'); - crtRec = crtRec.parentNode; - - } - tree.setNodesVisibility(record,forceHide); - tree.applyDisableToNode(record); - }); - - if (me.enableDrag) - { - me.dragZone = Ext.create('Ext.tree.ViewDragZone', { - view: view, - ddGroup: me.dragGroup || me.ddGroup, - dragText: me.dragText, - repairHighlightColor: me.nodeHighlightColor, - repairHighlight: me.nodeHighlightOnRepair - }); - } - - if (me.enableDrop) - { - me.dropZone = Ext.create('Ext.tree.ViewDropZone', { - view: view, - ddGroup: me.dropGroup || me.ddGroup, - allowContainerDrops: me.allowContainerDrops, - appendOnly: me.appendOnly, - allowParentInserts: me.allowParentInserts, - expandDelay: me.expandDelay, - dropHighlightColor: me.nodeHighlightColor, - dropHighlight: me.nodeHighlightOnDrop, - isValidDropPoint : me.isValidDropPoint - }); - } - } - }, - listeners : - { - beforedrop : function(node, data, overModel, dropPosition) - { - var parentId; - switch(dropPosition) - { - case 'append' : - if (overModel.isLeaf()) - parentId = overModel.parentNode.get('id'); - else - parentId = overModel.get('id'); - - if(!overModel.isExpanded() && overModel.isExpandable()) { - myDesktopApp.warningMsg('Please open the folder before node adding'); - return false; - } - break; - case 'before' : - case 'after' : - parentId = overModel.parentNode.get('id'); - break; - } - - Ext.each(data.records, function(rec) - { - rec.renameDD(parentId,function(result) - { - if (result) - { - if (!result.id) - { - Ext.Msg.show({ - title : 'Drop is impossible', - msg : result.error, - buttons : Ext.Msg.OK, - icon : Ext.MessageBox.WARNING - }); - - return false; - } - } - else - { - Ext.Msg.show({ - title : 'Drop is impossible', - msg : 'Cannot connect to the server', - buttons : Ext.Msg.OK, - icon : Ext.MessageBox.WARNING - }); - - return false; - } - - return true; - }); - }); - } - }, - }, - listeners: { - - itemmouseenter: function(view, record, item){ - if(record.get('isParameter')){ - var el = Ext.get(item), - td = el.down('td > div'); - td.setStyle('cursor', 'crosshair'); - } - else - { - var el = Ext.get(item), - td = el.down('td > div'); - td.setStyle('cursor', 'pointer'); - } + extend: 'Ext.tab.Panel', + alias : 'widget.panelExplorer', + + statics: + { + RESRC_TAB : { + TREE_ID:'resourcesTree', + TREE_TYPE:'resources' + }, + OPE_TAB : { + TREE_ID:'operationsTree', + TREE_TYPE:'operations' + }, + JOB_TAB : { + TREE_ID:'jobsTree', + TREE_TYPE:'jobs' }, - itemcontextmenu: function(view, rec, item, index, e){ - // block other events - e.stopEvent(); + CAT_SUFFIX: '-treeBase', + ROOT_SUFFIX: '-treeRootNode', + SUB_ROOT_SUFFIX : 'RootNode', - // unlock selection -// view.ownerCt.getSelectionModel().setLocked(false); - // already selected by default by right click -// view.ownerCt.getSelectionModel().select(rec,true); + ITEM_KIND_ROOT : 'root', + ITEM_KIND_LEAF : 'leaf', + ITEM_KIND_DIRE : 'dire', + ITEM_KIND_PARA : 'para', + ITEM_KIND_MISS : 'miss' + }, - // clear menu items - menu.removeAll(); - var menuItems; + initComponent : function (config) + { + var explorerModule = myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.explorer.id); + + var myConf = { + split : true, + width : '100%', + height : '100%', + autoScroll : true, + border : true, + header : false, + defaults : { + // applied to each contained panel + containerScroll : true + }, + stateful: true, + //stateId: 'tp1', + stateEvents: ['tabchange'], + getState: function() { + return { + activeTab: this.items.findIndex('id',this.getActiveTab().id) + }; + }, + applyState: function(s) { + this.setActiveTab(s.activeTab); + }, + items: [ + this.initTree(amdaUI.ExplorerUI.RESRC_TAB.TREE_TYPE), + this.initTree(amdaUI.ExplorerUI.OPE_TAB.TREE_TYPE), + this.initTree(amdaUI.ExplorerUI.JOB_TAB.TREE_TYPE) + ], + tbar : [ + { + xtype : 'combo', + fieldLabel: 'Filter', + labelWidth: 25, + width: 140, + store: explorerModule.filtersStore, + queryMode: 'local', + displayField: 'name', + valueField: 'id', + listeners : { + scope : this, + select: function(combo, records) { + AmdaAction.setCrtFilterId({id : records[0].get('id')}, + function (result, e) + { + var t = e.getTransaction(); + if (e.status) + { + if (result) + { + var explorerModule = myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.explorer.id); + if (explorerModule) + explorerModule.setCrtFilter(); + } + else + Ext.Msg.show( { + title : 'Filter', + msg : 'Cannot apply filter', + modal : true, + icon : Ext.Msg.ERROR, + buttons : Ext.Msg.OK + }); + } + else + { + // FAILURE + Ext.Msg.show({title:'Error System', msg: e.message, icon: Ext.MessageBox.ERROR, buttons: Ext.Msg.OK}); + } + },this); + } + } + }, + { + text: '', + iconCls : 'icon-parameters', + tooltip: { text: 'Edit Filter', align: 'bl-tl' }, + handler: function(t){ + myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.filters.id, true, function (module) { + module.createWindow(); + }); + } + }, + { + text: '', + iconCls : 'icon-remover', + tooltip: { text: 'Reset Filter', align: 'bl-tl' }, + handler: function(t){ + var explorerModule = myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.explorer.id); + explorerModule.resetFilter(); + } + }, '-', + { + xtype: 'displayfield', + fieldLabel: 'SortBy', + width: 40 + }, + { + text: 'Name', + scope : this, + tooltip: { text: 'Sort out AMDA DataBase Data by Mission Name', align: 'bl-tl' }, + pressed: true, + enableToggle : true, + toggleGroup: 'sorting', + handler: function(){ + var tree = Ext.getCmp(amdaUI.ExplorerUI.RESRC_TAB.TREE_ID); + tree.getStore().sort([ + { sorterFn: function(o1, o2){ + if (o1.get('nodeType') !== 'localParam') + return; - // if it's a single selection - if (view.ownerCt.getSelectionModel().selected.length === 1) { - // get items menu corresponding to right clicked record - menuItems = rec.getContextMenuItems(this); + return o1.get('text').toUpperCase() < o2.get('text').toUpperCase() ? -1 : 1; + } + }]); + this.updateFilter(); + } + }, + { + text: 'Target', + scope : this, + tooltip: {text: 'Sort out AMDA DataBase Data by Mission Main Target', align: 'bl-tl'}, + enableToggle : true, + toggleGroup: 'sorting', + handler: function(){ + var tree = Ext.getCmp(amdaUI.ExplorerUI.RESRC_TAB.TREE_ID); + tree.getStore().sort([{ property : 'rank' }]); + this.updateFilter(); + } + }] + }; + Ext.apply (this , Ext.apply (arguments, myConf)); + this.callParent(arguments); + }, + + initTree : function(treeType) + { + switch (treeType) + { + case amdaUI.ExplorerUI.RESRC_TAB.TREE_TYPE: + treeId = amdaUI.ExplorerUI.RESRC_TAB.TREE_ID; + break; + case amdaUI.ExplorerUI.OPE_TAB.TREE_TYPE: + treeId = amdaUI.ExplorerUI.OPE_TAB.TREE_ID; + break; + case amdaUI.ExplorerUI.JOB_TAB.TREE_TYPE: + treeId = amdaUI.ExplorerUI.JOB_TAB.TREE_ID; + break; + default: + treeId = amdaUI.ExplorerUI.RESRC_TAB.TREE_ID; + break; + } - } else if (view.ownerCt.getSelectionModel().selected.length > 1) { - // get items menu corresponding to right clicked record - menuItems = rec.getContextMenuMultiItems(this); + var store = Ext.create('Ext.data.TreeStore', { + root: { + expanded: true, + nodeType : treeType + }, + model: 'amdaModel.AmdaNode', + sorters:[{ direction: 'DES' }, + { sorterFn: function(o1, o2){ + if (o1.get('nodeType') !== 'localParam') + return; + + return o1.get('text').toUpperCase() < o2.get('text').toUpperCase() ? -1 : 1; + } + }], + listeners: { + beforeload: function(store, operation){ + store.proxy.extraParams = { + nodeType: operation.node.get('nodeType') + }; + } } - // if there's at least one item menu - if (menuItems && menuItems.length){ - // add the items - menu.add(menuItems); - // add listener on right clicked record - var onRecordClick = function (menu, item, e, eOpts) + }); + + var menu = new Ext.menu.Menu(); + + var tree = Ext.create('Ext.tree.Panel', { + id : treeId, + title: treeType, + store: store, + rootVisible: false, + animate: false, + hideHeaders : true, + selModel: Ext.create('Ext.selection.TreeModel', { + // ignoreRightMouseSelection: true, + mode: 'MULTI' + }), + viewConfig: + { + plugins: + { + ptype: 'treeviewdragdrop', + enableDrag:true, + enableDrop:true, + //TODO - BRE - Wait a fix for drag&drop issue + ddGroup:'explorerTree', + pluginId : 'ddplugin', + + isValidDropPoint : function (node, position, dragZone, e, data) { - if (this.myGetOwnerTree().getSelectionModel().isSelected(this)) { - //Dispatch click event to the record - this.onMenuItemClick(menu,item,e); + if (!node || !data.item) { + return false; } - //Remove old click listener - menu.removeListener('click',onRecordClick,this); - }; + var view = this.view, + targetNode = view.getRecord(node), + draggedRecords = data.records, + dataLength = draggedRecords.length, + ln = draggedRecords.length, + i, record; + + // No drop position, or dragged records: invalid drop point + if (!(targetNode && position && dataLength)) { + return false; + } + // If the targetNode is within the folder we are dragging + for (i = 0; i < ln; i++) { + record = draggedRecords[i]; + if (record.isNode && record.contains(targetNode)) { + return false; + } + } + // Respect the allowDrop field on Tree nodes + if (position === 'append' && targetNode.get('allowDrop') === false) { + return false; + } + else if (position != 'append' && targetNode.parentNode.get('allowDrop') === false) { + return false; + } + // If the target record is in the dragged dataset, then invalid drop + if (Ext.Array.contains(draggedRecords, targetNode)) { + return false; + } + // + if (dataLength > 1) + return false; + + var draggedRecord = draggedRecords[0]; + // + switch (targetNode.data.nodeType) + { + case 'localParam' : + case 'remoteParam' : + case 'remoteSimuParam' : + case 'myData' : + return false; + default : + if (draggedRecord.data.id == targetNode.data.nodeType+'-treeRootNode') + return false; + if ((position == 'before') && (targetNode.data.id == targetNode.data.nodeType+'-treeRootNode')) + return false; + return (draggedRecord.data.nodeType == targetNode.data.nodeType); + } + return false; + }, + onViewRender : function(view) + { + var me = this; + + view.on('itemupdate', function(record,index,node,opts) + { + var forceHide = false; + var crtRec = record.parentNode; + while (crtRec && !forceHide) + { + if (crtRec.get('filtered')) + forceHide = crtRec.get('filtered'); + crtRec = crtRec.parentNode; + } + tree.setNodesVisibility(record,forceHide); + tree.applyDisableToNode(record); + }); + + view.on('itemadd', function(records,index,node,opts) + { + Ext.each(records,function (rec) + { + tree.applyFilterToNode(rec); + tree.applyDisableToNode(rec); + }); + }); + + view.on('afteritemexpand', function(record,index,node,opts) + { + var forceHide = false; + var crtRec = record.parentNode; + while (crtRec && !forceHide) + { + if (crtRec.get('filtered')) + forceHide = crtRec.get('filtered'); + crtRec = crtRec.parentNode; - menu.addListener('click',onRecordClick,rec); - // then show menu - menu.showAt(e.getXY()); - } - }, + } + tree.setNodesVisibility(record,forceHide); + tree.applyDisableToNode(record); + }); + + if (me.enableDrag) + { + me.dragZone = Ext.create('Ext.tree.ViewDragZone', { + view: view, + ddGroup: me.dragGroup || me.ddGroup, + dragText: me.dragText, + repairHighlightColor: me.nodeHighlightColor, + repairHighlight: me.nodeHighlightOnRepair + }); + } - itemdblclick: function(view, record, item, index, event){ - event.stopEvent(); - - // first check if it is for SAVE-START-STOP plugin... - if (Ext.PluginManager.getCount() > 0 && - record.get('nodeType') == amdaModel.TimeTableNode.nodeType && record.isLeaf()) { - var zmgr = myDesktopApp.desktop.getDesktopZIndexManager(); - var winActive = zmgr.getActive(); - var winId = winActive.getId(); - if (winId == 'explorer-win') { - zmgr.eachTopDown(function(win) { - var id = win.getId(); - if (id !== 'explorer-win') { - winId = id; - return false; + if (me.enableDrop) + { + me.dropZone = Ext.create('Ext.tree.ViewDropZone', { + view: view, + ddGroup: me.dropGroup || me.ddGroup, + allowContainerDrops: me.allowContainerDrops, + appendOnly: me.appendOnly, + allowParentInserts: me.allowParentInserts, + expandDelay: me.expandDelay, + dropHighlightColor: me.nodeHighlightColor, + dropHighlight: me.nodeHighlightOnDrop, + isValidDropPoint : me.isValidDropPoint + }); + } + } + }, + listeners : + { + beforedrop : function(node, data, overModel, dropPosition) + { + var parentId; + switch(dropPosition) + { + case 'append' : + if (overModel.isLeaf()) + parentId = overModel.parentNode.get('id'); + else + parentId = overModel.get('id'); + + if(!overModel.isExpanded() && overModel.isExpandable()) { + myDesktopApp.warningMsg('Please open the folder before node adding'); + return false; + } + break; + case 'before' : + case 'after' : + parentId = overModel.parentNode.get('id'); + break; } - }); + + Ext.each(data.records, function(rec) + { + rec.renameDD(parentId,function(result) + { + if (result) + { + if (!result.id) + { + Ext.Msg.show({ + title : 'Drop is impossible', + msg : result.error, + buttons : Ext.Msg.OK, + icon : Ext.MessageBox.WARNING + }); + + return false; + } + } + else + { + Ext.Msg.show({ + title : 'Drop is impossible', + msg : 'Cannot connect to the server', + buttons : Ext.Msg.OK, + icon : Ext.MessageBox.WARNING + }); + + return false; + } + + return true; + }); + }); + } } - } + }, + listeners: + { + itemmouseenter: function(view, record, item){ + if(record.get('isParameter')){ + var el = Ext.get(item), + td = el.down('td > div'); + td.setStyle('cursor', 'crosshair'); + } + else + { + var el = Ext.get(item), + td = el.down('td > div'); + td.setStyle('cursor', 'pointer'); + } + }, + + itemcontextmenu: function(view, rec, item, index, e){ + // block other events + e.stopEvent(); + + // clear menu items + menu.removeAll(); + var menuItems; + + // if it's a single selection + if (view.ownerCt.getSelectionModel().selected.length === 1) { + // get items menu corresponding to right clicked record + menuItems = rec.getContextMenuItems(this); + + } else if (view.ownerCt.getSelectionModel().selected.length > 1) { + // get items menu corresponding to right clicked record + menuItems = rec.getContextMenuMultiItems(this); + } + // if there's at least one item menu + if (menuItems && menuItems.length){ + // add the items + menu.add(menuItems); + // add listener on right clicked record + var onRecordClick = function (menu, item, e, eOpts) + { + if (this.myGetOwnerTree().getSelectionModel().isSelected(this)) { + //Dispatch click event to the record + this.onMenuItemClick(menu,item,e); + } + //Remove old click listener + menu.removeListener('click',onRecordClick,this); + }; + + menu.addListener('click',onRecordClick,rec); + // then show menu + menu.showAt(e.getXY()); + } + }, + + itemdblclick: function(view, record, item, index, event){ + event.stopEvent(); + // first check if it is for SAVE-START-STOP plugin... + if (Ext.PluginManager.getCount() > 0 && + record.get('nodeType') == amdaModel.TimeTableNode.nodeType && record.isLeaf()) { + var zmgr = myDesktopApp.desktop.getDesktopZIndexManager(); + var winActive = zmgr.getActive(); + var winId = winActive.getId(); + if (winId == 'explorer-win') { + zmgr.eachTopDown(function(win) { + var id = win.getId(); + if (id !== 'explorer-win') { + winId = id; + return false; + } + }); + } + } + + if (record.get('nodeType') == 'remoteParam' && !record.isLeaf() + && !record.get('isParameter')) { + myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.interop.id, true, function (module) { + module.createWindow(record.getBaseId()); + }); + } + + if (record.isLeaf() || record.data.isParameter) + switch (record.get('nodeType')) + { + case 'myData' : + case 'myDataParam' : + case 'derivedParam' : + case 'timeTable' : + case 'sharedtimeTable' : + case 'sharedcatalog' : + case 'catalog' : + case 'request' : + case 'condition' : + record.editLeaf(); + break; + case 'localParam' : + case 'remoteParam': + case 'remoteSimuParam': + record.createAlias(record); + break; + case 'bkgWorks' : + if (!record.get('object')) { + AmdaAction.getObject(record.get('id'), record.get('nodeType'), record.getObjectCallback, record); + } + else { + if (record.get('status') == 'done') { + var isInteractive = false; + var isNewTab = true; + record.editNode(isNewTab, isInteractive); + } + else { + myDesktopApp.infoMsg('Job Status: ' + record.get('status')); + } + } + break; + } + }, + + beforeselect: function(view,node,index,options){ + // if there's at least one node already selected + if(view.selected.length + //AND (the node which is beeing selected has a different nodeType than the first selected node OR the first selected node isn't a leaf + && ( node.get('nodeType')!== view.selected.items[0].get('nodeType') || !view.selected.items[0].isLeaf()) + // OR the node which is beeing selected has no nodeType OR it isn't a leaf OR + || !node.get('nodeType') || !node.isLeaf() + ){ + // clear old selection + view.deselectAll(); + } + }, + + afterrender: function(comp){ + var view = comp.getView(); + view.tip = Ext.create('Ext.tip.ToolTip', { + // The overall target element. + target: view.el, + // Each grid row causes its own seperate show and hide. + delegate: view.itemSelector, + dismissDelay : 0, + // showDelay: 100, + // anchor: 'left', + // Moving within the row should not hide the tip. + trackMouse: true, + autoRender: true, + listeners: { + // Change content dynamically depending on which element triggered the show. + beforeshow: function updateTipBody(tip) { + if (view.getRecord(tip.triggerElement)) { + var info = view.getRecord(tip.triggerElement).get('info'); + if (!info || info == '') { + tip.addCls('hide'); + } + else { + tip.removeCls('hide'); + tip.update(info); + } + } + } + } + }); + }, + // if remote base is empty - open interoperability module + itemexpand: function(node) { + if ( node.get('nodeType') == amdaModel.RemoteParamNode.nodeType + && node.getDepth() == 3 && !node.hasChildNodes()) { + node.addData(); + } + }, + scope: this + }, - if (record.get('nodeType') == 'remoteParam' && !record.isLeaf() - && !record.get('isParameter')) { - myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.interop.id, true, function (module) { - module.createWindow(record.getBaseId()); - }); - } + hideHeaders: true, + // must define a column with a field to enable editor + columns: [{ + xtype : 'treetoolcolumn', + text : 'Name', + flex : 1, + dataIndex: 'text', + tool: 'info', // this references the "tools" object on the prototype + toolHandler: function(view, cell, recordIndex, cellIndex, e) { + var tooltype = e.target.getAttribute("tooltype"); + var record = view.store.getAt(recordIndex); + switch (tooltype) + { + case 'info' : + myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.info.id, true, function (module) { + module.createWindow(record.get('help'), record.get('info')); + }); + break; + } + }, + toolIsVisible : function(record) { - if (record.isLeaf() || record.data.isParameter) - switch (record.get('nodeType')) - { - case 'myData' : - case 'myDataParam' : - case 'derivedParam' : - case 'timeTable' : - case 'sharedtimeTable' : - case 'sharedcatalog' : - case 'catalog' : - case 'request' : - case 'condition' : - record.editLeaf(); - break; - case 'localParam' : - case 'remoteParam': - case 'remoteSimuParam': - record.createAlias(record); - break; - case 'bkgWorks' : - if (!record.get('object')) { - AmdaAction.getObject(record.get('id'), record.get('nodeType'), record.getObjectCallback, record); + switch (record.get('nodeType')) + { + case 'localParam' : + case 'remoteParam' : + case 'remoteSimuParam' : + + return record.get('help') != ''; + } + return false; + }, + field: { + validFlag: false, + validator : function(value) { + // get explorerModule + var explModule = myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.explorer.id); + var explUI = explModule.getUiContent(); + var activeTreePanel = explUI.getActiveTab(); + + var editedNode = activeTreePanel.getSelectionModel().selected.items[0]; + if (editedNode) { + if (!editedNode.get('id') && value === amdaModel.AmdaNode.NEW_DIR_NAME){ + return false; + } else { + return this.validFlag; + } + } else { + return true; + } + }, + listeners: { + change : function( field, newValue, oldValue, eOpts ) + { + var explModule = myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.explorer.id); + var explUI = explModule.getUiContent(); + var activeTreePanel = explUI.getActiveTab(); + + var editedNode = activeTreePanel.getSelectionModel().selected.items[0]; + if (editedNode) { + editedNode.isValidName(newValue, function (res) { + if (!res) + { + field.validFlag = 'Error during object validation'; + field.validate(); + return; + } + if (!res.valid) + { + if (res.error) + { + field.validFlag = res.error; + field.validate(); + return; + } + else + { + field.validFlag = 'Invalid object name'; + field.validate(); + return; + } + } + + field.validFlag = true; + field.validate(); + }); + } + } + }, + scope: this } - else { - if (record.get('status') == 'done') { - var isInteractive = false; - var isNewTab = true; - record.editNode(isNewTab, isInteractive); + }], + //add our custom editor plugin + plugins: [ new MyTreeEditor({ + pluginId: 'treeEditor', + listeners: { + 'canceledit' : function(editor, context) { + if (editor && editor.startValue===amdaModel.AmdaNode.NEW_DIR_NAME) { + context.record.remove(true); + } } - else { - myDesktopApp.infoMsg('Job Status: ' + record.get('status')); + } + })], + + setNodesVisibility : function(node,forceHide) + { + var isFiltered = node.get('filtered'); + + for (var i = 0; i < node.childNodes.length; i++) + this.setNodesVisibility(node.childNodes[i],forceHide || isFiltered); + + this.setNodeVisibility(node,!(forceHide || isFiltered)); + }, + + setNodeVisibility : function(node,isVisible) + { + var record = store.getNodeById(node.internalId); + var viewNode = Ext.fly(tree.getView().getNode(record)); + if (viewNode) + { + viewNode.setVisibilityMode(Ext.Element.DISPLAY); + if (isVisible) + { + viewNode.show(); + this.applyDisableToNode(record); } + else + viewNode.hide(); } - break; - } - }, - beforeselect: function(view,node,index,options){ - // if there's at least one node already selected - if(view.selected.length - //AND (the node which is beeing selected has a different nodeType than the first selected node OR the first selected node isn't a leaf - && ( node.get('nodeType')!== view.selected.items[0].get('nodeType') || !view.selected.items[0].isLeaf()) - // OR the node which is beeing selected has no nodeType OR it isn't a leaf OR - || !node.get('nodeType') || !node.isLeaf() - ){ - // clear old selection - view.deselectAll(); - } - }, -// Already done in ExtJS 4.2.4 selection model -// itemmousedown: function(tree,rec,item,index,event,options){ -// if(event.button===2){ -// // if the right clicked item is already selected -// if (tree.getSelectionModel().isSelected(rec)) { -// // lock selection to prevent the selection modification by the right click -// tree.getSelectionModel().setLocked(true); -// } -// } -// }, - afterrender: function(comp){ - var view = comp.getView(); - view.tip = Ext.create('Ext.tip.ToolTip', { - // The overall target element. - target: view.el, - // Each grid row causes its own seperate show and hide. - delegate: view.itemSelector, - dismissDelay : 0, - // showDelay: 100, - // anchor: 'left', - // Moving within the row should not hide the tip. - trackMouse: true, - autoRender: true, - listeners: { - // Change content dynamically depending on which element triggered the show. - beforeshow: function updateTipBody(tip) { - if (view.getRecord(tip.triggerElement)) { - var info = view.getRecord(tip.triggerElement).get('info'); - if (!info || info == '') { - tip.addCls('hide'); - } - else { - tip.removeCls('hide'); - tip.update(info); - } - } - } - } + }, + + applyFilterToNode : function(node) + { + if (!node) + return; + + var filter = myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.explorer.id).filter; + + switch (node.get('nodeType')) + { + case 'localParam' : + if (!filter || !filter['param']) + { + //no filter applied + node.set('filtered',false); + return; + } + var pos = node.get('depth') - 3; //depth from local param root node + if (pos < 0 || pos > 2) + { + node.set('filtered',false); + return; + } + var isFiltered = true; + for (var i = 0; i < filter['param'].length; i++) + { + s = filter['param'][i].split(';'); + if (node.get('id') == s[pos]) + { + isFiltered = false; + break; + } + } + node.set('filtered',isFiltered); + break; + + case 'remoteSimuParam' : + if (!filter || !filter['simu'] ) + { + //no filter applied + node.set('filtered',false); + return; + } + var pos = node.get('depth') - 3; //depth from remote param root node + + if (pos < 0 || pos > 5) + { + node.set('filtered',false); + return; + } + var isFiltered = true; + + for (var i = 0; i < filter['simu'].length; i++) + { + s = filter['simu'][i].split(';'); + + if (node.get('id') == s[pos]) + { + isFiltered = false; + break; + } + } + node.set('filtered',isFiltered); + break; + /*case 'alias' : + if (!this.localParamFilter.result || this.localParamFilter.id == "" || + !node.isLeaf()) + { + //no filter applied + node.set('filtered',false); + return; + } + var crtParam = node.get('id'); + crtParam = crtParam.replace('alias_',''); + crtParam = crtParam.replace(/_/g,':'); + var isFiltered = true; + for (var i = 0; i < this.localParamFilter.result.length; i++) + { + s = this.localParamFilter.result[i].split(';'); + console.log(s[2]); + if (crtParam == s[2]) + { + isFiltered = false; + break; + } + } + node.set('filtered',isFiltered); + break;*/ + default : + return; + } + }, + + applyFilterToNodes : function(node) + { + node.eachChild(function (child){ + tree.applyFilterToNodes(child); + }); + tree.applyFilterToNode(node); + }, + + applyDisableToNode : function(node) + { + var crtNode = node; + var disable = false; + + do + { + if (crtNode.get('disable')) + { + disable = true; + break; + } + crtNode = crtNode.parentNode; + } while (crtNode); + + + var viewNode = Ext.fly(tree.getView().getNode(node)); + if (disable) + { + node.set('disable',true); + viewNode.setStyle('opacity',0.5); + } + } }); - }, - // if remote base is empty - open interoperability module - itemexpand: function(node) { - if ( node.get('nodeType') == amdaModel.RemoteParamNode.nodeType - && node.getDepth() == 3 && !node.hasChildNodes()) { - node.addData(); - } - }, - scope: this - }, - hideHeaders: true, - // must define a column with a field to enable editor - columns: [{ - xtype : 'treetoolcolumn', - text : 'Name', - flex : 1, - dataIndex: 'text', - tool: 'info', // this references the "tools" object on the prototype - toolHandler: function(view, cell, recordIndex, cellIndex, e) { - var tooltype = e.target.getAttribute("tooltype"); - var record = view.store.getAt(recordIndex); - switch (tooltype) - { - case 'info' : - myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.info.id, true, function (module) { - module.createWindow(record.get('help'), record.get('info')); - }); - break; - } - }, - toolIsVisible : function(record) { - - switch (record.get('nodeType')) - { - case 'localParam' : - case 'remoteParam' : - case 'remoteSimuParam' : - - return record.get('help') != ''; - } - return false; - }, - field: { - validFlag: false, - validator : function(value) { - // get explorerModule - var explModule = myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.explorer.id); - var explUI = explModule.getUiContent(); - var activeTreePanel = explUI.getActiveTab(); - - var editedNode = activeTreePanel.getSelectionModel().selected.items[0]; - if (editedNode) { - if (!editedNode.get('id') && value === amdaModel.AmdaNode.NEW_DIR_NAME){ - return false; - } else { - return this.validFlag; - } - } else { - return true; - } - }, - listeners: { - change : function( field, newValue, oldValue, eOpts ) - { - var explModule = myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.explorer.id); - var explUI = explModule.getUiContent(); - var activeTreePanel = explUI.getActiveTab(); - - var editedNode = activeTreePanel.getSelectionModel().selected.items[0]; - if (editedNode) { - editedNode.isValidName(newValue, function (res) { - if (!res) - { - field.validFlag = 'Error during object validation'; - field.validate(); - return; - } - - if (!res.valid) - { - if (res.error) - { - field.validFlag = res.error; - field.validate(); - return; - } - else - { - field.validFlag = 'Invalid object name'; - field.validate(); - return; - } - } - - field.validFlag = true; - field.validate(); - }); - } - } - }, - scope: this - } - }], - //add our custom editor plugin - plugins: [new MyTreeEditor({ - pluginId: 'treeEditor', - listeners: { - 'canceledit' : function(editor, context) { - if (editor && editor.startValue===amdaModel.AmdaNode.NEW_DIR_NAME) { - context.record.remove(true); - } - } - - }})], - - setNodesVisibility : function(node,forceHide) - { - var isFiltered = node.get('filtered'); - - for (var i = 0; i < node.childNodes.length; i++) - this.setNodesVisibility(node.childNodes[i],forceHide || isFiltered); - - this.setNodeVisibility(node,!(forceHide || isFiltered)); - }, - - setNodeVisibility : function(node,isVisible) - { - var record = store.getNodeById(node.internalId); - var viewNode = Ext.fly(tree.getView().getNode(record)); - if (viewNode) - { - viewNode.setVisibilityMode(Ext.Element.DISPLAY); - if (isVisible) - { - viewNode.show(); - this.applyDisableToNode(record); - } - else - viewNode.hide(); - } - }, - - applyFilterToNode : function(node) - { - if (!node) - return; - - var filter = myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.explorer.id).filter; - - switch (node.get('nodeType')) - { - case 'localParam' : - if (!filter || !filter['param']) - { - //no filter applied - node.set('filtered',false); - return; - } - var pos = node.get('depth') - 3; //depth from local param root node - if (pos < 0 || pos > 2) - { - node.set('filtered',false); - return; - } - var isFiltered = true; - for (var i = 0; i < filter['param'].length; i++) - { - s = filter['param'][i].split(';'); - if (node.get('id') == s[pos]) - { - isFiltered = false; - break; - } - } - node.set('filtered',isFiltered); - break; - case 'remoteSimuParam' : - - if (!filter || !filter['simu'] ) - { - //no filter applied - node.set('filtered',false); - return; - } - - var pos = node.get('depth') - 3; //depth from remote param root node - - if (pos < 0 || pos > 5) - { - node.set('filtered',false); - return; - } - - var isFiltered = true; - - for (var i = 0; i < filter['simu'].length; i++) - { - s = filter['simu'][i].split(';'); - - if (node.get('id') == s[pos]) - { - isFiltered = false; - break; - } - } - node.set('filtered',isFiltered); - break; - /*case 'alias' : - if (!this.localParamFilter.result || this.localParamFilter.id == "" || - !node.isLeaf()) - { - //no filter applied - node.set('filtered',false); - return; - } - var crtParam = node.get('id'); - crtParam = crtParam.replace('alias_',''); - crtParam = crtParam.replace(/_/g,':'); - var isFiltered = true; - for (var i = 0; i < this.localParamFilter.result.length; i++) - { - s = this.localParamFilter.result[i].split(';'); - console.log(s[2]); - if (crtParam == s[2]) - { - isFiltered = false; - break; - } - } - node.set('filtered',isFiltered); - break;*/ - default : - return; - } - }, - - applyFilterToNodes : function(node) - { - node.eachChild(function (child){ - tree.applyFilterToNodes(child); - }); - tree.applyFilterToNode(node); - }, - - applyDisableToNode : function(node) - { - var crtNode = node; - var disable = false; - - do - { - if (crtNode.get('disable')) - { - disable = true; - break; - } - crtNode = crtNode.parentNode; - } while (crtNode); - - - var viewNode = Ext.fly(tree.getView().getNode(node)); - if (disable) - { - node.set('disable',true); - viewNode.setStyle('opacity',0.5); - } - } - }); - - tree.addEvents('edition'); - - - - return tree; - }, - - updateFilter : function() - { - var filter = myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.explorer.id).filter; - - var keys = []; - for (var f in filter) { - if (hasOwnProperty.call(filter, f)) - keys.push(f); - } - - var tree = this.query('#'+amdaUI.ExplorerUI.RESRC_TAB.TREE_ID)[0]; - tree.getView().refresh(); - - for (var i = 0; i < keys.length; i++) - { - if (keys[i] == "_empty_") - continue; + tree.addEvents('edition'); + + return tree; + }, - switch (keys[i]) + updateFilter : function() { - case 'param' : - - //apply filter to local datasets - var localNode = tree.getRootNode().findChild('id','myLocalData-treeRootNode',true); - tree.applyFilterToNodes(localNode); - tree.setNodesVisibility(localNode,false); - tree.applyDisableToNode(localNode); - - //apply filter to aliases - var aliasNode = tree.getRootNode().findChild('id','alias-treeRootNode',true); - tree.applyFilterToNodes(aliasNode); - tree.setNodesVisibility(aliasNode,false); - tree.applyDisableToNode(aliasNode); - break; - - case 'simu' : - //apply filter to simulation datasets (in remote data) - var remoteNode = tree.getRootNode().findChild('id','myRemoteSimuData-treeRootNode',true); - tree.applyFilterToNodes(remoteNode); - tree.setNodesVisibility(remoteNode,false); - tree.applyDisableToNode(remoteNode); - break; - } - } + var filter = myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.explorer.id).filter; - this.dockedItems.getAt(1).items.items[0].select(filter['name']); - } + var keys = []; + for (var f in filter) { + if (hasOwnProperty.call(filter, f)) + keys.push(f); + } + + var tree = this.query('#'+amdaUI.ExplorerUI.RESRC_TAB.TREE_ID)[0]; + tree.getView().refresh(); + + for (var i = 0; i < keys.length; i++) + { + if (keys[i] == "_empty_") + continue; + switch (keys[i]) + { + case 'param' : + //apply filter to local datasets + var localNode = tree.getRootNode().findChild('id','myLocalData-treeRootNode',true); + tree.applyFilterToNodes(localNode); + tree.setNodesVisibility(localNode,false); + tree.applyDisableToNode(localNode); + + //apply filter to aliases + var aliasNode = tree.getRootNode().findChild('id','alias-treeRootNode',true); + tree.applyFilterToNodes(aliasNode); + tree.setNodesVisibility(aliasNode,false); + tree.applyDisableToNode(aliasNode); + break; + + case 'simu' : + //apply filter to simulation datasets (in remote data) + var remoteNode = tree.getRootNode().findChild('id','myRemoteSimuData-treeRootNode',true); + tree.applyFilterToNodes(remoteNode); + tree.setNodesVisibility(remoteNode,false); + tree.applyDisableToNode(remoteNode); + break; + } + } + + this.dockedItems.getAt(1).items.items[0].select(filter['name']); + } }); +// MyTreeEditor Ext.define( 'MyTreeEditor', { - extend: 'Ext.grid.plugin.CellEditing', - alias: 'editing.treeeditor', - - // initialization method of plugin - init: function(cmp) { - var me = this; - me.hostCmp = cmp; - // on parent event - me.hostCmp.on({ - // on edition event - edition : { - delay: 50, - fn : function(view, record, item, index, e){ - view.getHeaderAtIndex(0).field.validFlag = 'Not modified'; - // call the start edition method - me.startEdit(record, view.getHeaderAtIndex(0)); - }, - scope: me - } - }); - me.callParent(arguments); - }, - - /** - * Cancel any active editing. - */ - cancelEdit: function() { - var me = this, - activeEd = me.getActiveEditor(), - viewEl = me.grid.getView().getEl(me.getActiveColumn()); - - me.setActiveEditor(null); - me.setActiveColumn(null); - me.setActiveRecord(null); - if (activeEd) { - activeEd.cancelEdit(); - viewEl.focus(); - this.fireEvent('canceledit', activeEd, me.context); - } - }, - - /** - * overwrite the initEditTriggers to disable edition on click/dblclick - * and to add custom - */ - initEditTriggers: function() { - - var me = this, - view = me.view; - - me.on({ - edit: function(editor,event){ - // if there is a modification - if (event.originalValue !== event.value) { - // delegate rename action on model - event.record.rename(event.value,function(result){ - // if a result has been returned : success - if(result) { - // delegate commit action to delete modification flag - event.record.commit(); - var rec = event.record.data; - // in case of directory - if (!rec.leaf){ - // set folder's ID returned by server - rec.id = result.id; - } - } else { // in case of transaction error - // reset originalValue - event.record.value = event.originalValue; - event.record.get('text') = event.originalValue; - event.record.commit(); - } - }); - } - - } - }); - - // enable Enter key and Esc Key - view.on('render', function() { - me.keyNav = Ext.create('Ext.util.KeyNav', view.el, { - enter: me.onEnterKey, - esc: me.onEscKey, - scope: me - }); - }, me, { single: true }); - }, - - //overwrite the getEditing context because we do not need the rowId - getEditingContext: function(record, columnHeader) { - var me = this, - grid = me.grid, - store = grid.store, - colIdx, - view = grid.getView(), - value; - - // getting colIdx and real columnHeader - if (Ext.isNumber(columnHeader)) { - colIdx = columnHeader; - columnHeader = grid.headerCt.getHeaderAtIndex(colIdx); - } else { - colIdx = columnHeader.getIndex(); - } - // getting current value - value = record.get(columnHeader.dataIndex); - - // return editing context - return { - grid: grid, - record: record, - field: columnHeader.dataIndex, - value: value, - column: columnHeader, - colIdx: colIdx, - view: columnHeader.getOwnerHeaderCt().view - }; - } -} ); + extend: 'Ext.grid.plugin.CellEditing', + alias: 'editing.treeeditor', + + // initialization method of plugin + init: function(cmp) { + var me = this; + me.hostCmp = cmp; + // on parent event + me.hostCmp.on({ + // on edition event + edition : { + delay: 50, + fn : function(view, record, item, index, e){ + view.getHeaderAtIndex(0).field.validFlag = 'Not modified'; + // call the start edition method + me.startEdit(record, view.getHeaderAtIndex(0)); + }, + scope: me + } + }); + me.callParent(arguments); + }, + + /** + * Cancel any active editing. + */ + cancelEdit: function() { + var me = this, + activeEd = me.getActiveEditor(), + viewEl = me.grid.getView().getEl(me.getActiveColumn()); + + me.setActiveEditor(null); + me.setActiveColumn(null); + me.setActiveRecord(null); + if (activeEd) { + activeEd.cancelEdit(); + viewEl.focus(); + this.fireEvent('canceledit', activeEd, me.context); + } + }, + + /** + * overwrite the initEditTriggers to disable edition on click/dblclick + * and to add custom + */ + initEditTriggers: function() + { + var me = this, + view = me.view; + + me.on({ + edit: function(editor,event){ + // if there is a modification + if (event.originalValue !== event.value) { + // delegate rename action on model + event.record.rename(event.value,function(result){ + // if a result has been returned : success + if(result) { + // delegate commit action to delete modification flag + event.record.commit(); + var rec = event.record.data; + // in case of directory + if (!rec.leaf){ + // set folder's ID returned by server + rec.id = result.id; + } + } else { // in case of transaction error + // reset originalValue + event.record.value = event.originalValue; + event.record.get('text') = event.originalValue; + event.record.commit(); + } + }); + } + } + }); + + // enable Enter key and Esc Key + view.on('render', function() { + me.keyNav = Ext.create('Ext.util.KeyNav', view.el, { + enter: me.onEnterKey, + esc: me.onEscKey, + scope: me + }); + }, me, { single: true }); + }, + //overwrite the getEditing context because we do not need the rowId + getEditingContext: function(record, columnHeader) { + var me = this, + grid = me.grid, + store = grid.store, + colIdx, + view = grid.getView(), + value; + + // getting colIdx and real columnHeader + if (Ext.isNumber(columnHeader)) { + colIdx = columnHeader; + columnHeader = grid.headerCt.getHeaderAtIndex(colIdx); + } else { + colIdx = columnHeader.getIndex(); + } + // getting current value + value = record.get(columnHeader.dataIndex); + + // return editing context + return { + grid: grid, + record: record, + field: columnHeader.dataIndex, + value: value, + column: columnHeader, + colIdx: colIdx, + view: columnHeader.getOwnerHeaderCt().view + }; + } +}); diff --git a/js/app/views/ParamsMgrUI.js b/js/app/views/ParamsMgrUI.js index 25820a2..2c93ce2 100644 --- a/js/app/views/ParamsMgrUI.js +++ b/js/app/views/ParamsMgrUI.js @@ -1,423 +1,418 @@ /** * Project : AMDA-NG - * Name : amdaUI.ParamsMgrUI - * @class : + * Name : ParamsMgrUI.js + * @class amdaUI.ParamsMgrUI * @extends Ext.Panel.Panel * @brief - * @author Elena - * @version $Id: ParamsMgrUI.js 1871 2013-11-22 13:54:17Z elena $ - ****************************************************************************** - * FT Id : Date : Name - Description - ****************************************************************************** - * + * @author Elena */ -Ext.define('amdaUI.ParamsMgrUI', { - extend: 'Ext.panel.Panel', - - alias: 'widget.paramsMgrPanel', - - baseId : null, - srcTree : null, - destTree : null, +Ext.define('amdaUI.ParamsMgrUI',{ + extend: 'Ext.panel.Panel', + alias: 'widget.paramsMgrPanel', + + baseId : null, + srcTree : null, + destTree : null, + //TODO where keep this (==baseId) description ? Global variable? + basesNames : ['CDAWEB', 'THEMIS', 'MAPSKP'], + bases : [], - hasModifs: false, - - //TODO where keep this (==baseId) description ? Global variable? - basesNames : ['VEXGRAZ', 'CDAWEB', 'THEMIS', 'MAPSKP'], - bases : [], - - configSrc : {title: 'source', enableDrag : true, enableDrop: false}, - configDest : {title: 'destination', enableDrag : false, enableDrop:true}, + configSrc : {title: 'source', enableDrag : true, enableDrop: false}, + configDest : {title: 'destination', enableDrag : false, enableDrop:true}, + + constructor: function(config){ + this.init(config); + this.callParent(arguments); + }, - - constructor: function(config) { - this.init(config); - this.callParent(arguments); - }, - - /* - * Load new data bases trees : source & destination - */ - loadTrees : function(button, pressed) { - if (pressed) { - this.baseId = button.text; - this.loadTree('source'); - this.loadTree('destination'); - } - }, - - /* - * Real Load data base tree - */ - loadTree : function(type) { - - var title = this.baseId; - if (type == 'source') var store = this.srcTree.getStore(); - else { - var store = this.destTree.getStore(); - title = 'My '+ this.baseId; - } - // or RELOAD? - var root = store.getRootNode(); - store.load({ - node: root, - params: { - nodeType: type, - baseId: this.baseId - } - }); - root.set('text', title); - }, - -/* - * Store and tree creation - */ - initTree: function(config) { - - if (this.baseId) { - var title = config.title == 'source' ? this.baseId : 'My '+ this.baseId; - } - else var title = config.title; - - var selMode = config.title == 'source' ? {mode: 'SIMPLE'} : {mode: 'SINGLE'}; - - var store = Ext.create('Ext.data.TreeStore', { - model: 'amdaModel.AmdaNode', - root: { - text: title, - //TODO if use the same logic for localParam? - nodeType : 'remoteParam', - expanded: true - }, - listeners: { - scope : this, - beforeload: function(store, operation){ - store.proxy.extraParams = { - nodeType: config.title, - baseId: this.baseId - } - }} - }); + /* + * Load new data bases trees : source & destination + */ + loadTrees : function(button, pressed){ + if (pressed) { + this.baseId = button.text; + this.loadTree('source'); + this.loadTree('destination'); + } + }, - var menu = new Ext.menu.Menu({ - items: [{ - text: 'Delete Data' - }], - listeners: { - scope : this, - click : this.deleteMulti - } - }); + /* + * Real Load data base tree + */ + loadTree : function(type){ + var title = this.baseId; + if (type == 'source'){ + var store = this.srcTree.getStore(); + } + else { + var store = this.destTree.getStore(); + title = 'My '+ this.baseId; + } + // or RELOAD? + var root = store.getRootNode(); + store.load({ + node: root, + params: { + nodeType: type, + baseId: this.baseId + } + }); + root.set('text', title); + }, - var tree = Ext.create('Ext.tree.Panel', { - store: store, - id : config.title, - flex: 1, - height: 400, - selModel: selMode, //{mode: 'SIMPLE'}, - viewConfig: { - plugins: { - ptype: 'treeviewdragdrop', - allowContainerDrops : true, - enableDrag: config.enableDrag, - enableDrop: config.enableDrop, - //TODO dataset drag/drop by parameters SELECTION - dragText : "{0} selected parameter{1}", - expandDelay : 100, - ddGroup : "RemoteTreeDD", - isValidDropPoint : function(){ - return true; - }, - onContainerOver : function() { - return this.dropAllowed; - - }, - onNodeOver : function() { - return this.dropAllowed; - }, - onNodeDrop : function(nodeData, dd, e, data) { - if (!data.records) - return false; - Ext.Array.each(data.records, this.onDrop, this); -// deselect source tree selection - data.view.getSelectionModel().deselectAll(); - return true; - }, - onContainerDrop : function(dd, e, data) { - - if (!data.records) - return false; - Ext.Array.each(data.records, this.onDrop, this); -// deselect source tree selection - data.view.getSelectionModel().deselectAll(); - return true; - }, + /* + * Store and tree creation + */ + initTree: function(config){ + if (this.baseId){ + var title = config.title == 'source' ? this.baseId : 'My '+ this.baseId; + } + else + var title = config.title; + + var selMode = config.title == 'source' ? {mode: 'SIMPLE'} : {mode: 'SINGLE'}; - onDrop : function(record) { - - var root = tree.getRootNode(); - var srcNode = record; - var id = srcNode.get('id'); - - // Check if node exists already at destination - if (root.findChild('id',id, true)) return; - - var ddNode = srcNode; - // Array of parent nodes description - var Arr = []; - - while (!ddNode.isRoot()) { - ddNode = ddNode.parentNode; - Arr.push(ddNode); + var store = Ext.create('Ext.data.TreeStore', { + model: 'amdaModel.AmdaNode', + root: { + text: title, + nodeType : 'remoteParam', + expanded: true + }, + listeners: { + scope : this, + beforeload: function(store, operation){ + store.proxy.extraParams = { + nodeType: config.title, + baseId: this.baseId + } + }} + }); + + var menu = new Ext.menu.Menu({ + items: [{ + text: 'Delete Data' + }], + listeners: { + scope : this, + click : this.deleteMulti } - // start with the highest node - Arr.reverse(); - - // create parent nodes if they do not exist - var parentNode = root; - Ext.Array.each(Arr,function(srcNode, index){ - if (index > 0) { - var nodeId = srcNode.get('id'); - var node = root.findChild('id',nodeId, true); - if (!node) { - node = srcNode.copy(); - parentNode.appendChild(node); - parentNode.expand(); - node.setDirty(); - } - parentNode = node; - } - }); - - // Add new node to correct location - parentNode.expand(!this.isDataSet, function(res){ - var newNode = srcNode.copy(); - parentNode.appendChild(newNode); - //to sync treeStore - newNode.setDirty(); - //expand the whole subtree of added node - tree.selectPath(newNode.getPath( 'id', '|'), 'id', '|'); - }); - return true; - }, - - onViewRender : function(view) { - var me = this; + }); + + var tree = Ext.create('Ext.tree.Panel', { + store: store, + id : config.title, + flex: 1, + height: 500, + selModel: selMode, //{mode: 'SIMPLE'}, + viewConfig: { + plugins:{ + ptype: 'treeviewdragdrop', + allowContainerDrops : true, + enableDrag: config.enableDrag, + enableDrop: config.enableDrop, + //TODO dataset drag/drop by parameters SELECTION + dragText : "{0} selected parameter{1}", + expandDelay : 100, + ddGroup : "RemoteTreeDD", + + isValidDropPoint : function(){ + return true; + }, + + onContainerOver : function() { + return this.dropAllowed; + }, + + onNodeOver : function() { + return this.dropAllowed; + }, + + onNodeDrop : function(nodeData, dd, e, data){ + if (!data.records) + return false; + Ext.Array.each(data.records, this.onDrop, this); + // deselect source tree selection + data.view.getSelectionModel().deselectAll(); + + return true; + }, + + onContainerDrop : function(dd, e, data){ + if (!data.records) + return false; + Ext.Array.each(data.records, this.onDrop, this); + // deselect source tree selection + data.view.getSelectionModel().deselectAll(); + + return true; + }, + + onDrop : function(record) { + var root = tree.getRootNode(); + var srcNode = record; + var id = srcNode.get('id'); + // Check if node exists already at destination + if (root.findChild('id',id, true)) { + myDesktopApp.infoMsg('This parameter exists already in your treee'); + return; + } + var ddNode = srcNode; + // Array of parent nodes description + var Arr = []; + while (!ddNode.isRoot()) { + ddNode = ddNode.parentNode; + Arr.push(ddNode); + } + // start with the highest node + Arr.reverse(); + // create parent nodes if they do not exist + var parentNode = root; + Ext.Array.each(Arr,function(srcNode, index) { + if (index > 0) { + var nodeId = srcNode.get('id'); + var node = root.findChild('id',nodeId, true); + if (!node) { + node = srcNode.copy(); + parentNode.appendChild(node); + parentNode.expand(); + node.setDirty(); + } + parentNode = node; + } + }); - if (me.enableDrag) { - me.dragZone = Ext.create('Ext.tree.ViewDragZone', { - view: view, - ddGroup: me.dragGroup || me.ddGroup, - dragText: me.dragText - }); - } + // Add new node to correct location + parentNode.expand(!this.isDataSet, function(res){ + var newNode = srcNode.copy(); + parentNode.appendChild(newNode); + //to sync treeStore + newNode.setDirty(); + //expand the whole subtree of added node + tree.selectPath(newNode.getPath( 'id', '|'), 'id', '|'); + }); + return true; + }, + + onViewRender : function(view){ + var me = this; - if (me.enableDrop) { - me.dropZone = Ext.create('Ext.tree.ViewDropZone', { - view: view, - ddGroup: me.dropGroup || me.ddGroup, - allowContainerDrops: me.allowContainerDrops, - expandDelay: me.expandDelay, - isValidDropPoint : me.isValidDropPoint, - onContainerDrop : me.onContainerDrop, - onNodeDrop : me.onNodeDrop, - onContainerOver : me.onContainerOver, - onNodeOver : me.onNodeOver, - onDrop : me.onDrop, - onSimpleDrop : me.onSimpleDrop - }); - } - } - } - }, - listeners: { - afterrender: function(comp){ - var view = comp.getView(); - view.tip = Ext.create('Ext.tip.ToolTip', { - // The overall target element. - target: view.el, - // Each grid row causes its own seperate show and hide. - delegate: view.itemSelector, - // Moving within the row should not hide the tip. - trackMouse: true, - autoRender: true, + if (me.enableDrag){ + me.dragZone = Ext.create('Ext.tree.ViewDragZone', { + view: view, + ddGroup: me.dragGroup || me.ddGroup, + dragText: me.dragText + }); + } + + if (me.enableDrop){ + me.dropZone = Ext.create('Ext.tree.ViewDropZone', { + view: view, + ddGroup: me.dropGroup || me.ddGroup, + allowContainerDrops: me.allowContainerDrops, + expandDelay: me.expandDelay, + isValidDropPoint : me.isValidDropPoint, + onContainerDrop : me.onContainerDrop, + onNodeDrop : me.onNodeDrop, + onContainerOver : me.onContainerOver, + onNodeOver : me.onNodeOver, + onDrop : me.onDrop, + onSimpleDrop : me.onSimpleDrop + }); + } + } + } + }, + listeners: { - // Change content dynamically depending on which element triggered the show. - beforeshow: function updateTipBody(tip) { - var trigger = view.getRecord(tip.triggerElement); - if (trigger) { - var info = trigger.get('info'); - if (!info || info == '') { - tip.addCls('hide'); - } - else { - tip.removeCls('hide'); - tip.update(info); - } + afterrender: function(comp) { + var view = comp.getView(); + view.tip = Ext.create('Ext.tip.ToolTip', { + // The overall target element. + target: view.el, + // Each grid row causes its own seperate show and hide. + delegate: view.itemSelector, + // Moving within the row should not hide the tip. + trackMouse: true, + autoRender: true, + listeners: { + // Change content dynamically depending on which element triggered the show. + beforeshow: function updateTipBody(tip) { + var trigger = view.getRecord(tip.triggerElement); + if (trigger) { + var info = trigger.get('info'); + if (!info || info == '') { + tip.addCls('hide'); + } + else { + tip.removeCls('hide'); + tip.update(info); + } + } + } + } + }); + }, + + itemmouseenter: function(view, record, item){ + if(record.get('allowDrag') && view.ownerCt.id == 'source'){ + var el = Ext.get(item), + td = el.down('td > div'); + td.setStyle('cursor', 'crosshair'); + } + }, + + beforeselect: function(selmodel, record, index) { + if (!(record.get('isRemoteDataSet') || record.get('isParameter')) && tree.id == 'source') return false; + }, + + select: function(selmodel, record, index){ + if (record.get('isRemoteDataSet') && tree.id == 'source' && record.isExpanded()) { + var toSelect = selmodel.getCount() !== record.childNodes.length + 1; + var alreadySelected = selmodel.isSelected(record.firstChild); + + selmodel.deselectAll(); + + if (toSelect && !alreadySelected) + selmodel.select(record.childNodes); + } + }, + + itemcontextmenu: function(view, rec, item, index, e) + { + e.preventDefault();//stopEvent(); + if (tree.id == 'destination' && rec.getDepth() > 0) + menu.showAt(e.getXY()); } - } - } - }); - }, - - itemmouseenter: function(view, record, item){ - if(record.get('allowDrag') && view.ownerCt.id == 'source'){ - var el = Ext.get(item), - td = el.down('td > div'); - td.setStyle('cursor', 'crosshair'); - } - }, + } + }); + return tree; + }, + + // for the moment SINGLE! + deleteMulti: function(){ + var selected = this.destTree.getSelectionModel().getSelection(); + Ext.Array.each(selected, function(rec){ + rec.deleteData(); + }); - beforeselect: function(selmodel, record, index) { - if (!(record.get('isRemoteDataSet') || record.get('isParameter')) && tree.id == 'source') return false; - }, - - select: function(selmodel, record, index) { - - if (record.get('isRemoteDataSet') && tree.id == 'source' && record.isExpanded()) { - var toSelect = selmodel.getCount() !== record.childNodes.length + 1; - var alreadySelected = selmodel.isSelected(record.firstChild); - - selmodel.deselectAll(); - - if (toSelect && !alreadySelected) selmodel.select(record.childNodes); - } - }, - - itemcontextmenu: function(view, rec, item, index, e){ - e.preventDefault();//stopEvent(); - if (tree.id == 'destination' && rec.getDepth() > 0) - menu.showAt(e.getXY()); - } - } - }); - return tree; - }, -// for the moment SINGLE! - deleteMulti: function(){ - var selected = this.destTree.getSelectionModel().getSelection(); - Ext.Array.each(selected, function(rec){ - rec.deleteData(); - }); - }, - - - successCallBack : function(batch, options) { - this.hasModifs = true; - loadMask.hide(); - var createdNodes = options.operations.update; - -// define Pathes to the created nodes - var Arr = []; - Ext.Array.each(createdNodes,function(item){ - if (item.getDepth() == 4) { // parameter level - Arr.push(item.getPath('id', '|')); - } - }); - -// reload destination tree and expand created nodes - var panel = this.destTree; - var store = this.destTree.getStore(); - var root = store.getRootNode(); - store.load({ node : root, - params : { nodeType: 'destination', - baseId: this.baseId }, - callback : function(){ - for (var i = 0; i < Arr.length; i++){ - panel.selectPath(Arr[i], 'id', '|'); - } - } - }); - - - }, - - failureCallBack : function(batch, options) { - //TODO message error - alert('FAILURE!'); - loadMask.hide(); - this.loadTree('destination'); - }, - - /* - * Panel Trees generation - */ - - init: function(config) { - - if (config.baseId && config.baseId != 'root') - this.baseId = config.baseId; - - this.srcTree = this.initTree(this.configSrc); - this.destTree = this.initTree(this.configDest); + // reload destination tree and expand created nodes + var store = this.destTree.getStore(); + var root = store.getRootNode(); + store.load({ node : root, + params : { nodeType: 'destination', + baseId : this.baseId } + }); + }, + + successCallBack : function(batch, options) { + loadMask.hide(); + var createdNodes = options.operations.create; + // define Pathes to the created nodes + Arr = []; + Ext.Array.each(createdNodes,function(item){ + // if (item.getDepth() == 5) { // parameter level + if (item.get('isParameter')){ // parameter level + Arr.push(item.getPath('id', '|')); + } + }); + // reload destination tree and expand created nodes + var panel = this.destTree; + var store = this.destTree.getStore(); + var root = store.getRootNode(); + store.load({ node : root, + params : { nodeType: 'destination', + baseId : this.baseId }, + scope : this, + callback : function(){ + for (var i = 0; i < Arr.length; i++){ + panel.selectPath(Arr[i], 'id', '|'); + } + } + }); + + this.updateUserTree(); + }, + + failureCallBack : function(batch, options) { + myDesktopApp.errorMsg('Error while saving modifs'); + loadMask.hide(); + this.loadTree('destination'); + }, + + /* + * Update User Tree in Explorer after the the modifs + */ + updateUserTree : function() { + // reload RemoteParam Tree in explorer + var explorerTree = Ext.getCmp(amdaUI.ExplorerUI.RESRC_TAB.TREE_ID); + if (explorerTree) + { + var explorerTreeStore = explorerTree.getStore(); + var explorerRoot = explorerTreeStore.getRootNode(); + var explorerPath = '/root/parameters-treeBase/myRemoteData-treeRootNode/'; + + explorerTreeStore.load( { node : explorerRoot, + params : { nodeType: 'resources'}, + callback : function(){ + explorerTree.selectPath(explorerPath); + } + }); + } + myDesktopApp.infoMsg('Modifs have been saved'); + }, + + /* + * Panel Trees generation + */ + init: function(config) { + if (config.baseId && config.baseId != 'root') + this.baseId = config.baseId; + + this.srcTree = this.initTree(this.configSrc); + this.destTree = this.initTree(this.configDest); -// synchron load of destination tree if the corresponding node exists - this.srcTree.on('itemexpand', function(node) { - var root = this.destTree.getRootNode(); - var destNode = root.findChild('id',node.get('id'),true); - if (destNode) destNode.expand(); - }, - this); -// toolbar - Ext.Array.each(this.basesNames, function(baseName,index){ - var isTheBase = false; - if (this.baseId && baseName == this.baseId) var isTheBase = true; - this.bases[index] = {text: baseName, toggleGroup: 'remoteBases', pressed: isTheBase, scope : this, toggleHandler: this.loadTrees} - }, this); + // synchron load of destination tree if the corresponding node exists + this.srcTree.on('itemexpand', function(node) { + var root = this.destTree.getRootNode(); + var destNode = root.findChild('id',node.get('id'),true); + if (destNode) destNode.expand(); + }, this); + + // toolbar + Ext.Array.each(this.basesNames, function(baseName,index){ + var isTheBase = false; + if (this.baseId && baseName == this.baseId) var isTheBase = true; + this.bases[index] = {text: baseName, toggleGroup: 'remoteBases', pressed: isTheBase, scope : this, toggleHandler: this.loadTrees} + }, this); - var myConf = { - - id : 'rb_tab_panel', - title : 'Remote Data Base', - items: [ - this.srcTree, - this.destTree - ], - tbar: this.bases, - fbar: [ - { text: 'Save Modifs', - scope : this, - handler: function(){ - var store = this.destTree.getStore(); - - var removed = store.getRemovedRecords(); - var updated = store.getUpdatedRecords(); - // if only removed: no sync - already removed at Server by node.delete - //TODO is this condition OK?? - if (Ext.Array.union(removed,updated).length != removed.length) { - loadMask.show(); - store.sync({ success : this.successCallBack, failure: this.failureCallBack, scope : this}); + var myConf = { + id : 'rb_tab_panel', + title : 'Remote Data Base', + items: [ + this.srcTree, + this.destTree + ], + tbar: this.bases, + fbar: [ + { text: 'Save Modifs', + scope : this, + handler: function(){ + var store = this.destTree.getStore(); + var new_nodes = store.getNewRecords(); + var removed_nodes = store.getRemovedRecords(); + // if only removed: no sync - already removed at Server by node.delete + if ( new_nodes.length === 0 && removed_nodes.length > 0) this.updateUserTree(); + if ( new_nodes.length > 0 ){ + loadMask.show(); + store.sync({ success : this.successCallBack, failure: this.failureCallBack, scope : this}); + } } - } - } - ], - listeners : { - scope : this, - destroy : function() { - if (this.hasModifs) { - // reload RemoteParam Tree in explorer - var explorerTree = Ext.getCmp(amdaUI.ExplorerUI.RESRC_TAB.TREE_ID); - if (explorerTree) { - var explorerTreeStore = explorerTree.getStore(); - var explorerRoot = explorerTreeStore.getRootNode(); - var explorerPath = '/root/parameters-treeBase/myRemoteData-treeRootNode/'; - - explorerTreeStore.load( { node : explorerRoot, - params : { nodeType: 'resources'}, - callback : function(){ - explorerTree.selectPath(explorerPath); - } - }); - } - } - } - } + } + ] }; - - Ext.apply(this, Ext.apply(arguments, myConf)); - - } - -}); \ No newline at end of file + Ext.apply(this, Ext.apply(arguments, myConf)); + } +}); diff --git a/php/RemoteDataCenter/CDAWEB.php b/php/RemoteDataCenter/CDAWEB.php new file mode 100644 index 0000000..fee3806 --- /dev/null +++ b/php/RemoteDataCenter/CDAWEB.php @@ -0,0 +1,35 @@ +<?php +/** + * @class CDAWEB + * @brief + */ + +class CDAWEB extends RemoteDataCenterClientClass +{ + + protected function dataset2dd($id) + { + return $id; + } + + public function getParamSize() + { + $cmd = "ncinfo_remote ".RemoteData.$this->baseID."/".$this->infoFile." ".$this->ParamId; + $res = shell_exec($cmd); + + return $res; + } + + public function getParamComponents() + { + $cmd = "ncinfo_remote ".RemoteData.$this->baseID."/".$this->infoFile." ".$this->ParamId." 1"; + $res = shell_exec($cmd); + + return $res; + } + + public function setInfoFile() + { + $this->infoFile = strtolower($this->ViId).".nc"; + } +} \ No newline at end of file diff --git a/php/RemoteDataCenter/RemoteDataCenterClientClass.php b/php/RemoteDataCenter/RemoteDataCenterClientClass.php new file mode 100644 index 0000000..10f1094 --- /dev/null +++ b/php/RemoteDataCenter/RemoteDataCenterClientClass.php @@ -0,0 +1,96 @@ +<?php +/** + * @class RemoteDataCenterClientClass + * @brief + * @details + */ +class RemoteDataCenterClientClass +{ + public $baseDom = null, $dataCenter = null; + public $baseDomName; + public $baseID = null; + public $ViId = null, $ParamId = null; + protected $client; + public $infoFile = null; + + /* + * @brief Constructor + */ + function __construct() + { + $this->baseID = get_class($this); + $this->baseDom = new DomDocument("1.0"); + $this->baseDomName = RemoteData.$this->baseID."/base.xml"; + + // if (!file_exists($this->baseDomName)) + // return -1; + // if (!$this->baseDom->load($this->baseDomName)) + // return -2; + $this->baseDom->load($this->baseDomName); + + date_default_timezone_set('UTC'); + + try { + $this->client = new SoapClient(DD_WSDL); + } + catch (SoapFault $exception) { + $msg = $exception->faultstring.PHP_EOL; + exit($msg); + } + + // return 0; + } + + public function param2dd($paramID) + { + $pairs = array(" " => "_","-" => "_","/" => "_","%" => "_","\\" => "_","$" => "_",":" => "_","+" =>"_", + "#" => "_","@" => "_","." => "_", ">" => "_", "<" => "_", "," => "_", ")" => "", "(" => "_"); + + return strtr($paramID,$pairs); + } + + + public function setViId($id) + { + $this->ViId = $id; + } + + public function setParamId($id) + { + $this->ParamId = $id; + } + + public function addViToDD() + { + if (!$this->ViId) return false; + + $this->setInfoFile(); + //check if VI already added + try { + $res = $this->client->isRemoteViAdded($this->baseID, strtolower($this->ViId)); + if (!$res) + { + // call to DD Server to create new VI + $command = 'AddVI '.$this->dataset2dd($this->ViId).' '.$this->ViId.' '.$this->baseID; + system($command, $err); + + return ($err == 0); + } + + return true; + } + catch (SoapFault $exception) { +// echo $this->client->__getLastRequest(); +// echo $this->client->__getLastResponse(); + $msg = $exception->faultstring.PHP_EOL; + return false; + } + } + + + protected function dataset2dd($id){} + public function setInfoFile(){} + public function getParamSize(){} + public function getParamComponents(){} +} +?> diff --git a/php/RemoteDataCenter/RemoteParamManager.php b/php/RemoteDataCenter/RemoteParamManager.php new file mode 100644 index 0000000..1424bed --- /dev/null +++ b/php/RemoteDataCenter/RemoteParamManager.php @@ -0,0 +1,295 @@ +<?php +/** + * @class RemoteParamManager + * @brief Manage Remote Data Centers via DDServer + */ + +class RemoteParamManager +{ + protected $Bases, $basesDom; + protected $baseDom; + + protected $center; + + public $xmlDom, $xmlName; + public $paramId, $remoteViId, $localInfo, $paramDom, $paramXML; + + function __construct() + { + if (!file_exists(RemoteData."Bases.xml")) + return array("err" => "No Remote Data Bases"); + + $this->basesDom = new DomDocument("1.0"); + if (!$this->basesDom->load(RemoteData."Bases.xml")) + return array("err" => "Can not load Remote Data Bases definitions"); + $bases = $this->basesDom->getElementsByTagName('dataCenter'); + + foreach ($bases as $base) + $this->Bases[] = $base->getAttribute('xml:id'); + + if (!file_exists(USERWSDIR."RemoteParams.xml")) + return array("err" => "No RemoteParams.xml"); + + $this->xmlName = USERWSDIR."RemoteParams.xml"; + $this->xmlDom = new DomDocument("1.0"); + $this->xmlDom->load($this->xmlName); + } + + /* + * get baseId from parameter descriptor + */ + protected function setBaseId($id) + { + foreach ($this->Bases as $base) { + // Special Themis case + if (substr($id,0,2) == "th") { + $baseId = "THEMIS"; + break; + } + if (strncmp($id, $base, strlen($base)) === 0) + { + $baseId = $base; + break; + } + } + + $this->center = new $baseId(); + } + +// <param xml:id="ace_r"><get><vi name="ace:orb:all"><baseParam name="R"/></vi></get> +// <process>$ace_orb_all_R/RADIUS_EARTH</process> +// <output/></param> + public function makeInternalParamXml() + { + if (!$this->center->ViId) return false; + if (!$this->center->ParamId) return false; + + $this->paramId = strtolower($this->center->baseID."_".$this->center->ViId."_".$this->center->ParamId); + $xml = new DomDocument("1.0"); + $paramNode = $xml->createElement("param"); + $xml->appendChild($paramNode); + + $paramNode->setAttribute("xml:id", $this->paramId); + $getNode = $xml->createElement("get"); + $viNode = $xml->createElement("vi"); + $baseParamNode = $xml->createElement("baseParam"); + $baseParamNode->setAttribute("name", $this->center->ParamId); + $viNode->setAttribute("name", strtolower(strtr($this->center->ViId,"_", ":"))); + $viNode->appendChild($baseParamNode); + $getNode->appendChild($viNode); + $paramNode->appendChild($getNode); + $paramNode->appendChild($xml->createElement("process")); + $paramNode->appendChild($xml->createElement("output")); + + return $xml->save(RemoteData.$this->center->baseID."/".$this->paramId.".xml"); + } + + // TODO not used - too complicated + protected function makeParamArgs() + { + $CURR_DIR = getcwd(); + rename($CURR_DIR ."/".$this->paramId.".xml", "/home/budnik/NEWMETA/final/".$this->paramId.".xml"); + chdir(NEWKERNEL_BASE_PATH."/app-generate-paraminfo"); + $cmd = NEWKERNEL_INSTALL_DIR."/bin/DDLogin budnik Sacre-Cour"; + $res = system($cmd); + $cmd = NEWKERNEL_INSTALL_DIR."/bin/amdaParameterInfo -p ".$this->paramId; + system($cmd, $res); + $info_name = "info_".$this->paramId.".xml"; + rename($info_name, $CURR_DIR."/".$info_name); + chdir($CURR_DIR); + + return $info_name; + } + +// protected function makeComponentsFromArgsFile($node, $info_file_name) +// { +// $xml = new DomDocument(); +// $xml->load($info_file_name); +// +// $components = $xml->getElementsByTagName('component'); +// if ($components->length > 0) +// { +// foreach ($components as $component) +// { +// $compNode = $this->xmlDom->createElement("component"); +// $compNode->setAttribute('xml:id',$this->paramId.'('.$component->getAttribute("index_1").')'); +// $component->setAttribute('name',$component->getAttribute("name")); // LABEL +// +// $node->appendChild($compNode); +// } +// } +// } + + protected function makeComponents($node, $size, $components) + { + $compArray = explode(";",$components); + + for ($i = 0; $i < $size; $i++) + { + $compNode = $this->xmlDom->createElement("component"); + $compNode->setAttribute('xml:id',$this->paramId."($i)"); + $compNode->setAttribute('name',strtolower($compArray[$i])); // LABEL + + $node->appendChild($compNode); + } + } + + protected function addNode($id) + { + // Node exists already + if ($this->xmlDom->getElementById($id)) return true; + + // Node to be added + $nodeRemote = $this->center->baseDom->getElementById($id); + + // No such node in base.xml + if (!$nodeRemote) return false; + + if ($nodeRemote->tagName == 'dataset') + { + $this->center->setViId($nodeRemote->getAttribute('name')); + $status = $this->center->addViToDD(); + // echo "STATUS $status".PHP_EOL; + if (!$status) return false; + $remoteDatasetInfo = "/home/budnik/DDBASE/INFO/bases/".$this->center->baseID."/".$this->center->infoFile; //TODO "http://apus.irap.omp.eu/ + $localDatasetInfo = RemoteData.$this->center->baseID."/".$this->center->infoFile; + + if (!copy($remoteDatasetInfo,$localDatasetInfo)) return false; + } + + $node = $this->xmlDom->importNode($nodeRemote); + + if ($nodeRemote->tagName == 'parameter') + { + $this->center->setParamId($nodeRemote->getAttribute('name')); + $this->center->setViId($nodeRemote->parentNode->getAttribute('name')); + $this->center->setInfoFile(); + + if (!$this->makeInternalParamXml()) return false; + + if (($size = $this->center->getParamSize()) > 1) + { + // make components and args + $components = $this->center->getParamComponents(); + $this->makeComponents($node, $size, $components); // return false; + } + +// if ($res) +// $info_file_name = $this->makeParamArgs(); +// +// if (!$this->makeComponentsFromArgsFile($node, $info_file_name)) return false; + + } + + $parentRemote= $nodeRemote->parentNode; + $parentRemoteId = $parentRemote->getAttribute('xml:id'); + + $parent = $this->xmlDom->getElementById($parentRemoteId); + + if (!$parent) + { + $parent = $this->xmlDom->importNode($parentRemote); + } + + $parent->appendChild($node); + + $toAddDataCentertToDoc = false; + + while ($parent->tagName != 'dataCenter') + { + $node = $parent; + $parentRemote = $parentRemote->parentNode; + $parentRemoteId = $parentRemote->getAttribute('xml:id'); + $parent = $this->xmlDom->getElementById($parentRemoteId); + + if (!$parent) + { + if ($parentRemote->tagName == 'dataCenter') + $toAddDataCenterToDoc = true; + $parent = $this->xmlDom->importNode($parentRemote); + $parent->appendChild($node); + } + } + + if ($toAddDataCenterToDoc) + { + //TODO if this is necessary ??? + // special bases 'hand-made' descriptions + $basesDom = new DomDocument("1.0"); + $basesDom -> load(RemoteData.'Bases.xml'); + $theBase = $basesDom->getElementById($parent->getAttribute('xml:id')); + + if ($theBase) $parent -> setAttribute('name', $theBase->getAttribute('name')); + $this->xmlDom->documentElement->appendChild($parent); + } + + return true; + } + +/* +* PUBLIC FUNCTIONS +*/ + public function saveTree($obj) + { + $r = print_r($obj, true); + if (count($obj) == 1) + { + $id = $obj->id; + + if ($id == 'root') return array('res' => 'ok'); + + $this->setBaseId($id); + $res = $this->addNode($id); + + if ($res === false) return array("err" => "Cannot add node : $id"); + } + else + { + foreach ($obj as $o) + { + $id = $o->id; + + if ($id == 'root') continue; + + if (!$this->baseId) $this->setBaseId($id); + $res = $this->addNode($id); + + if ($res === false) return array("err" => "Cannot add node : $id"); + + } + } + + if (!$this->xmlDom->save($this->xmlName)) + return array("err" => "Cannot save RemoteParams.xml"); + + return array('res' => 'ok'); + } + + public function deleteFromTree($obj) + { + $id = $obj->id; + $nodeToDelete = $this->xmlDom->getElementById($id); + + if (!$nodeToDelete) + return array("err" => "No such id : $id"); + + $tagName = $nodeToDelete->tagName; + + while ( $tagName != "dataRoot" ) // "dataCenter" ? + { + $parentNode = $nodeToDelete->parentNode; + $parentNode->removeChild($nodeToDelete); + $otherChildren = $parentNode->getElementsByTagName($tagName); + + if ( $otherChildren->length > 0 ) + break; + + $nodeToDelete = $parentNode; + $tagName = $nodeToDelete->tagName; + } + $this->xmlDom->save($this->xmlName); + + return array('res'=> $obj->id); + } +} +?> \ No newline at end of file diff --git a/php/classes/ParamMgr.php b/php/classes/ParamMgr.php deleted file mode 100644 index 797a7c7..0000000 --- a/php/classes/ParamMgr.php +++ /dev/null @@ -1,415 +0,0 @@ -<?php -/** - * @class ParamMgr - * @version $Id: ParamMgr.php 1947 2013-11-28 15:10:46Z elena $ - * - */ - - class ParamMgr { - - - protected $Bases, $basesDom; - protected $baseDom; - public $xmlDom, $xmlName; - public $baseId, $paramId, $remoteViId, $localInfo, $paramDom, $paramXML; - - function __construct() { -//TODO check if files exist.... - $this->basesDom = new DomDocument("1.0"); - $this->basesDom->load(RemoteData.'Bases.xml'); - $bases = $this->basesDom->getElementsByTagName('dataCenter'); - foreach ($bases as $base) $this->Bases[] = $base->getAttribute('xml:id'); - - $this->xmlName = USERWSDIR.'RemoteParams.xml'; - $this->xmlDom = new DomDocument("1.0"); - $this->xmlDom->load($this->xmlName); - - } - -/* -* -*/ - protected function param2dd($paramID) { - - $pairs = array("%" => "_","\\" => "_","$" => "_",":" => "_","+" =>"_","-" => "_","#" => "_","@" => "_","." => "_", ">" => "_", "<" => "_"); - return strtr($paramID,$pairs); - } - -/* -* Make Aliases - Remote data set ID -> DD data set ID (xxxx_xxxx_xxxx) -*/ - public function dataset2dd($remVIID) { - // TODO method of ???? class - - $ddVIID = $remVIID; - return $ddVIID; - } - -/* -* get baseId from parameter descriptor -*/ - protected function setBaseId($id) { - - foreach ($this->Bases as $base) { -// Special Themis case - if (substr($id,0,2) == "th") { - $this->baseId = "THEMIS"; - break; - } - if (strncmp($id, $base, strlen($base)) === 0) { - $this->baseId = $base; - break; - } - } - - $this->baseDom = new DomDocument("1.0"); - $this->baseDom->load(RemoteData.$this->baseId.'/base.xml'); - } - -/* -* get Info File name -*/ -//TODO not to hardly code special stuff... - public function getInfoName($datasetId) { - - if ($this->baseId == 'CDAWEB') - return strtolower($datasetId)."_00000000_v01.cdf"; - return $datasetId.'.xml'; - - } - -/* -* -*/ - protected function getDatasetInfo() { - - $infoFileName = $this->getInfoName($this->remoteViId); - $this->localInfo = RemoteData.$this->baseId.'/'.$infoFileName; - if (file_exists($this->localInfo)) return true; - -// call to DD Server to create new VI - $command = OLD_CLASSPATH.'AddVI '.$this->dataset2dd($this->remoteViId).' '.$this->remoteViId.' '.$this->baseId; - system($command, $err); - - $remoteInfo = INFOSITE.'INFO/'.$this->baseId.'/DATASETS/'.$infoFileName; -// Get dataset info from DD Server if it doesn't yet exists locally -//TODO may be not neccessary to copy file? load from URL? - $res = copy($remoteInfo, $this->localInfo); - return $res; - } - -/* -* -*/ - public function getParamInfo() { - - if (!$this->localInfo) { - $infoFileName = $this->getInfoName($this->remoteViId); - $this->localInfo = RemoteData.$this->baseId.'/'.$infoFileName; - } - switch ($this->baseId) { -// CDAWEB specific function to parse master CDF - idl - case 'CDAWEB' : - $command = OLD_CLASSPATH.'cdfInfo '.$this->localInfo.' "'.$this->paramId.'"'; - $info = exec($command); - break; - case 'VEXGRAZ' : - case 'MAPSKP' : - $info = $this->getInfoSpase(); - break; - default: - - } - if ($info == "%-9999") return false; - return $info; - } - -/* -* -*/ - protected function getInfoSpase() { - - $xmlinfo = new DomDocument("1.0"); - $xmlinfo->load($this->localInfo); - $mission = $xmlinfo->getElementsByTagName("PARENT_MISSION"); - $instrument = $xmlinfo->getElementsByTagName("PARENT_INSTRUMENT"); - - $xp = new domxpath($xmlinfo); - $param = $xp->query("//PARAM_ID[.='".$this->paramId."']"); - $paramNode = $param->item(0)->parentNode; - if (!$paramNode) return false; - - $info = "paramID%" . $this->paramId . "&&"; - // Data Type - $tag = $paramNode->getElementsByTagName("DATA_TYPE"); - $value = $tag->item(0)->nodeValue; - switch ($value) { - case 'FLOAT' : $dataTypeS = '2'; break; - case 'DOUBLE': $dataTypeS = '3'; break; - case 'INT' : $dataTypeS = '1'; break; - case 'CHAR' : $dataTypeS = '0'; break; - default : $dataTypeS = '2' ; - } - $info = $info . "DATATYPE%" . $dataTypeS ."&&"; - $tag = $paramNode->getElementsByTagName("SIZES"); - $value = $tag->item(0)->nodeValue; - $info = $info . "DIMENSION%" . $value; - $tags=array("PARENT_MISSION", "PARENT_EXPERIMENT", "PARAMETER_SHORT_DESCRIPTION", "FILLVAL", "UNITS","DISPLAY_TYPE", "COORDINATE_SYSTEM", "TENSOR_ORDER_VALUE", "LABEL_I", "FIELDNAM"); - - foreach ($tags as $atag){ - $tag = $paramNode->getElementsByTagName($atag); - $value = $tag->length > 0 ? $tag->item(0)->nodeValue : -9999; - switch ($atag) { - case "LABEL_I" : $name = "LABLAXIS"; - $val_arr = array(); - for ($j = 0; $j < $tag->length; $j++) - $val_arr[$j] = $tag->item($j)->nodeValue; - $value = implode($val_arr, '$').'$'; break; - case "COORDINATE_SYSTEM" : $name = "FRAME"; break; - case "TENSOR_ORDER_VALUE" : $name = "TENSOR"; break; - case "PARAMETER_SHORT_DESCRIPTION" : $name = "DESCRIPTOR"; break; - case "PARENT_MISSION" : $name = "SOURCE_NAME"; - $value = $mission->item(0)->nodeValue; - break; - case "PARENT_EXPERIMENT" : $name = "DATA_TYPE"; - $value = $instrument->item(0)->nodeValue; - break; - case "FILLVAL": - $value = $tag->length > 0 ? $tag->item(0)->nodeValue : -1.e31; - $name = "FILLVAL"; - break; - default: $name = $atag; - } - $info = $info . "&&".$name."%". $value; - } - - return $info; - } -/* -* Create XML parameter descriptor in the generic_data/RemoteData/PARAMS dir -*/ - public function createParamXml($infoTotal) { - - $this->paramDom = new DomDocument("1.0"); - $this->paramDom->preserveWhiteSpace = false; - $this->paramDom->formatOutput = true; - - $param = $this->paramDom->createElement('PARAM'); - $param->appendChild($this->paramDom->createElement("baseID",$this->baseId)); - $param->appendChild($this->paramDom->createElement("viID",$this->remoteViId)); - - $info = explode("&&",$infoTotal); - for ($i = 0; $i < count($info); $i++){ - $attr = explode("%",$info[$i]); - try { - $param->appendChild($this->paramDom->createElement($attr[0],$attr[1])); - } - catch (Exception $e) { - return false; - } - } - $this->paramDom->appendChild($param); - if (!$this->paramDom->save($this->paramXML)) return false; - - return true; // NO ERROR - - } - -/* -* special themis case: componets from base.xml -*/ - public function makeThemisComponents($param) { - - $sizes = $param->getAttribute('size'); - if (!$sizes) return true; // scalar - - - $labels = $param->getAttribute('labels'); - $id = $param->getAttribute('xml:id'); - $name = $param->getAttribute('name'); - - if (!$labels) { - $param->setAttribute('needsArgs', true); - return true; - } - - $labelArr = explode("$",$labels); - for ($i = 0; $i < count($labelArr); $i++) - { - $component = $this->xmlDom->createElement('component'); - $component->setAttribute('xml:id',$id.'('.$i.')'); - - $component->setAttribute('name',$labelArr[$i]); - $param->appendChild($component); - } - return true; - - } - -/* -* -*/ - public function makeComponents($param) { - - $sizes = $this->paramDom->getElementsByTagName('DIMENSION')->item(0)->nodeValue; - $display = strtolower($this->paramDom->getElementsByTagName('DISPLAY_TYPE')->item(0)->nodeValue); - $units = $this->paramDom->getElementsByTagName('UNITS')->item(0)->nodeValue; - - if (!$units || ($units == "-9999")) $units = "no"; - $param->setAttribute("units", $units); - - if ($sizes == "1") return true; // Scalar - Nothing to do - - $id = $param->getAttribute('xml:id'); - $name = $param->getAttribute('name'); - // Not a Scalar - add components to user tree - $labels = $this->paramDom->getElementsByTagName('LABLAXIS')->item(0)->nodeValue; - - // No labels - if (!$labels || ($labels == "$") || (substr($display,0,6) == "spectr")) { - if (!$param->getAttribute('needsArgs')) { - $param->setAttribute('needsArgs', true); - if (substr($display,0,6) == "spectr") - $param->setAttribute('display_type', 'spectrogram'); - } - return true; - } - - $labelArr = explode("$",$labels); - for ($i = 0; $i < count($labelArr)-1; $i++) - { - $component = $this->xmlDom->createElement('component'); - $component->setAttribute('xml:id',$id.'('.$i.')'); - $component->setAttribute('name',$labelArr[$i]); - $param->appendChild($component); - } - return true; - } -/* -* -*/ - protected function addNode($id){ - -// NODE EXISTS - - if ($this->xmlDom->getElementById($id)) return true; - -// NODE TO BE ADD - $nodeRemote = $this->baseDom->getElementById($id); - - if (!$nodeRemote) return false; - - if ($nodeRemote->tagName == 'dataset') { - - $this->remoteViId = $nodeRemote->getAttribute('name'); - $datasetExists = $this->baseId != 'THEMIS' ? $this->getDatasetInfo() : true; - if (!$datasetExists) return false; - } - - $node = $this->xmlDom->importNode($nodeRemote); - - if ($nodeRemote->tagName == 'parameter') { - - $this->paramId = $nodeRemote->getAttribute('name'); - $this->remoteViId = $nodeRemote->parentNode->getAttribute('name'); - - $info = $this->baseId != 'THEMIS' ? $this->getParamInfo() : true; - if (!$info) return false; - - - // XML descriptor of the parameter; themis excluded - if ($this->baseId == 'THEMIS') { - - if (!$this->makeThemisComponents($node)) return false; - } - else { - - $paramGlobalId = $this->baseId.":".$this->dataset2dd($this->remoteViId).":".$this->param2dd($this->paramId); - $node->setAttribute('xml:id', $paramGlobalId); - $this->paramXML = RemoteData.'PARAMS/'.$paramGlobalId.'.xml'; - - if (!file_exists($this->paramXML) && !$this->createParamXml($info)) return false; - if (!$this->paramDom) { - $this->paramDom = new DomDocument("1.0"); - } - $this->paramDom->load($this->paramXML); - - if (!$this->makeComponents($node)) return false; - } - } - - $parentRemote= $nodeRemote->parentNode; - $parentRemoteId = $parentRemote->getAttribute('xml:id'); - - $parent = $this->xmlDom->getElementById($parentRemoteId); - if (!$parent) { - $parent = $this->xmlDom->importNode($parentRemote); - } - $parent -> appendChild($node); - - $toAddDataCentertToDoc = false; - - while ($parent->tagName != 'dataCenter') { - $node = $parent; - $parentRemote = $parentRemote->parentNode; - $parentRemoteId = $parentRemote->getAttribute('xml:id'); - $parent = $this->xmlDom->getElementById($parentRemoteId); - - if (!$parent) { - if ($parentRemote->tagName == 'dataCenter') $toAddDataCenterToDoc = true; - $parent = $this->xmlDom->importNode($parentRemote); - $parent -> appendChild($node); - } - } - - if ($toAddDataCenterToDoc) { -//TODO if this is neccessary ??? -// special bases 'hand-made' descriptions - $basesDom = new DomDocument("1.0"); - $basesDom -> load(RemoteData.'Bases.xml'); - $theBase = $basesDom -> getElementById($parent->getAttribute('xml:id')); - - if ($theBase) $parent -> setAttribute('name', $theBase->getAttribute('name')); - $this->xmlDom->documentElement->appendChild($parent); - } - return true; - } - -/* -* PUBLIC FUNCTIONS -*/ - public function saveTree($obj) { - - if (count($obj) == 1) { - $id = $obj->id; - $this->setBaseId($id); - $res = $this->addNode($id); - } - else { - foreach ($obj as $o) { - $id = $o->id; - if ($id == 'root') continue; - if (!$this->baseId) $this->setBaseId($id); - $res = $this->addNode($id); - } - } - - $this->xmlDom->save($this->xmlName); - return array('res' => 'ok'); - } - - public function deleteFromTree($obj) { - - $id = $obj->id; - $nodeToDelete = $this->xmlDom->getElementById($id); - if (!$nodeToDelete) return array('err' => 'NO SUCH ID'); - $nodeToDelete->parentNode->removeChild($nodeToDelete); - - $this->xmlDom->save($this->xmlName); - - return array('res'=> $obj->id); - } - -} - -?> \ No newline at end of file diff --git a/php/src/AddVI.c b/php/src/AddVI.c new file mode 100644 index 0000000..a592846 --- /dev/null +++ b/php/src/AddVI.c @@ -0,0 +1,23 @@ +/* $Id: AddVI.c,v 1.2 2012/10/29 08:03:14 budnik Exp $*/ +/*=========================================================================== + * DD SYSTEM CLIENT-SERVER + * AddVI.c + * v.1.0 + * Executable to add new VI to server + * List of changes: + * 17 Jun 2007: V.1.0 + ===========================================================================*/ + +#include <stdio.h> +#include <string.h> +#include <DD.h> + +main(int argc, char **argv) +{ + int Err; + + Err = DD_AddDataSet(argv[1],argv[2],argv[3]); + // printf("Err = %d\n",Err); + return Err; +} +/*===========================================================================*/ diff --git a/php/src/Makefile b/php/src/Makefile index 608bcc0..9e83214 100644 --- a/php/src/Makefile +++ b/php/src/Makefile @@ -1,91 +1,59 @@ -INC = -I/usr/include -I/usr/local/include -I${CDF_DIR}/include -I${CEF_DIR}/include -I${DD_INCLUDE} -LIB = -L/usr/lib64 -L/usr/local/lib64 -L${CDF_DIR}/lib -L${CEF_DIR}/lib -L${DD_LIB} +INC = -I/usr/include -I/usr/local/include -I/opt/local/include -I/opt/local/include/DDClientLibC +LIB = -L/usr/lib64 -L/usr/local/lib64 -L/opt/local/lib -L/opt/local/lib CFLAGS = -ggdb -DLINUX -m64 -march=core2 -fPIC -Dlinux -D_REENTRANT -malign-double CC = gcc EXE = nctimestring2double nctimeinfo getncvars ncvarinfo \ - cefstartstop cefvarinfo cefinfo cefsampling ceftimeinfo \ - cdfinfo cdfvarinfo cdfstartstopfromdata cdfsamplingfromdata + ncinfo_remote \ + cdfinfo cdfvarinfo cdfstartstopfromdata cdfsamplingfromdata \ + AddVI lib: ${EXE} -nctimestring2double: nctimestring2double.o - ${CC} -o nctimestring2double nctimestring2double.o ${LIB} -lDDClientLibC -lnetcdf +AddVI: AddVI.c + ${CC} ${CFLAGS} -o AddVI AddVI.c ${INC} ${LIB} -lDDClientLibC + +ncinfo_remote: ncinfo_remote.c + ${CC} ${CFLAGS} -o ncinfo_remote ncinfo_remote.c ${INC} ${LIB} -lnetcdf + +nctimestring2double: nctimestring2double.c + ${CC} ${CFLAGS} -o nctimestring2double nctimestring2double.c ${INC} ${LIB} -lDDClientLibC -lnetcdf -nctimestring2double.o: nctimestring2double.c - ${CC} ${CFLAGS} -c nctimestring2double.c ${INC} +nctimeinfo: nctimeinfo.c + ${CC} ${CFLAGS} -o nctimeinfo nctimeinfo.c ${INC} ${LIB} -lnetcdf -nctimeinfo: nctimeinfo.o - ${CC} -o nctimeinfo nctimeinfo.o ${LIB} -lnetcdf +getncvars: getncvars.c + ${CC} ${CFLAGS} -o getncvars getncvars.c ${INC} ${LIB} -lnetcdf -nctimeinfo.o: nctimeinfo.c - ${CC} ${CFLAGS} -c nctimeinfo.c ${INC} +ncvarinfo: ncvarinfo.c + ${CC} ${CFLAGS} -o ncvarinfo ncvarinfo.c ${INC} ${LIB} -lnetcdf -getncvars: getncvars.o - ${CC} -o getncvars getncvars.o ${LIB} -lnetcdf +cefvarinfo: cefvarinfo.c + ${CC} ${CFLAGS} -o cefvarinfo cefvarinfo.c ${INC} ${LIB} -lm -lz -lCEF_gcc -lCIS_gcc -getncvars.o: getncvars.c - ${CC} ${CFLAGS} -c getncvars.c ${INC} +cefinfo: cefinfo.c + ${CC} ${CFLAGS} -o cefinfo cefinfo.c ${INC} ${LIB} -lm -lz -lCEF_gcc -lCIS_gcc -ncvarinfo: ncvarinfo.o - ${CC} -o ncvarinfo ncvarinfo.o ${LIB} -lnetcdf +cefstartstop: cefstartstop.c + ${CC} ${CFLAGS} -o cefstartstop cefstartstop.c ${INC} ${LIB} -lm -lz -lCEF_gcc -lCIS_gcc -ncvarinfo.o: ncvarinfo.c - ${CC} ${CFLAGS} -c ncvarinfo.c ${INC} +cefsampling: cefsampling.c + ${CC} ${CFLAGS} -o cefsampling cefsampling.c ${INC} ${LIB} -lm -lz -lCEF_gcc -lCIS_gcc -cefvarinfo: cefvarinfo.o - ${CC} -o cefvarinfo cefvarinfo.o ${LIB} -lm -lz -lCEF_gcc -lCIS_gcc +ceftimeinfo: ceftimeinfo.c + ${CC} ${CFLAGS} -o ceftimeinfo ceftimeinfo.c ${INC} ${LIB} -lm -lz -lCEF_gcc -lCIS_gcc -cefvarinfo.o: cefvarinfo.c - ${CC} ${CFLAGS} -c cefvarinfo.c ${INC} +cdfinfo: cdfinfo.c + ${CC} ${CFLAGS} -o cdfinfo cdfinfo.c ${INC} ${LIB} -lcdf -cefinfo: cefinfo.o - ${CC} -o cefinfo cefinfo.o ${LIB} -lm -lz -lCEF_gcc -lCIS_gcc +cdfvarinfo: cdfvarinfo.c + ${CC} ${CFLAGS} -o cdfvarinfo cdfvarinfo.c ${INC} ${LIB} -lcdf -cefinfo.o: cefinfo.c - ${CC} ${CFLAGS} -c cefinfo.c ${INC} +cdfstartstopfromdata: cdfstartstopfromdata.c + ${CC} ${CFLAGS} -o cdfstartstopfromdata cdfstartstopfromdata.c ${INC} ${LIB} -lcdf -cefstartstop: cefstartstop.o - ${CC} -o cefstartstop cefstartstop.o ${LIB} -lm -lz -lCEF_gcc -lCIS_gcc - -cefstartstop.o: cefstartstop.c - ${CC} ${CFLAGS} -c cefstartstop.c ${INC} - -cefsampling: cefsampling.o - ${CC} -o cefsampling cefsampling.o ${LIB} -lm -lz -lCEF_gcc -lCIS_gcc - -cefsampling.o: cefsampling.c - ${CC} ${CFLAGS} -c cefsampling.c ${INC} - -ceftimeinfo: ceftimeinfo.o - ${CC} -o ceftimeinfo ceftimeinfo.o ${LIB} -lm -lz -lCEF_gcc -lCIS_gcc - -ceftimeinfo.o: ceftimeinfo.c - ${CC} ${CFLAGS} -c ceftimeinfo.c ${INC} - -cdfinfo: cdfinfo.o - ${CC} -o cdfinfo cdfinfo.o ${LIB} -lcdf - -cdfinfo.o: cdfinfo.c - ${CC} ${CFLAGS} -c cdfinfo.c ${INC} - -cdfvarinfo: cdfvarinfo.o - ${CC} -o cdfvarinfo cdfvarinfo.o ${LIB} -lcdf - -cdfvarinfo.o: cdfvarinfo.c - ${CC} ${CFLAGS} -c cdfvarinfo.c ${INC} - -cdfstartstopfromdata: cdfstartstopfromdata.o - ${CC} -o cdfstartstopfromdata cdfstartstopfromdata.o ${LIB} -lcdf - -cdfstartstopfromdata.o: cdfstartstopfromdata.c - ${CC} ${CFLAGS} -c cdfstartstopfromdata.c ${INC} - -cdfsamplingfromdata: cdfsamplingfromdata.o - ${CC} -o cdfsamplingfromdata cdfsamplingfromdata.o ${LIB} -lcdf - -cdfsamplingfromdata.o: cdfsamplingfromdata.c - ${CC} ${CFLAGS} -c cdfsamplingfromdata.c ${INC} +cdfsamplingfromdata: cdfsamplingfromdata.c + ${CC} ${CFLAGS} -o cdfsamplingfromdata cdfsamplingfromdata.c ${INC} ${LIB} -lcdf install: install -d -m a+rx,ug+w ${IHM_DIR}/php/bin diff --git a/php/src/ncinfo_remote.c b/php/src/ncinfo_remote.c new file mode 100644 index 0000000..27e37e0 --- /dev/null +++ b/php/src/ncinfo_remote.c @@ -0,0 +1,96 @@ + #include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <netcdf.h> + +void check(int stat) +{ + if (stat != NC_NOERR) + { + printf("NetCDF error: %s\n", nc_strerror(stat)); + exit(1); + } +} + +main(int argc, char **argv) +{ + int ncID, varID, labelID, ndims, dimids[NC_MAX_DIMS]; + size_t i, k; +// char varname[NC_MAX_NAME]; + int stat = 0; + nc_type xtype; + size_t start[] = {0, 0}; + size_t count[] = {1, 0}; + size_t size, length; + + if (argc <= 2) { + printf("Incorrect number of arguments\n"); + exit(1); + } + + stat = nc_open(argv[1],NC_WRITE|NC_SHARE,&ncID); check(stat); + + stat = nc_inq_varid(ncID, argv[2], &varID); check(stat); + + stat = nc_inq_varndims(ncID, varID, &ndims); check(stat); + + stat = nc_inq_vardimid(ncID, varID, dimids); check(stat); + + size_t len = 0; + if (ndims > 1) + for (i = 1; i < ndims; i++) { + stat = nc_inq_dimlen(ncID, dimids[i], &len); check(stat); + if (argc == 3) + { + fprintf(stdout, "%d ", len); + } + } + else + if (argc == 3) + { + fprintf(stdout,"%d ", len); + } + + if (argc == 4) + { + size_t attlen = 0; + stat = nc_inq_attlen(ncID, varID, "LABL_PTR_1", &attlen); check(stat); + // stat = nc_inq_atttype(ncID, varID, "LABL_PTR_1", &xtype); check(stat); + + unsigned char *string_attr = (unsigned char *)malloc(attlen * sizeof(char*)); + stat = nc_get_att(ncID, varID, "LABL_PTR_1", string_attr); check(stat); + + // printf("attribute = %s\n", string_attr); + stat = nc_inq_varid(ncID, string_attr, &labelID); check(stat); + // stat = nc_inq_vartype(ncID, labelID, &xtype); check(stat); + + // printf("%d \n", xtype); + + stat = nc_inq_varndims(ncID, labelID, &ndims); check(stat); + + stat = nc_inq_vardimid(ncID, labelID, dimids); check(stat); + + for (i = 0; i < ndims; i++) { + stat = nc_inq_dimlen(ncID, dimids[i], &len); check(stat); + // printf("%d \n", len); + if (i == 0) size = len; + if (i == 1) length = len; + } + count[1] = length; + + unsigned char *string_var = (unsigned char *)malloc(length * sizeof(char*)); + for (i = 0; i < size; i++) + { + stat = nc_get_vara(ncID, labelID, start, count, string_var); check(stat); + fprintf(stdout, "%s;", string_var); + start[0]++; + } + free(string_attr); + free(string_var); + } + + stat = nc_close(ncID); + exit(0); +} + + -- libgit2 0.21.2