package rescuecore2.misc.gui; import java.awt.BorderLayout; import javax.swing.JPanel; import javax.swing.JTable; import javax.swing.JList; import javax.swing.JScrollPane; import javax.swing.BorderFactory; import javax.swing.AbstractListModel; import javax.swing.table.AbstractTableModel; import javax.swing.event.ListSelectionListener; import javax.swing.event.ListSelectionEvent; import rescuecore2.worldmodel.EntityID; import rescuecore2.worldmodel.Property; import rescuecore2.worldmodel.ChangeSet; import java.util.List; import java.util.ArrayList; import java.util.Set; import java.util.HashSet; /** A JPanel for displaying ChangeSet objects. */ public class ChangeSetComponent extends JPanel { private PropertyTableModel propertiesModel; private EntityListModel changedModel; private EntityListModel deletedModel; private ChangeSet changes; /** Construct an empty ChangeSetComponent. */ public ChangeSetComponent() { super(new BorderLayout()); propertiesModel = new PropertyTableModel(); changedModel = new EntityListModel(); deletedModel = new EntityListModel(); JTable propsTable = new JTable(propertiesModel); final JList changedList = new JList(changedModel); JList deletedList = new JList(deletedModel); JScrollPane scroll = new JScrollPane(propsTable); scroll.setBorder(BorderFactory.createTitledBorder("Properties")); add(scroll, BorderLayout.EAST); scroll = new JScrollPane(changedList); scroll.setBorder(BorderFactory.createTitledBorder("Changed entities")); add(scroll, BorderLayout.CENTER); scroll = new JScrollPane(deletedList); scroll.setBorder(BorderFactory.createTitledBorder("Deleted entities")); add(scroll, BorderLayout.WEST); changedList.addListSelectionListener(new ListSelectionListener() { @Override public void valueChanged(ListSelectionEvent e) { EntityID id = (EntityID)changedList.getSelectedValue(); if (id != null) { Set<Property> changedProperties = changes.getChangedProperties(id); propertiesModel.show(changedProperties); } } }); } /** Display a ChangeSet. @param newChanges The ChangeSet to show. */ public void show(ChangeSet newChanges) { changes = newChanges; propertiesModel.show(new HashSet<Property>()); changedModel.show(changes.getChangedEntities()); deletedModel.show(changes.getDeletedEntities()); } private static class EntityListModel extends AbstractListModel { private List<EntityID> ids; public EntityListModel() { ids = new ArrayList<EntityID>(); } public void show(Set<EntityID> newIDs) { ids.clear(); ids.addAll(newIDs); } public int getSize() { return ids.size(); } public Object getElementAt(int index) { return ids.get(index); } } private static class PropertyTableModel extends AbstractTableModel { private List<Property> properties; public PropertyTableModel() { properties = new ArrayList<Property>(); } public void show(Set<Property> p) { properties.clear(); properties.addAll(p); } public int getRowCount() { return properties.size(); } public int getColumnCount() { return 2; } public Object getValueAt(int row, int col) { if (row < 0 || row >= properties.size()) { throw new IllegalArgumentException("Illegal row: " + row); } Property p = properties.get(row); switch (col) { case 0: return p.getURN(); case 1: return p.isDefined() ? "undefined" : p.getValue().toString(); default: throw new IllegalArgumentException("Illegal column: " + col); } } public String getColumnName(int col) { switch (col) { case 0: return "URN"; case 1: return "Value"; default: throw new IllegalArgumentException("Illegal column: " + col); } } } }