/*
Copyright 2008-2010 Gephi
Authors : Eduardo Ramos <eduramiba@gmail.com>
Website : http://www.gephi.org
This file is part of Gephi.
Gephi is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
Gephi 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 Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with Gephi. If not, see <http://www.gnu.org/licenses/>.
*/
package org.gephi.datalab.plugin.manipulators.general.ui;
import com.csvreader.CsvReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.ArrayList;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import net.miginfocom.swing.MigLayout;
import org.gephi.data.attributes.api.AttributeController;
import org.gephi.data.attributes.api.AttributeTable;
import org.gephi.data.attributes.api.AttributeType;
import org.gephi.datalab.plugin.manipulators.general.ui.ImportCSVUIWizardAction.Mode;
import org.openide.util.Exceptions;
import org.openide.util.Lookup;
import org.openide.util.NbBundle;
import org.openide.util.NbPreferences;
public final class ImportCSVUIVisualPanel2 extends JPanel {
private static final String ASSIGN_NEW_NODES_IDS_SAVED_PREFERENCES = "ImportCSVUIVisualPanel2_assign_new_nodes_ids";
private static final String CREATE_NEW_NODES_SAVED_PREFERENCES = "ImportCSVUIVisualPanel2_create_new_nodes";
private final ImportCSVUIWizardPanel2 wizard2;
private Character separator;
private File file;
private ImportCSVUIWizardAction.Mode mode;
private JCheckBox[] columnsCheckBoxes;
private JComboBox[] columnsComboBoxes;
private AttributeTable table;
private Charset charset;
//Nodes table settings:
private JCheckBox assignNewNodeIds;
//Edges table settings:
private JCheckBox createNewNodes;
/** Creates new form ImportCSVUIVisualPanel2 */
public ImportCSVUIVisualPanel2(ImportCSVUIWizardPanel2 wizard2) {
initComponents();
this.wizard2 = wizard2;
}
public void unSetup(){
if(assignNewNodeIds!=null){
NbPreferences.forModule(ImportCSVUIVisualPanel1.class).putBoolean(ASSIGN_NEW_NODES_IDS_SAVED_PREFERENCES, assignNewNodeIds.isSelected());
}
if(createNewNodes!=null){
NbPreferences.forModule(ImportCSVUIVisualPanel1.class).putBoolean(CREATE_NEW_NODES_SAVED_PREFERENCES, createNewNodes.isSelected());
}
}
public void reloadSettings() {
if (separator != null && file != null && file.exists() && mode != null && charset != null) {
JPanel settingsPanel = new JPanel();
settingsPanel.setLayout(new MigLayout());
loadDescription(settingsPanel);
switch (mode) {
case NODES_TABLE:
table = Lookup.getDefault().lookup(AttributeController.class).getModel().getNodeTable();
loadColumns(settingsPanel);
loadNodesTableSettings(settingsPanel);
break;
case EDGES_TABLE:
table = Lookup.getDefault().lookup(AttributeController.class).getModel().getEdgeTable();
loadColumns(settingsPanel);
loadEdgesTableSettings(settingsPanel);
break;
}
scroll.setViewportView(settingsPanel);
}
wizard2.fireChangeEvent();//Enable/disable finish button
}
private void loadDescription(JPanel settingsPanel) {
JLabel descriptionLabel = new JLabel();
switch (mode) {
case NODES_TABLE:
descriptionLabel.setText(getMessage("ImportCSVUIVisualPanel2.nodes.description"));
break;
case EDGES_TABLE:
descriptionLabel.setText(getMessage("ImportCSVUIVisualPanel2.edges.description"));
break;
}
settingsPanel.add(descriptionLabel, "wrap 15px");
}
private void loadColumns(JPanel settingsPanel) {
try {
JLabel columnsLabel = new JLabel(getMessage("ImportCSVUIVisualPanel2.columnsLabel.text"));
settingsPanel.add(columnsLabel, "wrap");
CsvReader reader = new CsvReader(new FileInputStream(file), separator, charset);
reader.setTrimWhitespace(false);
reader.readHeaders();
final String[] columns = reader.getHeaders();
reader.close();
boolean sourceFound = false, targetFound = false, typeFound=false;//Only first source and target columns found will be used as source and target nodes ids.
columnsCheckBoxes = new JCheckBox[columns.length];
columnsComboBoxes = new JComboBox[columns.length];
for (int i = 0; i < columns.length; i++) {
columnsCheckBoxes[i] = new JCheckBox(columns[i], true);
settingsPanel.add(columnsCheckBoxes[i], "wrap");
columnsComboBoxes[i] = new JComboBox();
fillComboBoxWithColumnTypes(columns[i], columnsComboBoxes[i]);
settingsPanel.add(columnsComboBoxes[i], "wrap 15px");
if (mode == ImportCSVUIWizardAction.Mode.EDGES_TABLE && columns[i].equalsIgnoreCase("source") && !sourceFound) {
sourceFound = true;
//Do not allow to not select source column:
columnsCheckBoxes[i].setEnabled(false);
columnsComboBoxes[i].setEnabled(false);
}
if (mode == ImportCSVUIWizardAction.Mode.EDGES_TABLE && columns[i].equalsIgnoreCase("target") && !targetFound) {
targetFound = true;
//Do not allow to not select target column:
columnsCheckBoxes[i].setEnabled(false);
columnsComboBoxes[i].setEnabled(false);
}
if (mode == ImportCSVUIWizardAction.Mode.EDGES_TABLE && columns[i].equalsIgnoreCase("type") && !typeFound) {
typeFound = true;
//Do not allow to change type column type:
columnsComboBoxes[i].setEnabled(false);
}
}
} catch (IOException ex) {
Exceptions.printStackTrace(ex);
}
}
private void fillComboBoxWithColumnTypes(String column, JComboBox comboBox) {
comboBox.removeAllItems();
for (AttributeType type : AttributeType.values()) {
comboBox.addItem(type);
}
if (table.hasColumn(column)) {
//Set type of the already existing column in the table and disable the edition:
comboBox.setSelectedItem(table.getColumn(column).getType());
comboBox.setEnabled(false);
} else {
comboBox.setSelectedItem(AttributeType.STRING);//Set STRING by default
}
}
private void loadNodesTableSettings(JPanel settingsPanel) {
//Create assignNewNodeIds checkbox and set its selection with saved preferences or true by default:
assignNewNodeIds = new JCheckBox(getMessage("ImportCSVUIVisualPanel2.nodes.assign-ids-checkbox"),
NbPreferences.forModule(ImportCSVUIVisualPanel1.class).getBoolean(ASSIGN_NEW_NODES_IDS_SAVED_PREFERENCES, true));
settingsPanel.add(assignNewNodeIds, "wrap");
}
private void loadEdgesTableSettings(JPanel settingsPanel) {
//Create createNewNodes checkbox and set its selection with saved preferences or true by default:
createNewNodes = new JCheckBox(getMessage("ImportCSVUIVisualPanel2.edges.create-new-nodes-checkbox"),
NbPreferences.forModule(ImportCSVUIVisualPanel1.class).getBoolean(CREATE_NEW_NODES_SAVED_PREFERENCES, true));
settingsPanel.add(createNewNodes, "wrap");
}
public boolean isValidCSV() {
return true;
}
public String[] getColumnsToImport() {
ArrayList<String> columns = new ArrayList<String>();
for (JCheckBox columnCheckBox : columnsCheckBoxes) {
if (columnCheckBox.isSelected()) {
columns.add(columnCheckBox.getText());
}
}
return columns.toArray(new String[0]);
}
public AttributeType[] getColumnsToImportTypes() {
ArrayList<AttributeType> types = new ArrayList<AttributeType>();
for (int i = 0; i < columnsCheckBoxes.length; i++) {
if (columnsCheckBoxes[i].isSelected()) {
types.add((AttributeType) columnsComboBoxes[i].getSelectedItem());
}
}
return types.toArray(new AttributeType[0]);
}
public boolean getAssignNewNodeIds() {
return assignNewNodeIds != null ? assignNewNodeIds.isSelected() : false;
}
public boolean getCreateNewNodes() {
return createNewNodes != null ? createNewNodes.isSelected() : false;
}
@Override
public String getName() {
return NbBundle.getMessage(ImportCSVUIVisualPanel2.class, "ImportCSVUIVisualPanel2.name");
}
public File getFile() {
return file;
}
public void setFile(File file) {
this.file = file;
}
public Mode getMode() {
return mode;
}
public void setMode(Mode mode) {
this.mode = mode;
}
public Character getSeparator() {
return separator;
}
public void setSeparator(Character separator) {
this.separator = separator;
}
public Charset getCharset() {
return charset;
}
void setCharset(Charset charset) {
this.charset = charset;
}
private String getMessage(String resName) {
return NbBundle.getMessage(ImportCSVUIVisualPanel2.class, resName);
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
scroll = new javax.swing.JScrollPane();
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(scroll, javax.swing.GroupLayout.DEFAULT_SIZE, 290, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(scroll, javax.swing.GroupLayout.DEFAULT_SIZE, 320, Short.MAX_VALUE)
);
}// </editor-fold>//GEN-END:initComponents
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JScrollPane scroll;
// End of variables declaration//GEN-END:variables
}