[StoryToolKit] STK工具箱的源代码

以下代码是 《StoryToolKit》 附带的工具箱的源代码,虽然有待改进的地方不少,但我相信值得大家借鉴的地方同样很多

 

里面很能体现了我写代码的特点:精简变量,精简代码结构,最大化兼容性

我所有的界面仅使用AWT组件,这样做界面有3点好处:

1。发布独立安装包时可以精简虚拟机

2。可以兼容所有的虚拟机——这里给只会用swing的人普及一下知识:IBM的java虚拟机对SWT支持不错,但对swing的支持不行;而Linux下OpenJDK执行Swing的效率是极其低下的

3。最大化配合本机用户界面

 

大家不妨看看我的内部类,匿名类以及一个文件多个类的使用方法,这样做的好处是方便管理java代码文件——虽然编译出来的类没差。

以及一些界面小技巧:文本框仅支持数字,动画显示窗口,鼠标拖曳窗口及部件,等等等等……

 

以下代码全部包括在一个java源文件内,包含main函数,可以直接执行

 

import java.awt.Button;
import java.awt.Choice;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Label;
import java.awt.List;
import java.awt.MouseInfo;
import java.awt.Panel;
import java.awt.ScrollPane;
import java.awt.TextField;
import java.awt.Toolkit;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.event.TextEvent;
import java.awt.event.TextListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import javax.imageio.ImageIO;

public class FunctionListForm
{
	
	public static Frame window = null;
	public static Button PackFilesBtn=new Button("Pack Files"),
						CheckPackedFilesBtn=new Button("View Package"),
						LocateImageBtn=new Button("Calculate Location"),
						CreateAnimeBtn=new Button("Create Animation");
	private static boolean animing=false, isMin=false;
	private static int mouseLocateInForm_X=0, mouseLocateInForm_Y=0;
	public static Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 

	public static void main(String[] args)
	{
		window = new Frame(){public void paint(Graphics g) {
			if(animing)
				return;
			g.setColor(Color.BLACK);
			g.drawRect(0, 0, 199, 599);
			g.fill3DRect(0, 0, 200, 20, true);
			g.setColor(Color.WHITE);
			g.drawString(window.getTitle(), 4, 14);
		}};
		window.setSize(200, 0);
		window.setTitle("ToolBox - StoryToolKit");
		window.setLayout(null);
		window.setLocation(50, 50);
		window.setUndecorated(true);
		window.setBackground(Color.LIGHT_GRAY);
		window.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e)
		{
			window.dispose();
			System.exit(0);
		}});
		window.addMouseListener(new MouseAdapter(){public void mousePressed(MouseEvent e) {
			mouseLocateInForm_X = e.getX();
			mouseLocateInForm_Y = e.getY();
		}});
		window.addMouseMotionListener(new MouseMotionAdapter(){public void mouseDragged(MouseEvent e) {
			window.setLocation(MouseInfo.getPointerInfo().getLocation().x-mouseLocateInForm_X,
					MouseInfo.getPointerInfo().getLocation().y-mouseLocateInForm_Y);
		}});
		
		Button minBtn = new Button();
		minBtn.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent arg0) {
			animing=true;
			if(isMin)
			{
				synchronized (this) {try{
					for(int i=20; i<600; i+=50)
					{
						window.setSize(200, i);
						wait(20);
					}
					animing=false;
					window.setSize(200, 600);
					isMin=false;
				} catch(Exception e){}}
			}
			else
			{
				synchronized (this) {try{
					for(int i=600; i>0; i-=50)
					{
						window.setSize(200, i);
						wait(20);
					}
					animing=false;
					window.setSize(200, 20);
					isMin=true;
				} catch(Exception e){}}
			}
		}});
		minBtn.setLocation(180,1);
		minBtn.setSize(19, 18);
		minBtn.setFocusable(false);
		window.add(minBtn);
		
		final Button exitBtn = new Button("Exit");
		exitBtn.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent arg0) {
			exitBtn.setEnabled(false);
			new Thread(){public void run(){
				synchronized (this) {try{
					animing=true;
					for(int i=600; i>0; i-=50)
					{
						window.setSize(200, i);
						wait(20);
					}
					System.exit(0);
				} catch(Exception e){}}
			}}.start();
		}});
		exitBtn.setLocation(1,579);
		exitBtn.setSize(198, 20);
		window.add(exitBtn);
		
		PackFilesBtn.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent arg0) {
			PackFilesBtn.setEnabled(false);
			new PackFiles();
		}});
		PackFilesBtn.setLocation(1,22);
		PackFilesBtn.setSize(198, 19);
		window.add(PackFilesBtn);
		
		CheckPackedFilesBtn.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent arg0) {
			CheckPackedFilesBtn.setEnabled(false);
			new CheckPackedFiles();
		}});
		CheckPackedFilesBtn.setLocation(1,42);
		CheckPackedFilesBtn.setSize(198, 19);
		window.add(CheckPackedFilesBtn);
		
		LocateImageBtn.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent arg0) {
			LocateImageBtn.setEnabled(false);
			new CalLocation();
		}});
		LocateImageBtn.setLocation(1,62);
		LocateImageBtn.setSize(198, 19);
		window.add(LocateImageBtn);
		
		CreateAnimeBtn.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent arg0) {
			CreateAnimeBtn.setEnabled(false);
			new AnimeCreater();
		}});
		CreateAnimeBtn.setLocation(1,82);
		CreateAnimeBtn.setSize(198, 19);
//		CreateAnimeBtn.setEnabled(false);
		window.add(CreateAnimeBtn);
		
		window.setVisible(true);
		new Thread(){public void run(){
			synchronized (this) {try{
				animing=true;
				for(int i=0; i<600; i+=50)
				{
					window.setSize(200, i);
					wait(20);
				}
				animing=false;
				window.setSize(200, 600);
			} catch(Exception e){}}
		}}.start();
	}
	
}

class MsgBox
{
	private int mouseLocateInForm_X=0, mouseLocateInForm_Y=0;
	public MsgBox(String msg)
	{
		final Window msgBox = new Window(FunctionListForm.window){public void paint(Graphics g) {
			g.drawRect(0, 0, 299, 149);
		}};
		msgBox.setSize(300, 150);
		msgBox.setLayout(null);
		msgBox.setLocation((FunctionListForm.screenSize.width-300)/2, (FunctionListForm.screenSize.height-150)/2);
		msgBox.addMouseListener(new MouseAdapter(){public void mousePressed(MouseEvent e) {
			mouseLocateInForm_X = e.getX();
			mouseLocateInForm_Y = e.getY();
		}});
		msgBox.addMouseMotionListener(new MouseMotionAdapter(){public void mouseDragged(MouseEvent e) {
			msgBox.setLocation(MouseInfo.getPointerInfo().getLocation().x-mouseLocateInForm_X,
					MouseInfo.getPointerInfo().getLocation().y-mouseLocateInForm_Y);
		}});
		
		Label msgLabel = new Label(msg);
		msgLabel.setSize(260, 100);
		msgLabel.setLocation(20, 10);
		msgLabel.addMouseListener(new MouseAdapter(){public void mousePressed(MouseEvent e) {
			mouseLocateInForm_X = e.getX()+20;
			mouseLocateInForm_Y = e.getY()+10;
		}});
		msgLabel.addMouseMotionListener(new MouseMotionAdapter(){public void mouseDragged(MouseEvent e) {
			msgBox.setLocation(MouseInfo.getPointerInfo().getLocation().x-mouseLocateInForm_X,
					MouseInfo.getPointerInfo().getLocation().y-mouseLocateInForm_Y);
		}});
		msgBox.add(msgLabel);
		
		final Button okBtn = new Button("OK");
		okBtn.setSize(100, 20);
		okBtn.setLocation(100, 115);
		okBtn.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent arg0) {
			msgBox.dispose();
		}});
		msgBox.add(okBtn);
		msgBox.setVisible(true);
		okBtn.requestFocus();
	}
}

class PackFiles
{
	private Frame window = null;
	private Choice typeChice = new Choice();
	private TextField distPathInput = new TextField();
	private List fileList = new List();
	private Label statusLabel = new Label("No start");
	private Button addBtn = new Button("Add"), upBtn = new Button("Up"), delBtn = new Button("Del"),
						downBtn = new Button("Down"), startBtn = new Button("Pack");
	
	public PackFiles()
	{
		window = new Frame(){ public void paint(Graphics g) {
			g.drawLine(20, 100, 480, 100);
			g.drawLine(20, 320, 480, 320);
		}};
		window.setSize(500, 400);
		window.setLayout(null);
		window.setLocation((FunctionListForm.screenSize.width-500)/2, (FunctionListForm.screenSize.height-400)/2);
		window.setBackground(Color.LIGHT_GRAY);
		window.setResizable(false);
		window.setTitle("PackFiles - StoryToolKit");
		window.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e)
		{
			window.dispose();
			FunctionListForm.PackFilesBtn.setEnabled(true);
		}});

		Label typeLabel = new Label("Target type:");
		typeLabel.setSize(80, 20);
		typeLabel.setLocation(20, 40);
		window.add(typeLabel);
		
		typeChice.setSize(60, 20);
		typeChice.setLocation(110, 40);
		typeChice.add("Image");
		typeChice.add("Audio");
		typeChice.add("Video");
		typeChice.add("Text");
		window.add(typeChice);

		Label pathLabel = new Label("Source path:");
		pathLabel.setSize(80, 20);
		pathLabel.setLocation(20, 70);
		window.add(pathLabel);
		
		final TextField pathInput = new TextField();
		pathInput.setSize(310, 20);
		pathInput.setLocation(110, 70);
		window.add(pathInput);
		
		addBtn.setSize(50, 20);
		addBtn.setLocation(430, 70);
		addBtn.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent arg0) {
			if(addFile(pathInput.getText()))
				pathInput.setText(null);
		}});
		window.add(addBtn);
		
		fileList.setSize(390, 200);
		fileList.setLocation(30, 110);
		window.add(fileList);
		
		upBtn.setSize(40, 70);
		upBtn.setLocation(435, 110);
		upBtn.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent arg0) {
			upItem();
		}});
		window.add(upBtn);
		
		delBtn.setSize(40, 40);
		delBtn.setLocation(435, 190);
		delBtn.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent arg0) {
			int index = fileList.getSelectedIndex();
			if(index>-1)
			{
				fileList.remove(index);
				String tFilePath;
				for(int i=index; i<fileList.getItemCount(); i++)
				{
					tFilePath = fileList.getItem(i);
					tFilePath = tFilePath.substring(tFilePath.indexOf(" - ")+3);
					fileList.remove(i);
					fileList.add(i + " - " + tFilePath, i);
				}
			}
		}});
		window.add(delBtn);
		
		downBtn.setSize(40, 70);
		downBtn.setLocation(435, 240);
		downBtn.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent arg0) {
			downItem();
		}});
		window.add(downBtn);

		Label distPathLabel = new Label("Packed file save path:");
		distPathLabel.setSize(120, 20);
		distPathLabel.setLocation(20, 330);
		window.add(distPathLabel);
		
		distPathInput.setSize(330, 20);
		distPathInput.setLocation(150, 330);
		window.add(distPathInput);

		Label statusTitleLabel = new Label("Status:");
		statusTitleLabel.setSize(60, 20);
		statusTitleLabel.setLocation(20, 360);
		window.add(statusTitleLabel);

		statusLabel.setSize(330, 20);
		statusLabel.setLocation(90, 360);
		window.add(statusLabel);
		
		startBtn.setSize(50, 20);
		startBtn.setLocation(430, 360);
		startBtn.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent arg0) {
			PackingConfirm(distPathInput.getText());
		}});
		window.add(startBtn);
		
		window.setVisible(true);
	}
	
	private boolean addFile(String filePath)
	{
		if(filePath==null || filePath.trim().length()==0)
		{
			new MsgBox("Please input file path.");
			return false;
		}
		File file = new File(filePath);
		if(file.exists())
		{
			if(file.isDirectory())
			{
				File[] files = file.listFiles();
				for(int i=0; i<files.length; i++)
				{
					if(!files[i].isDirectory())
						fileList.add(fileList.getItemCount() + " - " + files[i].getAbsolutePath());
				}
				return true;
			}
			else
			{
				fileList.add(fileList.getItemCount() + " - " + filePath);
				return true;
			}
		}
		else
		{
			new MsgBox("File could not be found.");
			return false;
		}
	}
	
	private void upItem()
	{
		int index = fileList.getSelectedIndex();
		if(index<1)
			return;
		String tFilePath = fileList.getItem(index);
		tFilePath = tFilePath.substring(tFilePath.indexOf(" - ")+3);
		fileList.remove(index);
		fileList.add((index-1) + " - " + tFilePath, index-1);
		for(int i=index; i<fileList.getItemCount(); i++)
		{
			tFilePath = fileList.getItem(i);
			tFilePath = tFilePath.substring(tFilePath.indexOf(" - ")+3);
			fileList.remove(i);
			fileList.add(i + " - " + tFilePath, i);
		}
		fileList.select(index-1);
	}
	
	private void downItem()
	{
		int index = fileList.getSelectedIndex();
		if(index<0||index==(fileList.getItemCount()-1))
			return;
		String tFilePath = fileList.getItem(index);
		tFilePath = tFilePath.substring(tFilePath.indexOf(" - ")+3);
		fileList.remove(index);
		fileList.add((index+1) + " - " + tFilePath, index+1);
		for(int i=index; i<fileList.getItemCount(); i++)
		{
			tFilePath = fileList.getItem(i);
			tFilePath = tFilePath.substring(tFilePath.indexOf(" - ")+3);
			fileList.remove(i);
			fileList.add(i + " - " + tFilePath, i);
		}
		fileList.select(index+1);
	}

	private void PackingConfirm(String filePath)
	{
		if(fileList.getItemCount()==0)
		{
			new MsgBox("No files need to be packed.");
			return;
		}
		if(filePath==null || filePath.trim().length()==0)
		{
			new MsgBox("Please input file path.");
			return;
		}
		if(filePath.replace("\\", "/").indexOf("/")<0)
		{
			new MsgBox("Target file format error.");
			return;
		}
		File saveFile = new File(filePath);
		if(saveFile.exists())
		{
			if(saveFile.isDirectory())
				new MsgBox("Target file could not be directory.");
			else
				new MsgBox("Target file already exist.");
			return;
		}
		File folder = new File(saveFile.getParent());
		if(!folder.exists() && !folder.mkdirs())
		{
			new MsgBox("Fail to crete target folder.");
			return;
		}
		final Window confirmBox = new Window(window){public void paint(Graphics g) {
			g.drawRect(1, 1, 398, 198);
		}};
		confirmBox.setSize(400, 200);
		confirmBox.setLayout(null);
		confirmBox.setLocation(530, 400);
		confirmBox.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e)
		{
			confirmBox.dispose();
		}});

		Label typeLabel = new Label("File type:");
		typeLabel.setSize(60, 20);
		typeLabel.setLocation(20, 30);
		confirmBox.add(typeLabel);

		Label typeValueLabel = new Label(typeChice.getSelectedItem());
		typeValueLabel.setSize(60, 20);
		typeValueLabel.setLocation(90, 30);
		confirmBox.add(typeValueLabel);

		Label pathLabel = new Label("Save target:");
		pathLabel.setSize(60, 20);
		pathLabel.setLocation(20, 60);
		confirmBox.add(pathLabel);

		Label pathValueLabel = new Label(distPathInput.getText());
		pathValueLabel.setSize(60, 20);
		pathValueLabel.setLocation(90, 60);
		confirmBox.add(pathValueLabel);

		Label countLabel = new Label("File count:");
		countLabel.setSize(60, 20);
		countLabel.setLocation(20, 90);
		confirmBox.add(countLabel);

		Label countValueLabel = new Label(String.valueOf(fileList.getItemCount()));
		countValueLabel.setSize(60, 20);
		countValueLabel.setLocation(90, 90);
		confirmBox.add(countValueLabel);
		
		final Button okBtn = new Button("OK");
		okBtn.setSize(100, 20);
		okBtn.setLocation(70, 150);
		okBtn.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent arg0) {
			confirmBox.dispose();
			typeChice.setEnabled(false);
			addBtn.setEnabled(false);
			upBtn.setEnabled(false);
			delBtn.setEnabled(false);
			downBtn.setEnabled(false);
			startBtn.setEnabled(false);
			distPathInput.setEnabled(false);
			new Thread(){public void run(){
				process();
			}}.start();
		}});
		confirmBox.add(okBtn);
		
		final Button cancelBtn = new Button("Cancel");
		cancelBtn.setSize(100, 20);
		cancelBtn.setLocation(230, 150);
		cancelBtn.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent arg0) {
			confirmBox.dispose();
		}});
		confirmBox.add(cancelBtn);
		
		confirmBox.setVisible(true);
	}
	
	private void process()
	{
		FileOutputStream fos = null;
		try {
			int fileType = typeChice.getSelectedIndex();
			fos = new FileOutputStream(distPathInput.getText());

			statusLabel.setText("Counting index ......");
			int fileCount = fileList.getItemCount();
			fos.write(fileList.getItemCount()/0x100);
			fos.write(fileList.getItemCount()%0x100);
			fos.write(fileType);

			int index=fileCount*4+3;
			for(int i=0; i<fileCount; i++)
			{
				File file = new File(fileList.getItem(i).substring(fileList.getItem(i).indexOf(" - ")+3));
				if(index>Integer.MAX_VALUE)
					throw new Exception("Target file too large.");
				int lInt=0;
				
				fos.write(index/0x1000000);
				lInt=index%0x1000000;
				
				fos.write(lInt/0x10000);
				lInt=index%0x10000;
				
				fos.write(lInt/0x100);
				lInt=index%0x100;
				
				fos.write(lInt);
				
				System.out.println();
				index += (int)file.length();
			}

			for(int i=0; i<fileCount; i++)
			{
				File file = new File(fileList.getItem(i).substring(fileList.getItem(i).indexOf(" - ")+3));
				byte[] content = new byte[(int)file.length()];
				statusLabel.setText("Packing file ["+i+"] with length: "+content.length);
				FileInputStream fis = new FileInputStream(file);
				fis.read(content);
				for(int j=0; j<content.length; j++)
					content[j]=(byte)(content[j]+fileType+7);
				fos.write(content);
				fis.close();
			}
			fos.flush();
			statusLabel.setText("Files packed completed successful");
		} catch (Exception e) {
			statusLabel.setText("Error:"+e.toString());
			new File(distPathInput.getText()).delete();
		}
		try {
			fos.close();
		} catch (Exception e1) {}
		typeChice.setEnabled(true);
		addBtn.setEnabled(true);
		upBtn.setEnabled(true);
		delBtn.setEnabled(true);
		downBtn.setEnabled(true);
		startBtn.setEnabled(true);
		distPathInput.setEnabled(true);
	}

}

class CheckPackedFiles
{
	private Frame window=null;
	private Choice indexChice = new Choice(), typeChice = new Choice();
	private String loadedPackagePath = null;
	private Button viewBtn = new Button("View"), unpackBtn = new Button("Unpack");

	public CheckPackedFiles()
	{
		window = new Frame(){ public void paint(Graphics g) {
			g.drawLine(20, 70, 480, 70);
		}};
		window.setSize(500, 110);
		window.setLayout(null);
		window.setLocation((FunctionListForm.screenSize.width-500)/2, (FunctionListForm.screenSize.height-110)/2);
		window.setResizable(false);
		window.setBackground(Color.LIGHT_GRAY);
		window.setTitle("PackageViewer - StoryToolKit");
		window.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e)
		{
			window.dispose();
			FunctionListForm.CheckPackedFilesBtn.setEnabled(true);
		}});

		Label pathLabel = new Label("Package path:");
		pathLabel.setSize(80, 20);
		pathLabel.setLocation(20, 40);
		window.add(pathLabel);
		
		final TextField pathInput = new TextField();
		pathInput.setSize(310, 20);
		pathInput.setLocation(110, 40);
		window.add(pathInput);
		
		final Button loadBtn = new Button("Load");
		loadBtn.setSize(50, 20);
		loadBtn.setLocation(430, 40);
		loadBtn.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent arg0) {
			loadBtn.setEnabled(false);
			pathInput.setEnabled(false);
			indexChice.removeAll();
			typeChice.setEnabled(true);
			new Thread(){public void run(){
				loadPackage(pathInput.getText());
				loadBtn.setEnabled(true);
				pathInput.setEnabled(true);
			}}.start();
		}});
		window.add(loadBtn);

		Label indexLabel = new Label("File index:");
		indexLabel.setSize(80, 20);
		indexLabel.setLocation(20, 80);
		window.add(indexLabel);
		
		indexChice.setSize(50, 20);
		indexChice.setLocation(110, 80);
		window.add(indexChice);

		Label typeLabel = new Label("Package type:");
		typeLabel.setSize(80, 20);
		typeLabel.setLocation(180, 80);
		window.add(typeLabel);
		
		typeChice.setSize(60, 20);
		typeChice.setLocation(270, 80);
		typeChice.add("Image");
		typeChice.add("Audio");
		typeChice.add("Video");
		typeChice.add("Text");
		window.add(typeChice);
		
		viewBtn.setSize(50, 20);
		viewBtn.setLocation(370, 80);
		viewBtn.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent arg0) {
			if(loadedPackagePath==null)
				return;
			indexChice.setEnabled(false);
			viewBtn.setEnabled(false);
			unpackBtn.setEnabled(false);
			loadBtn.setEnabled(false);
			new Thread(){public void run(){
				startFile(indexChice.getSelectedIndex(), typeChice.getSelectedIndex());
				indexChice.setEnabled(true);
				viewBtn.setEnabled(true);
				unpackBtn.setEnabled(true);
				loadBtn.setEnabled(true);
			}}.start();
		}});
		window.add(viewBtn);
		
		unpackBtn.setSize(50, 20);
		unpackBtn.setLocation(430, 80);
		unpackBtn.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent arg0) {
			if(loadedPackagePath==null)
				return;
			indexChice.setEnabled(false);
			viewBtn.setEnabled(false);
			unpackBtn.setEnabled(false);
			loadBtn.setEnabled(false);
			new Thread(){public void run(){
				unpackAll(typeChice.getSelectedIndex());
				indexChice.setEnabled(true);
				viewBtn.setEnabled(true);
				unpackBtn.setEnabled(true);
				loadBtn.setEnabled(true);
			}}.start();
		}});
		window.add(unpackBtn);
		
		window.setVisible(true);
	}
	
	private void loadPackage(String filePath)
	{
		if(filePath==null || filePath.trim().length()==0)
		{
			new MsgBox("Please input the package path.");
			loadedPackagePath=null;
			return;
		}
		File file = new File(filePath);
		if(!file.exists() || !file.isFile())
		{
			new MsgBox("Package could not be found.");
			loadedPackagePath=null;
			return;
		}
		try {
			FileInputStream fis = new FileInputStream(file); 
			int count = fis.read();
			count = count*0x100+fis.read();
			typeChice.select(fis.read());
			fis.close();
			typeChice.setEnabled(false);
			for(int i=0; i<count; i++)
				indexChice.add(String.valueOf(i));
			loadedPackagePath=filePath;
		} catch (Exception e) {
			new MsgBox(e.toString());
			loadedPackagePath=null;
		}
	}
	
	private void startFile(int index, int type)
	{
		try {
			File f = new File(loadedPackagePath); 
			FileInputStream fis = new FileInputStream(f); 
			int count = fis.read();
			count = count*0x100+fis.read();
			fis.skip(index*4+1);
			
			int i1 = fis.read(), i2 = fis.read(), i3 = fis.read(), i4 = fis.read();
			int fIndex = i1*0x1000000+i2*0x10000+i3*0x100+i4;
			int fLength = 0;
			System.out.println(fIndex);
			
			if(index==count-1)
			{
				fLength = (int)f.length()-fIndex;
			}
			else
			{
				int ii1 = fis.read(), ii2 = fis.read(), ii3 = fis.read(), ii4 = fis.read();
				fLength = ii1*0x1000000+ii2*0x10000+ii3*0x100+ii4-fIndex;
				System.out.println(fLength);
				System.out.println((count-index-2)*4);
				fis.skip((count-index-2)*4);
			}
			System.out.println(fIndex-count*4-3);
			fis.skip(fIndex-count*4-3);
			byte[] bytes = new byte[fLength];
			fis.read(bytes);
			fis.close();
			File folder = new File("extract");
			folder.mkdirs();
			FileOutputStream writer = new FileOutputStream("extract/"+f.getName()+"."+index);	
			for(int i=0; i<bytes.length; i++)
			{
				bytes[i]=(byte)(bytes[i]-7-type);
				writer.write(bytes[i]);
			}
			writer.flush();
			writer.close();
			
			Runtime.getRuntime().exec("explorer "+folder.getAbsolutePath()).waitFor();
			
		} catch (Exception e) {
			new MsgBox(e.toString());
			e.printStackTrace();
		}
	}
	
	private void unpackAll(int type)
	{
		try {
			File f = new File(loadedPackagePath); 
			FileInputStream fis = new FileInputStream(f); 
			int count = fis.read();
			count = count*0x100+fis.read();
			fis.skip(1);
			int[] fileLengthes = new int[count];
			int i1 = fis.read(), i2 = fis.read(), i3 = fis.read(), i4 = fis.read();
			int fIndex = i1*0x1000000+i2*0x10000+i3*0x100+i4;
			for(int i=0; i<count; i++)
			{
				if(i==count-1)
				{
					fileLengthes[i] = (int)f.length()-fIndex;
				}
				else
				{
					int ii1 = fis.read(), ii2 = fis.read(), ii3 = fis.read(), ii4 = fis.read();
					int tIndex = ii1*0x1000000+ii2*0x10000+ii3*0x100+ii4;
					fileLengthes[i] = tIndex-fIndex;
					fIndex = tIndex;
				}
			}
			File path = new File("extract");
			path.mkdirs();
			for(int i=0; i<count; i++)
			{
				byte[] bytes = new byte[fileLengthes[i]];
				fis.read(bytes);
				FileOutputStream writer = new FileOutputStream("extract/"+f.getName()+"."+i);	
				for(int j=0; j<bytes.length; j++)
				{
					bytes[j]=(byte)(bytes[j]-7-type);
					writer.write(bytes[j]);
				}
				writer.flush();
				writer.close();
			}
			fis.close();
			
			Runtime.getRuntime().exec("explorer "+path.getAbsolutePath()).waitFor();
			
		} catch (Exception e) {
			new MsgBox(e.toString());
			e.printStackTrace();
		}
	}
}

class CalLocation
{
	private Frame window = null;
	private ArrayList images = new ArrayList();
	private TextField pathInput=new TextField(), strInput=new TextField(), sizeInput=new TextField("20"), fontInput=new TextField(),
				xInput=new TextField(), yInput=new TextField();
	private Button loadBtn=new Button("Open"), addBtn=new Button("Add"), delBtn=new Button("Delete"), locateBtn=new Button("Locate");
	private Label sizeLabel=new Label("Size:"), colorLabel=new Label("Color:"), fontLabel=new Label("Font:"),
				infoLabel = new Label("No selected"), xLabel = new Label("X:"), yLabel = new Label("Y:");
	private Choice colorChoice=new Choice();
	private ImageBean selectedImg = null;
	private Panel imgPanel = new Panel(){public void paint(Graphics g) {
		g.fillRect(0, 0, imgPanel.getWidth(), imgPanel.getHeight());
		for(int i=0; i<images.size(); i++)
		{
			ImageBean img = (ImageBean)images.get(i);
			g.drawImage(img.image, img.position_X, img.position_Y, img.width, img.height, null);
		}
		if(selectedImg!=null)
		{
			g.setColor(Color.WHITE);
			g.drawRect(selectedImg.position_X, selectedImg.position_Y, selectedImg.width, selectedImg.height);
		}
	}};
	private int mouseLocateInImg_X, mouseLocateInImg_Y;
	private ScrollPane sp = new ScrollPane(1);
	private boolean sizeKeyIned=false;
	private int sizeSelectIndex=0;
	
	public CalLocation()
	{
		window = new Frame(){ public void paint(Graphics g) {
			if(window.getWidth()<500 || window.getHeight()<300)
				window.setSize(500, 300);
			pathInput.setSize(window.getWidth()-190, 20);
			loadBtn.setLocation(window.getWidth()-70, 40);
			strInput.setSize((window.getWidth()-220)/2-120, 20);
			sizeLabel.setLocation((window.getWidth()-220)/2, 70);
			sizeInput.setLocation((window.getWidth()-220)/2+40, 70);
			colorLabel.setLocation((window.getWidth()-220)/2+100, 70);
			colorChoice.setLocation((window.getWidth()-220)/2+140, 70);
			fontLabel.setLocation((window.getWidth()-220)/2+200, 70);
			fontInput.setLocation((window.getWidth()-220)/2+240, 70);
			fontInput.setSize(window.getWidth()/2-210, 20);
			addBtn.setLocation(window.getWidth()-70, 70);
			infoLabel.setSize(window.getWidth()-260, 20);
			infoLabel.setLocation(20, window.getHeight()-30);
			sp.setSize(window.getWidth()-40, window.getHeight()-170);
			sp.doLayout();
			delBtn.setLocation(window.getWidth()-120, window.getHeight()-60);
			xLabel.setLocation(window.getWidth()-240, window.getHeight()-30);
			xInput.setLocation(window.getWidth()-220, window.getHeight()-30);
			yLabel.setLocation(window.getWidth()-160, window.getHeight()-30);
			yInput.setLocation(window.getWidth()-140, window.getHeight()-30);
			locateBtn.setLocation(window.getWidth()-80, window.getHeight()-30);
		}};
		window.setLayout(null);
		window.setSize(640, 480);
		window.setLocation((FunctionListForm.screenSize.width-640)/2, (FunctionListForm.screenSize.height-480)/2);
		window.setBackground(Color.LIGHT_GRAY);
		window.setTitle("Locater - StoryToolKit");
		window.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e)
		{
			window.dispose();
			FunctionListForm.LocateImageBtn.setEnabled(true);
		}});
		window.addComponentListener(new ComponentAdapter(){public void componentResized(ComponentEvent e) {
			window.repaint();
		}});

		Label pathLabel = new Label("Image path:");
		pathLabel.setSize(80, 20);
		pathLabel.setLocation(20, 40);
		window.add(pathLabel);
		
		pathInput.setLocation(110, 40);
		pathInput.addKeyListener(new KeyAdapter(){public void keyPressed(KeyEvent e) {
			if(e.getKeyCode()==KeyEvent.VK_ENTER)
				OpenImage(pathInput.getText());
		}});
		window.add(pathInput);
		
		loadBtn.setSize(50, 20);
		loadBtn.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent arg0) {
			OpenImage(pathInput.getText());
		}});
		window.add(loadBtn);

		Label strLabel = new Label("Text string:");
		strLabel.setSize(80, 20);
		strLabel.setLocation(20, 70);
		window.add(strLabel);
		
		strInput.setLocation(110, 70);
		window.add(strInput);

		sizeLabel.setSize(40, 20);
		window.add(sizeLabel);
		
		sizeInput.setSize(50, 20);
		sizeInput.addTextListener(new TextListener(){public void textValueChanged(TextEvent e) {
			if(!sizeKeyIned)
				return;
			StringBuffer buffer = new StringBuffer(sizeInput.getText());
			for(int i=0; i<buffer.length(); i++)
			{
				char c = buffer.charAt(i);
				if(c<'0'||c>'9')
				{
					buffer.deleteCharAt(i--);
					sizeSelectIndex--;
				}
				else if(i==0&&c=='0')
				{
					buffer.deleteCharAt(i--);
					sizeSelectIndex--;
				}
			}
			sizeKeyIned=false;
			sizeInput.setText(buffer.toString());
			sizeInput.setSelectionStart(sizeSelectIndex);
		}});
		sizeInput.addKeyListener(new KeyAdapter(){public void keyPressed(KeyEvent e) {
			sizeKeyIned=true;
			sizeSelectIndex = sizeInput.getSelectionStart()+1;
		}});
		sizeInput.addFocusListener(new FocusAdapter(){public void focusLost(FocusEvent e) {
			if(sizeInput.getText().equals(""))
				sizeInput.setText("20");
		}});
		window.add(sizeInput);
		
		colorLabel.setSize(40, 20);
		window.add(colorLabel);
		
		colorChoice.setSize(50, 20);
		colorChoice.add("BLACK");
		colorChoice.add("WHITE");
		colorChoice.add("RED");
		colorChoice.add("GREEN");
		colorChoice.add("BLUE");
		window.add(colorChoice);
		
		fontLabel.setSize(40, 20);
		window.add(fontLabel);
		
		window.add(fontInput);
		
		addBtn.setSize(50, 20);
		addBtn.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent arg0) {
			addBtn.setEnabled(false);
			addString(strInput.getText(), fontInput.getText());
			addBtn.setEnabled(true);
		}});
		window.add(addBtn);
		
		delBtn.setSize(100, 20);
		delBtn.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent arg0) {
			if(selectedImg!=null)
			{
				images.remove(selectedImg);
				noImgSelected();
			}
		}});
		window.add(delBtn);
		
		delBtn.setSize(100, 20);
		delBtn.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent arg0) {
			if(selectedImg!=null)
			{
				images.remove(selectedImg);
				noImgSelected();
			}
		}});
		window.add(delBtn);
		
//		imgPanel.setLocation(20, 70);
		imgPanel.addMouseListener(new MouseAdapter(){public void mousePressed(MouseEvent e) {
			selectImg(e.getX(), e.getY());
			if(selectedImg!=null)
			{
				mouseLocateInImg_X = e.getX()-selectedImg.position_X;
				mouseLocateInImg_Y = e.getY()-selectedImg.position_Y;
			}
		}});
		imgPanel.addMouseMotionListener(new MouseMotionAdapter(){public void mouseDragged(MouseEvent e) {
			if(selectedImg!=null)
			{
				selectedImg.position_X=e.getX()-mouseLocateInImg_X;
				selectedImg.position_Y=e.getY()-mouseLocateInImg_Y;
				xInput.setText(String.valueOf(selectedImg.position_X));
				yInput.setText(String.valueOf(selectedImg.position_Y));
				imgPanel.repaint();
			}
		}});
		imgPanel.addKeyListener(new KeyAdapter(){public void keyPressed(KeyEvent e) {
			if(selectedImg==null)
				return;
			switch(e.getKeyCode())
			{
			case KeyEvent.VK_UP:
				yInput.setText(String.valueOf(--selectedImg.position_Y));
				break;
			case KeyEvent.VK_DOWN:
				yInput.setText(String.valueOf(++selectedImg.position_Y));
				break;
			case KeyEvent.VK_LEFT:
				xInput.setText(String.valueOf(--selectedImg.position_X));
				break;
			case KeyEvent.VK_RIGHT:
				xInput.setText(String.valueOf(++selectedImg.position_X));
				break;
			case KeyEvent.VK_DELETE:
				if(selectedImg!=null)
				{
					images.remove(selectedImg);
					noImgSelected();
				}
				break;
			}
			imgPanel.repaint();
		}});
		
		sp.setLocation(20, 100);
		sp.add(imgPanel);
		window.add(sp);
		

		xLabel.setSize(20, 20);
		window.add(xLabel);
		
		xInput.setSize(50, 20);
		xInput.addFocusListener(new FocusAdapter(){public void focusLost(FocusEvent e) {
			if(selectedImg!=null)
			{
				try {
					selectedImg.position_X=Integer.parseInt(xInput.getText());
					imgPanel.repaint();
				} catch (Exception e1) {
					new MsgBox("Number format error.");
				}
			}
		}});
		xInput.addKeyListener(new KeyAdapter(){public void keyPressed(KeyEvent e) {
			if(e.getKeyCode()==KeyEvent.VK_ENTER && selectedImg!=null)
			{
				try {
					selectedImg.position_X=Integer.parseInt(xInput.getText());
					imgPanel.repaint();
				} catch (Exception e1) {
					new MsgBox("Number format error.");
				}
			}
		}});
		window.add(xInput);

		yLabel.setSize(20, 20);
		window.add(yLabel);
		
		yInput.setSize(50, 20);
		yInput.addFocusListener(new FocusAdapter(){public void focusLost(FocusEvent e) {
			if(selectedImg!=null)
			{
				try {
					selectedImg.position_Y=Integer.parseInt(yInput.getText());
					imgPanel.repaint();
				} catch (Exception e1) {
					new MsgBox("Number format error.");
				}
			}
		}});
		yInput.addKeyListener(new KeyAdapter(){public void keyPressed(KeyEvent e) {
			if(e.getKeyCode()==KeyEvent.VK_ENTER && selectedImg!=null)
			{
				try {
					selectedImg.position_Y=Integer.parseInt(yInput.getText());
					imgPanel.repaint();
				} catch (Exception e1) {
					new MsgBox("Number format error.");
				}
			}
		}});
		window.add(yInput);
		window.add(infoLabel);
		
		locateBtn.setSize(60, 20);
		locateBtn.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent arg0) {
			try {
				selectedImg.position_X=Integer.parseInt(xInput.getText());
				selectedImg.position_Y=Integer.parseInt(yInput.getText());
				imgPanel.repaint();
			} catch (Exception e1) {
				new MsgBox("Number format error.");
			}
		}});
		window.add(locateBtn);
		
		window.setVisible(true);
	}
	
	private class ImageBean
	{
		private Image image;
		private String fileName;
		private int position_X;
		private int position_Y;
		private int width;
		private int height;
	}
	
	private void OpenImage(String filePath)
	{
		if(filePath==null || filePath.trim().length()==0)
		{
			new MsgBox("Please input the image path.");
			return;
		}
		File file = new File(filePath);
		if(!file.exists() || !file.isFile())
		{
			new MsgBox("Image could not be found.");
			return;
		}
		ImageBean img = new ImageBean();
		try {
			img.image = ImageIO.read(file);
			img.fileName = file.getName();
			img.position_X=0;
			img.position_Y=0;
			img.width = img.image.getWidth(null);
			img.height = img.image.getHeight(null);
			images.add(img);
			pathInput.setText(null);
			imgPanel.setPreferredSize(new Dimension(Math.max(img.width, imgPanel.getWidth()),Math.max(img.height, imgPanel.getHeight())));
			imgPanel.repaint();
			sp.doLayout();
			window.repaint();
		} catch (Exception e) {
			new MsgBox(e.toString());
			e.printStackTrace();
		}
	}
	
	private void addString(String string, String fontFile)
	{
		if(string.trim().length()==0)
		{
			new MsgBox("Please input the text.");
			return;
		}
		int fontSize = Integer.parseInt(sizeInput.getText());
		Font font=null;
		if(fontFile.trim().length()>0)
		{
			File file = new File(fontFile);
			if(!file.exists() || !file.isFile())
			{
				new MsgBox("Font file could not be found.");
				return;
			}
			try {
				BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
				font = Font.createFont(Font.TRUETYPE_FONT, bis);
				font = font.deriveFont(Font.PLAIN, fontSize);
				bis.close();
			} catch (Exception e) {
				new MsgBox(e.toString());
				return;
			}
		}
		else
		{
			font=new Font("", Font.PLAIN, fontSize);
		}
		FontMetrics metrics = new BufferedImage(1,1,BufferedImage.TYPE_INT_ARGB).getGraphics().getFontMetrics(font);
		int width = metrics.stringWidth(string);
		int height = metrics.getHeight();
		BufferedImage strImg = new BufferedImage(width,height,BufferedImage.TYPE_INT_ARGB);
		Graphics g = strImg.getGraphics();
		g.setFont(font);
		switch(colorChoice.getSelectedIndex())
		{
		case 0:
			g.setColor(Color.BLACK);
			break;
		case 1:
			g.setColor(Color.WHITE);
			break;
		case 2:
			g.setColor(Color.RED);
			break;
		case 3:
			g.setColor(Color.GREEN);
			break;
		case 4:
			g.setColor(Color.BLUE);
			break;
		}
		g.drawString(string, 0, -(int) (font.getStringBounds(string, ((Graphics2D)g).getFontRenderContext()).getY()));
		ImageBean img = new ImageBean();
			img.image = strImg;
			img.fileName = string;
			img.position_X=0;
			img.position_Y=0;
			img.width = img.image.getWidth(null);
			img.height = img.image.getHeight(null);
			images.add(img);
			strInput.setText(null);
			imgPanel.setPreferredSize(new Dimension(Math.max(img.width, imgPanel.getWidth()),Math.max(img.height, imgPanel.getHeight())));
			imgPanel.repaint();
			sp.doLayout();
			window.repaint();
	}
	
	private void selectImg(int x, int y)
	{
		for(int i=images.size()-1; i>-1; i--)
		{
			ImageBean img = (ImageBean) images.get(i);
			if(img.position_X<x&&img.position_X+img.width>x&&img.position_Y<y&&img.position_Y+img.height>y)
			{
				selectedImg=img;
				infoLabel.setText(img.fileName+" ("+img.width+"x"+img.height+")");
				xInput.setText(String.valueOf(img.position_X));
				yInput.setText(String.valueOf(img.position_Y));
				imgPanel.repaint();
				return;
			}
		}
		noImgSelected();
	}
	
	private void noImgSelected()
	{
		infoLabel.setText("No selected");
		xInput.setText(null);
		yInput.setText(null);
		imgPanel.repaint();
		selectedImg=null;
	}
}

class AnimeCreater
{
	private Frame window = null;
	private List fileList = new List();
	private Button addBtn = new Button("Add"), upBtn = new Button("Up"), delBtn = new Button("Del"), downBtn = new Button("Down"), 
				playBtn = new Button("Play"), lPlayBtn = new Button("Loop-Play"), startBtn = new Button("Create");
	private ArrayList imageList = new ArrayList();
	private boolean sizeKeyIned=false, loopplaying=false;
	private int sizeSelectIndex, frameWidth=1, frameHeight=1;
	private ScrollPane imgSP = new ScrollPane(1);
	private Panel imgPanel = new Panel(){public void paint(Graphics g) {
		g.fillRect(0, 0, imgPanel.getWidth(), imgPanel.getHeight());
		int frameIndex = fileList.getSelectedIndex();
		if(frameIndex>-1&&frameIndex<imageList.size())
			g.drawImage((Image) imageList.get(frameIndex), 0, 0, null);
	}};
	
	public AnimeCreater()
	{
		window = new Frame(){ public void paint(Graphics g) {
			g.drawLine(20, 70, 580, 70);
			g.drawLine(300, 90, 300, 330);
			g.drawLine(20, 350, 580, 350);
		}};
		window.setSize(600, 400);
		window.setLayout(null);
		window.setLocation((FunctionListForm.screenSize.width-600)/2, (FunctionListForm.screenSize.height-400)/2);
		window.setBackground(Color.LIGHT_GRAY);
		window.setResizable(false);
		window.setTitle("PackFiles - StoryToolKit");
		window.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e)
		{
			window.dispose();
			FunctionListForm.CreateAnimeBtn.setEnabled(true);
		}});

		Label pathLabel = new Label("Image path:");
		pathLabel.setSize(80, 20);
		pathLabel.setLocation(20, 40);
		window.add(pathLabel);
		
		final TextField pathInput = new TextField();
		pathInput.setSize(410, 20);
		pathInput.setLocation(110, 40);
		pathInput.addKeyListener(new KeyAdapter(){public void keyPressed(KeyEvent e) {
			if(e.getKeyCode()==KeyEvent.VK_ENTER)
			{
				try {
					addFile(pathInput.getText());
					pathInput.setText(null);
				} catch (Exception e1) {
					new MsgBox(e1.toString());
					e1.printStackTrace();
					fileList.removeAll();
					imageList.clear();
				}
			}
		}});
		window.add(pathInput);
		
		addBtn.setSize(50, 20);
		addBtn.setLocation(530, 40);
		addBtn.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent arg0) {
			try {
				addFile(pathInput.getText());
				pathInput.setText(null);
			} catch (Exception e) {
				new MsgBox(e.toString());
				e.printStackTrace();
				fileList.removeAll();
				imageList.clear();
			}
		}});
		window.add(addBtn);
		
		fileList.setSize(200, 260);
		fileList.setLocation(20, 80);
		fileList.addItemListener(new ItemListener(){public void itemStateChanged(ItemEvent e) {
			imgPanel.repaint();	
		}});
		window.add(fileList);
		
		upBtn.setSize(40, 90);
		upBtn.setLocation(230, 80);
		upBtn.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent arg0) {
			upItem();
		}});
		window.add(upBtn);
		
		delBtn.setSize(40, 60);
		delBtn.setLocation(230, 180);
		delBtn.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent arg0) {
			int index = fileList.getSelectedIndex();
			if(index>-1)
			{
				fileList.remove(index);
				String tFilePath;
				for(int i=index; i<fileList.getItemCount(); i++)
				{
					tFilePath = fileList.getItem(i);
					tFilePath = tFilePath.substring(tFilePath.indexOf(" - ")+3);
					fileList.remove(i);
					fileList.add(i + " - " + tFilePath, i);
				}
			}
		}});
		window.add(delBtn);
		
		downBtn.setSize(40, 90);
		downBtn.setLocation(230, 250);
		downBtn.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent arg0) {
			downItem();
		}});
		window.add(downBtn);

		Label fpsLabel = new Label("FPS:");
		fpsLabel.setSize(35, 20);
		fpsLabel.setLocation(320, 80);
		window.add(fpsLabel);
		
		final TextField fpsInput = new TextField("60");
		fpsInput.setSize(50, 20);
		fpsInput.setLocation(355, 80);
		fpsInput.addTextListener(new TextListener(){public void textValueChanged(TextEvent e) {
			if(!sizeKeyIned)
				return;
			StringBuffer buffer = new StringBuffer(fpsInput.getText());
			for(int i=0; i<buffer.length(); i++)
			{
				char c = buffer.charAt(i);
				if(c<'0'||c>'9')
				{
					buffer.deleteCharAt(i--);
					sizeSelectIndex--;
				}
				else if(i==0&&c=='0')
				{
					buffer.deleteCharAt(i--);
					sizeSelectIndex--;
				}
			}
			sizeKeyIned=false;
			fpsInput.setText(buffer.toString());
			fpsInput.setSelectionStart(sizeSelectIndex);
		}});
		fpsInput.addKeyListener(new KeyAdapter(){public void keyPressed(KeyEvent e) {
			sizeKeyIned=true;
			sizeSelectIndex = fpsInput.getSelectionStart()+1;
		}});
		fpsInput.addFocusListener(new FocusAdapter(){public void focusLost(FocusEvent e) {
			if(fpsInput.getText().equals(""))
				fpsInput.setText("60");
		}});
		window.add(fpsInput);

		Label delayLabel = new Label("Duration:");
		delayLabel.setSize(60, 20);
		delayLabel.setLocation(470, 80);
		window.add(delayLabel);
		
		final TextField timeInput = new TextField("1");
		timeInput.setSize(50, 20);
		timeInput.setLocation(530, 80);
		timeInput.addTextListener(new TextListener(){public void textValueChanged(TextEvent e) {
			if(!sizeKeyIned)
				return;
			StringBuffer buffer = new StringBuffer(timeInput.getText());
			for(int i=0; i<buffer.length(); i++)
			{
				char c = buffer.charAt(i);
				if(c<'0'||c>'9')
				{
					buffer.deleteCharAt(i--);
					sizeSelectIndex--;
				}
				else if(i==0&&c=='0')
				{
					buffer.deleteCharAt(i--);
					sizeSelectIndex--;
				}
			}
			sizeKeyIned=false;
			timeInput.setText(buffer.toString());
			timeInput.setSelectionStart(sizeSelectIndex);
		}});
		timeInput.addKeyListener(new KeyAdapter(){public void keyPressed(KeyEvent e) {
			sizeKeyIned=true;
			sizeSelectIndex = timeInput.getSelectionStart()+1;
		}});
		timeInput.addFocusListener(new FocusAdapter(){public void focusLost(FocusEvent e) {
			if(timeInput.getText().equals(""))
				timeInput.setText("1");
		}});
		window.add(timeInput);
		
		imgSP.setSize(260, 200);
		imgSP.setLocation(320, 110);
		imgSP.add(imgPanel);
		window.add(imgSP);
		
		playBtn.setSize(100, 20);
		playBtn.setLocation(320, 320);
		playBtn.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent arg0) {
			if(fileList.getItemCount()<1)
				return;
			playBtn.setEnabled(false);
			lPlayBtn.setEnabled(false);
			upBtn.setEnabled(false);
			delBtn.setEnabled(false);
			downBtn.setEnabled(false);
			startBtn.setEnabled(false);
			fileList.select(0);
			new Thread(){public void run(){
				int waitTime = 1000*(Integer.parseInt(timeInput.getText()))/Integer.parseInt(fpsInput.getText());
				for(int i=0; i<fileList.getItemCount(); i++)
				{
					fileList.select(i);
					imgPanel.repaint();
					synchronized (this) {try {
						wait(waitTime);
					} catch (Exception e) {}}
				}
				playBtn.setEnabled(true);
				lPlayBtn.setEnabled(true);
				upBtn.setEnabled(true);
				delBtn.setEnabled(true);
				downBtn.setEnabled(true);
				startBtn.setEnabled(true);
			}}.start();
		}});
		window.add(playBtn);
		
		lPlayBtn.setSize(100, 20);
		lPlayBtn.setLocation(480, 320);
		lPlayBtn.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent arg0) {
			if(fileList.getItemCount()<1)
				return;
			if(loopplaying)
			{
				loopplaying=false;
				lPlayBtn.setLabel("Loop-Play");
			}
			else
			{
				playBtn.setEnabled(false);
				upBtn.setEnabled(false);
				delBtn.setEnabled(false);
				downBtn.setEnabled(false);
				startBtn.setEnabled(false);
				lPlayBtn.setLabel("Stop");
				loopplaying=true;
				new Thread(){public void run(){
					int waitTime = 1000*(Integer.parseInt(timeInput.getText()))/Integer.parseInt(fpsInput.getText());
					for(int i=0; i<fileList.getItemCount() && loopplaying; i++)
					{
						fileList.select(i);
						imgPanel.repaint();
						synchronized (this) {try {
							wait(waitTime);
						} catch (Exception e) {}}
						if(i==fileList.getItemCount()-1)
							i=-1;
					}
					playBtn.setEnabled(true);
					upBtn.setEnabled(true);
					delBtn.setEnabled(true);
					downBtn.setEnabled(true);
					startBtn.setEnabled(true);
				}}.start();
			}
		}});
		window.add(lPlayBtn);

		Label distPathLabel = new Label("Animation save path:");
		distPathLabel.setSize(120, 20);
		distPathLabel.setLocation(20, 360);
		window.add(distPathLabel);
		
		final TextField distPathInput = new TextField();
		distPathInput.setSize(380, 20);
		distPathInput.setLocation(140, 360);
		window.add(distPathInput);
		
		startBtn.setSize(50, 20);
		startBtn.setLocation(530, 360);
		startBtn.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent arg0) {
			createConfirm(distPathInput.getText(),fileList.getItemCount(), Integer.parseInt(timeInput.getText()));
		}});
		window.add(startBtn);
		
		window.setVisible(true);
	}
	
	private void addFile(String filePath) throws Exception
	{
		if(filePath==null || filePath.trim().length()==0)
		{
			new MsgBox("Please input file path.");
			return;
		}
		File file = new File(filePath);
		if(file.exists())
		{
			if(file.isDirectory())
			{
				File[] files = file.listFiles();
				for(int i=0; i<files.length; i++)
				{
					if(!files[i].isDirectory())
					{
						fileList.add(fileList.getItemCount() + " - " + files[i].getName());
						Image img = ImageIO.read(files[i]);
						imageList.add(img);
						imgPanel.setPreferredSize(new Dimension(Math.max(img.getWidth(null), imgPanel.getWidth()),
								Math.max(img.getHeight(null), imgPanel.getHeight())));
						frameWidth = Math.max(img.getWidth(null), frameWidth);
						frameHeight = Math.max(img.getHeight(null), frameHeight);
						imgSP.doLayout();
						fileList.select(fileList.getItemCount()-1);
						imgPanel.repaint();
					}
				}
			}
			else
			{
				fileList.add(fileList.getItemCount() + " - " + file.getName());
				Image img = ImageIO.read(file);
				imageList.add(img);
				imgPanel.setPreferredSize(new Dimension(Math.max(img.getWidth(null), imgPanel.getWidth()),
						Math.max(img.getHeight(null), imgPanel.getHeight())));
				frameWidth = Math.max(img.getWidth(null), frameWidth);
				frameHeight = Math.max(img.getHeight(null), frameHeight);
				imgSP.doLayout();
				fileList.select(fileList.getItemCount()-1);
				imgPanel.repaint();
			}
		}
		else
		{
			new MsgBox("File could not be found.");
		}
	}
	
	private void upItem()
	{
		int index = fileList.getSelectedIndex();
		if(index<1)
			return;
		String tFilePath = fileList.getItem(index);
		tFilePath = tFilePath.substring(tFilePath.indexOf(" - ")+3);
		fileList.remove(index);
		fileList.add((index-1) + " - " + tFilePath, index-1);
		imageList.add(index-1, imageList.remove(index));
		for(int i=index; i<fileList.getItemCount(); i++)
		{
			tFilePath = fileList.getItem(i);
			tFilePath = tFilePath.substring(tFilePath.indexOf(" - ")+3);
			fileList.remove(i);
			fileList.add(i + " - " + tFilePath, i);
		}
		fileList.select(index-1);
		imgPanel.repaint();
	}
	
	private void downItem()
	{
		int index = fileList.getSelectedIndex();
		if(index<0||index==(fileList.getItemCount()-1))
			return;
		String tFilePath = fileList.getItem(index);
		tFilePath = tFilePath.substring(tFilePath.indexOf(" - ")+3);
		fileList.remove(index);
		fileList.add((index+1) + " - " + tFilePath, index+1);
		imageList.add(index+1, imageList.remove(index));
		for(int i=index; i<fileList.getItemCount(); i++)
		{
			tFilePath = fileList.getItem(i);
			tFilePath = tFilePath.substring(tFilePath.indexOf(" - ")+3);
			fileList.remove(i);
			fileList.add(i + " - " + tFilePath, i);
		}
		fileList.select(index+1);
		imgPanel.repaint();
	}

	private void createConfirm(final String filePath, final int count, final int duration)
	{
		if(count==0)
		{
			new MsgBox("No image to be created.");
			return;
		}
		if(filePath==null || filePath.trim().length()==0)
		{
			new MsgBox("Please input file path.");
			return;
		}
		if(filePath.replace("\\", "/").indexOf("/")<0)
		{
			new MsgBox("Target file format error.");
			return;
		}
		File saveFile = new File(filePath);
		if(saveFile.exists())
		{
			if(saveFile.isDirectory())
				new MsgBox("Target file could not be directory.");
			else
				new MsgBox("Target file already exist.");
			return;
		}
		File folder = new File(saveFile.getParent());
		if(!folder.exists() && !folder.mkdirs())
		{
			new MsgBox("Fail to crete target folder.");
			return;
		}
		final Window confirmBox = new Window(window){public void paint(Graphics g) {
			g.drawRect(0, 0, 399, 199);
		}};
		confirmBox.setSize(400, 200);
		confirmBox.setLayout(null);
		confirmBox.setLocation((FunctionListForm.screenSize.width-400)/2, (FunctionListForm.screenSize.height-200)/2);

		Label typeLabel = new Label("Save target:");
		typeLabel.setSize(100, 20);
		typeLabel.setLocation(20, 30);
		confirmBox.add(typeLabel);

		Label typeValueLabel = new Label(filePath);
		typeValueLabel.setSize(260, 20);
		typeValueLabel.setLocation(120, 30);
		confirmBox.add(typeValueLabel);

		Label pathLabel = new Label("Frame count:");
		pathLabel.setSize(100, 20);
		pathLabel.setLocation(20, 60);
		confirmBox.add(pathLabel);

		Label pathValueLabel = new Label(String.valueOf(count));
		pathValueLabel.setSize(260, 20);
		pathValueLabel.setLocation(120, 60);
		confirmBox.add(pathValueLabel);

		Label countLabel = new Label("Frame duration:");
		countLabel.setSize(100, 20);
		countLabel.setLocation(20, 90);
		confirmBox.add(countLabel);

		Label countValueLabel = new Label(String.valueOf(duration));
		countValueLabel.setSize(260, 20);
		countValueLabel.setLocation(120, 90);
		confirmBox.add(countValueLabel);
		
		final Button okBtn = new Button("OK");
		okBtn.setSize(100, 20);
		okBtn.setLocation(70, 150);
		okBtn.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent arg0) {
			confirmBox.dispose();
			new Thread(){public void run(){
				process(filePath, count, duration);
			}}.start();
		}});
		confirmBox.add(okBtn);
		
		final Button cancelBtn = new Button("Cancel");
		cancelBtn.setSize(100, 20);
		cancelBtn.setLocation(230, 150);
		cancelBtn.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent arg0) {
			confirmBox.dispose();
		}});
		confirmBox.add(cancelBtn);
		
		confirmBox.setVisible(true);
		okBtn.requestFocus();
	}
	
	private void process(String savePath, int frameCount, int duration)
	{
		playBtn.setEnabled(false);
		lPlayBtn.setEnabled(false);
		upBtn.setEnabled(false);
		delBtn.setEnabled(false);
		downBtn.setEnabled(false);
		startBtn.setEnabled(false);

		BufferedImage fileImg = new BufferedImage(frameWidth*frameCount, frameHeight, BufferedImage.TYPE_INT_ARGB); 
		Graphics g = fileImg.getGraphics();
		for(int i=0; i<frameCount; i++)
		{
			g.drawImage((Image) imageList.get(i), i*frameWidth, 0, null);
		}
		g.dispose();
		File imgFile = new File(savePath);
		try {
			ImageIO.write(fileImg, "png", imgFile);
			FileWriter writer = new FileWriter(savePath+".pf");
			writer.write("#Please do not amend manual.\n");
			writer.write("IMAGE_PATH="+imgFile.getName()+".pf\n");
			writer.write("FRAME_COUNT="+frameCount+"\n");
			writer.write("FRAME_DURATION="+duration);
			writer.flush();
			writer.close();
		} catch (Exception e) {
			new MsgBox(e.toString());
			e.printStackTrace();
			new File(savePath).delete();
			new File(imgFile.getName()+".pf").delete();
		} 
		new MsgBox("Completed");
		
		playBtn.setEnabled(true);
		lPlayBtn.setEnabled(true);
		upBtn.setEnabled(true);
		delBtn.setEnabled(true);
		downBtn.setEnabled(true);
		startBtn.setEnabled(true);
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值