//--------------------------------------------------------------------------------// // 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 java.awt.event.MouseAdapter; import javax.swing.BoxLayout; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTabbedPane; import javax.swing.JTextArea; import javax.swing.JScrollPane; import javax.swing.WindowConstants; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import xfuzzy.XfuzzyIcons; import xfuzzy.lang.Type; import xfuzzy.lang.Rule; import xfuzzy.lang.Rulebase; import xfuzzy.util.XCommandForm; import xfuzzy.util.XConstants; import xfuzzy.util.XDialog; import xfuzzy.util.XLabel; import xfuzzy.util.XList; import xfuzzy.xfsp.XfspEvent; import xfuzzy.xfsp.controller.XfspStore; import xfuzzy.xfsp.view.listener.XfspViewActionListener; import xfuzzy.xfsp.view.listener.XfspWindowListener; /** * <p> <b>Descripci�n:</b> Vista del sistema de simplificaci�n de sistemas * difusos que permite visualizar el sistema y seleccionar los distintos * m�todos de simplificaci�n. * <p> <b>E-mail</b>: <ADDRESS>joragupra@us.es</ADDRRESS> * @author Jorge Agudo Praena * @version 5.3 * @see XfspController * @see XfspModel * */ public class XfspView extends JFrame implements IXfspView { /** * C�digo asociado a la clase serializable */ private static final long serialVersionUID = 95505666603080L; //panel principal de la herramienta private JTabbedPane mainPane; //paneles para la simplificaci�n de tipos private JPanel typesPanel; private JPanel typesTop; private JPanel typesLeft; private JPanel typesRightTop; private JPanel typesRightDown; private JPanel typesRight; private JPanel typesCentral; //elementos para los paneles de simplificaci�n de tipos private XLabel typesTitle; private XList typesList; private XfspGraphPanel graph; private XCommandForm typesAlgorithm; //distintos algoritmos que se pueden utilizar para simplificar los tipos String[] typesAlgorithms = { "Purge", "Clustering", "Similarity"}; //tipos del sistema private Type[] types; //paneles para la simplificaci�n de bases de reglas private JPanel rulesPanel; private JPanel rulesTop; private JPanel rulesLeft; private JPanel rulesRightTop; private JPanel rulesRightDown; private JPanel rulesRight; private JPanel rulesCentral; //elementos para los paneles de simplificaci�n de bases de reglas private XLabel rulesTitle; private XList ruleBasesList; private JTextArea rulesList; private JScrollPane rulesListPane; private XCommandForm rulesAlgorithm; //distintos algoritmos que se pueden utilizar para simplificar las reglas String[] rulesAlgorithms = { "Pruning", "Compress", "Expand", "TabularSimplification"}; //bases de reglas del sistema private Rulebase[] ruleBases; //reglas de una base de reglas en particular private Rule[] rules; //opciones que se pueden elegir tras la simplificaci�n private XCommandForm finalOptions; private String[] finalOptionsLabel = { "Reload", "Apply", "Save", "Close"}; private Point viewLocation; //almacena si el sistema fue llamado desde Xfuzzy private boolean xfuzzy; //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 XfspViewActionListener actionListener; //nombre del sistema a simplificar private String name; //almac�n donde deben ser guardados los eventos generados por la vista private XfspStore store; /** * <p> <b>Descripci�n:</b> crea una vista del sistema y le indica el almac�n * donde deber� guardar los eventos generados para que sean procesados. * @param store Almac�n donde se deben guardar los eventos producidos por la * vista para que sean procesados por alg�n controlador. * */ public XfspView(XfspStore store) { //llama al constructor de la clase padre super("Xfsp"); //establece el almac�n donde guardar los eventos this.store = store; this.viewLocation = null; } /** * <p> <b>Descripci�n:</b> construye todos los elementos de la interfaz * gr�fica correspondiente a la vista del sistema. * */ public void build() { //crea el objeto que debe atender los eventos generados por esta ventana //as� como por las que permiten la configuraci�n de los pesos de las //funciones de pertenencia y de los m�todos de validaci�n de clusters actionListener = new XfspViewActionListener(this, this.store); //construye la ventana que permite la simplificaci�n de tipos buildTypes(); //construye la ventana que permite la simplificaic�n de bases de reglas buildRules(); //panel principal para la simplificaci�n de sistemas mainPane = new JTabbedPane(); //a�ade una pesta�a para la simplificaci�n de tipos... mainPane.addTab("Types", typesPanel); //...y otra para la de bases de reglas mainPane.addTab("Rules", rulesPanel); //crea un conjunto de botones para aplicar cambios, grabar el sistema //obtenido, revertir cambios o cerrar la ventana... this.finalOptions = new XCommandForm(finalOptionsLabel, finalOptionsLabel, this.actionListener); //...establece la anchura que debe ocupar este conjunto de botones... this.finalOptions.setCommandWidth(80); //...y lo fija this.finalOptions.block(); //obtiene el contenedor de la ventana... Container content = getContentPane(); //...a�ade el panel con informaci�n de tipos y bases de reglas en el //centro... content.add(mainPane, BorderLayout.CENTER); //...y el conjunto de botones en la parte inferior content.add(finalOptions, BorderLayout.SOUTH); //establece la acci�n por defecto al cerrar la ventana setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); //establece el icono que se muestra en la ventana setIconImage(XfuzzyIcons.xfuzzy.getImage()); //a�ade el objeto que debe responder a los eventos de ventana addWindowListener(new XfspWindowListener(this)); //establece la fuente que se debe mostrar setFont(XConstants.font); //ajusta el tama�o que debe tener la ventana pack(); //establece la posici�n de la ventana en el monitor setLocation(); } /** * <p> <b>Descripci�n:</b> construye todos los elementos de la interfaz * correspodientes a la simplificaci�n de tipos. * */ private void buildTypes() { //t�tulo del panel para la simplificaci�n de tipos typesTitle = new XLabel("System types simplification for " + this.name); //crea el panel situado en la parte superior en la opci�n de tipos typesTop = new JPanel(new GridLayout(1, 1)); //a�ade el titulo al panel typesTop.add(typesTitle); // tipos del sistema TypesListListener typesListener = new TypesListListener(); typesList = new XList("Types"); typesList.setListData(types); typesList.addListSelectionListener(typesListener); typesList.addMouseListener(typesListener); //representaci�n gr�fica de los tipos del sistema graph = new XfspGraphPanel(80); //crea un conjunto de bontones que permitan seleccionar c�mo se quieren //simplificar los tipos... typesAlgorithm = new XCommandForm(typesAlgorithms, typesAlgorithms, this.actionListener); //...establece la anchura... typesAlgorithm.setCommandWidth(120); //...y lo fija typesAlgorithm.block(); //crea el panel situado a la izquierda para la simplificaci�n de tipos... typesLeft = new JPanel(new GridLayout(1, 1)); //...establece sus dimensiones por defecto... typesLeft.setPreferredSize(new Dimension(175, 350)); //...y le a�ade la lista con los tipos del sistema typesLeft.add(typesList); //crea el panel situado arriba a la derecha para la simplificaci�n de //tipos... typesRightTop = new JPanel(new GridLayout(1, 1)); //...establece el tama�o por defecto... typesRightTop.setPreferredSize(new Dimension(400, 300)); //...y le a�ade el gr�fico con la representaci�n del tipo seleccionado typesRightTop.add(graph); //crea el panel situado abajo a la derecha para la simplificaci�n de //tipos... typesRightDown = new JPanel(new GridLayout(1, 1)); //...establece el tama�o por defecto... typesRightDown.setPreferredSize(new Dimension(400, 50)); //...y le a�ade el panel con los botones con los algoritmos para la //simplificaci�n de tipos typesRightDown.add(typesAlgorithm); //crea el panel situado a la derecha para la simplificaci�n de tipos... typesRight = new JPanel(); //...establece un layout que disponga los elementos de forma vertical... typesRight.setLayout(new BoxLayout(typesRight, BoxLayout.Y_AXIS)); //...a�ade el panel con la representaci�n gr�fica de los tipos... typesRight.add(typesRightTop); //...y el panel con los botones de los algoritmos para la simplificaci�n typesRight.add(typesRightDown); //crea el panel central para la simplificaci�n de tipos typesCentral = new JPanel(); //...establece un layout que disponga los elementos de forma horizontal... typesCentral.setLayout(new BoxLayout(typesCentral, BoxLayout.X_AXIS)); //...a�ade el panel de la izquierda (con la lista de tipos del sistema)... typesCentral.add(typesLeft); //...y el de la derecha (con la representaci�n de los tipos y los botones //de los distintos algoritmos) typesCentral.add(typesRight); //crea el panel principal para la simplificaci�n de tipos... typesPanel = new JPanel(new BorderLayout()); //...a�ade en la parte superior el panel de arriba (con el t�tulo de la //ventana)... typesPanel.add(typesTop, BorderLayout.NORTH); //...y en el centro el panel central (con la lista de tipos, la //representaci�n gr�fica de los tipos y los botones con los distintos //algoritmos) typesPanel.add(typesCentral, BorderLayout.CENTER); } /** * <p> <b>Descripci�n:</b> construye todos los elementos de la interfaz * correspodientes a la simplificaci�n de bases de reglas. * */ private void buildRules() { //t�tulo del panel para la simplificaci�n de reglas rulesTitle = new XLabel("System rules simplification for " + this.name); //crea el panel situado en la parte superior en la opci�n de reglas rulesTop = new JPanel(new GridLayout(1, 1)); //a�ade el t�tulo al panel rulesTop.add(rulesTitle); //bases de reglas del sistema RuleBasesListListener ruleBasesListener = new RuleBasesListListener(); ruleBasesList = new XList("Rule Bases"); ruleBasesList.setListData(ruleBases); ruleBasesList.addListSelectionListener(ruleBasesListener); ruleBasesList.addMouseListener(ruleBasesListener); //campo de texto que muestras las reglas de la base de reglas seleccionada rulesList = new JTextArea(400, 300); rulesList.setBackground(XConstants.textbackground); rulesList.setEditable(false); rulesListPane = new JScrollPane(rulesList); //algoritmos de simplificaci�n de bases de reglas rulesAlgorithm = new XCommandForm(rulesAlgorithms, rulesAlgorithms, this.actionListener); rulesAlgorithm.setCommandWidth(120); rulesAlgorithm.block(); // panel situado a la izquierda en la opci�n de reglas rulesLeft = new JPanel(new GridLayout(1, 1)); rulesLeft.setPreferredSize(new Dimension(175, 350)); rulesLeft.add(ruleBasesList); // panel situado arriba a la derecha en la opci�n de reglas rulesRightTop = new JPanel(new GridLayout(1, 1)); rulesRightTop.setPreferredSize(new Dimension(400, 300)); rulesRightTop.add(rulesListPane); //rulesTabPane); // panel situado abajo a la derecha para la simplificaci�n de tipos rulesRightDown = new JPanel(new GridLayout(1, 1)); rulesRightDown.setPreferredSize(new Dimension(400, 50)); rulesRightDown.add(rulesAlgorithm); // panel situado a la derecha en la opci�n de reglas rulesRight = new JPanel(); rulesRight.setLayout(new BoxLayout(rulesRight, BoxLayout.Y_AXIS)); rulesRight.add(rulesRightTop); rulesRight.add(rulesRightDown); // panel situado en el centro en la opci�n de reglas rulesCentral = new JPanel(); rulesCentral.setLayout(new BoxLayout(rulesCentral, BoxLayout.X_AXIS)); rulesCentral.add(rulesLeft); rulesCentral.add(rulesRight); // panel principal para la simplificaci�n de reglas rulesPanel = new JPanel(new BorderLayout()); rulesPanel.add(rulesTop, BorderLayout.NORTH); rulesPanel.add(rulesCentral, BorderLayout.CENTER); } /** * <p> <b>Descripci�n:</b> establece la localizaci�n de la vista. * */ private void setLocation() { if (viewLocation == null) { if (xfuzzy) { Point loc = parentLocation; loc.x += 95; loc.y += 45; super.setLocation(loc); } else { Dimension frame = getSize(); Dimension screen = getToolkit().getScreenSize(); setLocation( (screen.width - frame.width) / 2, (screen.height - frame.height) / 2); } } else { super.setLocation(viewLocation); } } /** * <p> <b>Descripci�n:</b> permite activar o desactivar la vista. * @param enabled Activa la ventana si vale <i>true</i> y la desactiva si * vale <i>false</i>. * */ public void setEnabled(boolean enabled) { super.setEnabled(enabled); for (int i = 0; i < typesAlgorithms.length; i++) { typesAlgorithm.setEnabled(i, enabled); } for (int i = 0; i < rulesAlgorithms.length; i++) { rulesAlgorithm.setEnabled(i, enabled); } for (int i = 0; i < finalOptionsLabel.length; i++) { finalOptions.setEnabled(i, enabled); } } /** * <p> <b>Descripci�n:</b> devuelve los tipos del sistema a simplificar. * @return Tipos del sistema que se est� tratando. * */ public Type[] getTypes() { return this.types; } /** * <p> <b>Descripci�n:</b> establece los tipos del sistema a simplificar. * @param types Tipos del sistema que se est� tratando. * */ public void setTypes(Type[] types) { this.types = types; } /** * <p> <b>Descripci�n:</b> devuelve las bases de reglas del sistema a * simplificar. * @return Bases de reglas del sistema que se est� tratando. * */ public Rulebase[] getRuleBases() { return this.ruleBases; } /** * <p> <b>Descripci�n:</b> establece las bases de reglas del sistema a * simplificar. * @param ruleBases Bases de reglas del sistema que se est� tratando. * */ public void setRuleBases(Rulebase[] ruleBases) { this.ruleBases = ruleBases; } /** * <p> <b>Descripci�n:</b> devuelve el nombre del sistema a simplificar. * @return Nombre del sistema que se est� tratando. * */ public String getName() { return this.name; } /** * <p> <b>Descripci�n:</b> establece el nombre del sistema a simplificar. * @param name Nombre del sistema que se est� tratando. * */ public void setName(String name) { this.name = name; } /** * <p> <b>Descripci�n:</b> devuelve si se llam� al sistema de simplificaci�n * desde el sistema principal <i>Xfuzzy</i>. * @return Devuelve cierto si se llam� al sistema de simplificaci�n desde * <i>Xfuzzy</i> y falso si no fue as�. * */ public boolean getXfuzzy() { return this.xfuzzy; } /** * <p> <b>Descripci�n:</b> establece si se llam� al sistema de simplificaci�n * desde el sistema principal <i>Xfuzzy</i>. * @param xfuzzy Vale cierto si se llam� al sistema de simplificaci�n desde * <i>Xfuzzy</i> y falso si no fue as�. * */ public void xfuzzy(boolean xfuzzy) { this.xfuzzy = xfuzzy; } /** * <p> <b>Descripci�n:</b> devuelve la localizaci�n de la ventana padre de la * vista. * @return Localizaci�n de la ventana padre de la vista. * */ public Point getParentLocation() { return parentLocation; } /** * <p> <b>Descripci�n:</b> establece la localizaci�n de la ventana padre de * la vista. * @param loc Localizaci�n de la ventana padre de la vista. * */ public void setParentLocation(Point loc) { parentLocation = loc; } /** * <p> <b>Descripci�n:</b> establece la localizaci�n de la vista. * @param loc Localizaci�n de la vista. * */ public void setLocation(Point loc) { this.viewLocation = loc; } /** * <p> <b>Descripci�n:</b> devuelve la lista de los tipos del sistema a * simplificar. * @return Lista de tipos del sistema a simplificar. * */ public XList getTypesList() { return this.typesList; } /** * <p> <b>Descripci�n:</b> devuelve la lista de las bases de reglas del * sistema a simplificar. * @return Lista de bases de reglas del sistema a simplificar. * */ public XList getRuleBasesList() { return this.ruleBasesList; } /** * <p> <b>Descripci�n:</b> selecciona un tipo de entre los disponibles en el * sistema a simplificar. * */ private void selectType() { Type selected = null; try { selected = (Type) typesList.getSelectedValue(); graph.setSelection(selected); graph.repaint(); } catch (Exception ex) { } } /** * <p> <b>Descripci�n:</b> selecciona una base de reglas de entre las * disponibles en el sistema a simplificar. * */ private void selectRuleBase() { Rulebase selected = null; String rulesString = ""; try { selected = (Rulebase) ruleBasesList.getSelectedValue(); rules = selected.getRules(); for (int i = 0; i < rules.length; i++) { rulesString += rules[i].toXfl(); } //cambia la antigua lista de reglas por la nueva String oldText = rulesList.getText(); rulesList.replaceRange(rulesString, 0, oldText.length()); } catch (Exception ex) { } } /** * <p> <b>Descripci�n:</b> muestra un mensaje al usuario por pantalla. * @param msg Mensaje que se debe mostrar al usuario. * */ public void showMessage(String[] msg) { XDialog.showMessage(this, msg); } /** * <p> <b>Descripci�n:</b> regenera la vista. * */ public void refresh() { graph.repaint(); selectRuleBase(); } /** * <p> <b>Descripci�n:</b> cierra la ventana correspondiente a la vista y * termina el proceso de simplificaci�n. * */ public void close() { //env�a al almac�n un evento indicando que se debe cerrar el sistema XfspEvent ev = new XfspEvent("Close", null); store.store(ev); //si el sistema de simplificaci�n no fue ejecutado desde Xfuzzy... if (!this.getXfuzzy()) { //...termina el proceso completamente System.exit(0); } } /** * <p> <b>Descripci�n:</b> clase interna que atiende los eventos provocados * por la lista de tipos del sistema mostrada en la vista. * @version 1.0 * @see XfspView * */ private class TypesListListener extends MouseAdapter implements ListSelectionListener { public void valueChanged(ListSelectionEvent e) { selectType(); } } /** * <p> <b>Descripci�n:</b> clase interna que atiende los eventos provocados * por la lista de bases de reglas del sistema mostrada en la vista. * @version 1.0 * @see XfspView * */ private class RuleBasesListListener extends MouseAdapter implements ListSelectionListener { public void valueChanged(ListSelectionEvent e) { selectRuleBase(); } } }