From: seraphy Date: Sun, 31 Mar 2019 13:54:56 +0000 (+0900) Subject: キャラクターデータの初回インボード時に必ず失敗していた問題の修正 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=e45260e3aee145c1f734da5f9da61fa69a2dfe30;hp=f82e10e8dcf6c98e95d4d9a563405a660c04f10e;p=charactermanaj%2FCharacterManaJ.git キャラクターデータの初回インボード時に必ず失敗していた問題の修正 --- diff --git a/src/main/java/charactermanaj/model/io/CharacterDataDefaultProvider.java b/src/main/java/charactermanaj/model/io/CharacterDataDefaultProvider.java index ce0b8c8..f58b266 100644 --- a/src/main/java/charactermanaj/model/io/CharacterDataDefaultProvider.java +++ b/src/main/java/charactermanaj/model/io/CharacterDataDefaultProvider.java @@ -100,7 +100,7 @@ public class CharacterDataDefaultProvider { cd = prov.loadPredefinedCharacterData(reskey); cache = new SoftReference(cd); } - return cd; + return cd.duplicateBasicInfo(); } catch (IOException ex) { throw new RuntimeException( diff --git a/src/main/java/charactermanaj/model/io/CharacterDataIniReader.java b/src/main/java/charactermanaj/model/io/CharacterDataIniReader.java index 0ac5b16..dc2ba4a 100644 --- a/src/main/java/charactermanaj/model/io/CharacterDataIniReader.java +++ b/src/main/java/charactermanaj/model/io/CharacterDataIniReader.java @@ -19,7 +19,7 @@ import charactermanaj.model.io.CharacterDataDefaultProvider.DefaultCharacterData /** * character.iniファイルを読み込むためのクラス. - * + * * @author seraphy */ public class CharacterDataIniReader { @@ -33,7 +33,7 @@ public class CharacterDataIniReader { /** * character.iniファイルから、キャラクター定義を生成します.
* docBaseは設定されていないため、戻り値に設定する必要があります.
- * + * * @param is * character.iniの入力ストリーム * @param version diff --git a/src/main/java/charactermanaj/ui/ImportWizardDialog.java b/src/main/java/charactermanaj/ui/ImportWizardDialog.java index 6fe34b6..334c880 100644 --- a/src/main/java/charactermanaj/ui/ImportWizardDialog.java +++ b/src/main/java/charactermanaj/ui/ImportWizardDialog.java @@ -145,7 +145,7 @@ public class ImportWizardDialog extends JDialog { * 現在表示中もしくは選択中のプロファイル.
* 新規の場合はnull */ - protected CharacterData current; + private final CharacterData targetCd; private CardLayout mainPanelLayout; @@ -179,7 +179,14 @@ public class ImportWizardDialog extends JDialog { */ public ImportWizardDialog(JFrame parent, CharacterData current) { super(parent, true); - initComponent(parent, current); + this.targetCd = current; + if (targetCd != null && !targetCd.getDocBase().getScheme().equals("file")) { + throw new IllegalArgumentException("ファイルベース以外のキャラクターデータにインポートできません"); + } + if (targetCd != null && !targetCd.isValid()) { + throw new IllegalArgumentException("妥当でないキャラクターデータにはインポートできません"); + } + initComponent(); } /** @@ -192,7 +199,25 @@ public class ImportWizardDialog extends JDialog { */ public ImportWizardDialog(JDialog parent, CharacterData current) { super(parent, true); - initComponent(parent, current); + this.targetCd = current; + if (targetCd != null && !targetCd.getDocBase().getScheme().equals("file")) { + throw new IllegalArgumentException("ファイルベース以外のキャラクターデータにインポートできません"); + } + if (targetCd != null && !targetCd.isValid()) { + throw new IllegalArgumentException("妥当でないキャラクターデータにはインポートできません"); + } + initComponent(); + } + + /** + * インポート先のキャラクターデータを返す。新規の場合はnull + * @return インポート先、新規の場合はnull + */ + public CharacterData getTargetCharacterData() { + if (targetCd != null && !targetCd.getDocBase().getScheme().equals("file")) { + throw new IllegalStateException("ファイルベース以外のキャラクターデータにインポートできません: " + targetCd); + } + return targetCd; } /** @@ -210,14 +235,8 @@ public class ImportWizardDialog extends JDialog { /** * ウィザードダイアログのコンポーネントを初期化します.
* currentがnullの場合は新規インポート、そうでない場合は更新インポートとります。 - * - * @param parent - * 親コンテナ - * @param current - * インポート対象プロファイル、新規の場合はnull */ - private void initComponent(Component parent, CharacterData current) { - this.current = current; + private void initComponent() { setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE); addWindowListener(new WindowAdapter() { @@ -231,7 +250,7 @@ public class ImportWizardDialog extends JDialog { .getLocalizedProperties(STRINGS_RESOURCE); // タイトル - if (current == null) { + if (targetCd == null) { setTitle(strings.getProperty("title.new")); } else { setTitle(strings.getProperty("title.update")); @@ -397,7 +416,7 @@ public class ImportWizardDialog extends JDialog { // HiDpi環境でのスケールを考慮したウィンドウサイズに補正する dim = scaleSupport.manualScaled(dim); setSize(dim); - setLocationRelativeTo(parent); + setLocationRelativeTo(getParent()); mainPanelLayout.first(mainPanel); updateBtnPanelState(); @@ -486,13 +505,13 @@ public class ImportWizardDialog extends JDialog { int exitCode; CharacterData importedCharacterData; try { - if (current == null) { + if (targetCd == null) { // 新規作成 importedCharacterData = createNewProfile(); exitCode = EXIT_PROFILE_CREATED; } else { // 更新 - importedCharacterData = updateProfile(); + importedCharacterData = updateProfile(targetCd.duplicateBasicInfo()); exitCode = EXIT_PROFILE_UPDATED; } } finally { @@ -604,15 +623,9 @@ public class ImportWizardDialog extends JDialog { * @throws IOException * 失敗 */ - protected CharacterData updateProfile() throws IOException { - if (current == null || !current.isValid()) { - throw new IllegalStateException("current profile is not valid. :" + current); - } - + protected CharacterData updateProfile(CharacterData characterData) throws IOException { CharacterDataPersistent persist = CharacterDataPersistent.getInstance(); - CharacterData characterData = current.duplicateBasicInfo(); // 現在のもの。(インポートしたものではない) - boolean imported = false; boolean modCharacterDef = false; boolean modFavories = false; @@ -673,7 +686,7 @@ public class ImportWizardDialog extends JDialog { // キャラクター定義の更新 if (modCharacterDef) { persist.updateProfile(characterData); // キャラクター定義の構造に変化なし - current.setDescription(characterData.getDescription()); + targetCd.setDescription(characterData.getDescription()); // 現在保持しているCdの説明文は更新しておく(念のため) } // お気に入りの更新 if (modFavories) { @@ -1172,7 +1185,7 @@ class ImportFileSelectPanel extends ImportWizardCardPanel { } try { - parent.importModel.openImportSource(importArchive, parent.current); + parent.importModel.openImportSource(importArchive, parent.getTargetCharacterData()); // ワーカースレッドでアーカイブの読み込みを行う. Worker worker = new Worker() { @@ -1635,7 +1648,7 @@ class ImportTypeSelectPanel extends ImportWizardCardPanel { .getLocalizedProperties(ImportWizardDialog.STRINGS_RESOURCE); // 呼び出しもと情報 - CharacterData current = parent.current; + CharacterData current = parent.getTargetCharacterData(); // キャラクター定義情報 CharacterData cd = parent.importModel.getCharacterData(); @@ -1818,7 +1831,7 @@ class ImportTypeSelectPanel extends ImportWizardCardPanel { @Override public boolean isReadyFinish() { if (!isImportPartsImages() && !isImportPreset()) { - if ((parent != null && parent.current == null) + if ((parent != null && parent.getTargetCharacterData() == null) || isImportSampleImage()) { // 新規プロファイル作成か、サンプルイメージの更新のみで // イメージもパーツセットもいらなければ、ただちに作成可能. @@ -2123,13 +2136,14 @@ class ImportPartsSelectPanel extends ImportWizardCardPanel { // インポート対象のプロファイルサイズ CharacterData characterData; - if (parent.current == null) { + if (parent.getTargetCharacterData() == null) { // 新規インポート characterData = parent.importModel.getCharacterData(); } else { // 更新インポート - characterData = parent.current; + characterData = parent.getTargetCharacterData(); } + int profileWidth = 0; int profileHeight = 0; if (characterData != null) { @@ -2155,7 +2169,7 @@ class ImportPartsSelectPanel extends ImportWizardCardPanel { actSort.setEnabled(enabled); actSortByTimestamp.setEnabled(enabled); - CharacterData currentProfile = parent.current; + CharacterData currentProfile = parent.getTargetCharacterData(); Collection partsImageContents = parent.importModel.getPartsImageContents(); PartsManageData partsManageData = parent.importModel.getPartsManageData(); partsTableModel.initModel(partsImageContents, partsManageData, currentProfile); @@ -2169,11 +2183,10 @@ class ImportPartsSelectPanel extends ImportWizardCardPanel { } } - String defaultPartsSetId; - CharacterData presetImportTarget; - boolean selectAllPreset; - if (parent.current == null) { - presetImportTarget = null; + final String defaultPartsSetId; + final CharacterData presetImportTarget = parent.getTargetCharacterData(); + final boolean selectAllPreset; + if (presetImportTarget == null) { // 新規の場合 CharacterData cd = parent.importModel.getCharacterData(); if (cd != null) { defaultPartsSetId = cd.getDefaultPartsSetId(); @@ -2182,9 +2195,8 @@ class ImportPartsSelectPanel extends ImportWizardCardPanel { } selectAllPreset = true; // 新規プロファイルの場合はプリセットをインポートする } else { - presetImportTarget = parent.current; defaultPartsSetId = null; // 既存の場合はデフォルトのパーツセットであるかは表示する必要ないのでnullにする. - selectAllPreset = (parent.current.getPartsCount() == 0); // パーツが空の場合はプリセットをインポートする + selectAllPreset = (presetImportTarget.getPartsCount() == 0); // パーツが空の場合はプリセットをインポートする } parent.importPresetSelectPanel.initModel(partsSets, defaultPartsSetId, presetImportTarget, selectAllPreset); diff --git a/src/main/java/charactermanaj/ui/ProfileListManager.java b/src/main/java/charactermanaj/ui/ProfileListManager.java index fd762bb..f568eba 100644 --- a/src/main/java/charactermanaj/ui/ProfileListManager.java +++ b/src/main/java/charactermanaj/ui/ProfileListManager.java @@ -379,7 +379,7 @@ public final class ProfileListManager { logger.info("オープンできるプロファイルがないため、新規プロファイルを作成します。"); try { CharacterDataDefaultProvider defProv = new CharacterDataDefaultProvider(); - characterData = defProv.createDefaultCharacterData(DefaultCharacterDataVersion.V3); + characterData = defProv.createDefaultCharacterData(DefaultCharacterDataVersion.V3).duplicateBasicInfo(); Map> customLayerPatterns = defProv.createDefaultCustomLayerOrderMap(characterData, DefaultCharacterDataVersion.V3); persistent.createProfile(characterData, customLayerPatterns);