1 package org.argeo.tracker.ui;
2
3 import javax.jcr.Node;
4 import javax.jcr.Property;
5
6 import org.argeo.cms.util.CmsUtils;
7 import org.argeo.connect.ConnectConstants;
8 import org.argeo.connect.ConnectNames;
9 import org.argeo.connect.ui.AppWorkbenchService;
10 import org.argeo.connect.util.ConnectJcrUtils;
11 import org.argeo.eclipse.ui.EclipseUiUtils;
12 import org.argeo.tracker.TrackerNames;
13 import org.argeo.tracker.core.TrackerUtils;
14 import org.eclipse.swt.SWT;
15 import org.eclipse.swt.events.SelectionAdapter;
16 import org.eclipse.swt.events.SelectionEvent;
17 import org.eclipse.swt.layout.GridData;
18 import org.eclipse.swt.layout.GridLayout;
19 import org.eclipse.swt.widgets.Composite;
20 import org.eclipse.swt.widgets.Label;
21 import org.eclipse.swt.widgets.Link;
22
23
24 public class MilestoneListComposite extends Composite {
25 private static final long serialVersionUID = 7277540413496825697L;
26
27 private final AppWorkbenchService workbenchService;
28 private final Node project;
29
30 public MilestoneListComposite(Composite parent, int style, AppWorkbenchService appWorkbenchService, Node project) {
31 super(parent, style);
32 this.workbenchService = appWorkbenchService;
33 this.project = project;
34 GridLayout layout = EclipseUiUtils.noSpaceGridLayout();
35 layout.verticalSpacing = 5;
36 this.setLayout(layout);
37 }
38
39 public void setInput(Node[] milestones) {
40 CmsUtils.clear(this);
41
42 for (Node currMS : milestones)
43 appendMilestoneCmp(this, currMS);
44
45 this.layout(true, true);
46 }
47
48 private void appendMilestoneCmp(Composite parent, Node milestone) {
49 String currTitle = ConnectJcrUtils.get(milestone, Property.JCR_TITLE);
50 String currId = ConnectJcrUtils.get(milestone, ConnectNames.CONNECT_UID);
51 int totalNb = (int) TrackerUtils.getIssues(project, null, TrackerNames.TRACKER_MILESTONE_UID, currId).getSize();
52 int openNb = (int) TrackerUtils.getIssues(project, null, TrackerNames.TRACKER_MILESTONE_UID, currId, true)
53 .getSize();
54 int closeNb = totalNb - openNb;
55
56 if (totalNb <= 0)
57 return;
58
59 Composite boxCmp = new Composite(parent, SWT.NO_FOCUS | SWT.BORDER);
60 boxCmp.setLayoutData(EclipseUiUtils.fillWidth());
61
62 GridLayout layout = new GridLayout();
63 layout.numColumns = 2;
64 boxCmp.setLayout(layout);
65
66 Link titleLk = new Link(boxCmp, SWT.WRAP);
67 titleLk.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
68 titleLk.setFont(EclipseUiUtils.getBoldFont(boxCmp));
69 titleLk.setText("<a>" + currTitle + "</a>");
70 titleLk.addSelectionListener(new SelectionAdapter() {
71 private static final long serialVersionUID = 5342086098924045174L;
72
73 @Override
74 public void widgetSelected(SelectionEvent e) {
75
76
77
78
79 workbenchService.openEntityEditor(milestone);
80 }
81 });
82
83 Composite chartCmp = new Composite(boxCmp, SWT.NO_FOCUS);
84 GridData twd = new GridData();
85
86 twd.heightHint = 40;
87
88 chartCmp.setLayoutData(twd);
89 chartCmp.setLayout(EclipseUiUtils.noSpaceGridLayout());
90
91 CategoryOverviewChart coc = new CategoryOverviewChart(chartCmp, SWT.NO_FOCUS);
92 coc.setInput(currTitle, closeNb, totalNb);
93 coc.setLayoutData(new GridData(310, 40));
94 coc.layout(true, true);
95
96 Label datesLbl = new Label(boxCmp, SWT.WRAP);
97
98 String ddVal = ConnectJcrUtils.getDateFormattedAsString(milestone, TrackerNames.TRACKER_TARGET_DATE,
99 ConnectConstants.DEFAULT_DATE_FORMAT);
100 if (EclipseUiUtils.isEmpty(ddVal)) {
101 datesLbl.setText("No due date defined");
102 datesLbl.setFont(EclipseUiUtils.getItalicFont(boxCmp));
103 } else
104 datesLbl.setText("Due date: " + ddVal);
105
106 Label descLbl = new Label(boxCmp, SWT.WRAP);
107 String desc = ConnectJcrUtils.get(milestone, Property.JCR_DESCRIPTION);
108 if (EclipseUiUtils.isEmpty(desc))
109 descLbl.setText("-");
110 else
111 descLbl.setText(desc);
112 }
113 }