package hep.aida.ref.plotter.style.registry;
import java.awt.GridBagConstraints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.BoxLayout;
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.JTextField;
import javax.swing.border.EtchedBorder;
import javax.swing.border.TitledBorder;
import org.freehep.application.Application;
public class JELRuleEditorPanel extends JPanel {
private String title;
private JTextField field;
private JPanel actionsPanel;
private JComboBox qualifiers;
private JComboBox logics;
private JComboBox operations;
private DefaultComboBoxModel noneModel;
private DefaultComboBoxModel intModel;
private DefaultComboBoxModel logicModel;
private DefaultComboBoxModel stringModel;
private DefaultComboBoxModel objectModel;
private JButton ok;
private JButton cancel;
private String oldText;
private JELRule rule;
public JELRuleEditorPanel() {
this(null);
}
public JELRuleEditorPanel(JELRule rule) {
this("JEL Rule Editor", rule);
}
public JELRuleEditorPanel(String title, JELRule rule) {
super();
this.title = title;
createActionsPanel();
initComponents();
if (rule != null) setRule(rule);
}
private void initComponents() {
field = new JTextField(40);
ok = new JButton("Set Rule");
ok.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ev) {
okAction();
}
});
cancel = new JButton("Cancel");
cancel.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ev) {
cancelAction();
}
});
GridBagConstraints gbc = new GridBagConstraints();
gbc.anchor = GridBagConstraints.WEST;
gbc.insets = new java.awt.Insets(2, 2, 2, 2);
JPanel rulePanel = new JPanel();
rulePanel.setLayout(new java.awt.GridBagLayout());
gbc.gridy=0; gbc.gridx=0;
rulePanel.add(new JLabel("Rule: "), gbc);
gbc.gridx=1;
rulePanel.add(field, gbc);
JPanel buttonPanel = new JPanel();
buttonPanel.setLayout(new java.awt.GridBagLayout());
gbc.gridy=0; gbc.gridx=0;
buttonPanel.add(cancel, gbc);
gbc.gridy=0; gbc.gridx=1;
buttonPanel.add(ok, gbc);
this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
this.setBorder(new TitledBorder(new EtchedBorder(), title));
if (actionsPanel != null) this.add(actionsPanel);
this.add(rulePanel);
this.add(buttonPanel);
}
// Create panel with help and actions
private void createActionsPanel() {
String[] qual = new String[] { "[NONE]", IStyleRule.OVERLAY_INDEX, IStyleRule.OVERLAY_TOTAL,
IStyleRule.REGION_INDEX, IStyleRule.REGION_TOTAL, IStyleRule.PATH,
IStyleRule.OBJECT, IStyleRule.OBJECT_TYPE, IStyleRule.ATTRIBUTE};
String[] none = new String[] { "[NONE]" };
String[] logic = new String[] { "[NONE]", " && ", " || ", " ( ", " ) " };
String[] integ = new String[] { "[NONE]", " == ", " != ", " >= ", " <= ", " > ", " < " };
String[] str = new String[] { "[NONE]", ".equals(\"\")", ".equalsIgnoreCase(\"\")", ".startsWith(\"\")",
".endsWith(\"\")", ".contains(\"\")",
".indexOf(\"\")", ".lastIndexOf(\"\")",
".toLowerCase(\"\")", ".toUpperCase(\"\")" };
String[] objm = new String[] { "[NONE]", ".getClass()", ".toString()" };
noneModel = new DefaultComboBoxModel(none);
intModel = new DefaultComboBoxModel(integ);
logicModel = new DefaultComboBoxModel(logic);
stringModel = new DefaultComboBoxModel(str);
objectModel = new DefaultComboBoxModel(objm);
qualifiers = new JComboBox(qual);
qualifiers.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
System.out.println("Qualifiers : "+e.getStateChange());
if (e.getStateChange() == ItemEvent.SELECTED) {
String message = (e.getItem() instanceof String) ? (String) e.getItem() : e.getItem().toString();
System.out.println("Qualifiers Selected: "+message);
if (!message.equals("[NONE]")) {
if (message.equals(IStyleRule.OVERLAY_INDEX) || message.equals(IStyleRule.OVERLAY_TOTAL) ||
message.equals(IStyleRule.REGION_INDEX) || message.equals(IStyleRule.REGION_TOTAL)) setIntModel();
else if (message.equals(IStyleRule.OBJECT)) setObjectModel();
else setStringModel();
addTextToTheRule(message);
} else setNoneModel();
}
}
});
logics = new JComboBox(logicModel);
logics.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
String message = (e.getItem() instanceof String) ? (String) e.getItem() : e.getItem().toString();
System.out.println("Logics Selected: "+message);
if (!message.equals("[NONE]")) {
addTextToTheRule(message);
logics.setSelectedIndex(0);
}
}
}
});
operations = new JComboBox(intModel);
operations.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
String message = (e.getItem() instanceof String) ? (String) e.getItem() : e.getItem().toString();
System.out.println("Qualifiers Selected: "+message);
if (!message.equals("[NONE]")) {
addTextToTheRule(message);
operations.setSelectedIndex(0);
qualifiers.setSelectedIndex(0);
}
}
}
});
// Create panel and pack everything together
GridBagConstraints gbc = new GridBagConstraints();
gbc.anchor = GridBagConstraints.WEST;
gbc.insets = new java.awt.Insets(2, 2, 2, 2);
actionsPanel = new JPanel();
actionsPanel.setLayout(new java.awt.GridBagLayout());
gbc.gridy=0; gbc.gridx=0;
actionsPanel.add(new JLabel(" Qualifiers: "), gbc);
gbc.gridx=1;
actionsPanel.add(qualifiers, gbc);
gbc.gridx=2;
actionsPanel.add(new JLabel(" Logics: "), gbc);
gbc.gridx=3;
actionsPanel.add(logics, gbc);
gbc.gridx=4;
actionsPanel.add(new JLabel(" Operations: "), gbc);
gbc.gridx=5;
actionsPanel.add(operations, gbc);
}
public JELRule getRule() { return rule; }
public void setRule(JELRule rule) {
this.rule = rule;
oldText = rule.getDescription();
if (oldText == null) oldText = "";
field.setText(oldText);
}
public boolean isModified() {
if (rule.getDescription() != null) {
if (!rule.getDescription().equals(field.getText())) return true;
if (!rule.getDescription().equals(oldText)) return true;
}
if (rule.getDescription() == null && field.getText() != null && !field.getText().trim().equals("")) return true;
else return false;
}
void okAction() {
try {
String tmp = field.getText();
rule.setDescription(tmp);
oldText = tmp;
} catch (Exception e) {
handleException(e);
}
}
void cancelAction() {
try {
rule.setDescription(oldText);
field.setText(oldText);
} catch (Exception e) {
handleException(e);
}
}
private void setNoneModel() { operations.setModel(noneModel); }
private void setIntModel() { operations.setModel(intModel); }
private void setStringModel() { operations.setModel(stringModel); }
private void setObjectModel() { operations.setModel(objectModel); }
private void addTextToTheRule(String text) {
String tmp = field.getText();
tmp += text;
field.setText(tmp);
}
private void handleException(Exception e) {
handleException("", e);
}
private void handleException(String message, Exception e) {
if (Application.getApplication() != null) Application.error(Application.getApplication(), message, e);
System.out.println("ERROR: "+ message+"\n");
if (e != null) e.printStackTrace();
}
public static void main(String[] args) {
JFrame frame = new JFrame("TesT");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JELRuleEditorPanel panel = new JELRuleEditorPanel(new JELRule());
frame.getContentPane().add(panel);
//frame.setSize(500, 300);
frame.pack();
frame.setVisible(true);
}
}