1 package org.argeo.tracker.ui;
2
3 import java.io.IOException;
4 import java.io.InputStream;
5
6 import org.apache.commons.io.IOUtils;
7 import org.apache.commons.logging.Log;
8 import org.apache.commons.logging.LogFactory;
9 import org.argeo.cms.util.CmsUtils;
10 import org.argeo.tracker.TrackerException;
11 import org.eclipse.swt.SWT;
12 import org.eclipse.swt.SWTException;
13 import org.eclipse.swt.browser.Browser;
14 import org.eclipse.swt.browser.ProgressEvent;
15 import org.eclipse.swt.browser.ProgressListener;
16 import org.eclipse.swt.layout.GridData;
17 import org.eclipse.swt.layout.GridLayout;
18 import org.eclipse.swt.widgets.Composite;
19
20
21 public class CategoryOverviewChart extends Composite {
22 private static final long serialVersionUID = -2758463753509540538L;
23 private final Log log = LogFactory.getLog(CategoryOverviewChart.class);
24
25 private String options = "options: { legend: { display: false, position: 'bottom' } , "
26 + " title: { display: true, position: 'bottom', fontStyle: 'none', text: customisedTitle } , "
27 + "scales: { xAxes: [{ display: false, ticks: { beginAtZero: true }}], "
28 + "yAxes: [{ barThickness: 10, display: false, stacked: true }]}}";
29
30 public CategoryOverviewChart(Composite parent, int style) {
31 super(parent, style);
32
33 }
34
35 public void setInput(String title, int closedNb, int totalNb) {
36 Composite parent = this;
37 CmsUtils.clear(parent);
38
39 final String jscData = "{labels: ['" + title + "'], datasets: ["
40 + "{ label: 'Open', backgroundColor: \"rgb(141,192,66) \", data: [" + closedNb + "], },"
41 + " { label: 'All', data: [" + totalNb + "]} ]}";
42
43 parent.setLayout(new GridLayout());
44 final Browser browser = new Browser(parent, SWT.NONE);
45 browser.setLayoutData(new GridData(300, 80));
46 String html;
47 InputStream in = null;
48 try {
49 in = getClass().getResourceAsStream("/org/argeo/tracker/ui/charts/ChartJs.html");
50 html = IOUtils.toString(in);
51 } catch (IOException e) {
52 throw new TrackerException("Cannot read HTML", e);
53 } finally {
54 IOUtils.closeQuietly(in);
55 }
56 browser.addProgressListener(new ProgressListener() {
57 private static final long serialVersionUID = 2852043674756868097L;
58
59 @Override
60 public void completed(ProgressEvent event) {
61 try {
62 String type = "horizontalBar";
63 StringBuilder js = new StringBuilder();
64 double a = (double) closedNb, b = (double) totalNb;
65 double indic = a / b*100;
66 StringBuilder lb = new StringBuilder();
67 lb.append(String.format("%.0f", indic)).append("% ");
68 lb.append("(").append(closedNb).append("/").append(totalNb).append(" done)");
69
70 js.append("var customisedTitle=").append("'").append(lb.toString()).append("'").append(";\n");
71 js.append("var chartData=").append(jscData).append(";\n");
72 js.append("new Chart(").append("document.getElementById('chart').getContext('2d'),").append("{")
73 .append("type:'").append(type).append("',").append("data:chartData,\n").append(options)
74 .append("});");
75 try {
76 if (log.isTraceEnabled())
77 log.debug(js.toString());
78 browser.evaluate(js.toString());
79 } catch (SWTException e) {
80 log.error(e.getMessage() + "\n" + js + "\n");
81 }
82 } catch (Exception e) {
83 new TrackerException("Unable to prepare chart", e);
84 }
85 }
86
87 @Override
88 public void changed(ProgressEvent event) {
89 }
90 });
91 browser.setText(html);
92 parent.layout(true, true);
93 }
94
95 @Override
96 public boolean setFocus() {
97 return true;
98 }
99 }