| 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 */  | 
 | 
 | 
 | 
package javax.swing.colorchooser;  | 
 | 
 | 
 | 
import java.awt.Color;  | 
 | 
import java.awt.Graphics;  | 
 | 
import java.awt.Insets;  | 
 | 
import java.awt.event.MouseEvent;  | 
 | 
import java.awt.event.MouseListener;  | 
 | 
import java.awt.event.MouseMotionListener;  | 
 | 
import java.awt.image.BufferedImage;  | 
 | 
import javax.swing.JComponent;  | 
 | 
 | 
 | 
final class DiagramComponent extends JComponent implements MouseListener, MouseMotionListener { | 
 | 
 | 
 | 
    private final ColorPanel panel;  | 
 | 
    private final boolean diagram;  | 
 | 
 | 
 | 
    private final Insets insets = new Insets(0, 0, 0, 0);  | 
 | 
 | 
 | 
    private int width;  | 
 | 
    private int height;  | 
 | 
 | 
 | 
    private int[] array;  | 
 | 
    private BufferedImage image;  | 
 | 
 | 
 | 
    DiagramComponent(ColorPanel panel, boolean diagram) { | 
 | 
        this.panel = panel;  | 
 | 
        this.diagram = diagram;  | 
 | 
        addMouseListener(this);  | 
 | 
        addMouseMotionListener(this);  | 
 | 
    }  | 
 | 
 | 
 | 
    @Override  | 
 | 
    protected void paintComponent(Graphics g) { | 
 | 
        getInsets(this.insets);  | 
 | 
        this.width = getWidth() - this.insets.left - this.insets.right;  | 
 | 
        this.height = getHeight() - this.insets.top - this.insets.bottom;  | 
 | 
 | 
 | 
        boolean update = (this.image == null)  | 
 | 
                || (this.width != this.image.getWidth())  | 
 | 
                || (this.height != this.image.getHeight());  | 
 | 
        if (update) { | 
 | 
            int size = this.width * this.height;  | 
 | 
            if ((this.array == null) || (this.array.length < size)) { | 
 | 
                this.array = new int[size];  | 
 | 
            }  | 
 | 
            this.image = new BufferedImage(this.width, this.height, BufferedImage.TYPE_INT_RGB);  | 
 | 
        }  | 
 | 
        { | 
 | 
            float dx = 1.0f / (float) (this.width - 1);  | 
 | 
            float dy = 1.0f / (float) (this.height - 1);  | 
 | 
 | 
 | 
            int offset = 0;  | 
 | 
            float y = 0.0f;  | 
 | 
            for (int h = 0; h < this.height; h++, y += dy) { | 
 | 
                if (this.diagram) { | 
 | 
                    float x = 0.0f;  | 
 | 
                    for (int w = 0; w < this.width; w++, x += dx, offset++) { | 
 | 
                        this.array[offset] = this.panel.getColor(x, y);  | 
 | 
                    }  | 
 | 
                }  | 
 | 
                else { | 
 | 
                    int color = this.panel.getColor(y);  | 
 | 
                    for (int w = 0; w < this.width; w++, offset++) { | 
 | 
                        this.array[offset] = color;  | 
 | 
                    }  | 
 | 
                }  | 
 | 
            }  | 
 | 
        }  | 
 | 
        this.image.setRGB(0, 0, this.width, this.height, this.array, 0, this.width);  | 
 | 
        g.drawImage(this.image, this.insets.left, this.insets.top, this.width, this.height, this);  | 
 | 
        if (isEnabled()) { | 
 | 
            this.width--;  | 
 | 
            this.height--;  | 
 | 
            g.setXORMode(Color.WHITE);  | 
 | 
            g.setColor(Color.BLACK);  | 
 | 
            if (this.diagram) { | 
 | 
                int x = getValue(this.panel.getValueX(), this.insets.left, this.width);  | 
 | 
                int y = getValue(this.panel.getValueY(), this.insets.top, this.height);  | 
 | 
                g.drawLine(x - 8, y, x + 8, y);  | 
 | 
                g.drawLine(x, y - 8, x, y + 8);  | 
 | 
            }  | 
 | 
            else { | 
 | 
                int z = getValue(this.panel.getValueZ(), this.insets.top, this.height);  | 
 | 
                g.drawLine(this.insets.left, z, this.insets.left + this.width, z);  | 
 | 
            }  | 
 | 
            g.setPaintMode();  | 
 | 
        }  | 
 | 
    }  | 
 | 
 | 
 | 
    public void mousePressed(MouseEvent event) { | 
 | 
        mouseDragged(event);  | 
 | 
    }  | 
 | 
 | 
 | 
    public void mouseReleased(MouseEvent event) { | 
 | 
    }  | 
 | 
 | 
 | 
    public void mouseClicked(MouseEvent event) { | 
 | 
    }  | 
 | 
 | 
 | 
    public void mouseEntered(MouseEvent event) { | 
 | 
    }  | 
 | 
 | 
 | 
    public void mouseExited(MouseEvent event) { | 
 | 
    }  | 
 | 
 | 
 | 
    public void mouseMoved(MouseEvent event) { | 
 | 
    }  | 
 | 
 | 
 | 
    public void mouseDragged(MouseEvent event) { | 
 | 
        if (isEnabled()) { | 
 | 
            float y = getValue(event.getY(), this.insets.top, this.height);  | 
 | 
            if (this.diagram) { | 
 | 
                float x = getValue(event.getX(), this.insets.left, this.width);  | 
 | 
                this.panel.setValue(x, y);  | 
 | 
            }  | 
 | 
            else { | 
 | 
                this.panel.setValue(y);  | 
 | 
            }  | 
 | 
        }  | 
 | 
    }  | 
 | 
 | 
 | 
    private static int getValue(float value, int min, int max) { | 
 | 
        return min + (int) (value * (float) (max));  | 
 | 
    }  | 
 | 
 | 
 | 
    private static float getValue(int value, int min, int max) { | 
 | 
        if (min < value) { | 
 | 
            value -= min;  | 
 | 
            return (value < max)  | 
 | 
                    ? (float) value / (float) max  | 
 | 
                    : 1.0f;  | 
 | 
        }  | 
 | 
        return 0.0f;  | 
 | 
    }  | 
 | 
}  |