-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;
+ }
+}