1 package charactermanaj.ui.model;
3 import java.util.ArrayList;
4 import java.util.Collections;
5 import java.util.Comparator;
6 import java.util.HashMap;
7 import java.util.HashSet;
10 import java.util.Map.Entry;
13 import charactermanaj.model.CustomLayerOrder;
14 import charactermanaj.model.CustomLayerOrderKey;
15 import charactermanaj.model.CustomLayerOrderMapper;
16 import charactermanaj.model.Layer;
17 import charactermanaj.model.LayerOrderMapper;
20 * アクティブなカスタムレイヤーパターンのリストを管理する。
22 public class ActiveCustomLayerPatternMgr {
25 * 認識している、すべてのカスタムレイヤーパターンを保持する
27 private final Map<CustomLayerOrderKey, List<CustomLayerOrder>> customLayerPatternMap =
28 new HashMap<CustomLayerOrderKey, List<CustomLayerOrder>>();
31 * 現在有効にしているカスタムレイヤーパターン名を保持する
33 private final Set<CustomLayerOrderKey> activeCustomLayers = new HashSet<CustomLayerOrderKey>();
36 * カスタムレイヤーパターンと有効にしているパターン名から現在有効なレイヤーマッピングを導出する。
37 * まだ導出されていないかリセットされた場合はnull
39 private transient CustomLayerOrderMapper customLayerOrderMapper;
44 * @return map パターン名をキーとし、カスタムレイヤー順のリストを値とするマップ
46 public Map<CustomLayerOrderKey, List<CustomLayerOrder>> getMap() {
47 return customLayerPatternMap;
53 * @param map パターン名をキーとし、カスタムレイヤー順のリストを値とするマップ
55 public void setMap(Map<CustomLayerOrderKey, List<CustomLayerOrder>> map) {
56 customLayerPatternMap.clear();
57 customLayerPatternMap.putAll(map);
58 activeCustomLayers.retainAll(customLayerPatternMap.keySet()); // 現在存在するパターン名に絞り込む
59 customLayerOrderMapper = null; // レイヤー順マッピングは再構築する必要がある。
63 * すべてのレイヤーパターンのキーとレイヤー順リストについて、パターンの表示名順にソートしたエントリリストとして返す。
64 * @return ソートされたエントリーリスト
66 public List<Map.Entry<CustomLayerOrderKey, List<CustomLayerOrder>>> getOrderedEntries() {
67 List<Map.Entry<CustomLayerOrderKey, List<CustomLayerOrder>>> entries =
68 new ArrayList<Map.Entry<CustomLayerOrderKey, List<CustomLayerOrder>>>(customLayerPatternMap.entrySet());
69 Collections.sort(entries, new Comparator<Map.Entry<CustomLayerOrderKey, List<CustomLayerOrder>>>() {
71 public int compare(Entry<CustomLayerOrderKey, List<CustomLayerOrder>> o1,
72 Entry<CustomLayerOrderKey, List<CustomLayerOrder>> o2) {
73 CustomLayerOrderKey k1 = o1.getKey();
74 CustomLayerOrderKey k2 = o2.getKey();
75 return CustomLayerOrderKey.COMPARATOR.compare(k1, k2);
83 * アクティブなカスタムレイヤー順定義でカスタムレイヤー順序索引を行うようにする。
85 public void initActiveCustomLayerOrderMap() {
86 initCustomLayerOrderMap(getActiveCustomLayerOrderList());
90 * リストで指定したカスタムレイヤー順定義でカスタムレイヤー順序索引を行うようにする。
91 * @param orderList カスタムレイヤー順定義、nullの場合はすべてレイヤーの規定値となる。
93 public void initCustomLayerOrderMap(List<CustomLayerOrder> orderList) {
94 customLayerOrderMapper = new CustomLayerOrderMapper(orderList);
98 * 現在設定されているカスタムレイヤー順序索引を取得する。
99 * @see {@link #initCustomLayerOrderMap(List)}
102 public LayerOrderMapper getLayerOrderMapper() {
103 if (customLayerOrderMapper == null) {
104 initActiveCustomLayerOrderMap();
106 return customLayerOrderMapper;
110 * 現在有効なカスタムレイヤーパターン名の一覧のコピーを取得する。
114 public Set<CustomLayerOrderKey> getActivePatternNames() {
115 return new HashSet<CustomLayerOrderKey>(activeCustomLayers);
119 * 現在有効なカスタムレイヤー定義リストを取得する
122 public List<CustomLayerOrder> getActiveCustomLayerOrderList() {
123 List<CustomLayerOrder> mergedList = new ArrayList<CustomLayerOrder>();
124 for (CustomLayerOrderKey patternName : activeCustomLayers) {
125 List<CustomLayerOrder> list = customLayerPatternMap.get(patternName);
127 for (CustomLayerOrder layerOrder : list) {
128 if (layerOrder != null && !mergedList.contains(layerOrder)) {
129 mergedList.add(layerOrder);
143 public boolean isSelected(CustomLayerOrderKey name) {
144 return activeCustomLayers.contains(name);
152 public void setSelected(CustomLayerOrderKey name, boolean selected) {
153 if (customLayerPatternMap.containsKey(name)) {
155 unselectConflict(name);
156 activeCustomLayers.add(name);
158 activeCustomLayers.remove(name);
160 customLayerOrderMapper = null; // レイヤー順マッピングは再構築する必要がある。
165 * 現在のアクティブなレイヤーパターンの一覧を一括更新する。
166 * @param patternNames
168 public void setActivePatternNames(Set<CustomLayerOrderKey> patternNames) {
169 activeCustomLayers.clear();
170 for (CustomLayerOrderKey name : patternNames) {
171 if (customLayerPatternMap.containsKey(name)) {
172 unselectConflict(name);
173 activeCustomLayers.add(name);
176 customLayerOrderMapper = null; // レイヤー順マッピングは再構築する必要がある。
180 * 選択するレイヤーパターンと重複するレイヤーをもつパターンがすでに選択されている場合、
182 * @param name 選択するレイヤーパターン
184 private void unselectConflict(CustomLayerOrderKey orderKey) {
185 // 指定されたパターン名が使用しているレイヤー一覧を作成する。
186 Set<Layer> targetLayers = new HashSet<Layer>();
187 List<CustomLayerOrder> targetLayerOrders = customLayerPatternMap.get(orderKey);
188 if (targetLayerOrders != null) {
189 for (CustomLayerOrder layerOrder : targetLayerOrders) {
190 targetLayers.add(layerOrder.getLayer());
194 // 現在選択しているレイヤーパターンから、
195 // これから選択しようとしているレイヤーを含んでいる(衝突)パターンを検出する
196 ArrayList<CustomLayerOrderKey> conflictPatterns = new ArrayList<CustomLayerOrderKey>();
197 for (CustomLayerOrderKey patternName : activeCustomLayers) {
198 if (!patternName.equals(orderKey)) { // 自分と同一名であれば検査の必要なし
199 List<CustomLayerOrder> layerOrders = customLayerPatternMap.get(patternName);
200 if (layerOrders != null) {
201 for (CustomLayerOrder layerOrder : layerOrders) {
202 Layer layer = layerOrder.getLayer();
203 if (targetLayers.contains(layer)) {
204 // ターゲットにレイヤーが含まれている場合は、このパターンの選択は解除する
205 conflictPatterns.add(patternName);
212 // 衝突のあるパターン名を現在の選択から除外する
213 activeCustomLayers.removeAll(conflictPatterns);