Gridarta Editor
BrowseArchetypesDialog.java
Go to the documentation of this file.
1 /*
2  * Gridarta MMORPG map editor for Crossfire, Daimonin and similar games.
3  * Copyright (C) 2000-2015 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.dialog.browsearchetypes;
21 
22 import java.awt.BorderLayout;
23 import java.awt.Component;
24 import java.awt.Dimension;
25 import java.awt.event.ItemEvent;
26 import java.awt.event.ItemListener;
27 import java.awt.event.MouseEvent;
28 import java.awt.event.MouseListener;
29 import java.io.File;
30 import java.io.IOException;
31 import java.util.Collection;
32 import java.util.TreeSet;
33 import javax.swing.BoxLayout;
34 import javax.swing.DefaultComboBoxModel;
35 import javax.swing.ImageIcon;
36 import javax.swing.JButton;
37 import javax.swing.JComboBox;
38 import javax.swing.JDialog;
39 import javax.swing.JFileChooser;
40 import javax.swing.JOptionPane;
41 import javax.swing.JPanel;
42 import javax.swing.JScrollPane;
43 import javax.swing.JTable;
44 import javax.swing.ListSelectionModel;
45 import javax.swing.ScrollPaneConstants;
46 import javax.swing.SwingUtilities;
47 import javax.swing.WindowConstants;
48 import javax.swing.event.ListSelectionEvent;
49 import javax.swing.event.ListSelectionListener;
50 import javax.swing.table.JTableHeader;
51 import javax.swing.table.TableColumnModel;
62 import net.sf.japi.swing.action.ActionBuilder;
63 import net.sf.japi.swing.action.ActionBuilderFactory;
64 import net.sf.japi.swing.action.ActionMethod;
65 import org.jetbrains.annotations.NotNull;
66 
71 public class BrowseArchetypesDialog<G extends GameObject<G, A, R>, A extends MapArchObject<A>, R extends Archetype<G, A, R>> extends JOptionPane {
72 
76  private static final long serialVersionUID = 1L;
77 
81  @NotNull
82  private static final ActionBuilder ACTION_BUILDER = ActionBuilderFactory.getInstance().getActionBuilder("net.sf.gridarta");
83 
87  @NotNull
89 
93  @NotNull
95 
99  @NotNull
100  private final Collection<String> availableAttributes = new TreeSet<>();
101 
105  @NotNull
107 
111  @NotNull
112  private final DefaultComboBoxModel<String> addAttributeComboBoxModel = new DefaultComboBoxModel<>();
113 
118  @NotNull
119  private final JTable archetypesTable;
120 
125  @NotNull
126  private final JDialog dialog;
127 
132  @NotNull
133  private final JButton addAttributeButton;
134 
139  @NotNull
140  private final JComboBox<String> addAttributeComboBox;
141 
145  @NotNull
146  private final JFileChooser chooser = new JFileChooser();
147 
159  public BrowseArchetypesDialog(@NotNull final Component parentComponent, @NotNull final ArchetypeChooserControl<G, A, R> archetypeChooserControl, @NotNull final ObjectChooser<G, A, R> objectChooser, @NotNull final ArchetypeSet<G, A, R> archetypeSet, @NotNull final ImageIcon closingIcon) {
160  this.archetypeChooserControl = archetypeChooserControl;
161  this.objectChooser = objectChooser;
164 
165  for (final Archetype<?, ?, ?> archetype : archetypeSet.getArchetypes()) {
166  availableAttributes.addAll(archetype.getAttributeKeys());
167  }
168  if (availableAttributes.remove("value")) {
170  }
171 
172  archetypesTable.setFillsViewportHeight(true);
173  archetypesTable.setAutoCreateRowSorter(true);
174  archetypesTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
175  archetypesTable.setRowSelectionAllowed(true);
176  archetypesTable.setColumnSelectionAllowed(false);
177  final ListSelectionListener listSelectionListener = new ListSelectionListener() {
178 
179  @Override
180  public void valueChanged(@NotNull final ListSelectionEvent e) {
182  }
183 
184  };
185  archetypesTable.getSelectionModel().addListSelectionListener(listSelectionListener);
186  final JTableHeader tableHeader = archetypesTable.getTableHeader();
187  tableHeader.setReorderingAllowed(true);
188  final TableHeaderCellRenderer renderer = new TableHeaderCellRenderer(closingIcon, tableHeader.getDefaultRenderer());
189  tableHeader.setDefaultRenderer(renderer);
190  final MouseListener mouseListener = new MouseListener() {
191 
195  private boolean pressed;
196 
197  @Override
198  public void mouseClicked(@NotNull final MouseEvent e) {
199  if (pressed) {
200  pressed = false;
201  if (SwingUtilities.isLeftMouseButton(e)) {
202  final TableColumnModel columnModel = archetypesTable.getColumnModel();
203  final int viewColumn = columnModel.getColumnIndexAtX(e.getX());
204  final int columnIndex = archetypesTable.convertColumnIndexToModel(viewColumn);
205  final int offsetX = renderer.getX(columnIndex);
206  int cx = 0;
207  for (int i = 0; i < columnIndex; i++) {
208  cx += columnModel.getColumn(i).getWidth();
209  }
210  final int ex = e.getX();
211  if (offsetX >= 0 && ex - cx >= offsetX) {
212  final String attribute = archetypesTableModel.removeAttribute(columnIndex);
213  if (attribute != null) {
214  availableAttributes.add(attribute);
215  updateComboBox();
216  addAttributeComboBoxModel.setSelectedItem(attribute);
217  }
218  }
219  }
220  }
221  }
222 
223  @Override
224  public void mousePressed(@NotNull final MouseEvent e) {
225  pressed = true;
226  }
227 
228  @Override
229  public void mouseReleased(@NotNull final MouseEvent e) {
230  }
231 
232  @Override
233  public void mouseEntered(@NotNull final MouseEvent e) {
234  }
235 
236  @Override
237  public void mouseExited(@NotNull final MouseEvent e) {
238  }
239 
240  };
241  tableHeader.addMouseListener(mouseListener);
242  addAttributeButton = new JButton(ACTION_BUILDER.createAction(false, "browseArchetypesAddAttribute", this));
244  final ItemListener itemListener = new ItemListener() {
245 
246  @Override
247  public void itemStateChanged(@NotNull final ItemEvent e) {
248  updateActions();
249  }
250 
251  };
252  addAttributeComboBox.addItemListener(itemListener);
253  setMessage(createPanel());
254 
255  final JPanel addAttributePanel = new JPanel();
256  addAttributePanel.setLayout(new BoxLayout(addAttributePanel, BoxLayout.LINE_AXIS));
257  addAttributePanel.add(addAttributeButton);
258  addAttributePanel.add(addAttributeComboBox);
259  addAttributePanel.add(new JButton(ACTION_BUILDER.createAction(false, "browseArchetypesSave", this)));
260  setOptions(new Object[] { addAttributePanel });
261 
262  updateComboBox();
263  addAttributeComboBox.setSelectedIndex(Math.min(0, addAttributeComboBoxModel.getSize() - 1));
264 
265  dialog = createDialog(parentComponent, ActionBuilderUtils.getString(ACTION_BUILDER, "browseArchetypes.title"));
266  dialog.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
267  dialog.setModal(false);
268  dialog.setResizable(true);
269  dialog.pack();
270  dialog.setMinimumSize(new Dimension(200, 200));
271  dialog.setSize(new Dimension(800, 600));
272  dialog.setLocationRelativeTo(parentComponent);
273  setInitialValue(archetypesTable);
274  updateActions();
275 
276  chooser.setDialogTitle(ActionBuilderUtils.getString(ACTION_BUILDER, "browseArchetypesSave.title"));
277  chooser.setFileFilter(FileFilters.CSV_FILE_FILTER);
278  }
279 
283  public void showDialog() {
284  dialog.setVisible(true);
285  dialog.toFront();
286  }
287 
292  @NotNull
293  private JPanel createPanel() {
294  final JPanel mainPanel = new JPanel(new BorderLayout());
295 
296  mainPanel.setBorder(GUIConstants.DIALOG_BORDER);
297 
298  final JScrollPane scrollPane = new JScrollPane(archetypesTable);
299  scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
300  scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
301 
302  mainPanel.add(scrollPane, BorderLayout.CENTER);
303  return mainPanel;
304  }
305 
309  @ActionMethod
311  doAddAttribute(true);
312  }
313 
317  @ActionMethod
318  public void browseArchetypesSave() {
319  chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
320  chooser.setMultiSelectionEnabled(false);
322  final int returnVal = chooser.showSaveDialog(this);
323  if (returnVal == JFileChooser.APPROVE_OPTION) {
324  File file = chooser.getSelectedFile();
325  try {
326  if (chooser.getFileFilter() == FileFilters.CSV_FILE_FILTER && !file.getName().endsWith(".csv")) {
327  file = new File(file.getParentFile(), file.getName() + ".csv");
328  }
330  } catch (final IOException ex) {
331  ACTION_BUILDER.showMessageDialog(this, "browseArchetypesSaveIOException", file, ex.getMessage());
332  }
333  }
334  }
335 
341  private boolean doAddAttribute(final boolean performAction) {
342  final String attributeName = (String) addAttributeComboBox.getSelectedItem();
343  if (attributeName == null) {
344  return false;
345  }
346 
347  if (performAction) {
348  if (availableAttributes.remove(attributeName)) {
349  archetypesTableModel.addAttribute(attributeName);
350  final int selectedIndex = Math.max(addAttributeComboBox.getSelectedIndex(), 0);
351  updateComboBox();
352  addAttributeComboBox.setSelectedIndex(Math.min(selectedIndex, addAttributeComboBoxModel.getSize() - 1));
353  }
354  updateActions();
355  } else if (!availableAttributes.contains(attributeName)) {
356  return false;
357  }
358 
359  return true;
360  }
361 
365  private void updateActions() {
366  addAttributeButton.setEnabled(doAddAttribute(false));
367  addAttributeComboBox.setEnabled(!availableAttributes.isEmpty());
368  }
369 
374  private void updateComboBox() {
375  addAttributeComboBoxModel.removeAllElements();
376  for (final String attribute : availableAttributes) {
377  addAttributeComboBoxModel.addElement(attribute);
378  }
379  }
380 
385  private void highlightSelectedEntry() {
386  final int index = archetypesTable.getSelectedRow();
387  if (index == -1) {
388  return;
389  }
390 
391  final R archetype = archetypesTableModel.get(archetypesTable.getRowSorter().convertRowIndexToModel(index));
394  }
395 
396 }
net.sf.gridarta.gui.dialog.browsearchetypes.BrowseArchetypesDialog.browseArchetypesSave
void browseArchetypesSave()
Definition: BrowseArchetypesDialog.java:318
net.sf.gridarta.gui.panel
net.sf.gridarta.gui.dialog.browsearchetypes.BrowseArchetypesDialog.browseArchetypesAddAttribute
void browseArchetypesAddAttribute()
Definition: BrowseArchetypesDialog.java:310
net.sf.gridarta.gui.dialog.browsearchetypes.BrowseArchetypesDialog.updateActions
void updateActions()
Definition: BrowseArchetypesDialog.java:365
net.sf.gridarta
net.sf.gridarta.gui.dialog.browsearchetypes.BrowseArchetypesDialog.doAddAttribute
boolean doAddAttribute(final boolean performAction)
Definition: BrowseArchetypesDialog.java:341
net.sf.gridarta.gui.panel.objectchooser.ObjectChooser.moveArchetypeChooserToFront
void moveArchetypeChooserToFront()
net.sf.gridarta.gui.utils.GUIConstants
Definition: GUIConstants.java:33
net.sf
net.sf.gridarta.gui.dialog.browsearchetypes.BrowseArchetypesDialog.availableAttributes
final Collection< String > availableAttributes
Definition: BrowseArchetypesDialog.java:100
net.sf.gridarta.gui.dialog.browsearchetypes.BrowseArchetypesDialog.addAttributeComboBox
final JComboBox< String > addAttributeComboBox
Definition: BrowseArchetypesDialog.java:140
net.sf.gridarta.gui.dialog.browsearchetypes.BrowseArchetypesDialog.dialog
final JDialog dialog
Definition: BrowseArchetypesDialog.java:126
net.sf.gridarta.utils.FileChooserUtils.sanitizeCurrentDirectory
static void sanitizeCurrentDirectory(@NotNull final JFileChooser fileChooser)
Definition: FileChooserUtils.java:56
net.sf.gridarta.model.archetype
Definition: AbstractArchetype.java:20
net.sf.gridarta.model.gameobject.GameObject
Definition: GameObject.java:36
net.sf.gridarta.gui.dialog.browsearchetypes.BrowseArchetypesDialog.ACTION_BUILDER
static final ActionBuilder ACTION_BUILDER
Definition: BrowseArchetypesDialog.java:82
net.sf.gridarta.gui.dialog.browsearchetypes.BrowseArchetypesDialog.addAttributeButton
final JButton addAttributeButton
Definition: BrowseArchetypesDialog.java:133
net.sf.gridarta.gui.dialog.browsearchetypes.BrowseArchetypesDialog.updateComboBox
void updateComboBox()
Definition: BrowseArchetypesDialog.java:374
net.sf.gridarta.gui.dialog.browsearchetypes.BrowseArchetypesTableModel.addAttribute
void addAttribute(@NotNull final String attribute)
Definition: BrowseArchetypesTableModel.java:203
net.sf.gridarta.gui
net.sf.gridarta.gui.dialog.browsearchetypes.BrowseArchetypesDialog.serialVersionUID
static final long serialVersionUID
Definition: BrowseArchetypesDialog.java:76
net.sf.gridarta.gui.dialog.browsearchetypes.BrowseArchetypesDialog.archetypesTableModel
final BrowseArchetypesTableModel< G, A, R > archetypesTableModel
Definition: BrowseArchetypesDialog.java:106
net.sf.gridarta.gui.panel.objectchooser
Definition: DefaultObjectChooser.java:20
net.sf.gridarta.model.gameobject
Definition: AbstractGameObject.java:20
net
net.sf.gridarta.gui.dialog.browsearchetypes.BrowseArchetypesTableModel< G, A, R >
net.sf.gridarta.gui.dialog.browsearchetypes.BrowseArchetypesDialog.highlightSelectedEntry
void highlightSelectedEntry()
Definition: BrowseArchetypesDialog.java:385
net.sf.gridarta.gui.dialog.browsearchetypes.BrowseArchetypesDialog.chooser
final JFileChooser chooser
Definition: BrowseArchetypesDialog.java:146
net.sf.gridarta.gui.panel.archetypechooser
Definition: ArchetypeChooserControl.java:20
net.sf.gridarta.gui.dialog.browsearchetypes.BrowseArchetypesDialog.BrowseArchetypesDialog
BrowseArchetypesDialog(@NotNull final Component parentComponent, @NotNull final ArchetypeChooserControl< G, A, R > archetypeChooserControl, @NotNull final ObjectChooser< G, A, R > objectChooser, @NotNull final ArchetypeSet< G, A, R > archetypeSet, @NotNull final ImageIcon closingIcon)
Definition: BrowseArchetypesDialog.java:159
net.sf.gridarta.model.maparchobject.MapArchObject
Definition: MapArchObject.java:40
net.sf.gridarta.model.archetypeset.ArchetypeSet
Definition: ArchetypeSet.java:37
net.sf.gridarta.gui.dialog.browsearchetypes.BrowseArchetypesDialog.createPanel
JPanel createPanel()
Definition: BrowseArchetypesDialog.java:293
net.sf.gridarta.utils.ActionBuilderUtils.getString
static String getString(@NotNull final ActionBuilder actionBuilder, @NotNull final String key, @NotNull final String defaultValue)
Definition: ActionBuilderUtils.java:71
net.sf.gridarta.gui.panel.archetypechooser.ArchetypeChooserControl.selectArchetype
void selectArchetype(@NotNull final R archetype)
Definition: ArchetypeChooserControl.java:95
net.sf.gridarta.gui.dialog.browsearchetypes.BrowseArchetypesDialog.objectChooser
final ObjectChooser< G, A, R > objectChooser
Definition: BrowseArchetypesDialog.java:94
net.sf.gridarta.gui.panel.objectchooser.ObjectChooser
Definition: ObjectChooser.java:34
net.sf.gridarta.gui.dialog.browsearchetypes.BrowseArchetypesDialog.addAttributeComboBoxModel
final DefaultComboBoxModel< String > addAttributeComboBoxModel
Definition: BrowseArchetypesDialog.java:112
net.sf.gridarta.gui.dialog.browsearchetypes.BrowseArchetypesTableModel.removeAttribute
String removeAttribute(final int index)
Definition: BrowseArchetypesTableModel.java:244
net.sf.gridarta.utils.FileFilters.CSV_FILE_FILTER
static final FileFilter CSV_FILE_FILTER
Definition: FileFilters.java:74
net.sf.gridarta.gui.dialog.browsearchetypes.TableHeaderCellRenderer
Definition: TableHeaderCellRenderer.java:37
net.sf.gridarta.gui.panel.archetypechooser.ArchetypeChooserControl
Definition: ArchetypeChooserControl.java:45
net.sf.gridarta.model
net.sf.gridarta.model.archetype.Archetype
Definition: Archetype.java:41
net.sf.gridarta.utils.FileFilters
Definition: FileFilters.java:32
net.sf.gridarta.gui.dialog.browsearchetypes.BrowseArchetypesTableModel.saveAsCsv
void saveAsCsv(@NotNull final File file)
Definition: BrowseArchetypesTableModel.java:271
net.sf.gridarta.utils.FileChooserUtils
Definition: FileChooserUtils.java:31
net.sf.gridarta.utils.ActionBuilderUtils
Definition: ActionBuilderUtils.java:31
net.sf.gridarta.gui.dialog.browsearchetypes.BrowseArchetypesTableModel.get
R get(final int index)
Definition: BrowseArchetypesTableModel.java:262
net.sf.gridarta.gui.dialog.browsearchetypes.TableHeaderCellRenderer.getX
int getX(final int index)
Definition: TableHeaderCellRenderer.java:104
net.sf.gridarta.model.maparchobject
Definition: AbstractMapArchObject.java:20
net.sf.gridarta.gui.dialog.browsearchetypes.BrowseArchetypesDialog
Definition: BrowseArchetypesDialog.java:71
net.sf.gridarta.gui.utils
Definition: AnimationComponent.java:20
net.sf.gridarta.gui.dialog.browsearchetypes.BrowseArchetypesDialog.showDialog
void showDialog()
Definition: BrowseArchetypesDialog.java:283
net.sf.gridarta.model.archetypeset
Definition: ArchetypeSet.java:20
net.sf.gridarta.gui.dialog.browsearchetypes.BrowseArchetypesDialog.archetypesTable
final JTable archetypesTable
Definition: BrowseArchetypesDialog.java:119
net.sf.gridarta.utils
Definition: ActionBuilderUtils.java:20
net.sf.gridarta.gui.dialog.browsearchetypes.BrowseArchetypesDialog.archetypeChooserControl
final ArchetypeChooserControl< G, A, R > archetypeChooserControl
Definition: BrowseArchetypesDialog.java:88
net.sf.gridarta.gui.utils.GUIConstants.DIALOG_BORDER
Border DIALOG_BORDER
Definition: GUIConstants.java:38