Gridarta Editor
MapPreview.java
Go to the documentation of this file.
1 /*
2  * Gridarta MMORPG map editor for Crossfire, Daimonin and similar games.
3  * Copyright (C) 2000-2023 The Gridarta Developers.
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License along
16  * with this program; if not, write to the Free Software Foundation, Inc.,
17  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18  */
19 
20 package net.sf.gridarta.gui.misc;
21 
22 import java.awt.Color;
23 import java.awt.Component;
24 import java.awt.Dimension;
25 import java.awt.Graphics;
26 import java.awt.Image;
27 import java.awt.image.BufferedImage;
28 import java.awt.image.RenderedImage;
29 import java.io.File;
30 import java.io.IOException;
31 import javax.imageio.ImageIO;
32 import javax.swing.JComponent;
33 import javax.swing.JFileChooser;
34 import javax.swing.JFrame;
35 import javax.swing.JScrollPane;
36 import javax.swing.WindowConstants;
38 import net.sf.japi.swing.action.ActionBuilder;
39 import net.sf.japi.swing.action.ActionBuilderFactory;
40 import net.sf.japi.swing.action.ActionMethod;
41 import org.jetbrains.annotations.NotNull;
42 
51 public class MapPreview extends JComponent {
52 
56  private static final long serialVersionUID = 1L;
57 
61  @NotNull
62  private static final ActionBuilder ACTION_BUILDER = ActionBuilderFactory.getInstance().getActionBuilder("net.sf.gridarta");
63 
68  @NotNull
69  private final Image original;
70 
75  private int algorithm = Image.SCALE_DEFAULT;
76 
81  private int width;
82 
87  private int height;
88 
93  @NotNull
94  private Image image;
95 
100  @NotNull
101  private final JFrame frame;
102 
109  public MapPreview(@NotNull final Image original) {
110  this.original = original;
111  image = original;
112  width = image.getWidth(this);
113  height = image.getHeight(this);
114  rescale();
115  setBackground(new Color(255, 255, 255, 0));
116  frame = new JFrame("Map Previewer");
117  // WARNING: Do not set the icon. There's a bug that will prevent the frame from getting properly disposed.
118  // This code will be put back in as soon as sun fixes the setIconImage() bug in their java.awt.peer.FramePeer impl.
119  //ImageIcon icon = ResourceIcons.getIcon(GUIConstants.APP_ICON);
120  //if (icon != null) {
121  // frame.setIconImage(icon.getImage());
122  //}
123  frame.setJMenuBar(ACTION_BUILDER.createMenuBar(false, "zoomBar", this));
124  final Component scroll = new JScrollPane(this);
125  scroll.setFocusable(true);
126  frame.add(scroll);
127  frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
128  frame.pack();
129  frame.setVisible(true);
130  }
131 
137  @ActionMethod
138  public void zoom0() throws OutOfMemoryError {
139  setScale(48, 23);
140  }
141 
147  @ActionMethod
148  public void zoom12() throws OutOfMemoryError {
149  setScale(0.125);
150  }
151 
157  @ActionMethod
158  public void zoom25() throws OutOfMemoryError {
159  setScale(0.25);
160  }
161 
167  @ActionMethod
168  public void zoom50() throws OutOfMemoryError {
169  setScale(0.5);
170  }
171 
177  @ActionMethod
178  public void zoom100() throws OutOfMemoryError {
179  setScale(1.0);
180  }
181 
187  @ActionMethod
188  public void zoom150() throws OutOfMemoryError {
189  setScale(1.5);
190  }
191 
197  @ActionMethod
198  public void zoom200() throws OutOfMemoryError {
199  setScale(2.0);
200  }
201 
207  @ActionMethod
208  public void zoom250() throws OutOfMemoryError {
209  setScale(2.5);
210  }
211 
217  @ActionMethod
218  public void zoom300() throws OutOfMemoryError {
219  setScale(3.0);
220  }
221 
227  @ActionMethod
228  public void zoom400() throws OutOfMemoryError {
229  setScale(4.0);
230  }
231 
238  @ActionMethod
239  public void zoomSave() throws IOException, OutOfMemoryError {
240  final JFileChooser chooser = new JFileChooser();
241  chooser.setFileFilter(FileFilters.PNG_FILE_FILTER);
242  if (chooser.showSaveDialog(frame) == JFileChooser.APPROVE_OPTION) {
243  final File file = chooser.getSelectedFile();
244  if (!file.exists() || ACTION_BUILDER.showQuestionDialog(this, "overwriteOtherFile", file)) {
245  final RenderedImage img;
246  if (image instanceof RenderedImage) {
247  img = (RenderedImage) image;
248  } else {
249  final BufferedImage img2 = new BufferedImage(image.getWidth(this), image.getHeight(this), BufferedImage.TYPE_INT_ARGB);
250  final Graphics g = img2.getGraphics();
251  try {
252  paintComponent(g);
253  } finally {
254  g.dispose();
255  }
256  img = img2;
257  }
258  ImageIO.write(img, "png", file);
259  }
260  }
261  }
262 
266  @ActionMethod
267  public void zoomClose() {
268  frame.dispose();
269  }
270 
276  @ActionMethod
277  public void zoomAlgDefault() throws OutOfMemoryError {
278  setAlgorithm(Image.SCALE_DEFAULT);
279  }
280 
286  @ActionMethod
287  public void zoomAlgFast() throws OutOfMemoryError {
288  setAlgorithm(Image.SCALE_FAST);
289  }
290 
296  @ActionMethod
297  public void zoomAlgSmooth() throws OutOfMemoryError {
298  setAlgorithm(Image.SCALE_SMOOTH);
299  }
300 
306  @ActionMethod
307  public void zoomAlgReplicate() throws OutOfMemoryError {
308  setAlgorithm(Image.SCALE_REPLICATE);
309  }
310 
316  @ActionMethod
317  public void zoomAlgAreaAveraging() throws OutOfMemoryError {
318  setAlgorithm(Image.SCALE_AREA_AVERAGING);
319  }
320 
328  private void setScale(final double scale) throws OutOfMemoryError {
329  width = (int) (original.getWidth(this) * scale);
330  height = (int) (original.getHeight(this) * scale);
331  rescale();
332  }
333 
339  private void setScale(final int width, final int height) {
340  this.width = width;
341  this.height = height;
342  rescale();
343  }
344 
349  private void setAlgorithm(final int algorithm) {
350  this.algorithm = algorithm;
351  rescale();
352  }
353 
359  private void rescale() throws OutOfMemoryError {
360  try {
361  image = original.getScaledInstance(width, height, algorithm);
362  } catch (final OutOfMemoryError e) {
363  image = original;
364  width = image.getWidth(this);
365  height = image.getHeight(this);
366  throw e;
367  } finally {
368  setPreferredSize(new Dimension(width, height));
369  revalidate();
370  if (image == original) {
371  // XXX somehow in this case no repainting is done, so we tell to do it.
372  repaint();
373  }
374  }
375  }
376 
377  @Override
378  public void paintComponent(@NotNull final Graphics g) {
379  super.paintComponent(g);
380  g.drawImage(image, 0, 0, this);
381  }
382 
383 }
net.sf.gridarta.gui.misc.MapPreview.setAlgorithm
void setAlgorithm(final int algorithm)
Set the algorithm.
Definition: MapPreview.java:349
net.sf.gridarta.gui.misc.MapPreview.image
Image image
The currently displayed image.
Definition: MapPreview.java:94
net.sf.gridarta
Base package of all Gridarta classes.
net.sf.gridarta.gui.misc.MapPreview.frame
final JFrame frame
The preview frame.
Definition: MapPreview.java:101
net.sf.gridarta.gui.misc.MapPreview.width
int width
The currently used width.
Definition: MapPreview.java:81
net.sf
net.sf.gridarta.gui.misc.MapPreview.ACTION_BUILDER
static final ActionBuilder ACTION_BUILDER
Action Builder.
Definition: MapPreview.java:62
net.sf.gridarta.gui.misc.MapPreview.setScale
void setScale(final int width, final int height)
Set the scale factor to a specific size.
Definition: MapPreview.java:339
net.sf.gridarta.gui.misc.MapPreview
The map preview of the level editor.
Definition: MapPreview.java:51
net.sf.gridarta.gui.misc.MapPreview.height
int height
The currently used height.
Definition: MapPreview.java:87
net.sf.gridarta.gui.misc.MapPreview.zoomAlgFast
void zoomAlgFast()
Zoom Algorithm: Fast.
Definition: MapPreview.java:287
net.sf.gridarta.gui.misc.MapPreview.zoom0
void zoom0()
Zoom to 24x24.
Definition: MapPreview.java:138
net.sf.gridarta.gui.misc.MapPreview.zoomAlgDefault
void zoomAlgDefault()
Zoom Algorithm: Default.
Definition: MapPreview.java:277
net.sf.gridarta.gui.misc.MapPreview.zoom200
void zoom200()
Zoom to 200%.
Definition: MapPreview.java:198
net
net.sf.gridarta.gui.misc.MapPreview.paintComponent
void paintComponent(@NotNull final Graphics g)
Definition: MapPreview.java:378
net.sf.gridarta.gui.misc.MapPreview.algorithm
int algorithm
The currently used algorithm.
Definition: MapPreview.java:75
net.sf.gridarta.gui.misc.MapPreview.zoom100
void zoom100()
Zoom to 100%.
Definition: MapPreview.java:178
net.sf.gridarta.gui.misc.MapPreview.zoom25
void zoom25()
Zoom to 25%.
Definition: MapPreview.java:158
net.sf.gridarta.gui.misc.MapPreview.zoomClose
void zoomClose()
Close the preview.
Definition: MapPreview.java:267
net.sf.gridarta.gui.misc.MapPreview.zoomSave
void zoomSave()
Zoom save.
Definition: MapPreview.java:239
net.sf.gridarta.gui.misc.MapPreview.original
final Image original
The original image.
Definition: MapPreview.java:69
net.sf.gridarta.gui.misc.MapPreview.zoom50
void zoom50()
Zoom to 50%.
Definition: MapPreview.java:168
net.sf.gridarta.gui.misc.MapPreview.zoom300
void zoom300()
Zoom to 300%.
Definition: MapPreview.java:218
net.sf.gridarta.gui.misc.MapPreview.zoomAlgAreaAveraging
void zoomAlgAreaAveraging()
Zoom Algorithm: Area Averaging.
Definition: MapPreview.java:317
net.sf.gridarta.gui.misc.MapPreview.rescale
void rescale()
Recalculate the image.
Definition: MapPreview.java:359
net.sf.gridarta.utils.FileFilters
Utility class defining FileFilters.
Definition: FileFilters.java:32
net.sf.gridarta.gui.misc.MapPreview.serialVersionUID
static final long serialVersionUID
The serial Version UID.
Definition: MapPreview.java:56
net.sf.gridarta.utils.FileFilters.PNG_FILE_FILTER
static final FileFilter PNG_FILE_FILTER
Swing FileFilter for png graphics.
Definition: FileFilters.java:68
net.sf.gridarta.gui.misc.MapPreview.zoom12
void zoom12()
Zoom to 12.5%.
Definition: MapPreview.java:148
net.sf.gridarta.gui.misc.MapPreview.zoom150
void zoom150()
Zoom to 150%.
Definition: MapPreview.java:188
net.sf.gridarta.gui.misc.MapPreview.zoom400
void zoom400()
Zoom to 400%.
Definition: MapPreview.java:228
net.sf.gridarta.gui.misc.MapPreview.zoomAlgReplicate
void zoomAlgReplicate()
Zoom Algorithm: Replicate.
Definition: MapPreview.java:307
net.sf.gridarta.gui.misc.MapPreview.MapPreview
MapPreview(@NotNull final Image original)
Constructs the user interface.
Definition: MapPreview.java:109
net.sf.gridarta.utils
Definition: ActionBuilderUtils.java:20
net.sf.gridarta.gui.misc.MapPreview.setScale
void setScale(final double scale)
Set the scale factor to be used for displaying the image.
Definition: MapPreview.java:328
net.sf.gridarta.gui.misc.MapPreview.zoomAlgSmooth
void zoomAlgSmooth()
Zoom Algorithm: Smooth.
Definition: MapPreview.java:297
net.sf.gridarta.gui.misc.MapPreview.zoom250
void zoom250()
Zoom to 250%.
Definition: MapPreview.java:208