001 /* ======================================================================== 002 * JCommon : a free general purpose class library for the Java(tm) platform 003 * ======================================================================== 004 * 005 * (C) Copyright 2000-2005, by Object Refinery Limited and Contributors. 006 * 007 * Project Info: http://www.jfree.org/jcommon/index.html 008 * 009 * This library is free software; you can redistribute it and/or modify it 010 * under the terms of the GNU Lesser General Public License as published by 011 * the Free Software Foundation; either version 2.1 of the License, or 012 * (at your option) any later version. 013 * 014 * This library is distributed in the hope that it will be useful, but 015 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 016 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 017 * License for more details. 018 * 019 * You should have received a copy of the GNU Lesser General Public 020 * License along with this library; if not, write to the Free Software 021 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 022 * USA. 023 * 024 * [Java is a trademark or registered trademark of Sun Microsystems, Inc. 025 * in the United States and other countries.] 026 * 027 * ------------------- 028 * BevelArrowIcon.java 029 * ------------------- 030 * (C) Copyright 2000-2004, by Nobuo Tamemasa and Contributors. 031 * 032 * Original Author: Nobuo Tamemasa; 033 * Contributor(s): David Gilbert (for Object Refinery Limited); 034 * 035 * $Id: BevelArrowIcon.java,v 1.5 2007/11/02 17:50:36 taqua Exp $ 036 * 037 * Changes (from 26-Oct-2001) 038 * -------------------------- 039 * 26-Oct-2001 : Changed package to com.jrefinery.ui.*; 040 * 13-Oct-2002 : Fixed errors reported by Checkstyle (DG); 041 * 042 */ 043 044 package org.jfree.ui; 045 046 import java.awt.Color; 047 import java.awt.Component; 048 import java.awt.Graphics; 049 import javax.swing.Icon; 050 import javax.swing.UIManager; 051 052 /** 053 * An arrow icon that can point up or down (usually used to indicate the sort direction in a table). 054 * <P> 055 * This class (and also SortButtonRenderer) is based on original code by Nobuo Tamemasa (version 056 * 1.0, 26-Feb-1999) posted on www.codeguru.com. 057 * 058 * @author Nobuo Tamemasa 059 */ 060 public class BevelArrowIcon implements Icon { 061 062 /** Constant indicating that the arrow is pointing up. */ 063 public static final int UP = 0; 064 065 /** Constant indicating that the arrow is pointing down. */ 066 public static final int DOWN = 1; 067 068 /** The default arrow size. */ 069 private static final int DEFAULT_SIZE = 11; 070 071 /** Edge color 1. */ 072 private Color edge1; 073 074 /** Edge color 2. */ 075 private Color edge2; 076 077 /** The fill color for the arrow icon. */ 078 private Color fill; 079 080 /** The size of the icon. */ 081 private int size; 082 083 /** The direction that the arrow is pointing (UP or DOWN). */ 084 private int direction; 085 086 /** 087 * Standard constructor - builds an icon with the specified attributes. 088 * 089 * @param direction . 090 * @param isRaisedView . 091 * @param isPressedView . 092 */ 093 public BevelArrowIcon(final int direction, 094 final boolean isRaisedView, 095 final boolean isPressedView) { 096 if (isRaisedView) { 097 if (isPressedView) { 098 init(UIManager.getColor("controlLtHighlight"), 099 UIManager.getColor("controlDkShadow"), 100 UIManager.getColor("controlShadow"), 101 DEFAULT_SIZE, direction); 102 } 103 else { 104 init(UIManager.getColor("controlHighlight"), 105 UIManager.getColor("controlShadow"), 106 UIManager.getColor("control"), 107 DEFAULT_SIZE, direction); 108 } 109 } 110 else { 111 if (isPressedView) { 112 init(UIManager.getColor("controlDkShadow"), 113 UIManager.getColor("controlLtHighlight"), 114 UIManager.getColor("controlShadow"), 115 DEFAULT_SIZE, direction); 116 } 117 else { 118 init(UIManager.getColor("controlShadow"), 119 UIManager.getColor("controlHighlight"), 120 UIManager.getColor("control"), 121 DEFAULT_SIZE, direction); 122 } 123 } 124 } 125 126 /** 127 * Standard constructor - builds an icon with the specified attributes. 128 * 129 * @param edge1 the color of edge1. 130 * @param edge2 the color of edge2. 131 * @param fill the fill color. 132 * @param size the size of the arrow icon. 133 * @param direction the direction that the arrow points. 134 */ 135 public BevelArrowIcon(final Color edge1, 136 final Color edge2, 137 final Color fill, 138 final int size, 139 final int direction) { 140 init(edge1, edge2, fill, size, direction); 141 } 142 143 /** 144 * Paints the icon at the specified position. Supports the Icon interface. 145 * 146 * @param c . 147 * @param g . 148 * @param x . 149 * @param y . 150 */ 151 public void paintIcon(final Component c, 152 final Graphics g, 153 final int x, 154 final int y) { 155 switch (this.direction) { 156 case DOWN: drawDownArrow(g, x, y); break; 157 case UP: drawUpArrow(g, x, y); break; 158 } 159 } 160 161 /** 162 * Returns the width of the icon. Supports the Icon interface. 163 * 164 * @return the icon width. 165 */ 166 public int getIconWidth() { 167 return this.size; 168 } 169 170 /** 171 * Returns the height of the icon. Supports the Icon interface. 172 * @return the icon height. 173 */ 174 public int getIconHeight() { 175 return this.size; 176 } 177 178 /** 179 * Initialises the attributes of the arrow icon. 180 * 181 * @param edge1 the color of edge1. 182 * @param edge2 the color of edge2. 183 * @param fill the fill color. 184 * @param size the size of the arrow icon. 185 * @param direction the direction that the arrow points. 186 */ 187 private void init(final Color edge1, 188 final Color edge2, 189 final Color fill, 190 final int size, 191 final int direction) { 192 this.edge1 = edge1; 193 this.edge2 = edge2; 194 this.fill = fill; 195 this.size = size; 196 this.direction = direction; 197 } 198 199 /** 200 * Draws the arrow pointing down. 201 * 202 * @param g the graphics device. 203 * @param xo ?? 204 * @param yo ?? 205 */ 206 private void drawDownArrow(final Graphics g, final int xo, final int yo) { 207 g.setColor(this.edge1); 208 g.drawLine(xo, yo, xo + this.size - 1, yo); 209 g.drawLine(xo, yo + 1, xo + this.size - 3, yo + 1); 210 g.setColor(this.edge2); 211 g.drawLine(xo + this.size - 2, yo + 1, xo + this.size - 1, yo + 1); 212 int x = xo + 1; 213 int y = yo + 2; 214 int dx = this.size - 6; 215 while (y + 1 < yo + this.size) { 216 g.setColor(this.edge1); 217 g.drawLine(x, y, x + 1, y); 218 g.drawLine(x, y + 1, x + 1, y + 1); 219 if (0 < dx) { 220 g.setColor(this.fill); 221 g.drawLine(x + 2, y, x + 1 + dx, y); 222 g.drawLine(x + 2, y + 1, x + 1 + dx, y + 1); 223 } 224 g.setColor(this.edge2); 225 g.drawLine(x + dx + 2, y, x + dx + 3, y); 226 g.drawLine(x + dx + 2, y + 1, x + dx + 3, y + 1); 227 x += 1; 228 y += 2; 229 dx -= 2; 230 } 231 g.setColor(this.edge1); 232 g.drawLine( 233 xo + (this.size / 2), yo + this.size - 1, xo + (this.size / 2), yo + this.size - 1 234 ); 235 } 236 237 /** 238 * Draws the arrow pointing up. 239 * 240 * @param g the graphics device. 241 * @param xo ?? 242 * @param yo ?? 243 */ 244 private void drawUpArrow(final Graphics g, final int xo, final int yo) { 245 g.setColor(this.edge1); 246 int x = xo + (this.size / 2); 247 g.drawLine(x, yo, x, yo); 248 x--; 249 int y = yo + 1; 250 int dx = 0; 251 while (y + 3 < yo + this.size) { 252 g.setColor(this.edge1); 253 g.drawLine(x, y, x + 1, y); 254 g.drawLine(x, y + 1, x + 1, y + 1); 255 if (0 < dx) { 256 g.setColor(this.fill); 257 g.drawLine(x + 2, y, x + 1 + dx, y); 258 g.drawLine(x + 2, y + 1, x + 1 + dx, y + 1); 259 } 260 g.setColor(this.edge2); 261 g.drawLine(x + dx + 2, y, x + dx + 3, y); 262 g.drawLine(x + dx + 2, y + 1, x + dx + 3, y + 1); 263 x -= 1; 264 y += 2; 265 dx += 2; 266 } 267 g.setColor(this.edge1); 268 g.drawLine(xo, yo + this.size - 3, xo + 1, yo + this.size - 3); 269 g.setColor(this.edge2); 270 g.drawLine(xo + 2, yo + this.size - 2, xo + this.size - 1, yo + this.size - 2); 271 g.drawLine(xo, yo + this.size - 1, xo + this.size, yo + this.size - 1); 272 } 273 274 }