InteropModule.js 8.36 KB
/**
 * Project   : AMDA-NG
 * Name      : InteropModule.js
 * @class    amdaDesktop.InteropModule
 * @extends  amdaDesktop.AmdaModule
 * @brief    Interop Module controller definition
 * @author   Benjamin RENARD
 * $Id: InteropModule.js 1870 2013-11-22 13:43:34Z elena $
 */


Ext.define('amdaDesktop.InteropModule', {
	extend: 'amdaDesktop.AmdaModule',

	requires: [
		'amdaUI.InteropUI',
		'amdaDesktop.SampModule',
		'amdaDesktop.EpnTapModule'
	],

	contentId : 'interopUI',

	/**
	* @cfg {String} window definitions
	* @required
	*/
	// height: 650,
	// width: 1050,
	uiType :    'panelInterop',
	helpTitle :'Help on Interop Module',
	helpFile: 'interopHelp.html',

	samp : null,

	sampclientsStore : new Ext.data.SimpleStore({
		idProperty: 'id',
		fields: [
			{name: 'id'},
			{name: 'name'},
			{name: 'descriptionText'},
			{name: 'iconUrl'},
			{name: 'acceptVOTable', type : 'boolean'},
			{name: 'acceptFITS', type : 'boolean'}
		]
	}),

	init : function() {
		this.launcher = {
			text : this.title,
			iconCls : this.icon,
			handler : this.createWindow,
			scope : this
		};
	},

	initSampConnector : function(successfn){
		var me = this;
		
		if (!this.samp)
		{
			this.samp = Ext.create('amdaDesktop.SampModule',{
				listeners : {
					connected : function(o,success)
					{
						if (!success)
							Ext.Msg.show( {
								title : 'SAMP',
								msg : 'Cannot connect AMDA to a hub',
								modal : false,
								icon : Ext.Msg.ERROR,
								buttons : Ext.Msg.OK
							});
						me.updateStatus();
						me.updateClients();
					},
					disconnected : function(o,success)
					{
						me.updateStatus();
						me.sampclientsStore.removeAll();
						me.updateClients();
					},
					clientregister : function(o,id)
					{
						me.updateClients();
					},
					clientunregister : function(o,id)
					{
						var record = me.sampclientsStore.getById(id);
						if (record)
						{
							me.sampclientsStore.remove(record);
							me.updateClients();
						}
					},
					clientmetachange : function(o,id,data,subs)
					{
						var record = me.sampclientsStore.getById(id);

						if (!record){
							me.sampclientsStore.add({id : id});
							record = me.sampclientsStore.getById(id);
						}

						if (record){
							record.set('descriptionText',data['samp.description.text']);
							record.set('iconUrl',data['samp.icon.url']);
							record.set('name',data['samp.name']);
							
							if (subs){
								record.set('acceptVOTable',
										me.samp.isSubscribed(subs,"table.load.votable"));
								record.set('acceptFITS',
										me.samp.isSubscribed(subs,"image.load.fits"));
							}
						}

						me.updateClients();
					},
					clientsubs : function(o,id,data)
					{
						var record = me.sampclientsStore.getById(id);

						if (!record)
							return;

						if (record){
							record.set('acceptVOTable',
									me.samp.isSubscribed(data,"table.load.votable"));
							record.set('acceptFITS',
									me.samp.isSubscribed(data,"image.load.fits"));
						}

						me.updateClients();
					},
					uploadfile : function(o,clientName,url,format)
					{
						myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.upload.id, true, function (module) {
							module.uploadNotification(url,format);
						});
					}
				}
			});
			this.samp.loadScript(function (s){
				if (successfn)
					successfn.call(me.samp);
			});
		}
	else
		this.samp.loadScript(function (s){
			if (successfn)
				successfn.call(me.samp);
		});
	},

	updateStatus : function()
	{
		if (this.app && this.samp)
		{
			var desktop = this.app.getDesktop();

			var isConnected = this.samp.isConnected();

			if (desktop){
				var win = desktop.getWindow(this.id);
				if (win && win.isVisible)
					win.items.items[0].updateStatus(isConnected);

				var taskbar = desktop.taskbar;

				if (taskbar){
					var samptb = taskbar.getComponent('samptb');
					if (samptb)
						samptb.updateStatus(isConnected);
				}
			}
		}
	},

	updateClients : function()
	{
		if (this.app && this.samp)
		{
			var desktop = this.app.getDesktop();

			var isConnected = this.samp.isConnected();

			if (desktop)
			{
				var win = desktop.getWindow(this.id);

				var taskbar = desktop.taskbar;

				if (taskbar)
				{
					var samptb = taskbar.getComponent('samptb');
					if (samptb)
						samptb.updateClients(this.sampclientsStore);
				}
			}
		}
	},

	sampConnected : function()
	{
		if (!this.samp)
			return false;
			return this.samp.isConnected();
	},

	sendVOTable : function(file,clientId)
	{
		if (!this.samp)
			return false;
		var href = window.location.href;
		var baseurl = href.replace('desktop.php','');
		this.samp.sendVOTable(baseurl+file,clientId);
	},

	sendAladinScript : function(script)
	{
		if (!this.samp)
			return false;
		this.samp.sendAladinScript(script);
	},

	sendFITS : function(url,name)
	{
		if (!this.samp)
			return false;
		this.samp.sendFITS(url,name);
	},

	loadFile: function(url,onLoad,onError) {
		if (!this.samp)
			return null;
		this.samp.loadFile(url,onLoad,onError);
	},

	loadEpnTap: function(filter) {
		if(!this.epntap) {
			this.epntap = Ext.create('amdaDesktop.EpnTapModule');
		}
		this.epntap.loadTarget(filter);
	},

	generateAladinScript : function(urlList, scriptType)
	{        
		var script = 'reset;';

		for( var i=0; i < urlList.length; i++) {
			var url = urlList[i].url;
			var name = urlList[i].name;
			script += 'get File(' + url +','+name+');';
		}

		script += 'sync;';
		switch( scriptType )
		{
			case('mosaic'):
			{
				script += 'sync;mview 16';
			}
			break;
			case('movie'):
			{
				script += 'blink ';
					for( var i=1; i < urlList.length; i++){
						script += urlList[i].name+" ";
					}
					script += ';';
			}
			break;
		}
		return script;
	},

	switchSampConnect : function()
	{
		var me = this;
		//loadMask.show();
		this.initSampConnector(function (s){
			if (me.samp.isConnected())
			{
				me.samp.disconnect();
			}
			else
			{
				me.samp.connect();
				//	loadMask.hide();
			}
		});
	},

	forceSampDisconnect : function()
	{
		if (!this.samp)
			return;

		if (!this.samp.isConnected())
			return;

		this.samp.disconnect();
	},

	getVOTableClients : function ()
	{
		//return list of all clients that can receive a VOTable
		if (!this.samp)
			return [];
		var result = new Array();
		this.sampclientsStore.each(function (client){
			if (client.get('acceptVOTable'))
				result.push({id : client.get('id'), name : client.get('name'), icon : client.get('iconUrl')});

		},this);
		return result;
	},

	getFITSClients : function ()
	{
		//return list of all clients that can receive a FITS image
		if (!this.samp)
			return [];
		var result = new Array();
		this.sampclientsStore.each(function (client){
			if (client.get('acceptFITS'))
				result.push({id : client.get('id'), name : client.get('name'), icon : client.get('iconUrl')});

		},this);
		return result;
	},
	
	// arguments from launcher : CONFIG (OBJECT!!!)
	createWindow : function(config){
		var me = this;
		var baseId = null;

		if (!Ext.isObject(config)) {
			baseId = config;
			var activeTab = 1;
		}
		else {
			var activeTab = 'activeTab' in config ? config['activeTab'] : 1;
		}
		var desktop = this.app.getDesktop();
		var win = desktop.getWindow(this.id);
		
		if(!win)
		{
			win = desktop.createWindow({
				id: this.id,
				title:this.title,
				layout: 'fit',
				minWidth: 650,
				minHeight: 350,
				minimizable: false,
				iconCls: this.icon,
				animCollapse:false,
				constrainHeader:true,
				bodyPadding : 5,
				stateful : true,
				stateId  : this.id,
				stateEvents: ['move','show','resize'],
				tools: [{
					type:'help',
					qtip: this.helpTitle,
					scope:this,
					handler: function(event, toolEl, panel) {
						myDesktopApp.getLoadedModule(myDesktopApp.dynamicModules.info.id, true, function(module) {
							module.createWindow(me.helpFile, me.helpTitle);
						});
					}
				}],
				items : [
				{
					xtype: 'panelInterop',
					clientsStore : this.sampclientsStore,
					activeTab : activeTab,
					baseId : baseId,
					loadTab: function(tab) {
						if(tab['id'] === 'epntapTab') {							
							me.loadEpnTap(Ext.isObject(config) && 'epntapFilter' in config ? config['epntapFilter']: false);							
						}
					},
					onSwitchConnect : function ()
					{
						me.switchSampConnect();
					}
				}]
			});
		} else if(activeTab == 2) {
				me.loadEpnTap(Ext.isObject(config) && 'epntapFilter' in config ? config['epntapFilter']: false);
		}

		if (me.samp && me.samp.ready)
			this.updateStatus();

		win.show();
		return win;
	}
});