Gridarta Editor
BrowseArchetypesTableModel.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.io.BufferedWriter;
23 import java.io.File;
24 import java.io.FileOutputStream;
25 import java.io.IOException;
26 import java.io.OutputStream;
27 import java.io.OutputStreamWriter;
28 import java.io.Writer;
29 import java.util.ArrayList;
30 import java.util.List;
31 import java.util.Map;
32 import java.util.WeakHashMap;
33 import java.util.regex.Pattern;
34 import javax.swing.table.AbstractTableModel;
40 import net.sf.japi.swing.action.ActionBuilder;
41 import net.sf.japi.swing.action.ActionBuilderFactory;
42 import org.jetbrains.annotations.NotNull;
43 import org.jetbrains.annotations.Nullable;
44 
50 public class BrowseArchetypesTableModel<G extends GameObject<G, A, R>, A extends MapArchObject<A>, R extends Archetype<G, A, R>> extends AbstractTableModel {
51 
55  private static final long serialVersionUID = 1L;
56 
60  @NotNull
61  private static final ActionBuilder ACTION_BUILDER = ActionBuilderFactory.getInstance().getActionBuilder("net.sf.gridarta");
62 
67  @NotNull
68  private static final Pattern PATTERN_PLAIN_CSV_VALUE = Pattern.compile("[a-zA-Z_0-9]+");
69 
73  @NotNull
74  private static final Pattern PATTERN_QUOTE = Pattern.compile("\"");
75 
79  @NotNull
81 
85  @NotNull
86  private final List<R> archetypes = new ArrayList<>();
87 
91  @NotNull
92  private final List<String> attributes = new ArrayList<>();
93 
97  @NotNull
98  private final List<Class<?>> classes = new ArrayList<>();
99 
103  @NotNull
104  private final Map<String, Class<?>> classMap = new WeakHashMap<>();
105 
111  this.archetypeSet = archetypeSet;
112  update();
113  }
114 
115  @Override
116  public int getRowCount() {
117  return archetypes.size();
118  }
119 
120  @Override
121  public int getColumnCount() {
122  return 2 + attributes.size();
123  }
124 
125  @Nullable
126  @Override
127  public Object getValueAt(final int rowIndex, final int columnIndex) {
128  if (rowIndex < 0 || rowIndex >= archetypes.size()) {
129  return null;
130  }
131  final Archetype<?, ?, ?> archetype = archetypes.get(rowIndex);
132  if (columnIndex == 0) {
133  return archetype.getArchetypeName();
134  }
135  if (columnIndex == 1) {
136  return archetype.getBestName();
137  }
138  if (columnIndex >= 0 && columnIndex < 2 + attributes.size()) {
139  final String attribute = attributes.get(columnIndex - 2);
140  final String value = archetype.getAttributeString(attribute);
141  final Class<?> attributeClass = classes.get(columnIndex - 2);
142  if (attributeClass == Long.class) {
143  if (value.isEmpty()) {
144  return null;
145  }
146  try {
147  return Long.valueOf(value);
148  } catch (final NumberFormatException ignored) {
149  }
150  }
151  return value;
152  }
153  return null;
154  }
155 
156  @Override
157  public String getColumnName(final int column) {
158  if (column == 0) {
159  return ActionBuilderUtils.getString(ACTION_BUILDER, "browseArchetypes.table.archetype");
160  }
161  if (column == 1) {
162  return ActionBuilderUtils.getString(ACTION_BUILDER, "browseArchetypes.table.name");
163  }
164  return column >= 0 && column < 2 + attributes.size() ? attributes.get(column - 2) : super.getColumnName(column);
165  }
166 
167  @Override
168  public Class<?> getColumnClass(final int columnIndex) {
169  if (columnIndex < 2) {
170  return String.class;
171  }
172  if (columnIndex >= 0 && columnIndex < 2 + attributes.size()) {
173  return classes.get(columnIndex - 2);
174  }
175  return super.getColumnClass(columnIndex);
176  }
177 
182  private void update() {
183  archetypes.clear();
184  for (final R archetype : archetypeSet.getArchetypes()) {
185  boolean include = false;
186  for (final String attribute : attributes) {
187  if (!archetype.getAttributeString(attribute).isEmpty()) {
188  include = true;
189  break;
190  }
191  }
192  if (include) {
193  archetypes.add(archetype);
194  }
195  }
196  fireTableStructureChanged();
197  }
198 
203  public void addAttribute(@NotNull final String attribute) {
204  classes.add(getAttributeClass(attribute));
205  attributes.add(attribute);
206  update();
207  }
208 
214  @NotNull
215  private Class<?> getAttributeClass(@NotNull final String attribute) {
216  final Class<?> existingClass = classMap.get(attribute);
217  if (existingClass != null) {
218  return existingClass;
219  }
220 
221  for (final Archetype<?, ?, ?> archetype : archetypeSet.getArchetypes()) {
222  final String value = archetype.getAttributeString(attribute);
223  if (value.isEmpty()) {
224  // skip empty values
225  continue;
226  }
227  try {
228  Long.parseLong(value);
229  } catch (final NumberFormatException ignored) {
230  classMap.put(attribute, String.class);
231  return String.class;
232  }
233  }
234  classMap.put(attribute, Long.class);
235  return Long.class;
236  }
237 
243  @Nullable
244  public String removeAttribute(final int index) {
245  final String attribute;
246  try {
247  attribute = attributes.remove(index - 2);
248  classes.remove(index - 2);
249  } catch (final IndexOutOfBoundsException ignored) {
250  return null;
251  }
252  update();
253  return attribute;
254  }
255 
261  @NotNull
262  public R get(final int index) {
263  return archetypes.get(index);
264  }
265 
271  public void saveAsCsv(@NotNull final File file) throws IOException {
272  try (OutputStream outputStream = new FileOutputStream(file)) {
273  try (Writer writer = new OutputStreamWriter(outputStream)) {
274  try (BufferedWriter bufferedWriter = new BufferedWriter(writer)) {
275  final int columns = getColumnCount();
276  final int rows = getRowCount();
277  for (int column = 0; column < columns; column++) {
278  if (column > 0) {
279  bufferedWriter.write(",");
280  }
281  writeCsvValue(bufferedWriter, getColumnName(column));
282  }
283  bufferedWriter.newLine();
284  for (int row = 0; row < rows; row++) {
285  for (int column = 0; column < columns; column++) {
286  if (column > 0) {
287  bufferedWriter.write(",");
288  }
289  final Object value = getValueAt(row, column);
290  writeCsvValue(bufferedWriter, value == null ? "" : value.toString());
291  }
292  bufferedWriter.newLine();
293  }
294  }
295  }
296  }
297  }
298 
305  private static void writeCsvValue(@NotNull final Writer writer, @NotNull final String value) throws IOException {
306  if (PATTERN_PLAIN_CSV_VALUE.matcher(value).matches()) {
307  writer.write(value);
308  } else {
309  writer.write("\"");
310  writer.write(PATTERN_QUOTE.matcher(value).replaceAll("\"\""));
311  writer.write("\"");
312  }
313  }
314 
315 }
net.sf.gridarta.gui.dialog.browsearchetypes.BrowseArchetypesTableModel.classes
final List< Class<?> > classes
Definition: BrowseArchetypesTableModel.java:98
net.sf.gridarta.model.archetype.Archetype.getArchetypeName
String getArchetypeName()
net.sf.gridarta
net.sf.gridarta.gui.dialog.browsearchetypes.BrowseArchetypesTableModel.getColumnClass
Class<?> getColumnClass(final int columnIndex)
Definition: BrowseArchetypesTableModel.java:168
net.sf
net.sf.gridarta.gui.dialog.browsearchetypes.BrowseArchetypesTableModel.archetypes
final List< R > archetypes
Definition: BrowseArchetypesTableModel.java:86
net.sf.gridarta.gui.dialog.browsearchetypes.BrowseArchetypesTableModel.getRowCount
int getRowCount()
Definition: BrowseArchetypesTableModel.java:116
net.sf.gridarta.gui.dialog.browsearchetypes.BrowseArchetypesTableModel.PATTERN_QUOTE
static final Pattern PATTERN_QUOTE
Definition: BrowseArchetypesTableModel.java:74
net.sf.gridarta.model.archetype
Definition: AbstractArchetype.java:20
net.sf.gridarta.gui.dialog.browsearchetypes.BrowseArchetypesTableModel.serialVersionUID
static final long serialVersionUID
Definition: BrowseArchetypesTableModel.java:55
net.sf.gridarta.model.gameobject.GameObject
Definition: GameObject.java:36
net.sf.gridarta.model.baseobject.BaseObject.getBestName
String getBestName()
net.sf.gridarta.gui.dialog.browsearchetypes.BrowseArchetypesTableModel.addAttribute
void addAttribute(@NotNull final String attribute)
Definition: BrowseArchetypesTableModel.java:203
net.sf.gridarta.gui.dialog.browsearchetypes.BrowseArchetypesTableModel.ACTION_BUILDER
static final ActionBuilder ACTION_BUILDER
Definition: BrowseArchetypesTableModel.java:61
net.sf.gridarta.gui.dialog.browsearchetypes.BrowseArchetypesTableModel.writeCsvValue
static void writeCsvValue(@NotNull final Writer writer, @NotNull final String value)
Definition: BrowseArchetypesTableModel.java:305
net.sf.gridarta.model.gameobject
Definition: AbstractGameObject.java:20
net
net.sf.gridarta.gui.dialog.browsearchetypes.BrowseArchetypesTableModel
Definition: BrowseArchetypesTableModel.java:50
net.sf.gridarta.gui.dialog.browsearchetypes.BrowseArchetypesTableModel.getAttributeClass
Class<?> getAttributeClass(@NotNull final String attribute)
Definition: BrowseArchetypesTableModel.java:215
net.sf.gridarta.model.maparchobject.MapArchObject
Definition: MapArchObject.java:40
net.sf.gridarta.gui.dialog.browsearchetypes.BrowseArchetypesTableModel.update
void update()
Definition: BrowseArchetypesTableModel.java:182
net.sf.gridarta.gui.dialog.browsearchetypes.BrowseArchetypesTableModel.archetypeSet
final ArchetypeSet< G, A, R > archetypeSet
Definition: BrowseArchetypesTableModel.java:80
net.sf.gridarta.gui.dialog.browsearchetypes.BrowseArchetypesTableModel.getColumnName
String getColumnName(final int column)
Definition: BrowseArchetypesTableModel.java:157
net.sf.gridarta.model.archetypeset.ArchetypeSet
Definition: ArchetypeSet.java:37
net.sf.gridarta.gui.dialog.browsearchetypes.BrowseArchetypesTableModel.getColumnCount
int getColumnCount()
Definition: BrowseArchetypesTableModel.java:121
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.dialog.browsearchetypes.BrowseArchetypesTableModel.getValueAt
Object getValueAt(final int rowIndex, final int columnIndex)
Definition: BrowseArchetypesTableModel.java:127
net.sf.gridarta.gui.dialog.browsearchetypes.BrowseArchetypesTableModel.attributes
final List< String > attributes
Definition: BrowseArchetypesTableModel.java:92
net.sf.gridarta.gui.dialog.browsearchetypes.BrowseArchetypesTableModel.removeAttribute
String removeAttribute(final int index)
Definition: BrowseArchetypesTableModel.java:244
net.sf.gridarta.model.archetypeset.ArchetypeSet.getArchetypes
Collection< R > getArchetypes()
net.sf.gridarta.gui.dialog.browsearchetypes.BrowseArchetypesTableModel.classMap
final Map< String, Class<?> > classMap
Definition: BrowseArchetypesTableModel.java:104
net.sf.gridarta.gui.dialog.browsearchetypes.BrowseArchetypesTableModel.PATTERN_PLAIN_CSV_VALUE
static final Pattern PATTERN_PLAIN_CSV_VALUE
Definition: BrowseArchetypesTableModel.java:68
net.sf.gridarta.model
net.sf.gridarta.model.archetype.Archetype
Definition: Archetype.java:41
net.sf.gridarta.gui.dialog.browsearchetypes.BrowseArchetypesTableModel.saveAsCsv
void saveAsCsv(@NotNull final File file)
Definition: BrowseArchetypesTableModel.java:271
net.sf.gridarta.utils.ActionBuilderUtils
Definition: ActionBuilderUtils.java:31
net.sf.gridarta.model.maparchobject
Definition: AbstractMapArchObject.java:20
net.sf.gridarta.gui.dialog.browsearchetypes.BrowseArchetypesTableModel.BrowseArchetypesTableModel
BrowseArchetypesTableModel(@NotNull final ArchetypeSet< G, A, R > archetypeSet)
Definition: BrowseArchetypesTableModel.java:110
net.sf.gridarta.model.baseobject.BaseObject.getAttributeString
String getAttributeString(@NotNull String attributeName, boolean queryArchetype)
net.sf.gridarta.model.archetypeset
Definition: ArchetypeSet.java:20
net.sf.gridarta.utils
Definition: ActionBuilderUtils.java:20