package com.javaxyq.tools;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JDialog;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSeparator;
import javax.swing.border.LineBorder;
import org.jdesktop.application.Action;
import org.jdesktop.application.Application;
import org.jdesktop.application.ApplicationActionMap;
import com.javaxyq.ui.CenterLayout;
import com.javaxyq.ui.Label;
import com.javaxyq.widget.Sprite;
import com.jidesoft.dialog.ButtonPanel;
import com.jidesoft.swing.JideButton;
import com.jidesoft.swing.JideComboBox;
/**
* ����Ԥ��
*
* @author ����ΰ
* @history 2008-7-2 ����ΰ �½�
*/
public class SpriteDialog extends JDialog {
private static final long serialVersionUID = 8029400278451880408L;
// TODO �϶�����ķ���(������ת)
private Sprite sprite;
private Label animLabel;
private FileObject fileObject;
private JCheckBox autoPlayCheckbox;
private JideComboBox dirctionComboBox;
private ApplicationActionMap actionMap;
private Timer timer;
private JPanel animPanel;
private JideComboBox frameComboBox;
private static JFileChooser fileChooser;
public SpriteDialog(JFrame owner,FileObject fileObject) {
super(owner);
this.fileObject = fileObject;
sprite = XYQTools.createSprite(fileObject);
actionMap = Application.getInstance().getContext().getActionMap(this);
initGUI(fileObject);
this.addWindowListener(new WindowAdapter() {
@Override
public void windowActivated(WindowEvent e) {
if(timer == null) {
timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
repaint();
}
}, 100, 100);
}
}
public void windowClosing(WindowEvent e) {
timer.cancel();
sprite = null;
remove(animPanel);
animPanel = null;
animLabel.setAnim(null);
}
});
}
private void initGUI(final FileObject fileObject) {
animLabel = new Label(sprite.getCurrAnimation());
animLabel.setDebug(true);
animLabel.setBorder(new LineBorder(Color.LIGHT_GRAY));
animPanel = new JPanel(new CenterLayout());
animPanel.add("Center", animLabel);
//animPanel.setBackground(Color.BLACK);
String[] items = new String[sprite.getAnimationCount()];
for (int i = 0; i < items.length; i++) {
items[i] = "����" + i;
}
dirctionComboBox = new JideComboBox(items);
dirctionComboBox.setPreferredSize(new Dimension(80, 22));
dirctionComboBox.setEditable(false);
dirctionComboBox.setFocusable(false);
dirctionComboBox.setAction(actionMap.get("changeDirection"));
JPanel controlPanel = new JPanel();
controlPanel.add(dirctionComboBox);
autoPlayCheckbox = new JCheckBox(actionMap.get("autoPlay"));
autoPlayCheckbox.setSelected(true);
autoPlayCheckbox.setFocusable(false);
controlPanel.add(autoPlayCheckbox);
JButton btnPlay = new JButton(actionMap.get("play"));
btnPlay.setMargin(new Insets(2, 2, 2, 2));
controlPanel.add(btnPlay);
JButton btnFirst = new JButton(actionMap.get("first"));
btnFirst.setMargin(new Insets(2, 2, 2, 2));
controlPanel.add(btnFirst);
JButton btnPrev = new JButton(actionMap.get("prev"));
btnPrev.setMargin(new Insets(2, 2, 2, 2));
controlPanel.add(btnPrev);
String[] frameitems = new String[sprite.getCurrAnimation().getFrameCount()];
for (int i = 0; i < frameitems.length; i++) {
frameitems[i] = "frame " + i;
}
frameComboBox = new JideComboBox(frameitems);
frameComboBox.setPreferredSize(new Dimension(80, 22));
frameComboBox.setEditable(false);
frameComboBox.setFocusable(false);
frameComboBox.setAction(actionMap.get("changeFrame"));
controlPanel.add(frameComboBox);
JButton btnNext = new JButton(actionMap.get("next"));
btnNext.setMargin(new Insets(2, 2, 2, 2));
controlPanel.add(btnNext);
JButton btnLast = new JButton(actionMap.get("last"));
btnLast.setMargin(new Insets(2, 2, 2, 2));
controlPanel.add(btnLast);
JPanel previewPanel = new JPanel(new BorderLayout());
previewPanel.setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createTitledBorder(" Ԥ�� "), BorderFactory.createEmptyBorder(4, 4, 4, 4)));
previewPanel.add(animPanel, BorderLayout.CENTER);
previewPanel.add(controlPanel, BorderLayout.SOUTH);
JPanel infoPanel = new JPanel(new GridLayout(12, 1, 6, 6));
infoPanel.setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createTitledBorder(" ��Ϣ "), BorderFactory.createEmptyBorder(4, 4, 4, 4)));
infoPanel.add(new JLabel("name: \t" + fileObject.getName()));
if (fileObject instanceof WdfFileNode) {
WdfFileNode node = (WdfFileNode) fileObject;
infoPanel.add(new JLabel("id: \t" + Long.toHexString(node.getId()).toUpperCase()));
infoPanel.add(new JLabel("offset: \t" + Long.toHexString(node.getOffset()).toUpperCase()));
}
infoPanel.add(new JLabel("size: \t" + (fileObject.getSize()*1.0/1024)+" KB"));
//infoPanel.add(new JLabel("space: \t" + fileObject.getSpace()));
infoPanel.add(new JLabel("path: \t" + fileObject.getPath()));
infoPanel.add(new JSeparator());
infoPanel.add(new JLabel("FrameCount: \t" + sprite.getAnimationCount()));
infoPanel.add(new JLabel("width: \t" + sprite.getWidth()));
infoPanel.add(new JLabel("height: \t" + sprite.getHeight()));
infoPanel.add(new JLabel("RefPixelX: \t" + sprite.getRefPixelX()));
infoPanel.add(new JLabel("RefPixelY: \t" + sprite.getRefPixelY()));
JPanel contentPanel = new JPanel(new BorderLayout());
contentPanel.add(previewPanel, BorderLayout.CENTER);
contentPanel.add(infoPanel, BorderLayout.EAST);
//FIXME buttons
ButtonPanel buttonPanel = new ButtonPanel();
JideButton closeButton = new JideButton("�ر�");
closeButton.setName("closeButton");
closeButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
SpriteDialog.this.dispose();
}
});
JideButton exportButton = new JideButton("����");
exportButton.setName("exportButton");
exportButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if(fileChooser == null) {
fileChooser = new JFileChooser();
}
fileChooser.setSelectedFile(new File(fileObject.getName()));
int opt = fileChooser.showSaveDialog(SpriteDialog.this);
if(opt == JFileChooser.APPROVE_OPTION) {
File file = fileChooser.getSelectedFile();
try {
byte[] buf = fileObject.getData();
FileOutputStream fos = new FileOutputStream(file);
fos.write(buf);
fos.close();
} catch (IOException e1) {
System.out.println("��������ʧ�ܣ�"+fileObject.getName());
e1.printStackTrace();
}
}
}
});
// JideButton prevButton = new JideButton("prev");
// prevButton.setName("prevButton");
// JideButton nextButton = new JideButton("next");
// nextButton.setName("nextButton");
//
buttonPanel.addButton(exportButton);
// buttonPanel.add(prevButton);
// buttonPanel.add(nextButton);
buttonPanel.add(Box.createHorizontalBox());
buttonPanel.addButton(closeButton);
add(buttonPanel, BorderLayout.SOUTH);
add(contentPanel, BorderLayout.CENTER);
// setModal(true);
setAlwaysOnTop(true);
addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (e.getButton() == MouseEvent.BUTTON3) {
dispose();
SpriteDialog.this.getParent().remove(SpriteDialog.this);
}
}
});
}
@Action
public void autoPlay() {
this.sprite.setAutoPlay(autoPlayCheckbox.isSelected());
}
@Action
public void first() {
this.sprite.setRepeat(0);
this.sprite.getCurrAnimation().setIndex(0);
frameComboBox.setSelectedIndex(this.sprite.getCurrAnimation().getIndex());
}
@Action
public void prev() {
this.sprite.setRepeat(0);
int index = this.sprite.getCurrAnimation().getIndex()-1;
this.sprite.getCurrAnimation().setIndex(index>0?index:0);
frameComboBox.setSelectedIndex(this.sprite.getCurrAnimation().getIndex());
}
@Action
public void next() {
this.sprite.setRepeat(0);
int index = this.sprite.getCurrAnimation().getIndex()+1;
int count = this.sprite.getCurrAnimation().getFrameCount();
index = index<count-1?index:count-1;
this.sprite.getCurrAnimation().setIndex(index);
frameComboBox.setSelectedIndex(this.sprite.getCurrAnimation().getIndex());
}
@Action
public void last() {
this.sprite.setRepeat(0);
int count = this.sprite.getCurrAnimation().getFrameCount();
this.sprite.getCurrAnimation().setIndex(count-1);
frameComboBox.setSelectedIndex(count-1);
}
@Action
public void changeFrame() {
this.sprite.setRepeat(0);
int index = frameComboBox.getSelectedIndex();
this.sprite.getCurrAnimation().setIndex(index);
}
@Action
public void play() {
this.sprite.resetFrames();
this.sprite.setRepeat(1);
}
@Action
public void changeDirection() {
int index = dirctionComboBox.getSelectedIndex();
this.sprite.setDirection(index);
this.animLabel.setAnim(this.sprite.getCurrAnimation());
}
public FileObject getFileObject() {
return fileObject;
}
public void setFileObject(FileObject fileObject) {
this.fileObject = fileObject;
//FIXME
}
}