/**
*
*/
package org.korsakow.ide.ui.resources.cellrenderers;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.FontMetrics;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JList;
import javax.swing.JTextArea;
import javax.swing.ListCellRenderer;
import org.korsakow.ide.lang.LanguageBundle;
import org.korsakow.ide.ui.model.EventModel;
import org.korsakow.ide.ui.model.PredicateModel;
import org.korsakow.ide.ui.model.RuleModel;
import org.korsakow.services.plugin.predicate.PredicateTypeInfoFactory;
import org.korsakow.services.plugin.rule.RuleTypeInfoFactory;
public class EventModelListCellRenderer implements ListCellRenderer
{
private JTextArea renderer = new JTextArea();
public Component getListCellRendererComponent(
JList list, // the list
Object value, // value to display
int index, // cell index
boolean isSelected, // is the cell selected
boolean cellHasFocus) // does the cell have focus
{
adjustRendererText(value);
adjustRendererStyles(list, index, isSelected, cellHasFocus);
adjustSize(list); // must be called after text is set
return renderer;
}
private void adjustRendererText(Object value)
{
EventModel model = (EventModel)value;
String triggerString = model.getTrigger().getType().getDisplayName();
String predicateString = renderPredicate(model.getPredicate());
String ruleString = renderRule(model.getRule());
String display = LanguageBundle.getString("eventview.renderer.format", triggerString, predicateString, ruleString);
renderer.setText(display);
}
private void adjustRendererStyles(JList list, int index, boolean isSelected, boolean cellHasFocus)
{
if (isSelected || cellHasFocus) {
renderer.setBackground(list.getSelectionBackground());
renderer.setForeground(list.getSelectionForeground());
} else {
renderer.setBackground((index%2==0)?list.getBackground():(Color)list.getClientProperty("List.altBackground"));
renderer.setForeground(list.getForeground());
}
renderer.setWrapStyleWord(true);
renderer.setLineWrap(true);
}
/**
*/
private void adjustSize(JList list)
{
renderer.setSize(new Dimension(list.getWidth(), 0));
}
private static String renderRule(RuleModel ruleModel)
{
String display = RuleTypeInfoFactory.getFactory().getTypeInfo(ruleModel.getType().getId()).getFormattedDisplayString(ruleModel.getPropertyValues().toArray());
return display;
}
private static String renderPredicate(PredicateModel predicateModel)
{
List<String> flatList = new ArrayList<String>();
renderLeaves(flatList, predicateModel);
StringBuilder sb = new StringBuilder();
for (String s : flatList) {
sb.append(s).append(' ');
}
return sb.toString();
}
private static void renderLeaves(List<String> flatList, PredicateModel predicateModel)
{
if (predicateModel.getPredicates().isEmpty()) {
String predicateString = PredicateTypeInfoFactory.getFactory().getTypeInfo(predicateModel.getType().getId()).getFormattedDisplayString(predicateModel.getPropertyValues().toArray());
flatList.add(predicateString);
} else {
String predicateString = PredicateTypeInfoFactory.getFactory().getTypeInfo(predicateModel.getType().getId()).getFormattedDisplayString(predicateModel.getPropertyValues().toArray());
int i = -1;
for (PredicateModel model : predicateModel.getPredicates()) {
renderLeaves(flatList, model);
if (++i%2==0) // insert the parent(glue) between each child
flatList.add(predicateString);
}
}
}
private static int calculateHeight(String text, int maxWidth, JTextArea textArea, JList list)
{
FontMetrics metrics = textArea.getFontMetrics(textArea.getFont());
// int avgCharWidth = (int)(metrics.getStringBounds(text, textArea.getGraphics()).getWidth()/text.length());
int maxTextWidth = text.length()*metrics.getMaxAdvance();
int rows = maxTextWidth / maxWidth;
return (int)(rows * metrics.getLineMetrics(text, textArea.getGraphics()).getHeight());
}
}