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.Collection;
25 import java.util.Collections;
26 import java.util.List;
27 import java.util.concurrent.CopyOnWriteArrayList;
31 import org.jetbrains.annotations.NotNull;
32 import org.jetbrains.annotations.Nullable;
33 
40 public class ArchetypeChooserPanel<G extends GameObject<G, A, R>, A extends MapArchObject<A>, R extends Archetype<G, A, R>> implements Serializable {
41 
45  private static final long serialVersionUID = 1L;
46 
51  @NotNull
52  private final String name;
53 
60  @NotNull
61  private final List<ArchetypeChooserFolder<G, A, R>> folders = new ArrayList<>();
62 
68  @NotNull
70 
75  @NotNull
76  private final transient ArchetypeChooserFolderListener<G, A, R> archetypeChooserFolderListener = this::fireSelectedArchetypeChanged;
77 
81  @NotNull
82  private final Collection<ArchetypeChooserPanelListener<G, A, R>> listeners = new CopyOnWriteArrayList<>();
83 
88  public ArchetypeChooserPanel(@NotNull final String name) {
89  this.name = name;
92  }
93 
99  listeners.add(listener);
100  }
101 
107  listeners.remove(listener);
108  }
109 
114  @NotNull
115  public String getName() {
116  return name;
117  }
118 
124  @NotNull
125  public List<ArchetypeChooserFolder<G, A, R>> getFolders() {
126  return Collections.unmodifiableList(folders);
127  }
128 
134  public void addArchetype(@NotNull final String folder, @NotNull final R archetype) {
135  getOrCreateFolder(folder).addArchetype(archetype);
136  getDefaultFolder().addArchetype(archetype);
137  }
138 
144  @NotNull
146  return folders.get(0);
147  }
148 
155  @NotNull
156  private ArchetypeChooserFolder<G, A, R> getOrCreateFolder(@NotNull final String folderName) {
157  final ArchetypeChooserFolder<G, A, R> existingFolder = getFolder(folderName);
158  if (existingFolder != null) {
159  return existingFolder;
160  }
161 
162  final ArchetypeChooserFolder<G, A, R> folder = new ArchetypeChooserFolder<>(folderName);
163  folders.add(folder);
164  return folder;
165  }
166 
172  @Nullable
173  private ArchetypeChooserFolder<G, A, R> getFolder(@NotNull final String folderName) {
174  for (int i = 1; i < folders.size(); i++) {
175  final ArchetypeChooserFolder<G, A, R> folder = folders.get(i);
176  if (folder.getName().equals(folderName)) {
177  return folder;
178  }
179  }
180 
181  return null;
182  }
183 
188  @NotNull
190  return selectedFolder;
191  }
192 
198  if (!folders.contains(selectedFolder)) {
199  throw new IllegalArgumentException("selected folder " + selectedFolder.getName() + " is not part of the panel");
200  }
201 
202  if (this.selectedFolder == selectedFolder) {
203  return;
204  }
205 
206  this.selectedFolder.removeArchetypeChooserFolderListener(archetypeChooserFolderListener);
207  this.selectedFolder = selectedFolder;
209 
210  for (final ArchetypeChooserPanelListener<G, A, R> listener : listeners) {
211  listener.selectedFolderChanged(selectedFolder);
212  }
214  }
215 
222  private void fireSelectedArchetypeChanged(@Nullable final R selectedArchetype) {
223  for (final ArchetypeChooserPanelListener<G, A, R> listener : listeners) {
224  listener.selectedArchetypeChanged(selectedArchetype);
225  }
226  }
227 
228 }
net.sf.gridarta.model.archetypechooser.ArchetypeChooserPanel.getFolders
List< ArchetypeChooserFolder< G, A, R > > getFolders()
Definition: ArchetypeChooserPanel.java:125
net.sf.gridarta.model.archetypechooser.ArchetypeChooserPanel.selectedFolder
ArchetypeChooserFolder< G, A, R > selectedFolder
Definition: ArchetypeChooserPanel.java:69
net.sf.gridarta.model.archetypechooser.ArchetypeChooserPanel.removeArchetypeChooserPanelListener
void removeArchetypeChooserPanelListener(@NotNull final ArchetypeChooserPanelListener< G, A, R > listener)
Definition: ArchetypeChooserPanel.java:106
net.sf.gridarta
net.sf.gridarta.model.archetypechooser.ArchetypeChooserFolderListener< G, A, R >
net.sf.gridarta.model.archetypechooser.ArchetypeChooserPanel.serialVersionUID
static final long serialVersionUID
Definition: ArchetypeChooserPanel.java:45
net.sf
net.sf.gridarta.model.archetypechooser.ArchetypeChooserPanel.getOrCreateFolder
ArchetypeChooserFolder< G, A, R > getOrCreateFolder(@NotNull final String folderName)
Definition: ArchetypeChooserPanel.java:156
net.sf.gridarta.model.archetypechooser.ArchetypeChooserPanel.name
final String name
Definition: ArchetypeChooserPanel.java:52
net.sf.gridarta.model.archetypechooser.ArchetypeChooserPanel.ArchetypeChooserPanel
ArchetypeChooserPanel(@NotNull final String name)
Definition: ArchetypeChooserPanel.java:88
net.sf.gridarta.model.archetype
Definition: AbstractArchetype.java:20
net.sf.gridarta.model.gameobject.GameObject
Definition: GameObject.java:36
net.sf.gridarta.model.archetypechooser.ArchetypeChooserFolder< G, A, R >
net.sf.gridarta.model.gameobject
Definition: AbstractGameObject.java:20
net
net.sf.gridarta.model.maparchobject.MapArchObject
Definition: MapArchObject.java:40
net.sf.gridarta.model.archetypechooser.ArchetypeChooserPanel.getDefaultFolder
ArchetypeChooserFolder< G, A, R > getDefaultFolder()
Definition: ArchetypeChooserPanel.java:145
net.sf.gridarta.model.archetypechooser.ArchetypeChooserPanel
Definition: ArchetypeChooserPanel.java:40
net.sf.gridarta.model.archetypechooser.ArchetypeChooserPanel.folders
final List< ArchetypeChooserFolder< G, A, R > > folders
Definition: ArchetypeChooserPanel.java:61
net.sf.gridarta.model.archetypechooser.ArchetypeChooserPanel.listeners
final Collection< ArchetypeChooserPanelListener< G, A, R > > listeners
Definition: ArchetypeChooserPanel.java:82
net.sf.gridarta.model.archetypechooser.ArchetypeChooserFolder.addArchetype
void addArchetype(@NotNull final R archetype)
Definition: ArchetypeChooserFolder.java:118
net.sf.gridarta.model
net.sf.gridarta.model.archetype.Archetype
Definition: Archetype.java:41
net.sf.gridarta.model.archetypechooser.ArchetypeChooserPanel.getFolder
ArchetypeChooserFolder< G, A, R > getFolder(@NotNull final String folderName)
Definition: ArchetypeChooserPanel.java:173
net.sf.gridarta.model.archetypechooser.ArchetypeChooserFolder.addArchetypeChooserFolderListener
void addArchetypeChooserFolderListener(@NotNull final ArchetypeChooserFolderListener< G, A, R > listener)
Definition: ArchetypeChooserFolder.java:84
net.sf.gridarta.model.archetypechooser.ArchetypeChooserPanel.fireSelectedArchetypeChanged
void fireSelectedArchetypeChanged(@Nullable final R selectedArchetype)
Definition: ArchetypeChooserPanel.java:222
net.sf.gridarta.model.archetypechooser.ArchetypeChooserPanel.addArchetype
void addArchetype(@NotNull final String folder, @NotNull final R archetype)
Definition: ArchetypeChooserPanel.java:134
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< G, A, R >
net.sf.gridarta.model.maparchobject
Definition: AbstractMapArchObject.java:20
net.sf.gridarta.model.archetypechooser.ArchetypeChooserPanel.archetypeChooserFolderListener
final transient ArchetypeChooserFolderListener< G, A, R > archetypeChooserFolderListener
Definition: ArchetypeChooserPanel.java:76
net.sf.gridarta.model.archetypechooser.ArchetypeChooserPanel.getName
String getName()
Definition: ArchetypeChooserPanel.java:115
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.ArchetypeChooserFolder.getName
String getName()
Definition: ArchetypeChooserFolder.java:101
net.sf.gridarta.model.archetypechooser.ArchetypeChooserPanel.getSelectedFolder
ArchetypeChooserFolder< G, A, R > getSelectedFolder()
Definition: ArchetypeChooserPanel.java:189