package org.korsakow.ide.ui.resources;
import java.awt.Dimension;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.Collection;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.DefaultComboBoxModel;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ListCellRenderer;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import org.korsakow.ide.lang.LanguageBundle;
import org.korsakow.ide.resources.PredicateType;
import org.korsakow.ide.resources.TriggerType;
import org.korsakow.ide.rules.RuleType;
import org.korsakow.ide.ui.components.layout.VerticalFlowLayout;
import org.korsakow.ide.ui.components.model.KComboboxModel;
import org.korsakow.ide.ui.resources.cellrenderers.PredicateModelListCellRenderer;
import org.korsakow.ide.ui.resources.cellrenderers.PredicateTypeListCellRenderer;
import org.korsakow.ide.ui.resources.cellrenderers.RuleTypeListCellRenderer;
import org.korsakow.ide.ui.resources.cellrenderers.TriggerTypeListCellRenderer;
import org.korsakow.ide.util.UIHelper;
import org.korsakow.ide.util.UIResourceManager;
public class EventEditor extends JPanel
{
public static final String AND = LanguageBundle.getString("eventeditor.and");
public static final String OR = LanguageBundle.getString("eventeditor.or");
public static final String[] AndOr = {
AND,
OR,
};
private JComboBox whenCombo;
private JLabel whenLabel;
private JComboBox ifCombo;
private JComboBox ifArgCombo;
private JLabel ifArgLabel;
private JComponent ifArgPanel;
private JList ifList;
private JButton addIfButton;
private JButton deleteIfButton;
private JComboBox ifListAndOrCombo;
private JComboBox thenCombo;
private JLabel thenArgLabel;
private JComboBox thenArgCombo;
private JComponent thenArgPanel;
public EventEditor()
{
init();
initListeners();
}
public void init()
{
setLayout(new VerticalFlowLayout(VerticalFlowLayout.TOP));
setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
JPanel whenPanel = UIHelper.createHorizontalFlowLayoutPanel(
whenCombo = new JComboBox(),
whenLabel = new JLabel("")
);
whenLabel.setVisible(false);
add(UIHelper.createLabelPanel("", LanguageBundle.getString("eventeditor.when.label"), whenPanel));
whenCombo.setRenderer(new TriggerTypeListCellRenderer());
JPanel thenPanel;
add(thenPanel =
UIHelper.createHorizontalFlowLayoutPanel(
UIHelper.createLabelPanel("", LanguageBundle.getString("eventeditor.then.label"), thenCombo = new JComboBox()),
Box.createHorizontalStrut(20),
thenArgPanel = UIHelper.createWestEastPanel(
thenArgLabel = new JLabel(),
Box.createHorizontalStrut(5),
thenArgCombo = new JComboBox()
)
)
);
thenCombo.setRenderer(new RuleTypeListCellRenderer());
thenPanel.setAlignmentX(JPanel.LEFT_ALIGNMENT);
thenArgPanel.setVisible(false);
// thenPanel.add(thenArgCombo);
add(Box.createVerticalStrut(30));
JPanel ifPanel;
add(ifPanel =
UIHelper.createWestEastPanel(
UIHelper.createHorizontalFlowLayoutPanel(
addIfButton = new JButton(UIResourceManager.getIcon(UIResourceManager.ICON_ADD)),
UIHelper.createLabelPanel("", LanguageBundle.getString("eventeditor.if.label"), ifCombo = new JComboBox()),
Box.createHorizontalStrut(20),
ifArgPanel = UIHelper.createWestEastPanel(
ifArgLabel = new JLabel(),
Box.createHorizontalStrut(5),
ifArgCombo = new JComboBox()
)
),
ifListAndOrCombo = new JComboBox(new DefaultComboBoxModel(AndOr))
)
);
// add(ifArgCombo);
ifCombo.setRenderer(new PredicateTypeListCellRenderer());
ifArgPanel.setVisible(false);
addIfButton.setEnabled(false);
ifPanel.setAlignmentX(JPanel.LEFT_ALIGNMENT);
Box ifListPanel = Box.createVerticalBox();
add(ifListPanel);
JScrollPane ifListScroll;
ifListPanel.add(ifListScroll = new JScrollPane(ifList = new JList()));
ifList.setCellRenderer(new PredicateModelListCellRenderer());
ifListScroll.setPreferredSize(new Dimension(Short.MAX_VALUE, Short.MAX_VALUE));
ifListScroll.setAlignmentX(JComponent.RIGHT_ALIGNMENT);
JPanel ifButtonPanel;
ifListPanel.add(ifButtonPanel = UIHelper.createHorizontalBoxLayoutPanel(
Box.createHorizontalGlue(),
addIfButton,
deleteIfButton = new JButton(UIResourceManager.getIcon(UIResourceManager.ICON_DELETE)
)));
ifButtonPanel.setAlignmentX(JComponent.RIGHT_ALIGNMENT);
deleteIfButton.setEnabled(false);
ifListPanel.setAlignmentX(JPanel.LEFT_ALIGNMENT);
ifListPanel.add(Box.createVerticalGlue());
}
public void initListeners()
{
ifList.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
deleteIfButton.setEnabled(ifList.getModel().getSize() != 0);
}
});
ifCombo.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
addIfButton.setEnabled(ifCombo.getSelectedItem() != null);
}
});
}
public void setWhenEditable(boolean editable)
{
whenCombo.setVisible(editable);
whenLabel.setVisible(!editable);
}
public void setWhen(TriggerType value)
{
whenCombo.setSelectedItem(value);
whenLabel.setText(value.getDisplayName());
}
public TriggerType getWhen()
{
return (TriggerType)whenCombo.getSelectedItem();
}
public void setWhenChoices(Collection<TriggerType> choices)
{
whenCombo.setModel(new KComboboxModel(choices));
}
public void setIf(PredicateType value)
{
ifCombo.setSelectedItem(value);
}
public PredicateType getIf()
{
return (PredicateType)ifCombo.getSelectedItem();
}
public void setIfChoices(Collection<PredicateType> choices)
{
ifCombo.setModel(new KComboboxModel(choices));
addIfButton.setEnabled(ifCombo.getSelectedItem() != null);
}
public void setIfListModel(DefaultListModel model)
{
ifList.setModel(model);
}
public void removeSelectedIf()
{
Object selected = ifList.getSelectedValue();
if (selected != null)
getIfListModel().removeElement(selected);
}
public DefaultListModel getIfListModel()
{
return (DefaultListModel)ifList.getModel();
}
public void setIfArgVisible(boolean visible)
{
ifArgPanel.setVisible(visible);
}
public void setIfArgLabel(String label)
{
ifArgLabel.setText(label);
}
/**
* @param renderer may be null, as when you just would pass an empty @choices to clear the list
*/
public void setIfArgChoices(Collection<?> choices, boolean editable, ListCellRenderer renderer)
{
// setModel causes a repaint so the order of these two operations is important
if (renderer != null)
ifArgCombo.setRenderer(renderer);
// ifArgCombo.setEditable(editable); // disabled until proper support for free editing validation
ifArgCombo.setModel(new KComboboxModel(choices));
}
public void setIfArg(Object value)
{
ifArgCombo.setSelectedItem(value);
}
public Object getIfArg()
{
return ifArgCombo.getSelectedItem();
}
public Object getIfListAndOr()
{
return ifListAndOrCombo.getSelectedItem();
}
public void setIfListAndOr(Object value)
{
ifListAndOrCombo.setSelectedItem(value);
}
public void setThen(RuleType value)
{
thenCombo.setSelectedItem(value);
}
public RuleType getThen()
{
return (RuleType)thenCombo.getSelectedItem();
}
public void setThenChoices(Collection<RuleType> choices)
{
thenCombo.setModel(new KComboboxModel(choices));
}
public void setThenArgVisible(boolean visible)
{
thenArgPanel.setVisible(visible);
}
public void setThenArgLabel(String label)
{
thenArgLabel.setText(label);
}
/**
* @param renderer may be null, as when you just would pass an empty @choices to clear the list
*/
public void setThenArgChoices(Collection<?> choices, boolean editable, ListCellRenderer renderer)
{
// setModel causes a repaint so the order of these two operations is important
if (renderer != null)
thenArgCombo.setRenderer(renderer);
// thenArgCombo.setEditable(editable); // disabled until proper support for free editing validation
thenArgCombo.setModel(new KComboboxModel(choices));
}
public void setThenArg(Object value)
{
thenArgCombo.setSelectedItem(value);
}
public Object getThenArg()
{
return thenArgCombo.getSelectedItem();
}
public void addWhenChangeListener(ActionListener listener)
{
whenCombo.addActionListener(listener);
}
public void addIfChangeListener(ActionListener listener)
{
ifCombo.addActionListener(listener);
}
public void addThenChangeListener(ActionListener listener)
{
thenCombo.addActionListener(listener);
}
public void addAddIfButtonActionListener(ActionListener listener)
{
addIfButton.addActionListener(listener);
}
public void addDeleteIfButtonActionListener(ActionListener listener)
{
deleteIfButton.addActionListener(listener);
}
}