/** * Project  : AMDA-NG * Name : AstroImagesUI.js * @plugin amdaUI.AstroImagesUI * @extends Ext.panel.Panel * @brief Astronomical images viewer for interoperability - Abstract class * @author Benjamin * @version $Id: AstroImagesUI.js 1847 2013-10-30 14:46:48Z elena $ ******************************************************************************** * FT Id : Date : Name - Description ******************************************************************************* * : */ Ext.define('ImageNode', { extend: 'Ext.data.Model', fields: [ {name: 'leaf', type: 'boolean'}, {name: 'id', type: 'string'}, {name: 'name', type: 'string'}, {name: 'target', type: 'string'}, {name: 'ra', type: 'string'}, {name: 'dec', type: 'string'}, {name: 'ref', type: 'string'}, {name: 'start', type: 'string'}, {name: 'stop', type: 'string'}, {name: 'exposure', type: 'string'}, {name: 'instrument',type: 'string'}, {name: 'preview_url', type: 'string'}, {name: 'image_url', type: 'string'}, {name: 'fits_url', type: 'string'}, {name: 'additional_text', type: 'string'} ] }); Ext.define('amdaUI.AstroImagesUI', { extend: 'Ext.form.Panel', requires: [ 'amdaUI.SendToSampButtonUI' ], // getPreviewUrl : Ext.emptyFn, getImageLink : Ext.emptyFn, getImageToSendUrl : Ext.emptyFn, refreshTree : Ext.emptyFn, getAcknowledgement : Ext.emptyFn, timeSelector : null, preview : false, constructor: function(config) { this.init(config); this.callParent(arguments); }, setInterval : function(startDate,stopDate) { this.timeSelector.setInterval(startDate,stopDate); }, setPreview : function(prev) { if (!this.getPreviewUrl) return; this.preview = prev; var view = this.getImageTreePanel().getView(); var rootNode = this.getImageTreePanel().store.getRootNode(); rootNode.eachChild(function(folder) { folder.eachChild(function(image) { if (prev) { var imageSrc = this.getPreviewUrl(image); image.set('icon',imageSrc); image.set('iconCls','x-tree-icon-leaf'); } else { image.set('icon',''); image.set('iconCls',''); } },this); },this); }, getSelectedImageList : function() { var me = this; var root = this.getImageTreePanel().getRootNode(); var imgList = new Array(); if (!this.getImageToSendUrl) return imgList; root.eachChild(function (folder){ folder.eachChild(function (image){ if(image.get('checked')) { var name = image.get('name'); if (!name.substr(name.lastIndexOf('.') + 1) != "fits") name+='.fits'; imgList.push({name:name, url:me.getImageToSendUrl(image)}); } }); }); return imgList; }, getCurrentScript : function() { var imageList = this.getSelectedImageList(); if (imageList.length <= 0) { Ext.Msg.show({title:'Empty selection', msg: 'You must select at least one image in tree', icon: Ext.MessageBox.WARNING, buttons: Ext.Msg.OK}); return; } var interopModule = myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.interop.id); if (interopModule) { return interopModule.generateAladinScript(imageList,'movie'); }; return ""; }, onExtendInterval : function(o) { var dtField = o.up().up().query('numberfield')[0]; var dtVal = dtField ? dtField.getValue() : 0; var unitField = o.up().up().query('combobox')[1]; var unitVal = unitField ? unitField.getValue() : 'min'; switch(unitVal) { case 'min' : dtVal *= 60; break; case 'hour' : dtVal *= 3600; break; case 'day' : dtVal *= (24*3600); break; } var startTime = this.timeSelector.getStartTime(); var stopTime = this.timeSelector.getStopTime(); switch(o.getText()) { case 'left' : startTime = Ext.Date.add(startTime, Ext.Date.MILLI, -dtVal*1000); break; case 'right' : stopTime = Ext.Date.add(stopTime, Ext.Date.MILLI, dtVal*1000); break; case 'both' : startTime = Ext.Date.add(startTime, Ext.Date.MILLI, -dtVal*1000); stopTime = Ext.Date.add(stopTime, Ext.Date.MILLI, dtVal*1000); break; } this.timeSelector.setInterval(startTime,stopTime); }, onShiftInterval : function(o) { var dtField = o.up().up().query('numberfield')[0]; var dtVal = dtField ? dtField.getValue() : 0; var unitField = o.up().up().query('combobox')[1]; var unitVal = unitField ? unitField.getValue() : 'min'; switch(unitVal) { case 'min' : dtVal *= 60; break; case 'hour' : dtVal *= 3600; break; case 'day' : dtVal *= (24*3600); break; } var startTime = this.timeSelector.getStartTime(); var stopTime = this.timeSelector.getStopTime(); switch(o.getText()) { case 'left' : startTime = Ext.Date.add(startTime, Ext.Date.MILLI, -dtVal*1000); stopTime = Ext.Date.add(stopTime, Ext.Date.MILLI, -dtVal*1000); break; case 'right' : startTime = Ext.Date.add(startTime, Ext.Date.MILLI, dtVal*1000); stopTime = Ext.Date.add(stopTime, Ext.Date.MILLI, dtVal*1000); break; } this.timeSelector.setInterval(startTime,stopTime); }, createTree : function(imagesArray) { this.getImageTreePanel().setLoading(false); var rootNode = this.getImageTreePanel().store.getRootNode(); rootNode.removeAll(false); Ext.each(imagesArray, function(data){ var rec = Ext.create('ImageNode',{ leaf : false, id : data.name, name : data.name, start : data.start }); var folderNode = rootNode.appendChild(rec); Ext.each(data.images, function(image,index){ var rec = Ext.create('ImageNode',{ leaf : true, id : data.name+'-'+image.name+'-'+index+'-'+this.id, name : image.name, target : image.target, ra : image.ra, dec : image.dec, ref : image.ref, start : image.start, stop : image.stop, exposure : image.exposure, instrument : image.instrument, preview_url : image.preview_url, fits_url : image.fits_url, image_url : image.image_url, additional_text : image.additional_text, checked : false, hrefTarget : '_blank' }); if (this.getImageLink) rec.set('href',this.getImageLink(rec)); folderNode.appendChild(rec); },this); }, this); this.getImageTreePanel().getView().refresh(); this.setPreview(this.preview); }, onRefreshTree : function(o) { if (this.refreshTree) this.refreshTree(); }, onSendFITSToSAMP : function(clientId, sendOpt) { if (!sendOpt.scope) return; var imageList = sendOpt.scope.getSelectedImageList(); if (imageList.length <= 0) { Ext.Msg.show({title:'Empty selection', msg: 'You must select at least one image in tree', icon: Ext.MessageBox.WARNING, buttons: Ext.Msg.OK}); return; } myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.interop.id, true, function (module) { /*var script = this.getCurrentScript(); module.sendAladinScript(escape(script));*/ for( var i=0; i < imageList.length; i++) { var url = imageList[i].url; var name = imageList[i].name; if (module) module.sendFITS(url,name); } }); }, onSendToWeb : function(o) { var me = this; myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.interop.id, true, function (module) { var script = me.getCurrentScript(); var args = ""; if( script ) { args="?script="+escape(script); } var url = "http://aladin.u-strasbg.fr/java/nph-aladin.pl"+args; window.open( url ); }); }, onDownload : function(o) { var imageList = this.getSelectedImageList(); if (imageList.length <= 0) { Ext.Msg.show({title:'Empty selection', msg: 'You must select at least one image in tree', icon: Ext.MessageBox.WARNING, buttons: Ext.Msg.OK}); return; } var obj = Ext.create('amdaModel.Download'); obj.set('compression','zip'); obj.set('list',imageList); obj.set('downloadSrc',2); amdaModel.DownloadNode.set('object',obj); amdaModel.DownloadNode.execute(); }, getAdditionalRequestConfig : function(panelId) { return {}; }, getTargetList : function() { return []; }, createRequestSelectorPanel : function(panelId) { var me = this; this.timeSelector = Ext.create('amdaUI.IntervalUI', {}); return { xtype : 'panel', region : 'west', title : 'Request definition', bodyStyle: { background : '#dfe8f6' }, flex:1, layout: { type: 'vbox', align: 'stretch'}, dockedItems: [{ xtype: 'toolbar', dock: 'bottom', items: [ '->', { text: 'Refresh', scope : me, handler : me.onRefreshTree }] }], items : [ { xtype: 'component', height: 5}, { xtype : 'combo', id : panelId+'-combo-target', fieldLabel : 'Target', fields : ['id', 'name'], queryMode: 'local', editable: false, store : this.getTargetList(), value: "saturn" }, { xtype : 'component', autoEl: 'hr' }, this.timeSelector, { xtype : 'component', autoEl: 'hr' }, { xtype : 'container', layout : 'hbox', items : [ { xtype : 'numberfield', fieldLabel : 'Delta T', labelWidth: 60, flex : 1, minValue: 0, value : 0, hideTrigger: true, keyNavEnabled: false, mouseWheelEnabled: false }, { xtype: 'component', width: 5}, { xtype : 'combobox', queryMode: 'local', forceSelection : true, flex : 1, allowBlank : false, editable: false, value : "min", store : [ ["min","minute(s)"], ["hour","hour(s)"], ["day","day(s)"] ] } ] }, { xtype: 'component', height: 5}, { xtype : 'container', layout : 'hbox', items : [ { xtype : 'label', text : 'Extend ... ', width : 60 }, { xtype: 'component', width: 5}, { xtype : 'button', text : 'left', flex : 1, scope : me, handler : me.onExtendInterval }, { xtype: 'component', width: 5}, { xtype : 'button', text : 'right', flex : 1, scope : me, handler : me.onExtendInterval }, { xtype: 'component', width: 5}, { xtype : 'button', text : 'both', flex : 1, scope : me, handler : me.onExtendInterval } ] }, { xtype: 'component', height: 5}, { xtype : 'container', layout : 'hbox', items : [ { xtype : 'label', text : 'Shift ... ', width : 60 }, { xtype: 'component', width: 5}, { xtype : 'button', text : 'left', flex : 1, scope : me, handler : me.onShiftInterval }, { xtype: 'component', width: 5}, { xtype : 'button', text : 'right', flex : 1, scope : me, handler : me.onShiftInterval } ] }, { xtype : 'component', autoEl: 'hr' }, this.getAdditionalRequestConfig(panelId) ] }; }, createImageTreePanel : function(panelId) { var me = this; return { xtype : 'treepanel', region : 'center', title : 'Image Selection', flex:1, rootVisible: false, autoScroll : true, animate: false, id : panelId+'-images-tree-panel', columns: [{ xtype: 'treecolumn', text: 'Images', flex: 1, sortable: false, dataIndex : 'id', renderer : function(value,metaData,record,rowIndex,colIndex,store,view) { if (record.get('leaf')) { if (record.get('additional_text')) return record.get('start') + ' - ' + record.get('additional_text'); else return record.get('start'); } var start = record.get('start'); var dt = Ext.Date.parse(start,'Y-m-d H:i:s'); return Ext.Date.format(dt, 'Y-m-d') + ' ('+record.childNodes.length+' image'+(record.childNodes.length > 1 ? 's' : '')+')'; } }], store : Ext.create('Ext.data.TreeStore', { root: { expanded: true, children: [] }, model : 'ImageNode' }), tbar : [ { text : 'Collapse all', flex : 1, scope : me, handler : function(o) { this.getImageTreePanel().collapseAll(); } }, { text : 'Expand all', flex : 1, scope : me, handler : function(o) { this.getImageTreePanel().expandAll(); } }, { text : 'Select all', flex : 1, scope : me, handler : function(o) { var root = this.getImageTreePanel().getRootNode(); root.eachChild(function (folder){ folder.eachChild(function (image){ image.set('checked',true); }); }); } }, { text : 'Unselect all', flex : 1, scope : me, handler : function(o) { var root = this.getImageTreePanel().getRootNode(); root.eachChild(function (folder){ folder.eachChild(function (image){ image.set('checked',false); }); }); } } ], dockedItems: [{ xtype: 'toolbar', dock: 'bottom', items: [ { xtype : 'checkbox', boxLabel: 'Load preview', listeners : { 'change' : function(o,newVal,oldVal,opts) { me.setPreview(newVal); } } }, '->', { xtype : 'button', text : 'Download selection', scope : this, handler : me.onDownload } ] }], listeners : { 'afterrender' : function(tree) { view = tree.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: false,//true, // Render immediately so that tip.body can be referenced prior to the first show. //renderTo : Ext.getBody(), //showDelay : 2, //hideDelay : 0, listeners: { // Change content dynamically depending on which element triggered the show. beforeshow: function (tip) { view = tree.getView(); record = view.getRecord(tip.triggerElement); if (record) { if (!record.get('leaf')) { var crtTip = 'Name : "' + record.get('name') + '"
'; crtTip += 'Start time : "' + record.get('start') + '"
'; tip.update(crtTip); return; } var crtTip = 'Name : ' + record.get('name') + '
'; crtTip += 'Start time : ' + record.get('start') + '
'; crtTip += 'Stop time : ' + record.get('stop') + '
'; crtTip += 'Exposure time : ' + record.get('exposure') + '
'; crtTip += 'Target : ' + record.get('target') + '
'; crtTip += 'Instrument : ' + record.get('instrument') + '
'; if (me.preview && me.getPreviewUrl) crtTip += '
'; tip.update(crtTip); } } } }); } } }; }, getImageTreePanel : function() { return this.queryById(this.id+'-images-tree-panel'); }, getTargetCombo : function() { return this.queryById(this.id+'-combo-target'); }, forceRefresh : function() { this.onRefreshTree(this); }, init : function(config) { var me = this; var myConf = { defaults: { bodyStyle: { background : '#dfe8f6' } }, layout : 'border', items: [ { xtype : 'panel', region : 'north', height : 40, html : this.getAcknowledgement ? this.getAcknowledgement() : 'ToDo - Acknowledgement' }, this.createRequestSelectorPanel(config.id), this.createImageTreePanel(config.id), { xtype : 'panel', region : 'south', layout : 'hbox', title : 'Interoperability', height : 60, items : [ { xtype : 'combobox', fieldLabel : 'Display Mode', flex : 2, disabled : true, allowBlank : false, editable: false, store : [ ["mosaic","mosaic"], ["movie","movie"], ["diff","diff"] ] }, { xtype: 'component', width: 5}, { xtype : 'button', flex : 1, text : 'Send to Aladin Web', scope : this, handler : this.onSendToWeb }, { xtype: 'component', width: 5}, { xtype : 'sendToSampButton', flex : 1, type : 'fits', onSendToSamp : me.onSendFITSToSAMP, sendOpt : {scope : me} } ] } ] }; Ext.apply (this , Ext.apply (arguments, myConf)); } });