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.JList;
31 import javax.swing.JPanel;
32 import javax.swing.JPopupMenu;
33 import javax.swing.JScrollPane;
34 import javax.swing.JViewport;
35 import javax.swing.ListSelectionModel;
36 import javax.swing.event.ListSelectionEvent;
37 import javax.swing.event.ListSelectionListener;
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
101  private final JList<R> archetypeList = new JList<>(archetypeListModel);
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) {
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 
215  folders.addItem(folder);
216  }
217  folders.setRenderer(new FolderListCellRenderer());
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  private 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<>(folder.getArchetypes());
290  archetypes.sort(displayMode);
291  for (final R archetype : archetypes) {
292  archetypeListModel.addElement(archetype);
293  }
294  if (archetypeListFolder != null) {
295  final R oldSelectedArchetype = archetypeListFolder.getSelectedArchetype();
296  if (oldSelectedArchetype != null && folder.containsArchetype(oldSelectedArchetype)) {
297  folder.setSelectedArchetype(oldSelectedArchetype); // retain selected archetype when switching from or to "all"
298  }
299  }
301  }
302  if (archetypeListFolder != null) {
304  }
305  archetypeListFolder = folder;
306  if (archetypeListFolder != null) {
308  }
309  } finally {
310  updateInProgress = false;
311  }
312  }
313  }
314  }
315 
320  @NotNull
321  private JPopupMenu createListPopupMenu() {
322  final JPopupMenu menu = new JPopupMenu();
323  menu.add(ACTION_BUILDER.createAction(false, "editPopup", this));
324  return menu;
325  }
326 
330  @ActionMethod
331  public void editPopup() {
332  //XXX: gameObjectAttributesDialogFactory.showAttributeDialog(getSelectedArchetype());
333  }
334 
339  public void selectArchetype(@NotNull final R archetype) {
340  final List<ArchetypeChooserFolder<G, A, R>> archetypeChooserFolders = archetypeChooserPanel.getFolders();
341  for (int index = 1; index < archetypeChooserFolders.size(); index++) {
342  final ArchetypeChooserFolder<G, A, R> folder = archetypeChooserFolders.get(index);
343  if (folder.containsArchetype(archetype)) {
344  folders.setSelectedIndex(index);
345  setSelectedArchetype(archetype);
346  return;
347  }
348  }
349 
350  }
351 
356  @NotNull
358  return archetypeChooserPanel;
359  }
360 
361 }
net.sf.gridarta.gui.panel.archetypechooser.ArchetypePanel.archetypeListModel
final DefaultListModel< R > archetypeListModel
Definition: ArchetypePanel.java:93
net.sf.gridarta.model.archetypechooser.ArchetypeChooserPanel.getFolders
List< ArchetypeChooserFolder< G, A, R > > getFolders()
Definition: ArchetypeChooserPanel.java:125
net.sf.gridarta.gui.panel.archetypechooser.ArchetypePanel.archetypeListFolder
ArchetypeChooserFolder< G, A, R > archetypeListFolder
Definition: ArchetypePanel.java:108
net.sf.gridarta.gui.panel.archetypechooser.ArchetypePanel.editPopup
void editPopup()
Definition: ArchetypePanel.java:331
net.sf.gridarta.gui.panel.archetypechooser.ArchetypePanel.updateCellRenderer
void updateCellRenderer(@NotNull final DisplayMode< G, A, R > displayMode)
Definition: ArchetypePanel.java:238
net.sf.gridarta.model.archetypechooser.ArchetypeChooserModel
Definition: ArchetypeChooserModel.java:38
net.sf.gridarta
net.sf.gridarta.model.archetypechooser.ArchetypeChooserFolderListener
Definition: ArchetypeChooserFolderListener.java:33
net.sf.gridarta.model.archetypechooser
Definition: ArchetypeChooserFolder.java:20
net.sf
net.sf.gridarta.gui.panel.archetypechooser.ArchetypePanel.getArchetypeChooserPanel
ArchetypeChooserPanel< G, A, R > getArchetypeChooserPanel()
Definition: ArchetypePanel.java:357
net.sf.gridarta.gui.panel.archetypechooser.ArchetypePanel.setSelectedArchetype
void setSelectedArchetype(@Nullable final R archetype)
Definition: ArchetypePanel.java:262
net.sf.gridarta.utils.CommonConstants
Definition: CommonConstants.java:28
net.sf.gridarta.gui.panel.archetypechooser.ArchetypePanel.ArchetypePanel
ArchetypePanel(@NotNull final ArchetypeChooserModel< G, A, R > archetypeChooserModel, @NotNull final ArchetypeChooserPanel< G, A, R > archetypeChooserPanel)
Definition: ArchetypePanel.java:143
net.sf.gridarta.gui.panel.archetypechooser.ArchetypePanel.archetypeChooserPanel
final ArchetypeChooserPanel< G, A, R > archetypeChooserPanel
Definition: ArchetypePanel.java:78
net.sf.gridarta.model.archetype
Definition: AbstractArchetype.java:20
net.sf.gridarta.model.gameobject.GameObject
Definition: GameObject.java:36
net.sf.gridarta.gui.panel.archetypechooser.ArchetypePanel.createListPopupMenu
JPopupMenu createListPopupMenu()
Definition: ArchetypePanel.java:321
net.sf.gridarta.model.archetypechooser.ArchetypeChooserFolder
Definition: ArchetypeChooserFolder.java:40
net.sf.gridarta.model.archetypechooser.ArchetypeChooserFolder.removeArchetypeChooserFolderListener
void removeArchetypeChooserFolderListener(@NotNull final ArchetypeChooserFolderListener< G, A, R > listener)
Definition: ArchetypeChooserFolder.java:92
net.sf.gridarta.model.gameobject
Definition: AbstractGameObject.java:20
net
net.sf.gridarta.utils.CommonConstants.BG_COLOR
static final Color BG_COLOR
Definition: CommonConstants.java:38
net.sf.gridarta.gui.panel.archetypechooser.FolderListCellRenderer
Definition: FolderListCellRenderer.java:32
net.sf.gridarta.model.maparchobject.MapArchObject
Definition: MapArchObject.java:40
net.sf.gridarta.model.archetypechooser.ArchetypeChooserPanel
Definition: ArchetypeChooserPanel.java:40
net.sf.gridarta.gui.panel.archetypechooser.ArchetypePanel.displayMode
Comparator< Archetype< G, A, R > > displayMode
Definition: ArchetypePanel.java:122
net.sf.gridarta.gui.panel.archetypechooser.ArchetypePanel.getSelectedArchetype
R getSelectedArchetype()
Definition: ArchetypePanel.java:253
net.sf.gridarta.gui.panel.archetypechooser.ArchetypePanel.archetypeList
final JList< R > archetypeList
Definition: ArchetypePanel.java:101
net.sf.gridarta.model.archetypechooser.ArchetypeChooserFolder.containsArchetype
boolean containsArchetype(@NotNull final R archetype)
Definition: ArchetypeChooserFolder.java:156
net.sf.gridarta.gui.panel.archetypechooser.ArchetypePanel.serialVersionUID
static final long serialVersionUID
Definition: ArchetypePanel.java:65
net.sf.gridarta.gui.panel.archetypechooser.ArchetypePanel.selectArchetype
void selectArchetype(@NotNull final R archetype)
Definition: ArchetypePanel.java:339
net.sf.gridarta.gui.panel.archetypechooser.ArchetypePanel.updateInProgress
boolean updateInProgress
Definition: ArchetypePanel.java:129
net.sf.gridarta.gui.panel.archetypechooser.ArchetypePanel.ACTION_BUILDER
static final ActionBuilder ACTION_BUILDER
Definition: ArchetypePanel.java:71
net.sf.gridarta.gui.panel.archetypechooser.ArchetypePanel.getSelectedFolder
ArchetypeChooserFolder< G, A, R > getSelectedFolder()
Definition: ArchetypePanel.java:272
net.sf.gridarta.model
net.sf.gridarta.model.archetype.Archetype
Definition: Archetype.java:41
net.sf.gridarta.model.archetypechooser.ArchetypeChooserFolder.addArchetypeChooserFolderListener
void addArchetypeChooserFolderListener(@NotNull final ArchetypeChooserFolderListener< G, A, R > listener)
Definition: ArchetypeChooserFolder.java:84
net.sf.gridarta.gui.panel.archetypechooser.ArchetypePanel.updateArchetypeList
void updateArchetypeList()
Definition: ArchetypePanel.java:281
net.sf.gridarta.gui.panel.archetypechooser.ArchetypePanel.archetypeChooserFolderListener
final ArchetypeChooserFolderListener< G, A, R > archetypeChooserFolderListener
Definition: ArchetypePanel.java:136
net.sf.gridarta.model.archetypechooser.ArchetypeChooserFolder.getSelectedArchetype
R getSelectedArchetype()
Definition: ArchetypeChooserFolder.java:127
net.sf.gridarta.model.archetypechooser.ArchetypeChooserPanel.setSelectedFolder
void setSelectedFolder(@NotNull final ArchetypeChooserFolder< G, A, R > selectedFolder)
Definition: ArchetypeChooserPanel.java:197
net.sf.gridarta.model.archetypechooser.ArchetypeChooserPanelListener
Definition: ArchetypeChooserPanelListener.java:34
net.sf.gridarta.gui.panel.archetypechooser.ArchetypePanel.folders
final JComboBox< ArchetypeChooserFolder< G, A, R > > folders
Definition: ArchetypePanel.java:115
net.sf.gridarta.model.maparchobject
Definition: AbstractMapArchObject.java:20
net.sf.gridarta.model.archetypechooser.DisplayMode
Definition: DisplayMode.java:35
net.sf.gridarta.model.archetypechooser.ArchetypeChooserFolder.setSelectedArchetype
void setSelectedArchetype(@Nullable final R selectedArchetype)
Definition: ArchetypeChooserFolder.java:136
net.sf.gridarta.model.archetypechooser.ArchetypeChooserPanel.addArchetypeChooserPanelListener
void addArchetypeChooserPanelListener(@NotNull final ArchetypeChooserPanelListener< G, A, R > listener)
Definition: ArchetypeChooserPanel.java:98
net.sf.gridarta.model.archetypechooser.ArchetypeChooserModelListener
Definition: ArchetypeChooserModelListener.java:34
net.sf.gridarta.gui.panel.archetypechooser.ArchetypePanel
Definition: ArchetypePanel.java:60
net.sf.gridarta.utils
Definition: ActionBuilderUtils.java:20
net.sf.gridarta.model.archetypechooser.ArchetypeChooserPanel.getSelectedFolder
ArchetypeChooserFolder< G, A, R > getSelectedFolder()
Definition: ArchetypeChooserPanel.java:189
net.sf.gridarta.model.archetypechooser.ArchetypeChooserFolder.getArchetypes
Collection< R > getArchetypes()
Definition: ArchetypeChooserFolder.java:110
net.sf.gridarta.gui.panel.archetypechooser.ArchetypePanel.popupMenu
final JPopupMenu popupMenu
Definition: ArchetypePanel.java:86