/*
GanttProject is an opensource project management tool. License: GPL3
Copyright (C) 2012 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 biz.ganttproject.core.model.task;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.GregorianCalendar;
import java.util.List;
import javax.swing.Icon;
import biz.ganttproject.core.table.ColumnList;
import biz.ganttproject.core.table.ColumnList.Column;
import com.google.common.base.Predicate;
/**
* Enumeration of built-in task properties.
*
* @author dbarashev (Dmitry Barashev)
*/
public enum TaskDefaultColumn {
TYPE(new ColumnList.ColumnStub("tpd0", null, false, -1, -1), Icon.class, "tableColType"),
PRIORITY(new ColumnList.ColumnStub("tpd1", null, false, -1, 50), Icon.class, "tableColPriority"),
INFO(new ColumnList.ColumnStub("tpd2", null, false, -1, -1), Icon.class, "tableColInfo", Functions.NOT_EDITABLE),
NAME(new ColumnList.ColumnStub("tpd3", null, true, 0, 200), String.class, "tableColName"),
BEGIN_DATE(new ColumnList.ColumnStub("tpd4", null, true, 1, 75), GregorianCalendar.class, "tableColBegDate"),
END_DATE(new ColumnList.ColumnStub("tpd5", null, true, 2, 75), GregorianCalendar.class, "tableColEndDate", null),
DURATION(new ColumnList.ColumnStub("tpd6", null, false, -1, 50), Integer.class, "tableColDuration", null),
COMPLETION(new ColumnList.ColumnStub("tpd7", null, false, -1, 50), Integer.class, "tableColCompletion"),
COORDINATOR(new ColumnList.ColumnStub("tpd8", null, false, -1, 200), String.class, "tableColCoordinator", Functions.NOT_EDITABLE),
PREDECESSORS(new ColumnList.ColumnStub("tpd9", null, false, -1, 200), String.class, "tableColPredecessors"),
ID(new ColumnList.ColumnStub("tpd10", null, false, -1, 20), Integer.class, "tableColID", Functions.NOT_EDITABLE),
OUTLINE_NUMBER(new ColumnList.ColumnStub("tpd11", null, false, 4, 20), String.class, "tableColOutline", Functions.NOT_EDITABLE),
COST(new ColumnList.ColumnStub("tpd12", null, false, -1, 20), Double.class, "tableColCost"),
RESOURCES(new ColumnList.ColumnStub("tpd13", null, false, -1, 20), String.class, "resources", Functions.NOT_EDITABLE);
public interface LocaleApi {
String i18n(String key);
}
private static LocaleApi ourLocaleApi;
public static void setLocaleApi(LocaleApi localeApi) {
ourLocaleApi = localeApi;
}
private final Column myDelegate;
private final Class<?> myValueClass;
private Predicate<? extends Object> myIsEditablePredicate;
private final String myNameKey;
private Comparator<?> mySortComparator;
private TaskDefaultColumn(ColumnList.Column delegate, Class<?> valueClass, String nameKey) {
this(delegate, valueClass, nameKey, Functions.ALWAYS_EDITABLE);
}
private TaskDefaultColumn(ColumnList.Column delegate, Class<?> valueClass, String nameKey, Predicate<? extends Object> isEditable) {
myDelegate = delegate;
myValueClass = valueClass;
myIsEditablePredicate= isEditable;
myNameKey = nameKey;
}
public Comparator<?> getSortComparator() {
return mySortComparator;
}
public void setSortComparator(Comparator<?> sortComparator) {
mySortComparator = sortComparator;
}
public Column getStub() {
return myDelegate;
}
public static List<Column> getColumnStubs() {
List<Column> result = new ArrayList<Column>();
for (TaskDefaultColumn dc : values()) {
result.add(dc.myDelegate);
}
return result;
}
public static TaskDefaultColumn find(String id) {
for (TaskDefaultColumn column : values()) {
if (column.getStub().getID().equals(id)) {
return column;
}
}
return null;
}
public Class<?> getValueClass() {
return myValueClass;
}
public <T> void setIsEditablePredicate(Predicate<T> predicate) {
myIsEditablePredicate = predicate;
}
public <T> boolean isEditable(T task) {
return ((Predicate<T>)myIsEditablePredicate).apply(task);
}
public String getNameKey() {
return myNameKey;
}
public String getName() {
return ourLocaleApi == null ? getNameKey() : ourLocaleApi.i18n(getNameKey());
}
static class Functions {
static Predicate<Object> NOT_EDITABLE = new Predicate<Object>() {
@Override
public boolean apply(Object input) {
return false;
}
};
static Predicate<Object> ALWAYS_EDITABLE = new Predicate<Object>() {
@Override
public boolean apply(Object input) {
return true;
}
};
}
}