package preSimulationWindow;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.HashSet;
import javax.swing.BoxLayout;
import javax.swing.DefaultCellEditor;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.JTextField;
@SuppressWarnings("serial")
public class FoodManagementDialog extends JDialog {
private ArrayList<String> speciesList;
private JComboBox speciesChoice;
private ViewModel viewModel;
private SpeciesTableModel tableModel;
private JTable foodTable;
private ImageIcon addIcon; // icone pour ajouter des especes
private ImageIcon removeIcon; // icone pour enlever des especes
private ImageIcon infoIcon; // icone pour afficher les caracteristiques de
// l'espece
private JButton okButton;
public FoodManagementDialog(ArrayList<String> sList, ViewModel model,
ArrayList<String> foodList, PropertyChangeListener pcl) {
this.setSize(300, 300);
this.setModal(true);
this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
this.addPropertyChangeListener(pcl);
speciesList = sList;
viewModel = model;
this.setLayout(new BoxLayout(this.getContentPane(), BoxLayout.PAGE_AXIS));
addIcon = new ImageIcon(getClass().getResource("/add.png"));
removeIcon = new ImageIcon(getClass().getResource("/remove.png"));
infoIcon = new ImageIcon(getClass().getResource("/info.png"));
tableModel = new SpeciesTableModel();
foodTable = new JTable(tableModel);
speciesChoice = new JComboBox(speciesList.toArray());
okButton = new JButton("OK");
/** Gestion du tableau **/
foodTable.setShowGrid(true);
foodTable.setFillsViewportHeight(true);
foodTable.getColumnModel().getColumn(0)
.setCellEditor(new DefaultCellEditor(speciesChoice));
foodTable.getColumnModel().getColumn(1)
.setCellEditor(new DefaultCellEditor(new JTextField()));
foodTable.getColumnModel().getColumn(2)
.setCellRenderer(new ButtonRenderer(addIcon));
foodTable.getColumnModel().getColumn(2)
.setCellEditor(new ButtonEditor(addIcon, new ActionListener() {
// Ajout d'une ligne
@Override
public void actionPerformed(ActionEvent e) {
int idx = foodTable.getEditingRow();
addRow(idx);
}
}));
foodTable.getColumnModel().getColumn(2).setMaxWidth(30);
foodTable.getColumnModel().getColumn(3)
.setCellRenderer(new ButtonRenderer(removeIcon));
foodTable
.getColumnModel()
.getColumn(3)
.setCellEditor(
new ButtonEditor(removeIcon, new ActionListener() {
// Suppression d'une lignes
@Override
public void actionPerformed(ActionEvent e) {
int idx = foodTable.getEditingRow();
/**
* Il faut arreter d'editer la ligne pour
* pouvoir supprimer le bouton
**/
/**
* Car en fait je demande au bouton de supprimer
* la ligne sur laquelle il se trouve
**/
/**
* Donc si je supprime la derniere ligne, ca va
* buguer car Swing va vouloir repeindre la
* derniere ligne
**/
/**
* A cause de l'editeur, mais y'a plus rien sauf
* le bouton (etat instable....)
**/
foodTable.editingCanceled(null);
removeRow(idx);
}
}));
foodTable.getColumnModel().getColumn(3).setMaxWidth(30);
foodTable.getColumnModel().getColumn(4)
.setCellRenderer(new ButtonRenderer(infoIcon));
foodTable.getColumnModel().getColumn(4)
.setCellEditor(new ButtonEditor(infoIcon, new ActionListener() {
// Ouverture de l'onglet d'informations
@Override
public void actionPerformed(ActionEvent e) {
int row = foodTable.getEditingRow();
String species = getSpecies(row);
showInfos(species);
}
}));
foodTable.getColumnModel().getColumn(4).setMaxWidth(30);
foodTable.setRowHeight(30);
foodTable.removeColumn(foodTable.getColumnModel().getColumn(1));
/** Recuperation des valeurs existantes concernant la nourriture **/
if (foodList != null) {
// On recupere le type de l'espece
for (String f : foodList) {
String key = viewModel.getName(f);
tableModel.addRow(0);
tableModel.setValueAt(key, 0, 0);
}
}
/** Action apres avoir clique sur 'OK' **/
okButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
sendEdibleFoodList();
dispose();
}
});
/** Ajout dans la fenetre **/
this.add(foodTable);
this.add(okButton, BorderLayout.PAGE_END);
this.setVisible(true);
}
protected void sendEdibleFoodList() {
HashSet<String> edibleFoodList = new HashSet<String>();
for (int i = 0; i < tableModel.getRowCount(); i++) {
if (!(getSpecies(i).isEmpty())) {
String species = getSpecies(i);
String type = viewModel.getType(species);
edibleFoodList.add(type);
}
}
firePropertyChange("foodList", null,
edibleFoodList.toArray(new String[edibleFoodList.size()]));
}
private void addRow(int idx) {
tableModel.addRow(idx);
/**
* le fireTableRowsInserted continue a selectionner les lignes ajoutees,
* d'ou le clearSelection() necessaire
**/
foodTable.clearSelection();
}
private void removeRow(int idx) {
tableModel.removeRow(idx);
}
private void showInfos(String species) {
if (!species.isEmpty()) {
String description = viewModel.getRestServer()
.getSpeciesDescription(species);
JOptionPane.showMessageDialog(null, description,
"Informations sur l'espèce " + species,
JOptionPane.INFORMATION_MESSAGE);
} else {
JOptionPane.showMessageDialog(null, "No species selected !",
"Warning", JOptionPane.WARNING_MESSAGE);
}
}
/** Recupere le nom de l'espece comme ecrit dans la table **/
protected String getSpecies(int row) {
return foodTable.getValueAt(row, 0).toString();
}
}