package test;
import java.awt.Component;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.File;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.event.TreeModelListener;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.TreeModel;
import javax.swing.tree.TreePath;
import com.kreative.paint.material.sprite.ArrayOrdering;
import com.kreative.paint.material.sprite.ColorTransform;
import com.kreative.paint.material.sprite.Sprite;
import com.kreative.paint.material.sprite.SpriteIntent;
import com.kreative.paint.material.sprite.SpriteSheet;
import com.kreative.paint.material.sprite.SpriteSheetReader;
public class SpriteSheetDemo {
public static void main(String[] args) throws IOException {
SpriteSheetReader.Options o = new SpriteSheetReader.Options();
boolean processingFlags = true;
int i = 0; while (i < args.length) {
String arg = args[i++];
if (processingFlags && arg.startsWith("-")) {
if (arg.equals("--")) {
processingFlags = false;
} else if (arg.equals("-s") && i < args.length) {
arg = args[i++].trim();
if (arg.equalsIgnoreCase("whole")) {
o.setDefaultSlicingNone();
} else if (arg.equalsIgnoreCase("strip")) {
o.setDefaultSlicingStrip();
} else {
Pattern p = Pattern.compile("([0-9]+)\\s*[Xx,]\\s*([0-9]+)");
Matcher m = p.matcher(arg);
if (m.matches()) {
int w = Integer.parseInt(m.group(1));
int h = Integer.parseInt(m.group(2));
o.setDefaultSlicingFixed(w, h);
} else {
System.err.println("Ignoring invalid option parameter: -s " + arg);
}
}
} else if (arg.equals("-h") && i < args.length) {
arg = args[i++].trim();
Pattern p = Pattern.compile(
"([Cc][Ee][Nn][Tt][Ee][Rr]|[+-]?[0-9]+)\\s*,\\s*" +
"([Cc][Ee][Nn][Tt][Ee][Rr]|[+-]?[0-9]+)"
);
Matcher m = p.matcher(arg);
if (m.matches()) {
int x = m.group(1).equalsIgnoreCase("center") ?
SpriteSheetReader.Options.HOTSPOT_CENTER :
Integer.parseInt(m.group(1));
int y = m.group(2).equalsIgnoreCase("center") ?
SpriteSheetReader.Options.HOTSPOT_CENTER :
Integer.parseInt(m.group(2));
o.setDefaultHotspot(x, y);
} else {
System.err.println("Ignoring invalid option parameter: -h " + arg);
}
} else if (arg.equals("-o")) {
o.setDefaultSlicingOrder(ArrayOrdering.fromString(args[i++]));
} else if (arg.equals("-t")) {
o.setDefaultColorTransform(ColorTransform.fromString(args[i++]));
} else if (arg.equals("-p")) {
arg = args[i++].trim();
if (arg.equalsIgnoreCase("auto")) {
o.setDefaultPresentationAuto();
} else {
Pattern p = Pattern.compile(
"([+-]?[0-9]+)\\s*[Xx,]\\s*" +
"([+-]?[0-9]+)\\s*,\\s*(.+)"
);
Matcher m = p.matcher(arg);
if (m.matches()) {
int w = Integer.parseInt(m.group(1));
int h = Integer.parseInt(m.group(2));
ArrayOrdering order = ArrayOrdering.fromString(m.group(3));
o.setDefaultPresentation(w, h, order);
} else {
System.err.println("Ignoring invalid option parameter: -p " + arg);
}
}
} else if (arg.equals("-i")) {
o.setDefaultIntent(SpriteIntent.fromString(args[i++]));
} else if (arg.equals("-d")) {
arg = args[i++].trim();
if (arg.equalsIgnoreCase("flat")) {
o.setDefaultStructureFlat();
} else if (arg.equalsIgnoreCase("single")) {
o.setDefaultStructureSingleParent(false);
} else if (arg.equalsIgnoreCase("xsingle")) {
o.setDefaultStructureSingleParent(true);
} else if (arg.equalsIgnoreCase("multi")) {
o.setDefaultStructureMultipleParents(false);
} else if (arg.equalsIgnoreCase("xmulti")) {
o.setDefaultStructureMultipleParents(true);
} else {
System.err.println("Ignoring invalid option parameter: -d " + arg);
}
} else {
System.err.println("Ignoring unknown option: " + arg);
}
} else {
try {
processFile(new File(arg), o);
} catch (IOException e) {
System.err.println("Error processing " + arg + ": " + e.getMessage());
e.printStackTrace();
}
}
}
}
private static void processFile(File file, SpriteSheetReader.Options o) throws IOException {
SpriteSheet sheet = SpriteSheetReader.readSpriteSheet(file, o);
SpriteSheetTreeModel model = new SpriteSheetTreeModel(sheet);
SpriteSheetCellRenderer renderer = new SpriteSheetCellRenderer();
final JTree view = new JTree(model);
view.setRowHeight(0);
view.setCellRenderer(renderer);
view.addMouseListener(new MouseListener() {
@Override
public void mouseClicked(MouseEvent e) {
if (e.getButton() != MouseEvent.BUTTON1) {
Object o = view.getLastSelectedPathComponent();
if (o instanceof Sprite) {
Sprite s = (Sprite)o;
view.setCursor(s.getPreparedCursor(e.isAltDown()));
}
}
}
@Override public void mouseEntered(MouseEvent e) {}
@Override public void mouseExited(MouseEvent e) {}
@Override public void mousePressed(MouseEvent e) {}
@Override public void mouseReleased(MouseEvent e) {}
});
JScrollPane pane = new JScrollPane(view,
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
JFrame frame = new JFrame(file.getName());
frame.setContentPane(pane);
frame.setSize(300, 300);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
private static class SpriteSheetTreeModel implements TreeModel {
private final SpriteSheet sheet;
public SpriteSheetTreeModel(SpriteSheet sheet) {
this.sheet = sheet;
}
@Override
public Object getRoot() {
return sheet;
}
@Override
public int getChildCount(Object parent) {
if (parent instanceof SpriteSheet) {
return ((SpriteSheet)parent).getSpriteCount();
}
if (parent instanceof Sprite) {
return ((Sprite)parent).getChildCount();
}
return 0;
}
@Override
public Object getChild(Object parent, int index) {
if (parent instanceof SpriteSheet) {
return ((SpriteSheet)parent).getSprite(index);
}
if (parent instanceof Sprite) {
return ((Sprite)parent).getChild(index);
}
return null;
}
@Override
public int getIndexOfChild(Object parent, Object child) {
int count = getChildCount(parent);
for (int i = 0; i < count; i++) {
if (getChild(parent, i) == child) {
return i;
}
}
return -1;
}
@Override
public boolean isLeaf(Object o) {
return getChildCount(o) == 0;
}
@Override public void addTreeModelListener(TreeModelListener listener) {}
@Override public void removeTreeModelListener(TreeModelListener listener) {}
@Override public void valueForPathChanged(TreePath path, Object o) {}
}
private static class SpriteSheetCellRenderer extends DefaultTreeCellRenderer {
private static final long serialVersionUID = 1L;
@Override
public Component getTreeCellRendererComponent(
JTree tree, Object value, boolean sel, boolean expanded,
boolean leaf, int row, boolean hasFocus
) {
JLabel label = (JLabel)super.getTreeCellRendererComponent(
tree, value, sel, expanded, leaf, row, hasFocus
);
if (value instanceof SpriteSheet) {
SpriteSheet sheet = (SpriteSheet)value;
if (sheet.name != null && sheet.name.length() > 0) {
label.setText(sheet.name);
} else {
label.setText("<SpriteSheet>");
}
}
if (value instanceof Sprite) {
Sprite s = (Sprite)value;
label.setIcon(new ImageIcon(s.getPreparedImage()));
if (s.getName() != null && s.getName().length() > 0) {
label.setText(s.getName());
} else {
label.setText("<Sprite>");
}
}
label.setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2));
return label;
}
}
}