CustomColumnsStorage.java :  » Project-Management » ganttproject » net » sourceforge » ganttproject » task » Java Open Source

Java Open Source » Project Management » ganttproject 
ganttproject » net » sourceforge » ganttproject » task » CustomColumnsStorage.java
package net.sourceforge.ganttproject.task;

import java.text.ParseException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Vector;

import net.sourceforge.ganttproject.GPLogger;
import net.sourceforge.ganttproject.GanttCalendar;
import net.sourceforge.ganttproject.language.GanttLanguage;
import net.sourceforge.ganttproject.util.DateUtils;

/**
 * TODO Remove tha 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 List availableTypes = null;

    public static GanttLanguage language = GanttLanguage.getInstance();

    private static int nextId;

    private final static String ID_PREFIX = "tpc";
    private final List myListeners = new ArrayList();

    static {
        initTypes();
    }

    /**
     * Column name (String) -> CustomColumn
     */
    // private Map customColumns = null;
    private final Map mapIdCustomColum = new HashMap();

    /**
     * Creates an instance of CustomColumnsStorage.
     */
    public CustomColumnsStorage() {
    }

    public void reset() {
        initTypes();
        mapIdCustomColum.clear();
        nextId = 0;
    }

    // public CustomColumnsStorage(Map customCols)
    // {
    // customColumns = customCols;
    // }

    /**
     * Initialize the available types (text, integer, ...)
     */
    private static void initTypes() {
        availableTypes = new Vector(6);
        availableTypes.add(language.getText("text"));
        availableTypes.add(language.getText("integer"));
        availableTypes.add(language.getText("double"));
        availableTypes.add(language.getText("date"));
        availableTypes.add(language.getText("boolean"));
    }

    /**
     * Changes the language of the available types.
     *
     * @param lang
     *            New language.
     */
    public static void changeLanguage(GanttLanguage lang) {
        language = lang;
        initTypes();
    }

    /**
     * Add a custom column.
     *
     * @param col
     *            CustomColumn to be added.
     * @throws CustomColumnsException
     *             A CustomColumnsException of type
     *             CustomColumnsException.ALREADY_EXIST could be thrown if the
     *             CustomColumn that should be added has a name that already
     *             exists.
     */
    public void addCustomColumn(CustomColumn col) {
        if (getCustomColumnsNames().contains(col.getName())) {
          return;
        }
        String id = col.getId();
        while (id == null) {
            id = ID_PREFIX + nextId++;
            if (existsForID(id))
                id = null;
        }
        mapIdCustomColum.put(id, col);
        col.setId(id);
        CustomColumEvent event = new CustomColumEvent(CustomColumEvent.EVENT_ADD, col);
        fireCustomColumnsChange(event);
    }

    void removeCustomColumn(String name) {
      CustomColumn column = getCustomColumn(name);
      if (column!=null) {
        removeCustomColumn(column);
      }
    }
    /**
     * Removes the CustomColumn whose name is given in parameter. If the column
     * name does not exist, nothing is done.
     *
     * @param name
     *            Name of the column to remove.
     */
    public void removeCustomColumn(CustomColumn column) {
        CustomColumEvent event = new CustomColumEvent(CustomColumEvent.EVENT_REMOVE, column);
        fireCustomColumnsChange(event);
        mapIdCustomColum.remove(column.getId());
    }

    /**
     * Returns the number of custom columns.
     *
     * @return The number of custom columns.
     */
    public int getCustomColumnCount() {
        // return customColumns.size();
        return mapIdCustomColum.size();
    }

    /**
     * Returns a collection containing the names of all the stored custom
     * columns.
     *
     * @return A collection containing the names of all the stored custom
     *         columns.
     */
    public List getCustomColumnsNames() {
        // return customColumns.keySet();
        // -----
        List c = new ArrayList();
        Iterator it = mapIdCustomColum.keySet().iterator();
        while (it.hasNext()) {
            String id = (String) it.next();
            c.add(((CustomColumn) mapIdCustomColum.get(id)).getName());
        }
        return c;
    }

    /**
     * Returns a collection with all the stored custom columns.
     *
     * @return A collection with all the stored custom columns.
     */
    public Collection getCustomColums() {
        // return customColumns.values();
        return mapIdCustomColum.values();
    }

    /**
     * @param name
     * @return
     * @throws CustomColumnsException
     */
    public CustomColumn getCustomColumn(String name) {
        // if (!exists(name))
        // throw new CustomColumnsException(CustomColumnsException.DO_NOT_EXIST,
        // name);
        // return (CustomColumn) customColumns.get(name);
        String id = getIdFromName(name);
        if (id == null) {
          return null;
        }
        return (CustomColumn) mapIdCustomColum.get(id);
    }

    public CustomColumn getCustomColumnByID(String id) {
        return (CustomColumn) mapIdCustomColum.get(id);
    }

    /**
     * Returns true if a custom column has the same name that the one given in
     * parameter, false otherwise.
     *
     * @param colName
     *            The name of the column to check the existence.
     * @return True if a custom column has the same name that the one given in
     *         parameter, false otherwise.
     */
    public boolean exists(String colName) {
        return getIdFromName(colName) != null;
    }

    public boolean existsForID(String id) {
        return this.mapIdCustomColum.keySet().contains(id);
    }

    public void renameCustomColumn(String name, String newName) {
        // if (customColumns.containsKey(name))
        // {
        // CustomColumn cc = (CustomColumn) customColumns.get(name);
        // cc.setName(newName);
        // customColumns.put(newName, cc);
        // customColumns.remove(name);
        // ((CustomColumn) mapIdCustomColum.get(cc.getId())).setName(newName);
        // }
        String id = getIdFromName(name);
        if (id != null) {
            CustomColumn cc = (CustomColumn) mapIdCustomColum.get(id);
            cc.setName(newName);
            CustomColumEvent event = new CustomColumEvent(name, cc);
            fireCustomColumnsChange(event);
        }

    }

    public void changeDefaultValue(String colName, Object newDefaultValue)
            throws CustomColumnsException {
        // if (customColumns.containsKey(colName))
        // {
        // CustomColumn cc = (CustomColumn) customColumns.get(colName);
        // cc.setDefaultValue(newDefaultValue);
        // ((CustomColumn)
        // mapIdCustomColum.get(cc.getId())).setDefaultValue(newDefaultValue);
        // }
        String id = getIdFromName(colName);
        if (id != null) {
            CustomColumn cc = (CustomColumn) mapIdCustomColum.get(id);

            if (newDefaultValue.getClass().isAssignableFrom(cc.getType()))
                cc.setDefaultValue(newDefaultValue);
            else {
                try {
                    if (cc.getType().equals(Boolean.class))
                        cc.setDefaultValue(Boolean.valueOf(newDefaultValue
                                .toString()));
                    else if (cc.getType().equals(Integer.class)) {
                      try {
                        cc.setDefaultValue(Integer.valueOf(newDefaultValue
                            .toString()));
                      }
                      catch (NumberFormatException e) {
                        cc.setDefaultValue(null);
                      }
                    }
                    else if (cc.getType().equals(Double.class)) {
                      try {
                            cc.setDefaultValue(Double.valueOf(newDefaultValue
                                    .toString()));
                      }
                      catch (NumberFormatException e) {
                        cc.setDefaultValue(null);
                      }

                    }
                    else if (GregorianCalendar.class.isAssignableFrom(cc
                            .getType())) {
                      try {
                        Date dateValue =
                          DateUtils.parseDate(newDefaultValue.toString());
                        cc.setDefaultValue(new GanttCalendar(dateValue));
                      }
                      catch (ParseException e) {
                        cc.setDefaultValue(null);
                      }
                    }

                } catch (Exception ee) {
                  throw new CustomColumnsException(ee);
                }

            }
        }
    }

    public String getIdFromName(String name) {
        String id = null;
        Iterator it = mapIdCustomColum.values().iterator();
        while (it.hasNext()) {
            CustomColumn cc = (CustomColumn) it.next();
            if (cc.getName().equals(name)) {
                id = cc.getId();
                break;
            }
        }
        return id;
    }

    public String getNameFromId(String id) {
        CustomColumn column = getCustomColumnByID(id);
        assert column!=null : "failed to find column by id=" + id;
        return column.getName();
    }

    /**
     * Add all stored custom column to the given task. All custom column will
     * have the default value.
     *
     * @param task
     *            The task to process.
     */
    public void processNewTask(Task task) {
        Iterator it = mapIdCustomColum.values().iterator();
        while (it.hasNext()) {
            CustomColumn cc = (CustomColumn) it.next();
            try {
                task.getCustomValues().setValue(cc.getName(),
                        cc.getDefaultValue());
            } catch (CustomColumnsException e) {
              if (!GPLogger.log(e)) {
                e.printStackTrace(System.err);
              }
            }
        }

    }

    public String toString() {
        return mapIdCustomColum.toString();
    }

  public void importData(CustomColumnsStorage source) {
    for (Iterator columns = source.getCustomColums().iterator();
       columns.hasNext();) {
      CustomColumn nextColumn = (CustomColumn) columns.next();
      if (!exists(nextColumn.getName())) {
        addCustomColumn(nextColumn);
      }
    }
  }

    void addCustomColumnsListener(CustomColumsListener listener) {
        myListeners.add(listener);
    }

    private void fireCustomColumnsChange(CustomColumEvent event) {
        Iterator it = myListeners.iterator();
        while (it.hasNext()) {
            CustomColumsListener listener = (CustomColumsListener) it.next();
            listener.customColumsChange(event);
        }
    }

}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.