/*
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.task;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import biz.ganttproject.core.time.GanttCalendar;
import net.sourceforge.ganttproject.CustomProperty;
import net.sourceforge.ganttproject.CustomPropertyDefinition;
import net.sourceforge.ganttproject.CustomPropertyHolder;
import net.sourceforge.ganttproject.CustomPropertyManager;
import net.sourceforge.ganttproject.language.GanttLanguage;
/**
* Keeps a map of custom property ID to value.
*
* @author bbaranne Mar 2, 2005 -- initial code
* @auuthor dbarashev (Dmitry Barashev) -- complete rewrite
*/
public class CustomColumnsValues implements CustomPropertyHolder, Cloneable {
/**
* CustomColumnName(String) -> Value (Object)
*/
private final Map<String, Object> mapCustomColumnValue = new HashMap<String, Object>();
private final CustomPropertyManager myManager;
/**
* Creates an instance of CustomColumnsValues.
*/
public CustomColumnsValues(CustomPropertyManager customPropertyManager) {
myManager = customPropertyManager;
}
public void setValue(CustomPropertyDefinition def, Object value) throws CustomColumnsException {
if (value == null) {
mapCustomColumnValue.remove(def.getID());
return;
}
Class<?> c1 = def.getType();
Class<?> c2 = value.getClass();
if (!c1.isAssignableFrom(c2)) {
throw new CustomColumnsException(CustomColumnsException.CLASS_MISMATCH, "Failed to set value=" + value
+ ". value class=" + c2 + ", column class=" + c1);
}
mapCustomColumnValue.put(def.getID(), value);
}
public Object getValue(CustomPropertyDefinition def) {
Object result = mapCustomColumnValue.get(def.getID());
return (result == null) ? def.getDefaultValue() : result;
}
public boolean hasOwnValue(CustomPropertyDefinition def) {
return mapCustomColumnValue.containsKey(def.getID());
}
public void removeCustomColumn(CustomPropertyDefinition definition) {
mapCustomColumnValue.remove(definition.getID());
}
@Override
public Object clone() {
CustomColumnsValues res = new CustomColumnsValues(myManager);
res.mapCustomColumnValue.putAll(this.mapCustomColumnValue);
return res;
}
@Override
public String toString() {
return mapCustomColumnValue.toString();
}
@Override
public List<CustomProperty> getCustomProperties() {
List<CustomProperty> result = new ArrayList<CustomProperty>(mapCustomColumnValue.size());
for (Entry<String, Object> entry : mapCustomColumnValue.entrySet()) {
String id = entry.getKey();
Object value = entry.getValue();
CustomPropertyDefinition def = getCustomPropertyDefinition(myManager, id);
if (def != null) {
result.add(new CustomPropertyImpl(def, value));
}
}
return result;
}
private static CustomPropertyDefinition getCustomPropertyDefinition(CustomPropertyManager manager, String id) {
return manager.getCustomPropertyDefinition(id);
}
@Override
public CustomProperty addCustomProperty(CustomPropertyDefinition definition, String valueAsString) {
CustomPropertyDefinition defStub = CustomPropertyManager.PropertyTypeEncoder.decodeTypeAndDefaultValue(
definition.getTypeAsString(), valueAsString);
try {
setValue(definition, defStub.getDefaultValue());
} catch (CustomColumnsException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return new CustomPropertyImpl(definition, defStub.getDefaultValue());
}
private static class CustomPropertyImpl implements CustomProperty {
private CustomPropertyDefinition myDefinition;
private Object myValue;
public CustomPropertyImpl(CustomPropertyDefinition definition, Object value) {
myDefinition = definition;
myValue = value;
}
@Override
public CustomPropertyDefinition getDefinition() {
return myDefinition;
}
@Override
public Object getValue() {
return myValue;
}
@Override
public String getValueAsString() {
return CustomColumnsValues.getValueAsString(myValue);
}
}
static String getValueAsString(Object value) {
String result = null;
if (value != null) {
if (value instanceof GanttCalendar) {
result = GanttLanguage.getInstance().formatShortDate((GanttCalendar) value);
} else {
result = String.valueOf(value);
}
}
return result;
}
}