ChartControl.java
- package de.slothsoft.charts.swt;
- import org.eclipse.swt.SWT;
- import org.eclipse.swt.events.PaintEvent;
- import org.eclipse.swt.graphics.Rectangle;
- import org.eclipse.swt.widgets.Canvas;
- import org.eclipse.swt.widgets.Composite;
- import de.slothsoft.charts.Chart;
- import de.slothsoft.charts.PaintInstructions;
- import de.slothsoft.charts.RefreshListener;
- /**
- * A SWT control displaying a {@link Chart} and hooking it to the SWT framework.
- *
- * @author Stef Schulz
- * @since 0.1.0
- */
- public class ChartControl extends Canvas {
- private Chart model;
- private SwtGraphicContext graphicContext;
- private final RefreshListener refreshListener = e -> redraw();
- /**
- * Constructs a new instance of this class given its parentand a style value
- * describing its behavior and appearance.
- *
- * @param parent a composite control which will be the parent of the new instance
- * (cannot be null)
- * @param style the style of control to construct
- */
- public ChartControl(Composite parent, int style) {
- super(parent, style | SWT.DOUBLE_BUFFERED);
- addPaintListener(this::paintControl);
- addDisposeListener(e -> dispose());
- }
- private void paintControl(PaintEvent e) {
- final Rectangle rect = getClientArea();
- e.gc.setAntialias(SWT.ON);
- if (this.model != null) {
- if (this.graphicContext == null) {
- this.graphicContext = new SwtGraphicContext(e.gc);
- } else {
- this.graphicContext.delegate(e.gc);
- }
- final PaintInstructions instructions = new PaintInstructions(
- new de.slothsoft.charts.Area(rect.x, rect.y, rect.width, rect.height));
- this.model.paintOn(this.graphicContext, instructions);
- }
- }
- /**
- * Returns the {@link Chart} that gets displayed by this control.
- *
- * @return the chart
- */
- public Chart getModel() {
- return this.model;
- }
- /**
- * Sets the {@link Chart} that gets displayed by this control.
- *
- * @param newModel the chart
- * @return this instance
- */
- public ChartControl model(Chart newModel) {
- setModel(newModel);
- return this;
- }
- /**
- * Sets the {@link Chart} that gets displayed by this control.
- *
- * @param model the chart
- */
- public void setModel(Chart model) {
- if (this.model != null) {
- this.model.removeRefreshListener(this.refreshListener);
- }
- this.model = model;
- if (this.model != null) {
- this.model.addRefreshListener(this.refreshListener);
- }
- redraw();
- }
- @Override
- public void dispose() {
- if (this.graphicContext != null) {
- this.graphicContext.dispose();
- }
- if (this.model != null) {
- this.model.removeRefreshListener(this.refreshListener);
- }
- super.dispose();
- }
- }