+ private boolean isOverdue(Node node, String propName) {
+ try {
+ Calendar now = GregorianCalendar.getInstance();
+ return node.hasProperty(propName) && node.getProperty(propName).getDate().before(now);
+ } catch (RepositoryException e) {
+ throw new SuiteException("Cannot check overdue status with property " + propName + " on " + node, e);
+ }
+ }
+
+ private void populateHeaderPart(Composite bodyCmp, Node context) {
+ bodyCmp.setLayout(EclipseUiUtils.noSpaceGridLayout(new GridLayout(2, true)));
+
+ Composite leftCmp = new Composite(bodyCmp, SWT.NO_FOCUS);
+ leftCmp.setLayout(new GridLayout());
+ leftCmp.setLayoutData(EclipseUiUtils.fillWidth());
+ Composite rightCmp = new Composite(bodyCmp, SWT.NO_FOCUS);
+ rightCmp.setLayout(new GridLayout());
+ rightCmp.setLayoutData(EclipseUiUtils.fillWidth());
+
+ // Title
+ Label titleLbl = new Label(leftCmp, SWT.WRAP | SWT.LEAD);
+ CmsUtils.markup(titleLbl);
+ String titleStr = "<big><b> Hello " + CurrentUser.getDisplayName() + " </b></big>";
+ titleLbl.setText(titleStr);
+ GridData gd = new GridData(SWT.TOP, SWT.BOTTOM, false, false);
+ gd.verticalIndent = 5;
+ gd.horizontalIndent = 10;
+ titleLbl.setLayoutData(gd);
+
+ NodeIterator nit = activitiesService.getMyTasks(getSession(), true);
+ if (nit.hasNext()) {
+ List<Node> overdueTasks = new ArrayList<>();
+ while (nit.hasNext()) {
+ Node currNode = nit.nextNode();
+ if (isOverdue(currNode, ActivitiesNames.ACTIVITIES_DUE_DATE))
+ overdueTasks.add(currNode);
+ }
+ if (!overdueTasks.isEmpty()) {
+ Composite overdueCmp = new Composite(leftCmp, SWT.NO_FOCUS);
+ long size = overdueTasks.size();
+ String overdueStr = "You have " + size + " overdue task" + (size > 1 ? "s" : "") + ": ";
+ populateMuliValueClickableList(overdueCmp, overdueTasks.toArray(new Node[0]), new TaskLp(), overdueStr);
+ }
+ }
+
+ nit = trackerService.getMyMilestones(getSession(), true);
+ List<Node> openMilestones = new ArrayList<>();
+
+ if (nit.hasNext()) {
+ List<Node> overdueMilestones = new ArrayList<>();
+ while (nit.hasNext()) {
+ Node currNode = nit.nextNode();
+ openMilestones.add(currNode);
+ if (isOverdue(currNode, TrackerNames.TRACKER_TARGET_DATE))
+ overdueMilestones.add(currNode);
+ }
+ if (!overdueMilestones.isEmpty()) {
+ Composite overdueCmp = new Composite(leftCmp, SWT.NO_FOCUS);
+ long size = overdueMilestones.size();
+ String overdueStr = "You have " + size + " overdue milestone" + (size > 1 ? "s" : "") + ": ";
+ populateMuliValueClickableList(overdueCmp, overdueMilestones.toArray(new Node[0]), new MilestoneLp(),
+ overdueStr);
+ }
+ }
+
+ // My projects
+ List<Node> openProjects = JcrUtils.nodeIteratorToList(trackerService.getMyProjects(getSession(), true));
+ if (!openProjects.isEmpty()) {
+ Group myProjectsGp = new Group(rightCmp, SWT.NO_FOCUS);
+ myProjectsGp.setText("My open projects");
+ myProjectsGp.setLayoutData(EclipseUiUtils.fillWidth());
+ populateMuliValueClickableList(myProjectsGp, openProjects.toArray(new Node[0]), new ProjectLp(), null);
+ }
+
+ // My Milestones
+ if (!openMilestones.isEmpty()) {
+ Group myMilestoneGp = new Group(rightCmp, SWT.NO_FOCUS);
+ myMilestoneGp.setText("My open milestones");
+ myMilestoneGp.setLayoutData(EclipseUiUtils.fillWidth());
+ populateMuliValueClickableList(myMilestoneGp, openMilestones.toArray(new Node[0]), new MilestoneLp(), null);
+ }
+ }
+
+ private class ProjectLp extends ColumnLabelProvider {
+ private static final long serialVersionUID = 7231233932794865555L;
+
+ @Override
+ public String getText(Object element) {
+ Node project = (Node) element;
+
+ String percent;
+ NodeIterator nit = TrackerUtils.getIssues(project, null, null, null, true);
+ long openNb = nit.getSize();