   import java.io.*;

/**
 * Writes formatted tables (i.e., 2-dimensional arrays of
 * String objects) to a PrintWriter
 *
 * @author  Prof. David Bernstein, James Madison University
 * @version 1.0
 */
    public class TableWriter
   {
      private int               fieldWidth;
      private PrintWriter       out;
   
    /**
     * Explicit Value Constructor
     *
     * @param out   The PrintWriter to write to
     */
       public TableWriter(PrintWriter out)
      {
         this.out   = out;
         fieldWidth = 20;  // changed for 4.8
      }
   
   
    /**
     * Print a table
     *
     * @param table   The table to print
     */
       public void printTable(String[][] table)
      {
         FieldFormat        formatter;
         int                i, j;
      
         formatter = new FieldFormat();
         formatter.setFieldWidth(fieldWidth);
      
         for (i=0; i < table.length; i++)
         {
            for (j=0; j < table[i].length; j++) // fix for 4.2
            {
               if (table[i][j] == null)
               {
                  out.print(formatter.fitStringToField(" "));
               }
               else
               {
                  out.print(formatter.fitStringToField(table[i][j]));
               }
            }
            out.println();
         }
      }
   
   
   
   
   
   
   
   /**
     * Print a table with row and column prefixes
     *
     * @param table   The table to print
     */
       public void writeTable(String[][] table)
      {
        FieldFormat        formatter;
         int                i, j;
      
         formatter = new FieldFormat();
         formatter.setFieldWidth(fieldWidth);
      
         for (i=0; i < table.length; i++)
         {
            for (j=0; j < table[i].length; j++) // fix for 4.2
            {
               if (table[i][j] == null)
               {
                  out.print(formatter.fitStringToField(" "));
               }// end if
               else
               {
                  out.print ("   " + i + "," + j + ":" + table[i][j]+ "\t");  // fix for 4.3
               }// end else
            }// end inner for
            out.println();
         } // end outer for
      }// end writeTable method
   
   /**
     * Print a table with row and column headings
     *
     * @param table   The table to print
     */
       public void printTableWithHeaders(String[][] table)
      {
         FieldFormat        formatter;
         int                i, j;
      
         formatter = new FieldFormat();
         formatter.setFieldWidth(fieldWidth);
      
         for (j = 0; j < table[0].length; j++)  // fix 1 for 4.6
            out.print( "           " + j);
         out.println (); 
      
         for (i=0; i < table.length; i++)
         { 
            out.print (i + "\t");               // fix 3 for 4.6
            for (j=0; j < table[i].length; j++) // fix for 4.2
            {
               if (table[i][j] == null)
               {
                  out.print(formatter.fitStringToField(" "));
               } // end if
               else
               {
                  out.print(formatter.fitStringToField(table[i][j]));
               } // end else
            } // end inner for
            out.println();
         }  // end outer for
      }// end class PrintTableWithHeaders
   
   
    /**
     * Set the field width to use for each 
     * entry in the table
     *
     * @param width
     */
       public void setFieldWidth(int width)
      {
         fieldWidth = width;
      }
   		   
   }
