package org.archstudio.bna.things.swt; import org.archstudio.bna.IBNAView; import org.archstudio.bna.ICoordinateMapper; import org.archstudio.bna.IThingListener; import org.archstudio.bna.ThingEvent; import org.archstudio.bna.ui.IUIResources; import org.archstudio.swtutils.SWTWidgetUtils; import org.eclipse.swt.SWT; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.widgets.Slider; public class SWTScrollBarThingPeer<T extends SWTScrollBarThing> extends AbstractControlThingPeer<T, Slider> { public SWTScrollBarThingPeer(T thing, IBNAView view, ICoordinateMapper cm) { super(thing, view, cm); } @Override public boolean draw(Rectangle localBounds, IUIResources r) { SWTWidgetUtils.async(view.getBNAUI().getComposite(), new Runnable() { @Override public void run() { if (control != null && (control.getStyle() & t.getType().getSwtStyle()) == 0) { control.dispose(); control = null; } } }); return super.draw(localBounds, r); } @Override protected Slider createControl(final IBNAView view, ICoordinateMapper cm) { final Slider control = new Slider(view.getBNAUI().getComposite(), t.getType().getSwtStyle()); control.setData(t); control.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { t.setValue(control.getSelection()); } }); final IThingListener updateControlListener = new IThingListener() { @Override public void thingChanged(ThingEvent thingEvent) { SWTWidgetUtils.async(view.getBNAUI().getComposite(), new Runnable() { @Override public void run() { updateControl(control); } }); } }; updateControl(control); t.addThingListener(updateControlListener); control.addDisposeListener(new DisposeListener() { @Override public void widgetDisposed(DisposeEvent e) { t.removeThingListener(updateControlListener); } }); return control; } private void updateControl(Slider slider) { slider.setValues(t.getValue(), t.getMin(), t.getMax(), 1, 1, 1); } @Override protected Rectangle getBounds(IBNAView view, ICoordinateMapper cm) { Rectangle bounds = super.getBounds(view, cm); if (control != null) { if ((control.getStyle() & SWT.HORIZONTAL) != 0) { Point size = control.computeSize(bounds.width, SWT.DEFAULT); bounds.width = size.x; bounds.height = size.y; } if ((control.getStyle() & SWT.VERTICAL) != 0) { Point size = control.computeSize(SWT.DEFAULT, bounds.height); bounds.width = size.x; bounds.height = size.y; } } return bounds; } }