Java tutorial
/* * * (c) Copyright IBM Corp. 2000, 2001. * * All Rights Reserved. * */ import org.eclipse.swt.SWT; import org.eclipse.swt.SWTError; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Text; import org.eclipse.swt.widgets.TypedListener; public class Spinner extends Composite { static final int BUTTON_WIDTH = 16; Text text; Button up, down; int minimum, maximum; public Spinner(Composite parent, int style) { super(parent, style); text = new Text(this, style | SWT.SINGLE | SWT.BORDER); up = new Button(this, style | SWT.ARROW | SWT.UP); down = new Button(this, style | SWT.ARROW | SWT.DOWN); text.addListener(SWT.Verify, new Listener() { public void handleEvent(Event e) { verify(e); } }); text.addListener(SWT.Traverse, new Listener() { public void handleEvent(Event e) { traverse(e); } }); up.addListener(SWT.Selection, new Listener() { public void handleEvent(Event e) { up(); } }); down.addListener(SWT.Selection, new Listener() { public void handleEvent(Event e) { down(); } }); addListener(SWT.Resize, new Listener() { public void handleEvent(Event e) { resize(); } }); addListener(SWT.FocusIn, new Listener() { public void handleEvent(Event e) { focusIn(); } }); text.setFont(getFont()); minimum = 0; maximum = 9; setSelection(minimum); } void verify(Event e) { try { Integer.parseInt(e.text); } catch (NumberFormatException ex) { e.doit = false; } } void traverse(Event e) { switch (e.detail) { case SWT.TRAVERSE_ARROW_PREVIOUS: if (e.keyCode == SWT.ARROW_UP) { e.doit = true; e.detail = SWT.NULL; up(); } break; case SWT.TRAVERSE_ARROW_NEXT: if (e.keyCode == SWT.ARROW_DOWN) { e.doit = true; e.detail = SWT.NULL; down(); } break; } } void up() { setSelection(getSelection() + 1); notifyListeners(SWT.Selection, new Event()); } void down() { setSelection(getSelection() - 1); notifyListeners(SWT.Selection, new Event()); } void focusIn() { text.setFocus(); } public void setFont(Font font) { super.setFont(font); text.setFont(font); } public void setSelection(int selection) { if (selection < minimum) { selection = minimum; } else if (selection > maximum) { selection = maximum; } text.setText(String.valueOf(selection)); text.selectAll(); text.setFocus(); } public int getSelection() { return Integer.parseInt(text.getText()); } public void setMaximum(int maximum) { checkWidget(); this.maximum = maximum; resize(); } public int getMaximum() { return maximum; } public void setMinimum(int minimum) { this.minimum = minimum; } public int getMinimum() { return minimum; } void resize() { Point pt = computeSize(SWT.DEFAULT, SWT.DEFAULT); int textWidth = pt.x - BUTTON_WIDTH; int buttonHeight = pt.y / 2; text.setBounds(0, 0, textWidth, pt.y); up.setBounds(textWidth, 0, BUTTON_WIDTH, buttonHeight); down.setBounds(textWidth, pt.y - buttonHeight, BUTTON_WIDTH, buttonHeight); } public Point computeSize(int wHint, int hHint, boolean changed) { GC gc = new GC(text); Point textExtent = gc.textExtent(String.valueOf(maximum)); gc.dispose(); Point pt = text.computeSize(textExtent.x, textExtent.y); int width = pt.x + BUTTON_WIDTH; int height = pt.y; if (wHint != SWT.DEFAULT) width = wHint; if (hHint != SWT.DEFAULT) height = hHint; return new Point(width, height); } public void addSelectionListener(SelectionListener listener) { if (listener == null) throw new SWTError(SWT.ERROR_NULL_ARGUMENT); addListener(SWT.Selection, new TypedListener(listener)); } }