- display cell as hexagon is Display.mHexagon if set ( not default ) will need a checkbox to set this - various new models preparation...
288 lines
8.0 KiB
Java
288 lines
8.0 KiB
Java
package org.artisanlogiciel.games.maze.gui;
|
|
|
|
import org.artisanlogiciel.games.maze.LabyModel;
|
|
import org.artisanlogiciel.games.maze.Maze;
|
|
import org.artisanlogiciel.games.maze.MazeParams;
|
|
import org.artisanlogiciel.games.maze.MazeParamsFixed;
|
|
import org.artisanlogiciel.games.maze.persist.MazePersistRaw;
|
|
import org.artisanlogiciel.games.maze.solve.SolvingModel;
|
|
import org.artisanlogiciel.graphics.Drawing;
|
|
import org.artisanlogiciel.xpm.Xpm;
|
|
|
|
import javax.imageio.ImageIO;
|
|
import javax.swing.*;
|
|
import java.awt.*;
|
|
import java.awt.image.BufferedImage;
|
|
import java.io.File;
|
|
import java.io.FileInputStream;
|
|
import java.io.IOException;
|
|
import java.util.Locale;
|
|
|
|
/**
|
|
* Display is Main JFrame for this tool
|
|
**/
|
|
public class Display extends Maze
|
|
implements StatusListener
|
|
{
|
|
// to please eclipse, not supposed to be serialized
|
|
private static final long serialVersionUID = 8500214871372184418L;
|
|
|
|
MazeComponent maze;
|
|
MazeControler controler;
|
|
|
|
boolean autoSize;
|
|
|
|
public boolean isStatusEnable() {
|
|
return statusEnable;
|
|
}
|
|
|
|
public void setStatusEnable(boolean statusEnable) {
|
|
this.statusEnable = statusEnable;
|
|
}
|
|
|
|
public void addDrawing(Drawing drawing, boolean add)
|
|
{
|
|
if (maze != null)
|
|
{
|
|
maze.addDrawing(drawing,add);
|
|
}
|
|
}
|
|
|
|
boolean statusEnable = true;
|
|
boolean mGrow = false;
|
|
boolean mHexagon = false;
|
|
|
|
JTextField statusField = null;
|
|
|
|
Maze3dSettings stlsettings;
|
|
|
|
MazeFrame mazeFrame;
|
|
|
|
private class MazeFrame extends JFrame
|
|
{
|
|
MazeFrame(LabyModel model, int W, int H, MazeParams params) {
|
|
super(MazeDefault.labels.getString("title"));
|
|
maze = createMazeComponent(model, W, H);
|
|
|
|
Container con = this.getContentPane();
|
|
JScrollPane scrollableMaze = new JScrollPane(maze);
|
|
con.add(scrollableMaze, BorderLayout.CENTER);
|
|
controler = new MazeControler(Display.this, params);
|
|
con.add(controler.getMoveControl(), BorderLayout.NORTH);
|
|
con.add(controler.getGenerationControl(), BorderLayout.SOUTH);
|
|
|
|
/*
|
|
scrollableMaze.addComponentListener(new ComponentAdapter() {
|
|
@Override
|
|
public void componentResized(ComponentEvent e) {
|
|
if (autoSize) {
|
|
maze.getAutoSize();
|
|
}
|
|
}
|
|
});
|
|
*/
|
|
|
|
|
|
model.setMazeListener(maze);
|
|
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
|
setBounds(W, H, W, H);
|
|
setVisible(true);
|
|
}
|
|
|
|
}
|
|
|
|
public Display(LabyModel model, int W, int H, MazeParams params)
|
|
{
|
|
super(model);
|
|
mazeFrame = new MazeFrame(model,W,H,params);
|
|
if (params != null) {
|
|
// fixedParams = new MazeParamsFixed(params.getSaveDir(),params.getWidth(),params.getHeight(),params.getMaxDepth());
|
|
this.params = params;
|
|
}
|
|
}
|
|
|
|
private MazeComponent createMazeComponent(LabyModel model, int W, int H) {
|
|
|
|
MazeCellParameters cp = mHexagon ? new HexagonCell(model.getWidth(), model.getHeight(), W, H, 0, 0) : new MazeCellParameters(model.getWidth(), model.getHeight(), W, H, 0, 0);
|
|
MazeComponent comp = new MazeComponent(model, cp, this);
|
|
Xpm xpm = new Xpm();
|
|
try {
|
|
xpm.parse(new FileInputStream(MazeDefault.getInstance().getXpmBackground()));
|
|
comp.setXpm(xpm);
|
|
}
|
|
catch(Exception e)
|
|
{
|
|
System.err.println("Missing background file " + e);
|
|
}
|
|
return comp;
|
|
}
|
|
|
|
void recreateModel() {
|
|
// recreate labyrinth
|
|
if (params != null) {
|
|
|
|
// Keep current model to be able to complete a manualy edited one
|
|
maze.resetWallsProvider(model);
|
|
model.setMazeListener(maze);
|
|
|
|
model.reset();
|
|
|
|
// we are in GUI event thread, need to release it and do it outside.
|
|
new Thread() {
|
|
public void run() {
|
|
model.generateWithEntry(0, 0);
|
|
model.addEntryOrExit(-1, 0);
|
|
model.addEntryOrExit(params.getWidth(), params.getHeight() - 1);
|
|
}
|
|
}.start();
|
|
}
|
|
}
|
|
|
|
void resetModel() {
|
|
// recreate labyrinth
|
|
if (params != null) {
|
|
params = controler.getSettings().resetParams();
|
|
setModel(new LabyModel(params));
|
|
refresh();
|
|
}
|
|
}
|
|
|
|
@Override
|
|
protected void refresh()
|
|
{
|
|
// reinit labyrinth view
|
|
if (params != null) {
|
|
maze.resetWallsProvider(model);
|
|
model.setMazeListener(maze);
|
|
|
|
// we are in GUI event thread, need to release it and do it outside.
|
|
new Thread() {
|
|
public void run() {
|
|
maze.changed(null, null, model);
|
|
}
|
|
}.start();
|
|
}
|
|
}
|
|
|
|
void resolve() {
|
|
|
|
SolvingModel solving = new SolvingModel(model);
|
|
// should transform current model to be a SolvingModel
|
|
model = solving;
|
|
model.reset();
|
|
solving.resolve(solving.getWidth() - 1, solving.getHeight() - 1, maze);
|
|
}
|
|
|
|
boolean reverse(boolean grow) {
|
|
boolean done = model.reverse(grow);
|
|
if ( done ) {
|
|
refresh();
|
|
}
|
|
return done;
|
|
}
|
|
|
|
void goNorth() {
|
|
maze.goNorth();
|
|
}
|
|
|
|
void goSouth() {
|
|
maze.goSouth();
|
|
}
|
|
|
|
void goEast() {
|
|
maze.goEast();
|
|
}
|
|
|
|
void goWest() {
|
|
maze.goWest();
|
|
}
|
|
|
|
void setWallSize(int size) {
|
|
maze.setWallSize(size);
|
|
}
|
|
|
|
void setAutoSize(boolean autoSize) {
|
|
this.autoSize = autoSize;
|
|
if (autoSize) {
|
|
maze.getAutoSize();
|
|
}
|
|
}
|
|
|
|
public void addStatus(String pStatus)
|
|
{
|
|
if ( statusEnable ) {
|
|
statusField.setText(pStatus);
|
|
}
|
|
}
|
|
|
|
JButton addDirection(final JPanel panel, final String direction, String key, Action goAction) {
|
|
String actionName = "go" + direction;
|
|
JButton button = new JButton(direction);
|
|
button.addActionListener(goAction);
|
|
KeyStroke keystroke = KeyStroke.getKeyStroke(key);
|
|
// attach keys to maze
|
|
maze.getInputMap().put(keystroke, actionName);
|
|
maze.getActionMap().put(actionName, goAction);
|
|
return button;
|
|
}
|
|
|
|
private static void setupDisplay(LabyModel model, int W, int H, MazeParams params) {
|
|
Display display = new Display(model, W, H, params);
|
|
}
|
|
|
|
|
|
/**
|
|
* Not part of generic Maze since using ImageIo and Graphics
|
|
*/
|
|
void savePng() {
|
|
File file = getFileForExtension("png");
|
|
// BufferedImage bi = new BufferedImage(this.getSize().width, this.getSize().height, BufferedImage.TYPE_INT_ARGB);
|
|
BufferedImage bi = new BufferedImage(maze.getSize().width, maze.getSize().height, BufferedImage.TYPE_INT_ARGB);
|
|
Graphics g = bi.createGraphics();
|
|
// this.paint(g);
|
|
maze.paint(g);
|
|
g.dispose();
|
|
try {
|
|
ImageIO.write(bi, "png", file);
|
|
} catch (Exception e) {
|
|
e.printStackTrace();
|
|
}
|
|
}
|
|
|
|
public static void main(String pArgs[]) {
|
|
LabyModel model = null;
|
|
int W = 600;
|
|
int H = 400;
|
|
|
|
System.out.println("Default Locale " + Locale.getDefault());
|
|
|
|
if ((pArgs.length > 0) && (pArgs[0].length() > 0)) {
|
|
try {
|
|
model = new MazePersistRaw().parseInputStream("raw",new FileInputStream(pArgs[0]));
|
|
} catch (IOException io) {
|
|
io.printStackTrace(System.err);
|
|
System.exit(1);
|
|
}
|
|
|
|
setupDisplay(model, W, H, null);
|
|
} else {
|
|
MazeParamsFixed params = new MazeParamsFixed(MazeDefault.getInstance().getParams());
|
|
model = new LabyModel(params);
|
|
|
|
setupDisplay(model, W, H, params);
|
|
|
|
/*
|
|
model.generateWithEntry(0, 0);
|
|
|
|
model.addEntryOrExit(-1, 0);
|
|
model.addEntryOrExit(params.getWidth(), params.getHeight() - 1);
|
|
|
|
addStatus("Generation completed");
|
|
*/
|
|
/*
|
|
*/
|
|
}
|
|
|
|
}
|
|
}
|