/*
GanttProject is an opensource project management tool. License: GPL3
Copyright (C) 2005-2011 GanttProject Team
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, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package net.sourceforge.ganttproject;
import java.awt.Component;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.text.NumberFormat;
import java.util.List;
import javax.swing.DropMode;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.TransferHandler;
import javax.swing.event.TableColumnModelListener;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellRenderer;
import javax.swing.tree.TreePath;
import com.google.common.base.Supplier;
import biz.ganttproject.core.model.task.TaskDefaultColumn;
import biz.ganttproject.core.table.ColumnList.Column;
import net.sourceforge.ganttproject.chart.Chart;
import net.sourceforge.ganttproject.chart.GanttChart;
import net.sourceforge.ganttproject.gui.UIFacade;
/**
* Task tree table.
*
* @author bbaranne (Benoit Baranne) - original version
* @author dbarashev (Dmitry Barashev) - complete rewrite in 2011
*/
public class GanttTreeTable extends GPTreeTableBase {
private final UIFacade myUIfacade;
private static final NumberFormat ID_FORMAT = (NumberFormat) NumberFormat.getIntegerInstance().clone();
static {
ID_FORMAT.setGroupingUsed(false);
}
GanttTreeTable(IGanttProject project, final UIFacade uifacade, GanttTreeTableModel model) {
super(project, uifacade, project.getTaskCustomColumnManager(), model);
myUIfacade = uifacade;
getTableHeaderUiFacade().createDefaultColumns(TaskDefaultColumn.getColumnStubs());
setDropMode(DropMode.ON);
final GPTreeTransferHandler transferHandler = new GPTreeTransferHandler(this, project.getTaskManager(), new Supplier<GanttChart>() {
@Override
public GanttChart get() {
return uifacade.getGanttChart();
}
}, uifacade.getUndoManager());
setTransferHandler(transferHandler);
addMouseMotionListener(new MouseMotionAdapter() {
@Override
public void mouseDragged(MouseEvent e) {
transferHandler.exportAsDrag(getTable(), e, TransferHandler.MOVE);
}
});
}
private UIFacade getUiFacade() {
return myUIfacade;
}
@Override
protected List<Column> getDefaultColumns() {
return TaskDefaultColumn.getColumnStubs();
}
@Override
protected Chart getChart() {
return myUIfacade.getGanttChart();
}
@Override
protected void doInit() {
super.doInit();
getTable().getColumnModel().addColumnModelListener((TableColumnModelListener) this.getTreeTableModel());
getTable().getModel().addTableModelListener(new ModelListener());
VscrollAdjustmentListener vscrollListener = new VscrollAdjustmentListener(myUIfacade.getGanttChart(), true);
getVerticalScrollBar().addAdjustmentListener(vscrollListener);
myUIfacade.getGanttChart().setVScrollController(vscrollListener);
TableCellRenderer idRenderer = new DefaultTableCellRenderer() {
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
int row, int column) {
if (value instanceof Integer) {
value = ID_FORMAT.format((Integer) value);
}
return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
}
};
getTableHeaderUiFacade().findColumnByID(TaskDefaultColumn.ID.getStub().getID())
.getTableColumnExt().setCellRenderer(idRenderer);
}
void centerViewOnSelectedCell() {
int row = getTable().getSelectedRow();
int col = getTable().getEditingColumn();
if (col == -1) {
col = getTable().getSelectedColumn();
}
Rectangle rect = getTable().getCellRect(row, col, true);
getHorizontalScrollBar().scrollRectToVisible(rect);
getScrollPane().getViewport().scrollRectToVisible(rect);
}
private class ModelListener implements TableModelListener {
@Override
public void tableChanged(TableModelEvent e) {
getUiFacade().getGanttChart().reset();
}
}
void editSelectedTask() {
TreePath selectedPath = getTree().getTreeSelectionModel().getSelectionPath();
Column column = getTableHeaderUiFacade().findColumnByID(TaskDefaultColumn.NAME.getStub().getID());
editCellAt(getTree().getRowForPath(selectedPath), column.getOrder());
}
@Override
protected void onProjectCreated() {
super.onProjectCreated();
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
getUiFacade().getGanttChart().reset();
}
});
}
}