/*
* (c) Copyright 2010-2011 AgileBirds
*
* This file is part of OpenFlexo.
*
* OpenFlexo 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.
*
* OpenFlexo 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 OpenFlexo. If not, see <http://www.gnu.org/licenses/>.
*
*/
package org.openflexo.fib.utils.table;
import java.awt.event.MouseEvent;
import java.util.logging.Logger;
import javax.swing.JTable;
import javax.swing.table.JTableHeader;
public class FlexoJTable extends JTable {
protected static final Logger logger = Logger.getLogger(FlexoJTable.class.getPackage().getName());
protected AbstractModel _model;
public FlexoJTable(AbstractModel dm) {
super(dm);
_model = dm;
// Following line is very important and must be kept in order
// to prevent unexpected column rebuilt !!!!!!!!!!!!
setAutoCreateColumnsFromModel(false);
}
/**
* Overrides createDefaultTableHeader
*
* @see javax.swing.JTable#createDefaultTableHeader()
*/
@Override
protected JTableHeader createDefaultTableHeader() {
return new JTableHeader(columnModel) {
@Override
public String getToolTipText(MouseEvent e) {
java.awt.Point p = e.getPoint();
int index = columnModel.getColumnIndexAtX(p.x);
int realIndex = columnModel.getColumn(index).getModelIndex();
return _model.getColumnTooltip(realIndex);
}
};
}
/* public void doLayout()
{
logger.info("doLayout() for "+_model);
logger.info("getResizingColumn() = "+getResizingColumn());
logger.info("getSize() = "+getSize());
logger.info("getPreferredSize() = "+getPreferredSize());
logger.info("model.getTotalPreferredWidth() = "+_model.getTotalPreferredWidth());
if (getResizingColumn() == null) {
setWidthsFromPreferredWidths(false);
} else {
super.doLayout();
}
}
public void columnMarginChanged(ChangeEvent e)
{
logger.info("columnMarginChanged() with "+e+" for "+_model);
super.columnMarginChanged(e);
}
private TableColumn getResizingColumn()
{
return (tableHeader == null) ? null
: tableHeader.getResizingColumn();
}
private void setWidthsFromPreferredWidths(final boolean inverse)
{
logger.info("setWidthsFromPreferredWidths() with "+inverse+" for "+_model);
int totalWidth = getWidth();
int totalPreferred = getPreferredSize().width;
int target = !inverse ? totalWidth : totalPreferred;
final TableColumnModel cm = columnModel;
Resizable3 r = new Resizable3() {
public int getElementCount() { return cm.getColumnCount(); }
public int getLowerBoundAt(int i) { return cm.getColumn(i).getMinWidth(); }
public int getUpperBoundAt(int i) { return cm.getColumn(i).getMaxWidth(); }
public int getMidPointAt(int i) {
if (!inverse) {
logger.info("hophophop");
return cm.getColumn(i).getPreferredWidth();
}
else {
logger.info("oucacacacca");
return cm.getColumn(i).getWidth();
}
}
public void setSizeAt(int s, int i) {
if (!inverse) {
cm.getColumn(i).setWidth(s);
}
else {
cm.getColumn(i).setPreferredWidth(s);
}
}
};
adjustSizes(target, r, inverse);
}
private interface Resizable2
{
public int getElementCount();
public int getLowerBoundAt(int i);
public int getUpperBoundAt(int i);
public void setSizeAt(int newSize, int i);
}
private interface Resizable3 extends Resizable2
{
public int getMidPointAt(int i);
}
private void adjustSizes(long target, final Resizable3 r, boolean inverse)
{
logger.info("adjustSizes1() with "+target+","+r+","+inverse+" for "+_model);
int N = r.getElementCount();
long totalPreferred = 0;
String st = "0";
for(int i = 0; i < N; i++) {
int w = r.getMidPointAt(i);
totalPreferred += w;
st = st + " + "+w;
}
logger.info("totalPreferred = "+st+" = "+totalPreferred);
Resizable2 s;
if ((target < totalPreferred) == !inverse) {
logger.info("On passe ici");
s = new Resizable2() {
public int getElementCount() { return r.getElementCount(); }
public int getLowerBoundAt(int i) { return r.getLowerBoundAt(i); }
public int getUpperBoundAt(int i) { return r.getMidPointAt(i); }
public void setSizeAt(int newSize, int i) { r.setSizeAt(newSize, i); }
};
}
else {
logger.info("On passe la");
s = new Resizable2() {
public int getElementCount() { return r.getElementCount(); }
public int getLowerBoundAt(int i) { return r.getMidPointAt(i); }
public int getUpperBoundAt(int i) { return r.getUpperBoundAt(i); }
public void setSizeAt(int newSize, int i) { r.setSizeAt(newSize, i); }
};
}
adjustSizes(target, s, !inverse);
}
private void adjustSizes(long target, Resizable2 r, boolean limitToRange)
{
logger.info("adjustSizes2() with "+target+","+r+","+limitToRange+" for "+_model);
long totalLowerBound = 0;
long totalUpperBound = 0;
for(int i = 0; i < r.getElementCount(); i++) {
totalLowerBound += r.getLowerBoundAt(i);
totalUpperBound += r.getUpperBoundAt(i);
}
if (limitToRange) {
target = Math.min(Math.max(totalLowerBound, target), totalUpperBound);
}
for(int i = 0; i < r.getElementCount(); i++) {
int lowerBound = r.getLowerBoundAt(i);
int upperBound = r.getUpperBoundAt(i);
// Check for zero. This happens when the distribution of the delta
// finishes early due to a series of "fixed" entries at the end.
// In this case, lowerBound == upperBound, for all subsequent terms.
int newSize;
if (totalLowerBound == totalUpperBound) {
newSize = lowerBound;
}
else {
double f = (double)(target - totalLowerBound)/(totalUpperBound - totalLowerBound);
newSize = (int)Math.round(lowerBound+f*(upperBound - lowerBound));
// We'd need to round manually in an all integer version.
// size[i] = (int)(((totalUpperBound - target) * lowerBound +
// (target - totalLowerBound) * upperBound)/(totalUpperBound-totalLowerBound));
}
logger.info("setSizeAt newSize="+newSize+" i="+i );
r.setSizeAt(newSize, i);
target -= newSize;
totalLowerBound -= lowerBound;
totalUpperBound -= upperBound;
}
}
public void createDefaultColumnsFromModel()
{
logger.info("########### createDefaultColumnsFromModel()");
super.createDefaultColumnsFromModel();
}*/
}