ItlkNetEditor.java
import fr.esrf.tangoatk.widget.util.interlock.*;
import javax.swing.*;
import java.awt.*;
import java.io.IOException;
public class ItlkNetEditor extends NetEditor {
final static int ITLK_BUBBLE = 1; final static int SENSOR_BUBBLE = 2; final static int VCC_BUBBLE = 3; final static int GROUND_BUBBLE = 4; final static int JOIN_BUBBLE = 5;
private int createMode;
private NetObject theRoot;
class ItlkInfo {
boolean state; int nbHit; boolean storedResult; }
final static String[] bubbleExt = { "Type","Address" };
public ItlkNetEditor(JFrame parent) {
super(parent);
createMode = 0;
theRoot=null;
}
public void loadFile(String fileName) throws IOException {
super.loadFile(fileName);
if(!isEditable()) prepareObjects();
}
public void setEditable(boolean b) {
if(!b) prepareObjects();
super.setEditable(b);
}
public NetObject getRoot() {
return theRoot;
}
public void prepareObjects() {
for (int i = 0; i < getNetObjectNumber(); i++) {
NetObject o = getNetObjectAt(i);
if (o.getType() != NetObject.OBJECT_TEXT) {
o.setUserValue(new ItlkInfo());
getII(o).state = true;
o.setColor(Color.GREEN);
}
}
}
private void resetLogic() {
for (int i = 0; i < getNetObjectNumber(); i++) {
NetObject o = getNetObjectAt(i);
if (o.getType() != NetObject.OBJECT_TEXT) {
getII(o).nbHit = o.getParentNumber();
getII(o).storedResult = false;
}
}
}
private void computeState(Graphics2D g,NetObject o,boolean curState) {
if (getII(o).nbHit > 1) {
getII(o).storedResult = getII(o).storedResult || curState;
getII(o).nbHit--;
} else {
switch (o.getUserType()) {
case ITLK_BUBBLE:
if (getII(o).state)
propagateState(g, o, curState);
else
propagateState(g, o, false);
break;
case VCC_BUBBLE:
propagateState(g, o, curState);
break;
case SENSOR_BUBBLE:
if (!curState)
o.setColor(Color.RED);
else
o.setColor(Color.GREEN);
propagateState(g, o, curState);
break;
case JOIN_BUBBLE:
if (o.getParentNumber() > 1) {
getII(o).storedResult |= curState;
propagateState(g, o, getII(o).storedResult);
} else {
propagateState(g, o, curState);
}
break;
}
}
}
private void propagateState(Graphics2D g, NetObject o,boolean curState) {
for (int i = 0; i < o.getChildrenNumber(); i++) {
NetObject c = o.getChildAt(i);
if( curState ) {
g.setColor(Color.GREEN);
} else {
g.setColor(Color.RED);
}
o.paintLink(g,c,false);
computeState(g, c,curState);
}
}
public void swapItlkState(NetObject o) {
getII(o).state = !getII(o).state;
if( getII(o).state ) {
o.setColor(Color.GREEN);
} else {
o.setColor(Color.RED);
}
repaint();
}
private ItlkInfo getII(NetObject o) {
return (ItlkInfo)o.getUserValue();
}
public void setCreateMode(int type,int userType) {
createMode = userType;
setCreateMode(type);
}
public NetObject createBubbleObject(int x,int y) {
NetObject ret = null;
switch(createMode) {
case ITLK_BUBBLE:
ret = new NetObject(NetObject.OBJECT_BUBBLE,ITLK_BUBBLE,1,1,x,y);
ret.setShape(NetShape.SHAPE_CIRCLE);
ret.setExtensionList(bubbleExt);
ret.setEditableShape(false);
break;
case SENSOR_BUBBLE:
ret = new NetObject(NetObject.OBJECT_BUBBLE,SENSOR_BUBBLE,1,1,x,y);
ret.setShape(NetShape.SHAPE_SQUARE);
ret.setEditableShape(false);
ret.setSize(9);
break;
case VCC_BUBBLE:
ret = new NetObject(NetObject.OBJECT_BUBBLE,VCC_BUBBLE,0,1,x,y);
ret.setShape(NetShape.SHAPE_VCC);
ret.setEditableShape(false);
ret.setLabel("Vcc");
break;
case GROUND_BUBBLE:
ret = new NetObject(NetObject.OBJECT_BUBBLE,GROUND_BUBBLE,1,0,x,y);
ret.setShape(NetShape.SHAPE_GROUND);
ret.setEditableShape(false);
break;
case JOIN_BUBBLE:
ret = new NetObject(NetObject.OBJECT_BUBBLE,JOIN_BUBBLE,10,10,x,y);
ret.setShape(NetShape.SHAPE_DOT);
ret.setEditableShape(false);
break;
}
return ret;
}
public boolean addObject(NetObject o) {
if (o == null)
return false;
if (o.getUserType() == VCC_BUBBLE) {
if (theRoot != null) {
JOptionPane.showMessageDialog(getParentFrame(), "Cannot add a new VCC object. Only 1 accepted",
"Error", JOptionPane.ERROR_MESSAGE);
return false;
} else {
theRoot = o;
}
}
return super.addObject(o);
}
public void removeObject(NetObject o) {
if(theRoot==o) theRoot=null;
super.removeObject(o);
}
public void clearObjects() {
theRoot=null;
super.clearObjects();
}
public void paintLinks(Graphics2D g2) {
if(!isEditable()) {
resetLogic();
if(theRoot!=null) computeState(g2,theRoot,true);
} else {
super.paintLinks(g2);
}
}
public void paintObjects(Graphics2D g2) {
for(int i=0;i < getNetObjectNumber();i++) {
NetObject o = getNetObjectAt(i);
if(o.getUserType()==ITLK_BUBBLE) {
o.setCenterLabel(o.getExtendedParam(0 ));
o.setBottomLabel(o.getExtendedParam(1 ));
}
}
super.paintObjects(g2);
}
}