package moviescraper.doctord.view;
import java.awt.BorderLayout;
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.util.ArrayList;
import java.util.List;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.border.Border;
import moviescraper.doctord.model.dataitem.Genre;
public class GenreEditorPanel extends JPanel implements ItemListener {
private static final long serialVersionUID = 1L;
private JTextField textFieldGenre;
private ArrayList<JCheckBox> genreCheckBoxes;
private List<Genre> originalGenreList; //original values in case we hit cancel
private List<Genre> editedGenreList; //edited values which become active when we hit ok
private static final int DEFAULT_GENRE_LENGTH = 15;
public GenreEditorPanel(final List<Genre> genreList){
super(new BorderLayout());
this.originalGenreList = genreList;
editedGenreList = cloneOriginalGenreListDeepCopy();
super.setMaximumSize(new Dimension(600,400));
final JPanel currentMovieGenresPanel = new JPanel(new ModifiedFlowLayout());
Border panelBorder = BorderFactory.createEtchedBorder();
JPanel favoriteMovieGenresPanel = new JPanel();
favoriteMovieGenresPanel.setLayout(new BoxLayout(favoriteMovieGenresPanel, BoxLayout.Y_AXIS));
JPanel enterANewGenrePanel = new JPanel();
//enterANewGenrePanel.setBorder(blackline);
//enter a new genre panel
JLabel lblGenre = new JLabel("Add Genre to Current Movie: ");
JButton addNewGenreButton = new JButton("Add");
//Adds a new checkbox, in the checked state. Also adds this to the list of genres
ActionListener addGenreActionListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if(textFieldGenre != null &&
textFieldGenre.getText()!= null
&& textFieldGenre.getText().length() > 0 && editedGenreList != null){
Genre genreToAdd = new Genre(textFieldGenre.getText());
if(!editedGenreList.contains(genreToAdd))
{
editedGenreList.add(genreToAdd);
addGenreCheckBoxToPanel(currentMovieGenresPanel, genreToAdd, true);
if(textFieldGenre != null)
{
textFieldGenre.setText("");
textFieldGenre.requestFocus();
}
}
}
}
};
addNewGenreButton.addActionListener(addGenreActionListener);
enterANewGenrePanel.add(lblGenre);
textFieldGenre = new JTextField(DEFAULT_GENRE_LENGTH);
textFieldGenre.addActionListener(addGenreActionListener);
enterANewGenrePanel.add(textFieldGenre);
enterANewGenrePanel.add(addNewGenreButton);
//existing genres panel
genreCheckBoxes = new ArrayList<>(editedGenreList.size());
//get all the labels of the check boxes set up
for(Genre currentGenreToAdd : editedGenreList)
{
addGenreCheckBoxToPanel(currentMovieGenresPanel, currentGenreToAdd, true);
}
//favorite genres panel
JLabel favoriteLabel = new JLabel("Favorites");
ArrayList<Genre> existingFavoriteGenresArray = FavoriteGenrePickerPanel.getFavoriteGenresFromPreferences();
final JPanel quickGenresCheckboxPanel = new JPanel();
quickGenresCheckboxPanel.setLayout(new BoxLayout(quickGenresCheckboxPanel, BoxLayout.Y_AXIS));
for(Genre existingFavoriteGenres : existingFavoriteGenresArray)
{
addGenreCheckBoxToPanel(quickGenresCheckboxPanel, existingFavoriteGenres, false);
}
quickGenresCheckboxPanel.add(Box.createVerticalGlue());
JScrollPane quickGenresCheckboxPanelScrollPane = new JScrollPane(quickGenresCheckboxPanel);
quickGenresCheckboxPanelScrollPane.setBorder(BorderFactory.createEmptyBorder());
//quickGenresCheckboxPanel.setBorder(BorderFactory.createEmptyBorder());
quickGenresCheckboxPanelScrollPane.setPreferredSize(new Dimension(240, 310));
favoriteMovieGenresPanel.add(favoriteLabel);
favoriteMovieGenresPanel.add(quickGenresCheckboxPanelScrollPane);
favoriteMovieGenresPanel.add(Box.createVerticalGlue());
//scroll panes
final JScrollPane currentMovieGenresPanelScrollPane = new JScrollPane(currentMovieGenresPanel);
//currentMovieGenresPanelScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
currentMovieGenresPanelScrollPane.setBorder(BorderFactory.createEmptyBorder());
currentMovieGenresPanelScrollPane.setPreferredSize(new Dimension(400, 310));
JPanel westPanel = new JPanel(new BorderLayout());
westPanel.setBorder(panelBorder);
JPanel eastPanel = new JPanel(new BorderLayout());
eastPanel.setBorder(panelBorder);
westPanel.add(enterANewGenrePanel, BorderLayout.NORTH);
westPanel.add(currentMovieGenresPanelScrollPane, BorderLayout.CENTER);
eastPanel.add(favoriteMovieGenresPanel);
add(westPanel, BorderLayout.WEST);
add(eastPanel, BorderLayout.EAST);
}
private List<Genre> cloneOriginalGenreListDeepCopy() {
ArrayList<Genre> clonedList = new ArrayList<>(originalGenreList.size());
for (Genre originalGenre : originalGenreList)
{
clonedList.add(new Genre(originalGenre.getGenre()));
}
return clonedList;
}
private void addGenreCheckBoxToPanel(JPanel panel, Genre genre, boolean initialStatus)
{
JCheckBox checkBoxOfGenre = new JCheckBox(genre.getGenre());
checkBoxOfGenre.setSelected(initialStatus);
checkBoxOfGenre.addItemListener(this);
panel.add(checkBoxOfGenre);
panel.revalidate();
}
//What happens when a checkbox in the genre editor is checked or unchecked
@Override
public void itemStateChanged(ItemEvent event) {
if(genreCheckBoxes != null && editedGenreList != null)
{
JCheckBox eventItem = (JCheckBox) event.getItem();
Genre genreNameToEdit = new Genre(eventItem.getText());
if(event.getStateChange() == ItemEvent.SELECTED)
{
if(!editedGenreList.contains(genreNameToEdit))
{
editedGenreList.add(genreNameToEdit);
}
}
else if(event.getStateChange() == ItemEvent.DESELECTED)
{
editedGenreList.remove(genreNameToEdit);
}
}
}
/**
* Finalize changes made
*/
public void save()
{
originalGenreList.clear();
originalGenreList.addAll(editedGenreList);
}
}