Programming Resources
For Fun and Learning
Charles Cusack
Computer Science
Hope College
main

Python
C++

JAVA


PHP
SQL
Assignments

LogicEquivApp


ProofTable.java

import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;
import javax.swing.text.*;

class ProofTable extends JScrollPane {
   ProofModel PModel;
   JTable pTable;
   ProofTable(String S) { initTable(S); }

   public void initTable(String S) {
        PModel=new ProofModel(S);
        pTable=new JTable(PModel) {
            public TableCellRenderer getCellRenderer(int row,int column) {
                if(column==0) { return new EquationRenderer(); }
                else { // column==1
                     DefaultTableCellRenderer GRend=
                              new DefaultTableCellRenderer();
                     GRend.setBackground(new Color(150,150,250));
                     return GRend;
                }
            }
        }; 
        pTable.getColumnModel().getColumn(0).setPreferredWidth(335);
        pTable.getColumnModel().getColumn(0).setMinWidth(335);
        pTable.getColumnModel().getColumn(1).setPreferredWidth(180);
        pTable.getColumnModel().getColumn(1).setMinWidth(180);
        pTable.setBackground(new Color(150,250,150));
        pTable.setShowVerticalLines(false);
        pTable.setShowGrid(false);
        pTable.setIntercellSpacing(new Dimension(0,0));
        pTable.setRowHeight(20);
        pTable.setFont(new Font(pTable.getFont().getFontName(),
                     pTable.getFont().getStyle(),14));

        pTable.getTableHeader().setReorderingAllowed(false);
        pTable.setSelectionMode(0);
        this.setViewportView(pTable);
        this.setPreferredSize(new Dimension(620,360));
        this.validate();
   }
  public void addRow(Object []S) {
      PModel.addRow(S);
        pTable.getColumnModel().getColumn(0).setPreferredWidth(335);
        pTable.getColumnModel().getColumn(0).setMinWidth(335);
        pTable.getColumnModel().getColumn(1).setPreferredWidth(180);
        pTable.getColumnModel().getColumn(1).setMinWidth(180);
      this.validate();
  }

  public void updateCell(Object S,int row,int column) {
      PModel.setValueAt(S,row,column);
        pTable.getColumnModel().getColumn(0).setPreferredWidth(335);
        pTable.getColumnModel().getColumn(0).setMinWidth(335);
        pTable.getColumnModel().getColumn(1).setPreferredWidth(180);
        pTable.getColumnModel().getColumn(1).setMinWidth(180);
      this.validate();
  }

  public String deleteRow() {
      String S=PModel.deleteRow();
      pTable.getColumnModel().getColumn(0).setPreferredWidth(335);
      pTable.getColumnModel().getColumn(0).setMinWidth(335);
      pTable.getColumnModel().getColumn(1).setPreferredWidth(180);
      pTable.getColumnModel().getColumn(1).setMinWidth(180);
      this.validate();
      return S;
  }

  public int rowCount() {
      return PModel.getRowCount();
  }
}
//---------------------------------------------------------------------
class ProofModel extends AbstractTableModel {
   String []Head={"","Equivalence"};
   Object[][] theValues=new Object[50][];
   int rows;
   ProofModel(String S) {
       initTable(S);
   }

  public void addRow(Object []S) {
      theValues[rows]=S;
      rows++;
      fireTableStructureChanged();
  }

  public String removeAts(String A) {
        String B=A;
        while(B.indexOf('@')!=-1) {
             int b=B.indexOf('@');
             if(b==0)
                B=B.substring(1,B.length());
             else if(b==B.length()-1)
                B=B.substring(0,B.length()-1);
             else
                B=B.substring(0,b)+B.substring(b+1,B.length());
        }
        return B;
  }
  public String deleteRow() {
     if(rows>=1) {
        rows--;
        theValues[rows]=null;
        fireTableStructureChanged();
        String S=(String) theValues[rows-1][0];
        setValueAt(removeAts(S),rows-1,0);
        if(rows!=1) S=S.substring(4,S.length());
        return removeAts(S);
     }
     else { return ""; }
  }

   public void initTable(String S) {
      String[]newRow=new String[2];
      newRow[0]=S;
      newRow[1]="";
      addRow(newRow);
      fireTableStructureChanged();
   }
   public int getColumnCount() {
       return 2;
   }

   public int getRowCount() { 
       return rows;
   }
   public String getColumnName(int col) {
       return Head[col];
   }
   public Object getValueAt(int row, int col) {
       return theValues[row][col];
   }
   public Class getColumnClass(int c) {
       return getValueAt(0, c).getClass();
   }
   public boolean isCellEditable(int row, int col) {
       return false;
   }
   public void setValueAt(Object value, int row, int col) {
              theValues[row][col]=value;
   }
};

class EquationRenderer extends JTextPane implements TableCellRenderer {
  
   DefaultStyledDocument lsd;
  public EquationRenderer() {
    super();
    lsd = new DefaultStyledDocument();
    //setLineWrap(true);
  }

  public Component getTableCellRendererComponent(JTable table, Object value,
                   boolean isSelected, boolean hasFocus, int row, int column) {
     setBackground(new Color(100,250,100));
     String S=(String) value;
     String[] initString;
     SimpleAttributeSet[] attrs;
     int F=S.indexOf('@');
     int L=S.lastIndexOf('@');
     if(F!=-1) {
        initString = new String[3];
        initString[0]=S.substring(0,F);
        initString[1]=S.substring(F+1,L);
        initString[2]=S.substring(L+1,S.length());
        attrs = new SimpleAttributeSet[3];
        attrs[0] = new SimpleAttributeSet();
        StyleConstants.setFontFamily(attrs[0], "Lucida Sans");
        StyleConstants.setFontSize(attrs[0], 14);
        attrs[1] = new SimpleAttributeSet(attrs[0]);
        StyleConstants.setForeground(attrs[1], new Color(255,50,50));
        attrs[2] = new SimpleAttributeSet(attrs[0]);
    }
    else {
        initString = new String[1];
        initString[0]=S;
        attrs = new SimpleAttributeSet[1];
        attrs[0] = new SimpleAttributeSet();
        StyleConstants.setFontFamily(attrs[0], "Lucida Sans");
        StyleConstants.setFontSize(attrs[0], 14);
    }
    setDocument(lsd);
    try {
         for (int i = 0; i < initString.length; i ++) {
             lsd.insertString(lsd.getLength(), initString[i], attrs[i]);
         }
     } catch (BadLocationException ble) {
         System.err.println("Couldn't insert initial text."); }
    return this;
  }
}