/* ****************************************************************************** * Copyright (C) 2007-2010, International Business Machines Corporation and * * others. All Rights Reserved. * ****************************************************************************** */ package com.ibm.icu.impl.duration; import java.util.Locale; import com.ibm.icu.impl.duration.impl.DataRecord.ECountVariant; import com.ibm.icu.impl.duration.impl.DataRecord.ESeparatorVariant; import com.ibm.icu.impl.duration.impl.DataRecord.EUnitVariant; import com.ibm.icu.impl.duration.impl.PeriodFormatterData; import com.ibm.icu.impl.duration.impl.PeriodFormatterDataService; /** * An implementation of PeriodFormatterFactory that provides customization of * formatting behavior. Instances of this factory are created by * BasicPeriodFormatterService. * * The settings on BasicPeriodFormatterFactory are: * */ public class BasicPeriodFormatterFactory implements PeriodFormatterFactory { private final PeriodFormatterDataService ds; private PeriodFormatterData data; private Customizations customizations; private boolean customizationsInUse; private String localeName; // package-only constructor BasicPeriodFormatterFactory(PeriodFormatterDataService ds) { this.ds = ds; this.customizations = new Customizations(); this.localeName = Locale.getDefault().toString(); } /** * Return the default rdf factory as a BasicPeriodFormatterFactory. * * @return a default BasicPeriodFormatterFactory */ public static BasicPeriodFormatterFactory getDefault() { return (BasicPeriodFormatterFactory) BasicPeriodFormatterService.getInstance().newPeriodFormatterFactory(); } /** * Set the locale for this factory. */ public PeriodFormatterFactory setLocale(String localeName) { data = null; this.localeName = localeName; return this; } /** * Set whether limits will be displayed. * * @param display true if limits will be displayed * @return this PeriodFormatterFactory */ public PeriodFormatterFactory setDisplayLimit(boolean display) { updateCustomizations().displayLimit = display; return this; } /** * Return true if limits will be displayed. * * @return true if limits will be displayed */ public boolean getDisplayLimit() { return customizations.displayLimit; } /** * Set whether past and future will be displayed. * * @param display true if past and future will be displayed * @return this PeriodFormatterFactory */ public PeriodFormatterFactory setDisplayPastFuture(boolean display) { updateCustomizations().displayDirection = display; return this; } /** * Return true if past and future will be displayed. * * @return true if past and future will be displayed */ public boolean getDisplayPastFuture() { return customizations.displayDirection; } /** * Set how separators will be displayed. * * @param variant the variant indicating separators will be displayed * @return this PeriodFormatterFactory */ public PeriodFormatterFactory setSeparatorVariant(int variant) { updateCustomizations().separatorVariant = (byte) variant; return this; } /** * Return the variant indicating how separators will be displayed. * * @return the variant */ public int getSeparatorVariant() { return customizations.separatorVariant; } /** * Set the variant of the time unit names to use. * * @param variant the variant to use * @return this PeriodFormatterFactory */ public PeriodFormatterFactory setUnitVariant(int variant) { updateCustomizations().unitVariant = (byte) variant; return this; } /** * Return the unit variant. * * @return the unit variant */ public int getUnitVariant() { return customizations.unitVariant; } /** * Set the variant of the count to use. * * @param variant the variant to use * @return this PeriodFormatterFactory */ public PeriodFormatterFactory setCountVariant(int variant) { updateCustomizations().countVariant = (byte) variant; return this; } /** * Return the count variant. * * @return the count variant */ public int getCountVariant() { return customizations.countVariant; } public PeriodFormatter getFormatter() { customizationsInUse = true; return new BasicPeriodFormatter(this, localeName, getData(), customizations); } private Customizations updateCustomizations() { if (customizationsInUse) { customizations = customizations.copy(); customizationsInUse = false; } return customizations; } // package access only PeriodFormatterData getData() { if (data == null) { data = ds.get(localeName); } return data; } // package access for use by BasicPeriodFormatter PeriodFormatterData getData(String locName) { return ds.get(locName); } // package access for use by BasicPeriodFormatter static class Customizations { boolean displayLimit = true; boolean displayDirection = true; byte separatorVariant = ESeparatorVariant.FULL; byte unitVariant = EUnitVariant.PLURALIZED; byte countVariant = ECountVariant.INTEGER; public Customizations copy() { Customizations result = new Customizations(); result.displayLimit = displayLimit; result.displayDirection = displayDirection; result.separatorVariant = separatorVariant; result.unitVariant = unitVariant; result.countVariant = countVariant; return result; } } }