package nars.gui.input;
import automenta.vivisect.swing.NWindow;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTree;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
/**
<<<<<<< HEAD
=======
/**
>>>>>>> origin/graphplan1
*
* @author me
*/
public class NarseseTemplatePanel {
abstract static class TemplateElement { }
static class Budget extends TemplateElement { }
static class Text extends TemplateElement {
public final String value;
public Text(String value) {
this.value = value;
}
@Override public String toString() {
return value.trim();
}
}
static class Concept extends TemplateElement {
String id;
public Concept(String id) {
this.id = id;
}
@Override public String toString() {
return '#' + id;
}
}
static class Truth extends TemplateElement { }
public static class NarseseTemplate {
public final Map<String,Concept> concepts = new HashMap();
public final Map<String,List<TemplateElement>> forms = new HashMap();
public NarseseTemplate(String narsese, String english) {
forms.put("narsese", parse(narsese));
forms.put("en", parse(english));
}
public List<TemplateElement> parse(String p) /*throws InvalidTemplateException*/ {
Pattern P = Pattern.compile("~t|~b|~\\#[\\D]|[.]+");
Matcher m = P.matcher(p);
List<String> pieces = new ArrayList();
int i = 0;
while (m.find()) {
if (m.start() > i) {
pieces.add(p.substring(i, m.start()));
}
pieces.add(m.group());
i = m.end();
}
if (p.length() > i) {
pieces.add(p.substring(i, p.length()));
}
List<TemplateElement> l = new LinkedList();
for (String a : pieces) {
if (a.equals("~t"))
l.add(new Truth());
else if (a.equals("~b"))
l.add(new Budget());
else if (a.startsWith("~#"))
l.add(new Concept(a.substring(2)));
else
l.add(new Text(a));
}
System.out.println(l);
//TODO check for unbalanced variables
return l;
}
@Override
public String toString() {
return getSummaryString("en");
}
private String getSummaryString(String form) {
StringBuilder s = new StringBuilder();
for (TemplateElement e : forms.get(form)) {
if (!form.equals("narsese") && (!(e instanceof Text) || (e instanceof Concept)))
continue;
s.append(e.toString()).append(" ");
}
return s.toString();
}
}
public static JPanel newPanel(NarseseTemplate t, String form) {
JPanel p = new JPanel(new FlowLayout());
List<TemplateElement> l = t.forms.get(form);
for (TemplateElement e : l) {
if (e instanceof Text) {
Text text = (Text)e;
p.add(new JLabel(text.value));
}
else if (e instanceof Concept) {
p.add(new JComboBox());
}
else if (e instanceof Truth) {
p.add(new JLabel("[truth]"));
}
else if (e instanceof Budget) {
p.add(new JLabel("[budget]"));
}
}
return p;
}
public static JPanel newPanel(final NarseseTemplate t) {
final JPanel p = new JPanel(new BorderLayout());
final JComboBox formSelect = new JComboBox();
p.add(formSelect, BorderLayout.WEST);
for (String f : t.forms.keySet())
formSelect.addItem(f);
ActionListener change = new ActionListener() {
JPanel r = null;
@Override public void actionPerformed(ActionEvent e) {
if (r!=null) {
p.remove(r);
}
r = newPanel(t, formSelect.getSelectedItem().toString());
p.add(r, BorderLayout.CENTER);
p.validate();
}
};
formSelect.addActionListener(change);
change.actionPerformed(null);
return p;
}
private static JPanel newPanel(List<NarseseTemplate> templates) {
JPanel p = new JPanel(new BorderLayout());
JPanel menu = new JPanel(new BorderLayout());
DefaultMutableTreeNode tree = new DefaultMutableTreeNode();
for (NarseseTemplate n : templates) {
DefaultMutableTreeNode nt = new DefaultMutableTreeNode(n);
tree.add(nt);
}
JTree t = new JTree(tree);
menu.add(t, BorderLayout.CENTER);
final JComboBox formSelect = new JComboBox();
formSelect.addItem("en");
formSelect.addItem("narsese");
menu.add(formSelect, BorderLayout.NORTH);
p.add(menu, BorderLayout.WEST);
ActionListener change = new ActionListener() {
JPanel r = null;
@Override public void actionPerformed(ActionEvent e) {
if (t.getSelectionModel().isSelectionEmpty()) return;
Object o =
((DefaultMutableTreeNode)t.getSelectionModel().getSelectionPath().getLastPathComponent()).getUserObject();
if (!(o instanceof NarseseTemplate))
return;
if (r!=null) {
p.remove(r);
}
r = newPanel((NarseseTemplate)o, formSelect.getSelectedItem().toString());
p.add(r, BorderLayout.CENTER);
p.validate();
}
};
formSelect.addActionListener(change);
t.getSelectionModel().addTreeSelectionListener(new TreeSelectionListener() {
@Override
public void valueChanged(TreeSelectionEvent e) {
change.actionPerformed(null);
}
});
change.actionPerformed(null);
return p;
}
public static void main(String[] args) {
List<NarseseTemplate> templates = new ArrayList();
templates.addAll(Arrays.asList( new NarseseTemplate[] {
new NarseseTemplate("<~#a--> ~#b>? %~t%", "Is ~#a is a ~#b? ~t"),
new NarseseTemplate("<~#a--> ~#b>. %~t%", "~#a is a ~#b. ~t"),
new NarseseTemplate("<~#a --> ~#b>. %1.00;0.99%", "~#a is a ~#b."),
new NarseseTemplate("<~#a --> ~#b>. %0.00;0.99%", "~#a is not a ~#b."),
new NarseseTemplate("<~#a --> ~#b>. %1.00;0.50%", "~#a is possibly a ~#b."),
new NarseseTemplate("<~#a --> ~#b>. %0.00;0.50%", "~#a is possibly not a ~#b."),
}));
NWindow w = new NWindow("NarseseTemplatePanel test", NarseseTemplatePanel.newPanel(templates) );
w.setSize(400, 200);
w.setVisible(true);
}
}