package com.vistatec.ocelot.its.view;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowListener;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Calendar;
import javax.swing.ButtonGroup;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.vistatec.ocelot.events.LQIAdditionEvent;
import com.vistatec.ocelot.events.LQIEditEvent;
import com.vistatec.ocelot.events.api.OcelotEventQueue;
import com.vistatec.ocelot.its.model.LanguageQualityIssue;
import com.vistatec.ocelot.lqi.model.LQIErrorCategory;
import com.vistatec.ocelot.lqi.model.LQIGrid;
import com.vistatec.ocelot.lqi.model.LQISeverity;
import com.vistatec.ocelot.segment.model.OcelotSegment;
public class LanguageQualityIssuePropsPanel extends JPanel implements
ActionListener, Runnable {
private static final long serialVersionUID = 4489879495975477888L;
private static final Logger LOG = LoggerFactory
.getLogger(LanguageQualityIssuePropsPanel.class);
private OcelotEventQueue eventQueue;
// private List<LQIErrorCategory> errorCategories;
private LQIGrid lqiGrid;
private boolean enabled = true;
private OcelotSegment selectedSeg;
private LanguageQualityIssue selectedLQI;
private String prevType, prevComment;
private LQISeverity prevSeverity;
private URL prevProfile;
private boolean prevEnabled;
private JComboBox<String> typeList;
private JComboBox<LQISeverity> severityList;
private JTextArea commentContent;
private JTextField profileRefLink;
private JRadioButton enabledTrue;
private JRadioButton enabledFalse;
private JFrame frame;
private WindowListener windowListener;
private JButton btnSave;
private JButton btnCancel;
private JLabel segmentLabel;
private JLabel segmentId;
private JLabel typeLabel;
private JLabel commentLabel;
private JLabel severityLabel;
private JLabel profileLabel;
private JLabel enabledLabel;
private JScrollPane commentScroll;
public LanguageQualityIssuePropsPanel(OcelotEventQueue eventQueue,
LQIGrid lqiGrid) {
this.eventQueue = eventQueue;
this.lqiGrid = lqiGrid;
makePanel();
}
private void makePanel() {
setLayout(new GridBagLayout());
setBorder(new EmptyBorder(10, 10, 10, 10));
// Initialize default grid bag layout: left align, 1 grid each
GridBagConstraints gridBag = new GridBagConstraints();
gridBag.anchor = GridBagConstraints.FIRST_LINE_START;
gridBag.gridwidth = 1;
// Add UI Components from top to bottom
addTranslationSegment(gridBag);
addType(gridBag);
addComments(gridBag);
addSeverity(gridBag);
addProfileReference(gridBag);
addEnabled(gridBag);
addSave(gridBag);
}
private void addTranslationSegment(GridBagConstraints gridBag) {
segmentLabel = new JLabel("Segment #: ");
gridBag.gridx = 0;
gridBag.gridy = 0;
add(segmentLabel, gridBag);
segmentId = new JLabel();
gridBag.gridx = 1;
gridBag.gridy = 0;
add(segmentId, gridBag);
}
private void addType(GridBagConstraints gridBag) {
typeLabel = new JLabel("Type: ");
gridBag.gridx = 0;
gridBag.gridy = 1;
add(typeLabel, gridBag);
typeList = new JComboBox<String>();
if (lqiGrid != null && lqiGrid.getErrorCategories() != null) {
String[] types = new String[lqiGrid.getErrorCategories().size()];
int i = 0;
for (LQIErrorCategory errCat : lqiGrid.getErrorCategories()) {
types[i++] = errCat.getName();
}
typeList.setModel(new DefaultComboBoxModel<>(types));
}
gridBag.gridx = 1;
gridBag.gridy = 1;
add(typeList, gridBag);
}
private void addComments(GridBagConstraints gridBag) {
commentLabel = new JLabel("Comment: ");
gridBag.gridx = 0;
gridBag.gridy = 2;
add(commentLabel, gridBag);
commentContent = new JTextArea(5, 15);
commentContent.setEditable(true);
commentContent.setLineWrap(true);
commentScroll = new JScrollPane(commentContent);
gridBag.gridx = 1;
gridBag.gridy = 2;
add(commentScroll, gridBag);
}
private void addSeverity(GridBagConstraints gridBag) {
severityLabel = new JLabel("Severity: ");
gridBag.gridx = 0;
gridBag.gridy = 3;
add(severityLabel, gridBag);
severityList = new JComboBox<>();
if (lqiGrid != null && lqiGrid.getSeverities() != null) {
severityList.setModel(new DefaultComboBoxModel<>(lqiGrid
.getSeverities().toArray(
new LQISeverity[lqiGrid.getSeverities().size()])));
}
gridBag.gridx = 1;
gridBag.gridy = 3;
add(severityList, gridBag);
}
private void addProfileReference(GridBagConstraints gridBag) {
profileLabel = new JLabel("Profile Reference: ");
gridBag.gridx = 0;
gridBag.gridy = 4;
add(profileLabel, gridBag);
// TODO: IRI validation?
profileRefLink = new JTextField(15);
gridBag.gridx = 1;
gridBag.gridy = 4;
add(profileRefLink, gridBag);
}
private void addEnabled(GridBagConstraints gridBag) {
enabledLabel = new JLabel("Enabled: ");
gridBag.gridx = 0;
gridBag.gridy = 5;
add(enabledLabel, gridBag);
enabledTrue = new JRadioButton("Yes");
enabledTrue.setSelected(true);
enabledTrue.addActionListener(this);
enabledFalse = new JRadioButton("No");
enabledFalse.addActionListener(this);
ButtonGroup group = new ButtonGroup();
group.add(enabledTrue);
group.add(enabledFalse);
JPanel enabledPanel = new JPanel();
enabledPanel.add(enabledTrue);
enabledPanel.add(enabledFalse);
gridBag.gridx = 1;
gridBag.gridy = 5;
add(enabledPanel, gridBag);
}
private void addSave(GridBagConstraints gridBag) {
KeyListener enter = new KeyListener() {
@Override
public void keyTyped(KeyEvent ke) {
}
@Override
public void keyPressed(KeyEvent ke) {
}
@Override
public void keyReleased(KeyEvent ke) {
if (ke.getKeyCode() == KeyEvent.VK_ENTER) {
if (ke.getSource().equals(btnSave)) {
btnSave.doClick();
} else {
btnCancel.doClick();
}
}
}
};
btnSave = new JButton("Save");
btnSave.addActionListener(this);
btnSave.addKeyListener(enter);
btnSave.setEnabled(selectedSeg != null);
btnCancel = new JButton("Cancel");
btnCancel.addActionListener(this);
btnCancel.addKeyListener(enter);
JPanel actionPanel = new JPanel();
actionPanel.add(btnSave);
actionPanel.add(btnCancel);
gridBag.gridx = 1;
gridBag.gridy = 6;
add(actionPanel, gridBag);
}
public void resetForm() {
// if (!setType(prevType)) {
// typeList.setSelectedIndex(0);
// }
setType(prevType);
commentContent.setText(prevComment != null ? prevComment : "");
// severityRating.setValue(prevSeverity);
severityList.setSelectedItem(prevSeverity);
profileRefLink.setText(prevProfile != null ? prevProfile.toString()
: "");
if (prevEnabled) {
enabledTrue.doClick();
} else {
enabledFalse.doClick();
}
}
public void setType(String metadataType) {
boolean found = false;
for (int i = 0; i < typeList.getModel().getSize(); i++) {
if (typeList.getModel().getElementAt(i).equals(metadataType)) {
found = true;
break;
}
}
if (found) {
typeList.setSelectedItem(metadataType);
} else {
typeList.setSelectedIndex(0);
}
// for (int i = 0; i < LQI_TYPE.length; i++) {
// String value = LQI_TYPE[i];
// if (value.equals(metadataType)) {
// typeList.setSelectedIndex(i);
// return true;
// }
// }
// return false;
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == btnCancel) {
if (addingLQI()) {
frame.dispose();
} else {
resetForm();
}
} else if (e.getSource() == btnSave) {
LanguageQualityIssue lqi = new LanguageQualityIssue();
lqi.setType(typeList.getSelectedItem().toString());
lqi.setComment(commentContent.getText());
lqi.setSeverity(((LQISeverity) severityList.getSelectedItem())
.getScore());
lqi.setSeverityName(((LQISeverity) severityList.getSelectedItem())
.getName());
if (!profileRefLink.getText().isEmpty()) {
try {
lqi.setProfileReference(new URL(profileRefLink.getText()));
} catch (MalformedURLException ex) {
LOG.warn("Profile reference '" + profileRefLink.getText()
+ "' is not a valid URL", ex);
}
}
lqi.setEnabled(enabled);
if (!selectedSeg.getLQI().isEmpty()) {
lqi.setIssuesRef(selectedSeg.getLQI().get(0).getIssuesRef());
} else {
// TODO: generate unique LQI issues ref
lqi.setIssuesRef(Calendar.getInstance().getTime().toString());
}
if (addingLQI()) {
eventQueue.post(new LQIAdditionEvent(lqi, selectedSeg));
frame.dispose();
} else {
eventQueue.post(new LQIEditEvent(lqi, this.selectedLQI,
selectedSeg, this.selectedLQI));
}
} else if (e.getSource() == enabledTrue) {
enabled = true;
} else if (e.getSource() == enabledFalse) {
enabled = false;
}
}
public boolean addingLQI() {
return frame != null && this.selectedLQI == null;
}
public void setWindowListener(WindowListener winodowListener) {
this.windowListener = winodowListener;
}
public void setSegment(OcelotSegment segment) {
this.selectedSeg = segment;
btnSave.setEnabled(segment != null);
}
public void setMetadata(OcelotSegment selectedSegment,
LanguageQualityIssue lqi) {
setSegment(selectedSegment);
this.selectedLQI = lqi;
prevType = lqi.getType();
prevComment = lqi.getComment();
prevSeverity = new LQISeverity(lqi.getSeverityName(), lqi.getSeverity());
prevProfile = lqi.getProfileReference();
prevEnabled = lqi.isEnabled();
segmentLabel.setText("Segment #");
if (selectedSegment != null) {
segmentId.setText(selectedSegment.getSegmentNumber() + "");
} else {
segmentId.setText("");
}
typeLabel.setText("Type");
setType(prevType);
commentLabel.setText("Comment");
commentContent.setText(prevComment);
commentContent.setVisible(true);
severityLabel.setText("Severity");
severityList.setSelectedItem(prevSeverity);
profileLabel.setText("Profile Reference");
profileRefLink.setText(prevProfile != null ? prevProfile.toString()
: "");
enabledLabel.setText("Enabled");
enabledTrue.setSelected(prevEnabled);
enabledFalse.setSelected(!prevEnabled);
}
public void clearDisplay() {
segmentLabel.setText("");
segmentId.setText("");
typeLabel.setText("");
typeList.setVisible(false);
commentLabel.setText("");
commentContent.setText("");
commentScroll.setVisible(false);
severityLabel.setText("");
profileLabel.setText("");
profileRefLink.setText("");
profileRefLink.setVisible(false);
enabledLabel.setText("");
enabledTrue.setVisible(false);
enabledFalse.setVisible(false);
btnSave.setVisible(false);
btnCancel.setVisible(false);
}
@Override
public void run() {
frame = new JFrame("Add Language Quality Issue");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(this);
if (windowListener != null) {
frame.addWindowListener(windowListener);
}
frame.pack();
frame.setVisible(true);
}
}