View Javadoc
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  /** Simple DropDown that displays the list of milestones for this project */
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  }