package net.bettyluke.tracinstant.plugins;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.text.JTextComponent;
import net.bettyluke.tracinstant.data.Ticket;
public class AnnotationPanel extends JPanel {
public static ToolPlugin createPlugin() {
return new AnnotationPanel().new Plugin();
}
private int selectedTicketId = -1;
private TicketUpdater updater;
private JTextComponent editor;
/** The interface through which the application interacts with us. */
private class Plugin extends ToolPlugin {
private static final String ANNOTATION_FIELD = "Annotation";
@Override
public JComponent initialise(TicketUpdater tu) {
tu.identifyUserField(ANNOTATION_FIELD, true);
updater = tu;
return AnnotationPanel.this;
}
@Override
public void ticketViewUpdated(Ticket[] inView, Ticket[] selected) {
showAnnotationsForSelected(selected);
}
@Override
public String toString() {
return "Annotate";
}
@Override
public void hidden() {
// Ensure data is saved when the editor goes out of view.
// Includes shut-down.
storeAnnotationInTicket();
deselect();
}
}
public AnnotationPanel() {
super(new BorderLayout());
editor = createEditor();
add(new JScrollPane(editor));
Dimension dim = new Dimension(200, 50);
setPreferredSize(dim);
setMinimumSize(dim);
}
private JTextComponent createEditor() {
JTextArea result = new JTextArea();
result.setBackground(new Color(255, 255, 230));
result.addFocusListener(new FocusListener() {
@Override
public void focusLost(FocusEvent e) {
storeAnnotationInTicket();
}
@Override
public void focusGained(FocusEvent e) {
}
});
return result;
}
protected void storeAnnotationInTicket() {
if (editor.isEnabled() && selectedTicketId >= 0) {
String text = editor.getText();
if (text.isEmpty()) {
text = null;
}
updater.setTicketField(selectedTicketId, "Annotation", text);
}
}
protected void deselect() {
showAnnotationsForSelected(new Ticket[0]);
}
protected final void showAnnotationsForSelected(Ticket[] selected) {
if (selected.length == 1) {
int newId = selected[0].getNumber();
if (selectedTicketId != newId) {
selectedTicketId = newId;
String annotation = selected[0].getValue("Annotation");
showText(annotation == null ? "" : annotation);
}
} else {
selectedTicketId = -1;
hideText();
}
}
private void showText(String text) {
editor.setEnabled(true);
editor.setEditable(true);
editor.setText(text);
}
private void hideText() {
editor.setText("");
editor.setEnabled(false);
editor.setEditable(false);
}
}