//--------------------------------------------------------------------------------//
// 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.io.File;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.Point;
import javax.swing.BoxLayout;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JPanel;
import javax.swing.WindowConstants;
import xfuzzy.util.XCommandForm;
import xfuzzy.util.XConstants;
import xfuzzy.util.XLabel;
import xfuzzy.util.XTextForm;
import xfuzzy.xfsp.view.listener.XfspClusteringActionListener;
import xfuzzy.xfsp.view.listener.XfspWindowListener;
/**
* <p> <b>Descripci�n:</b> ventana que permite introducir par�metros num�ricos
* para aquellos procesos de simplificaci�n por <i>clustering</i> que lo
* requieran.
* <p> <b>E-mail</b>: <ADDRESS>joragupra@us.es</ADDRRESS>
* @author Jorge Agudo Praena
* @version 2.3
* @see IXfspView
* @see XfspClusteringActionListener
*
*/
public class XfspNumericParametersView
extends JDialog
implements IXfspView {
/**
* C�digo asociado a la clase serializable
*/
private static final long serialVersionUID = 95505666603076L;
//t�tulo de la vista
private XLabel titleLabel;
//panel que contendr� al t�tulo de la vista
private JPanel titlePanel;
//campo donde el usuario podr� introducir el numero de clusters en que quiere
//agrupar las funciones de pertenencia del tipo
private XTextForm[] parameters;
//panel que contendr� los campos para introducir los par�metros
private JPanel parametersPanel;
//panel que contendr� los campos de texto para la introducci�n de los pesos
private JPanel weightsPanel;
//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 XfspClusteringActionListener actionListener;
//almacena los nombres de los par�metros que se pueden introducir en la vista
private String[] parametersNames;
//almacena los valores iniciales para los par�metros
private double[] initialValues;
//almacena el nombre de la vista
private String name;
//almacena el t�tulo de la vista
private String title;
//almacena el fichero con la imagen de la f�rmula que debe aparecer en la
//vista (si la hay)
private File icon;
//almacena cierto si los par�metros de la vista son enteros y falso si son
//reales
private boolean intParameters;
/**
* <p> <b>Descripci�n:</b> crea una ventana que sirve para introducir �
* par�metros de tipos num�rico.
*
*/
public XfspNumericParametersView() {
super();
}
/**
* <p> <b>Descripci�n:</b> crea una vista adecuada para que el usuario pueda
* introducir par�metros num�ricos para aquellos procesos de simplificaci�n
* por <i>clustering</i> que lo requieran.
* @param actionListener Objeto que se encargar� de escuchar los eventos
* provocados por el ususario al pulsar los botones que muestra la vista.
*
*/
public XfspNumericParametersView(XfspClusteringActionListener
actionListener, String[] names,
String name) {
//establecemos el objeto pendiente de la escucha de los eventos generandos
//por el usuario
this.actionListener = actionListener;
//establece los nombres de los par�metros que se pueden introducir en la
//vista actual
this.parametersNames = names;
//establece el nombre de la vista actual
this.name = name;
}
/**
* <p> <b>Descripci�n:</b> construye la vista que permite la introducci�n de
* par�metros num�ricos.
*
*/
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);
//...y a�ade los botones de confirmaci�n en la parte de abajo del contenedor
content.add(confirmPanel, 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
titleLabel = new XLabel(this.title);
//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(titleLabel);
}
/**
* <p> <b>Descripci�n:</b> crea los campos necesarios para que el usuario
* pueda introducir los par�metros necesarios para llevar a cabo el m�todo.
*
*/
private void buildParameters() {
//panel que contendr� los campos de texto donde los usuarios podr�n
//introducir los par�metros
parametersPanel = new JPanel();
//crea un layout que disponga los elementos de forma vertical...
BoxLayout layout = new BoxLayout(parametersPanel, BoxLayout.Y_AXIS);
//...y establece dicho layout para el panel anterior
parametersPanel.setLayout(layout);
//crea un vector de campos de texto para todos los campos de texto que
//sirven para introducir par�metros
parameters = new XTextForm[parametersNames.length];
//para todos los campos de texto dispontibles para introducir par�metros...
for (int i = 0; i < parametersNames.length; i++) {
//...establece el valor por defecto para dicho campo de texto...
//....seg�n se un valor entero...
parameters[i] = new XTextForm(parametersNames[i]);
if (!this.intParameters) {
parameters[i].setText("" + initialValues[i]);
}
//...o un valor real
else {
parameters[i].setText("" + Math.round(initialValues[i]));
}
}
//establece la anchura por defecto para todos los campos de texto
XTextForm.setWidth(parameters);
//crea el panel para los pesos
weightsPanel = new JPanel(new GridLayout(parameters.length, 1));
//si la vista tiene que mostrar alguna f�rmula...
if (icon != null) {
Icon formula = new ImageIcon(icon.getAbsolutePath());
//...crea un bot�n que contendr� el icono con la f�rmula...
JButton button = new JButton(formula);
//...hace que el bot�n permacezca inactivo...
button.setEnabled(false);
//...y a�ade dicho bot�n al panel adecuado
parametersPanel.add(button);
}
for (int i = 0; i < parameters.length; i++) {
weightsPanel.add(parameters[i]);
}
parametersPanel.add(weightsPanel);
}
/**
* <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[] confirmation = {
"Ok", "Cancel"};
//comandos que se ejecutar�n cuando se pulse sobre los botones de
//confirmaci�n de la vista
String[] commands = {
this.name + "Ok", this.name + "Cancel"};
//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(confirmation, commands, 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() {
//inicializa la localizaci�n a la misma que tuviera la ventana padre...
Point loc = parentLocation;
//...la desplaza 40 p�xeles a la derecha...
loc.x += 40;
//...y 20 p�xeles hacia abajo
loc.y += 20;
//llama al m�todo setLocation de la superclase con la localizaci�n que debe
//tener la ventana de esta vista
setLocation(loc);
}
/**
* <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) {
//establece la localizaci�n de la ventana padre
parentLocation = loc;
}
/**
* <p> <b>Descripci�n:</b> establece el nombre de la vista actual.
* @param name Nombre que tomar� la vista actual.
*
*/
public void setName(String name) {
this.name = name;
}
/**
* <p> <b>Descripci�n:</b> establece el t�tulo de la vista.
* @param title T�tulo que mostrar� la ventana de la vista actual.
*
*/
public void setTitle(String title) {
this.title = title;
}
/**
* <p> <b>Descripci�n:</b> establece los valores por defecto para los
* par�metros que permite introducir la vista.
* @param initVal Valores por defecto que toman los par�metros que permite
* introducir la vista.
*
*/
public void setInitialValues(double[] initVal) {
this.initialValues = initVal;
}
/**
* <p> <b>Descripci�n:</b> establece los nombres de los distintos par�metros
* que permite introducir la vista.
* @param paramNames Nombres de los par�metros que permite introducir la
* vista.
*
*/
public void setParametersNames(String[] paramNames) {
this.parametersNames = paramNames;
}
/**
* <p> <b>Descripci�n:</b> establece el icono con la f�rmula que debe mostrar
* la vista actual.
* @param icon Fichero con la imagen de la f�rmula que debe aparecer en la
* vista actual.
*
*/
public void setFormulaIcon(File icon) {
this.icon = icon;
}
/**
* <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(XfspClusteringActionListener actionListener) {
this.actionListener = actionListener;
}
/**
* <p> <b>Descripci�n:</b> permite saber si los par�metros que se pueden
* introducir en la vista actual son enteros o reales.
* @param intParameters Vale cierto si los par�metros que muestra la vista
* actual son enteros y falso si son reales.
*
*/
public void setIntParameters(boolean intParameters) {
this.intParameters = intParameters;
}
/**
* <p> <b>Descripci�n:</b> obtiene el n-�simo par�metro de la vista.
* @return N-�simo par�metro de los que permite introducir la vista.
*
*/
public String getNthParameter(int n) {
String s = parameters[n].getText();
return s;
}
/**
* <p> <b>Descripci�n:</b> cierra la ventana de esta vista.
*
*/
public void close() {
//establece a falso la visibilidad de la ventana
setVisible(false);
}
}