/*
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.TableModelExt;
import net.sourceforge.ganttproject.language.GanttLanguage;
import net.sourceforge.ganttproject.resource.HumanResource;
import net.sourceforge.ganttproject.roles.Role;
import net.sourceforge.ganttproject.task.ResourceAssignment;
import net.sourceforge.ganttproject.task.ResourceAssignmentCollection;
import net.sourceforge.ganttproject.task.ResourceAssignmentMutator;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
/**
* Table model of a table of resources assigned to a task.
*
* @author dbarashev (Dmitry Barashev)
*/
class ResourcesTableModel extends TableModelExt<ResourceAssignment>
{
static enum Column {
ID("id", String.class), NAME("resourcename", String.class), UNIT("unit", String.class), COORDINATOR("coordinator",
Boolean.class), ROLE("role", String.class);
private final String myName;
private final Class<?> myClass;
Column(String key, Class<?> clazz) {
myName = GanttLanguage.getInstance().getText(key);
myClass = clazz;
}
String getName() {
return myName;
}
Class<?> getColumnClass() {
return myClass;
}
}
private final List<ResourceAssignment> myAssignments;
private final ResourceAssignmentMutator myMutator;
private boolean isChanged = false;
public ResourcesTableModel(ResourceAssignmentCollection assignmentCollection) {
myAssignments = new ArrayList<ResourceAssignment>(Arrays.asList(assignmentCollection.getAssignments()));
myMutator = assignmentCollection.createMutator();
}
@Override
public Class<?> getColumnClass(int columnIndex) {
return Column.values()[columnIndex].getColumnClass();
}
@Override
public int getColumnCount() {
return Column.values().length;
}
@Override
public int getRowCount() {
return myAssignments.size() + 1;
}
@Override
public String getColumnName(int col) {
return Column.values()[col].getName();
}
@Override
public Object getValueAt(int row, int col) {
Object result;
if (row >= 0) {
if (row < myAssignments.size()) {
ResourceAssignment assignment = myAssignments.get(row);
switch (col) {
case 0:
result = String.valueOf(assignment.getResource().getId());
break;
case 1:
result = assignment.getResource();
break;
case 2:
result = String.valueOf(assignment.getLoad());
break;
case 3:
result = new Boolean(assignment.isCoordinator());
break;
case 4:
result = assignment.getRoleForAssignment();
break;
default:
result = "";
}
} else {
result = null;
}
} else {
throw new IllegalArgumentException("I can't return data in row=" + row);
}
return result;
}
@Override
public boolean isCellEditable(int row, int col) {
boolean result = col > 0;
if (result) {
result = (col == 2 ? row < myAssignments.size() : row <= myAssignments.size()) || col == 3 || col == 4;
}
return result;
}
@Override
public void setValueAt(Object value, int row, int col) {
if (row >= 0) {
if (row >= myAssignments.size()) {
createAssignment(value);
} else {
updateAssignment(value, row, col);
}
} else {
throw new IllegalArgumentException("I can't set data in row=" + row);
}
isChanged = true;
}
private void updateAssignment(Object value, int row, int col) {
ResourceAssignment updateTarget = myAssignments.get(row);
switch (col) {
case 4: {
updateTarget.setRoleForAssignment((Role) value);
break;
}
case 3: {
updateTarget.setCoordinator(((Boolean) value).booleanValue());
break;
}
case 2: {
float loadAsFloat = Float.parseFloat(String.valueOf(value));
updateTarget.setLoad(loadAsFloat);
break;
}
case 1: {
if (value == null) {
updateTarget.delete();
myAssignments.remove(row);
fireTableRowsDeleted(row, row);
} else if (value instanceof HumanResource) {
float load = updateTarget.getLoad();
boolean coord = updateTarget.isCoordinator();
updateTarget.delete();
myMutator.deleteAssignment(updateTarget.getResource());
ResourceAssignment newAssignment = myMutator.addAssignment((HumanResource) value);
newAssignment.setLoad(load);
newAssignment.setCoordinator(coord);
myAssignments.set(row, newAssignment);
}
break;
}
default:
break;
}
}
private void createAssignment(Object value) {
if (value instanceof HumanResource) {
ResourceAssignment newAssignment = myMutator.addAssignment((HumanResource) value);
newAssignment.setLoad(100);
boolean coord = false;
if (myAssignments.isEmpty())
coord = true;
newAssignment.setCoordinator(coord);
newAssignment.setRoleForAssignment(newAssignment.getResource().getRole());
myAssignments.add(newAssignment);
fireTableRowsInserted(myAssignments.size(), myAssignments.size());
}
}
public List<ResourceAssignment> getResourcesAssignments() {
return Collections.unmodifiableList(myAssignments);
}
public void commit() {
myMutator.commit();
}
public boolean isChanged() {
return isChanged;
}
public void delete(int[] selectedRows) {
List<ResourceAssignment> selected = new ArrayList<ResourceAssignment>();
for (int row : selectedRows) {
if (row < myAssignments.size()) {
selected.add(myAssignments.get(row));
}
}
for (ResourceAssignment ra : selected) {
ra.delete();
}
myAssignments.removeAll(selected);
fireTableDataChanged();
}
@Override
public List<ResourceAssignment> getAllValues() {
return myAssignments;
}
}