OSDN Git Service

mavenによるビルドに変更
[charactermanaj/CharacterManaJ.git] / src / main / java / charactermanaj / ui / model / PartsColorCoordinator.java
1 package charactermanaj.ui.model;\r
2 \r
3 import java.util.ArrayList;\r
4 import java.util.Collection;\r
5 import java.util.HashMap;\r
6 import java.util.IdentityHashMap;\r
7 import java.util.Map;\r
8 import java.util.logging.Level;\r
9 import java.util.logging.Logger;\r
10 \r
11 import charactermanaj.graphics.filters.ColorConvertParameter;\r
12 import charactermanaj.model.AppConfig;\r
13 import charactermanaj.model.ColorGroup;\r
14 import charactermanaj.model.ColorInfo;\r
15 import charactermanaj.model.Layer;\r
16 import charactermanaj.model.PartsColorInfo;\r
17 import charactermanaj.model.PartsColorManager;\r
18 import charactermanaj.model.PartsIdentifier;\r
19 import charactermanaj.model.PartsSpec;\r
20 import charactermanaj.model.PartsSpecResolver;\r
21 import charactermanaj.ui.ColorDialog;\r
22 import charactermanaj.ui.ImageSelectPanel;\r
23 import charactermanaj.ui.ImageSelectPanel.ImageSelectPanelEvent;\r
24 import charactermanaj.ui.ImageSelectPanel.ImageSelectPanelListener;\r
25 \r
26 /**\r
27  * パーツの選択パネルとカラーダイアログを関連づけて調整するコーディネータオブジェクト.<br>\r
28  * @author seraphy\r
29  *\r
30  */\r
31 public class PartsColorCoordinator {\r
32 \r
33         /**\r
34          * ロガー\r
35          */\r
36         private static final Logger logger = Logger.getLogger(PartsColorCoordinator.class.getName());\r
37         \r
38         /**\r
39          * パーツ選択パネルとカラーダイアログの関係を示すマップ.<br>\r
40          */\r
41         private IdentityHashMap<ImageSelectPanel, ColorDialog> colorDialogMap\r
42                         = new IdentityHashMap<ImageSelectPanel, ColorDialog>();\r
43         \r
44         /**\r
45          * パーツ識別子ごとのカラー情報を保存するパーツカラーマネージャ.<br>\r
46          */\r
47         private PartsColorManager partsColorMrg;\r
48         \r
49         /**\r
50          * パーツ設定\r
51          */\r
52         private PartsSpecResolver partsSpecResolver;\r
53         \r
54         /**\r
55          * 同一の色グループに設定値を同期させるためのコーディネータ.<br>\r
56          */\r
57         private ColorGroupCoordinator colorGroupCoordinator;\r
58 \r
59         /**\r
60          * コンストラクタ.<br>\r
61          * @param partsSpecResolver パーツ\r
62          * @param partsColorMrg パーツ識別子ごとの色情報を管理するオブジェクト\r
63          * @param colorGroupCoordinator 同一の色グループに設定値を同期させるためのコーディネータ.\r
64          */\r
65         public PartsColorCoordinator(PartsSpecResolver partsSpecResolver,\r
66                         PartsColorManager partsColorMrg,\r
67                         ColorGroupCoordinator colorGroupCoordinator) {\r
68                 if (partsSpecResolver == null || partsColorMrg == null || colorGroupCoordinator == null) {\r
69                         throw new IllegalArgumentException();\r
70                 }\r
71                 this.partsSpecResolver = partsSpecResolver;\r
72                 this.partsColorMrg = partsColorMrg;\r
73                 this.colorGroupCoordinator = colorGroupCoordinator;\r
74         }\r
75         \r
76         /**\r
77          * パーツ選択パネルと色ダイアログの関係を登録する.<br>\r
78          * @param imageSelectPanel パーツ選択パネル\r
79          * @param colorDialog 色ダイアログ\r
80          */\r
81         public void register(final ImageSelectPanel imageSelectPanel, final ColorDialog colorDialog) {\r
82                 if (imageSelectPanel == null || colorDialog == null) {\r
83                         throw new IllegalArgumentException();\r
84                 }\r
85                 if (colorDialogMap.containsKey(imageSelectPanel)) {\r
86                         throw new IllegalArgumentException("already registered: " + imageSelectPanel);\r
87                 }\r
88                 colorDialogMap.put(imageSelectPanel, colorDialog);\r
89                 \r
90                 imageSelectPanel.addImageSelectListener(new ImageSelectPanelListener() {\r
91                         public void onChangeColor(ImageSelectPanelEvent event) {\r
92                                 // なにもしない\r
93                         }\r
94                         public void onPreferences(ImageSelectPanelEvent event) {\r
95                                 // なにもしない\r
96                         }\r
97                         public void onChange(ImageSelectPanelEvent event) {\r
98                                 PartsColorCoordinator.this.loadColorSettingToColorDialog(imageSelectPanel, colorDialog);\r
99                         }\r
100                         public void onSelectChange(ImageSelectPanelEvent event) {\r
101                                 PartsColorCoordinator.this.loadColorSettingToColorDialog(imageSelectPanel, colorDialog);\r
102                         }\r
103                         public void onTitleClick(ImageSelectPanelEvent event) {\r
104                                 // なにもしない\r
105                         }\r
106                         public void onTitleDblClick(ImageSelectPanelEvent event) {\r
107                                 // なにもしない\r
108                         }\r
109                 });\r
110                 \r
111                 colorDialog.addColorChangeListener(new ColorChangeListener() {\r
112                         public void onColorChange(ColorChangeEvent event) {\r
113                                 saveColorSettingAll();\r
114                         }\r
115                         public void onColorGroupChange(ColorChangeEvent event) {\r
116                                 saveColorSettingAll();\r
117                         }\r
118                 });\r
119         }\r
120         \r
121         /**\r
122          * パーツ選択パネルの現在の選択に対する保存されているカラー情報を色ダイアログに設定する.<br>\r
123          * @param imageSelectPanel パーツ選択パネル\r
124          * @param colorDialog 色ダイアログ\r
125          */\r
126         protected void loadColorSettingToColorDialog(ImageSelectPanel imageSelectPanel, ColorDialog colorDialog) {\r
127                 PartsIdentifier selectedParts = imageSelectPanel.getSelectedPartsIdentifier();\r
128                 \r
129                 // 選択されているパーツのパーツ名と有効なレイヤーをカラーダイアログに設定する.\r
130                 // 選択されているパーツがない場合はデフォルトに戻す.\r
131                 colorDialog.setPartsIdentifier(selectedParts);\r
132                 colorDialog.setEnableLayers(getEnabledLayers(selectedParts));\r
133                 \r
134                 if (selectedParts == null) {\r
135                         // 選択されているパーツがない場合は、ここまで。\r
136                         return;\r
137                 }\r
138 \r
139                 PartsColorInfo partsColorInfo = partsColorMrg.getPartsColorInfo(selectedParts, false);\r
140                 \r
141                 for (Map.Entry<Layer, ColorInfo> entry : partsColorInfo.entrySet()) {\r
142                         Layer layer = entry.getKey();\r
143                         ColorInfo colorInfo = entry.getValue();\r
144                         \r
145                         ColorGroup colorGroup = colorInfo.getColorGroup();\r
146                         if (colorGroup == null) {\r
147                                 colorGroup = ColorGroup.NA;\r
148                         }\r
149                         colorDialog.setColorGroup(layer, colorGroup);\r
150                         boolean syncColorGroup = colorInfo.isSyncColorGroup();\r
151                         colorDialog.setSyncColorGroup(layer, syncColorGroup);\r
152 \r
153                         ColorConvertParameter param = colorInfo.getColorParameter();\r
154                         colorDialog.setColorConvertParameter(layer, param);\r
155                         \r
156                         if (syncColorGroup) {\r
157                                 colorGroupCoordinator.syncColorGroup(colorDialog.getPartsCategory(), layer, colorDialog);\r
158                         }\r
159                 }\r
160         }\r
161 \r
162         /**\r
163          * 現在選択中のパーツの組み合わせに対応するカラーダイアログの設定情報をPartsColorManagerに保存する.<br>\r
164          * (カラーダイアログの値が変更されるたびに呼び出される.)<br>\r
165          */\r
166         protected void saveColorSettingAll() {\r
167                 for (Map.Entry<ImageSelectPanel, ColorDialog> entry : colorDialogMap.entrySet()) {\r
168                         ImageSelectPanel imageSelectPanel = entry.getKey();\r
169                         ColorDialog colorDialog = entry.getValue();\r
170                         saveColorSettingFromColorDialog(imageSelectPanel, colorDialog);\r
171                 }\r
172         }\r
173         \r
174         /**\r
175          * カテゴリべつの現在選択中のパーツ識別子と、それに対応するカラーダイアログの設定値をPartsColorManagerに保存する.<br>\r
176          * @param imageSelectPanel カテゴリ別のパーツ選択\r
177          * @param colorDialog 対応するカラーダイアログ\r
178          */\r
179         protected void saveColorSettingFromColorDialog(ImageSelectPanel imageSelectPanel, ColorDialog colorDialog) {\r
180                 PartsIdentifier selectedParts = imageSelectPanel.getSelectedPartsIdentifier();\r
181                 if (selectedParts == null) {\r
182                         return;\r
183                 }\r
184 \r
185                 Map<Layer, ColorConvertParameter> paramMap = colorDialog.getColorConvertParameters();\r
186                 \r
187                 PartsColorInfo partsColorInfo = partsColorMrg.getPartsColorInfo(selectedParts, true);\r
188                 for (Map.Entry<Layer, ColorConvertParameter> entry : paramMap.entrySet()) {\r
189                         Layer layer = entry.getKey();\r
190                         ColorConvertParameter param = entry.getValue();\r
191 \r
192                         ColorInfo colorInfo = new ColorInfo();\r
193                         ColorGroup colorGroup = colorDialog.getColorGroup(layer);\r
194                         colorInfo.setColorGroup(colorGroup);\r
195                         boolean syncColorGroup = colorDialog.isSyncColorGroup(layer);\r
196                         colorInfo.setSyncColorGroup(syncColorGroup);\r
197                         colorInfo.setColorParameter(param);\r
198                         partsColorInfo.put(layer, colorInfo);\r
199                 }\r
200                 boolean applyAll = colorDialog.isApplyAll();\r
201                 partsColorMrg.setPartsColorInfo(selectedParts, partsColorInfo, applyAll);\r
202         }\r
203         \r
204         /**\r
205          * 全カラーダイアログで設定されている各レイヤーごとの色パラメータを全て取得する.<br>\r
206          * @return 各レイヤーごとの色パラメータ\r
207          */\r
208         public Map<Layer, ColorConvertParameter> getColorConvertParameterMap() {\r
209                 final HashMap<Layer, ColorConvertParameter> colorConvertParameterMap = new HashMap<Layer, ColorConvertParameter>();\r
210                 for (ColorDialog colorDlg : colorDialogMap.values()) {\r
211                         for (Map.Entry<Layer, ColorConvertParameter> entry : colorDlg.getColorConvertParameters().entrySet()) {\r
212                                 Layer layer = entry.getKey();\r
213                                 ColorConvertParameter colorConvertParameter = entry.getValue();\r
214                                 colorConvertParameterMap.put(layer, colorConvertParameter);\r
215                         }\r
216                 }\r
217                 return colorConvertParameterMap;\r
218         }\r
219         \r
220         /**\r
221          * 現在選択されている各カテゴリのパーツの組み合わせに対するカラー情報に各カテゴリの色ダイアログを設定する.<br>\r
222          * (選択中のパーツ名も設定される.)<br>\r
223          */\r
224         public void initColorDialog() {\r
225                 for (Map.Entry<ImageSelectPanel, ColorDialog> entry : colorDialogMap.entrySet()) {\r
226                         ImageSelectPanel imageSelectPanel = entry.getKey();\r
227                         ColorDialog colorDialog = entry.getValue();\r
228 \r
229                         PartsIdentifier partsIdentifier = imageSelectPanel.getSelectedPartsIdentifier();\r
230 \r
231                         // 選択されているパーツのパーツ名と有効なレイヤーをカラーダイアログに設定する.\r
232                         // 選択されているパーツがない場合はデフォルトに戻す.\r
233                         colorDialog.setPartsIdentifier(partsIdentifier);\r
234                         colorDialog.setEnableLayers(getEnabledLayers(partsIdentifier));\r
235                         \r
236                         if (partsIdentifier != null) {\r
237                                 PartsColorInfo partsColorInfo = partsColorMrg.getPartsColorInfo(partsIdentifier, false);\r
238                                 for (Map.Entry<Layer, ColorInfo> colorInfoEntry : partsColorInfo.entrySet()) {\r
239                                         Layer layer = colorInfoEntry.getKey();\r
240                                         ColorInfo colorInfo = colorInfoEntry.getValue();\r
241                                         if (logger.isLoggable(Level.FINE)) {\r
242                                                 logger.log(Level.FINE, layer + "=" + colorInfo);\r
243                                         }\r
244                                         colorDialog.setColorGroup(layer, colorInfo.getColorGroup());\r
245                                         colorDialog.setSyncColorGroup(layer, colorInfo.isSyncColorGroup());\r
246                                         colorDialog.setColorConvertParameter(layer, colorInfo.getColorParameter());\r
247                                 }\r
248                         }\r
249                 }\r
250         }\r
251 \r
252         /**\r
253          * 指定したパーツ識別子を構成する実際に存在するレイヤーを返します.<br>\r
254          * (カテゴリが2つ以上のレイヤーをもっている場合でもパーツが、カテゴリのレイヤー数を全て使い切っていない場合は、使っているレイヤーのみが返されます.)<br>\r
255          * 指定したパーツ識別子がnullの場合はnullを返します.<br>\r
256          * 指定したパーツ識別子がnullではなく、且つ、パーツリゾルバから取得できない場合は空が返されます.<br>\r
257          * ただし、アプリケーション設定で「存在しないレイヤーをディセーブルにしない」がtrueであれば、常にnullを返します.<br>\r
258          * @param partsIdentifier パーツ識別子、もしくはnull\r
259          * @return レイヤーのコレクション、もしくはnull\r
260          */\r
261         protected Collection<Layer> getEnabledLayers(PartsIdentifier partsIdentifier) {\r
262                 AppConfig appConfig = AppConfig.getInstance();\r
263                 if (appConfig.isNotDisableLayerTab()) {\r
264                         return null;\r
265                 }\r
266 \r
267                 if (partsIdentifier != null) {\r
268                         PartsSpec partsSpec = partsSpecResolver.getPartsSpec(partsIdentifier);\r
269                         ArrayList<Layer> layers = new ArrayList<Layer>();\r
270                         if (partsSpec != null) {\r
271                                 for (Layer layer : partsSpec.getPartsFiles().keySet()) {\r
272                                         layers.add(layer);\r
273                                 }\r
274                         }\r
275                         return layers;\r
276                 }\r
277                 return null;\r
278         }\r
279         \r
280 }\r