001         package com.croftsoft.core.gui;
002    
003         import com.croftsoft.core.lang.*;
004         import java.awt.*;
005         import java.util.*;
006    
007         /*********************************************************************
008         * @version
009         *   1997-04-28
010         * @author
011         *   <A HREF="http://www.alumni.caltech.edu/~croft">David W. Croft</A>
012         *********************************************************************/
013    
014         public class  TextCanvas extends Canvas {
015         //////////////////////////////////////////////////////////////////////
016         //////////////////////////////////////////////////////////////////////
017    
018         private Vector     line_Vector  = new Vector ( );
019         private Vector     color_Vector = new Vector ( );
020         private Dimension  size;
021         private Graphics   graphics;
022         private Image      offscreenImage;
023         private Graphics   offscreenGraphics;
024    
025         private static final int  TEXT_INSET_LEFT = 5;
026    
027         //////////////////////////////////////////////////////////////////////
028         //////////////////////////////////////////////////////////////////////
029    
030         public TextCanvas (
031           Color  foreground, Color  background, Font  font ) {
032         //////////////////////////////////////////////////////////////////////
033           setForeground ( foreground );
034           setBackground ( background );
035           setFont ( font );
036         }
037    /*
038         public synchronized void  dispose ( ) {
039         //////////////////////////////////////////////////////////////////////
040           if ( graphics != null ) graphics.dispose ( );
041           if ( offscreenGraphics != null ) offscreenGraphics.dispose ( );
042         }
043    */
044         public void  write ( String  line ) {
045         //////////////////////////////////////////////////////////////////////
046           write ( line, getForeground ( ) );
047         }
048    
049         public void  write ( String  line, Color  color ) {
050         //////////////////////////////////////////////////////////////////////
051           String [ ]  lines = StringLib.toStringArray ( line );
052           synchronized ( this ) {
053             for ( int  i = 0; i < lines.length; i++ ) {
054               line_Vector.addElement ( lines [ i ] );
055               color_Vector.addElement ( color );
056             }
057           }
058           update_offscreen ( );
059           repaint ( );
060         }
061    
062         private synchronized void  update_offscreen ( ) {
063         //////////////////////////////////////////////////////////////////////
064           if ( size == null ) return;
065           int  font_height = getFontMetrics ( getFont ( ) ).getHeight ( );
066           int  max_lines = size.height / font_height;
067           if ( max_lines < 1 ) max_lines = 1;
068           int  line_count;
069           while ( ( line_count = line_Vector.size ( ) ) > max_lines ) {
070             line_Vector.removeElementAt ( 0 );
071             color_Vector.removeElementAt ( 0 );
072           }
073           if ( offscreenGraphics == null ) {
074             offscreenImage = createImage ( size.width, size.height );
075             if ( offscreenImage == null ) return;
076             offscreenGraphics = offscreenImage.getGraphics ( );
077           }
078           offscreenGraphics.setColor ( getBackground ( ) );
079           offscreenGraphics.fillRect ( 0, 0, size.width, size.height );
080           offscreenGraphics.setFont ( getFont ( ) );
081           for ( int  i = 0; i < line_count; i++ ) {
082             offscreenGraphics.setColor (
083               ( Color ) color_Vector.elementAt ( i ) );
084             offscreenGraphics.drawString (
085               ( String ) line_Vector.elementAt ( i ),
086               TEXT_INSET_LEFT, font_height * ( i + 1 ) );
087           }
088         }
089    
090         public void  paint ( Graphics  g ) {
091         //////////////////////////////////////////////////////////////////////
092           try {
093             if ( graphics == null ) graphics = getGraphics ( );
094             if ( graphics == null ) return;
095             if ( offscreenImage != null ) {
096               graphics.drawImage ( offscreenImage, 0, 0, this );
097             }
098           } catch ( Exception  e ) { e.printStackTrace ( ); }
099         }
100    
101         public synchronized void  reshape (
102           int  x, int  y, int  width, int  height ) {
103         //////////////////////////////////////////////////////////////////////
104           try {
105           super.reshape ( x, y, width, height );
106           Dimension  size = size ( );
107           if ( !size.equals ( this.size ) ) {
108             this.size = size;
109             if ( offscreenGraphics != null ) {
110               offscreenGraphics.dispose ( );
111               offscreenGraphics = null;
112               offscreenImage = null;
113               System.gc ( );
114             }
115             update_offscreen ( );
116           }
117           } catch ( Exception  e ) { e.printStackTrace ( ); }
118         }
119    
120         public void  repaint ( ) {
121         //////////////////////////////////////////////////////////////////////
122           paint ( null );
123         }
124    
125         public void  update ( Graphics  g ) {
126         //////////////////////////////////////////////////////////////////////
127           paint ( null );
128         }
129    
130         //////////////////////////////////////////////////////////////////////
131         //////////////////////////////////////////////////////////////////////
132         }