OSDN Git Service

インポート時にキャラクターなんとか機のver2とver3のフォルダ構造を判別し、異なるものが混在する場合に警告を出せるようにした。
authorseraphy <seraphy@5b6e9025-a2e8-4882-b233-f889982098c5>
Wed, 9 Oct 2013 18:45:48 +0000 (18:45 +0000)
committerseraphy <seraphy@5b6e9025-a2e8-4882-b233-f889982098c5>
Wed, 9 Oct 2013 18:45:48 +0000 (18:45 +0000)
git-svn-id: https://svn.sourceforge.jp/svnroot/charactermanaj/trunk@68 5b6e9025-a2e8-4882-b233-f889982098c5

resources/languages/importwizdialog.xml
resources/languages/importwizdialog_ja.xml
resources/template/character3.xml
src/charactermanaj/model/io/AbstractCharacterDataArchiveFile.java
src/charactermanaj/model/io/CharacterDataDefaultProvider.java
src/charactermanaj/model/io/CharacterDataIniReader.java
src/charactermanaj/model/io/CharacterDataPersistent.java
src/charactermanaj/ui/ImportWizardDialog.java
src/charactermanaj/ui/ProfileEditDialog.java
src/charactermanaj/ui/ProfileListManager.java
src/charactermanaj/ui/SelectCharatersDirDialog.java

index df505b0..b321ec8 100644 (file)
@@ -31,8 +31,8 @@
        \r
        <entry key="noContents">No contents.</entry>\r
        <entry key="notFormalArchive">This is not a formal archive, but may be containing some picture.</entry>\r
-       <entry key="unmatchedProfileId">Profile ID mismatch.</entry>\r
-       <entry key="unmatchedProfileRev">Profile REV mismatch.</entry>\r
+       <entry key="unmatchedProfileId">Profile ID mismatch. id="{0}"</entry>\r
+       <entry key="unmatchedProfileRev">Profile REV mismatch. rev="{0}"</entry>\r
 \r
        <entry key="parts.title">Import parts</entry>\r
        <entry key="parts.btn.selectAll">select All</entry>\r
index 7e4b80e..e9e490b 100644 (file)
@@ -32,8 +32,8 @@
 \r
        <entry key="noContents">インポートできる内容がありません。</entry>\r
        <entry key="notFormalArchive">CharacterManaJのエクスポート形式と異なりますが、使用できる可能性のあるパーツがあります。</entry>\r
-       <entry key="unmatchedProfileId">プロファイルIDが一致しません。</entry>\r
-       <entry key="unmatchedProfileRev">プロファイルIDは一致しますが、リビジョンが一致しません。</entry>\r
+       <entry key="unmatchedProfileId">プロファイルIDが一致しません。 id="{0}"</entry>\r
+       <entry key="unmatchedProfileRev">プロファイルIDは一致しますが、リビジョンが一致しません。 rev="{0}"</entry>\r
 \r
        <entry key="parts.title">インポートするパーツ</entry>\r
        <entry key="parts.btn.selectAll">全て選択</entry>\r
index a136626..c0b44f5 100644 (file)
@@ -6,10 +6,10 @@
     xsi:schemaLocation="http://charactermanaj.sourceforge.jp/schema/charactermanaj character.xsd"\r
     version="1.0"\r
     id="default"\r
-    rev="default">\r
+    rev="default_v3">\r
 \r
-    <name xml:lang="en">Default</name>\r
-    <name xml:lang="ja">デフォルト</name>\r
+    <name xml:lang="en">Default(v3)</name>\r
+    <name xml:lang="ja">デフォルト(v3)</name>\r
 \r
     <information>\r
        <author xml:lang="en">Unknown</author>\r
index f9f795e..843a5b4 100644 (file)
@@ -27,6 +27,7 @@ import charactermanaj.model.CharacterData;
 import charactermanaj.model.Layer;\r
 import charactermanaj.model.PartsCategory;\r
 import charactermanaj.model.PartsManageData;\r
+import charactermanaj.model.io.CharacterDataDefaultProvider.DefaultCharacterDataVersion;\r
 \r
 public abstract class AbstractCharacterDataArchiveFile\r
                implements\r
@@ -382,6 +383,8 @@ public abstract class AbstractCharacterDataArchiveFile
         * それがなければ、アーカイブ上のどこかにある/character.iniを探して、もっとも短い場所にある1つを採用する.<br>\r
         * character.iniが何処にも存在しないか、読み取り時にエラーとなった場合はnullを返す.<br>\r
         * 「キャラクターなんとか機 v2.2」の設定ファイルを想定している.<br>\r
+        * ただし、character.iniの下にeye_colorフォルダがある場合は「ver3」とみなす。<br>\r
+        * (設定ファイルの形式はv2, v3の間で変わらず)\r
         * \r
         * @return キャラクター定義、もしくはnull\r
         */\r
@@ -389,16 +392,24 @@ public abstract class AbstractCharacterDataArchiveFile
                FileContent characterFile = null;\r
                characterFile = entries.get(rootPrefix\r
                                + CharacterDataPersistent.COMPATIBLE_CONFIG_NAME);\r
-               if (characterFile == null) {\r
-                       // どこかにあるcharacter.iniを探す\r
-                       ArrayList<String> characterInis = new ArrayList<String>();\r
-                       for (Map.Entry<String, FileContent> entry : entries.entrySet()) {\r
-                               String entryName = entry.getKey();\r
-                               if (entryName.endsWith("/"\r
-                                               + CharacterDataPersistent.COMPATIBLE_CONFIG_NAME)) {\r
-                                       characterInis.add(entryName);\r
-                               }\r
+\r
+               // どこかにあるcharacter.iniを探す\r
+               // および、eye_colorフォルダがあるか?(あればver3形式とみなす。)\r
+               boolean hasEyeColorFolder = false;\r
+               ArrayList<String> characterInis = new ArrayList<String>();\r
+               for (Map.Entry<String, FileContent> entry : entries.entrySet()) {\r
+                       String entryName = entry.getKey();\r
+                       if (entryName.endsWith("/"\r
+                                       + CharacterDataPersistent.COMPATIBLE_CONFIG_NAME)) {\r
+                               characterInis.add(entryName);\r
+                       }\r
+                       if (entryName.contains("/eye_color/")\r
+                                       || entryName.endsWith("/eye_color")) {\r
+                               hasEyeColorFolder = true;\r
                        }\r
+               }\r
+\r
+               if (characterFile == null) {\r
                        // もっとも短い名前のものを採用\r
                        Collections.sort(characterInis);\r
                        if (characterInis.size() > 0) {\r
@@ -410,13 +421,21 @@ public abstract class AbstractCharacterDataArchiveFile
                        return null;\r
                }\r
 \r
+               DefaultCharacterDataVersion version;\r
+               if (hasEyeColorFolder) {\r
+                       // "eye_color"フォルダがあればver3形式とみなす\r
+                       version = DefaultCharacterDataVersion.V3;\r
+               } else {\r
+                       version = DefaultCharacterDataVersion.V2;\r
+               }\r
+\r
                try {\r
                        // デフォルトのキャラクター定義を構築する.\r
                        CharacterData cd;\r
                        InputStream is = characterFile.openStream();\r
                        try {\r
                                CharacterDataIniReader iniReader = new CharacterDataIniReader();\r
-                               cd = iniReader.readCharacterDataFromIni(is);\r
+                               cd = iniReader.readCharacterDataFromIni(is, version);\r
                        } finally {\r
                                is.close();\r
                        }\r
index 2b124bb..f289f9e 100644 (file)
@@ -27,9 +27,14 @@ public class CharacterDataDefaultProvider extends ResourceLoader {
        public static final String DEFAULT_CHARACTER_PREFIX = "template/";\r
 \r
        /**\r
-        * デフォルトのキャラクターセット名\r
+        * デフォルトのキャラクターセット名(ver2)\r
         */\r
-       public static final String DEFAULT_CHARACTER_NAME = "character3.xml";\r
+       public static final String DEFAULT_CHARACTER_NAME_V2 = "character2.xml";\r
+\r
+       /**\r
+        * デフォルトのキャラクターセット名(ver3)\r
+        */\r
+       public static final String DEFAULT_CHARACTER_NAME_V3 = "character3.xml";\r
 \r
        /**\r
         * ロガー\r
@@ -37,22 +42,50 @@ public class CharacterDataDefaultProvider extends ResourceLoader {
        private static final Logger logger = Logger\r
                        .getLogger(CharacterDataDefaultProvider.class.getName());\r
 \r
+       public enum DefaultCharacterDataVersion {\r
+               V2() {\r
+                       public String getResourceName() {\r
+                               return DEFAULT_CHARACTER_NAME_V2;\r
+                       }\r
+               },\r
+               V3() {\r
+                       public String getResourceName() {\r
+                               return DEFAULT_CHARACTER_NAME_V3;\r
+                       }\r
+               };\r
+\r
+               public abstract String getResourceName();\r
+\r
+               public CharacterData create(CharacterDataDefaultProvider prov) {\r
+                       if (prov == null) {\r
+                               throw new IllegalArgumentException();\r
+                       }\r
+                       try {\r
+                               return prov.loadPredefinedCharacterData(getResourceName());\r
+\r
+                       } catch (IOException ex) {\r
+                               throw new RuntimeException(\r
+                                               "can not create the default profile from application's resource",\r
+                                               ex);\r
+                       }\r
+               }\r
+       }\r
+\r
        /**\r
         * デフォルトのキャラクター定義を生成して返す.<br>\r
         * 一度生成された場合はキャッシュされる.<br>\r
         * 生成されたキャラクター定義のdocBaseはnullであるため、docBaseをセットすること.<br>\r
         * \r
+        * @param version\r
+        *            デフォルトキャラクターセットのバージョン\r
         * @return キャラクター定義\r
         */\r
-       public synchronized CharacterData createDefaultCharacterData() {\r
-               try {\r
-                       return loadPredefinedCharacterData(DEFAULT_CHARACTER_NAME);\r
-\r
-               } catch (IOException ex) {\r
-                       throw new RuntimeException(\r
-                                       "can not create the default profile from application's resource",\r
-                                       ex);\r
+       public synchronized CharacterData createDefaultCharacterData(\r
+                       DefaultCharacterDataVersion version) {\r
+               if (version == null) {\r
+                       throw new IllegalArgumentException();\r
                }\r
+               return version.create(this);\r
        }\r
 \r
        /**\r
@@ -81,10 +114,6 @@ public class CharacterDataDefaultProvider extends ResourceLoader {
                return results;\r
        }\r
 \r
-       protected URL getEmbeddedResourceURL(String schemaName) {\r
-               return getResource(schemaName);\r
-       }\r
-\r
        /**\r
         * XMLリソースファイルから、定義済みのキャラクターデータを生成して返す.<br>\r
         * (現在のロケールの言語に対応するデータを取得し、なければ最初の言語で代替する.)<br>\r
@@ -99,7 +128,7 @@ public class CharacterDataDefaultProvider extends ResourceLoader {
                        throws IOException {\r
                CharacterData cd;\r
                String resKey = DEFAULT_CHARACTER_PREFIX + name;\r
-               URL predefinedCharacter = getEmbeddedResourceURL(resKey);\r
+               URL predefinedCharacter = getResource(resKey);\r
                if (predefinedCharacter == null) {\r
                        throw new FileNotFoundException(resKey);\r
                }\r
index ade1eef..e442175 100644 (file)
@@ -15,6 +15,7 @@ import charactermanaj.model.CharacterData;
 import charactermanaj.model.PartsCategory;\r
 import charactermanaj.model.PartsIdentifier;\r
 import charactermanaj.model.PartsSet;\r
+import charactermanaj.model.io.CharacterDataDefaultProvider.DefaultCharacterDataVersion;\r
 \r
 /**\r
  * character.iniファイルを読み込むためのクラス.\r
@@ -35,18 +36,21 @@ public class CharacterDataIniReader {
         * \r
         * @param is\r
         *            character.iniの入力ストリーム\r
+        * @param version\r
+        *            デフォルトキャラクターセットのバージョン\r
         * @return キャラクターデータ\r
         * @throws IOException\r
         *             読み取りに失敗した場合\r
         */\r
-       public CharacterData readCharacterDataFromIni(InputStream is)\r
+       public CharacterData readCharacterDataFromIni(InputStream is,\r
+                       DefaultCharacterDataVersion version)\r
                        throws IOException {\r
-               if (is == null) {\r
+               if (is == null || version == null) {\r
                        throw new IllegalArgumentException();\r
                }\r
 \r
                CharacterDataDefaultProvider defProv = new CharacterDataDefaultProvider();\r
-               CharacterData cd = defProv.createDefaultCharacterData();\r
+               CharacterData cd = defProv.createDefaultCharacterData(version);\r
 \r
                // イメージサイズ\r
                int siz_x = 0;\r
index 6031b19..5843933 100644 (file)
@@ -40,6 +40,7 @@ import charactermanaj.model.AppConfig;
 import charactermanaj.model.CharacterData;\r
 import charactermanaj.model.Layer;\r
 import charactermanaj.model.PartsCategory;\r
+import charactermanaj.model.io.CharacterDataDefaultProvider.DefaultCharacterDataVersion;\r
 import charactermanaj.ui.MainFrame;\r
 import charactermanaj.util.DirectoryConfig;\r
 import charactermanaj.util.FileNameNormalizer;\r
@@ -859,7 +860,6 @@ public class CharacterDataPersistent {
 \r
        /**\r
         * character.iniを読み取り、character.xmlを生成します.<br>\r
-        * character.xmlのシリアライズされた中間ファイルも生成されます.<br>\r
         * すでにcharacter.xmlがある場合は上書きされます.<br>\r
         * 途中でエラーが発生した場合はcharacter.xmlは削除されます.<br>\r
         * \r
@@ -867,12 +867,16 @@ public class CharacterDataPersistent {
         *            読み取るcharatcer.iniファイル\r
         * @param characterXmlFile\r
         *            書き込まれるcharacter.xmlファイル\r
+        * @param version\r
+        *            デフォルトキャラクターセットのバージョン\r
         * @throws IOException\r
         *             失敗した場合\r
         */\r
        public void convertFromCharacterIni(File characterIniFile,\r
-                       File characterXmlFile) throws IOException {\r
-               if (characterIniFile == null || characterXmlFile == null) {\r
+                       File characterXmlFile, DefaultCharacterDataVersion version)\r
+                       throws IOException {\r
+               if (characterIniFile == null || characterXmlFile == null\r
+                               || version == null) {\r
                        throw new IllegalArgumentException();\r
                }\r
 \r
@@ -881,7 +885,7 @@ public class CharacterDataPersistent {
                CharacterData characterData;\r
                try {\r
                        CharacterDataIniReader iniReader = new CharacterDataIniReader();\r
-                       characterData = iniReader.readCharacterDataFromIni(is);\r
+                       characterData = iniReader.readCharacterDataFromIni(is, version);\r
 \r
                } finally {\r
                        is.close();\r
@@ -923,6 +927,10 @@ public class CharacterDataPersistent {
        /**\r
         * お勧めリンクリストが設定されていない場合(nullの場合)、デフォルトのお勧めリストを設定する.<br>\r
         * すでに設定されている場合(空を含む)は何もしない.<br>\r
+        * <br>\r
+        * おすすめリンクがサポートされてなかったころのデータは、おすすめリンク用のタグそのものが存在せずnullとなる.<br>\r
+        * サポート後のデータでリンクを未設定にしている場合は、空のリストとなる.<br>\r
+        * したがって、nullの場合のみ、おすすめリンクを補完する.<br>\r
         * \r
         * @param characterData\r
         *            キャラクターデータ\r
@@ -936,9 +944,9 @@ public class CharacterDataPersistent {
                        return;\r
                }\r
                CharacterDataDefaultProvider defProv = new CharacterDataDefaultProvider();\r
-               CharacterData defaultCd = defProv.createDefaultCharacterData();\r
+               CharacterData defaultCd = defProv\r
+                               .createDefaultCharacterData(DefaultCharacterDataVersion.V3);\r
                characterData.setRecommendationURLList(defaultCd\r
                                .getRecommendationURLList());\r
        }\r
-\r
 }\r
index c2d7d45..9ead178 100644 (file)
@@ -28,6 +28,7 @@ import java.io.IOException;
 import java.io.Serializable;\r
 import java.net.URI;\r
 import java.sql.Timestamp;\r
+import java.text.MessageFormat;\r
 import java.util.AbstractCollection;\r
 import java.util.ArrayList;\r
 import java.util.Arrays;\r
@@ -89,9 +90,9 @@ import charactermanaj.model.PartsIdentifier;
 import charactermanaj.model.PartsManageData;\r
 import charactermanaj.model.PartsSet;\r
 import charactermanaj.model.PartsSpec;\r
-import charactermanaj.model.io.CharacterDataPersistent;\r
 import charactermanaj.model.io.AbstractCharacterDataArchiveFile.CategoryLayerPair;\r
 import charactermanaj.model.io.AbstractCharacterDataArchiveFile.PartsImageContent;\r
+import charactermanaj.model.io.CharacterDataPersistent;\r
 import charactermanaj.model.io.ImportModel;\r
 import charactermanaj.ui.model.AbstractTableModelWithComboBoxModel;\r
 import charactermanaj.ui.progress.ProgressHandle;\r
@@ -164,9 +165,13 @@ public class ImportWizardDialog extends JDialog {
        \r
        /**\r
         * プロファイルにパーツデータ・プリセットデータをインポートします.<br>\r
-        * @param parent 親フレーム\r
-        * @param current 更新対象となる現在のプロファイル(新規インポートの場合はnull)\r
-        * @param initFiles アーカイブファィルまたはディレクトリの初期選択、なければnullまたは空\r
+        * \r
+        * @param parent\r
+        *            親フレーム\r
+        * @param current\r
+        *            更新対象となる現在のプロファイル(新規インポートの場合はnull)\r
+        * @param initFiles\r
+        *            アーカイブファィルまたはディレクトリの初期選択、なければnullまたは空\r
         */\r
        public ImportWizardDialog(JFrame parent, CharacterData current, List<File> initFiles) {\r
                super(parent, true);\r
@@ -177,8 +182,11 @@ public class ImportWizardDialog extends JDialog {
        \r
        /**\r
         * プロファイルにパーツデータ・プリセットデータをインポートします.<br>\r
-        * @param parent 親ダイアログ\r
-        * @param current 選択していてるプロファイル、新規インポートの場合はnull\r
+        * \r
+        * @param parent\r
+        *            親ダイアログ\r
+        * @param current\r
+        *            選択していてるプロファイル、新規インポートの場合はnull\r
         */\r
        public ImportWizardDialog(JDialog parent, CharacterData current) {\r
                super(parent, true);\r
@@ -188,8 +196,11 @@ public class ImportWizardDialog extends JDialog {
        /**\r
         * ウィザードダイアログのコンポーネントを初期化します.<br>\r
         * currentがnullの場合は新規インポート、そうでない場合は更新インポートとります。\r
-        * @param parent 親コンテナ\r
-        * @param current インポート対象プロファイル、新規の場合はnull\r
+        * \r
+        * @param parent\r
+        *            親コンテナ\r
+        * @param current\r
+        *            インポート対象プロファイル、新規の場合はnull\r
         */\r
        private void initComponent(Component parent, CharacterData current) {\r
                this.current = current;\r
@@ -486,10 +497,10 @@ public class ImportWizardDialog extends JDialog {
        }\r
        \r
        /**\r
-        * ウィザードが閉じられた場合の終了コード.\r
-        * {@link #EXIT_PROFILE_UPDATED}であればプロファイルが更新されており,<br>\r
+        * ウィザードが閉じられた場合の終了コード. {@link #EXIT_PROFILE_UPDATED}であればプロファイルが更新されており,<br>\r
         * {@link #EXIT_PROFILE_CREATED}であればプロファイルが作成されている.<br>\r
         * {@link #EXIT_CANCELED}であればキャンセルされている.<br>\r
+        * \r
         * @return 終了コード\r
         */\r
        public int getExitCode() {\r
@@ -498,6 +509,7 @@ public class ImportWizardDialog extends JDialog {
        \r
        /**\r
         * 新規または更新されたプロファイル、キャンセルされた場合はnull\r
+        * \r
         * @return プロファイル\r
         */\r
        public CharacterData getImportedCharacterData() {\r
@@ -506,8 +518,10 @@ public class ImportWizardDialog extends JDialog {
        \r
        /**\r
         * アーカイブからの新規プロファイルの作成\r
+        * \r
         * @return 作成された新規プロファイル\r
-        * @throws IOException 失敗\r
+        * @throws IOException\r
+        *             失敗\r
         */\r
        protected CharacterData createNewProfile() throws IOException {\r
                CharacterData cd = importModel.getCharacterData();\r
@@ -563,8 +577,10 @@ public class ImportWizardDialog extends JDialog {
        \r
        /**\r
         * プロファイルの更新\r
+        * \r
         * @return 更新されたプロファイル\r
-        * @throws IOException 失敗\r
+        * @throws IOException\r
+        *             失敗\r
         */\r
        protected CharacterData updateProfile() throws IOException {\r
                if (current == null || !current.isValid()) {\r
@@ -650,6 +666,7 @@ public class ImportWizardDialog extends JDialog {
 \r
 /**\r
  * タブの抽象基底クラス.<br>\r
+ * \r
  * @author seraphy\r
  */\r
 abstract class ImportWizardCardPanel extends JPanel {\r
@@ -704,6 +721,7 @@ abstract class ImportWizardCardPanel extends JPanel {
 \r
 /**\r
  * ファイル選択パネル\r
+ * \r
  * @author seraphy\r
  */\r
 class ImportFileSelectPanel extends ImportWizardCardPanel {\r
@@ -725,7 +743,7 @@ class ImportFileSelectPanel extends ImportWizardCardPanel {
        private JRadioButton radioArchiveFile;\r
        \r
        /**\r
-        * ファイル名入力ボックス \r
+        * ファイル名入力ボックス\r
         */\r
        private JTextField txtArchiveFile;\r
        \r
@@ -912,7 +930,9 @@ class ImportFileSelectPanel extends ImportWizardCardPanel {
        /**\r
         * アーカイブファイルまたはディレクトリを選択状態とする.<br>\r
         * nullの場合は選択を解除する.\r
-        * @param dropFile アーカイブファイルまたはディレクトリ、もしくはnull\r
+        * \r
+        * @param dropFile\r
+        *            アーカイブファイルまたはディレクトリ、もしくはnull\r
         */\r
        public void setSelectFile(List<File> dropFiles) {\r
 \r
@@ -1118,7 +1138,7 @@ class URLTableModel extends AbstractTableModelWithComboBoxModel<URLTableRow> {
        \r
        static {\r
                COLUMN_NAMES = new String[] {\r
-                               "作者",\r
+"作者",\r
                                "URL",\r
                };\r
                COLUMN_WIDTHS = new int[] {\r
@@ -1205,6 +1225,7 @@ class URLTableModel extends AbstractTableModelWithComboBoxModel<URLTableRow> {
 \r
 /**\r
  * ファイル選択パネル\r
+ * \r
  * @author seraphy\r
  */\r
 class ImportTypeSelectPanel extends ImportWizardCardPanel {\r
@@ -1459,7 +1480,7 @@ class ImportTypeSelectPanel extends ImportWizardCardPanel {
                // 開いているか選択しているプロファイルが有効であれば更新可能\r
                final boolean updatable = (current != null && current.isValid());\r
 \r
-               // 新規の場合でインポートもとが有効なキャラクターセットであれば作成可能 \r
+               // 新規の場合でインポートもとが有効なキャラクターセットであれば作成可能\r
                final boolean creatable = (current == null && cd != null && cd.isValid());\r
                \r
                // 新規作成の場合はキャラクター定義名と作者名を更新可能とする\r
@@ -1553,10 +1574,17 @@ class ImportTypeSelectPanel extends ImportWizardCardPanel {
                        JOptionPane.showMessageDialog(this, strings.getProperty("notFormalArchive"));\r
                \r
                } else if (!matchID) {\r
-                       JOptionPane.showMessageDialog(this, strings.getProperty("unmatchedProfileId"));\r
+                       String fmt = strings.getProperty("unmatchedProfileId");\r
+                       String msg = MessageFormat.format(fmt,\r
+                                       cd.getId() == null ? "" : cd.getId());\r
+                       JOptionPane.showMessageDialog(this, msg);\r
                \r
                } else if (!matchREV) {\r
-                       JOptionPane.showMessageDialog(this, strings.getProperty("unmatchedProfileRev"));\r
+                       String fmt = strings.getProperty("unmatchedProfileRev");\r
+                       String msg = MessageFormat.format(fmt, cd.getRev() == null\r
+                                       ? ""\r
+                                       : cd.getRev());\r
+                       JOptionPane.showMessageDialog(this, msg);\r
                }\r
        }\r
        \r
@@ -1579,6 +1607,7 @@ class ImportTypeSelectPanel extends ImportWizardCardPanel {
        /**\r
         * 説明として追加するドキュメント.<Br>\r
         * これはユーザーが編集可能であり、ユーザー編集後の値が取得される.<br>\r
+        * \r
         * @return 説明として追加するドキュメント\r
         */\r
        public String getAdditionalDescription() {\r
@@ -1587,6 +1616,7 @@ class ImportTypeSelectPanel extends ImportWizardCardPanel {
        \r
        /**\r
         * キャラクター定義名を取得する.\r
+        * \r
         * @return キャラクター定義名\r
         */\r
        public String getCharacterName() {\r
@@ -1595,6 +1625,7 @@ class ImportTypeSelectPanel extends ImportWizardCardPanel {
        \r
        /**\r
         * 作者名を取得する.\r
+        * \r
         * @return 作者名\r
         */\r
        public String getAuthor() {\r
@@ -1640,6 +1671,7 @@ class ImportTypeSelectPanel extends ImportWizardCardPanel {
 \r
 /**\r
  * パーツ選択パネル\r
+ * \r
  * @author seraphy\r
  */\r
 class ImportPartsSelectPanel extends ImportWizardCardPanel {\r
@@ -1683,7 +1715,8 @@ class ImportPartsSelectPanel extends ImportWizardCardPanel {
                profileSizePanel = new JPanel();\r
                GridBagLayout profileSizePanelLayout = new GridBagLayout();\r
                profileSizePanel.setLayout(profileSizePanelLayout);\r
-               profileSizePanel.setBorder(BorderFactory.createTitledBorder("プロファイルのサイズ"));\r
+               profileSizePanel.setBorder(BorderFactory\r
+                               .createTitledBorder("プロファイルのサイズ"));\r
                \r
                GridBagConstraints gbc = new GridBagConstraints();\r
                \r
@@ -2049,6 +2082,7 @@ class ImportPartsSelectPanel extends ImportWizardCardPanel {
 \r
        /**\r
         * 選択されたイメージコンテンツのコレクション.<br>\r
+        * \r
         * @return 選択されたイメージコンテンツのコレクション、なければ空\r
         */\r
        public Collection<PartsImageContent> getSelectedPartsImageContents() {\r
@@ -2057,6 +2091,7 @@ class ImportPartsSelectPanel extends ImportWizardCardPanel {
        \r
        /**\r
         * すでにプロファイルに登録済みのパーツ識別子、および、これからインポートする予定の選択されたパーツ識別子のコレクション.<br>\r
+        * \r
         * @return インポートされた、またはインポートするパーツ識別子のコレクション.なければ空.\r
         */\r
        public Collection<PartsIdentifier> getImportedPartsIdentifiers() {\r
@@ -2076,6 +2111,7 @@ class ImportPartsSelectPanel extends ImportWizardCardPanel {
 /**\r
  * 同じパーツ名をもつイメージのコレクション.<br>\r
  * パーツの各レイヤーの集合を想定する.<br>\r
+ * \r
  * @author seraphy\r
  */\r
 class ImportPartsImageSet extends AbstractCollection<PartsImageContent> {\r
@@ -2241,11 +2277,17 @@ class ImportPartsModel {
 \r
        /**\r
         * 行モデルを構築する\r
-        * @param partsIdentifier パーツ識別子\r
-        * @param authorInfo 作者情報(なければnull)\r
-        * @param versionInfo バージョン情報(なければnull)\r
-        * @param imageSet イメージファイルのセット\r
-        * @param numOfLink カテゴリの参照カウント数(複数カテゴリに参照される場合は2以上となる)\r
+        * \r
+        * @param partsIdentifier\r
+        *            パーツ識別子\r
+        * @param authorInfo\r
+        *            作者情報(なければnull)\r
+        * @param versionInfo\r
+        *            バージョン情報(なければnull)\r
+        * @param imageSet\r
+        *            イメージファイルのセット\r
+        * @param numOfLink\r
+        *            カテゴリの参照カウント数(複数カテゴリに参照される場合は2以上となる)\r
         */\r
        public ImportPartsModel(PartsIdentifier partsIdentifier,\r
                        PartsAuthorInfo authorInfo,\r
@@ -2407,8 +2449,11 @@ class ImportPartsTableModel extends AbstractTableModelWithComboBoxModel<ImportPa
 \r
        /**\r
         * モデルを初期化する.<br>\r
-        * @param partsImageContents インポートもとアーカイブに含まれる、全パーツイメージコンテンツ\r
-        * @param currentProfile インポート先のプロファイル、現在プロファイルが既に持っているパーツを取得するためのもの。\r
+        * \r
+        * @param partsImageContents\r
+        *            インポートもとアーカイブに含まれる、全パーツイメージコンテンツ\r
+        * @param currentProfile\r
+        *            インポート先のプロファイル、現在プロファイルが既に持っているパーツを取得するためのもの。\r
         */\r
        public void initModel(Collection<PartsImageContent> partsImageContents, PartsManageData partsManageData, CharacterData currentProfile) {\r
                clear();\r
@@ -2511,6 +2556,7 @@ class ImportPartsTableModel extends AbstractTableModelWithComboBoxModel<ImportPa
        \r
        /**\r
         * 選択されているパーツを構成するファイルのコレクションを返します.<br>\r
+        * \r
         * @return パーツイメージコンテンツのコレクション、選択がなければ空\r
         */\r
        public Collection<PartsImageContent> getSelectedPartsImageContents() {\r
@@ -2535,6 +2581,7 @@ class ImportPartsTableModel extends AbstractTableModelWithComboBoxModel<ImportPa
         * 選択されているパーツ識別子のコレクションを返します.<br>\r
         * 返されるコレクションには同一のパーツ識別子が複数存在しないことが保証されます.<br>\r
         * 一つも選択がない場合は空が返されます.<br>\r
+        * \r
         * @return パーツ識別子のコレクション.<br>\r
         */\r
        public Collection<PartsIdentifier> getSelectedPartsIdentifiers() {\r
@@ -2550,6 +2597,7 @@ class ImportPartsTableModel extends AbstractTableModelWithComboBoxModel<ImportPa
        /**\r
         * 現在のプロファイルが所有している全パーツの識別子.<br>\r
         * 現在のプロファイルがないか、まったく所有していなければ空.<br>\r
+        * \r
         * @return 現在のプロファイルが所有するパーツの識別子のコレクション.(重複しない一意であることが保証される.)\r
         */\r
        public Collection<PartsIdentifier> getCurrentProfilePartsIdentifers() {\r
@@ -2740,7 +2788,9 @@ class ImportPartsTableModel extends AbstractTableModelWithComboBoxModel<ImportPa
 \r
        /**\r
         * 指定したパーツ識別子をチェック状態にする.\r
-        * @param partsIdentifiers パーツ識別子のコレクション、nullの場合は何もしない.\r
+        * \r
+        * @param partsIdentifiers\r
+        *            パーツ識別子のコレクション、nullの場合は何もしない.\r
         */\r
        public void selectByPartsIdentifiers(Collection<PartsIdentifier> partsIdentifiers) {\r
                boolean modified = false;\r
@@ -2778,6 +2828,7 @@ class ImportPartsTableModel extends AbstractTableModelWithComboBoxModel<ImportPa
 \r
 /**\r
  * プリセット選択パネル\r
+ * \r
  * @author seraphy\r
  */\r
 class ImportPresetSelectPanel extends ImportWizardCardPanel {\r
@@ -3019,10 +3070,10 @@ class ImportPresetSelectPanel extends ImportWizardCardPanel {
        \r
        /**\r
         * デフォルトのパーツセットIDとして使用されることが推奨されるパーツセットIDを取得する.<br>\r
-        * 明示的なデフォルトのパーツセットIDがなければ、もしくは、\r
-        * 明示的に指定されているパーツセットIDが選択されているパーツセットの中になければ、\r
+        * 明示的なデフォルトのパーツセットIDがなければ、もしくは、 明示的に指定されているパーツセットIDが選択されているパーツセットの中になければ、\r
         * 選択されているパーツセットの最初のアイテムを返す.<br>\r
         * 選択しているパーツセットが一つもなければnullを返す.<br>\r
+        * \r
         * @return デフォルトのパーツセット\r
         */\r
        public String getPrefferedDefaultPartsSetId() {\r
@@ -3128,7 +3179,8 @@ class ImportPresetTableModel extends AbstractTableModelWithComboBoxModel<ImportP
 \r
        private static final long serialVersionUID = 1L;\r
 \r
-       private static final String[] COLUMN_NAMES; // = {"選択", "プリセット名", "不足するパーツ"};\r
+       private static final String[] COLUMN_NAMES; // = {"選択", "プリセット名",\r
+                                                                                               // "不足するパーツ"};\r
        \r
        private static final int[] COLUMN_WIDTHS; // = {50, 100, 200};\r
        \r
@@ -3234,7 +3286,9 @@ class ImportPresetTableModel extends AbstractTableModelWithComboBoxModel<ImportP
 \r
        /**\r
         * 指定した行のパーツセットがデフォルトパーツセットであるか?\r
-        * @param rowIndex 行インデックス\r
+        * \r
+        * @param rowIndex\r
+        *            行インデックス\r
         * @return デフォルトパーツセットであればtrue、そうでなければfalse\r
         */\r
        public boolean isDefaultPartsSet(int rowIndex) {\r
@@ -3251,9 +3305,13 @@ class ImportPresetTableModel extends AbstractTableModelWithComboBoxModel<ImportP
        \r
        /**\r
         * パーツセットリストを構築する.<br>\r
-        * @param partsSets 登録するパーツセット\r
-        * @param defaultPartsSetId デフォルトのパーツセットID、なければnull\r
-        * @param presetImportTarget インポート先、新規の場合はnull (上書き判定のため)\r
+        * \r
+        * @param partsSets\r
+        *            登録するパーツセット\r
+        * @param defaultPartsSetId\r
+        *            デフォルトのパーツセットID、なければnull\r
+        * @param presetImportTarget\r
+        *            インポート先、新規の場合はnull (上書き判定のため)\r
         */\r
        public void initModel(Collection<PartsSet> partsSets, String defaultPartsSetId, CharacterData presetImportTarget) {\r
                clear();\r
index 1038202..a447483 100644 (file)
@@ -73,6 +73,7 @@ import charactermanaj.model.PartsIdentifier;
 import charactermanaj.model.PartsSet;\r
 import charactermanaj.model.RecommendationURL;\r
 import charactermanaj.model.io.CharacterDataDefaultProvider;\r
+import charactermanaj.model.io.CharacterDataDefaultProvider.DefaultCharacterDataVersion;\r
 import charactermanaj.model.io.CharacterDataPersistent;\r
 import charactermanaj.ui.model.AbstractTableModelWithComboBoxModel;\r
 import charactermanaj.util.DesktopUtilities;\r
@@ -1181,7 +1182,8 @@ public class ProfileEditDialog extends JDialog {
                if (recommendationURLList == null) {\r
                        // キャラクターデータのお勧めリンクがnull(古い形式)の場合は、デフォルトのお勧めリンクで代替する.\r
                        CharacterDataDefaultProvider defProv = new CharacterDataDefaultProvider();\r
-                       CharacterData defaultCd = defProv.createDefaultCharacterData();\r
+                       CharacterData defaultCd = defProv\r
+                                       .createDefaultCharacterData(DefaultCharacterDataVersion.V3);\r
                        recommendationURLList = defaultCd.getRecommendationURLList();\r
                }\r
                if (recommendationURLList != null) {\r
@@ -1426,7 +1428,8 @@ public class ProfileEditDialog extends JDialog {
                        }\r
                }\r
                CharacterDataDefaultProvider defProv = new CharacterDataDefaultProvider();\r
-               CharacterData defaultCd = defProv.createDefaultCharacterData();\r
+               CharacterData defaultCd = defProv\r
+                               .createDefaultCharacterData(DefaultCharacterDataVersion.V3);\r
                List<RecommendationURL> defaultRecommendationURLList = defaultCd.getRecommendationURLList();\r
                if (defaultRecommendationURLList != null && defaultRecommendationURLList.equals(recommendationURLList)) {\r
                        // デフォルトのお勧めリストと内容が同じの場合は、明示的にリストを設定しない.\r
index ba382a3..c13c61a 100644 (file)
@@ -17,6 +17,7 @@ import javax.swing.JFrame;
 import charactermanaj.model.CharacterData;\r
 import charactermanaj.model.PartsManageData;\r
 import charactermanaj.model.io.CharacterDataDefaultProvider;\r
+import charactermanaj.model.io.CharacterDataDefaultProvider.DefaultCharacterDataVersion;\r
 import charactermanaj.model.io.CharacterDataPersistent;\r
 import charactermanaj.model.io.CharacterDataPersistent.ListProfileCallback;\r
 import charactermanaj.model.io.CharacterDataPersistent.ProfileListErrorHandler;\r
@@ -366,7 +367,8 @@ public final class ProfileListManager {
                        logger.info("オープンできるプロファイルがないため、新規プロファイルを作成します。");\r
                        try {\r
                                CharacterDataDefaultProvider defProv = new CharacterDataDefaultProvider();\r
-                               characterData = defProv.createDefaultCharacterData();\r
+                               characterData = defProv\r
+                                               .createDefaultCharacterData(DefaultCharacterDataVersion.V3);\r
                                persistent.createProfile(characterData);\r
 \r
                        } catch (IOException ex) {\r
index e060edf..5534844 100644 (file)
@@ -38,6 +38,7 @@ import javax.swing.JRootPane;
 import javax.swing.KeyStroke;\r
 \r
 import charactermanaj.Main;\r
+import charactermanaj.model.io.CharacterDataDefaultProvider.DefaultCharacterDataVersion;\r
 import charactermanaj.model.io.CharacterDataPersistent;\r
 import charactermanaj.ui.util.FileDropTarget;\r
 import charactermanaj.util.ErrorMessageHelper;\r
@@ -353,13 +354,30 @@ public class SelectCharatersDirDialog extends JDialog {
                        }\r
                        File characterXmlFile = new File(dir, CharacterDataPersistent.CONFIG_FILE);\r
                        if (characterXmlFile.exists()) {\r
-                               // すでにキャラクター定義XMLが存在する.\r
+                               // すでにキャラクター定義XMLが存在する場合はスキップする.\r
                                continue;\r
                        }\r
+\r
                        File characterIniFile = new File(dir, CharacterDataPersistent.COMPATIBLE_CONFIG_NAME);\r
                        if (characterIniFile.exists() && characterIniFile.canWrite() && dir.canWrite()) {\r
+                               // character.iniが存在し、書き込み可能であれば、それをcharacter.xmlに変換する.\r
+\r
+                               // eye_colorフォルダがあるか?\r
+                               File eyeColorFolder = new File(dir, "eye_color");\r
+                               boolean hasEyeColorFolder = eyeColorFolder.exists()\r
+                                               && eyeColorFolder.isDirectory();\r
+\r
+                               DefaultCharacterDataVersion version;\r
+                               if (hasEyeColorFolder) {\r
+                                       // eye_colorフォルダがあればver3形式とみなす.\r
+                                       version = DefaultCharacterDataVersion.V3;\r
+                               } else {\r
+                                       version = DefaultCharacterDataVersion.V2;\r
+                               }\r
+\r
                                try {\r
-                                       persist.convertFromCharacterIni(characterIniFile, characterXmlFile);\r
+                                       persist.convertFromCharacterIni(characterIniFile,\r
+                                                       characterXmlFile, version);\r
 \r
                                } catch (Exception ex) {\r
                                        logger.log(Level.WARNING, "character.xmlの生成に失敗しました。:"\r