001    /*
002    * @(#)ColorPickerSliderUI.java  1.0  2008-03-01
003    *
004    * Copyright (c) 2008 Jeremy Wood
005    * E-mail: mickleness@gmail.com
006    * All rights reserved.
007    *
008    * The copyright of this software is owned by Jeremy Wood.
009    * You may not use, copy or modify this software, except in
010    * accordance with the license agreement you entered into with
011    * Jeremy Wood. For details see accompanying license terms.
012    */
013    
014    package com.colorpicker.swing;
015    
016    import java.awt.event.*;
017    import com.colorpicker.awt.*;
018    
019    import javax.swing.event.MouseInputAdapter;
020    import javax.swing.plaf.basic.*;
021    import javax.swing.*;
022    
023    import java.awt.*;
024    import java.awt.image.*;
025    
026    /** This is a non-public SliderUI designed specifically for the
027     * <code>ColorPicker</code>.
028     * 
029     * @version 1.1
030     * @author Jeremy Wood
031     */
032    class ColorPickerSliderUI extends BasicSliderUI {
033            ColorPicker colorPicker;
034            
035            /** Half of the height of the arrow */
036            int ARROW_HALF = 8;
037            
038            int[] intArray = new int[ Toolkit.getDefaultToolkit().getScreenSize().height ];
039            BufferedImage bi = new BufferedImage(1,intArray.length,BufferedImage.TYPE_INT_RGB);
040            int lastMode = -1;
041    
042        ColorPickerSliderUI(JSlider b,ColorPicker cp) {
043                    super(b);
044    
045                    colorPicker = cp;
046                    cp.getColorPanel().addComponentListener(new ComponentAdapter() {
047                            public void componentResized(ComponentEvent e) {
048                                    ColorPickerSliderUI.this.calculateGeometry();
049                                    slider.repaint();
050                            }
051                    });
052            }
053    
054            public void paintThumb(Graphics g) {
055                    int y = thumbRect.y+thumbRect.height/2;
056                    Polygon polygon = new Polygon();
057                    polygon.addPoint(0,y-ARROW_HALF);
058                    polygon.addPoint(ARROW_HALF,y);
059                    polygon.addPoint(0,y+ARROW_HALF);
060                    
061                    Graphics2D g2 = (Graphics2D)g;
062                    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
063                    g2.setColor(Color.black);
064                    g2.fill(polygon);
065                    g2.setColor(Color.white);
066                    g2.draw(polygon);
067            }
068    
069            protected void calculateThumbSize() {
070                    super.calculateThumbSize();
071                    thumbRect.height+=4;
072                    thumbRect.y-=2;
073            }
074    
075            protected void calculateTrackRect() {
076                    super.calculateTrackRect();
077    
078                    ColorPickerPanel cp = colorPicker.getColorPanel();
079                    int size = Math.min(ColorPickerPanel.MAX_SIZE, Math.min(cp.getWidth(), cp.getHeight()));
080                    int max = slider.getHeight()-ARROW_HALF*2-2;
081                    if(size>max) {
082                            size = max;
083                    }
084                    trackRect.y = slider.getHeight()/2-size/2;
085                    trackRect.height = size;
086            }
087    
088            public synchronized void paintTrack(Graphics g) {
089                    int mode = colorPicker.getMode();
090                    if(mode==ColorPicker.HUE || mode==ColorPicker.BRI || mode==ColorPicker.SAT) {
091                            float[] hsb = colorPicker.getHSB();
092                            if(mode==ColorPicker.HUE) {
093                                    for(int y = 0; y<trackRect.height; y++) {
094                                            float hue = ((float)y)/((float)trackRect.height);
095                                            intArray[y] = Color.HSBtoRGB( hue, 1, 1);
096                                    }
097                            } else if(mode==ColorPicker.SAT) {
098                                    for(int y = 0; y<trackRect.height; y++) {
099                                            float sat = 1-((float)y)/((float)trackRect.height);
100                                            intArray[y] = Color.HSBtoRGB( hsb[0], sat, hsb[2]);
101                                    }
102                            } else {
103                                    for(int y = 0; y<trackRect.height; y++) {
104                                            float bri = 1-((float)y)/((float)trackRect.height);
105                                            intArray[y] = Color.HSBtoRGB( hsb[0], hsb[1], bri);
106                                    }
107                            }
108                    } else {
109                            int[] rgb = colorPicker.getRGB();
110                            if(mode==ColorPicker.RED) {
111                                    for(int y = 0; y<trackRect.height; y++) {
112                                            int red = 255-(int)(y*255/trackRect.height+.49);
113                                            intArray[y] = (red << 16)+(rgb[1] << 8)+(rgb[2]);
114                                    }
115                            } else if(mode==ColorPicker.GREEN) {
116                                    for(int y = 0; y<trackRect.height; y++) {
117                                            int green = 255-(int)(y*255/trackRect.height+.49);
118                                            intArray[y] = (rgb[0] << 16)+(green << 8)+(rgb[2]);
119                                    }
120                            } else if(mode==ColorPicker.BLUE) {
121                                    for(int y = 0; y<trackRect.height; y++) {
122                                            int blue = 255-(int)(y*255/trackRect.height+.49);
123                                            intArray[y] = (rgb[0] << 16)+(rgb[1] << 8)+(blue);
124                                    }
125                            }
126                    }
127    
128                    Graphics2D g2 = (Graphics2D)g;
129                    Rectangle r = new Rectangle(6, trackRect.y, 14, trackRect.height);
130                    if(slider.hasFocus()) {
131                            PaintUtils.paintFocus(g2,r,3);
132                    }
133                    
134                    bi.getRaster().setDataElements(0,0,1,trackRect.height,intArray);
135                    TexturePaint p = new TexturePaint(bi,new Rectangle(0,trackRect.y,1,bi.getHeight()));
136                    g2.setPaint(p);
137                    g2.fillRect(r.x,r.y,r.width,r.height);
138                    
139                    PaintUtils.drawBevel(g2, r);
140                    
141            }
142            
143            public void paintFocus(Graphics g) {}
144    
145            /** This overrides the default behavior for this slider
146             * and sets the thumb to where the user clicked.
147             * From a design standpoint, users probably don't want to
148             * scroll through several colors to get where they clicked:
149             * they simply want the color they selected.
150             */
151            MouseInputAdapter myMouseListener = new MouseInputAdapter() {
152                    public void mousePressed(MouseEvent e) {
153                            slider.setValueIsAdjusting(true);
154                            updateSliderValue(e);
155                    }
156                    private void updateSliderValue(MouseEvent e) {
157                            int v;
158                            if(slider.getOrientation()==JSlider.HORIZONTAL) {
159                                    int x = e.getX();
160                                    v = valueForXPosition(x);
161                            } else {
162                                    int y = e.getY();
163                                    v = valueForYPosition(y);
164                            }
165                            slider.setValue(v);
166                    }
167                    public void mouseReleased(MouseEvent e) {
168                            updateSliderValue(e);
169                            slider.setValueIsAdjusting(false);
170                    }
171                    public void mouseDragged(MouseEvent e) {
172                            updateSliderValue(e);
173                    }
174            };
175    
176            protected void installListeners(JSlider slider) {           
177                    super.installListeners(slider);
178                    slider.removeMouseListener(trackListener);
179                    slider.removeMouseMotionListener(trackListener);
180                    slider.addMouseListener(myMouseListener);
181                    slider.addMouseMotionListener(myMouseListener);
182                    slider.setOpaque(false);
183            }
184    
185            protected void uninstallListeners(JSlider slider) {
186                    super.uninstallListeners(slider);
187                    slider.removeMouseListener(myMouseListener);
188                    slider.removeMouseMotionListener(myMouseListener);
189            }
190    
191            
192    }