package uk.org.squirm3.ui.reaction.mode;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.StringTokenizer;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JTextArea;
import org.springframework.core.convert.ConversionService;
import org.springframework.util.StringUtils;
import uk.org.squirm3.model.Reaction;
import uk.org.squirm3.ui.reaction.ReactionListPanel;
import com.google.common.base.Joiner;
public class JTextAreaMode implements ReactionsListMode {
private final ReactionListPanel reactionListPanel;
private final ConversionService conversionService;
private final JButton updateButton;
private final JTextArea textArea;
public JTextAreaMode(final ReactionListPanel reactionListPanel,
final ConversionService conversionService) {
this.reactionListPanel = reactionListPanel;
this.conversionService = conversionService;
updateButton = reactionListPanel.createJButton("reactions.update",
new UpdateReactionsListener());
textArea = new JTextArea();
}
@Override
public Component getMenu() {
return updateButton;
}
@Override
public Component getReactionsList() {
return textArea;
}
@Override
public void reactionsHaveChanged(final Collection<Reaction> reactions) {
textArea.setText(Joiner.on("\n").join(reactions));
}
private final class UpdateReactionsListener implements ActionListener {
@Override
public void actionPerformed(final ActionEvent e) {
try {
reactionListPanel.setReactions(parseReactions(textArea
.getText()));
} catch (final UnparsableReactionException exception) {
JOptionPane.showMessageDialog(reactionListPanel,
exception.getUnparsableReaction(),
reactionListPanel.localize("reactions.parsing.error"),
JOptionPane.ERROR_MESSAGE);
}
}
private Collection<Reaction> parseReactions(final String text)
throws UnparsableReactionException {
final List<Reaction> reactions = new ArrayList<Reaction>();
final StringTokenizer lines = new StringTokenizer(text, "\n", true);
String line = null;
String originalLine = null;
while (lines.hasMoreTokens()) {
originalLine = lines.nextToken();
line = StringUtils.trimAllWhitespace(originalLine);
if (!StringUtils.hasText(line) || isAComment(line)) {
continue;
}
final Reaction r = parseReaction(line, originalLine);
if (r != null) {
reactions.add(r);
} else {
throw new UnparsableReactionException(originalLine);
}
}
return reactions;
}
private Reaction parseReaction(final String line,
final String originalLine) throws UnparsableReactionException {
try {
return conversionService.convert(line, Reaction.class);
} catch (final Exception e) {
throw new UnparsableReactionException(originalLine);
}
}
private boolean isAComment(final String line) {
return line.startsWith("/") || line.startsWith("#");
}
public class UnparsableReactionException extends Exception {
private static final long serialVersionUID = 1L;
private final String unparsableReaction;
private UnparsableReactionException(final String unparsableReaction) {
this.unparsableReaction = unparsableReaction;
}
public String getUnparsableReaction() {
return unparsableReaction;
}
}
}
}