/**
*
*/
package wpw.helper.components;
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSeparator;
import javax.swing.JSpinner;
import javax.swing.SpinnerNumberModel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import wpw.general.Constants;
/**
* @author Ronald Hennig
* @date Jun 30, 2011
* @version 1.0
*
*/
public class BorderDialog extends JDialog implements ActionListener
{
public static final int BORDER_MIN_WIDTH = 0;
public static final int BORDER_MAX_WIDTH = 10;
public static final int BORDER_STEPS = 1;
// Format is: style width color => solid 1px #C1C1C1
private String cssBorder;
private JSpinner borderWidth;
private JComboBox borderStyle;
private ColorButton borderColor;
private JButton btnOk;
private JButton btnCancel;
private BorderPreview preview;
private boolean saveClicked = false;
/**
* Standard constructor
* @param initialBorder Initial border settings
*/
public BorderDialog(final String initialBorder)
{
cssBorder = initialBorder;
initializeComponents();
layoutComponents();
}
private void layoutComponents()
{
JLabel lblBorderWidth = new JLabel("Border width:");
JLabel lblBorderStyle = new JLabel("Border style:");
JLabel lblBorderColor = new JLabel("Border color:");
JLabel lblBorderPreview = new JLabel("Border preview:");
JPanel pnlBorderSettings = new JPanel(new GridLayout(3, 2, 8, 5));
pnlBorderSettings.add(lblBorderWidth);
pnlBorderSettings.add(borderWidth);
pnlBorderSettings.add(lblBorderStyle);
pnlBorderSettings.add(borderStyle);
pnlBorderSettings.add(lblBorderColor);
pnlBorderSettings.add(borderColor);
JPanel pnlPreview = new JPanel(new GridLayout(2,2,8,5));
pnlPreview.add(lblBorderPreview);
pnlPreview.add(preview);
pnlPreview.add(btnOk);
pnlPreview.add(btnCancel);
setLayout(new BorderLayout());
add(pnlBorderSettings, BorderLayout.NORTH);
add(new JSeparator(), BorderLayout.CENTER);
add(pnlPreview, BorderLayout.SOUTH);
setTitle("Border settings");
setModalityType(ModalityType.APPLICATION_MODAL);
setResizable(false);
setLocationRelativeTo(null);
pack();
}
private void initializeComponents()
{
borderColor = new ColorButton(extractBorderColor());
borderColor.addPropertyChangeListener("background", new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt)
{
preview.setColor(getBorderColor().getOrigColor());
preview.repaint();
}
});
borderWidth = new JSpinner(new SpinnerNumberModel(extractBorderWidth(), BORDER_MIN_WIDTH, BORDER_MAX_WIDTH, BORDER_STEPS));
borderWidth.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e)
{
preview.setWidth(new Float((Integer)getBorderWidth().getValue()));
preview.repaint();
}
});
// borderStyle = new JComboBox(Constants.S_LINESTYLES);
borderStyle = new JComboBox(new String[] {"none","dotted","dashed","solid","double","groove","ridge","inset","outset"});
// borderStyle = new JComboBox(new DefaultComboBoxModel(Constants.S_LINESTYLES));
borderStyle.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e)
{
if (e.getStateChange() == ItemEvent.SELECTED)
{
preview.setStyle(getBorderStyle().getSelectedItem().toString());
preview.repaint();
}
}
});
preview = new BorderPreview(getBorderColor().getOrigColor(), getBorderStyle().getSelectedItem().toString(), new Float((Integer)getBorderWidth().getValue()));
btnOk = new JButton("Save settings");
btnOk.addActionListener(this);
btnCancel = new JButton("Cancel");
btnCancel.addActionListener(this);
borderStyle.setSelectedItem(extractBorderStyle());
}
/**
* @return the borderWidth
*/
public final JSpinner getBorderWidth() {
return borderWidth;
}
/**
* @return the preview
*/
public final BorderPreview getPreview() {
return preview;
}
/**
* @return the borderStyle
*/
public final JComboBox getBorderStyle() {
return borderStyle;
}
/**
* @return the borderColor
*/
public final ColorButton getBorderColor() {
return borderColor;
}
/**
* @return the cssBorder
*/
public String getCSSBorder() {
return cssBorder;
}
/**
* Extract the border color from the css border format
* @return border color
*/
private String extractBorderColor()
{
String borderColor = cssBorder.substring(cssBorder.indexOf("#"));
return borderColor;
}
/**
* Extract the border width from the css border format
* @return border width
*/
private int extractBorderWidth()
{
String borderWidth = cssBorder.substring(cssBorder.indexOf(" ")+1, cssBorder.indexOf("px"));
return Integer.parseInt(borderWidth);
}
/**
* Extract the border style from the css border format
* @return border style
*/
private String extractBorderStyle()
{
String borderStyle = cssBorder.substring(0, cssBorder.indexOf(" "));
return borderStyle;
}
@Override
public void actionPerformed(ActionEvent evt)
{
// save settings
if (evt.getSource().equals(btnOk))
{
String bStyle = borderStyle.getSelectedItem().toString();
String bWidth = Integer.toString((Integer)borderWidth.getValue());
String bColor = borderColor.getColor();
cssBorder = bStyle+" "+bWidth+"px "+bColor;
saveClicked = true;
}
this.setVisible(false);
}
/**
* Make the FontDialog visible and return the css border if user clicked the save button
* @return css font or null
*/
public String showDialog()
{
setVisible(true);
if (saveClicked)
{
saveClicked = false;
return cssBorder;
}
return null;
}
}