OSDN Git Service

dmg作成バージョンの取得方法の修正
[charactermanaj/CharacterManaJ.git] / src / charactermanaj / ui / model / ColorGroupCoordinator.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.Iterator;\r
6 import java.util.LinkedList;\r
7 import java.util.Map;\r
8 \r
9 import charactermanaj.graphics.filters.ColorConvertParameter;\r
10 import charactermanaj.model.ColorGroup;\r
11 import charactermanaj.model.ColorInfo;\r
12 import charactermanaj.model.Layer;\r
13 import charactermanaj.model.PartsCategory;\r
14 import charactermanaj.model.PartsColorInfo;\r
15 import charactermanaj.model.PartsColorManager;\r
16 import charactermanaj.model.PartsIdentifier;\r
17 import charactermanaj.ui.ColorDialog;\r
18 \r
19 /**\r
20  * 同一カラーグループでの連動をサポートするためのコーディネータオブジェクト.<br>\r
21  * @author seraphy\r
22  */\r
23 public class ColorGroupCoordinator {\r
24         \r
25         /**\r
26          * パーツの選択状態を管理するマネージャ.<br>\r
27          */\r
28         private final PartsSelectionManager partsSelectionMrg;\r
29         \r
30         /**\r
31          * 色ダイアログのコレクション\r
32          */\r
33         private final LinkedList<ColorDialog> colorDialogs = new LinkedList<ColorDialog>();\r
34         \r
35         /**\r
36          * カラーグループの変更通知を受けるリスナーのコレクション.<br>\r
37          */\r
38         private final LinkedList<ColorChangeListener> listeners = new LinkedList<ColorChangeListener>();\r
39         \r
40         /**\r
41          * パーツ識別子ごとの色情報を管理するパーツカラーマネージャ\r
42          */\r
43         private final PartsColorManager partsColorMrg;\r
44 \r
45         /**\r
46          * 色ダイアログからの通知を受け取るリスナ.(自クラス内オブジェクト)\r
47          */\r
48         protected final ColorChangeListener listener;\r
49         \r
50         /**\r
51          * コンストラクタ\r
52          * @param partsSelectionMrg パーツの選択を管理するマネージャ\r
53          * @param partsColorMrg パーツ識別子ごとの色を管理するマネージャ\r
54          */\r
55         public ColorGroupCoordinator(PartsSelectionManager partsSelectionMrg, PartsColorManager partsColorMrg) {\r
56                 if (partsSelectionMrg == null || partsColorMrg == null) {\r
57                         throw new IllegalArgumentException();\r
58                 }\r
59                 this.partsSelectionMrg = partsSelectionMrg;\r
60                 this.partsColorMrg = partsColorMrg;\r
61                 \r
62                 listener = new ColorChangeListener() {\r
63                         public void onColorChange(ColorChangeEvent event) {\r
64                                 Layer layer = event.getLayer();\r
65                                 ColorDialog colorDialog = (ColorDialog) event.getSource();\r
66                                 PartsCategory partsCategory = colorDialog.getPartsCategory();\r
67                                 ColorGroupCoordinator.this.syncColorGroup(partsCategory, layer, colorDialog);\r
68                                 ColorGroupCoordinator.this.fireColorChangeEvent(event);\r
69                         }\r
70                         public void onColorGroupChange(ColorChangeEvent event) {\r
71                                 Layer layer = event.getLayer();\r
72                                 ColorDialog colorDialog = (ColorDialog) event.getSource();\r
73                                 ColorGroup colorGroup = colorDialog.getColorGroup(layer);\r
74                                 ColorGroupCoordinator.this.onChangeColorGroup(colorDialog, layer, colorGroup);\r
75                                 ColorGroupCoordinator.this.fireColorGroupChangeEvent(event);\r
76                         }\r
77                 };\r
78         }\r
79         \r
80         /**\r
81          * カラーダイアログを登録する.<br>\r
82          * @param colorDialog カラーダイアログ\r
83          */\r
84         public void registerColorDialog(ColorDialog colorDialog) {\r
85                 if (colorDialog == null) {\r
86                         throw new IllegalArgumentException();\r
87                 }\r
88                 this.colorDialogs.add(colorDialog);\r
89                 colorDialog.addColorChangeListener(listener);\r
90         }\r
91         \r
92         /**\r
93          * カラーダイアログの登録を解除する.<br>\r
94          * @param colorDialog カラーダイアログ\r
95          */\r
96         public void unregisterColorDialog(ColorDialog colorDialog) {\r
97                 Iterator<ColorDialog> ite = colorDialogs.iterator();\r
98                 while (ite.hasNext()) {\r
99                         ColorDialog dlg = ite.next();\r
100                         if (dlg == colorDialog) {\r
101                                 dlg.removeColorChangeListener(listener);\r
102                                 ite.remove();\r
103                         }\r
104                 }\r
105         }\r
106         \r
107         /**\r
108          * カラーグループが変更されたことを通知するリスナを登録する.<br>\r
109          * @param listener リスナー\r
110          */\r
111         public void addColorChangeListener(ColorChangeListener listener) {\r
112                 if (listener == null) {\r
113                         throw new IllegalArgumentException();\r
114                 }\r
115                 listeners.add(listener);\r
116         }\r
117 \r
118         /**\r
119          * カラーグループが変更されたことを通知するリスナを登録解除する.<br>\r
120          * @param listener リスナー\r
121          */\r
122         public void removeColorChangeListener(ColorChangeListener listener) {\r
123                 listeners.remove(listener);\r
124         }\r
125         \r
126         protected void fireColorChangeEvent(ColorChangeEvent e) {\r
127                 if (e == null) {\r
128                         throw new IllegalArgumentException();\r
129                 }\r
130                 for (ColorChangeListener listener : listeners) {\r
131                         listener.onColorChange(e);\r
132                 }\r
133         }\r
134         \r
135         protected void fireColorGroupChangeEvent(ColorChangeEvent e) {\r
136                 if (e == null) {\r
137                         throw new IllegalArgumentException();\r
138                 }\r
139                 for (ColorChangeListener listener : listeners) {\r
140                         listener.onColorGroupChange(e);\r
141                 }\r
142         }\r
143         \r
144         protected void onChangeColorGroup(ColorDialog destColorDialog, Layer layer, ColorGroup colorGroup) {\r
145                 if (destColorDialog == null || layer == null || colorGroup == null) {\r
146                         throw new IllegalArgumentException();\r
147                 }\r
148                 for (ColorDialog colorDlg : colorDialogs) {\r
149                         for (Layer srcLayer : colorDlg.getPartsCategory().getLayers()) {\r
150                                 if (!srcLayer.equals(layer)) {\r
151                                         if (ColorGroup.equals(colorGroup, colorDlg.getColorGroup(srcLayer))\r
152                                                         && colorDlg.isSyncColorGroup(srcLayer)) {\r
153                                                 ColorConvertParameter param = colorDlg.getColorConvertParameter(srcLayer);\r
154                                                 destColorDialog.setColorConvertParameter(layer, param);\r
155                                                 break;\r
156                                         }\r
157                                 }\r
158                         }\r
159                 }\r
160         }\r
161         \r
162         /**\r
163          * パーツの色ダイアログが変更されたことにより、同一の他のカラーグループのレイヤーのカラーダイアログの設定値をコピーする.<br>\r
164          * (色ダイアログのパラメータ変更により呼び出される.)<br>\r
165          * @param partsCategory パーツカテゴリ\r
166          * @param eventSourceLayer 変更もとのレイヤー\r
167          * @param sourceColorDialog 変更されたカラーダイアログ\r
168          */\r
169         public void syncColorGroup(PartsCategory partsCategory, Layer eventSourceLayer, ColorDialog sourceColorDialog) {\r
170                 if (partsCategory == null || sourceColorDialog == null) {\r
171                         throw new IllegalArgumentException();\r
172                 }\r
173 \r
174                 // 変更もと\r
175                 ArrayList<Layer> syncSources = new ArrayList<Layer>();\r
176                 if (eventSourceLayer != null) {\r
177                         if (sourceColorDialog.isSyncColorGroup(eventSourceLayer)) {\r
178                                 syncSources.add(eventSourceLayer);\r
179                         }\r
180                 } else {\r
181                         for (Layer layer2 : partsCategory.getLayers()) {\r
182                                 if (sourceColorDialog.isSyncColorGroup(layer2)) {\r
183                                         syncSources.add(layer2);\r
184                                 }\r
185                         }\r
186                 }\r
187                 \r
188                 // 変更もとのレイヤーのカラーグループを他のレイヤーにも適用する.\r
189                 for (Layer sourceLayer : syncSources) {\r
190                         ColorGroup sourceColorGroup = sourceColorDialog.getColorGroup(sourceLayer);\r
191                         if (sourceColorGroup != null && sourceColorGroup.isEnabled()) {\r
192                                 ColorConvertParameter param = sourceColorDialog.getColorConvertParameter(sourceLayer);\r
193                                 \r
194                                 // 他のパネルに適用する\r
195                                 for (ColorDialog targetColorDialog : colorDialogs) {\r
196                                         for (Layer targetLayer : targetColorDialog.getPartsCategory().getLayers()) {\r
197                                                 if (!targetLayer.equals(sourceLayer)) {\r
198                                                         if (ColorGroup.equals(targetColorDialog.getColorGroup(targetLayer), sourceColorGroup)) {\r
199                                                                 if (targetColorDialog.isSyncColorGroup(targetLayer)) {\r
200                                                                         targetColorDialog.setColorConvertParameter(targetLayer, param);\r
201                                                                 }\r
202                                                         }\r
203                                                 }\r
204                                         }\r
205                                 }\r
206                                 // 色ダイアログで選択中でない有効なパーツも含めてパーツカラーを更新する.\r
207                                 for (PartsCategory targetPartsCategory : partsSelectionMrg.getAllCategories()) {\r
208                                         Collection<PartsIdentifier> selectedPartss = partsSelectionMrg.getSelectedPartsIdentifiers(targetPartsCategory);\r
209                                         for (PartsIdentifier partsIdentifier : selectedPartss) {\r
210                                                 // カラーダイアログで選択されていない他のパーツも含めてパーツカラーを更新する.\r
211                                                 PartsColorInfo partsColorInfo = partsColorMrg.getPartsColorInfo(partsIdentifier, true);\r
212                                                 for (Map.Entry<Layer, ColorInfo> entry : partsColorInfo.entrySet()) {\r
213                                                         ColorInfo colorInfo = entry.getValue();\r
214                                                         if (ColorGroup.equals(sourceColorGroup, colorInfo.getColorGroup())) {\r
215                                                                 if (colorInfo.isSyncColorGroup()) {\r
216                                                                         colorInfo.setColorParameter(param);\r
217                                                                 }\r
218                                                         }\r
219                                                 }\r
220                                         }\r
221                                 }\r
222                         }\r
223                 }\r
224         }\r
225         \r
226 }\r