1 | /* |
---|
2 | * To change this template, choose Tools | Templates |
---|
3 | * and open the template in the editor. |
---|
4 | */ |
---|
5 | package eu.clarin.sru.fcs.aggregator.sparam2; |
---|
6 | |
---|
7 | import java.util.ArrayList; |
---|
8 | import java.util.Arrays; |
---|
9 | import java.util.HashMap; |
---|
10 | import java.util.HashSet; |
---|
11 | import java.util.List; |
---|
12 | import java.util.Map; |
---|
13 | import java.util.Set; |
---|
14 | import org.zkoss.zk.ui.event.Event; |
---|
15 | import org.zkoss.zk.ui.event.EventListener; |
---|
16 | import org.zkoss.zk.ui.event.Events; |
---|
17 | import org.zkoss.zul.A; |
---|
18 | import org.zkoss.zul.Checkbox; |
---|
19 | import org.zkoss.zul.DefaultTreeNode; |
---|
20 | import org.zkoss.zul.Label; |
---|
21 | import org.zkoss.zul.Treecell; |
---|
22 | import org.zkoss.zul.Treeitem; |
---|
23 | import org.zkoss.zul.TreeitemRenderer; |
---|
24 | import org.zkoss.zul.Treerow; |
---|
25 | |
---|
26 | /** |
---|
27 | * |
---|
28 | * @author Yana Panchenko <yana_panchenko at yahoo.com> |
---|
29 | */ |
---|
30 | /** |
---|
31 | * The structure of tree |
---|
32 | * |
---|
33 | * <pre> |
---|
34 | * <treeitem> |
---|
35 | * <treerow> |
---|
36 | * <treecell>...</treecell> |
---|
37 | * </treerow> |
---|
38 | * <treechildren> |
---|
39 | * <treeitem>...</treeitem> |
---|
40 | * </treechildren> |
---|
41 | * </treeitem> |
---|
42 | * </pre> |
---|
43 | */ |
---|
44 | public class Corpus2Renderer implements TreeitemRenderer<DefaultTreeNode<Corpus2>> { |
---|
45 | |
---|
46 | Map<String, Set<Corpus2>> selectedCorpora = new HashMap<String,Set<Corpus2>>(); |
---|
47 | |
---|
48 | |
---|
49 | @Override |
---|
50 | public void render(Treeitem treeItem, DefaultTreeNode<Corpus2> treeNode, int index) throws Exception { |
---|
51 | |
---|
52 | Treerow dataRow = new Treerow(); |
---|
53 | dataRow.setParent(treeItem); |
---|
54 | treeItem.setValue(treeNode); |
---|
55 | treeItem.setOpen(false); |
---|
56 | Corpus2 data = treeNode.getData(); |
---|
57 | |
---|
58 | if (data.isTemporary()) { |
---|
59 | System.out.println("IN TEMP NODE!!!!"); |
---|
60 | return; |
---|
61 | } |
---|
62 | |
---|
63 | Treecell cell1 = createCellForSelectCorpus(data, dataRow); |
---|
64 | dataRow.appendChild(cell1); |
---|
65 | Treecell cell4 = createCellForHome(data); |
---|
66 | dataRow.appendChild(cell4); |
---|
67 | Treecell cell2 = createCellForCorpusLanguage(data); |
---|
68 | dataRow.appendChild(cell2); |
---|
69 | Treecell cell5 = createCellForCorpusInstitution(data); |
---|
70 | dataRow.appendChild(cell5); |
---|
71 | Treecell cell3 = createCellForCorpusDescription(data); |
---|
72 | dataRow.appendChild(cell3); |
---|
73 | |
---|
74 | treeItem.addEventListener(Events.ON_OPEN, new EventListener<Event>() { |
---|
75 | @Override |
---|
76 | public void onEvent(Event event) throws Exception { |
---|
77 | |
---|
78 | Treeitem openedTreeitem = (Treeitem) event.getTarget(); |
---|
79 | if (openedTreeitem.getTreechildren().getChildren().isEmpty()) { |
---|
80 | openedTreeitem.setOpen(false); |
---|
81 | } else { |
---|
82 | // get first child |
---|
83 | Treeitem childTreeitem = (Treeitem) openedTreeitem.getTreechildren().getChildren().get(0); |
---|
84 | // if this first child is temp node remove it |
---|
85 | DefaultTreeNode<Corpus2> openedNodeValue = (DefaultTreeNode<Corpus2>) openedTreeitem.getValue(); |
---|
86 | Corpus2 openedCorpus = openedNodeValue.getData(); |
---|
87 | DefaultTreeNode<Corpus2> childNodeValue = (DefaultTreeNode<Corpus2>) childTreeitem.getValue(); |
---|
88 | Corpus2 childCorpus = childNodeValue.getData(); |
---|
89 | if (childCorpus.isTemporary()) { |
---|
90 | openedNodeValue.getChildren().remove(childTreeitem.getIndex()); |
---|
91 | // add real corpora nodes |
---|
92 | Iterable<Corpus2> subcorpora = Corpus2.getSubcorpora(openedCorpus); |
---|
93 | boolean open = false; |
---|
94 | for (Corpus2 corpus : subcorpora) { |
---|
95 | List<DefaultTreeNode<Corpus2>> tempChildren = new ArrayList<DefaultTreeNode<Corpus2>>(1); |
---|
96 | Corpus2 tempChildCorpus = new Corpus2(); |
---|
97 | tempChildren.add(new DefaultTreeNode<Corpus2>(tempChildCorpus)); |
---|
98 | DefaultTreeNode<Corpus2> subcorporaNode = new DefaultTreeNode(corpus, tempChildren); |
---|
99 | openedNodeValue.getChildren().add(subcorporaNode); |
---|
100 | open = true; |
---|
101 | } |
---|
102 | openedTreeitem.setOpen(open); |
---|
103 | } |
---|
104 | } |
---|
105 | } |
---|
106 | }); |
---|
107 | |
---|
108 | |
---|
109 | } |
---|
110 | |
---|
111 | private Checkbox createCheckboxForSelectCorpus(Treerow dataRow) { |
---|
112 | Checkbox checkbox = new Checkbox(); |
---|
113 | checkbox.setValue(dataRow); |
---|
114 | Treeitem eventItem = (Treeitem) dataRow.getParent(); |
---|
115 | DefaultTreeNode<Corpus2> eventNode = (DefaultTreeNode<Corpus2>) eventItem.getValue(); |
---|
116 | if (selectedCorpora.containsKey(eventNode.getData().getEndpointUrl())) { |
---|
117 | if (selectedCorpora.get(eventNode.getData().getEndpointUrl()).contains(eventNode.getData())) { |
---|
118 | checkbox.setChecked(true); |
---|
119 | toggleCorpusCheckbox(eventNode.getData(), checkbox, dataRow); |
---|
120 | } |
---|
121 | } |
---|
122 | checkbox.addEventListener("onCheck", new EventListener() { |
---|
123 | @Override |
---|
124 | public void onEvent(Event event) throws Exception { |
---|
125 | Checkbox eventCheckbox = (Checkbox) event.getTarget(); |
---|
126 | Treerow eventRow = (Treerow) eventCheckbox.getValue(); |
---|
127 | Treeitem eventItem = (Treeitem) eventRow.getParent(); |
---|
128 | DefaultTreeNode<Corpus2> eventNode = (DefaultTreeNode<Corpus2>) eventItem.getValue(); |
---|
129 | toggleCorpusCheckbox(eventNode.getData(), eventCheckbox, eventRow); |
---|
130 | } |
---|
131 | }); |
---|
132 | return checkbox; |
---|
133 | } |
---|
134 | |
---|
135 | private void toggleCorpusCheckbox(Corpus2 corpus, Checkbox checkbox, Treerow row) { |
---|
136 | if (checkbox.isChecked()) { |
---|
137 | row.setZclass("z-treerow z-treerow-seld"); |
---|
138 | addToSelected(corpus); |
---|
139 | } else { |
---|
140 | row.setZclass("z-treerow"); |
---|
141 | removeFromSelected(corpus); |
---|
142 | } |
---|
143 | } |
---|
144 | |
---|
145 | public void updateItem(Treeitem item, boolean select) { |
---|
146 | Treerow row = (Treerow) item.getFirstChild(); |
---|
147 | Checkbox checkbox = (Checkbox) row.getFirstChild().getFirstChild(); |
---|
148 | DefaultTreeNode<Corpus2> node = (DefaultTreeNode<Corpus2>) item.getValue(); |
---|
149 | checkbox.setChecked(select); |
---|
150 | toggleCorpusCheckbox(node.getData(), checkbox, row); |
---|
151 | } |
---|
152 | |
---|
153 | |
---|
154 | // private Label createLabelForCorpus(Corpus2 data) { |
---|
155 | // Label label; |
---|
156 | // if (data.isRoot()) { |
---|
157 | // if (data.getInstitution() != null) { |
---|
158 | // label = new Label(data.getInstitution().getName()); |
---|
159 | // } else { |
---|
160 | // label = new Label(""); |
---|
161 | // } |
---|
162 | // } else { |
---|
163 | // label = new Label(data.getDisplayName()); |
---|
164 | // } |
---|
165 | // return label; |
---|
166 | // } |
---|
167 | // private Treecell createCellForSelectCorpus(Corpus2 data, Treerow dataRow) { |
---|
168 | // Treecell cell = new Treecell(); |
---|
169 | // Checkbox corpusCheckbox = createCheckboxForSelectCorpus(dataRow); |
---|
170 | // corpusCheckbox.setParent(cell); |
---|
171 | // if (data.getLandingPage() == null) { |
---|
172 | // Label corpusLabel = createLabelForCorpus(data); |
---|
173 | // corpusLabel.setParent(cell); |
---|
174 | // } else { |
---|
175 | //// A link = new A(data.getDisplayName()); |
---|
176 | //// link.setHref(data.getLandingPage()); |
---|
177 | //// link.setParent(cell); |
---|
178 | // Label corpusLabel = new Label(data.getDisplayName()); |
---|
179 | // corpusLabel.setParent(cell); |
---|
180 | // |
---|
181 | //// A link = new A(""); |
---|
182 | //// link.setHref(data.getLandingPage()); |
---|
183 | //// link.setImage("go-home.png"); |
---|
184 | //// link.setParent(cell); |
---|
185 | // } |
---|
186 | // return cell; |
---|
187 | // } |
---|
188 | private Treecell createCellForSelectCorpus(Corpus2 data, Treerow dataRow) { |
---|
189 | Treecell cell = new Treecell(); |
---|
190 | Checkbox corpusCheckbox = createCheckboxForSelectCorpus(dataRow); |
---|
191 | corpusCheckbox.setParent(cell); |
---|
192 | if (data.getDisplayName() == null) { |
---|
193 | Label corpusLabel = new Label(""); |
---|
194 | corpusLabel.setParent(cell); |
---|
195 | } else { |
---|
196 | Label corpusLabel = new Label(data.getDisplayName()); |
---|
197 | corpusLabel.setParent(cell); |
---|
198 | } |
---|
199 | return cell; |
---|
200 | } |
---|
201 | |
---|
202 | private Treecell createCellForCorpusInstitution(Corpus2 data) { |
---|
203 | Treecell cell = new Treecell(); |
---|
204 | if (data.getInstitution() == null) { |
---|
205 | Label label = new Label(""); |
---|
206 | label.setParent(cell); |
---|
207 | } else { |
---|
208 | Label label = new Label(data.getInstitution().getName()); |
---|
209 | label.setParent(cell); |
---|
210 | } |
---|
211 | return cell; |
---|
212 | } |
---|
213 | |
---|
214 | private Treecell createCellForHome(Corpus2 data) { |
---|
215 | Treecell cell = new Treecell(); |
---|
216 | if (data.getLandingPage() == null) { |
---|
217 | Label label = new Label(""); |
---|
218 | label.setParent(cell); |
---|
219 | } else { |
---|
220 | |
---|
221 | A link = new A(); |
---|
222 | link.setTarget("_blank"); |
---|
223 | link.setHref(data.getLandingPage()); |
---|
224 | link.setImage("go-home.png"); |
---|
225 | link.setParent(cell); |
---|
226 | } |
---|
227 | return cell; |
---|
228 | } |
---|
229 | |
---|
230 | private Treecell createCellForCorpusLanguage(Corpus2 data) { |
---|
231 | Treecell cell = new Treecell(); |
---|
232 | if (!data.getLanguages().isEmpty()) { |
---|
233 | StringBuilder langs = new StringBuilder(); |
---|
234 | for (String lang : data.getLanguages()) { |
---|
235 | langs.append(lang); |
---|
236 | langs.append(" "); |
---|
237 | } |
---|
238 | Label label = new Label(langs.toString()); |
---|
239 | label.setParent(cell); |
---|
240 | } else { |
---|
241 | Label label = new Label(""); |
---|
242 | label.setParent(cell); |
---|
243 | } |
---|
244 | return cell; |
---|
245 | } |
---|
246 | |
---|
247 | private Treecell createCellForCorpusDescription(Corpus2 data) { |
---|
248 | Treecell cell = new Treecell(); |
---|
249 | if (data.getDescription() != null) { |
---|
250 | //if (data.getDescription().length() > 40) { |
---|
251 | // String descrStart = data.getDescription().substring(0, 35) + " ..."; |
---|
252 | // Label label = new Label(descrStart); |
---|
253 | // label.setTooltiptext(data.getDescription()); |
---|
254 | // label.setParent(cell); |
---|
255 | //} else { |
---|
256 | Label label = new Label(data.getDescription()); |
---|
257 | label.setParent(cell); |
---|
258 | //} |
---|
259 | } else { |
---|
260 | Label label = new Label(""); |
---|
261 | label.setParent(cell); |
---|
262 | } |
---|
263 | |
---|
264 | return cell; |
---|
265 | } |
---|
266 | |
---|
267 | private void addToSelected(Corpus2 data) { |
---|
268 | if (!this.selectedCorpora.containsKey(data.getEndpointUrl())) { |
---|
269 | this.selectedCorpora.put(data.getEndpointUrl(), new HashSet<Corpus2>()); |
---|
270 | } |
---|
271 | this.selectedCorpora.get(data.getEndpointUrl()).add(data); |
---|
272 | |
---|
273 | } |
---|
274 | |
---|
275 | private void removeFromSelected(Corpus2 data) { |
---|
276 | if (this.selectedCorpora.containsKey(data.getEndpointUrl())) { |
---|
277 | this.selectedCorpora.get(data.getEndpointUrl()).remove(data); |
---|
278 | } |
---|
279 | } |
---|
280 | |
---|
281 | public Map<String, Set<Corpus2>> getSelectedCorpora() { |
---|
282 | return selectedCorpora; |
---|
283 | } |
---|
284 | } |
---|