/* * Copyright (C) 2014-2015 たんらる */ package fourthline.mabiicco.ui.mml; import java.awt.Dimension; import java.awt.Frame; import java.awt.Point; import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.Arrays; import java.util.List; import javax.swing.AbstractAction; import javax.swing.ButtonGroup; import javax.swing.InputMap; import javax.swing.JComponent; import javax.swing.JDialog; import javax.swing.JPanel; import javax.swing.JButton; import javax.swing.KeyStroke; import javax.swing.JScrollPane; import fourthline.mabiicco.AppResource; import fourthline.mabiicco.ui.IMMLManager; import fourthline.mabiicco.ui.MMLTrackView; import fourthline.mabiicco.ui.editor.MMLEditor; import fourthline.mmlTools.MMLEventList; import fourthline.mmlTools.MMLTrack; import javax.swing.JComboBox; import javax.swing.JLabel; import javax.swing.JRadioButton; import javax.swing.border.TitledBorder; import javax.swing.border.LineBorder; import java.awt.Color; /** * パート入れ替え */ public final class MMLPartChangePanel extends JPanel { private static final long serialVersionUID = 8558159209741558854L; private TrackListTable table; private final JDialog dialog; private final JButton applyButton = new JButton(AppResource.appText("part_change.apply")); private final IMMLManager mmlManager; private final MMLEditor editor; private JRadioButton radioSelectArea; private JRadioButton radioAllArea; private JRadioButton radioChange; private JRadioButton radioMove; private JRadioButton radioCopy; private JComboBox<String> partSelectComboBox; public MMLPartChangePanel() { this.dialog = null; this.mmlManager = null; this.editor = null; initializePanel(null, 0); } public MMLPartChangePanel(Frame parentFrame, IMMLManager mmlManager, MMLEditor editor) { this.dialog = new JDialog(parentFrame, AppResource.appText("part_change"), true); this.mmlManager = mmlManager; this.editor = editor; initializePanel(mmlManager.getMMLScore().getTrackList(), mmlManager.getActiveTrackIndex()); } private void initializePanel(List<MMLTrack> trackList, int initialIndex) { setLayout(null); applyButton.setBounds(204, 412, 90, 29); add(applyButton); applyButton.addActionListener((event) -> { changePartAction(); mmlManager.updateActivePart(true); dialog.setVisible(false); }); JButton closeButton = new JButton(AppResource.appText("part_change.cancel")); closeButton.setBounds(319, 412, 90, 29); add(closeButton); closeButton.setFocusable(false); closeButton.addActionListener((event) -> { dialog.setVisible(false); }); /* 入れ替え元 */ JPanel applyPanel = new JPanel(); applyPanel.setBorder(new TitledBorder(new LineBorder(new Color(128, 128, 128), 1, true), AppResource.appText("part_change.src"), TitledBorder.LEADING, TitledBorder.TOP, null, null)); applyPanel.setBounds(12, 10, 414, 63); applyPanel.setLayout(null); add(applyPanel); ButtonGroup applyGroup = new ButtonGroup(); radioSelectArea = new JRadioButton(AppResource.appText("part_change.selectArea")); radioSelectArea.setBounds(8, 22, 113, 21); applyPanel.add(radioSelectArea); applyGroup.add(radioSelectArea); radioAllArea = new JRadioButton(AppResource.appText("part_change.all")); radioAllArea.setBounds(138, 22, 113, 21); applyPanel.add(radioAllArea); applyGroup.add(radioAllArea); if (editor != null) { if (editor.hasSelectedNote()) { radioSelectArea.setSelected(true); } else { radioSelectArea.setEnabled(false); radioAllArea.setSelected(true); } } /* 入れ替え先 */ JPanel destSelectPanel = new JPanel(); destSelectPanel.setBorder(new TitledBorder(new LineBorder(new Color(128, 128, 128), 1, true), AppResource.appText("part_change.dest"), TitledBorder.LEADING, TitledBorder.TOP, null, null)); destSelectPanel.setBounds(12, 83, 414, 246); destSelectPanel.setLayout(null); add(destSelectPanel); JLabel label1 = new JLabel(AppResource.appText("track")); label1.setBounds(12, 23, 172, 13); destSelectPanel.add(label1); JLabel label2 = new JLabel(AppResource.appText("part")); label2.setBounds(12, 209, 64, 13); destSelectPanel.add(label2); partSelectComboBox = new JComboBox<>(); partSelectComboBox.setBounds(100, 206, 131, 19); destSelectPanel.add(partSelectComboBox); JScrollPane scrollPane = new JScrollPane(); scrollPane.setBounds(12, 46, 372, 142); destSelectPanel.add(scrollPane); table = new TrackListTable(trackList); scrollPane.setViewportView(table); table.setRowSelectionInterval(initialIndex, initialIndex); Point p = scrollPane.getViewport().getViewPosition(); p.y = initialIndex * table.getRowHeight(); scrollPane.getViewport().setViewPosition(p); table.addMouseListener(new MouseAdapter() { @Override public void mouseReleased(MouseEvent arg0) { updatePartSelectBox(); } }); /* 実行内容 */ JPanel executePanel = new JPanel(); executePanel.setBorder(new TitledBorder(new LineBorder(new Color(128, 128, 128), 1, true), AppResource.appText("part_change.method"), TitledBorder.LEADING, TitledBorder.TOP, null, null)); executePanel.setBounds(12, 339, 414, 63); executePanel.setLayout(null); add(executePanel); ButtonGroup executeGroup = new ButtonGroup(); radioChange = new JRadioButton(AppResource.appText("part_change.swap")); radioChange.setBounds(8, 22, 113, 21); radioChange.setSelected(true); executePanel.add(radioChange); executeGroup.add(radioChange); radioMove = new JRadioButton(AppResource.appText("part_change.move")); radioMove.setBounds(139, 22, 113, 21); executePanel.add(radioMove); executeGroup.add(radioMove); radioCopy = new JRadioButton(AppResource.appText("part_change.copy")); radioCopy.setBounds(256, 22, 113, 21); executePanel.add(radioCopy); executeGroup.add(radioCopy); InputMap imap = dialog.getRootPane().getInputMap( JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); imap.put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "close-it"); dialog.getRootPane().getActionMap().put("close-it", new AbstractAction() { private static final long serialVersionUID = -4495368209645211523L; @Override public void actionPerformed(ActionEvent arg0) { dialog.setVisible(false); }}); updatePartSelectBox(); } private void updatePartSelectBox() { if (mmlManager == null) { return; } MMLEventList activePart = mmlManager.getActiveMMLPart(); if (activePart == null) { return; } int trackIndex = table.getSelectedRow(); partSelectComboBox.removeAllItems(); MMLTrack selectedTrack = mmlManager.getMMLScore().getTrack(trackIndex); for (int i = 0; i < MMLTrackView.MMLPART_NAME.length; i++) { if (selectedTrack.getMMLEventAtIndex(i) != activePart) { partSelectComboBox.addItem(MMLTrackView.MMLPART_NAME[i]); } } } private void changePartAction() { if (mmlManager == null) { return; } int trackIndex = table.getSelectedRow(); MMLTrack selectedTrack = mmlManager.getMMLScore().getTrack(trackIndex); int partIndex = Arrays.binarySearch(MMLTrackView.MMLPART_NAME, partSelectComboBox.getSelectedItem()); MMLEditor.ChangePartAction action = MMLEditor.ChangePartAction.SWAP; if (radioMove.isSelected()) { action = MMLEditor.ChangePartAction.MOVE; } else if (radioCopy.isSelected()) { action = MMLEditor.ChangePartAction.COPY; } MMLEventList fromPart = mmlManager.getActiveMMLPart(); if (fromPart == null) { return; } MMLEventList toPart = selectedTrack.getMMLEventAtIndex(partIndex); editor.changePart(fromPart, toPart, radioSelectArea.isSelected(), action); } @Override public Dimension getPreferredSize() { return new Dimension(440, 450); } /** * ダイアログを表示する. */ public void showDialog() { if (mmlManager.getActiveMMLPart() != null) { dialog.getContentPane().add(this); dialog.pack(); dialog.setResizable(false); dialog.setLocationRelativeTo(null); dialog.setVisible(true); } } }