Package org.open2jam.gui.parts

Source Code of org.open2jam.gui.parts.MusicSelection

package org.open2jam.gui.parts;

import com.github.dtinth.partytime.server.Server;
import com.github.dtinth.partytime.server.ServerUI;
import com.sun.jna.NativeLibrary;
import java.awt.Component;
import java.awt.Container;
import java.awt.event.ItemEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.File;
import java.io.IOException;
import java.text.DecimalFormat;
import java.util.*;
import java.util.logging.Level;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.TableRowSorter;
import org.lwjgl.LWJGLException;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
import org.open2jam.Config;
import org.open2jam.GameOptions;
import org.open2jam.GameOptions.ChannelMod;
import org.open2jam.GameOptions.SpeedType;
import org.open2jam.GameOptions.VisibilityMod;
import org.open2jam.gui.ChartListTableModel;
import org.open2jam.gui.ChartModelLoader;
import org.open2jam.gui.ChartTableModel;
import org.open2jam.parsers.BMSWriter;
import org.open2jam.parsers.Chart;
import org.open2jam.parsers.ChartList;
import org.open2jam.render.Render;
import org.open2jam.game.judgment.BeatJudgment;
import org.open2jam.game.judgment.TimeJudgment;
import org.open2jam.sound.SoundSystemException;
import org.open2jam.util.Logger;

public class MusicSelection extends javax.swing.JPanel
    implements PropertyChangeListener, ListSelectionListener {
    private Server lastServer;

    private class RenderThread extends Thread {

        Container c;
        Render r;
        public RenderThread(Container c, Render r) {
            this.c = c;
            this.r = r;
        }
        @Override
        public void run() {
            c.setEnabled(false);
            r.startRendering();
            c.setEnabled(true);
        }
    }
   
    private class PopupListener extends MouseAdapter {

  private final JPopupMenu menu;
 
  public PopupListener(JPopupMenu menu) {
      this.menu = menu;
  }

  @Override
  public void mousePressed(MouseEvent e) {
      showPopup(e);
  }

  @Override
  public void mouseReleased(MouseEvent e) {
      showPopup(e);
  }
 
  private void showPopup(MouseEvent e) {
      if(e.isPopupTrigger()) {
    Component c = e.getComponent();
    if(c instanceof ListSelectionListener) {
        JTable t = (JTable) c;
        int row = t.rowAtPoint(e.getPoint());
        t.getSelectionModel().setSelectionInterval(row, row);
    }
   
    if(menu == null) return;
   
    menu.show(e.getComponent(), e.getX(), e.getY());
      }
  }
    }

    private ChartListTableModel model_songlist;
    private ChartTableModel model_chartlist;
    //private File cwd;
    private DisplayMode[] display_modes;
    private int rank = 0;
    private ChartList selected_chart;
    private Chart selected_header;
    private int last_model_idx;
    private final TableRowSorter<ChartListTableModel> table_sorter;
   
    private class FileItem {
        File file;
       
        public FileItem(File f) {
            this.file = f;
        }

        @Override
        public int hashCode() {
            int hash = 7;
            hash = 59 * hash + (this.file != null ? this.file.hashCode() : 0);
            return hash;
        }
       
        @Override
        public boolean equals(Object o) {
            return (o instanceof FileItem) &&
                    ((FileItem)o).file.equals(file);
        }
       
        @Override
        public String toString() {
            return file.getName();
        }
    }

    /** Creates new form Interface */
    public MusicSelection() {
        initLogic();
        initComponents();
        load_progress.setVisible(false);
       
        List<File> list = Config.getDirsList();
        for(File f : list)combo_dirs.addItem(new FileItem(f));
       
        File cwd = Config.getCwd();
        if(cwd == null)
        {
            //just in case, should not go inside this if
            if(!Config.getDirsList().isEmpty())
            {
                cwd =Config.getDirsList().get(0);
                Config.setCwd(cwd);
                loadDir(cwd);
            }
            else
                openFileChooser();
        }
        else
            loadDir(cwd);
       
        table_sorter = new TableRowSorter<ChartListTableModel>(model_songlist);
        table_songlist.setRowSorter(table_sorter);
        txt_filter.getDocument().addDocumentListener(new DocumentListener() {
            @Override
            public void insertUpdate(DocumentEvent e) {updateFilter();}
            @Override
            public void removeUpdate(DocumentEvent e) {updateFilter();}
            @Override
            public void changedUpdate(DocumentEvent e) {}
        });

        javax.swing.table.TableColumn col;
        col = table_songlist.getColumnModel().getColumn(0);
        col.setPreferredWidth(180);
        col = table_songlist.getColumnModel().getColumn(1);
        col.setPreferredWidth(30);
        col = table_songlist.getColumnModel().getColumn(2);
        col.setPreferredWidth(80);

        table_chartlist.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
            @Override
            public void valueChanged(ListSelectionEvent e)
            {
                if (e.getValueIsAdjusting()) return;
                javax.swing.ListSelectionModel lsm = (javax.swing.ListSelectionModel)e.getSource();
                if(lsm.isSelectionEmpty()) return;
                int selectedRow = lsm.getMinSelectionIndex();
                if(selectedRow < 0) return;
                if(selected_chart.get(selectedRow) == selected_header)return;
                selected_header = selected_chart.get(selectedRow);

                updateInfo();
                updateRankFromChartSelection();
            }
        });
       
        readGameOptions();
 
  btn_autoplay_keys.setEnabled(jc_autoplay.isSelected());
 
  JPopupMenu popMenu = new JPopupMenu();
  JMenuItem bmsConvItem = new JMenuItem("Convert to BMS");
 
  bmsConvItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
    try {
        BMSWriter.export(selected_header, "converted");
    } catch (IOException ex) {
        java.util.logging.Logger.getLogger(MusicSelection.class.getName()).log(Level.SEVERE, "{0}", ex);
    } finally {
        System.gc();
    }
            }
        });
 
  popMenu.add(bmsConvItem);
  popMenu.add(new JMenuItem("Convert to OJN"));
  popMenu.add(new JMenuItem("Convert to SM"));
  popMenu.add(new JMenuItem("Convert to SNP"));
 
  //table_chartlist.addMouseListener(new PopupListener(popMenu));
  table_songlist.addMouseListener(new PopupListener(popMenu));
    }
   
    private void readGameOptions() {
        // TODO: read Config gameOptions and set them on the GUI
        GameOptions go = Config.getGameOptions();
       
        jc_autoplay.setSelected(go.isAutoplay());
  jc_autosound.setSelected(go.isAutosound());
        combo_channelModifier.setSelectedItem(go.getChannelModifier());
        combo_visibilityModifier.setSelectedItem(go.getVisibilityModifier());
        slider_main_vol.setValue(Math.round(go.getMasterVolume()*100));
        slider_key_vol.setValue(Math.round(go.getKeyVolume()*100));
        slider_bgm_vol.setValue(Math.round(go.getBGMVolume()*100));
        js_hispeed.setValue(go.getSpeedMultiplier());
        combo_speedType.setSelectedItem(go.getSpeedType());
        txt_displayLag.setText(go.getDisplayLag() + "");
        txt_audioLatency.setText(go.getAudioLatency() + "");
       
        for(DisplayMode dm : display_modes)
        {
            if(go.isDisplaySaved(dm))
                combo_displays.setSelectedItem(dm);
        }

        jc_full_screen.setSelected(go.isDisplayFullscreen());
        jc_vsync.setSelected(go.isDisplayVsync());
        jc_timed_judgment.setSelected(go.getJudgmentType() == GameOptions.JudgmentType.TimeJudgment);
       
    }
   
    /*
     * the parent is telling us the window is closing
     * now is a good time to save the game options
     */
    public void windowClosing() {
        GameOptions go = Config.getGameOptions();

        go.setAutoplay(jc_autoplay.isSelected());
  go.setAutosound(jc_autosound.isSelected());
        go.setChannelModifier((ChannelMod)combo_channelModifier.getSelectedItem());
        go.setVisibilityModifier((VisibilityMod)combo_visibilityModifier.getSelectedItem());
        go.setMasterVolume(slider_main_vol.getValue()/100f);
        go.setKeyVolume(slider_key_vol.getValue()/100f);
        go.setBGMVolume(slider_bgm_vol.getValue()/100f);
        go.setSpeedMultiplier((Double)js_hispeed.getValue());
        go.setSpeedType((SpeedType)combo_speedType.getSelectedItem());
        go.setDisplayFullscreen(jc_full_screen.isSelected());
        go.setDisplayVsync(jc_vsync.isSelected());
        go.setJudgmentType(jc_timed_judgment.isSelected() ? GameOptions.JudgmentType.TimeJudgment : GameOptions.JudgmentType.BeatJudgment);
       
        go.setDisplay((DisplayMode)combo_displays.getSelectedItem());
       
        Config.setGameOptions(go);
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        rank_group = new javax.swing.ButtonGroup();
        panel_list = new javax.swing.JPanel();
        table_scroll = new javax.swing.JScrollPane();
        table_songlist = new javax.swing.JTable();
        txt_filter = new javax.swing.JTextField();
        lbl_search = new javax.swing.JLabel();
        bt_choose_dir = new javax.swing.JButton();
        load_progress = new javax.swing.JProgressBar();
        jLabel2 = new javax.swing.JLabel();
        combo_dirs = new javax.swing.JComboBox();
        btn_reload = new javax.swing.JButton();
        btn_delete = new javax.swing.JButton();
        panel_setting = new javax.swing.JPanel();
        combo_displays = new javax.swing.JComboBox();
        txt_res_height = new javax.swing.JTextField();
        txt_res_width = new javax.swing.JTextField();
        jc_vsync = new javax.swing.JCheckBox();
        lbl_display = new javax.swing.JLabel();
        jc_custom_size = new javax.swing.JCheckBox();
        lbl_res_x = new javax.swing.JLabel();
        jc_full_screen = new javax.swing.JCheckBox();
        jLabel1 = new javax.swing.JLabel();
        txt_displayLag = new javax.swing.JTextField();
        cb_autoSyncDisplay = new javax.swing.JCheckBox();
        jLabel3 = new javax.swing.JLabel();
        txt_audioLatency = new javax.swing.JTextField();
        cb_autoSyncAudio = new javax.swing.JCheckBox();
        panel_song = new javax.swing.JPanel();
        panel_modifiers = new javax.swing.JPanel();
        lbl_main_vol = new javax.swing.JLabel();
        slider_main_vol = new javax.swing.JSlider();
        lbl_key_vol = new javax.swing.JLabel();
        slider_key_vol = new javax.swing.JSlider();
        lbl_bgm_vol = new javax.swing.JLabel();
        slider_bgm_vol = new javax.swing.JSlider();
        lbl_channelModifier = new javax.swing.JLabel();
        combo_channelModifier = new javax.swing.JComboBox();
        lbl_visibilityModifier = new javax.swing.JLabel();
        combo_visibilityModifier = new javax.swing.JComboBox();
        js_hispeed = new javax.swing.JSpinner();
        lbl_rank = new javax.swing.JLabel();
        jr_rank_easy = new javax.swing.JRadioButton();
        jr_rank_normal = new javax.swing.JRadioButton();
        jr_rank_hard = new javax.swing.JRadioButton();
        jc_autoplay = new javax.swing.JCheckBox();
        jc_timed_judgment = new javax.swing.JCheckBox();
        combo_speedType = new javax.swing.JComboBox();
        btn_autoplay_keys = new javax.swing.JButton();
        jc_autosound = new javax.swing.JCheckBox();
        panel_info = new javax.swing.JPanel();
        lbl_level1 = new javax.swing.JLabel();
        lbl_bpm1 = new javax.swing.JLabel();
        lbl_time1 = new javax.swing.JLabel();
        lbl_level = new javax.swing.JLabel();
        lbl_genre1 = new javax.swing.JLabel();
        lbl_filename = new javax.swing.JLabel();
        lbl_genre = new javax.swing.JLabel();
        lbl_artist = new javax.swing.JLabel();
        lbl_title = new javax.swing.JLabel();
        lbl_notes = new javax.swing.JLabel();
        lbl_notes1 = new javax.swing.JLabel();
        lbl_time = new javax.swing.JLabel();
        lbl_keys1 = new javax.swing.JLabel();
        lbl_bpm = new javax.swing.JLabel();
        lbl_keys = new javax.swing.JLabel();
        lbl_cover = new javax.swing.JLabel();
        table_scroll2 = new javax.swing.JScrollPane();
        table_chartlist = new javax.swing.JTable();
        bt_play = new javax.swing.JButton();
        cb_startPaused = new javax.swing.JCheckBox();
        jLabel4 = new javax.swing.JLabel();
        txtLocalMatchingServer = new javax.swing.JTextField();
        btnCreateServer = new javax.swing.JButton();

        setPreferredSize(new java.awt.Dimension(900, 673));

        panel_list.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createEtchedBorder(), "Selection List", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.TOP));

        table_songlist.setModel(model_songlist);
        table_songlist.setAutoCreateRowSorter(true);
        table_songlist.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
        table_songlist.getSelectionModel().addListSelectionListener(this);
        table_scroll.setViewportView(table_songlist);

        lbl_search.setText("Search:");

        bt_choose_dir.setText("Choose dir");
        bt_choose_dir.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bt_choose_dirActionPerformed(evt);
            }
        });

        load_progress.setStringPainted(true);

        jLabel2.setText("Saved dirs:");

        combo_dirs.setMaximumSize(new java.awt.Dimension(34, 35));
        combo_dirs.addItemListener(new java.awt.event.ItemListener() {
            public void itemStateChanged(java.awt.event.ItemEvent evt) {
                combo_dirsItemStateChanged(evt);
            }
        });

        btn_reload.setText("Reload");
        btn_reload.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btn_reloadActionPerformed(evt);
            }
        });

        btn_delete.setText("Remove Dir");
        btn_delete.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btn_deleteActionPerformed(evt);
            }
        });

        combo_displays.setModel(new javax.swing.DefaultComboBoxModel(display_modes));

        txt_res_height.setText("600");
        txt_res_height.setEnabled(false);

        txt_res_width.setText("800");
        txt_res_width.setEnabled(false);

        jc_vsync.setSelected(true);
        jc_vsync.setText("Use VSync");

        lbl_display.setText("Display:");

        jc_custom_size.setFont(new java.awt.Font("Tahoma", 0, 10));
        jc_custom_size.setText("Custom size:");
        jc_custom_size.addItemListener(new java.awt.event.ItemListener() {
            public void itemStateChanged(java.awt.event.ItemEvent evt) {
                jc_custom_size_clicked(evt);
            }
        });

        lbl_res_x.setText("x");

        jc_full_screen.setText("Full screen");

        jLabel1.setText("Display Lag:");

        txt_displayLag.setText("0");
        txt_displayLag.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txt_displayLagActionPerformed(evt);
            }
        });

        cb_autoSyncDisplay.setText("autosync");
        cb_autoSyncDisplay.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                cb_autoSyncDisplayActionPerformed(evt);
            }
        });

        jLabel3.setText("Audio Latency:");

        txt_audioLatency.setText("0");
        txt_audioLatency.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txt_audioLatencyActionPerformed(evt);
            }
        });

        cb_autoSyncAudio.setText("autosync");
        cb_autoSyncAudio.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                cb_autoSyncAudioActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout panel_settingLayout = new javax.swing.GroupLayout(panel_setting);
        panel_setting.setLayout(panel_settingLayout);
        panel_settingLayout.setHorizontalGroup(
            panel_settingLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panel_settingLayout.createSequentialGroup()
                .addGroup(panel_settingLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(panel_settingLayout.createSequentialGroup()
                        .addComponent(lbl_display)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(combo_displays, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(jc_custom_size, javax.swing.GroupLayout.PREFERRED_SIZE, 85, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(txt_res_width, javax.swing.GroupLayout.PREFERRED_SIZE, 40, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(lbl_res_x)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(txt_res_height, javax.swing.GroupLayout.PREFERRED_SIZE, 39, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(panel_settingLayout.createSequentialGroup()
                        .addGroup(panel_settingLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jc_vsync)
                            .addComponent(jLabel1))
                        .addGroup(panel_settingLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addGroup(panel_settingLayout.createSequentialGroup()
                                .addGap(58, 58, 58)
                                .addComponent(jc_full_screen))
                            .addGroup(panel_settingLayout.createSequentialGroup()
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addGroup(panel_settingLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                                    .addComponent(txt_displayLag)
                                    .addComponent(txt_audioLatency, javax.swing.GroupLayout.DEFAULT_SIZE, 164, Short.MAX_VALUE))
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addGroup(panel_settingLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                    .addComponent(cb_autoSyncDisplay)
                                    .addComponent(cb_autoSyncAudio))
                                .addGap(4, 4, 4))))
                    .addComponent(jLabel3))
                .addContainerGap(20, Short.MAX_VALUE))
        );
        panel_settingLayout.setVerticalGroup(
            panel_settingLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panel_settingLayout.createSequentialGroup()
                .addGroup(panel_settingLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER)
                    .addComponent(txt_res_height, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(lbl_res_x)
                    .addComponent(txt_res_width, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jc_custom_size)
                    .addComponent(combo_displays, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(lbl_display))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(panel_settingLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER)
                    .addComponent(jc_vsync)
                    .addComponent(jc_full_screen))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 13, Short.MAX_VALUE)
                .addGroup(panel_settingLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel1)
                    .addComponent(txt_displayLag, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(cb_autoSyncDisplay))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(panel_settingLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel3)
                    .addComponent(txt_audioLatency, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(cb_autoSyncAudio)))
        );

        javax.swing.GroupLayout panel_listLayout = new javax.swing.GroupLayout(panel_list);
        panel_list.setLayout(panel_listLayout);
        panel_listLayout.setHorizontalGroup(
            panel_listLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panel_listLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(panel_listLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER)
                    .addGroup(panel_listLayout.createSequentialGroup()
                        .addComponent(bt_choose_dir)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jLabel2)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(combo_dirs, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(load_progress, javax.swing.GroupLayout.PREFERRED_SIZE, 91, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(btn_reload, javax.swing.GroupLayout.PREFERRED_SIZE, 71, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(btn_delete))
                    .addComponent(table_scroll))
                .addContainerGap())
            .addGroup(javax.swing.GroupLayout.Alignment.CENTER, panel_listLayout.createSequentialGroup()
                .addGap(10, 10, 10)
                .addComponent(lbl_search)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(txt_filter)
                .addGap(10, 10, 10))
            .addGroup(panel_listLayout.createSequentialGroup()
                .addComponent(panel_setting, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        panel_listLayout.setVerticalGroup(
            panel_listLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panel_listLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(panel_listLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(bt_choose_dir)
                    .addComponent(jLabel2)
                    .addComponent(combo_dirs, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(btn_reload)
                    .addComponent(btn_delete)
                    .addComponent(load_progress, javax.swing.GroupLayout.PREFERRED_SIZE, 27, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(table_scroll, javax.swing.GroupLayout.DEFAULT_SIZE, 370, Short.MAX_VALUE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(panel_listLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(txt_filter, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(lbl_search))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(panel_setting, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
        );

        panel_song.setName("");

        panel_modifiers.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createEtchedBorder(), "Modifiers", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.TOP));
        panel_modifiers.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));

        lbl_main_vol.setText("Main Volume:");

        slider_main_vol.setPaintLabels(true);
        slider_main_vol.setToolTipText("Main Volume");
        slider_main_vol.setMaximumSize(new java.awt.Dimension(10, 32767));

        lbl_key_vol.setText("Key Volume:");

        slider_key_vol.setPaintLabels(true);
        slider_key_vol.setToolTipText("Key Volume");
        slider_key_vol.setValue(100);
        slider_key_vol.setMaximumSize(new java.awt.Dimension(10, 32767));

        lbl_bgm_vol.setText("BGM Volume:");

        slider_bgm_vol.setPaintLabels(true);
        slider_bgm_vol.setToolTipText("BGM Volume");
        slider_bgm_vol.setValue(100);

        lbl_channelModifier.setText("Channel Modifier:");

        combo_channelModifier.setModel(new javax.swing.DefaultComboBoxModel(GameOptions.ChannelMod.values()));

        lbl_visibilityModifier.setText("Visibility Modifier:");

        combo_visibilityModifier.setModel(new javax.swing.DefaultComboBoxModel(GameOptions.VisibilityMod.values()));

        js_hispeed.setModel(new javax.swing.SpinnerNumberModel(1.0d, 0.5d, 10.0d, 0.5d));
        js_hispeed.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));

        lbl_rank.setText("Rank:");

        rank_group.add(jr_rank_easy);
        jr_rank_easy.setSelected(true);
        jr_rank_easy.setText("Easy");
        jr_rank_easy.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jr_rank_easy.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jr_rank_easy.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jr_rank_easyActionPerformed(evt);
            }
        });

        rank_group.add(jr_rank_normal);
        jr_rank_normal.setText("Normal");
        jr_rank_normal.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jr_rank_normal.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jr_rank_normal.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jr_rank_normalActionPerformed(evt);
            }
        });

        rank_group.add(jr_rank_hard);
        jr_rank_hard.setText("Hard");
        jr_rank_hard.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jr_rank_hard.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jr_rank_hard.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jr_rank_hardActionPerformed(evt);
            }
        });

        jc_autoplay.setText("Autoplay");
        jc_autoplay.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jc_autoplayActionPerformed(evt);
            }
        });

        jc_timed_judgment.setText("Use timed judgment");
        jc_timed_judgment.setToolTipText("Like Bemani games");

        combo_speedType.setModel(new javax.swing.DefaultComboBoxModel(GameOptions.SpeedType.values()));

        btn_autoplay_keys.setText("Keys");
        btn_autoplay_keys.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btn_autoplay_keysActionPerformed(evt);
            }
        });

        jc_autosound.setText("AutoSound");

        javax.swing.GroupLayout panel_modifiersLayout = new javax.swing.GroupLayout(panel_modifiers);
        panel_modifiers.setLayout(panel_modifiersLayout);
        panel_modifiersLayout.setHorizontalGroup(
            panel_modifiersLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panel_modifiersLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(panel_modifiersLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(panel_modifiersLayout.createSequentialGroup()
                        .addComponent(lbl_channelModifier)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(combo_channelModifier, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 96, Short.MAX_VALUE)
                        .addComponent(lbl_visibilityModifier)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(combo_visibilityModifier, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(panel_modifiersLayout.createSequentialGroup()
                        .addGroup(panel_modifiersLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(lbl_bgm_vol)
                            .addComponent(lbl_key_vol)
                            .addComponent(lbl_main_vol))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(panel_modifiersLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(slider_key_vol, javax.swing.GroupLayout.Alignment.TRAILING, 0, 0, Short.MAX_VALUE)
                            .addComponent(slider_bgm_vol, javax.swing.GroupLayout.Alignment.TRAILING, 0, 0, Short.MAX_VALUE)
                            .addComponent(slider_main_vol, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE))
                        .addGroup(panel_modifiersLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addGroup(panel_modifiersLayout.createSequentialGroup()
                                .addGap(10, 10, 10)
                                .addComponent(lbl_rank)
                                .addGap(27, 27, 27)
                                .addComponent(jr_rank_easy)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(jr_rank_normal)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(jr_rank_hard))
                            .addGroup(panel_modifiersLayout.createSequentialGroup()
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(combo_speedType, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                .addComponent(js_hispeed, javax.swing.GroupLayout.PREFERRED_SIZE, 76, javax.swing.GroupLayout.PREFERRED_SIZE))))
                    .addGroup(panel_modifiersLayout.createSequentialGroup()
                        .addComponent(jc_timed_judgment)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(jc_autosound)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(jc_autoplay)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(btn_autoplay_keys)))
                .addContainerGap())
        );
        panel_modifiersLayout.setVerticalGroup(
            panel_modifiersLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panel_modifiersLayout.createSequentialGroup()
                .addGroup(panel_modifiersLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(panel_modifiersLayout.createSequentialGroup()
                        .addGroup(panel_modifiersLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER)
                            .addComponent(lbl_main_vol)
                            .addComponent(slider_main_vol, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(lbl_rank))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(panel_modifiersLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER)
                            .addComponent(lbl_key_vol)
                            .addComponent(slider_key_vol, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(panel_modifiersLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER)
                            .addComponent(lbl_bgm_vol)
                            .addComponent(slider_bgm_vol, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(js_hispeed, javax.swing.GroupLayout.PREFERRED_SIZE, 28, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(combo_speedType, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                    .addComponent(jr_rank_easy)
                    .addComponent(jr_rank_normal)
                    .addComponent(jr_rank_hard))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(panel_modifiersLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(panel_modifiersLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(lbl_visibilityModifier)
                        .addComponent(combo_visibilityModifier, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(panel_modifiersLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(combo_channelModifier, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(lbl_channelModifier)))
                .addGap(18, 18, 18)
                .addGroup(panel_modifiersLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jc_timed_judgment)
                    .addComponent(btn_autoplay_keys)
                    .addComponent(jc_autoplay)
                    .addComponent(jc_autosound)))
        );

        panel_info.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createEtchedBorder(), "Song Info", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.TOP));

        lbl_level1.setText("Level:");

        lbl_bpm1.setText("BPM:");

        lbl_time1.setText("Time:");

        lbl_level.setFont(lbl_level.getFont());
        lbl_level.setText("content");

        lbl_genre1.setText("Genre:");

        lbl_filename.setFont(lbl_filename.getFont().deriveFont(lbl_filename.getFont().getSize()-1f));
        lbl_filename.setText("filename");

        lbl_genre.setFont(lbl_genre.getFont());
        lbl_genre.setText("content");

        lbl_artist.setFont(lbl_artist.getFont().deriveFont((lbl_artist.getFont().getStyle() | java.awt.Font.ITALIC)));
        lbl_artist.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        lbl_artist.setText("Artist");

        lbl_title.setFont(lbl_title.getFont().deriveFont(lbl_title.getFont().getSize()+7f));
        lbl_title.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        lbl_title.setText("Title");

        lbl_notes.setFont(lbl_notes.getFont());
        lbl_notes.setText("content");

        lbl_notes1.setText("Notes:");

        lbl_time.setFont(lbl_time.getFont());
        lbl_time.setText("content");

        lbl_keys1.setText("Keys:");

        lbl_bpm.setFont(lbl_bpm.getFont());
        lbl_bpm.setText("content");

        lbl_keys.setFont(lbl_keys.getFont());
        lbl_keys.setText("content");

        lbl_cover.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        lbl_cover.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
        lbl_cover.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        lbl_cover.setIconTextGap(0);
        lbl_cover.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                lbl_coverMouseClicked(evt);
            }
        });

        table_chartlist.setModel(model_chartlist);
        table_chartlist.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
        table_scroll2.setViewportView(table_chartlist);

        javax.swing.GroupLayout panel_infoLayout = new javax.swing.GroupLayout(panel_info);
        panel_info.setLayout(panel_infoLayout);
        panel_infoLayout.setHorizontalGroup(
            panel_infoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 473, Short.MAX_VALUE)
            .addGroup(panel_infoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(panel_infoLayout.createSequentialGroup()
                    .addContainerGap()
                    .addGroup(panel_infoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addComponent(table_scroll2, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 433, Short.MAX_VALUE)
                        .addComponent(lbl_title, javax.swing.GroupLayout.DEFAULT_SIZE, 433, Short.MAX_VALUE)
                        .addGroup(panel_infoLayout.createSequentialGroup()
                            .addComponent(lbl_cover, javax.swing.GroupLayout.PREFERRED_SIZE, 146, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                            .addGroup(panel_infoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                                .addGroup(panel_infoLayout.createSequentialGroup()
                                    .addGroup(panel_infoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                        .addComponent(lbl_bpm1)
                                        .addComponent(lbl_genre1)
                                        .addComponent(lbl_level1)
                                        .addComponent(lbl_notes1)
                                        .addComponent(lbl_time1)
                                        .addComponent(lbl_keys1))
                                    .addGap(18, 18, 18)
                                    .addGroup(panel_infoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                        .addComponent(lbl_level, javax.swing.GroupLayout.DEFAULT_SIZE, 214, Short.MAX_VALUE)
                                        .addComponent(lbl_notes, javax.swing.GroupLayout.DEFAULT_SIZE, 214, Short.MAX_VALUE)
                                        .addComponent(lbl_time, javax.swing.GroupLayout.DEFAULT_SIZE, 214, Short.MAX_VALUE)
                                        .addComponent(lbl_genre, javax.swing.GroupLayout.DEFAULT_SIZE, 214, Short.MAX_VALUE)
                                        .addComponent(lbl_bpm, javax.swing.GroupLayout.DEFAULT_SIZE, 214, Short.MAX_VALUE)
                                        .addComponent(lbl_keys, javax.swing.GroupLayout.DEFAULT_SIZE, 214, Short.MAX_VALUE)))
                                .addComponent(lbl_filename)))
                        .addComponent(lbl_artist, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 433, Short.MAX_VALUE))
                    .addContainerGap()))
        );
        panel_infoLayout.setVerticalGroup(
            panel_infoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 352, Short.MAX_VALUE)
            .addGroup(panel_infoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(panel_infoLayout.createSequentialGroup()
                    .addContainerGap()
                    .addGroup(panel_infoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                        .addComponent(lbl_cover, javax.swing.GroupLayout.PREFERRED_SIZE, 146, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGroup(panel_infoLayout.createSequentialGroup()
                            .addGroup(panel_infoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(lbl_bpm1)
                                .addComponent(lbl_bpm))
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                            .addGroup(panel_infoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(lbl_genre)
                                .addComponent(lbl_genre1))
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                            .addGroup(panel_infoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(lbl_level)
                                .addComponent(lbl_level1))
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                            .addGroup(panel_infoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(lbl_notes1)
                                .addComponent(lbl_notes))
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                            .addGroup(panel_infoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(lbl_time)
                                .addComponent(lbl_time1))
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                            .addGroup(panel_infoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(lbl_keys1)
                                .addComponent(lbl_keys))
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(lbl_filename)))
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                    .addComponent(lbl_title, javax.swing.GroupLayout.PREFERRED_SIZE, 44, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                    .addComponent(lbl_artist)
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                    .addComponent(table_scroll2, javax.swing.GroupLayout.DEFAULT_SIZE, 69, Short.MAX_VALUE)
                    .addContainerGap()))
        );

        javax.swing.GroupLayout panel_songLayout = new javax.swing.GroupLayout(panel_song);
        panel_song.setLayout(panel_songLayout);
        panel_songLayout.setHorizontalGroup(
            panel_songLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panel_songLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(panel_songLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(panel_info, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(panel_modifiers, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addContainerGap())
        );
        panel_songLayout.setVerticalGroup(
            panel_songLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panel_songLayout.createSequentialGroup()
                .addComponent(panel_info, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(panel_modifiers, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
        );

        bt_play.setFont(new java.awt.Font("Tahoma", 1, 24));
        bt_play.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/open2jam_icon.png")));
        bt_play.setText("PLAY !!!");
        bt_play.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bt_playActionPerformed(evt);
            }
        });

        cb_startPaused.setText("Start Paused");
        cb_startPaused.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                cb_startPausedActionPerformed(evt);
            }
        });

        jLabel4.setText("<html>Local Matching Server<br><small>(host:port)</small>");

        txtLocalMatchingServer.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txtLocalMatchingServerActionPerformed(evt);
            }
        });

        btnCreateServer.setText("Create Server");
        btnCreateServer.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnCreateServerActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER)
                    .addComponent(panel_song, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(bt_play, javax.swing.GroupLayout.PREFERRED_SIZE, 359, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(cb_startPaused)))
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(panel_list, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                    .addGroup(layout.createSequentialGroup()
                        .addGap(26, 26, 26)
                        .addComponent(jLabel4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(txtLocalMatchingServer, javax.swing.GroupLayout.PREFERRED_SIZE, 141, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(btnCreateServer)
                        .addGap(176, 176, 176))))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(panel_song, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(panel_list, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(bt_play)
                    .addComponent(cb_startPaused)
                    .addComponent(txtLocalMatchingServer, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(btnCreateServer)
                    .addComponent(jLabel4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(27, 27, 27))
        );
    }// </editor-fold>//GEN-END:initComponents

    private void bt_choose_dirActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bt_choose_dirActionPerformed
       openFileChooser();
}//GEN-LAST:event_bt_choose_dirActionPerformed

    private void btn_reloadActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btn_reloadActionPerformed
        updateSelection(Config.getCwd());
}//GEN-LAST:event_btn_reloadActionPerformed

    private void btn_deleteActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btn_deleteActionPerformed
        String str = "Are you sure?";
        if(JOptionPane.showConfirmDialog(this, str, "Warning",
                JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE)
                != JOptionPane.YES_OPTION) return;      
       
        ArrayList<File> dir_list = Config.getDirsList();

        File rem = Config.getCwd();
        Config.delCache(rem);
        if(dir_list.contains(rem))
        {
            dir_list.remove(rem);
            combo_dirs.removeItem(new FileItem(rem));
            Config.setDirsList(dir_list);
        }
       
        if(dir_list.isEmpty())
            openFileChooser();  
        else
        {
            File f = dir_list.get(0);
            loadDir(f);
        }
}//GEN-LAST:event_btn_deleteActionPerformed

    private void lbl_coverMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_lbl_coverMouseClicked
        if(selected_header == null)return;
        BufferedImage i = selected_header.getCover();
        if(i == null) return;
        JOptionPane.showMessageDialog(this, null, "Cover",
                JOptionPane.INFORMATION_MESSAGE, new ImageIcon(i));
}//GEN-LAST:event_lbl_coverMouseClicked

    private void jc_custom_size_clicked(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_jc_custom_size_clicked
        if (evt.getStateChange() == ItemEvent.SELECTED){
            combo_displays.setEnabled(false);
            txt_res_width.setEnabled(true);
            lbl_res_x.setEnabled(true);
            txt_res_height.setEnabled(true);
        }else{
            txt_res_width.setEnabled(false);
            lbl_res_x.setEnabled(false);
            txt_res_height.setEnabled(false);
            combo_displays.setEnabled(true);
        }
}//GEN-LAST:event_jc_custom_size_clicked

    private void bt_playActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bt_playActionPerformed
        try {
            if(selected_header == null) return;
           
           
            final double hispeed = (Double) js_hispeed.getValue();

            final DisplayMode dm;
            if(jc_custom_size.isSelected()){ // custom size selected
                int w,h;
                try{
                    w = Integer.parseInt(txt_res_width.getText());
                    h = Integer.parseInt(txt_res_height.getText());
                }catch(Exception e){
                    JOptionPane.showMessageDialog(this, "Invalid value on custom size", "Error", JOptionPane.WARNING_MESSAGE);
                    return;
                }
                dm = new DisplayMode(w,h);
            }else{
                dm = (DisplayMode) combo_displays.getSelectedItem();
            }
           
            final boolean vsync = jc_vsync.isSelected();
            boolean fs = jc_full_screen.isSelected();

            final boolean autoplay = jc_autoplay.isSelected();
            final boolean autosound = jc_autosound.isSelected();

            final boolean time_judgment = jc_timed_judgment.isSelected();

            final SpeedType speed_type =(SpeedType) combo_speedType.getSelectedItem();

            final ChannelMod channelModifier = (ChannelMod) combo_channelModifier.getSelectedItem();
            final VisibilityMod visibilityModifier = (VisibilityMod) combo_visibilityModifier.getSelectedItem();

            final float mainVol = slider_main_vol.getValue() / 100f;
            final float keyVol = slider_key_vol.getValue() / 100f;
            final float bgmVol = slider_bgm_vol.getValue() / 100f;


            if(!dm.isFullscreenCapable() && fs) {
                String str = "This monitor can't support the selected resolution.\n"
                        + "Do you want to play it in windowed mode?";
                if(JOptionPane.showConfirmDialog(this, str, "Warning",
                        JOptionPane.YES_NO_OPTION, JOptionPane.ERROR_MESSAGE)
                        == JOptionPane.YES_OPTION)
                    fs = false;
            }

            final GameOptions go = Config.getGameOptions();
            go.setAutoplay(autoplay);
            go.setAutosound(autosound);
            go.setChannelModifier(channelModifier);
            go.setVisibilityModifier(visibilityModifier);
            go.setMasterVolume(mainVol);
            go.setKeyVolume(keyVol);
            go.setBGMVolume(bgmVol);
            go.setSpeedMultiplier(hispeed);
            go.setSpeedType(speed_type);
            go.setDisplayFullscreen(fs);
            go.setDisplayVsync(vsync);
            go.setJudgmentType(jc_timed_judgment.isSelected() ? GameOptions.JudgmentType.TimeJudgment : GameOptions.JudgmentType.BeatJudgment);
           
            System.out.println(go.isAutoplay());
           
            try{
                go.setDisplayLag(Double.parseDouble(txt_displayLag.getText()));
            }catch(Exception e){
                JOptionPane.showMessageDialog(this, "Invalid display lag value", "Error", JOptionPane.WARNING_MESSAGE);
                return;
            }
           
            try{
                go.setAudioLatency(Double.parseDouble(txt_audioLatency.getText()));
            }catch(Exception e){
                JOptionPane.showMessageDialog(this, "Invalid audio latency value", "Error", JOptionPane.WARNING_MESSAGE);
                return;
            }

            NativeLibrary.addSearchPath("vlc", go.getVLCLibraryPath());
           
            final Render r;
            r = new Render(selected_header, go, dm);
           
            if (cb_startPaused.isSelected()) {
                r.setStartPaused();
            }
           
            if (cb_autoSyncDisplay.isSelected()) {
                r.setAutosyncDisplay();
                r.setAutosyncCallback(new Render.AutosyncCallback() {

                    @Override
                    public void autosyncFinished(double displayLag) {
                        if (JOptionPane.showConfirmDialog(MusicSelection.this, "This display latency has changed from\n"
                                + go.getDisplayLag() + "\nto\n" + displayLag + "\n\nSave this change?",
                                "Save Display Latency", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
                            go.setDisplayLag(displayLag);
                            txt_displayLag.setText(displayLag + "");
                            cb_autoSyncDisplay.setSelected(false);
                        }
                    }
                });
            }
           
            else if (cb_autoSyncAudio.isSelected()) {
                r.setAutosyncAudio();
                r.setAutosyncCallback(new Render.AutosyncCallback() {

                    @Override
                    public void autosyncFinished(double audioLatency) {
                        if (JOptionPane.showConfirmDialog(MusicSelection.this, "This audio latency has changed from\n"
                                + go.getAudioLatency() + "\nto\n" + audioLatency + "\n\nSave this change?",
                                "Save Audio Latency", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
                            go.setAudioLatency(audioLatency);
                            txt_audioLatency.setText(audioLatency + "");
                            cb_autoSyncAudio.setSelected(false);
                        }
                    }
                });
            }
           
            r.setLocalMatchingServer(txtLocalMatchingServer.getText());
           
            r.setRank(rank);
           
            r.setJudge(jc_timed_judgment.isSelected()
                    ? new TimeJudgment()
                    : new BeatJudgment());
           
            if (lastServer != null && !lastServer.isClosed()) {
                r.setServer(lastServer);
            }
           
            new RenderThread(this.getTopLevelAncestor(), r).start();
        } catch (SoundSystemException ex) {
            java.util.logging.Logger.getLogger(MusicSelection.class.getName()).log(Level.SEVERE, "{0}", ex);
        }
}//GEN-LAST:event_bt_playActionPerformed

    public void setRank(int rank) {
        this.rank = rank;
       
        if (rank == 0) jr_rank_easy.setSelected(true);
        if (rank == 1) jr_rank_normal.setSelected(true);
        if (rank == 2) jr_rank_hard.setSelected(true);
       
        int sel_row = table_songlist.getSelectedRow();
        if(sel_row >= 0)last_model_idx = table_songlist.convertRowIndexToModel(sel_row);
        model_songlist.setRank(rank);
    }
   
    private void jr_rank_easyActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jr_rank_easyActionPerformed
        setRank(0);
}//GEN-LAST:event_jr_rank_easyActionPerformed

    private void jr_rank_normalActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jr_rank_normalActionPerformed
        setRank(1);
}//GEN-LAST:event_jr_rank_normalActionPerformed

    private void jr_rank_hardActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jr_rank_hardActionPerformed
        setRank(2);
}//GEN-LAST:event_jr_rank_hardActionPerformed

    private void combo_dirsItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_combo_dirsItemStateChanged
        if(combo_dirs.getSelectedIndex() == -1) return;
        File dir = ((FileItem)combo_dirs.getSelectedItem()).file;
        if(dir.equals(Config.getCwd())) return;
        loadDir(dir);
    }//GEN-LAST:event_combo_dirsItemStateChanged

    private void jc_autoplayActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jc_autoplayActionPerformed
  btn_autoplay_keys.setEnabled(jc_autoplay.isSelected());
    }//GEN-LAST:event_jc_autoplayActionPerformed

    private void btn_autoplay_keysActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btn_autoplay_keysActionPerformed

    }//GEN-LAST:event_btn_autoplay_keysActionPerformed

    private void txt_displayLagActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_txt_displayLagActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_txt_displayLagActionPerformed

    private void cb_autoSyncDisplayActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cb_autoSyncDisplayActionPerformed
        if (cb_autoSyncDisplay.isSelected()) cb_autoSyncAudio.setSelected(false);
    }//GEN-LAST:event_cb_autoSyncDisplayActionPerformed

    private void txt_audioLatencyActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_txt_audioLatencyActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_txt_audioLatencyActionPerformed

    private void cb_autoSyncAudioActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cb_autoSyncAudioActionPerformed
        if (cb_autoSyncAudio.isSelected()) {
            cb_autoSyncDisplay.setSelected(false);
            jc_autosound.setSelected(true);
        }
    }//GEN-LAST:event_cb_autoSyncAudioActionPerformed

    private void cb_startPausedActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cb_startPausedActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_cb_startPausedActionPerformed

    private void txtLocalMatchingServerActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_txtLocalMatchingServerActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_txtLocalMatchingServerActionPerformed

    private void btnCreateServerActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnCreateServerActionPerformed
       
        String portText = JOptionPane.showInputDialog("What port?", "7273");
       
        if (portText == null || portText.isEmpty()) {
            return;
        }
       
        int port = 0;
       
        try {
            port = Integer.parseInt(portText);
        } catch (NumberFormatException e) {
            JOptionPane.showMessageDialog(null, "Error", "Invalid port", JOptionPane.ERROR_MESSAGE, null);
            return;
        }
       
        txtLocalMatchingServer.setText("localhost:" + port);
       
        Server server = new Server(port);
        ServerUI ui = new ServerUI(server);
       
        SwingUtilities.invokeLater(ui);
        server.start();
        lastServer = server;

    }//GEN-LAST:event_btnCreateServerActionPerformed

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton bt_choose_dir;
    private javax.swing.JButton bt_play;
    private javax.swing.JButton btnCreateServer;
    private javax.swing.JButton btn_autoplay_keys;
    private javax.swing.JButton btn_delete;
    private javax.swing.JButton btn_reload;
    private javax.swing.JCheckBox cb_autoSyncAudio;
    private javax.swing.JCheckBox cb_autoSyncDisplay;
    private javax.swing.JCheckBox cb_startPaused;
    private javax.swing.JComboBox combo_channelModifier;
    private javax.swing.JComboBox combo_dirs;
    private javax.swing.JComboBox combo_displays;
    private javax.swing.JComboBox combo_speedType;
    private javax.swing.JComboBox combo_visibilityModifier;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JCheckBox jc_autoplay;
    private javax.swing.JCheckBox jc_autosound;
    private javax.swing.JCheckBox jc_custom_size;
    private javax.swing.JCheckBox jc_full_screen;
    private javax.swing.JCheckBox jc_timed_judgment;
    private javax.swing.JCheckBox jc_vsync;
    private javax.swing.JRadioButton jr_rank_easy;
    private javax.swing.JRadioButton jr_rank_hard;
    private javax.swing.JRadioButton jr_rank_normal;
    private javax.swing.JSpinner js_hispeed;
    private javax.swing.JLabel lbl_artist;
    private javax.swing.JLabel lbl_bgm_vol;
    private javax.swing.JLabel lbl_bpm;
    private javax.swing.JLabel lbl_bpm1;
    private javax.swing.JLabel lbl_channelModifier;
    private javax.swing.JLabel lbl_cover;
    private javax.swing.JLabel lbl_display;
    private javax.swing.JLabel lbl_filename;
    private javax.swing.JLabel lbl_genre;
    private javax.swing.JLabel lbl_genre1;
    private javax.swing.JLabel lbl_key_vol;
    private javax.swing.JLabel lbl_keys;
    private javax.swing.JLabel lbl_keys1;
    private javax.swing.JLabel lbl_level;
    private javax.swing.JLabel lbl_level1;
    private javax.swing.JLabel lbl_main_vol;
    private javax.swing.JLabel lbl_notes;
    private javax.swing.JLabel lbl_notes1;
    private javax.swing.JLabel lbl_rank;
    private javax.swing.JLabel lbl_res_x;
    private javax.swing.JLabel lbl_search;
    private javax.swing.JLabel lbl_time;
    private javax.swing.JLabel lbl_time1;
    private javax.swing.JLabel lbl_title;
    private javax.swing.JLabel lbl_visibilityModifier;
    private javax.swing.JProgressBar load_progress;
    private javax.swing.JPanel panel_info;
    private javax.swing.JPanel panel_list;
    private javax.swing.JPanel panel_modifiers;
    private javax.swing.JPanel panel_setting;
    private javax.swing.JPanel panel_song;
    private javax.swing.ButtonGroup rank_group;
    private javax.swing.JSlider slider_bgm_vol;
    private javax.swing.JSlider slider_key_vol;
    private javax.swing.JSlider slider_main_vol;
    private javax.swing.JTable table_chartlist;
    private javax.swing.JScrollPane table_scroll;
    private javax.swing.JScrollPane table_scroll2;
    private javax.swing.JTable table_songlist;
    private javax.swing.JTextField txtLocalMatchingServer;
    private javax.swing.JTextField txt_audioLatency;
    private javax.swing.JTextField txt_displayLag;
    private javax.swing.JTextField txt_filter;
    private javax.swing.JTextField txt_res_height;
    private javax.swing.JTextField txt_res_width;
    // End of variables declaration//GEN-END:variables
    private void initLogic() {

        try {
            List<DisplayMode> list = Arrays.asList(Display.getAvailableDisplayModes());

            Collections.sort(list, new Comparator<DisplayMode>() {
                @Override
                public int compare(DisplayMode dm1, DisplayMode dm2) {

                    if(dm1.getBitsPerPixel() == dm2.getBitsPerPixel())
                    {
                        if(dm1.getWidth() == dm2.getWidth())
                        {
                            if(dm1.getHeight() == dm2.getHeight())
                            {
                                if(dm1.getFrequency() > dm2.getFrequency())return -1;
                                else if(dm1.getFrequency() < dm2.getFrequency())return 1;
                                else return 0;
                            }
                            else if(dm1.getHeight() > dm2.getHeight())return -1;
                            else return 1;
                        }
                        else if(dm1.getWidth() > dm2.getWidth())return -1;
                        else return 1;
                    }
                    else if(dm1.getBitsPerPixel() > dm2.getBitsPerPixel()) return -1;
                    return 1;
                }
            });
            display_modes = list.toArray(new DisplayMode[list.size()]);

        } catch (LWJGLException ex) {
            Logger.global.log(Level.WARNING, "Could not get the display modes !! {0}", ex.getMessage());
            display_modes = new DisplayMode[0];
        }

        model_songlist = new ChartListTableModel();
        model_chartlist = new ChartTableModel();
    }

    private void loadDir(File dir)
    {
        Config.setCwd(dir);
        if(dir == null) return;
       
        ArrayList<ChartList> l = Config.getCache(dir);
       
        if(l == null) {
            updateSelection(dir);
        } else {
            model_songlist.setRawList(l);
        }
       
        ArrayList<File> dir_list = Config.getDirsList();
        if(!dir_list.contains(dir))
        {
            dir_list.add(dir);
            combo_dirs.addItem(new FileItem(dir));
            Config.setDirsList(dir_list);
        }  
        // update combo box dir list
        //System.out.println("set "+dir);
        combo_dirs.setSelectedItem(new FileItem(dir));
    }
   
    private void openFileChooser()
    {
        if(Config.getDirsList().isEmpty())
            Config.setCwd(null);
       
        JFileChooser jfc = new JFileChooser();
        jfc.setCurrentDirectory(Config.getCwd());
        jfc.setDialogTitle("Choose a directory");
        jfc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        jfc.setAcceptAllFileFilterUsed(false);
        if (jfc.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
            loadDir(jfc.getSelectedFile());
        }
//        else
//        {
//            JOptionPane.showMessageDialog(this, "You haven't selected any directory. Byebye...", "You failed to humanity :(", JOptionPane.ERROR_MESSAGE);
//            System.exit(1);
//        }
    }

    private void updateSelection(File f) {
        bt_choose_dir.setEnabled(false);
        btn_reload.setVisible(false);
        btn_delete.setVisible(false);
        combo_dirs.setEnabled(false);
        txt_filter.setEnabled(false);
        table_songlist.setEnabled(false);
        load_progress.setValue(0);
        load_progress.setVisible(true);
        ChartModelLoader task = new ChartModelLoader(model_songlist, f);
        task.addPropertyChangeListener(this);
        task.execute();
    }
   
    @Override
    public void propertyChange(PropertyChangeEvent evt) {
        if("progress".equals(evt.getPropertyName()))
        {
            int i = (Integer) evt.getNewValue();
            load_progress.setValue(i);
            if(i == 100)
            {
                bt_choose_dir.setEnabled(true);
                btn_delete.setVisible(true);
                combo_dirs.setEnabled(true);
                btn_reload.setVisible(true);
                load_progress.setVisible(false);
                txt_filter.setEnabled(true);
                table_songlist.setEnabled(true);
            }
        }
    }

    void updateFilter() {
        try {
            if(txt_filter.getText().length() == 0)table_sorter.setRowFilter(null);
            else table_sorter.setRowFilter(RowFilter.regexFilter("(?i)"+txt_filter.getText()));
        } catch (java.util.regex.PatternSyntaxException ignored) {
        }
    }

    @Override
    public void valueChanged(ListSelectionEvent e) {
        int i = table_songlist.getSelectedRow();
        if(i < 0 && last_model_idx >= 0){
            try {
                i = last_model_idx;
                int i_view = table_songlist.convertRowIndexToView(i);
                table_songlist.getSelectionModel().setSelectionInterval(0, i_view);
                table_scroll.getVerticalScrollBar().setValue(table_songlist.getCellRect(i_view, 0, false).y);
            } catch (IndexOutOfBoundsException up) {
                table_songlist.getSelectionModel().setSelectionInterval(0, -1);
                // not sure what to do with it here...
            }
        }else{
            i = table_songlist.convertRowIndexToModel(i);
        }
        if(model_songlist.getRow(i) == selected_chart)return;
        selected_chart = model_songlist.getRow(i);
        if(selected_chart.size() > rank)selected_header = selected_chart.get(rank);
        if(selected_chart != model_chartlist.getChartList()){
            model_chartlist.clear();
            model_chartlist.setChartList(selected_chart);
        }
        updateChartSelectionFromRank();
        updateInfo();
    }
   
    private void updateChartSelectionFromRank() {
        if (selected_chart == null) return;
        if (rank >= selected_chart.size())
            table_chartlist.getSelectionModel().setSelectionInterval(0, 0);
        else
            table_chartlist.getSelectionModel().setSelectionInterval(0, rank);
    }
   
    private void updateRankFromChartSelection() {
        if (selected_chart == null) return;
        int selectedIndex = table_chartlist.getSelectedRow();
        if (0 <= selectedIndex && selectedIndex < 3) setRank(selectedIndex);
    }

    private DecimalFormat bpm_format = new DecimalFormat(".##");
    private void updateInfo()
    {
        if(selected_header == null)return;
        if(!selected_header.getSource().exists()) {JOptionPane.showMessageDialog(this, "Doesn't Exist"); return;}
        lbl_artist.setText(resizeString(selected_header.getArtist(), 40));
        lbl_title.setText(resizeString(selected_header.getTitle(), 30));
        lbl_filename.setText(resizeString(selected_header.getSource().getName(), 30));
        lbl_genre.setText(resizeString(selected_header.getGenre(), 30));
        lbl_level.setText(selected_header.getLevel()+"");
        lbl_bpm.setText(bpm_format.format(selected_header.getBPM()));
        lbl_notes.setText(selected_header.getNoteCount()+"");
  lbl_keys.setText(selected_header.getKeys()+"");
        lbl_time.setText(time2Text(selected_header.getDuration()));

        BufferedImage i = selected_header.getCover();

        if(i != null)
        lbl_cover.setIcon(new ImageIcon(i.getScaledInstance(
                lbl_cover.getWidth(),
                lbl_cover.getHeight(),
                BufferedImage.SCALE_SMOOTH
                )));
        else
            lbl_cover.setIcon(null);
    }
   
    private String time2Text(int secs) {
        int h = secs / 60;
        int m = secs % 60;
        return m < 10 ? h+":0"+m : h+":"+m;
    }

    private String resizeString(String string, int size)
    {
        if(string == null)return "";
        if(string.length() > size)
            string = string.substring(0, size)+"...";
        return string;
    }

}
TOP

Related Classes of org.open2jam.gui.parts.MusicSelection

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.