Gridarta Editor
ArchetypePanel.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.panel.archetypechooser;
21 
22 import java.awt.BorderLayout;
23 import java.awt.event.ActionEvent;
24 import java.awt.event.ActionListener;
25 import java.util.ArrayList;
26 import java.util.Comparator;
27 import java.util.List;
28 import javax.swing.DefaultListModel;
29 import javax.swing.JComboBox;
30 import javax.swing.JPanel;
31 import javax.swing.JPopupMenu;
32 import javax.swing.JScrollPane;
33 import javax.swing.JViewport;
34 import javax.swing.ListSelectionModel;
35 import javax.swing.event.ListSelectionEvent;
36 import javax.swing.event.ListSelectionListener;
37 import net.sf.gridarta.gui.utils.GList;
49 import net.sf.japi.swing.action.ActionBuilder;
50 import net.sf.japi.swing.action.ActionBuilderFactory;
51 import net.sf.japi.swing.action.ActionMethod;
52 import org.jetbrains.annotations.NotNull;
53 import org.jetbrains.annotations.Nullable;
54 
60 public class ArchetypePanel<G extends GameObject<G, A, R>, A extends MapArchObject<A>, R extends Archetype<G, A, R>> extends JPanel {
61 
65  private static final long serialVersionUID = 1L;
66 
70  @NotNull
71  private static final ActionBuilder ACTION_BUILDER = ActionBuilderFactory.getInstance().getActionBuilder("net.sf.gridarta");
72 
77  @NotNull
79 
84  // This looks unused, but don't remove it. It will be used in future.
85  @NotNull
86  private final JPopupMenu popupMenu = createListPopupMenu();
87 
92  @NotNull
93  private final DefaultListModel<R> archetypeListModel = new DefaultListModel<>();
94 
100  @NotNull
102 
107  @Nullable
109 
114  @NotNull
115  private final JComboBox<ArchetypeChooserFolder<G, A, R>> folders = new JComboBox<>();
116 
121  @NotNull
122  private Comparator<Archetype<G, A, R>> displayMode;
123 
129  private boolean updateInProgress;
130 
135  @NotNull
137 
143  public ArchetypePanel(@NotNull final ArchetypeChooserModel<G, A, R> archetypeChooserModel, @NotNull final ArchetypeChooserPanel<G, A, R> archetypeChooserPanel) {
144  super(new BorderLayout());
145  this.archetypeChooserPanel = archetypeChooserPanel;
146  archetypeList.setFocusable(false);
147  archetypeList.setBackground(CommonConstants.BG_COLOR);
148  archetypeList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
149  final JScrollPane scrollPane = new JScrollPane(archetypeList);
150  add(scrollPane, BorderLayout.CENTER);
151  add(folders, BorderLayout.NORTH);
152  scrollPane.setAutoscrolls(true);
153  scrollPane.getViewport().setScrollMode(JViewport.SIMPLE_SCROLL_MODE);
154  folders.setAutoscrolls(true);
155 
156  final ArchetypeChooserModelListener<G, A, R> archetypeChooserModelListener = new ArchetypeChooserModelListener<G, A, R>() {
157 
158  @Override
159  public void selectedPanelChanged(@NotNull final ArchetypeChooserPanel<G, A, R> selectedPanel) {
160  }
161 
162  @Override
163  public void selectedFolderChanged(@NotNull final ArchetypeChooserFolder<G, A, R> selectedFolder) {
164  }
165 
166  @Override
167  public void selectedArchetypeChanged(@Nullable final R selectedArchetype) {
168  }
169 
170  @Override
171  public void directionChanged(@Nullable final Integer direction) {
172  }
173 
174  @Override
175  public void displayModeChanged(@NotNull final DisplayMode<G, A, R> displayMode) {
176  updateCellRenderer(displayMode);
177  }
178 
179  };
180  archetypeChooserModel.addArchetypeChooserModelListener(archetypeChooserModelListener);
181  updateCellRenderer(archetypeChooserModel.getDisplayMode());
182 
183  final ArchetypeChooserPanelListener<G, A, R> archetypeChooserPanelListener = new ArchetypeChooserPanelListener<G, A, R>() {
184 
185  @Override
186  public void selectedFolderChanged(@NotNull final ArchetypeChooserFolder<G, A, R> selectedFolder) {
187  folders.setSelectedItem(selectedFolder);
189  }
190 
191  @Override
192  public void selectedArchetypeChanged(@Nullable final R selectedArchetype) {
193  setSelectedArchetype(selectedArchetype);
194  }
195 
196  };
197 
198  archetypeList.addListSelectionListener(new ListSelectionListener() {
199 
200  @Override
201  public void valueChanged(@NotNull final ListSelectionEvent e) {
202  if (!updateInProgress) {
204  if (folder != null) {
206  }
207  }
208  }
209 
210  });
211 
212  archetypeChooserPanel.addArchetypeChooserPanelListener(archetypeChooserPanelListener);
213 
214  for (final ArchetypeChooserFolder<G, A, R> folder : archetypeChooserPanel.getFolders()) {
215  folders.addItem(folder);
216  }
217  folders.setRenderer(new FolderListCellRenderer());
218  folders.setSelectedItem(archetypeChooserPanel.getSelectedFolder());
219  folders.addActionListener(new ActionListener() {
220 
221  @Override
222  public void actionPerformed(@NotNull final ActionEvent e) {
224  if (folder != null) {
226  }
227  }
228 
229  });
230 
232  }
233 
238  private void updateCellRenderer(@NotNull final DisplayMode<G, A, R> displayMode) {
239  this.displayMode = displayMode;
240  archetypeList.setCellRenderer(displayMode);
241  archetypeList.setLayoutOrientation(displayMode.getLayoutOrientation());
242  archetypeList.setVisibleRowCount(-1);
243  final R selectedValue = getSelectedArchetype();
245  setSelectedArchetype(selectedValue);
246  }
247 
252  @Nullable
253  public R getSelectedArchetype() {
254  return archetypeList.getSelectedValue();
255  }
256 
262  private void setSelectedArchetype(@Nullable final R archetype) {
263  archetypeList.setSelectedValue(archetype, true);
264  archetypeList.ensureIndexIsVisible(archetypeList.getSelectedIndex());
265  }
266 
271  @Nullable
273  //JComboBox does not use type parameters
274  @SuppressWarnings("unchecked") final ArchetypeChooserFolder<G, A, R> selectedFolder = (ArchetypeChooserFolder<G, A, R>) folders.getSelectedItem();
275  return selectedFolder;
276  }
277 
281  private void updateArchetypeList() {
282  synchronized (archetypeList.getTreeLock()) {
284  if (archetypeListFolder != folder) {
285  try {
286  updateInProgress = true;
287  archetypeListModel.removeAllElements();
288  if (folder != null) {
289  final List<R> archetypes = new ArrayList<>();
290  archetypes.addAll(folder.getArchetypes());
291  archetypes.sort(displayMode);
292  for (final R archetype : archetypes) {
293  archetypeListModel.addElement(archetype);
294  }
295  if (archetypeListFolder != null) {
296  final R oldSelectedArchetype = archetypeListFolder.getSelectedArchetype();
297  if (oldSelectedArchetype != null && folder.containsArchetype(oldSelectedArchetype)) {
298  folder.setSelectedArchetype(oldSelectedArchetype); // retain selected archetype when switching from or to "all"
299  }
300  }
302  }
303  if (archetypeListFolder != null) {
304  archetypeListFolder.removeArchetypeChooserFolderListener(archetypeChooserFolderListener);
305  }
306  archetypeListFolder = folder;
307  if (archetypeListFolder != null) {
308  archetypeListFolder.addArchetypeChooserFolderListener(archetypeChooserFolderListener);
309  }
310  } finally {
311  updateInProgress = false;
312  }
313  }
314  }
315  }
316 
321  @NotNull
322  private JPopupMenu createListPopupMenu() {
323  final JPopupMenu menu = new JPopupMenu();
324  menu.add(ACTION_BUILDER.createAction(false, "editPopup", this));
325  return menu;
326  }
327 
331  @ActionMethod
332  public void editPopup() {
333  //XXX: gameObjectAttributesDialogFactory.showAttributeDialog(getSelectedArchetype());
334  }
335 
340  public void selectArchetype(@NotNull final R archetype) {
341  final List<ArchetypeChooserFolder<G, A, R>> archetypeChooserFolders = archetypeChooserPanel.getFolders();
342  for (int index = 1; index < archetypeChooserFolders.size(); index++) {
343  final ArchetypeChooserFolder<G, A, R> folder = archetypeChooserFolders.get(index);
344  if (folder.containsArchetype(archetype)) {
345  folders.setSelectedIndex(index);
346  setSelectedArchetype(archetype);
347  return;
348  }
349  }
350 
351  }
352 
357  @NotNull
359  return archetypeChooserPanel;
360  }
361 
362 }
A DefaultListCellRenderer for rendering ArchetypeChooserFolder instances.
final ArchetypeChooserPanel< G, A, R > archetypeChooserPanel
The associated ArchetypeChooserPanel.
Comparator< Archetype< G, A, R > > displayMode
The comparator for sorting archetypes in the active panel.
JPopupMenu createListPopupMenu()
Creates the popup menu for the archetype lists to bring up the editor.
ArchetypeChooserFolder< G, A, R > getSelectedFolder()
Returns the selected folder in folders.
Graphical User Interface of Gridarta.
A named panel within the ArchetypeChooserModel.
final GList< R > archetypeList
The list of currently shown archetypes; it is updated each time a new folder is selected.
void editPopup()
Action method for the popup menu to edit a default arch.
static final long serialVersionUID
Serial Version UID.
void updateArchetypeList()
Updates archetypeList to contain the currently selected folder.
final DefaultListModel< R > archetypeListModel
The list model of archetypeList.
A named folder within the ArchetypeChooserModel.
final JPopupMenu popupMenu
The popup menu for the archetype lists to bring up the editor.
void setSelectedFolder(@NotNull final ArchetypeChooserFolder< G, A, R > selectedFolder)
Sets the selected ArchetypeChooserFolder.
Class with constants used in Gridarta and derivates.
static final Color BG_COLOR
Background Color (for the Panels).
Base package of all Gridarta classes.
Reflects a game object (object on a map).
Definition: GameObject.java:36
static final ActionBuilder ACTION_BUILDER
Action Builder.
void setSelectedArchetype(@Nullable final R selectedArchetype)
Sets the selected Archetype.
GameObjects are the objects based on Archetypes found on maps.
R getSelectedArchetype()
Returns the archetype currently selected in the list.
Interface for listeners interested in ArchetypeChooserPanel related events.
void removeArchetypeChooserFolderListener(@NotNull final ArchetypeChooserFolderListener< G, A, R > listener)
Removes a listener to be notified of changes.
List< ArchetypeChooserFolder< G, A, R > > getFolders()
Returns the ArchetypeChooserFolders.
ArchetypeChooserFolder< G, A, R > archetypeListFolder
The currently shown ArchetypeChooserFolder.
boolean updateInProgress
Set while updateArchetypeList() is running.
Interface for listeners interested in ArchetypeChooserModel related events.
Abstract base class for classes implementing display modes of the archetype chooser.
Interface for listeners interested in ArchetypeChooserFolder related events.
final JComboBox< ArchetypeChooserFolder< G, A, R > > folders
The combo box for selecting the active archetype panel.
boolean containsArchetype(@NotNull final R archetype)
Returns whether an Archetype is part of this folder.
void selectArchetype(@NotNull final R archetype)
Selects an archetype.
final ArchetypeChooserFolderListener< G, A, R > archetypeChooserFolderListener
The ArchetypeChooserFolderListener attached to archetypeListFolder to track changes to the selected a...
void addArchetypeChooserFolderListener(@NotNull final ArchetypeChooserFolderListener< G, A, R > listener)
Adds a listener to be notified of changes.
void updateCellRenderer(@NotNull final DisplayMode< G, A, R > displayMode)
Updates the cell renderer state.
void setSelectedArchetype(@Nullable final R archetype)
Sets the currently selected archetype in the list.
ArchetypeChooserPanel< G, A, R > getArchetypeChooserPanel()
Returns the associated ArchetypeChooserPanel.
An extended JList.
Definition: GList.java:36
ArchetypePanel(@NotNull final ArchetypeChooserModel< G, A, R > archetypeChooserModel, @NotNull final ArchetypeChooserPanel< G, A, R > archetypeChooserPanel)
Creates a new instance.