home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1995 November / PCWK1195.iso / inne / win95 / sieciowe / hotja32.lzh / hotjava / classsrc / awt / smoothscroller.java < prev    next >
Text File  |  1995-08-11  |  4KB  |  128 lines

  1. /*
  2.  * @(#)SmoothScroller.java    1.10 95/02/16 Jonathan Payne
  3.  *
  4.  * Copyright (c) 1994 Sun Microsystems, Inc. All Rights Reserved.
  5.  *
  6.  * Permission to use, copy, modify, and distribute this software
  7.  * and its documentation for NON-COMMERCIAL purposes and without
  8.  * fee is hereby granted provided that this copyright notice
  9.  * appears in all copies. Please refer to the file "copyright.html"
  10.  * for further important copyright and licensing information.
  11.  *
  12.  * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
  13.  * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
  14.  * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
  15.  * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR
  16.  * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
  17.  * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
  18.  */
  19.  
  20. package awt;
  21.  
  22.  
  23. /**
  24.  * SmootherScroller is a thread which calls back Scrollable
  25.  * clients to generate a real-world feel to smoother scrolling.
  26.  * This model includes applying thrust in one direction or
  27.  * another and friction.  A variable amount of thrust can be
  28.  * applied for a variable amount of time.  A notion of braking is
  29.  * included, by temporarily upping the friction.
  30.  *
  31.  * Units of acceleration are in pixels/sec/sec.  Velocity is in
  32.  * pixels/sec.  The constants below probably should not be
  33.  * constants and rather should be configurable for each instance.
  34.  * These constants work well for a text widget that calls the
  35.  * thrust method with particular values.  Get my point?
  36.  *
  37.  * This thread is a daemon thread, so if all other user threads
  38.  * die, this one will too.
  39.  *
  40.  * @version 1.10 16 Feb 1995
  41.  * @author Jonathan Payne
  42.  */
  43. public class SmoothScroller extends Thread {
  44.     final float    initFriction = 400;
  45.     final float    brakeFriction = 1500;
  46.     final float    maxVelocity = 1000;
  47.  
  48.     awt.Scrollable    client;                /* client we're scrolling */
  49.     float    friction = initFriction;    /* current friction */
  50.     float    velocity;            /* current velocity */
  51.     float    thrust;                /* current thrust */
  52.     int        velocitySgn;            /* sign (1, -1) of velocity at last thrust */
  53.     int        thrustTime;            /* time limit to apply thrust */
  54.     int        brakeTime;            /* time limit to apply brakes */
  55.     int        lastTime;            /* last time through loop (for dt calculation) */
  56.  
  57.     public SmoothScroller(awt.Scrollable client) {
  58.     this.client = client;
  59.     setDaemon(true);
  60.     setPriority(Thread.currentThread().getPriority() + 1);
  61.     start();
  62.     Thread.currentThread().yield();
  63.     }
  64.  
  65.     int sgn(float n) {
  66.     return n < 0 ? -1 : 1;
  67.     }
  68.  
  69.     synchronized void relax() {
  70.     velocity = 0;
  71.     wait();
  72.     lastTime = System.nowMillis() - 100;
  73.     }
  74.  
  75.     public synchronized void setThrust(int t, int millis) {
  76.     thrust = t;
  77.     thrustTime = System.nowMillis() + millis;
  78.     if (velocity == 0)
  79.         velocitySgn = sgn(t);
  80.     else
  81.         velocitySgn = sgn(velocity);
  82.     notify();
  83.     }
  84.  
  85.     public void brake(int millis) {
  86.     brakeTime = System.nowMillis() + millis;
  87.     friction = brakeFriction;
  88.     }
  89.  
  90.     void callback(float dist) {
  91.     if (client.scrollVertically((int)-dist)) {
  92.         velocity = -1 * velocitySgn;    /* this stops us in our tracks */
  93.     }
  94.     }
  95.  
  96.     public void run() {
  97.     relax();
  98.     while (true) {
  99.         int        now = System.nowMillis();
  100.         float   dt = (now - lastTime) / 1000.0;
  101.  
  102.         velocity += (thrust * dt);
  103.         if (velocity < 0) {
  104.         velocity += (friction * dt);
  105.         if (velocity > 0)
  106.             velocity = 0;
  107.         } else {
  108.         velocity -= (friction * dt);
  109.         if (velocity < 0)
  110.             velocity = 0;
  111.         }
  112.         if (Math.abs(velocity) > maxVelocity)
  113.         velocity = velocitySgn * maxVelocity;
  114.         callback(velocity * dt);
  115.         lastTime = now;
  116.         if (now >= thrustTime)
  117.         thrust = 0;
  118.         if (now >= brakeTime)
  119.         friction = initFriction;
  120.         if (now >= thrustTime && velocity == 0) {
  121.         relax();
  122.         } else {
  123.         sleep(50);
  124.         }
  125.     }
  126.     }
  127. }
  128.