package org.limewire.ui.swing.dock; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Component; import java.awt.Font; import java.awt.FontMetrics; import java.awt.GradientPaint; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.geom.RoundRectangle2D; import org.limewire.lifecycle.Asynchronous; import org.limewire.lifecycle.Service; /** * A Mac OS X Dock Icon for LimeWire. Overlays the download * completion count on the LimeWire icon in the dock. */ class DockIconMacOSXImpl implements DockIcon { /** * The max number we can display (depends on the FONT!). */ private static final int MAX_NUMBER = 999999; /** * The minimum width and height of the badge. */ private static final int MIN_WnH = 42; /** * Gradient FROM Color. */ private final Color FROM = new Color(0xE0, 0x00, 0x00); /** * Gradient TO Color. */ private final Color TO = new Color(0xC0, 0x00, 0x00); /** * The Font that is used to draw the numbers. */ private final Font FONT = new Font("Lucida Grande", Font.BOLD, 24); /** * The number of complete Downloads. */ private int complete = 0; void register(org.limewire.lifecycle.ServiceRegistry registry) { registry.register(new Service() { public void start() {} @Asynchronous (daemon = false) public void stop() { Dock.restoreDockTileImage(); } public void initialize() {} public String getServiceName() { return "Dock cleanup"; } }).in("UIHack"); } /* * (non-Javadoc) * @see javax.swing.Icon#getIconWidth() */ public int getIconWidth() { return Dock.ICON_WIDTH; } /* * (non-Javadoc) * @see javax.swing.Icon#getIconHeight() */ public int getIconHeight() { return Dock.ICON_HEIGHT; } /** * Draws the LimeWire Dock Icon. Only draws if the count * has changed since the last draw. * * @param complete The number of complete Downloads */ public void draw(int complete) { synchronized (Dock.getDockLock()) { if (complete != this.complete) { this.complete = complete; Dock.restoreDockTileImage(); if (complete > 0) Dock.setDockTileOverlayImage(this); } } } /* * (non-Javadoc) * @see javax.swing.Icon#paintIcon(java.awt.Component, java.awt.Graphics, int, int) */ public void paintIcon(Component c, Graphics g, int x, int y) { String value = Integer.toString(Math.min(complete, MAX_NUMBER)); Graphics2D g2 = (Graphics2D)g; g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2.setFont(FONT); FontMetrics fm = g2.getFontMetrics(); int valueWidth = fm.stringWidth(value); int width = MIN_WnH; if (value.length() > 2) { width = Math.max(valueWidth + 16, width); } RoundRectangle2D.Float ellipse = new RoundRectangle2D.Float( x+Dock.ICON_WIDTH-width-5, y+Dock.ICON_HEIGHT-55, width, MIN_WnH, MIN_WnH, MIN_WnH); g2.setStroke(new BasicStroke(1.5f)); g2.setPaint(new GradientPaint(0, 0, FROM, ellipse.width, ellipse.height, TO)); g2.fill(ellipse); g2.setPaint(Color.black); g2.draw(ellipse); g2.setPaint(Color.white); g2.drawString(value, ellipse.x + (ellipse.width - valueWidth)/2, ellipse.y + fm.getHeight()); } }