package com.explodingpixels.macwidgets; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.Point; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import javax.swing.BorderFactory; import javax.swing.ImageIcon; import javax.swing.JPanel; /** * This editor panel emulates iTunes Star rating editor functionality * @author Paul Connolly paulcconnolly gmail */ public class RatingStarEditorPanel extends JPanel implements MouseListener, MouseMotionListener { public RatingStarEditorPanel() { setBorder(BorderFactory.createLineBorder(Color.BLACK, 1)); repaint(); } private int lastX = Integer.MIN_VALUE; private int lastY = Integer.MIN_VALUE; private int xoffset = 5; //these offsets are there for display purposes, to position the stars correctly private int yoffset = 2; public void mouseClicked(MouseEvent e) { processCoordinates(e); repaint(); } /** * keep track of the last mouse position. * * @param e */ private void recordCoordinates(MouseEvent e) { lastX = e.getX(); lastY = e.getY(); } /** * Before recording coordinates, we have to make sure that they fall in the right range. * * @param e * @return */ private boolean validateCoordinates(MouseEvent e) { Point location = getLocation(); Dimension size = getSize(); if (e.getX() < location.getX() || e.getX() > location.getX() + size.getWidth()) { return false; } if (e.getY() < location.getY() || e.getY() > location.getY() + size.getHeight()) { return false; } return true; } public void mousePressed(MouseEvent e) { processCoordinates(e); repaint(); } private void processCoordinates(MouseEvent e) { if (e != null) { if (validateCoordinates(e)) { recordCoordinates(e); } } } public void mouseReleased(MouseEvent e) { processCoordinates(e); repaint(); } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } /** * Calculate the level between 0-5. This correlates to the star rating system. * * @return */ public int getLevel() { if (lastX == Integer.MIN_VALUE || lastY == Integer.MIN_VALUE) { return 0; } int min = (int) getLocation().getX(); int max = min + (int) getSize().getWidth(); //essentially, calculate a percentile for what section of this component the mouse //is positioned within. return (int) Math.ceil(((double) (lastX - min) / (max - min)) * 5); } @Override protected void paintComponent(Graphics g) { Graphics2D g2 = ((Graphics2D) g); Image star = new ImageIcon(ITunesRatingTableCellRenderer.class.getResource( "/com/explodingpixels/macwidgets/images/itunes_star_unselected.png")).getImage(); int level = getLevel(); g2.clearRect(0, 0, getWidth(), getHeight()); for (int i = 0; i < level; i++) { g2.drawImage(star, (i * star.getWidth(null)) + xoffset, yoffset, null, null); } } public void mouseDragged(MouseEvent e) { processCoordinates(e); repaint(); } public void mouseMoved(MouseEvent e) { //To change body of implemented methods use File | Settings | File Templates. } }