/***********************************************************************
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/
**********************************************************************/
package keel.GraphInterKeel.datacf.editData;
import org.core.Files;
import keel.GraphInterKeel.datacf.util.KeelFileFilter;
import keel.GraphInterKeel.util.Path;
import java.io.File;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import keel.GraphInterKeel.datacf.DataCFFrame;
/**
* <p>
* @author Written by Juan Carlos Fernández and Pedro Antonio Gutiérrez (University of Córdoba) 23/10/2008
* @version 1.0
* @since JDK1.5
* </p>
*/
public class EditPanel extends javax.swing.JPanel {
/**
* <p>
* Class for editing a dataset
* </p>
*/
/**
* <p>
* Constructor that initializes the panel
* </p>
*/
public EditPanel() {
initComponents();
}
/**
* <p>
* This method is called from within the constructor to
* initialize the form.
* </p>
* <p>
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
* </p>
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
editjTabbedPane = new javax.swing.JTabbedPane();
editDataPanel = new keel.GraphInterKeel.datacf.editData.EditDataPanel();
editVariablePanel = new keel.GraphInterKeel.datacf.editData.EditVariablePanel();
loadjPanel = new javax.swing.JPanel();
loadjLabel = new javax.swing.JLabel();
browserjButton = new javax.swing.JButton();
loadjTextField = new javax.swing.JTextField();
savejButton = new javax.swing.JButton();
setName("Form"); // NOI18N
editjTabbedPane.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createEtchedBorder(), "Edition"));
editjTabbedPane.setName("editjTabbedPane"); // NOI18N
editDataPanel.setName("editDataPanel"); // NOI18N
editjTabbedPane.addTab("Data", editDataPanel);
editVariablePanel.setName("editVariablePanel"); // NOI18N
editjTabbedPane.addTab("Variables", editVariablePanel);
loadjPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createEtchedBorder(), "Load"));
loadjPanel.setName("loadjPanel"); // NOI18N
this.editDataPanel.setEditVariablePanel(this.editVariablePanel);
this.editVariablePanel.setEditDataPanel(this.editDataPanel);
loadjLabel.setText("Load Dataset");
loadjLabel.setName("loadjLabel"); // NOI18N
browserjButton.setText("...");
browserjButton.setToolTipText("Open Browser");
browserjButton.setName("browserjButton"); // NOI18N
browserjButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
browserjButtonActionPerformed(evt);
}
});
loadjTextField.setEditable(false);
loadjTextField.setName("loadjTextField"); // NOI18N
savejButton.setText("Save");
savejButton.setToolTipText("Save Dataa");
savejButton.setMaximumSize(new java.awt.Dimension(63, 23));
savejButton.setMinimumSize(new java.awt.Dimension(63, 23));
savejButton.setName("savejButton"); // NOI18N
savejButton.setPreferredSize(new java.awt.Dimension(63, 23));
savejButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
savejButtonActionPerformed(evt);
}
});
javax.swing.GroupLayout loadjPanelLayout = new javax.swing.GroupLayout(loadjPanel);
loadjPanel.setLayout(loadjPanelLayout);
loadjPanelLayout.setHorizontalGroup(
loadjPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(loadjPanelLayout.createSequentialGroup()
.addContainerGap()
.addComponent(loadjLabel)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(loadjTextField, javax.swing.GroupLayout.DEFAULT_SIZE, 222, Short.MAX_VALUE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(browserjButton)
.addGap(18, 18, 18)
.addComponent(savejButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap())
);
loadjPanelLayout.setVerticalGroup(
loadjPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(loadjPanelLayout.createSequentialGroup()
.addGroup(loadjPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(loadjLabel)
.addComponent(savejButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(browserjButton)
.addComponent(loadjTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(loadjPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(editjTabbedPane, javax.swing.GroupLayout.DEFAULT_SIZE, 458, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(loadjPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(editjTabbedPane, javax.swing.GroupLayout.DEFAULT_SIZE, 314, Short.MAX_VALUE))
);
org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(keel.GraphInterKeel.datacf.DataCFApp.class).getContext().getResourceMap(EditPanel.class);
editjTabbedPane.getAccessibleContext().setAccessibleName(resourceMap.getString("editjTabbedPane.AccessibleContext.accessibleName")); // NOI18N
}// </editor-fold>//GEN-END:initComponents
private void browserjButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_browserjButtonActionPerformed
JFileChooser chooser = new JFileChooser();
KeelFileFilter fileFilter = new KeelFileFilter();
fileFilter.addExtension("dat");
fileFilter.setFilterName("Data Files");
chooser.setFileFilter(fileFilter);
chooser.setCurrentDirectory(Path.getFilePath());
int opcion = chooser.showOpenDialog(this);
Path.setFilePath(chooser.getCurrentDirectory());
if (opcion == JFileChooser.APPROVE_OPTION)
this.loadFile(chooser.getSelectedFile(), false);
}//GEN-LAST:event_browserjButtonActionPerformed
/**
* <p>
* Loads a new file in the tab
* </p>
* @param file The new file
* @param showPartition A boolean indicating if you want to show a dialog
* for making partitions, after editing the file.
*/
public void loadFile(File file, boolean showPartition){
this.editDataPanel.setDataSet(file.getAbsolutePath());
this.editDataPanel.setStateAddButton(true);
this.editVariablePanel.setStateAddButton(true);
this.editVariablePanel.setCounter(0);
this.loadjTextField.setText(file.getAbsolutePath());
this.showPartition = showPartition;
}
private void savejButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_savejButtonActionPerformed
if (this.editDataPanel.getData().getAttributes().size() == 0) {
JOptionPane.showMessageDialog(this, "Please, insert at least one variable", "Error", 2);
return;
}
JFileChooser chooser = new JFileChooser();
KeelFileFilter fileFilter = new KeelFileFilter();
fileFilter.addExtension("dat");
fileFilter.setFilterName("KEEL Files (.dat)");
chooser.setFileFilter(fileFilter);
chooser.setCurrentDirectory(Path.getFilePath());
if(!this.loadjTextField.getText().equals(""))
chooser.setSelectedFile(new File(this.loadjTextField.getText()));
int opcion = chooser.showSaveDialog(this);
Path.setFilePath(chooser.getCurrentDirectory());
String cadena, aux;
boolean ok;
if (opcion == JFileChooser.APPROVE_OPTION && this.editDataPanel.getStateAddButton()) {
String nombre = chooser.getSelectedFile().getAbsolutePath();
if (!nombre.toLowerCase().endsWith(".dat") && !nombre.toLowerCase().endsWith(".txt")) {
// Add correct extension
nombre += ".dat";
}
File tmp = new File(nombre);
if (!tmp.exists() || JOptionPane.showConfirmDialog(this,
"File " + nombre + " already exists. Do you want to replace it?", "Confirm",
JOptionPane.YES_NO_OPTION, 3) == JOptionPane.YES_OPTION) {
imprimeCabecera(nombre);
for (int i = 0; i < this.editDataPanel.getTablaDataset().getData().length; i++) {
cadena = "";
ok = false;
for (int j = 0; j < this.editDataPanel.getData().getNVariables(); j++) {
if (!ok) {
if (this.editDataPanel.getTablaDataset().getData()[i][j] == null ||
(this.editDataPanel.getTablaDataset().getData().toString()).equalsIgnoreCase(
"<null>")) {
cadena += "<null>";
} else {
cadena += this.editDataPanel.getTablaDataset().getData()[i][j];
}
ok = true;
} else {
if (this.editDataPanel.getTablaDataset().getData() == null ||
(this.editDataPanel.getTablaDataset().getData().toString()).equalsIgnoreCase(
"<null>")) {
cadena += ", <null>";
} else {
cadena += ", " + this.editDataPanel.getTablaDataset().getData()[i][j];
}
}
}
cadena += "\n";
Files.addToFile(nombre, cadena);
}
JOptionPane.showMessageDialog(this, "DataSet created", "Info",
JOptionPane.INFORMATION_MESSAGE);
// Perform partitions?
if(showPartition){
Object[] options = {"Yes", "No"};
int n = JOptionPane.showOptionDialog(parent,
"Do you want to make partitions for this dataset?",
"Make partitions",
JOptionPane.YES_NO_CANCEL_OPTION,
JOptionPane.QUESTION_MESSAGE,
null,
options,
options[1]);
if (n == 0) {
if (dataCFFrame != null) {
dataCFFrame.addPartitionTab(tmp);
}
}
showPartition = false;
}
}
}
}//GEN-LAST:event_savejButtonActionPerformed
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton browserjButton;
private keel.GraphInterKeel.datacf.editData.EditDataPanel editDataPanel;
private keel.GraphInterKeel.datacf.editData.EditVariablePanel editVariablePanel;
private javax.swing.JTabbedPane editjTabbedPane;
private javax.swing.JLabel loadjLabel;
private javax.swing.JPanel loadjPanel;
private javax.swing.JTextField loadjTextField;
private javax.swing.JButton savejButton;
// End of variables declaration//GEN-END:variables
// Parent JFrame
protected JFrame parent = null;
// Boolean indicating if you want to show a final dialog for making partitions of the dataset
protected boolean showPartition = false;
/** DataCF parent frame */
protected DataCFFrame dataCFFrame = null;
/**
* <p>
* Set the JFrame Parent
* </p>
* @param parent JFrame parent
*/
public void setParent(JFrame parent) {
this.parent = parent;
}
/**
* <p>
* Sets a view for a dataset
* </p>
* @param dataCFView View for a dataset
*/
public void setDataCFView(DataCFFrame dataCFView) {
this.dataCFFrame = dataCFView;
}
private void imprimeCabecera(String nombreFichero) {
String cadena = "";
int i, j;
if (this.editDataPanel.getData().getRelacion().equals("unknow")) {
cadena += "@relation " + new File(nombreFichero).getName().replaceAll(".dat", "") + "\n";
} else {
cadena += "@relation " + this.editDataPanel.getData().getRelacion() + "\n";
}
for (i = 0; i < this.editDataPanel.getData().getNVariables(); i++) {
cadena += "@attribute " + this.editDataPanel.getData().getAttributeIndex(i) + " ";
if (this.editDataPanel.getData().getAttributeTypeIndex(i).equalsIgnoreCase("nominal")) { //lista
cadena += "{";
for (j = 0; j < this.editDataPanel.getData().getRange(i).size(); j++) {
cadena += (String) this.editDataPanel.getData().getRange(i).elementAt(j);
if (j < this.editDataPanel.getData().getRange(i).size() - 1) {
cadena += ", ";
}
}
cadena += "}\n";
} else if (this.editDataPanel.getData().getAttributeTypeIndex(i).equalsIgnoreCase("integer")) { //int
cadena += "integer" + " [" + this.editDataPanel.getData().getRangesInt(i, 0) + ", " +
this.editDataPanel.getData().getRangesInt(i, 1) + "]\n";
} else { //real
cadena += "real" + " [" + this.editDataPanel.getData().getRangesReal(i, 0) + ", " +
this.editDataPanel.getData().getRangesReal(i, 1) + "]\n";
}
}
cadena += "@inputs ";
boolean poner = false;
for (j = 0; j < this.editDataPanel.getData().getNInputs(); j++) {
if (!poner) {
cadena += (String) (this.editDataPanel.getData().getInputs().elementAt(j));
poner = true;
} else {
cadena += ", " + (String) (this.editDataPanel.getData().getInputs().elementAt(j));
}
}
cadena += "\n";
cadena += "@outputs ";
poner = false;
for (j = 0; j < this.editDataPanel.getData().getNOutputs(); j++) {
if (!poner) {
cadena += (String) (this.editDataPanel.getData().getOutputs().elementAt(j));
poner = true;
} else {
cadena += ", " + (String) (this.editDataPanel.getData().getOutputs().elementAt(j));
}
}
cadena += "\n";
cadena += "@data\n";
Files.writeFile(nombreFichero, cadena);
}
}