-
Notifications
You must be signed in to change notification settings - Fork 5
/
GSTagImpl.java
134 lines (113 loc) · 4.14 KB
/
GSTagImpl.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
package org.genericsystem.reactor.gscomponents;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Consumer;
import org.genericsystem.defaults.tools.ObservableListWrapperExtended;
import org.genericsystem.reactor.Context;
import org.genericsystem.reactor.MetaBinding;
import org.genericsystem.reactor.Tag;
import org.genericsystem.reactor.model.ModeSelector;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.collections.transformation.FilteredList;
public abstract class GSTagImpl implements Tag {
private MetaBinding<?> metaBinding;
private final List<Consumer<Context>> preFixedBindings = new ArrayList<>();
private final List<Consumer<Context>> postFixedBindings = new ArrayList<>();
private Tag parent;
private final ObservableList<Tag> children = FXCollections.observableArrayList();
private ObservableList<Tag> filteredChildren = children;
protected ModeSelector modeSelector;
protected GSTagImpl(Tag parent) {
setParent(parent);
beforeProcessAnnotations();
getRootTag().getAnnotationsManager().processAnnotations(this);
init();
}
public void setParent(Tag parent) {
this.parent = parent;
if (parent != null)
parent.getObservableChildren().add(this);
}
protected GSTagImpl() {
}
@Override
public String toString() {
return getTag() + " " + getClass().getName();
}
@Override
public List<Consumer<Context>> getPreFixedBindings() {
return preFixedBindings;
}
@Override
public List<Consumer<Context>> getPostFixedBindings() {
return postFixedBindings;
}
@Override
@SuppressWarnings("unchecked")
public <BETWEEN> MetaBinding<BETWEEN> getMetaBinding() {
return (MetaBinding<BETWEEN>) metaBinding;
}
@Override
public <BETWEEN> void setMetaBinding(MetaBinding<BETWEEN> metaBinding) {
if (this.metaBinding != null)
throw new IllegalStateException("MetaBinding already defined");
this.metaBinding = metaBinding;
}
@Override
public ObservableList<Tag> getObservableChildren() {
return children;
}
@Override
public ObservableList<Tag> getObservableChildren(Context context) {
if (!context.containsProperty(this, "extractorsMap"))
createNewInitializedProperty("extractorsMap", context, c -> new HashMap<Tag, ObservableValue[]>() {
private static final long serialVersionUID = -435743147955810836L;
@Override
public ObservableValue[] get(Object key) {
ObservableValue[] result = super.get(key);
Tag child = (Tag) key;
if (result == null)
put(child, result = child.getModeSelector() != null ? new ObservableValue[] { child.getModeSelector().apply(context, child) } : new ObservableValue[] { new SimpleBooleanProperty(true) });
return result;
};
});
ObservableList<Tag> extObs = new ObservableListWrapperExtended<Tag>(children, child -> getExtractors(context).get(child));
filteredChildren = new FilteredList<Tag>(extObs, child -> Boolean.TRUE.equals(getExtractors(context).get(child)[0].getValue()));
// TODO: Garder transmitSuccessiveInvalidations ou non ?
// TODO: ajouter MinimalChangesObservableList
// filteredChildren = new ListBinding<Tag>() {
// {
// for (Tag child : children)
// if (child.getModeSelector() != null)
// bind(child.getModeSelector().apply(context, child));
// }
//
// @Override
// protected ObservableList<Tag> computeValue() {
// return children.filtered(child -> child.getModeSelector() != null ? Boolean.TRUE.equals(child.getModeSelector().apply(context, child).getValue()) : true);
// }
// };
return filteredChildren;
}
private Map<Tag, ObservableValue[]> getExtractors(Context context) {
return this.<Map<Tag, ObservableValue[]>> getProperty("extractorsMap", context).getValue();
}
@Override
@SuppressWarnings("unchecked")
public <COMPONENT extends Tag> COMPONENT getParent() {
return (COMPONENT) parent;
}
@Override
public void setModeSelector(ModeSelector modeSelector) {
this.modeSelector = modeSelector;
}
@Override
public ModeSelector getModeSelector() {
return modeSelector;
}
}