package bd.amazed.docscissors.view; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Image; import java.util.Iterator; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.ListCellRenderer; import bd.amazed.docscissors.model.PageGroup; public class PageGroupRenderer extends JComponent implements ListCellRenderer<PageGroup> { private PageGroup currentGroup; private float pdfWidth = 100; private float pdfHeight = 100; private int padding = 1; private boolean isSelected; private static Color selectedBg = new Color(0x00D0FF); public PageGroupRenderer() { if (getFont() == null) { setFont(new JLabel().getFont()); } } public void setPageSize(float pdfWidth, float pdfHeight) { this.pdfWidth = pdfWidth; this.pdfHeight = pdfHeight; } public Component getListCellRendererComponent(JList<? extends PageGroup> list, PageGroup value, int index, boolean isSelected, boolean cellHasFocus) { if (value instanceof PageGroup) { PageGroup pageGroup = (PageGroup) value; currentGroup = pageGroup; } this.isSelected = isSelected; return this; } protected void paintComponent(Graphics g) { super.paintComponent(g); if (isSelected) { g.setColor(selectedBg); g.fillRect(0, 0, getWidth(), getHeight()); } int offsetFromEdge = padding * 2; int boxWidth = getWidth() - offsetFromEdge * 2; int boxHeight = getHeight() - offsetFromEdge * 2 - getFontMetrics(getFont()).getHeight(); g.setColor(Color.white); g.fillRect(offsetFromEdge, offsetFromEdge, boxWidth , boxHeight); g.setColor(Color.black); g.drawRect(offsetFromEdge, offsetFromEdge, boxWidth, boxHeight); //shadow g.drawLine(offsetFromEdge + 1, offsetFromEdge + boxHeight + 1, offsetFromEdge + boxWidth + 1, offsetFromEdge + boxHeight + 1); g.drawLine(offsetFromEdge + boxWidth + 1, offsetFromEdge + 1, offsetFromEdge + boxWidth + 1, offsetFromEdge + boxHeight + 1); if (currentGroup.getStackImage() != null) { g.drawImage(currentGroup.getStackImage().getScaledInstance(boxWidth, boxHeight, Image.SCALE_FAST), offsetFromEdge, offsetFromEdge, this); } Iterator<Rect> iter = currentGroup.getRects().iterator(); g.translate(offsetFromEdge, offsetFromEdge); while (iter.hasNext()) { (iter.next()).draw(g, (getWidth() - offsetFromEdge * 2)/ pdfWidth, Rect.STROKE_SOLID, false); } g.translate(-offsetFromEdge, -offsetFromEdge); String text = currentGroup.toString(); int textWidth = g.getFontMetrics().stringWidth(text); int textHeight = g.getFontMetrics().getHeight(); g.setColor(Color.black); g.drawString(text, (getWidth() - textWidth)/2, getHeight() - textHeight + 2); } @Override public Dimension getPreferredSize() { int prefWidth = 100; prefWidth = Math.max(prefWidth, (int)(pdfWidth / 10)); padding = Math.max(1, prefWidth / 20); int prefHeight = (int)((prefWidth * pdfHeight) / pdfWidth); return new Dimension(prefWidth + padding * 4, prefHeight + padding * 4 + getFontMetrics(getFont()).getHeight()); } }