package modmanager.gui.views; import modmanager.business.Mod; import java.awt.Component; import java.awt.Point; import java.util.ArrayList; import javax.swing.AbstractListModel; import javax.swing.DefaultListCellRenderer; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.ListCellRenderer; import javax.swing.ListSelectionModel; import javax.swing.event.ListSelectionListener; /** * A ModsTable display with icons * @author Gcommer */ public class IconsView extends ModsTableView { private final IconsListCellRenderer cellRenderer = new IconsListCellRenderer(); public IconsView(ArrayList<Mod> _modsList) { super(_modsList); JList comp = new JList(new ModsListModel()); comp.setCellRenderer(cellRenderer); comp.setLayoutOrientation(JList.HORIZONTAL_WRAP); comp.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); comp.setVisibleRowCount(-1); setComponent(comp); } @Override public Mod getModAt(int x, int y) { return getModAt(new Point(x, y)); } @Override public Mod getModAt(Point p) { JList list = (JList) getComponent(); // JList doesn't have a fancy "rowAtPoint" like JTable, so work // through the visible items ourselves. // We could easily make this a binary search if it ever seems worth it. int lim = list.getLastVisibleIndex(); for (int i = list.getFirstVisibleIndex(); i <= lim; ++i) { try { if (list.getCellBounds(i, i).contains(p)) { return getModsList().get(i); } } catch (NullPointerException e) { } } throw new IndexOutOfBoundsException("IconsView: Mouse not over a mod."); } @Override public void applyOptions() { // TODO: Find a cleaner way of forcing icon views to properly refresh. // reapint, revalidate, invalidate, etc. all don't work. ((JList) getComponent()).setCellRenderer(new DefaultListCellRenderer()); ((JList) getComponent()).setCellRenderer(cellRenderer); } /** * Class to renderer cells in the Icons View list. * * Note, DefaultListCellRenderer actually is_a JLabel */ private class IconsListCellRenderer extends DefaultListCellRenderer { public IconsListCellRenderer() { } @Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); Mod mod = ((Mod) value); if(options.usingSmallIcons()) { setIcon(mod.getSmallIcon()); } else { setIcon(mod.getSizedIcon()); } // We display this mod in <HTML> to allow the text to wrap. setText("<HTML><CENTER>" + mod.getName() + "</CENTER></HTML>"); // Grays out the icon // TODO: Extend this for more informative icons - should probably // be abstracted to the getIcon()/getSizedIcon() method. setEnabled(mod.isEnabled()); // Allows sub classes of IconsView to add stuff here. cellRendererExtension(this, mod); /* try { BufferedImage image = ImageIO.read(new ByteArrayInputStream(ZIP.getFile(new File(m.getPath()), Mod.ICON_FILENAME))); BufferedImage image2; if (!m.isEnabled()) { ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_GRAY); ColorConvertOp op = new ColorConvertOp(cs, null); image = op.filter(image, null); image2 = ImageIO.read(getClass().getClassLoader().getResource("gui/resources/disabled.png")); } else if (model.getAppliedMods().contains(m)) { image2 = ImageIO.read(getClass().getClassLoader().getResource("gui/resources/applied.png")); } else { image2 = ImageIO.read(getClass().getClassLoader().getResource("gui/resources/enabled.png")); } BufferedImage iamgefinal = new BufferedImage(48, 48, BufferedImage.TYPE_3BYTE_BGR); Graphics2D graphics = iamgefinal.createGraphics(); graphics.drawImage(image, null, 0, 0); graphics.drawImage(image2, null, 0, 0); data.setIcon(new ImageIcon(iamgefinal)); } catch (Exception ex) { System.err.println(m.getName()); ex.printStackTrace(); data.setIcon(m.getIcon()); } */ return this; } } /** * Can be extended to allow cell renderer customizations * @param label the label to apply changes to * @param mod the mod that this cell represents */ public void cellRendererExtension(JLabel label, Mod mod) { } private class ModsListModel extends AbstractListModel { @Override protected void fireContentsChanged(Object source, int index0, int index1) { super.fireContentsChanged(source, index0, index1); } public Object getElementAt(int i) { return getModsList().get(i); } public int getSize() { return getModsList().size(); } } public void addListSelectionListener(ListSelectionListener lsl) { ((JList) getComponent()).addListSelectionListener(lsl); } @Override public Mod getSelectedMod() { return (Mod) ((JList) getComponent()).getSelectedValue(); } @Override public void setSelectedMod(Mod mod) { ((JList) getComponent()).setSelectedValue(mod, true); } @Override public boolean hasModSelected() { return !(((JList) getComponent()).getSelectionModel().isSelectionEmpty()); } public void selectNextMod() { int index = ((JList) getComponent()).getSelectedIndex(); int max = getModsList().size() - 1; if (index != -1 && index < max) { ((JList) getComponent()).setSelectedIndex(index + 1); } } public void selectPrevMod() { int index = ((JList) getComponent()).getSelectedIndex(); if (index != -1 && index > 0) { ((JList) getComponent()).setSelectedIndex(index - 1); } } }