Gridarta Editor
MapPreviewAccessory.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.map;
21 
22 import java.awt.BorderLayout;
23 import java.awt.Dimension;
24 import java.awt.Image;
25 import java.beans.PropertyChangeListener;
26 import java.io.File;
27 import java.util.prefs.Preferences;
28 import javax.swing.Action;
29 import javax.swing.Icon;
30 import javax.swing.ImageIcon;
31 import javax.swing.JButton;
32 import javax.swing.JComponent;
33 import javax.swing.JFileChooser;
34 import javax.swing.JLabel;
35 import javax.swing.JScrollPane;
36 import javax.swing.SwingConstants;
37 import javax.swing.filechooser.FileView;
38 import net.sf.gridarta.MainControl;
40 import net.sf.japi.swing.action.ActionBuilder;
41 import net.sf.japi.swing.action.ActionBuilderFactory;
42 import net.sf.japi.swing.action.ActionMethod;
43 import net.sf.japi.swing.action.ToggleAction;
44 import org.jetbrains.annotations.NotNull;
45 import org.jetbrains.annotations.Nullable;
46 
52 public class MapPreviewAccessory extends JComponent {
53 
57  private static final long serialVersionUID = 1L;
58 
62  @NotNull
63  private static final ActionBuilder ACTION_BUILDER = ActionBuilderFactory.getInstance().getActionBuilder("net.sf.gridarta");
64 
68  @NotNull
69  private static final Preferences PREFERENCES = Preferences.userNodeForPackage(MainControl.class);
70 
74  @NotNull
75  private static final String PREFERENCES_AUTO_GENERATE_PREVIEW = "autoGeneratePreviews";
76 
80  @NotNull
82 
86  @NotNull
87  private final JLabel preview = new JLabel();
88 
92  @NotNull
93  private final ToggleAction autoGeneratePreview = (ToggleAction) ACTION_BUILDER.createToggle(false, "autoGeneratePreviews", this);
94 
98  @NotNull
99  private final Action genPreview = ACTION_BUILDER.createAction(false, "genPreview", this);
100 
104  @NotNull
105  private final JFileChooser fileChooser;
106 
110  @NotNull
111  private File @Nullable [] selectedFiles;
112 
116  private boolean autoGeneratePreviews;
117 
123  public MapPreviewAccessory(@NotNull final MapImageCache<?, ?, ?> mapImageCache, @NotNull final JFileChooser fileChooser) {
124  this.mapImageCache = mapImageCache;
125  this.fileChooser = fileChooser;
126  buildUI();
127  setPreview("genPreviewNone.text");
128 
129  final PropertyChangeListener propertyChangeListener = evt -> {
130  final String prop = evt.getPropertyName();
131  if (JFileChooser.DIRECTORY_CHANGED_PROPERTY.equals(prop)) {
132  setPreview("genPreviewNone.text");
133  } else if (JFileChooser.SELECTED_FILE_CHANGED_PROPERTY.equals(prop)) {
134  final File selectedFile = (File) evt.getNewValue();
135  if (selectedFile == null) {
136  setPreview("genPreviewNone.text");
137  } else {
138  final Image previewImage = getMapPreview(selectedFile);
139  if (previewImage == null) {
140  setPreview("genPreviewNone.text");
141  } else {
142  setPreview(previewImage);
143  }
144  }
145  } else if (JFileChooser.SELECTED_FILES_CHANGED_PROPERTY.equals(prop)) {
146  selectedFiles = (File[]) evt.getNewValue();
147  }
148  };
149  fileChooser.addPropertyChangeListener(propertyChangeListener);
150  fileChooser.setFileView(new MapFileView());
151  }
152 
156  private void buildUI() {
158  setPreferredSize(new Dimension(240, 115));
159  setLayout(new BorderLayout());
160  add(autoGeneratePreview.createCheckBox(), BorderLayout.NORTH);
161  add(new JButton(genPreview), BorderLayout.SOUTH);
162  preview.setHorizontalAlignment(SwingConstants.CENTER);
163  add(new JScrollPane(preview), BorderLayout.CENTER);
164  }
165 
170  private void setPreview(@Nullable final Image image) {
171  preview.setIcon(image == null ? null : new ImageIcon(image));
172  preview.setText(null);
173  }
174 
179  private void setPreview(@NotNull final String text) {
180  preview.setIcon(null);
181  preview.setText(ACTION_BUILDER.getString(text));
182  }
183 
189  @ActionMethod
190  public void setAutoGeneratePreviews(final boolean autoGeneratePreviews) {
191  this.autoGeneratePreviews = autoGeneratePreviews;
194  if (autoGeneratePreviews) {
195  fileChooser.validate();
196  fileChooser.repaint();
197  }
198  }
199 
205  @ActionMethod
206  public boolean isAutoGeneratePreviews() {
207  return autoGeneratePreviews;
208  }
209 
213  @ActionMethod
214  public void genPreview() {
215  final File[] files = selectedFiles;
216  if (files == null || files.length == 0) {
217  return;
218  }
219 
220  for (final File file : files) {
221  mapImageCache.flush(file);
222 
223  final Image image = mapImageCache.getOrCreatePreview(file);
224  setPreview(image);
225  }
226  fileChooser.validate();
227  fileChooser.repaint();
228  }
229 
236  @Nullable
237  private Image getMapIcon(@NotNull final File mapFile) {
238  return autoGeneratePreview.isSelected() ? mapImageCache.getOrCreateIcon(mapFile) : mapImageCache.getIcon(mapFile);
239  }
240 
247  @Nullable
248  private Image getMapPreview(@NotNull final File mapFile) {
249  return autoGeneratePreview.isSelected() ? mapImageCache.getOrCreatePreview(mapFile) : mapImageCache.getPreview(mapFile);
250  }
251 
255  private class MapFileView extends FileView {
256 
257  @Override
258  public Icon getIcon(@NotNull final File f) {
259  final Image image = fileChooser.getCurrentDirectory().equals(f.getParentFile()) ? getMapIcon(f) : null;
260  return image == null ? super.getIcon(f) : new ImageIcon(image);
261  }
262 
263  }
264 
265 }
net.sf.gridarta.gui.mapimagecache
Definition: ImageType.java:20
net.sf.gridarta.gui.map.MapPreviewAccessory.PREFERENCES
static final Preferences PREFERENCES
Preferences.
Definition: MapPreviewAccessory.java:69
net.sf.gridarta
Base package of all Gridarta classes.
net.sf.gridarta.gui.map.MapPreviewAccessory
Abstract base class for MapPreviewAccessories which are used for previewing maps in JFileChoosers.
Definition: MapPreviewAccessory.java:52
files
Standard Edition Runtime Environment README Import and export control rules on cryptographic software vary from country to country The Java Cryptography Java provides two different sets of cryptographic policy files
Definition: README.txt:26
net.sf.gridarta.gui.map.MapPreviewAccessory.getMapIcon
Image getMapIcon(@NotNull final File mapFile)
Get an icon.
Definition: MapPreviewAccessory.java:237
net.sf
net.sf.gridarta.gui.map.MapPreviewAccessory.mapImageCache
final MapImageCache<?, ?, ?> mapImageCache
The cache for map images.
Definition: MapPreviewAccessory.java:81
net.sf.gridarta.gui.map.MapPreviewAccessory.setAutoGeneratePreviews
void setAutoGeneratePreviews(final boolean autoGeneratePreviews)
Switch automatic preview generation.
Definition: MapPreviewAccessory.java:190
net.sf.gridarta.gui
Graphical User Interface of Gridarta.
net.sf.gridarta.gui.mapimagecache.MapImageCache.getIcon
Image getIcon(@NotNull final File mapFile)
Returns the icon Image for a given map file.
Definition: MapImageCache.java:180
net.sf.gridarta.gui.map.MapPreviewAccessory.autoGeneratePreview
final ToggleAction autoGeneratePreview
ToggleAction for auto-generate preview.
Definition: MapPreviewAccessory.java:93
net.sf.gridarta.gui.mapimagecache.MapImageCache
Caches icon and preview images for map files.
Definition: MapImageCache.java:53
net.sf.gridarta.gui.map.MapPreviewAccessory.isAutoGeneratePreviews
boolean isAutoGeneratePreviews()
Get whether to automatically generate previews.
Definition: MapPreviewAccessory.java:206
net
net.sf.gridarta.gui.mapimagecache.MapImageCache.getOrCreateIcon
Image getOrCreateIcon(@NotNull final File mapFile)
Returns an icon Image for a given map file.
Definition: MapImageCache.java:192
net.sf.gridarta.gui.map.MapPreviewAccessory.setPreview
void setPreview(@Nullable final Image image)
Updates the text and icon of preview.
Definition: MapPreviewAccessory.java:170
net.sf.gridarta.gui.map.MapPreviewAccessory.preview
final JLabel preview
The preview label.
Definition: MapPreviewAccessory.java:87
net.sf.gridarta.gui.mapimagecache.MapImageCache.flush
void flush(@NotNull final File mapFile)
Removes the cached images for a map file.
Definition: MapImageCache.java:167
net.sf.gridarta.gui.map.MapPreviewAccessory.autoGeneratePreviews
boolean autoGeneratePreviews
Whether previews should be auto-generated.
Definition: MapPreviewAccessory.java:116
net.sf.gridarta.gui.map.MapPreviewAccessory.setPreview
void setPreview(@NotNull final String text)
Updates the text and icon of preview.
Definition: MapPreviewAccessory.java:179
net.sf.gridarta.gui.mapimagecache.MapImageCache.getOrCreatePreview
Image getOrCreatePreview(@NotNull final File mapFile)
Returns a preview Image for a given map file.
Definition: MapImageCache.java:226
net.sf.gridarta.gui.map.MapPreviewAccessory.fileChooser
final JFileChooser fileChooser
The file chooser instance.
Definition: MapPreviewAccessory.java:105
net.sf.gridarta.gui.map.MapPreviewAccessory.genPreview
void genPreview()
Generate a preview.
Definition: MapPreviewAccessory.java:214
net.sf.gridarta.gui.map.MapPreviewAccessory.MapFileView
FileView for giving icons to map files.
Definition: MapPreviewAccessory.java:255
net.sf.gridarta.gui.map.MapPreviewAccessory.genPreview
final Action genPreview
Action for generating preview.
Definition: MapPreviewAccessory.java:99
net.sf.gridarta.gui.map.MapPreviewAccessory.serialVersionUID
static final long serialVersionUID
The serial version UID.
Definition: MapPreviewAccessory.java:57
net.sf.gridarta.gui.map.MapPreviewAccessory.ACTION_BUILDER
static final ActionBuilder ACTION_BUILDER
Action Builder.
Definition: MapPreviewAccessory.java:63
net.sf.gridarta.gui.mapimagecache.MapImageCache.getPreview
Image getPreview(@NotNull final File mapFile)
Returns a preview Image for a given map file.
Definition: MapImageCache.java:214
net.sf.gridarta.gui.map.MapPreviewAccessory.MapPreviewAccessory
MapPreviewAccessory(@NotNull final MapImageCache<?, ?, ?> mapImageCache, @NotNull final JFileChooser fileChooser)
Creates an MapPreviewAccessory.
Definition: MapPreviewAccessory.java:123
net.sf.gridarta.gui.map.MapPreviewAccessory.getMapPreview
Image getMapPreview(@NotNull final File mapFile)
Get a preview.
Definition: MapPreviewAccessory.java:248
net.sf.gridarta.gui.map.MapPreviewAccessory.buildUI
void buildUI()
Build the user interface.
Definition: MapPreviewAccessory.java:156
net.sf.gridarta.gui.map.MapPreviewAccessory.PREFERENCES_AUTO_GENERATE_PREVIEW
static final String PREFERENCES_AUTO_GENERATE_PREVIEW
Preferences key for automatic preview generation.
Definition: MapPreviewAccessory.java:75
net.sf.gridarta.gui.map.MapPreviewAccessory.selectedFiles
File[] selectedFiles
The currently selected files, or.
Definition: MapPreviewAccessory.java:111
net.sf.gridarta.gui.map.MapPreviewAccessory.MapFileView.getIcon
Icon getIcon(@NotNull final File f)
Definition: MapPreviewAccessory.java:258
net.sf.gridarta.MainControl
Interface used as preferences location.
Definition: MainControl.java:27