Crossfire JXClient, Trunk  R20561
KnowledgeManager.java
Go to the documentation of this file.
1 package com.realtime.crossfire.jxclient.knowledge;
2 
7 import java.util.ArrayList;
8 import java.util.Collection;
9 import java.util.Collections;
10 import java.util.Comparator;
11 import java.util.List;
12 import java.util.stream.Collectors;
13 import org.jetbrains.annotations.NotNull;
14 import org.jetbrains.annotations.Nullable;
15 
20 public class KnowledgeManager {
21 
25  @NotNull
26  private static final Comparator<KnowledgeItem> KNOWLEDGE_COMPARATOR = (o1, o2) -> o1.getKnowledgeTitle().compareTo(o2.getKnowledgeTitle());
27 
32  @NotNull
34 
35  @NotNull
36  private final List<String> types = new ArrayList<>();
37 
38  @NotNull
39  private final List<String> names = new ArrayList<>();
40 
41  @NotNull
42  private final List<Integer> faces = new ArrayList<>();
43 
44  @NotNull
45  private final List<Boolean> attempt = new ArrayList<>();
46 
47  @NotNull
48  private final Collection<KnowledgeItem> items = new ArrayList<>();
49 
50  @NotNull
51  private final List<KnowledgeItem> filteredItems = new ArrayList<>();
52 
53  @NotNull
54  private String typeFilter = "";
55 
60  @NotNull
61  @SuppressWarnings("FieldCanBeLocal")
63 
64  @Override
65  public void start() {
66  // ignore
67  }
68 
69  @Override
70  public void metaserver() {
71  // ignore
72  }
73 
74  @Override
75  public void preConnecting(@NotNull final String serverInfo) {
76  // ignore
77  }
78 
79  @Override
80  public void connecting(@NotNull final String serverInfo) {
81  types.clear();
82  faces.clear();
83  names.clear();
84  attempt.clear();
85  items.clear();
86  filteredItems.clear();
87  }
88 
89  @Override
90  public void connecting(@NotNull final ClientSocketState clientSocketState) {
91  // ignore
92  }
93 
94  @Override
95  public void connected() {
96  // ignore
97  }
98 
99  @Override
100  public void connectFailed(@NotNull final String reason) {
101  // ignore
102  }
103 
104  };
105 
106  public KnowledgeManager(@NotNull final GuiStateManager guiStateManager) {
107  guiStateManager.addGuiStateListener(guiStateListener);
108  }
109 
113  public void selectCharacter() {
114  items.clear();
115  filteredItems.clear();
116  }
117 
122  public void addKnowledgeListener(@NotNull final KnowledgeListener listener) {
123  listeners.add(listener);
124  }
125 
126  public void addKnowledgeType(@NotNull final String type, @NotNull final String name, final int face, final boolean canAttempt) {
127  types.add(type);
128  if (type.isEmpty()) {
129  names.add("All types");
130  } else {
131  names.add(name);
132  }
133  faces.add(face);
134  attempt.add(canAttempt);
135  for (final KnowledgeListener listener : listeners) {
136  listener.typeAdded(0);
137  }
138  }
139 
140  public void clearTypes() {
141  types.clear();
142  names.clear();
143  faces.clear();
144  attempt.clear();
145  }
146 
147  public int getTypes() {
148  return types.size();
149  }
150 
151  @NotNull
152  public String getTypeName(final int index) {
153  if (index < 0 || index >= faces.size()) {
154  return "";
155  }
156  return names.get(index);
157  }
158 
159  public int getTypeFace(final int index) {
160  if (index < 0 || index >= faces.size()) {
161  return 0;
162  }
163  return faces.get(index);
164  }
165 
166  public boolean canAttemptType(@NotNull final String type) {
167  for (int i = 0; i < types.size(); i++) {
168  if (type.equals(types.get(i))) {
169  return attempt.get(i);
170  }
171  }
172 
173  return false;
174  }
175 
176  public void addKnowledge(final int index, @NotNull final String type, @NotNull final String title, final int face) {
177  items.add(new KnowledgeItem(index, type, title, face));
178  filterKnowledge();
179  for (final KnowledgeListener listener : listeners) {
180  listener.knowledgeAdded(0);
181  }
182  }
183 
184  public int getKnowledgeCount() {
185  return filteredItems.size();
186  }
187 
193  @Nullable
194  public KnowledgeItem getKnowledge(final int index) {
195  try {
196  return filteredItems.get(index);
197  } catch (final IndexOutOfBoundsException ignored) {
198  return null;
199  }
200  }
201 
202  public void filterType(final int index) {
203  if (index < 0 || index >= types.size()) {
204  return;
205  }
206 
207  final String filter = types.get(index);
208 
209  if (typeFilter.equals(filter)) {
210  return;
211  }
212 
213  typeFilter = filter;
214  filterKnowledge();
215 
216  for (final KnowledgeListener listener : listeners) {
217  listener.knowledgeAdded(0);
218  }
219  }
220 
221  private void filterKnowledge() {
222  filteredItems.clear();
223  filteredItems.addAll(items.stream().filter(item -> typeFilter.isEmpty() || item.getType().equals(typeFilter)).collect(Collectors.toList()));
224  Collections.sort(filteredItems, KNOWLEDGE_COMPARATOR);
225  }
226 
227 }
KnowledgeItem getKnowledge(final int index)
Returns a KnowledgeItem instance by index.
Interface for listeners interested gui state changes.
KnowledgeManager(@NotNull final GuiStateManager guiStateManager)
static final Comparator< KnowledgeItem > KNOWLEDGE_COMPARATOR
Compare two knowledge items.
void addKnowledgeListener(@NotNull final KnowledgeListener listener)
Adds a KnowledgeListener to notify about changes.
final GuiStateListener guiStateListener
The GuiStateListener for detecting established or dropped connections.
void selectCharacter()
A character name was sent to the server.
void add(@NotNull final T listener)
Adds a listener.
void addKnowledge(final int index, @NotNull final String type, @NotNull final String title, final int face)
void addKnowledgeType(@NotNull final String type, @NotNull final String name, final int face, final boolean canAttempt)
Connection progress states of the Crossfire server connection.
final EventListenerList2< KnowledgeListener > listeners
The KnowledgeListeners to notify about changes.