/******************************************************************************* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 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 ); } } }