//--------------------------------------------------------------------------------//
// COPYRIGHT NOTICE //
//--------------------------------------------------------------------------------//
// Copyright (c) 2012, Instituto de Microelectronica de Sevilla (IMSE-CNM) //
// //
// All rights reserved. //
// //
// Redistribution and use in source and binary forms, with or without //
// modification, are permitted provided that the following conditions are met: //
// //
// * Redistributions of source code must retain the above copyright notice, //
// this list of conditions and the following disclaimer. //
// //
// * Redistributions in binary form must reproduce the above copyright //
// notice, this list of conditions and the following disclaimer in the //
// documentation and/or other materials provided with the distribution. //
// //
// * Neither the name of the IMSE-CNM nor the names of its contributors may //
// be used to endorse or promote products derived from this software //
// without specific prior written permission. //
// //
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" //
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE //
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE //
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE //
// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL //
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR //
// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER //
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, //
// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE //
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. //
//--------------------------------------------------------------------------------//
package xfuzzy.xfsp.view;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.Point;
import javax.swing.JDialog;
import javax.swing.JPanel;
import javax.swing.WindowConstants;
import xfuzzy.lang.Parameter;
import xfuzzy.lang.ParamMemFunc;
import xfuzzy.util.XCommandForm;
import xfuzzy.util.XConstants;
import xfuzzy.util.XLabel;
import xfuzzy.util.XTextForm;
import xfuzzy.xfsp.view.listener.XfspFunctionMergeActionListener;
import xfuzzy.xfsp.view.listener.XfspWindowListener;
/**
* <p> <b>Descripci�n:</b> ventana que permite al usuario la introducci�n de
* los par�metros adecuados para una nueva funci�n de pertenencia cuyo tipo ha
* sido ya seleccionado.
* <p>
* @author Jorge Agudo Praena
* @version 3.2
* @see IXfspView
*
*/
public class XfspParamMemFunctionParametersView
extends JDialog
implements IXfspView {
/**
* C�digo asociado a la clase serializable
*/
private static final long serialVersionUID = 95505666603077L;
//t�tulo de la vista
private XLabel title;
//panel que contendr� al t�tulo de la vista
private JPanel titlePanel;
//panel que contiene los campos de texto para la introducci�n de los
//par�metros de una funci�n de pertenencia
private JPanel parametersPanel;
//botones que permiten al usuario confirmar que los datos introducidos son
//correctos o cancelar la introducci�n de par�metros
private XCommandForm confirmForm;
//panel que contendr� los botones de confirmaci�n
private JPanel confirmPanel;
//referencia a la localizaci�n de la vista padre a esta (aquella que la
//origin�)
private Point parentLocation;
//objeto que se encarga de escuchar los eventos generados por el usuario al
//pulsar los distintos botones de la vista
private XfspFunctionMergeActionListener actionListener;
//funci�n de pertenencia cuyos par�metros van a ser introducidos mediante la
//vista
private ParamMemFunc mf;
/**
* <p> <b>Descripci�n:</b> crea una ventana que sirve para introducir los
* par�metros que definen una funci�n de pertenencia param�trica.
*
*/
public XfspParamMemFunctionParametersView() {
super();
}
/**
* <p> <b>Descripci�n:</b> construye la ventana inicializando todos los
* componentes que contiene.
*
*/
public void build() {
//construye el t�tulo de la vista
buildTitle();
//construye la parte donde el usuario puede introducir los par�metros
//necesarios
buildParameters();
//contruye los botones de confirmaci�n
buildConfirmation();
//obtiene el contenedor de la ventana correspondiente a la vista
Container content = getContentPane();
//a�ade en la parte de arriba de dicho contenedor el t�tulo de la vista...
content.add(titlePanel, BorderLayout.NORTH);
//...a�ade el panel donde se pueden introducir los par�metros en el
//centro...
content.add(parametersPanel, BorderLayout.CENTER);
//...y a�ade los botones de confirmaci�n en la parte de abajo del contenedor
content.add(confirmForm, BorderLayout.SOUTH);
//establece la operaci�n por defecto cuando se cierra la ventana
setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
//establece un nuevo objeto de tipo XfspWindowListener como el encargado de
//escuchar los eventos de ventana generados por el usuario
addWindowListener(new XfspWindowListener(this));
//establece la fuente que debe utilizar la vista
setFont(XConstants.font);
//ajusta el tama�o que debe tener la ventana
pack();
//establece la posici�n que debe ocupar la ventana de la vista
setLocation();
}
/**
* <p> <b>Descripci�n:</b> crea el r�tulo con el t�tulo de la vista.
*
*/
private void buildTitle() {
//t�tulo de la vista para la introducci�n de par�metros del m�todo Custom
title = new XLabel("Parameters for " + mf.getLabel());
//inicializa el panel situado en la parte superior que contendr� el titulo
//de la vista
titlePanel = new JPanel(new GridLayout(1, 1));
//a�ade al panel el t�tulo de la vista
titlePanel.add(title);
}
/**
* <p> <b>Descripci�n:</b> crea los campos necesarios para que el usuario
* pueda introducir los par�metros que definen la funci�n de pertenencia.
*
*/
private void buildParameters() {
//almacena los par�metros de la funci�n de pertenencia
Parameter[] parameters = mf.getParameters();
//crea nuevo panel en el que los elementos se dispondr�n en una sola columna
parametersPanel = new JPanel(new GridLayout(parameters.length, 1));
//iniciliza el vector de campos de texto para los par�metros de la funci�n
XTextForm[] tvector = new XTextForm[parameters.length];
//para cada uno de los par�metros de la funci�n...
for (int i = 0; i < parameters.length; i++) {
//...lo inicializa con el nombre del par�metro que permite definir en su
//etiqueta...
XTextForm auxTextForm = new XTextForm("Parameter " +
parameters[i].getName() +
" value");
//...y lo a�ade al panel creado...
parametersPanel.add(auxTextForm);
//...y al vector de campos de texto
tvector[i] = auxTextForm;
}
//establece la anchura �ptima para todos los campos de texto
XTextForm.setWidth(tvector);
}
/**
* <p> <b>Descripci�n:</b> crea el campo de confirmaci�n de la vista.
*
*/
private void buildConfirmation() {
//cadenas de caracteres que deben aparecer en los botones de confirmaci�n
//de la vista
String[] confirmationText = {
"Ok", "Refresh", "Cancel"};
//comandos que se ejecutar�n cuando se pulse sobre los botones de
//confirmaci�n de la vista
String[] confirmationCommands = {
"ParametersOk", "ParametersRefresh", "ParametersCancel"};
//crea un nuevo campo de confirmaci�n con las cadenas que deben mostrar
//los bontones, los comandos que se deben ejecutar al pulsar sobre ellos y
//el objeto encargado de escuchar los dichos eventos
confirmForm = new XCommandForm(confirmationText, confirmationCommands,
actionListener);
//establece el ancho del campo de confirmaci�n...
confirmForm.setCommandWidth(120);
//...y lo fija
confirmForm.block();
//inicializa el nuevo panel que contendr� al campo de confirmaci�n de la
//vista...
confirmPanel = new JPanel();
//...establece el layout para el panel...
confirmPanel.setLayout(new GridLayout(1, 1));
//...as� como el tama�o predefinido...
confirmPanel.setPreferredSize(new Dimension(400, 50));
//...y a�ade el conjunto de botones de confirmaci�n al panel
confirmPanel.add(confirmForm);
}
/**
* <p> <b>Descripci�n:</b> establece la localizaci�n en pantalla de la
* ventana.
*
*/
private void setLocation() {
Point loc = parentLocation;
loc.x += 20;
loc.y += 100;
setLocation(loc);
}
/**
* <p> <b>Descripci�n:</b> devuelve la funci�n de pertenencia cuyos
* par�metros se pueden definir a trav�s de la vista.
* @return Funci�n de pertenencia param�trica cuyos par�metros permite
* establecer la vista.
*
*/
public ParamMemFunc getMF() {
return mf;
}
/**
* <p> <b>Descripci�n:</b> establece la funci�n de pertenencia cuyos
* par�metros podr�n ser definidos mediante la vista.
* @param mf Funci�n de pertenencia par�metrica para la que la vista
* permitir� introducir sus par�metros.
*
*/
public void setMF(ParamMemFunc mf) {
this.mf = mf;
}
/**
* <p> <b>Descripci�n:</b> establece el objeto encargado de atender los
* eventos generados por la vista actual.
* @param actionListener Objeto encargado de atender los eventos generados
* por la vista actual.
*
*/
public void setActionListener(XfspFunctionMergeActionListener actionListener) {
this.actionListener = actionListener;
}
/**
* <p> <b>Descripci�n:</b> permite establecer la posici�n de la ventana padre
* de esta vista, es decir, aquella que la origi�.
* @param loc Localizaci�n de la ventana padre de la vista.
*
*/
public void setParentLocation(Point loc) {
parentLocation = loc;
}
/**
* <p> <b>Descripci�n:</b> devuelve los par�meros introducidos por el usuario
* para la funci�n de pertenencia.
* @return Par�metros introducidos en la vista para la funci�n de pertenencia
* param�trica que se est� definiendo.
*
*/
public Parameter[] getParameters() {
//par�metros de la funci�n de pertenencia
Parameter[] parameters = mf.getParameters();
//almacena los par�metros introducidos para la funci�n de pertenencia
Parameter[] result = new Parameter[parameters.length];
//almacena el campo de texto que se est� tratando en un momento dado
XTextForm auxTextForm = null;
//almacena el valor en forma de cadena contenido en el campo de texto que
//se est� tratando
String stringValue = null;
try {
//para cada uno de los par�metros de la funci�n de pertenencia...
for (int i = 0; i < parameters.length; i++) {
//...obtiene el par�metro actual...
result[i] = (Parameter) parameters[i].clone();
//...as� como el campo de texto que lo contiene
auxTextForm = (XTextForm) parametersPanel.getComponent(i);
//obtiene el valor en forma de cadena que almacena dicho campo de...
//texto
stringValue = auxTextForm.getText();
//...y lo convierte a valor double
double value = Double.parseDouble(stringValue);
//establece el valor para el par�metro actual
result[i].value = value;
}
}
catch (NumberFormatException e) {
result = null;
}
return result;
}
/**
* <p> <b>Descripci�n:</b> cierra la ventana de esta vista.
*
*/
public void close() {
setVisible(false);
}
}