Gridarta Editor
ArchetypeChooserPanel.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.model.archetypechooser;
21 
22 import java.io.Serializable;
23 import java.util.ArrayList;
24 import java.util.Collections;
25 import java.util.List;
30 import org.jetbrains.annotations.NotNull;
31 import org.jetbrains.annotations.Nullable;
32 
39 public class ArchetypeChooserPanel<G extends GameObject<G, A, R>, A extends MapArchObject<A>, R extends Archetype<G, A, R>> implements Serializable {
40 
44  private static final long serialVersionUID = 1L;
45 
50  @NotNull
51  private final String name;
52 
59  @NotNull
60  private final List<ArchetypeChooserFolder<G, A, R>> folders = new ArrayList<>();
61 
67  @NotNull
69 
74  @NotNull
75  private final transient ArchetypeChooserFolderListener<G, A, R> archetypeChooserFolderListener = this::fireSelectedArchetypeChanged;
76 
80  @NotNull
82 
87  public ArchetypeChooserPanel(@NotNull final String name) {
88  this.name = name;
89  folders.add(selectedFolder);
90  selectedFolder.addArchetypeChooserFolderListener(archetypeChooserFolderListener);
91  }
92 
98  listeners.add(listener);
99  }
100 
106  listeners.remove(listener);
107  }
108 
113  @NotNull
114  public String getName() {
115  return name;
116  }
117 
123  @NotNull
124  public List<ArchetypeChooserFolder<G, A, R>> getFolders() {
125  return Collections.unmodifiableList(folders);
126  }
127 
133  public void addArchetype(@NotNull final String folder, @NotNull final R archetype) {
134  getOrCreateFolder(folder).addArchetype(archetype);
135  getDefaultFolder().addArchetype(archetype);
136  }
137 
143  @NotNull
145  return folders.get(0);
146  }
147 
154  @NotNull
155  private ArchetypeChooserFolder<G, A, R> getOrCreateFolder(@NotNull final String folderName) {
156  final ArchetypeChooserFolder<G, A, R> existingFolder = getFolder(folderName);
157  if (existingFolder != null) {
158  return existingFolder;
159  }
160 
161  final ArchetypeChooserFolder<G, A, R> folder = new ArchetypeChooserFolder<>(folderName);
162  folders.add(folder);
163  return folder;
164  }
165 
171  @Nullable
172  public ArchetypeChooserFolder<G, A, R> getFolder(@NotNull final String folderName) {
173  for (int i = 1; i < folders.size(); i++) {
174  final ArchetypeChooserFolder<G, A, R> folder = folders.get(i);
175  if (folder.getName().equals(folderName)) {
176  return folder;
177  }
178  }
179 
180  return null;
181  }
182 
187  @NotNull
189  return selectedFolder;
190  }
191 
196  public void setSelectedFolder(@NotNull final ArchetypeChooserFolder<G, A, R> selectedFolder) {
197  if (!folders.contains(selectedFolder)) {
198  throw new IllegalArgumentException("selected folder " + selectedFolder.getName() + " is not part of the panel");
199  }
200 
201  if (this.selectedFolder == selectedFolder) {
202  return;
203  }
204 
205  this.selectedFolder.removeArchetypeChooserFolderListener(archetypeChooserFolderListener);
206  this.selectedFolder = selectedFolder;
207  this.selectedFolder.addArchetypeChooserFolderListener(archetypeChooserFolderListener);
208 
209  for (final ArchetypeChooserPanelListener<G, A, R> listener : listeners.getListeners()) {
210  listener.selectedFolderChanged(selectedFolder);
211  }
212  fireSelectedArchetypeChanged(selectedFolder.getSelectedArchetype());
213  }
214 
221  private void fireSelectedArchetypeChanged(@Nullable final R selectedArchetype) {
222  for (final ArchetypeChooserPanelListener<G, A, R> listener : listeners.getListeners()) {
223  listener.selectedArchetypeChanged(selectedArchetype);
224  }
225  }
226 
227 }
ArchetypeChooserFolder< G, A, R > selectedFolder
The selected ArchetypeChooserFolder.
void removeArchetypeChooserPanelListener(@NotNull final ArchetypeChooserPanelListener< G, A, R > listener)
Removes a listener to be notified of changes.
final List< ArchetypeChooserFolder< G, A, R > > folders
The ArchetypeChooserFolders in this panel.
T [] getListeners()
Returns an array of all the listeners.
void fireSelectedArchetypeChanged(@Nullable final R selectedArchetype)
Notifies all registered ArchetypeChooserPanelListeners that the selected archetype has changed...
ArchetypeChooserFolder< G, A, R > getFolder(@NotNull final String folderName)
Returns an ArchetypeChooserFolder by folder name.
A named panel within the ArchetypeChooserModel.
ArchetypeChooserPanel(@NotNull final String name)
Creates a new instance.
void setSelectedFolder(@NotNull final ArchetypeChooserFolder< G, A, R > selectedFolder)
Sets the selected ArchetypeChooserFolder.
Base package of all Gridarta classes.
Reflects a game object (object on a map).
Definition: GameObject.java:36
void remove(@NotNull final T listener)
Removes a listener.
GameObjects are the objects based on Archetypes found on maps.
void add(@NotNull final T listener)
Adds a listener.
Interface for listeners interested in ArchetypeChooserPanel related events.
ArchetypeChooserFolder< G, A, R > getOrCreateFolder(@NotNull final String folderName)
Returns an ArchetypeChooserFolder by folder name.
final EventListenerList2< ArchetypeChooserPanelListener< G, A, R > > listeners
The registered listeners.
List< ArchetypeChooserFolder< G, A, R > > getFolders()
Returns the ArchetypeChooserFolders.
Type-safe version of EventListenerList.
void addArchetype(@NotNull final R archetype)
Adds an Archetype to this folder.
ArchetypeChooserFolder< G, A, R > getSelectedFolder()
Returns the selected ArchetypeChooserFolder.
void addArchetypeChooserFolderListener(@NotNull final ArchetypeChooserFolderListener< G, A, R > listener)
Adds a listener to be notified of changes.
void addArchetype(@NotNull final String folder, @NotNull final R archetype)
Adds an Archetype to this panel.
ArchetypeChooserFolder< G, A, R > getDefaultFolder()
Returns the default ArchetypeChooserFolder that contains all Archetypes of all folders.
void addArchetypeChooserPanelListener(@NotNull final ArchetypeChooserPanelListener< G, A, R > listener)
Adds a listener to be notified of changes.
final transient ArchetypeChooserFolderListener< G, A, R > archetypeChooserFolderListener
The ArchetypeChooserFolderListener attached to selectedFolder.