package org.isatools.isacreator.gui.commentui;
import com.explodingpixels.macwidgets.IAppWidgetFactory;
import org.apache.commons.collections15.OrderedMap;
import org.apache.log4j.Logger;
import org.isatools.isacreator.common.CommonMouseAdapter;
import org.isatools.isacreator.common.UIHelper;
import org.isatools.isacreator.common.button.ButtonType;
import org.isatools.isacreator.common.button.FlatButton;
import org.isatools.isacreator.configuration.DataTypes;
import org.isatools.isacreator.configuration.FieldObject;
import org.isatools.isacreator.configuration.io.ConfigXMLParser;
import org.isatools.isacreator.effects.HUDTitleBar;
import org.isatools.isacreator.effects.components.RoundedJTextField;
import org.isatools.isacreator.managers.ApplicationManager;
import org.isatools.isacreator.spreadsheet.model.TableReferenceObject;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.List;
public abstract class AbstractAddCommentGUI extends JFrame {
public static final String CUSTOM = "custom";
public static final int WINDOW_WIDTH = 600;
public static final int WINDOW_HEIGHT = 500;
private JPanel swappableContainer;
protected static Map<String, TableReferenceObject> templateToFields;
private List<JLabel> labels;
private List<JCheckBox> selectedFieldComponents;
private Timer timer;
private static Logger log = Logger.getLogger(AbstractAddCommentGUI.class.getName());
static {
templateToFields = new HashMap<String, TableReferenceObject>();
File fieldTemplateDirectory = new File("ProgramData/field_templates/");
if (fieldTemplateDirectory.exists()) {
ConfigXMLParser parser = new ConfigXMLParser(fieldTemplateDirectory.getAbsolutePath());
parser.loadConfiguration();
for (TableReferenceObject tro : parser.getTables()) {
templateToFields.put(tro.getTableName(), tro);
}
} else {
log.info("No field_templates directory in Program data directory, so ISAcreator hasn't loaded any field templates.");
}
}
public AbstractAddCommentGUI() {
labels = new ArrayList<JLabel>();
createGUI();
}
private void createGUI() {
setUndecorated(true);
setLayout(new BorderLayout());
setAlwaysOnTop(true);
setBackground(new Color(248, 248, 249));
setPreferredSize(new Dimension(WINDOW_WIDTH, WINDOW_HEIGHT));
((JComponent) getContentPane()).setBorder(UIHelper.EMPTY_BORDER);
addTitlePanel();
addSidePanel();
addCentralPanel();
swapContainers(getPredefinedCommentsInterface(CUSTOM));
pack();
setLocationRelativeTo(ApplicationManager.getCurrentApplicationInstance());
setVisible(true);
}
private void addTitlePanel() {
HUDTitleBar titleBar = new HUDTitleBar(null, null);
add(titleBar, BorderLayout.NORTH);
titleBar.installListeners();
}
private void addSidePanel() {
JPanel sidePanel = new JPanel(new BorderLayout());
sidePanel.setPreferredSize(new Dimension(175, 200));
sidePanel.setBackground(UIHelper.BG_COLOR);
sidePanel.setBorder(UIHelper.EMPTY_BORDER);
Container sidePanelOptions = new JPanel();
sidePanelOptions.setLayout(new BoxLayout(sidePanelOptions, BoxLayout.PAGE_AXIS));
sidePanelOptions.setBackground(UIHelper.BG_COLOR);
sidePanelOptions.add(UIHelper.createLabel("Add Field(s)", UIHelper.VER_12_BOLD, UIHelper.DARK_GREEN_COLOR));
sidePanelOptions.add(Box.createVerticalStrut(5));
sidePanelOptions.add(new JSeparator());
sidePanelOptions.add(Box.createVerticalStrut(15));
sidePanelOptions.add(UIHelper.createLabel("Custom Field", UIHelper.VER_11_BOLD, UIHelper.LIGHT_GREY_COLOR));
sidePanelOptions.add(Box.createVerticalStrut(5));
JLabel addCustomCommentOption = UIHelper.createLabel("\t\t Add Custom Field", UIHelper.VER_10_BOLD, UIHelper.LIGHT_GREEN_COLOR);
labels.add(addCustomCommentOption);
addCustomCommentOption.addMouseListener(new CommonMouseAdapter() {
@Override
public void mousePressed(MouseEvent mouseEvent) {
super.mousePressed(mouseEvent);
resetLabelStyle();
((JComponent) mouseEvent.getSource()).setForeground(UIHelper.LIGHT_GREEN_COLOR);
swapContainers(getPredefinedCommentsInterface(CUSTOM));
}
@Override
public void mouseEntered(MouseEvent mouseEvent) {
super.mouseEntered(mouseEvent);
}
@Override
public void mouseExited(MouseEvent mouseEvent) {
super.mouseExited(mouseEvent);
}
});
sidePanelOptions.add(addCustomCommentOption);
sidePanelOptions.add(Box.createVerticalStrut(15));
sidePanelOptions.add(UIHelper.createLabel("Predefined Fields", UIHelper.VER_11_BOLD, UIHelper.LIGHT_GREY_COLOR));
sidePanelOptions.add(Box.createVerticalStrut(5));
for (final String commentListTemplateName : templateToFields.keySet()) {
JLabel addTemplateComments = UIHelper.createLabel(String.format("\t\t %s Fields", commentListTemplateName), UIHelper.VER_10_BOLD, UIHelper.DARK_GREEN_COLOR);
labels.add(addTemplateComments);
addTemplateComments.addMouseListener(new CommonMouseAdapter() {
@Override
public void mousePressed(MouseEvent mouseEvent) {
super.mousePressed(mouseEvent);
resetLabelStyle();
((JComponent) mouseEvent.getSource()).setForeground(UIHelper.LIGHT_GREEN_COLOR);
swapContainers(getPredefinedCommentsInterface(commentListTemplateName));
}
@Override
public void mouseEntered(MouseEvent mouseEvent) {
super.mouseEntered(mouseEvent);
}
@Override
public void mouseExited(MouseEvent mouseEvent) {
super.mouseExited(mouseEvent);
}
});
sidePanelOptions.add(addTemplateComments);
}
sidePanel.add(sidePanelOptions, BorderLayout.NORTH);
add(sidePanel, BorderLayout.WEST);
}
private void resetLabelStyle() {
for (JLabel label : labels) {
label.setForeground(UIHelper.DARK_GREEN_COLOR);
}
}
private void addCentralPanel() {
swappableContainer = new JPanel();
swappableContainer.setBorder(UIHelper.EMPTY_BORDER);
swappableContainer.setBackground(UIHelper.BG_COLOR);
add(swappableContainer, BorderLayout.CENTER);
}
private void swapContainers(Container newContainer) {
if (newContainer != null) {
swappableContainer.removeAll();
swappableContainer.add(newContainer);
swappableContainer.repaint();
swappableContainer.validate();
}
}
private JPanel getPredefinedCommentsInterface(final String templateName) {
if (templateName.equals(CUSTOM)) {
return getAddCustomPanel();
}
selectedFieldComponents = new ArrayList<JCheckBox>();
JPanel panel = new JPanel(new BorderLayout());
panel.setBackground(UIHelper.BG_COLOR);
panel.add(UIHelper.createLabel(String.format("Add %s fields to Interface", templateName)), BorderLayout.NORTH);
Box fields = Box.createVerticalBox();
int addedFieldsCount = 0;
for (String fieldName : templateToFields.get(templateName).getFieldLookup().keySet()) {
if (isFieldAllowedInSection(templateName, fieldName)) {
final JPanel field = new JPanel(new GridLayout(1, 1));
field.setBackground(UIHelper.BG_COLOR);
final JCheckBox checkBox = new JCheckBox(fieldName, false);
UIHelper.renderComponent(checkBox, UIHelper.VER_10_PLAIN, UIHelper.GREY_COLOR, false);
checkBox.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent actionEvent) {
JCheckBox source = (JCheckBox) actionEvent.getSource();
if (source.isSelected()) {
selectedFieldComponents.add(source);
} else {
if (selectedFieldComponents.contains(source)) {
selectedFieldComponents.remove(source);
}
}
}
});
if (!okToAddField(fieldName)) checkBox.setEnabled(false);
field.add(checkBox);
fields.add(field);
addedFieldsCount++;
}
}
if (addedFieldsCount == 0) {
fields.add(UIHelper.createLabel("No available predefined fields for the selected section.", UIHelper.VER_10_BOLD, UIHelper.LIGHT_GREY_COLOR));
}
JPanel fieldContainer = new JPanel(new BorderLayout());
fieldContainer.setBackground(UIHelper.BG_COLOR);
fieldContainer.add(fields, BorderLayout.NORTH);
JScrollPane scrollPane = new JScrollPane(fieldContainer, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
IAppWidgetFactory.makeIAppScrollPane(scrollPane);
panel.setPreferredSize(new Dimension(300, 400));
scrollPane.setBorder(new EmptyBorder(30, 0, 0, 0));
panel.add(scrollPane, BorderLayout.CENTER);
// only add a button if we have fields to add to it.
if (addedFieldsCount > 0) {
final JPanel buttonContainer = new JPanel(new BorderLayout());
buttonContainer.setOpaque(false);
final JLabel fieldAddStatus = UIHelper.createLabel("", UIHelper.VER_10_BOLD, UIHelper.GREY_COLOR);
buttonContainer.add(fieldAddStatus, BorderLayout.WEST);
FlatButton button = new FlatButton(ButtonType.GREEN, "Add Field(s)");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent actionEvent) {
boolean errors = false;
int error_count = 0;
if (selectedFieldComponents.size() > 0) {
for (JCheckBox fieldToAdd : selectedFieldComponents) {
if (fieldToAdd.isEnabled() && okToAddField(fieldToAdd.getText())) {
addFieldsToDisplay(templateToFields.get(templateName).getFieldByName(fieldToAdd.getText()));
fieldToAdd.setSelected(false);
fieldToAdd.setEnabled(false);
} else {
errors = true;
error_count++;
}
}
selectedFieldComponents.clear();
fieldAddStatus.setText(errors ? String.format("%d fields already exist...", error_count) : "Field added successfully!");
fieldAddStatus.setForeground(errors ? UIHelper.RED_COLOR : UIHelper.GREY_COLOR);
} else {
fieldAddStatus.setText("No fields have been selected!");
}
timer = new Timer(3000, new ActionListener() {
public void actionPerformed(ActionEvent actionEvent) {
fieldAddStatus.setText("");
fieldAddStatus.setForeground(UIHelper.GREY_COLOR);
timer.stop();
}
});
timer.start();
}
});
buttonContainer.add(button, BorderLayout.EAST);
panel.add(buttonContainer, BorderLayout.SOUTH);
}
return panel;
}
private JPanel getAddCustomPanel() {
JPanel panel = new JPanel(new BorderLayout());
panel.setPreferredSize(new Dimension(300, 400));
panel.setBackground(UIHelper.BG_COLOR);
panel.add(UIHelper.createLabel("Add Custom Field to Interface"), BorderLayout.NORTH);
JPanel fieldPanel = new JPanel(new BorderLayout());
fieldPanel.setBorder(new EmptyBorder(30, 0, 0, 0));
fieldPanel.setBackground(UIHelper.BG_COLOR);
final JPanel field = new JPanel(new GridLayout(1, 3));
field.setBackground(UIHelper.BG_COLOR);
field.add(UIHelper.createLabel("Field name"));
final RoundedJTextField fieldName = new RoundedJTextField(20);
field.add(fieldName);
final JComboBox fieldType = new JComboBox(new String[]{"String", "Ontology term"});
field.add(fieldType);
fieldPanel.add(field, BorderLayout.NORTH);
panel.add(fieldPanel, BorderLayout.CENTER);
final JPanel buttonContainer = new JPanel(new BorderLayout());
buttonContainer.setOpaque(false);
final JLabel fieldAddStatus = UIHelper.createLabel("", UIHelper.VER_10_BOLD, UIHelper.GREY_COLOR);
buttonContainer.add(fieldAddStatus, BorderLayout.WEST);
FlatButton button = new FlatButton(ButtonType.GREEN, "Add Field");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent actionEvent) {
if (!fieldName.getText().isEmpty()) {
String fieldNameAsComment = transformFieldNameToComment(fieldName.getText());
if (okToAddField(fieldNameAsComment)) {
addFieldsToDisplay(new FieldObject(fieldNameAsComment, "",
DataTypes.resolveDataType(fieldType.getSelectedItem().toString()), "", false, false, false));
fieldAddStatus.setText("Field added successfully!");
} else {
fieldAddStatus.setForeground(UIHelper.RED_COLOR);
fieldAddStatus.setText("Field not added. Already exists!");
}
} else {
fieldAddStatus.setForeground(UIHelper.RED_COLOR);
fieldAddStatus.setText("Please enter a value!");
}
timer = new Timer(3000, new ActionListener() {
public void actionPerformed(ActionEvent actionEvent) {
fieldAddStatus.setText("");
fieldAddStatus.setForeground(UIHelper.GREY_COLOR);
timer.stop();
}
});
timer.start();
}
});
buttonContainer.add(button, BorderLayout.EAST);
panel.add(buttonContainer, BorderLayout.SOUTH);
return panel;
}
private String transformFieldNameToComment(String fieldName) {
return "Comment [" + fieldName + "]";
}
public abstract void addFieldsToDisplay(FieldObject fieldObject);
public abstract boolean okToAddField(String fieldName);
public abstract boolean isFieldAllowedInSection(String template, String fieldName);
}