/*
Copyright 2003-2012 Dmitry Barashev, GanttProject Team
This file is part of GanttProject, an opensource project management tool.
GanttProject 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.
GanttProject 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 GanttProject. If not, see <http://www.gnu.org/licenses/>.
*/
package net.sourceforge.ganttproject.gui.taskproperties;
import com.google.common.base.Objects;
import net.sourceforge.ganttproject.GPLogger;
import net.sourceforge.ganttproject.language.GanttLanguage;
import net.sourceforge.ganttproject.task.Task;
import net.sourceforge.ganttproject.task.dependency.TaskDependency;
import net.sourceforge.ganttproject.task.dependency.TaskDependency.Hardness;
import net.sourceforge.ganttproject.task.dependency.TaskDependencyCollectionMutator;
import net.sourceforge.ganttproject.task.dependency.TaskDependencyConstraint;
import net.sourceforge.ganttproject.task.dependency.TaskDependencyException;
import net.sourceforge.ganttproject.task.dependency.constraint.ConstraintImpl;
import net.sourceforge.ganttproject.task.dependency.constraint.FinishStartConstraintImpl;
import javax.swing.*;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableColumn;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
/**
* @author dbarashev (Dmitry Barashev)
*/
public class DependencyTableModel extends AbstractTableModel {
private static final boolean EDITABLE = true;
private static final boolean NOT_EDITABLE = false;
public static enum MyColumn {
ID(GanttLanguage.getInstance().getText("id"), DependencyTableModel.NOT_EDITABLE), TASK_NAME(
GanttLanguage.getInstance().getText("taskname"), DependencyTableModel.EDITABLE), CONSTRAINT_TYPE(
GanttLanguage.getInstance().getText("type"), DependencyTableModel.EDITABLE), LAG(
GanttLanguage.getInstance().getText("delay"), DependencyTableModel.EDITABLE), HARDNESS(
GanttLanguage.getInstance().getText("hardness"), DependencyTableModel.EDITABLE);
private final String myCaption;
private final boolean isEditable;
MyColumn(String caption, boolean isEditable) {
myCaption = caption;
this.isEditable = isEditable;
}
public String getCaption() {
return myCaption;
}
public boolean isEditable() {
return isEditable;
}
TableColumn getTableColumn(JTable table) {
return table.getColumnModel().getColumn(this.ordinal());
}
}
private final List<TaskDependency> myDependencies;
private final TaskDependencyCollectionMutator myMutator;
private final Task myTask;
public DependencyTableModel(Task task) {
myDependencies = new ArrayList<TaskDependency>(Arrays.asList(task.getDependenciesAsDependant().toArray()));
myMutator = task.getManager().getDependencyCollection().createMutator();
myTask = task;
}
List<TaskDependency> getDependencies() {
return Collections.unmodifiableList(myDependencies);
}
public void commit() {
myMutator.commit();
}
@Override
public int getColumnCount() {
return MyColumn.values().length;
}
@Override
public int getRowCount() {
return myDependencies.size() + 1;
}
@Override
public String getColumnName(int col) {
return MyColumn.values()[col].getCaption();
}
@Override
public Object getValueAt(int row, int col) {
assert row >= 0 && row < getRowCount() && col >= 0 && col < getColumnCount();
if (row == myDependencies.size()) {
return "";
}
TaskDependency dep = myDependencies.get(row);
MyColumn column = MyColumn.values()[col];
switch (column) {
case ID: {
return dep.getDependee().getTaskID();
}
case TASK_NAME: {
return new TaskComboItem(dep.getDependee());
}
case CONSTRAINT_TYPE: {
return dep.getConstraint().getName();
}
case LAG: {
return dep.getDifference();
}
case HARDNESS: {
return dep.getHardness();
}
default:
throw new IllegalArgumentException("Illegal row number=" + row);
}
}
@Override
public boolean isCellEditable(int row, int col) {
MyColumn column = MyColumn.values()[col];
return row == getRowCount() ? column == MyColumn.TASK_NAME : column.isEditable();
}
@Override
public void setValueAt(Object value, int row, int col) {
assert row >= 0;
if (Objects.equal(value, getValueAt(row, col))) {
return;
}
try {
if (row == myDependencies.size()) {
createDependency(value);
} else {
updateDependency(value, row, col);
}
} catch (TaskDependencyException e) {
if (!GPLogger.log(e)) {
e.printStackTrace(System.err);
}
}
fireTableCellUpdated(row, col);
}
private void updateDependency(Object value, int row, int col) throws TaskDependencyException {
TaskDependency dep = myDependencies.get(row);
switch (col) {
case 4:
dep.setHardness((Hardness) value);
break;
case 3: {
int loadAsInt = Integer.parseInt(String.valueOf(value));
dep.setDifference(loadAsInt);
break;
}
case 2: {
TaskDependencyConstraint clone;
try {
clone = (TaskDependencyConstraint) ((ConstraintImpl) value).clone();
} catch (CloneNotSupportedException e) {
throw new RuntimeException(e);
}
dep.setConstraint(clone);
break;
}
case 1: {
dep.delete();
myDependencies.remove(row);
if (value == null) {
fireTableRowsDeleted(row, row);
} else {
Task selectedTask = ((TaskComboItem) value).myTask;
TaskDependency newDependency = myMutator.createDependency(myTask, selectedTask, new FinishStartConstraintImpl());
myDependencies.add(newDependency);
}
}
}
}
public void delete(int[] selectedRows) {
List<TaskDependency> selected = new ArrayList<TaskDependency>();
for (int row : selectedRows) {
selected.add(myDependencies.get(row));
}
for (TaskDependency d : selected) {
d.delete();
}
myDependencies.removeAll(selected);
fireTableDataChanged();
}
private void createDependency(Object value) throws TaskDependencyException {
if (value instanceof TaskComboItem) {
Task selectedTask = ((TaskComboItem) value).myTask;
TaskDependency dep = myMutator.createDependency(myTask, selectedTask, new FinishStartConstraintImpl());
dep.setHardness(TaskDependency.Hardness.parse(myTask.getManager().getDependencyHardnessOption().getValue()));
myDependencies.add(dep);
fireTableRowsInserted(myDependencies.size(), myDependencies.size());
}
}
static class TaskComboItem {
final String myText;
final Task myTask;
TaskComboItem(Task task) {
myTask = task;
myText = "[#" + task.getTaskID() + "] " + task.getName();
}
@Override
public String toString() {
return myTask.getName();
}
@Override
public boolean equals(Object obj) {
if (obj instanceof TaskComboItem == false) {
return false;
}
TaskComboItem value = (TaskComboItem) obj;
return myTask.getTaskID() == value.myTask.getTaskID();
}
@Override
public int hashCode() {
return myTask.getTaskID();
}
}
}