OSDN Git Service

カスタムレイヤーのインポート・エクスポート、テンプレート登録に対応。
[charactermanaj/CharacterManaJ.git] / src / main / java / charactermanaj / model / io / ImportModel.java
index 23c1a7e..488d528 100644 (file)
@@ -10,11 +10,15 @@ import java.io.InputStream;
 import java.io.OutputStream;
 import java.net.URI;
 import java.util.Collection;
+import java.util.List;
+import java.util.Map;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
 import charactermanaj.model.AppConfig;
 import charactermanaj.model.CharacterData;
+import charactermanaj.model.CustomLayerOrder;
+import charactermanaj.model.CustomLayerOrderKey;
 import charactermanaj.model.PartsAuthorInfo;
 import charactermanaj.model.PartsCategory;
 import charactermanaj.model.PartsManageData;
@@ -33,44 +37,49 @@ public class ImportModel {
         * インポートもとファイル
         */
        private URI importSource;
-       
+
        /**
         * プロファイル先のキャラクター定義、新規の場合はnull
         */
        private CharacterData currentCharacterData;
-       
-       
+
+
        /**
         * インポートもとアーカイブ. ロードされた場合に非nullとなる.
         */
        private CharacterDataArchiveFile archiveFile;
-       
-       
+
+
        /**
         * インポートされたキャラクター定義、なければnull
         */
        private CharacterData sourceCharacterData;
-       
+
+       /**
+        * インポートされたカスタムレイヤーパターン定義、なければnull
+        */
+       private Map<CustomLayerOrderKey, List<CustomLayerOrder>> sourceCustomLayerPatternMap;
+
        /**
         * インポートされたサンプルピクチャ、なければnull
         */
        private BufferedImage samplePicture;
-       
+
        /**
         * インポートされたreadme
         */
        private String readme;
-       
+
        /**
         * インポート先のキャラクター定義、もしくは現在のキャラクター定義のディレクトリ構成から 読み取ることのできるパーツのコレクション、なければ空.<br>
         */
        private Collection<PartsImageContent> partsImageContentsMap;
-       
+
        /**
         * パーツ管理データ、なければ空
         */
        private PartsManageData partsManageData;
-       
+
 
        public void openImportSource(URI importSource, CharacterData currentCharacterData) throws IOException {
                if (archiveFile != null || importSource == null) {
@@ -79,7 +88,7 @@ public class ImportModel {
                this.importSource = importSource;
                this.currentCharacterData = currentCharacterData;
        }
-       
+
        public void closeImportSource() throws IOException {
                if (archiveFile != null) {
                        try {
@@ -90,7 +99,7 @@ public class ImportModel {
                        }
                }
        }
-       
+
        public void loadContents(ProgressHandle progressHandle) throws IOException {
                if (archiveFile != null) {
                        throw new IllegalStateException("既にアーカイブがオープンされています。");
@@ -100,7 +109,7 @@ public class ImportModel {
                }
 
                CharacterDataFileReaderWriterFactory factory = CharacterDataFileReaderWriterFactory.getInstance();
-               
+
                progressHandle.setCaption("open archive...");
                archiveFile = factory.openArchive(importSource);
 
@@ -118,16 +127,21 @@ public class ImportModel {
                                        sourceCharacterData.setDescription(readme);
                                }
                        }
-                       
+
                } else {
                        // character.xmlがあった場合、favorites.xmlもあれば読み込む.
                        archiveFile.readFavorites(sourceCharacterData);
                }
 
+               if (sourceCharacterData != null && sourceCharacterData.isEnableCustonLayerPattern()) {
+                       // キャラクターデータの読み取りができ、且つ、カスタムレイヤーパターンが有効であれば
+                       sourceCustomLayerPatternMap = archiveFile.readCustomLayerPatterns(sourceCharacterData);
+               }
+
                // サンプルピクチャの読み込み、なければnull
                progressHandle.setCaption("load sample picture...");
                samplePicture = archiveFile.readSamplePicture();
-               
+
                // パーツセットの読み込み、なければ空
                progressHandle.setCaption("load partssets...");
                if (currentCharacterData != null) {
@@ -138,7 +152,7 @@ public class ImportModel {
                        // インポート元にあるキャラクター定義をもとにパーツディレクトリを探索する場合
                        partsImageContentsMap = archiveFile.getPartsImageContents(sourceCharacterData, true);
                }
-               
+
                // パーツ管理データの読み込み
                progressHandle.setCaption("load parts definitions...");
                partsManageData = archiveFile.getPartsManageData();
@@ -153,24 +167,29 @@ public class ImportModel {
                partsImageContentsMap = null;
                partsManageData = null;
        }
-       
+
 
 
        public URI getImportSource() {
                return importSource;
        }
-       
+
        protected void checkArchiveOpened() {
                if (archiveFile == null) {
                        throw new IllegalStateException("アーカイブはオープンされていません。");
                }
        }
-       
+
        public CharacterData getCharacterData() {
                checkArchiveOpened();
                return sourceCharacterData;
        }
 
+       public Map<CustomLayerOrderKey, List<CustomLayerOrder>> getCustomLayerPatternMap() {
+               checkArchiveOpened();
+               return sourceCustomLayerPatternMap;
+       }
+
        public BufferedImage getSamplePicture() {
                checkArchiveOpened();
                return samplePicture;
@@ -191,11 +210,11 @@ public class ImportModel {
                return partsManageData;
        }
 
-       
-       
+
+
        /**
         * パーツデータをプロファイルの画像ディレクトリに一括コピーする.<br>
-        * 
+        *
         * @param partsImageContents
         *            コピー対象のパーツデータ
         * @param cd
@@ -223,7 +242,7 @@ public class ImportModel {
 
                AppConfig appConfig = AppConfig.getInstance();
                byte[] stmbuf = new byte[appConfig.getFileTransferBufferSize()];
-               
+
                // ファイルコピー
                for (PartsImageContent content : partsImageContents) {
                        InputStream is = new BufferedInputStream(content.openStream());
@@ -247,11 +266,11 @@ public class ImportModel {
                                } finally {
                                        os.close();
                                }
-                               
+
                                if (!outFile.setLastModified(content.lastModified())) {
                                        logger.log(Level.WARNING, "can't change the modified-date: " + outFile);
                                }
-                               
+
                        } finally {
                                is.close();
                        }
@@ -263,7 +282,7 @@ public class ImportModel {
         * パーツ管理情報がnullまたは空であれば何もしない.<br>
         * そうでなければインポートするパーツに該当するパーツ管理情報を、現在のプロファイルのパーツ管理情報に追記・更新し、 それを書き出す.<br>
         * インポートもとにパーツ管理情報がなく、既存にある場合、インポートしても管理情報は削除されません.(上書きセマンティクスのため)
-        * 
+        *
         * @param partsImageContents
         *            インポートするパーツ
         * @param partsManageData
@@ -282,7 +301,7 @@ public class ImportModel {
                if (target == null || !target.isValid()) {
                        throw new IllegalArgumentException();
                }
-               
+
                if (partsImageContents == null || partsImageContents.isEmpty()
                                || partsManageData == null || partsManageData.isEmpty()) {
                        // インポートするパーツが存在しないか、管理情報がない場合は更新しようがないので何もしないで戻る.
@@ -290,7 +309,7 @@ public class ImportModel {
                }
 
                PartsInfoXMLReader xmlReader = new PartsInfoXMLReader();
-               
+
                PartsManageData mergedPartsManagedData;
                if (current != null && current.isValid()) {
                        // 現在のプロファイルからパーツ管理情報を取得する.
@@ -299,20 +318,20 @@ public class ImportModel {
                        // 新規の場合は空
                        mergedPartsManagedData = new PartsManageData();
                }
-               
+
                // インポート対象のパーツに該当するパーツ管理情報のみを取り出して追記する.
                for (PartsImageContent partsImageContent : partsImageContents) {
                        String partsName = partsImageContent.getPartsName();
                        for (CategoryLayerPair catLayerPair : partsImageContent.getCategoryLayerPairs()) {
                                PartsCategory partsCategory = catLayerPair.getPartsCategory();
                                String categoryId = partsCategory.getCategoryId();
-                               
+
                                PartsManageData.PartsKey partsKey = new PartsManageData.PartsKey(partsName, categoryId);
-                               
+
                                PartsAuthorInfo partsAuthorInfo = partsManageData.getPartsAuthorInfo(partsKey);
                                PartsManageData.PartsVersionInfo versionInfo = partsManageData.getVersion(partsKey);
                                String localizedName = partsManageData.getLocalizedName(partsKey);
-                               
+
                                if (partsAuthorInfo != null || versionInfo != null || localizedName != null) {
                                        // いずれかの情報の登録がある場合、パーツ管理情報として追記する.
                                        mergedPartsManagedData.putPartsInfo(partsKey, localizedName, partsAuthorInfo, versionInfo);