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 }