import java.lang.*;

/**
*
* StringDisplay 
*    
*      Author: Jeffrey Rodriguez
*      StringDisplay Allows you to add / delete into our customized TextField
*
*
*/


public class StringDisplay {
    static int             _length = 64;
    StringBuffer           _displayBuffer  = new StringBuffer( _length );
    int                    _cursor;
    boolean                _floatingPoint  = true;
    char                   _defaultDisplay = ' ';

    static private StringDisplay _instanceFloat = new StringDisplay( true, '0' );
    static private StringDisplay _instanceInt   = new StringDisplay( false, '0' );


    public void  setDefaultDisplay( char defaultValue ) {
        char data[] = new char[2];
        data[0] = defaultValue;
        if ( this.isFloatingPoint() == true ) {
            data[1] = '.';
        }
        _defaultDisplay = defaultValue;
        // System.out.println( "defdis = " + _defaultDisplay );
    }

    public char getDefaultDisplay() {
        return (_defaultDisplay);
    }


    public void  setFloatingPoint( boolean setFloat ) {
        _floatingPoint = setFloat;
    }

    public boolean isFloatingPoint() {
        return (_floatingPoint);
    }

    public int  getCursor( ) {
        return (_cursor);
    }


    public int length() {
       return _displayBuffer.length();
    }

    public void setCursor( int cursor ) {
        _cursor = cursor;
    }

    private  StringDisplay( boolean isFloating, char defaultDisplay ) {
        setFloatingPoint( isFloating );
        setDefaultDisplay( defaultDisplay );
                               //123456789012345678901234567890123456789012345678
        _displayBuffer.append( "                                     " );
        if ( this.isFloatingPoint() == true ) {
            _displayBuffer.setCharAt( _displayBuffer.length() -1 , '.' );
            _displayBuffer.setCharAt( _displayBuffer.length() -2 , this.getDefaultDisplay() );
        } else
            _displayBuffer.setCharAt( _displayBuffer.length() -1 , this.getDefaultDisplay() );

        setCursor( _displayBuffer.length() );
    }


    static public StringDisplay getInstance( boolean isFloating ) {
        if ( isFloating == true ) {
            return (_instanceFloat);
        } else {
            return (_instanceInt);
        }
    }



    public String getStringDisplay() {
        return (_displayBuffer.toString());
    }


    public void add( char alphaNumeric ) {
        int  length  = _displayBuffer.length();
        char alphaCursor = 0;
        if ( this.isFloatingPoint() ) {
            length -= 1;
            for ( int i = length -1 ; i >= 0; i-- ) {
                if ( _displayBuffer.charAt( i ) == ' ' ) {
                    if ( _displayBuffer.charAt( i + 1 ) == this.getDefaultDisplay()  
                         && _displayBuffer.charAt( i + 2 ) == '.' ) {
                        _displayBuffer.setCharAt( i + 1 , ' ' );
                        this.setCursor( i + 1 );
                    } else
                        this.setCursor( i  );

                    break;
                }
            }   
        } else {
            for ( int i = length -1 ; i >= 0; i-- ) {
                if ( _displayBuffer.charAt( i ) == ' ' ) {
                    if ( _displayBuffer.charAt( i + 1 ) == this.getDefaultDisplay() ) {
                        _displayBuffer.setCharAt( i + 1 , ' ' );
                        this.setCursor( i + 1 );
                    } else
                        this.setCursor( i );
                    break;
                }
            }   
        }

        int  numOfChars   = length - this.getCursor();
        char buffer[]     = new char[numOfChars];
        for ( int i = 0; i < numOfChars ; i++ )
            buffer[i] = _displayBuffer.charAt( this.getCursor() + i );

        //System.out.println( "Arra = >>" + new String( buffer ) + "<<" );
        for ( int i = 0; i < numOfChars; i++ ) {
            _displayBuffer.setCharAt( this.getCursor() + i - 1, buffer[i] ); 
        }
        _displayBuffer.setCharAt( length -1 , alphaNumeric );
    }


    public void delete() {
        int  cursor       =  this.getCursor();
        int  numOfChars   = _displayBuffer.length() - cursor;   
        if ( numOfChars == 0 ) {
            return;
        } else if ( numOfChars == 1 ) {
            _displayBuffer.setCharAt(  cursor, this.getDefaultDisplay() );
            return;
        } else if ( numOfChars == 2 && ( this.isFloatingPoint() == true ) ) {
            _displayBuffer.setCharAt(  cursor, this.getDefaultDisplay() );
            return;
        }


        char buffer[]     = new char[numOfChars-1];



        for ( int i = 0; i < numOfChars -1 ; i++ )  // Store field text into buffer
            buffer[i] = _displayBuffer.charAt( cursor + i );

        //System.out.println( "Str Bef = >>" + new String( buffer ) + "<<" ); 
        //System.out.println( "Cursor = " + cursor );
        //System.out.println( "numChar = " + numOfChars );


        if ( this.isFloatingPoint() == true )
            numOfChars -= 1;

        for ( int i = 0; i < numOfChars -1 ; i++ ) {
            if ( buffer[i] == ' ' )
                buffer[i] = this.getDefaultDisplay();

            //if( cursor + i + 1 < 32 )

            //System.out.println( "buf = " + buffer[i] );
            _displayBuffer.setCharAt( cursor + i + 1, buffer[i] ); 

        }
        this.setCursor( cursor + 1  );// move cursor one space over
        //System.out.println( "Str = >>" + new String( buffer ) + "<<" ); 
        // if( cursor < 32 )

        _displayBuffer.setCharAt(  cursor, ' ' );
    }


    public void deleteAll() {
        int cursor = this.getCursor();
        int length = _displayBuffer.length();

        //System.out.println( " cursor = " + cursor );
        //System.out.println( " Length = " + length );
        //this.delete();
        for ( int i = cursor; i< length  ; i++ ) {
            this.delete();
        }
    }

    public void writeString( String str )
    {
    int length = str.length();
    this.deleteAll();
    for( int i = 0; i < length; i++ ) 
       {
       this.add( str.charAt( i ) );
       }
    }

    static public void main( String[] args ) {
        StringDisplay  display = getInstance( false);
        System.out.println( "String = >" + display.getStringDisplay() + "<" );
        display.add( '1' );
        System.out.println( "String = >" + display.getStringDisplay() + "<" );
        display.add( '4' );
        System.out.println( "String = >" + display.getStringDisplay() + "<" );
        display.add( 'B' );
        System.out.println( "String = >" + display.getStringDisplay() + "<" );
        display.delete();
        System.out.println( "String = >" + display.getStringDisplay() + "<" );
        display.delete();
        System.out.println( "String = >" + display.getStringDisplay() + "<" );
        display.delete();
        System.out.println( "String = >" + display.getStringDisplay() + "<" );

        display.delete();
        System.out.println( "String = >" + display.getStringDisplay() + "<" );


        display.delete();
        System.out.println( "String = >" + display.getStringDisplay() + "<" );




        StringDisplay  display1 = getInstance( true );
        System.out.println( "String = >" + display1.getStringDisplay() + "<" );
        display1.add( '1' );
        System.out.println( "String = >" + display1.getStringDisplay() + "<" );
        display1.add( '4' );
        System.out.println( "String = >" + display1.getStringDisplay() + "<" );
        display1.add( 'B' );
        System.out.println( "String = >" + display1.getStringDisplay() + "<" );
        display1.delete();
        System.out.println( "String = >" + display1.getStringDisplay() + "<" );
        display1.delete();
        System.out.println( "String = >" + display1.getStringDisplay() + "<" );
        display1.delete();
        System.out.println( "String = >" + display1.getStringDisplay() + "<" );
        display1.delete();
        System.out.println( "String = >" + display1.getStringDisplay() + "<" );

        display1.delete();
        System.out.println( "String = >" + display1.getStringDisplay() + "<" );

        display1.delete();
        System.out.println( "String = >" + display1.getStringDisplay() + "<" );




        display1.add( '1' );
        System.out.println( "String = >" + display1.getStringDisplay() + "<" );
        display1.add( '4' );
        System.out.println( "String = >" + display1.getStringDisplay() + "<" );
        display1.add( 'B' );
        System.out.println( "String = >" + display1.getStringDisplay() + "<" );
        display1.add( '3' );
        System.out.println( "String = >" + display1.getStringDisplay() + "<" );
        display1.add( '7' );
        System.out.println( "String = >" + display1.getStringDisplay() + "<" );
        display1.add( 'C' );
        System.out.println( "String = >" + display1.getStringDisplay() + "<" );
        System.out.println( "The Cursor = " + display1.getCursor() );
        display1.delete();
        System.out.println( "String = >" + display1.getStringDisplay() + "<" );
        display1.delete();
        System.out.println( "String = >" + display1.getStringDisplay() + "<" );
        display1.deleteAll();
        System.out.println( "String = >" + display1.getStringDisplay() + "<" );
        display1.writeString( "123sdf32" );
        System.out.println( "String = >" + display1.getStringDisplay() + "<" );
        display1.writeString( "222334xxx" );
        System.out.println( "String = >" + display1.getStringDisplay() + "<" );
        display1.deleteAll();
        System.out.println( "String = >" + display1.getStringDisplay() + "<" );

        display1 = getInstance( false);
        display1.deleteAll();
        System.out.println( "String = >" + display1.getStringDisplay() + "<" );
        display1.writeString( "123sdf32" );
        System.out.println( "String = >" + display1.getStringDisplay() + "<" );
        display1.writeString( "222334xxx" );
        System.out.println( "String = >" + display1.getStringDisplay() + "<" );
        display1.deleteAll();
        System.out.println( "String = >" + display1.getStringDisplay() + "<" );
        System.out.println( "String length " + display1.length() );
        display1.writeString( "This_is_a_String" );
        System.out.println( "String = " + display1.getStringDisplay() );

    }


}
