package nbtool.gui;
import java.awt.ComponentOrientation;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BoxLayout;
import javax.swing.ButtonGroup;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import nbtool.data.json.JsonObject;
import nbtool.data.log.Log;
import nbtool.io.CommonIO.IOFirstResponder;
import nbtool.io.CommonIO.IOInstance;
import nbtool.nio.LogRPC;
import nbtool.nio.RobotConnection;
import nbtool.nio.RobotConnection.RobotFlag;
import nbtool.util.Debug;
public class FlagPanel extends JPanel implements ActionListener {
private static final long serialVersionUID = 1L;
private JRadioButton jrb[] = new JRadioButton[3];
private JLabel lbl;
private ButtonGroup bg;
public String flag_name;
public int index;
public RobotConnection robot;
private final int TOTAL_NAME_LENGTH = 40;
public FlagPanel(RobotConnection robot, RobotFlag flag) {
String name = flag.name;
int index = flag.index;
boolean value = flag.value;
this.robot = robot;
this.flag_name = name;
if (name.length() > TOTAL_NAME_LENGTH) {
Debug.error("flag name %s is longer than %d chars, this will mess up the GUI!", name,
TOTAL_NAME_LENGTH);
} else {
int nspace = TOTAL_NAME_LENGTH - name.length();
//even out lengths.
this.flag_name += new String(new char[nspace]).replace("\0", " ");
}
this.index = index;
this.setLayout(new BoxLayout(this, BoxLayout.LINE_AXIS));
lbl = new JLabel(this.flag_name);
lbl.setFont(new Font("monospaced", Font.PLAIN, 12));
add(lbl);
bg = new ButtonGroup();
jrb[0] = new JRadioButton("F");
jrb[0].applyComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
bg.add(jrb[0]);
add(jrb[0]);
jrb[1] = new JRadioButton("?");
jrb[1].applyComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
bg.add(jrb[1]);
add(jrb[1]);
jrb[2] = new JRadioButton("T");
jrb[2].applyComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
bg.add(jrb[2]);
add(jrb[2]);
jrb[0].addActionListener(this);
jrb[1].addActionListener(this);
jrb[2].addActionListener(this);
jrb[1].setEnabled(false);
lbl.setText(flag_name);
setKnown(value);
}
public void actionPerformed(ActionEvent e) {
if (robot == null || robot.finished()) {
Debug.error( "FlagPanel clicked while no RobotConnection available!");
this.setUnknown();
return;
}
if (e.getSource() == jrb[0]) {
LogRPC.setFlag(falseR, robot, index, false);
Debug.info( "FlagPanel[%s] on %s LogRPC.setFlag(%d, false)\n", flag_name, robot, index);
} else if (e.getSource() == jrb[1]) {
Debug.error( "ERROR: FlagPanel " + flag_name + " got action from MIDDLE switch!");
} else if (e.getSource() == jrb[2]) {
LogRPC.setFlag(trueR, robot, index, true);
Debug.info( "FlagPanel[%s] on %s LogRPC.setFlag(%d, true)\n", flag_name, robot, index);
} else {
Debug.error( "ERROR: FlagPanel " + flag_name + " got action from UNKNOWN!");
}
this.setUnknown();
}
private final IOFirstResponder falseR = new IOFirstResponder(){
@Override
public void ioFinished(IOInstance instance) {}
@Override
public void ioReceived(IOInstance inst, int ret, Log... out) {
assert(inst == robot);
setKnown(false);
}
@Override
public boolean ioMayRespondOnCenterThread(IOInstance inst) {
return false;
}
};
private final IOFirstResponder trueR = new IOFirstResponder(){
@Override
public void ioFinished(IOInstance instance) {}
@Override
public void ioReceived(IOInstance inst, int ret, Log... out) {
assert(inst == robot);
setKnown(true);
}
@Override
public boolean ioMayRespondOnCenterThread(IOInstance inst) {
return false;
}
};
public void setUnknown() {
jrb[0].setEnabled(false);
jrb[1].setSelected(true);
jrb[2].setEnabled(false);
}
public void setKnown(boolean v) {
jrb[v ? 2 : 0].setSelected(true);
jrb[0].setEnabled(true);
jrb[2].setEnabled(true);
}
}