1 package de.lathanda.eos.robot.gui;
3 import java.awt.BorderLayout;
5 import java.awt.Component;
6 import java.awt.GridLayout;
7 import java.awt.event.ActionEvent;
8 import java.awt.event.ActionListener;
9 import java.awt.event.KeyEvent;
10 import java.awt.event.KeyListener;
12 import java.io.FileInputStream;
13 import java.io.FileOutputStream;
14 import java.io.IOException;
15 import java.util.TreeMap;
17 import javax.swing.JButton;
18 import javax.swing.JColorChooser;
19 import javax.swing.JFileChooser;
20 import javax.swing.JFrame;
21 import javax.swing.JLabel;
22 import javax.swing.JOptionPane;
23 import javax.swing.JPanel;
24 import javax.swing.JTextField;
25 import javax.swing.event.DocumentEvent;
26 import javax.swing.event.DocumentListener;
27 import javax.swing.filechooser.FileNameExtensionFilter;
28 import javax.xml.parsers.ParserConfigurationException;
29 import javax.xml.transform.TransformerException;
31 import de.lathanda.eos.base.MutableColor;
32 import de.lathanda.eos.base.util.GuiToolkit;
33 import de.lathanda.eos.robot.World;
34 import de.lathanda.eos.robot.World.IntRange;
35 import de.lathanda.eos.robot.exceptions.RobotException;
37 import static de.lathanda.eos.robot.icons.Icons.*;
38 import static de.lathanda.eos.base.icons.Icons.*;
39 import static de.lathanda.eos.robot.text.Text.TEXT;
45 public class WorldEditor extends JFrame implements KeyListener, DocumentListener {
46 private static final long serialVersionUID = -3910302047095245337L;
48 private Component view;
49 private final JFileChooser filechooser;
50 private JPanel editorToolbar;
51 private JButton btnUp;
52 private JButton btnDown;
53 private JButton btnLeft;
54 private JButton btnRight;
55 private JButton btnForward;
56 private JButton btnBack;
57 private JButton btnChooseColorStone;
58 private JButton btnChooseColorMark;
59 private JButton btnRemove;
60 private JButton btnStone;
61 private JButton btnRock;
62 private JButton btnMark;
63 private JButton btnEntrance;
64 private JButton btnSaveAs;
65 private JButton btnSave;
66 private JButton btnLoad;
68 private JPanel rangeToolbar;
69 private JTextField txtMinX;
70 private JTextField txtMaxX;
71 private JTextField txtMinY;
72 private JTextField txtMaxY;
74 private JLabel lblRangeX;
75 private JLabel lblRangeY;
79 private File activeFile =
null;
82 super(TEXT.getString(
"Title"));
83 this.setIconImage(LOGO);
84 setDefaultCloseOperation(DISPOSE_ON_CLOSE);
85 world =
new World(
this);
91 filechooser =
new JFileChooser();
93 .addChoosableFileFilter(
new FileNameExtensionFilter(TEXT.getString(
"File.EOW"),
"eow"));
94 filechooser.setCurrentDirectory(
new File(
"."));
96 getContentPane().add(view, BorderLayout.CENTER);
98 editorToolbar =
new JPanel();
99 editorToolbar.setLayout(
new GridLayout(2, 8));
106 evt -> downActionPerformed(evt));
107 mnemonics.put(KeyEvent.VK_Z, evt -> downActionPerformed(evt));
110 evt -> leftActionPerformed(evt));
111 mnemonics.put(KeyEvent.VK_LEFT, evt -> leftActionPerformed(evt));
114 evt -> rightActionPerformed(evt));
115 mnemonics.put(KeyEvent.VK_RIGHT, evt -> rightActionPerformed(evt));
118 evt -> forwardActionPerformed(evt));
119 mnemonics.put(KeyEvent.VK_UP, evt -> forwardActionPerformed(evt));
122 evt -> backActionPerformed(evt));
123 mnemonics.put(KeyEvent.VK_DOWN, evt -> backActionPerformed(evt));
135 TEXT.getString(
"Tooltip.ChooseColorStone"), evt -> chooseColorStoneActionPerformed(evt));
136 mnemonics.put(KeyEvent.VK_C, evt -> chooseColorStoneActionPerformed(evt));
139 TEXT.getString(
"Tooltip.ChooseColorMark"), evt -> chooseColorMarkActionPerformed(evt));
140 mnemonics.put(KeyEvent.VK_V, evt -> chooseColorMarkActionPerformed(evt));
145 removeActionPerformed(evt);
148 mnemonics.put(KeyEvent.VK_X, evt -> {
150 removeActionPerformed(evt);
154 btnStone = GuiToolkit.createButton(CUBES, TEXT.getString(
"Tooltip.Stone"),
157 stoneActionPerformed(evt);
158 } catch (RobotException e1) {}
160 mnemonics.put(KeyEvent.VK_S, evt -> {
162 stoneActionPerformed(evt);
163 } catch (RobotException e) {}
166 btnRock = GuiToolkit.createButton(BRICKWALL, TEXT.getString(
"Tooltip.Rock"),
169 rockActionPerformed(evt);
170 } catch (RobotException e1) {}
172 mnemonics.put(KeyEvent.VK_R, evt -> {
174 rockActionPerformed(evt);
175 } catch (RobotException e) {}
178 btnMark = GuiToolkit.createButton(GOLD_BAR, TEXT.getString(
"Tooltip.Mark"),
181 markActionPerformed(evt);
182 } catch (RobotException e) {}
184 mnemonics.put(KeyEvent.VK_M, evt -> {
186 markActionPerformed(evt);
187 } catch (RobotException e) {}
190 btnEntrance = GuiToolkit.createButton(ROBOT, TEXT.getString(
"Tooltip.Entrance"),
191 evt -> entranceActionPerformed(evt));
192 mnemonics.put(KeyEvent.VK_E, evt -> entranceActionPerformed(evt));
194 editorToolbar.add(btnUp);
195 editorToolbar.add(btnEntrance);
196 editorToolbar.add(btnForward);
197 editorToolbar.add(btnStone);
198 editorToolbar.add(btnRock);
199 editorToolbar.add(btnChooseColorStone);
200 editorToolbar.add(btnSaveAs);
201 editorToolbar.add(btnSave);
202 editorToolbar.add(btnDown);
203 editorToolbar.add(btnLeft);
204 editorToolbar.add(btnBack);
205 editorToolbar.add(btnRight);
206 editorToolbar.add(btnMark);
207 editorToolbar.add(btnChooseColorMark);
208 editorToolbar.add(btnLoad);
209 editorToolbar.add(btnRemove);
211 getContentPane().add(editorToolbar, BorderLayout.SOUTH);
213 view.addKeyListener(
this);
214 editorToolbar.addKeyListener(
this);
215 btnUp.addKeyListener(
this);
216 btnDown.addKeyListener(
this);
217 btnLeft.addKeyListener(
this);
218 btnRight.addKeyListener(
this);
219 btnForward.addKeyListener(
this);
220 btnBack.addKeyListener(
this);
221 btnChooseColorStone.addKeyListener(
this);
222 btnChooseColorMark.addKeyListener(
this);
223 btnRemove.addKeyListener(
this);
224 btnStone.addKeyListener(
this);
225 btnRock.addKeyListener(
this);
226 btnMark.addKeyListener(
this);
227 btnEntrance.addKeyListener(
this);
228 btnSave.addKeyListener(
this);
229 btnSaveAs.addKeyListener(
this);
230 btnLoad.addKeyListener(
this);
232 rangeToolbar =
new JPanel();
233 rangeToolbar.setLayout(
new GridLayout(1, 6));
235 txtMinX = GuiToolkit.createTextField();
236 lblRangeX = GuiToolkit.createLabel(TEXT.getString(
"Range.X"));
237 lblRangeX.setHorizontalAlignment(JTextField.CENTER);
238 txtMaxX = GuiToolkit.createTextField();
240 txtMinY = GuiToolkit.createTextField();
241 lblRangeY = GuiToolkit.createLabel(TEXT.getString(
"Range.Y"));
242 lblRangeY.setHorizontalAlignment(JTextField.CENTER);
243 txtMaxY = GuiToolkit.createTextField();
245 txtMinX.getDocument().addDocumentListener(
this);
246 txtMaxX.getDocument().addDocumentListener(
this);
247 txtMinY.getDocument().addDocumentListener(
this);
248 txtMaxY.getDocument().addDocumentListener(
this);
250 rangeToolbar.add(txtMinX);
251 rangeToolbar.add(lblRangeX);
252 rangeToolbar.add(txtMaxX);
253 rangeToolbar.add(txtMinY);
254 rangeToolbar.add(lblRangeY);
255 rangeToolbar.add(txtMaxY);
257 getContentPane().add(rangeToolbar, BorderLayout.NORTH);
263 private void entranceActionPerformed(ActionEvent evt) {
267 private void markActionPerformed(ActionEvent evt)
throws RobotException {
271 private void rockActionPerformed(ActionEvent evt)
throws RobotException {
275 private void stoneActionPerformed(ActionEvent evt)
throws RobotException {
279 private void removeActionPerformed(ActionEvent evt)
throws RobotException {
283 private void chooseColorStoneActionPerformed(ActionEvent evt) {
284 Color color = JColorChooser.showDialog(
this, TEXT.getString(
"Color.Title.Stone"),
291 private void chooseColorMarkActionPerformed(ActionEvent evt) {
292 Color color = JColorChooser.showDialog(
this, TEXT.getString(
"Color.Title.Mark"),
299 private void backActionPerformed(ActionEvent evt) {
303 private void forwardActionPerformed(ActionEvent evt) {
307 private void rightActionPerformed(ActionEvent evt) {
311 private void leftActionPerformed(ActionEvent evt) {
315 private void downActionPerformed(ActionEvent evt) {
325 if (filechooser.showSaveDialog(
this) == JFileChooser.APPROVE_OPTION) {
326 activeFile = filechooser.getSelectedFile();
327 try (FileOutputStream fos =
new FileOutputStream(activeFile)) {
331 }
catch (TransformerException | ParserConfigurationException | IOException |
RobotException io) {
332 JOptionPane.showMessageDialog(
this, TEXT.getString(
"Save.Error.Title"),
339 if (activeFile !=
null) {
340 try (FileOutputStream fos =
new FileOutputStream(activeFile)) {
344 saveAsActionPerformed(ae);
346 }
catch (TransformerException | ParserConfigurationException | IOException |
RobotException io) {
347 JOptionPane.showMessageDialog(
this, TEXT.getString(
"Save.Error.Title"),
354 if (filechooser.showOpenDialog(
this) == JFileChooser.APPROVE_OPTION) {
355 activeFile = filechooser.getSelectedFile();
356 try (FileInputStream fis =
new FileInputStream(filechooser.getSelectedFile())) {
360 txtMinX.setText(String.valueOf(xr.
getMin()));
361 txtMaxX.setText(String.valueOf(xr.
getMax()));
362 txtMinY.setText(String.valueOf(yr.
getMin()));
363 txtMaxY.setText(String.valueOf(yr.
getMax()));
367 JOptionPane.showMessageDialog(
this, TEXT.getString(
"Open.Error.Title"),
368 io.getLocalizedMessage(), JOptionPane.ERROR_MESSAGE);
372 TreeMap<Integer, ActionListener> mnemonics =
new TreeMap<>();
376 ActionListener actionListener = mnemonics.get(ke.getKeyCode());
377 if (actionListener !=
null) {
378 actionListener.actionPerformed(
null);
405 private void refreshRange() {
406 Integer minX = checkRangeText(txtMinX);
407 Integer maxX = checkRangeText(txtMaxX);
408 Integer minY = checkRangeText(txtMinY);
409 Integer maxY = checkRangeText(txtMaxY);
410 world.
setRange(minX, maxX, minY, maxY);
413 private static Integer checkRangeText(JTextField f) {
414 String text = f.getText();
416 return Integer.parseInt(text);
417 }
catch (Throwable t) {
void load(String filename)
void setStoneColor(MutableColor c)
void setRange(Integer minX, Integer maxX, Integer minY, Integer maxY)
void setShowCursor(boolean showCursor)
void setMarkColor(MutableColor c)
void save(OutputStream targetStream)
MutableColor getMarkColor()
MutableColor getStoneColor()
String getLocalizedMessage()
void changedUpdate(DocumentEvent arg0)
void keyReleased(KeyEvent ke)
void keyPressed(KeyEvent ke)
void loadActionPerformed(ActionEvent ae)
void insertUpdate(DocumentEvent de)
void saveAsActionPerformed(ActionEvent ae)
void removeUpdate(DocumentEvent de)
void upActionPerformed(ActionEvent ae)
void saveActionPerformed(ActionEvent ae)
void keyTyped(KeyEvent ke)