Source code: com/javathis/mapeditor/NewMapDialog.java
1 /**
2 * JTMapEditor - The Pure Java Map Editor
3 * Copyright(c) 2002 by Rodney S. Foley
4 * <pre>
5 * This library is free software; you can redistribute it and/or modify it under
6 * the terms of the GNU Lesser General Public License as published by the Free
7 * Software Foundation; either version 2.1 of the License, or (at your option)
8 * any later version.
9 *
10 * This library is distributed in the hope that it will be useful, but WITHOUT
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
12 * FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for
13 * more details.
14 *
15 * You should have received a copy of the GNU Library General Public License
16 * along with this library; if not, write to:
17 *
18 * Free Software Foundation, Inc.
19 * 59 Temple Place, Suite 330
20 * Boston, MA 02111-1307, USA
21 *
22 * or download it from: http://www.fsf.org/licenses/licenses.html#LGPL
23 * </pre>
24 */
25 package com.javathis.mapeditor;
26
27 import com.javathis.utilities.*;
28 import com.javathis.utilities.ui.*;
29 import java.awt.*;
30 import java.awt.event.*;
31 import java.io.*;
32 import java.util.*;
33 import javax.swing.*;
34
35 /**
36 * Dialog displayed when the user request to create a new map.
37 */
38 public class NewMapDialog extends JDialog
39 {
40 protected static final ResourceBundle MAIN_RESOURCE_BUNDLE = ResourceBundle.getBundle("com/javathis/mapeditor/properties/NewMapDialog");
41
42 private static final Dimension DEFAULT_SIZE = new Dimension(272, 150);
43 private static final Dimension FULL_SIZE = new Dimension(272, 258);
44
45 private JPanel mainPanel = new JPanel();
46 private JPanel tileSetDetailsPanel = new JPanel();
47 private JPanel buttonPanel = new JPanel();
48 private JButton okButton = new JButton(JTUtilities.COMMON_RESOURCE_BUNDLE.getString("ok.Text"));
49 private JButton cancelButton = new JButton(JTUtilities.COMMON_RESOURCE_BUNDLE.getString("cancel.Text"));
50 private JButton browseTileSetButton = new JButton(MAIN_RESOURCE_BUNDLE.getString("browseTileSet.Text") + JTUtilities.ELLIPSIS);
51 private JTLabel widthLabel = new JTLabel(MAIN_RESOURCE_BUNDLE.getString("mapWidth.Text") + ":");
52 private JTLabel heightLabel = new JTLabel(MAIN_RESOURCE_BUNDLE.getString("mapHeight.Text") + ":");
53 private JTLabel defaultTileIndexLabel = new JTLabel(MAIN_RESOURCE_BUNDLE.getString("defaultTileIndex.Text") + ":");
54 private JTLabel tileSizeLabel = new JTLabel(MAIN_RESOURCE_BUNDLE.getString("tileSize.Text") + ":");
55 private JTLabel tileSetFileLabel = new JTLabel("");
56 private JTTextField widthTextField = new JTTextField();
57 private JTTextField heightTextField = new JTTextField();
58 private JTTextField defaultTileIndexTextField = new JTTextField();
59 private JTTextField tileSizeTextField = new JTTextField();
60 private JCheckBox useDefaultTileSetCheckBox = new JCheckBox();
61
62 private int width = -1;
63 private int height = -1;
64 private int tileSize = -1;
65 private int defaultTileIndex = -1;
66
67 private boolean useDefaultTileSet = true;
68 private File tileSetFile = null;
69
70 public NewMapDialog(JFrame owner, boolean isModal, int width, int height)
71 {
72 super(owner, isModal);
73
74 this.width = width;
75 this.height = height;
76
77 useDefaultTileSetCheckBox.setSelected(true);
78
79 guiInit();
80 registerEvents();
81 }
82
83 private void guiInit()
84 {
85 this.setSize(getNewSize(useDefaultTileSetCheckBox.isSelected()));
86
87 this.setTitle(EditFrame.MAIN_RESOURCE_BUNDLE.getString("newMap.Text"));
88 this.getContentPane().setLayout(new BorderLayout(0, 0));
89 this.setResizable(false);
90
91 widthLabel.setRequired(true);
92 heightLabel.setRequired(true);
93 tileSizeLabel.setRequired(true);
94 defaultTileIndexLabel.setRequired(true);
95
96 this.getContentPane().add(mainPanel, BorderLayout.CENTER);
97 this.getContentPane().add(buttonPanel, BorderLayout.SOUTH);
98
99 buttonPanel.setLayout(new JTCommandButtonLayout());
100 mainPanel.setLayout(new GridBagLayout());
101 tileSetDetailsPanel.setLayout(new GridBagLayout());
102
103
104 buttonPanel.add(okButton);
105 buttonPanel.add(cancelButton);
106
107 mainPanel.add(widthLabel, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0
108 ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(3, 6, 3, 6), 0, 0));
109 mainPanel.add(heightLabel, new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0
110 ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(3, 6, 3, 6), 0, 0));
111 mainPanel.add(widthTextField, new GridBagConstraints(1, 0, 1, 1, 1.0, 0.0
112 ,GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(3, 6, 3, 6), 0, 0));
113 mainPanel.add(heightTextField, new GridBagConstraints(1, 1, 1, 1, 1.0, 0.0
114 ,GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(3, 6, 3, 6), 0, 0));
115 mainPanel.add(useDefaultTileSetCheckBox, new GridBagConstraints(1, 2, 1, 1, 0.0, 1.0
116 ,GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(3, 6, 3, 6), 0, 0));
117 mainPanel.add(tileSetDetailsPanel, new GridBagConstraints(0, 3, 2, 1, 1.0, 1.0
118 ,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0));
119
120 tileSetDetailsPanel.add(defaultTileIndexLabel, new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0
121 ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(3, 6, 3, 6), 0, 0));
122 tileSetDetailsPanel.add(defaultTileIndexTextField, new GridBagConstraints(1, 1, 1, 1, 1.0, 0.0
123 ,GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(3, 6, 3, 6), 0, 0));
124 tileSetDetailsPanel.add(tileSizeLabel, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0
125 ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(3, 6, 3, 6), 0, 0));
126 tileSetDetailsPanel.add(tileSizeTextField, new GridBagConstraints(1, 0, 1, 1, 1.0, 0.0
127 ,GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(3, 6, 3, 6), 0, 0));
128 tileSetDetailsPanel.add(browseTileSetButton, new GridBagConstraints(0, 2, 2, 1, 0.0, 0.0
129 ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(6, 6, 3, 6), 0, 0));
130 tileSetDetailsPanel.add(tileSetFileLabel, new GridBagConstraints(0, 3, 2, 1, 1.0, 1.0
131 ,GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL, new Insets(3, 6, 3, 6), 0, 0));
132
133 widthLabel.setDisplayedMnemonic(MAIN_RESOURCE_BUNDLE.getString("mapWidth.Mnemonic").charAt(0));
134 heightLabel.setDisplayedMnemonic(MAIN_RESOURCE_BUNDLE.getString("mapHeight.Mnemonic").charAt(0));
135 useDefaultTileSetCheckBox.setMnemonic(MAIN_RESOURCE_BUNDLE.getString("useDefaultTileSet.Mnemonic").charAt(0));
136 tileSizeLabel.setDisplayedMnemonic(MAIN_RESOURCE_BUNDLE.getString("tileSize.Mnemonic").charAt(0));
137 defaultTileIndexLabel.setDisplayedMnemonic(MAIN_RESOURCE_BUNDLE.getString("defaultTileIndex.Mnemonic").charAt(0));
138 browseTileSetButton.setMnemonic(MAIN_RESOURCE_BUNDLE.getString("browseTileSet.Mnemonic").charAt(0));
139
140 widthLabel.setLabelFor(widthTextField);
141 heightLabel.setLabelFor(heightTextField);
142 tileSizeLabel.setLabelFor(tileSizeTextField);
143 defaultTileIndexLabel.setLabelFor(defaultTileIndexTextField);
144
145 widthTextField.setText(Long.toString(width));
146 widthTextField.setToolTipText(MAIN_RESOURCE_BUNDLE.getString("mapWidth.ToolTip"));
147 widthLabel.setToolTipText(MAIN_RESOURCE_BUNDLE.getString("mapWidth.ToolTip"));
148 heightTextField.setText(Long.toString(height));
149 heightTextField.setToolTipText(MAIN_RESOURCE_BUNDLE.getString("mapHeight.ToolTip"));
150 heightLabel.setToolTipText(MAIN_RESOURCE_BUNDLE.getString("mapHeight.ToolTip"));
151
152 useDefaultTileSetCheckBox.setText(MAIN_RESOURCE_BUNDLE.getString("useDefaultTileSet.Text"));
153 tileSizeTextField.setText("0");
154 tileSizeTextField.setToolTipText(MAIN_RESOURCE_BUNDLE.getString("tileSize.ToolTip"));
155 tileSizeLabel.setToolTipText(MAIN_RESOURCE_BUNDLE.getString("tileSize.ToolTip"));
156 defaultTileIndexTextField.setText("0");
157 defaultTileIndexTextField.setToolTipText(MAIN_RESOURCE_BUNDLE.getString("defaultTileIndex.ToolTip"));
158 defaultTileIndexLabel.setToolTipText(MAIN_RESOURCE_BUNDLE.getString("defaultTileIndex.ToolTip"));
159 tileSetFileLabel.setText(" ");
160
161 widthTextField.requestFocus();
162 widthTextField.selectAll();
163
164 this.getRootPane().setDefaultButton(okButton);
165
166 JTUtilities.centerRelativeFrom(this.getOwner(), this);
167
168 tileSetDetailsPanel.setVisible(false);
169 }
170
171 private void registerEvents()
172 {
173
174 okButton.addActionListener(new ActionListener()
175 {
176 public void actionPerformed(ActionEvent event)
177 {
178 handleOKButton();
179 }
180 });
181
182 cancelButton.addActionListener(new ActionListener()
183 {
184 public void actionPerformed(ActionEvent event)
185 {
186 handleCancelButton();
187 }
188 });
189
190 browseTileSetButton.addActionListener(new ActionListener()
191 {
192 public void actionPerformed(ActionEvent event)
193 {
194 handleBrowseForTileSet();
195 }
196 });
197
198 useDefaultTileSetCheckBox.addActionListener(new ActionListener()
199 {
200 public void actionPerformed(ActionEvent event)
201 {
202 handleUseDefaultTileSet(useDefaultTileSetCheckBox.isSelected());
203 }
204 });
205 }
206
207 public int getMapWidth()
208 {
209 return width;
210 }
211
212 public int getMapHeight()
213 {
214 return height;
215 }
216
217 public boolean useDefaultTileSet()
218 {
219 return useDefaultTileSet;
220 }
221
222 public int getTileSize()
223 {
224 return tileSize;
225 }
226
227 public int getDefaultTileIndex()
228 {
229 return defaultTileIndex;
230 }
231
232 public File getTileSetFile()
233 {
234 return tileSetFile;
235 }
236
237 private void handleOKButton()
238 {
239 boolean hide = true;
240 boolean invalidNumber = false;
241 boolean invalidSize = false;
242 boolean invalidRange = false;
243 useDefaultTileSet = useDefaultTileSetCheckBox.isSelected();
244
245 try
246 {
247 width = Integer.valueOf(widthTextField.getText()).intValue();
248 height = Integer.valueOf(heightTextField.getText()).intValue();
249
250 if (!useDefaultTileSet)
251 {
252 tileSize = Integer.valueOf(tileSizeTextField.getText()).intValue();
253 defaultTileIndex = Integer.valueOf(defaultTileIndexTextField.getText()).intValue();
254 }
255 }
256 catch (NumberFormatException e)
257 {
258 invalidNumber = true;
259 }
260
261 if (width < 1 || height < 1)
262 invalidRange = true;
263 else if(!useDefaultTileSet && (tileSize <= 0 || defaultTileIndex < 0))
264 invalidRange = true;
265
266 if ((long)width * (long)height > (long)Integer.MAX_VALUE)
267 invalidSize = true;
268
269 if (!useDefaultTileSet && tileSetFile == null)
270 {
271 JTUtilities.showErrorMessage(this, MAIN_RESOURCE_BUNDLE.getString("tileSetInvalidError.Message"), MAIN_RESOURCE_BUNDLE.getString("tileSetInvalidError.Title"));
272 hide = false;
273 }
274
275 if (invalidNumber)
276 {
277 JTUtilities.showErrorMessage(this, EditFrame.MAIN_RESOURCE_BUNDLE.getString("invalidNumberError.Message"), EditFrame.MAIN_RESOURCE_BUNDLE.getString("invalidNumberError.Title"));
278 hide = false;
279 }
280
281 if (invalidRange)
282 {
283 String[] message = new String[]
284 {
285 EditFrame.MAIN_RESOURCE_BUNDLE.getString("invalidNumberError.Message"),
286 " ",
287 MAIN_RESOURCE_BUNDLE.getString("validNumberRange.Text"),
288 " 1 " + JTUtilities.COMMON_RESOURCE_BUNDLE.getString("to.Text") + " " + Integer.toString(Integer.MAX_VALUE)
289 };
290
291 JTUtilities.showErrorMessage(this, message, EditFrame.MAIN_RESOURCE_BUNDLE.getString("invalidNumberError.Title"));
292 hide = false;
293
294 }
295
296 if (invalidSize)
297 {
298 String[] message = new String[]
299 {
300 MAIN_RESOURCE_BUNDLE.getString("mapSizeError.Message.1"),
301 " " + Integer.toString(Integer.MAX_VALUE),
302 " ",
303 MAIN_RESOURCE_BUNDLE.getString("mapSizeError.Message.2")
304 };
305 JOptionPane.showMessageDialog(this, message, MAIN_RESOURCE_BUNDLE.getString("mapSizeError.Title"), JOptionPane.ERROR_MESSAGE);
306 hide = false;
307 }
308
309 if (hide)
310 hide();
311 }
312
313 private void handleCancelButton()
314 {
315 width = -1;
316 height = -1;
317
318 hide();
319 }
320
321 private void handleUseDefaultTileSet(boolean useDefaultTileSet)
322 {
323 Dimension newSize = getNewSize(useDefaultTileSet);
324
325 if (useDefaultTileSet)
326 {
327 this.setSize(newSize);
328
329 mainPanel.remove(useDefaultTileSetCheckBox);
330 mainPanel.add(useDefaultTileSetCheckBox, new GridBagConstraints(1, 2, 1, 1, 0.0, 1.0, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(3, 6, 3, 6), 0, 0));
331 }
332 else
333 {
334 this.setSize(newSize);
335 mainPanel.remove(useDefaultTileSetCheckBox);
336 mainPanel.add(useDefaultTileSetCheckBox, new GridBagConstraints(1, 2, 1, 1, 0.0, 0.0, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(3, 6, 3, 6), 0, 0));
337 }
338
339 tileSetDetailsPanel.setVisible(!useDefaultTileSet);
340
341 invalidate();
342 validate();
343
344 }
345
346 private void handleBrowseForTileSet()
347 {
348 final JFileChooser fileChooser = new JFileChooser();
349 fileChooser.setDialogTitle(MAIN_RESOURCE_BUNDLE.getString("browseTileSet.Text"));
350 fileChooser.setFileFilter(new JTFileFilter("jpg", MAIN_RESOURCE_BUNDLE.getString("tileSetFileFilter.title")));
351 fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
352 fileChooser.setFileHidingEnabled(true);
353 fileChooser.setMultiSelectionEnabled(false);
354 fileChooser.setAcceptAllFileFilterUsed(false);
355
356 if(fileChooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION)
357 {
358 new Thread( new Runnable()
359 {
360 public void run()
361 {
362 try
363 {
364 File tileSetFile = fileChooser.getSelectedFile();
365
366 if (tileSetFile.exists())
367 {
368 NewMapDialog.this.tileSetFile = tileSetFile;
369 NewMapDialog.this.tileSetFileLabel.setText(tileSetFile.getName());
370 }
371 }
372 catch (Exception e)
373 {
374 e.printStackTrace();
375 JTUtilities.showErrorMessage(NewMapDialog.this, e.getMessage(), e.getClass().toString());
376 }
377 }
378 }).start();
379 }
380 }
381
382 private Dimension getNewSize(boolean useDefaultTileSet)
383 {
384 Dimension newSize = null;
385
386 if (UIManager.getLookAndFeel().getClass().getName().equals(JTUtilities.LNF_MOTIF))
387 newSize = useDefaultTileSet ? new Dimension(DEFAULT_SIZE.width, DEFAULT_SIZE.height + JTUtilities.MOTIF_HEIGHT_OFFSET) :
388 new Dimension(FULL_SIZE.width, FULL_SIZE.height + JTUtilities.MOTIF_HEIGHT_OFFSET);
389 else
390 newSize = useDefaultTileSet ? DEFAULT_SIZE : FULL_SIZE;
391
392 return newSize;
393 }
394 }