package com.clearlyspam23.GLE.basic.layers.tile.gui.tileset; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.util.List; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.JScrollPane; import com.clearlyspam23.GLE.basic.layers.tile.TilesetGroupNode; import com.clearlyspam23.GLE.basic.layers.tile.TilesetHandle; import com.clearlyspam23.GLE.basic.layers.tile.TilesetTileNode; import com.clearlyspam23.GLE.basic.layers.tile.TilesetTreeNode; import com.clearlyspam23.GLE.basic.layers.tile.TilesetTreeNode.Type; import com.clearlyspam23.GLE.basic.layers.tile.resources.BasicTilesetHandle; public class TilesetLoadPanel extends JPanel implements TilesetViewListener{ /** * */ private static final long serialVersionUID = 1L; private TilesetTreeViewPanel tilesetViewPanel; private TilesetEditPanel tilesetEditPanel; private TilesetGroupNode root; private TilesetTileNode currentTilesetNode; private final JPopupMenu tilePopUp; private final JPopupMenu groupPopUp; private static final String newLine = System.getProperty("line.separator"); private int lastId; /** * Create the panel. */ public TilesetLoadPanel() { setLayout(new BorderLayout(0, 0)); tilePopUp = new JPopupMenu(); JMenuItem button = new JMenuItem("New Tileset"); button.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent arg0) { BasicTilesetHandle h = new BasicTilesetHandle("New Tileset"); h.setID(++lastId); TilesetTileNode tileNode = new TilesetTileNode(h); for(int i = 1; !root.getTilesetsByName(tileNode.getName()).isEmpty(); i++){ tileNode.setName("New Tileset " + i); } tilesetViewPanel.insertNode(tileNode, true); changeToTileset(tileNode); } }); tilePopUp.add(button); button = new JMenuItem("New Group"); button.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent arg0) { tilesetViewPanel.insertNode(new TilesetGroupNode("New Group")); } }); tilePopUp.add(button); tilePopUp.add(button); button = new JMenuItem("Remove"); button.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent arg0) { if(JOptionPane.showConfirmDialog(TilesetLoadPanel.this, "Are you sure you want to Remove this Tileset?", "Confirm Removal", JOptionPane.OK_CANCEL_OPTION)==JOptionPane.OK_OPTION) tilesetViewPanel.removeNode(); } }); tilePopUp.add(button); groupPopUp = new JPopupMenu(); button = new JMenuItem("New Tileset"); button.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent arg0) { BasicTilesetHandle h = new BasicTilesetHandle("New Tileset"); h.setID(++lastId); TilesetTileNode tileNode = new TilesetTileNode(h); for(int i = 1; !root.getTilesetsByName(tileNode.getName()).isEmpty(); i++){ tileNode.setName("New Tileset " + i); } tilesetViewPanel.insertNode(tileNode, true); changeToTileset(tileNode); } }); groupPopUp.add(button); button = new JMenuItem("New Group"); button.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent arg0) { tilesetViewPanel.insertNode(new TilesetGroupNode("New Group")); } }); groupPopUp.add(button); button = new JMenuItem("Remove"); button.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent arg0) { if(JOptionPane.showConfirmDialog(TilesetLoadPanel.this, "Are you sure you want to Remove this group? This will also Remove any children of this group", "Confirm Removal", JOptionPane.OK_CANCEL_OPTION)==JOptionPane.OK_OPTION) tilesetViewPanel.removeNode(); } }); groupPopUp.add(button); JScrollPane scrollPane = new JScrollPane(); add(scrollPane, BorderLayout.WEST); tilesetViewPanel = new TilesetTreeViewPanel(); tilesetViewPanel.setPreferredSize(new Dimension(160, 0)); scrollPane.setViewportView(tilesetViewPanel); tilesetEditPanel = new TilesetEditPanel(); add(tilesetEditPanel, BorderLayout.CENTER); } // public TilesetHandle generateTilesetHandle(){ // // } private boolean finalizeCurrentTileset(boolean silent){ if(currentTilesetNode!=null){ String errorMsg; BasicTilesetHandle tileset = tilesetEditPanel.getTileset(); if(!silent&&!(errorMsg=isValidTileset(tileset)).isEmpty()){ String msg = "The Tileset currently being edited is invalid for the following reason(s) : " + newLine + newLine + errorMsg + newLine + newLine + "If you change Tilesets, this Tileset will not be saved and any changes will be lost." + newLine + newLine + "Change Tilesets Anyways?"; return JOptionPane.showConfirmDialog(this, msg, "Confirm Tileset Change", JOptionPane.OK_CANCEL_OPTION)==JOptionPane.OK_OPTION; } currentTilesetNode.setTileset(tileset); } return true; } private void changeToTileset(TilesetTileNode handle){ if(!finalizeCurrentTileset(false)){ return; } currentTilesetNode = handle; tilesetEditPanel.setToTileset(handle.getTileset()); } public void setToTileset(TilesetGroupNode tilesetTree, int startId){ lastId = startId; root = tilesetTree.cloneAsBasic().getAsGroup(); currentTilesetNode = null; tilesetEditPanel.setToTileset(null); tilesetViewPanel.setToTilesets(root, this); } private boolean isNameUnique(String name){ return isNameUnique(name, currentTilesetNode.getTileset()); } private boolean isNameUnique(String name, TilesetHandle handle){ List<TilesetHandle> h = root.getTilesetsByName(name); if(h.size()==1){ return h.get(0)==handle; } return h.isEmpty(); } private String isValidTileset(TilesetHandle current){ StringBuilder out = new StringBuilder(""); if(current.getName()==null||"".equals(current.getName())) out.append("name cannot be empty").append(newLine); else{ if(!isNameUnique(current.getName())) out.append("name is not unique").append(newLine); } if(!isImageFileValid(current.getFilename())) out.append("the image file is not valid").append(newLine); else{ } return out.toString(); } private boolean isImageFileValid(String s){ return new BasicTilesetHandle("", s, Integer.MAX_VALUE, Integer.MAX_VALUE).isValid(); } @Override public void onTilesetDoubleClick(TilesetTreeViewPanel panel, TilesetTileNode tileNode, MouseEvent e) { if(tileNode!=currentTilesetNode) changeToTileset(tileNode); } @Override public void onGroupDoubleClick(TilesetTreeViewPanel panel, TilesetGroupNode tileNode, MouseEvent e) { } @Override public void onTilesetRightClick(TilesetTreeViewPanel panel, TilesetTileNode tileNode, MouseEvent e) { tilePopUp.show(e.getComponent(), e.getX(), e.getY()); } @Override public void onGroupRightClick(TilesetTreeViewPanel panel, TilesetGroupNode tileNode, MouseEvent e) { groupPopUp.show(e.getComponent(), e.getX(), e.getY()); } @Override public void onTilesetRenamed(TilesetTreeViewPanel panel, TilesetTileNode node) { if(node==currentTilesetNode) tilesetEditPanel.updateName(node.getName()); } @Override public void onGroupRenamed(TilesetTreeViewPanel panel, TilesetGroupNode node) { } public void removeInvalidTilesets(){ removeInvalidTilesets(root); } private void removeInvalidTilesets(TilesetGroupNode parent){ for(int i = 0; i < parent.getChildren().size(); i++){ TilesetTreeNode node = parent.getChildren().get(i); if(node.getType()==Type.TILE){ if(!isValidTileset(node.getAsTiles().getTileset()).isEmpty()) parent.getChildren().remove(i--); } else removeInvalidTilesets(node.getAsGroup()); } } private void accumulate(TilesetGroupNode node, StringBuilder err){ for(TilesetTreeNode n : node.getChildren()){ if(n.getType()==TilesetTreeNode.Type.TILE){ currentTilesetNode = n.getAsTiles(); if(!isValidTileset(currentTilesetNode.getTileset()).isEmpty()){ err.append(currentTilesetNode.getTileset().getName()).append(newLine); } } else{ accumulate(n.getAsGroup(), err); } } } /** * attempts to validate the existing tilesets * @return a string, either the empty string if all tilesets were validated successfully, or a string with the name of every failed string, followed by a new line */ public String validateTilesets(){ StringBuilder err = new StringBuilder(""); accumulate(root, err); // for(TilesetHandle h : root.getTilesets()){ // if(!isValidTileset(h).isEmpty()){ // System.out.println(isValidTileset(h)); // err.append(h.getName()).append(newLine); // } // } return err.toString(); } public boolean finish(){ return finish(false); } public boolean finish(boolean silentFinalize){ if(!finalizeCurrentTileset(silentFinalize)) return false; String err = validateTilesets(); //tommorow, split this up so itll fit better into more than just a dialog if(!err.isEmpty()){ String msg = "The following Tilesets are invalid:" + newLine + newLine + err + newLine + "If you continue, these tilesets will be removed" + newLine + newLine + " Do you want to Continue?"; if(JOptionPane.showConfirmDialog(this, msg, "Confirm", JOptionPane.OK_CANCEL_OPTION)==JOptionPane.OK_OPTION){ removeInvalidTilesets(root); return true; } return false; } return true; } private void replicate(TilesetGroupNode node, TilesetGroupNode replicate){ for(TilesetTreeNode n : node.getChildren()){ if(n.getType()==Type.TILE){ TilesetHandle h = n.getAsTiles().getTileset(); replicate.addNode(new TilesetTileNode(new BasicTilesetHandle(h.getName(), h.getFilename(), h.getTileWidth(), h.getTileHeight(), h.getTileXSpacing(), h.getTileYSpacing(), h.getID()))); } else{ TilesetGroupNode g = new TilesetGroupNode(n.getName()); replicate.addNode(g); replicate(n.getAsGroup(), g); } } } public TilesetGroupNode getTilesets(){ TilesetGroupNode output = new TilesetGroupNode(root.getName()); replicate(root, output); return output; } }