/* * $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.awt.event.ActionEvent; import java.awt.event.ActionListener; 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.IntConfigurer; import VASSAL.configure.StringConfigurer; import VASSAL.tools.ScrollPane; public class LayoutConfigurer extends Configurer { protected static final String ADD_SYMBOL = "Symbol"; protected static final String ADD_IMAGE = "Image"; protected static final String ADD_TEXT = "Label"; protected static final String ADD_TEXTBOX = "Text Box"; protected static final String ADD_SHAPE = "Shape"; protected static final String REMOVE = "Remove"; protected static final String UP = "Up"; protected static final String DOWN = "Down"; protected static final int NO_CURRENT_ITEM = -1; protected JPanel panel; protected ItemPanel itemPanel; protected JPanel itemConfigPanel; protected Component currentItemControls; protected int currentItem = NO_CURRENT_ITEM; protected Box visBox; protected Visualizer visualizer = new Visualizer(); protected JLabel visLabel; protected Box filler; protected GamePieceLayout layout; protected StringConfigurer defName; protected NewIntConfigurer height, width; protected LayoutConfigurer() { super(null, null); } protected LayoutConfigurer(String key, String name, GamePieceLayout def) { super(key, name); layout = def; } public Object getValue() { if (layout != null) { layout.setConfigureName(defName.getValueString()); layout.setHeight(((Integer) height.getValue()).intValue()); layout.setWidth(((Integer) width.getValue()).intValue()); } return layout; } public void setValue(String s) { if (itemPanel != null) { itemPanel.reshow(); } } public Component getControls() { if (panel == null) { panel = new JPanel(); panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); filler = Box.createHorizontalBox(); filler.setPreferredSize(new Dimension(50, 10)); panel.add(filler); visBox = Box.createHorizontalBox(); visBox.setAlignmentX(Box.CENTER_ALIGNMENT); visualizer = new Visualizer(layout); visBox.add(new ScrollPane(visualizer)); panel.add(visBox); filler = Box.createHorizontalBox(); filler.setPreferredSize(new Dimension(50, 10)); panel.add(filler); itemPanel = new ItemPanel(); panel.add(itemPanel); filler = Box.createHorizontalBox(); filler.setPreferredSize(new Dimension(50, 10)); panel.add(filler); Window w = SwingUtilities.getWindowAncestor(itemPanel); if (w != null) { w.pack(); } } return panel; } public String getValueString() { return null; } protected void repack() { Window w = SwingUtilities.getWindowAncestor(panel); if (w != null) { w.pack(); } if (visualizer != null) { visualizer.rebuild(); } } protected class ItemPanel extends JPanel implements ActionListener { private static final long serialVersionUID = 1L; protected JTable table; protected AbstractTableModel model; protected JScrollPane scrollPane; protected JButton addSymbolBtn, addTextBtn, addTextBoxBtn, addImageBtn, addShapeBtn, remBtn, upBtn, dnBtn; protected JPanel mainPanel; public ItemPanel() { 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 MyTableModel(); table = new JTable(model); table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); if (layout.getItemCount() > 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); box = Box.createHorizontalBox(); addSymbolBtn = new JButton(ADD_SYMBOL); addSymbolBtn.setToolTipText("Add a Symbol to the Layout"); addSymbolBtn.addActionListener(this); box.add(addSymbolBtn); addTextBtn = new JButton(ADD_TEXT); addTextBtn.setToolTipText("Add Text to the Layout"); addTextBtn.addActionListener(this); box.add(addTextBtn); addTextBoxBtn = new JButton(ADD_TEXTBOX); addTextBoxBtn.setToolTipText("Add Text Box to the Layout"); addTextBoxBtn.addActionListener(this); box.add(addTextBoxBtn); addImageBtn = new JButton(ADD_IMAGE); addImageBtn.setToolTipText("Add an Image to the Layout"); addImageBtn.addActionListener(this); box.add(addImageBtn); addShapeBtn = new JButton(ADD_SHAPE); addShapeBtn.setToolTipText("Add a Colored Shape to the Layout"); addShapeBtn.addActionListener(this); box.add(addShapeBtn); mainPanel.add(box); box = Box.createHorizontalBox(); remBtn = new JButton(REMOVE); remBtn.setToolTipText("Remove the selected Item"); remBtn.addActionListener(this); box.add(remBtn); upBtn = new JButton(UP); upBtn.setToolTipText("Move the selected Item up the list (draw earlier)"); upBtn.addActionListener(this); box.add(upBtn); dnBtn = new JButton(DOWN); dnBtn.setToolTipText("Move the selected Item down the list (draw later)"); dnBtn.addActionListener(this); box.add(dnBtn); mainPanel.add(box); add(mainPanel); box = Box.createHorizontalBox(); box.setPreferredSize(new Dimension(50, 10)); add(box); itemConfigPanel = new JPanel(); itemConfigPanel.setBorder(BorderFactory.createLineBorder(Color.black)); add(new ScrollPane(itemConfigPanel)); showItem(0); } public void actionPerformed(ActionEvent e) { String action = e.getActionCommand(); int pos = layout.getItemCount(); int sel = table.getSelectedRow(); if (action.equals(ADD_SYMBOL)) { addItem(new SymbolItem(layout, "Symbol"+pos)); //$NON-NLS-1$ } else if (action.equals(ADD_TEXT)) { TextItem item = new TextItem(layout, "Text"+pos); //$NON-NLS-1$ addItem(item); } else if (action.equals(ADD_TEXTBOX)) { TextBoxItem item = new TextBoxItem(layout, "TextBox"+pos); //$NON-NLS-1$ addItem(item); } else if (action.equals(ADD_IMAGE)) { addItem(new ImageItem(layout, "Image"+pos)); //$NON-NLS-1$ } else if (action.equals(ADD_SHAPE)) { addItem(new ShapeItem(layout, "Shape"+pos)); //$NON-NLS-1$ } else if (action.equals(REMOVE)) { if (sel >= 0) { layout.removeItem(sel); model.fireTableRowsDeleted(sel, sel); } if (layout.getItemCount() > 1) { if (sel >= layout.getItemCount()) { table.getSelectionModel().setSelectionInterval(layout.getItemCount() - 1, layout.getItemCount() - 1); } else { table.getSelectionModel().setSelectionInterval(sel, sel); } } } else if (action.equals(UP)) { if (sel > 0) { moveItem(sel, sel-1); } } else if (action.equals(DOWN)) { if (sel < pos-1) { moveItem(sel, sel+1); } } rebuildViz(); } protected void addItem(Item item) { layout.addItem(item); int pos = layout.getItemCount() - 1; model.fireTableRowsInserted(pos, pos); table.getSelectionModel().setSelectionInterval(pos, pos); } protected void moveItem(int from, int to) { layout.moveItem(from, to); model.fireTableRowsUpdated(from, to); table.getSelectionModel().setSelectionInterval(to, to); rebuildViz(); } protected void rebuildViz() { layout.setImageDefn(new GamePieceImage(layout)); visualizer.rebuild(); } protected void showItem(int itemNo) { if (currentItemControls != null) { itemConfigPanel.remove(currentItemControls); currentItemControls = null; currentItem = NO_CURRENT_ITEM; } if (itemNo != NO_CURRENT_ITEM && layout.getItemCount() > 0 && itemNo < layout.getItemCount()) { Item item = layout.getItem(itemNo); Configurer c = item.getConfigurer(); currentItemControls = c.getControls(); itemConfigPanel.add(currentItemControls); currentItem = itemNo; } reshow(); } public void reshow() { repack(); rebuildViz(); itemConfigPanel.repaint(); } class MyTableModel 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 layout.getItemCount(); } public String getColumnName(int col) { return columnNames[col]; } public Object getValueAt(int row, int col) { if (col == 0) { return (layout.getItem(row)).getConfigureName(); } else if (col == 1) { return (layout.getItem(row)).getDisplayName(); } else if (col == 2) { return (layout.getItem(row)).getLocation(); } else return null; } public Class<String> getColumnClass(int c) { return String.class; } } } protected class NewIntConfigurer extends IntConfigurer { NewIntConfigurer(String name, String key, Integer i) { super(name, key, i); } public void setColumns(int cols) { nameField.setColumns(cols); } public int getIntValue() { return ((Integer) getValue()).intValue(); } } }