/*
* Copyright (c) 2014 tabletoptool.com team.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Public License v3.0
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/gpl.html
*
* Contributors:
* rptools.com team - initial implementation
* tabletoptool.com team - further development
*/
package com.t3.client.swing;
import java.awt.BasicStroke;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Stroke;
import java.util.HashMap;
import java.util.Map;
import javax.swing.DefaultComboBoxModel;
import javax.swing.DefaultListCellRenderer;
import javax.swing.Icon;
import javax.swing.JComboBox;
import javax.swing.JList;
import com.t3.model.drawing.Pen;
/**
* Combo box showing the available pen widths and a preview of each.
*
* @author Jay
* @version $Revision: 5945 $ $Date: 2013-06-02 21:05:50 +0200 (Sun, 02 Jun 2013) $ $Author:&
*/
public class PenWidthChooser extends JComboBox {
/**
* The renderer for this chooser.
*/
private PenListRenderer renderer = new PenListRenderer();
/**
* Supported Pen Widths
*/
public static final int[] WIDTHS = { 1, 3, 5, 7, 11, 15, 21 };
/**
* The width that the Icon is painted.
*/
public static final int ICON_WIDTH = 25;
/**
* The maximum number of eleemnts in the list before it scrolls
*/
public static final int MAX_ROW_COUNT = 10;
/**
* Create the renderer and model for the combo box
*/
public PenWidthChooser() {
setRenderer(renderer);
DefaultComboBoxModel model = new DefaultComboBoxModel();
int selected = -1;
int defaultThickness = (int)Pen.DEFAULT.getThickness();
for (int i = 0; i < WIDTHS.length; i += 1) {
model.addElement(WIDTHS[i]);
renderer.icon.strokes.put(WIDTHS[i], new BasicStroke(WIDTHS[i], BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER));
if (WIDTHS[i] == defaultThickness)
selected = i;
} // endfor
// Set up the component
setModel(model);
setMaximumSize(getPreferredSize());
setMaximumRowCount(MAX_ROW_COUNT);
setSelectedIndex(Math.max(selected, WIDTHS[0]));
}
/**
* Renderer for the items in the combo box
*
* @author jgorrell
* @version $Revision: 5945 $ $Date: 2013-06-02 21:05:50 +0200 (Sun, 02 Jun 2013) $ $Author: azhrei_fje $
*/
private class PenListRenderer extends DefaultListCellRenderer {
/**
* Icon used to draw the line sample
*/
PenIcon icon = new PenIcon();
/**
* @see javax.swing.ListCellRenderer#getListCellRendererComponent(javax.swing.JList, java.lang.Object, int, boolean, boolean)
*/
@Override
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
// Sets the text, clears the icon
super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
// Set the icon
icon.width = (Integer)value;
setIcon(icon);
return this;
}
}
/**
* Icon for the renderer
*
* @author jgorrell
* @version $Revision: 5945 $ $Date: 2013-06-02 21:05:50 +0200 (Sun, 02 Jun 2013) $ $Author: azhrei_fje $
*/
private class PenIcon implements Icon {
/**
* Pen used in drawing.
*/
private int width = 0;
/**
* Strokes for this icon
*/
private Map<Integer, Stroke> strokes = new HashMap<Integer, Stroke>();
/**
* @see javax.swing.Icon#getIconHeight()
*/
@Override
public int getIconHeight() {
return getHeight();
}
/**
* @see javax.swing.Icon#getIconWidth()
*/
@Override
public int getIconWidth() {
return ICON_WIDTH;
}
/**
* @see javax.swing.Icon#paintIcon(java.awt.Component, java.awt.Graphics, int, int)
*/
@Override
public void paintIcon(Component c, Graphics g, int x, int y) {
// Fill the background
Graphics2D g2d = (Graphics2D)g;
g2d.setColor(c.getBackground());
g2d.fillRect(x, y, getIconWidth(), getIconHeight());
// Draw a line centered in the foreground
g2d.setColor(c.getForeground());
g2d.setStroke(strokes.get(width));
int yCentered = y + getIconHeight() / 2;
g2d.drawLine(x, yCentered, x + getIconWidth(), yCentered);
}
}
}