/*********************************************************************** 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 keel.GraphInterKeel.datacf.util.Dataset; import keel.GraphInterKeel.datacf.util.DatasetTable; import javax.swing.DefaultCellEditor; import javax.swing.JComboBox; import javax.swing.JOptionPane; import javax.swing.JScrollBar; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.ListSelectionModel; import javax.swing.event.ChangeEvent; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.event.TableColumnModelEvent; import javax.swing.event.TableColumnModelListener; import javax.swing.table.TableColumn; import javax.swing.table.TableColumnModel; /** * <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 EditDataPanel extends javax.swing.JPanel { /** * <p> * Panel for editing datasets * </p> */ /** * <p> * Constructor that initializes the panel * </p> */ public EditDataPanel() { 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() { java.awt.GridBagConstraints gridBagConstraints; datajScrollPane = new javax.swing.JScrollPane(); jTable1 = new javax.swing.JTable(); buttonsjPanel = new javax.swing.JPanel(); addjButton = new javax.swing.JButton(); deletejButton = new javax.swing.JButton(); rankjPanel = new javax.swing.JPanel(); rankjLabel1 = new javax.swing.JLabel(); leftRankjLabel = new javax.swing.JLabel(); comajLabel = new javax.swing.JLabel(); rightRankjLabel = new javax.swing.JLabel(); bracketRightjLabel = new javax.swing.JLabel(); nominalValuesjLabel = new javax.swing.JLabel(); nominalValuesjScrollPane = new javax.swing.JScrollPane(); nominalValuesjTextPane = new javax.swing.JTextPane(); setName("Form"); // NOI18N datajScrollPane.setName("datajScrollPane"); // NOI18N jTable1.setModel(new javax.swing.table.DefaultTableModel( new Object [][] { }, new String [] { "Title 1", "Title 2", "Title 3", "Title 4" } )); jTable1.setName("jTable1"); // NOI18N datajScrollPane.setViewportView(jTable1); buttonsjPanel.setName("buttonsjPanel"); // NOI18N buttonsjPanel.setLayout(new java.awt.GridBagLayout()); addjButton.setText("Add Instance"); addjButton.setToolTipText("Add new instance"); addjButton.setMaximumSize(new java.awt.Dimension(112, 29)); addjButton.setMinimumSize(new java.awt.Dimension(112, 29)); addjButton.setName("addjButton"); // NOI18N addjButton.setPreferredSize(new java.awt.Dimension(109, 23)); addjButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { addjButtonActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(0, 0, 0, 10); buttonsjPanel.add(addjButton, gridBagConstraints); deletejButton.setText("Delete Instance"); deletejButton.setToolTipText("Delete instance"); deletejButton.setName("deletejButton"); // NOI18N addjButton.setEnabled(false); deletejButton.setEnabled(false); deletejButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { deletejButtonActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 0; gridBagConstraints.insets = new java.awt.Insets(0, 10, 0, 0); buttonsjPanel.add(deletejButton, gridBagConstraints); rankjPanel.setBorder(javax.swing.BorderFactory.createTitledBorder("View Information")); rankjPanel.setName("rankjPanel"); // NOI18N nominalValuesjLabel.setEnabled(false); nominalValuesjTextPane.setText(""); nominalValuesjScrollPane.setEnabled(false); nominalValuesjTextPane.setEnabled(false); rankjLabel1.setText("Value Rank: ["); rankjLabel1.setEnabled(false); rankjLabel1.setName("rankjLabel1"); // NOI18N leftRankjLabel.setName("leftRankjLabel"); // NOI18N comajLabel.setText(","); comajLabel.setEnabled(false); comajLabel.setName("comajLabel"); // NOI18N rightRankjLabel.setName("rightRankjLabel"); // NOI18N bracketRightjLabel.setText("]"); bracketRightjLabel.setEnabled(false); bracketRightjLabel.setName("bracketRightjLabel"); // NOI18N nominalValuesjLabel.setText("Nominal Values:"); nominalValuesjLabel.setEnabled(false); nominalValuesjLabel.setName("nominalValuesjLabel"); // NOI18N nominalValuesjScrollPane.setName("nominalValuesjScrollPane"); // NOI18N nominalValuesjTextPane.setEditable(false); nominalValuesjTextPane.setEnabled(false); nominalValuesjTextPane.setName("nominalValuesjTextPane"); // NOI18N nominalValuesjTextPane.setOpaque(false); nominalValuesjScrollPane.setViewportView(nominalValuesjTextPane); javax.swing.GroupLayout rankjPanelLayout = new javax.swing.GroupLayout(rankjPanel); rankjPanel.setLayout(rankjPanelLayout); rankjPanelLayout.setHorizontalGroup( rankjPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, rankjPanelLayout.createSequentialGroup() .addContainerGap() .addComponent(rankjLabel1) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(leftRankjLabel) .addGap(18, 18, 18) .addComponent(comajLabel) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(rightRankjLabel) .addGap(18, 18, 18) .addComponent(bracketRightjLabel) .addGap(82, 82, 82) .addComponent(nominalValuesjLabel) .addGap(18, 18, 18) .addComponent(nominalValuesjScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 139, Short.MAX_VALUE)) ); rankjPanelLayout.setVerticalGroup( rankjPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(rankjPanelLayout.createSequentialGroup() .addGroup(rankjPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(rankjPanelLayout.createSequentialGroup() .addGap(21, 21, 21) .addGroup(rankjPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(rankjLabel1) .addComponent(nominalValuesjLabel) .addComponent(comajLabel) .addComponent(leftRankjLabel) .addComponent(rightRankjLabel) .addComponent(bracketRightjLabel))) .addComponent(nominalValuesjScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 59, 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(buttonsjPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 464, Short.MAX_VALUE) .addComponent(datajScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 464, Short.MAX_VALUE) .addComponent(rankjPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addComponent(datajScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 157, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(rankjPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(buttonsjPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) ); }// </editor-fold>//GEN-END:initComponents private void addjButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_addjButtonActionPerformed int fil, i, j; int temp = 0; Object nuevo[][]; boolean flagEnd = false; fil = this.jTable1.getSelectedRow(); if (fil == -1) { flagEnd = true; fil = this.tablaDataset.getData().length; } else { this.jTable1.removeRowSelectionInterval(fil, fil); } nuevo = new Object[this.tablaDataset.getData().length + 1][this.tablaDataset.getData()[0].length]; for (i = 0; i < nuevo.length; i++) { for (j = 0; j < nuevo[i].length; j++) { if (i == fil && temp == 0) { temp++; } if (i == fil) { if (this.data.getAttributeTypeIndex(j).equalsIgnoreCase("nominal")) { nuevo[i][j] = new String("<null>"); } else { nuevo[i][j] = null; } } else { nuevo[i][j] = this.tablaDataset.getData()[i - temp][j]; } } } //Refresh this.tablaDataset.setData(nuevo); this.jTable1.setModel(this.tablaDataset); datajScrollPane.getViewport().remove(jTable1); datajScrollPane.getViewport().add(jTable1); if (flagEnd == true) { JScrollBar scroll = this.datajScrollPane.getVerticalScrollBar(); scroll.setValue(scroll.getMaximum()); } //Posible change in Table this.editVariablePanel.refreshVariablePanel(this.data); }//GEN-LAST:event_addjButtonActionPerformed private void deletejButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_deletejButtonActionPerformed int fil, i, j; int temp = 0; Object nuevo[][]; fil = this.jTable1.getSelectedRow(); this.jTable1.removeRowSelectionInterval(fil, fil); nuevo = new Object[this.tablaDataset.getData().length - 1][this.tablaDataset.getData()[0].length]; for (i = 0; i < nuevo.length; i++) { for (j = 0; j < nuevo[i].length; j++) { if (i == fil && temp == 0) { temp++; } nuevo[i][j] = this.tablaDataset.getData()[i + temp][j]; } } this.tablaDataset.setData(nuevo); this.jTable1.setModel(this.tablaDataset); datajScrollPane.getViewport().remove(jTable1); datajScrollPane.getViewport().add(jTable1); //Posible change in Table this.editVariablePanel.refreshVariablePanel(this.data); }//GEN-LAST:event_deletejButtonActionPerformed // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton addjButton; private javax.swing.JLabel bracketRightjLabel; private javax.swing.JPanel buttonsjPanel; private javax.swing.JLabel comajLabel; private javax.swing.JScrollPane datajScrollPane; private javax.swing.JButton deletejButton; private javax.swing.JTable jTable1; private javax.swing.JLabel leftRankjLabel; private javax.swing.JLabel nominalValuesjLabel; private javax.swing.JScrollPane nominalValuesjScrollPane; private javax.swing.JTextPane nominalValuesjTextPane; private javax.swing.JLabel rankjLabel1; private javax.swing.JPanel rankjPanel; private javax.swing.JLabel rightRankjLabel; // End of variables declaration//GEN-END:variables /* Dataset */ protected Dataset data = null; /* Dataset Table */ protected DatasetTable tablaDataset = null; /** Edit Variable Panel */ protected EditVariablePanel editVariablePanel = null; /** * <p> * Set a Dataset * </p> * @param data Dataset to be used */ public void setData(Dataset data) { this.data = data; //Posible change in Table //this.editVariablePanel.refreshVariablePanel(); } /** * <p> * Get Dataset * </p> * @return The edited Dataset */ public Dataset getData() { return this.data; } /** * <p> * Set DatasetTable * </p> * @param tablaDataset Table for storing the dataset */ public void setTablaDataset(DatasetTable tablaDataset) { this.tablaDataset = tablaDataset; //Posible change in Table //this.editVariablePanel.refreshVariablePanel(); } /** * <p> * Return tablaDataset * </p> * @return DatasetTable Table for storing the dataset */ public DatasetTable getTablaDataset() { return this.tablaDataset; } /** * <p> * Set JTable of Data * </p> * @param jTable1 JTable for the dataset */ public void setJTable1(JTable jTable1) { this.jTable1 = jTable1; } /** * <p> * Get JTable of the dataSet * </p> * @return JTable JTable of the dataset */ public JTable getJTable1() { return this.jTable1; } /** * <p> * Return datajScrollPane * </p> * @return JScrollPane JScrollPane for the dataset */ public JScrollPane getScrollPane() { return this.datajScrollPane; } /** * <p> * Set the JScrollPane * </p> * @param scroll JScrollPane for the dataset */ public void setScrollPane(JScrollPane scroll) { this.datajScrollPane = scroll; } /** * <p> * Set the dataset by using its name * </p> * @param nameDataset Dataset Name */ public void setDataSet(String nameDataset) { Dataset aux = new Dataset(nameDataset); this.refreshDataPanel(aux); //Posible change in Table this.editVariablePanel.refreshVariablePanel(this.data); } /** * Change in EditVariablePanel * @param dataSet New dataset */ public void refreshDataPanel(Dataset dataSet) { Dataset aux = this.data; this.data = dataSet; if (this.data.getDataVector().size() > 0) { try { this.tablaDataset = new DatasetTable(this.data, this); } catch (ArrayIndexOutOfBoundsException exp) { if (this.data.getNVariables() > (this.data.getNInputs() + this.data.getNOutputs())) { JOptionPane.showMessageDialog(this, "There are neither input nor output attributes", "Error", 2); } else { JOptionPane.showMessageDialog(this, "The data set contains some errors. It can not be edited.", "Error", 2); } return; } this.jTable1.setModel(this.tablaDataset); this.jTable1.setFont(new java.awt.Font("Arial", 0, 11)); this.jTable1.getTableHeader().setReorderingAllowed(false); this.jTable1.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); this.jTable1.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); this.jTable1.setCellSelectionEnabled(true); this.jTable1.setColumnSelectionAllowed(true); TableColumn combos; for (int i = 0; i < this.data.getNVariables(); i++) { if (this.data.getAttributeTypeIndex(i).equalsIgnoreCase("nominal")) { combos = this.jTable1.getColumnModel().getColumn(i); JComboBox comboBox = new JComboBox(); for (int j = 0; j < this.data.getRange(i).size(); j++) { comboBox.addItem(new String(this.data.getRangesEnum(i, j))); } comboBox.addItem(new String("<null>")); combos.setCellEditor(new DefaultCellEditor(comboBox)); } } TableColumnModel colSM = jTable1.getColumnModel(); colSM.addColumnModelListener(new TableColumnModelListener() { @Override public void columnAdded(TableColumnModelEvent e) { } @Override public void columnRemoved(TableColumnModelEvent e) { } @Override public void columnMoved(TableColumnModelEvent e) { } @Override public void columnMarginChanged(ChangeEvent e) { } @Override public void columnSelectionChanged(ListSelectionEvent e) { ListSelectionModel csm = (ListSelectionModel) e.getSource(); int column = csm.getMinSelectionIndex(); if (column >= 0) { if (data.getAttributeTypeIndex(column).equalsIgnoreCase("nominal")) { nominalValuesjLabel.setEnabled(true); nominalValuesjTextPane.setEnabled(true); nominalValuesjScrollPane.setEnabled(true); rankjLabel1.setEnabled(false); leftRankjLabel.setEnabled(false); comajLabel.setEnabled(false); rightRankjLabel.setEnabled(false); bracketRightjLabel.setEnabled(false); leftRankjLabel.setText(""); rightRankjLabel.setText(""); String text = ""; for (int i = 0; i < data.getRange(column).size(); i++) { text = text + data.getRangesEnum(column, i) + "\n"; nominalValuesjTextPane.setText(text); } } else { rankjLabel1.setEnabled(true); leftRankjLabel.setEnabled(true); comajLabel.setEnabled(true); rightRankjLabel.setEnabled(true); bracketRightjLabel.setEnabled(true); leftRankjLabel.setText(""); rightRankjLabel.setText(""); nominalValuesjLabel.setEnabled(false); nominalValuesjTextPane.setEnabled(false); nominalValuesjTextPane.setText(""); nominalValuesjScrollPane.setEnabled(false); if (data.getAttributeTypeIndex(column).equalsIgnoreCase("integer")) { leftRankjLabel.setText(data.getRangesInt(column, 0).toString()); rightRankjLabel.setText(data.getRangesInt(column, 1).toString()); } else { leftRankjLabel.setText(data.getRangesReal(column, 0).toString()); rightRankjLabel.setText(data.getRangesReal(column, 1).toString()); } } } } }); // end of "colSM.addColumnModelListener" ListSelectionModel rowSM = jTable1.getSelectionModel(); rowSM.addListSelectionListener(new ListSelectionListener() { @Override public void valueChanged(ListSelectionEvent e) { ListSelectionModel lsm = (ListSelectionModel) e.getSource(); if (lsm.isSelectionEmpty()) { deletejButton.setEnabled(false); leftRankjLabel.setText(""); rightRankjLabel.setText(""); nominalValuesjLabel.setEnabled(false); nominalValuesjTextPane.setText(""); nominalValuesjScrollPane.setEnabled(false); nominalValuesjTextPane.setEnabled(false); } else { deletejButton.setEnabled(true); int column = jTable1.getSelectedColumn(); if (data.getAttributeTypeIndex(column).equalsIgnoreCase("nominal")) { nominalValuesjLabel.setEnabled(true); nominalValuesjTextPane.setEnabled(true); nominalValuesjScrollPane.setEnabled(true); leftRankjLabel.setText(""); rightRankjLabel.setText(""); nominalValuesjTextPane.setText(""); String text = ""; for (int i = 0; i < data.getRange(column).size(); i++) { text = text + data.getRangesEnum(column, i) + "\n"; nominalValuesjTextPane.setText(text); } } else { nominalValuesjLabel.setEnabled(false); nominalValuesjTextPane.setText(""); nominalValuesjScrollPane.setEnabled(false); nominalValuesjTextPane.setEnabled(false); leftRankjLabel.setText(""); rightRankjLabel.setText(""); if (data.getAttributeTypeIndex(column).equalsIgnoreCase("integer")) { leftRankjLabel.setText(data.getRangesInt(column, 0).toString()); rightRankjLabel.setText(data.getRangesInt(column, 1).toString()); } else { leftRankjLabel.setText(data.getRangesReal(column, 0).toString()); rightRankjLabel.setText(data.getRangesReal(column, 1).toString()); } } } } }); this.jTable1.setModel(this.tablaDataset); this.datajScrollPane.getViewport().remove(this.jTable1); this.datajScrollPane.getViewport().add(this.jTable1); } else { JOptionPane.showMessageDialog(this, "The file is not a KEEL data format file or it contains errors", "Error", 2); this.data = aux; return; } //Thre is not variables in the table. All have been deleted if (this.tablaDataset.getColumnCount() == 0) { this.deletejButton.setEnabled(false); this.addjButton.setEnabled(false); } } /** * <p> * Enables or disables Add Button * </p> * @param state State of Add Button */ public void setStateAddButton(boolean state) { this.addjButton.setEnabled(state); } /** * <p> * Enables or disables Delete Button * </p> * @param state Stated for Delete Button */ public void setStateDeleteButton(boolean state) { this.deletejButton.setEnabled(state); } /** * <p> * Gets the state of Add Button * </p> * @return boolean State of Add Button */ public boolean getStateAddButton() { if (this.addjButton.isEnabled() == true) { return true; } else { return false; } } /** * <p> * Gets the state of Delete Button * </p> * @return boolean State of Delete Button */ public boolean getStateDeleteButton() { if (this.deletejButton.isEnabled() == true) { return true; } else { return false; } } /** * <p> * Set the EditVariablePanel * </p> * @param editVariablePanel Panel for editing variables */ public void setEditVariablePanel(EditVariablePanel editVariablePanel) { this.editVariablePanel = editVariablePanel; } }//Class