Appendix E: Spinner for Any Platform

This appendix contains the source code for a Spinner class that will run on any platform.

 

package spinner;

 

/*

 * (c) Copyright IBM Corp. 2000, 2001.

 * All Rights Reserved.

 */

 

import java.util.*;

import org.eclipse.swt.*;

import org.eclipse.swt.graphics.*;

import org.eclipse.swt.widgets.*;

import org.eclipse.swt.events.*;

 

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));

      }

}