1 | |
package org.jtheque.core.managers.feature; |
2 | |
|
3 | |
|
4 | |
|
5 | |
|
6 | |
|
7 | |
|
8 | |
|
9 | |
|
10 | |
|
11 | |
|
12 | |
|
13 | |
|
14 | |
|
15 | |
|
16 | |
|
17 | |
|
18 | |
|
19 | |
import org.jtheque.core.managers.AbstractManager; |
20 | |
import org.jtheque.core.managers.Managers; |
21 | |
import org.jtheque.core.managers.feature.Feature.FeatureType; |
22 | |
import org.jtheque.core.managers.resource.IResourceManager; |
23 | |
import org.jtheque.core.managers.resource.ImageType; |
24 | |
import org.jtheque.utils.collections.CollectionUtils; |
25 | |
|
26 | |
import javax.swing.Action; |
27 | |
import java.util.ArrayList; |
28 | |
import java.util.Collection; |
29 | |
import java.util.EnumMap; |
30 | |
import java.util.Map; |
31 | |
|
32 | |
|
33 | |
|
34 | |
|
35 | |
|
36 | |
|
37 | 0 | public final class FeatureManager extends AbstractManager implements IFeatureManager { |
38 | |
private final Collection<Feature> features; |
39 | |
|
40 | |
private final Map<CoreFeature, Feature> coreFeatures; |
41 | |
|
42 | |
|
43 | |
|
44 | |
|
45 | |
public FeatureManager() { |
46 | 0 | super(); |
47 | |
|
48 | 0 | features = new ArrayList<Feature>(10); |
49 | 0 | coreFeatures = new EnumMap<CoreFeature, Feature>(CoreFeature.class); |
50 | 0 | } |
51 | |
|
52 | |
@Override |
53 | |
public void init(){ |
54 | 0 | coreFeatures.put(CoreFeature.FILE, createAndAddFeature(0, "menu.file")); |
55 | 0 | coreFeatures.put(CoreFeature.EDIT, createAndAddFeature(1, "menu.edit")); |
56 | 0 | coreFeatures.put(CoreFeature.ADVANCED, createAndAddFeature(990, "menu.advanced")); |
57 | 0 | coreFeatures.put(CoreFeature.HELP, createAndAddFeature(1000, "menu.help")); |
58 | |
|
59 | 0 | addMenu(new CoreMenu()); |
60 | 0 | } |
61 | |
|
62 | |
@Override |
63 | |
public void addMenu(Menu menu){ |
64 | 0 | for(CoreFeature feature : CoreFeature.values()){ |
65 | 0 | for(Feature f : menu.getSubFeatures(feature)){ |
66 | 0 | getFeature(feature).addSubFeature(f); |
67 | |
} |
68 | |
} |
69 | |
|
70 | 0 | for(Feature f : menu.getMainFeatures()){ |
71 | 0 | addFeature(f); |
72 | |
} |
73 | 0 | } |
74 | |
|
75 | |
@Override |
76 | |
public void removeMenu(Menu menu){ |
77 | 0 | for(CoreFeature feature : CoreFeature.values()){ |
78 | 0 | for(Feature f : menu.getSubFeatures(feature)){ |
79 | 0 | getFeature(feature).removeSubFeature(f); |
80 | |
} |
81 | |
} |
82 | |
|
83 | 0 | for(Feature f : menu.getMainFeatures()){ |
84 | 0 | removeFeature(f); |
85 | |
} |
86 | 0 | } |
87 | |
|
88 | |
@Override |
89 | |
public Feature createFeature(int position, FeatureType type, String key) { |
90 | 0 | Feature feature = new ManagedFeature(); |
91 | 0 | feature.setPosition(position); |
92 | 0 | feature.setType(type); |
93 | 0 | feature.setTitleKey(key); |
94 | |
|
95 | 0 | return feature; |
96 | |
} |
97 | |
|
98 | |
|
99 | |
|
100 | |
|
101 | |
|
102 | |
|
103 | |
|
104 | |
|
105 | |
private Feature createAndAddFeature(int position, String key) { |
106 | 0 | Feature feature = createFeature(position, FeatureType.PACK, key); |
107 | |
|
108 | 0 | features.add(feature); |
109 | |
|
110 | 0 | return feature; |
111 | |
} |
112 | |
|
113 | |
@Override |
114 | |
public Feature addSubFeature(Feature parent, String actionName, FeatureType type, int position, String baseName, String icon) { |
115 | 0 | Action action = Managers.getManager(IResourceManager.class).getAction(actionName); |
116 | |
|
117 | 0 | action.putValue(Action.SMALL_ICON, Managers.getManager(IResourceManager.class).getIcon( |
118 | |
baseName, |
119 | |
icon, ImageType.PNG)); |
120 | |
|
121 | 0 | return addSubFeature(parent, action, type, position); |
122 | |
} |
123 | |
|
124 | |
@Override |
125 | |
public Feature addSubFeature(Feature parent, String action, FeatureType type, int position) { |
126 | 0 | return addSubFeature(parent, Managers.getManager(IResourceManager.class).getAction(action), type, position); |
127 | |
} |
128 | |
|
129 | |
|
130 | |
|
131 | |
|
132 | |
|
133 | |
|
134 | |
|
135 | |
|
136 | |
|
137 | |
|
138 | |
private static Feature addSubFeature(Feature parent, Action action, FeatureType type, int position) { |
139 | 0 | Feature feature = new Feature(); |
140 | 0 | feature.setType(type); |
141 | 0 | feature.setAction(action); |
142 | 0 | feature.setPosition(position); |
143 | |
|
144 | 0 | parent.addSubFeature(feature); |
145 | |
|
146 | 0 | return feature; |
147 | |
} |
148 | |
|
149 | |
@Override |
150 | |
public void addFeature(Feature feature) { |
151 | 0 | if (feature.getType() != FeatureType.PACK) { |
152 | 0 | throw new IllegalArgumentException("Can only add feature of type pack directly. "); |
153 | |
} |
154 | |
|
155 | 0 | features.add(feature); |
156 | |
|
157 | 0 | fireFeatureAdded(feature); |
158 | 0 | } |
159 | |
|
160 | |
@Override |
161 | |
public void removeFeature(Feature feature) { |
162 | 0 | features.remove(feature); |
163 | |
|
164 | 0 | fireFeatureRemoved(feature); |
165 | 0 | } |
166 | |
|
167 | |
@Override |
168 | |
public Collection<Feature> getFeatures() { |
169 | 0 | return CollectionUtils.copyOf(features); |
170 | |
} |
171 | |
|
172 | |
@Override |
173 | |
public Feature getFeature(CoreFeature feature) { |
174 | 0 | return coreFeatures.get(feature); |
175 | |
} |
176 | |
|
177 | |
@Override |
178 | |
public void addFeatureListener(FeatureListener listener) { |
179 | 0 | getListeners().add(FeatureListener.class, listener); |
180 | 0 | } |
181 | |
|
182 | |
@Override |
183 | |
public void removeFeatureListener(FeatureListener listener) { |
184 | 0 | getListeners().add(FeatureListener.class, listener); |
185 | 0 | } |
186 | |
|
187 | |
|
188 | |
|
189 | |
|
190 | |
|
191 | |
|
192 | |
private void fireFeatureAdded(Feature feature) { |
193 | 0 | FeatureListener[] l = getListeners().getListeners(FeatureListener.class); |
194 | |
|
195 | 0 | FeatureEvent event = new FeatureEvent(this, feature); |
196 | |
|
197 | 0 | for (FeatureListener listener : l) { |
198 | 0 | listener.featureAdded(event); |
199 | |
} |
200 | 0 | } |
201 | |
|
202 | |
|
203 | |
|
204 | |
|
205 | |
|
206 | |
|
207 | |
private void fireFeatureRemoved(Feature feature) { |
208 | 0 | FeatureListener[] l = getListeners().getListeners(FeatureListener.class); |
209 | |
|
210 | 0 | FeatureEvent event = new FeatureEvent(this, feature); |
211 | |
|
212 | 0 | for (FeatureListener listener : l) { |
213 | 0 | listener.featureRemoved(event); |
214 | |
} |
215 | 0 | } |
216 | |
|
217 | |
|
218 | |
|
219 | |
|
220 | |
|
221 | |
|
222 | 0 | protected static final class ManagedFeature extends Feature { |
223 | |
@Override |
224 | |
public void addSubFeature(Feature feature) { |
225 | 0 | super.addSubFeature(feature); |
226 | |
|
227 | 0 | fireSubFeatureAdded(this, feature); |
228 | 0 | } |
229 | |
|
230 | |
@Override |
231 | |
public void removeSubFeature(Feature feature) { |
232 | 0 | super.removeSubFeature(feature); |
233 | |
|
234 | 0 | fireSubFeatureRemoved(this, feature); |
235 | 0 | } |
236 | |
|
237 | |
|
238 | |
|
239 | |
|
240 | |
|
241 | |
|
242 | |
|
243 | |
private void fireSubFeatureAdded(Feature feature, Feature subFeature) { |
244 | 0 | FeatureListener[] l = getListeners().getListeners(FeatureListener.class); |
245 | |
|
246 | 0 | FeatureEvent event = new FeatureEvent(this, feature, subFeature); |
247 | |
|
248 | 0 | for (FeatureListener listener : l) { |
249 | 0 | listener.subFeatureAdded(event); |
250 | |
} |
251 | 0 | } |
252 | |
|
253 | |
|
254 | |
|
255 | |
|
256 | |
|
257 | |
|
258 | |
|
259 | |
private void fireSubFeatureRemoved(Feature feature, Feature subFeature) { |
260 | 0 | FeatureListener[] l = getListeners().getListeners(FeatureListener.class); |
261 | |
|
262 | 0 | FeatureEvent event = new FeatureEvent(this, feature, subFeature); |
263 | |
|
264 | 0 | for (FeatureListener listener : l) { |
265 | 0 | listener.subFeatureRemoved(event); |
266 | |
} |
267 | 0 | } |
268 | |
} |
269 | |
} |