package com.norbsoft.typefacehelper;
import android.graphics.Typeface;
import android.util.SparseArray;
/**
* Represents collection of typefaces. This includes 4 variants (styles):
* <ul>
* <li>{@link android.graphics.Typeface#NORMAL}</li>
* <li>{@link android.graphics.Typeface#BOLD}</li>
* <li>{@link android.graphics.Typeface#ITALIC}</li>
* <li>{@link android.graphics.Typeface#BOLD_ITALIC}</li>
* </ul>
* @author Jakub Skierbiszewski
*/
public class TypefaceCollection {
/** Builder interface */
public static class Builder {
/**
* This typeface is set in fist {@link #set(int, android.graphics.Typeface)}
* call and is used for all unset styles in {@link #create()} call
*/
private Typeface mDefaultTypeface;
private TypefaceCollection mCollection = new TypefaceCollection();
/**
* Sets typeface for certain style.
*
* @param typefaceStyle one of:
* <ul>
* <li>{@link android.graphics.Typeface#NORMAL}</li>
* <li>{@link android.graphics.Typeface#BOLD}</li>
* <li>{@link android.graphics.Typeface#ITALIC}</li>
* <li>{@link android.graphics.Typeface#BOLD_ITALIC}</li>
* </ul>
* @throws IllegalArgumentException when invalid typefaceStyle is passed
* @return self
*/
public Builder set(int typefaceStyle, Typeface typeface) {
validateTypefaceStyle(typefaceStyle);
if (mDefaultTypeface == null) {
mDefaultTypeface = typeface;
}
mCollection.mTypefaces.put(typefaceStyle, typeface);
return this;
}
/**
* Creates typeface collection.
* If not all styles are set, uses fist typeface that has been set
* for all unset styles.
* @throws IllegalStateException when no {@link android.graphics.Typeface}
* has been set via {@link #set(int, android.graphics.Typeface)}
* @return TypefaceCollection
*/
public TypefaceCollection create() {
if (mDefaultTypeface == null) {
throw new IllegalStateException("At least one typeface style have to be set!");
}
if (mCollection.mTypefaces.get(Typeface.NORMAL) == null) {
mCollection.mTypefaces.put(Typeface.NORMAL, mDefaultTypeface);
}
if (mCollection.mTypefaces.get(Typeface.BOLD) == null) {
mCollection.mTypefaces.put(Typeface.BOLD, mDefaultTypeface);
}
if (mCollection.mTypefaces.get(Typeface.ITALIC) == null) {
mCollection.mTypefaces.put(Typeface.ITALIC, mDefaultTypeface);
}
if (mCollection.mTypefaces.get(Typeface.BOLD_ITALIC) == null) {
mCollection.mTypefaces.put(Typeface.BOLD_ITALIC, mDefaultTypeface);
}
TypefaceCollection collection = mCollection;
mCollection = null;
return collection;
}
}
/**
* Creates default typeface collection, containing system fonts:
* <ul>
* <li>{@link android.graphics.Typeface#DEFAULT}</li>
* <li>{@link android.graphics.Typeface#DEFAULT_BOLD}</li>
* </ul>
* @return typeface collection
*/
public static TypefaceCollection createSystemDefault() {
return new Builder()
.set(Typeface.NORMAL, Typeface.DEFAULT)
.set(Typeface.BOLD, Typeface.DEFAULT_BOLD)
.set(Typeface.ITALIC, Typeface.DEFAULT)
.set(Typeface.BOLD_ITALIC, Typeface.DEFAULT_BOLD)
.create();
}
private SparseArray<Typeface> mTypefaces = new SparseArray<Typeface>(4);
private TypefaceCollection() {}
/**
*
* @param typefaceStyle
* <ul>
* <li>{@link android.graphics.Typeface#NORMAL}</li>
* <li>{@link android.graphics.Typeface#BOLD}</li>
* <li>{@link android.graphics.Typeface#ITALIC}</li>
* <li>{@link android.graphics.Typeface#BOLD_ITALIC}</li>
* </ul>
* @throws IllegalArgumentException when invalid typefaceStyle is passed
*
* @return selected Typeface
*/
Typeface getTypeface(int typefaceStyle) {
validateTypefaceStyle(typefaceStyle);
return mTypefaces.get(typefaceStyle);
}
private static void validateTypefaceStyle(int typefaceStyle) {
switch (typefaceStyle) {
case Typeface.NORMAL:
case Typeface.BOLD:
case Typeface.ITALIC:
case Typeface.BOLD_ITALIC:
break;
default:
throw new IllegalArgumentException("Invalid typeface style! Have to be one of " +
"Typeface.NORMAL, Typeface.BOLD, Typeface.ITALIC or Typeface.BOLD_ITALIC");
}
}
}