OSDN Git Service

ver0.995 release
authorseraphy <seraphy@5b6e9025-a2e8-4882-b233-f889982098c5>
Sat, 4 Jan 2014 23:11:40 +0000 (23:11 +0000)
committerseraphy <seraphy@5b6e9025-a2e8-4882-b233-f889982098c5>
Sat, 4 Jan 2014 23:11:40 +0000 (23:11 +0000)
git-svn-id: https://svn.sourceforge.jp/svnroot/charactermanaj/trunk@93 5b6e9025-a2e8-4882-b233-f889982098c5

17 files changed:
dist/CharacterManaJ 0.991.dmg [deleted file]
dist/CharacterManaJ.app/Contents/Resources/Java/CharacterManaJ.jar
dist/CharacterManaJ.jar
dist/charactermanaj.exe
dist/charactermanaj.l4j.ini
dist/java7mac/CharacterManaJ.app/Contents/Java/CharacterManaJ.jar
launch4j.xml
resources/appinfo/about.html
resources/appinfo/about_ja.html
resources/version.properties
src/charactermanaj/Main.java
src/charactermanaj/model/CharacterDataChangeEvent.java [new file with mode: 0644]
src/charactermanaj/model/CharacterDataChangeListener.java [new file with mode: 0644]
src/charactermanaj/model/CharacterDataChangeObserver.java [new file with mode: 0644]
src/charactermanaj/ui/MainFrame.java
src/charactermanaj/ui/ManageFavoriteDialog.java
src/charactermanaj/ui/ProfileSelectorDialog.java

diff --git a/dist/CharacterManaJ 0.991.dmg b/dist/CharacterManaJ 0.991.dmg
deleted file mode 100644 (file)
index c1b4085..0000000
Binary files a/dist/CharacterManaJ 0.991.dmg and /dev/null differ
index 2295ec7..8d3d882 100755 (executable)
Binary files a/dist/CharacterManaJ.app/Contents/Resources/Java/CharacterManaJ.jar and b/dist/CharacterManaJ.app/Contents/Resources/Java/CharacterManaJ.jar differ
index 2295ec7..8d3d882 100755 (executable)
Binary files a/dist/CharacterManaJ.jar and b/dist/CharacterManaJ.jar differ
index 403ace1..ea394a4 100644 (file)
Binary files a/dist/charactermanaj.exe and b/dist/charactermanaj.exe differ
index da02def..bcbb63f 100644 (file)
@@ -1,4 +1,4 @@
 -Xms64m\r
 -Xmx128m\r
--DcharactersDir=%EXEDIR%\characters\r
--DappConfigFile=%EXEDIR%\appConfig.xml\r
+"-DcharactersDir=%EXEDIR%\characters"\r
+"-DappConfigFile=%EXEDIR%\appConfig.xml"\r
index 2295ec7..8d3d882 100755 (executable)
Binary files a/dist/java7mac/CharacterManaJ.app/Contents/Java/CharacterManaJ.jar and b/dist/java7mac/CharacterManaJ.app/Contents/Java/CharacterManaJ.jar differ
index f4d0ca4..d99e8d8 100644 (file)
@@ -1,8 +1,8 @@
 <launch4jConfig>
   <dontWrapJar>false</dontWrapJar>
   <headerType>gui</headerType>
-  <jar>dist/CharacterManaJ.jar</jar>
-  <outfile>dist/charactermanaj.exe</outfile>
+  <jar>dist\CharacterManaJ.jar</jar>
+  <outfile>dist\charactermanaj.exe</outfile>
   <errTitle></errTitle>
   <cmdLine></cmdLine>
   <chdir></chdir>
     <initialHeapSize>64</initialHeapSize>
     <maxHeapSize>128</maxHeapSize>
   </jre>
+  <versionInfo>
+    <fileVersion>0.9.9.5</fileVersion>
+    <txtFileVersion>0.995</txtFileVersion>
+    <fileDescription>CharacterManaJ</fileDescription>
+    <copyright>http://sourceforge.jp/projects/charactermanaj/</copyright>
+    <productVersion>0.9.9.5</productVersion>
+    <txtProductVersion>0.995</txtProductVersion>
+    <productName>CharacterManaJ</productName>
+    <companyName>seraphy@users.sourceforge.jp</companyName>
+    <internalName>CharacterManaJ</internalName>
+    <originalFilename>charactermanaj.exe</originalFilename>
+  </versionInfo>
 </launch4jConfig>
\ No newline at end of file
index a11f13c..a733bef 100644 (file)
@@ -27,9 +27,11 @@ h2 {
                        <li>10.5 Leopard (Intel) JavaSE6</li>\r
                        <li>10.6 Snow Leopard (Intel) JavaSE6</li>\r
                        <li>10.7 Lion (Intel) JavaSE6 (Java for Mac OS X 10.7 is required.)</li>\r
-                       <li>10.7 Lion (Intel) Java7 (Oracle, Java7u17 or later)</li>\r
-                       <li>10.8 Mountain Lion (Intel) JavaSE6 (Java for Mac OS X 10.7 is required.)</li>\r
-                       <li>10.8 Mountain Lion (Intel) Java7 (Oracle, java7u17 or later)</li>\r
+                       <li>10.7 Lion (Intel) Java7 (Oracle, Java7u45 or later)</li>\r
+                       <li>10.8 Mountain Lion (Intel) JavaSE6u65 or later (Java for OS X 2013-005 is required.)</li>\r
+                       <li>10.8 Mountain Lion (Intel) Java7 (Oracle, java7u45 or later)</li>\r
+                       <li>10.9 Marvericks (Intel) JavaSE6u65 or later (Java for OS X 2013-005 is required.)</li>\r
+                       <li>10.9 Marvericks (Intel) Java7 (Oracle, java7u45 or later)</li>\r
                </ul>\r
        </li>\r
        <li>Microsoft Windows\r
@@ -37,8 +39,9 @@ h2 {
                        <li>Windows 2000 SP4 (32Bit) JavaSE6 (<font color="red">Japanese Only</font>)</li>\r
                        <li>Windows XP SP2 or later (32Bit) JavaSE6</li>\r
                        <li>Windows Vista SP1 or later (32/64Bit) JavaSE6</li>\r
-                       <li>Windows 7 (32/64Bit) JavaSE6, Java7u10 or later</li>\r
-                       <li>Windows 8 (32/64Bit) JavaSE6, Java7u10 or later</li>\r
+                       <li>Windows 7 (32/64Bit) JavaSE6, Java7u45 or later</li>\r
+                       <li>Windows 8 (32/64Bit) JavaSE6, Java7u45 or later</li>\r
+                       <li>Windows 8.1 (32/64Bit) JavaSE6, Java7u45 or later</li>\r
                </ul>\r
                <span style="color: red; font-weight: bold;">Installation of language support of East Asia is indispensable.</span><br>\r
                (Control Panel / Regional and Language Options / Language Tab / Install files for East Asian languages)\r
index 135a46a..65bbcb4 100644 (file)
@@ -61,9 +61,11 @@ h2 {
                        <li>10.5 Leopard (Intel) JavaSE6</li>\r
                        <li>10.6 Snow Leopard (Intel) JavaSE6</li>\r
                        <li>10.7 Lion (Intel) JavaSE6 (Java for Mac OS X 10.7 is required.)</li>\r
-                       <li>10.7 Lion (Intel) Java7 (Oracle, Java7u17 or later)</li>\r
-                       <li>10.8 Mountain Lion (Intel) JavaSE6 (Java for Mac OS X 10.7 is required.)</li>\r
-                       <li>10.8 Mountain Lion (Intel) Java7 (Oracle, java7u17 or later)</li>\r
+                       <li>10.7 Lion (Intel) Java7 (Oracle, Java7u45 or later)</li>\r
+                       <li>10.8 Mountain Lion (Intel) JavaSE6u65 or later (Java for OS X 2013-005 is required.)</li>\r
+                       <li>10.8 Mountain Lion (Intel) Java7 (Oracle, java7u45 or later)</li>\r
+                       <li>10.9 Marvericks (Intel) JavaSE6u65 or later (Java for OS X 2013-005 is required.)</li>\r
+                       <li>10.9 Marvericks (Intel) Java7 (Oracle, java7u45 or later)</li>\r
                </ul>\r
        </li>\r
        <li>Microsoft Windows\r
@@ -71,8 +73,9 @@ h2 {
                        <li>Windows 2000 SP4 (32Bit) JavaSE6 (日本語版のみ)</li>\r
                        <li>Windows XP SP2+ (32Bit) JavaSE6 (日本語版、それ以外はEast asian languagesをコンパネからインストール済みのこと)</li>\r
                        <li>Windows Vista SP1以降 (32/64Bit) JavaSE6</li>\r
-                       <li>Windows 7 (32/64Bit) JavaSE6, Java7u10 or later</li>\r
-                       <li>Windows 8 (32/64Bit) JavaSE6, Java7u10 or later</li>\r
+                       <li>Windows 7 (32/64Bit) JavaSE6, Java7u45 or later</li>\r
+                       <li>Windows 8 (32/64Bit) JavaSE6, Java7u45 or later</li>\r
+                       <li>Windows 8.1 (32/64Bit) JavaSE6, Java7u45 or later</li>\r
                </ul>\r
        </li>\r
        <li>Linux\r
@@ -86,6 +89,7 @@ h2 {
 <p>J2SE5で記述しているため、J2SE5のデスクトップをサポートした実行環境があれば基本的には動作すると思います。</p>\r
 <p>Windows環境ではJ2SE5でも動作しますが、Java7を推奨します。</p>\r
 <p>Mac OS Xも同様にJava7(Oracle)を推奨します。(AppleのJavaSE5/JavaSE6でも動作します。)</p>\r
+<p>OS X 10.7以降は標準ではJavaはインストールされていません。AppleのサイトからJava6をインストールするか、OracleのサイトからJava7をインストールする必要があります.<p>\r
 <p>Mac OS X上での本アプリケーションは、AppleのJava5/6用と、OracleのJava7用と、それぞれ専用版のアプリケーションに分けています。</p>\r
 <p>メモリは、Mac OS Xのアプリケーションバンドル形式、またはWindowsのEXE形式での配布形式では、初期状態で96MB、最大で128MBの設定を行っています。</p>\r
 <p>実行可能JAR形式ではJREのデフォルトのサイズが使われます。これは搭載している物理メモリによって割り当てられるサイズが64MBあるいは256MBのように変わります。</p>\r
index 4ef7e19..14be796 100644 (file)
@@ -1,3 +1,3 @@
 vendor=seraphy@seraphyware\r
 specification_version=1.0\r
-implements_version=0.994\r
+implements_version=0.995\r
index 02b1486..8128e2a 100644 (file)
@@ -2,6 +2,7 @@ package charactermanaj;
 \r
 import java.awt.Font;\r
 import java.io.File;\r
+import java.lang.Thread.UncaughtExceptionHandler;\r
 import java.lang.reflect.Method;\r
 import java.util.logging.Level;\r
 import java.util.logging.Logger;\r
@@ -74,9 +75,31 @@ public final class Main implements Runnable {
                        // ログの設定を読み取る.(OSにより、設定ファイルの位置が異なることに注意)\r
                        ApplicationLoggerConfigurator.configure();\r
 \r
-                       // SwingのEDT内の例外ハンドラの設定 (ロギングするだけ)\r
-                       System.setProperty("sun.awt.exception.handler",\r
-                                       AWTExceptionLoggingHandler.class.getName());\r
+                       if (getJavaVersion() >= 1.7) {\r
+                               // java7以降は、sun.awt.exception.handlerが使えないので、\r
+                               // EDTスレッドで未処理例外ハンドラを明示的に設定する.\r
+                               final AWTExceptionLoggingHandler logHandler = new AWTExceptionLoggingHandler();\r
+                               SwingUtilities.invokeLater(new Runnable() {\r
+                                       public void run() {\r
+                                               final UncaughtExceptionHandler handler = Thread\r
+                                                               .getDefaultUncaughtExceptionHandler();\r
+                                               Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() {\r
+                                                       public void uncaughtException(Thread t, Throwable ex) {\r
+                                                               logHandler.handle(ex);\r
+                                                               if (handler != null) {\r
+                                                                       handler.uncaughtException(t, ex);\r
+                                                               }\r
+                                                       }\r
+                                               });\r
+                                       }\r
+                               });\r
+\r
+                       } else {\r
+                               // SwingのEDT内の例外ハンドラの設定 (ロギングするだけ)\r
+                               // (ただし、unofficial trickである.)\r
+                               System.setProperty("sun.awt.exception.handler",\r
+                                               AWTExceptionLoggingHandler.class.getName());\r
+                       }\r
 \r
                } catch (Throwable ex) {\r
                        // ロガーの準備に失敗した場合はロガーがないかもなので\r
@@ -92,7 +115,7 @@ public final class Main implements Runnable {
         * \r
         * @return バージョン\r
         */\r
-       private static double getJavaVersion() {\r
+       public static double getJavaVersion() {\r
                try {\r
                String version = System.getProperty("java.version");\r
                String[] versions = version.split("\\.");\r
diff --git a/src/charactermanaj/model/CharacterDataChangeEvent.java b/src/charactermanaj/model/CharacterDataChangeEvent.java
new file mode 100644 (file)
index 0000000..c72ffbc
--- /dev/null
@@ -0,0 +1,34 @@
+package charactermanaj.model;\r
+\r
+import java.util.EventObject;\r
+\r
+public class CharacterDataChangeEvent extends EventObject {\r
+\r
+       private static final long serialVersionUID = -99746684880598436L;\r
+\r
+       private CharacterData characterData;\r
+\r
+       private boolean changeStructure;\r
+\r
+       private boolean reloadPartsAndFavorites;\r
+\r
+       public CharacterDataChangeEvent(Object src, CharacterData characterData,\r
+                       boolean changeStructure, boolean reloadPartsAndFavorites) {\r
+               super(src);\r
+               this.characterData = characterData;\r
+               this.changeStructure = changeStructure;\r
+               this.reloadPartsAndFavorites = reloadPartsAndFavorites;\r
+       }\r
+\r
+       public CharacterData getCharacterData() {\r
+               return characterData;\r
+       }\r
+\r
+       public boolean isChangeStructure() {\r
+               return changeStructure;\r
+       }\r
+\r
+       public boolean isReloadPartsAndFavorites() {\r
+               return reloadPartsAndFavorites;\r
+       }\r
+}\r
diff --git a/src/charactermanaj/model/CharacterDataChangeListener.java b/src/charactermanaj/model/CharacterDataChangeListener.java
new file mode 100644 (file)
index 0000000..d560f9a
--- /dev/null
@@ -0,0 +1,9 @@
+package charactermanaj.model;\r
+\r
+import java.util.EventListener;\r
+\r
+public interface CharacterDataChangeListener extends EventListener {\r
+\r
+       void notifyChangeCharacterData(CharacterDataChangeEvent e);\r
+\r
+}\r
diff --git a/src/charactermanaj/model/CharacterDataChangeObserver.java b/src/charactermanaj/model/CharacterDataChangeObserver.java
new file mode 100644 (file)
index 0000000..d5f2c0b
--- /dev/null
@@ -0,0 +1,64 @@
+package charactermanaj.model;\r
+\r
+import javax.swing.event.EventListenerList;\r
+\r
+\r
+/**\r
+ * キャラクターデータが変更されたことを通知するためのメカニズム\r
+ * \r
+ * @author seraphy\r
+ * \r
+ */\r
+public abstract class CharacterDataChangeObserver {\r
+\r
+       private static CharacterDataChangeObserver inst = new CharacterDataChangeObserverImpl();\r
+\r
+       public static CharacterDataChangeObserver getDefault() {\r
+               return inst;\r
+       }\r
+\r
+       public abstract void addCharacterDataChangeListener(\r
+                       CharacterDataChangeListener l);\r
+\r
+       public abstract void removeCharacterDataChangeListener(\r
+                       CharacterDataChangeListener l);\r
+\r
+       public abstract void notifyCharacterDataChange(CharacterDataChangeEvent e);\r
+\r
+       public void notifyCharacterDataChange(Object wnd, CharacterData cd,\r
+                       boolean changeStructure, boolean reloadPartsAndFavorites) {\r
+               if (cd == null) {\r
+                       throw new IllegalArgumentException();\r
+               }\r
+               notifyCharacterDataChange(new CharacterDataChangeEvent(wnd, cd,\r
+                               changeStructure, reloadPartsAndFavorites));\r
+       }\r
+}\r
+\r
+class CharacterDataChangeObserverImpl extends CharacterDataChangeObserver {\r
+\r
+       private EventListenerList listeners = new EventListenerList();\r
+\r
+       @Override\r
+       public void addCharacterDataChangeListener(CharacterDataChangeListener l) {\r
+               listeners.add(CharacterDataChangeListener.class, l);\r
+       }\r
+\r
+       @Override\r
+       public void removeCharacterDataChangeListener(CharacterDataChangeListener l) {\r
+               listeners.remove(CharacterDataChangeListener.class, l);\r
+       }\r
+\r
+       @Override\r
+       public void notifyCharacterDataChange(CharacterDataChangeEvent e) {\r
+               if (e == null) {\r
+                       throw new IllegalArgumentException();\r
+               }\r
+               CharacterDataChangeListener[] lst = listeners\r
+                               .getListeners(CharacterDataChangeListener.class);\r
+               for (CharacterDataChangeListener l : lst) {\r
+                       l.notifyChangeCharacterData(e);\r
+               }\r
+       }\r
+}\r
+\r
index 2d1cbf9..cde5670 100644 (file)
@@ -70,6 +70,9 @@ import charactermanaj.graphics.io.OutputOption;
 import charactermanaj.graphics.io.UkagakaImageSaveHelper;\r
 import charactermanaj.model.AppConfig;\r
 import charactermanaj.model.CharacterData;\r
+import charactermanaj.model.CharacterDataChangeEvent;\r
+import charactermanaj.model.CharacterDataChangeListener;\r
+import charactermanaj.model.CharacterDataChangeObserver;\r
 import charactermanaj.model.ColorGroup;\r
 import charactermanaj.model.IndependentPartsSetInfo;\r
 import charactermanaj.model.PartsCategory;\r
@@ -120,7 +123,10 @@ import charactermanaj.util.UIHelper;
  * \r
  * @author seraphy\r
  */\r
-public class MainFrame extends JFrame implements FavoritesChangeListener {\r
+public class MainFrame extends JFrame\r
+               implements\r
+                       FavoritesChangeListener,\r
+                       CharacterDataChangeListener {\r
 \r
        private static final long serialVersionUID = 1L;\r
 \r
@@ -272,157 +278,43 @@ public class MainFrame extends JFrame implements FavoritesChangeListener {
        }\r
 \r
        /**\r
-        * インポートされパーツが増減した可能性がある場合に呼び出される.\r
-        * \r
-        * @param cd\r
-        *            対象\r
-        * @param newCd\r
-        *            インポートされたcd\r
-        * @param caller\r
-        *            呼び出しもとメインフレーム\r
-        * @throws IOException\r
-        *             例外\r
-        */\r
-       public static void notifyImportedPartsOrFavorites(\r
-                       final CharacterData cd,\r
-                       final CharacterData newCd,\r
-                       final Component caller\r
-                       ) throws IOException {\r
-               if (cd == null || newCd == null || caller == null) {\r
-                       throw new IllegalArgumentException();\r
-               }\r
-\r
-               if (!cd.isValid() || !newCd.isValid()) {\r
-                       // 変更前もしくは変更後が無効なキャラクターデータであれば\r
-                       // 反映する必要ない.\r
-                       return;\r
-               }\r
-               logger.log(Level.FINE, "parts imported for active profiles: " + newCd);\r
-\r
-\r
-               if ( !cd.isSameStructure(newCd)) {\r
-                       // キャラクターデータそのものが変更されている場合\r
-                       notifyChangeCharacterData(cd, newCd, caller);\r
-\r
-               } else {\r
-                       // パーツ構成は変更されていない場合\r
-\r
-                       // Frameのうち、ネイティブリソースと関連づけられているアクティブなフレームを調査\r
-                       for (Frame frame : JFrame.getFrames()) {\r
-                               if (frame.isDisplayable() && frame instanceof MainFrame) {\r
-                                       final MainFrame mainFrame = (MainFrame) frame;\r
-                                       if (mainFrame.characterData == null || !mainFrame.characterData.isValid()) {\r
-                                               // 無効なキャラクターデータを保持している場合は、そのメインフレームは処理対象外\r
-                                               continue;\r
-                                       }\r
-                                       SwingUtilities.invokeLater(new Runnable() {\r
-                                               public void run() {\r
-                                                       // パーツ及びお気に入りを再取得する場合.\r
-                                                       try {\r
-                                                               Cursor oldCur = mainFrame.getCursor();\r
-                                                               mainFrame.setCursor(Cursor\r
-                                                                               .getPredefinedCursor(Cursor.WAIT_CURSOR));\r
-                                                               try {\r
-                                                                       mainFrame.reloadPartsAndFavorites(newCd, true);\r
-\r
-                                                               } finally {\r
-                                                                       mainFrame.setCursor(oldCur != null ? oldCur : Cursor.getDefaultCursor());\r
-                                                               }\r
-\r
-                                                       } catch (Exception ex) {\r
-                                                               ErrorMessageHelper.showErrorDialog(mainFrame, ex);\r
+        * キャラクターデータが変更された場合に通知される.\r
+        */\r
+       public void notifyChangeCharacterData(final CharacterDataChangeEvent e) {\r
+               final CharacterData cd = e.getCharacterData();\r
+               if (cd != null\r
+                               && cd.getDocBase().equals(\r
+                                               MainFrame.this.characterData.getDocBase())) {\r
+                       SwingUtilities.invokeLater(new Runnable() {\r
+                               public void run() {\r
+                                       try {\r
+                                               Cursor oldCur = getCursor();\r
+                                               setCursor(Cursor\r
+                                                               .getPredefinedCursor(Cursor.WAIT_CURSOR));\r
+                                               try {\r
+                                                       if (e.isChangeStructure()) {\r
+                                                               // 現在情報の保存\r
+                                                               saveWorkingSet();\r
+\r
+                                                               // 画面構成の再構築\r
+                                                               initComponent(cd);\r
                                                        }\r
-                                               }\r
-                                       });\r
-                               }\r
-                       }\r
-               }\r
-       }\r
-\r
-       /**\r
-        * キャラクターデータが変更されたことを通知される.<br>\r
-        * \r
-        * @param cd\r
-        *            キャラクターデータ(変更前)\r
-        * @param newCd\r
-        *            キャラクターデータ(変更後)\r
-        * @param caller\r
-        *            呼び出しもとコンポーネント(ウェイトカーソル表示用)\r
-        * @param structureCompatible\r
-        *            構造が同一であるか?\r
-        * @throws IOException\r
-        *             新しいキャラクターデータのパーツセットのロードに失敗した場合 (メインフレームは変更されていません.)\r
-        */\r
-       public static void notifyChangeCharacterData(\r
-                       final CharacterData cd,\r
-                       final CharacterData newCd,\r
-                       final Component caller\r
-                       ) throws IOException {\r
-               if (cd == null || newCd == null || caller == null) {\r
-                       throw new IllegalArgumentException();\r
-               }\r
-\r
-               if (!cd.isValid() || !newCd.isValid()) {\r
-                       // 変更前もしくは変更後が無効なキャラクターデータであれば\r
-                       // 反映する必要ない.\r
-                       return;\r
-               }\r
-               logger.log(Level.FINE, "change active profile: " + newCd);\r
 \r
-               if (!ProfileListManager.isUsingCharacterData(cd)) {\r
-                       // 使用中のプロファイルではないので何もしない.\r
-                       return;\r
-               }\r
+                                                       if (e.isReloadPartsAndFavorites()) {\r
+                                                               // パーツとお気に入りのリロード\r
+                                                               reloadPartsAndFavorites(cd, true);\r
+                                                       }\r
 \r
-               caller.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));\r
-               try {\r
-                       // キャラクターデータが、まだ読み込まれていなければ読み込む.\r
-                       if (!newCd.isPartsLoaded()) {\r
-                               ProfileListManager.loadCharacterData(newCd);\r
-                               ProfileListManager.loadFavorites(newCd);\r
-                       }\r
-\r
-                       // Frameのうち、ネイティブリソースと関連づけられているアクティブなフレームを調査\r
-                       for (Frame frame : JFrame.getFrames()) {\r
-                               if (frame.isDisplayable() && frame instanceof MainFrame) {\r
-                                       final MainFrame mainFrame = (MainFrame) frame;\r
-                                       if (mainFrame.characterData == null || !mainFrame.characterData.isValid()) {\r
-                                               // 無効なキャラクターデータを保持している場合は、そのメインフレームは処理対象外\r
-                                               continue;\r
-                                       }\r
+                                               } finally {\r
+                                                       setCursor(oldCur != null ? oldCur : Cursor\r
+                                                                       .getDefaultCursor());\r
+                                               }\r
 \r
-                                       // メインフレームが保持しているキャラクターデータのdocbaseと\r
-                                       // 変更対象となったキャラクターデータのdocbaseが等しければ、メインフレームを更新する必要がある.\r
-                                       String docbaseOrg = cd.getDocBase().toString();\r
-                                       String docbaseMine = mainFrame.characterData.getDocBase().toString();\r
-                                       if (docbaseOrg.equals(docbaseMine)) {\r
-                                               SwingUtilities.invokeLater(new Runnable() {\r
-                                                       public void run() {\r
-                                                               try {\r
-                                                                       Cursor oldCur = mainFrame.getCursor();\r
-                                                                       mainFrame.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));\r
-                                                                       try {\r
-                                                                               // 現在情報の保存\r
-                                                                               mainFrame.saveWorkingSet();\r
-\r
-                                                                               // 画面構成の再構築\r
-                                                                               mainFrame.initComponent(newCd);\r
-\r
-                                                                       } finally {\r
-                                                                               mainFrame.setCursor(oldCur != null ? oldCur : Cursor.getDefaultCursor());\r
-                                                                       }\r
-\r
-                                                               } catch (RuntimeException ex) {\r
-                                                                       ErrorMessageHelper.showErrorDialog(mainFrame, ex);\r
-                                                               }\r
-                                                       }\r
-                                               });\r
+                                       } catch (Exception ex) {\r
+                                               ErrorMessageHelper.showErrorDialog(MainFrame.this, ex);\r
                                        }\r
                                }\r
-                       }\r
-\r
-               } finally {\r
-                       caller.setCursor(Cursor.getDefaultCursor());\r
+                       });\r
                }\r
        }\r
 \r
@@ -433,11 +325,19 @@ public class MainFrame extends JFrame implements FavoritesChangeListener {
         */\r
        public void notifyChangeFavorites(FavoritesChangeEvent e) {\r
                CharacterData cd = e.getCharacterData();\r
-               if (cd.getDocBase().equals(MainFrame.this.characterData.getDocBase())) {\r
-                       if (!MainFrame.this.equals(e.getSource())) {\r
-                               // お気に入りを最新化する.\r
-                               // (ただし、自分自身から送信したイベントの場合はリロードの必要はない)\r
-                               refreshFavorites();\r
+               if (cd != null\r
+                               && cd.getDocBase().equals(\r
+                                               MainFrame.this.characterData.getDocBase())) {\r
+                       if (!MainFrame.this.equals(e.getSource())\r
+                                       && !characterData.equals(cd)) {\r
+                               // プリセットとお気に入りを最新化する.\r
+                               // ただし、自分自身から送信したイベントの場合は最新化は不要.\r
+                               characterData.clearPartsSets(false);\r
+                               for (Map.Entry<String, PartsSet> entry : cd.getPartsSets()\r
+                                               .entrySet()) {\r
+                                       PartsSet partsSet = entry.getValue();\r
+                                       characterData.addPartsSet(partsSet);\r
+                               }\r
                        }\r
 \r
                        // お気に入り管理ダイアログ上のお気に入り一覧を最新に更新する.\r
@@ -492,6 +392,9 @@ public class MainFrame extends JFrame implements FavoritesChangeListener {
                        // お気に入り変更通知を受け取る\r
                        FavoritesChangeObserver.getDefault().addFavoritesChangeListener(\r
                                        this);\r
+                       // キャラクターデータの変更通知を受け取る\r
+                       CharacterDataChangeObserver.getDefault()\r
+                                       .addCharacterDataChangeListener(this);\r
 \r
                        // メインスクリーンサイズを取得する.\r
                        GraphicsEnvironment genv = GraphicsEnvironment.getLocalGraphicsEnvironment();\r
@@ -600,6 +503,8 @@ public class MainFrame extends JFrame implements FavoritesChangeListener {
        public void dispose() {\r
                FavoritesChangeObserver.getDefault()\r
                                .removeFavoritesChangeListener(this);\r
+               CharacterDataChangeObserver.getDefault()\r
+                               .removeCharacterDataChangeListener(this);\r
            imageLoader.close();\r
                stopAgents();\r
                super.dispose();\r
@@ -1725,7 +1630,8 @@ public class MainFrame extends JFrame implements FavoritesChangeListener {
                        CharacterData cd = this.characterData;\r
                        CharacterData newCd = ProfileListManager.editProfile(this, cd);\r
                        if (newCd != null) {\r
-                               MainFrame.notifyChangeCharacterData(cd, newCd, this);\r
+                               CharacterDataChangeObserver.getDefault()\r
+                                               .notifyCharacterDataChange(this, newCd, true, true);\r
                        }\r
 \r
                } catch (Exception ex) {\r
@@ -1900,7 +1806,9 @@ public class MainFrame extends JFrame implements FavoritesChangeListener {
 \r
                                if (importWizDialog.getExitCode() == ImportWizardDialog.EXIT_PROFILE_UPDATED) {\r
                                        CharacterData importedCd = importWizDialog.getImportedCharacterData();\r
-                                       notifyImportedPartsOrFavorites(characterData, importedCd, this);\r
+                                       CharacterDataChangeObserver.getDefault()\r
+                                                       .notifyCharacterDataChange(this, importedCd,\r
+                                                                       false, true);\r
                                }\r
 \r
                        } finally {\r
@@ -2269,11 +2177,6 @@ public class MainFrame extends JFrame implements FavoritesChangeListener {
                ManageFavoriteDialog dlg = new ManageFavoriteDialog(this, characterData);\r
                dlg.setFavoriteManageCallback(new FavoriteManageCallback() {\r
 \r
-                       public void refreshFavorites(CharacterData cd) {\r
-                               // お気に入りの状態を最新にリフレッシュする.\r
-                               MainFrame.this.refreshFavorites();\r
-                       }\r
-\r
                        public void selectFavorites(PartsSet partsSet) {\r
                                // お気に入り編集ダイアログで選択されたパーツを選択表示する.\r
                                selectPresetParts(partsSet);\r
@@ -2312,26 +2215,6 @@ public class MainFrame extends JFrame implements FavoritesChangeListener {
                lastUseManageFavoritesDialog = dlg;\r
        }\r
 \r
-       /**\r
-        * 最新のお気に入りの状態を取り出す.<br>\r
-        */\r
-       protected void refreshFavorites() {\r
-               logger.log(Level.FINE, "refresh Favorites.: " + characterData);\r
-               try {\r
-                       setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));\r
-                       try {\r
-                               CharacterDataPersistent persiste = CharacterDataPersistent.getInstance();\r
-                               characterData.clearPartsSets(true);\r
-                               persiste.loadFavorites(characterData);\r
-                       } finally {\r
-                               setCursor(Cursor.getDefaultCursor());\r
-                       }\r
-\r
-               } catch (Exception ex) {\r
-                       logger.log(Level.WARNING, "can't refresh favorites: " + characterData, ex);\r
-               }\r
-       }\r
-\r
        protected void onRegisterFavorite() {\r
                if (!characterData.isValid()) {\r
                        Toolkit tk = Toolkit.getDefaultToolkit();\r
index 80a701f..f07130b 100644 (file)
@@ -180,13 +180,6 @@ public class ManageFavoriteDialog extends JDialog {
        public interface FavoriteManageCallback {\r
 \r
                /**\r
-                * キャラクターデータのお気に入り状態を最新にする.\r
-                * \r
-                * @param cd\r
-                */\r
-               void refreshFavorites(CharacterData cd);\r
-\r
-               /**\r
                 * 引数で指定されたパーツセットを表示する.\r
                 * \r
                 * @param partsSet\r
@@ -367,10 +360,6 @@ public class ManageFavoriteDialog extends JDialog {
                        }\r
                });\r
 \r
-               if (callback != null) {\r
-                       callback.refreshFavorites(this.characterData);\r
-               }\r
-\r
                initListModel();\r
 \r
                updateButtonUI();\r
index 15dd3e5..3a2595b 100644 (file)
@@ -81,6 +81,7 @@ import charactermanaj.graphics.io.ImageCachedLoader;
 import charactermanaj.graphics.io.LoadedImage;\r
 import charactermanaj.model.AppConfig;\r
 import charactermanaj.model.CharacterData;\r
+import charactermanaj.model.CharacterDataChangeObserver;\r
 import charactermanaj.model.io.CharacterDataDefaultProvider;\r
 import charactermanaj.model.io.CharacterDataPersistent;\r
 import charactermanaj.model.io.PartsImageDirectoryWatchAgent;\r
@@ -95,7 +96,7 @@ import charactermanaj.util.UIHelper;
 \r
 /**\r
  * プロファイルを選択するためのダイアログ、およびデフォルトプロファイルを開く\r
- *\r
+ * \r
  * @author seraphy\r
  */\r
 public class ProfileSelectorDialog extends JDialog {\r
@@ -170,7 +171,7 @@ public class ProfileSelectorDialog extends JDialog {
 \r
        /**\r
         * プロファイルの選択ダイアログを構築する.\r
-        *\r
+        * \r
         * @param parent\r
         *            親フレーム、もしくはnull\r
         * @param characterDatas\r
@@ -729,7 +730,7 @@ public class ProfileSelectorDialog extends JDialog {
 \r
        /**\r
         * サンプルピクチャパネルにドロップされた画像ファイルをサンプルピクチャとしてコピーします.<br>\r
-        *\r
+        * \r
         * @param dtde\r
         *            ドロップイベント\r
         */\r
@@ -822,7 +823,7 @@ public class ProfileSelectorDialog extends JDialog {
 \r
        /**\r
         * プロファイルの作成\r
-        *\r
+        * \r
         * @param makeDefault\r
         *            デフォルトのプロファイルで作成する場合\r
         */\r
@@ -952,7 +953,8 @@ public class ProfileSelectorDialog extends JDialog {
                        }\r
 \r
                        // 現在開いているメインフレームに対してキャラクター定義が変更されたことを通知する.\r
-                       MainFrame.notifyChangeCharacterData(cd, newCd, this);\r
+                       CharacterDataChangeObserver.getDefault().notifyCharacterDataChange(\r
+                                       this, newCd, true, true);\r
 \r
                        // プロファイル一覧画面も更新する.\r
                        characterListModel.set(selRow, newCd);\r
@@ -1131,7 +1133,8 @@ public class ProfileSelectorDialog extends JDialog {
                                } else if (importWizDialog.getExitCode() == ImportWizardDialog.EXIT_PROFILE_UPDATED) {\r
 \r
                                        // 更新されたプロファイルを通知する\r
-                                       MainFrame.notifyImportedPartsOrFavorites(cd, newCd, this);\r
+                                       CharacterDataChangeObserver.getDefault()\r
+                                                       .notifyCharacterDataChange(this, newCd, true, true);\r
                                }\r
 \r
                        } finally {\r