/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 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.util.*; import java.awt.*; import java.awt.image.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; import javax.swing.border.*; import javax.swing.text.*; import de.muntjak.tinylookandfeel.controlpanel.*; /** * ColorizeDialog * * @version 1.0 * @author Hans Bickel */ 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); } } }