Appendix B: SpinnerTest and Spinner

This appendix contains the source code for the SpinnerTest and Spinner classes. The Spinner class loads and calls the native code listed in either Appendix C: Spinner For Windows, or Appendix D: Spinner for Motif.

SpinnerTest.java

package spinner;

/*
 * (c) Copyright IBM Corp. 2000, 2001.
 * All Rights Reserved.
 */

import org.eclipse.swt.*;
import org.eclipse.swt.widgets.*;
import org.eclipse.swt.events.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.graphics.*;
 
public class SpinnerTest {
      
public static void main (String [] args) {
    Display display = new Display ();
    Shell shell = new Shell (display);
    shell.setLayout (new RowLayout ());
 
    final Spinner spinner = new Spinner (shell, 0);
    spinner.setMaximum (999);
    System.out.println ("max set to " + spinner.getMaximum ());
    spinner.setSelection (500);
    System.out.println ("selection set to " + spinner.getSelection ());
    spinner.setMinimum (100);
    System.out.println ("min set to " + spinner.getMinimum ());
    Font font = new Font (display, "Courier", 20, SWT.NORMAL);
    spinner.setFont (font);
    spinner.addSelectionListener (new SelectionAdapter () {
        public void widgetSelected (SelectionEvent e) {
            System.out.println (spinner.getSelection ());
        }
    });
    shell.pack ();
    shell.open ();          
    while (!shell.isDisposed ()){
        if (!display.readAndDispatch ()) display.sleep ();
    }
    font.dispose ();
}
}

Spinner.java

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 {
    int handleSpinner;
    static Hashtable table = new Hashtable ();
    static {
        System.loadLibrary ("spinner");     
    }
  
    public Spinner (Composite parent, int style) {
        super (parent, style);
        int handleParent = handle;
        handleSpinner = createControl (handleParent);
        if (handleSpinner == 0) SWT.error (SWT.ERROR_NO_HANDLES);
        table.put (new Integer (handleSpinner), this);
        addDisposeListener (new DisposeListener () {
            public void widgetDisposed (DisposeEvent e) {
                Spinner.this.widgetDisposed (e);
            }
        });
        addControlListener (new ControlAdapter () {
            public void controlResized (ControlEvent e) {
                Spinner.this.controlResized (e);                
            }
        });
        addFocusListener (new FocusAdapter () {
            public void focusGained (FocusEvent e) {
                Spinner.this.focusGained (e);             
            }
        });
        Font font = getFont ();
        setFont (handleSpinner, font.handle);
    }
  
    public void setFont (Font font) {
        super.setFont (font);
        int hFont = 0;
        if (font != null) hFont = font.handle;
        setFont (handleSpinner, hFont);
    }
  
    public int getSelection () {
        checkWidget ();
        return getPosition (handleSpinner);
    }
  
    public void setSelection (int selection) {
        checkWidget ();
        setPosition (handleSpinner, selection);
    }

    public void setMaximum (int maximum) {
        checkWidget ();
        setMaximum (handleSpinner, maximum);
    }

    public int getMaximum () {
        checkWidget ();
        return getMaximum (handleSpinner);
    }

    public void setMinimum (int minimum) {
        checkWidget ();
        setMinimum (handleSpinner, minimum);
    }

    public int getMinimum () {
        checkWidget ();
        return getMinimum (handleSpinner);
    }
 
    public void widgetDisposed (DisposeEvent e) {
        table.remove (new Integer (handleSpinner));
        handleSpinner = 0;
    }
  
    public void controlResized (ControlEvent e) {
        Rectangle rect = getClientArea ();
        resizeControl (handleSpinner, rect.x, rect.y, rect.width, rect.height);       
    }

    public void focusGained (FocusEvent e) {
        setFocus (handleSpinner);
    }
 
    public Point computeSize (int wHint, int hHint, boolean changed) {
        checkWidget ();
        int [] result = new int [2];
        computeSize (handleSpinner, result);
        if (wHint != SWT.DEFAULT) result [0] = wHint;
        if (hHint != SWT.DEFAULT) result [1] = hHint;
        int border = getBorderWidth ();
        return new Point (result [0] + border * 2, result [1] + border * 2);
    }
  
    public void addSelectionListener (SelectionListener listener) {
        if (listener == null) throw new SWTError (SWT.ERROR_NULL_ARGUMENT);
        addListener (SWT.Selection, new TypedListener (listener));
    }

    static void widgetSelected (int handle) {
        Spinner spinner = (Spinner) table.get (new Integer (handle));
        if (spinner == null) return;
        spinner.notifyListeners (SWT.Selection, new Event ());
    }
  
    /*********** JAVA NATIVES ************/

    static final native int createControl (int handle);
    static final native void computeSize (int handle, int [] result);
    static final native void resizeControl (int handle, int x, int y, int width, int height);
    static final native void setPosition (int handle, int position);
    static final native int getPosition (int handle);
    static final native void setMaximum (int handle, int max);
    static final native int getMaximum (int handle);
    static final native void setMinimum (int handle, int min);
    static final native int getMinimum (int handle);
    static final native void setFont (int handle, int hFont);
    static final native void setFocus (int handle);
}