1 package charactermanaj.ui.model;
\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
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
20 * 同一カラーグループでの連動をサポートするためのコーディネータオブジェクト.<br>
\r
23 public class ColorGroupCoordinator {
\r
26 * パーツの選択状態を管理するマネージャ.<br>
\r
28 private final PartsSelectionManager partsSelectionMrg;
\r
33 private final LinkedList<ColorDialog> colorDialogs = new LinkedList<ColorDialog>();
\r
36 * カラーグループの変更通知を受けるリスナーのコレクション.<br>
\r
38 private final LinkedList<ColorChangeListener> listeners = new LinkedList<ColorChangeListener>();
\r
41 * パーツ識別子ごとの色情報を管理するパーツカラーマネージャ
\r
43 private final PartsColorManager partsColorMrg;
\r
46 * 色ダイアログからの通知を受け取るリスナ.(自クラス内オブジェクト)
\r
48 protected final ColorChangeListener listener;
\r
52 * @param partsSelectionMrg パーツの選択を管理するマネージャ
\r
53 * @param partsColorMrg パーツ識別子ごとの色を管理するマネージャ
\r
55 public ColorGroupCoordinator(PartsSelectionManager partsSelectionMrg, PartsColorManager partsColorMrg) {
\r
56 if (partsSelectionMrg == null || partsColorMrg == null) {
\r
57 throw new IllegalArgumentException();
\r
59 this.partsSelectionMrg = partsSelectionMrg;
\r
60 this.partsColorMrg = partsColorMrg;
\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
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
81 * カラーダイアログを登録する.<br>
\r
82 * @param colorDialog カラーダイアログ
\r
84 public void registerColorDialog(ColorDialog colorDialog) {
\r
85 if (colorDialog == null) {
\r
86 throw new IllegalArgumentException();
\r
88 this.colorDialogs.add(colorDialog);
\r
89 colorDialog.addColorChangeListener(listener);
\r
93 * カラーダイアログの登録を解除する.<br>
\r
94 * @param colorDialog カラーダイアログ
\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
108 * カラーグループが変更されたことを通知するリスナを登録する.<br>
\r
109 * @param listener リスナー
\r
111 public void addColorChangeListener(ColorChangeListener listener) {
\r
112 if (listener == null) {
\r
113 throw new IllegalArgumentException();
\r
115 listeners.add(listener);
\r
119 * カラーグループが変更されたことを通知するリスナを登録解除する.<br>
\r
120 * @param listener リスナー
\r
122 public void removeColorChangeListener(ColorChangeListener listener) {
\r
123 listeners.remove(listener);
\r
126 protected void fireColorChangeEvent(ColorChangeEvent e) {
\r
128 throw new IllegalArgumentException();
\r
130 for (ColorChangeListener listener : listeners) {
\r
131 listener.onColorChange(e);
\r
135 protected void fireColorGroupChangeEvent(ColorChangeEvent e) {
\r
137 throw new IllegalArgumentException();
\r
139 for (ColorChangeListener listener : listeners) {
\r
140 listener.onColorGroupChange(e);
\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
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
163 * パーツの色ダイアログが変更されたことにより、同一の他のカラーグループのレイヤーのカラーダイアログの設定値をコピーする.<br>
\r
164 * (色ダイアログのパラメータ変更により呼び出される.)<br>
\r
165 * @param partsCategory パーツカテゴリ
\r
166 * @param eventSourceLayer 変更もとのレイヤー
\r
167 * @param sourceColorDialog 変更されたカラーダイアログ
\r
169 public void syncColorGroup(PartsCategory partsCategory, Layer eventSourceLayer, ColorDialog sourceColorDialog) {
\r
170 if (partsCategory == null || sourceColorDialog == null) {
\r
171 throw new IllegalArgumentException();
\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
181 for (Layer layer2 : partsCategory.getLayers()) {
\r
182 if (sourceColorDialog.isSyncColorGroup(layer2)) {
\r
183 syncSources.add(layer2);
\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
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
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