package gitj.ui.components; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import java.util.ArrayList; import java.util.List; import javax.swing.JComponent; import gitj.Language; @SuppressWarnings("serial") public class LanguageBar extends JComponent implements MouseListener, MouseMotionListener { public static final Font FONT_BOLD = new Font("Arial", Font.BOLD, 12); public static final Font FONT_NORMAL = new Font("Arial", Font.PLAIN, 12); private List<Language> languages = new ArrayList<Language>(); public LanguageBar() { super.setPreferredSize(new Dimension(50, 40)); super.addMouseListener(this); super.addMouseMotionListener(this); } public LanguageBar(List<Language> languages) { this(); this.languages = languages; } @Override public void paintComponent(Graphics g) { ((Graphics2D) g).setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); super.paintComponent(g); g.setColor(Color.white); g.fillRect(0, 0, getWidth(), getHeight()); int max = 0; for (Language l : languages) { max += l.getLineCount(); } int startText = 10; int start = 0; for (Language l : languages) { String s = l.getLanguage(); float fp = (((float) l.getLineCount() / (float) max) * 100); String percent = String.format("%.4g%n", fp) + "%"; if (fp < 0.1F) { continue; } g.setColor(Color.black); g.setFont(FONT_NORMAL); g.drawString(s, startText + 15, 5 + g.getFontMetrics().getHeight()); g.setColor(Color.gray); g.setFont(FONT_BOLD); g.drawString(percent, startText + 17 + g.getFontMetrics().stringWidth(s), 5 + g.getFontMetrics().getHeight()); if (l.isOther()) { g.setColor(Color.lightGray); } else { g.setColor(l.getColor()); } g.fillOval(startText, 10, 10, 10); startText += g.getFontMetrics().stringWidth(s) + 25; startText += g.getFontMetrics().stringWidth(percent); int todraw = (int) (((float) l.getLineCount() / (float) max) * getWidth()); g.fillRect(start, getHeight() - 10, todraw, 10); start += todraw; } } public void setLanguages(List<Language> languages) { this.languages = languages; } @Override public void mouseClicked(MouseEvent e) { } @Override public void mousePressed(MouseEvent e) { } @Override public void mouseReleased(MouseEvent e) { } @Override public void mouseEntered(MouseEvent e) { } @Override public void mouseExited(MouseEvent e) { } @Override public void mouseMoved(MouseEvent e) { } @Override public void mouseDragged(MouseEvent e) { } }