/* GanttProject is an opensource project management tool. License: GPL3 Copyright (C) 2010 Dmitry Barashev 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.gui.taskproperties; import net.sourceforge.ganttproject.gui.AbstractTableAndActionsComponent; import net.sourceforge.ganttproject.gui.UIUtil; import net.sourceforge.ganttproject.task.Task; import net.sourceforge.ganttproject.task.TaskManager; import net.sourceforge.ganttproject.task.dependency.TaskDependency; import net.sourceforge.ganttproject.task.dependency.TaskDependencyConstraint; import net.sourceforge.ganttproject.task.dependency.constraint.FinishFinishConstraintImpl; import net.sourceforge.ganttproject.task.dependency.constraint.FinishStartConstraintImpl; import net.sourceforge.ganttproject.task.dependency.constraint.StartFinishConstraintImpl; import net.sourceforge.ganttproject.task.dependency.constraint.StartStartConstraintImpl; import javax.swing.*; import javax.swing.table.TableColumn; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.List; /** * UI component in a task properties dialog: a table with task predecessors * * @author dbarashev (Dmitry Barashev) */ public class TaskDependenciesPanel { private static TaskDependencyConstraint[] CONSTRAINTS = new TaskDependencyConstraint[] { new FinishStartConstraintImpl(), new FinishFinishConstraintImpl(), new StartFinishConstraintImpl(), new StartStartConstraintImpl() }; private static TaskDependency.Hardness[] HARDNESS = new TaskDependency.Hardness[] { TaskDependency.Hardness.STRONG, TaskDependency.Hardness.RUBBER }; private Task myTask; private DependencyTableModel myModel; private JTable myTable; private JTable getTable() { return myTable; } public JPanel getComponent() { myModel = new DependencyTableModel(myTask); myTable = new JTable(myModel); UIUtil.setupTableUI(myTable); setUpPredecessorComboColumn(DependencyTableModel.MyColumn.TASK_NAME.getTableColumn(getTable()), getTable()); CommonPanel.setupComboBoxEditor(DependencyTableModel.MyColumn.CONSTRAINT_TYPE.getTableColumn(getTable()), CONSTRAINTS); CommonPanel.setupComboBoxEditor(DependencyTableModel.MyColumn.HARDNESS.getTableColumn(getTable()), HARDNESS); AbstractTableAndActionsComponent<TaskDependency> tableAndActions = new AbstractTableAndActionsComponent<TaskDependency>( getTable()) { @Override protected void onAddEvent() { getTable().editCellAt(myModel.getRowCount() - 1, DependencyTableModel.MyColumn.TASK_NAME.ordinal()); } @Override protected void onDeleteEvent() { if (myTable.isEditing()) { myTable.getCellEditor().stopCellEditing(); } myModel.delete(getTable().getSelectedRows()); } @Override protected TaskDependency getValue(int row) { List<TaskDependency> dependencies = myModel.getDependencies(); return (row >= 0 && row < dependencies.size()) ? dependencies.get(row) : null; } }; return CommonPanel.createTableAndActions(myTable, tableAndActions.getActionsComponent()); } public void init(Task task) { myTask = task; } public void commit() { if (myTable.isEditing()) { myTable.getCellEditor().stopCellEditing(); } myModel.commit(); } private Task getTask() { return myTask; } protected void setUpPredecessorComboColumn(TableColumn predecessorColumn, final JTable predecessorTable) { final JComboBox comboBox = new JComboBox(); Task[] possiblePredecessors = getTaskManager().getAlgorithmCollection().getFindPossibleDependeesAlgorithm().run( getTask()); for (int i = 0; i < possiblePredecessors.length; i++) { Task next = possiblePredecessors[i]; comboBox.addItem(new DependencyTableModel.TaskComboItem(next)); } comboBox.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (predecessorTable.getEditingRow() != -1) { DependencyTableModel.TaskComboItem selectedItem = (DependencyTableModel.TaskComboItem) comboBox.getSelectedItem(); if (selectedItem != null) { predecessorTable.setValueAt(selectedItem, predecessorTable.getEditingRow(), 0); predecessorTable.setValueAt(TaskDependenciesPanel.CONSTRAINTS[0], predecessorTable.getEditingRow(), 2); } } } }); comboBox.setEditable(false); predecessorColumn.setCellEditor(new DefaultCellEditor(comboBox)); } private TaskManager getTaskManager() { return getTask().getManager(); } }