- package com.xfherun.midiforge.gui;
- import com.xfherun.languages.Language;
- import com.xfherun.midiforge.animations.LoadAnimation;
- import com.xfherun.midiforge.exits.Exit;
- import com.xfherun.midiforge.gui.dialogs.MIDIForgeTickLoopDialog;
- import com.xfherun.midiforge.gui.renderer.MIDIRendererPanel;
- import com.xfherun.midiforge.gui.ui.componentuis.MIDIForgeMenuBarUI;
- import com.xfherun.midiforge.gui.ui.componentuis.MIDIForgeMenuUI;
- import com.xfherun.midiforge.languages.SystemLanguage;
- import com.xfherun.midiforge.logger.Logger;
- import com.xfherun.midiforge.main.References;
- import com.xfherun.midiforge.utils.GraphicsUtilities;
- import com.xfherun.midiforge.utils.MathUtilities;
- import com.xfherun.midiforge.utils.ThreadUtilities;
- import com.xfherun.midiplayer.DefaultMidiRenderer;
- import com.xfherun.midiplayer.LoopOption;
- import com.xfherun.midiplayer.MidiSequence;
- import com.xfherun.midiplayer.PianoKeyboardRenderer;
- import javax.sound.midi.MidiSystem;
- import javax.sound.midi.MidiUnavailableException;
- import javax.sound.midi.Receiver;
- import javax.swing.*;
- import javax.swing.filechooser.FileNameExtensionFilter;
- import java.awt.*;
- import java.awt.datatransfer.DataFlavor;
- import java.awt.datatransfer.Transferable;
- import java.awt.datatransfer.UnsupportedFlavorException;
- import java.awt.event.*;
- import java.io.File;
- import java.io.IOException;
- import java.util.ArrayList;
- import java.util.LinkedHashSet;
- import java.util.List;
- /**
- * 主窗口
- * project: MidiForge
- *
- * @author xfherun 何润
- */
- public class MainWindow extends JFrame
- {
- /**
- * 窗口是否显示
- */
- protected volatile boolean rendering = false;
- /**
- * 默认的空参构造 -> class: MainWindow
- *
- * @author xfherun 何润
- */
- public MainWindow()
- {
- initialization();
- }
- /**
- * 关闭窗口
- *
- * @author xfherun 何润
- */
- public final void close()
- {
- implClose();
- }
- /**
- * 实现关闭
- *
- * @author xfherun 何润
- */
- protected void implClose()
- {
- Logger.LOGGER.info("Window closing...");
- setVisible(false);
- dispose();
- Exit.exit(true);
- }
- /**
- * 初始化
- *
- * @author xfherun 何润
- */
- protected void initialization()
- {
- Logger.LOGGER.info("The window starts initializing...");
- setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
- addWindowListener(new WindowAdapter()
- {
- @Override
- public void windowClosing(WindowEvent e)
- {
- close();
- }
- });
- setTitle(SystemLanguage.translate("application.window.title"));
- try
- {
- Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
- setSize(
- MathUtilities.round(screenSize.getWidth() * 0.667),
- MathUtilities.round(screenSize.getHeight() * 0.667)
- );
- }
- catch (Throwable e)
- {
- Logger.LOGGER.error("Unable to set window size!", e);
- setSize(850, 480);
- }
- setLocationRelativeTo(null);
- Logger.LOGGER.info("The window size is set to: " + getWidth() + " * " + getHeight());
- Logger.LOGGER.info("window position is set to: " + getX() + " * " + getY());
- Logger.LOGGER.info("Start initializing the window component...");
- initializationComponents();
- Logger.LOGGER.info("The window component is initialized!");
- Logger.LOGGER.info("The window is initialized!");
- }
- @Override
- public void paint(Graphics g)
- {
- if (!rendering)
- rendering = true;
- super.paint(g);
- }
- /**
- * 获取 rendering 的值
- *
- * @return rendering 的值
- * @author xfherun 何润
- */
- public boolean isRendering()
- {
- return rendering;
- }
- /**
- * MIDI渲染器面板
- */
- protected volatile MIDIRendererPanel midiRendererPanel;
- /**
- * 顶部栏
- */
- protected volatile JPanel topBar;
- /**
- * 卡片面板
- */
- private volatile JPanel cardPanel;
- /**
- * 创建播放菜单
- *
- * @return 返回集合
- * @author xfherun 何润
- */
- protected ArrayList<JComponent> createPlayMenus()
- {
- ArrayList<JComponent> arrayList = new ArrayList<>();
- JMenuItem playAndPause = new JMenuItem(SystemLanguage.translate("application.window.home.menubar.menu.play.playAndPause.text"));
- JMenuItem stop = new JMenuItem(SystemLanguage.translate("application.window.home.menubar.menu.play.stop.text"));
- JMenuItem fwd = new JMenuItem(SystemLanguage.translate("application.window.home.menubar.menu.play.tickForward.text"));
- JMenuItem back = new JMenuItem(SystemLanguage.translate("application.window.home.menubar.menu.play.tickBackward.text"));
- JCheckBoxMenuItem enableLoop = new JCheckBoxMenuItem(SystemLanguage.translate("application.window.home.menubar.menu.play.enableLoop.text"));
- JMenuItem volumeForward = new JMenuItem(SystemLanguage.translate("application.window.home.menubar.menu.play.volumeForward.text"));
- JMenuItem volumeBackward = new JMenuItem(SystemLanguage.translate("application.window.home.menubar.menu.play.volumeBackward.text"));
- JCheckBoxMenuItem muted = new JCheckBoxMenuItem(SystemLanguage.translate("application.window.home.menubar.menu.play.mute.text"));
- {
- playAndPause.setAccelerator(KeyStroke.getKeyStroke("SPACE"));
- stop.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_E, InputEvent.CTRL_MASK));
- fwd.setAccelerator(KeyStroke.getKeyStroke("RIGHT"));
- back.setAccelerator(KeyStroke.getKeyStroke("LEFT"));
- enableLoop.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_L, InputEvent.CTRL_MASK));
- volumeForward.setAccelerator(KeyStroke.getKeyStroke("UP"));
- volumeBackward.setAccelerator(KeyStroke.getKeyStroke("DOWN"));
- muted.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_M, InputEvent.CTRL_MASK));
- }
- DefaultMidiRenderer renderer = midiRendererPanel.getRenderer();
- if (renderer == null)
- {
- playAndPause.setEnabled(false);
- stop.setEnabled(false);
- fwd.setEnabled(false);
- back.setEnabled(false);
- enableLoop.setEnabled(false);
- volumeForward.setEnabled(false);
- volumeBackward.setEnabled(false);
- muted.setEnabled(false);
- }
- if (renderer != null)
- {
- playAndPause.addActionListener(e ->
- {
- if (renderer.isRunning()) renderer.stop();
- else renderer.start();
- });
- stop.addActionListener(e ->
- {
- renderer.stop();
- renderer.setTickPosition(0L);
- });
- long finalTickStep = 1000000000L;
- fwd.addActionListener(e ->
- renderer.setTimePosition(renderer.getTimePosition() + finalTickStep));
- back.addActionListener(e ->
- renderer.setTimePosition(renderer.getTimePosition() - finalTickStep));
- muted.setSelected(renderer.isMuted());
- muted.addActionListener(e ->
- renderer.setMuted(muted.isSelected()));
- volumeForward.addActionListener(e ->
- {
- JSlider volumeSlider = midiRendererPanel.getVolumeSlider();
- volumeSlider.setValue(volumeSlider.getValue() + 10);
- });
- volumeBackward.addActionListener(e ->
- {
- JSlider volumeSlider = midiRendererPanel.getVolumeSlider();
- volumeSlider.setValue(volumeSlider.getValue() - 10);
- });
- enableLoop.setSelected(midiRendererPanel.isLoop());
- enableLoop.addActionListener(e ->
- {
- if (!enableLoop.isSelected()) midiRendererPanel.setLoop(false, 0L, -1L, 0);
- else
- {
- MIDIForgeTickLoopDialog midiForgeTickLoopDialog = new MIDIForgeTickLoopDialog(MainWindow.this, renderer);
- midiForgeTickLoopDialog.setVisible(true);
- int loopCount = midiForgeTickLoopDialog.getLoopCount();
- LoopOption loopOption = midiForgeTickLoopDialog.getLoopOption();
- long startPointLong = midiForgeTickLoopDialog.getStartPointLong();
- long endPointLong = midiForgeTickLoopDialog.getEndPointLong();
- if (loopOption != null)
- {
- if (LoopOption.NO_LOOP.equals(loopOption)) return;
- if (LoopOption.INDEFINITELY_LOOP.equals(loopOption)) loopCount = -1;
- midiRendererPanel.setLoop(true, startPointLong, endPointLong, loopCount);
- }
- }
- });
- }
- arrayList.add(playAndPause);
- arrayList.add(stop);
- arrayList.add(fwd);
- arrayList.add(back);
- arrayList.add(new JPopupMenu.Separator());
- arrayList.add(enableLoop);
- arrayList.add(new JPopupMenu.Separator());
- arrayList.add(volumeForward);
- arrayList.add(volumeBackward);
- arrayList.add(muted);
- return arrayList;
- }
- /**
- * 选择MIDI文件
- *
- * @param multipleChoices 是否多选
- * @return 返回文件数组
- * @author xfherun 何润
- */
- protected File[] selectedMIDIFile(boolean multipleChoices)
- {
- JFileChooser jFileChooser = new JFileChooser();
- jFileChooser.setDialogType(JFileChooser.OPEN_DIALOG);
- jFileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
- jFileChooser.setMultiSelectionEnabled(multipleChoices);
- jFileChooser.setDialogTitle(SystemLanguage.translate("application.utilities.midiFileChooser.window.title"));
- jFileChooser.setFileFilter(new FileNameExtensionFilter(
- SystemLanguage.translate("application.utilities.typeMIDI.description.text"),
- "mid", "midi"
- ));
- jFileChooser.setSelectedFile(new File("").getAbsoluteFile());
- int option = jFileChooser.showOpenDialog(MainWindow.this);
- if (option == JFileChooser.APPROVE_OPTION)
- {
- if (jFileChooser.isMultiSelectionEnabled())
- return jFileChooser.getSelectedFiles();
- return new File[]{jFileChooser.getSelectedFile()};
- }
- return null;
- }
- /**
- * 当前MIDI文件
- */
- protected volatile File currentMIDIFile;
- /**
- * 使用MIDI接收器
- */
- private static final boolean useMidiReceiver = true;
- /**
- * 获取MIDI接收器
- *
- * @return 返回MIDI接收器
- * @author xfherun 何润
- */
- protected Receiver getMIDIReceiver()
- {
- if (!useMidiReceiver) return null;
- try
- {
- return MidiSystem.getReceiver();
- }
- catch (Throwable e)
- {
- Logger.LOGGER.error("Unable to get a MIDI receiver!", e);
- }
- return null;
- }
- /**
- * 创建文件菜单
- *
- * @return 返回集合
- * @author xfherun 何润
- */
- protected ArrayList<JComponent> createFileMenus()
- {
- ArrayList<JComponent> arrayList = new ArrayList<>();
- JMenuItem openSong = new JMenuItem(SystemLanguage.translate("application.window.home.menubar.menu.file.openSong.text"));
- JMenuItem reopenSong = new JMenuItem(SystemLanguage.translate("application.window.home.menubar.menu.file.reopenSong.text", (currentMIDIFile != null ? currentMIDIFile.getName() : SystemLanguage.translate("application.window.home.menubar.menu.file.reopenSong.sub.text"))));
- JMenuItem closeFile = new JMenuItem(SystemLanguage.translate("application.window.home.menubar.menu.file.closeFile.text"));
- JMenu library = new JMenu(SystemLanguage.translate("application.window.home.menubar.menu.file.library.text"));
- {
- JMenuItem addFile = new JMenuItem(SystemLanguage.translate("application.window.home.menubar.menu.file.library.addFile.text"));
- JMenuItem addDirectory = new JMenuItem(SystemLanguage.translate("application.window.home.menubar.menu.file.library.addDirectory.text"));
- addFile.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F, InputEvent.CTRL_MASK));
- addDirectory.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_D, InputEvent.CTRL_MASK));
- library.add(addFile);
- library.add(addDirectory);
- }
- openSong.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, InputEvent.CTRL_MASK));
- reopenSong.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_R, InputEvent.CTRL_MASK));
- closeFile.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_W, InputEvent.CTRL_MASK));
- library.setMnemonic('L');
- if (currentMIDIFile == null || !currentMIDIFile.exists() || !currentMIDIFile.isFile())
- reopenSong.setEnabled(false);
- openSong.addActionListener(e ->
- {
- File[] files = selectedMIDIFile(false);
- if (files != null)
- {
- File midiFile = files[0];
- if (midiFile.getName().toLowerCase().endsWith(".mid") || midiFile.getName().toLowerCase().endsWith(".midi"))
- {
- ThreadUtilities.asynchronous(that ->
- {
- Logger.LOGGER.info("Selected MIDI File: " + midiFile.getAbsolutePath());
- loadSong(midiFile, getMIDIReceiver());
- });
- }
- }
- });
- closeFile.addActionListener(e ->
- {
- if (currentMIDIFile == null) return;
- Logger.LOGGER.info("Start closing MIDI files... currentMIDIFile -> " + currentMIDIFile.getAbsolutePath());
- closeSong();
- });
- reopenSong.addActionListener(e ->
- {
- if (currentMIDIFile == null) return;
- File reopenMIDIFile = currentMIDIFile;
- if (reopenMIDIFile.exists() && reopenMIDIFile.isFile() && (reopenMIDIFile.getName().toLowerCase().endsWith(".mid") || reopenMIDIFile.getName().toLowerCase().endsWith(".midi")))
- {
- Logger.LOGGER.info("Start reopening this MIDI song: " + reopenMIDIFile.getAbsolutePath());
- ThreadUtilities.asynchronous(that ->
- {
- closeSong();
- loadSong(reopenMIDIFile, getMIDIReceiver());
- });
- }
- else
- {
- Logger.LOGGER.warn("Invalid MIDI files: " + reopenMIDIFile.getAbsolutePath());
- currentMIDIFile = null;
- }
- });
- arrayList.add(openSong);
- arrayList.add(reopenSong);
- arrayList.add(closeFile);
- arrayList.add(new JPopupMenu.Separator());
- arrayList.add(library);
- return arrayList;
- }
- /**
- * 创建视图菜单
- *
- * @return 返回集合
- * @author xfherun 何润
- */
- protected ArrayList<JComponent> createViewMenus()
- {
- DefaultMidiRenderer renderer = midiRendererPanel.getRenderer();
- ArrayList<JComponent> arrayList = new ArrayList<>();
- JCheckBoxMenuItem playbackToolbar = new JCheckBoxMenuItem(SystemLanguage.translate("application.window.home.menubar.menu.view.playbackToolbar.text"));
- JCheckBoxMenuItem libraryPanel = new JCheckBoxMenuItem(SystemLanguage.translate("application.window.home.menubar.menu.view.libraryPanel.text"));
- JCheckBoxMenuItem pianoKeyboard = new JCheckBoxMenuItem(SystemLanguage.translate("application.window.home.menubar.menu.view.pianoKeyboard.text"));
- JCheckBoxMenuItem noteLabels = new JCheckBoxMenuItem(SystemLanguage.translate("application.window.home.menubar.menu.view.noteLabels.text"));
- JMenu changedPianoKeyboardOrientation = new JMenu(SystemLanguage.translate("application.window.home.menubar.menu.view.changedPianoKeyboardOrientation.text"));
- JCheckBoxMenuItem alwaysOnTop = new JCheckBoxMenuItem(SystemLanguage.translate("application.window.home.menubar.menu.view.alwaysOnTop.text"));
- JCheckBoxMenuItem fullScreen = new JCheckBoxMenuItem(SystemLanguage.translate("application.window.home.menubar.menu.view.fullScreen.text"));
- playbackToolbar.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_T, InputEvent.CTRL_MASK));
- libraryPanel.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Y, InputEvent.CTRL_MASK));
- pianoKeyboard.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_K, InputEvent.CTRL_MASK));
- noteLabels.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, InputEvent.CTRL_MASK));
- changedPianoKeyboardOrientation.setMnemonic('C');
- playbackToolbar.setSelected(midiRendererPanel.getTopBarPanel().isVisible());
- playbackToolbar.addActionListener(e ->
- {
- midiRendererPanel.getTopBarPanel().setVisible(playbackToolbar.isSelected());
- midiRendererPanel.updateSize();
- GraphicsUtilities.updateComponents(midiRendererPanel, MainWindow.this);
- });
- fullScreen.setSelected(isUndecorated());
- fullScreen.addActionListener(e ->
- {
- if (fullScreen.isSelected())
- midiRendererPanel.fullScreenOn();
- else midiRendererPanel.fullScreenOff();
- });
- JMenuItem h = new JMenuItem(SystemLanguage.translate("application.window.home.menubar.menu.view.changedPianoKeyboardOrientation.H.text"));
- JMenuItem v = new JMenuItem(SystemLanguage.translate("application.window.home.menubar.menu.view.changedPianoKeyboardOrientation.V.text"));
- h.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_H, InputEvent.CTRL_MASK));
- v.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, InputEvent.CTRL_MASK));
- h.setEnabled(false);
- v.setEnabled(false);
- pianoKeyboard.setEnabled(false);
- noteLabels.setEnabled(false);
- if (renderer != null)
- {
- h.setEnabled(true);
- v.setEnabled(true);
- pianoKeyboard.setEnabled(true);
- noteLabels.setEnabled(true);
- h.addActionListener(e ->
- {
- renderer.getPianoKeyboardRenderer().setOrientation(PianoKeyboardRenderer.HORIZONTAL);
- midiRendererPanel.updateSize();
- });
- v.addActionListener(e ->
- {
- renderer.getPianoKeyboardRenderer().setOrientation(PianoKeyboardRenderer.VERTICAL);
- midiRendererPanel.updateSize();
- });
- pianoKeyboard.addActionListener(e ->
- {
- });
- noteLabels.addActionListener(e ->
- {
- });
- }
- changedPianoKeyboardOrientation.add(h);
- changedPianoKeyboardOrientation.add(v);
- alwaysOnTop.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, InputEvent.CTRL_MASK));
- fullScreen.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, InputEvent.ALT_MASK));
- {
- alwaysOnTop.setSelected(isAlwaysOnTop());
- }
- {
- alwaysOnTop.addActionListener(e -> setAlwaysOnTop(alwaysOnTop.isSelected()));
- }
- arrayList.add(playbackToolbar);
- arrayList.add(libraryPanel);
- arrayList.add(pianoKeyboard);
- arrayList.add(noteLabels);
- arrayList.add(changedPianoKeyboardOrientation);
- arrayList.add(new JPopupMenu.Separator());
- arrayList.add(alwaysOnTop);
- arrayList.add(fullScreen);
- return arrayList;
- }
- /**
- * 创建选项菜单
- *
- * @return 返回集合
- * @author xfherun 何润
- */
- protected ArrayList<JComponent> createOptionsMenus()
- {
- ArrayList<JComponent> arrayList = new ArrayList<>();
- JMenuItem preferences = new JMenuItem(SystemLanguage.translate("application.window.home.menubar.menu.options.preferences.text"));
- preferences.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_P, InputEvent.CTRL_MASK));
- arrayList.add(preferences);
- return arrayList;
- }
- /**
- * 创建帮助菜单
- *
- * @return 返回集合
- * @author xfherun 何润
- */
- protected ArrayList<JComponent> createHelpMenus()
- {
- ArrayList<JComponent> arrayList = new ArrayList<>();
- JMenuItem online = new JMenuItem(SystemLanguage.translate("application.window.home.menubar.menu.help.online.text"));
- JMenuItem about = new JMenuItem(SystemLanguage.translate("application.window.home.menubar.menu.help.about.text"));
- online.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_I, InputEvent.CTRL_MASK));
- about.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_U, InputEvent.CTRL_MASK));
- arrayList.add(online);
- arrayList.add(about);
- return arrayList;
- }
- /**
- * 初始化窗口组件
- *
- * @author xfherun 何润
- */
- protected void initializationComponents()
- {
- cardPanel = new JPanel();
- cardPanel.setOpaque(true);
- cardPanel.setLayout(new CardLayout());
- {
- topBar = new JPanel();
- topBar.setOpaque(true);
- topBar.setBackground(Color.BLACK);
- topBar.setLayout(new BorderLayout());
- topBar.setMinimumSize(new Dimension(0, 50));
- topBar.setMaximumSize(new Dimension(Integer.MAX_VALUE, 50));
- topBar.setPreferredSize(new Dimension(0, 50));
- JLabel logoTextLabel = new JLabel();
- logoTextLabel.setForeground(new Color(217, 217, 217, 255));
- logoTextLabel.setBorder(BorderFactory.createEmptyBorder(0, 50, 0, 50));
- logoTextLabel.setFont(new Font(logoTextLabel.getFont().getFamily(), Font.BOLD, MathUtilities.round(topBar.getPreferredSize().getHeight() * 0.61)));
- logoTextLabel.setText(References.APPLICATION_NAME);
- topBar.add(logoTextLabel, BorderLayout.WEST);
- JMenuBar menuBar = new JMenuBar();
- JMenu file = createMenu(SystemLanguage.translate("application.window.home.menubar.menu.file.text"));
- JMenu play = createMenu(SystemLanguage.translate("application.window.home.menubar.menu.play.text"));
- JMenu view = createMenu(SystemLanguage.translate("application.window.home.menubar.menu.view.text"));
- JMenu options = createMenu(SystemLanguage.translate("application.window.home.menubar.menu.options.text"));
- JMenu help = createMenu(SystemLanguage.translate("application.window.home.menubar.menu.help.text"));
- file.setMnemonic('F');
- play.setMnemonic('P');
- view.setMnemonic('V');
- options.setMnemonic('O');
- help.setMnemonic('H');
- file.addItemListener(e ->
- {
- Logger.LOGGER.info("Start Creation Menu: File");
- JMenu source = (JMenu) e.getSource();
- source.removeAll();
- for (JComponent menu : createFileMenus())
- source.add(menu);
- GraphicsUtilities.updateComponents(source);
- });
- play.addItemListener(e ->
- {
- Logger.LOGGER.info("Start Creation Menu: Play");
- JMenu source = (JMenu) e.getSource();
- source.removeAll();
- for (JComponent menu : createPlayMenus())
- source.add(menu);
- GraphicsUtilities.updateComponents(source);
- });
- view.addItemListener(e ->
- {
- Logger.LOGGER.info("Start Creation Menu: View");
- JMenu source = (JMenu) e.getSource();
- source.removeAll();
- for (JComponent menu : createViewMenus())
- source.add(menu);
- GraphicsUtilities.updateComponents(source);
- });
- options.addItemListener(e ->
- {
- Logger.LOGGER.info("Start Creation Menu: Options");
- JMenu source = (JMenu) e.getSource();
- source.removeAll();
- for (JComponent menu : createOptionsMenus())
- source.add(menu);
- GraphicsUtilities.updateComponents(source);
- });
- help.addItemListener(e ->
- {
- Logger.LOGGER.info("Start Creation Menu: Help");
- JMenu source = (JMenu) e.getSource();
- source.removeAll();
- for (JComponent menu : createHelpMenus())
- source.add(menu);
- GraphicsUtilities.updateComponents(source);
- });
- menuBar.add(file);
- menuBar.add(play);
- menuBar.add(view);
- menuBar.add(options);
- menuBar.add(help);
- menuBar.setBorder(BorderFactory.createEmptyBorder(9, 9, 9, 50));
- topBar.add(menuBar, BorderLayout.EAST);
- getContentPane().add(topBar, BorderLayout.NORTH);
- }
- {
- midiRendererPanel = new MIDIRendererPanel();
- midiRendererPanel.addMouseListener(new MouseAdapter()
- {
- @Override
- public void mouseClicked(MouseEvent e)
- {
- if (e.getButton() == 3)
- {
- ArrayList<JComponent> alls = new ArrayList<>();
- {
- {
- JMenu file0 = new JMenu(SystemLanguage.translate("application.window.home.menubar.menu.file.text"));
- file0.setMnemonic('F');
- ArrayList<JComponent> fileMenus = createFileMenus();
- for (JComponent fileMenu : fileMenus) file0.add(fileMenu);
- alls.add(file0);
- }
- {
- JMenu view0 = new JMenu(SystemLanguage.translate("application.window.home.menubar.menu.view.text"));
- view0.setMnemonic('V');
- ArrayList<JComponent> fileMenus = createViewMenus();
- for (JComponent fileMenu : fileMenus) view0.add(fileMenu);
- alls.add(view0);
- }
- {
- alls.addAll(createOptionsMenus());
- }
- }
- alls.add(new JPopupMenu.Separator());
- alls.addAll(createPlayMenus());
- JPopupMenu popupMenu = new JPopupMenu();
- for (JComponent playMenu : alls)
- popupMenu.add(playMenu);
- popupMenu.show(midiRendererPanel, e.getX() + 1, e.getY() + 1);
- }
- }
- });
- JPanel panel = new JPanel();
- panel.setLayout(new BorderLayout());
- midiRendererPanel.setTransferHandler(new TransferHandler()
- {
- @Override
- public boolean canImport(TransferSupport support)
- {
- return true;
- }
- @Override
- public boolean importData(TransferSupport support)
- {
- LinkedHashSet<File> files = new LinkedHashSet<>();
- Transferable transferable = support.getTransferable();
- if (transferable != null && support.isDataFlavorSupported(DataFlavor.javaFileListFlavor))
- {
- DataFlavor[] dataFlavors = support.getDataFlavors();
- if (dataFlavors != null && dataFlavors.length > 0)
- {
- for (DataFlavor dataFlavor : dataFlavors)
- {
- try
- {
- if (dataFlavor == null) continue;
- Object transferData = transferable.getTransferData(dataFlavor);
- if (transferData instanceof List<?> list)
- {
- for (Object o : list)
- {
- if (o instanceof File file)
- {
- String name = file.getName().toLowerCase();
- if (name.endsWith(".mid") || name.endsWith(".midi"))
- files.add(file);
- }
- }
- }
- }
- catch (Throwable ignored)
- {
- }
- }
- }
- }
- if (files.size() != 1) return false;
- for (File file : files)
- {
- ThreadUtilities.asynchronous(that ->
- {
- Logger.LOGGER.info("Selected MIDI File: " + file.getAbsolutePath());
- loadSong(file, getMIDIReceiver());
- });
- break;
- }
- return true;
- }
- });
- panel.add(midiRendererPanel, BorderLayout.CENTER);
- cardPanel.add("Renderer", panel);
- }
- getContentPane().add(cardPanel, BorderLayout.CENTER);
- }
- /**
- * 创建菜单
- *
- * @param text 文本
- * @return 返回菜单对象
- * @author xfherun 何润
- */
- protected JMenu createMenu(String text)
- {
- return new JMenu(text)
- {
- @Override
- public void updateUI()
- {
- setUI(new MIDIForgeMenuUI()
- {
- @Override
- public void installUI(JComponent c)
- {
- super.installUI(c);
- c.setOpaque(true);
- c.setBackground(new Color(0, 0, 0, 255));
- c.setForeground(new Color(204, 204, 204, 255));
- selectionBackground = new Color(0, 0, 0, 255);
- selectionForeground = new Color(255, 255, 255, 255);
- int margin = 4;
- int p = 2;
- c.setBorder(BorderFactory.createEmptyBorder(margin, margin * p, margin, margin * p));
- }
- });
- }
- };
- }
- /**
- * 关闭歌曲
- *
- * @author xfherun 何润
- */
- public void closeSong()
- {
- DefaultMidiRenderer renderer = midiRendererPanel.getRenderer();
- if (renderer != null)
- renderer.close();
- midiRendererPanel.setRenderer(null);
- midiRendererPanel.getDraggedProgressBar().setPercentage(0.0);
- midiRendererPanel.getDraggedProgressBar().setDraggable(false);
- setTitle(SystemLanguage.translate("application.window.title"));
- GraphicsUtilities.updateComponents(this);
- }
- /**
- * 加载歌曲
- *
- * @param file 文件
- * @param receiver MIDI接收器
- * @author xfherun 何润
- */
- public void loadSong(File file, Receiver receiver)
- {
- closeSong();
- MidiSequence sequence;
- LoadAnimation.LoadAnimationDialog loadAnimationDialog = new LoadAnimation.LoadAnimationDialog(MainWindow.this);
- try
- {
- sequence = MidiSequence.loadMidiSequence(currentMIDIFile = file, null);
- }
- catch (Throwable e)
- {
- try
- {
- loadAnimationDialog.setVisible(false);
- loadAnimationDialog.dispose();
- loadAnimationDialog = null;
- }
- catch (Throwable ex)
- {
- e.addSuppressed(ex);
- }
- Logger.LOGGER.error("Loading MIDI sequence error!", e);
- return;
- }
- midiRendererPanel.setRenderer(new DefaultMidiRenderer());
- DefaultMidiRenderer renderer = midiRendererPanel.getRenderer();
- renderer.open(sequence, receiver);
- try
- {
- loadAnimationDialog.setVisible(false);
- loadAnimationDialog.dispose();
- loadAnimationDialog = null;
- }
- catch (Throwable e)
- {
- Logger.LOGGER.warn("Closing the loading animation window failed!", e);
- }
- midiRendererPanel.getDraggedProgressBar().setPercentage(0.0);
- midiRendererPanel.getDraggedProgressBar().setDraggable(true);
- midiRendererPanel.updateMetronome();
- midiRendererPanel.updateVolume();
- setTitle("*" + SystemLanguage.translate("application.window.title") + " - " + currentMIDIFile.getAbsolutePath());
- GraphicsUtilities.updateComponents(this);
- }
- /**
- * 获取 midiRendererPanel 的值
- *
- * @return midiRendererPanel 的值
- * @author xfherun 何润
- */
- public MIDIRendererPanel getMidiRendererPanel()
- {
- return midiRendererPanel;
- }
- }