/*******************************************************************************
* Copyright (c) 2016 Weasis Team and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Nicolas Roduit - initial API and implementation
*******************************************************************************/
package org.weasis.core.ui.util;
import java.awt.Point;
import java.awt.Rectangle;
import javax.swing.JTable;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;
public class TableColumnAdjuster {
public static final int VISIBLE_ROWS = 0;
public static final int ALL_ROWS = 1;
public static final int NO_ROWS = 2;
private TableColumnAdjuster() {
}
private static int preferredWidth(JTable table, int col) {
TableColumn tableColumn = table.getColumnModel().getColumn(col);
int width = (int) table.getTableHeader().getDefaultRenderer()
.getTableCellRendererComponent(table, tableColumn.getIdentifier(), false, false, -1, col).getPreferredSize()
.getWidth();
if (table.getRowCount() != 0) {
Rectangle rect = table.getVisibleRect();
int from = table.rowAtPoint(rect.getLocation());
int to = table.rowAtPoint(new Point((int) rect.getMaxX(), (int) rect.getMaxY())) + 1;
for (int row = from; row < to; row++) {
int preferedWidth = (int) table.getCellRenderer(row, col)
.getTableCellRendererComponent(table, table.getValueAt(row, col), false, false, row, col)
.getPreferredSize().getWidth();
width = Math.max(width, preferedWidth);
}
}
return width + table.getIntercellSpacing().width;
}
public static void pack(JTable table) {
if (!table.isShowing() || table.getColumnCount() == 0) {
return;
}
int[] width = new int[table.getColumnCount()];
int total = 0;
for (int col = 0; col < width.length; col++) {
width[col] = preferredWidth(table, col);
total += width[col];
}
int extra = table.getVisibleRect().width - total;
if (extra > 0) {
int bonus = extra / table.getColumnCount();
for (int i = 0; i < width.length; i++) {
width[i] += bonus;
}
extra -= bonus * table.getColumnCount();
width[width.length - 1] += extra;
}
TableColumnModel columnModel = table.getColumnModel();
for (int col = 0; col < width.length; col++) {
TableColumn tableColumn = columnModel.getColumn(col);
table.getTableHeader().setResizingColumn(tableColumn);
tableColumn.setWidth(width[col]);
}
}
}