package com.javaxyq.tools;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSeparator;
import javax.swing.JViewport;
import javax.swing.SwingUtilities;
import com.javaxyq.ui.CenterLayout;
import com.javaxyq.util.Utils;
/**
* ��ͼ���빤��
* @author dewitt
* @date 2009-09-21 create
*/
public class MasksTool extends javax.swing.JFrame {
/** */
private static final int CELL_WIDTH = 20;
private JMenuItem helpMenuItem;
private JMenu jMenu5;
private JMenuItem deleteMenuItem;
private JSeparator jSeparator1;
private JMenuItem pasteMenuItem;
private JMenuItem copyMenuItem;
private JMenuItem cutMenuItem;
private JMenu jMenu4;
private JMenuItem exitMenuItem;
private JSeparator jSeparator2;
private JMenuItem closeFileMenuItem;
private JMenuItem saveAsMenuItem;
private JMenuItem saveMenuItem;
private JMenuItem openFileMenuItem;
private JMenuItem newFileMenuItem;
private JMenu jMenu3;
private JMenuBar jMenuBar1;
private JPanel mainPanel;
private JMap map;
private String filename;
private JScrollPane mapPanel;
private int sceneWidth;
private int sceneHeight;
private String path;
private Color markColor = new Color(192, 0, 0, 80);
Color lineColor = new Color(128,0,0,120);
/**
* Auto-generated main method to display this JFrame
*/
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
MasksTool inst = new MasksTool();
inst.setLocationRelativeTo(null);
inst.setVisible(true);
}
});
}
public MasksTool() {
super();
initGUI();
}
private void initGUI() {
try {
{
jMenuBar1 = new JMenuBar();
setJMenuBar(jMenuBar1);
{
jMenu3 = new JMenu();
jMenuBar1.add(jMenu3);
jMenu3.setText("File");
{
openFileMenuItem = new JMenuItem();
jMenu3.add(openFileMenuItem);
openFileMenuItem.setText("Open");
openFileMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
openMap();
}
});
}
{
saveMenuItem = new JMenuItem();
jMenu3.add(saveMenuItem);
saveMenuItem.setText("Save");
saveMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
saveMasks();
}
});
}
{
saveAsMenuItem = new JMenuItem();
jMenu3.add(saveAsMenuItem);
saveAsMenuItem.setText("Save As ...");
}
{
closeFileMenuItem = new JMenuItem();
jMenu3.add(closeFileMenuItem);
closeFileMenuItem.setText("Close");
}
{
jSeparator2 = new JSeparator();
jMenu3.add(jSeparator2);
}
{
exitMenuItem = new JMenuItem();
jMenu3.add(exitMenuItem);
exitMenuItem.setText("Exit");
}
}
{
jMenu4 = new JMenu();
jMenuBar1.add(jMenu4);
jMenu4.setText("Edit");
{
cutMenuItem = new JMenuItem();
jMenu4.add(cutMenuItem);
cutMenuItem.setText("Cut");
}
{
copyMenuItem = new JMenuItem();
jMenu4.add(copyMenuItem);
copyMenuItem.setText("Copy");
}
{
pasteMenuItem = new JMenuItem();
jMenu4.add(pasteMenuItem);
pasteMenuItem.setText("Paste");
}
{
jSeparator1 = new JSeparator();
jMenu4.add(jSeparator1);
}
{
deleteMenuItem = new JMenuItem();
jMenu4.add(deleteMenuItem);
deleteMenuItem.setText("Delete");
}
}
{
jMenu5 = new JMenu();
jMenuBar1.add(jMenu5);
jMenu5.setText("Help");
{
helpMenuItem = new JMenuItem();
jMenu5.add(helpMenuItem);
helpMenuItem.setText("Help");
}
}
}
{
mainPanel = new JPanel(new BorderLayout());
map = new JMap() {
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Rectangle rect = this.getVisibleRect();
int gx = rect.x - rect.x % CELL_WIDTH;
int gy = rect.y - rect.y % CELL_WIDTH;
for (int x = gx, maxX = rect.x+rect.width; x < maxX; x += CELL_WIDTH) {
// ������
g.setColor(lineColor);
g.drawLine(x, rect.y, x, rect.y + rect.height);
for (int y = gy, maxY = rect.y+rect.height; y < maxY; y += CELL_WIDTH) {
// ������
g.setColor(lineColor);
g.drawLine(rect.x, y, rect.x + rect.width, y);
//��������
try {
if(isMark(x, y)) {
g.setColor(markColor);
g.fillRect(x, y, CELL_WIDTH, CELL_WIDTH);
}
} catch (Exception e) {
//e.printStackTrace();
}
}
}
}
};
//��갴���¼�
map.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
if(!e.isAltDown()&& e.getButton()==MouseEvent.BUTTON1) {
mark(e.getX(), e.getY());
}else if(e.getButton() == MouseEvent.BUTTON3 || e.isAltDown()) {
unmark(e.getX(), e.getY());
}
//map.repaint();
map.paintImmediately(e.getX()-CELL_WIDTH,e.getY()-CELL_WIDTH,2*CELL_WIDTH,2*CELL_WIDTH);
}
});
//�����ҷ
map.addMouseMotionListener(new MouseAdapter() {
public void mouseDragged(MouseEvent e) {
int paintX = e.getX()-CELL_WIDTH;
int paintY = e.getY()-CELL_WIDTH;
int paintWidth = 2*CELL_WIDTH;
int paintHeight = 2*CELL_WIDTH;
if(e.isAltDown()) {
unmark(e.getX(), e.getY());
}else if(e.isControlDown()){
mark(e.getX()-CELL_WIDTH, e.getY()-CELL_WIDTH);
mark(e.getX()-CELL_WIDTH, e.getY());
mark(e.getX(), e.getY());
mark(e.getX(), e.getY()+CELL_WIDTH);
mark(e.getX()+CELL_WIDTH, e.getY()+CELL_WIDTH);
paintX -= CELL_WIDTH;
paintY -= CELL_WIDTH;
paintWidth *=2;
paintHeight *=2;
}else {
mark(e.getX(), e.getY());
}
map.paintImmediately(paintX,paintY,paintWidth,paintHeight);
}
// public void mouseMoved(MouseEvent e) {
// System.out.println("move");
// }
});
JPanel panel = new JPanel(new CenterLayout());
panel.add("Center", map);
mapPanel = new JScrollPane(panel);
mainPanel.add(mapPanel, BorderLayout.CENTER);
setContentPane(mainPanel);
}
setTitle("Masks Builder");
setSize(800, 600);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* ���
* @param x
* @param y
*/
private void mark(int x, int y) {
int sx = x / CELL_WIDTH;
int sy = y / CELL_WIDTH;
int pos = sx + sy * sceneWidth;
//System.out.println("mark: ("+sx+","+sy+")");
masks[pos] = 1;
}
private boolean isMark(int x, int y) {
int sx = x / CELL_WIDTH;
int sy = y / CELL_WIDTH;
int pos = sx + sy * sceneWidth;
return masks[pos]>0;
}
/**
* ȡ�����
* @param x
* @param y
*/
private void unmark(int x, int y) {
int sx = x / CELL_WIDTH;
int sy = y / CELL_WIDTH;
int pos = sx + sy * sceneWidth;
//System.out.println("unmark: ("+sx+","+sy+")");
masks[pos] = 0;
}
private void openMap() {
File[] files = Utils.showOpenDialog(this, "��ͼ", Utils.MAP_FILTER);
if (files != null) {
File file = files[0];
boolean b = map.loadMap(file);
filename = file.getName();
path = file.getPath();
if (b) {
setTitle("Masks Builder - " + filename);
JViewport viewport = mapPanel.getViewport();
viewport.setViewPosition(new Point());
viewport.setViewSize(map.getMapSize());
System.out.println("��ͼ�Ѵ�:" + file.getAbsolutePath());
Dimension mapsize = map.getMapSize();
System.out.println("��ͼ��С��" + mapsize.width+"*"+mapsize.height);
sceneWidth = mapsize.width / CELL_WIDTH;
sceneHeight = mapsize.height / CELL_WIDTH;
masks = new byte[sceneWidth * sceneHeight];
System.out.println("Steps: " + sceneWidth + "*" + sceneHeight);
String maskfilename = path.replace(".map", ".msk");
loadMask(maskfilename);
} else {
JOptionPane.showMessageDialog(this, "��ͼ�ļ�ʧ��:" + filename, "����", JOptionPane.ERROR_MESSAGE);
System.err.println("��ͼ��ʧ��");
}
}
}
private byte[] masks;
private void saveMasks() {
String maskfilename = path.replace(".map", ".msk");
try {
FileOutputStream fos = new FileOutputStream(maskfilename);
PrintWriter pw = new PrintWriter(fos);
for (int i = 0; i < masks.length; i++) {
pw.print(masks[i]==0?'0':'1');
if(i%sceneWidth==sceneWidth-1) {
pw.println();
}
}
pw.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
/**
* ���ص�ͼ������
*
* @param filename
*/
public void loadMask(String filename) {
System.out.println("map steps: " + sceneWidth + "*" + sceneHeight);
masks = new byte[sceneWidth * sceneHeight];
try {
InputStream in = new FileInputStream(filename);
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String str;
int pos = 0;
while ((str = reader.readLine()) != null) {
int len = str.length();
for (int i = 0; i < len; i++) {
masks[pos++] = (byte) (str.charAt(i) - '0');
}
}
} catch (UnsupportedEncodingException e) {
System.out.println("���ص�ͼ����ʧ�ܣ�filename=" + filename+", "+e.toString());
} catch (IOException e) {
System.out.println("���ص�ͼ����ʧ�ܣ�" + e.toString());
}
}
}