OSDN Git Service

リポジトリ内改行コードのLFへの修正
[charactermanaj/CharacterManaJ.git] / src / main / java / charactermanaj / ui / model / ActiveCustomLayerPatternMgr.java
1 package charactermanaj.ui.model;
2
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;
8 import java.util.List;
9 import java.util.Map;
10 import java.util.Map.Entry;
11 import java.util.Set;
12
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;
18
19 /**
20  * アクティブなカスタムレイヤーパターンのリストを管理する。
21  */
22 public class ActiveCustomLayerPatternMgr {
23
24         /**
25          * 認識している、すべてのカスタムレイヤーパターンを保持する
26          */
27         private final Map<CustomLayerOrderKey, List<CustomLayerOrder>> customLayerPatternMap =
28                         new HashMap<CustomLayerOrderKey, List<CustomLayerOrder>>();
29
30         /**
31          * 現在有効にしているカスタムレイヤーパターン名を保持する
32          */
33         private final Set<CustomLayerOrderKey> activeCustomLayers = new HashSet<CustomLayerOrderKey>();
34
35         /**
36          * カスタムレイヤーパターンと有効にしているパターン名から現在有効なレイヤーマッピングを導出する。
37          * まだ導出されていないかリセットされた場合はnull
38          */
39         private transient CustomLayerOrderMapper customLayerOrderMapper;
40
41         /**
42          * レイヤーパターンの一覧を取得する。
43          *
44          * @return map パターン名をキーとし、カスタムレイヤー順のリストを値とするマップ
45          */
46         public Map<CustomLayerOrderKey, List<CustomLayerOrder>> getMap() {
47                 return customLayerPatternMap;
48         }
49
50         /**
51          * レイヤーパターンの一覧を設定する。
52          * (現在のパターン一覧はクリアされる。)
53          * @param map パターン名をキーとし、カスタムレイヤー順のリストを値とするマップ
54          */
55         public void setMap(Map<CustomLayerOrderKey, List<CustomLayerOrder>> map) {
56                 customLayerPatternMap.clear();
57                 customLayerPatternMap.putAll(map);
58                 activeCustomLayers.retainAll(customLayerPatternMap.keySet()); // 現在存在するパターン名に絞り込む
59                 customLayerOrderMapper = null; // レイヤー順マッピングは再構築する必要がある。
60         }
61
62         /**
63          * すべてのレイヤーパターンのキーとレイヤー順リストについて、パターンの表示名順にソートしたエントリリストとして返す。
64          * @return ソートされたエントリーリスト
65          */
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>>>() {
70                         @Override
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);
76                         }
77                 });
78                 return entries;
79         }
80
81
82         /**
83          * アクティブなカスタムレイヤー順定義でカスタムレイヤー順序索引を行うようにする。
84          */
85         public void initActiveCustomLayerOrderMap() {
86                 initCustomLayerOrderMap(getActiveCustomLayerOrderList());
87         }
88
89         /**
90          * リストで指定したカスタムレイヤー順定義でカスタムレイヤー順序索引を行うようにする。
91          * @param orderList カスタムレイヤー順定義、nullの場合はすべてレイヤーの規定値となる。
92          */
93         public void initCustomLayerOrderMap(List<CustomLayerOrder> orderList) {
94                 customLayerOrderMapper = new CustomLayerOrderMapper(orderList);
95         }
96
97         /**
98          * 現在設定されているカスタムレイヤー順序索引を取得する。
99          * @see {@link #initCustomLayerOrderMap(List)}
100          * @return
101          */
102         public LayerOrderMapper getLayerOrderMapper() {
103                 if (customLayerOrderMapper == null) {
104                         initActiveCustomLayerOrderMap();
105                 }
106                 return customLayerOrderMapper;
107         }
108
109         /**
110          * 現在有効なカスタムレイヤーパターン名の一覧のコピーを取得する。
111          * (返される順序は不定です。)
112          * @return
113          */
114         public Set<CustomLayerOrderKey> getActivePatternNames() {
115                 return new HashSet<CustomLayerOrderKey>(activeCustomLayers);
116         }
117
118         /**
119          * 現在有効なカスタムレイヤー定義リストを取得する
120          * @return
121          */
122         public List<CustomLayerOrder> getActiveCustomLayerOrderList() {
123                 List<CustomLayerOrder> mergedList = new ArrayList<CustomLayerOrder>();
124                 for (CustomLayerOrderKey patternName : activeCustomLayers) {
125                         List<CustomLayerOrder> list = customLayerPatternMap.get(patternName);
126                         if (list != null) {
127                                 for (CustomLayerOrder layerOrder : list) {
128                                         if (layerOrder != null && !mergedList.contains(layerOrder)) {
129                                                 mergedList.add(layerOrder);
130                                         }
131                                 }
132                         }
133                 }
134                 return mergedList;
135         }
136
137
138         /**
139          * レイヤーパターンの選択状態を取得する
140          * @param name
141          * @return
142          */
143         public boolean isSelected(CustomLayerOrderKey name) {
144                 return activeCustomLayers.contains(name);
145         }
146
147         /**
148          * レイヤーパターンの選択状態を設定する
149          * @param name
150          * @param selected
151          */
152         public void setSelected(CustomLayerOrderKey name, boolean selected) {
153                 if (customLayerPatternMap.containsKey(name)) {
154                         if (selected) {
155                                 unselectConflict(name);
156                                 activeCustomLayers.add(name);
157                         } else {
158                                 activeCustomLayers.remove(name);
159                         }
160                         customLayerOrderMapper = null; // レイヤー順マッピングは再構築する必要がある。
161                 }
162         }
163
164         /**
165          * 現在のアクティブなレイヤーパターンの一覧を一括更新する。
166          * @param patternNames
167          */
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);
174                         }
175                 }
176                 customLayerOrderMapper = null; // レイヤー順マッピングは再構築する必要がある。
177         }
178
179         /**
180          * 選択するレイヤーパターンと重複するレイヤーをもつパターンがすでに選択されている場合、
181          * その選択を解除する。
182          * @param name 選択するレイヤーパターン
183          */
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());
191                         }
192                 }
193
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);
206                                                         break;
207                                                 }
208                                         }
209                                 }
210                         }
211                 }
212                 // 衝突のあるパターン名を現在の選択から除外する
213                 activeCustomLayers.removeAll(conflictPatterns);
214         }
215 }