/*
* $Id$
*
* Copyright (c) 2000-2003 by Rodney Kinney
*
* 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.widget;
import java.awt.CardLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.util.HashMap;
import java.util.Map;
import javax.swing.BoxLayout;
import javax.swing.DefaultListModel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JSplitPane;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import VASSAL.build.Buildable;
import VASSAL.build.Configurable;
import VASSAL.build.Widget;
import VASSAL.tools.ScrollPane;
/**
* A Widget that corresponds to a panel with a {@link JList} sitting
* to the right of a {@link JPanel} with a {@link CardLayout} layout.
* Adding a Widget to a ListWidget adds the child Widget's component to
* the JPanel and add's the child's name (via {@link
* Configurable#getConfigureName}) to the JList. Changing the
* selection of the JList shows the corresponding child's
* component */
public class ListWidget extends Widget
implements ListSelectionListener {
private JPanel panel;
private JSplitPane split;
private JList list;
private DefaultListModel widgets = new DefaultListModel();
private CardLayout layout;
private JPanel multiPanel;
private int width, height, divider;
private static final String DIVIDER="divider";
private Map<Object,String> keys = new HashMap<Object,String>();
private int count = 0;
public ListWidget() {
}
public static String getConfigureTypeName() {
return "Scrollable List";
}
public Component getComponent() {
if (panel == null) {
rebuild();
panel = new JPanel();
split = new JSplitPane();
split.setResizeWeight(1.0);
list = new JList(widgets);
layout = new CardLayout();
multiPanel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));
multiPanel.setLayout(layout);
for (Buildable b : getBuildables()) {
Widget w = (Widget) b;
multiPanel.add(getKey(w), w.getComponent());
}
list.setModel(widgets);
list.addListSelectionListener(this);
list.setCellRenderer(new Widget.MyCellRenderer());
list.setFixedCellWidth(80);
list.setVisibleRowCount(3);
split.setLeftComponent(multiPanel);
split.setRightComponent(new ScrollPane(list));
if (width > 0 && height > 0) {
split.setPreferredSize(new Dimension(width,height));
}
if (divider > 0){
split.setDividerLocation(divider);
}
}
return split;
}
public void add(Buildable b) {
if (b instanceof Widget) {
Widget w = (Widget) b;
widgets.addElement(w);
if (panel != null) {
multiPanel.add(getKey(w), w.getComponent());
list.revalidate();
}
}
super.add(b);
}
public void remove(Buildable b) {
if (b instanceof Widget) {
widgets.removeElement(b);
}
super.remove(b);
}
private String getKey(Object o) {
String s = keys.get(o);
if (s == null) {
s = String.valueOf(count++);
keys.put(o, s);
}
return s;
}
public void valueChanged(ListSelectionEvent e) {
Object selected = list.getSelectedValue();
if (selected != null) {
layout.show(multiPanel, getKey(selected));
}
}
public String[] getAttributeNames() {
return new String[] {NAME,WIDTH,HEIGHT,DIVIDER};
}
public String[] getAttributeDescriptions() {
return new String[]{"Name: "};
}
public Class<?>[] getAttributeTypes() {
return new Class<?>[]{String.class};
}
public void setAttribute(String name, Object value) {
if (NAME.equals(name)) {
setConfigureName((String) value);
}
else if (WIDTH.equals(name)) {
width = Integer.parseInt((String)value);
}
else if (HEIGHT.equals(name)) {
height = Integer.parseInt((String)value);
}
else if (DIVIDER.equals(name)) {
divider = Integer.parseInt((String)value);
}
}
public String getAttributeValueString(String name) {
if (NAME.equals(name)) {
return getConfigureName();
}
else if (WIDTH.equals(name)) {
return String.valueOf(split == null ? width : split.getWidth());
}
else if (HEIGHT.equals(name)) {
return String.valueOf(split == null ? height : split.getHeight());
}
else if (DIVIDER.equals(name)) {
return String.valueOf(split == null ? divider : split.getDividerLocation());
}
return null;
}
}