OSDN Git Service

mavenによるビルドに変更
[charactermanaj/CharacterManaJ.git] / src / main / java / charactermanaj / ui / model / PartsSelectionManager.java
1 package charactermanaj.ui.model;\r
2 \r
3 import java.awt.Color;\r
4 import java.util.ArrayList;\r
5 import java.util.Collection;\r
6 import java.util.Collections;\r
7 import java.util.HashMap;\r
8 import java.util.List;\r
9 import java.util.Map;\r
10 \r
11 import charactermanaj.model.PartsCategory;\r
12 import charactermanaj.model.PartsColorInfo;\r
13 import charactermanaj.model.PartsColorManager;\r
14 import charactermanaj.model.PartsIdentifier;\r
15 import charactermanaj.model.PartsSet;\r
16 import charactermanaj.ui.ImageSelectPanel;\r
17 \r
18 /**\r
19  * パーツ選択ペインの管理クラス.\r
20  * @author seraphy\r
21  */\r
22 public class PartsSelectionManager {\r
23         \r
24         /**\r
25          * 背景色を管理するオブジェクトが実装するインターフェイス.\r
26          * @author seraphy\r
27          */\r
28         public interface ImageBgColorProvider {\r
29                 \r
30                 /**\r
31                  * 背景色を取得する.\r
32                  * @return 背景色\r
33                  */\r
34                 Color getImageBgColor();\r
35 \r
36                 /**\r
37                  * 背景色を設定する\r
38                  * @param imageBgColor 背景色\r
39                  */\r
40                 void setImageBgColor(Color imageBgColor);\r
41         }\r
42 \r
43         /**\r
44          * カテゴリ別パーツ選択パネル.<br>\r
45          */\r
46         private HashMap<PartsCategory, ImageSelectPanel> imageSelectPanels = new HashMap<PartsCategory, ImageSelectPanel>();\r
47         \r
48         /**\r
49          * パーツカラーマネージャ.<br>\r
50          */\r
51         private PartsColorManager partsColorMrg;\r
52         \r
53         /**\r
54          * 背景色プロバイダ.\r
55          */\r
56         private ImageBgColorProvider imageBgColorProvider;\r
57         \r
58         /**\r
59          * アフィン変換用のパラメータ.<br>\r
60          * 変換しない場合はnull.<br>\r
61          */\r
62         private double[] affineTransformParameter;\r
63         \r
64         /**\r
65          * 単一選択カテゴリの選択解除の有効/無効.<br>\r
66          * 有効にする場合はtrue.<br>\r
67          */\r
68         private boolean deselectableAllCategory;\r
69         \r
70         \r
71         /**\r
72          * コンストラクタ\r
73          * @param partsColorMrg パーツカラーマネージャ\r
74          * @param imageBgColorProvider 背景色プロバイダ\r
75          */\r
76         public PartsSelectionManager(\r
77                         PartsColorManager partsColorMrg,\r
78                         ImageBgColorProvider imageBgColorProvider\r
79                         ) {\r
80                 if (partsColorMrg == null || imageBgColorProvider == null) {\r
81                         throw new IllegalArgumentException();\r
82                 }\r
83                 this.partsColorMrg = partsColorMrg;\r
84                 this.imageBgColorProvider = imageBgColorProvider;\r
85         }\r
86         \r
87 \r
88         /**\r
89          * パーツをロードする.\r
90          */\r
91         public void loadParts() {\r
92                 for (ImageSelectPanel panel : imageSelectPanels.values()) {\r
93                         panel.loadParts();\r
94                 }\r
95         }\r
96         \r
97         public void register(ImageSelectPanel imageSelectPanel) {\r
98                 if (imageSelectPanel == null) {\r
99                         throw new IllegalArgumentException();\r
100                 }\r
101                 imageSelectPanels.put(imageSelectPanel.getPartsCategory(), imageSelectPanel);\r
102         }\r
103 \r
104         public List<PartsIdentifier> getSelectedPartsIdentifiers(PartsCategory partsCategory) {\r
105                 if (partsCategory == null) {\r
106                         throw new IllegalArgumentException();\r
107                 }\r
108                 ImageSelectPanel panel = imageSelectPanels.get(partsCategory);\r
109                 if (panel != null) {\r
110                         return Collections.unmodifiableList(panel.getSelectedPartsIdentifiers());\r
111                 }\r
112                 return Collections.emptyList();\r
113         }\r
114 \r
115         public PartsIdentifier getSelectedPartsIdentifier(PartsCategory partsCategory) {\r
116                 if (partsCategory == null) {\r
117                         throw new IllegalArgumentException();\r
118                 }\r
119                 ImageSelectPanel panel = imageSelectPanels.get(partsCategory);\r
120                 if (panel != null) {\r
121                         return panel.getSelectedPartsIdentifier();\r
122                 }\r
123                 return null;\r
124         }\r
125         \r
126         public Collection<PartsCategory> getAllCategories() {\r
127                 ArrayList<PartsCategory> partsCategories = new ArrayList<PartsCategory>();\r
128                 partsCategories.addAll(imageSelectPanels.keySet());\r
129                 return partsCategories;\r
130         }\r
131         \r
132         /**\r
133          * 各カテゴリの選択状態と背景をパーツセットで指定されたものに設定します.<br>\r
134          * @param partsSet パーツセット\r
135          */\r
136         public void selectPartsSet(PartsSet partsSet) {\r
137                 if (partsSet == null) {\r
138                         throw new IllegalArgumentException();\r
139                 }\r
140 \r
141                 for (ImageSelectPanel panel : imageSelectPanels.values()) {\r
142                         PartsCategory partsCategory = panel.getPartsCategory();\r
143                         List<PartsIdentifier> partsIdentifiers = partsSet.get(partsCategory);\r
144                         panel.selectParts(partsIdentifiers);\r
145                         if (partsIdentifiers != null) {\r
146                                 for (PartsIdentifier partsIdentifier : partsIdentifiers) {\r
147                                         PartsColorInfo partsColorInfo = partsSet.getColorInfo(partsIdentifier);\r
148                                         if (partsColorInfo != null) {\r
149                                                 partsColorMrg.setPartsColorInfo(partsIdentifier, partsColorInfo, false);\r
150                                         }\r
151                                 }\r
152                         }\r
153                 }\r
154 \r
155                 Color bgColor = partsSet.getBgColor();\r
156                 if (bgColor != null) {\r
157                         setImageBgColor(bgColor); \r
158                 }\r
159                 \r
160                 affineTransformParameter = partsSet.getAffineTransformParameter(); // clone済み\r
161         }\r
162         \r
163         /**\r
164          * 現在の選択中のパーツと色設定からパーツセットを構築します.\r
165          * 選択がなにもない場合は空のパーツセットとなります.<br>\r
166          * @return パーツセット\r
167          */\r
168         public PartsSet createPartsSet() {\r
169                 PartsSet presetParts = new PartsSet();\r
170                 for (ImageSelectPanel imageSelectPanel : imageSelectPanels.values()) {\r
171                         PartsCategory category = imageSelectPanel.getPartsCategory();\r
172                         for (PartsIdentifier partsIdentifier : imageSelectPanel.getSelectedPartsIdentifiers()) {\r
173                                 PartsColorInfo partsColorInfo = partsColorMrg.getPartsColorInfo(partsIdentifier, false);\r
174                                 presetParts.appendParts(category, partsIdentifier, partsColorInfo);\r
175                         }\r
176                 }\r
177                 presetParts.setBgColor(getImageBgColor());\r
178                 presetParts.setAffineTransformParameter(affineTransformParameter); // 相手側でcloneする\r
179                 return presetParts;\r
180         }\r
181 \r
182         /**\r
183          * すべてのカテゴリのリストで選択中のアイテムが見えるようにスクロールする.\r
184          */\r
185         public void scrollToSelectedParts() {\r
186                 for (ImageSelectPanel imageSelectPanel : imageSelectPanels.values()) {\r
187                         imageSelectPanel.scrollToSelectedRow();\r
188                 }\r
189         }\r
190         \r
191         /**\r
192          * 指定したパーツ識別子にフォーカスを当てて、必要に応じてスクロールします.<br>\r
193          * 該当するパーツ識別子がどこにもなければ何もしません.<br>\r
194          * @param partsIdentifier パーツ識別子\r
195          */\r
196         public void setSelection(PartsIdentifier partsIdentifier) {\r
197                 if (partsIdentifier == null) {\r
198                         return;\r
199                 }\r
200                 PartsCategory partsCategory = partsIdentifier.getPartsCategory();\r
201                 if (isMinimizeMode(partsCategory)) {\r
202                         setMinimizeModeIfOther(partsCategory, true);\r
203                 }\r
204                 ImageSelectPanel imageSelectPanel = imageSelectPanels.get(partsCategory);\r
205                 if (imageSelectPanel != null) {\r
206                         imageSelectPanel.setSelection(partsIdentifier);\r
207                 }\r
208         }\r
209         \r
210         /**\r
211          * 背景色を取得する.\r
212          * @return 背景色\r
213          */\r
214         protected Color getImageBgColor() {\r
215                 return imageBgColorProvider.getImageBgColor();\r
216         }\r
217 \r
218         /**\r
219          * 背景色を設定する\r
220          * @param imageBgColor 背景色\r
221          */\r
222         protected void setImageBgColor(Color imageBgColor) {\r
223                 imageBgColorProvider.setImageBgColor(imageBgColor);\r
224         }\r
225 \r
226         /**\r
227          * アフィン変換用のパラメータを取得する.<br>\r
228          * 変換しない場合はnull.<br>\r
229          * @return アフィン変換用のパラメータ、もしくはnull\r
230          */\r
231         public double[] getAffineTransformParameter() {\r
232                 return affineTransformParameter == null ? null : affineTransformParameter.clone();\r
233         }\r
234         \r
235         /**\r
236          * アフィン変換用のパラメータを設定する.<br>\r
237          * 変換しない場合はnull.<br>\r
238          * 要素数は4または6でなければならない.<br>\r
239          * @param affineTransformParameter アフィン変換用のパラメータ、もしくはnull\r
240          */\r
241         public void setAffineTransformParameter(double[] affineTransformParameter) {\r
242                 if (affineTransformParameter != null && !(affineTransformParameter.length == 4 || affineTransformParameter.length == 6)) {\r
243                         throw new IllegalArgumentException("affineTransformParameter invalid length.");\r
244                 }\r
245                 this.affineTransformParameter = affineTransformParameter == null ? null : affineTransformParameter.clone();\r
246         }\r
247 \r
248         /**\r
249          * 選択選択パーツカテゴリの選択解除を許可するか?<br>\r
250          * @return 許可する場合はtrue\r
251          */\r
252         public boolean isDeselectableSingleCategory() {\r
253                 return deselectableAllCategory;\r
254         }\r
255         \r
256         /**\r
257          * 選択選択パーツカテゴリの選択解除を許可するか設定する.<br>\r
258          * @param deselectable 許可する場合はtrue\r
259          */\r
260         public void setDeselectableSingleCategory(boolean deselectable) {\r
261                 this.deselectableAllCategory = deselectable;\r
262                 for (ImageSelectPanel imageSelectPanel : this.imageSelectPanels.values()) {\r
263                         imageSelectPanel.setDeselectableSingleCategory(deselectable);\r
264                 }\r
265         }\r
266         \r
267         /**\r
268          * パーツ選択をすべて解除する.<br>\r
269          * 単一選択カテゴリが解除されるかどうかは、{@link #isDeselectableSingleCategory()}による.<br>\r
270          */\r
271         public void deselectAll() {\r
272                 for (ImageSelectPanel imageSelectPanel : this.imageSelectPanels.values()) {\r
273                         if (imageSelectPanel.getPartsCategory().isMultipleSelectable()\r
274                                         || imageSelectPanel.isDeselectableSingleCategory()) {\r
275                                 imageSelectPanel.deselectAll();\r
276                         }\r
277                 }\r
278         }\r
279         \r
280         /**\r
281          * 指定したカテゴリ以外のパネルを最小化する.<br>\r
282          * (指定したカテゴリがnullでなければ、そのカテゴリの最小化は解除される.)<br>\r
283          * @param partsCategory 最小化の対象外のパネル、nullの場合は不問\r
284          * @param minimize 指定したカテゴリ以外を最小化する場合はtrue、falseの場合はすべてが最小化解除される.\r
285          */\r
286         public void setMinimizeModeIfOther(PartsCategory partsCategory, boolean minimize) {\r
287                 for (Map.Entry<PartsCategory, ImageSelectPanel> entry : imageSelectPanels.entrySet()) {\r
288                         PartsCategory cat = entry.getKey();\r
289                         ImageSelectPanel imageSelectPanel = entry.getValue();\r
290                         if (partsCategory != null && cat.equals(partsCategory)) {\r
291                                 imageSelectPanel.setMinimizeMode(false);\r
292                         } else {\r
293                                 imageSelectPanel.setMinimizeMode(minimize);\r
294                         }\r
295                 }\r
296         }\r
297         \r
298         /**\r
299          * 指定したカテゴリが最小化モードであるか?\r
300          * @param partsCategory カテゴリ\r
301          * @return 指定したカテゴリが最小化モードであればtrue、該当するカテゴリがない場合は常にfalse\r
302          */\r
303         public boolean isMinimizeMode(PartsCategory partsCategory) {\r
304                 ImageSelectPanel panel = imageSelectPanels.get(partsCategory);\r
305                 if (panel == null) {\r
306                         return false;\r
307                 }\r
308                 return panel.isMinimizeMode();\r
309         }\r
310         \r
311         /**\r
312          * 指定したカテゴリが最小化モードでなく、且つ、他がすべて最小化モードであるか?\r
313          * (指定カテゴリがない場合は全パネルが最小化モードである場合)<br>\r
314          * @param partsCategory カテゴリ、もしくはnull\r
315          * @return 指定したカテゴリが最小化モードでなく、且つ、他がすべて最小化モードである場合はtrue\r
316          */\r
317         public boolean isNotMinimizeModeJust(PartsCategory partsCategory) {\r
318                 for (Map.Entry<PartsCategory, ImageSelectPanel> entry : imageSelectPanels.entrySet()) {\r
319                         PartsCategory cat = entry.getKey();\r
320                         ImageSelectPanel imageSelectPanel = entry.getValue();\r
321                         if (partsCategory != null) {\r
322                                 if (cat.equals(partsCategory)) {\r
323                                         // 指定したカテゴリが最小化モードであればfalse\r
324                                         if (imageSelectPanel.isMinimizeMode()) {\r
325                                                 return false;\r
326                                         }\r
327                                 } else {\r
328                                         // 指定したカテゴリ以外が最小化モードでなければfalse\r
329                                         if ( !imageSelectPanel.isMinimizeMode()) {\r
330                                                 return false;\r
331                                         }\r
332                                 }\r
333                         }\r
334                 }\r
335                 // 指定カテゴリ以外がすべて最小化モードである場合\r
336                 // (指定カテゴリがない場合は全パネルが最小化モードである場合)\r
337                 return true;\r
338         }\r
339 }\r