CalIcon.java Source code

Java tutorial

Introduction

Here is the source code for CalIcon.java

Source

/*
 * Copyright (c) Ian F. Darwin, http://www.darwinsys.com/, 1996-2002.
 * All rights reserved. Software written by Ian F. Darwin and others.
 * $Id: LICENSE,v 1.8 2004/02/09 03:33:38 ian Exp $
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS''
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 * 
 * Java, the Duke mascot, and all variants of Sun's Java "steaming coffee
 * cup" logo are trademarks of Sun Microsystems. Sun's, and James Gosling's,
 * pioneering role in inventing and promulgating (and standardizing) the Java 
 * language and environment is gratefully acknowledged.
 * 
 * The pioneering role of Dennis Ritchie and Bjarne Stroustrup, of AT&T, for
 * inventing predecessor languages C and C++ is also gratefully acknowledged.
 */

import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.text.DecimalFormat;
import java.util.Calendar;

import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;

/**
 * Display one of those standard Calendar Page icons with Weekday, Day and
 * Month. Can be used as the Icon in a JButton. Can include or exclude an
 * updating Clock at the top (invoke constructor with value of true to include).
 * However, it should be excluded when using as an Icon, and true when using as
 * a Component.
 * 
 * @author Ian Darwin, http://www.darwinsys.com
 * @version $Id: CalIcon.java,v 1.3 2003/05/29 18:06:31 ian Exp $
 */
public class CalIcon extends JComponent implements Icon {
    /** The size shalle be 64x64. */
    protected final int SIZE = 64;

    protected final Dimension d = new Dimension(SIZE, SIZE);

    /** The size of the inner white box */
    protected final int RBW = 40, RBH = 40;

    /** The x location of the inner box */
    protected final int RBX;

    /** The y location of the inner box */
    protected final int RBY;

    /** Our Calendar */
    protected Calendar myCal;

    /** True if user wants the time shown */
    protected boolean showTime = true;

    /** The Clock to show the time, if showTime */
    protected Clock clock;

    /** Font for displaying the time */
    protected Font dayNumbFont;

    /** FontMetrics for displaying the time */
    protected FontMetrics dayNumbFM;

    /** Font for displaying the time */
    protected Font dayNameFont;

    /** FontMetrics for displaying the time */
    protected FontMetrics dayNameFM;

    /** Font for displaying the time */
    protected Font monNameFont;

    /** FontMetrics for displaying the time */
    protected FontMetrics monNameFM;

    /** Construct the object with default arguments */
    public CalIcon(boolean showT) {
        this(Calendar.getInstance(), showT);
    }

    /** Construct the object with a Calendar object */
    public CalIcon(Calendar c, boolean showT) {
        super();
        showTime = showT;
        myCal = c;

        setLayout(null); // we don't need another layout, ...

        if (showTime) {
            // System.err.println("Constructing and adding Clock");
            clock = new Clock();
            add(clock);
            clock.setBounds(0, 2, SIZE, 10);
            // clock.setBackground(Color.black);
            // clock.setForeground(Color.green);
            RBY = d.height - (RBH + (showTime ? 12 : 0) / 2);
        } else {
            RBY = 6;
        }
        RBX = 12; // raised box x offset
        // System.err.println("RBX, RBY = " + RBX + "," + RBY);

        dayNumbFont = new Font("Serif", Font.BOLD, 20);
        dayNumbFM = getFontMetrics(dayNumbFont);
        dayNameFont = new Font("SansSerif", Font.PLAIN, 10);
        dayNameFM = getFontMetrics(dayNameFont);
        monNameFont = new Font("SansSerif", Font.ITALIC, 10);
        monNameFM = getFontMetrics(monNameFont);
    }

    /** Days of the week */
    public String[] days = { "SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT" };

    public String[] mons = { "JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC", };

    /**
     * Paint: draw the calendar page in the JComponent. Delegates most work to
     * paintIcon().
     */
    public void paint(Graphics g) {

        paintIcon(this, g, 0, 0);
    }

    /** paintIcon: draw the calendar page. */
    public void paintIcon(Component c, Graphics g, int x, int y) {

        // Allow clock to get painted (voodoo magic)
        if (showTime)
            super.paint(g);

        // Outline it.
        g.setColor(Color.black);
        g.draw3DRect(x, y, d.width - 2, d.height - 2, true);

        // Show the date: First, a white page with a drop shadow.
        g.setColor(Color.gray);
        g.fillRect(x + RBX + 3, y + RBY + 3, RBW, RBH);
        g.setColor(Color.white);
        g.fillRect(x + RBX, y + RBY, RBW, RBH);

        // g.setColor(getForeground());
        g.setColor(Color.black);

        String s = days[myCal.get(Calendar.DAY_OF_WEEK) - 1];
        g.setFont(dayNameFont);
        int w = dayNameFM.stringWidth(s);
        g.drawString(s, x + RBX + ((RBW - w) / 2), y + RBY + 10);

        s = Integer.toString(myCal.get(Calendar.DAY_OF_MONTH));
        g.setFont(dayNumbFont);
        w = dayNumbFM.stringWidth(s);
        g.drawString(s, x + RBX + ((RBW - w) / 2), y + RBY + 25);

        s = mons[myCal.get(Calendar.MONTH)];
        g.setFont(monNameFont);
        w = monNameFM.stringWidth(s);
        g.drawString(s, x + RBX + ((RBW - w) / 2), y + RBY + 35);
    }

    public int getIconWidth() {
        return SIZE;
    }

    public int getIconHeight() {
        return SIZE;
    }

    public Dimension getPreferredSize() {
        return d;
    }

    public Dimension getMinimumSize() {
        return d;
    }

    public static void main(String[] args) {
        JFrame jf = new JFrame("Calendar");
        Container cp = jf.getContentPane();
        cp.setLayout(new GridLayout(0, 1, 5, 5));
        CalIcon c = new CalIcon(true);
        cp.add(c);
        JButton j = new JButton("As Icon", new CalIcon(false));
        cp.add(j);
        jf.pack();
        jf.setVisible(true);
    }
}

class Clock extends javax.swing.JComponent {
    protected DecimalFormat tflz, tf;
    protected boolean done = false;

    public Clock() {
        new Thread(new Runnable() {
            public void run() {
                while (!done) {
                    Clock.this.repaint(); // request a redraw
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        /* do nothing*/ }
                }
            }
        }).start();
        tf = new DecimalFormat("#0");
        tflz = new DecimalFormat("00");
    }

    public void stop() {
        done = true;
    }

    /* paint() - get current time and draw (centered) in Component. */
    public void paint(Graphics g) {
        Calendar myCal = Calendar.getInstance();
        StringBuffer sb = new StringBuffer();
        sb.append(tf.format(myCal.get(Calendar.HOUR)));
        sb.append(':');
        sb.append(tflz.format(myCal.get(Calendar.MINUTE)));
        sb.append(':');
        sb.append(tflz.format(myCal.get(Calendar.SECOND)));
        String s = sb.toString();
        FontMetrics fm = getFontMetrics(getFont());
        int x = (getSize().width - fm.stringWidth(s)) / 2;
        // System.out.println("Size is " + getSize());
        g.drawString(s, x, 10);
    }

    public Dimension getPreferredSize() {
        return new Dimension(100, 30);
    }

    public Dimension getMinimumSize() {
        return new Dimension(50, 10);
    }
}