/*
 * Created on 06.03.2005
 */
package net.sourceforge.ganttproject.time.gregorian;

import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;

import net.sourceforge.ganttproject.language.GanttLanguage;
import net.sourceforge.ganttproject.language.GanttLanguage.Event;
import net.sourceforge.ganttproject.language.GanttLanguage.Listener;
import net.sourceforge.ganttproject.time.DateFrameable;
import net.sourceforge.ganttproject.time.TimeUnit;
import net.sourceforge.ganttproject.time.TimeUnitText;

/**
 * @author bard
 */
public abstract class CachingTextFormatter implements Listener {
    private final static Calendar ourCalendar = (Calendar) Calendar.getInstance().clone();
    private final HashMap myTextCache = new HashMap();

    protected CachingTextFormatter() {
        GanttLanguage.getInstance().addListener(this);
    }

    public TimeUnitText format(TimeUnit timeUnit, Date baseDate) {
        TimeUnitText result = null;
        Date adjustedLeft = timeUnit.adjustLeft(baseDate);
        result = getCachedText(adjustedLeft);
        if (result == null) {
            result = createTimeUnitText(adjustedLeft);
            myTextCache.put(adjustedLeft, result);
        }

        return result;
    }

    protected TimeUnitText getCachedText(Date startDate) {
        return (TimeUnitText) myTextCache.get(startDate);
    }

    public void languageChanged(Event event) {
        myTextCache.clear();
    }

    protected Calendar getCalendar() {
        return ourCalendar;
    }
    protected abstract TimeUnitText createTimeUnitText(Date adjustedLeft);

}
