/*
GanttProject is an opensource project management tool.
Copyright (C) 2009-2011 Dmitry Barashev, 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 org.ganttproject.impex.htmlpdf.itext;
import java.awt.Font;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.ganttproject.impex.htmlpdf.fonts.TTFontCache;
import org.osgi.service.prefs.Preferences;
public class FontSubstitutionModel {
public static class FontSubstitution {
final TTFontCache myFontCache;
final String myOriginalFamily;
private final Preferences myPrefs;
public FontSubstitution(String family, Preferences prefs, TTFontCache fontCache) {
myFontCache = fontCache;
myOriginalFamily = family;
myPrefs = prefs;
}
public boolean isResolved() {
return getSubstitutionFont() != null;
}
public void setSubstitutionFamily(String family) {
myPrefs.put(myOriginalFamily, family);
}
public String getSubstitutionFamily() {
return myPrefs.get(myOriginalFamily, myOriginalFamily);
}
public Font getSubstitutionFont() {
return myFontCache.getAwtFont(getSubstitutionFamily());
}
}
private final TTFontCache myFontCache;
private final Map<String, FontSubstitution> mySubstitutions = new LinkedHashMap<String, FontSubstitution>();
private final ArrayList<FontSubstitution> myIndexedSubstitutions;
public FontSubstitutionModel(TTFontCache fontCache, ITextStylesheet stylesheet, Preferences prefs) {
myFontCache = fontCache;
List<FontSubstitution> unresolvedFonts = new ArrayList<FontSubstitution>();
List<FontSubstitution> resolvedFonts = new ArrayList<FontSubstitution>();
for (Iterator<String> families = stylesheet.getFontFamilies().iterator(); families.hasNext();) {
String nextFamily = families.next();
FontSubstitution fs = new FontSubstitution(nextFamily, prefs, myFontCache);
Font awtFont = fs.getSubstitutionFont();
if (awtFont == null) {
unresolvedFonts.add(fs);
} else {
resolvedFonts.add(fs);
}
}
addSubstitutions(unresolvedFonts);
addSubstitutions(resolvedFonts);
myIndexedSubstitutions = new ArrayList<FontSubstitution>(mySubstitutions.values());
}
private void addSubstitutions(List<FontSubstitution> substitutions) {
for (int i = 0; i < substitutions.size(); i++) {
FontSubstitution nextSubstitution = substitutions.get(i);
mySubstitutions.put(nextSubstitution.myOriginalFamily, nextSubstitution);
}
}
public Collection<FontSubstitution> getSubstitutions() {
return Collections.unmodifiableCollection(mySubstitutions.values());
}
public FontSubstitution getSubstitution(String originalFamily) {
return mySubstitutions.get(originalFamily);
}
public FontSubstitution getSubstitution(int index) {
return myIndexedSubstitutions.get(index);
}
public List<String> getAvailableSubstitutionFamilies() {
return myFontCache.getRegisteredFamilies();
}
public boolean hasUnresolvedFonts() {
for (FontSubstitution fs : mySubstitutions.values()) {
if (!fs.isResolved()) {
return true;
}
}
return false;
}
}