/* * Copyright (C) 2011 IsmAvatar <IsmAvatar@gmail.com> * * This file is part of LateralGM. * LateralGM is free software and comes with ABSOLUTELY NO WARRANTY. * See LICENSE for details. */ package org.lateralgm.components.impl; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.Frame; import java.awt.Rectangle; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.image.BufferedImage; import java.util.ArrayList; import java.util.Iterator; import javax.swing.GroupLayout; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.GroupLayout.Alignment; import javax.swing.GroupLayout.ParallelGroup; import javax.swing.GroupLayout.SequentialGroup; import javax.swing.LayoutStyle.ComponentPlacement; import org.lateralgm.components.NumberField; import org.lateralgm.components.NumberField.ValueChangeEvent; import org.lateralgm.components.NumberField.ValueChangeListener; import org.lateralgm.components.visual.SpriteStripPreview; import org.lateralgm.messages.Messages; public class SpriteStripDialog extends JDialog implements Iterable<Rectangle>,ActionListener { private static final long serialVersionUID = 1L; public BufferedImage img; public SpriteStripPreview preview; /** Whether this dialog was confirmed yet (via press to OK button). */ public boolean confirmed = false; private NumberField fields[]; private static final int IMAGE_NUMBER = 0, IMAGES_PER_ROW = 1, CELL_WIDTH = 2, CELL_HEIGHT = 3, HOR_CELL_OFFSET = 4, VERT_CELL_OFFSET = 5, HOR_PIXEL_OFFSET = 6, VERT_PIXEL_OFFSET = 7, HOR_SEP = 8, VERT_SEP = 9; public SpriteStripDialog(Frame owner, BufferedImage src) { super(owner,Messages.getString("SpriteStripDialog.TITLE"),true); img = src; String labels[] = { "IMAGE_NUMBER","IMAGES_PER_ROW","CELL_WIDTH","CELL_HEIGHT", "HOR_CELL_OFFSET","VERT_CELL_OFFSET","HOR_PIXEL_OFFSET","VERT_PIXEL_OFFSET","HOR_SEP", "VERT_SEP" }; JLabel l[] = new JLabel[labels.length]; fields = new NumberField[labels.length]; JPanel p = new JPanel(); GroupLayout layout = new GroupLayout(p); p.setLayout(layout); ParallelGroup g1 = layout.createParallelGroup(); ParallelGroup g2 = layout.createParallelGroup(); SequentialGroup g3 = layout.createSequentialGroup().addContainerGap(); preview = new SpriteStripPreview(this); fields[IMAGE_NUMBER] = new NumberField(1,99999,1); fields[IMAGES_PER_ROW] = new NumberField(1,99999,1); fields[CELL_WIDTH] = new NumberField(1,99999,32); fields[CELL_HEIGHT] = new NumberField(1,99999,32); //link ImgNum together with ImgPerRow if they are equal, thus expanding horizontally. fields[IMAGE_NUMBER].addValueChangeListener(new ValueChangeListener() { public void valueChange(ValueChangeEvent evt) { if (fields[IMAGES_PER_ROW].getValue().equals(evt.getOldValue())) fields[IMAGES_PER_ROW].setValue(evt.getNewValue()); } }); for (int i = 0; i < labels.length; i++) { l[i] = new JLabel(Messages.getString("SpriteStripDialog." + labels[i])); g1.addComponent(l[i]); if (i > 3) fields[i] = new NumberField(0); fields[i].addValueChangeListener(preview); g2.addComponent(fields[i],50,50,50); if ((i > 1 && i % 2 == 0) || i == 1) g3.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED); g3.addGroup(layout.createParallelGroup(Alignment.BASELINE) /**/.addComponent(l[i]) /**/.addComponent(fields[i])); } String str = "SpriteStripDialog.IMPORT"; JButton ok = new JButton(Messages.getString(str)); ok.setActionCommand(str); ok.addActionListener(this); str = "SpriteStripDialog.CANCEL"; JButton cancel = new JButton(Messages.getString(str)); cancel.setActionCommand(str); cancel.addActionListener(this); layout.setHorizontalGroup(layout.createParallelGroup() /**/.addGroup(layout.createSequentialGroup() /* */.addContainerGap() /* */.addGroup(g1) /* */.addPreferredGap(ComponentPlacement.RELATED) /* */.addGroup(g2) /* */.addContainerGap()) /**/.addGroup(layout.createSequentialGroup() /* */.addComponent(ok).addComponent(cancel))); g3.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED); g3.addGroup(layout.createParallelGroup() /**/.addComponent(ok) /**/.addComponent(cancel)).addContainerGap(); layout.setVerticalGroup(g3); add(p,BorderLayout.WEST); JScrollPane scroll = new JScrollPane(preview); scroll.setPreferredSize(new Dimension(300,300)); add(scroll,BorderLayout.CENTER); pack(); } /** * Sets the origin, or x/y position of top-left cell, which in turn updates the preview. * This is really only used by the preview, when the mouse is clicked. */ public void setOrigin(int x, int y) { fields[HOR_CELL_OFFSET].setValue(0); fields[VERT_CELL_OFFSET].setValue(0); fields[HOR_PIXEL_OFFSET].setValue(x); fields[VERT_PIXEL_OFFSET].setValue(y); } public BufferedImage[] getStrip() { if (!confirmed) return null; BufferedImage[] ret = new BufferedImage[fields[IMAGE_NUMBER].getIntValue()]; int i = 0; for (Rectangle r : this) ret[i++] = img.getSubimage(r.x,r.y,r.width,r.height); return ret; } public Iterator<Rectangle> iterator() { ArrayList<Rectangle> list = new ArrayList<Rectangle>(); int cw = fields[CELL_WIDTH].getIntValue(); int ch = fields[CELL_HEIGHT].getIntValue(); int x = fields[HOR_CELL_OFFSET].getIntValue() * cw; int y = fields[VERT_CELL_OFFSET].getIntValue() * ch; x += fields[HOR_PIXEL_OFFSET].getIntValue(); y += fields[VERT_PIXEL_OFFSET].getIntValue(); int xx = x, yy = y; for (int i = 0; i < fields[IMAGE_NUMBER].getIntValue(); i++) { if (i != 0 && i % fields[IMAGES_PER_ROW].getIntValue() == 0) { xx = x; yy += ch + fields[VERT_SEP].getIntValue(); } list.add(new Rectangle(xx,yy,cw,ch)); xx += cw + fields[HOR_SEP].getIntValue(); } return list.listIterator(); } public void actionPerformed(ActionEvent e) { if (e.getActionCommand().equals("SpriteStripDialog.IMPORT")) confirmed = true; setVisible(false); } }