1 package cz.cuni.amis.pogamut.sposh.elements;
2
3 import java.util.AbstractList;
4 import java.util.Collections;
5 import java.util.LinkedList;
6 import java.util.List;
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 public final class Trigger<OWNER extends PoshElement> extends AbstractList<Sense> {
27
28
29
30
31 private final List<Sense> senses = new LinkedList<Sense>();
32
33
34
35 private final List<Sense> sensesUm = Collections.unmodifiableList(senses);
36
37
38
39 private final OWNER owner;
40
41
42
43
44
45
46
47
48 Trigger(OWNER owner, List<Sense> senses) {
49 this.owner = owner;
50
51 for (Sense sense : senses) {
52 assert sense.getParent() == null;
53 add(sense);
54 }
55 }
56
57
58
59
60
61
62
63 Trigger(OWNER owner) {
64 this(owner, Collections.<Sense>emptyList());
65 }
66
67
68
69
70
71
72
73 @Override
74 public String toString() {
75 StringBuilder sb = new StringBuilder();
76 sb.append('(');
77 boolean first = true;
78
79 for (Sense sense : sensesUm) {
80 if (first) {
81 first = false;
82 sb.append(sense.toString());
83 } else {
84 sb.append(' ');
85 sb.append(sense.toString());
86 }
87 }
88
89 sb.append(')');
90 return sb.toString();
91 }
92
93
94
95
96
97
98 @Override
99 public boolean add(Sense sense) {
100 assert !contains(sense);
101 assert !sense.isChildOfParent();
102
103 sense.setParent(owner);
104 boolean ret = senses.add(sense);
105
106 owner.emitChildNode(sense);
107 return ret;
108 }
109
110
111
112
113
114
115
116 @Override
117 public Sense get(int index) {
118 return senses.get(index);
119 }
120
121
122
123
124
125
126
127 @Override
128 public void add(int index, Sense newSense) {
129 assert !contains(newSense);
130 assert !newSense.isChildOfParent();
131
132 newSense.setParent(owner);
133 senses.add(index, newSense);
134
135 owner.emitChildNode(newSense);
136 }
137
138
139
140
141
142
143
144
145 @Override
146 public Sense remove(int index) {
147 Sense sense = senses.remove(index);
148 sense.setParent(null);
149 owner.emitChildDeleted(sense, index);
150 return sense;
151 }
152
153
154
155
156
157
158 @Override
159 public int size() {
160 return senses.size();
161 }
162
163
164
165
166
167
168 List<Sense> unmodifiable() {
169 return sensesUm;
170 }
171
172
173
174
175
176
177
178
179
180
181 public void moveSense(int newIndex, Sense movedSense) {
182 assert sensesUm.contains(movedSense);
183 assert movedSense.getTrigger() == this;
184
185 int originalIndex = sensesUm.indexOf(movedSense);
186
187 if (newIndex > originalIndex) {
188 Sense removed = senses.remove(originalIndex);
189 senses.add(newIndex, movedSense);
190 } else if (newIndex < originalIndex) {
191 senses.remove(originalIndex);
192 senses.add(newIndex, movedSense);
193 } else {
194 return;
195 }
196 owner.emitChildMove(movedSense, originalIndex, newIndex);
197 }
198 }