Gridarta Editor
TilePanel.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.maptilepane;
21 
22 import java.awt.Component;
23 import java.awt.GridBagConstraints;
24 import java.awt.GridBagLayout;
25 import java.awt.Insets;
26 import java.awt.event.ActionEvent;
27 import java.awt.event.ActionListener;
28 import java.io.File;
29 import java.io.IOException;
30 import javax.swing.AbstractButton;
31 import javax.swing.Action;
32 import javax.swing.JButton;
33 import javax.swing.JFileChooser;
34 import javax.swing.JPanel;
35 import javax.swing.JTextField;
36 import javax.swing.filechooser.FileFilter;
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 org.jetbrains.annotations.NotNull;
44 import org.jetbrains.annotations.Nullable;
45 
52 public class TilePanel extends JPanel {
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 final FileFilter fileFilter;
70 
74  @NotNull
75  private final String original;
76 
80  @Nullable
81  private final File relativeReference;
82 
86  @NotNull
87  private final File absoluteReference;
88 
92  @NotNull
93  private final JTextField textField;
94 
98  @NotNull
99  private final RASwitch raSwitch;
100 
111  public TilePanel(@NotNull final FileFilter fileFilter, @NotNull final String original, @Nullable final File relativeReference, @NotNull final File absoluteReference) {
112  super(new GridBagLayout());
113  this.fileFilter = fileFilter;
114  this.original = original;
115  this.relativeReference = relativeReference == null ? null : getAbsolutePath(relativeReference);
116  this.absoluteReference = getAbsolutePath(absoluteReference);
117  final GridBagConstraints gbc = new GridBagConstraints();
118  textField = new JTextField();
119  textField.setColumns(16);
120 
121  gbc.fill = GridBagConstraints.NONE;
122  add(iconButton(ACTION_BUILDER.createAction(false, "mapTileRevert", this)), gbc);
123  add(iconButton(ACTION_BUILDER.createAction(false, "mapTileClear", this)), gbc);
124  gbc.fill = GridBagConstraints.HORIZONTAL;
125  gbc.weightx = 1.0;
126  add(textField, gbc);
127  gbc.weightx = 0.0;
128  gbc.fill = GridBagConstraints.NONE;
129  raSwitch = new RASwitch();
130  add(raSwitch, gbc);
131  add(iconButton(ACTION_BUILDER.createAction(false, "mapTileChoose", this)), gbc);
132 
133  textField.setText(original);
135  }
136 
142  @NotNull
143  private static File getAbsolutePath(@NotNull final File file) {
144  try {
145  return file.getCanonicalFile();
146  } catch (final IOException ignored) {
147  return file.getAbsoluteFile();
148  }
149  }
150 
156  @NotNull
157  private static Component iconButton(@NotNull final Action action) {
158  final AbstractButton button = new JButton(action);
159  button.setMargin(new Insets(0, 0, 0, 0));
160  return button;
161  }
162 
166  @ActionMethod
167  public void mapTileRevert() {
168  setText(original, false);
169  }
170 
174  @ActionMethod
175  public void mapTileClear() {
176  setText("", true);
177  }
178 
182  @ActionMethod
183  public void mapTileChoose() {
184  final File tmpRelativeReference = relativeReference;
185  final JFileChooser chooser = tmpRelativeReference == null ? new JFileChooser() : new JFileChooser(tmpRelativeReference.getParentFile());
186  final String oldFilename = getText();
187  if (!oldFilename.isEmpty()) {
188  // Point the chooser on the current path tile file
189  final File oldFile;
190  if (tmpRelativeReference == null || oldFilename.startsWith("/")) {
191  oldFile = new File(absoluteReference, oldFilename.substring(1));
192  } else {
193  oldFile = new File(tmpRelativeReference.getParentFile(), oldFilename);
194  }
195  FileChooserUtils.setCurrentDirectory(chooser, oldFile.getParentFile());
196  chooser.setSelectedFile(oldFile);
197  }
198  chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
199  chooser.setMultiSelectionEnabled(false);
200  chooser.setFileFilter(fileFilter);
202  final int returnVal = chooser.showOpenDialog(this);
203  if (returnVal == JFileChooser.APPROVE_OPTION) {
204  try {
205  final File selected = chooser.getSelectedFile();
206  final String relPath = selected.getCanonicalPath().substring(absoluteReference.getCanonicalPath().length()).replace('\\', '/');
207  setText(relPath, true);
208  } catch (final IOException ex) {
209  setText("Error: " + ex, true);
210  }
211  }
212  }
213 
219  public void setText(@NotNull final String text, final boolean keepRA) {
220  textField.setText(text);
221  if (keepRA) {
222  raSwitch.actionPerformed(false);
223  } else {
225  }
226  }
227 
232  @NotNull
233  public String getText() {
234  final String text = textField.getText();
235  assert text != null;
236  return text;
237  }
238 
242  public void activateTextField() {
243  textField.requestFocusInWindow();
244  }
245 
250  public void addTextFieldActionListener(@NotNull final ActionListener actionListener) {
251  textField.addActionListener(actionListener);
252  }
253 
257  public void updateRAState() {
259  }
260 
264  private class RASwitch extends JButton implements ActionListener {
265 
269  private static final long serialVersionUID = 1L;
270 
274  private boolean isRelative;
275 
279  private RASwitch() {
280  setMargin(new Insets(0, 0, 0, 0));
281  setToolTipText(ActionBuilderUtils.getString(ACTION_BUILDER, "mapTilePathMode.shortdescription"));
282  updateText();
283  addActionListener(this);
284  setPreferredSize(getMinimumSize());
285  }
286 
287  @Override
288  public void actionPerformed(@NotNull final ActionEvent e) {
289  actionPerformed(true);
290  }
291 
292  protected void actionPerformed(final boolean toggleRelative) {
293  final String path = TilePanel.this.getText();
294  final File tmpRelativeReference = relativeReference;
295  if (path.isEmpty() || tmpRelativeReference == null) {
296  return;
297  }
298  if (toggleRelative) {
300  updateText();
301  }
302  final String relRef = "/" + PathManagerUtils.absoluteToRelative(absoluteReference.getPath() + "/", tmpRelativeReference.getPath());
304  }
305 
309  protected void updateRAState() {
310  final String path = getText();
312  updateText();
313  }
314 
318  private void updateText() {
319  setText(isRelative ? "R" : "A");
320  }
321 
322  }
323 
324 }
net.sf.gridarta.gui.map.maptilepane.TilePanel.RASwitch
A JButton that converts relative to absolute paths and vice versa.
Definition: TilePanel.java:264
net.sf.gridarta.utils.PathManagerUtils.absoluteToRelative
static String absoluteToRelative(@NotNull final String reference, @NotNull final String absolute)
Converts an absolute path to a relative path.
Definition: PathManagerUtils.java:137
net.sf.gridarta
Base package of all Gridarta classes.
net.sf.gridarta.utils.FileChooserUtils.setCurrentDirectory
static void setCurrentDirectory(@NotNull final JFileChooser fileChooser, @Nullable final File dir)
Calls JFileChooser#setCurrentDirectory(File).
Definition: FileChooserUtils.java:48
net.sf.gridarta.gui.map.maptilepane.TilePanel.RASwitch.actionPerformed
void actionPerformed(@NotNull final ActionEvent e)
Definition: TilePanel.java:288
net.sf.gridarta.gui.map.maptilepane.TilePanel.getAbsolutePath
static File getAbsolutePath(@NotNull final File file)
Returns the absolute path of a File.
Definition: TilePanel.java:143
net.sf
net.sf.gridarta.gui.map.maptilepane.TilePanel.serialVersionUID
static final long serialVersionUID
The serial version UID.
Definition: TilePanel.java:57
net.sf.gridarta.utils.FileChooserUtils.sanitizeCurrentDirectory
static void sanitizeCurrentDirectory(@NotNull final JFileChooser fileChooser)
Makes sure the current directory of a JFileChooser is valid.
Definition: FileChooserUtils.java:56
net.sf.gridarta.gui.map.maptilepane.TilePanel.mapTileClear
void mapTileClear()
Action method for deleting the path.
Definition: TilePanel.java:175
net.sf.gridarta.gui.map.maptilepane.TilePanel.fileFilter
final FileFilter fileFilter
The FileFilter to use.
Definition: TilePanel.java:69
net.sf.gridarta.gui.map.maptilepane.TilePanel.updateRAState
void updateRAState()
Updates the state of the raSwitch.
Definition: TilePanel.java:257
net.sf.gridarta.gui.map.maptilepane.TilePanel.RASwitch.actionPerformed
void actionPerformed(final boolean toggleRelative)
Definition: TilePanel.java:292
net.sf.gridarta.gui.map.maptilepane.TilePanel.TilePanel
TilePanel(@NotNull final FileFilter fileFilter, @NotNull final String original, @Nullable final File relativeReference, @NotNull final File absoluteReference)
Creates a new instance.
Definition: TilePanel.java:111
net.sf.gridarta.gui.map.maptilepane.TilePanel.absoluteReference
final File absoluteReference
The context reference for absolute paths.
Definition: TilePanel.java:87
net
net.sf.gridarta.gui.map.maptilepane.TilePanel.activateTextField
void activateTextField()
Activates the text input field.
Definition: TilePanel.java:242
net.sf.gridarta.gui.map.maptilepane.TilePanel.setText
void setText(@NotNull final String text, final boolean keepRA)
Sets the text.
Definition: TilePanel.java:219
net.sf.gridarta.gui.map.maptilepane.TilePanel.RASwitch.serialVersionUID
static final long serialVersionUID
The serial version UID.
Definition: TilePanel.java:269
net.sf.gridarta.gui.map.maptilepane.TilePanel.RASwitch.isRelative
boolean isRelative
Whether the current mode is relative.
Definition: TilePanel.java:274
net.sf.gridarta.gui.map.maptilepane.TilePanel.RASwitch.updateText
void updateText()
Updates the button text to reflect the current state.
Definition: TilePanel.java:318
net.sf.gridarta.utils.ActionBuilderUtils.getString
static String getString(@NotNull final ActionBuilder actionBuilder, @NotNull final String key, @NotNull final String defaultValue)
Returns the value of a key.
Definition: ActionBuilderUtils.java:71
net.sf.gridarta.gui.map.maptilepane.TilePanel.original
final String original
The original value.
Definition: TilePanel.java:75
net.sf.gridarta.gui.map.maptilepane.TilePanel.RASwitch.updateRAState
void updateRAState()
Updates the state of the button.
Definition: TilePanel.java:309
net.sf.gridarta.utils.PathManagerUtils
Utility class for converting relative map paths to absolute map paths and vice versa.
Definition: PathManagerUtils.java:31
net.sf.gridarta.gui.map.maptilepane.TilePanel.relativeReference
final File relativeReference
The context reference for relative paths.
Definition: TilePanel.java:81
net.sf.gridarta.utils.PathManagerUtils.isRelative
static boolean isRelative(@NotNull final String path)
Check whether a path is relative.
Definition: PathManagerUtils.java:97
net.sf.gridarta.gui.map.maptilepane.TilePanel.mapTileRevert
void mapTileRevert()
Action method for reverting to stored path.
Definition: TilePanel.java:167
net.sf.gridarta.utils.FileChooserUtils
Utility class for JFileChooser related functions.
Definition: FileChooserUtils.java:31
net.sf.gridarta.utils.ActionBuilderUtils
Utility class for ActionBuilder related functions.
Definition: ActionBuilderUtils.java:31
net.sf.gridarta.gui.map.maptilepane.TilePanel.mapTileChoose
void mapTileChoose()
Action method for choosing the path.
Definition: TilePanel.java:183
net.sf.gridarta.gui.map.maptilepane.TilePanel.RASwitch.RASwitch
RASwitch()
Creates a new instance.
Definition: TilePanel.java:279
net.sf.gridarta.utils.PathManagerUtils.relativeToAbsolute
static String relativeToAbsolute(@NotNull final String reference, @NotNull final String relative)
Converts a relative path to an absolute path.
Definition: PathManagerUtils.java:111
net.sf.gridarta.gui.map.maptilepane.TilePanel.textField
final JTextField textField
The JTextField with the text.
Definition: TilePanel.java:93
net.sf.gridarta.gui.map.maptilepane.TilePanel.addTextFieldActionListener
void addTextFieldActionListener(@NotNull final ActionListener actionListener)
Adds an ActionListener to the text input field.
Definition: TilePanel.java:250
net.sf.gridarta.gui.map.maptilepane.TilePanel.getText
String getText()
Returns the text.
Definition: TilePanel.java:233
net.sf.gridarta.utils
Definition: ActionBuilderUtils.java:20
net.sf.gridarta.gui.map.maptilepane.TilePanel
A tile panel displays exactly one direction for map tiling.
Definition: TilePanel.java:52
net.sf.gridarta.gui.map.maptilepane.TilePanel.iconButton
static Component iconButton(@NotNull final Action action)
Creates a new button for reverting a path entry.
Definition: TilePanel.java:157
net.sf.gridarta.gui.map.maptilepane.TilePanel.ACTION_BUILDER
static final ActionBuilder ACTION_BUILDER
The ActionBuilder.
Definition: TilePanel.java:63
net.sf.gridarta.gui.map.maptilepane.TilePanel.raSwitch
final RASwitch raSwitch
The RASwitch.
Definition: TilePanel.java:99