/*
GanttProject is an opensource project management tool.
Copyright (C) 2005-2011 Benoit Baranne, 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 com.google.common.base.Objects;
import net.sourceforge.ganttproject.CustomPropertyDefinition;
import net.sourceforge.ganttproject.CustomPropertyListener;
import net.sourceforge.ganttproject.DefaultCustomPropertyDefinition;
import net.sourceforge.ganttproject.language.GanttLanguage;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
/**
* TODO Remove the map Name->customColum to keep only the map Id -> CustomColumn
* This class stores the CustomColumns.
*
* @author bbaranne (Benoit Baranne) Mar 2, 2005
*/
public class CustomColumnsStorage {
public static GanttLanguage language = GanttLanguage.getInstance();
private static int nextId;
private final static String ID_PREFIX = "tpc";
private final List<CustomPropertyListener> myListeners = new ArrayList<CustomPropertyListener>();
private final Map<String, CustomColumn> mapIdCustomColum = new LinkedHashMap<String, CustomColumn>();
private final CustomColumnsManager myManager;
CustomColumnsStorage(CustomColumnsManager manager) {
myManager = manager;
}
String createId() {
while (true) {
String id = ID_PREFIX + nextId++;
if (!mapIdCustomColum.containsKey(id)) {
return id;
}
}
}
public void reset() {
mapIdCustomColum.clear();
nextId = 0;
}
public static void changeLanguage(GanttLanguage lang) {
language = lang;
}
public void addCustomColumn(CustomColumn col) {
assert !mapIdCustomColum.containsKey(col.getID()) : "column with id =" + col.getID()
+ " already exists. All existing columns:\n" + getCustomColums();
mapIdCustomColum.put(col.getID(), col);
CustomPropertyEvent event = new CustomPropertyEvent(CustomPropertyEvent.EVENT_ADD, col);
fireCustomColumnsChange(event);
}
public void removeCustomColumn(CustomPropertyDefinition column) {
CustomPropertyEvent event = new CustomPropertyEvent(CustomPropertyEvent.EVENT_REMOVE, column);
fireCustomColumnsChange(event);
mapIdCustomColum.remove(column.getID());
}
public int getCustomColumnCount() {
return mapIdCustomColum.size();
}
public Collection<CustomColumn> getCustomColums() {
return mapIdCustomColum.values();
}
public CustomColumn getCustomColumnByID(String id) {
return mapIdCustomColum.get(id);
}
@Override
public String toString() {
return mapIdCustomColum.toString();
}
public Map<CustomPropertyDefinition, CustomPropertyDefinition> importData(CustomColumnsStorage source) {
Map<CustomPropertyDefinition, CustomPropertyDefinition> result = new HashMap<CustomPropertyDefinition, CustomPropertyDefinition>();
for (CustomColumn thatColumn : source.getCustomColums()) {
CustomColumn thisColumn = findByName(thatColumn.getName());
if (thisColumn == null || !thisColumn.getPropertyClass().equals(thatColumn.getPropertyClass())) {
thisColumn = new CustomColumn(myManager, thatColumn.getName(), thatColumn.getPropertyClass(), thatColumn.getDefaultValue());
thisColumn.setId(createId());
thisColumn.getAttributes().putAll(thatColumn.getAttributes());
addCustomColumn(thisColumn);
}
result.put(thatColumn, thisColumn);
}
return result;
}
private CustomColumn findByName(String name) {
for (CustomColumn cc : mapIdCustomColum.values()) {
if (Objects.equal(cc.getName(), name)) {
return cc;
}
}
return null;
}
public void addCustomColumnsListener(CustomPropertyListener listener) {
myListeners.add(listener);
}
private void fireCustomColumnsChange(CustomPropertyEvent event) {
Iterator<CustomPropertyListener> it = myListeners.iterator();
while (it.hasNext()) {
CustomPropertyListener listener = it.next();
listener.customPropertyChange(event);
}
}
void fireDefinitionChanged(int event, CustomPropertyDefinition def, CustomPropertyDefinition oldDef) {
CustomPropertyEvent e = new CustomPropertyEvent(event, def, oldDef);
fireCustomColumnsChange(e);
}
void fireDefinitionChanged(CustomPropertyDefinition def, String oldName) {
CustomPropertyDefinition oldDef = new DefaultCustomPropertyDefinition(oldName, def.getID(), def);
CustomPropertyEvent e = new CustomPropertyEvent(CustomPropertyEvent.EVENT_NAME_CHANGE, def, oldDef);
fireCustomColumnsChange(e);
}
}