package amidst.gui.version; import java.awt.Color; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.util.ArrayList; import javax.swing.JPanel; import net.miginfocom.swing.MigLayout; public class VersionSelectPanel extends JPanel implements MouseListener, KeyListener { private String emptyMessage; private int emptyMessageWidth; private FontMetrics emptyMessageMetric; private Font emptyMessageFont = new Font("arial", Font.BOLD, 30); private boolean isLoading = false; private ArrayList<VersionComponent> components = new ArrayList<VersionComponent>(); private VersionComponent selected = null; private int selectedIndex = -1; public VersionSelectPanel() { setLayout(new MigLayout("ins 0", "", "[]0[]")); setEmptyMessage("Empty"); addMouseListener(this); } public void addVersion(VersionComponent version) { add(version, "growx, pushx, wrap"); components.add(version); } @Override public void paintChildren(Graphics g) { super.paintChildren(g); Graphics2D g2d = (Graphics2D)g; g2d.setColor(Color.gray); for (int i = 1; i <= components.size(); i++) { g2d.drawLine(0, i * 40, getWidth(), i * 40); } } @Override public void paintComponent(Graphics g) { super.paintComponent(g); ((Graphics2D)g).setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); if (emptyMessageMetric == null) { emptyMessageMetric = g.getFontMetrics(emptyMessageFont); emptyMessageWidth = emptyMessageMetric.stringWidth(emptyMessage); } g.setColor(Color.white); g.fillRect(0, 0, getWidth(), getHeight()); if (components.size() == 0) { g.setColor(Color.gray); g.setFont(emptyMessageFont); g.drawString(emptyMessage, (getWidth() >> 1) - (emptyMessageWidth >> 1), 30); } } public void setEmptyMessage(String message) { emptyMessage = message; if (emptyMessageMetric != null) emptyMessageWidth = emptyMessageMetric.stringWidth(emptyMessage); } public void select(String name) { for (int i = 0; i < components.size(); i++) { if (components.get(i).getVersionName().equals(name)) { select(i); break; } } } public void select(VersionComponent component) { for (int i = 0; i < components.size(); i++) { if (components.get(i) == component) { select(i); break; } } } public void select(int index) { if (selected != null) { selected.setSelected(false); selected.repaint(); } selected = null; if (index < components.size()) { selected = components.get(index); selected.setSelected(true); selected.repaint(); selectedIndex = index; } } private void loadSelectedProfile() { if ((selected == null) || !selected.isReadyToLoad()) return; isLoading = true; selected.load(); } @Override public void mouseClicked(MouseEvent arg0) { } @Override public void mouseEntered(MouseEvent arg0) { } @Override public void mouseExited(MouseEvent arg0) { } @Override public void mousePressed(MouseEvent event) { if (isLoading) return; int index = event.getPoint().y / 40; select(index); if (event.getPoint().x > getWidth() - 40) loadSelectedProfile(); } @Override public void mouseReleased(MouseEvent arg0) { } @Override public void keyPressed(KeyEvent event) { if (isLoading) return; int key = event.getKeyCode(); switch (key) { case KeyEvent.VK_DOWN: if (selectedIndex < components.size() - 1) select(selectedIndex + 1); break; case KeyEvent.VK_UP: if (selectedIndex > 0) select(selectedIndex - 1); else if (selectedIndex == -1) select(0); break; case KeyEvent.VK_ENTER: loadSelectedProfile(); break; } } @Override public void keyReleased(KeyEvent arg0) { } @Override public void keyTyped(KeyEvent event) { } }