package ruscz.game.gameOfProd.LevelEditor; import javax.imageio.ImageIO; import javax.swing.*; import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.LinkedList; public class TilesetOverview extends JFrame { private JLayeredPane view; private JLayeredPane tilesetPanel; private JScrollPane scrollPane; private JLabel info; private int offset = 0; private int tilesetOffset = 0; private LinkedList activeTilesets; private LinkedList imagesOfTiles; public TilesetOverview() { final File folder = new File("src/main/resources/tilesets/"); view = new JLayeredPane(); tilesetPanel = new JLayeredPane(); scrollPane = new JScrollPane(tilesetPanel); listFilesForFolder(folder); } public void listFilesForFolder(File folder) { activeTilesets = new LinkedList<>(); for (final File fileEntry : folder.listFiles()) { loadTileset(fileEntry.getName()); } JButton generate = new JButton("Generate Tileset Overview"); generate.setBounds(50, offset, 200, 50); generate.addActionListener(actionEvent -> { generateOverview(); }); add(generate); info = new JLabel(); info.setBounds(300, 830, 200, 50); add(info); tilesetPanel.setPreferredSize(new Dimension(630, 800)); scrollPane.setLocation(300, 0); scrollPane.setBounds(300, 0, 650, 800); scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); scrollPane.setWheelScrollingEnabled(true); scrollPane.getVerticalScrollBar().setUnitIncrement(10); view.add(scrollPane); add(view); setDefaultCloseOperation(EXIT_ON_CLOSE); setBounds(0, 0, 1000, 1000); setLocationRelativeTo(null); setVisible(true); setResizable(false); try { setIconImage(ImageIO.read(new File("src/main/resources/images/icon.png")).getScaledInstance(64, 64, Image.SCALE_DEFAULT)); } catch (IOException e) { e.printStackTrace(); } } private void loadTileset(String name) { JLabel text = new JLabel(name); text.setBounds(50 , offset, 200, 50); JCheckBox checkBox = new JCheckBox(); checkBox.setBounds(220, offset, 30, 50); checkBox.addActionListener(actionEvent -> { if (activeTilesets.contains(name)) activeTilesets.remove(name); else activeTilesets.add(name); }); checkBox.setName(name); add(text); add(checkBox); offset += 70; } public void generateOverview() { tilesetOffset = 0; imagesOfTiles = new LinkedList<>(); tilesetPanel.removeAll(); for (String name : activeTilesets) { JPanel tileset = new JPanel(); LinkedList tileList = new LinkedList<>(); BufferedImage image = null; try { image = ImageIO.read(new File("src/main/resources/tilesets/" + name)); } catch (IOException e) { e.printStackTrace(); } int width = image.getWidth(); int height = image.getHeight(); int tileSize = 32; int Xtiles = width / tileSize; int Ytiles = height / tileSize; int tiles = Xtiles * Ytiles; Rectangle[] rectangles = new Rectangle[tiles]; int count = 0; for (int i = 0; i < rectangles.length / Ytiles; i++) { for (int j = 0; j < rectangles.length / Xtiles; j++) { rectangles[count] = new Rectangle(tileSize * i, tileSize * j, tileSize, tileSize); count++; } } for (int i = 0; i < tiles; i++) { BufferedImage tileImage = image.getSubimage(rectangles[i].x, rectangles[i].y, rectangles[i].height, rectangles[i].width); imagesOfTiles.add(tileImage); ImageIcon imageIcon = new ImageIcon(tileImage); JLabel tile = new JLabel("" + (imagesOfTiles.size() - 1) + "", imageIcon, JLabel.CENTER); tile.setHorizontalTextPosition(JLabel.CENTER); tile.setPreferredSize(new Dimension(tileSize, tileSize)); tile.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { info.setIcon(new ImageIcon(tileImage.getScaledInstance(50, 50, Image.SCALE_DEFAULT))); info.setText(tile.getText()); } }); tileList.add(tile); } // for (int i = 0; i < Ytiles; i++) { for (int j = 0; j < Xtiles; j++) { tileset.add(tileList.get(i + (j*Ytiles))); } } // for (int i = 0; i < 16; i++) { // tileset.add(tileList.get(i)); // } tileset.setBounds(0, tilesetOffset, width + (Xtiles * 6), height + (Ytiles * 6)); tilesetOffset += height + + (Ytiles * 6); tilesetPanel.add(tileset); int panelWidth = tilesetPanel.getPreferredSize().width; if (panelWidth < width + (Xtiles * 6)) panelWidth = width + (Xtiles * 6); tilesetPanel.setPreferredSize(new Dimension(panelWidth, tilesetOffset)); } view.repaint(); } public LinkedList getImagesOfTiles() { return imagesOfTiles; } public LinkedList getActiveTilesets() { return activeTilesets; } public void setActiveTilesets(LinkedList activeTilesets) { this.activeTilesets = activeTilesets; } public JLabel getInfo() { return info; } }