package key; import java.io.*; import java.util.Enumeration; import java.util.StringTokenizer; /** * 'TextParagraph' is used for many room descriptions, and which * can be set to be formatted in various ways, such as justification (left, * right and center), as well as indenting (left, right, firstlineLeft, firstlineRight) */ public class TextParagraph extends Paragraph { private static final long serialVersionUID = -8586198511161550286L; private String text; private int left=0; private int right=0; private int leftFirst=0; private int rightFirst=0; private int alignment; public static final int LEFT = 0; /** * Displays the paragraph centered on the screen, but * left aligned within itself * <p> * Doesn't make use of first line indents - * they are irrelevant. * <p> * It doesn't make an incredible amount of sense to use * left and right indent either, but it could be useful * to have them non-zero if you wanted, say, to center * something 'just left of center' on the screen or * something like that. */ public static final int CENTERALIGNED = 1; public static final int CENTERED = 2; //(unsupported) public static final int RIGHT = 3; //(unsupported) public static final int FULL = 4; public TextParagraph() { text = ""; } public TextParagraph( String value ) { text = value; stripTrailingCR(); } public TextParagraph( TextParagraph p ) { text = p.text; left = p.left; right = p.right; leftFirst = p.leftFirst; rightFirst = p.rightFirst; alignment = p.alignment; stripTrailingCR(); } public TextParagraph( int newAlignment, String value ) { text = value; alignment = newAlignment; stripTrailingCR(); } public TextParagraph( int newAlignment, String value, int left, int right, int leftFirst, int rightFirst ) { this( newAlignment, value ); setMargins( left, right, leftFirst, rightFirst ); } private void stripTrailingCR() { if( text.endsWith( "\n" ) ) text = text.substring( 0, text.length() - 1 ); } public final String getText() { return( text ); } public final boolean isEmpty() { return( text.length() == 0 ); } private final void setMargins( int li, int ri, int lfi, int rfi ) { left = li; right = ri; leftFirst = lfi; rightFirst = rfi; } public final int getAlignment() { return( alignment ); } public final int getLeftMargin() { return( left ); } public final int getRightMargin() { return( right ); } public final int getLeftFirstMargin() { return( leftFirst ); } public final int getRightFirstMargin() { return( rightFirst ); } public final long length() { return( text.length() ); } public final int numberOfNewLines() { int i = 0; int c = -1; if( text == null ) return( 0 ); int tl = text.length(); do { c++; i = text.indexOf( '\n', i ) + 1; } while( i != 0 && i < tl ); return( c + 1 ); } public String toString() { return( "TextParagraph, " + text.length() + " characters." ); } public Paragraph substitute( String[] codes ) { String s = Grammar.substitute( text, codes ); if( s != text ) { TextParagraph tp = new TextParagraph( this ); tp.text = s; return( tp ); } else return( this ); } }