package com.tulskiy.musique.plugins.discogs.dialog; import java.awt.BorderLayout; import java.awt.CardLayout; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.io.File; import java.net.URI; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import javax.swing.*; import javax.swing.GroupLayout.Alignment; import javax.swing.LayoutStyle.ComponentPlacement; import javax.swing.border.LineBorder; import javax.swing.border.TitledBorder; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import org.discogs.model.Artist; import org.discogs.model.ArtistRelease; import org.discogs.model.LabelRelease; import org.discogs.model.Release; import org.jaudiotagger.tag.FieldKey; import com.tulskiy.musique.gui.dialogs.ProgressDialog; import com.tulskiy.musique.gui.dialogs.Task; import com.tulskiy.musique.playlist.Playlist; import com.tulskiy.musique.playlist.Track; import com.tulskiy.musique.playlist.TrackData; import com.tulskiy.musique.plugins.discogs.DiscogsCaller; import com.tulskiy.musique.plugins.discogs.DiscogsListener; import com.tulskiy.musique.plugins.discogs.model.DiscogsArtistListModel; import com.tulskiy.musique.plugins.discogs.model.DiscogsDefaultListModel; import com.tulskiy.musique.plugins.discogs.model.DiscogsReleaseListModel; import com.tulskiy.musique.plugins.discogs.model.DiscogsTrackListModel; import com.tulskiy.musique.plugins.discogs.model.MusiqueTrackListModel; import com.tulskiy.musique.plugins.discogs.model.ReleaseTracklistingModel; import com.tulskiy.musique.plugins.discogs.util.DiscogsModelUtil; import com.tulskiy.musique.system.TrackIO; import com.tulskiy.musique.util.Util; public class DiscogsDialog extends JDialog implements DiscogsListener { private static final String CARD_RELEASE = "name_58493966786713"; private static final String CARD_ARTIST = "name_58558508937237"; private Thread thread; private ArrayList<Track> tracks; private Playlist playlist; private Release release; private JTextField txtArtist; private JTextField txtFilter; private JTextField txtReleaseartist; private JTextField txtReleasealbum; private JTextField txtReleaselabel; private JTextField txtReleasecatalogno; private JTextField txtReleaseformat; private JTextField txtReleasecountry; private JTextField txtReleasegenre; private JTextField txtReleasestatus; private JTextField txtReleaseyear; private DiscogsDialog me; private JProgressBar progressBarArtist = new JProgressBar(); private JProgressBar progressBarRelease = new JProgressBar(); private JSplitPane splitPaneArtist = new JSplitPane(); private JSplitPane splitPaneRelease = new JSplitPane(); private JPanel panelReleaseInfo = new JPanel(); private JList lstArtists = new JList(); private JList lstReleases = new JList(); private JList lstDiscogsTracks = new JList(); private JList lstMusiqueTracks = new JList(); private JButton btnQuery = new JButton("Query"); private JButton btnSelect = new JButton("Select"); private JButton btnWrite = new JButton("Write"); private JButton btnDiscogstrackup = new JButton("Up"); private JButton btnDiscogstrackremove = new JButton("Remove"); private JButton btnDiscogstrackdown = new JButton("Down"); private JButton btnMusiquetrackremove = new JButton("Remove"); private JCheckBox chckbxUseanv = new JCheckBox("Use ANV"); /** * Create the dialog. */ public DiscogsDialog(final ArrayList<Track> tracks, final Playlist playlist) { me = this; this.tracks = tracks; this.playlist = playlist; setTitle("Discogs"); setBounds(100, 100, 700, 550); getContentPane().setLayout(new CardLayout(0, 0)); JPanel panelArtist = new JPanel(); getContentPane().add(panelArtist, CARD_ARTIST); panelArtist.setLayout(new BorderLayout(0, 0)); JPanel panelArtistControls = new JPanel(); panelArtistControls.setPreferredSize(new Dimension(10, 50)); panelArtist.add(panelArtistControls, BorderLayout.SOUTH); panelArtistControls.setLayout(new BoxLayout(panelArtistControls, BoxLayout.X_AXIS)); Component horizontalStrut_1 = Box.createHorizontalStrut(20); panelArtistControls.add(horizontalStrut_1); Component horizontalGlue_1 = Box.createHorizontalGlue(); panelArtistControls.add(horizontalGlue_1); progressBarArtist.setToolTipText("Indicates that Discogs is querying at the moment."); progressBarArtist.setVisible(false); progressBarArtist.setString("Querying Discogs..."); progressBarArtist.setIndeterminate(true); panelArtistControls.add(progressBarArtist); Component horizontalGlue = Box.createHorizontalGlue(); panelArtistControls.add(horizontalGlue); btnSelect.setToolTipText("Go to release details page."); btnSelect.setPreferredSize(new Dimension(81, 0)); btnSelect.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { ListSelectionModel selectionModel = lstReleases.getSelectionModel(); DiscogsReleaseListModel model = (DiscogsReleaseListModel) lstReleases.getModel(); thread = new Thread(new DiscogsCaller( DiscogsCaller.CallMode.RELEASE, model.getEx(selectionModel.getMinSelectionIndex()).getId(), me), ""); thread.start(); CardLayout cl = (CardLayout) getContentPane().getLayout(); cl.show(getContentPane(), CARD_RELEASE); } }); btnSelect.setEnabled(false); panelArtistControls.add(btnSelect); Component horizontalStrut = Box.createHorizontalStrut(20); horizontalStrut.setPreferredSize(new Dimension(10, 0)); horizontalStrut.setMinimumSize(new Dimension(10, 0)); panelArtistControls.add(horizontalStrut); JButton btnCancelArtist = new JButton("Cancel"); btnCancelArtist.setToolTipText("Abort querying and/or close Discogs dialog."); btnCancelArtist.setPreferredSize(new Dimension(81, 0)); btnCancelArtist.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { close(); } }); panelArtistControls.add(btnCancelArtist); Component horizontalStrut_3 = Box.createHorizontalStrut(20); panelArtistControls.add(horizontalStrut_3); splitPaneArtist.setResizeWeight(0.3); panelArtist.add(splitPaneArtist, BorderLayout.CENTER); JScrollPane scrollPane = new JScrollPane(); splitPaneArtist.setLeftComponent(scrollPane); JPanel panel_1 = new JPanel(); panel_1.setPreferredSize(new Dimension(10, 40)); scrollPane.setColumnHeaderView(panel_1); panel_1.setLayout(new BoxLayout(panel_1, BoxLayout.X_AXIS)); Component horizontalStrut_5 = Box.createHorizontalStrut(20); panel_1.add(horizontalStrut_5); JLabel lblArtist = new JLabel("Artist"); panel_1.add(lblArtist); Component horizontalStrut_6 = Box.createHorizontalStrut(20); horizontalStrut_6.setPreferredSize(new Dimension(10, 0)); panel_1.add(horizontalStrut_6); txtArtist = new JTextField(); txtArtist.setToolTipText("Artist query string."); txtArtist.addKeyListener(new KeyAdapter() { @Override public void keyPressed(KeyEvent e) { if (KeyEvent.VK_ENTER == e.getKeyCode()) { btnQuery.doClick(); } } }); txtArtist.setMaximumSize(new Dimension(2147483647, 24)); txtArtist.setText("Artist"); panel_1.add(txtArtist); txtArtist.setColumns(10); txtArtist.setText(tracks.get(0).getTrackData().getArtist()); txtArtist.setCaretPosition(0); JScrollPane scrollPane_1 = new JScrollPane(); splitPaneArtist.setRightComponent(scrollPane_1); JPanel panel_2 = new JPanel(); panel_2.setPreferredSize(new Dimension(10, 40)); scrollPane_1.setColumnHeaderView(panel_2); lstReleases.setToolTipText("List of releases belong to selected artist. One is to be selected to continue."); lstReleases.setModel(new DiscogsReleaseListModel()); lstReleases.addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent arg0) { if (!arg0.getValueIsAdjusting()) { ListSelectionModel selectionModel = lstReleases.getSelectionModel(); btnSelect.setEnabled(!selectionModel.isSelectionEmpty()); } } }); lstReleases.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { if (e.getClickCount() > 1) { ListSelectionModel selectionModel = lstReleases.getSelectionModel(); if (!selectionModel.isSelectionEmpty()) { DiscogsReleaseListModel releaseModel = (DiscogsReleaseListModel) lstReleases.getModel(); ArtistRelease release = releaseModel.getEx(selectionModel.getMinSelectionIndex()); if(java.awt.Desktop.isDesktopSupported()) { java.awt.Desktop desktop = java.awt.Desktop.getDesktop(); if(desktop.isSupported(java.awt.Desktop.Action.BROWSE)) { try { desktop.browse(new URI("http://www.discogs.com/release/" + release.getId())); } catch (Exception exc) { // ignore any exception since it's absolutely optional feature } } } } } } }); scrollPane_1.setViewportView(lstReleases); lstArtists.setToolTipText("List of artists fit query string."); lstArtists.setModel(new DiscogsArtistListModel()); lstArtists.addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent arg0) { DiscogsArtistListModel artistModel = (DiscogsArtistListModel) lstArtists.getModel(); ListSelectionModel selectionModel = lstArtists.getSelectionModel(); if (!selectionModel.isSelectionEmpty() && !arg0.getValueIsAdjusting()) { Artist artist = artistModel.getEx(selectionModel.getMinSelectionIndex()); if (artist != null) { DiscogsReleaseListModel releaseModel = (DiscogsReleaseListModel) lstReleases.getModel(); releaseModel.clear(); for (ArtistRelease release : artist.getReleases()) { releaseModel.addElement(release); } lstReleases.revalidate(); lstReleases.clearSelection(); lstReleases.repaint(); } } } }); scrollPane.setViewportView(lstArtists); btnQuery.setToolTipText("Query Discogs database."); btnQuery.setPreferredSize(new Dimension(81, 0)); btnQuery.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { if (!Util.isEmpty(txtArtist.getText())) { thread = new Thread(new DiscogsCaller( DiscogsCaller.CallMode.SEARCH_ARTISTS, txtArtist.getText(), me), ""); thread.start(); } } }); Component horizontalStrut_7 = Box.createHorizontalStrut(20); horizontalStrut_7.setPreferredSize(new Dimension(10, 0)); panel_1.add(horizontalStrut_7); panel_1.add(btnQuery); Component horizontalStrut_8 = Box.createHorizontalStrut(20); panel_1.add(horizontalStrut_8); panel_2.setLayout(new BoxLayout(panel_2, BoxLayout.X_AXIS)); Component horizontalStrut_9 = Box.createHorizontalStrut(20); panel_2.add(horizontalStrut_9); JLabel lblFilter = new JLabel("Filter"); panel_2.add(lblFilter); txtFilter = new JTextField(); txtFilter.setToolTipText("Release filter string."); txtFilter.setMaximumSize(new Dimension(2147483647, 24)); txtFilter.getDocument().addDocumentListener(new DocumentListener() { public void changedUpdate(DocumentEvent e) { filterReleases(lstReleases); } public void removeUpdate(DocumentEvent e) { filterReleases(lstReleases); } public void insertUpdate(DocumentEvent e) { filterReleases(lstReleases); } }); Component horizontalStrut_10 = Box.createHorizontalStrut(20); horizontalStrut_10.setPreferredSize(new Dimension(10, 0)); panel_2.add(horizontalStrut_10); txtFilter.setText("Filter"); panel_2.add(txtFilter); txtFilter.setColumns(10); txtFilter.setText(tracks.get(0).getTrackData().getAlbum()); txtFilter.setCaretPosition(0); DiscogsReleaseListModel model = (DiscogsReleaseListModel) lstReleases.getModel(); model.setFilter(txtFilter.getText()); JButton btnClear = new JButton("Clear"); btnClear.setToolTipText("Clear release filter field."); btnClear.setPreferredSize(new Dimension(81, 0)); btnClear.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { txtFilter.setText(""); } }); Component horizontalStrut_11 = Box.createHorizontalStrut(20); horizontalStrut_11.setPreferredSize(new Dimension(10, 0)); panel_2.add(horizontalStrut_11); panel_2.add(btnClear); Component horizontalStrut_12 = Box.createHorizontalStrut(20); panel_2.add(horizontalStrut_12); JPanel panelRelease = new JPanel(); getContentPane().add(panelRelease, CARD_RELEASE); panelRelease.setLayout(new BorderLayout(0, 0)); JPanel panelReleaseControls = new JPanel(); panelReleaseControls.setPreferredSize(new Dimension(10, 50)); panelRelease.add(panelReleaseControls, BorderLayout.SOUTH); panelReleaseControls.setLayout(new BoxLayout(panelReleaseControls, BoxLayout.X_AXIS)); Component horizontalStrut_2 = Box.createHorizontalStrut(20); panelReleaseControls.add(horizontalStrut_2); JButton btnBack = new JButton("Back"); btnBack.setToolTipText("Return back to artist/release page."); btnBack.setPreferredSize(new Dimension(81, 0)); btnBack.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { CardLayout cardLayout = (CardLayout) getContentPane().getLayout(); cardLayout.show(getContentPane(), CARD_ARTIST); } }); panelReleaseControls.add(btnBack); Component horizontalGlue_2 = Box.createHorizontalGlue(); panelReleaseControls.add(horizontalGlue_2); progressBarRelease.setToolTipText("Indicates that Discogs is querying at the moment."); progressBarRelease.setVisible(false); progressBarRelease.setString("Querying Discogs..."); progressBarRelease.setIndeterminate(true); panelReleaseControls.add(progressBarRelease); Component horizontalGlue2 = Box.createHorizontalGlue(); panelReleaseControls.add(horizontalGlue2); btnWrite.setToolTipText("Write tags to files."); btnWrite.setPreferredSize(new Dimension(81, 0)); btnWrite.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { updateTracks(); writeTracks(); } }); btnWrite.setEnabled(false); panelReleaseControls.add(btnWrite); Component horizontalStrut2 = Box.createHorizontalStrut(20); horizontalStrut2.setPreferredSize(new Dimension(10, 0)); horizontalStrut2.setMinimumSize(new Dimension(10, 0)); panelReleaseControls.add(horizontalStrut2); JButton btnCancelRelease = new JButton("Cancel"); btnCancelRelease.setToolTipText("Abort querying and/or close Discogs dialog."); btnCancelRelease.setPreferredSize(new Dimension(81, 0)); btnCancelRelease.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { close(); } }); panelReleaseControls.add(btnCancelRelease); Component horizontalStrut_4 = Box.createHorizontalStrut(20); panelReleaseControls.add(horizontalStrut_4); panelReleaseInfo.setToolTipText("General release information. Same for all tracks."); panelReleaseInfo.setBorder(new TitledBorder(new LineBorder(new Color(184, 207, 229)), "General Info", TitledBorder.LEADING, TitledBorder.TOP, null, new Color(51, 51, 51))); panelRelease.add(panelReleaseInfo, BorderLayout.NORTH); JLabel lblReleaseartist = new JLabel("Artist"); JLabel lblReleasealbum = new JLabel("Album"); JLabel lblReleaselabel = new JLabel("Label"); JLabel lblReleasecatalogno = new JLabel("Catalog #"); txtReleaseartist = new JTextField(); txtReleaseartist.setToolTipText("Release artist(s)."); txtReleaseartist.setEnabled(false); txtReleaseartist.setEditable(false); txtReleaseartist.setColumns(10); txtReleasealbum = new JTextField(); txtReleasealbum.setToolTipText("Release title."); txtReleasealbum.setEnabled(false); txtReleasealbum.setEditable(false); txtReleasealbum.setColumns(10); txtReleaselabel = new JTextField(); txtReleaselabel.setToolTipText("Release record label(s)."); txtReleaselabel.setEnabled(false); txtReleaselabel.setEditable(false); txtReleaselabel.setColumns(10); txtReleasecatalogno = new JTextField(); txtReleasecatalogno.setToolTipText("Release record label catalog number(s)."); txtReleasecatalogno.setEnabled(false); txtReleasecatalogno.setEditable(false); txtReleasecatalogno.setColumns(10); JLabel lblReleaseyear = new JLabel("Year"); txtReleaseformat = new JTextField(); txtReleaseformat.setToolTipText("Release format(s)."); txtReleaseformat.setEnabled(false); txtReleaseformat.setEditable(false); txtReleaseformat.setColumns(10); txtReleasecountry = new JTextField(); txtReleasecountry.setToolTipText("Release country."); txtReleasecountry.setEnabled(false); txtReleasecountry.setEditable(false); txtReleasecountry.setColumns(10); txtReleasegenre = new JTextField(); txtReleasegenre.setToolTipText("Release genre(s)."); txtReleasegenre.setEnabled(false); txtReleasegenre.setEditable(false); txtReleasegenre.setColumns(10); txtReleasestatus = new JTextField(); txtReleasestatus.setToolTipText("Release status."); txtReleasestatus.setEnabled(false); txtReleasestatus.setEditable(false); txtReleasestatus.setColumns(10); txtReleaseyear = new JTextField(); txtReleaseyear.setToolTipText("Release date."); txtReleaseyear.setEnabled(false); txtReleaseyear.setEditable(false); txtReleaseyear.setColumns(10); JLabel lblReleasestatus = new JLabel("Status"); lblReleasestatus.setHorizontalAlignment(SwingConstants.RIGHT); JLabel lblReleaseformat = new JLabel("Format"); lblReleaseformat.setHorizontalAlignment(SwingConstants.RIGHT); JLabel lblReleasecountry = new JLabel("Country"); lblReleasecountry.setHorizontalAlignment(SwingConstants.RIGHT); JLabel lblReleasegenre = new JLabel("Genre"); lblReleasegenre.setHorizontalAlignment(SwingConstants.RIGHT); GroupLayout gl_panelReleaseInfo = new GroupLayout(panelReleaseInfo); gl_panelReleaseInfo.setHorizontalGroup( gl_panelReleaseInfo.createParallelGroup(Alignment.LEADING) .addGroup(gl_panelReleaseInfo.createSequentialGroup() .addGap(20) .addGroup(gl_panelReleaseInfo.createParallelGroup(Alignment.TRAILING) .addComponent(lblReleaseyear) .addComponent(lblReleaseartist) .addComponent(lblReleaselabel) .addComponent(lblReleasealbum) .addComponent(lblReleasecatalogno)) .addPreferredGap(ComponentPlacement.RELATED) .addGroup(gl_panelReleaseInfo.createParallelGroup(Alignment.LEADING) .addComponent(txtReleaseyear, GroupLayout.DEFAULT_SIZE, 250, Short.MAX_VALUE) .addComponent(txtReleasealbum, GroupLayout.DEFAULT_SIZE, 250, Short.MAX_VALUE) .addComponent(txtReleaselabel, GroupLayout.DEFAULT_SIZE, 250, Short.MAX_VALUE) .addComponent(txtReleaseartist, GroupLayout.DEFAULT_SIZE, 250, Short.MAX_VALUE) .addComponent(txtReleasecatalogno, GroupLayout.DEFAULT_SIZE, 250, Short.MAX_VALUE)) .addPreferredGap(ComponentPlacement.RELATED) .addGroup(gl_panelReleaseInfo.createParallelGroup(Alignment.TRAILING) .addComponent(lblReleasestatus) .addComponent(lblReleaseformat) .addComponent(lblReleasegenre) .addComponent(lblReleasecountry, GroupLayout.PREFERRED_SIZE, 71, GroupLayout.PREFERRED_SIZE)) .addPreferredGap(ComponentPlacement.RELATED) .addGroup(gl_panelReleaseInfo.createParallelGroup(Alignment.LEADING) .addComponent(txtReleaseformat, GroupLayout.DEFAULT_SIZE, 226, Short.MAX_VALUE) .addComponent(txtReleasecountry, GroupLayout.DEFAULT_SIZE, 226, Short.MAX_VALUE) .addComponent(txtReleasegenre, GroupLayout.DEFAULT_SIZE, 226, Short.MAX_VALUE) .addComponent(txtReleasestatus, GroupLayout.DEFAULT_SIZE, 226, Short.MAX_VALUE) .addComponent(chckbxUseanv, GroupLayout.DEFAULT_SIZE, 226, Short.MAX_VALUE)) .addContainerGap()) ); gl_panelReleaseInfo.setVerticalGroup( gl_panelReleaseInfo.createParallelGroup(Alignment.LEADING) .addGroup(gl_panelReleaseInfo.createSequentialGroup() .addContainerGap() .addGroup(gl_panelReleaseInfo.createParallelGroup(Alignment.BASELINE) .addComponent(lblReleaseartist) .addComponent(txtReleaseartist, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) .addComponent(txtReleasestatus, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) .addComponent(lblReleasestatus)) .addPreferredGap(ComponentPlacement.RELATED) .addGroup(gl_panelReleaseInfo.createParallelGroup(Alignment.BASELINE) .addComponent(lblReleasealbum) .addComponent(txtReleasealbum, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) .addComponent(txtReleaseformat, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) .addComponent(lblReleaseformat)) .addPreferredGap(ComponentPlacement.RELATED) .addGroup(gl_panelReleaseInfo.createParallelGroup(Alignment.BASELINE) .addComponent(lblReleaselabel) .addComponent(txtReleaselabel, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) .addComponent(txtReleasecountry, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) .addComponent(lblReleasecountry)) .addPreferredGap(ComponentPlacement.RELATED) .addGroup(gl_panelReleaseInfo.createParallelGroup(Alignment.BASELINE) .addComponent(lblReleasecatalogno) .addComponent(txtReleasegenre, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) .addComponent(txtReleasecatalogno, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) .addComponent(lblReleasegenre)) .addPreferredGap(ComponentPlacement.RELATED) .addGroup(gl_panelReleaseInfo.createParallelGroup(Alignment.BASELINE) .addComponent(lblReleaseyear) .addComponent(txtReleaseyear, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) .addComponent(chckbxUseanv)) .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); panelReleaseInfo.setLayout(gl_panelReleaseInfo); JPanel panelTracklisting = new JPanel(); panelTracklisting.setBorder(new TitledBorder(new LineBorder(new Color(184, 207, 229)), "Tracklisting", TitledBorder.LEADING, TitledBorder.TOP, null, new Color(51, 51, 51))); panelTracklisting.setLayout(new BorderLayout(0, 0)); panelRelease.add(panelTracklisting, BorderLayout.CENTER); splitPaneRelease.setResizeWeight(0.5); panelTracklisting.add(splitPaneRelease); JScrollPane scrollPane_2 = new JScrollPane(); splitPaneRelease.setLeftComponent(scrollPane_2); JPanel panel = new JPanel(); panel.setPreferredSize(new Dimension(10, 40)); scrollPane_2.setColumnHeaderView(panel); btnDiscogstrackup.setToolTipText("Move selected items up."); btnDiscogstrackup.setEnabled(false); btnDiscogstrackup.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { moveSelectedTracklistingItems(lstDiscogsTracks, -1); } }); panel.add(btnDiscogstrackup); btnDiscogstrackremove.setToolTipText("Remove selected items."); btnDiscogstrackremove.setEnabled(false); btnDiscogstrackremove.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { removeSelectedTracklistingItems(lstDiscogsTracks); } }); panel.add(btnDiscogstrackremove); btnDiscogstrackdown.setToolTipText("Move selected items down."); btnDiscogstrackdown.setEnabled(false); btnDiscogstrackdown.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { moveSelectedTracklistingItems(lstDiscogsTracks, 1); } }); panel.add(btnDiscogstrackdown); lstDiscogsTracks.setToolTipText("List of tracks read from Discogs database."); lstDiscogsTracks.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION); lstDiscogsTracks.setModel(new DiscogsTrackListModel()); lstDiscogsTracks.addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent arg0) { if (!arg0.getValueIsAdjusting()) { ListSelectionModel lsm = lstDiscogsTracks.getSelectionModel(); btnDiscogstrackup.setEnabled(!lsm.isSelectionEmpty() && lsm.getMinSelectionIndex() > 0); btnDiscogstrackremove.setEnabled(!lsm.isSelectionEmpty()); btnDiscogstrackdown.setEnabled(!lsm.isSelectionEmpty() && lsm.getMaxSelectionIndex() < lstDiscogsTracks.getModel().getSize() - 1); } } }); scrollPane_2.setViewportView(lstDiscogsTracks); JScrollPane scrollPane_3 = new JScrollPane(); splitPaneRelease.setRightComponent(scrollPane_3); JPanel panel_3 = new JPanel(); panel_3.setPreferredSize(new Dimension(10, 40)); scrollPane_3.setColumnHeaderView(panel_3); btnMusiquetrackremove.setToolTipText("Remove selected items."); btnMusiquetrackremove.setEnabled(false); btnMusiquetrackremove.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { removeSelectedTracklistingItems(lstMusiqueTracks); } }); panel_3.add(btnMusiquetrackremove); lstMusiqueTracks.setToolTipText("List of playlist tracks to be tagged."); lstMusiqueTracks.addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent arg0) { if (!arg0.getValueIsAdjusting()) { ListSelectionModel lsm = lstMusiqueTracks.getSelectionModel(); btnMusiquetrackremove.setEnabled(!lsm.isSelectionEmpty()); } } }); lstMusiqueTracks.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION); lstMusiqueTracks.setModel(new MusiqueTrackListModel()); scrollPane_3.setViewportView(lstMusiqueTracks); chckbxUseanv.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent arg0) { fillReleaseInfo(release); updateDiscogsTracklistingWithUseAnv(); lstDiscogsTracks.revalidate(); lstDiscogsTracks.repaint(); } }); chckbxUseanv.setToolTipText("Use artist variation name."); chckbxUseanv.setSelected(true); } private void filterReleases(final JList list) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { DiscogsReleaseListModel model = (DiscogsReleaseListModel) list.getModel(); model.setFilter(txtFilter.getText()); list.clearSelection(); } }); } @Override public void onRetrieveStart(final DiscogsCaller.CallMode callMode) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { switch (callMode) { case ARTIST: case SEARCH_ARTISTS: clearReleaseInfo(); btnSelect.setEnabled(false); progressBarArtist.setVisible(true); setComponentChildrenState(splitPaneArtist, false); break; case RELEASE: btnWrite.setEnabled(false); progressBarRelease.setVisible(true); setComponentChildrenState(panelReleaseInfo, false); setComponentChildrenState(splitPaneRelease, false); break; default: break; } } }); } @Override public void onRetrieveFinish(final DiscogsCaller.CallMode callMode, final Object data) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { switch (callMode) { case ARTIST: case SEARCH_ARTISTS: if (lstArtists != null && data != null) { DefaultListModel listModel = (DefaultListModel) lstArtists.getModel(); listModel.clear(); if (callMode == DiscogsCaller.CallMode.ARTIST) { Artist artist = (Artist) data; listModel.addElement(artist); } else if (callMode == DiscogsCaller.CallMode.SEARCH_ARTISTS) { List<Artist> artists = (List<Artist>) data; for (Artist artist : artists) { listModel.addElement(artist); } } lstArtists.setSelectedIndex(0); } progressBarArtist.setVisible(false); setComponentChildrenState(splitPaneArtist, true); break; case RELEASE: if (data != null) { release = (Release) data; if (lstDiscogsTracks != null) { fillReleaseInfo(release); updateDiscogsTracklistingWithUseAnv(); fillTracklisting(lstDiscogsTracks, release.getTracks()); fillTracklisting(lstMusiqueTracks, tracks); btnWrite.setEnabled(true); } } progressBarRelease.setVisible(false); setComponentChildrenState(panelReleaseInfo, true); setComponentChildrenState(splitPaneRelease, true); // to set proper up/remove/down buttons state // i know it's bad bad bad, fix if you can lstDiscogsTracks.getSelectionModel().setSelectionInterval(0, 0); lstDiscogsTracks.getSelectionModel().clearSelection(); lstMusiqueTracks.getSelectionModel().setSelectionInterval(0, 0); lstMusiqueTracks.getSelectionModel().clearSelection(); break; default: break; } } }); } private void setComponentChildrenState(JComponent component, boolean state) { component.setEnabled(state); for (Component child : component.getComponents()) { child.setEnabled(state); if (child instanceof JComponent) { setComponentChildrenState((JComponent) child, state); } } } private void fillReleaseInfo(Release release) { if (release != null) { txtReleaseartist.setText(DiscogsModelUtil.getReleaseArtistDescription( release.getArtists(), chckbxUseanv.isSelected(), true)); txtReleasealbum.setText(release.getTitle()); txtReleaselabel.setText(DiscogsModelUtil.getReleaseLabelDescription(release)); txtReleasecatalogno.setText(DiscogsModelUtil.getReleaseCatalogNoDescription(release)); txtReleaseyear.setText(DiscogsModelUtil.getReleaseDateDescription(release)); txtReleasestatus.setText(release.getStatus()); txtReleaseformat.setText(DiscogsModelUtil.getReleaseFormatDescription(release)); txtReleasecountry.setText(release.getCountry()); txtReleasegenre.setText(Util.formatFieldValues(release.getStyles(), ", ")); } } private void fillTracklisting(final JList list, final List<?> tracks) { DefaultListModel listModel = (DefaultListModel) list.getModel(); listModel.clear(); for (Object track : tracks) { listModel.addElement(track); } } private void moveSelectedTracklistingItems(final JList list, final int direction) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { DiscogsDefaultListModel listModel = (DiscogsDefaultListModel) list.getModel(); ListSelectionModel lsm = list.getSelectionModel(); int indexStart = list.getSelectedIndices()[0]; int indexEnd = list.getSelectedIndices()[list.getSelectedIndices().length - 1]; int indexObj; Object obj; if (direction < 0) { indexObj = indexStart - 1; obj = listModel.getEx(indexObj); listModel.remove(indexObj); if (listModel.size() == indexEnd) { listModel.addElement(obj); } else { listModel.add(indexEnd, obj); } lsm.setSelectionInterval(indexStart - 1, indexEnd - 1); } else if (direction > 0) { indexObj = indexEnd + 1; obj = listModel.getEx(indexObj); listModel.remove(indexObj); listModel.add(indexStart, obj); lsm.setSelectionInterval(indexStart + 1, indexEnd + 1); } } }); } private void removeSelectedTracklistingItems(final JList list) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { DefaultListModel listModel = (DefaultListModel) list.getModel(); listModel.removeRange(list.getSelectedIndices()[0], list.getSelectedIndices()[list.getSelectedIndices().length - 1]); } }); } private void clearReleaseInfo() { txtReleaseartist.setText(DiscogsModelUtil.DEFAULT_RELEASE_INFO_TEXT); txtReleasealbum.setText(DiscogsModelUtil.DEFAULT_RELEASE_INFO_TEXT); txtReleaselabel.setText(DiscogsModelUtil.DEFAULT_RELEASE_INFO_TEXT); txtReleasecatalogno.setText(DiscogsModelUtil.DEFAULT_RELEASE_INFO_TEXT); txtReleaseformat.setText(DiscogsModelUtil.DEFAULT_RELEASE_INFO_TEXT); txtReleasecountry.setText(DiscogsModelUtil.DEFAULT_RELEASE_INFO_TEXT); txtReleasegenre.setText(DiscogsModelUtil.DEFAULT_RELEASE_INFO_TEXT); txtReleasestatus.setText(DiscogsModelUtil.DEFAULT_RELEASE_INFO_TEXT); txtReleaseyear.setText(DiscogsModelUtil.DEFAULT_RELEASE_INFO_TEXT); } private void updateDiscogsTracklistingWithUseAnv() { ((DiscogsTrackListModel) lstDiscogsTracks.getModel()).setUseAnv(chckbxUseanv.isSelected()); } private void close() { if (thread != null && thread.isAlive()) { thread.interrupt(); } setVisible(false); dispose(); } private void updateTracks() { MusiqueTrackListModel musiqueModel = (MusiqueTrackListModel) lstMusiqueTracks.getModel(); DiscogsTrackListModel discogsModel = (DiscogsTrackListModel) lstDiscogsTracks.getModel(); ReleaseTracklistingModel rtm = DiscogsModelUtil.getReleaseTracklistingModel(release); for (int i = 0; i < musiqueModel.getSize() && i < discogsModel.getSize(); i++) { Track musiqueTrack = musiqueModel.getEx(i); org.discogs.model.Track discogsTrack = discogsModel.getEx(i); TrackData trackData = musiqueTrack.getTrackData(); String albumArtist = DiscogsModelUtil.getReleaseArtistDescription( release.getArtists(), chckbxUseanv.isSelected(), false); String trackArtist = DiscogsModelUtil.getReleaseArtistDescription( discogsTrack.getArtists(), chckbxUseanv.isSelected(), false); trackData.setTagFieldValues(FieldKey.ALBUM_ARTIST, albumArtist); trackData.setTagFieldValues(FieldKey.ALBUM, release.getTitle()); trackData.setTagFieldValues(FieldKey.RECORD_LABEL, ""); trackData.setTagFieldValues(FieldKey.CATALOG_NO, ""); for (LabelRelease label : release.getLabelReleases()) { trackData.addRecordLabel(label.getLabelName()); trackData.addCatalogNo(label.getCatalogNumber()); } trackData.setTagFieldValues(FieldKey.YEAR, DiscogsModelUtil.getReleaseDateDescription(release)); trackData.setTagFieldValues(FieldKey.GENRE, ""); for (String style : release.getStyles()) { trackData.addGenre(style); } trackData.setTagFieldValues(FieldKey.ARTIST, Util.firstNotEmpty(trackArtist, albumArtist)); trackData.setTagFieldValues(FieldKey.TITLE, DiscogsModelUtil.getTrackTitleCleared(discogsTrack.getTitle())); trackData.setTagFieldValues(FieldKey.TRACK, rtm.getTrackTrack(discogsTrack)); trackData.setTagFieldValues(FieldKey.TRACK_TOTAL, rtm.getTrackTrackTotal(discogsTrack)); trackData.setTagFieldValues(FieldKey.DISC_NO, rtm.getTrackDisc(discogsTrack)); trackData.setTagFieldValues(FieldKey.DISC_TOTAL, rtm.getTrackDiscTotal(discogsTrack)); } } private void writeTracks() { ProgressDialog dialog = new ProgressDialog(this, "Writing tags"); dialog.show(new Task() { String status; boolean abort = false; public int processed; @Override public boolean isIndeterminate() { return false; } @Override public float getProgress() { return (float) processed / tracks.size(); } @Override public String getStatus() { return "Writing Tags to: " + status; } @Override public void abort() { abort = true; } @Override public void start() { HashMap<File, ArrayList<Track>> cues = new HashMap<File, ArrayList<Track>>(); for (Track track : tracks) { TrackData trackData = track.getTrackData(); if (!trackData.isFile()) { processed++; continue; } if (abort) break; if (trackData.isCue()) { File file; if (trackData.isCueEmbedded()) { file = trackData.getFile(); } else { file = new File(trackData.getCueLocation()); } if (!cues.containsKey(file)) { cues.put(file, new ArrayList<Track>()); } cues.get(file).add(track); continue; } status = trackData.getFile().getName(); TrackIO.write(track); processed++; } // now let's write cue files // not implemented for now // CUEWriter writer = new CUEWriter(); // for (File file : cues.keySet()) { // status = file.getName(); // writer.write(file, cues.get(file)); // } playlist.firePlaylistChanged(); close(); } }); } }