/******************************************************************************* * Copyright (c) 2016 * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *******************************************************************************/ package jsettlers.main.swing.menu.openpanel; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Font; import java.awt.Graphics; import java.awt.Image; import java.awt.image.BufferedImage; import java.text.SimpleDateFormat; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.ListCellRenderer; import javax.swing.SwingUtilities; import javax.swing.UIManager; import jsettlers.graphics.localization.Labels; import jsettlers.logic.map.loading.MapLoader; import jsettlers.logic.map.loading.newmap.MapFileHeader; import jsettlers.main.swing.JSettlersSwingUtil; import jsettlers.main.swing.lookandfeel.ELFStyle; /** * Render to open an existing map * * @author Andreas Butti * */ public class MapListCellRenderer implements ListCellRenderer<MapLoader> { /** * Selected background color */ private final Color SELECTION_BACKGROUND = UIManager.getColor("MapListCellRenderer.backgroundSelected"); /** * Background even */ private final Color BACKGROUND1 = UIManager.getColor("MapListCellRenderer.backgroundColor1"); /** * Background odd */ private final Color BACKGROUND2 = UIManager.getColor("MapListCellRenderer.backgroundColor2"); /** * Font color */ private final Color FOREGROUND = UIManager.getColor("MapListCellRenderer.foregroundColor"); /** * Right part of the panel with all texts */ private final Box rightPanelPart = Box.createVerticalBox(); /** * Main Panel */ private final JPanel contentsPanel = new JPanel(); /** * Name of the Map */ private final JLabel mapNameLabel = new JLabel(); /** * Count of players */ private final JLabel playerCountLabel = new JLabel(); /** * ID of the Map and the creation date */ private final JLabel mapIdLabel = new JLabel(); /** * Description of the Map */ private final JLabel descriptionLabel = new JLabel(); /** * Preview of the map */ private final JLabel iconLabel = new JLabel(); /** * Empty icon, if there is no image */ private final Icon EMPTY_ICON = new Icon() { @Override public void paintIcon(Component c, Graphics g, int x, int y) { } @Override public int getIconWidth() { return 1; } @Override public int getIconHeight() { return 1; } }; /** * Format for date display */ private final SimpleDateFormat df = new SimpleDateFormat(Labels.getString("date.date-only")); /** * Cache for preview images */ private final Map<MapLoader, Icon> previewImageCache = new ConcurrentHashMap<>(); /** * Constructor */ public MapListCellRenderer() { JPanel pFirst = new JPanel(); pFirst.setOpaque(false); pFirst.setLayout(new BorderLayout(5, 0)); pFirst.add(mapNameLabel, BorderLayout.CENTER); pFirst.add(playerCountLabel, BorderLayout.EAST); pFirst.setAlignmentX(Component.LEFT_ALIGNMENT); rightPanelPart.add(pFirst); rightPanelPart.add(mapIdLabel); mapIdLabel.setAlignmentX(Component.LEFT_ALIGNMENT); rightPanelPart.add(descriptionLabel); descriptionLabel.setAlignmentX(Component.LEFT_ALIGNMENT); rightPanelPart.setOpaque(false); rightPanelPart.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); mapNameLabel.setFont(mapNameLabel.getFont().deriveFont(Font.BOLD)); mapNameLabel.setAlignmentX(Component.LEFT_ALIGNMENT); mapNameLabel.setForeground(FOREGROUND); mapIdLabel.setForeground(FOREGROUND); descriptionLabel.setForeground(FOREGROUND); playerCountLabel.setForeground(Color.BLUE); contentsPanel.setLayout(new BorderLayout()); contentsPanel.add(rightPanelPart, BorderLayout.CENTER); contentsPanel.add(iconLabel, BorderLayout.WEST); contentsPanel.putClientProperty(ELFStyle.KEY, ELFStyle.PANEL_DRAW_BG_CUSTOM); iconLabel.setOpaque(false); iconLabel.setBorder(BorderFactory.createEmptyBorder(1, 0, 1, 0)); // Update UI SwingUtilities.updateComponentTreeUI(contentsPanel); } /** * Gets the preview icon for a map * * @param value * Map * @return Image, <code>null</code> if none or error */ private Icon getPreviewIcon(MapLoader value) { Icon mapPreviewIcon = previewImageCache.get(value); if (mapPreviewIcon != null) { return mapPreviewIcon; } try { BufferedImage previewImage = JSettlersSwingUtil.createBufferedImageFrom(value); Image resizedPreviewImage = previewImage.getScaledInstance(MapFileHeader.PREVIEW_IMAGE_SIZE, MapFileHeader.PREVIEW_IMAGE_SIZE / 2, Image.SCALE_SMOOTH); mapPreviewIcon = new ImageIcon(resizedPreviewImage); previewImageCache.put(value, mapPreviewIcon); return mapPreviewIcon; } catch (Exception e) { System.err.println("Error converting preview image"); e.printStackTrace(); } return null; } @Override public Component getListCellRendererComponent(JList<? extends MapLoader> list, MapLoader value, int index, boolean isSelected, boolean cellHasFocus) { mapNameLabel.setText(value.getMapName()); String date = "???"; if (value.getCreationDate() != null) { date = df.format(value.getCreationDate()); } mapIdLabel.setText(date + " / " + value.getMapId()); playerCountLabel.setText("Player: " + value.getMinPlayers() + " - " + value.getMaxPlayers()); if (value.getDescription() != null && !value.getDescription().isEmpty()) { descriptionLabel.setText(value.getDescription()); } else { descriptionLabel.setText("<no description>"); } Icon previewIcon = getPreviewIcon(value); if (previewIcon == null) { previewIcon = EMPTY_ICON; } iconLabel.setIcon(previewIcon); if (isSelected) { contentsPanel.setBackground(SELECTION_BACKGROUND); } else { if (index % 2 == 0) { contentsPanel.setBackground(BACKGROUND1); } else { contentsPanel.setBackground(BACKGROUND2); } } return contentsPanel; } }