package com.kreative.paint.tool; import java.awt.*; import java.util.*; import java.util.List; import javax.swing.*; import javax.swing.border.Border; import com.kreative.paint.ToolContext; import com.kreative.paint.ToolContextListener; import com.kreative.paint.tool.ToolOptions.*; import com.kreative.paint.tool.ui.*; import com.kreative.paint.util.SwingUtils; public class ToolOptionsUI extends JPanel implements ToolContextListener { private static final long serialVersionUID = 1L; private static final int GRID_SPACING = 8; // Grid Spacing private static final int GRID_SPACING_MINI = 4; // Grid Spacing (Mini) private static final int SECTION_SPACING = 16; // Section Spacing private static final int SECTION_SPACING_MINI = 8; // Section Spacing (Mini) private JPanel drawOptionsPanel; private JPanel cornerRadiusPanel; private JPanel quickShadowPanel; private JPanel powerBrushPanel; private JPanel powerSpraypaintPanel; private JPanel curlPanel; private JPanel regPolygonPanel; private JPanel alphabetPanel; private JPanel brushesPanel; private JPanel calligraphyPanel; private JPanel charcoalPanel; private JPanel framePanel; private JPanel rubberStampPanel; private JPanel powerShapePanel; private JPanel sprinklesPanel; private JPanel customPanel; private String customTitleString; private JLabel customTitleLabel; private JLabel noOptionsLabel; public ToolOptionsUI(ToolContext tc, boolean mini) { List<JComponent> rows = new Vector<JComponent>(); rows.add(drawOptionsPanel = makeSection(ToolUtilities.messages.getString("options.DrawOptions"), new DrawOptionsUI(tc, mini), mini)); rows.add(cornerRadiusPanel = makeSection(ToolUtilities.messages.getString("options.RoundCorners"), new CornerRadiusUI(tc, mini), mini)); rows.add(quickShadowPanel = makeSection(ToolUtilities.messages.getString("options.QuickShadow"), new QuickShadowUI(tc, mini), mini)); rows.add(powerBrushPanel = makeSection(ToolUtilities.messages.getString("options.PowerBrushes"), new PowerBrushUI(tc, mini), mini)); rows.add(powerSpraypaintPanel = makeSection(ToolUtilities.messages.getString("options.PowerSpraypaint"), new PowerSpraypaintUI(tc, mini), mini)); rows.add(curlPanel = makeSection(ToolUtilities.messages.getString("options.Curl"), new CurlUI(tc, mini), mini)); rows.add(regPolygonPanel = makeSection(ToolUtilities.messages.getString("options.RegPoly"), new RegPolygonUI(tc, mini), mini)); rows.add(alphabetPanel = makeSection(ToolUtilities.messages.getString("options.Alphabet"), new AlphabetsUI(tc, mini), mini)); rows.add(brushesPanel = makeSection(ToolUtilities.messages.getString("options.Brushes"), new BrushesUI(tc, mini), mini)); rows.add(calligraphyPanel = makeSection(ToolUtilities.messages.getString("options.Calligraphy"), new CalligraphyBrushesUI(tc, mini), mini)); rows.add(charcoalPanel = makeSection(ToolUtilities.messages.getString("options.Charcoal"), new CharcoalBrushesUI(tc, mini), mini)); rows.add(framePanel = makeSection(ToolUtilities.messages.getString("options.Frames"), new FramesUI(tc, mini), mini)); rows.add(rubberStampPanel = makeSection(ToolUtilities.messages.getString("options.Stamps"), new RubberStampsUI(tc, mini), mini)); rows.add(powerShapePanel = makeSection(ToolUtilities.messages.getString("options.PowerShapes"), new PowerShapesUI(tc, mini), mini)); rows.add(sprinklesPanel = makeSection(ToolUtilities.messages.getString("options.Sprinkles"), new SprinklesUI(tc, mini), mini)); rows.add(customPanel = makeSection(ToolUtilities.messages.getString("options.Custom"), new CustomUI(tc, mini), mini)); rows.add(noOptionsLabel = new JLabel(ToolUtilities.messages.getString("options.na"))); noOptionsLabel.setBorder(BorderFactory.createEmptyBorder(16, 16, 16, 16)); if (mini) SwingUtils.shrink(noOptionsLabel); toolChanged(tc, tc.getTool(), tc.getTool()); setLayout(new GridLayout(1,1)); add(makeSectionStack(rows, mini)); tc.addToolContextListener(this); } public void toolSettingsChanged(ToolContext src, long delta) {} public void modeChanged(ToolContext src, boolean drawMode) {} public void toolChanged(ToolContext src, Tool previousTool, Tool nextTool) { drawOptionsPanel.setVisible(nextTool instanceof DrawOptions); cornerRadiusPanel.setVisible(nextTool instanceof CornerRadius); quickShadowPanel.setVisible(nextTool instanceof QuickShadow); powerBrushPanel.setVisible(nextTool instanceof PowerBrush); powerSpraypaintPanel.setVisible(nextTool instanceof PowerSpraypaint); curlPanel.setVisible(nextTool instanceof Curl); regPolygonPanel.setVisible(nextTool instanceof RegPolygon); alphabetPanel.setVisible(nextTool instanceof Alphabets); brushesPanel.setVisible(nextTool instanceof Brushes); calligraphyPanel.setVisible(nextTool instanceof CalligraphyBrushes); charcoalPanel.setVisible(nextTool instanceof CharcoalBrushes); framePanel.setVisible(nextTool instanceof Frames); rubberStampPanel.setVisible(nextTool instanceof RubberStamps); powerShapePanel.setVisible(nextTool instanceof PowerShapes); sprinklesPanel.setVisible(nextTool instanceof Sprinkles); customPanel.setVisible(nextTool instanceof Custom); customTitleLabel.setText(customTitleString.replace("$", nextTool.getName())); noOptionsLabel.setVisible(!(nextTool instanceof ToolOptions)); invalidate(); SwingUtilities.invokeLater(new Runnable() { public void run() { pack(); } }); } public void toolDoubleClicked(ToolContext src, Tool tool) {} public void pack() { Component c = this; c.invalidate(); while (c != null) { if (c instanceof Window) { ((Window)c).pack(); break; } else if (c instanceof Frame) { ((Frame)c).pack(); break; } else if (c instanceof Dialog) { ((Dialog)c).pack(); break; } else c = c.getParent(); } } private JPanel makeSection(String label, JComponent content, boolean mini) { JPanel p = new JPanel(new BorderLayout(mini ? GRID_SPACING_MINI : GRID_SPACING, mini ? GRID_SPACING_MINI : GRID_SPACING)); JLabel l = new JLabel(label); if (mini) SwingUtils.shrink(l); if (content instanceof CustomUI) { customTitleString = label; customTitleLabel = l; } Border inner = BorderFactory.createEmptyBorder(0, 0, mini ? 2 : 4, 0); Border outer = BorderFactory.createMatteBorder(0, 0, 1, 0, Color.black); l.setBorder(BorderFactory.createCompoundBorder(outer, inner)); l.setAlignmentX(JLabel.LEFT_ALIGNMENT); l.setHorizontalAlignment(JLabel.LEFT); l.setHorizontalTextPosition(JLabel.LEFT); p.add(l, BorderLayout.NORTH); p.add(content, BorderLayout.CENTER); return p; } private JPanel makeSectionStack(Collection<JComponent> rows, boolean mini) { int s = mini ? SECTION_SPACING_MINI : SECTION_SPACING; JPanel ip = new JPanel(new BorderLayout()); for (JComponent p : rows) { p.setBorder(BorderFactory.createEmptyBorder(0, 0, s, 0)); ip.add(p, BorderLayout.CENTER); JPanel tp = new JPanel(new BorderLayout()); tp.add(ip, BorderLayout.NORTH); ip = tp; } ip.setBorder(BorderFactory.createEmptyBorder(s, s, 0, s)); return ip; } }