\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
\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
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
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
* それがなければ、アーカイブ上のどこかにある/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
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
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
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
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
return results;\r
}\r
\r
- protected URL getEmbeddedResourceURL(String schemaName) {\r
- return getResource(schemaName);\r
- }\r
-\r
/**\r
* XMLリソースファイルから、定義済みのキャラクターデータを生成して返す.<br>\r
* (現在のロケールの言語に対応するデータを取得し、なければ最初の言語で代替する.)<br>\r
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
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
* \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
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
\r
/**\r
* character.iniを読み取り、character.xmlを生成します.<br>\r
- * character.xmlのシリアライズされた中間ファイルも生成されます.<br>\r
* すでにcharacter.xmlがある場合は上書きされます.<br>\r
* 途中でエラーが発生した場合はcharacter.xmlは削除されます.<br>\r
* \r
* 読み取る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
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
/**\r
* お勧めリンクリストが設定されていない場合(nullの場合)、デフォルトのお勧めリストを設定する.<br>\r
* すでに設定されている場合(空を含む)は何もしない.<br>\r
+ * <br>\r
+ * おすすめリンクがサポートされてなかったころのデータは、おすすめリンク用のタグそのものが存在せずnullとなる.<br>\r
+ * サポート後のデータでリンクを未設定にしている場合は、空のリストとなる.<br>\r
+ * したがって、nullの場合のみ、おすすめリンクを補完する.<br>\r
* \r
* @param characterData\r
* キャラクターデータ\r
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
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
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
\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
\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
/**\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
}\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
\r
/**\r
* 新規または更新されたプロファイル、キャンセルされた場合はnull\r
+ * \r
* @return プロファイル\r
*/\r
public CharacterData getImportedCharacterData() {\r
\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
\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
\r
/**\r
* タブの抽象基底クラス.<br>\r
+ * \r
* @author seraphy\r
*/\r
abstract class ImportWizardCardPanel extends JPanel {\r
\r
/**\r
* ファイル選択パネル\r
+ * \r
* @author seraphy\r
*/\r
class ImportFileSelectPanel extends ImportWizardCardPanel {\r
private JRadioButton radioArchiveFile;\r
\r
/**\r
- * ファイル名入力ボックス \r
+ * ファイル名入力ボックス\r
*/\r
private JTextField txtArchiveFile;\r
\r
/**\r
* アーカイブファイルまたはディレクトリを選択状態とする.<br>\r
* nullの場合は選択を解除する.\r
- * @param dropFile アーカイブファイルまたはディレクトリ、もしくはnull\r
+ * \r
+ * @param dropFile\r
+ * アーカイブファイルまたはディレクトリ、もしくはnull\r
*/\r
public void setSelectFile(List<File> dropFiles) {\r
\r
\r
static {\r
COLUMN_NAMES = new String[] {\r
- "作者",\r
+"作者",\r
"URL",\r
};\r
COLUMN_WIDTHS = new int[] {\r
\r
/**\r
* ファイル選択パネル\r
+ * \r
* @author seraphy\r
*/\r
class ImportTypeSelectPanel extends ImportWizardCardPanel {\r
// 開いているか選択しているプロファイルが有効であれば更新可能\r
final boolean updatable = (current != null && current.isValid());\r
\r
- // 新規の場合でインポートもとが有効なキャラクターセットであれば作成可能 \r
+ // 新規の場合でインポートもとが有効なキャラクターセットであれば作成可能\r
final boolean creatable = (current == null && cd != null && cd.isValid());\r
\r
// 新規作成の場合はキャラクター定義名と作者名を更新可能とする\r
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
/**\r
* 説明として追加するドキュメント.<Br>\r
* これはユーザーが編集可能であり、ユーザー編集後の値が取得される.<br>\r
+ * \r
* @return 説明として追加するドキュメント\r
*/\r
public String getAdditionalDescription() {\r
\r
/**\r
* キャラクター定義名を取得する.\r
+ * \r
* @return キャラクター定義名\r
*/\r
public String getCharacterName() {\r
\r
/**\r
* 作者名を取得する.\r
+ * \r
* @return 作者名\r
*/\r
public String getAuthor() {\r
\r
/**\r
* パーツ選択パネル\r
+ * \r
* @author seraphy\r
*/\r
class ImportPartsSelectPanel extends ImportWizardCardPanel {\r
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
\r
/**\r
* 選択されたイメージコンテンツのコレクション.<br>\r
+ * \r
* @return 選択されたイメージコンテンツのコレクション、なければ空\r
*/\r
public Collection<PartsImageContent> getSelectedPartsImageContents() {\r
\r
/**\r
* すでにプロファイルに登録済みのパーツ識別子、および、これからインポートする予定の選択されたパーツ識別子のコレクション.<br>\r
+ * \r
* @return インポートされた、またはインポートするパーツ識別子のコレクション.なければ空.\r
*/\r
public Collection<PartsIdentifier> getImportedPartsIdentifiers() {\r
/**\r
* 同じパーツ名をもつイメージのコレクション.<br>\r
* パーツの各レイヤーの集合を想定する.<br>\r
+ * \r
* @author seraphy\r
*/\r
class ImportPartsImageSet extends AbstractCollection<PartsImageContent> {\r
\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
\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
\r
/**\r
* 選択されているパーツを構成するファイルのコレクションを返します.<br>\r
+ * \r
* @return パーツイメージコンテンツのコレクション、選択がなければ空\r
*/\r
public Collection<PartsImageContent> getSelectedPartsImageContents() {\r
* 選択されているパーツ識別子のコレクションを返します.<br>\r
* 返されるコレクションには同一のパーツ識別子が複数存在しないことが保証されます.<br>\r
* 一つも選択がない場合は空が返されます.<br>\r
+ * \r
* @return パーツ識別子のコレクション.<br>\r
*/\r
public Collection<PartsIdentifier> getSelectedPartsIdentifiers() {\r
/**\r
* 現在のプロファイルが所有している全パーツの識別子.<br>\r
* 現在のプロファイルがないか、まったく所有していなければ空.<br>\r
+ * \r
* @return 現在のプロファイルが所有するパーツの識別子のコレクション.(重複しない一意であることが保証される.)\r
*/\r
public Collection<PartsIdentifier> getCurrentProfilePartsIdentifers() {\r
\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
\r
/**\r
* プリセット選択パネル\r
+ * \r
* @author seraphy\r
*/\r
class ImportPresetSelectPanel extends ImportWizardCardPanel {\r
\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
\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
\r
/**\r
* 指定した行のパーツセットがデフォルトパーツセットであるか?\r
- * @param rowIndex 行インデックス\r
+ * \r
+ * @param rowIndex\r
+ * 行インデックス\r
* @return デフォルトパーツセットであればtrue、そうでなければfalse\r
*/\r
public boolean isDefaultPartsSet(int rowIndex) {\r
\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
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
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
}\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
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
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
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
}\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