1 package charactermanaj.model;
\r
3 import java.io.Serializable;
\r
4 import java.util.AbstractMap;
\r
5 import java.util.Collections;
\r
6 import java.util.HashMap;
\r
7 import java.util.Map;
\r
8 import java.util.Set;
\r
9 import java.util.logging.Level;
\r
10 import java.util.logging.Logger;
\r
12 import charactermanaj.graphics.filters.ColorConvertParameter;
\r
15 * パーツ単位のカラーグループを含む色情報のコレクション.<br>
\r
16 * パーツは複数のレイヤーから構成されるため、レイヤーごとのカラーグループを含む色情報の集合を意味する.<br>
\r
17 * キーのセットはカテゴリに属するレイヤーに固定されており、追加・削除することはできない.<br>
\r
20 public final class PartsColorInfo extends AbstractMap<Layer, ColorInfo> implements Serializable, Cloneable {
\r
25 private static final Logger logger = Logger.getLogger(PartsColorInfo.class.getName());
\r
27 private static final long serialVersionUID = -8639109147043912257L;
\r
30 * パーツが属するカテゴリのレイヤー構成に対する色情報のマップ.<br>
\r
32 private HashMap<Layer, ColorInfo> colorInfoMap = new HashMap<Layer, ColorInfo>();
\r
37 private final PartsCategory partsCategory;
\r
40 * カテゴリを指定して色情報が未設定のインスタンスを構築する.<br>
\r
41 * カテゴリに属するレイヤーが初期化されている.<br>
\r
42 * @param partsCategory カテゴリ
\r
44 public PartsColorInfo(PartsCategory partsCategory) {
\r
45 if (partsCategory == null) {
\r
46 throw new IllegalArgumentException();
\r
48 this.partsCategory = partsCategory;
\r
53 public PartsColorInfo clone() {
\r
55 PartsColorInfo inst = (PartsColorInfo) super.clone();
\r
56 inst.colorInfoMap = new HashMap<Layer, ColorInfo>();
\r
57 for (Map.Entry<Layer, ColorInfo> entry : colorInfoMap.entrySet()) {
\r
58 Layer layer = entry.getKey();
\r
59 ColorInfo colorInfo = entry.getValue();
\r
60 inst.colorInfoMap.put(layer, colorInfo.clone());
\r
64 } catch (CloneNotSupportedException ex) {
\r
65 throw new RuntimeException(ex);
\r
70 * パーツカラー情報を指定したパーツカテゴリに存在するレイヤーに正規化して返す.<br>
\r
71 * カテゴリに存在しないレイヤーの情報は破棄され、結果は有効なレイヤーのみの色情報となる.<br>
\r
72 * @param partsCategory パーツカテゴリ
\r
73 * @return 正規化されたパーツカラー情報
\r
75 public PartsColorInfo createCompatible(PartsCategory partsCategory) {
\r
76 if (partsCategory == null) {
\r
77 throw new IllegalArgumentException();
\r
79 PartsColorInfo newInfo = new PartsColorInfo(partsCategory);
\r
81 for (Map.Entry<Layer, ColorInfo> entry : colorInfoMap.entrySet()) {
\r
82 Layer layer = entry.getKey();
\r
83 ColorInfo colorInfo = entry.getValue();
\r
84 if (partsCategory.hasLayer(layer)) {
\r
85 newInfo.put(layer, colorInfo.clone());
\r
87 logger.log(Level.INFO, "missing layer '" + layer + "' in " + partsCategory);
\r
94 * 2つのパーツカラー情報が同じであるか判定する.<br>
\r
95 * 双方がnullである場合はtrueとなります.<br>
\r
96 * いずれか一方がnullである場合はfalseとなります.<br>
\r
97 * @param a 対象1、null可
\r
98 * @param b 対象2, null可
\r
99 * @return 同一であればtrue、そうでなければfalse
\r
101 public static boolean equals(PartsColorInfo a, PartsColorInfo b) {
\r
105 if (a == null || b == null) {
\r
108 return a.equals(b);
\r
111 private void init() {
\r
112 for (Layer layer : partsCategory.getLayers()) {
\r
113 colorInfoMap.put(layer, createColorInfo(layer));
\r
117 protected ColorInfo createColorInfo(Layer layer) {
\r
118 ColorInfo colorInfo = new ColorInfo();
\r
119 colorInfo.setColorGroup(layer.getColorGroup());
\r
120 colorInfo.setSyncColorGroup(layer.getColorGroup().isEnabled());
\r
121 colorInfo.setColorParameter(new ColorConvertParameter());
\r
125 public PartsCategory getPartsCategory() {
\r
126 return partsCategory;
\r
130 public Set<java.util.Map.Entry<Layer, ColorInfo>> entrySet() {
\r
131 return Collections.unmodifiableSet(colorInfoMap.entrySet());
\r
135 * カテゴリに属するレイヤーの色情報を設定する.<br>
\r
136 * カテゴリに該当しないレイヤーを指定した場合はIllegalArgumentException例外となる.<br>
\r
141 public ColorInfo put(Layer key, ColorInfo value) {
\r
142 if (key == null || value == null) {
\r
143 throw new IllegalArgumentException();
\r
145 if (!colorInfoMap.containsKey(key)) {
\r
146 throw new IllegalArgumentException("invalid layer: " + key);
\r
148 return colorInfoMap.put(key, value);
\r
152 public String toString() {
\r
153 StringBuilder buf = new StringBuilder();
\r
154 buf.append(getClass().getSimpleName() + "@" + Integer.toHexString(System.identityHashCode(this)));
\r
156 buf.append(colorInfoMap.toString());
\r
158 return buf.toString();
\r