package de.javasoft.synthetica.democenter.examples.tips.table;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Graphics;

import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.border.TitledBorder;
import javax.swing.table.JTableHeader;

import org.jdesktop.swingx.JXTable;
import org.jdesktop.swingx.table.ColumnControlButton;


/**
 * Example how to fill the background of the upper right corner with tableHeader background.  
 */
@SuppressWarnings("serial")
public class FilledScrollPaneCorner extends JFrame
{
  private Object[] columns = {"Planet", "Temperatur", "Monde", "Ringe"};    
  private Object[][] data = 
  {
    {"Merkur", "-170C...+350C", new Integer(0), new Integer(0)},
    {"Venus", "+475C", new Integer(0), new Integer(0)},
    {"Erde", "+22C", new Integer(1), new Integer(0)},
    {"Mars", "-23C", new Integer(2), new Integer(0)},
    {"Jupiter", "-123C", new Integer(16), new Integer(1)},
    {"Saturn", "-18C", new Integer(23), "---"},
    {"Uranus", "-218C", new Integer(18), new Integer(10)},
    {"Neptun", "-228C", new Integer(8), new Integer(3)},
  };
  
  public FilledScrollPaneCorner()
  {
    super("Filled ScrollPaneCorner");
    setLayout(new BoxLayout(getContentPane(), BoxLayout.LINE_AXIS));

    JTable table = new JTable(data, columns);
    JScrollPane tableScrollPane = new JScrollPane(table)
    {
      //workaround to avoid border fallback to default scrollpane-border after a LAF switch - JTable bug.
      @Override
      public void updateUI()
      {
        super.updateUI();
        setBorder(UIManager.getBorder("Table.scrollPaneBorder"));
      }
    };
    //same color for the whole table area - avoid ColorUIResource for LAF change support 
    tableScrollPane.getViewport().setBackground(new Color(table.getBackground().getRGB()));
    tableScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
//@highlight
    JTableHeader th = new JTableHeader();
    th.setTable(table);
    tableScrollPane.setCorner(JScrollPane.UPPER_TRAILING_CORNER, th);
//@/highlight

    JPanel tablePanel = new JPanel(new BorderLayout());
    tablePanel.add(tableScrollPane);
    tablePanel.setBorder(new TitledBorder("JTable"));
    add(tablePanel);
    
    add(Box.createHorizontalStrut(20));
    
    JXTable jxtable = new JXTable(data, columns);
//@highlight
    jxtable.setColumnControlVisible(true);
    th = new JTableHeader();
    th.setTable(jxtable);
    th.setLayout(new BorderLayout());
    th.add(new ColumnControlButton(jxtable, ((JButton)jxtable.getColumnControl()).getIcon())
    {
      @Override
      protected void paintComponent(Graphics g)
      {
        Icon icon = getIcon();
        int iw = icon.getIconWidth();
        int ih = icon.getIconHeight();
        icon.paintIcon(this, g, (getWidth()-iw)/2 , (getHeight()-ih)/2);
      };
      @Override
      public boolean isOpaque()
      {
        return false;
      }
    });
    jxtable.setColumnControl(th);
//@/highlight
    JScrollPane jxtableScrollPane = new JScrollPane(jxtable)
    {
      //workaround to avoid border fallback to default scrollpane-border after a LAF switch - JTable bug in Java 5.
      @Override
      public void updateUI()
      {
        super.updateUI();
        setBorder(UIManager.getBorder("Table.scrollPaneBorder"));
      }
    };    
    jxtableScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
    
    JPanel jxtablePanel = new JPanel(new BorderLayout());    
    jxtablePanel.add(jxtableScrollPane);
    jxtablePanel.setBorder(new TitledBorder("JXTable"));
    add(jxtablePanel);

    //setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);      
    setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    setSize(640, 320);
    setLocationRelativeTo(null);        //center
    setVisible(true);
  }
    
  /**
   * Static main method for application startup. 
   */
  public static void main(String[] args)
  {
    EventQueue.invokeLater(new Runnable()
    {
      public void run()
      {
        try
        {
          UIManager.setLookAndFeel("de.javasoft.plaf.synthetica.SyntheticaStandardLookAndFeel");
          new FilledScrollPaneCorner();
        }
        catch (Exception e)
        {
          e.printStackTrace();
        }
      }
    });
  }
      
}
