//--------------------------------------------------------------------------------//
// 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.JFrame;
import javax.swing.JPanel;
import javax.swing.WindowConstants;
import xfuzzy.lang.Type;
import xfuzzy.util.XCommandForm;
import xfuzzy.util.XConstants;
import xfuzzy.util.XDialog;
import xfuzzy.util.XLabel;
import xfuzzy.util.XTextForm;
import xfuzzy.xfsp.controller.XfspStore;
import xfuzzy.xfsp.view.listener.XfspSimilarityActionListener;
import xfuzzy.xfsp.view.listener.XfspWindowListener;
/**
* <p> <b>Descripci�n:</b> ventana que permite introducir los par�metros
* necesarios para poder llevar a cabo la simplificaci�n de un tipo mediante el
* c�lulo de la media de similaridad entres sus funciones de pertenencia.
* <p> <b>E-mail</b>: <ADDRESS>joragupra@us.es</ADDRRESS>
* @author Jorge Agudo Praena
* @version 2.0
* @see IXfspView
* @see XfspSimilarityActionListener
* @see XfspView
*
*/
public class XfspSimilarityParametersView
extends JFrame
implements IXfspView {
/**
* C�digo asociado a la clase serializable
*/
private static final long serialVersionUID = 95505666603079L;
//t�tulo de la vista
private XLabel title;
//panel que contendr� al t�tulo de la vista
private JPanel titlePanel;
//panel que contendr� la f�rmula de la medida de similaridad
private JPanel similarityFormulaPanel;
//panel que contendr� el panel con el t�tulo de la ventana y el panel con la
//f�rmula de la medida de similaridad
private JPanel similarityPanel;
//etiqueta con el t�tulo para los par�metros
private XLabel parametersTitle;
//panel que contendr� el panel con el t�tulo para los par�metros
private JPanel parametersTitlePanel;
//campo de texto que permite introducir el umbral para el proceso de
//simplificaci�n por similaridad
private XTextForm threshold;
//panel que contendr� el t�tulo de los par�metros y el campo de texto para la
//introducci�n del umbral
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;
//tipo que se debe simplificar mediante el uso de medidas de similaridad
private Type type;
//almac�n donde almacenar los enventos que la vista quiera dirigir al modelo
//para que puedan ser procesador por alg�n controlador
private XfspStore store;
/**
* <p> <b>Descripci�n:</b> crea una ventana que sirve para configurar el
* proceso de simplificaci�n tipos por t�cnicas de similaridad.
* @param type Tipo que se quiere simplificar.
* @param store Almac�n donde se deben guardar los eventos producidos por la
* ventana para que sean procesados por alg�n controlador.
*
*/
public XfspSimilarityParametersView(Type type, XfspStore store) {
//llama al constructor de la clase padre
super("Xfuzzy 3.0.0");
//establece el tipo a simplificar
this.type = type;
//establece el almac�n donde guardar los eventos
this.store = store;
}
/**
* <p> <b>Descripci�n:</b> construye todos los elementos de la interfaz
* gr�fica correspondiente a la simplificaci�n de tipos mediante uso de
* medidas de similaridad.
*
*/
public void build() {
//crea el objeto que debe atender los eventos generados por esta ventana
new XfspSimilarityActionListener(this, this.store, this.type);
//construye el t�tulo de la ventana
buildTitle();
//construye los campos de texto precisos para seleccionar el umbral que se
//debe utilizar para la simplificaci�n por similaridad
buildParameters();
//crea los botones en la parte inferior de la ventana que permiten
//confirmar los par�metros introduccidos y continuar con el proceso de
//clustering o abortar la operaci�n
buildConfirmation();
//obtiene el contendor de la ventana
Container content = getContentPane();
//a�ade el panel con el t�tulo de la ventana y la f�rmula de la medida de
//similaridad
content.add(similarityPanel, BorderLayout.NORTH);
//a�ade el panel con los par�metros para el c�lculo de la medida de
//similaridad
content.add(parametersPanel);
//a�ade el panel con los botones de confirmaci�n o rechazo en la parte
//inferior de la ventana
content.add(confirmPanel, BorderLayout.SOUTH);
//establece la operaci�n por defecto a realizar cuando se cierra la ventana
setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
//establece el objeto que debe atender los eventos de ventana
addWindowListener(new XfspWindowListener(this));
//establece la fuente para el texto que aparece en la ventana
setFont(XConstants.font);
//ajusta el tama�o de la ventana
pack();
//establece la localizaci�n en que se debe mostrar la ventana
setLocation();
}
/**
* <p> <b>Descripci�n:</b> crea el t�tulo de la ventana as� como el panel que
* lo contendr�.
*
*/
private void buildTitle() {
//t�tulo del panel para la introducci�n de par�metros
title = new XLabel("Similarity");
//crea el panel situado en la parte superior en la opci�n de tipos...
titlePanel = new JPanel(new GridLayout(1, 1));
//...y le a�ade el t�tulo de la ventana
titlePanel.add(title);
//establece la ruta donde se est� ejecutando el entorno
File path = new File(System.getProperty("xfuzzy.path"));
//esta l�nea puede tener que ser modificada en la versi�n definitiva para
//poder ser usados los iconos correctamente
//abre el fichero que contiene la imagen con la f�rmula de la medida de
//similaridad empleada
File icon = new File(path, "smp/gif/similarity.gif");
//crea una imagen con la f�rmula de la similaridad
Icon weightFormula = new ImageIcon(icon.getAbsolutePath());
//crea un bot�n que contendr� el icono con la f�rmula de la similaridad
JButton button = new JButton(weightFormula);
//hace que el bot�n permacezca inactivo
button.setEnabled(false);
//crea un panel que contendr� la f�rmula de la similaridad
similarityFormulaPanel = new JPanel(new GridLayout(1, 1));
//a�ade el bot�n de la f�rmula al panel
similarityFormulaPanel.add(button);
//crea el panel situado en la parte superior de la ventana
similarityPanel = new JPanel();
//crea un layout que disponga los elementos de forma vertical...
BoxLayout layout = new BoxLayout(similarityPanel, BoxLayout.Y_AXIS);
//...y lo establece como layout del panel superior
similarityPanel.setLayout(layout);
//a�ade al panel el t�tulo de la ventana...
similarityPanel.add(titlePanel);
//...la f�rmula de la similaridad utilizada
similarityPanel.add(similarityFormulaPanel);
}
/**
* <p> <b>Descripci�n:</b> crea el t�tulo para los par�metros y el campo de
* texto para la introducci�n del umbral.
*
*/
private void buildParameters() {
//t�tulo de la secci�n para la introducci�n de par�metros
parametersTitle = new XLabel("Parameters");
//panel donde estar� ubicado el t�tulo para la introducci�n de par�metros
parametersTitlePanel = new JPanel(new GridLayout(1, 1));
//a�ade la etiqueta con el t�tulo al panel
parametersTitlePanel.add(parametersTitle);
//crea el campo de texto para que el usuario introduzca el umbral a utilizar
threshold = new XTextForm("Threshold");
//establece el valor por defecto para el umbral
threshold.setText("0.8");
//crea un vector donde almacenar todos los campos de texto que deben
//aparecer en la ventana
XTextForm[] tvector = new XTextForm[1];
//establece el umbral como el primer campo de texto de la ventana
tvector[0] = threshold;
//ajusta todos los campos de texto de la ventana
XTextForm.setWidth(tvector);
//crea el panel para los par�metros...
parametersPanel = new JPanel(new GridLayout(2, 1));
//...y le a�ade el panel con el t�tulo de los par�metros...
parametersPanel.add(parametersTitlePanel);
//...y el campo de texto donde introducir el umbral
parametersPanel.add(threshold);
}
/**
* <p> <b>Descripci�n:</b> crea los botones que permiten iniciar el
* proceso de simplificaci�n por <b>clustering</b> o cancelarlo y el
* panel que contendr� dichos botones.
*
*/
private void buildConfirmation() {
//vector con todas las cadenas de caracteres utilizadas para la confirmaci�n
//o cancelacion del proceso de clustering
String[] confirmation = {
"Ok", "Cancel"};
//crea un conjunto de botones que permiten cancelar o seguir adelante con la
//simplificaci�n de tipos mediante clustering...
confirmForm = new XCommandForm(confirmation, confirmation,
new XfspSimilarityActionListener(this, store,
type));
//...establece la anchura para el conjunto anterior...
confirmForm.setCommandWidth(120);
//...y lo fija
confirmForm.block();
//crea un panel que contendr� al conjunto de bontones de confirmaci�n...
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 posici�n en pantalla de la ventana en
* funci�n de la posici�n ocupada por su ventana padre.
*
*/
private void setLocation() {
Point loc = parentLocation;
loc.x += 40;
loc.y += 200;
setLocation(loc);
}
/**
* <p> <b>Descripci�n:</b> establece la posici� en pantalla de la ventana
* padre de la actual.
* @param loc Posici�n ocupada en la pantalla por la ventana padre del objeto
* actual.
*
*/
public void setParentLocation(Point loc) {
parentLocation = loc;
}
/**
* <p> <b>Descripci�n:</b> obtiene el umbral introducido por el usuario para
* el m�todo de simplificaci�n de tipos por similaridad.
* @return Valor introducido por el usuario como umbral para el m�todo de
* simplificaci�n de tipos por similaridad.
*
*/
public double getThreshold() {
//valor del umbral
double ths = 0;
//obtiene la cadena del campo de texto para el umbral
String s = threshold.getText();
try {
//convierte a double dicha cadena de texto
ths = Double.parseDouble(s);
}
//si no se pudo convertir la cadena...
catch (NumberFormatException e) {
//...muestra un mensaje de error por pantalla...
String[] message = {
"Incorrect argument for threshold",
"You must enter a float number"
};
XDialog.showMessage(this, message);
//...y devuelve como umbral 0
ths = 0;
}
return ths;
}
/**
* <p> <b>Descripci�n:</b> cierra la ventana correspondiente a la
* simplificaci�n de tipos mediante t�cnicas de <i>clustering<\i>.
*
*/
public void close() {
setVisible(false);
}
}