1 package charactermanaj.ui.model;
\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
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
27 * パーツの選択パネルとカラーダイアログを関連づけて調整するコーディネータオブジェクト.<br>
\r
31 public class PartsColorCoordinator {
\r
36 private static final Logger logger = Logger.getLogger(PartsColorCoordinator.class.getName());
\r
39 * パーツ選択パネルとカラーダイアログの関係を示すマップ.<br>
\r
41 private IdentityHashMap<ImageSelectPanel, ColorDialog> colorDialogMap
\r
42 = new IdentityHashMap<ImageSelectPanel, ColorDialog>();
\r
45 * パーツ識別子ごとのカラー情報を保存するパーツカラーマネージャ.<br>
\r
47 private PartsColorManager partsColorMrg;
\r
52 private PartsSpecResolver partsSpecResolver;
\r
55 * 同一の色グループに設定値を同期させるためのコーディネータ.<br>
\r
57 private ColorGroupCoordinator colorGroupCoordinator;
\r
61 * @param partsSpecResolver パーツ
\r
62 * @param partsColorMrg パーツ識別子ごとの色情報を管理するオブジェクト
\r
63 * @param colorGroupCoordinator 同一の色グループに設定値を同期させるためのコーディネータ.
\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
71 this.partsSpecResolver = partsSpecResolver;
\r
72 this.partsColorMrg = partsColorMrg;
\r
73 this.colorGroupCoordinator = colorGroupCoordinator;
\r
77 * パーツ選択パネルと色ダイアログの関係を登録する.<br>
\r
78 * @param imageSelectPanel パーツ選択パネル
\r
79 * @param colorDialog 色ダイアログ
\r
81 public void register(final ImageSelectPanel imageSelectPanel, final ColorDialog colorDialog) {
\r
82 if (imageSelectPanel == null || colorDialog == null) {
\r
83 throw new IllegalArgumentException();
\r
85 if (colorDialogMap.containsKey(imageSelectPanel)) {
\r
86 throw new IllegalArgumentException("already registered: " + imageSelectPanel);
\r
88 colorDialogMap.put(imageSelectPanel, colorDialog);
\r
90 imageSelectPanel.addImageSelectListener(new ImageSelectPanelListener() {
\r
91 public void onChangeColor(ImageSelectPanelEvent event) {
\r
94 public void onPreferences(ImageSelectPanelEvent event) {
\r
97 public void onChange(ImageSelectPanelEvent event) {
\r
98 PartsColorCoordinator.this.loadColorSettingToColorDialog(imageSelectPanel, colorDialog);
\r
100 public void onSelectChange(ImageSelectPanelEvent event) {
\r
101 PartsColorCoordinator.this.loadColorSettingToColorDialog(imageSelectPanel, colorDialog);
\r
103 public void onTitleClick(ImageSelectPanelEvent event) {
\r
106 public void onTitleDblClick(ImageSelectPanelEvent event) {
\r
111 colorDialog.addColorChangeListener(new ColorChangeListener() {
\r
112 public void onColorChange(ColorChangeEvent event) {
\r
113 saveColorSettingAll();
\r
115 public void onColorGroupChange(ColorChangeEvent event) {
\r
116 saveColorSettingAll();
\r
122 * パーツ選択パネルの現在の選択に対する保存されているカラー情報を色ダイアログに設定する.<br>
\r
123 * @param imageSelectPanel パーツ選択パネル
\r
124 * @param colorDialog 色ダイアログ
\r
126 protected void loadColorSettingToColorDialog(ImageSelectPanel imageSelectPanel, ColorDialog colorDialog) {
\r
127 PartsIdentifier selectedParts = imageSelectPanel.getSelectedPartsIdentifier();
\r
129 // 選択されているパーツのパーツ名と有効なレイヤーをカラーダイアログに設定する.
\r
130 // 選択されているパーツがない場合はデフォルトに戻す.
\r
131 colorDialog.setPartsIdentifier(selectedParts);
\r
132 colorDialog.setEnableLayers(getEnabledLayers(selectedParts));
\r
134 if (selectedParts == null) {
\r
135 // 選択されているパーツがない場合は、ここまで。
\r
139 PartsColorInfo partsColorInfo = partsColorMrg.getPartsColorInfo(selectedParts, false);
\r
141 for (Map.Entry<Layer, ColorInfo> entry : partsColorInfo.entrySet()) {
\r
142 Layer layer = entry.getKey();
\r
143 ColorInfo colorInfo = entry.getValue();
\r
145 ColorGroup colorGroup = colorInfo.getColorGroup();
\r
146 if (colorGroup == null) {
\r
147 colorGroup = ColorGroup.NA;
\r
149 colorDialog.setColorGroup(layer, colorGroup);
\r
150 boolean syncColorGroup = colorInfo.isSyncColorGroup();
\r
151 colorDialog.setSyncColorGroup(layer, syncColorGroup);
\r
153 ColorConvertParameter param = colorInfo.getColorParameter();
\r
154 colorDialog.setColorConvertParameter(layer, param);
\r
156 if (syncColorGroup) {
\r
157 colorGroupCoordinator.syncColorGroup(colorDialog.getPartsCategory(), layer, colorDialog);
\r
163 * 現在選択中のパーツの組み合わせに対応するカラーダイアログの設定情報をPartsColorManagerに保存する.<br>
\r
164 * (カラーダイアログの値が変更されるたびに呼び出される.)<br>
\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
175 * カテゴリべつの現在選択中のパーツ識別子と、それに対応するカラーダイアログの設定値をPartsColorManagerに保存する.<br>
\r
176 * @param imageSelectPanel カテゴリ別のパーツ選択
\r
177 * @param colorDialog 対応するカラーダイアログ
\r
179 protected void saveColorSettingFromColorDialog(ImageSelectPanel imageSelectPanel, ColorDialog colorDialog) {
\r
180 PartsIdentifier selectedParts = imageSelectPanel.getSelectedPartsIdentifier();
\r
181 if (selectedParts == null) {
\r
185 Map<Layer, ColorConvertParameter> paramMap = colorDialog.getColorConvertParameters();
\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
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
200 boolean applyAll = colorDialog.isApplyAll();
\r
201 partsColorMrg.setPartsColorInfo(selectedParts, partsColorInfo, applyAll);
\r
205 * 全カラーダイアログで設定されている各レイヤーごとの色パラメータを全て取得する.<br>
\r
206 * @return 各レイヤーごとの色パラメータ
\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
217 return colorConvertParameterMap;
\r
221 * 現在選択されている各カテゴリのパーツの組み合わせに対するカラー情報に各カテゴリの色ダイアログを設定する.<br>
\r
222 * (選択中のパーツ名も設定される.)<br>
\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
229 PartsIdentifier partsIdentifier = imageSelectPanel.getSelectedPartsIdentifier();
\r
231 // 選択されているパーツのパーツ名と有効なレイヤーをカラーダイアログに設定する.
\r
232 // 選択されているパーツがない場合はデフォルトに戻す.
\r
233 colorDialog.setPartsIdentifier(partsIdentifier);
\r
234 colorDialog.setEnableLayers(getEnabledLayers(partsIdentifier));
\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
244 colorDialog.setColorGroup(layer, colorInfo.getColorGroup());
\r
245 colorDialog.setSyncColorGroup(layer, colorInfo.isSyncColorGroup());
\r
246 colorDialog.setColorConvertParameter(layer, colorInfo.getColorParameter());
\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
261 protected Collection<Layer> getEnabledLayers(PartsIdentifier partsIdentifier) {
\r
262 AppConfig appConfig = AppConfig.getInstance();
\r
263 if (appConfig.isNotDisableLayerTab()) {
\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