home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1997 March / PCWK0397.iso / novell / webserv3 / wstkb1.exe / DOCS / TOOLS / JAVA / CLOCK / CLOCK.JAV < prev   
Text File  |  1996-12-20  |  11KB  |  278 lines

  1. import java.awt.*;
  2. import java.net.*;
  3. import java.lang.Math;
  4. import java.lang.Integer;
  5. import java.util.Date;
  6.  
  7. public class Clock extends java.applet.Applet implements Runnable
  8. {
  9.   Thread   runner;            //thread for applet
  10.   Color    facecolor, clockcolor,    //color for clock face and markings
  11.            fontcolor;                   //color for text displayed on clock
  12.   int      secx, secy,            //coordinates for second hand
  13.            minx, miny,            //coordinates for minute hand
  14.            hrx,  hry,            //coordinates for hour hand
  15.            tzoneoffset = 0,        //offset for local time zone
  16.            gmtoffset = 0;        //offset for time to display
  17.   boolean  statusBar,                   //flag for displaying on the status bar
  18.            tickmarks,            //flag for 5 min. tick mark display
  19.            sechand;            //flag for second hand display
  20.   URL      lclick = null;        //the execution string for a left-click
  21.  
  22.   public Color nameToColor(String name) {  //This function converts a color name String to a Color
  23.     //This takes a string form of a color name and converts it to a color
  24.     Color color;
  25.     if (name.equalsIgnoreCase("blue")) color = Color.blue;
  26.     else if (name.equalsIgnoreCase("cyan")) color = Color.cyan;
  27.     else if (name.equalsIgnoreCase("darkGray")) color = Color.darkGray;
  28.     else if (name.equalsIgnoreCase("darkGrey")) color = Color.darkGray;
  29.     else if (name.equalsIgnoreCase("gray")) color = Color.gray;
  30.     else if (name.equalsIgnoreCase("grey")) color = Color.gray;
  31.     else if (name.equalsIgnoreCase("green")) color = Color.green;
  32.     else if (name.equalsIgnoreCase("lightGray")) color = Color.lightGray;
  33.     else if (name.equalsIgnoreCase("lightGrey")) color = Color.lightGray;
  34.     else if (name.equalsIgnoreCase("magenta")) color = Color.magenta;
  35.     else if (name.equalsIgnoreCase("orange")) color = Color.orange;
  36.     else if (name.equalsIgnoreCase("pink")) color = Color.pink;
  37.     else if (name.equalsIgnoreCase("red")) color = Color.red;
  38.     else if (name.equalsIgnoreCase("white")) color = Color.white;
  39.     else if (name.equalsIgnoreCase("yellow")) color = Color.yellow;
  40.     else color = Color.black;
  41.     return color;
  42.   } //end of Clock.Color(String)
  43.  
  44.   public void init() {  //init routine gets variables and initializes variables
  45.     Date     curDate;            //holder of current time/date
  46.     String tstr;
  47.     Integer toffset;
  48.  
  49.     // Determine the color of the clock's face (default white)
  50.     tstr = getParameter("facecolor");
  51.     if (tstr == null) tstr="white";
  52.     this.facecolor=nameToColor(tstr);
  53.  
  54.     // Determine the color of the clock's markings (default black)
  55.     tstr = getParameter("clockcolor");
  56.     if (tstr == null) tstr="black";
  57.     this.clockcolor=nameToColor(tstr);
  58.  
  59.     // Determine the color of the clock's text (default grey)
  60.     tstr = getParameter("fontcolor");
  61.     if (tstr == null) tstr="grey";
  62.     this.fontcolor=nameToColor(tstr);
  63.  
  64.     // Determine the color of the applet's background
  65.     tstr = getParameter("background");
  66.     if (tstr == null) tstr="white";
  67.     this.setBackground(nameToColor(tstr));
  68.  
  69.     // Determine if the second hand is to be shown
  70.     tstr = getParameter("sechand");
  71.     if (tstr != null && tstr.equalsIgnoreCase("false"))
  72.       this.sechand = false;
  73.     else
  74.       this.sechand = true;
  75.  
  76.     // Determine if the second hand is to be shown
  77.     tstr = getParameter("tickmarks");
  78.     if (tstr != null && tstr.equalsIgnoreCase("true"))
  79.       this.tickmarks = true;
  80.     else
  81.       this.tickmarks = false;
  82.  
  83.     // Determine the leftclick action
  84.     tstr = getParameter("lclick");
  85.     if (tstr != null)
  86.       try { lclick = new URL(tstr); }
  87.       catch (MalformedURLException e) {
  88.         System.out.println ("Bad URL: " + lclick);
  89.       }
  90.  
  91.     // Determine the time to show based on the gmtoffset parameter passed
  92.     // in by the html document.  A "5" would be equal to EST.  A "7" would
  93.     // be equal to MST.  Etc...
  94.     // Since this is a constant, daylight time is adjusted by your adding
  95.     // a 1 to the standard time value when you specify the value in your
  96.     // html document.
  97.     curDate = new Date();
  98.     tzoneoffset = curDate.getTimezoneOffset() / 60;
  99.     tstr = getParameter("gmtoffset");
  100.     if (tstr  == null)
  101.       gmtoffset = tzoneoffset;
  102.     else {
  103.       toffset = new Integer(tstr);
  104.       gmtoffset = toffset.intValue();
  105.     }
  106.   } //end of Clock.init()
  107.  
  108.   public void start() {  //start routine for applet
  109.  
  110.     if (runner==null) {
  111.       runner = new Thread(this);
  112.       runner.start();
  113.     }
  114.   } //end of Clock.start()
  115.  
  116.   public void stop() {  //stop routine for applet
  117.     if (runner != null) {
  118.       runner.stop();
  119.       runner = null;
  120.     }
  121.   } //end of Clock.stop()
  122.  
  123.   public void run() {   //paint routine for applet
  124.  
  125.     while (true) {
  126.       painthands(this.getGraphics());
  127.       try { Thread.sleep(1000); }
  128.       catch (InterruptedException e) { }
  129.     }
  130.   } //end of Clock.run()
  131.  
  132.   public void paint(Graphics g) {   //paint routine for applet
  133.     paintclock(g);
  134.     painthands(g);
  135.   } //end of Clock.paint(Graphics)
  136.  
  137.   public void paintclock(Graphics g) {    //paint routine for the clock markings
  138.     int    ratio = 20,
  139.            diameter = this.size().height<this.size().width ?
  140.              this.size().height-1 : this.size().width-1,
  141.            radius = (int)(diameter/2);
  142.     double i,
  143.            marksize = diameter/ratio;
  144.  
  145.     // Draw Clock face
  146.     g.setColor(this.facecolor);
  147.     g.fillOval(0, 0, diameter, diameter);
  148.  
  149.     // Draw Clock outline
  150.     g.setColor(this.clockcolor);
  151.     g.drawOval(0, 0, diameter, diameter);
  152.  
  153.     // Draw 5 min. marks  This could be uncommented if you wish the 5 min.
  154.     // hash marks to be drawn.
  155.     if (this.tickmarks) {
  156.       g.setColor(this.clockcolor);
  157.       for (i = 0; i < ((2*Math.PI)); i+=(Math.PI/6))
  158.         g.fillOval(
  159.          (int)((Math.cos(i)+1)*(diameter-marksize*2)/2+(marksize/2)),
  160.           (int)((Math.sin(i)+1)*(diameter-marksize*2)/2+(marksize/2)),
  161.           (int)marksize, (int)marksize);
  162.     }
  163.   } //end of Clock.paintclock(Graphics)
  164.  
  165.   public void painthands(Graphics g) {  //painthands paints the moving parts of the clock
  166.     Date        date = new Date();
  167.     double      sini, cosi;
  168.     int         tmpx, tmpy,
  169.                 ratio = 20, 
  170.                 diameter = this.size().height < this.size().width ? 
  171.                   this.size().height-1 : this.size().width-1,
  172.                 radius = (int)(diameter/2);
  173.     float       seconds = date.getSeconds(),
  174.                 minutes = date.getMinutes()+(seconds/60),
  175.                 hours = date.getHours()-gmtoffset+tzoneoffset+(minutes/60),
  176.                 marksize = diameter/ratio;
  177.     int         fontsize = (int)(radius/2);
  178.     String      am = "AM",
  179.                 pm = "PM";
  180.     Font        f = new Font("TimesRoman", Font.PLAIN, fontsize);
  181.     FontMetrics fm = getFontMetrics(f);
  182.     int         strwidth = fm.stringWidth(pm) > fm.stringWidth(am) ?
  183.                   fm.stringWidth(pm) : fm.stringWidth(am);
  184.  
  185.     // remove the hands to be redrawn  
  186.     if (hrx != 0 && hry !=0) {
  187.       g.setColor(this.facecolor);
  188.       g.drawLine(radius, radius, this.hrx, this.hry);
  189.       g.drawLine(radius-1, radius, this.hrx, this.hry);
  190.       g.drawLine(radius+1, radius, this.hrx, this.hry);
  191.       g.drawLine(radius, radius-1, this.hrx, this.hry);
  192.       g.drawLine(radius, radius+1, this.hrx, this.hry);
  193.     }
  194.     if (minx != 0 && miny != 0) {
  195.       g.setColor(this.facecolor);
  196.       g.drawLine(radius, radius, this.minx, this.miny);
  197.       g.drawLine(radius-1, radius, this.minx, this.miny);
  198.       g.drawLine(radius+1, radius, this.minx, this.miny);
  199.       g.drawLine(radius, radius-1, this.minx, this.miny);
  200.       g.drawLine(radius, radius+1, this.minx, this.miny);
  201.     }
  202.     if (this.sechand && secx != 0 && secy != 0) {
  203.       g.setColor(this.facecolor);
  204.       g.drawLine(radius, radius, this.secx, this.secy);
  205.     }
  206.  
  207.     //redraw am/pm
  208.     tmpx = (int)(radius-(strwidth/2));
  209.     tmpy = (int)(radius+1);
  210.     g.setFont(f);
  211.     g.setColor(this.facecolor);
  212.     g.fillRect(tmpx, tmpy, strwidth, fm.getHeight());
  213.     g.setColor(this.fontcolor);
  214.     if (hours >= 12)
  215.       g.drawString(pm, tmpx, tmpy+fm.getAscent());
  216.     else
  217.       g.drawString(am, tmpx, tmpy+fm.getAscent());
  218.  
  219.     // Draw Hour hand
  220.     cosi = Math.cos(((Math.PI/6)*hours)-(Math.PI/2))+1;
  221.     sini = Math.sin(((Math.PI/6)*hours)-(Math.PI/2))+1;
  222.     this.hrx = (int)((cosi*(diameter-(marksize*12))/2)+(marksize*12/2));
  223.     this.hry = (int)((sini*(diameter-(marksize*12))/2)+(marksize*12/2));
  224.     g.setColor(this.clockcolor);
  225.     g.drawLine(radius, radius, this.hrx, this.hry);
  226.     g.drawLine(radius-1, radius, this.hrx, this.hry);
  227.     g.drawLine(radius+1, radius, this.hrx, this.hry);
  228.     g.drawLine(radius, radius-1, this.hrx, this.hry);
  229.     g.drawLine(radius, radius+1, this.hrx, this.hry);
  230.  
  231.     // Draw Minute Hand
  232.     cosi = Math.cos(((Math.PI/30)*minutes)-(Math.PI/2))+1;
  233.     sini = Math.sin(((Math.PI/30)*minutes)-(Math.PI/2))+1;
  234.     this.minx = (int)((cosi*(diameter-(marksize*4))/2)+(marksize*2));
  235.     this.miny = (int)((sini*(diameter-(marksize*4))/2)+(marksize*2));
  236.     g.setColor(this.clockcolor);
  237.     g.drawLine(radius, radius, this.minx, this.miny);
  238.     g.drawLine(radius-1, radius, this.minx, this.miny);
  239.     g.drawLine(radius+1, radius, this.minx, this.miny);
  240.     g.drawLine(radius, radius-1, this.minx, this.miny);
  241.     g.drawLine(radius, radius+1, this.minx, this.miny);
  242.  
  243.     // Draw second hand 
  244.     cosi = Math.cos(((Math.PI/30)*seconds)-(Math.PI/2))+1;
  245.     sini = Math.sin(((Math.PI/30)*seconds)-(Math.PI/2))+1;
  246.     this.secx = (int)((cosi*(diameter-(marksize*4))/2)+(marksize*2));
  247.     this.secy = (int)((sini*(diameter-(marksize*4))/2)+(marksize*2));
  248.     if (this.sechand) {
  249.       g.setColor(Color.red);
  250.       g.drawLine(radius, radius, this.secx, this.secy);
  251.     }
  252.  
  253.     // statusBar display
  254.     if (this.statusBar)
  255.       getAppletContext().showStatus(date.toLocaleString());
  256.   }
  257.  
  258.   public boolean mouseEnter(Event evt, int x, int y) {    //routine to handle mouseEnter events
  259.     Date date = new Date();
  260.     getAppletContext().showStatus(date.toLocaleString());
  261.     this.statusBar = true;
  262.     return true;
  263.   } // end of mouseEnter(Event, int, int)
  264.  
  265.   public boolean mouseExit(Event evt, int x, int y) {    //routine to handle mouseExit events
  266.     getAppletContext().showStatus("");
  267.     this.statusBar = false;
  268.     return true;
  269.   } // end of mouseEnter(Event, int, int)
  270.  
  271.   public boolean mouseUp(Event evt, int x, int y) {    //routine to handle mouseUp events
  272.     if ( this.lclick != null && this.statusBar == true )
  273.         getAppletContext().showDocument(lclick);
  274.     return true;
  275.   } // end of mouseUp(Event, int, int)
  276. }  
  277.  
  278.