1 package charactermanaj.ui.model;
\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
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
22 public class PartsSelectionManager {
\r
25 * 背景色を管理するオブジェクトが実装するインターフェイス.
\r
28 public interface ImageBgColorProvider {
\r
34 Color getImageBgColor();
\r
38 * @param imageBgColor 背景色
\r
40 void setImageBgColor(Color imageBgColor);
\r
44 * カテゴリ別パーツ選択パネル.<br>
\r
46 private HashMap<PartsCategory, ImageSelectPanel> imageSelectPanels = new HashMap<PartsCategory, ImageSelectPanel>();
\r
51 private PartsColorManager partsColorMrg;
\r
56 private ImageBgColorProvider imageBgColorProvider;
\r
59 * アフィン変換用のパラメータ.<br>
\r
62 private double[] affineTransformParameter;
\r
65 * 単一選択カテゴリの選択解除の有効/無効.<br>
\r
68 private boolean deselectableAllCategory;
\r
73 * @param partsColorMrg パーツカラーマネージャ
\r
74 * @param imageBgColorProvider 背景色プロバイダ
\r
76 public PartsSelectionManager(
\r
77 PartsColorManager partsColorMrg,
\r
78 ImageBgColorProvider imageBgColorProvider
\r
80 if (partsColorMrg == null || imageBgColorProvider == null) {
\r
81 throw new IllegalArgumentException();
\r
83 this.partsColorMrg = partsColorMrg;
\r
84 this.imageBgColorProvider = imageBgColorProvider;
\r
91 public void loadParts() {
\r
92 for (ImageSelectPanel panel : imageSelectPanels.values()) {
\r
97 public void register(ImageSelectPanel imageSelectPanel) {
\r
98 if (imageSelectPanel == null) {
\r
99 throw new IllegalArgumentException();
\r
101 imageSelectPanels.put(imageSelectPanel.getPartsCategory(), imageSelectPanel);
\r
104 public List<PartsIdentifier> getSelectedPartsIdentifiers(PartsCategory partsCategory) {
\r
105 if (partsCategory == null) {
\r
106 throw new IllegalArgumentException();
\r
108 ImageSelectPanel panel = imageSelectPanels.get(partsCategory);
\r
109 if (panel != null) {
\r
110 return Collections.unmodifiableList(panel.getSelectedPartsIdentifiers());
\r
112 return Collections.emptyList();
\r
115 public PartsIdentifier getSelectedPartsIdentifier(PartsCategory partsCategory) {
\r
116 if (partsCategory == null) {
\r
117 throw new IllegalArgumentException();
\r
119 ImageSelectPanel panel = imageSelectPanels.get(partsCategory);
\r
120 if (panel != null) {
\r
121 return panel.getSelectedPartsIdentifier();
\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
133 * 各カテゴリの選択状態と背景をパーツセットで指定されたものに設定します.<br>
\r
134 * @param partsSet パーツセット
\r
136 public void selectPartsSet(PartsSet partsSet) {
\r
137 if (partsSet == null) {
\r
138 throw new IllegalArgumentException();
\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
155 Color bgColor = partsSet.getBgColor();
\r
156 if (bgColor != null) {
\r
157 setImageBgColor(bgColor);
\r
160 affineTransformParameter = partsSet.getAffineTransformParameter(); // clone済み
\r
164 * 現在の選択中のパーツと色設定からパーツセットを構築します.
\r
165 * 選択がなにもない場合は空のパーツセットとなります.<br>
\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
177 presetParts.setBgColor(getImageBgColor());
\r
178 presetParts.setAffineTransformParameter(affineTransformParameter); // 相手側でcloneする
\r
179 return presetParts;
\r
183 * すべてのカテゴリのリストで選択中のアイテムが見えるようにスクロールする.
\r
185 public void scrollToSelectedParts() {
\r
186 for (ImageSelectPanel imageSelectPanel : imageSelectPanels.values()) {
\r
187 imageSelectPanel.scrollToSelectedRow();
\r
192 * 指定したパーツ識別子にフォーカスを当てて、必要に応じてスクロールします.<br>
\r
193 * 該当するパーツ識別子がどこにもなければ何もしません.<br>
\r
194 * @param partsIdentifier パーツ識別子
\r
196 public void setSelection(PartsIdentifier partsIdentifier) {
\r
197 if (partsIdentifier == null) {
\r
200 PartsCategory partsCategory = partsIdentifier.getPartsCategory();
\r
201 if (isMinimizeMode(partsCategory)) {
\r
202 setMinimizeModeIfOther(partsCategory, true);
\r
204 ImageSelectPanel imageSelectPanel = imageSelectPanels.get(partsCategory);
\r
205 if (imageSelectPanel != null) {
\r
206 imageSelectPanel.setSelection(partsIdentifier);
\r
214 protected Color getImageBgColor() {
\r
215 return imageBgColorProvider.getImageBgColor();
\r
220 * @param imageBgColor 背景色
\r
222 protected void setImageBgColor(Color imageBgColor) {
\r
223 imageBgColorProvider.setImageBgColor(imageBgColor);
\r
227 * アフィン変換用のパラメータを取得する.<br>
\r
228 * 変換しない場合はnull.<br>
\r
229 * @return アフィン変換用のパラメータ、もしくはnull
\r
231 public double[] getAffineTransformParameter() {
\r
232 return affineTransformParameter == null ? null : affineTransformParameter.clone();
\r
236 * アフィン変換用のパラメータを設定する.<br>
\r
237 * 変換しない場合はnull.<br>
\r
238 * 要素数は4または6でなければならない.<br>
\r
239 * @param affineTransformParameter アフィン変換用のパラメータ、もしくはnull
\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
245 this.affineTransformParameter = affineTransformParameter == null ? null : affineTransformParameter.clone();
\r
249 * 選択選択パーツカテゴリの選択解除を許可するか?<br>
\r
250 * @return 許可する場合はtrue
\r
252 public boolean isDeselectableSingleCategory() {
\r
253 return deselectableAllCategory;
\r
257 * 選択選択パーツカテゴリの選択解除を許可するか設定する.<br>
\r
258 * @param deselectable 許可する場合はtrue
\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
268 * パーツ選択をすべて解除する.<br>
\r
269 * 単一選択カテゴリが解除されるかどうかは、{@link #isDeselectableSingleCategory()}による.<br>
\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
281 * 指定したカテゴリ以外のパネルを最小化する.<br>
\r
282 * (指定したカテゴリがnullでなければ、そのカテゴリの最小化は解除される.)<br>
\r
283 * @param partsCategory 最小化の対象外のパネル、nullの場合は不問
\r
284 * @param minimize 指定したカテゴリ以外を最小化する場合はtrue、falseの場合はすべてが最小化解除される.
\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
293 imageSelectPanel.setMinimizeMode(minimize);
\r
299 * 指定したカテゴリが最小化モードであるか?
\r
300 * @param partsCategory カテゴリ
\r
301 * @return 指定したカテゴリが最小化モードであればtrue、該当するカテゴリがない場合は常にfalse
\r
303 public boolean isMinimizeMode(PartsCategory partsCategory) {
\r
304 ImageSelectPanel panel = imageSelectPanels.get(partsCategory);
\r
305 if (panel == null) {
\r
308 return panel.isMinimizeMode();
\r
312 * 指定したカテゴリが最小化モードでなく、且つ、他がすべて最小化モードであるか?
\r
313 * (指定カテゴリがない場合は全パネルが最小化モードである場合)<br>
\r
314 * @param partsCategory カテゴリ、もしくはnull
\r
315 * @return 指定したカテゴリが最小化モードでなく、且つ、他がすべて最小化モードである場合はtrue
\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
328 // 指定したカテゴリ以外が最小化モードでなければfalse
\r
329 if ( !imageSelectPanel.isMinimizeMode()) {
\r
335 // 指定カテゴリ以外がすべて最小化モードである場合
\r
336 // (指定カテゴリがない場合は全パネルが最小化モードである場合)
\r