UIPrintableColorTable.java :  » Algebra » simplie » edu » simplie » ui » reusable » Java Open Source

Java Open Source » Algebra » simplie 
simplie » edu » simplie » ui » reusable » UIPrintableColorTable.java
/*
 * UIPrintableColorTable.java
 *
 * Created on 17 april 2007, 17:15
 *
 * This file is part of SimpLie.
 * 
 * SimpLie is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * 
 * SimpLie is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with SimpLie.  If not, see <http://www.gnu.org/licenses/>.
 *
 */

package edu.simplie.ui.reusable;

import javax.swing.JTable;
import javax.swing.event.TableModelEvent;
import javax.swing.table.TableCellRenderer;
import java.awt.Component;
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;

import javax.swing.text.JTextComponent;
import javax.swing.SwingUtilities;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;

public class UIPrintableColorTable extends JTable
{
  private boolean printing = false;
  private String titleTeX = "";
  
  /** Creates a printable color table that automatically resizes its columns. */
  public UIPrintableColorTable()
  {
    super.setShowGrid(false);
  }
  @Override
  public void print(Graphics g)
  {
    printing = true;
    try
    {
      super.setShowHorizontalLines(true);
      super.print(g);
    }
    finally
    {
      super.setShowHorizontalLines(false);
      printing = false;
    }
  }
  
  public void setTitleTeX(String title)
  {
    this.titleTeX = title;
  }
  
  public String getTitleTeX()
  {
    return this.titleTeX;
  }
  
  @Override
  public Component prepareRenderer(
      TableCellRenderer renderer,
      int row, int col)
  {
    Component c = super.prepareRenderer(renderer,
        row, col);
    // if printing, only use plain background
    if (printing)
    {
      c.setBackground(getBackground());
    }
    else
    {
      if (row % 2 == 0 && !isCellSelected(row,col))
      {
        c.setBackground(new Color(244, 246, 248));
        // cell is selected, use the highlight color
      }
      else if (isCellSelected(row, col))
      {
        c.setBackground(getSelectionBackground());
      }
      else
      {
        c.setBackground(getBackground());
      }
    }
    return c;
  }
  
  @Override
  public void tableChanged(TableModelEvent e)
  {
    super.tableChanged(e);
    
    if(e.getType() != TableModelEvent.INSERT)
      return;
    
    /** The following code auto-resizes the column of the table to fit their data. */
    
    Component comp = null;
    TableCellRenderer tableCellRenderer;
    int maxWidth;
    TableColumnModel tableColumnModel = super.getColumnModel();
    TableColumn tableColumn;
    
    for (int i = 0; i < super.getColumnCount(); i++)
    {
      tableCellRenderer = super.getCellRenderer( e.getFirstRow(), i );
      comp = tableCellRenderer.getTableCellRendererComponent( this, super.getValueAt( e.getFirstRow(), i ), false, false, e.getFirstRow(), i );
      
      if ( comp instanceof JTextComponent )
      {
        JTextComponent jtextComp = (JTextComponent)comp;
        
        String text = jtextComp.getText();
        Font font = jtextComp.getFont();
        FontMetrics fontMetrics = jtextComp.getFontMetrics( font );
        
        maxWidth = SwingUtilities.computeStringWidth( fontMetrics, text );
      }
      else
      {
        maxWidth = comp.getPreferredSize().width;
      }
      tableColumn = tableColumnModel.getColumn( i );
      if(e.getFirstRow() != 0)
        maxWidth = Math.max(tableColumn.getPreferredWidth(), maxWidth);
      tableColumn.setPreferredWidth(  maxWidth );
    }
  }
  
  public String toTeX(boolean includeCaption, int[] columns, int extraColumns)
  {
    String output = new String();
    
    if(super.getRowCount() == 0)
    {
      return output;
    }
    
    int totalColumns = columns.length + extraColumns;
    
    /** First determine which columns we should split into multicolumns. */
    int[] multiColumns = new int[columns.length];
    for (int i = 0; i < columns.length; i++)
    {
      multiColumns[i] = 1;
      Object data = super.getValueAt(0,columns[i]);
      if(data.getClass() != String.class)
        continue;
      
      String dataString = (String) data;
      int offset = 0;
      while(dataString.indexOf(" ",offset) != -1)
      {
        offset = dataString.indexOf(" ",offset) + 1;
        multiColumns[i]++;
      }
    }
    
    /** Write the header. */
    output += "\\begin{longtable}{";
    for (int i = 0; i < columns.length; i++)
    {
      output += "|";
      for (int j = 1; j < multiColumns[i]; j++)
      {
        output += "r@{\\ }";
      }
      output += "r";
    }
    for (int i = 0; i < extraColumns; i++)
    {
      output += "|r";
    }
    output += "|} \n";
    if(includeCaption)
      output += "\\caption{" + titleTeX + "} \\\\ \n";
    output += "\\hline \n";
    for (int i = 0; i < totalColumns; i++)
    {
      output += "\\multicolumn{";
      if(i < columns.length)
        output += multiColumns[i];
      else
        output += "1";
      output += "}{|c|}{$";
      if(i < columns.length)
        output +=  super.getColumnName(columns[i]);
      output += "$}";
      if(i != totalColumns - 1)
        output += " & \n";
      else
        output += "\\\\ \n";
    }
    output += "\\hline \n";
    
    /** Write the content */
    Object oldLevel = null;
    for (int i = 0; i < super.getRowCount(); i++)
    {
      if(i == 0 || !oldLevel.equals(super.getValueAt(i,0)))
      {
        output += "\\hline \n";
        oldLevel = super.getValueAt(i,0);
      }
      for (int j = 0; j < totalColumns; j++)
      {
        if(j < columns.length)
        {
          if(multiColumns[j] > 1)
          {
            String dataString = (String) super.getValueAt(i,columns[j]);
            output += dataString.replace(" ", " & ");
          }
          else
            output += super.getValueAt(i,columns[j]);
        }
        
        if(j != totalColumns - 1)
          output += " & ";
        else
          output += "\\\\ \n";
      }
    }
    
    /** Write the footer */
    output += "\\hline \n";
    output += "\\end{longtable}\n";
    
    return output;
  }
}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.