package uk.org.squirm3.ui.reaction.mode;
import java.awt.Component;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Collection;
import javax.swing.JButton;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import uk.org.squirm3.model.Reaction;
import uk.org.squirm3.ui.reaction.ReactionListPanel;
public class JListMode implements ReactionsListMode {
private final ReactionListPanel reactionListPanel;
private final ReactionsListMode textMode;
private final JButton editButton, deleteButton, clearButton;
private final JList<Reaction> reactionsList;
private final JPanel listButtonsPanel;
public JListMode(final ReactionListPanel reactionListPanel,
final ReactionsListMode textMode) {
this.reactionListPanel = reactionListPanel;
this.textMode = textMode;
listButtonsPanel = new JPanel();
listButtonsPanel.setLayout(new GridLayout(4, 1));
final ActionListener editReactionListener = new EditReactionsListener();
editButton = reactionListPanel.createJButton("reactions.edit",
editReactionListener);
listButtonsPanel.add(editButton);
deleteButton = reactionListPanel.createJButton("reactions.delete",
new DeleteSelectedReactionsListener());
listButtonsPanel.add(deleteButton);
clearButton = reactionListPanel.createJButton("reactions.clear",
new ClearReactionsListener());
listButtonsPanel.add(clearButton);
reactionsList = new JList<>();
reactionsList.getSelectionModel().addListSelectionListener(
new ListSelectionListener() {
@Override
public void valueChanged(final ListSelectionEvent e) {
updateDeleteButton();
}
});
reactionsList.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(final MouseEvent e) {
if (e.getClickCount() == 2) {
editReactionListener.actionPerformed(null);
}
}
});
}
@Override
public Component getMenu() {
return listButtonsPanel;
}
@Override
public Component getReactionsList() {
return reactionsList;
}
@Override
public void reactionsHaveChanged(final Collection<Reaction> reactions) {
reactionsList.setListData(reactions.toArray(new Reaction[0]));
clearButton.setEnabled(!reactions.isEmpty());
updateDeleteButton();
}
private void updateDeleteButton() {
deleteButton.setEnabled(!reactionsList.getSelectedValuesList()
.isEmpty());
}
private final class DeleteSelectedReactionsListener
implements
ActionListener {
@Override
public void actionPerformed(final ActionEvent e) {
reactionListPanel.removeReactions( //
new ArrayList<>(reactionsList.getSelectedValuesList()));
}
}
private final class ClearReactionsListener implements ActionListener {
@Override
public void actionPerformed(final ActionEvent e) {
reactionListPanel.clearReactions();
}
}
private final class EditReactionsListener implements ActionListener {
@Override
public void actionPerformed(final ActionEvent e) {
reactionListPanel.setCurrentModeTo(textMode);
}
}
}