OSDN Git Service

カスタムレイヤーまわりのリファクタなど。
authorseraphy <seraphy@users.osdn.me>
Thu, 6 Dec 2018 17:47:50 +0000 (02:47 +0900)
committerseraphy <seraphy@users.osdn.me>
Thu, 6 Dec 2018 17:47:50 +0000 (02:47 +0900)
src/main/assembly/charactermanaj_with_jre_zip.xml
src/main/assembly/charactermanaj_zip.xml
src/main/java/charactermanaj/graphics/ImageBuildJobAbstractAdaptor.java
src/main/java/charactermanaj/model/CustomLayerOrderKey.java
src/main/java/charactermanaj/model/CustomLayerOrderMapper.java [new file with mode: 0644]
src/main/java/charactermanaj/model/LayerOrderMapper.java [new file with mode: 0644]
src/main/java/charactermanaj/model/io/PartsImageCollectionParser.java
src/main/java/charactermanaj/ui/InformationDialog.java
src/main/java/charactermanaj/ui/MainFrame.java
src/main/java/charactermanaj/ui/model/ActiveCustomLayerPatternMgr.java [moved from src/main/java/charactermanaj/ui/model/CustomLayerPatternMgr.java with 58% similarity]

index b41c261..9f4ed29 100644 (file)
@@ -11,7 +11,6 @@
                        <outputDirectory>.</outputDirectory>\r
                        <includes>\r
                                <include>*.exe</include>\r
-                               <include>*.jar</include>\r
                        </includes>\r
                </fileSet>\r
                <fileSet>\r
index 6dfe370..0ce0b0d 100644 (file)
@@ -11,7 +11,6 @@
                        <outputDirectory>.</outputDirectory>\r
                        <includes>\r
                                <include>*.exe</include>\r
-                               <include>*.jar</include>\r
                        </includes>\r
                </fileSet>\r
                <fileSet>\r
index bb34704..a2db3e4 100644 (file)
@@ -7,11 +7,11 @@ import charactermanaj.graphics.ImageBuilder.ImageSourceCollector;
 import charactermanaj.graphics.filters.ColorConvertParameter;\r
 import charactermanaj.graphics.io.ImageResource;\r
 import charactermanaj.model.Layer;\r
+import charactermanaj.model.LayerOrderMapper;\r
 import charactermanaj.model.PartsIdentifier;\r
 import charactermanaj.model.PartsSet;\r
 import charactermanaj.model.PartsSpecResolver;\r
 import charactermanaj.model.io.PartsImageCollectionParser;\r
-import charactermanaj.model.io.PartsImageCollectionParser.LayerOrderMapper;\r
 \r
 /**\r
  * 非同期に複合画像を生成するイメージビルダに引き渡すジョブを生成するためのアダプタクラス.<br>\r
index 5a12d9c..a3365ce 100644 (file)
@@ -1,6 +1,7 @@
 package charactermanaj.model;\r
 \r
 import java.util.Collections;\r
+import java.util.Comparator;\r
 import java.util.HashMap;\r
 import java.util.Map;\r
 \r
@@ -63,13 +64,26 @@ public class CustomLayerOrderKey implements Comparable<CustomLayerOrderKey> {
                return true;\r
        }\r
 \r
+       /**\r
+        * 表示名によるソート順\r
+        */\r
+       public static final Comparator<CustomLayerOrderKey> COMPARATOR = new Comparator<CustomLayerOrderKey>() {\r
+               @Override\r
+               public int compare(CustomLayerOrderKey o1, CustomLayerOrderKey o2) {\r
+                       // 表示名でソートする\r
+                       // ※ ソート順でマップ化した場合、表示名が異なるがIDが同一のものができうるため\r
+                       // ツリーマップ化などを使う場合はロジックでID重複を防ぐ必要がある。\r
+                       int ret = o1.displayName.compareTo(o2.displayName);\r
+                       if (ret == 0) {\r
+                               ret = o1.id.compareTo(o2.id);\r
+                       }\r
+                       return ret;\r
+               }\r
+       };\r
+\r
        @Override\r
        public int compareTo(CustomLayerOrderKey o) {\r
-               int ret = displayName.compareTo(o.displayName);\r
-               if (ret == 0) {\r
-                       ret = id.compareTo(o.id);\r
-               }\r
-               return ret;\r
+               return COMPARATOR.compare(this, o);\r
        }\r
 \r
        @Override\r
diff --git a/src/main/java/charactermanaj/model/CustomLayerOrderMapper.java b/src/main/java/charactermanaj/model/CustomLayerOrderMapper.java
new file mode 100644 (file)
index 0000000..9014d66
--- /dev/null
@@ -0,0 +1,46 @@
+package charactermanaj.model;\r
+\r
+import java.util.Collection;\r
+import java.util.HashMap;\r
+import java.util.Map;\r
+\r
+/**\r
+ * カスタムレイヤー順の定義リストからレイヤーに対する順序を索引できるようにする。\r
+ */\r
+public class CustomLayerOrderMapper implements LayerOrderMapper {\r
+\r
+       private Map<Layer, Float> layerOrderMap;\r
+\r
+       public CustomLayerOrderMapper() {\r
+               this(null);\r
+       }\r
+\r
+       public CustomLayerOrderMapper(Collection<CustomLayerOrder> orders) {\r
+               initMapping(orders);\r
+       }\r
+\r
+       public final void initMapping(Collection<CustomLayerOrder> orders) {\r
+               this.layerOrderMap = createLayerOrderMap(orders);\r
+       }\r
+\r
+       private static Map<Layer, Float> createLayerOrderMap(Collection<CustomLayerOrder> orders) {\r
+               Map<Layer, Float> layerOrderMap = new HashMap<Layer, Float>();\r
+               if (orders != null) {\r
+                       for (CustomLayerOrder layerOrder : orders) {\r
+                               Layer layer = layerOrder.getLayer();\r
+                               float order = layerOrder.getLayerOrder();\r
+                               layerOrderMap.put(layer, order);\r
+                       }\r
+               }\r
+               return layerOrderMap;\r
+       }\r
+\r
+       @Override\r
+       public float getLayerOrder(Layer layer) {\r
+               Float order = layerOrderMap.get(layer);\r
+               if (order == null) {\r
+                       order = (float) layer.getOrder();\r
+               }\r
+               return order;\r
+       }\r
+}\r
diff --git a/src/main/java/charactermanaj/model/LayerOrderMapper.java b/src/main/java/charactermanaj/model/LayerOrderMapper.java
new file mode 100644 (file)
index 0000000..5af71d4
--- /dev/null
@@ -0,0 +1,9 @@
+package charactermanaj.model;\r
+\r
+/**\r
+ * レイヤーの補正済み順序を取得する\r
+ */\r
+public interface LayerOrderMapper {\r
+\r
+       float getLayerOrder(Layer layer);\r
+}
\ No newline at end of file
index 069a500..45ee536 100644 (file)
@@ -7,6 +7,7 @@ import charactermanaj.graphics.filters.ColorConvertParameter;
 import charactermanaj.graphics.io.ImageResource;\r
 import charactermanaj.model.ColorInfo;\r
 import charactermanaj.model.Layer;\r
+import charactermanaj.model.LayerOrderMapper;\r
 import charactermanaj.model.PartsColorInfo;\r
 import charactermanaj.model.PartsFiles;\r
 import charactermanaj.model.PartsIdentifier;\r
@@ -42,14 +43,6 @@ public class PartsImageCollectionParser {
        }\r
 \r
        /**\r
-        * レイヤーの補正済み順序を取得する\r
-        */\r
-       public interface LayerOrderMapper {\r
-\r
-               float getLayerOrder(Layer layer);\r
-       }\r
-\r
-       /**\r
         * パーツ設定を解決するためのインターフェイス\r
         */\r
        protected PartsSpecResolver partsSpecResolver;\r
index f62826f..0b29d1b 100644 (file)
@@ -58,11 +58,11 @@ import charactermanaj.graphics.io.PNGFileImageHeader;
 import charactermanaj.graphics.io.PNGFileImageHeaderReader;\r
 import charactermanaj.model.AppConfig;\r
 import charactermanaj.model.Layer;\r
+import charactermanaj.model.LayerOrderMapper;\r
 import charactermanaj.model.PartsIdentifier;\r
 import charactermanaj.model.PartsSet;\r
 import charactermanaj.model.PartsSpecResolver;\r
 import charactermanaj.model.io.PartsImageCollectionParser;\r
-import charactermanaj.model.io.PartsImageCollectionParser.LayerOrderMapper;\r
 import charactermanaj.model.io.PartsImageCollectionParser.PartsImageCollectionHandler;\r
 import charactermanaj.ui.model.AbstractTableModelWithComboBoxModel;\r
 import charactermanaj.util.DesktopUtilities;\r
index 4c6458a..ade70ca 100644 (file)
@@ -79,6 +79,7 @@ import charactermanaj.model.CharacterDataChangeObserver;
 import charactermanaj.model.ColorGroup;\r
 import charactermanaj.model.CustomLayerOrder;\r
 import charactermanaj.model.CustomLayerOrderKey;\r
+import charactermanaj.model.LayerOrderMapper;\r
 import charactermanaj.model.PartsCategory;\r
 import charactermanaj.model.PartsColorInfo;\r
 import charactermanaj.model.PartsColorManager;\r
@@ -89,7 +90,6 @@ import charactermanaj.model.WorkingSet;
 import charactermanaj.model.io.CharacterDataPersistent;\r
 import charactermanaj.model.io.CustomLayerOrderPersist;\r
 import charactermanaj.model.io.CustomLayerOrderPersist.CustomLayerOrderPersistListener;\r
-import charactermanaj.model.io.PartsImageCollectionParser.LayerOrderMapper;\r
 import charactermanaj.model.io.PartsImageDirectoryWatchAgent;\r
 import charactermanaj.model.io.PartsImageDirectoryWatchAgentFactory;\r
 import charactermanaj.model.io.PartsImageDirectoryWatchEvent;\r
@@ -102,10 +102,10 @@ import charactermanaj.ui.LayerOrderCustomizeDialog.LayerOrderCustomizeListener;
 import charactermanaj.ui.ManageFavoriteDialog.FavoriteManageCallback;\r
 import charactermanaj.ui.PreviewPanel.PreviewPanelEvent;\r
 import charactermanaj.ui.PreviewPanel.PreviewPanelListener;\r
+import charactermanaj.ui.model.ActiveCustomLayerPatternMgr;\r
 import charactermanaj.ui.model.ColorChangeEvent;\r
 import charactermanaj.ui.model.ColorChangeListener;\r
 import charactermanaj.ui.model.ColorGroupCoordinator;\r
-import charactermanaj.ui.model.CustomLayerPatternMgr;\r
 import charactermanaj.ui.model.FavoritesChangeEvent;\r
 import charactermanaj.ui.model.FavoritesChangeListener;\r
 import charactermanaj.ui.model.FavoritesChangeObserver;\r
@@ -272,7 +272,7 @@ public class MainFrame extends JFrame
        /**\r
         * カスタムレイヤーパターンのリストを管理する\r
         */\r
-       private final CustomLayerPatternMgr customLayerPatternMgr = new CustomLayerPatternMgr();\r
+       private final ActiveCustomLayerPatternMgr customLayerPatternMgr = new ActiveCustomLayerPatternMgr();\r
 \r
        /**\r
         * アクティブなメインフレームを設定する.\r
@@ -468,8 +468,10 @@ public class MainFrame extends JFrame
                // それ以上大きい画像の場合は増えた分だけフレームを大きくしておく.\r
                setSize(imageWidth - 300 + 600, imageHeight - 400 + 550);\r
 \r
-               // 次回表示時にプラットフォーム固有位置に表示するように予約\r
-               setLocationByPlatform(true);\r
+               // 現在表示されていなければ、次回表示時にプラットフォーム固有位置に表示するように予約\r
+               if (!isShowing()) {\r
+                       setLocationByPlatform(true);\r
+               }\r
        }\r
 \r
        /**\r
@@ -1315,8 +1317,7 @@ public class MainFrame extends JFrame
        protected void onSelectedCustomLayerMenu(JMenu menu) {\r
                // メニューの再構築\r
                ArrayList<JMenuItem> menuItems = new ArrayList<JMenuItem>();\r
-               for (Map.Entry<CustomLayerOrderKey, List<CustomLayerOrder>> entry :\r
-                               customLayerPatternMgr.getMap().entrySet()) {\r
+               for (Map.Entry<CustomLayerOrderKey, List<CustomLayerOrder>> entry : customLayerPatternMgr.getOrderedEntries()) {\r
                        final CustomLayerOrderKey patternKey = entry.getKey();\r
                        final String displayName = patternKey.getDisplayName();\r
                        final JCheckBoxMenuItem menuItem = new JCheckBoxMenuItem(displayName);\r
@@ -1430,6 +1431,11 @@ public class MainFrame extends JFrame
                        private PartsSet requestPartsSet;\r
 \r
                        /**\r
+                        * 適用されているカスタムレイヤー順序\r
+                        */\r
+                       private LayerOrderMapper layerOrderMapper;\r
+\r
+                       /**\r
                         * 非同期のイメージ構築要求の番号.<br>\r
                         */\r
                        private long ticket;\r
@@ -1448,6 +1454,11 @@ public class MainFrame extends JFrame
                                                previewPane.setPreviewImage(img);\r
                                                previewPane.setLoadingComplete(ticket);\r
                                                showPresetName(requestPartsSet);\r
+\r
+                                               // 表示対象のパーツセットの情報で更新する (情報ダイアログが開いていれば)\r
+                                               if (informationDialog != null) {\r
+                                                       informationDialog.showPartsInformation(requestPartsSet, layerOrderMapper);\r
+                                               }\r
                                        }\r
                                };\r
                                if (SwingUtilities.isEventDispatchThread()) {\r
@@ -1477,16 +1488,14 @@ public class MainFrame extends JFrame
                        @Override\r
                        protected PartsSet getPartsSet() {\r
                                // 合成できる状態になった時点でイメージビルダから呼び出される.\r
-                               final PartsSet[] result = new PartsSet[1];\r
                                Runnable collectPartsSetJob = new Runnable() {\r
                                        public void run() {\r
-                                               PartsSet partsSet = partsSelectionManager.createPartsSet();\r
-                                               result[0] = partsSet;\r
+                                               requestPartsSet = partsSelectionManager.createPartsSet();\r
 \r
-                                               // 表示対象のパーツセットの情報で更新する (情報ダイアログが開いていれば)\r
-                                               if (informationDialog != null) {\r
-                                                       informationDialog.showPartsInformation(partsSet, customLayerPatternMgr);\r
-                                               }\r
+                                               // getPartsSetで得られるパーツセットで保持しているカスタムレイヤーパターン名ではなく、\r
+                                               // 現在画面に適用している作業中のカスタムレイヤーのマッパーを取得する。\r
+                                               // ※ カスタムレイヤー編集ダイアログの動的なレイヤー変更によるプレビューに対応するため\r
+                                               layerOrderMapper = customLayerPatternMgr.getLayerOrderMapper();\r
                                        }\r
                                };\r
                                if (SwingUtilities.isEventDispatchThread()) {\r
@@ -1504,14 +1513,13 @@ public class MainFrame extends JFrame
                                        }\r
                                }\r
                                if (logger.isLoggable(Level.FINE)) {\r
-                                       logger.log(Level.FINE, "preview: " + result[0]);\r
+                                       logger.log(Level.FINE, "preview: " + requestPartsSet);\r
                                }\r
-                               requestPartsSet = result[0];\r
                                return requestPartsSet;\r
                        }\r
                        @Override\r
                        protected LayerOrderMapper getLayerOrderMapper() {\r
-                               return customLayerPatternMgr;\r
+                               return layerOrderMapper;\r
                        }\r
                });\r
        }\r
@@ -2341,6 +2349,8 @@ public class MainFrame extends JFrame
                }\r
 \r
                PartsSet partsSet = partsSelectionManager.createPartsSet();\r
+               LayerOrderMapper layerOrderMapper = customLayerPatternMgr.getLayerOrderMapper();\r
+\r
                if (informationDialog == null) {\r
                        informationDialog = new InformationDialog(this, characterData, new Runnable() {\r
                                @Override\r
@@ -2349,7 +2359,8 @@ public class MainFrame extends JFrame
                                }\r
                        });\r
                }\r
-               informationDialog.showPartsInformation(partsSet, customLayerPatternMgr);\r
+\r
+               informationDialog.showPartsInformation(partsSet, layerOrderMapper);\r
                informationDialog.setVisible(true);\r
        }\r
 \r
@@ -2363,22 +2374,22 @@ public class MainFrame extends JFrame
                        @Override\r
                        public void onChange(charactermanaj.ui.LayerOrderCustomizeDialog.LayerOrderCustomizeListener.Change e) {\r
                                // レイヤーパターンの編集がされた場合、プレビューする\r
-                               customLayerPatternMgr.applyCustomLayerOrder(layerOrderCustomDlg.getEdittingCustomLayerOrderList());\r
+                               customLayerPatternMgr.initCustomLayerOrderMap(layerOrderCustomDlg.getEdittingCustomLayerOrderList());\r
                                requestPreview();\r
                        }\r
                });\r
 \r
                // 現在保持しているレイヤーパターンの一覧を取得する\r
                final LayerOrderCustomizeDialogModel layerOrderCustomDialogModel = new LayerOrderCustomizeDialogModel();\r
-               for (Map.Entry<CustomLayerOrderKey, List<CustomLayerOrder>> entry :\r
-                               customLayerPatternMgr.getMap().entrySet()) {\r
+               // レイヤーパターン名を表示順に並べてからモデルに登録する。\r
+               for (Map.Entry<CustomLayerOrderKey, List<CustomLayerOrder>> entry : customLayerPatternMgr.getOrderedEntries()) {\r
                        CustomLayerOrderKey orderKey = entry.getKey();\r
                        List<CustomLayerOrder> customLayerOrderList = entry.getValue();\r
                        layerOrderCustomDialogModel.put(orderKey, customLayerOrderList);\r
                }\r
 \r
                // 現在選択しているアクティブなレイヤーパターンを取得する\r
-               List<CustomLayerOrder> currentList = customLayerPatternMgr.getMergedCustomLayerOrderList();\r
+               List<CustomLayerOrder> currentList = customLayerPatternMgr.getActiveCustomLayerOrderList();\r
                layerOrderCustomDialogModel.setCurrentList(currentList);\r
 \r
                layerOrderCustomDlg.setModel(layerOrderCustomDialogModel);\r
@@ -2421,6 +2432,9 @@ public class MainFrame extends JFrame
                        customLayerPatternMgr.setSelected(lastPatternName, true);\r
                }\r
 \r
+               // プレビューのために設定していたレイヤー順序を本来のアクティブカスタムレイヤーのものに戻す\r
+               customLayerPatternMgr.initActiveCustomLayerOrderMap();\r
+\r
                requestPreview();\r
        }\r
 \r
@@ -2805,6 +2819,14 @@ public class MainFrame extends JFrame
                                                        }\r
                                                }),\r
                                }),\r
+                               new MenuDataFactory("menu.customlayer", new MenuDataFactory[] {\r
+                                               new MenuDataFactory("customlayer.manage", new ActionListener() {\r
+                                                       public void actionPerformed(ActionEvent e) {\r
+                                                               onManageCustomLayer();\r
+                                                       }\r
+                                               }),\r
+                                               null,\r
+                               }),\r
                                new MenuDataFactory("menu.favorite", new MenuDataFactory[] {\r
                                                new MenuDataFactory("favorite.register", new ActionListener() {\r
                                                        public void actionPerformed(ActionEvent e) {\r
@@ -2818,14 +2840,6 @@ public class MainFrame extends JFrame
                                                }),\r
                                                null,\r
                                }),\r
-                               new MenuDataFactory("menu.customlayer", new MenuDataFactory[] {\r
-                                               new MenuDataFactory("customlayer.manage", new ActionListener() {\r
-                                                       public void actionPerformed(ActionEvent e) {\r
-                                                               onManageCustomLayer();\r
-                                                       }\r
-                                               }),\r
-                                               null,\r
-                               }),\r
                                new MenuDataFactory("menu.tool",\r
                                                new MenuDataFactory[]{new MenuDataFactory(\r
                                                                "tool.random", new ActionListener() {\r
@@ -1,29 +1,31 @@
 package charactermanaj.ui.model;\r
 \r
 import java.util.ArrayList;\r
+import java.util.Collections;\r
+import java.util.Comparator;\r
 import java.util.HashMap;\r
 import java.util.HashSet;\r
 import java.util.List;\r
 import java.util.Map;\r
+import java.util.Map.Entry;\r
 import java.util.Set;\r
-import java.util.TreeMap;\r
-import java.util.TreeSet;\r
 \r
 import charactermanaj.model.CustomLayerOrder;\r
 import charactermanaj.model.CustomLayerOrderKey;\r
+import charactermanaj.model.CustomLayerOrderMapper;\r
 import charactermanaj.model.Layer;\r
-import charactermanaj.model.io.PartsImageCollectionParser.LayerOrderMapper;\r
+import charactermanaj.model.LayerOrderMapper;\r
 \r
 /**\r
- * カスタムレイヤーパターンのリストを管理する。\r
+ * ã\82¢ã\82¯ã\83\86ã\82£ã\83\96ã\81ªã\82«ã\82¹ã\82¿ã\83 ã\83¬ã\82¤ã\83¤ã\83¼ã\83\91ã\82¿ã\83¼ã\83³ã\81®ã\83ªã\82¹ã\83\88ã\82\92管ç\90\86ã\81\99ã\82\8bã\80\82\r
  */\r
-public class CustomLayerPatternMgr implements LayerOrderMapper {\r
+public class ActiveCustomLayerPatternMgr {\r
 \r
        /**\r
-        * カスタムレイヤーパターンを保持する\r
+        * 認識している、すべてのカスタムレイヤーパターンを保持する\r
         */\r
        private final Map<CustomLayerOrderKey, List<CustomLayerOrder>> customLayerPatternMap =\r
-                       new TreeMap<CustomLayerOrderKey, List<CustomLayerOrder>>();\r
+                       new HashMap<CustomLayerOrderKey, List<CustomLayerOrder>>();\r
 \r
        /**\r
         * 現在有効にしているカスタムレイヤーパターン名を保持する\r
@@ -34,44 +36,7 @@ public class CustomLayerPatternMgr implements LayerOrderMapper {
         * カスタムレイヤーパターンと有効にしているパターン名から現在有効なレイヤーマッピングを導出する。\r
         * まだ導出されていないかリセットされた場合はnull\r
         */\r
-       private Map<Layer, Float> customLayerOrderMap;\r
-\r
-       /**\r
-        * 現在有功にしているカスタムレイヤーの順序をマッピングする\r
-        */\r
-       private void initCustomLayerOrder() {\r
-               customLayerOrderMap = new HashMap<Layer, Float>();\r
-               for (CustomLayerOrderKey patternKey : activeCustomLayers) {\r
-                       initCustomLayerOrder(customLayerPatternMap.get(patternKey));\r
-               }\r
-       }\r
-\r
-       private void initCustomLayerOrder(List<CustomLayerOrder> customLayerOrderList) {\r
-               if (customLayerOrderList != null) {\r
-                       for (CustomLayerOrder customLayerOrder : customLayerOrderList) {\r
-                               Layer layer = customLayerOrder.getLayer();\r
-                               float layerOrder = customLayerOrder.getLayerOrder();\r
-                               customLayerOrderMap.put(layer, layerOrder);\r
-                       }\r
-               }\r
-       }\r
-\r
-       public void applyCustomLayerOrder(List<CustomLayerOrder> customLayerOrderList) {\r
-               customLayerOrderMap = new HashMap<Layer, Float>();\r
-               initCustomLayerOrder(customLayerOrderList);\r
-       }\r
-\r
-       @Override\r
-       public float getLayerOrder(Layer layer) {\r
-               if (customLayerOrderMap == null) {\r
-                       initCustomLayerOrder();\r
-               }\r
-               Float layerOrder = customLayerOrderMap.get(layer);\r
-               if (layerOrder == null) {\r
-                       layerOrder = (float) layer.getOrder();\r
-               }\r
-               return layerOrder;\r
-       }\r
+       private transient CustomLayerOrderMapper customLayerOrderMapper;\r
 \r
        /**\r
         * レイヤーパターンの一覧を取得する。\r
@@ -91,9 +56,85 @@ public class CustomLayerPatternMgr implements LayerOrderMapper {
                customLayerPatternMap.clear();\r
                customLayerPatternMap.putAll(map);\r
                activeCustomLayers.retainAll(customLayerPatternMap.keySet()); // 現在存在するパターン名に絞り込む\r
-               initCustomLayerOrder();\r
+               customLayerOrderMapper = null; // レイヤー順マッピングは再構築する必要がある。\r
+       }\r
+\r
+       /**\r
+        * すべてのレイヤーパターンのキーとレイヤー順リストについて、パターンの表示名順にソートしたエントリリストとして返す。\r
+        * @return ソートされたエントリーリスト\r
+        */\r
+       public List<Map.Entry<CustomLayerOrderKey, List<CustomLayerOrder>>> getOrderedEntries() {\r
+               List<Map.Entry<CustomLayerOrderKey, List<CustomLayerOrder>>> entries =\r
+                               new ArrayList<Map.Entry<CustomLayerOrderKey, List<CustomLayerOrder>>>(customLayerPatternMap.entrySet());\r
+               Collections.sort(entries, new Comparator<Map.Entry<CustomLayerOrderKey, List<CustomLayerOrder>>>() {\r
+                       @Override\r
+                       public int compare(Entry<CustomLayerOrderKey, List<CustomLayerOrder>> o1,\r
+                                       Entry<CustomLayerOrderKey, List<CustomLayerOrder>> o2) {\r
+                               CustomLayerOrderKey k1 = o1.getKey();\r
+                               CustomLayerOrderKey k2 = o2.getKey();\r
+                               return CustomLayerOrderKey.COMPARATOR.compare(k1, k2);\r
+                       }\r
+               });\r
+               return entries;\r
+       }\r
+\r
+\r
+       /**\r
+        * アクティブなカスタムレイヤー順定義でカスタムレイヤー順序索引を行うようにする。\r
+        */\r
+       public void initActiveCustomLayerOrderMap() {\r
+               initCustomLayerOrderMap(getActiveCustomLayerOrderList());\r
+       }\r
+\r
+       /**\r
+        * リストで指定したカスタムレイヤー順定義でカスタムレイヤー順序索引を行うようにする。\r
+        * @param orderList カスタムレイヤー順定義、nullの場合はすべてレイヤーの規定値となる。\r
+        */\r
+       public void initCustomLayerOrderMap(List<CustomLayerOrder> orderList) {\r
+               customLayerOrderMapper = new CustomLayerOrderMapper(orderList);\r
+       }\r
+\r
+       /**\r
+        * 現在設定されているカスタムレイヤー順序索引を取得する。\r
+        * @see {@link #initCustomLayerOrderMap(List)}\r
+        * @return\r
+        */\r
+       public LayerOrderMapper getLayerOrderMapper() {\r
+               if (customLayerOrderMapper == null) {\r
+                       initActiveCustomLayerOrderMap();\r
+               }\r
+               return customLayerOrderMapper;\r
+       }\r
+\r
+       /**\r
+        * 現在有効なカスタムレイヤーパターン名の一覧のコピーを取得する。\r
+        * (返される順序は不定です。)\r
+        * @return\r
+        */\r
+       public Set<CustomLayerOrderKey> getActivePatternNames() {\r
+               return new HashSet<CustomLayerOrderKey>(activeCustomLayers);\r
+       }\r
+\r
+       /**\r
+        * 現在有効なカスタムレイヤー定義リストを取得する\r
+        * @return\r
+        */\r
+       public List<CustomLayerOrder> getActiveCustomLayerOrderList() {\r
+               List<CustomLayerOrder> mergedList = new ArrayList<CustomLayerOrder>();\r
+               for (CustomLayerOrderKey patternName : activeCustomLayers) {\r
+                       List<CustomLayerOrder> list = customLayerPatternMap.get(patternName);\r
+                       if (list != null) {\r
+                               for (CustomLayerOrder layerOrder : list) {\r
+                                       if (layerOrder != null && !mergedList.contains(layerOrder)) {\r
+                                               mergedList.add(layerOrder);\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+               return mergedList;\r
        }\r
 \r
+\r
        /**\r
         * レイヤーパターンの選択状態を取得する\r
         * @param name\r
@@ -116,19 +157,11 @@ public class CustomLayerPatternMgr implements LayerOrderMapper {
                        } else {\r
                                activeCustomLayers.remove(name);\r
                        }\r
-                       initCustomLayerOrder();\r
+                       customLayerOrderMapper = null; // レイヤー順マッピングは再構築する必要がある。\r
                }\r
        }\r
 \r
        /**\r
-        * 現在アクティブなレイヤーパターン名の一覧のコピーを取得する。\r
-        * @return\r
-        */\r
-       public Set<CustomLayerOrderKey> getActivePatternNames() {\r
-               return new TreeSet<CustomLayerOrderKey>(activeCustomLayers);\r
-       }\r
-\r
-       /**\r
         * 現在のアクティブなレイヤーパターンの一覧を一括更新する。\r
         * @param patternNames\r
         */\r
@@ -140,7 +173,7 @@ public class CustomLayerPatternMgr implements LayerOrderMapper {
                                activeCustomLayers.add(name);\r
                        }\r
                }\r
-               initCustomLayerOrder();\r
+               customLayerOrderMapper = null; // レイヤー順マッピングは再構築する必要がある。\r
        }\r
 \r
        /**\r
@@ -179,24 +212,4 @@ public class CustomLayerPatternMgr implements LayerOrderMapper {
                // 衝突のあるパターン名を現在の選択から除外する\r
                activeCustomLayers.removeAll(conflictPatterns);\r
        }\r
-\r
-       /**\r
-        * 現在有効なすべてのレイヤーパターンのレイヤーマッピングを重ねたリストを取得する。\r
-        * (順序は不定である。)\r
-        * @return\r
-        */\r
-       public List<CustomLayerOrder> getMergedCustomLayerOrderList() {\r
-               List<CustomLayerOrder> mergedList = new ArrayList<CustomLayerOrder>();\r
-               for (CustomLayerOrderKey patternName : activeCustomLayers) {\r
-                       List<CustomLayerOrder> list = customLayerPatternMap.get(patternName);\r
-                       if (list != null) {\r
-                               for (CustomLayerOrder layerOrder : list) {\r
-                                       if (!mergedList.contains(layerOrder)) {\r
-                                               mergedList.add(layerOrder);\r
-                                       }\r
-                               }\r
-                       }\r
-               }\r
-               return mergedList;\r
-       }\r
 }
\ No newline at end of file