20 package net.sf.gridarta.gui.dialog.exportmap;
22 import java.awt.EventQueue;
23 import java.awt.GridBagConstraints;
24 import java.awt.GridBagLayout;
25 import java.awt.Image;
26 import java.awt.image.BufferedImage;
28 import java.util.prefs.Preferences;
29 import java.util.regex.Pattern;
30 import javax.swing.AbstractButton;
31 import javax.swing.ImageIcon;
32 import javax.swing.JButton;
33 import javax.swing.JCheckBox;
34 import javax.swing.JDialog;
35 import javax.swing.JFileChooser;
36 import javax.swing.JFrame;
37 import javax.swing.JLabel;
38 import javax.swing.JOptionPane;
39 import javax.swing.JPanel;
40 import javax.swing.JProgressBar;
41 import javax.swing.WindowConstants;
55 import net.
sf.japi.swing.action.ActionBuilder;
56 import net.
sf.japi.swing.action.ActionBuilderFactory;
57 import net.
sf.japi.swing.action.ActionMethod;
58 import org.jetbrains.annotations.NotNull;
59 import org.jetbrains.annotations.Nullable;
65 @SuppressWarnings(
"ThisEscapedInObjectConstruction")
71 private static final int PREVIEW_SIZE = 256;
76 private static final long serialVersionUID = 1L;
82 private static final ActionBuilder ACTION_BUILDER = ActionBuilderFactory.getInstance().getActionBuilder(
"net.sf.gridarta");
88 protected static final Preferences PREFERENCES = Preferences.userNodeForPackage(
MainControl.class);
94 private static final Pattern PATTERN_PATH = Pattern.compile(
".*/");
112 private final JButton exportButton =
new JButton(ACTION_BUILDER.createAction(
false,
"exportMapAsImageExport",
this));
118 private final JButton cancelButton =
new JButton(ACTION_BUILDER.createAction(
false,
"exportMapAsImageCancel",
this));
124 private final JButton cancelExportButton =
new JButton(ACTION_BUILDER.createAction(
false,
"exportMapAsImageCancelExport",
this));
136 private final AbstractButton includeTiledMapsCheckbox =
new JCheckBox(ACTION_BUILDER.createToggle(
false,
"exportMapAsImageIncludeTiledMaps",
this));
148 private final JLabel progressLabel =
new JLabel();
154 private final JProgressBar progressBar =
new JProgressBar();
160 private final JLabel previewLabel =
new JLabel();
166 private final JLabel previewImage =
new JLabel();
171 private boolean includeTiledMaps =
true;
185 this.exportMapAsImageAction = exportMapAsImageAction;
186 this.mapControl = mapControl;
187 exportButton.setDefaultCapable(
true);
188 final MapFile mapFile = mapControl.getMapModel().getMapFile();
190 if (mapFile ==
null) {
191 file =
new File(System.getProperty(
"user.dir")).getAbsoluteFile();
194 file =
new File(
new File(mapsDir,
"images"), PATTERN_PATH.matcher(mapFile.
getMapPath().
getPath()).replaceAll(
"") +
".png");
196 outputFileField =
new JFileField(
this,
"exportMapAsImageOutputFile",
null, file, JFileChooser.FILES_ONLY | JFileChooser.SAVE_DIALOG);
197 previewImage.setIcon(
new ImageIcon(
new BufferedImage(PREVIEW_SIZE, PREVIEW_SIZE, BufferedImage.TYPE_INT_ARGB)));
198 cancelExportButton.setEnabled(
false);
199 setOptions(
new Object[] { exportButton, cancelButton, cancelExportButton });
200 setMessage(createPanel());
202 dialog = createDialog(parent, ACTION_BUILDER.format(
"exportMapAsImageTitle"));
203 dialog.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
204 dialog.getRootPane().setDefaultButton(exportButton);
205 dialog.setModal(
false);
207 dialog.setVisible(
true);
216 return outputFileField.
getFile();
225 return includeTiledMapsCheckbox.isSelected();
234 final JPanel panel =
new JPanel();
235 panel.setLayout(
new GridBagLayout());
237 final GridBagConstraints gbc =
new GridBagConstraints();
239 gbc.fill = GridBagConstraints.HORIZONTAL;
240 gbc.anchor = GridBagConstraints.LINE_START;
245 if (!mapArchObject.getTilePath(direction).isEmpty()) {
246 includeTiledMapsCheckbox.setSelected(
true);
247 panel.add(includeTiledMapsCheckbox, gbc);
253 panel.add(outputFileField, gbc);
254 panel.add(progressLabel, gbc);
255 panel.add(progressBar, gbc);
256 panel.add(previewLabel, gbc);
257 panel.add(previewImage, gbc);
269 public void setMax(
final int max) {
270 EventQueue.invokeLater(() -> {
271 progressLabel.setText(max +
" tiled " + (max == 1 ?
"map" :
"maps"));
272 progressBar.setMaximum(max);
278 public void setValue(
final int value, @NotNull
final BufferedImage image) {
279 EventQueue.invokeLater(() -> {
280 progressBar.setIndeterminate(
false);
281 progressBar.setStringPainted(
true);
282 progressBar.setValue(value);
283 previewLabel.setText(image.getWidth() +
"x" + image.getHeight() +
" pixels");
284 previewImage.setIcon(
new ImageIcon(image.getScaledInstance(PREVIEW_SIZE, PREVIEW_SIZE, Image.SCALE_DEFAULT)));
290 public boolean cancel() {
295 final Runnable runnable = () -> {
296 final boolean ok = exportMapAsImageAction.
exportMap(mapControl, includeTiledMaps, outputFileField.
getFile(), progress);
297 EventQueue.invokeLater(() -> {
298 setValue(ok ? exportButton : UNINITIALIZED_VALUE);
299 includeTiledMapsCheckbox.setEnabled(
true);
301 progressBar.setIndeterminate(
false);
302 progressBar.setStringPainted(
false);
303 progressBar.setMinimum(0);
304 progressBar.setMaximum(1);
305 progressBar.setValue(0);
306 cancelExportButton.setEnabled(
false);
307 exportButton.setEnabled(
true);
311 includeTiledMapsCheckbox.setEnabled(
false);
313 progressLabel.setText(
"");
314 progressBar.setIndeterminate(
true);
315 progressBar.setValue(0);
316 progressBar.setMaximum(0);
317 progressBar.setStringPainted(
false);
318 previewLabel.setText(
"");
319 previewImage.setIcon(
new ImageIcon(
new BufferedImage(PREVIEW_SIZE, PREVIEW_SIZE, BufferedImage.TYPE_INT_ARGB)));
320 cancelExportButton.setEnabled(
true);
321 exportButton.setEnabled(
false);
323 cancelExport =
false;
324 final Thread thread =
new Thread(runnable,
"Map Exporter Thread");
325 thread.setDaemon(
true);
334 setValue(cancelButton);
342 setValue(UNINITIALIZED_VALUE);
346 public void setValue(@Nullable
final Object newValue) {
347 super.setValue(newValue);
349 if (newValue != UNINITIALIZED_VALUE) {
360 return includeTiledMaps;
368 includeTiledMapsCheckbox.setSelected(includeTiledMaps);
369 this.includeTiledMaps = includeTiledMaps;