OSDN Git Service

リポジトリ内改行コードのLFへの修正
[charactermanaj/CharacterManaJ.git] / src / main / java / charactermanaj / ui / ManageFavoriteDialog.java
index f07130b..b8fc132 100644 (file)
-package charactermanaj.ui;\r
-\r
-import java.awt.BorderLayout;\r
-import java.awt.Container;\r
-import java.awt.Dimension;\r
-import java.awt.GridBagConstraints;\r
-import java.awt.GridBagLayout;\r
-import java.awt.Point;\r
-import java.awt.Toolkit;\r
-import java.awt.event.ActionEvent;\r
-import java.awt.event.KeyEvent;\r
-import java.awt.event.MouseAdapter;\r
-import java.awt.event.MouseEvent;\r
-import java.awt.event.WindowAdapter;\r
-import java.awt.event.WindowEvent;\r
-import java.util.ArrayList;\r
-import java.util.Arrays;\r
-import java.util.Collections;\r
-import java.util.Iterator;\r
-import java.util.List;\r
-import java.util.Map;\r
-import java.util.Properties;\r
-\r
-import javax.swing.AbstractAction;\r
-import javax.swing.Action;\r
-import javax.swing.ActionMap;\r
-import javax.swing.BorderFactory;\r
-import javax.swing.Box;\r
-import javax.swing.InputMap;\r
-import javax.swing.JButton;\r
-import javax.swing.JComponent;\r
-import javax.swing.JDialog;\r
-import javax.swing.JFrame;\r
-import javax.swing.JMenuItem;\r
-import javax.swing.JOptionPane;\r
-import javax.swing.JPanel;\r
-import javax.swing.JPopupMenu;\r
-import javax.swing.JRootPane;\r
-import javax.swing.JScrollPane;\r
-import javax.swing.JTable;\r
-import javax.swing.KeyStroke;\r
-import javax.swing.ListSelectionModel;\r
-import javax.swing.SwingUtilities;\r
-import javax.swing.UIManager;\r
-import javax.swing.event.ListSelectionEvent;\r
-import javax.swing.event.ListSelectionListener;\r
-import javax.swing.table.AbstractTableModel;\r
-\r
-import charactermanaj.model.CharacterData;\r
-import charactermanaj.model.PartsSet;\r
-import charactermanaj.util.LocalizedResourcePropertyLoader;\r
-import charactermanaj.util.UIHelper;\r
-\r
-/**\r
- * お気に入りの編集ダイアログ\r
- * \r
- * @author seraphy\r
- */\r
-public class ManageFavoriteDialog extends JDialog {\r
-\r
-       private static final long serialVersionUID = 1L;\r
-\r
-       protected static final String STRINGS_RESOURCE = "languages/managefavoritesdialog";\r
-\r
-       private CharacterData characterData;\r
-       \r
-       private PartsSetListTableModel partsSetListModel;\r
-       \r
-       private JTable partsSetList;\r
-\r
-       private FavoriteManageCallback callback;\r
-\r
-       private Action actSelect;\r
-\r
-       private Action actDelete;\r
-\r
-       private Action actRename;\r
-\r
-       public static class PartsSetListTableModel extends AbstractTableModel {\r
-\r
-               /**\r
-                * シリアライズバージョンID\r
-                */\r
-               private static final long serialVersionUID = 3012538368342673506L;\r
-\r
-               /**\r
-                * パーツセットのリスト\r
-                */\r
-               private List<PartsSet> partsSetList = Collections.emptyList();\r
-\r
-               private enum Columns {\r
-                       DISPLAY_NAME("Name") {\r
-                               @Override\r
-                               public Object getValue(PartsSet partsSet) {\r
-                                       if (partsSet != null) {\r
-                                               return partsSet.getLocalizedName();\r
-                                       }\r
-                                       return null;\r
-                               }\r
-                       },\r
-                       IS_PRESET("Type") {\r
-                               @Override\r
-                               public Object getValue(PartsSet partsSet) {\r
-                                       if (partsSet != null) {\r
-                                               return partsSet.isPresetParts()\r
-                                                               ? "Preset"\r
-                                                               : "Favorites";\r
-                                       }\r
-                                       return null;\r
-                               }\r
-                       };\r
-\r
-                       private String columnName;\r
-\r
-                       private Columns(String columnName) {\r
-                               this.columnName = columnName;\r
-                       }\r
-\r
-                       public Class<?> getColumnClass() {\r
-                               return String.class;\r
-                       }\r
-\r
-                       public String getColumnName() {\r
-                               return columnName;\r
-                       }\r
-\r
-                       public abstract Object getValue(PartsSet partsSet);\r
-               }\r
-\r
-               private static Columns[] columns = Columns.values();\r
-\r
-               public int getColumnCount() {\r
-                       return columns.length;\r
-               }\r
-\r
-               public int getRowCount() {\r
-                       return partsSetList.size();\r
-               }\r
-\r
-               public Object getValueAt(int rowIndex, int columnIndex) {\r
-                       PartsSet partsSet = getRow(rowIndex);\r
-                       return columns[columnIndex].getValue(partsSet);\r
-               }\r
-\r
-               @Override\r
-               public Class<?> getColumnClass(int columnIndex) {\r
-                       return columns[columnIndex].getColumnClass();\r
-               }\r
-\r
-               @Override\r
-               public String getColumnName(int column) {\r
-                       return columns[column].getColumnName();\r
-               }\r
-\r
-               public PartsSet getRow(int rowIndex) {\r
-                       return partsSetList.get(rowIndex);\r
-               }\r
-\r
-               public void updateRow(int rowIndex, PartsSet partsSet) {\r
-                       partsSetList.set(rowIndex, partsSet);\r
-                       fireTableRowsUpdated(rowIndex, rowIndex);\r
-               }\r
-\r
-               public List<PartsSet> getPartsSetList() {\r
-                       return new ArrayList<PartsSet>(partsSetList);\r
-               }\r
-\r
-               public void setPartsSetList(List<PartsSet> partsSetList) {\r
-                       if (partsSetList == null) {\r
-                               partsSetList = Collections.emptyList();\r
-                       }\r
-                       this.partsSetList = new ArrayList<PartsSet>(partsSetList);\r
-                       fireTableDataChanged();\r
-               }\r
-       }\r
-\r
-       /**\r
-        * パーツセットの選択および保存を行うためのコールバック.\r
-        */\r
-       public interface FavoriteManageCallback {\r
-\r
-               /**\r
-                * 引数で指定されたパーツセットを表示する.\r
-                * \r
-                * @param partsSet\r
-                */\r
-               void selectFavorites(PartsSet partsSet);\r
-\r
-               /**\r
-                * 指定したキャラクターデータのお気に入りを保存する.<br>\r
-                * presetを変更した場合はcharacter.xmlを更新するためにsavePreset引数をtrueとする.<br>\r
-                * \r
-                * @param characterData\r
-                *            お気に入りを保存するキャラクターデータ\r
-                * @param savePreset\r
-                *            character.xmlを更新する場合(presetの更新)\r
-                */\r
-               void updateFavorites(CharacterData characterData, boolean savePreset);\r
-       }\r
-\r
-       public ManageFavoriteDialog(JFrame parent, CharacterData characterData) {\r
-               super(parent, false);\r
-               if (characterData == null) {\r
-                       throw new IllegalArgumentException();\r
-               }\r
-               \r
-               setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);\r
-               addWindowListener(new WindowAdapter() {\r
-                       @Override\r
-                       public void windowClosing(WindowEvent e) {\r
-                               onClose();\r
-                       }\r
-               });\r
-               \r
-               Properties strings = LocalizedResourcePropertyLoader\r
-                               .getCachedInstance()\r
-                               .getLocalizedProperties(STRINGS_RESOURCE);\r
-\r
-               setTitle(strings.getProperty("manageFavorites"));\r
-               \r
-               this.characterData = characterData;\r
-               \r
-               characterData.getPartsSets();\r
-               \r
-               Container contentPane = getContentPane();\r
-               contentPane.setLayout(new BorderLayout());\r
-               \r
-               partsSetListModel = new PartsSetListTableModel();\r
-               partsSetList = new JTable(partsSetListModel);\r
-               partsSetList.setRowSelectionAllowed(true);\r
-               partsSetList\r
-                               .setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);\r
-\r
-               partsSetList.setTableHeader(null);\r
-               partsSetList.getColumnModel().getColumn(1).setMaxWidth(150);\r
-               \r
-               partsSetList.getSelectionModel().addListSelectionListener(\r
-                               new ListSelectionListener() {\r
-                                       public void valueChanged(ListSelectionEvent e) {\r
-                                               updateButtonUI();\r
-                                       }\r
-                               });\r
-\r
-               actSelect = new AbstractAction(strings.getProperty("select")) {\r
-                       private static final long serialVersionUID = 1L;\r
-                       public void actionPerformed(ActionEvent e) {\r
-                               onSelect();\r
-                       }\r
-               };\r
-               actDelete = new AbstractAction(strings.getProperty("remove")) {\r
-                       private static final long serialVersionUID = 1L;\r
-                       public void actionPerformed(ActionEvent e) {\r
-                               onDelete();\r
-                       }\r
-               };\r
-               actRename = new AbstractAction(strings.getProperty("rename")) {\r
-                       private static final long serialVersionUID = 1L;\r
-                       public void actionPerformed(ActionEvent e) {\r
-                               onRename();\r
-                       }\r
-               };\r
-\r
-               JPanel buttonsPanel = new JPanel();\r
-               GridBagLayout gb = new GridBagLayout();\r
-               GridBagConstraints gbc = new GridBagConstraints();\r
-               buttonsPanel.setLayout(gb);\r
-               \r
-               gbc.gridx = 0;\r
-               gbc.gridy = 0;\r
-               gbc.anchor = GridBagConstraints.EAST;\r
-               gbc.fill = GridBagConstraints.BOTH;\r
-               buttonsPanel.add(new JButton(actSelect), gbc);\r
-\r
-               gbc.gridx = 0;\r
-               gbc.gridy = 1;\r
-               buttonsPanel.add(new JButton(actDelete), gbc);\r
-\r
-               gbc.gridx = 0;\r
-               gbc.gridy = 2;\r
-               buttonsPanel.add(new JButton(actRename), gbc);\r
-               \r
-               gbc.gridx = 0;\r
-               gbc.gridy = 3;\r
-               gbc.weighty = 1.;\r
-               buttonsPanel.add(Box.createGlue(), gbc);\r
-\r
-               \r
-               JPanel panel2 = new JPanel();\r
-               panel2.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 42));\r
-               panel2.setLayout(new BorderLayout());\r
-               Action actCancel = new AbstractAction(strings.getProperty("close")) {\r
-                       private static final long serialVersionUID = 1L;\r
-                       public void actionPerformed(ActionEvent e) {\r
-                               onClose();\r
-                       }\r
-               };\r
-               JButton btnClose = new JButton(actCancel);\r
-               panel2.add(btnClose, BorderLayout.EAST);\r
-\r
-               JScrollPane scr = new JScrollPane(partsSetList);\r
-               scr.setBorder(BorderFactory.createEtchedBorder());\r
-               scr.setPreferredSize(new Dimension(300, 150));\r
-               \r
-               contentPane.add(scr, BorderLayout.CENTER);\r
-               contentPane.add(buttonsPanel, BorderLayout.EAST);\r
-               contentPane.add(panel2, BorderLayout.SOUTH);\r
-\r
-               Toolkit tk = Toolkit.getDefaultToolkit();\r
-               JRootPane rootPane = getRootPane();\r
-               rootPane.setDefaultButton(btnClose);\r
-               InputMap im = rootPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);\r
-               ActionMap am = rootPane.getActionMap();\r
-               im.put(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0), "deleteFav");\r
-               im.put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "closeManageFavoriteDialog");\r
-               im.put(KeyStroke.getKeyStroke(KeyEvent.VK_W, tk.getMenuShortcutKeyMask()), "closeManageFavoriteDialog");\r
-               am.put("deleteFav", actDelete);\r
-               am.put("closeManageFavoriteDialog", actCancel);\r
-\r
-               setSize(400, 500);\r
-               setLocationRelativeTo(parent);\r
-               \r
-               final JPopupMenu popupMenu = new JPopupMenu();\r
-               popupMenu.add(new JMenuItem(actSelect));\r
-               popupMenu.add(new JMenuItem(actRename));\r
-               popupMenu.add(new JMenuItem(actDelete));\r
-\r
-               partsSetList.addMouseListener(new MouseAdapter() {\r
-                       @Override\r
-                       public void mouseClicked(MouseEvent e) {\r
-                               if (e.getClickCount() == 2) {\r
-                                       onSelect();\r
-                               }\r
-                       }\r
-                       @Override\r
-                       public void mousePressed(MouseEvent e) {\r
-                               if (SwingUtilities.isRightMouseButton(e)) {\r
-                                       // 右クリックによる選択\r
-                                       Point pt = e.getPoint();\r
-                                       int rowIndex = partsSetList.rowAtPoint(pt);\r
-                                       if (rowIndex >= 0) {\r
-                                               int[] selrows = partsSetList.getSelectedRows();\r
-                                               if (!Arrays.asList(selrows).contains(rowIndex)) {\r
-                                                       // 現在の選択行以外を右クリックした場合、その行を選択行とする.\r
-                                                       ListSelectionModel selModel = partsSetList\r
-                                                                       .getSelectionModel();\r
-                                                       selModel.setSelectionInterval(rowIndex, rowIndex);\r
-                                               }\r
-                                       }\r
-                               }\r
-                               evaluatePopup(e);\r
-                       }\r
-                       @Override\r
-                       public void mouseReleased(MouseEvent e) {\r
-                               evaluatePopup(e);\r
-                       }\r
-                       private void evaluatePopup(MouseEvent e) {\r
-                               if (e.isPopupTrigger()) {\r
-                                       popupMenu.show(partsSetList, e.getX(), e.getY());\r
-                               }\r
-                       }\r
-               });\r
-\r
-               initListModel();\r
-\r
-               updateButtonUI();\r
-       }\r
-       \r
-       /**\r
-        * 現在のキャラクターデータの最新の状態でお気に入り一覧を更新する.\r
-        */\r
-       public void initListModel() {\r
-               ArrayList<PartsSet> partssets = new ArrayList<PartsSet>();\r
-               for (PartsSet partsset : characterData.getPartsSets().values()) {\r
-                       partssets.add(partsset);\r
-               }\r
-               Collections.sort(partssets, PartsSet.DEFAULT_COMPARATOR);\r
-               partsSetListModel.setPartsSetList(partssets);\r
-       }\r
-\r
-       protected void updateButtonUI() {\r
-               int[] rows = partsSetList.getSelectedRows();\r
-               actSelect.setEnabled(rows.length == 1);\r
-               actRename.setEnabled(rows.length == 1);\r
-               actDelete.setEnabled(rows.length >= 1);\r
-       }\r
-\r
-       /**\r
-        * 選択されている「お気に入り」のパーツセットの一覧を取得する.<br>\r
-        * プリセットが選択されている場合、それは除外される.<br>\r
-        * \r
-        * @param beep\r
-        *            プリセットが選択されている場合にビープを鳴らすか?\r
-        * @return お気に入りのパーツセットのリスト、選択がなければ空のリスト.\r
-        */\r
-       protected List<PartsSet> getSelectedPartsSet() {\r
-               ArrayList<PartsSet> selectedPartsSet = new ArrayList<PartsSet>();\r
-               int[] rows = partsSetList.getSelectedRows();\r
-               for (int row : rows) {\r
-                       PartsSet partsSet = partsSetListModel.getRow(row);\r
-                       selectedPartsSet.add(partsSet);\r
-               }\r
-               return selectedPartsSet;\r
-       }\r
-\r
-       /**\r
-        * お気に入りの削除\r
-        */\r
-       protected void onDelete() {\r
-               List<PartsSet> removePartsSet = getSelectedPartsSet();\r
-               if (removePartsSet.isEmpty() || callback == null) {\r
-                       return;\r
-               }\r
-\r
-               // 削除の確認ダイアログ\r
-               Properties strings = LocalizedResourcePropertyLoader.getCachedInstance()\r
-                               .getLocalizedProperties(STRINGS_RESOURCE);\r
-\r
-               String msg = strings.getProperty("favorite.remove.confirm");\r
-               JOptionPane optionPane = new JOptionPane(msg,\r
-                               JOptionPane.QUESTION_MESSAGE, JOptionPane.YES_NO_OPTION) {\r
-                       private static final long serialVersionUID = 1L;\r
-                       @Override\r
-                       public void selectInitialValue() {\r
-                               String noBtnCaption = UIManager\r
-                                               .getString("OptionPane.noButtonText");\r
-                               for (JButton btn : UIHelper.getInstance().getDescendantOfClass(\r
-                                               JButton.class, this)) {\r
-                                       if (btn.getText().equals(noBtnCaption)) {\r
-                                               // 「いいえ」ボタンにフォーカスを設定\r
-                                               btn.requestFocus();\r
-                                       }\r
-                               }\r
-                       }\r
-               };\r
-               JDialog dlg = optionPane.createDialog(ManageFavoriteDialog.this,\r
-                               strings.getProperty("confirm.remove"));\r
-               dlg.setVisible(true);\r
-               Object ret = optionPane.getValue();\r
-               if (ret == null || ((Number) ret).intValue() != JOptionPane.YES_OPTION) {\r
-                       return;\r
-               }\r
-\r
-               // お気に入りリストから削除する.\r
-               boolean dirty = false;\r
-               boolean deletePreset = false;\r
-               Map<String, PartsSet> partsSetMap = characterData.getPartsSets();\r
-               for (PartsSet partsSet : removePartsSet) {\r
-                       Iterator<Map.Entry<String, PartsSet>> ite = partsSetMap.entrySet().iterator();\r
-                       while (ite.hasNext()) {\r
-                               Map.Entry<String, PartsSet> entry = ite.next();\r
-                               PartsSet target = entry.getValue();\r
-                               if (target == partsSet) {\r
-                                       dirty = true;\r
-                                       if (target.isPresetParts()) {\r
-                                               // presetを削除した場合はcharacter.xmlの更新が必要\r
-                                               deletePreset = true;\r
-                                       }\r
-                                       ite.remove();\r
-                               }\r
-                       }\r
-               }\r
-               if (dirty) {\r
-                       callback.updateFavorites(characterData, deletePreset);\r
-                       initListModel();\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * お気に入りのリネーム\r
-        */\r
-       protected void onRename() {\r
-               int row = partsSetList.getSelectedRow();\r
-               if (row < 0 || callback == null) {\r
-                       return;\r
-               }\r
-               PartsSet partsSet = partsSetListModel.getRow(row);\r
-\r
-               Properties strings = LocalizedResourcePropertyLoader\r
-                               .getCachedInstance().getLocalizedProperties(STRINGS_RESOURCE);\r
-\r
-               String localizedName = JOptionPane.showInputDialog(this,\r
-                               strings.getProperty("inputName"), partsSet.getLocalizedName());\r
-               if (localizedName != null) {\r
-                       partsSet.setLocalizedName(localizedName);\r
-                       callback.updateFavorites(characterData, partsSet.isPresetParts());\r
-                       initListModel();\r
-               }\r
-       }\r
-       \r
-       /**\r
-        * 選択したお気に入りを表示する.\r
-        */\r
-       protected void onSelect() {\r
-               int row = partsSetList.getSelectedRow();\r
-               if (row < 0) {\r
-                       return;\r
-               }\r
-               PartsSet partsSet = partsSetListModel.getRow(row);\r
-               if (callback != null) {\r
-                       callback.selectFavorites(partsSet);\r
-               }\r
-       }\r
-\r
-       protected void onClose() {\r
-               dispose();\r
-       }\r
-       \r
-       public void setFavoriteManageCallback(FavoriteManageCallback callback) {\r
-               this.callback = callback;\r
-       }\r
-\r
-       public FavoriteManageCallback getFavoriteManageCallback() {\r
-               return callback;\r
-       }\r
-}\r
+package charactermanaj.ui;
+
+import java.awt.BorderLayout;
+import java.awt.Container;
+import java.awt.Dimension;
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+import java.awt.Point;
+import java.awt.Toolkit;
+import java.awt.event.ActionEvent;
+import java.awt.event.KeyEvent;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+import javax.swing.AbstractAction;
+import javax.swing.Action;
+import javax.swing.ActionMap;
+import javax.swing.BorderFactory;
+import javax.swing.Box;
+import javax.swing.InputMap;
+import javax.swing.JButton;
+import javax.swing.JComponent;
+import javax.swing.JDialog;
+import javax.swing.JFrame;
+import javax.swing.JMenuItem;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JPopupMenu;
+import javax.swing.JRootPane;
+import javax.swing.JScrollPane;
+import javax.swing.JTable;
+import javax.swing.KeyStroke;
+import javax.swing.ListSelectionModel;
+import javax.swing.SwingUtilities;
+import javax.swing.UIManager;
+import javax.swing.event.ListSelectionEvent;
+import javax.swing.event.ListSelectionListener;
+import javax.swing.table.AbstractTableModel;
+
+import charactermanaj.model.CharacterData;
+import charactermanaj.model.PartsSet;
+import charactermanaj.util.LocalizedResourcePropertyLoader;
+import charactermanaj.util.UIHelper;
+
+/**
+ * お気に入りの編集ダイアログ
+ *
+ * @author seraphy
+ */
+public class ManageFavoriteDialog extends JDialog {
+
+       private static final long serialVersionUID = 1L;
+
+       protected static final String STRINGS_RESOURCE = "languages/managefavoritesdialog";
+
+       private CharacterData characterData;
+
+       private PartsSetListTableModel partsSetListModel;
+
+       private JTable partsSetList;
+
+       private FavoriteManageCallback callback;
+
+       private Action actSelect;
+
+       private Action actDelete;
+
+       private Action actRename;
+
+       public static class PartsSetListTableModel extends AbstractTableModel {
+
+               /**
+                * シリアライズバージョンID
+                */
+               private static final long serialVersionUID = 3012538368342673506L;
+
+               /**
+                * パーツセットのリスト
+                */
+               private List<PartsSet> partsSetList = Collections.emptyList();
+
+               private enum Columns {
+                       DISPLAY_NAME("Name") {
+                               @Override
+                               public Object getValue(PartsSet partsSet) {
+                                       if (partsSet != null) {
+                                               return partsSet.getLocalizedName();
+                                       }
+                                       return null;
+                               }
+                       },
+                       IS_PRESET("Type") {
+                               @Override
+                               public Object getValue(PartsSet partsSet) {
+                                       if (partsSet != null) {
+                                               return partsSet.isPresetParts()
+                                                               ? "Preset"
+                                                               : "Favorites";
+                                       }
+                                       return null;
+                               }
+                       };
+
+                       private String columnName;
+
+                       private Columns(String columnName) {
+                               this.columnName = columnName;
+                       }
+
+                       public Class<?> getColumnClass() {
+                               return String.class;
+                       }
+
+                       public String getColumnName() {
+                               return columnName;
+                       }
+
+                       public abstract Object getValue(PartsSet partsSet);
+               }
+
+               private static Columns[] columns = Columns.values();
+
+               public int getColumnCount() {
+                       return columns.length;
+               }
+
+               public int getRowCount() {
+                       return partsSetList.size();
+               }
+
+               public Object getValueAt(int rowIndex, int columnIndex) {
+                       PartsSet partsSet = getRow(rowIndex);
+                       return columns[columnIndex].getValue(partsSet);
+               }
+
+               @Override
+               public Class<?> getColumnClass(int columnIndex) {
+                       return columns[columnIndex].getColumnClass();
+               }
+
+               @Override
+               public String getColumnName(int column) {
+                       return columns[column].getColumnName();
+               }
+
+               public PartsSet getRow(int rowIndex) {
+                       return partsSetList.get(rowIndex);
+               }
+
+               public void updateRow(int rowIndex, PartsSet partsSet) {
+                       partsSetList.set(rowIndex, partsSet);
+                       fireTableRowsUpdated(rowIndex, rowIndex);
+               }
+
+               public List<PartsSet> getPartsSetList() {
+                       return new ArrayList<PartsSet>(partsSetList);
+               }
+
+               public void setPartsSetList(List<PartsSet> partsSetList) {
+                       if (partsSetList == null) {
+                               partsSetList = Collections.emptyList();
+                       }
+                       this.partsSetList = new ArrayList<PartsSet>(partsSetList);
+                       fireTableDataChanged();
+               }
+       }
+
+       /**
+        * パーツセットの選択および保存を行うためのコールバック.
+        */
+       public interface FavoriteManageCallback {
+
+               /**
+                * 引数で指定されたパーツセットを表示する.
+                *
+                * @param partsSet
+                */
+               void selectFavorites(PartsSet partsSet);
+
+               /**
+                * 指定したキャラクターデータのお気に入りを保存する.<br>
+                * presetを変更した場合はcharacter.xmlを更新するためにsavePreset引数をtrueとする.<br>
+                *
+                * @param characterData
+                *            お気に入りを保存するキャラクターデータ
+                * @param savePreset
+                *            character.xmlを更新する場合(presetの更新)
+                */
+               void updateFavorites(CharacterData characterData, boolean savePreset);
+       }
+
+       public ManageFavoriteDialog(JFrame parent, CharacterData characterData) {
+               super(parent, false);
+               if (characterData == null) {
+                       throw new IllegalArgumentException();
+               }
+
+               setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
+               addWindowListener(new WindowAdapter() {
+                       @Override
+                       public void windowClosing(WindowEvent e) {
+                               onClose();
+                       }
+               });
+
+               Properties strings = LocalizedResourcePropertyLoader
+                               .getCachedInstance()
+                               .getLocalizedProperties(STRINGS_RESOURCE);
+
+               setTitle(strings.getProperty("manageFavorites"));
+
+               this.characterData = characterData;
+
+               characterData.getPartsSets();
+
+               Container contentPane = getContentPane();
+               contentPane.setLayout(new BorderLayout());
+
+               partsSetListModel = new PartsSetListTableModel();
+               partsSetList = new JTable(partsSetListModel);
+               partsSetList.setRowSelectionAllowed(true);
+               partsSetList
+                               .setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
+
+               partsSetList.setTableHeader(null);
+               partsSetList.getColumnModel().getColumn(1).setMaxWidth(150);
+
+               partsSetList.getSelectionModel().addListSelectionListener(
+                               new ListSelectionListener() {
+                                       public void valueChanged(ListSelectionEvent e) {
+                                               updateButtonUI();
+                                       }
+                               });
+
+               actSelect = new AbstractAction(strings.getProperty("select")) {
+                       private static final long serialVersionUID = 1L;
+                       public void actionPerformed(ActionEvent e) {
+                               onSelect();
+                       }
+               };
+               actDelete = new AbstractAction(strings.getProperty("remove")) {
+                       private static final long serialVersionUID = 1L;
+                       public void actionPerformed(ActionEvent e) {
+                               onDelete();
+                       }
+               };
+               actRename = new AbstractAction(strings.getProperty("rename")) {
+                       private static final long serialVersionUID = 1L;
+                       public void actionPerformed(ActionEvent e) {
+                               onRename();
+                       }
+               };
+
+               JPanel buttonsPanel = new JPanel();
+               GridBagLayout gb = new GridBagLayout();
+               GridBagConstraints gbc = new GridBagConstraints();
+               buttonsPanel.setLayout(gb);
+
+               gbc.gridx = 0;
+               gbc.gridy = 0;
+               gbc.anchor = GridBagConstraints.EAST;
+               gbc.fill = GridBagConstraints.BOTH;
+               buttonsPanel.add(new JButton(actSelect), gbc);
+
+               gbc.gridx = 0;
+               gbc.gridy = 1;
+               buttonsPanel.add(new JButton(actDelete), gbc);
+
+               gbc.gridx = 0;
+               gbc.gridy = 2;
+               buttonsPanel.add(new JButton(actRename), gbc);
+
+               gbc.gridx = 0;
+               gbc.gridy = 3;
+               gbc.weighty = 1.;
+               buttonsPanel.add(Box.createGlue(), gbc);
+
+
+               JPanel panel2 = new JPanel();
+               panel2.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 42));
+               panel2.setLayout(new BorderLayout());
+               Action actCancel = new AbstractAction(strings.getProperty("close")) {
+                       private static final long serialVersionUID = 1L;
+                       public void actionPerformed(ActionEvent e) {
+                               onClose();
+                       }
+               };
+               JButton btnClose = new JButton(actCancel);
+               panel2.add(btnClose, BorderLayout.EAST);
+
+               JScrollPane scr = new JScrollPane(partsSetList);
+               scr.setBorder(BorderFactory.createEtchedBorder());
+               scr.setPreferredSize(new Dimension(300, 150));
+
+               contentPane.add(scr, BorderLayout.CENTER);
+               contentPane.add(buttonsPanel, BorderLayout.EAST);
+               contentPane.add(panel2, BorderLayout.SOUTH);
+
+               Toolkit tk = Toolkit.getDefaultToolkit();
+               JRootPane rootPane = getRootPane();
+               rootPane.setDefaultButton(btnClose);
+               InputMap im = rootPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
+               ActionMap am = rootPane.getActionMap();
+               im.put(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0), "deleteFav");
+               im.put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "closeManageFavoriteDialog");
+               im.put(KeyStroke.getKeyStroke(KeyEvent.VK_W, tk.getMenuShortcutKeyMask()), "closeManageFavoriteDialog");
+               am.put("deleteFav", actDelete);
+               am.put("closeManageFavoriteDialog", actCancel);
+
+               setSize(400, 500);
+               setLocationRelativeTo(parent);
+
+               final JPopupMenu popupMenu = new JPopupMenu();
+               popupMenu.add(new JMenuItem(actSelect));
+               popupMenu.add(new JMenuItem(actRename));
+               popupMenu.add(new JMenuItem(actDelete));
+
+               partsSetList.addMouseListener(new MouseAdapter() {
+                       @Override
+                       public void mouseClicked(MouseEvent e) {
+                               if (e.getClickCount() == 2) {
+                                       onSelect();
+                               }
+                       }
+                       @Override
+                       public void mousePressed(MouseEvent e) {
+                               if (SwingUtilities.isRightMouseButton(e)) {
+                                       // 右クリックによる選択
+                                       Point pt = e.getPoint();
+                                       int rowIndex = partsSetList.rowAtPoint(pt);
+                                       if (rowIndex >= 0) {
+                                               int[] selrows = partsSetList.getSelectedRows();
+                                               Arrays.sort(selrows);
+                                               if (Arrays.binarySearch(selrows, rowIndex) < 0) {
+                                                       // 現在の選択行以外を右クリックした場合、その行を選択行とする.
+                                                       ListSelectionModel selModel = partsSetList
+                                                                       .getSelectionModel();
+                                                       selModel.setSelectionInterval(rowIndex, rowIndex);
+                                               }
+                                       }
+                               }
+                               evaluatePopup(e);
+                       }
+                       @Override
+                       public void mouseReleased(MouseEvent e) {
+                               evaluatePopup(e);
+                       }
+                       private void evaluatePopup(MouseEvent e) {
+                               if (e.isPopupTrigger()) {
+                                       popupMenu.show(partsSetList, e.getX(), e.getY());
+                               }
+                       }
+               });
+
+               initListModel();
+
+               updateButtonUI();
+       }
+
+       /**
+        * 現在のキャラクターデータの最新の状態でお気に入り一覧を更新する.
+        */
+       public void initListModel() {
+               ArrayList<PartsSet> partssets = new ArrayList<PartsSet>();
+               for (PartsSet partsset : characterData.getPartsSets().values()) {
+                       partssets.add(partsset);
+               }
+               Collections.sort(partssets, PartsSet.DEFAULT_COMPARATOR);
+               partsSetListModel.setPartsSetList(partssets);
+       }
+
+       protected void updateButtonUI() {
+               int[] rows = partsSetList.getSelectedRows();
+               actSelect.setEnabled(rows.length == 1);
+               actRename.setEnabled(rows.length == 1);
+               actDelete.setEnabled(rows.length >= 1);
+       }
+
+       /**
+        * 選択されている「お気に入り」のパーツセットの一覧を取得する.<br>
+        * プリセットが選択されている場合、それは除外される.<br>
+        *
+        * @param beep
+        *            プリセットが選択されている場合にビープを鳴らすか?
+        * @return お気に入りのパーツセットのリスト、選択がなければ空のリスト.
+        */
+       protected List<PartsSet> getSelectedPartsSet() {
+               ArrayList<PartsSet> selectedPartsSet = new ArrayList<PartsSet>();
+               int[] rows = partsSetList.getSelectedRows();
+               for (int row : rows) {
+                       PartsSet partsSet = partsSetListModel.getRow(row);
+                       selectedPartsSet.add(partsSet);
+               }
+               return selectedPartsSet;
+       }
+
+       /**
+        * お気に入りの削除
+        */
+       protected void onDelete() {
+               List<PartsSet> removePartsSet = getSelectedPartsSet();
+               if (removePartsSet.isEmpty() || callback == null) {
+                       return;
+               }
+
+               // 削除の確認ダイアログ
+               Properties strings = LocalizedResourcePropertyLoader.getCachedInstance()
+                               .getLocalizedProperties(STRINGS_RESOURCE);
+
+               String msg = strings.getProperty("favorite.remove.confirm");
+               JOptionPane optionPane = new JOptionPane(msg,
+                               JOptionPane.QUESTION_MESSAGE, JOptionPane.YES_NO_OPTION) {
+                       private static final long serialVersionUID = 1L;
+                       @Override
+                       public void selectInitialValue() {
+                               String noBtnCaption = UIManager
+                                               .getString("OptionPane.noButtonText");
+                               for (JButton btn : UIHelper.getInstance().getDescendantOfClass(
+                                               JButton.class, this)) {
+                                       if (btn.getText().equals(noBtnCaption)) {
+                                               // 「いいえ」ボタンにフォーカスを設定
+                                               btn.requestFocus();
+                                       }
+                               }
+                       }
+               };
+               JDialog dlg = optionPane.createDialog(ManageFavoriteDialog.this,
+                               strings.getProperty("confirm.remove"));
+               dlg.setVisible(true);
+               Object ret = optionPane.getValue();
+               if (ret == null || ((Number) ret).intValue() != JOptionPane.YES_OPTION) {
+                       return;
+               }
+
+               // お気に入りリストから削除する.
+               boolean dirty = false;
+               boolean deletePreset = false;
+               Map<String, PartsSet> partsSetMap = characterData.getPartsSets();
+               for (PartsSet partsSet : removePartsSet) {
+                       Iterator<Map.Entry<String, PartsSet>> ite = partsSetMap.entrySet().iterator();
+                       while (ite.hasNext()) {
+                               Map.Entry<String, PartsSet> entry = ite.next();
+                               PartsSet target = entry.getValue();
+                               if (target == partsSet) {
+                                       dirty = true;
+                                       if (target.isPresetParts()) {
+                                               // presetを削除した場合はcharacter.xmlの更新が必要
+                                               deletePreset = true;
+                                       }
+                                       ite.remove();
+                               }
+                       }
+               }
+               if (dirty) {
+                       callback.updateFavorites(characterData, deletePreset);
+                       initListModel();
+               }
+       }
+
+       /**
+        * お気に入りのリネーム
+        */
+       protected void onRename() {
+               int row = partsSetList.getSelectedRow();
+               if (row < 0 || callback == null) {
+                       return;
+               }
+               PartsSet partsSet = partsSetListModel.getRow(row);
+
+               Properties strings = LocalizedResourcePropertyLoader
+                               .getCachedInstance().getLocalizedProperties(STRINGS_RESOURCE);
+
+               String localizedName = JOptionPane.showInputDialog(this,
+                               strings.getProperty("inputName"), partsSet.getLocalizedName());
+               if (localizedName != null) {
+                       partsSet.setLocalizedName(localizedName);
+                       callback.updateFavorites(characterData, partsSet.isPresetParts());
+                       initListModel();
+               }
+       }
+
+       /**
+        * 選択したお気に入りを表示する.
+        */
+       protected void onSelect() {
+               int row = partsSetList.getSelectedRow();
+               if (row < 0) {
+                       return;
+               }
+               PartsSet partsSet = partsSetListModel.getRow(row);
+               if (callback != null) {
+                       callback.selectFavorites(partsSet);
+               }
+       }
+
+       protected void onClose() {
+               dispose();
+       }
+
+       public void setFavoriteManageCallback(FavoriteManageCallback callback) {
+               this.callback = callback;
+       }
+
+       public FavoriteManageCallback getFavoriteManageCallback() {
+               return callback;
+       }
+}