/*
* VectorSymbolPanel.java
*
* Created on July 6, 2006, 8:36 AM
*/
package ika.gui;
import ika.geo.VectorSymbol;
import javax.swing.JFormattedTextField.AbstractFormatterFactory;
/**
*
* @author Bernhard Jenny, Institute of Cartography, ETH Zurich.
*/
public class VectorSymbolPanel extends javax.swing.JPanel {
private VectorSymbol vs;
private boolean updating = false;
private AbstractFormatterFactory strokeWidthFormatter;
/**
* Creates new form VectorSymbolPanel
*/
public VectorSymbolPanel() {
javax.swing.text.NumberFormatter nf = new javax.swing.text.NumberFormatter();
nf.setMinimum(0f);
strokeWidthFormatter = new javax.swing.text.DefaultFormatterFactory(nf);
initComponents();
}
public void setVectorSymbol(VectorSymbol vs) {
this.vs = vs;
this.write();
}
public VectorSymbol getVectorSymbol() {
return this.vs;
}
private void enableTransparency() {
// transparency
boolean enableTransparency = vs.isFilled();
transparencyLabel.setEnabled(enableTransparency);
transparencySlider.setEnabled(enableTransparency);
transparencyField.setEnabled(enableTransparency);
}
public void write() {
if (vs == null) {
// stroke
strokeLabel.setEnabled(false);
strokeWidthField.setEnabled(false);
strokeCheckBox.setEnabled(false);
strokeColorButton.setEnabled(false);
pxLabel.setEnabled(false);
// fill
fillLabel.setEnabled(false);
fillCheckBox.setEnabled(false);
fillColorButton.setEnabled(false);
// transparency
transparencyLabel.setEnabled(false);
transparencySlider.setEnabled(false);
transparencyField.setEnabled(false);
return;
}
// stroke
strokeLabel.setEnabled(true);
strokeWidthField.setEnabled(true);
strokeCheckBox.setEnabled(true);
strokeColorButton.setEnabled(true);
pxLabel.setEnabled(true);
// fill
fillLabel.setEnabled(true);
fillCheckBox.setEnabled(true);
fillColorButton.setEnabled(true);
enableTransparency();
try {
updating = true;
// stroke
strokeWidthField.setValue(new Float(vs.getStrokeWidth()));
strokeCheckBox.setSelected(vs.isStroked());
strokeColorButton.setColor(vs.getStrokeColor());
// fill
fillCheckBox.setSelected(vs.isFilled());
java.awt.Color fillColor = vs.getFillColor();
fillColorButton.setColor(fillColor);
int alpha = 255 - fillColor.getAlpha();
transparencySlider.setValue(alpha);
transparencyField.setValue(alpha);
} finally {
updating = false;
}
}
public void read() {
if (updating) {
return;
}
if (vs == null) {
return;
}
VectorSymbol old_vs = (VectorSymbol) vs.clone();
vs.setStrokeWidth(((Number) strokeWidthField.getValue()).floatValue());
vs.setStroked(strokeCheckBox.isSelected());
vs.setStrokeColor(strokeColorButton.getColor());
// fill
vs.setFilled(fillCheckBox.isSelected());
java.awt.Color fillColor = fillColorButton.getColor();
final int alpha = 255 - transparencySlider.getValue();
fillColor = new java.awt.Color(fillColor.getRed(), fillColor.getGreen(),
fillColor.getBlue(), alpha);
vs.setFillColor(fillColor);
this.firePropertyChange("vectorsymbol", old_vs, this.vs);
}
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
java.awt.GridBagConstraints gridBagConstraints;
strokeLabel = new javax.swing.JLabel();
strokeCheckBox = new javax.swing.JCheckBox();
strokeColorButton = new ika.gui.ColorButton();
fillLabel = new javax.swing.JLabel();
fillCheckBox = new javax.swing.JCheckBox();
fillColorButton = new ika.gui.ColorButton();
transparencySlider = new javax.swing.JSlider();
transparencyLabel = new javax.swing.JLabel();
strokeWidthField = new javax.swing.JFormattedTextField();
pxLabel = new javax.swing.JLabel();
transparencyField = new javax.swing.JFormattedTextField();
setLayout(new java.awt.GridBagLayout());
strokeLabel.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
strokeLabel.setText("Stroke");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
gridBagConstraints.insets = new java.awt.Insets(0, 0, 0, 4);
add(strokeLabel, gridBagConstraints);
strokeCheckBox.setSelected(true);
strokeCheckBox.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0));
strokeCheckBox.setMargin(new java.awt.Insets(0, 0, 0, 0));
strokeCheckBox.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
strokeCheckBoxgeometryActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 0;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
add(strokeCheckBox, gridBagConstraints);
strokeColorButton.setColorChooserTitle("Stroke Color");
strokeColorButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
strokeColorButtonActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 2;
gridBagConstraints.gridy = 0;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(0, 4, 0, 4);
add(strokeColorButton, gridBagConstraints);
fillLabel.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
fillLabel.setText("Fill");
fillLabel.setVerticalAlignment(javax.swing.SwingConstants.TOP);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 2;
gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
gridBagConstraints.insets = new java.awt.Insets(0, 0, 0, 4);
add(fillLabel, gridBagConstraints);
fillCheckBox.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0));
fillCheckBox.setMargin(new java.awt.Insets(0, 0, 0, 0));
fillCheckBox.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
fillCheckBoxgeometryActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 2;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
add(fillCheckBox, gridBagConstraints);
fillColorButton.setColorChooserTitle("Fill Color");
fillColorButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
fillColorButtonActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 2;
gridBagConstraints.gridy = 2;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(0, 4, 0, 4);
add(fillColorButton, gridBagConstraints);
transparencySlider.setMaximum(255);
transparencySlider.setValue(0);
transparencySlider.setPreferredSize(new java.awt.Dimension(150, 29));
transparencySlider.addChangeListener(new javax.swing.event.ChangeListener() {
public void stateChanged(javax.swing.event.ChangeEvent evt) {
transparencySlidercolorSliderStateChanged(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 8;
gridBagConstraints.gridwidth = 4;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
add(transparencySlider, gridBagConstraints);
transparencyLabel.setText("Transparency");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 7;
gridBagConstraints.gridwidth = 4;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(6, 0, 0, 0);
add(transparencyLabel, gridBagConstraints);
strokeWidthField.setColumns(8);
strokeWidthField.setFormatterFactory(strokeWidthFormatter);
strokeWidthField.setMinimumSize(new java.awt.Dimension(70, 28));
strokeWidthField.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
public void propertyChange(java.beans.PropertyChangeEvent evt) {
strokeWidthFieldPropertyChange(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 3;
gridBagConstraints.gridy = 0;
add(strokeWidthField, gridBagConstraints);
pxLabel.setText("px");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_START;
gridBagConstraints.insets = new java.awt.Insets(0, 2, 0, 0);
add(pxLabel, gridBagConstraints);
transparencyField.setPreferredSize(new java.awt.Dimension(55, 28));
javax.swing.text.NumberFormatter nf2 = new javax.swing.text.NumberFormatter();
nf2.setMinimum(0);
nf2.setMaximum(255);
transparencyField.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(nf2));
transparencyField.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
public void propertyChange(java.beans.PropertyChangeEvent evt) {
transparencyFieldPropertyChange(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 5;
gridBagConstraints.gridy = 8;
add(transparencyField, gridBagConstraints);
}// </editor-fold>//GEN-END:initComponents
private void transparencySlidercolorSliderStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_transparencySlidercolorSliderStateChanged
if (this.updating) {
return;
}
try {
this.updating = true;
int alpha = this.transparencySlider.getValue();
this.transparencyField.setValue(alpha);
} finally {
this.updating = false;
}
if (transparencySlider.getValueIsAdjusting() == false) {
this.read();
}
}//GEN-LAST:event_transparencySlidercolorSliderStateChanged
private void fillColorButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_fillColorButtonActionPerformed
this.fillCheckBox.setSelected(true);
this.read();
enableTransparency();
}//GEN-LAST:event_fillColorButtonActionPerformed
private void fillCheckBoxgeometryActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_fillCheckBoxgeometryActionPerformed
// first read then update GUI for fill transparency
read();
enableTransparency();
}//GEN-LAST:event_fillCheckBoxgeometryActionPerformed
private void strokeColorButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_strokeColorButtonActionPerformed
try {
updating = true;
this.strokeCheckBox.setSelected(true);
} finally {
updating = false;
}
this.read();
}//GEN-LAST:event_strokeColorButtonActionPerformed
private void strokeCheckBoxgeometryActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_strokeCheckBoxgeometryActionPerformed
this.read();
}//GEN-LAST:event_strokeCheckBoxgeometryActionPerformed
private void strokeWidthFieldPropertyChange(java.beans.PropertyChangeEvent evt) {//GEN-FIRST:event_strokeWidthFieldPropertyChange
if (this.updating) {
return;
}
if ("value".equals(evt.getPropertyName()) && strokeWidthField.getValue() != null) {
read();
}
}//GEN-LAST:event_strokeWidthFieldPropertyChange
private void transparencyFieldPropertyChange(java.beans.PropertyChangeEvent evt) {//GEN-FIRST:event_transparencyFieldPropertyChange
if (this.updating) {
return;
}
if ("value".equals(evt.getPropertyName()) && transparencyField.getValue() != null) {
int alpha = ((Number) transparencyField.getValue()).intValue();
try {
updating = true;
transparencySlider.setValue(alpha);
} finally {
updating = false;
}
read();
}
}//GEN-LAST:event_transparencyFieldPropertyChange
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JCheckBox fillCheckBox;
private ika.gui.ColorButton fillColorButton;
private javax.swing.JLabel fillLabel;
private javax.swing.JLabel pxLabel;
private javax.swing.JCheckBox strokeCheckBox;
private ika.gui.ColorButton strokeColorButton;
private javax.swing.JLabel strokeLabel;
private javax.swing.JFormattedTextField strokeWidthField;
private javax.swing.JFormattedTextField transparencyField;
private javax.swing.JLabel transparencyLabel;
private javax.swing.JSlider transparencySlider;
// End of variables declaration//GEN-END:variables
}