OSDN Git Service

パーツ管理情報に設定時点のパーツの更新日時を記録するように修正。
authorseraphy <seraphy@5b6e9025-a2e8-4882-b233-f889982098c5>
Sun, 24 Nov 2013 04:08:36 +0000 (04:08 +0000)
committerseraphy <seraphy@5b6e9025-a2e8-4882-b233-f889982098c5>
Sun, 24 Nov 2013 04:08:36 +0000 (04:08 +0000)
git-svn-id: https://svn.sourceforge.jp/svnroot/charactermanaj/trunk@83 5b6e9025-a2e8-4882-b233-f889982098c5

resources/languages/partsmanagedialog.xml
resources/languages/partsmanagedialog_ja.xml
resources/schema/parts-definition.xsd
src/charactermanaj/model/PartsManageData.java
src/charactermanaj/model/io/PartsInfoXMLReader.java
src/charactermanaj/model/io/PartsInfoXMLWriter.java
src/charactermanaj/ui/PartsManageDialog.java
src/charactermanaj/ui/ProfileListManager.java

index 61c7d6b..99e6c4a 100644 (file)
@@ -5,6 +5,7 @@
        <entry key="sortByName">Sort by name</entry>\r
        <entry key="sortByAuthor">Sort by Author</entry>\r
        <entry key="sortByTimestamp">Sort by Last-modified</entry>\r
+       <entry key="applyAllLastModified">Up to date</entry>\r
        <entry key="applyAllDownloadURL">Batch input for the download URL.</entry>\r
        <entry key="applyAllVersion">Batch input for the version.</entry>\r
        <entry key="author.info">Author Information</entry>\r
index 398b292..ad4173f 100644 (file)
@@ -5,6 +5,7 @@
        <entry key="sortByName">名前順に整列</entry>\r
        <entry key="sortByAuthor">作者順に整列</entry>\r
        <entry key="sortByTimestamp">更新日順に整列</entry>\r
+       <entry key="applyAllLastModified">最新にする</entry>\r
        <entry key="applyAllDownloadURL">ダウンロードURLを一括指定</entry>\r
        <entry key="applyAllVersion">バージョンを一括指定</entry>\r
        <entry key="author.info">作者情報</entry>\r
index acb685d..a7ad0c4 100644 (file)
                 <xs:documentation xml:lang="ja">パーツのバージョン</xs:documentation>\r
               </xs:annotation>\r
             </xs:attribute>\r
+            <xs:attribute name="lastModified" use="optional" form="unqualified" type="xs:dateTime">\r
+              <xs:annotation>\r
+                <xs:documentation xml:lang="ja">最終更新日時(代表)</xs:documentation>\r
+              </xs:annotation>\r
+            </xs:attribute>\r
           </xs:complexType>\r
         </xs:element>\r
       </xs:choice>\r
index 7075f67..51b30c9 100644 (file)
@@ -1,5 +1,6 @@
 package charactermanaj.model;\r
 \r
+import java.sql.Timestamp;\r
 import java.util.AbstractCollection;\r
 import java.util.ArrayList;\r
 import java.util.Collection;\r
@@ -13,6 +14,7 @@ import java.util.Map;
  * パーツ識別子のかわりに、パーツキーを用いる.<br>\r
  * パーツキーは、CategoryIdがnullであることを許可している.<br>\r
  * カテゴリを省略し、パーツ名だけでパーツ管理情報を検索できるようにするためのもの.<br>\r
+ * \r
  * @author seraphy\r
  */\r
 public class PartsManageData extends AbstractCollection<PartsManageData.PartsKey> {\r
@@ -20,6 +22,7 @@ public class PartsManageData extends AbstractCollection<PartsManageData.PartsKey
        /**\r
         * パーツキー.<br>\r
         * パーツ識別子 {@link PartsIdentifier} とほぼ同等であるが、カテゴリがnullであることを許可している点が異なる.<br>\r
+        * \r
         * @author seraphy\r
         */\r
        public static final class PartsKey implements Comparable<PartsKey> {\r
@@ -92,6 +95,7 @@ public class PartsManageData extends AbstractCollection<PartsManageData.PartsKey
 \r
        /**\r
         * パーツごとのバージョンとダウンロードURL情報を保持するホルダークラス.<br>\r
+        * \r
         * @author seraphy\r
         */\r
        public static final class PartsVersionInfo {\r
@@ -100,15 +104,23 @@ public class PartsManageData extends AbstractCollection<PartsManageData.PartsKey
                \r
                private String downloadURL;\r
                \r
+               private Timestamp lastModified;\r
+\r
                public PartsVersionInfo() {\r
                        super();\r
                }\r
                \r
                public PartsVersionInfo(double version, String downloadURL) {\r
+                       this(version, downloadURL, null);\r
+               }\r
+               \r
+               public PartsVersionInfo(double version, String downloadURL,\r
+                               Timestamp lastModified) {\r
                        this.version = version;\r
                        this.downloadURL = downloadURL;\r
+                       this.lastModified = lastModified;\r
                }\r
-               \r
+\r
                public double getVersion() {\r
                        return version;\r
                }\r
@@ -124,6 +136,14 @@ public class PartsManageData extends AbstractCollection<PartsManageData.PartsKey
                public void setDownloadURL(String downloadURL) {\r
                        this.downloadURL = downloadURL;\r
                }\r
+\r
+               public Timestamp getLastModified() {\r
+                       return lastModified;\r
+               }\r
+\r
+               public void setLastModified(Timestamp lastModified) {\r
+                       this.lastModified = lastModified;\r
+               }\r
        }\r
 \r
        \r
@@ -155,10 +175,15 @@ public class PartsManageData extends AbstractCollection<PartsManageData.PartsKey
        \r
        /**\r
         * パーツキーに結びつく、各種情報を登録する.<br>\r
-        * @param partsKey パーツキー\r
-        * @param localizedName ローカライズ名(なければnull)\r
-        * @param partsAuthorInfo 作者情報 (なければnull)\r
-        * @param versionInfo バージョン情報 (なければnull)\r
+        * \r
+        * @param partsKey\r
+        *            パーツキー\r
+        * @param localizedName\r
+        *            ローカライズ名(なければnull)\r
+        * @param partsAuthorInfo\r
+        *            作者情報 (なければnull)\r
+        * @param versionInfo\r
+        *            バージョン情報 (なければnull)\r
         */\r
        public void putPartsInfo(PartsKey partsKey, String localizedName, PartsAuthorInfo partsAuthorInfo, PartsVersionInfo versionInfo) {\r
                if (partsKey == null) {\r
@@ -172,7 +197,9 @@ public class PartsManageData extends AbstractCollection<PartsManageData.PartsKey
        /**\r
         * パーツキーを指定して該当する作者情報を取得する.<br>\r
         * 完全に一致する作者情報がない場合は、カテゴリを無視して、パーツキーのパーツ名(ID)の一致する、いずれかの作者情報を返す.<br>\r
-        * @param partsKey パーツキー\r
+        * \r
+        * @param partsKey\r
+        *            パーツキー\r
         * @return 作者情報、完全に一致するものがなく、且つ、パーツ名(ID)に一致する情報もない場合はnull\r
         */\r
        public PartsAuthorInfo getPartsAuthorInfo(PartsKey partsKey) {\r
@@ -195,7 +222,9 @@ public class PartsManageData extends AbstractCollection<PartsManageData.PartsKey
        /**\r
         * パーツキーと完全に一致する作者情報を取得する.<br>\r
         * 存在しない場合はnullを返す.<br>\r
-        * @param partsKey パーツキー\r
+        * \r
+        * @param partsKey\r
+        *            パーツキー\r
         * @return 作者情報、もしくはnull\r
         */\r
        public PartsAuthorInfo getPartsAuthorInfoStrict(PartsKey partsKey) {\r
@@ -208,7 +237,9 @@ public class PartsManageData extends AbstractCollection<PartsManageData.PartsKey
        /**\r
         * パーツキーを指定して該当するバージョン情報を取得する.<br>\r
         * 完全に一致するバージョン情報がない場合は、カテゴリを無視して、パーツキーのパーツ名(ID)の一致する、いずれかのバージョン情報を返す.<br>\r
-        * @param partsKey パーツキー\r
+        * \r
+        * @param partsKey\r
+        *            パーツキー\r
         * @return バージョン情報、完全に一致するものがなく、且つ、パーツ名(ID)に一致する情報もない場合はnull\r
         */\r
        public PartsVersionInfo getVersion(PartsKey partsKey) {\r
@@ -231,7 +262,9 @@ public class PartsManageData extends AbstractCollection<PartsManageData.PartsKey
        /**\r
         * パーツキーを指定して該当するローカライズ名を取得する.<br>\r
         * 完全に一致するバージョン情報がない場合は、カテゴリを無視して、パーツキーのパーツ名(ID)の一致する、いずれかのローカライズ名を返す.<br>\r
-        * @param partsKey パーツキー\r
+        * \r
+        * @param partsKey\r
+        *            パーツキー\r
         * @return バージョン情報、完全に一致するものがなく、且つ、パーツ名(ID)に一致する情報もない場合はnull\r
         */\r
        public String getLocalizedName(PartsKey partsKey) {\r
@@ -253,7 +286,9 @@ public class PartsManageData extends AbstractCollection<PartsManageData.PartsKey
 \r
        /**\r
         * パーツキーと完全に一致するバージョン情報を取得する.<br>\r
-        * @param partsKey パーツキー\r
+        * \r
+        * @param partsKey\r
+        *            パーツキー\r
         * @return パーツキーに完全に一致するバージョン情報、該当がなければnull\r
         */\r
        public PartsVersionInfo getVersionStrict(PartsKey partsKey) {\r
@@ -265,7 +300,9 @@ public class PartsManageData extends AbstractCollection<PartsManageData.PartsKey
        \r
        /**\r
         * パーツキーと完全に一致するローカライズ名を取得する.<br>\r
-        * @param partsKey パーツキー\r
+        * \r
+        * @param partsKey\r
+        *            パーツキー\r
         * @return パーツキーに完全に一致するローカライズ名、該当がなければnull\r
         */\r
        public String getLocalizedNameStrict(PartsKey partsKey) {\r
@@ -277,6 +314,7 @@ public class PartsManageData extends AbstractCollection<PartsManageData.PartsKey
 \r
        /**\r
         * すべての作者情報を返す.<br>\r
+        * \r
         * @return 作者情報のコレクション\r
         */\r
        public Collection<PartsAuthorInfo> getAuthorInfos() {\r
@@ -294,7 +332,9 @@ public class PartsManageData extends AbstractCollection<PartsManageData.PartsKey
 \r
        /**\r
         * 指定した作者に該当する登録されているパーツキーの一覧を返す.<Br>\r
-        * @param author 作者\r
+        * \r
+        * @param author\r
+        *            作者\r
         * @return 作者に該当するパーツキー\r
         */\r
        public Collection<PartsKey> getPartsKeysByAuthor(String author) {\r
index 2e810a6..35d4f9b 100644 (file)
@@ -5,6 +5,8 @@ import java.io.FileInputStream;
 import java.io.IOException;\r
 import java.io.InputStream;\r
 import java.net.URI;\r
+import java.sql.Timestamp;\r
+import java.text.SimpleDateFormat;\r
 import java.util.LinkedList;\r
 import java.util.Locale;\r
 import java.util.logging.Level;\r
@@ -99,6 +101,10 @@ public class PartsInfoXMLReader {
                        // 要素のスタック\r
                        final LinkedList<String> stack = new LinkedList<String>();\r
 \r
+                       // 日時コンバータ\r
+                       final SimpleDateFormat dateTimeFmt = new SimpleDateFormat(\r
+                                       "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");\r
+\r
                        // DOMではなくSAXで読み流す.\r
                        saxParser.parse(is, new DefaultHandler() {\r
                                private StringBuilder buf = new StringBuilder();\r
@@ -117,6 +123,8 @@ public class PartsInfoXMLReader {
                                private String partsName;\r
                                private double partsVersion;\r
 \r
+                               private Timestamp partsLastModified;\r
+\r
                                @Override\r
                                public void startDocument() throws SAXException {\r
                                        logger.log(Level.FINEST, "parts-info : start");\r
@@ -169,6 +177,8 @@ public class PartsInfoXMLReader {
                                                partsLocalNameLang = null;\r
                                                partsCategoryId = attributes.getValue("category");\r
                                                partsName = attributes.getValue("name");\r
+\r
+                                               // バージョン\r
                                                String strVersion = attributes.getValue("version");\r
                                                try {\r
                                                        if (strVersion == null || strVersion.length() == 0) {\r
@@ -187,6 +197,23 @@ public class PartsInfoXMLReader {
                                                                                        + strVersion);\r
                                                        partsVersion = 0;\r
                                                }\r
+\r
+                                               // 更新日時\r
+                                               String strLastModified = attributes\r
+                                                               .getValue("lastModified");\r
+                                               if (strLastModified != null\r
+                                                               && strLastModified.trim().length() > 0) {\r
+                                                       try {\r
+                                                               partsLastModified = new Timestamp(dateTimeFmt\r
+                                                                               .parse(strLastModified.trim())\r
+                                                                               .getTime());\r
+\r
+                                                       } catch (Exception ex) {\r
+                                                               logger.log(Level.INFO,\r
+                                                                               "parts-info.xml: invalid dateTime."\r
+                                                                                               + strLastModified);\r
+                                                       }\r
+                                               }\r
                                        }\r
 \r
                                        buf = new StringBuilder();\r
@@ -243,12 +270,14 @@ public class PartsInfoXMLReader {
                                                                                        + " /category: " + partsCategoryId\r
                                                                                        + " /parts-local-name: "\r
                                                                                        + partsLocalName + " /version:"\r
-                                                                                       + partsVersion);\r
+                                                                                       + partsVersion + "/lastModified:"\r
+                                                                                       + partsLastModified);\r
                                                }\r
 \r
                                                PartsManageData.PartsVersionInfo versionInfo = new PartsManageData.PartsVersionInfo();\r
                                                versionInfo.setVersion(partsVersion);\r
                                                versionInfo.setDownloadURL(downloadURL);\r
+                                               versionInfo.setLastModified(partsLastModified);\r
 \r
                                                PartsManageData.PartsKey partsKey = new PartsManageData.PartsKey(\r
                                                                partsName, partsCategoryId);\r
index 97c765c..e8fef0b 100644 (file)
@@ -8,6 +8,7 @@ import java.io.OutputStream;
 import java.io.OutputStreamWriter;\r
 import java.net.URI;\r
 import java.nio.charset.Charset;\r
+import java.text.SimpleDateFormat;\r
 import java.util.ArrayList;\r
 import java.util.Collection;\r
 import java.util.Collections;\r
@@ -183,6 +184,10 @@ public class PartsInfoXMLWriter {
                                        downloadMap.keySet());\r
                        Collections.sort(downloadURLs);\r
 \r
+                       // 日時コンバータ\r
+                       final SimpleDateFormat dateTimeFmt = new SimpleDateFormat(\r
+                                       "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");\r
+\r
                        for (String downloadURL : downloadURLs) {\r
                                List<PartsKey> partsKeyGrp = downloadMap.get(downloadURL);\r
                                Collections.sort(partsKeyGrp);\r
@@ -209,6 +214,11 @@ public class PartsInfoXMLWriter {
                                                                Double.toString(versionInfo.getVersion()));\r
                                        }\r
 \r
+                                       if (versionInfo.getLastModified() != null) {\r
+                                               nodeParts.setAttribute("lastModified", dateTimeFmt\r
+                                                               .format(versionInfo.getLastModified()));\r
+                                       }\r
+\r
                                        String localizedName = partsManageData\r
                                                        .getLocalizedName(partsKey);\r
                                        if (localizedName != null\r
index 4906321..46e2887 100644 (file)
@@ -2,6 +2,7 @@ package charactermanaj.ui;
 \r
 import java.awt.BorderLayout;\r
 import java.awt.Color;\r
+import java.awt.Component;\r
 import java.awt.Container;\r
 import java.awt.GridBagConstraints;\r
 import java.awt.GridBagLayout;\r
@@ -40,6 +41,7 @@ import javax.swing.JPanel;
 import javax.swing.JPopupMenu;\r
 import javax.swing.JRootPane;\r
 import javax.swing.JScrollPane;\r
+import javax.swing.JSeparator;\r
 import javax.swing.JTable;\r
 import javax.swing.JTextField;\r
 import javax.swing.KeyStroke;\r
@@ -50,6 +52,7 @@ import javax.swing.event.ListSelectionEvent;
 import javax.swing.event.ListSelectionListener;\r
 import javax.swing.event.TableModelEvent;\r
 import javax.swing.event.TableModelListener;\r
+import javax.swing.table.TableCellRenderer;\r
 import javax.swing.table.TableColumnModel;\r
 \r
 import charactermanaj.Main;\r
@@ -59,7 +62,10 @@ import charactermanaj.model.PartsAuthorInfo;
 import charactermanaj.model.PartsCategory;\r
 import charactermanaj.model.PartsIdentifier;\r
 import charactermanaj.model.PartsManageData;\r
+import charactermanaj.model.PartsManageData.PartsKey;\r
+import charactermanaj.model.PartsManageData.PartsVersionInfo;\r
 import charactermanaj.model.PartsSpec;\r
+import charactermanaj.model.io.PartsInfoXMLReader;\r
 import charactermanaj.model.io.PartsInfoXMLWriter;\r
 import charactermanaj.ui.model.AbstractTableModelWithComboBoxModel;\r
 import charactermanaj.util.DesktopUtilities;\r
@@ -121,7 +127,43 @@ public class PartsManageDialog extends JDialog {
                partsListPanel.setLayout(partsListPanelLayout);\r
                \r
                partsManageTableModel = new PartsManageTableModel();\r
-               partsManageTable = new JTable(partsManageTableModel);\r
+               partsManageTable = new JTable(partsManageTableModel) {\r
+                       private static final long serialVersionUID = 1L;\r
+\r
+                       @Override\r
+                       public Component prepareRenderer(TableCellRenderer renderer,\r
+                                       int rowIdx, int columnIdx) {\r
+                               PartsManageTableModel.Columns column = PartsManageTableModel.Columns\r
+                                               .values()[columnIdx];\r
+                               Component comp = super.prepareRenderer(renderer, rowIdx, columnIdx);\r
+                               PartsManageTableRow row = partsManageTableModel.getRow(rowIdx);\r
+\r
+                               Timestamp current = row.getTimestamp();\r
+                               Timestamp lastModified = row.getLastModified();\r
+\r
+                               boolean warnings = false;\r
+\r
+                               if (current != null && !current.equals(lastModified)) {\r
+                                       // 現在のパーツの最終更新日と、パーツ管理情報の作成時のパーツの最終更新日が不一致の場合\r
+                                       warnings = true;\r
+                               }\r
+\r
+                               // 背景色、警告行は赤色に\r
+                               if (warnings && column == PartsManageTableModel.Columns.LastModified) {\r
+                                       AppConfig appConfig = AppConfig.getInstance();\r
+                                       Color invalidBgColor = appConfig.getInvalidBgColor();\r
+                                       comp.setBackground(invalidBgColor);\r
+                               } else {\r
+                                       if (isCellSelected(rowIdx, columnIdx)) {\r
+                                               comp.setBackground(getSelectionBackground());\r
+                                       } else {\r
+                                               comp.setBackground(getBackground());\r
+                                       }\r
+                               }\r
+\r
+                               return comp;\r
+                       }\r
+               };\r
                partsManageTable.setShowGrid(true);\r
                partsManageTable.setGridColor(AppConfig.getInstance().getGridColor());\r
                partsManageTableModel.adjustColumnModel(partsManageTable.getColumnModel());\r
@@ -207,6 +249,12 @@ public class PartsManageDialog extends JDialog {
 \r
                // テーブルのコンテキストメニュー\r
                final JPopupMenu popupMenu = new JPopupMenu();\r
+               Action actApplyAllLastModified = new AbstractAction(strings.getProperty("applyAllLastModified")) {\r
+                       private static final long serialVersionUID = 1L;\r
+                       public void actionPerformed(ActionEvent e) {\r
+                               onApplyAllLastModified();\r
+                       }\r
+               };\r
                Action actApplyAllDownloadURL = new AbstractAction(strings.getProperty("applyAllDownloadURL")) {\r
                        private static final long serialVersionUID = 1L;\r
                        public void actionPerformed(ActionEvent e) {\r
@@ -219,6 +267,8 @@ public class PartsManageDialog extends JDialog {
                                onApplyAllVersion();\r
                        }\r
                };\r
+               popupMenu.add(actApplyAllLastModified);\r
+               popupMenu.add(new JSeparator());\r
                popupMenu.add(actApplyAllVersion);\r
                popupMenu.add(actApplyAllDownloadURL);\r
                \r
@@ -426,6 +476,24 @@ public class PartsManageDialog extends JDialog {
                onChangeSelection();\r
        }\r
        \r
+       protected void onApplyAllLastModified() {\r
+               int[] selRows = partsManageTable.getSelectedRows();\r
+               if (selRows.length == 0) {\r
+                       Toolkit tk = Toolkit.getDefaultToolkit();\r
+                       tk.beep();\r
+                       return;\r
+               }\r
+               Arrays.sort(selRows);\r
+\r
+               for (int selRow : selRows) {\r
+                       PartsManageTableRow row = partsManageTableModel.getRow(selRow);\r
+                       Timestamp dt = row.getTimestamp();\r
+                       row.setLastModified(dt);\r
+               }\r
+               partsManageTableModel.fireTableRowsUpdated(selRows[0],\r
+                               selRows[selRows.length - 1]);\r
+       }\r
+\r
        protected void onApplyAllDownloadURL() {\r
                int[] selRows = partsManageTable.getSelectedRows();\r
                if (selRows.length == 0) {\r
@@ -467,6 +535,9 @@ public class PartsManageDialog extends JDialog {
                for (int selRow : selRows) {\r
                        PartsManageTableRow row = partsManageTableModel.getRow(selRow);\r
                        row.setDownloadURL(downloadURL_new);\r
+\r
+                       Timestamp dt = row.getTimestamp();\r
+                       row.setLastModified(dt);\r
                }\r
                partsManageTableModel.fireTableRowsUpdated(selRows[0], selRows[selRows.length - 1]);\r
        }\r
@@ -519,6 +590,9 @@ public class PartsManageDialog extends JDialog {
                for (int selRow : selRows) {\r
                        PartsManageTableRow row = partsManageTableModel.getRow(selRow);\r
                        row.setVersion(version_new);\r
+\r
+                       Timestamp dt = row.getTimestamp();\r
+                       row.setLastModified(dt);\r
                }\r
                partsManageTableModel.fireTableRowsUpdated(selRows[0], selRows[selRows.length - 1]);\r
        }\r
@@ -555,6 +629,10 @@ public class PartsManageDialog extends JDialog {
                                        String oldValue = row.getAuthor();\r
                                        if (oldValue == null || !oldValue.equals(author)) {\r
                                                row.setAuthor(author);\r
+\r
+                                               Timestamp dt = row.getTimestamp();\r
+                                               row.setLastModified(dt);\r
+\r
                                                firstRow = Math.max(firstRow, selRow);\r
                                                lastRow = Math.min(lastRow, selRow);\r
                                        }\r
@@ -661,14 +739,18 @@ public class PartsManageDialog extends JDialog {
                        double version = row.getVersion();\r
                        String downloadURL = row.getDownloadURL();\r
                        String localizedName = row.getLocalizedName();\r
+                       Timestamp lastModified = row.getLastModified();\r
                        \r
+                       PartsManageData.PartsVersionInfo versionInfo = new PartsManageData.PartsVersionInfo();\r
+                       versionInfo.setVersion(version);\r
+                       versionInfo.setDownloadURL(downloadURL);\r
+                       versionInfo.setLastModified(lastModified);\r
+\r
                        PartsIdentifier partsIdentifier = row.getPartsIdentifier();\r
                        \r
                        PartsManageData.PartsKey partsKey = new PartsManageData.PartsKey(partsIdentifier);\r
-                       partsManageData.putPartsInfo(partsKey,\r
-                                       localizedName,\r
-                                       partsAuthorInfo,\r
-                                       new PartsManageData.PartsVersionInfo(version, downloadURL));\r
+                       partsManageData.putPartsInfo(partsKey, localizedName,\r
+                                       partsAuthorInfo, versionInfo);\r
                }\r
                \r
                // パーツ管理情報を書き込む.\r
@@ -712,14 +794,20 @@ class PartsManageTableRow {
        \r
        private double version;\r
        \r
-       public PartsManageTableRow(PartsIdentifier partsIdentifier, PartsSpec partsSpec) {\r
+       private Timestamp lastModified;\r
+\r
+       public PartsManageTableRow(PartsIdentifier partsIdentifier,\r
+                       PartsSpec partsSpec, Timestamp lastModified) {\r
                if (partsIdentifier == null || partsSpec == null) {\r
                        throw new IllegalArgumentException();\r
                }\r
                this.partsIdentifier = partsIdentifier;\r
                this.localizedName = partsIdentifier.getLocalizedPartsName();\r
+\r
                this.timestamp = new Timestamp(partsSpec.getPartsFiles().lastModified());\r
                \r
+               this.lastModified = lastModified;\r
+               \r
                PartsAuthorInfo autherInfo = partsSpec.getAuthorInfo();\r
                if (autherInfo != null) {\r
                        author = autherInfo.getAuthor();\r
@@ -786,91 +874,57 @@ class PartsManageTableRow {
                this.homepage = homepage;\r
        }\r
        \r
+       public Timestamp getLastModified() {\r
+               return lastModified;\r
+       }\r
+\r
+       public void setLastModified(Timestamp lastModified) {\r
+               this.lastModified = lastModified;\r
+       }\r
 }\r
 \r
 class PartsManageTableModel extends AbstractTableModelWithComboBoxModel<PartsManageTableRow> {\r
 \r
        private static final long serialVersionUID = 1L;\r
 \r
-       private static final String[] COLUMN_NAMES;\r
-       \r
-       private static final int[] COLUMN_WIDTHS;\r
+       private static final Logger logger = Logger\r
+                       .getLogger(PartsManageTableModel.class.getName());\r
 \r
-       static {\r
-               Properties strings = LocalizedResourcePropertyLoader.getInstance()\r
-                               .getLocalizedProperties(PartsManageDialog.STRINGS_RESOURCE);\r
-\r
-               COLUMN_NAMES = new String[] {\r
-                               strings.getProperty("column.partsid"),\r
-                               strings.getProperty("column.lastmodified"),\r
-                               strings.getProperty("column.category"),\r
-                               strings.getProperty("column.partsname"),\r
-                               strings.getProperty("column.author"),\r
-                               strings.getProperty("column.version"),\r
-                               strings.getProperty("column.downloadURL"),\r
-               };\r
-               \r
-               COLUMN_WIDTHS = new int[] {\r
-                               Integer.parseInt(strings.getProperty("column.partsid.width")),\r
-                               Integer.parseInt(strings.getProperty("column.lastmodified.width")),\r
-                               Integer.parseInt(strings.getProperty("column.category.width")),\r
-                               Integer.parseInt(strings.getProperty("column.partsname.width")),\r
-                               Integer.parseInt(strings.getProperty("column.author.width")),\r
-                               Integer.parseInt(strings.getProperty("column.version.width")),\r
-                               Integer.parseInt(strings.getProperty("column.downloadURL.width")),\r
-               };\r
-               \r
-       }\r
-       \r
-       public int getColumnCount() {\r
-               return COLUMN_NAMES.length;\r
-       }\r
-       \r
-       @Override\r
-       public String getColumnName(int column) {\r
-               return COLUMN_NAMES[column];\r
-       }\r
-       \r
-       public void adjustColumnModel(TableColumnModel columnModel) {\r
-               for (int idx = 0; idx < COLUMN_WIDTHS.length; idx++) {\r
-                       columnModel.getColumn(idx).setPreferredWidth(COLUMN_WIDTHS[idx]);\r
-               }\r
-       }\r
+       private static Properties strings = LocalizedResourcePropertyLoader\r
+                       .getInstance().getLocalizedProperties(\r
+                                       PartsManageDialog.STRINGS_RESOURCE);\r
 \r
-       public Object getValueAt(int rowIndex, int columnIndex) {\r
-               PartsManageTableRow row = getRow(rowIndex);\r
-               switch (columnIndex) {\r
-               case 0:\r
-                       return row.getPartsIdentifier().getPartsName();\r
-               case 1:\r
-                       return row.getTimestamp().toString();\r
-               case 2:\r
-                       return row.getPartsIdentifier().getPartsCategory().getLocalizedCategoryName();\r
-               case 3:\r
-                       return row.getLocalizedName();\r
-               case 4:\r
-                       return row.getAuthor();\r
-               case 5:\r
-                       return row.getVersion() > 0 ? row.getVersion() : null;\r
-               case 6:\r
-                       return row.getDownloadURL();\r
-               }\r
-               return "";\r
-       }\r
-       \r
-       @Override\r
-       public void setValueAt(Object aValue, int rowIndex, int columnIndex) {\r
-               PartsManageTableRow row = getRow(rowIndex);\r
-               switch (columnIndex) {\r
-               case 0:\r
-                       return;\r
-               case 1:\r
-                       return;\r
-               case 2:\r
-                       return;\r
-               case 3:\r
-                       {\r
-                               String localizedName = (String) aValue;\r
+       /**\r
+        * カラムの定義\r
+        */\r
+       public enum Columns {\r
+               PartsID("column.partsid", false, String.class) {\r
+                       @Override\r
+                       public Object getValue(PartsManageTableRow row) {\r
+                               return row.getPartsIdentifier().getPartsName();\r
+                       }\r
+               },\r
+               LastModified("column.lastmodified", false, String.class) {\r
+                       @Override\r
+                       public Object getValue(PartsManageTableRow row) {\r
+                               return row.getTimestamp().toString();\r
+                       }\r
+               },\r
+               Category("column.category", false, String.class) {\r
+                       @Override\r
+                       public Object getValue(PartsManageTableRow row) {\r
+                               return row.getPartsIdentifier().getPartsCategory()\r
+                                               .getLocalizedCategoryName();\r
+                       }\r
+               },\r
+               PartsName("column.partsname", true, String.class) {\r
+                       @Override\r
+                       public Object getValue(PartsManageTableRow row) {\r
+                               return row.getLocalizedName();\r
+                       }\r
+                       @Override\r
+                       public void setValue(PartsManageTableRow row, Object value) {\r
+                               String localizedName = (String) value;\r
                                if (localizedName != null && localizedName.trim().length() > 0) {\r
                                        String oldValue = row.getLocalizedName();\r
                                        if (oldValue != null && oldValue.equals(localizedName)) {\r
@@ -879,10 +933,15 @@ class PartsManageTableModel extends AbstractTableModelWithComboBoxModel<PartsMan
                                        row.setLocalizedName(localizedName);\r
                                }\r
                        }\r
-                       break;\r
-               case 4:\r
-                       {\r
-                               String author = (String) aValue;\r
+               },\r
+               Author("column.author", true, String.class) {\r
+                       @Override\r
+                       public Object getValue(PartsManageTableRow row) {\r
+                               return row.getAuthor();\r
+                       }\r
+                       @Override\r
+                       public void setValue(PartsManageTableRow row, Object value) {\r
+                               String author = (String) value;\r
                                if (author == null) {\r
                                        author = "";\r
                                }\r
@@ -892,10 +951,15 @@ class PartsManageTableModel extends AbstractTableModelWithComboBoxModel<PartsMan
                                }\r
                                row.setAuthor(author);\r
                        }\r
-                       break;\r
-               case 5:\r
-                       {\r
-                               Double version = (Double) aValue;\r
+               },\r
+               Version("column.version", true, Double.class) {\r
+                       @Override\r
+                       public Object getValue(PartsManageTableRow row) {\r
+                               return row.getVersion() > 0 ? row.getVersion() : null;\r
+                       }\r
+                       @Override\r
+                       public void setValue(PartsManageTableRow row, Object value) {\r
+                               Double version = (Double) value;\r
                                if (version == null || version.doubleValue() <= 0) {\r
                                        version = Double.valueOf(0.);\r
                                }\r
@@ -905,10 +969,15 @@ class PartsManageTableModel extends AbstractTableModelWithComboBoxModel<PartsMan
                                }\r
                                row.setVersion(version);\r
                        }\r
-                       break;\r
-               case 6:\r
-                       {\r
-                               String downloadURL = (String) aValue;\r
+               },\r
+               DownloadURL("column.downloadURL", true, String.class) {\r
+                       @Override\r
+                       public Object getValue(PartsManageTableRow row) {\r
+                               return row.getDownloadURL();\r
+                       }\r
+                       @Override\r
+                       public void setValue(PartsManageTableRow row, Object value) {\r
+                               String downloadURL = (String) value;\r
                                if (downloadURL == null) {\r
                                        downloadURL = "";\r
                                }\r
@@ -918,42 +987,110 @@ class PartsManageTableModel extends AbstractTableModelWithComboBoxModel<PartsMan
                                }\r
                                row.setDownloadURL(downloadURL);\r
                        }\r
-                       break;\r
-               default:\r
+               };\r
+\r
+               private final Class<?> columnClass;\r
+\r
+               private final boolean editable;\r
+\r
+               private final String columnName;\r
+\r
+               private String displayName;\r
+\r
+               private int width;\r
+\r
+               private Columns(String columnName, boolean editable,\r
+                               Class<?> columnClass) {\r
+                       this.columnName = columnName;\r
+                       this.editable = editable;\r
+                       this.columnClass = columnClass;\r
+               }\r
+\r
+               public abstract Object getValue(PartsManageTableRow row);\r
+\r
+               public boolean isEditable() {\r
+                       return editable;\r
+               }\r
+\r
+               public Class<?> getColumnClass() {\r
+                       return columnClass;\r
+               }\r
+\r
+               public String getDisplayName() {\r
+                       init();\r
+                       return displayName;\r
+               }\r
+\r
+               public int getWidth() {\r
+                       init();\r
+                       return width;\r
+               }\r
+\r
+               public void setValue(PartsManageTableRow row, Object value) {\r
+                       // 何もしない.\r
+               }\r
+\r
+               private void init() {\r
+                       if (displayName != null) {\r
+                               return;\r
+                       }\r
+                       displayName = strings.getProperty(columnName);\r
+                       width = Integer\r
+                                       .parseInt(strings.getProperty(columnName + ".width"));\r
+               }\r
+       }\r
+\r
+       \r
+       public int getColumnCount() {\r
+               return Columns.values().length;\r
+       }\r
+       \r
+       @Override\r
+       public String getColumnName(int column) {\r
+               return Columns.values()[column].getDisplayName();\r
+       }\r
+       \r
+       public void adjustColumnModel(TableColumnModel columnModel) {\r
+               Columns[] columns = Columns.values();\r
+               for (int idx = 0; idx < columns.length; idx++) {\r
+                       columnModel.getColumn(idx).setPreferredWidth(\r
+                                       columns[idx].getWidth());\r
+               }\r
+       }\r
+\r
+       public Object getValueAt(int rowIndex, int columnIndex) {\r
+               PartsManageTableRow row = getRow(rowIndex);\r
+               Columns column = Columns.values()[columnIndex];\r
+               return column.getValue(row);\r
+       }\r
+       \r
+       @Override\r
+       public void setValueAt(Object aValue, int rowIndex, int columnIndex) {\r
+               PartsManageTableRow row = getRow(rowIndex);\r
+               Columns column = Columns.values()[columnIndex];\r
+               if (!column.isEditable()) {\r
                        return;\r
                }\r
+               column.setValue(row, aValue);\r
+\r
+               // 更新日を最新にする\r
+               Timestamp dt = row.getTimestamp();\r
+               row.setLastModified(dt);\r
+\r
                // 変更通知\r
                fireTableRowsUpdated(rowIndex, columnIndex);\r
        }\r
        \r
        @Override\r
        public Class<?> getColumnClass(int columnIndex) {\r
-               switch (columnIndex) {\r
-               case 0:\r
-                       return String.class;\r
-               case 1:\r
-                       return String.class;\r
-               case 2:\r
-                       return String.class;\r
-               case 3:\r
-                       return String.class;\r
-               case 4:\r
-                       return String.class;\r
-               case 5:\r
-                       return Double.class;\r
-               case 6:\r
-                       return String.class;\r
-               }\r
-               return String.class;\r
+               Columns column = Columns.values()[columnIndex];\r
+               return column.getColumnClass();\r
        }\r
        \r
        @Override\r
        public boolean isCellEditable(int rowIndex, int columnIndex) {\r
-               if (columnIndex == 0 || columnIndex == 1 || columnIndex == 2) {\r
-                       // PARTS ID/Timetsmap/CATEGORYは変更不可\r
-                       return false;\r
-               }\r
-               return true;\r
+               Columns column = Columns.values()[columnIndex];\r
+               return column.isEditable();\r
        }\r
        \r
        public void initModel(CharacterData characterData) {\r
@@ -962,13 +1099,42 @@ class PartsManageTableModel extends AbstractTableModelWithComboBoxModel<PartsMan
                }\r
                clear();\r
 \r
+               // 既存のパーツ管理情報ファイルがあれば読み込む\r
+               URI docBase = characterData.getDocBase();\r
+               PartsManageData partsManageData = null;\r
+               if (docBase != null) {\r
+                       try {\r
+                               PartsInfoXMLReader reader = new PartsInfoXMLReader();\r
+                               partsManageData = reader.loadPartsManageData(docBase);\r
+\r
+                       } catch (Exception ex) {\r
+                               logger.log(Level.WARNING, ex.toString(), ex);\r
+                       }\r
+               }\r
+               if (partsManageData == null) {\r
+                       partsManageData = new PartsManageData();\r
+               }\r
+\r
                for (PartsCategory partsCategory : characterData.getPartsCategories()) {\r
                        for (Map.Entry<PartsIdentifier, PartsSpec> entry : characterData\r
                                        .getPartsSpecMap(partsCategory).entrySet()) {\r
                                PartsIdentifier partsIdentifier = entry.getKey();\r
                                PartsSpec partsSpec = entry.getValue();\r
                                \r
-                               PartsManageTableRow row = new PartsManageTableRow(partsIdentifier, partsSpec);\r
+                               // パーツ管理情報ファイルから、パーツ管理情報を設定した時点の\r
+                               // ファイルサイズや更新日時などを読み取る.\r
+                               PartsKey partsKey = new PartsKey(partsIdentifier);\r
+                               PartsVersionInfo versionInfo = partsManageData\r
+                                               .getVersion(partsKey);\r
+\r
+                               Timestamp lastModified = null;\r
+\r
+                               if (versionInfo != null) {\r
+                                       lastModified = versionInfo.getLastModified();\r
+                               }\r
+\r
+                               PartsManageTableRow row = new PartsManageTableRow(\r
+                                               partsIdentifier, partsSpec, lastModified);\r
                                addRow(row);\r
                        }\r
                }\r
index 0e4e5bb..08914f9 100644 (file)
@@ -404,7 +404,8 @@ public final class ProfileListManager {
                        PartsDataLoader loader = loaderFactory.createPartsLoader(characterData.getDocBase());\r
                        PartsDataLoader colorGroupInfoDecorater = new PartsSpecDecorateLoader(loader, characterData.getColorGroups());\r
                        PartsManageDataDecorateLoader partsMngDecorater\r
-                                       = new PartsManageDataDecorateLoader(colorGroupInfoDecorater, new PartsManageDataDecorateLoader.PartsManageDataFactory() {\r
+                                       = new PartsManageDataDecorateLoader(colorGroupInfoDecorater,\r
+                                                       new PartsManageDataDecorateLoader.PartsManageDataFactory() {\r
                                                public PartsManageData createPartsManageData() {\r
                                                        try {\r
                                                                return xmlReader\r