View Javadoc
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  /** Simple composite widget to display a gauge value as chart */
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  		// parent.setLayout(EclipseUiUtils.noSpaceGridLayout());
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  }