PlotPreviewUI.js 9.39 KB
/**
 * Project   : AMDA-NG
 * Name      : PlotPreviewUI.js
 * @class    amdaPlotComp.PlotPreviewUI
 * @extends  Ext. panel.Panel
 * @brief    Plot Preview UI definition (View)
 * @author    
 * @version  $Id: PlotPreviewUI.js benjamin $
 ********************************************************************************
 *    FT Id     :   Date   : Name - Description
 *******************************************************************************
 *              
 */

Ext.define('amdaPlotComp.PlotPreviewUI', {
	extend: 'Ext.panel.Panel',

	alias: 'widget.plotPreview',

	requires: [
		'amdaPlotComp.PlotContextManager',
		'amdaPlotComp.PlotResultImage',
		'amdaUI.PlotTabResultUI'
	],

	isPlotFunction: false,
	disableDownloadingData:false,
	panelImage: null,
	crtContext: null,
	sliderPage: null,
	contextualMenu: null,
	hiddenForm: null,
	panelResultInstance: null,
	gotoDateGroup: null,
	downloadDataBtn: null,
	folder: null,
	plotFile: null,

	setPanelResultInstance: function (panelResultInstance_) {
		this.panelResultInstance = panelResultInstance_;
	},

	constructor: function (config) {
		this.init(config);
		this.callParent(arguments);
	},

	getImageSize: function () {
		if (!this.crtContext)
			return {
				width: 0,
				height: 0
			};

		return {
			width: this.crtContext.page.width * this.sliderPage.getValue() / 100.,
			height: this.crtContext.page.height * this.sliderPage.getValue() / 100.
		}
	},

	getImageUrl: function (resultFolder, plotFile) {
		return 'data/' + sessionID + '/RES/' + resultFolder + '/' + plotFile;
	},

	toPixelOnSourceImage: function (value) {
		return value * 100 / this.sliderPage.getValue();
	},

	toPixelOnResultImage: function (value) {
		return value * this.sliderPage.getValue() / 100;
	},
	getAxisValue: function (axis, pixelMin, pixelMax, pixelVal) {
		var val = amdaPlotComp.PlotContextManager.toAxisValue(axis, pixelMin, pixelMax, pixelVal);
		return parseFloat(val).toPrecision(5);
	},

	createPlotImage: function (resultFolder, plotFile) {
		var me = this;
		var size = this.getImageSize();
		this.folder = resultFolder;
		this.plotFile = plotFile;
		this.panelImage = Ext.create('amdaPlotComp.PlotResultImage', {
			src: this.getImageUrl(resultFolder, plotFile),
			width: size.width,
			height: size.height,
			onMouseMove: function (x, y) {
				if (!me.crtContext)
					return;

				var sourceXPos = me.toPixelOnSourceImage(x);
				var sourceYPos = me.toPixelOnSourceImage(y);
				var panel = amdaPlotComp.PlotContextManager.getPanel(me.crtContext, sourceXPos, sourceYPos);

				var text = '';
				if (me.panelImage) {
					if (!panel) {
						me.panelImage.resetCursor();
						text += 'No panel';
					}
					else {
						text += 'Panel Id : ';
						text += panel.id;
						if (amdaPlotComp.PlotContextManager.isInPlotArea(panel, sourceXPos, sourceYPos)) {
							/*me.panelImage.updateCursor(
								me.toPixelOnResultImage(panel.plotArea.x),
								me.toPixelOnResultImage(panel.plotArea.y),
								me.toPixelOnResultImage(panel.plotArea.width),
								me.toPixelOnResultImage(panel.plotArea.height),
								x, y);*/
							me.panelImage.updateCursor(
								me.toPixelOnResultImage(0),
								me.toPixelOnResultImage(0),
								me.toPixelOnResultImage(me.crtContext.page.width),
								me.toPixelOnResultImage(me.crtContext.page.height),
								x, y);

							var xText = '';
							var yLeftText = '';
							Ext.each(panel.plotArea.axes, function (axis) {
								switch (axis.id) {
									case 'y-left':
										yLeftText = me.getAxisValue(axis, panel.plotArea.y + panel.plotArea.height, panel.plotArea.y, sourceYPos);
										break;
									case 'xaxis_id':
										xText = me.getAxisValue(axis, panel.plotArea.x, panel.plotArea.x + panel.plotArea.width, sourceXPos);
										break;
								}

							});

							if (xText != '')
								text += (', X : ' + xText);
							if (yLeftText != '')
								text += (', Y : ' + yLeftText);
						}
						else
							me.panelImage.resetCursor();
					}
				}
				me.coordinatesField.setText(text);
			},
			onContextMenu: function (absoluteX, absoluteY, imageX, imageY) {
				me.contextualMenu.showAt(absoluteX, absoluteY);
			}
		});

		return this.panelImage;
	},

	updatePlotImage: function (configResult, newPlot) {
		this.crtContext = configResult.context;
		this.isPlotFunction = configResult.plotFile.includes("plotFunction") || configResult.plotFile.includes("histoPlot");
		this.interactiveId = configResult.interactiveId;
		this.panelId = configResult.panelId;
		this.folder = configResult.folder;
		this.plotFile = configResult.plotFile;


		this.panelImage.setSrc(this.getImageUrl(this.folder, configResult.plotFile));
		this.time = new Date(configResult.time);
		this.time = Ext.Date.add(this.time, Ext.Date.MINUTE, this.time.getTimezoneOffset());
		if (!this.isPlotFunction)
			Ext.getCmp('plotPreview-goto-Date').setValue(this.time);
		var size = this.getImageSize();
		this.panelImage.setSize(size.width, size.height);

		this.gotoDateGroup.setVisible(!this.isPlotFunction);

		this.panelImage.refreshMe();
	},

	init: function (configResult) {
		var me = this;

		this.crtContext = configResult.context;
		this.interactiveId = configResult.interactiveId;
		this.time = new Date(configResult.time);
		this.time = Ext.Date.add(this.time, Ext.Date.MINUTE, this.time.getTimezoneOffset());
		this.panelId = configResult.panelId;
		//Solution temporaire
		this.isPlotFunction = configResult.plotFile.includes("plotFunction") || configResult.plotFile.includes("histoPlot");
		this.disableDownloadingData = configResult.plotFile.includes("histoPlot");
		this.plotFile = configResult.plotFile;

		this.coordinatesField = new Ext.toolbar.TextItem({
			width: 300,
			text: ''
		});

		this.sliderPage = new Ext.slider.Single({
			width: 130,
			value: 75,
			increment: 5,
			minValue: 50,
			maxValue: 100,
			fieldLabel: 'Resize',
			labelWidth: 40,
			listeners: {
				scope: this,
				changecomplete: function (s, v) {
					var size = this.getImageSize();
					this.panelImage.width = size.width;
					this.panelImage.height = size.height;
					this.panelImage.doComponentLayout();
				}
			}
		});

		this.gotoDateGroup = new Ext.container.ButtonGroup({
			columns: 4,
			hidden: this.isPlotFunction,
			items: [
				{
					xtype: 'datefield',
					allowBlank: true,
					format: 'Y-m-d\\TH:i:s.u',
					id: 'plotPreview-goto-Date',
					value: this.time,
					width: 175,
					renderer: function (value) {
						if (value != null) {
							if (Ext.isDate(value)) {
								return Ext.Date.format(value, 'Y-m-d\\TH:i:s.u');
							} else {
								return Ext.Date.format(new Date(value), 'Y-m-d\\TH:i:s.u');
							}
						} else {
							return value;
						}
					}
				}, 
				{
					xtype: 'button',
					text: 'Change cut time',
					scope: this,
					handler: function (bt) {
						var newTime = Ext.getCmp('plotPreview-goto-Date').getValue();
						newTime = Ext.Date.add(newTime, Ext.Date.MINUTE, -newTime.getTimezoneOffset());
						me.panelResultInstance.callInteractivePlot({ 'action': 'instant', 'interactiveId': me.panelResultInstance.interactiveId, 'panelId': me.panelId, 'time': newTime.toISOString() });
					}
				},
				{
					xtype: 'button',
					text: 'Previous',
					handler: function () {
						var newTime = new Date(amdaPlotComp.PlotContextManager.getInstantTimePrev(me.crtContext) * 1000);
						me.panelResultInstance.callInteractivePlot({ 'action': 'instant', 'interactiveId': me.panelResultInstance.interactiveId, 'panelId': me.panelId, 'time': newTime.toISOString() });
					}
				},
				{
					xtype: 'button',
					text: 'Next',
					handler: function () {
						var newTime = new Date(amdaPlotComp.PlotContextManager.getInstantTimeNext(me.crtContext) * 1000);
						me.panelResultInstance.callInteractivePlot({ 'action': 'instant', 'interactiveId': me.panelResultInstance.interactiveId, 'panelId': me.panelId, 'time': newTime.toISOString() });
					}
				}
			],
		});

		this.downloadDataBtn = new Ext.button.Button({
			xtype: 'button',
			text: 'Download Data',
			handler: function () {
				var path = me.getImageUrl(me.folder, me.plotFile.replace(".png", ""));
				path += "_data.txt";
				window.open(path, "_blank");
			}
		});

		var topToolbar =
		{
			xtype: 'toolbar',
			dock: 'top',
			items: [
				this.gotoDateGroup,
				me.disableDownloadingData ? null: this.downloadDataBtn,
			]
		}
		var mouseToolbar = {
			xtype: 'toolbar',
			height: 25,
			dock: 'bottom',
			items: [
				this.coordinatesField,
				'->',
				this.sliderPage
			]
		};

		this.contextualMenu = Ext.create('Ext.menu.Menu', {
			width: 200,
			plain: true,
			items: [
				{
					text: 'Save Plot',
					handler: function () {
						if (me.hiddenForm == null)
							me.hiddenForm = Ext.create('Ext.form.Panel', {
								title: 'hiddenForm',
								renderTo: Ext.getBody(),
								standardSubmit: true,
								url: 'php/downloadPlot.php',
								timeout: 120000,
								height: 100,
								width: 100,
								hidden: true,
								items: []
							});

						me.hiddenForm.getForm().submit({
							params: {
								sessionId: sessionID,
								interactiveId: me.interactiveId,
								preview: true,
								function: me.isPlotFunction
							},
							success: function (form, action) { },
							failure: function (form, action) { }
						});
					}
				}
			]
		});

		var plotPreviewPanelConfig = {
			preventHeader: true,
			autoScroll: false,
			items: [
				this.createPlotImage(configResult.folder, configResult.plotFile)
			],
			dockedItems:[topToolbar, mouseToolbar]
		};

		Ext.apply(this, plotPreviewPanelConfig);
	},
});