/***********************************************************************
This file is part of KEEL-software, the Data Mining tool for regression,
classification, clustering, pattern mining and so on.
Copyright (C) 2004-2010
F. Herrera (herrera@decsai.ugr.es)
L. Sánchez (luciano@uniovi.es)
J. Alcalá-Fdez (jalcala@decsai.ugr.es)
S. García (sglopez@ujaen.es)
A. Fernández (alberto.fernandez@ujaen.es)
J. Luengo (julianlm@decsai.ugr.es)
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see http://www.gnu.org/licenses/
**********************************************************************/
/*
* File ParametersDialog.java
*
* Created on 02-mar-2009, 5:30:48
* Modified on 12-may-2009
* @author Ignacio Robles
* @author Julian Luengo
* @author Modified by Juan Carlos Fernandez Caballero and Pedro Antonio Gutierrez (University of Córdoba) 7/07/2009
* @authos Modified Ana Palacios Jimenez and Luciano Sanchez Ramos 23-4-2010 (University of Oviedo)
*/
package keel.GraphInterKeel.experiments;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.util.Vector;
import javax.swing.table.*;
import keel.GraphInterKeel.menu.Frame;
public class ParametersDialog extends JDialog {
JPanel panel1 = new JPanel() {
@Override
public void paintComponent(Graphics g) {
//ImageIcon img = new ImageIcon(this.getClass().getResource("/keel/GraphInterKeel/resources/imag/experimentos/parametersVector.jpg"));
//g.drawImage(img.getImage(), 0, 0, null);
super.paintComponent(g);
}
};
/***************************************************************
*************** EDUCATIONAL KEEL ****************************
**************************************************************/
private Experiments experiment;
/***************************************************************
*************** EDUCATIONAL KEEL ****************************
**************************************************************/
JLabel jLabel1 = new JLabel();
JLabel jLabel2 = new JLabel();
JLabel jLabel3 = new JLabel();
JButton jButton1 = new JButton();
JButton jButton2 = new JButton();
JScrollPane jScrollPane1 = new JScrollPane();
JTable jTable1;
Parameters parameterData;
JLabel jLabel4 = new JLabel();
Parameters undoParameters;
Vector actualSeed;
ParametersTable paramTable;
JComboBox opciones = new JComboBox();
JButton jButton5 = new JButton();
ImageIcon image1 = new ImageIcon(this.getClass().getResource(
"/keel/GraphInterKeel/resources/ico/experiments/aceptar.gif"));
ImageIcon image2 = new ImageIcon(this.getClass().getResource(
"/keel/GraphInterKeel/resources/ico/experiments/cancelar.gif"));
ImageIcon image3 = new ImageIcon(this.getClass().getResource(
"/keel/GraphInterKeel/resources/ico/experiments/deshacer.gif"));
SpinnerNumberModel model = new SpinnerNumberModel(1, 1, 1000, 1);
JSpinner jSpinner1 = new JSpinner(model);
Vector all;
ExternalObjectDescription dsc;
JComboBox jComboBox1 = new JComboBox();
JLabel jLabel5 = new JLabel();
//JLabel jLabel6 = new JLabel();
//ExternalObjectDescription dsc1;
/**
* Builder
*
* @param frame Parent frame
* @param title Title of the frame
* @param modal Modal status
* @param parametersVector Parameters vector
* @param dsc Parent dsc
*/
public ParametersDialog(Experiments frame, String title, boolean modal,
Vector parametersVector, ExternalObjectDescription dsc) {
super(frame, title, modal);
/* if(dsc_al.getSubtypelqd()==Node.CRISP2 ||dsc_al.getSubtypelqd()==Node.LQD )
{
jComboBox1.setEditable(false);
jComboBox1.setVisible(false);
jLabel6.setText("Algorithm without datasets");
jLabel6.setBounds(new Rectangle(185, 76, 155, 22));
jLabel6.setForeground(Color.black);
jLabel6.setBackground(new Color(225, 225, 225));
jLabel6.setFont(new java.awt.Font("Arial", 1, 11));
jLabel5.setVisible(false);
panel1.add(jLabel6, null);
}*/
try {
this.dsc = frame.experimentGraph.getExternalObjectDescription();
all = parametersVector;
parameterData = (Parameters) (parametersVector.elementAt(Layer.layerActivo));
undoParameters = new Parameters((Parameters) (parametersVector.elementAt(Layer.layerActivo)));
paramTable = new ParametersTable(undoParameters, this);
/***************************************************************
*************** EDUCATIONAL KEEL ***************************
**************************************************************/
if (Frame.buttonPressed == 1) //Button Teaching pressed
{
experiment = frame;
}
/***************************************************************
*************** EDUCATIONAL KEEL ****************************
**************************************************************/
initParameters();
pack();
} catch (Exception ex) {
ex.printStackTrace();
}
}
/**
* Default builder
*/
public ParametersDialog() {
this(null, "", false, null, null);
}
private void initParameters() throws Exception {
class MyTableCellEditor extends AbstractCellEditor implements TableCellEditor {
JComponent component = new JTextField();
// This method is called when a cell value is edited by the user.
public Component getTableCellEditorComponent(
JTable table, Object value,
boolean isSelected,
int rowIndex, int vColIndex) {
// 'value' is value contained in the cell located at (rowIndex, vColIndex)
component = null;
// colIndex is useful
int selectedRow = 0;
int n = parameterData.getNumParameters();
int suma = -1;
int pos = 0;
while (pos < n) {
while (parameterData.isHidden(pos)) {
pos++;
}
suma++;
if (suma == rowIndex) {
break;
}
pos++;
}
selectedRow = pos;
if (vColIndex == 1) {
if (parameterData.getParameterType(selectedRow).equalsIgnoreCase("list")) {
String[] valores = new String[parameterData.getDomain(selectedRow).size()];
int seleccionado = 0;
for (int i = 0; i < parameterData.getDomain(selectedRow).size(); i++) {
valores[i] = parameterData.getDomainValue(selectedRow, i);
if (value.equals(parameterData.getDomainValue(selectedRow, i))) {
seleccionado = i;
}
}
JComboBox tmp = new JComboBox(valores);
tmp.setSelectedIndex(seleccionado);
component = tmp;
} else {
component = new JTextField();
// Configure the component with the specified value
((JTextField) component).setText((String) value);
}
}
// Return the configured component
return component;
}
// This method is called when editing is completed.
// It must return the new value to be stored in the cell.
public Object getCellEditorValue() {
if (component instanceof JComboBox) {
return ((JComboBox) component).getSelectedItem();
} else {
return ((JTextField) component).getText();
}
}
}
jTable1 = new JTable(paramTable) {
@Override
public boolean isCellEditable(int rowIndex, int vColIndex) {
if (vColIndex == 1) {
return true;
} else {
return false;
}
}
};
// For OSX
jTable1.setRowHeight(30);
// Install new editor in second row
int vColIndex = 1;
TableColumn col = jTable1.getColumnModel().getColumn(vColIndex);
col.setCellEditor(new MyTableCellEditor());
panel1.setLayout(null);
jLabel1.setBackground(new Color(225, 225, 225));
jLabel1.setFont(new java.awt.Font("Arial", 1, 11));
jLabel1.setForeground(Color.black);
jLabel1.setText("Algorithm Name:");
jLabel1.setBounds(new Rectangle(17, 15, 135, 22));
jLabel2.setBackground(new Color(225, 225, 225));
jLabel2.setFont(new java.awt.Font("Arial", 1, 11));
jLabel2.setBorder(null);
jLabel2.setText("Number of Executions:");
jLabel2.setBounds(new Rectangle(17, 76, 136, 22));
jLabel3.setBackground(new Color(225, 225, 225));
jLabel3.setFont(new java.awt.Font("Arial", 1, 11));
jLabel3.setText("Parameters:");
jLabel3.setBounds(new Rectangle(17, 213, 90, 21));
jButton1.setBackground(new Color(225, 225, 225));
jButton1.setBounds(new Rectangle(75, 490, 100, 30));
jButton1.setFont(new java.awt.Font("Arial", 0, 11));
jButton1.setOpaque(false);
jButton1.setToolTipText("Apply changes");
jButton1.setIcon(image1);
jButton1.setMnemonic('A');
jButton1.setText("Apply");
jButton1.addActionListener(new ParametrosDialog_jButton1_actionAdapter(this));
jButton2.setText("Cancel");
jButton2.addActionListener(new ParametrosDialog_jButton2_actionAdapter(this));
jButton2.setBackground(new Color(225, 225, 225));
jButton2.setBounds(new Rectangle(224, 490, 100, 30));
jButton2.setFont(new java.awt.Font("Arial", 0, 11));
jButton2.setOpaque(false);
jButton2.setToolTipText("Don\'t apply the changes");
jButton2.setIcon(image2);
jButton2.setMnemonic('C');
jScrollPane1.getViewport().setBackground(Color.white);
jScrollPane1.setFont(new java.awt.Font("Arial", 0, 11));
jScrollPane1.setBorder(BorderFactory.createEtchedBorder());
jScrollPane1.setBounds(new Rectangle(17, 233, 359, 203));
jLabel4.setBackground(new Color(225, 225, 225));
jLabel4.setFont(new java.awt.Font("Arial", 0, 11));
jLabel4.setBorder(null);
jLabel4.setText(parameterData.getAlgorithmType());
jLabel4.setBounds(new Rectangle(17, 37, 349, 22));
jButton5.setBackground(new Color(225, 225, 225));
jButton5.setBounds(new Rectangle(133, 449, 130, 30));
jButton5.setFont(new java.awt.Font("Arial", 0, 11));
jButton5.setOpaque(false);
jButton5.setToolTipText("Restore default values");
jButton5.setIcon(image3);
jButton5.setMnemonic('V');
jButton5.setText("Default Values");
jButton5.addActionListener(new ParametrosDialog_jButton5_actionAdapter(this));
jTable1.setBackground(SystemColor.white);
jTable1.setFont(new java.awt.Font("Arial", 0, 11));
opciones.addActionListener(new ParametrosDialog_opciones_actionAdapter(this));
opciones.addFocusListener(new ParametrosDialog_opciones_focusAdapter(this));
jSpinner1.setBounds(new Rectangle(17, 103, 78, 22));
jSpinner1.setValue(new Integer(parameterData.getExe()));
jSpinner1.setBackground(new Color(225, 225, 225));
jSpinner1.setFont(new java.awt.Font("Arial", 0, 11));
jSpinner1.setForeground(new Color(225, 225, 225));
if (!parameterData.isProbabilistic()) {
jSpinner1.setEnabled(false);
jLabel2.setEnabled(false);
}
jComboBox1.setBounds(new Rectangle(184, 103, 185, 22));
jComboBox1.addActionListener(new ParametrosDialog_jComboBox1_actionAdapter(this));
String valores[] = dsc.getAllNames();
for (int i = 0; i < valores.length; i++) {
jComboBox1.addItem(valores[i]);
}
jComboBox1.addItem("All Datasets");
jComboBox1.setFont(new java.awt.Font("Arial", 0, 11));
jComboBox1.setSelectedIndex(valores.length);
jLabel5.setBounds(new Rectangle(185, 76, 135, 22));
jLabel5.setText("Applied to Dataset:");
jLabel5.setForeground(Color.black);
jLabel5.setBackground(new Color(225, 225, 225));
jLabel5.setFont(new java.awt.Font("Arial", 1, 11));
panel1.setBackground(new Color(225, 225, 225));
panel1.setFont(new java.awt.Font("Arial", 0, 11));
panel1.setOpaque(false);
this.getContentPane().setBackground(new Color(225, 225, 225));
this.setFont(new java.awt.Font("Arial", 0, 11));
opciones.setBackground(new Color(225, 225, 225));
opciones.setFont(new java.awt.Font("Arial", 0, 11));
getContentPane().add(panel1);
panel1.add(jLabel1, null);
panel1.add(jButton2, null);
panel1.add(jScrollPane1, null);
panel1.add(jLabel4, null);
panel1.add(jLabel3, null);
panel1.add(jButton5, null);
panel1.add(jButton1, null);
panel1.add(jLabel2, null);
panel1.add(jSpinner1, null);
panel1.add(jComboBox1, null);
panel1.add(jLabel5, null);
jTable1.getTableHeader().setReorderingAllowed(false);
TableColumn column = null;
column = jTable1.getColumnModel().getColumn(0);
column.setPreferredWidth(200);
column = jTable1.getColumnModel().getColumn(1);
column.setPreferredWidth(50);
jTable1.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
ListSelectionModel rowSM = jTable1.getSelectionModel();
/**
rowSM.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
ListSelectionModel lsm = (ListSelectionModel) e.getSource();
if (!lsm.isSelectionEmpty()) {
int selectedRow = lsm.getMinSelectionIndex();
jTable1.changeSelection(selectedRow, 1, true, false);
if (parameterData.getTipoParametro(selectedRow).equalsIgnoreCase("list")) {
TableColumn column = jTable1.getColumnModel().getColumn(1);
opciones.removeAllItems();
for (int i = 0; i < parameterData.getDominio(selectedRow).size(); i++) {
opciones.addItem(parameterData.getDominioValor(selectedRow, i));
}
column.setCellEditor(new DefaultCellEditor(opciones));
} else {
TableColumn column = jTable1.getColumnModel().getColumn(1);
column.setCellEditor(new DefaultCellEditor(new JTextField()));
}
}
}
});
*/
jScrollPane1.getViewport().add(jTable1, null);
}
/**
* Hide button
* @param e Event
*/
void jButton2_actionPerformed(ActionEvent e) {
this.setVisible(false);
}
/**
* Apply parameters
* @param e Event
*/
void jButton1_actionPerformed(ActionEvent e) {
jTable1.getColumnModel().getColumn(1).getCellEditor().stopCellEditing();
Integer ejecuciones = (Integer) jSpinner1.getValue();
if (jComboBox1.getSelectedIndex() == Layer.numLayers) {
for (int i = 0; i < all.size(); i++) {
((Parameters) (all.elementAt(i))).copyParameters(undoParameters);
((Parameters) (all.elementAt(i))).setExe(ejecuciones.intValue());
}
} else {
//Apply results in specified layer
jTable1.getColumnModel().getColumn(1).getCellEditor().stopCellEditing();
ejecuciones = (Integer) jSpinner1.getValue();
parameterData.copyParameters(undoParameters);
parameterData.setExe(ejecuciones.intValue());
parameterData.copyParameters(undoParameters);
parameterData.setExe(ejecuciones.intValue());
}
/***************************************************************
*************** EDUCATIONAL KEEL ****************************
**************************************************************/
if (Frame.buttonPressed == 1) //Button Teaching pressed
{
//Incorrect parameters
if (paramTable.getOutOfRange() == false) {
//window of partitions is opened
if (experiment.getExecDocentWindowState() == false) {
Object[] options = {"OK", "CANCEL"};
int n = JOptionPane.showOptionDialog(this, "The actual experiment is configured with others params. \n" +
"OK presses to STOP experiment and resume witch new configuration. \n", "Warning!",
JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE,
null, options, options[0]);
if (n == JOptionPane.YES_OPTION) {
this.setVisible(false);
//Open new window of partitions and invoque "generarDirectorios" method
experiment.deleteExecDocentWindow();
experiment.closedEducationalExec(null);
//experiment.ejecutar_actionPerformed(null);
} else {
//Don�t anything
}
} //Window of partitions closed
else {
this.setVisible(false);
}
}
} else //Button Experiments pressed
{
this.setVisible(false);
}
}//jButton1_actionPerformed
/***************************************************************
*************** EDUCATIONAL KEEL ****************************
**************************************************************/
class ParametrosDialog_jButton2_actionAdapter
implements java.awt.event.ActionListener {
ParametersDialog adaptee;
ParametrosDialog_jButton2_actionAdapter(ParametersDialog adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.jButton2_actionPerformed(e);
}
}
class ParametrosDialog_jButton1_actionAdapter
implements java.awt.event.ActionListener {
ParametersDialog adaptee;
ParametrosDialog_jButton1_actionAdapter(ParametersDialog adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.jButton1_actionPerformed(e);
}
}
/**
* Default values button
* @param e Event
*/
void jButton5_actionPerformed(ActionEvent e) {
int cont = 0;
jTable1.getColumnModel().getColumn(1).getCellEditor().stopCellEditing(); //esto se hace para que funcione bien el poner valores por defecto
undoParameters.setValues(parameterData.getDefaultValues());
for (int i = 0; i < parameterData.getNumParameters(); i++) {
if (!parameterData.isHidden(i)) {
jTable1.setValueAt(undoParameters.getValue(i), cont, 1);
cont++;
}
}
jTable1.repaint();
}
/**
* Options button
* @param e Event
*/
void opciones_actionPerformed(ActionEvent e) {
}
/**
* Option focus
* @param e Event
*/
void opciones_focusLost(FocusEvent e) {
jTable1.changeSelection(0, 1, true, false);
}
/**
* Apply changes
* @param e Event
*/
void jComboBox1_actionPerformed(ActionEvent e) {
int cont = 0;
//Apply results in specified layer
jTable1.getColumnModel().getColumn(1).getCellEditor().stopCellEditing();
Integer ejecuciones = (Integer) jSpinner1.getValue();
parameterData.copyParameters(undoParameters);
parameterData.setExe(ejecuciones.intValue());
//change layer
if (jComboBox1.getSelectedIndex() < Layer.numLayers) {
parameterData = (Parameters) (all.elementAt(jComboBox1.getSelectedIndex()));
undoParameters.setValues(parameterData.getValues());
for (int i = 0; i < parameterData.getNumParameters(); i++) {
if (!parameterData.isHidden(i)) {
jTable1.setValueAt(undoParameters.getValue(i), cont, 1);
cont++;
}
}
jTable1.repaint();
jSpinner1.setValue(new Integer(parameterData.getExe()));
}
}
}
class ParametrosDialog_jButton5_actionAdapter
implements java.awt.event.ActionListener {
ParametersDialog adaptee;
ParametrosDialog_jButton5_actionAdapter(ParametersDialog adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.jButton5_actionPerformed(e);
}
}
class ParametrosDialog_opciones_actionAdapter
implements java.awt.event.ActionListener {
ParametersDialog adaptee;
ParametrosDialog_opciones_actionAdapter(ParametersDialog adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.opciones_actionPerformed(e);
}
}
class ParametrosDialog_opciones_focusAdapter
extends java.awt.event.FocusAdapter {
ParametersDialog adaptee;
ParametrosDialog_opciones_focusAdapter(ParametersDialog adaptee) {
this.adaptee = adaptee;
}
@Override
public void focusLost(FocusEvent e) {
adaptee.opciones_focusLost(e);
}
}
class ParametrosDialog_jComboBox1_actionAdapter implements java.awt.event.ActionListener {
ParametersDialog adaptee;
ParametrosDialog_jComboBox1_actionAdapter(ParametersDialog adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.jComboBox1_actionPerformed(e);
}
}