001    /*
002     * cs101 DisplayField utility 
003     * $Id: DisplayField.java,v 1.1.1.1 2002/06/05 21:56:32 root Exp $
004     *
005     * Developed for "Rethinking CS101", a project of Lynn Andrea Stein's AP Group.
006     * For more information, see <a href="http://www.ai.mit.edu/projects/cs101/">the
007     * CS101 homepage</a> or email <las@ai.mit.edu>.
008     *
009     * Copyright (C) 1996 Massachusetts Institute of Technology.
010     * Please do not redistribute without obtaining permission.
011     */
012    
013    package cs101.awt;
014    
015    import java.awt.*;
016    
017    /**
018     * cs101.awt.DisplayField extends cs101.util.ColorField to add a line of
019     * text to the colored rectangle.<p>  The size of the rectangle is supposed
020     * to change with the length of the text.  The color of the field can also
021     * change between two predetermined colors.  
022     *
023     * <P>Copyright 1996 Massachusetts Institute of Technology
024     *
025     * @author Todd C. Parnell, tparnell@ai.mit.edu
026     * @author Joshua R. Brown, reuben@ai.mit.edu
027     * @version $Id: DisplayField.java,v 1.1.1.1 2002/06/05 21:56:32 root Exp $
028     */
029    public class DisplayField extends ColorField {
030    
031      /** the string to be displayed */
032      protected String text;   
033      
034      // DisplayField(String, boolean, Dimension, Color, Color)
035      /**
036       * Constructs a rectangular colorfield with the passed
037       * attributes.
038       *
039       * @param text       The text to intially display in the field.
040       * @param initState  The initial state of the color field.
041       * @param trueColor  The color of the field when the state is true.
042       * @param falseColor The color of the field when the state is false.  
043       */
044      public DisplayField(String text, boolean initState, Color trueColor,
045                          Color falseColor) {
046        super(initState, new Dimension(25,25), trueColor, falseColor);
047        this.text = text;
048      }
049    
050      // setText(String)
051      /**
052       * Changes the text of the DisplayField to the string passed.
053       *
054       * Should also resize the component to fit the text.
055       * This is not fully implemented yet.
056       *
057       * @param text  The string to be displayed in the field.
058       */
059      public void setText(String text) {
060        this.text = text;
061        measure();
062        repaint();
063      }
064    
065      /**
066       * This method is called to determine the size of the
067       * rectangle given the current text to display.
068       */
069      private void measure() {
070        Dimension oldSize = new Dimension(this.dim);
071    
072        FontMetrics fm = this.getFontMetrics(this.getFont());
073        
074        // If we don't have font metrics yet go with our guess
075        if (fm == null)       
076          return;        
077        
078        this.dim.height=fm.getHeight()+16;
079        this.dim.width=fm.stringWidth(this.text)+20;
080    
081      }
082    
083      /**
084       * Calls super.addNotify.  Then measures it's intial size.
085       * <br> 
086       * Note: Must be called from here so that the Font Metrics is available
087       * for measuring.
088       */
089      public void addNotify() {
090        super.addNotify();
091        measure();
092      }
093    
094      /**
095       * Called by this object's container
096       * to determine the minimum space required by this object. 
097       *
098       * @return the prefered size of the object
099       */   
100      public Dimension getPreferredSize() { return this.dim; }
101    
102      /**
103       * Called by this object's container
104       * to determine the minimum space required by this object. 
105       *
106       * @return the minimum size of the object
107       */
108      public Dimension getMinimumSize() { return this.dim; }
109     
110      /**
111       * Calls the ColorField.paint to do the field.
112       * Then adds the text in black.
113       *
114       * @param g The graphics context to paint into.
115       */
116      public void paint(Graphics g) {
117        super.paint(g);
118    
119        // draw the text
120        g.setColor(Color.black);
121        g.drawString(this.text,10,this.dim.height-10);
122        
123      }
124    
125    }
126    
127    
128    /* Comments:
129     *
130     * History:
131     *     $Log: DisplayField.java,v $
132     *     Revision 1.1.1.1  2002/06/05 21:56:32  root
133     *     CS101 comes to Olin finally.
134     *
135     *     Revision 1.4  1998/07/24 17:06:28  tparnell
136     *     Placate new javadoc behavior
137     *
138     *     Revision 1.3  1998/07/22 18:18:36  tparnell
139     *     migration from cs101.util to cs101.*
140     *
141     *     Revision 1.2  1998/06/03 19:32:20  tparnell
142     *     update from Java 1.0 to 1.1
143     *
144     *     Revision 1.1  1998/03/13 22:18:12  tparnell
145     *     Import from server crash.  I think the src and class files match up.
146     *
147     *     Revision 1.4  1996/08/01 18:26:20  reuben
148     *     More javadoc tweaking (hopefully the final pass)
149     *
150     *     Revision 1.3  1996/08/01 16:19:55  reuben
151     *     Fixed javadoc problem with return.
152     *
153     *     Revision 1.2  1996/07/25 18:27:41  reuben
154     *     Added all kinds of comments.
155     *     Compiled and tested.
156     *
157     */