package nars.lab.grid2d.gui;
import java.awt.BorderLayout;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import nars.entity.Concept;
import nars.entity.TaskLink;
import nars.lab.grid2d.main.Cell.Logic;
import nars.lab.grid2d.main.Cell.Machine;
import nars.lab.grid2d.main.Cell.Material;
import nars.lab.grid2d.main.Grid2DSpace;
import nars.lab.grid2d.main.GridAgent;
import nars.lab.grid2d.main.GridObject;
import nars.lab.grid2d.main.Hauto;
import nars.lab.grid2d.main.LocalGridObject;
import nars.lab.grid2d.main.TestChamber;
import nars.lab.grid2d.object.Key;
import nars.lab.grid2d.object.Pizza;
import nars.io.Symbols;
import org.parboiled.common.FileUtils;
import processing.core.PVector;
/**
*
* @author me
*/
public class EditorPanel extends JPanel {
final String levelPath = "./nars_lab/nars/lab/grid2d/level/";
abstract public static class EditorMode extends DefaultMutableTreeNode {
public EditorMode(String label) {
super(label);
}
abstract public void run();
}
public EditorPanel(final Grid2DSpace s) {
super(new BorderLayout());
DefaultMutableTreeNode root = new DefaultMutableTreeNode();
DefaultMutableTreeNode structMenu = new DefaultMutableTreeNode("Structural");
root.add(structMenu);
DefaultMutableTreeNode logicMenu = new DefaultMutableTreeNode("Logic");
root.add(logicMenu);
DefaultMutableTreeNode machineMenu = new DefaultMutableTreeNode("Machine");
root.add(machineMenu);
DefaultMutableTreeNode actionMenu = new DefaultMutableTreeNode("Force Action");
root.add(actionMenu);
DefaultMutableTreeNode goalMenu = new DefaultMutableTreeNode("Request Goal");
root.add(goalMenu);
DefaultMutableTreeNode knowMenu = new DefaultMutableTreeNode("Predefine knowledge");
root.add(knowMenu);
DefaultMutableTreeNode resourceMenu = new DefaultMutableTreeNode("Need of Resources");
root.add(resourceMenu);
DefaultMutableTreeNode mindSettings = new DefaultMutableTreeNode("Advanced Settings");
root.add(mindSettings);
mindSettings.add(new EditorMode("Delete all desires") {
@Override
public void run() {
for(Concept c : s.nar.memory) {
if(c.desires!=null && !c.desires.isEmpty()) {
c.desires.clear();
}
ArrayList<TaskLink> toDelete=new ArrayList<TaskLink>();
for(TaskLink T : c.taskLinks) {
if(T.targetTask.sentence.punctuation==Symbols.GOAL_MARK) {
toDelete.add(T);
}
}
for(TaskLink T : toDelete) {
c.taskLinks.take(T);
}
}
}
});
mindSettings.add(new EditorMode("Allow joy in action") {
@Override
public void run() {
Hauto.allow_imitating=true;
}
});
mindSettings.add(new EditorMode("Don't allow joy") {
@Override
public void run() {
Hauto.allow_imitating=false;
}
});
mindSettings.add(new EditorMode("Goal input periodic") {
@Override
public void run() {
Hauto.goalInputPeriodic=true;
}
});
mindSettings.add(new EditorMode("Goal input once") {
@Override
public void run() {
Hauto.goalInputPeriodic=false;
}
});
mindSettings.add(new EditorMode("Tell object categories") {
@Override
public void run() {
TestChamber.staticInformation=true;
}
});
mindSettings.add(new EditorMode("Don't tell object categories") {
@Override
public void run() {
TestChamber.staticInformation=false;
}
});
mindSettings.add(new EditorMode("Use complex feedback") {
@Override
public void run() {
TestChamber.ComplexFeedback=true;
}
});
mindSettings.add(new EditorMode("Don't use complex feedback") {
@Override
public void run() {
TestChamber.ComplexFeedback=false;
}
});
//ComplexFeedback
DefaultMutableTreeNode load = new DefaultMutableTreeNode("Load Scenario");
root.add(load);
DefaultMutableTreeNode save = new DefaultMutableTreeNode("Save Scenario");
root.add(save);
File f = new File(levelPath); // current directory
File[] files = f.listFiles();
for (File file : files) {
boolean is_file=false;
if (!file.isDirectory()) {
if(file.getName().endsWith(".lvl")) {
try {
String path=file.getCanonicalPath();
String name=file.getName();
load.add(new EditorMode(name) {
@Override
public void run() {
String allText = FileUtils.readAllText(path);
//todo: fill level according to read text
String[] values=allText.split("OBJECTS")[0].split(";");
for(String cell : values) {
String[] c=cell.split(",");
if(c.length<14) {
continue;
}
if(!c[11].equals("") && !c[11].contains("{")) {
c[11]="{"+c[11]+"}";
}
int i=Integer.valueOf(c[0]);
int j=Integer.valueOf(c[1]);
s.cells.readCells[i][j].charge=Float.valueOf(c[2]);
s.cells.writeCells[i][j].charge=Float.valueOf(c[2]);
s.cells.readCells[i][j].chargeFront=Boolean.valueOf(c[3]);
s.cells.writeCells[i][j].chargeFront=Boolean.valueOf(c[3]);
s.cells.readCells[i][j].conductivity=Float.valueOf(c[4]);
s.cells.writeCells[i][j].conductivity=Float.valueOf(c[4]);
s.cells.readCells[i][j].height=Float.valueOf(c[5]);
s.cells.writeCells[i][j].height=Float.valueOf(c[5]);
s.cells.readCells[i][j].is_solid=Boolean.valueOf(c[6]);
s.cells.writeCells[i][j].is_solid=Boolean.valueOf(c[6]);
s.cells.readCells[i][j].light=Float.valueOf(c[7]);
s.cells.writeCells[i][j].light=Float.valueOf(c[7]);
s.cells.readCells[i][j].logic=Logic.values()[Integer.valueOf(c[8])];
s.cells.writeCells[i][j].logic=Logic.values()[Integer.valueOf(c[8])];
if(s.cells.readCells[i][j].logic==Logic.SWITCH) {
if(TestChamber.staticInformation)
s.nar.addInput("<"+c[11]+" --> switch>.");
if(s.cells.readCells[i][j].light==1.0f) {
//s.nar.addInput("<"+c[11]+" --> on>. :|:");
}
else {
//s.nar.addInput("<"+c[11]+" --> off>.");
}
}
if(s.cells.readCells[i][j].logic==Logic.OFFSWITCH) {
if(TestChamber.staticInformation)
s.nar.addInput("<"+c[11]+" --> switch>.");
if(s.cells.readCells[i][j].light==1.0f) {
//s.nar.addInput("<"+c[11]+" --> on>. :|:");
}
else {
//s.nar.addInput("<"+c[11]+" --> off>. :|:");
}
}
if(!c[9].equals("")) {
s.cells.readCells[i][j].machine=Machine.values()[Integer.valueOf(c[9])];
s.cells.writeCells[i][j].machine=Machine.values()[Integer.valueOf(c[9])];
if(s.cells.readCells[i][j].machine==Machine.Turret) {
if(TestChamber.staticInformation)
s.nar.addInput("<"+c[11]+" --> oven>.");
if(s.cells.readCells[i][j].light==1.0f) {
//s.nar.addInput("<"+c[11]+" --> on>. :|:");
}
else {
//s.nar.addInput("<"+c[11]+" --> off>. :|:");
}
}
if(s.cells.readCells[i][j].machine==Machine.Light) {
if(TestChamber.staticInformation)
s.nar.addInput("<"+c[11]+" --> light>.");
if(s.cells.readCells[i][j].light==1.0f) {
//s.nar.addInput("<"+c[11]+" --> on>. :|:");
}
else {
//s.nar.addInput("<"+c[11]+" --> off>. :|:");
}
}
} else {
s.cells.readCells[i][j].machine=null;
s.cells.writeCells[i][j].machine=null;
}
s.cells.readCells[i][j].material=Material.values()[Integer.valueOf(c[10])];
s.cells.writeCells[i][j].material=Material.values()[Integer.valueOf(c[10])];
if(s.cells.readCells[i][j].material==Material.Door) {
if(TestChamber.staticInformation)
s.nar.addInput("<"+c[11]+" --> door>.");
//s.nar.addInput("<"+c[11]+" --> closed>. :|:");
}
s.cells.readCells[i][j].name=c[11];
s.cells.writeCells[i][j].name=c[11];
try {
if(!c[11].equals("")) {
String value=c[11].replaceAll("[A-Za-z]","").replaceAll("\\}", "").replaceAll("\\{", "");
int res=Integer.parseInt(value);
if(res>Hauto.entityID) {
Hauto.entityID=res+1;
}
}
}
catch(Exception ex){}
s.cells.readCells[i][j].value=Float.valueOf(c[12]);
s.cells.writeCells[i][j].value=Float.valueOf(c[12]);
s.cells.readCells[i][j].value2=Float.valueOf(c[13]);
s.cells.writeCells[i][j].value2=Float.valueOf(c[13]);
}
String[] objs=allText.split("OBJECTS")[1].split(";");
ArrayList<GridObject> newobj=new ArrayList<>(); //new ArrayList we have to fill
for(String obj : objs) {
if(obj.equals("\n"))
continue;
String[] val=obj.split(",");
if(val.length<=1) {
continue;
}
if(!val[1].equals("") && !val[1].contains("{")) {
val[1]="{"+val[1]+"}";
}
String name=val[1];
try {
if(!name.equals("")) {
String value=name.replaceAll("[A-Za-z]","");
int res=Integer.parseInt(value);
if(res>Hauto.entityID) {
Hauto.entityID=res+1;
}
}
}
catch(Exception ex){}
float cx=Float.valueOf(val[2]);
float cy=Float.valueOf(val[3]);
int x=Integer.valueOf(val[5]);
int y=Integer.valueOf(val[6]);
if(val[0].equals("GridAgent")) {
for(GridObject z : s.objects) {
if(z instanceof GridAgent) {
((GridAgent)z).cx=cx;
((GridAgent)z).cy=cy;
((GridAgent)z).x=x;
((GridAgent)z).y=y;
newobj.add(z);
s.target=new PVector(x,y);
s.current=new PVector(x,y);
}
}
}
if(val[0].equals("Key")) {
Key addu=new Key(x,y,name);
if(TestChamber.staticInformation)
s.nar.addInput("<"+name+" --> Key>.");
addu.space=s;
newobj.add(addu);
}
if(val[0].equals("Pizza")) {
Pizza addu=new Pizza(x,y,name);
if(TestChamber.staticInformation)
s.nar.addInput("<"+name+" --> pizza>.");
addu.space=s;
newobj.add(addu);
}
}
s.objects=newobj;
}
});
} catch (IOException ex) {
System.out.println("not able to get path of "+file.getName());
}
}
}
}
save.add(new EditorMode("Save") {
@Override
public void run() {
//todo save to new file with file name dummy_i
String filename= JOptionPane.showInputDialog("What is the name of the level?: ")+".lvl";
filename = levelPath + filename;
StringBuilder wr=new StringBuilder();
for(int i=0;i<s.cells.h;i++) { //its not python, we have to export it to file ourselves:
for(int j=0;j<s.cells.w;j++) {
wr.append(String.valueOf(i)).append(","); //also store coordinates, for case we may change size one day
wr.append(String.valueOf(j)).append(",");
wr.append(String.valueOf(s.cells.readCells[i][j].charge)).append(",");
wr.append(String.valueOf(s.cells.readCells[i][j].chargeFront)).append(",");
wr.append(String.valueOf(s.cells.readCells[i][j].conductivity)).append(",");
wr.append(String.valueOf(s.cells.readCells[i][j].height)).append(",");
wr.append(String.valueOf(s.cells.readCells[i][j].is_solid)).append(",");
wr.append(String.valueOf(s.cells.readCells[i][j].light)).append(",");
wr.append(String.valueOf(s.cells.readCells[i][j].logic.ordinal())).append(",");
if(s.cells.readCells[i][j].machine!=null) { //wtf enum can be null? kk its java..
wr.append(String.valueOf(s.cells.readCells[i][j].machine.ordinal())).append(",");
}
else
wr.append(",");
wr.append(String.valueOf(s.cells.readCells[i][j].material.ordinal())).append(",");
wr.append(String.valueOf(s.cells.readCells[i][j].name)).append(",");
wr.append(String.valueOf(s.cells.readCells[i][j].value)).append(",");
wr.append(String.valueOf(s.cells.readCells[i][j].value2)).append(";");
}
}
wr.append("OBJECTS");
for(GridObject s : s.objects) {
if(s instanceof LocalGridObject) {
LocalGridObject toSave=(LocalGridObject) s;
boolean export=false;
if(s instanceof GridAgent) {
export=true;
wr.append("GridAgent"+",");
}
if(s instanceof Key) {
export=true;
wr.append("Key"+",");
}
if(s instanceof Pizza) {
export=true;
wr.append("Pizza"+",");
}
wr.append(String.valueOf(toSave.doorname)).append(",");
wr.append(String.valueOf(toSave.cx)).append(",");
wr.append(String.valueOf(toSave.cy)).append(",");
wr.append(String.valueOf(toSave.cheading)).append(",");
wr.append(String.valueOf(toSave.x)).append(",");
wr.append(String.valueOf(toSave.y)).append(";");
}
}
try {
PrintWriter outw = new PrintWriter(filename);
outw.write(wr.toString());
outw.flush();
outw.close();
} catch (FileNotFoundException ex) {
System.out.println("impossible");
}
}
});
// DefaultMutableTreeNode extraMenu = new DefaultMutableTreeNode("Extra");
// root.add(extraMenu);
DefaultTreeModel model = new DefaultTreeModel(root);
final JTree toolTree = new JTree(model);
toolTree.expandRow(0);
add(new JScrollPane(toolTree), BorderLayout.CENTER);
toolTree.addTreeSelectionListener(new TreeSelectionListener() {
@Override
public void valueChanged(TreeSelectionEvent e) {
Object o = toolTree.getLastSelectedPathComponent();
if (o instanceof EditorMode) {
EditorMode m = (EditorMode) o;
m.run();
}
}
});
structMenu.add(new EditorMode("Stone Wall") {
@Override
public void run() {
s.cells.click("StoneWall", "", "");
}
});
structMenu.add(new EditorMode("Dirt Floor") {
@Override
public void run() {
s.cells.click("DirtFloor", "", "");
}
});
structMenu.add(new EditorMode("Grass Floor") {
@Override
public void run() {
s.cells.click("GrassFloor", "", "");
}
});
structMenu.add(new EditorMode("Water") {
@Override
public void run() {
s.cells.click("Water", "", "");
}
});
logicMenu.add(new EditorMode("On Wire") {
@Override
public void run() {
s.cells.click("OnWire", "", "");
}
});
logicMenu.add(new EditorMode("Off Wire") {
@Override
public void run() {
s.cells.click("OffWire", "", "");
}
});
logicMenu.add(new EditorMode("And") {
@Override
public void run() {
s.cells.click("AND", "", "");
}
});
logicMenu.add(new EditorMode("Or") {
@Override
public void run() {
s.cells.click("OR", "", "");
}
});
logicMenu.add(new EditorMode("Xor") {
@Override
public void run() {
s.cells.click("XOR", "", "");
}
});
logicMenu.add(new EditorMode("Not") {
@Override
public void run() {
s.cells.click("NOT", "", "");
}
});
logicMenu.add(new EditorMode("Bridge") {
@Override
public void run() {
s.cells.click("bridge", "", "");
}
});
logicMenu.add(new EditorMode("Uncertain50PercentBridge") {
@Override
public void run() {
s.cells.click("uncertainbridge", "", "");
}
});
logicMenu.add(new EditorMode("Off Switch") {
@Override
public void run() {
s.cells.click("offswitch", "", "");
}
});
logicMenu.add(new EditorMode("On Switch") {
@Override
public void run() {
s.cells.click("onswitch", "", "");
}
});
machineMenu.add(new EditorMode("Light") {
@Override
public void run() {
s.cells.click("Light", "", "");
}
});
//since oven doesnt serve a special functionality yet
machineMenu.add(new EditorMode("Oven") {
@Override public void run() { s.cells.click("Turret","",""); }
});
machineMenu.add(new EditorMode("Door and Key") {
@Override
public void run() {
s.cells.click("Door", "", "");
}
});
actionMenu.add(new EditorMode("Go-To named") {
@Override
public void run() {
s.cells.click("", "go-to", "");
TestChamber.active=true;
}
});
actionMenu.add(new EditorMode("Pick named") {
@Override
public void run() {
s.cells.click("", "pick", "");
TestChamber.active=true;
}
});
actionMenu.add(new EditorMode("activate switch") {
@Override
public void run() {
s.cells.click("", "activate", "");
TestChamber.active=true;
}
});
actionMenu.add(new EditorMode("deactivate switch") {
@Override
public void run() {
s.cells.click("", "deactivate", "");
TestChamber.active=true;
}
});
actionMenu.add(new EditorMode("perceive/name") {
@Override
public void run() {
s.cells.click("", "perceive", "");
}
});
EditorMode wu=new EditorMode("try things") {
@Override
public void run() {
TestChamber.curiousity=true;
TestChamber.active=true;
int cnt=0;
for (GridObject g : s.objects) {
if (g instanceof LocalGridObject) {
LocalGridObject obi = (LocalGridObject) g;
if (obi instanceof Key) {
//s.nar.addInput("<(^go-to," + obi.doorname + ") =/> <Self --> [curious]>>.");
//s.nar.addInput("<(^pick," + obi.doorname + ") =/> <Self --> [curious]>>.");
cnt+=2;
}
if (obi instanceof Pizza) {
//s.nar.addInput("<(^go-to," + obi.doorname + ") =/> <Self --> [curious]>>.");
cnt+=1;
}
}
}
for (int i = 0; i < s.cells.w; i++) {
for (int j = 0; j < s.cells.h; j++) {
if (s.cells.readCells[i][j].name.startsWith("switch") || s.cells.readCells[i][j].name.startsWith("place")) {
//s.nar.addInput("<(^go-to," + s.cells.readCells[i][j].name + ") =/> <Self --> [curious]>>.");
cnt+=1;
}
if (s.cells.readCells[i][j].logic == Logic.SWITCH || s.cells.readCells[i][j].logic == Logic.OFFSWITCH) {
s.nar.addInput("<(&/,"+"(^go-to,"+s.cells.readCells[i][j].name+"),(^activate," + s.cells.readCells[i][j].name + ")) =/> <Self --> [curious]>>.");
s.nar.addInput("<(&/,"+"(^go-to,"+s.cells.readCells[i][j].name+"),(^deactivate," + s.cells.readCells[i][j].name + ")) =/> <Self --> [curious]>>.");
cnt+=1;
}
}
}
s.nar.addInput("<<Self --> [curious]> =/> <Self --> [exploring]>>.");
s.nar.addInput("<<Self --> [curious]> =/> <Self --> [exploring]>>.");
s.nar.addInput("<Self --> [curious]>!");
s.nar.addInput("<Self --> [curious]>!");
s.nar.addInput("<Self --> [exploring]>!");
s.nar.addInput("<Self --> [exploring]>!"); //testing with multiple goals
}
};
goalMenu.add(wu);
goalMenu.add(new EditorMode("be somewhere") {
@Override
public void run() {
TestChamber.active=true;
s.cells.click("", "", "at");
}
});
goalMenu.add(new EditorMode("hold something") {
@Override
public void run() {
TestChamber.active=true;
s.cells.click("", "", "hold");
}
});
goalMenu.add(new EditorMode("make switched on") {
@Override
public void run() {
TestChamber.active=true;
s.cells.click("", "", "on");
}
});
goalMenu.add(new EditorMode("make switched off") {
@Override
public void run() {
TestChamber.active=true;
s.cells.click("", "", "off");
}
});
goalMenu.add(new EditorMode("make opened") {
@Override
public void run() {
TestChamber.active=true;
s.cells.click("", "", "opened");
}
});
goalMenu.add(new EditorMode("make closed") {
@Override
public void run() {
TestChamber.active=true;
s.cells.click("", "", "closed");
}
});
goalMenu.add(new EditorMode("be chatty") {
@Override
public void run() {
TestChamber.active=true;
s.nar.addInput("<<$1 --> [on]> <|> <(*,$1,SHOULD,BE,SWITCHED,ON) --> sentence>>.");
s.nar.addInput("<(--,<$1 --> [on]>) <|> <(*,$1,SHOULD,BE,OFF) --> sentence>>.");
s.nar.addInput("<<$1 --> [opened]> <|> <(*,$1,SHOULD,BE,OPENED) --> sentence>>.");
s.nar.addInput("<(--,<$1 --> [opened]>) <|> <(*,$1,IS,CLOSED) --> sentence>>.");
s.nar.addInput("<<$1 --> [hold]> <|> <(*,I,HOLD,$1) --> sentence>>.");
s.nar.addInput("<<$1 --> [at]> <|> <(*,I,AM,AT,$1) --> sentence>>.");
s.nar.addInput("<(^pick,$1) <|> <(*,I,PICK,$1) --> sentence>>.");
s.nar.addInput("<(^activate,$1) <|> <(*,I,ACTIVATE,$1) --> sentence>>.");
s.nar.addInput("<(^deactivate,$1) <|> <(*,I,DEACTIVATE,$1) --> sentence>>.");
s.nar.addInput("<(^go-to,$1) <|> <(*,I,GO,TO,$1) --> sentence>>.");
s.nar.addInput("<(&&,<$1 --> sentence>,(^say,$1)) =/> <SELF --> chatty>>.");
s.nar.addInput("<SELF --> chatty>!");
s.nar.addInput("<SELF --> chatty>!");
s.nar.addInput("<SELF --> chatty>!");
s.nar.addInput("<SELF --> chatty>!");
s.nar.addInput("<SELF --> chatty>!");
}
});
knowMenu.add(new EditorMode("common sense") {
@Override
public void run() {
s.nar.addInput("<(&/,<$1 --> [at]>,(^pick,$1)) =/> <$1 --> [hold]>>.");
s.nar.addInput("<(^go-to,$1) =/> <$1 --> [at]>>.");
s.nar.addInput("<(&/,<$1 --> [at]>,(^activate,$1)) =/> <$1 --> [on]>>.");
s.nar.addInput("(--,<(&/,<$1 --> [at]>,(^deactivate,$1)) =/> <$1 --> [on]>>). %1.00;0.90%");
//s.nar.addInput("(&&,<#1 --> on>,<<#1 --> on> =/> <#2 --> on>>).");
//s.nar.addInput("(&&,<#1 --> on>,<<#1 --> on> =/> <#2 --> opened>>).");
}
});
knowMenu.add(new EditorMode("if you go to somewhere you will be there") {
@Override
public void run() {
s.nar.addInput("<(^go-to,$1) =/> <$1 --> [at]>>.");
}
});
knowMenu.add(new EditorMode("if you are somewhere and you pick whats there, you will hold it") {
@Override
public void run() { /*s.nar.addInput("<(&/,<$1 --> at>,(^pick,$1)) =/> <$1 --> hold>>."); */
for (GridObject g : s.objects) {
if (g instanceof LocalGridObject) {
LocalGridObject obi = (LocalGridObject) g;
if (obi instanceof Key) {
s.nar.addInput("<(&/,<" + obi.doorname + " --> [at]>,(^pick," + obi.doorname + ")) =/> <" + obi.doorname + " --> [hold]>>.");
}
}
}
/*s.nar.addInput("<(&/,<key0 --> at>,(^pick,key0)) =/> <key0 --> hold>>.");
s.nar.addInput("<(&/,<key1 --> at>,(^pick,key1)) =/> <key1 --> hold>>.");
s.nar.addInput("<(&/,<key2 --> at>,(^pick,key2)) =/> <key2 --> hold>>.");
s.nar.addInput("<(&/,<key3 --> at>,(^pick,key3)) =/> <key3 --> hold>>.");*/
}
}); //s.nar.addInput("<(&/,<$1 --> at>,(^pick,$1)) =/> <$1 --> hold>>.");
resourceMenu.add(new EditorMode("need pizza") {
@Override
public void run() {
//s.nar.addInput("<(&&,<$1 --> pizza>,(^go-to,$1)) =/> <$1 --> eat>>."); //also works but better:
//s.nar.addInput("<(^go-to,$1) =/> <$1 --> [at]>>.");
TestChamber.needpizza=true;
}
});
resourceMenu.add(new EditorMode("pizza") {
@Override
public void run() {
s.cells.click("Pizza", "", "");
}
});
}
}