package uk.org.squirm3.ui.reaction;
import java.awt.BorderLayout;
import java.awt.event.ActionListener;
import java.util.Collection;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.border.EtchedBorder;
import javax.swing.border.TitledBorder;
import org.springframework.context.MessageSource;
import org.springframework.core.convert.ConversionService;
import uk.org.squirm3.engine.ApplicationEngine;
import uk.org.squirm3.engine.ApplicationEngineEvent;
import uk.org.squirm3.listener.Listener;
import uk.org.squirm3.model.Reaction;
import uk.org.squirm3.springframework.Messages;
import uk.org.squirm3.ui.reaction.mode.JListMode;
import uk.org.squirm3.ui.reaction.mode.JTextAreaMode;
import uk.org.squirm3.ui.reaction.mode.ReactionsListMode;
public class ReactionListPanel extends JPanel {
private static final long serialVersionUID = 1L;
private final ApplicationEngine applicationEngine;
private final MessageSource messageSource;
private JPanel buttonParentPanel;
private JScrollPane scrollPanel;
private TitledBorder border;
private final ReactionsListMode defaultMode;
private ReactionsListMode currentMode;
public ReactionListPanel(final ApplicationEngine applicationEngine,
final MessageSource messageSource,
final ConversionService conversionService) {
this.applicationEngine = applicationEngine;
this.messageSource = messageSource;
currentMode = new JTextAreaMode(this, conversionService);
defaultMode = new JListMode(this, currentMode);
createListPanel();
setCurrentModeTo(defaultMode);
applicationEngine.addListener(new ReactionsChangedListener(),
ApplicationEngineEvent.REACTIONS);
}
public void setCurrentModeTo(final ReactionsListMode futureMode) {
buttonParentPanel.remove(currentMode.getMenu());
buttonParentPanel.add(futureMode.getMenu(), BorderLayout.NORTH);
buttonParentPanel.updateUI();
scrollPanel.setViewportView(futureMode.getReactionsList());
currentMode = futureMode;
currentMode.reactionsHaveChanged(applicationEngine.getReactions());
}
public JButton createJButton(final String key,
final ActionListener actionListener) {
final JButton jButton = new JButton(Messages.localize(key,
messageSource));
jButton.addActionListener(actionListener);
return jButton;
}
public void setReactions(final Collection<Reaction> reactions) {
applicationEngine.setReactions(reactions);
}
public void removeReactions(final Collection<Reaction> reactions) {
applicationEngine.removeReactions(reactions);
}
public void clearReactions() {
applicationEngine.clearReactions();
}
public String localize(final String key) {
return Messages.localize("reactions.current", messageSource);
}
private final class ReactionsChangedListener implements Listener {
@Override
public void propertyHasChanged() {
final Collection<Reaction> reactions = applicationEngine
.getReactions();
border.setTitle(localize("reactions.current") + " ("
+ reactions.size() + ")");
setCurrentModeTo(defaultMode);
ReactionListPanel.this.repaint();
}
}
private void createListPanel() {
setLayout(new BorderLayout());
border = BorderFactory.createTitledBorder(
BorderFactory.createEtchedBorder(EtchedBorder.LOWERED),
localize("reactions.current"));
setBorder(border);
buttonParentPanel = new JPanel();
buttonParentPanel.setLayout(new BorderLayout());
add(buttonParentPanel, BorderLayout.EAST);
scrollPanel = new JScrollPane();
add(scrollPanel, BorderLayout.CENTER);
}
}