//--------------------------------------------------------------------------------//
// 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.xfpkg;
import xfuzzy.lang.*;
import xfuzzy.pkg.*;
import xfuzzy.util.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
/**
* Clase que desarrolla la ventana de edici�n de la definici�n de una
* funci�n de un paquete
*
* @author Francisco Jos� MorenoVelo
*/
public class XfpkgDefinition extends JDialog
implements ActionListener, WindowListener {
//----------------------------------------------------------------------------//
// MIEMBROS PRIVADOS //
//----------------------------------------------------------------------------//
/**
* C�digo asociado a la clase serializable
*/
private static final long serialVersionUID = 95505666603050L;
/**
* Campo para introducir el nombre de la funci�n
*/
private XTextForm defname;
/**
* Panel de botones
*/
private XCommandForm commandform;
/**
* Panel para introducir los nombres alternativos
*/
private XfpkgVectorPanel aliaspanel;
/**
* Panel para introducir los nombres de los par�metros
*/
private XfpkgVectorPanel parampanel;
/**
* Panel para introducir las funciones de pertenencias admitidas en un
* m�todo de concreci�n
*/
private XfpkgVectorPanel definedpanel;
/**
* Campo para introducir el nombre de la lista de par�metros
*/
private XTextForm paramlistname;
/**
* Campo para introducir los requisitos de los par�metros
*/
private JTextArea requires_area;
/**
* Campo para introducir el c�digo de actualizaci�n de los par�metros
*/
private JTextArea update_area;
/**
* Campo para introducir el c�digo para calcular el n�mero de entradas
* de una funci�n no difusa
*/
private JTextArea inputs_area;
/**
* Campo para introducir el c�digo para calcular el n�mero de miembros
* de una familia de funciones de pertenencia
*/
private JTextArea members_area;
/**
* Campo para introducir el c�digo Java que eval�a la funci�n
*/
private JTextArea javaeq_area;
/**
* Campo para introducir el c�digo Java que eval�a el modificador "Mayor o igual"
*/
private JTextArea javagreq_area;
/**
* Campo para introducir el c�digo Java que eval�a el modificador "Menor o igual"
*/
private JTextArea javasmeq_area;
/**
* Campo para introducir el c�digo Java para calcular el centro de una funci�n
*/
private JTextArea javacenter_area;
/**
* Campo para introducir el c�digo Java para calcular la base de una funci�n
*/
private JTextArea javabasis_area;
/**
* Campo para introducir el c�digo C que eval�a la funci�n
*/
private JTextArea ansiceq_area;
/**
* Campo para introducir el c�digo C que eval�a el modificador "Mayor o igual"
*/
private JTextArea ansicgreq_area;
/**
* Campo para introducir el c�digo C que eval�a el modificador "Menor o igual"
*/
private JTextArea ansicsmeq_area;
/**
* Campo para introducir el c�digo C para calcular el centro de una funci�n
*/
private JTextArea ansiccenter_area;
/**
* Campo para introducir el c�digo C para calcular la base de una funci�n
*/
private JTextArea ansicbasis_area;
/**
* Campo para introducir el c�digo C++ que eval�a la funci�n
*/
private JTextArea cppeq_area;
/**
* Campo para introducir el c�digo C++ que eval�a el modificador "Mayor o igual"
*/
private JTextArea cppgreq_area;
/**
* Campo para introducir el c�digo C++ que eval�a el modificador "Menor o igual"
*/
private JTextArea cppsmeq_area;
/**
* Campo para introducir el c�digo C++ para calcular el centro de una funci�n
*/
private JTextArea cppcenter_area;
/**
* Campo para introducir el c�digo C++ para calcular la base de una funci�n
*/
private JTextArea cppbasis_area;
/**
* Campo para introducir el c�digo Java de la derivada de la funci�n
*/
private JTextArea deriveq_area;
/**
* Campo para introducir el c�digo Java de la derivada del modificador "Mayor o igual"
*/
private JTextArea derivgreq_area;
/**
* Campo para introducir el c�digo Java de la derivada del modificador "Menor o igual"
*/
private JTextArea derivsmeq_area;
/**
* Campo para introducir el c�digo Java de la derivada del centro de una funci�n
*/
private JTextArea derivcenter_area;
/**
* Campo para introducir el c�digo Jave de la derivada de la base de una funci�n
*/
private JTextArea derivbasis_area;
/**
* Campo para introducir c�digo adicional en la clase
*/
private JTextArea source_area;
/**
* Referencia al objeto Xfpkg del que depende la ventana
*/
private Xfpkg xfpkg;
/**
* Definici�n que se est� editando
*/
private Definition definition;
//----------------------------------------------------------------------------//
// CONSTRUCTOR //
//----------------------------------------------------------------------------//
public XfpkgDefinition(Xfpkg xfpkg, Definition definition) {
super(xfpkg,"Xfpkg",false);
this.xfpkg = xfpkg;
this.definition = definition;
this.definition.setEditor(this);
build();
setValues();
}
//----------------------------------------------------------------------------//
// M�TODOS P�BLICOS //
//----------------------------------------------------------------------------//
/**
* Abre una ventana de edici�n de una definici�n
*/
static void showDefinitionEditor(Xfpkg xfpkg, Definition definition) {
XfpkgDefinition editor = new XfpkgDefinition(xfpkg,definition);
editor.setVisible(true);
editor.repaint();
}
/**
* Interfaz ActionListener
*/
public void actionPerformed(ActionEvent e) {
String command = e.getActionCommand();
if(command.equals("Edit")) setEditable(true);
else if(command.equals("Apply")) apply();
else if(command.equals("Reload")) setValues();
}
/**
* Interfaz WindowListener. Acci�n al abrir la ventana
*/
public void windowOpened(WindowEvent e) {
}
/**
* Interfaz WindowListener. Acci�n al cerrar la ventana
*/
public void windowClosing(WindowEvent e) {
close();
}
/**
* Interfaz WindowListener. Acci�n al terminar de cerrar la ventana
*/
public void windowClosed(WindowEvent e) {
}
/**
* Interfaz WindowListener. Acci�n al minimizar la ventana
*/
public void windowIconified(WindowEvent e) {
}
/**
* Interfaz WindowListener. Acci�n al maximizar la ventana
*/
public void windowDeiconified(WindowEvent e) {
}
/**
* Interfaz WindowListener. Acci�n al activar la ventana
*/
public void windowActivated(WindowEvent e) {
}
/**
* Interfaz WindowListener. Acci�n al desactivar la ventana
*/
public void windowDeactivated(WindowEvent e) {
}
//----------------------------------------------------------------------------//
// M�TODOS PRIVADOS //
//----------------------------------------------------------------------------//
//----------------------------------------------------------------------------//
// M�todos para construir la interfaz grafica //
//----------------------------------------------------------------------------//
/**
* Genera el contenido de la ventana
*/
private void build() {
int kind = definition.getKind();
JTabbedPane tabbed = new JTabbedPane();
tabbed.addTab(" Alias ", buildAliasPanel());
tabbed.addTab("Parameters", buildParamPanel());
tabbed.addTab("Requirements",buildRequiresPanel(kind));
if(kind == XflPackage.CRISP) tabbed.addTab("Inputs",buildInputsPanel());
if(kind == XflPackage.FAMILY) tabbed.addTab("Members",buildMembersPanel());
tabbed.addTab(" Java ", buildJavaPanel(kind));
tabbed.addTab(" C ", buildAnsiCPanel(kind));
tabbed.addTab(" C++ ", buildCppPanel(kind));
if(kind != XflPackage.CRISP && kind != XflPackage.DEFUZ)
tabbed.addTab("Derivative", buildDerivPanel(kind));
if(kind == XflPackage.FAMILY) tabbed.addTab("Update",buildUpdatePanel(kind));
if(kind == XflPackage.MFUNC) tabbed.addTab("Update",buildUpdatePanel(kind));
tabbed.addTab("Source", buildSourcePanel());
defname = new XTextForm("Name");
defname.setLabelWidth(100);
defname.setFieldWidth(350);
defname.setAlignment(JLabel.CENTER);
defname.setEditable(false);
String lb[] = {"Edit","Apply","Reload"};
commandform = new XCommandForm(lb,lb,this);
commandform.setCommandWidth(120);
commandform.block();
Box box = new Box(BoxLayout.Y_AXIS);
box.add(defname);
box.add(Box.createVerticalStrut(5));
box.add(tabbed);
box.add(Box.createVerticalStrut(5));
box.add(commandform);
Container content = getContentPane();
content.setLayout(new BoxLayout(content,BoxLayout.Y_AXIS));
content.add(Box.createVerticalStrut(5));
content.add(box);
content.add(Box.createVerticalStrut(5));
setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
addWindowListener(this);
setSize(new Dimension(800,400));
setEditable(false);
commandform.setEnabled(0,false);
}
//----------------------------------------------------------------------------//
// M�todos de construcci�n de los paneles de los bloques //
//----------------------------------------------------------------------------//
/**
* Genera el panel del bloque "alias"
*/
private JPanel buildAliasPanel() {
aliaspanel = new XfpkgVectorPanel(6);
Box box = new Box(BoxLayout.Y_AXIS);
box.add(Box.createVerticalStrut(20));
box.add(createLabel("Alias",300));
box.add(Box.createVerticalStrut(10));
box.add(aliaspanel);
box.add(Box.createVerticalStrut(20));
box.add(Box.createGlue());
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel,BoxLayout.X_AXIS));
panel.add(Box.createHorizontalStrut(25));
panel.add(box);
panel.add(Box.createHorizontalStrut(25));
Dimension maxsize = panel.getMaximumSize();
Dimension prefsize = panel.getPreferredSize();
panel.setMaximumSize(new Dimension(maxsize.width,prefsize.height));
return panel;
}
/**
* Genera el panel del bloque "parameter"
*/
private JPanel buildParamPanel() {
parampanel = new XfpkgVectorPanel(6);
paramlistname = new XTextForm("List name");
paramlistname.setLabelWidth(100);
paramlistname.setFieldWidth(200);
paramlistname.setAlignment(JButton.CENTER);
Box box = new Box(BoxLayout.Y_AXIS);
box.add(Box.createVerticalStrut(20));
box.add(createLabel("Parameters",300));
box.add(Box.createVerticalStrut(10));
box.add(parampanel);
box.add(Box.createVerticalStrut(20));
box.add(createLabel("List of parameters",300));
box.add(Box.createVerticalStrut(10));
box.add(paramlistname);
box.add(Box.createGlue());
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel,BoxLayout.X_AXIS));
panel.add(Box.createHorizontalStrut(25));
panel.add(box);
panel.add(Box.createHorizontalStrut(25));
Dimension maxsize = panel.getMaximumSize();
Dimension prefsize = panel.getPreferredSize();
panel.setMaximumSize(new Dimension(maxsize.width,prefsize.height));
return panel;
}
/**
* Genera el panel del bloque "requires"
*/
private JPanel buildRequiresPanel(int kind) {
String text = "";
switch(kind) {
case XflPackage.UNARY: text = "parameters"; break;
case XflPackage.BINARY: text = "parameters"; break;
case XflPackage.MFUNC: text = "parameters, min, max"; break;
case XflPackage.FAMILY: text = "parameters, min, max"; break;
case XflPackage.CRISP: text = "parameters"; break;
case XflPackage.DEFUZ: text = "parameters, min, max, step"; break;
}
XTextForm varform = new XTextForm("Variables");
varform.setLabelWidth(100);
varform.setFieldWidth(200);
varform.setAlignment(JButton.CENTER);
varform.setEditable(false);
varform.setText(text);
if(kind == XflPackage.DEFUZ) {
requires_area = new JTextArea(3,30);
requires_area.setBackground(XConstants.textbackground);
requires_area.setBorder(BorderFactory.createLoweredBevelBorder());
definedpanel = new XfpkgVectorPanel(6);
} else {
requires_area = new JTextArea(8,30);
requires_area.setBackground(XConstants.textbackground);
requires_area.setBorder(BorderFactory.createLoweredBevelBorder());
}
Box box = new Box(BoxLayout.Y_AXIS);
box.add(Box.createVerticalStrut(20));
box.add(createLabel("Requirements",300));
box.add(Box.createVerticalStrut(10));
box.add(varform);
box.add(Box.createVerticalStrut(10));
box.add(new JScrollPane(requires_area));
box.add(Box.createVerticalStrut(20));
if(kind == XflPackage.DEFUZ) {
box.add(createLabel("Defined for membership functions",300));
box.add(Box.createVerticalStrut(10));
box.add(definedpanel);
box.add(Box.createVerticalStrut(20));
}
box.add(Box.createGlue());
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel,BoxLayout.X_AXIS));
panel.add(Box.createHorizontalStrut(25));
panel.add(box);
panel.add(Box.createHorizontalStrut(25));
Dimension maxsize = panel.getMaximumSize();
Dimension prefsize = panel.getPreferredSize();
panel.setMaximumSize(new Dimension(maxsize.width,prefsize.height));
return panel;
}
/**
* Genera el panel del bloque "Inputs"
*/
private JPanel buildInputsPanel() {
XTextForm varform = new XTextForm("Variables");
varform.setLabelWidth(100);
varform.setFieldWidth(200);
varform.setAlignment(JButton.CENTER);
varform.setEditable(false);
varform.setText("parameters");
inputs_area = new JTextArea(8,30);
inputs_area.setBackground(XConstants.textbackground);
inputs_area.setBorder(BorderFactory.createLoweredBevelBorder());
Box box = new Box(BoxLayout.Y_AXIS);
box.add(Box.createVerticalStrut(20));
box.add(createLabel("Number of Input Variables",300));
box.add(Box.createVerticalStrut(10));
box.add(varform);
box.add(Box.createVerticalStrut(10));
box.add(new JScrollPane(inputs_area));
box.add(Box.createVerticalStrut(20));
box.add(Box.createGlue());
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel,BoxLayout.X_AXIS));
panel.add(Box.createHorizontalStrut(25));
panel.add(box);
panel.add(Box.createHorizontalStrut(25));
Dimension maxsize = panel.getMaximumSize();
Dimension prefsize = panel.getPreferredSize();
panel.setMaximumSize(new Dimension(maxsize.width,prefsize.height));
return panel;
}
/**
* Genera el panel del bloque "Members"
*/
private JPanel buildMembersPanel() {
XTextForm varform = new XTextForm("Variables");
varform.setLabelWidth(100);
varform.setFieldWidth(200);
varform.setAlignment(JButton.CENTER);
varform.setEditable(false);
varform.setText("parameters");
members_area = new JTextArea(8,30);
members_area.setBackground(XConstants.textbackground);
members_area.setBorder(BorderFactory.createLoweredBevelBorder());
Box box = new Box(BoxLayout.Y_AXIS);
box.add(Box.createVerticalStrut(20));
box.add(createLabel("Number of Family Members",300));
box.add(Box.createVerticalStrut(10));
box.add(varform);
box.add(Box.createVerticalStrut(10));
box.add(new JScrollPane(members_area));
box.add(Box.createVerticalStrut(20));
box.add(Box.createGlue());
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel,BoxLayout.X_AXIS));
panel.add(Box.createHorizontalStrut(25));
panel.add(box);
panel.add(Box.createHorizontalStrut(25));
Dimension maxsize = panel.getMaximumSize();
Dimension prefsize = panel.getPreferredSize();
panel.setMaximumSize(new Dimension(maxsize.width,prefsize.height));
return panel;
}
/**
* Genera el panel del bloque "update"
*/
private JPanel buildUpdatePanel(int kind) {
XTextForm varform = new XTextForm("Variables");
varform.setLabelWidth(100);
varform.setFieldWidth(200);
varform.setAlignment(JButton.CENTER);
varform.setEditable(false);
varform.setText("parameters, pos[], desp[], adj[], min, max, step");
update_area = new JTextArea(8,30);
update_area.setBackground(XConstants.textbackground);
update_area.setBorder(BorderFactory.createLoweredBevelBorder());
Box box = new Box(BoxLayout.Y_AXIS);
box.add(Box.createVerticalStrut(20));
box.add(createLabel("Parameters update",300));
box.add(Box.createVerticalStrut(10));
box.add(varform);
box.add(Box.createVerticalStrut(10));
box.add(new JScrollPane(update_area));
box.add(Box.createVerticalStrut(20));
box.add(Box.createGlue());
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel,BoxLayout.X_AXIS));
panel.add(Box.createHorizontalStrut(25));
panel.add(box);
panel.add(Box.createHorizontalStrut(25));
Dimension maxsize = panel.getMaximumSize();
Dimension prefsize = panel.getPreferredSize();
panel.setMaximumSize(new Dimension(maxsize.width,prefsize.height));
return panel;
}
/**
* Genera el contenido del panel del bloque "java"
*/
private JPanel buildJavaPanel(int kind) {
Box box;
if(kind == XflPackage.MFUNC || kind == XflPackage.FAMILY) {
boolean fam = (kind == XflPackage.FAMILY);
String functext = "parameters,"+(fam?" i,":"")+" x, min, max";
String proptext = "parameters,"+(fam?" i,":"")+" min, max";
javaeq_area = new JTextArea(8,30);
javaeq_area.setBackground(XConstants.textbackground);
javaeq_area.setBorder(BorderFactory.createLoweredBevelBorder());
javagreq_area = new JTextArea(8,30);
javagreq_area.setBackground(XConstants.textbackground);
javagreq_area.setBorder(BorderFactory.createLoweredBevelBorder());
javasmeq_area = new JTextArea(8,30);
javasmeq_area.setBackground(XConstants.textbackground);
javasmeq_area.setBorder(BorderFactory.createLoweredBevelBorder());
javacenter_area = new JTextArea(8,30);
javacenter_area.setBackground(XConstants.textbackground);
javacenter_area.setBorder(BorderFactory.createLoweredBevelBorder());
javabasis_area = new JTextArea(8,30);
javabasis_area.setBackground(XConstants.textbackground);
javabasis_area.setBorder(BorderFactory.createLoweredBevelBorder());
JTabbedPane tabbed = new JTabbedPane();
tabbed.addTab(" Membership ", buildAreaPanel(javaeq_area, functext));
tabbed.addTab("Greater or Equal", buildAreaPanel(javagreq_area, functext));
tabbed.addTab("Smaller or Equal", buildAreaPanel(javasmeq_area, functext));
tabbed.addTab(" Center ", buildAreaPanel(javacenter_area, proptext));
tabbed.addTab(" Basis ", buildAreaPanel(javabasis_area, proptext));
box = new Box(BoxLayout.Y_AXIS);
box.add(Box.createVerticalStrut(20));
box.add(createLabel("Java description",300));
box.add(Box.createVerticalStrut(10));
box.add(tabbed);
box.add(Box.createVerticalStrut(20));
box.add(Box.createGlue());
} else {
String text = "";
switch(kind) {
case XflPackage.UNARY: text = "parameters, a"; break;
case XflPackage.BINARY: text = "parameters, a, b"; break;
case XflPackage.CRISP: text = "parameters, x"; break;
case XflPackage.DEFUZ: text = "parameters, mf, min, max, step"; break;
}
XTextForm varform = new XTextForm("Variables");
varform.setLabelWidth(100);
varform.setFieldWidth(200);
varform.setAlignment(JButton.CENTER);
varform.setEditable(false);
varform.setText(text);
javaeq_area = new JTextArea(8,30);
javaeq_area.setBackground(XConstants.textbackground);
javaeq_area.setBorder(BorderFactory.createLoweredBevelBorder());
box = new Box(BoxLayout.Y_AXIS);
box.add(Box.createVerticalStrut(20));
box.add(createLabel("Java description",300));
box.add(Box.createVerticalStrut(10));
box.add(varform);
box.add(Box.createVerticalStrut(10));
box.add(new JScrollPane(javaeq_area));
box.add(Box.createVerticalStrut(20));
box.add(Box.createGlue());
}
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel,BoxLayout.X_AXIS));
panel.add(Box.createHorizontalStrut(25));
panel.add(box);
panel.add(Box.createHorizontalStrut(25));
Dimension maxsize = panel.getMaximumSize();
Dimension prefsize = panel.getPreferredSize();
panel.setMaximumSize(new Dimension(maxsize.width,prefsize.height));
return panel;
}
/**
* Genera el contenido del panel del bloque "ansi_c"
*/
private JPanel buildAnsiCPanel(int kind) {
Box box;
if(kind == XflPackage.MFUNC || kind == XflPackage.FAMILY) {
boolean fam = (kind == XflPackage.FAMILY);
String functext = "parameters,"+(fam?" i,":"")+" x, min, max";
String proptext = "parameters,"+(fam?" i,":"")+" min, max";
ansiceq_area = new JTextArea(8,30);
ansiceq_area.setBackground(XConstants.textbackground);
ansiceq_area.setBorder(BorderFactory.createLoweredBevelBorder());
ansicgreq_area = new JTextArea(8,30);
ansicgreq_area.setBackground(XConstants.textbackground);
ansicgreq_area.setBorder(BorderFactory.createLoweredBevelBorder());
ansicsmeq_area = new JTextArea(8,30);
ansicsmeq_area.setBackground(XConstants.textbackground);
ansicsmeq_area.setBorder(BorderFactory.createLoweredBevelBorder());
ansiccenter_area = new JTextArea(8,30);
ansiccenter_area.setBackground(XConstants.textbackground);
ansiccenter_area.setBorder(BorderFactory.createLoweredBevelBorder());
ansicbasis_area = new JTextArea(8,30);
ansicbasis_area.setBackground(XConstants.textbackground);
ansicbasis_area.setBorder(BorderFactory.createLoweredBevelBorder());
JTabbedPane tabbed = new JTabbedPane();
tabbed.addTab(" Membership ", buildAreaPanel(ansiceq_area, functext));
tabbed.addTab("Greater or Equal", buildAreaPanel(ansicgreq_area, functext));
tabbed.addTab("Smaller or Equal", buildAreaPanel(ansicsmeq_area, functext));
tabbed.addTab(" Center ", buildAreaPanel(ansiccenter_area, proptext));
tabbed.addTab(" Basis ", buildAreaPanel(ansicbasis_area, proptext));
box = new Box(BoxLayout.Y_AXIS);
box.add(Box.createVerticalStrut(20));
box.add(createLabel("C description",300));
box.add(Box.createVerticalStrut(10));
box.add(tabbed);
box.add(Box.createVerticalStrut(20));
box.add(Box.createGlue());
} else {
String text = "";
switch(kind) {
case XflPackage.UNARY: text = "parameters, a"; break;
case XflPackage.BINARY: text = "parameters, a, b"; break;
case XflPackage.CRISP: text = "parameters, x"; break;
case XflPackage.DEFUZ: text = "parameters, mf, min, max, step"; break;
}
XTextForm varform = new XTextForm("Variables");
varform.setLabelWidth(100);
varform.setFieldWidth(200);
varform.setAlignment(JButton.CENTER);
varform.setEditable(false);
varform.setText(text);
ansiceq_area = new JTextArea(8,30);
ansiceq_area.setBackground(XConstants.textbackground);
ansiceq_area.setBorder(BorderFactory.createLoweredBevelBorder());
box = new Box(BoxLayout.Y_AXIS);
box.add(Box.createVerticalStrut(20));
box.add(createLabel("C description",300));
box.add(Box.createVerticalStrut(10));
box.add(varform);
box.add(Box.createVerticalStrut(10));
box.add(new JScrollPane(ansiceq_area));
box.add(Box.createVerticalStrut(20));
box.add(Box.createGlue());
}
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel,BoxLayout.X_AXIS));
panel.add(Box.createHorizontalStrut(25));
panel.add(box);
panel.add(Box.createHorizontalStrut(25));
Dimension maxsize = panel.getMaximumSize();
Dimension prefsize = panel.getPreferredSize();
panel.setMaximumSize(new Dimension(maxsize.width,prefsize.height));
return panel;
}
/**
* Genera el contenido del panel del bloque "cplusplus"
*/
private JPanel buildCppPanel(int kind) {
Box box;
if(kind == XflPackage.MFUNC || kind == XflPackage.FAMILY) {
boolean fam = (kind == XflPackage.FAMILY);
String functext = "parameters,"+(fam?" i,":"")+" x, min, max";
String proptext = "parameters,"+(fam?" i,":"")+" min, max";
cppeq_area = new JTextArea(8,30);
cppeq_area.setBackground(XConstants.textbackground);
cppeq_area.setBorder(BorderFactory.createLoweredBevelBorder());
cppgreq_area = new JTextArea(8,30);
cppgreq_area.setBackground(XConstants.textbackground);
cppgreq_area.setBorder(BorderFactory.createLoweredBevelBorder());
cppsmeq_area = new JTextArea(8,30);
cppsmeq_area.setBackground(XConstants.textbackground);
cppsmeq_area.setBorder(BorderFactory.createLoweredBevelBorder());
cppcenter_area = new JTextArea(8,30);
cppcenter_area.setBackground(XConstants.textbackground);
cppcenter_area.setBorder(BorderFactory.createLoweredBevelBorder());
cppbasis_area = new JTextArea(8,30);
cppbasis_area.setBackground(XConstants.textbackground);
cppbasis_area.setBorder(BorderFactory.createLoweredBevelBorder());
JTabbedPane tabbed = new JTabbedPane();
tabbed.addTab(" Membership ", buildAreaPanel(cppeq_area, functext));
tabbed.addTab("Greater or Equal", buildAreaPanel(cppgreq_area, functext));
tabbed.addTab("Smaller or Equal", buildAreaPanel(cppsmeq_area, functext));
tabbed.addTab(" Center ", buildAreaPanel(cppcenter_area, proptext));
tabbed.addTab(" Basis ", buildAreaPanel(cppbasis_area, proptext));
box = new Box(BoxLayout.Y_AXIS);
box.add(Box.createVerticalStrut(20));
box.add(createLabel("C++ description",300));
box.add(Box.createVerticalStrut(10));
box.add(tabbed);
box.add(Box.createVerticalStrut(20));
box.add(Box.createGlue());
} else {
String text = "";
switch(kind) {
case XflPackage.UNARY: text = "parameters, a"; break;
case XflPackage.BINARY: text = "parameters, a, b"; break;
case XflPackage.CRISP: text = "parameters, x"; break;
case XflPackage.DEFUZ: text = "parameters, mf, min, max, step"; break;
}
XTextForm varform = new XTextForm("Variables");
varform.setLabelWidth(100);
varform.setFieldWidth(200);
varform.setAlignment(JButton.CENTER);
varform.setEditable(false);
varform.setText(text);
cppeq_area = new JTextArea(8,30);
cppeq_area.setBackground(XConstants.textbackground);
cppeq_area.setBorder(BorderFactory.createLoweredBevelBorder());
box = new Box(BoxLayout.Y_AXIS);
box.add(Box.createVerticalStrut(20));
box.add(createLabel("C++ description",300));
box.add(Box.createVerticalStrut(10));
box.add(varform);
box.add(Box.createVerticalStrut(10));
box.add(new JScrollPane(cppeq_area));
box.add(Box.createVerticalStrut(20));
box.add(Box.createGlue());
}
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel,BoxLayout.X_AXIS));
panel.add(Box.createHorizontalStrut(25));
panel.add(box);
panel.add(Box.createHorizontalStrut(25));
Dimension maxsize = panel.getMaximumSize();
Dimension prefsize = panel.getPreferredSize();
panel.setMaximumSize(new Dimension(maxsize.width,prefsize.height));
return panel;
}
/**
* Genera el contenido del panel del bloque "derivative"
*/
private JPanel buildDerivPanel(int kind) {
Box box;
if(kind == XflPackage.MFUNC || kind == XflPackage.FAMILY) {
boolean fam = (kind == XflPackage.FAMILY);
String functext = "parameters, deriv[],"+(fam?" i,":"")+" x, min, max";
String proptext = "parameters, deriv[],"+(fam?" i,":"")+" min, max";
deriveq_area = new JTextArea(8,30);
deriveq_area.setBackground(XConstants.textbackground);
deriveq_area.setBorder(BorderFactory.createLoweredBevelBorder());
derivgreq_area = new JTextArea(8,30);
derivgreq_area.setBackground(XConstants.textbackground);
derivgreq_area.setBorder(BorderFactory.createLoweredBevelBorder());
derivsmeq_area = new JTextArea(8,30);
derivsmeq_area.setBackground(XConstants.textbackground);
derivsmeq_area.setBorder(BorderFactory.createLoweredBevelBorder());
derivcenter_area = new JTextArea(8,30);
derivcenter_area.setBackground(XConstants.textbackground);
derivcenter_area.setBorder(BorderFactory.createLoweredBevelBorder());
derivbasis_area = new JTextArea(8,30);
derivbasis_area.setBackground(XConstants.textbackground);
derivbasis_area.setBorder(BorderFactory.createLoweredBevelBorder());
JTabbedPane tabbed = new JTabbedPane();
tabbed.addTab(" Membership ", buildAreaPanel(deriveq_area, functext));
tabbed.addTab("Greater or Equal", buildAreaPanel(derivgreq_area, functext));
tabbed.addTab("Smaller or Equal", buildAreaPanel(derivsmeq_area, functext));
tabbed.addTab(" Center ", buildAreaPanel(derivcenter_area, proptext));
tabbed.addTab(" Basis ", buildAreaPanel(derivbasis_area, proptext));
box = new Box(BoxLayout.Y_AXIS);
box.add(Box.createVerticalStrut(20));
box.add(createLabel("Derivative description",300));
box.add(Box.createVerticalStrut(10));
box.add(tabbed);
box.add(Box.createVerticalStrut(20));
box.add(Box.createGlue());
} else {
String text = "";
switch(kind) {
case XflPackage.UNARY: text = "parameters, deriv, a"; break;
case XflPackage.BINARY: text = "parameters, deriv[], a, b"; break;
}
XTextForm varform = new XTextForm("Variables");
varform.setLabelWidth(100);
varform.setFieldWidth(200);
varform.setAlignment(JButton.CENTER);
varform.setEditable(false);
varform.setText(text);
deriveq_area = new JTextArea(8,30);
deriveq_area.setBackground(XConstants.textbackground);
deriveq_area.setBorder(BorderFactory.createLoweredBevelBorder());
box = new Box(BoxLayout.Y_AXIS);
box.add(Box.createVerticalStrut(20));
box.add(createLabel("Derivative description",300));
box.add(Box.createVerticalStrut(10));
box.add(varform);
box.add(Box.createVerticalStrut(10));
box.add(new JScrollPane(deriveq_area));
box.add(Box.createVerticalStrut(20));
box.add(Box.createGlue());
}
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel,BoxLayout.X_AXIS));
panel.add(Box.createHorizontalStrut(25));
panel.add(box);
panel.add(Box.createHorizontalStrut(25));
Dimension maxsize = panel.getMaximumSize();
Dimension prefsize = panel.getPreferredSize();
panel.setMaximumSize(new Dimension(maxsize.width,prefsize.height));
return panel;
}
/**
* Genera el panel del bloque "source"
*/
private JPanel buildSourcePanel() {
source_area = new JTextArea(8,30);
source_area.setBackground(XConstants.textbackground);
source_area.setBorder(BorderFactory.createLoweredBevelBorder());
Box box = new Box(BoxLayout.Y_AXIS);
box.add(Box.createVerticalStrut(20));
box.add(createLabel("Additional code",300));
box.add(Box.createVerticalStrut(10));
box.add(new JScrollPane(source_area));
box.add(Box.createVerticalStrut(20));
box.add(Box.createGlue());
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel,BoxLayout.X_AXIS));
panel.add(Box.createHorizontalStrut(25));
panel.add(box);
panel.add(Box.createHorizontalStrut(25));
Dimension maxsize = panel.getMaximumSize();
Dimension prefsize = panel.getPreferredSize();
panel.setMaximumSize(new Dimension(maxsize.width,prefsize.height));
return panel;
}
/**
* Genera un panel para un area de texto
*/
private JPanel buildAreaPanel(JTextArea area, String text) {
XTextForm varform = new XTextForm("Variables");
varform.setLabelWidth(100);
varform.setFieldWidth(200);
varform.setAlignment(JButton.CENTER);
varform.setEditable(false);
varform.setText(text);
Box box = new Box(BoxLayout.Y_AXIS);
box.add(Box.createVerticalStrut(10));
box.add(varform);
box.add(Box.createVerticalStrut(10));
box.add(new JScrollPane(area));
box.add(Box.createVerticalStrut(20));
box.add(Box.createGlue());
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel,BoxLayout.X_AXIS));
panel.add(Box.createHorizontalStrut(25));
panel.add(box);
panel.add(Box.createHorizontalStrut(25));
return panel;
}
//----------------------------------------------------------------------------//
// Acciones a realizar respecto a las listas //
//----------------------------------------------------------------------------//
/**
* Actualiza el contenido de los paneles con la definici�n
*/
private void setValues() {
String code;
defname.setText(""+definition);
aliaspanel.set(definition.getAlias());
parampanel.set(definition.getParameters());
code = definition.getParamList();
paramlistname.setText((code == null? "" : code));
int kind = definition.getKind();
setValue(requires_area, Definition.REQUIREMENTS);
setValue(javaeq_area, Definition.JAVA_EQUAL);
setValue(ansiceq_area, Definition.C_EQUAL);
setValue(cppeq_area, Definition.CPP_EQUAL);
setValue(source_area, Definition.SOURCE);
switch(kind) {
case XflPackage.DEFUZ:
definedpanel.set(definition.getDefinedFor());
break;
case XflPackage.CRISP:
setValue(inputs_area, Definition.INPUTS);
break;
case XflPackage.UNARY:
case XflPackage.BINARY:
setValue(deriveq_area, Definition.DERIV_EQUAL);
break;
case XflPackage.FAMILY:
setValue(members_area, Definition.MEMBERS);
case XflPackage.MFUNC:
setValue(javagreq_area, Definition.JAVA_GREQ);
setValue(javasmeq_area, Definition.JAVA_SMEQ);
setValue(javacenter_area, Definition.JAVA_CENTER);
setValue(javabasis_area, Definition.JAVA_BASIS);
setValue(ansicgreq_area, Definition.C_GREQ);
setValue(ansicsmeq_area, Definition.C_SMEQ);
setValue(ansiccenter_area, Definition.C_CENTER);
setValue(ansicbasis_area, Definition.C_BASIS);
setValue(cppgreq_area, Definition.CPP_GREQ);
setValue(cppsmeq_area, Definition.CPP_SMEQ);
setValue(cppcenter_area, Definition.CPP_CENTER);
setValue(cppbasis_area, Definition.CPP_BASIS);
setValue(deriveq_area, Definition.DERIV_EQUAL);
setValue(derivgreq_area, Definition.DERIV_GREQ);
setValue(derivsmeq_area, Definition.DERIV_SMEQ);
setValue(derivcenter_area, Definition.DERIV_CENTER);
setValue(derivbasis_area, Definition.DERIV_BASIS);
setValue(update_area, Definition.UPDATE);
break;
}
setEditable(false);
}
/**
* Actualiza el contenido de un �rea de texto
*/
private void setValue(JTextArea area, int code) {
String source = definition.getCode(code);
area.setText((source == null? "" : source));
}
/**
* (Des)Habilita la edici�n del contenido de la definici�n
*/
private void setEditable(boolean editable) {
boolean pkgeditable = xfpkg.getPackage().isEditable();
defname.setEditable(editable && pkgeditable);
aliaspanel.setEditable(editable && pkgeditable);
parampanel.setEditable(editable && pkgeditable);
paramlistname.setEditable(editable && pkgeditable);
requires_area.setEditable(editable && pkgeditable);
javaeq_area.setEditable(editable && pkgeditable);
ansiceq_area.setEditable(editable && pkgeditable);
cppeq_area.setEditable(editable && pkgeditable);
source_area.setEditable(editable && pkgeditable);
int kind = definition.getKind();
switch(kind) {
case XflPackage.DEFUZ:
definedpanel.setEditable(editable && pkgeditable);
break;
case XflPackage.CRISP:
inputs_area.setEditable(editable && pkgeditable);
break;
case XflPackage.UNARY:
case XflPackage.BINARY:
deriveq_area.setEditable(editable && pkgeditable);
break;
case XflPackage.FAMILY:
members_area.setEditable(editable && pkgeditable);
case XflPackage.MFUNC:
javagreq_area.setEditable(editable && pkgeditable);
javasmeq_area.setEditable(editable && pkgeditable);
javacenter_area.setEditable(editable && pkgeditable);
javabasis_area.setEditable(editable && pkgeditable);
ansicgreq_area.setEditable(editable && pkgeditable);
ansicsmeq_area.setEditable(editable && pkgeditable);
ansiccenter_area.setEditable(editable && pkgeditable);
ansicbasis_area.setEditable(editable && pkgeditable);
cppgreq_area.setEditable(editable && pkgeditable);
cppsmeq_area.setEditable(editable && pkgeditable);
cppcenter_area.setEditable(editable && pkgeditable);
cppbasis_area.setEditable(editable && pkgeditable);
deriveq_area.setEditable(editable && pkgeditable);
derivgreq_area.setEditable(editable && pkgeditable);
derivsmeq_area.setEditable(editable && pkgeditable);
derivcenter_area.setEditable(editable && pkgeditable);
derivbasis_area.setEditable(editable && pkgeditable);
update_area.setEditable(editable && pkgeditable);
break;
}
commandform.setEnabled(0,!editable && pkgeditable);
commandform.setEnabled(1,editable && pkgeditable);
commandform.setEnabled(2,editable && pkgeditable);
}
/**
* Construye una definicion con el contenido de los paneles
*/
private Definition read(int kind) {
String code;
Definition workcopy = createDefinition();
boolean good = true;
code = defname.getText();
if(!XConstants.isIdentifier(code)) {
XDialog.showMessage(this,"Definition name is not an identifier.");
good = false;
}
workcopy.setName(code);
workcopy.setAlias(aliaspanel.get());
workcopy.setParameters(parampanel.get());
code = paramlistname.getText();
if(code.trim().length() != 0) workcopy.setParamList(code);
else workcopy.setParamList(null);
readValue(workcopy,requires_area,Definition.REQUIREMENTS);
readValue(workcopy,javaeq_area,Definition.JAVA_EQUAL);
readValue(workcopy,ansiceq_area,Definition.C_EQUAL);
readValue(workcopy,cppeq_area,Definition.CPP_EQUAL);
readValue(workcopy,source_area,Definition.SOURCE);
switch(kind) {
case XflPackage.DEFUZ:
workcopy.setDefinedFor(definedpanel.get());
break;
case XflPackage.CRISP:
readValue(workcopy,inputs_area,Definition.INPUTS);
break;
case XflPackage.UNARY:
case XflPackage.BINARY:
readValue(workcopy,deriveq_area,Definition.DERIV_EQUAL);
break;
case XflPackage.FAMILY:
readValue(workcopy,members_area,Definition.MEMBERS);
case XflPackage.MFUNC:
readValue(workcopy,javagreq_area,Definition.JAVA_GREQ);
readValue(workcopy,javasmeq_area,Definition.JAVA_SMEQ);
readValue(workcopy,javacenter_area,Definition.JAVA_CENTER);
readValue(workcopy,javabasis_area,Definition.JAVA_BASIS);
readValue(workcopy,ansicgreq_area,Definition.C_GREQ);
readValue(workcopy,ansicsmeq_area,Definition.C_SMEQ);
readValue(workcopy,ansiccenter_area,Definition.C_CENTER);
readValue(workcopy,ansicbasis_area,Definition.C_BASIS);
readValue(workcopy,cppgreq_area,Definition.CPP_GREQ);
readValue(workcopy,cppsmeq_area,Definition.CPP_SMEQ);
readValue(workcopy,cppcenter_area,Definition.CPP_CENTER);
readValue(workcopy,cppbasis_area,Definition.CPP_BASIS);
readValue(workcopy,deriveq_area,Definition.DERIV_EQUAL);
readValue(workcopy,derivgreq_area,Definition.DERIV_GREQ);
readValue(workcopy,derivsmeq_area,Definition.DERIV_SMEQ);
readValue(workcopy,derivcenter_area,Definition.DERIV_CENTER);
readValue(workcopy,derivbasis_area,Definition.DERIV_BASIS);
readValue(workcopy,update_area,Definition.UPDATE);
break;
}
if(good) return workcopy;
return null;
}
/**
* Lee el contenido de un �rea de texto
*/
private void readValue(Definition workcopy,JTextArea area, int code) {
String text = area.getText();
if(text.trim().length() != 0) workcopy.setCode(code,text);
}
//----------------------------------------------------------------------------//
// M�todos asociados a la barra de comandos //
//----------------------------------------------------------------------------//
/**
* Aplica los cambios a una definici�n editada
*/
private boolean apply() {
PackageDefinition pkg = xfpkg.getPackage();
Definition workcopy = read(definition.getKind());
if(workcopy == null) return false;
if(!workcopy.compile()) {
String msg = "Errors in the compilation of the definition.";
XDialog.showMessage(this,msg);
return false;
}
if(definition != null) {
if(!definition.getName().equals(workcopy.getName())) definition.unlink();
pkg.remove(definition, definition.getKind());
}
definition = workcopy;
pkg.add(definition, definition.getKind());
pkg.setModified(true);
setEditable(false);
return true;
}
/**
* Cierra la ventana de edici�n
*/
private void close() {
definition.setEditor(null);
setVisible(false);
}
//----------------------------------------------------------------------------//
// M�todos auxiliares //
//----------------------------------------------------------------------------//
/**
* Crea una etiqueta con una cierta anchura
*/
private JLabel createLabel(String label, int width) {
JLabel jlabel = new JLabel(label);
jlabel.setAlignmentX(0.5f);
jlabel.setForeground(Color.black);
Dimension minsize = jlabel.getMinimumSize();
Dimension prefsize = jlabel.getPreferredSize();
jlabel.setMinimumSize(new Dimension(width,minsize.height));
jlabel.setPreferredSize(new Dimension(width,prefsize.height));
return jlabel;
}
/**
* Crea una definicion de un cierto tipo
*/
private Definition createDefinition() {
int kind = definition.getKind();
PackageDefinition pkg = xfpkg.getPackage();
switch(kind) {
case PackageDefinition.BINARY: return Definition.createBinaryDefinition(""+pkg,"");
case PackageDefinition.UNARY: return Definition.createUnaryDefinition(""+pkg,"");
case PackageDefinition.MFUNC: return Definition.createMFDefinition(""+pkg,"");
case PackageDefinition.DEFUZ: return Definition.createDefuzDefinition(""+pkg,"");
case PackageDefinition.FAMILY: return Definition.createFamilyDefinition(""+pkg,"");
case PackageDefinition.CRISP: return Definition.createCrispDefinition(""+pkg,"");
default: return null;
}
}
}