001    /*
002     * cs101 Line utility
003     * $Id: Line.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.Color;
016    import java.awt.Graphics;
017    import java.util.StringTokenizer;
018    
019    /**
020     * Implements a 4-coordinate (+ optional Color) line abstraction with
021     * its own drawing method.  Also, implements a translation between
022     * Line objects and String objects for handling by less intelligent
023     * protocols.
024     * 
025     * <P>Copyright 1996 Massachusetts Institute of Technology
026     *
027     * @author   Maciej Stachowiak, maciej@ai.mit.edu
028     * @author   Lynn Andrea Stein, las@ai.mit.edu
029     * @version  $Id: Line.java,v 1.1.1.1 2002/06/05 21:56:32 root Exp $
030     * 
031     * @see      java.awt.Graphics
032     */
033    public class Line {
034        private Color c;
035        private int startX, startY, endX, endY;
036    
037        /**
038         * This specifies the default color for a line.
039         * It may not be changed.
040         */
041        public static final Color DEFAULT_COLOR = Color.black;
042    
043        /**
044         * Construct a line, specifying all 4 coordinates and using
045         * the default color.
046         */
047        public Line ( int startX, int startY, int endX, int endY ) {
048          this( startX, startY, endX, endY, Line.DEFAULT_COLOR );
049        }
050    
051        /**
052         * Construct a line, specifying all 4 coordinates and a specific
053         * color.
054         *
055         * @see java.awt.Color
056         */
057        public Line ( int startX, int startY, int endX, int endY, Color c ) {
058          this.startX = startX;
059          this.startY = startY;
060          this.endX = endX;
061          this.endY = endY;
062          if (c == null) this.c = Line.DEFAULT_COLOR;
063          else /* c != null */ this.c = c;
064        }
065    
066        public void drawOn (Graphics g) {
067          g.setColor(c);
068          g.drawLine(this.startX, this.startY, this.endX, this.endY);
069        }
070    
071      // The rest of this class is for use with primitive datahandlers
072      // which can only cope with Strings.  It provides a utility package
073      // which enables coercion between a particular String representation
074      // and objects of the Line class.
075        private Line() {}
076    
077        /**
078         * Given a String that was originally created by packLine, this
079         * function will return a reference to a new Line object that
080         * represents the original Line.
081         *
082         * @see #packLine
083         */
084        public static Line extractLine( String s ) {
085            StringTokenizer tokens = new StringTokenizer(s," \t\r\n:");
086            Line l = new Line();
087            l.startX = Integer.parseInt( tokens.nextToken() );
088            l.startY = Integer.parseInt( tokens.nextToken() );
089            l.endX = Integer.parseInt( tokens.nextToken() );
090            l.endY = Integer.parseInt( tokens.nextToken() );
091            if ( tokens.hasMoreTokens() ) {
092                l.c = new Color( Integer.parseInt( tokens.nextToken() ) );
093            } else {
094                l.c = Line.DEFAULT_COLOR;
095            }
096            return l;
097        }
098    
099        /**
100         * This method converts a Line into a String.
101         *
102         * @see #extractLine
103         */
104        public static String packLine( Line l ) {
105            return ( Integer.toString( l.startX )
106                     + ":"
107                     + Integer.toString( l.startY )
108                     + ":"
109                     + Integer.toString( l.endX )
110                     + ":"
111                     + Integer.toString( l.endY )
112                     + ":"
113                     + Integer.toString( l.c.getRGB() )
114                     + "\n" );
115        }
116    }
117    
118    
119    /* Comments:
120     *
121     * History:
122     *     $Log: Line.java,v $
123     *     Revision 1.1.1.1  2002/06/05 21:56:32  root
124     *     CS101 comes to Olin finally.
125     *
126     *     Revision 1.4  1998/07/24 17:06:30  tparnell
127     *     Placate new javadoc behavior
128     *
129     *     Revision 1.3  1998/07/22 18:18:39  tparnell
130     *     migration from cs101.util to cs101.*
131     *
132     *     Revision 1.2  1998/06/04 18:53:58  tparnell
133     *     prevented passing in color = null from raising exception
134     *
135     *     Revision 1.1  1998/03/13 22:18:15  tparnell
136     *     Import from server crash.  I think the src and class files match up.
137     *
138     *     Revision 1.4  1996/11/18 17:25:03  las
139     *     Added revised SharedWhiteboard support classes.  These versions of
140     *     Client and Server supercede the previous ones and are not directly
141     *     backwards compatible.  In particular, Server is an instantiable class
142     *     rather than a primarily static one (use RunServer to run it), and
143     *     Client uses StringHandler rather than subclassing to specialize it.
144     *     Line.java just picked up some obscure documentation along the way.
145     *     Otherwise, classes are direct imports from SharedWhiteboard.
146     *
147     *     Revision 1.1  1996/11/18 17:10:15  las
148     *     All files appear to be working.  Some of the files in this directory
149     *     belong in cs101.util.  These will be moved Real Soon Now.  Also, added
150     *     ClientMonitor, which watches net traffic but doesn't send.
151     *
152     *     Revision 1.3  1996/08/01 18:26:29  reuben
153     *     More javadoc tweaking (hopefully the final pass)
154     *
155     *     Revision 1.2  1996/07/30 17:26:00  reuben
156     *     Added/corrected javadoc comments.
157     *
158     *     Revision 1.1.1.1  1996/07/18 17:38:24  sit
159     *     Import from /mit/6.096/share/classes after 6.80s session
160     *
161     *     Revision 1.3  1996/07/11 14:48:06  sit
162     *     Added documentation.
163     *
164     *     Revision 1.2  1996/07/02 22:33:17  las
165     *     Fixed package....
166     *
167     *     Revision 1.1  1996/07/02 21:47:51  las
168     *     Initial revision
169     *
170     */
171