/* * $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.Color; import java.awt.Component; import java.awt.Container; import java.awt.GridLayout; import java.awt.LayoutManager; import java.util.ArrayList; import java.util.List; import javax.swing.BoxLayout; import javax.swing.JComponent; import javax.swing.JPanel; import VASSAL.build.BadDataReport; import VASSAL.build.Buildable; import VASSAL.build.Widget; import VASSAL.configure.VisibilityCondition; import VASSAL.tools.ErrorDialog; /** * A Widget that corresponds to a JPanel with a * GridLayout or BoxLayout layout. Adding a Widget to a * PanelWidget adds the child Widget's component to the JPanel. The * attributes of the PanelWidget determine the layout parameters */ public class PanelWidget extends Widget { private JPanel panel; private List<Widget> widgets = new ArrayList<Widget>(); private int nColumns = 3; private boolean vertical = false; private boolean fixed = false; public PanelWidget() { } public static String getConfigureTypeName() { return "Panel"; } public Component getComponent() { if (panel == null) { rebuild(); panel = new JPanel(); panel.setLayout(getLayout(panel)); for (Widget w : widgets) { final Component c = w.getComponent(); if (c instanceof JComponent) { ((JComponent) c).setAlignmentX(0.0F); ((JComponent) c).setAlignmentY(0.0F); } if (w instanceof PieceSlot) { // prevents grey rectangles when number of // pieces is not a multiple of the row length panel.setBackground(Color.WHITE); } panel.add(c); } } return panel; } private LayoutManager getLayout(Container c) { if (fixed) { return new GridLayout(0, nColumns); } else { return new BoxLayout(c, vertical ? BoxLayout.Y_AXIS : BoxLayout.X_AXIS); } } public void add(Buildable b) { if (b instanceof Widget) { final Widget w = (Widget) b; widgets.add(w); if (panel != null) { final Component c = w.getComponent(); if (c instanceof JComponent) { ((JComponent) c).setAlignmentX(0.0F); ((JComponent) c).setAlignmentY(0.0F); } panel.add(c); panel.revalidate(); } } super.add(b); } public void remove(Buildable b) { if (b instanceof Widget) { final Widget w = (Widget) b; if (panel != null) { panel.remove(w.getComponent()); } widgets.remove(w); } super.remove(b); } public static final String FIXED = "fixed"; public static final String COLS = "nColumns"; public static final String VERTICAL = "vert"; /** * The attributes of a PanelWidget are: * <code>NAME</code> for the name of the Widget * <code>FIXED</code> uses GridLayout if <code>true</code>. Otherwise uses BoxLayout * <code>COLS</code> for the number of columns. Ignored unless FIXED is true * <code>VERTICAL</code> Uses a vertical BoxLayout if <code>true</code>. otherwise uses a horizontal layout. Ignored unless FIXED is false */ public String[] getAttributeNames() { return new String[]{ NAME, FIXED, COLS, VERTICAL }; } public String[] getAttributeDescriptions() { return new String[]{ "Name: ", "Fixed cell size?", "Number of columns: ", "Vertical layout?" }; } public Class<?>[] getAttributeTypes() { return new Class<?>[]{ String.class, Boolean.class, Integer.class, Boolean.class }; } public VisibilityCondition getAttributeVisibility(String name) { if (COLS.equals(name)) { VisibilityCondition isFixed = new VisibilityCondition() { public boolean shouldBeVisible() { return fixed; } }; return isFixed; } else if (VERTICAL.equals(name)) { VisibilityCondition notFixed = new VisibilityCondition() { public boolean shouldBeVisible() { return !fixed; } }; return notFixed; } else { return super.getAttributeVisibility(name); } } public void setAttribute(String name, Object value) { if (NAME.equals(name)) { setConfigureName((String) value); } else if (FIXED.equals(name)) { if (value instanceof String) { value = Boolean.valueOf((String) value); } fixed = ((Boolean) value).booleanValue(); } else if (COLS.equals(name)) { if (value instanceof String) { value = Integer.valueOf((String) value); } nColumns = ((Integer) value).intValue(); if (nColumns < 1) { // FIXME: also dialog should not permit values < 1 to be entered ErrorDialog.dataError( new BadDataReport("Panel has < 1 column:", getConfigureName())); nColumns = 1; } } else if (VERTICAL.equals(name)) { if (value instanceof String) { value = Boolean.valueOf((String) value); } vertical = ((Boolean) value).booleanValue(); } if (panel != null) { panel.setLayout(getLayout(panel)); panel.revalidate(); } } public String getAttributeValueString(String name) { if (NAME.equals(name)) { return getConfigureName(); } else if (FIXED.equals(name)) { return String.valueOf(fixed); } else if (COLS.equals(name)) { return String.valueOf(nColumns); } else if (VERTICAL.equals(name)) { return String.valueOf(vertical); } return null; } }