/* * $Id$ * * Copyright (c) 2005 by Rodney Kinney, Brent Easton * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License (LGPL) as published by the Free Software Foundation. * * This library 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, copies are available * at http://www.opensource.org. */ package VASSAL.build.module.gamepieceimage; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.Window; import java.util.ArrayList; import java.util.List; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.ListSelectionModel; import javax.swing.SwingUtilities; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.table.AbstractTableModel; import VASSAL.configure.Configurer; import VASSAL.configure.StringArrayConfigurer; import VASSAL.tools.ScrollPane; /** * Controls for configuring an individual ItemInstance */ public class InstanceConfigurer extends Configurer { protected GamePieceImage defn; protected Box visBox; protected Visualizer visualizer = new Visualizer(); protected JPanel panel; //protected TextPanel itemPanel; protected SymbolPanel symbolPanel; protected InstanceConfigurer me; protected InstanceConfigurer() { super(null, null); me = this; } protected InstanceConfigurer(String key, String name, GamePieceImage defn) { super(key, name); this.defn = defn; setValue(defn.getInstances()); me = this; } public String getValueString() { return PropertiesToString(getValueList()); } @SuppressWarnings("unchecked") public List<ItemInstance> getValueList() { return (List<ItemInstance>) getValue(); } /** @deprecated Use {@link #getValueList()} instead. */ @SuppressWarnings("unchecked") @Deprecated public ArrayList<ItemInstance> getValueArrayList() { return (ArrayList<ItemInstance>) getValue(); } public void setValue(String s) { setValue(StringToProperties(s, defn)); if (symbolPanel != null) { symbolPanel.reset(); } } public Component getControls() { if (panel == null) { panel = new JPanel(); panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); Box filler = Box.createHorizontalBox(); filler.setPreferredSize(new Dimension(50, 10)); panel.add(filler); visBox = Box.createHorizontalBox(); visBox.setAlignmentX(Box.CENTER_ALIGNMENT); visualizer = new Visualizer(defn); visBox.add(new ScrollPane(visualizer)); panel.add(visBox); filler = Box.createHorizontalBox(); filler.setPreferredSize(new Dimension(50, 10)); panel.add(filler); symbolPanel = new SymbolPanel(); panel.add(symbolPanel); } return panel; } public static String PropertiesToString(List<ItemInstance> props) { String[] p = new String[props.size()]; int i = 0; for (ItemInstance prop : props) { p[i++] = prop.encode(); } return StringArrayConfigurer.arrayToString(p); } public static List<ItemInstance> StringToProperties(String s, GamePieceImage defn) { ArrayList<ItemInstance> props = new ArrayList<ItemInstance>(); String[] p = StringArrayConfigurer.stringToArray(s); for (int i = 0; i < p.length; i++) { if (p[i].startsWith(SymbolItem.TYPE)) { props.add(new SymbolItemInstance(p[i], defn)); } else if (p[i].startsWith(TextBoxItem.TYPE)) { props.add(new TextBoxItemInstance(p[i], defn)); } else if (p[i].startsWith(TextItem.TYPE)) { props.add(new TextItemInstance(p[i], defn)); } else if (p[i].startsWith(ShapeItem.TYPE)) { props.add(new ShapeItemInstance(p[i], defn)); } else if (p[i].startsWith(ImageItem.TYPE)) { props.add(new ImageItemInstance(p[i], defn)); } } return props; } public void refresh() { if (symbolPanel != null) { symbolPanel.refresh(); } visualizer.rebuild(); } protected class SymbolPanel extends JPanel { private static final long serialVersionUID = 1L; protected JTable table; protected AbstractTableModel model; protected JScrollPane scrollPane; protected JButton addSymbolBtn, addTextBtn, remBtn; protected JPanel mainPanel; protected JPanel detailPanel; protected Component detailControls; protected int currentDetail; protected static final int NO_CURRENT_ITEM = -1; protected static final int NAME_COL = 0; protected static final int TYPE_COL = 1; protected static final int LOC_COL = 2; protected static final int MAX_COL = 2; public SymbolPanel() { setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); mainPanel = new JPanel(); mainPanel.setBorder(BorderFactory.createLineBorder(Color.black)); mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS)); Box box = Box.createHorizontalBox(); box.add(new JLabel("Items")); mainPanel.add(box); model = new SymbolTableModel(); table = new JTable(model); table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); if (getValueList() != null && getValueList().size() > 0) { table.getSelectionModel().setSelectionInterval(0, 0); } ListSelectionModel rowSM = table.getSelectionModel(); rowSM.addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { if (e.getValueIsAdjusting()) return; ListSelectionModel lsm = (ListSelectionModel) e.getSource(); if (lsm.isSelectionEmpty()) { showItem(NO_CURRENT_ITEM); } else { int selectedRow = lsm.getMinSelectionIndex(); showItem(selectedRow); } } }); scrollPane = new ScrollPane(table); table.setPreferredScrollableViewportSize(new Dimension(300, 100)); mainPanel.add(scrollPane); detailPanel = new JPanel(); mainPanel.add(new ScrollPane(detailPanel)); add(mainPanel); showItem(0); } protected void showItem(int itemNo) { if (detailControls != null) { detailPanel.remove(detailControls); detailControls = null; currentDetail = NO_CURRENT_ITEM; } int count = getValueList().size(); if (itemNo != NO_CURRENT_ITEM && count > 0 && itemNo < count) { final ItemInstance instance = getValueList().get(itemNo); instance.setConfig(me); final Configurer c = instance.getConfigurer(); detailControls = c.getControls(); detailPanel.add(detailControls); currentDetail = itemNo; } reshow(); } public void reset() { showItem(currentDetail); } public void reshow() { repack(); detailPanel.repaint(); } public void refresh() { showItem(currentDetail); reshow(); } protected void repack() { Window w = SwingUtilities.getWindowAncestor(panel); if (w != null) { w.pack(); } } class SymbolTableModel extends AbstractTableModel { private static final long serialVersionUID = 1L; private String[] columnNames = new String[] { "Name", "Type", "Position" }; public int getColumnCount() { return columnNames.length; } public int getRowCount() { return getValueList() == null ? 0 : getValueList().size(); } public String getColumnName(int col) { return columnNames[col]; } public Object getValueAt(int row, int col) { if (col == NAME_COL) { return getValueList().get(row).getName(); } else if (col == TYPE_COL) { return getValueList().get(row).getItem().getDisplayName(); } else if (col == LOC_COL) { return getValueList().get(row).getLocation(); } else return null; } public Class<String> getColumnClass(int col) { return String.class; } public boolean isCellEditable(int row, int col) { return false; } public void setValueAt(Object value, int row, int col) { // fireTableCellUpdated(row, col); // visualizer.rebuild(); } } } public void rebuildViz() { if (visualizer != null) { visualizer.rebuild(); } } public void repack() { if (panel != null) { Window w = SwingUtilities.getWindowAncestor(panel); if (w != null) { w.pack(); } } rebuildViz(); } }