/*
* Copyright (C) 2014-2017 たんらる
*/
package fourthline.mabiicco.ui.mml;
import java.awt.BorderLayout;
import java.awt.Dialog;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.Insets;
import java.awt.Toolkit;
import java.awt.Window;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.List;
import javax.swing.AbstractAction;
import javax.swing.InputMap;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JButton;
import javax.swing.KeyStroke;
import javax.swing.JScrollPane;
import fourthline.mabiicco.AppResource;
import fourthline.mmlTools.ComposeRank;
import fourthline.mmlTools.MMLTrack;
import fourthline.mmlTools.core.MMLText;
public final class MMLOutputPanel extends JPanel {
private static final long serialVersionUID = 8558159209741558854L;
private final TrackListTable table;
private final JDialog dialog;
private final Window parentFrame;
private final JButton splitButton = new JButton(AppResource.appText("mml.output.split"));
private List<MMLTrack> trackList;
private List<String> outputTextList = new ArrayList<>();
public MMLOutputPanel(Frame parentFrame) {
this.dialog = null;
this.parentFrame = parentFrame;
this.table = null;
initializePanel(false);
}
public MMLOutputPanel(Frame parentFrame, List<MMLTrack> trackList) {
this.dialog = new JDialog(parentFrame, AppResource.appText("mml.output"), true);
this.parentFrame = parentFrame;
this.table = new TrackListTable(trackList);
this.trackList = trackList;
for (MMLTrack track : trackList) {
outputTextList.add(track.getMabiMML());
}
initializePanel(true);
}
private MMLOutputPanel(Dialog parent, MMLTrack track, List<MMLText> textList) {
this.dialog = new JDialog(parent, AppResource.appText("mml.output.split"), true);
this.parentFrame = parent;
this.table = new TrackListTable(track, textList);
for (MMLText mmlText : textList) {
outputTextList.add(mmlText.getMML());
}
initializePanel(false);
}
private void initializePanel(boolean splitFunc) {
setLayout(new BorderLayout());
JPanel buttonPanel = new JPanel();
JPanel p = new JPanel();
p.setLayout(null);
JButton copyButton = new JButton(AppResource.appText("mml.output.copyButton"));
copyButton.setMargin(new Insets(5, 10, 5, 10));
buttonPanel.add(copyButton);
copyButton.addActionListener((event) -> {
currentSelectedTrackMMLOutput();
});
if (splitFunc) {
splitButton.setMargin(new Insets(5, 10, 5, 10));
buttonPanel.add(splitButton);
splitButton.addActionListener((event) -> {
currentSelectedTrackMMLSplitOutput();
});
table.getSelectionModel().addListSelectionListener(t -> {
checkSplitCopy();
});
checkSplitCopy();
}
JButton closeButton = new JButton(AppResource.appText("mml.output.closeButton"));
closeButton.setMargin(new Insets(5, 10, 5, 10));
buttonPanel.add(closeButton);
closeButton.setFocusable(false);
closeButton.addActionListener((event) -> {
dialog.setVisible(false);
});
JScrollPane scrollPane = new JScrollPane();
scrollPane.setBounds(12, 10, 372, 169);
p.add(scrollPane);
scrollPane.setViewportView(table);
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);
}});
add(buttonPanel, BorderLayout.SOUTH);
add(p, BorderLayout.CENTER);
}
public static void copyToClipboard(Window parent, String text) {
Toolkit kit = Toolkit.getDefaultToolkit();
Clipboard clip = kit.getSystemClipboard();
clip.setContents(new StringSelection(text), null);
JOptionPane.showMessageDialog(parent, AppResource.appText("mml.output.done"), AppResource.getAppTitle(), JOptionPane.PLAIN_MESSAGE);
}
private void nextSelect(int row) {
row++;
if (row >= table.getRowCount()) {
row = 0;
}
table.setRowSelectionInterval(row, row);
}
/**
* 現在のトラックのMMLをコピーする
*/
private void currentSelectedTrackMMLOutput() {
int row = table.getSelectedRow();
String mmlText = outputTextList.get(row);
copyToClipboard(parentFrame, mmlText);
nextSelect(row);
}
/**
* 現在のトラックを分割コピーするダイアログを表示する
*/
private void currentSelectedTrackMMLSplitOutput() {
int row = table.getSelectedRow();
MMLTrack track = trackList.get(row);
MMLText mmlText = new MMLText().setMMLText( outputTextList.get(row) );
new MMLOutputPanel(dialog, track, mmlText.splitMML(ComposeRank.getTopRank())).showDialog();
nextSelect(row);
}
private void checkSplitCopy() {
boolean b = table.selectedRowCanSplit();
splitButton.setEnabled(b);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(390, 220);
}
/**
* ダイアログを表示する.
*/
public void showDialog() {
dialog.getContentPane().add(this);
dialog.pack();
dialog.setResizable(false);
dialog.setLocationRelativeTo(null);
dialog.setVisible(true);
}
}