package com.kreative.paint.material.fontlist; import java.util.ArrayList; import java.util.List; import java.util.SortedMap; import java.util.SortedSet; import java.util.TreeMap; import java.util.TreeSet; public class FontList { private final List<Integer> fontIds; private final SortedSet<Integer> sortedIds; private final List<String> fontNames; private final SortedSet<String> sortedNames; private final SortedMap<Integer,SortedSet<String>> idNameMap; private final SortedMap<String,SortedSet<Integer>> nameIdMap; public final String name; public FontList(String name) { this.fontIds = new ArrayList<Integer>(); this.sortedIds = new TreeSet<Integer>(); this.fontNames = new ArrayList<String>(); this.sortedNames = new TreeSet<String>(); this.idNameMap = new TreeMap<Integer,SortedSet<String>>(); this.nameIdMap = new TreeMap<String,SortedSet<Integer>>(); this.name = name; } public FontList(String name, String... fontNames) { this(name); for (String fontName : fontNames) { add(null, fontName); } } public void add(Integer id, String name) { fontIds.add(id); if (id != null) sortedIds.add(id); fontNames.add(name); if (name != null) sortedNames.add(name); if (id != null && name != null) { if (idNameMap.containsKey(id)) { idNameMap.get(id).add(name); } else { SortedSet<String> names = new TreeSet<String>(); names.add(name); idNameMap.put(id, names); } if (nameIdMap.containsKey(name)) { nameIdMap.get(name).add(id); } else { SortedSet<Integer> ids = new TreeSet<Integer>(); ids.add(id); nameIdMap.put(name, ids); } } } public void clear() { fontIds.clear(); sortedIds.clear(); fontNames.clear(); sortedNames.clear(); idNameMap.clear(); nameIdMap.clear(); } public boolean containsId(Integer id) { if (id == null) return fontIds.contains(null); else return sortedIds.contains(id); } public boolean containsName(String name) { if (name == null) return fontNames.contains(null); else return sortedNames.contains(name); } public boolean contains(Integer id, String name) { if (containsId(id) && containsName(name)) { for (int i = 0, n = size(); i < n; i++) { Integer cid = fontIds.get(i); String cname = fontNames.get(i); if (equals(cid, id) && equals(cname, name)) { return true; } } } return false; } public Integer getId(int index) { return fontIds.get(index); } public String getName(int index) { return fontNames.get(index); } public String[] idToName(Integer id) { if (id == null) return null; SortedSet<String> names = idNameMap.get(id); if (names == null || names.isEmpty()) return null; return names.toArray(new String[names.size()]); } public Integer[] nameToId(String name) { if (name == null) return null; SortedSet<Integer> ids = nameIdMap.get(name); if (ids == null || ids.isEmpty()) return null; return ids.toArray(new Integer[ids.size()]); } public int indexOfId(Integer id) { return fontIds.indexOf(id); } public int indexOfName(String name) { return fontNames.indexOf(name); } public int indexOf(Integer id, String name) { if (containsId(id) && containsName(name)) { for (int i = 0, n = size(); i < n; i++) { Integer cid = fontIds.get(i); String cname = fontNames.get(i); if (equals(cid, id) && equals(cname, name)) { return i; } } } return -1; } public boolean isEmpty() { return fontIds.isEmpty() && fontNames.isEmpty(); } public int lastIndexOfId(Integer id) { return fontIds.lastIndexOf(id); } public int lastIndexOfName(String name) { return fontNames.lastIndexOf(name); } public int lastIndexOf(Integer id, String name) { if (containsId(id) && containsName(name)) { for (int i = size() - 1; i >= 0; i--) { Integer cid = fontIds.get(i); String cname = fontNames.get(i); if (equals(cid, id) && equals(cname, name)) { return i; } } } return -1; } public int size() { return Math.min(fontIds.size(), fontNames.size()); } public int uniqueIdCount() { return sortedIds.size(); } public int uniqueNameCount() { return sortedNames.size(); } public Integer[] idsToArray() { return fontIds.toArray(new Integer[fontIds.size()]); } public Integer[] uniqueIdsToArray() { return sortedIds.toArray(new Integer[sortedIds.size()]); } public String[] namesToArray() { return fontNames.toArray(new String[fontNames.size()]); } public String[] uniqueNamesToArray() { return sortedNames.toArray(new String[sortedNames.size()]); } private static boolean equals(Object dis, Object dat) { if (dis == null) return (dat == null); if (dat == null) return (dis == null); return dis.equals(dat); } }