/**
* eAdventure (formerly <e-Adventure> and <e-Game>) is a research project of the
* <e-UCM> research group.
*
* Copyright 2005-2010 <e-UCM> research group.
*
* You can access a list of all the contributors to eAdventure at:
* http://e-adventure.e-ucm.es/contributors
*
* <e-UCM> is a research group of the Department of Software Engineering
* and Artificial Intelligence at the Complutense University of Madrid
* (School of Computer Science).
*
* C Profesor Jose Garcia Santesmases sn,
* 28040 Madrid (Madrid), Spain.
*
* For more info please visit: <http://e-adventure.e-ucm.es> or
* <http://www.e-ucm.es>
*
* ****************************************************************************
*
* This file is part of eAdventure, version 2.0
*
* eAdventure is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* eAdventure 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 Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with eAdventure. If not, see <http://www.gnu.org/licenses/>.
*/
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package es.eucm.ead.editor.view.components;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.util.Collection;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumnModel;
import org.jdesktop.swingx.JXTable;
import es.eucm.ead.editor.model.ModelEvent;
import es.eucm.ead.editor.model.ModelEventUtils;
import es.eucm.ead.editor.model.nodes.EditorNode;
import es.eucm.ead.editor.model.nodes.asset.AssetNode;
/**
* A panel that can be collapsed or expanded by clicking on a button.
*
* @author mfreire
*/
public class PropertiesTablePanel extends NodeBrowserPanel {
private JXTable table;
private SimpleTableModel tableModel;
public PropertiesTablePanel() {
tableModel = new SimpleTableModel();
table = new JXTable(tableModel);
table.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
table.getSelectionModel().addListSelectionListener(
new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
// update "last-selected"
for (int row : table.getSelectedRows()) {
int r = table.convertRowIndexToModel(row);
EditorNode node = nodes.get(r);
if (!selected.contains(node)) {
lastSelected = node;
break;
}
}
// update selection-list itself
selected.clear();
for (int row : table.getSelectedRows()) {
int r = table.convertRowIndexToModel(row);
selected.add(nodes.get(r));
}
firePropertyChange(selectedPropertyName, null,
lastSelected);
}
});
table.setColumnControlVisible(true);
table.setSortable(true);
table.setDefaultRenderer(BufferedImage.class, new ImageCellRenderer());
table.setAutoResizeMode(JXTable.AUTO_RESIZE_ALL_COLUMNS);
table.setRowHeight(32);
table.setColumnMargin(5);
table.setDragEnabled(true);
table.setTransferHandler(new NodeTransferHandler());
TableColumnModel tcm = table.getColumnModel();
tcm.getColumn(0).setMaxWidth(50);
tcm.getColumn(2).setMaxWidth(80);
tcm.getColumn(3).setMaxWidth(50);
tcm.getColumn(4).setMaxWidth(50);
add(new JScrollPane(table), BorderLayout.CENTER);
}
@Override
public void modelChanged(ModelEvent event) {
for (int i = 0; i < tableModel.getRowCount(); i++) {
EditorNode node = nodes.get(i);
if (ModelEventUtils.changes(event, node)) {
tableModel.fireTableRowsUpdated(i, i);
}
}
}
private static class ImageCellRenderer implements TableCellRenderer {
private ThumbnailPanel tp = new ThumbnailPanel();
@Override
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus, int row,
int column) {
tp.background = isSelected ? table.getSelectionBackground() : table
.getBackground();
tp.image = (BufferedImage) value;
return tp;
}
}
private static class ThumbnailPanel extends JPanel {
private BufferedImage image;
private Color background;
@Override
public void paint(Graphics g) {
g.setColor(background);
int h = getHeight();
int w = getWidth();
g.fillRect(0, 0, w, h);
g.drawImage(image, (w - 32) / 2, (h - 32) / 2, 32, 32, this);
}
}
private class SimpleTableModel extends AbstractTableModel {
@Override
public int getRowCount() {
return nodes.size();
}
@Override
public int getColumnCount() {
return 5;
}
@Override
public String getColumnName(int columnIndex) {
switch (columnIndex) {
case 0:
return "Thumb";
case 1:
return "Name";
case 2:
return "Size";
case 3:
return "Used in";
case 4:
return "Uses";
default:
throw new IllegalArgumentException();
}
}
@Override
public Class<?> getColumnClass(int columnIndex) {
switch (columnIndex) {
case 0:
return BufferedImage.class;
case 1:
return String.class;
case 2:
return Integer.class;
case 3:
return Integer.class;
case 4:
return Integer.class;
default:
throw new IllegalArgumentException();
}
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return false;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
EditorNode node = nodes.get(rowIndex);
switch (columnIndex) {
case 0:
return node.getThumbnail();
case 1:
return node.getLinkText();
case 2: {
return (node instanceof AssetNode) ? ((AssetNode) node)
.getAssetSize() : 0;
}
case 3: {
return controller.getModel().incomingDependencies(node).size();
}
case 4: {
return controller.getModel().outgoingDependencies(node).size();
}
default:
throw new IllegalArgumentException();
}
}
@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
throw new UnsupportedOperationException("Not supported yet.");
}
}
@Override
public void setNodes(Collection<EditorNode> nodes) {
this.nodes.clear();
this.nodes.addAll(nodes);
selected.clear();
tableModel.fireTableDataChanged();
}
@Override
public void addNode(EditorNode node) {
nodes.add(node);
tableModel.fireTableDataChanged();
}
}