package com.quiltplayer.view.swing.views.impl; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.FocusListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import javax.annotation.PostConstruct; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextField; import net.miginfocom.swing.MigLayout; import org.jdesktop.jxlayer.JXLayer; import org.springframework.beans.factory.annotation.Autowired; import com.quiltplayer.core.repo.spotify.JotifyRepository; import com.quiltplayer.model.jotify.JotifyAlbum; import com.quiltplayer.model.jotify.JotifyArtist; import com.quiltplayer.model.jotify.JotifySong; import com.quiltplayer.view.swing.buttons.QButton; import com.quiltplayer.view.swing.labels.SpotifyArtistLabel; import com.quiltplayer.view.swing.labels.StringOrCharLabel; import com.quiltplayer.view.swing.labels.search.AlbumSearchLabel; import com.quiltplayer.view.swing.labels.search.TrackSearchLabel; import com.quiltplayer.view.swing.layers.JScrollPaneLayerUI; import com.quiltplayer.view.swing.listeners.ArtistListener; import com.quiltplayer.view.swing.listeners.ChangeAlbumListener; import com.quiltplayer.view.swing.listeners.SearchListener; import com.quiltplayer.view.swing.panels.QScrollPane; import com.quiltplayer.view.swing.panels.QScrollPane.ScrollDirection; import com.quiltplayer.view.swing.textfields.QTextField; import com.quiltplayer.view.swing.views.View; import com.quiltplayer.view.swing.window.Keyboard; import de.felixbruns.jotify.media.Album; import de.felixbruns.jotify.media.Artist; import de.felixbruns.jotify.media.Result; /** * Search collection + Spotify * * @author Vlado Palczynski * */ @org.springframework.stereotype.Component public class SearchView implements View { private static final long serialVersionUID = 1L; public static final String EVENT_SEARCH = "search"; private JPanel panel; private JPanel searchPanel; private JPanel scrollablePanel; private JTextField searchField; private JButton searchButton; @Autowired private SearchListener searchListener; @Autowired private ArtistListener artistListener; @Autowired private ChangeAlbumListener changeAlbumListener; @Autowired private Keyboard keyboardPanel; private Result result; private FocusListener focusListener = new com.quiltplayer.view.swing.listeners.QFocusListener(); private boolean newResult; @PostConstruct public void init() { setupSearchField(); setupSearchButton(); } /* * (non-Javadoc) * * @see org.quiltplayer.view.components.View#getUI() */ @Override public JComponent getUI() { if (newResult || panel == null) { panel = new JPanel(); panel.setOpaque(false); panel.addFocusListener(focusListener); panel.setLayout(new MigLayout("ins 1.0cm 2cm 0cm 2cm, alignx center, top, wrap 1")); setupSearchBar(); panel.add(searchPanel, "top, alignx center, gapy 0 0.5cm"); if (result != null) { scrollablePanel = new JPanel(new MigLayout("wrap 3, alignx center, top")); scrollablePanel.setOpaque(true); setupArtists(panel); setupAlbums(panel); addTracks(panel); QScrollPane pane = new QScrollPane(scrollablePanel, ScrollDirection.VERTICAL); final JXLayer<JScrollPane> jx = new JXLayer<JScrollPane>(pane, new JScrollPaneLayerUI()); panel.add(jx, "w 100%"); } newResult = false; } searchField.requestFocus(); return panel; } private void setupSearchBar() { searchPanel = new JPanel(new MigLayout("insets 0, top")); searchPanel.setOpaque(false); searchPanel.add(searchField, "west, center, w 6cm, gapy 15, " + QTextField.MIG_HEIGHT); searchPanel.add(searchButton, "gapy 15, " + QButton.MIG_HEIGHT); } private void setupSearchField() { searchField = new QTextField(true, keyboardPanel); KeyListener k = new KeyAdapter() { /* * (non-Javadoc) * * @see java.awt.event.KeyAdapter#keyPressed(java.awt.event.KeyEvent) */ @Override public void keyPressed(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_ENTER) { searchListener.actionPerformed(new ActionEvent(searchField.getText(), 0, EVENT_SEARCH)); } } }; searchField.addKeyListener(k); } private void setupArtists(JPanel panel) { JPanel artists = new JPanel(new MigLayout("insets 0, wrap 1, top, fill")); artists.setOpaque(false); // artists.setBackground(ColorConstantsDark.BACKGROUND); SpotifyArtistLabel label = null; artists.add(new StringOrCharLabel(" Artists"), "w 100%, h 0.75cm"); if (!result.getArtists().isEmpty()) { for (Artist artist : result.getArtists()) { label = new SpotifyArtistLabel(new JotifyArtist(artist), artistListener); artists.add(label, "left, w 100%, gapy 0.1cm"); } } scrollablePanel.add(artists, "top, wmin 10%, w 30%, wmax 30%, alignx center, gapx 1% 1%"); } private void setupAlbums(JPanel panel) { JPanel albums = new JPanel(new MigLayout("insets 0, top, wrap 1")); albums.setOpaque(false); albums.add(new StringOrCharLabel(" Albums"), "w 100%, h 0.75cm"); if (!result.getAlbums().isEmpty()) { for (Album album : result.getAlbums()) { AlbumSearchLabel label; if (album.getTracks().size() <= 0) album = JotifyRepository.browseAlbum(album); label = new AlbumSearchLabel(new JotifyAlbum(album)); label.addActionListener(changeAlbumListener); albums.add(label, "left, w 100%, gapy 0.1cm"); } } scrollablePanel.add(albums, "top, wmin 10%, w 30%, wmax 30%, alignx center"); } private void addTracks(JPanel panel) { JPanel tracks = new JPanel(new MigLayout("insets 0, wrap 1")); tracks.setOpaque(false); TrackSearchLabel label = null; tracks.add(new StringOrCharLabel(" Tracks"), "w 100%, h 0.75cm"); if (!result.getTracks().isEmpty()) { for (de.felixbruns.jotify.media.Track track : result.getTracks()) { label = new TrackSearchLabel(new JotifySong(track)); label.addActionListener(changeAlbumListener); tracks.add(label, "left, w 100%, gapy 0.1cm"); } } scrollablePanel.add(tracks, "top, wmin 10%, w 30%, wmax 30%, alignx center, gapx 1% 1%"); } private void setupSearchButton() { searchButton = new QButton("Search Spotify"); searchButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { searchListener.actionPerformed(new ActionEvent(searchField.getText(), 0, EVENT_SEARCH)); } }); } /** * @param result * the result to set */ public final void setResult(Result result) { this.result = result; newResult = true; } }