OSDN Git Service

527e9937f7c45ba85d87da6fe84908509e2cd193
[charactermanaj/CharacterManaJ.git] / src / charactermanaj / model / PartsColorInfo.java
1 package charactermanaj.model;\r
2 \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
11 \r
12 import charactermanaj.graphics.filters.ColorConvertParameter;\r
13 \r
14 /**\r
15  * パーツ単位のカラーグループを含む色情報のコレクション.<br> \r
16  * パーツは複数のレイヤーから構成されるため、レイヤーごとのカラーグループを含む色情報の集合を意味する.<br>\r
17  * キーのセットはカテゴリに属するレイヤーに固定されており、追加・削除することはできない.<br>\r
18  * @author seraphy\r
19  */\r
20 public final class PartsColorInfo extends AbstractMap<Layer, ColorInfo> implements Serializable, Cloneable {\r
21 \r
22         /**\r
23          * ロガー\r
24          */\r
25         private static final Logger logger = Logger.getLogger(PartsColorInfo.class.getName());\r
26         \r
27         private static final long serialVersionUID = -8639109147043912257L;\r
28 \r
29         /**\r
30          * パーツが属するカテゴリのレイヤー構成に対する色情報のマップ.<br>\r
31          */\r
32         private HashMap<Layer, ColorInfo> colorInfoMap = new HashMap<Layer, ColorInfo>();\r
33 \r
34         /**\r
35          * カテゴリ\r
36          */\r
37         private final PartsCategory partsCategory;\r
38         \r
39         /**\r
40          * カテゴリを指定して色情報が未設定のインスタンスを構築する.<br>\r
41          * カテゴリに属するレイヤーが初期化されている.<br>\r
42          * @param partsCategory カテゴリ\r
43          */\r
44         public PartsColorInfo(PartsCategory partsCategory) {\r
45                 if (partsCategory == null) {\r
46                         throw new IllegalArgumentException();\r
47                 }\r
48                 this.partsCategory = partsCategory;\r
49                 init();\r
50         }\r
51         \r
52         @Override\r
53         public PartsColorInfo clone() {\r
54                 try {\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
61                         }\r
62                         return inst;\r
63 \r
64                 } catch (CloneNotSupportedException ex) {\r
65                         throw new RuntimeException(ex);\r
66                 }\r
67         }\r
68         \r
69         /**\r
70          * パーツカラー情報を指定したパーツカテゴリに存在するレイヤーに正規化して返す.<br>\r
71          * カテゴリに存在しないレイヤーの情報は破棄され、結果は有効なレイヤーのみの色情報となる.<br>\r
72          * @param partsCategory パーツカテゴリ\r
73          * @return 正規化されたパーツカラー情報\r
74          */\r
75         public PartsColorInfo createCompatible(PartsCategory partsCategory) {\r
76                 if (partsCategory == null) {\r
77                         throw new IllegalArgumentException();\r
78                 }\r
79                 PartsColorInfo newInfo = new PartsColorInfo(partsCategory);\r
80                 newInfo.init();\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
86                         } else {\r
87                                 logger.log(Level.INFO, "missing layer '" + layer + "' in " + partsCategory);\r
88                         }\r
89                 }\r
90                 return newInfo;\r
91         }\r
92 \r
93         /**\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
100          */\r
101         public static boolean equals(PartsColorInfo a, PartsColorInfo b) {\r
102                 if (a == b) {\r
103                         return true;\r
104                 }\r
105                 if (a == null || b == null) {\r
106                         return false;\r
107                 }\r
108                 return a.equals(b);\r
109         }\r
110         \r
111         private void init() {\r
112                 for (Layer layer : partsCategory.getLayers()) {\r
113                         colorInfoMap.put(layer, createColorInfo(layer));\r
114                 }\r
115         }\r
116         \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
122                 return colorInfo;\r
123         }\r
124         \r
125         public PartsCategory getPartsCategory() {\r
126                 return partsCategory;\r
127         }\r
128         \r
129         @Override\r
130         public Set<java.util.Map.Entry<Layer, ColorInfo>> entrySet() {\r
131                 return Collections.unmodifiableSet(colorInfoMap.entrySet());\r
132         }\r
133         \r
134         /**\r
135          * カテゴリに属するレイヤーの色情報を設定する.<br>\r
136          * カテゴリに該当しないレイヤーを指定した場合はIllegalArgumentException例外となる.<br>\r
137          * @param key レイヤー\r
138          * @param value 色情報\r
139          */\r
140         @Override\r
141         public ColorInfo put(Layer key, ColorInfo value) {\r
142                 if (key == null || value == null) {\r
143                         throw new IllegalArgumentException();\r
144                 }\r
145                 if (!colorInfoMap.containsKey(key)) {\r
146                         throw new IllegalArgumentException("invalid layer: " + key);\r
147                 }\r
148                 return colorInfoMap.put(key, value);\r
149         }\r
150         \r
151         @Override\r
152         public String toString() {\r
153                 StringBuilder buf = new StringBuilder();\r
154                 buf.append(getClass().getSimpleName() + "@" + Integer.toHexString(System.identityHashCode(this)));\r
155                 buf.append("(");\r
156                 buf.append(colorInfoMap.toString());\r
157                 buf.append(")");\r
158                 return buf.toString();\r
159         }\r
160         \r
161 }\r