// Fig. 15.13: ReadRandomFile.java 
// This program reads a random access file sequentially and
// displays the contents one record at a time in text fields.
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import java.text.DecimalFormat;

public class ReadRandomFile extends Frame 
             implements ActionListener {

   // TextFields to display account number, first name,
   // last name and balance.
   private TextField accountField, firstNameField,
                     lastNameField, balanceField;

   private Button next,   // get next record in file
                  done;   // quit program

   // Application other pieces
   private RandomAccessFile input;  
   private Record data;

   // Constructor -- initialize the Frame
   public ReadRandomFile()
   {
      super( "Read Client File" );

      // Open the file
      try {
         input = new RandomAccessFile( "credit.dat", "r" );
      }
      catch ( IOException e ) {
         System.err.println( e.toString() );
         System.exit( 1 );
      }

      data = new Record();

      setSize( 300, 150 );
      setLayout( new GridLayout( 5, 2 ) );

      // create the components of the Frame
      add( new Label( "Account Number" ) );
      accountField = new TextField();
      accountField.setEditable( false );
      add( accountField );

      add( new Label( "First Name" ) );
      firstNameField = new TextField( 20 );
      firstNameField.setEditable( false );
      add( firstNameField );      

      add( new Label( "Last Name" ) );
      lastNameField = new TextField( 20 );
      lastNameField.setEditable( false );
      add( lastNameField );

      add( new Label( "Balance" ) );
      balanceField = new TextField( 20 );
      balanceField.setEditable( false );
      add( balanceField );

      next = new Button( "Next" );
      next.addActionListener( this );
      add( next );      

      done = new Button( "Done" );
      done.addActionListener( this );
      add( done );       

      setVisible( true );  
   }

   public void actionPerformed( ActionEvent e )
   {
      if ( e.getSource() == next )
         readRecord();
      else
         closeFile();
   }

   public void readRecord()
   {
      DecimalFormat twoDigits = new DecimalFormat( "0.00" );

      // read a record and display
      try {
         do {
            data.read( input );
         } while ( data.getAccount() == 0 );

         accountField.setText(
            String.valueOf( data.getAccount() ) );
         firstNameField.setText( data.getFirstName() );
         lastNameField.setText( data.getLastName() );
         balanceField.setText( String.valueOf(
            twoDigits.format( data.getBalance() ) ) );
      }
      catch ( EOFException eof ) {
         closeFile();
      }
      catch ( IOException e ) {
         System.err.println( "Error during read from file\n" +
                             e.toString() );
         System.exit( 1 );
      }
   }

   private void closeFile()
   {
      try {
         input.close();
         System.exit( 0 );
      }
      catch ( IOException e ) {
         System.err.println( "Error closing file\n" +
                             e.toString() );
         System.exit( 1 );
      }
   }
   
   // Instantiate a ReadRandomFile object and start the program
   public static void main( String args[] )
   {
      new ReadRandomFile();
   }
}