package org.lysty.ui; import java.awt.event.ActionEvent; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; import java.util.ArrayList; import java.util.Collections; import java.util.List; import javax.swing.AbstractAction; import javax.swing.JButton; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.DefaultTableModel; import net.miginfocom.swing.MigLayout; import org.lysty.core.ExtractorManager; import org.lysty.dao.Song; import org.lysty.db.DBHandler; import org.lysty.util.Utils; public class SongMetaDataEditor extends LFrame { private Song song; private JTable table; private JButton btnCommit; private JButton btnCancel; private MetaDataModel model; public SongMetaDataEditor(String title) { super("View / Edit Meta Data"); } public SongMetaDataEditor() { this(""); } public void setSong(Song song) { this.song = song; } public void init(Song song) { setSong(song); createUI(); LayoutUI(); this.addWindowListener(new WindowListener() { @Override public void windowOpened(WindowEvent arg0) { // TODO Auto-generated method stub } @Override public void windowIconified(WindowEvent arg0) { // TODO Auto-generated method stub } @Override public void windowDeiconified(WindowEvent arg0) { // TODO Auto-generated method stub } @Override public void windowDeactivated(WindowEvent arg0) { // TODO Auto-generated method stub } @Override public void windowClosing(WindowEvent arg0) { List<Modification> changes = model.getChanges(); if (!changes.isEmpty()) { String[] options = new String[] { "Yes", "No" }; int choice = JOptionPane .showOptionDialog( SongMetaDataEditor.this, "There are unsaved modifications. Would you like to save them?", "Unsaved Modifications", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, JOptionPane.YES_OPTION); if (choice == JOptionPane.YES_OPTION) { DBHandler.getInstance().applyModifications( model.getChanges(), null); } } } @Override public void windowClosed(WindowEvent arg0) { // TODO Auto-generated method stub } @Override public void windowActivated(WindowEvent arg0) { // TODO Auto-generated method stub } }); } private void LayoutUI() { JPanel pnl = new JPanel(new MigLayout("", "", "")); JPanel controlPanel = new JPanel(new MigLayout("", "push[][]", "[]")); controlPanel.add(btnCommit, "flowx,push,align right"); controlPanel.add(btnCancel, "flowx"); JScrollPane scroller = new JScrollPane(table); pnl.add(scroller, "span"); pnl.add(controlPanel); setContentPane(pnl); pack(); setVisible(true); } private void createUI() { table = new JTable(); model = new MetaDataModel(song); table.setModel(model); btnCommit = new JButton(new AbstractAction("Commit Changes") { @Override public void actionPerformed(ActionEvent arg0) { DBHandler.getInstance().applyModifications(model.getChanges(), null); SongMetaDataEditor.this.dispose(); } }); btnCancel = new JButton(new AbstractAction("Cancel") { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub SongMetaDataEditor.this.dispose(); } }); } class MetaDataModel extends DefaultTableModel { private Song song; private List<String> attribList; private List<Modification> changes; public List<Modification> getChanges() { return changes; } public MetaDataModel(Song song) { Song song2 = DBHandler.getInstance().getSong(song.getFile()); changes = new ArrayList<Modification>(); if (song2 == null) { changes.add(new Modification(song, null, null, null)); song2 = song; } this.song = song2; attribList = ExtractorManager.getSupportedFeatures(); Collections.sort(attribList); fireTableDataChanged(); } @Override public Class<?> getColumnClass(int col) { return String.class; } @Override public int getColumnCount() { // TODO Auto-generated method stub return 2; } @Override public String getColumnName(int col) { if (col == 0) return "Feature"; if (col == 1) return "Value"; return ""; } @Override public int getRowCount() { if (attribList != null) return attribList.size(); return 0; } @Override public Object getValueAt(int row, int col) { if (col == 0) { return attribList.get(row); } else if (col == 1) { return song.getAttribute(attribList.get(row)); } return ""; } @Override public boolean isCellEditable(int row, int col) { // TODO Auto-generated method stub return col == 1; } @Override public void setValueAt(Object value, int row, int col) { // TODO Auto-generated method stub if (col == 1) { boolean changed = true; String newVal = value.toString(); String oldVal = song.getAttribute(attribList.get(row)); if (Utils.stringNotNullOrEmpty(newVal) && Utils.stringNotNullOrEmpty(oldVal)) { changed = !newVal.trim().equals(oldVal.trim()); } if (changed) { Modification change = new Modification(song, attribList.get(row), newVal, oldVal); song.setAttribute(attribList.get(row), value.toString()); changes.add(change); } } } } }