/*******************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Tiny Look and Feel * * (C) Copyright 2003 - 2007 Hans Bickel * * For
* licensing information and credits, please refer to the * comment in file
* de.muntjak.tinylookandfeel.TinyLookAndFeel * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*/
package de.muntjak.tinylookandfeel.controlpanel;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Event;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.JTextField;
import javax.swing.border.EtchedBorder;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
/**
* ColorizeDialog
*
* @version 1.0
* @author Hans Bickel
*/
@SuppressWarnings (
{ "all" } )
public class HSBChooser extends JDialog
{
private static HSBChooser myInstance;
private static int hue, sat, bri;
private boolean result = false;
private ControlPanel.HSBField hsbField;
private JSlider hueSlider, satSlider, briSlider;
private JTextField hueField, satField, briField;
private JCheckBox preserveGrey;
private boolean keyInput = false;
private boolean valueIsAdjusting = false;
public HSBChooser ( Frame frame )
{
super ( frame, "Hue/Saturation/Lightness", true );
setDefaultCloseOperation ( JDialog.HIDE_ON_CLOSE );
setupUI ( frame );
}
private void setupUI ( Frame frame )
{
ChangeListener sliderAction = new SliderAction ();
JPanel p1 = new JPanel ( new BorderLayout ( 12, 0 ) );
p1.setBorder ( BorderFactory.createEmptyBorder ( 4, 4, 4, 4 ) );
JPanel p2 = new JPanel ( new GridLayout ( 3, 1, 0, 8 ) );
JPanel p3 = new JPanel ( new FlowLayout ( FlowLayout.LEFT, 2, 4 ) );
JPanel p4 = new JPanel ( new BorderLayout ( 4, 0 ) );
// sliders
JPanel p5 = new JPanel ( new FlowLayout ( FlowLayout.LEFT, 0, 0 ) );
p4.add ( new JLabel ( "Hue" ), BorderLayout.NORTH );
hueSlider = new JSlider ( 0, 360, hue );
hueSlider.addChangeListener ( sliderAction );
hueSlider.setMajorTickSpacing ( 180 );
hueSlider.setPaintTicks ( true );
p4.add ( hueSlider, BorderLayout.CENTER );
hueField = new JTextField ( "" + hueSlider.getValue (), 4 );
hueField.getDocument ().addDocumentListener ( new HueInputListener () );
hueField.addKeyListener ( new ArrowKeyAction ( hueField, 0, 360 ) );
hueField.setHorizontalAlignment ( JTextField.CENTER );
p5.add ( hueField );
p4.add ( p5, BorderLayout.EAST );
p2.add ( p4 );
p5 = new JPanel ( new FlowLayout ( FlowLayout.LEFT, 0, 0 ) );
p4 = new JPanel ( new BorderLayout ( 4, 0 ) );
p4.add ( new JLabel ( "Saturation" ), BorderLayout.NORTH );
satSlider = new JSlider ( 0, 100, sat );
satSlider.addChangeListener ( sliderAction );
satSlider.setMajorTickSpacing ( 50 );
satSlider.setPaintTicks ( true );
p4.add ( satSlider, BorderLayout.CENTER );
satField = new JTextField ( "" + satSlider.getValue (), 4 );
satField.getDocument ().addDocumentListener ( new SatInputListener () );
satField.addKeyListener ( new ArrowKeyAction ( satField, 0, 100 ) );
satField.setHorizontalAlignment ( JTextField.CENTER );
p5.add ( satField );
p4.add ( p5, BorderLayout.EAST );
p2.add ( p4 );
p5 = new JPanel ( new FlowLayout ( FlowLayout.LEFT, 0, 0 ) );
p4 = new JPanel ( new BorderLayout ( 4, 0 ) );
p4.add ( new JLabel ( "Lightness" ), BorderLayout.NORTH );
briSlider = new JSlider ( -100, 100, bri );
briSlider.addChangeListener ( sliderAction );
briSlider.setMajorTickSpacing ( 100 );
briSlider.setPaintTicks ( true );
p4.add ( briSlider, BorderLayout.CENTER );
briField = new JTextField ( "" + briSlider.getValue (), 4 );
briField.getDocument ().addDocumentListener ( new BriInputListener () );
briField.addKeyListener ( new ArrowKeyAction ( briField, -100, 100 ) );
briField.setHorizontalAlignment ( JTextField.CENTER );
p5.add ( briField );
p4.add ( p5, BorderLayout.EAST );
p2.add ( p4 );
p3.add ( p2 );
p1.add ( p3, BorderLayout.CENTER );
p5 = new JPanel ( new FlowLayout ( FlowLayout.LEFT, 2, 6 ) );
preserveGrey = new JCheckBox ( "Preserve grey values", true );
preserveGrey.addActionListener ( new PreserveAction () );
p5.add ( preserveGrey );
p1.add ( p5, BorderLayout.SOUTH );
getContentPane ().add ( p1, BorderLayout.CENTER );
// buttons
p3 = new JPanel ( new FlowLayout ( FlowLayout.RIGHT, 8, 4 ) );
p3.setBorder ( new EtchedBorder () );
JButton b = new JButton ( "Cancel" );
b.addActionListener ( new CancelAction () );
p3.add ( b );
b = new JButton ( "OK" );
getRootPane ().setDefaultButton ( b );
b.addActionListener ( new OKAction () );
p3.add ( b );
getContentPane ().add ( p3, BorderLayout.SOUTH );
pack ();
Dimension size = getSize ();
setLocation ( frame.getLocationOnScreen ().x
+ ( frame.getWidth () - getSize ().width ) / 2, frame
.getLocationOnScreen ().y
+ ( frame.getHeight () - getSize ().height ) / 2 );
}
public static boolean showColorizeDialog ( Frame frame,
ControlPanel.HSBField cf )
{
if ( myInstance == null )
{
myInstance = new HSBChooser ( frame );
}
myInstance.hsbField = cf;
myInstance.result = false;
myInstance.setParams ( cf );
myInstance.setVisible ( true );
return myInstance.result;
}
public static void deleteInstance ()
{
myInstance = null;
}
public static int getHue ()
{
return hue;
}
public static int getSaturation ()
{
return sat;
}
public static int getBrightness ()
{
return bri;
}
public static boolean isPreserveGrey ()
{
return myInstance.preserveGrey.isSelected ();
}
private void setParams ( ControlPanel.HSBField cf )
{
hue = cf.getHue ();
sat = cf.getSaturation ();
bri = cf.getBrightness ();
valueIsAdjusting = true;
hueSlider.setValue ( hue );
satSlider.setValue ( sat );
briSlider.setValue ( bri );
preserveGrey.setSelected ( cf.isPreserveGrey () );
valueIsAdjusting = false;
performAction ();
}
private void performAction ()
{
if ( valueIsAdjusting )
return;
hsbField.setHue ( hue );
hsbField.setSaturation ( sat );
hsbField.setBrightness ( bri );
hsbField.setPreserveGrey ( preserveGrey.isSelected () );
ActionEvent ae = new ActionEvent ( hsbField, Event.ACTION_EVENT, "" );
hsbField.getAction ().actionPerformed ( ae );
}
class SliderAction implements ChangeListener
{
public void stateChanged ( ChangeEvent e )
{
if ( !keyInput )
{
if ( e.getSource ().equals ( hueSlider ) )
{
hue = hueSlider.getValue ();
hueField.setText ( "" + hue );
}
else if ( e.getSource ().equals ( briSlider ) )
{
bri = briSlider.getValue ();
briField.setText ( "" + bri );
}
else if ( e.getSource ().equals ( satSlider ) )
{
sat = satSlider.getValue ();
satField.setText ( "" + sat );
}
performAction ();
}
}
}
class HueInputListener implements DocumentListener
{
public void changedUpdate ( DocumentEvent e )
{
}
public void insertUpdate ( DocumentEvent e )
{
update ( e );
}
public void removeUpdate ( DocumentEvent e )
{
update ( e );
}
private void update ( DocumentEvent e )
{
Document doc = e.getDocument ();
try
{
String text = doc.getText ( 0, doc.getLength () );
try
{
int val = Integer.parseInt ( text );
keyInput = true;
hue = val;
hueSlider.setValue ( val );
keyInput = false;
performAction ();
}
catch ( NumberFormatException ignore )
{
}
}
catch ( BadLocationException ignore )
{
}
}
}
class SatInputListener implements DocumentListener
{
public void changedUpdate ( DocumentEvent e )
{
}
public void insertUpdate ( DocumentEvent e )
{
update ( e );
}
public void removeUpdate ( DocumentEvent e )
{
update ( e );
}
private void update ( DocumentEvent e )
{
Document doc = e.getDocument ();
try
{
String text = doc.getText ( 0, doc.getLength () );
try
{
int val = Integer.parseInt ( text );
keyInput = true;
sat = val;
satSlider.setValue ( val );
keyInput = false;
performAction ();
}
catch ( NumberFormatException ignore )
{
}
}
catch ( BadLocationException ignore )
{
}
}
}
class BriInputListener implements DocumentListener
{
public void changedUpdate ( DocumentEvent e )
{
}
public void insertUpdate ( DocumentEvent e )
{
update ( e );
}
public void removeUpdate ( DocumentEvent e )
{
update ( e );
}
private void update ( DocumentEvent e )
{
Document doc = e.getDocument ();
try
{
String text = doc.getText ( 0, doc.getLength () );
try
{
int val = Integer.parseInt ( text );
keyInput = true;
bri = val;
briSlider.setValue ( val );
keyInput = false;
performAction ();
}
catch ( NumberFormatException ignore )
{
}
}
catch ( BadLocationException ignore )
{
}
}
}
class ArrowKeyAction extends KeyAdapter implements ActionListener
{
private JTextField theField;
private javax.swing.Timer keyTimer;
private int step, min, max;
ArrowKeyAction ( JTextField field, int min, int max )
{
theField = field;
this.min = min;
this.max = max;
keyTimer = new javax.swing.Timer ( 20, this );
}
public void keyPressed ( KeyEvent e )
{
if ( e.getKeyCode () == 38 )
{ // up => decrease
step = 1;
if ( e.getModifiers () == KeyEvent.SHIFT_MASK )
{
step = 10;
}
changeVal ();
keyTimer.setInitialDelay ( 300 );
keyTimer.start ();
}
else if ( e.getKeyCode () == 40 )
{ // up => increase
step = -1;
if ( e.getModifiers () == KeyEvent.SHIFT_MASK )
{
step = -10;
}
changeVal ();
keyTimer.setInitialDelay ( 300 );
keyTimer.start ();
}
}
public void keyReleased ( KeyEvent e )
{
keyTimer.stop ();
}
public void actionPerformed ( ActionEvent e )
{
changeVal ();
}
private void changeVal ()
{
int val = Integer.parseInt ( theField.getText () ) + step;
if ( val > max )
val = max;
else if ( val < min )
val = min;
theField.setText ( "" + val );
}
}
class PreserveAction implements ActionListener
{
public void actionPerformed ( ActionEvent e )
{
performAction ();
}
}
class OKAction implements ActionListener
{
public void actionPerformed ( ActionEvent e )
{
result = true;
setVisible ( false );
}
}
class CancelAction implements ActionListener
{
public void actionPerformed ( ActionEvent e )
{
result = false;
setVisible ( false );
}
}
}