EOS 2  1.1.0
Einfache Objektbasierte Sprache
WorldEditor.java
gehe zur Dokumentation dieser Datei
1 package de.lathanda.eos.robot.gui;
2 
3 import java.awt.BorderLayout;
4 import java.awt.Color;
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;
11 import java.io.File;
12 import java.io.FileInputStream;
13 import java.io.FileOutputStream;
14 import java.io.IOException;
15 import java.util.TreeMap;
16 
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;
30 
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;
36 
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;
47  private World world;
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;
67 
68  private JPanel rangeToolbar;
69  private JTextField txtMinX;
70  private JTextField txtMaxX;
71  private JTextField txtMinY;
72  private JTextField txtMaxY;
73 
74  private JLabel lblRangeX;
75  private JLabel lblRangeY;
79  private File activeFile = null;
80 
81  public WorldEditor() {
82  super(TEXT.getString("Title"));
83  this.setIconImage(LOGO);
84  setDefaultCloseOperation(DISPOSE_ON_CLOSE);
85  world = new World(this);
86 
87  view = new WorldPanelOpenGLNoShader(world);
88  world.setShowCursor(true);
89  setLocation(0, 0);
90 
91  filechooser = new JFileChooser();
92  filechooser
93  .addChoosableFileFilter(new FileNameExtensionFilter(TEXT.getString("File.EOW"), "eow"));
94  filechooser.setCurrentDirectory(new File("."));
95 
96  getContentPane().add(view, BorderLayout.CENTER);
97 
98  editorToolbar = new JPanel();
99  editorToolbar.setLayout(new GridLayout(2, 8));
100 
101  btnUp = GuiToolkit.createButton(NAVIGATE_UP2, TEXT.getString("Tooltip.Up"),
102  evt -> upActionPerformed(evt));
103  mnemonics.put(KeyEvent.VK_A, evt -> upActionPerformed(evt));
104 
105  btnDown = GuiToolkit.createButton(NAVIGATE_DOWN2, TEXT.getString("Tooltip.Down"),
106  evt -> downActionPerformed(evt));
107  mnemonics.put(KeyEvent.VK_Z, evt -> downActionPerformed(evt));
108 
109  btnLeft = GuiToolkit.createButton(NAVIGATE_LEFT, TEXT.getString("Tooltip.Left"),
110  evt -> leftActionPerformed(evt));
111  mnemonics.put(KeyEvent.VK_LEFT, evt -> leftActionPerformed(evt));
112 
113  btnRight = GuiToolkit.createButton(NAVIGATE_RIGHT, TEXT.getString("Tooltip.Right"),
114  evt -> rightActionPerformed(evt));
115  mnemonics.put(KeyEvent.VK_RIGHT, evt -> rightActionPerformed(evt));
116 
117  btnForward = GuiToolkit.createButton(NAVIGATE_UP, TEXT.getString("Tooltip.Forward"),
118  evt -> forwardActionPerformed(evt));
119  mnemonics.put(KeyEvent.VK_UP, evt -> forwardActionPerformed(evt));
120 
121  btnBack = GuiToolkit.createButton(NAVIGATE_DOWN, TEXT.getString("Tooltip.Back"),
122  evt -> backActionPerformed(evt));
123  mnemonics.put(KeyEvent.VK_DOWN, evt -> backActionPerformed(evt));
124 
125  btnSaveAs = GuiToolkit.createButton(SAVE_AS, TEXT.getString("Tooltip.SaveAs"),
126  evt -> saveAsActionPerformed(evt));
127 
128  btnSave = GuiToolkit.createButton(FLOPPY_DISK, TEXT.getString("Tooltip.Save"),
129  evt -> saveActionPerformed(evt));
130 
131  btnLoad = GuiToolkit.createButton(FOLDER_OPEN, TEXT.getString("Tooltip.Load"),
132  evt -> loadActionPerformed(evt));
133 
134  btnChooseColorStone = GuiToolkit.createButton(PAINTERS_PALETTE,
135  TEXT.getString("Tooltip.ChooseColorStone"), evt -> chooseColorStoneActionPerformed(evt));
136  mnemonics.put(KeyEvent.VK_C, evt -> chooseColorStoneActionPerformed(evt));
137 
138  btnChooseColorMark = GuiToolkit.createButton(PAINTERS_PALETTE2,
139  TEXT.getString("Tooltip.ChooseColorMark"), evt -> chooseColorMarkActionPerformed(evt));
140  mnemonics.put(KeyEvent.VK_V, evt -> chooseColorMarkActionPerformed(evt));
141 
142  btnRemove = GuiToolkit.createButton(GARBAGE, TEXT.getString("Tooltip.Remove"),
143  evt -> {
144  try {
145  removeActionPerformed(evt);
146  } catch (RobotException e3) {}
147  });
148  mnemonics.put(KeyEvent.VK_X, evt -> {
149  try {
150  removeActionPerformed(evt);
151  } catch (RobotException e2) {}
152  });
153 
154  btnStone = GuiToolkit.createButton(CUBES, TEXT.getString("Tooltip.Stone"),
155  evt -> {
156  try {
157  stoneActionPerformed(evt);
158  } catch (RobotException e1) {}
159  });
160  mnemonics.put(KeyEvent.VK_S, evt -> {
161  try {
162  stoneActionPerformed(evt);
163  } catch (RobotException e) {}
164  });
165 
166  btnRock = GuiToolkit.createButton(BRICKWALL, TEXT.getString("Tooltip.Rock"),
167  evt -> {
168  try {
169  rockActionPerformed(evt);
170  } catch (RobotException e1) {}
171  });
172  mnemonics.put(KeyEvent.VK_R, evt -> {
173  try {
174  rockActionPerformed(evt);
175  } catch (RobotException e) {}
176  });
177 
178  btnMark = GuiToolkit.createButton(GOLD_BAR, TEXT.getString("Tooltip.Mark"),
179  evt -> {
180  try {
181  markActionPerformed(evt);
182  } catch (RobotException e) {}
183  });
184  mnemonics.put(KeyEvent.VK_M, evt -> {
185  try {
186  markActionPerformed(evt);
187  } catch (RobotException e) {}
188  });
189 
190  btnEntrance = GuiToolkit.createButton(ROBOT, TEXT.getString("Tooltip.Entrance"),
191  evt -> entranceActionPerformed(evt));
192  mnemonics.put(KeyEvent.VK_E, evt -> entranceActionPerformed(evt));
193 
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);
210 
211  getContentPane().add(editorToolbar, BorderLayout.SOUTH);
212 
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);
231 
232  rangeToolbar = new JPanel();
233  rangeToolbar.setLayout(new GridLayout(1, 6));
234 
235  txtMinX = GuiToolkit.createTextField();
236  lblRangeX = GuiToolkit.createLabel(TEXT.getString("Range.X"));
237  lblRangeX.setHorizontalAlignment(JTextField.CENTER);
238  txtMaxX = GuiToolkit.createTextField();
239 
240  txtMinY = GuiToolkit.createTextField();
241  lblRangeY = GuiToolkit.createLabel(TEXT.getString("Range.Y"));
242  lblRangeY.setHorizontalAlignment(JTextField.CENTER);
243  txtMaxY = GuiToolkit.createTextField();
244 
245  txtMinX.getDocument().addDocumentListener(this);
246  txtMaxX.getDocument().addDocumentListener(this);
247  txtMinY.getDocument().addDocumentListener(this);
248  txtMaxY.getDocument().addDocumentListener(this);
249 
250  rangeToolbar.add(txtMinX);
251  rangeToolbar.add(lblRangeX);
252  rangeToolbar.add(txtMaxX);
253  rangeToolbar.add(txtMinY);
254  rangeToolbar.add(lblRangeY);
255  rangeToolbar.add(txtMaxY);
256 
257  getContentPane().add(rangeToolbar, BorderLayout.NORTH);
258 
259  pack();
260 
261  }
262 
263  private void entranceActionPerformed(ActionEvent evt) {
264  world.setEntranceCursor();
265  }
266 
267  private void markActionPerformed(ActionEvent evt) throws RobotException {
268  world.toggleMarkCursor();
269  }
270 
271  private void rockActionPerformed(ActionEvent evt) throws RobotException {
272  world.setRockCursor();
273  }
274 
275  private void stoneActionPerformed(ActionEvent evt) throws RobotException {
276  world.setStoneCursor();
277  }
278 
279  private void removeActionPerformed(ActionEvent evt) throws RobotException {
280  world.removeCursor();
281  }
282 
283  private void chooseColorStoneActionPerformed(ActionEvent evt) {
284  Color color = JColorChooser.showDialog(this, TEXT.getString("Color.Title.Stone"),
285  world.getStoneColor().getColor());
286  if (color != null) {
287  world.setStoneColor(new MutableColor(color));
288  }
289  }
290 
291  private void chooseColorMarkActionPerformed(ActionEvent evt) {
292  Color color = JColorChooser.showDialog(this, TEXT.getString("Color.Title.Mark"),
293  world.getMarkColor().getColor());
294  if (color != null) {
295  world.setMarkColor(new MutableColor(color));
296  }
297  }
298 
299  private void backActionPerformed(ActionEvent evt) {
300  world.moveCursorSouth();
301  }
302 
303  private void forwardActionPerformed(ActionEvent evt) {
304  world.moveCursorNorth();
305  }
306 
307  private void rightActionPerformed(ActionEvent evt) {
308  world.moveCursorEast();
309  }
310 
311  private void leftActionPerformed(ActionEvent evt) {
312  world.moveCursorWest();
313  }
314 
315  private void downActionPerformed(ActionEvent evt) {
316  world.moveCursorDown();
317  }
318 
319  public void upActionPerformed(ActionEvent ae) {
320  world.moveCursorUp();
321  }
322 
323  public void saveAsActionPerformed(ActionEvent ae) {
324  try {
325  if (filechooser.showSaveDialog(this) == JFileChooser.APPROVE_OPTION) {
326  activeFile = filechooser.getSelectedFile();
327  try (FileOutputStream fos = new FileOutputStream(activeFile)) {
328  world.save(fos);
329  }
330  }
331  } catch (TransformerException | ParserConfigurationException | IOException | RobotException io) {
332  JOptionPane.showMessageDialog(this, TEXT.getString("Save.Error.Title"),
333  io.getLocalizedMessage(), JOptionPane.ERROR_MESSAGE);
334  }
335  }
336 
337  public void saveActionPerformed(ActionEvent ae) {
338  try {
339  if (activeFile != null) {
340  try (FileOutputStream fos = new FileOutputStream(activeFile)) {
341  world.save(fos);
342  }
343  } else {
344  saveAsActionPerformed(ae);
345  }
346  } catch (TransformerException | ParserConfigurationException | IOException | RobotException io) {
347  JOptionPane.showMessageDialog(this, TEXT.getString("Save.Error.Title"),
348  io.getLocalizedMessage(), JOptionPane.ERROR_MESSAGE);
349  }
350  }
351 
352  public void loadActionPerformed(ActionEvent ae) {
353  try {
354  if (filechooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
355  activeFile = filechooser.getSelectedFile();
356  try (FileInputStream fis = new FileInputStream(filechooser.getSelectedFile())) {
357  world.load(fis);
358  IntRange xr = world.getxRange();
359  IntRange yr = world.getyRange();
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()));
364  }
365  }
366  } catch (RobotException | IOException io) {
367  JOptionPane.showMessageDialog(this, TEXT.getString("Open.Error.Title"),
368  io.getLocalizedMessage(), JOptionPane.ERROR_MESSAGE);
369  }
370  }
371 
372  TreeMap<Integer, ActionListener> mnemonics = new TreeMap<>();
373 
374  @Override
375  public void keyPressed(KeyEvent ke) {
376  ActionListener actionListener = mnemonics.get(ke.getKeyCode());
377  if (actionListener != null) {
378  actionListener.actionPerformed(null);
379  }
380  }
381 
382  @Override
383  public void keyReleased(KeyEvent ke) {
384  }
385 
386  @Override
387  public void keyTyped(KeyEvent ke) {
388  }
389 
390  @Override
391  public void changedUpdate(DocumentEvent arg0) {
392  refreshRange();
393  }
394 
395  @Override
396  public void insertUpdate(DocumentEvent de) {
397  refreshRange();
398  }
399 
400  @Override
401  public void removeUpdate(DocumentEvent de) {
402  refreshRange();
403  }
404 
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);
411  }
412 
413  private static Integer checkRangeText(JTextField f) {
414  String text = f.getText();
415  try {
416  return Integer.parseInt(text);
417  } catch (Throwable t) {
418  return null;
419  }
420  }
421 }
static JButton createButton(Image image, String tooltip, ActionListener action)
void load(String filename)
Definition: World.java:119
void setStoneColor(MutableColor c)
Definition: World.java:606
void setRange(Integer minX, Integer maxX, Integer minY, Integer maxY)
Definition: World.java:894
void setShowCursor(boolean showCursor)
Definition: World.java:826
void setMarkColor(MutableColor c)
Definition: World.java:621
void save(OutputStream targetStream)
Definition: World.java:335
MutableColor getMarkColor()
Definition: World.java:628
MutableColor getStoneColor()
Definition: World.java:614
void changedUpdate(DocumentEvent arg0)
void loadActionPerformed(ActionEvent ae)
void insertUpdate(DocumentEvent de)
void saveAsActionPerformed(ActionEvent ae)
void removeUpdate(DocumentEvent de)
void upActionPerformed(ActionEvent ae)
void saveActionPerformed(ActionEvent ae)
Impressum