1 package org.argeo.tracker.ui.controls;
2
3 import java.util.ArrayList;
4 import java.util.LinkedHashMap;
5 import java.util.List;
6 import java.util.Map;
7 import java.util.stream.Collectors;
8
9 import javax.jcr.Node;
10 import javax.jcr.NodeIterator;
11 import javax.jcr.Property;
12 import javax.jcr.RepositoryException;
13 import javax.jcr.Session;
14 import javax.jcr.query.QueryResult;
15
16 import org.argeo.connect.ConnectNames;
17 import org.argeo.connect.ui.widgets.ConnectAbstractDropDown;
18 import org.argeo.connect.util.ConnectJcrUtils;
19 import org.argeo.connect.util.XPathUtils;
20 import org.argeo.tracker.TrackerException;
21 import org.argeo.tracker.TrackerTypes;
22 import org.eclipse.swt.SWT;
23 import org.eclipse.swt.widgets.Text;
24
25
26 public class MilestoneDropDown extends ConnectAbstractDropDown {
27
28 private final Session session;
29 private Node project;
30 private final boolean onlyOpenMilestons;
31 private final Map<String, Node> relevantMilestones = new LinkedHashMap<>();
32 private Map<String, Node> filteredMilestones;
33
34 public MilestoneDropDown(Session session, Text text, boolean onlyOpenMilestons) {
35 super(text, SWT.NONE, true);
36 this.session = session;
37 this.onlyOpenMilestons = onlyOpenMilestons;
38 init();
39 }
40
41 public void setProject(Node project) {
42 this.project = project;
43 populateMilestoneList();
44 }
45
46
47 public void resetMilestone(Node milestone) {
48 if (milestone != null)
49 reset(ConnectJcrUtils.get(milestone, Property.JCR_TITLE));
50 }
51
52 protected void populateMilestoneList() {
53 try {
54 relevantMilestones.clear();
55 if (project == null)
56 return;
57
58 StringBuilder builder = new StringBuilder();
59 builder.append(XPathUtils.descendantFrom(project.getPath()));
60 builder.append("//element(*, ");
61 builder.append(TrackerTypes.TRACKER_MILESTONE);
62 builder.append(")");
63
64 if (onlyOpenMilestons)
65 builder.append("[not(@").append(ConnectNames.CONNECT_CLOSE_DATE).append(")").append("]");
66
67 builder.append(" order by @").append(Property.JCR_TITLE);
68 QueryResult result = XPathUtils.createQuery(session, builder.toString()).execute();
69 NodeIterator nIt = result.getNodes();
70 while (nIt.hasNext()) {
71 Node currProj = nIt.nextNode();
72 relevantMilestones.put(currProj.getProperty(Property.JCR_TITLE).getString(), currProj);
73 }
74 } catch (RepositoryException e) {
75 throw new TrackerException("Unable to get projects for session " + session.getUserID(), e);
76 }
77 }
78
79 @Override
80 protected List<String> getFilteredValues(String filter) {
81 filteredMilestones = relevantMilestones.entrySet().stream()
82 .filter(p -> p.getKey().toLowerCase().indexOf(filter.toLowerCase()) >= 0)
83 .collect(Collectors.toMap(p -> p.getKey(), p -> p.getValue()));
84 List<String> res = new ArrayList<>();
85 res.addAll(filteredMilestones.keySet());
86 return res;
87 }
88
89 public Node getChosenMilestone() {
90 return relevantMilestones.get(getText());
91 }
92 }