Gridarta Editor
TableModel.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.dialog.findarchetypes;
21 
22 import java.util.ArrayList;
23 import java.util.Arrays;
24 import java.util.Comparator;
25 import java.util.List;
26 import javax.swing.table.AbstractTableModel;
32 import net.sf.japi.swing.action.ActionBuilder;
33 import net.sf.japi.swing.action.ActionBuilderFactory;
34 import org.jetbrains.annotations.NotNull;
35 import org.jetbrains.annotations.Nullable;
36 
48 public class TableModel<G extends GameObject<G, A, R>, A extends MapArchObject<A>, R extends Archetype<G, A, R>> extends AbstractTableModel {
49 
53  private static final long serialVersionUID = 1L;
54 
58  @NotNull
59  private static final ActionBuilder ACTION_BUILDER = ActionBuilderFactory.getInstance().getActionBuilder("net.sf.gridarta");
60 
64  @NotNull
65  private static final String @NotNull [] COLUMN_NAME = { ActionBuilderUtils.getString(ACTION_BUILDER, "findArchetypesColumnName"), ActionBuilderUtils.getString(ACTION_BUILDER, "findArchetypesColumnArch"), ActionBuilderUtils.getString(ACTION_BUILDER, "findArchetypesColumnType"), ActionBuilderUtils.getString(ACTION_BUILDER, "findArchetypesColumnFolder"), };
66 
70  @NotNull
72 
77  @NotNull
78  private final List<R> archetypes = new ArrayList<>();
79 
84  @NotNull
85  private Integer @Nullable [] sorting;
86 
92  @NotNull
93  private final Comparator<Integer> comparator = (o1, o2) -> {
94  final Archetype<G, A, R> archetype1 = archetypes.get(o1);
95  final Archetype<G, A, R> archetype2 = archetypes.get(o2);
96 
97  final int cmpBestName = archetype1.getBestName().compareToIgnoreCase(archetype2.getBestName());
98  if (cmpBestName != 0) {
99  return cmpBestName;
100  }
101 
102  final int cmpArchetypeName = archetype1.getArchetypeName().compareToIgnoreCase(archetype2.getArchetypeName());
103  if (cmpArchetypeName != 0) {
104  return cmpArchetypeName;
105  }
106 
107  return archetype1.getArchetypeName().compareTo(archetype2.getArchetypeName());
108  };
109 
115  this.archetypeTypeSet = archetypeTypeSet;
116  }
117 
121  public void clear() {
122  archetypes.clear();
123  sorting = null;
124  }
125 
130  public void add(@NotNull final R archetype) {
131  archetypes.add(archetype);
132  }
133 
139  @NotNull
140  public R get(final int index) {
141  return archetypes.get(sorting[index]);
142  }
143 
144  @Override
145  public int getColumnCount() {
146  return 4;
147  }
148 
149  @Override
150  public int getRowCount() {
151  return archetypes.size();
152  }
153 
154  @NotNull
155  @Override
156  public Object getValueAt(final int rowIndex, final int columnIndex) {
157  final Archetype<G, A, R> archetype = archetypes.get(sorting[rowIndex]);
158  switch (columnIndex) {
159  case 0:
160  return archetype.getBestName();
161 
162  case 1:
163  return archetype.getArchetypeName();
164 
165  case 2:
166  return archetypeTypeSet.getDisplayName(archetype);
167 
168  case 3:
169  return archetype.getEditorFolder();
170  }
171 
172  throw new IllegalArgumentException("invalid column index: " + columnIndex);
173  }
174 
175  @NotNull
176  @Override
177  public String getColumnName(final int column) {
178  try {
179  return COLUMN_NAME[column];
180  } catch (final ArrayIndexOutOfBoundsException ignored) {
181  return super.getColumnName(column);
182  }
183  }
184 
188  public void sortTable() {
189  sorting = new Integer[archetypes.size()];
190  for (int i = 0; i < sorting.length; i++) {
191  sorting[i] = i;
192  }
193 
194  Arrays.sort(sorting, comparator);
195  }
196 
203  public void finishUpdate() {
204  if (sorting == null && !archetypes.isEmpty()) {
205  throw new IllegalStateException("archetypes are not sorted");
206  }
207 
208  fireTableDataChanged();
209  }
210 
217  public int findTableIndex(@Nullable final R archetype) {
218  if (archetype != null) {
219  final int archetypeIndex = archetypes.indexOf(archetype);
220  if (archetypeIndex != -1) {
221  for (final Integer index : sorting) {
222  if (archetypeIndex == sorting[index]) {
223  return index;
224  }
225  }
226  }
227  }
228 
229  if (!archetypes.isEmpty()) {
230  return 0;
231  }
232 
233  return -1;
234  }
235 
236 }
net.sf.gridarta.gui.dialog.findarchetypes.TableModel.ACTION_BUILDER
static final ActionBuilder ACTION_BUILDER
Action Builder.
Definition: TableModel.java:59
net.sf.gridarta.model.archetypetype
Defines types of GameObjects with corresponding attributes.
Definition: AbstractArchetypeAttributeInvSpell.java:20
net.sf.gridarta.gui.dialog.findarchetypes.TableModel.finishUpdate
void finishUpdate()
Finish updating the model's contents.
Definition: TableModel.java:203
net.sf.gridarta.model.archetype.Archetype.getArchetypeName
String getArchetypeName()
Returns the name of this archetype.
net.sf.gridarta.gui.dialog.findarchetypes.TableModel.getValueAt
Object getValueAt(final int rowIndex, final int columnIndex)
Definition: TableModel.java:156
net.sf.gridarta.gui.dialog.findarchetypes.TableModel.sorting
Integer[] sorting
Reflects the current sorting of the model's contents.
Definition: TableModel.java:85
net.sf.gridarta
Base package of all Gridarta classes.
net.sf.gridarta.gui.dialog.findarchetypes.TableModel.archetypeTypeSet
final ArchetypeTypeSet archetypeTypeSet
The instance for looking up archetype types.
Definition: TableModel.java:71
net.sf.gridarta.model.archetypetype.ArchetypeTypeSet.getDisplayName
String getDisplayName(@NotNull final BaseObject<?, ?, ?, ?> baseObject)
Returns a description of this type.
Definition: ArchetypeTypeSet.java:258
net.sf
net.sf.gridarta.model.archetype.Archetype.getEditorFolder
String getEditorFolder()
Returns the editor folder.
net.sf.gridarta.gui.dialog.findarchetypes.TableModel.getColumnCount
int getColumnCount()
Definition: TableModel.java:145
net.sf.gridarta.model.archetype
Definition: AbstractArchetype.java:20
net.sf.gridarta.model.gameobject.GameObject
Reflects a game object (object on a map).
Definition: GameObject.java:36
net.sf.gridarta.gui.dialog.findarchetypes.TableModel.getRowCount
int getRowCount()
Definition: TableModel.java:150
net.sf.gridarta.model.baseobject.BaseObject.getBestName
String getBestName()
Returns the name which is best appropriate to describe this GameObject.
net.sf.gridarta.gui.dialog.findarchetypes.TableModel.archetypes
final List< R > archetypes
The model's contents.
Definition: TableModel.java:78
net.sf.gridarta.gui.dialog.findarchetypes.TableModel.serialVersionUID
static final long serialVersionUID
The serial version UID.
Definition: TableModel.java:53
net.sf.gridarta.model.archetypetype.ArchetypeTypeSet
Manages ArchetypeType instances, list, and bitmask definitions.
Definition: ArchetypeTypeSet.java:40
net.sf.gridarta.gui.dialog.findarchetypes.TableModel
The model for displaying a set of archetypes.
Definition: TableModel.java:48
net.sf.gridarta.model.gameobject
GameObjects are the objects based on Archetypes found on maps.
Definition: AbstractGameObject.java:20
net
net.sf.gridarta.gui.dialog.findarchetypes.TableModel.TableModel
TableModel(@NotNull final ArchetypeTypeSet archetypeTypeSet)
Creates a new instance.
Definition: TableModel.java:114
net.sf.gridarta.gui.dialog.findarchetypes.TableModel.findTableIndex
int findTableIndex(@Nullable final R archetype)
Return the row index of an archetype.
Definition: TableModel.java:217
net.sf.gridarta.model.maparchobject.MapArchObject
Interface for MapArchObjects.
Definition: MapArchObject.java:40
net.sf.gridarta.gui.dialog.findarchetypes.TableModel.sortTable
void sortTable()
Sort the table contents by name.
Definition: TableModel.java:188
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.dialog.findarchetypes.TableModel.clear
void clear()
Clear the model's contents.
Definition: TableModel.java:121
net.sf.gridarta.model
net.sf.gridarta.model.archetype.Archetype
Reflects an Archetype.
Definition: Archetype.java:41
net.sf.gridarta.gui.dialog.findarchetypes.TableModel.add
void add(@NotNull final R archetype)
Add an archetype to the model.
Definition: TableModel.java:130
net.sf.gridarta.gui.dialog.findarchetypes.TableModel.comparator
final Comparator< Integer > comparator
Comparator for sorting the model's contents.
Definition: TableModel.java:93
net.sf.gridarta.utils.ActionBuilderUtils
Utility class for ActionBuilder related functions.
Definition: ActionBuilderUtils.java:31
net.sf.gridarta.model.maparchobject
Definition: AbstractMapArchObject.java:20
net.sf.gridarta.utils
Definition: ActionBuilderUtils.java:20
net.sf.gridarta.gui.dialog.findarchetypes.TableModel.getColumnName
String getColumnName(final int column)
Definition: TableModel.java:177
net.sf.gridarta.gui.dialog.findarchetypes.TableModel.COLUMN_NAME
static final String[] COLUMN_NAME
The column titles.
Definition: TableModel.java:65