Project: drugis-common
/*
 * This file is part of ADDIS (Aggregate Data Drug Information System). 
 * ADDIS is distributed from http://drugis.org/. 
 * Copyright © 2009 Gert van Valkenhoef, Tommi Tervonen. 
 * Copyright © 2010 Gert van Valkenhoef, Tommi Tervonen, Tijs Zwinkels, 
 * Maarten Jacobs, Hanno Koeslag, Florin Schimbinschi, Ahmad Kamal, Daniel 
 * Reid. 
 * Copyright © 2011 Gert van Valkenhoef, Ahmad Kamal, Daniel Reid, Florin 
 * Schimbinschi. 
 * Copyright © 2012 Gert van Valkenhoef, Daniel Reid, Joël Kuiper, Wouter 
 * Reckman. 
 * 
 * This program 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. 
 * 
 * This program 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 this program.  If not, see <http://www.gnu.org/licenses/>. 
 */
 
package org.drugis.common.gui.table; 
 
import java.awt.BorderLayout; 
import java.awt.Container; 
import java.awt.Dimension; 
import java.awt.FlowLayout; 
import java.awt.event.ComponentAdapter; 
import java.awt.event.ComponentEvent; 
import java.awt.event.HierarchyEvent; 
import java.awt.event.HierarchyListener; 
 
import javax.swing.BorderFactory; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
 
public class TablePanel extends JPanel { 
 private static final long serialVersionUID = -3818839238577628096L
 
 public TablePanel(JTable table) { 
  super(new BorderLayout()); 
  add(createPanel(table), BorderLayout.CENTER); 
 
 
 private JPanel createPanel(final JTable table) { 
  JPanel panel = new JPanel(new FlowLayout(FlowLayout.LEFT)); 
  final JScrollPane sp = new JScrollPane(table); 
  sp.setBorder(BorderFactory.createEmptyBorder()); 
  sp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER); 
  sp.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); 
 
  panel.add(sp); 
 
  final ComponentAdapter scrollPaneSizer = new ComponentAdapter() { 
   @Override 
   public void componentResized(ComponentEvent e) { 
    final int padding = 2// FIXME: magic number 
    final int margin = 50// FIXME: magic number 
 
    if (findParent() == null) { 
     return
    
    int tablewidth = table.getPreferredSize().width + padding; 
    int panelwidth = findParent().getSize().width - margin; 
 
    int headerHeight = 0
    if (table.getTableHeader() != null) { 
     headerHeight = table.getTableHeader().getHeight(); 
    
 
    int height = table.getPreferredSize().height  + sp.getHorizontalScrollBar().getHeight() + headerHeight + padding; 
 
    sp.setPreferredSize(new Dimension(Math.min(tablewidth, panelwidth), height)); 
    sp.revalidate(); 
   
  }; 
  table.addComponentListener(scrollPaneSizer); 
 
  this.addHierarchyListener(new HierarchyListener() { 
   public void hierarchyChanged(HierarchyEvent e) { 
    if (findParent() != null) { 
     findParent().addComponentListener(scrollPaneSizer); 
    
   
  }); 
 
  return panel; 
 
 
 protected Container findParent() { 
  Container p = this
  while (!(p instanceof JScrollPane) && p != null) { 
   p = p.getParent(); 
  
  return p; 
 
}