package gve.calc.formula;
import java.awt.*;
public class OperatorUnion extends InfixBinaryOp {
public String getName() { return "union"; }
public int getPri() { return 1500; }
public OperatorUnion(Part l,Part r) {
super(l,r);
}
public Part union(Part a,Part b) {
if (!(a instanceof Brackets) || !(b instanceof Brackets))
return new OperatorUnion((Part)a.clone(),(Part)b.clone());
if (((Brackets)a).getKind()!=Brackets.CURLY || ((Brackets)b).getKind() != Brackets.CURLY)
return new OperatorUnion((Part)a.clone(),(Part)b.clone());
Part result = (Part)((Brackets)a).child.clone();
// Voeg elementen van b erbij
CommaEnumerator benum = new CommaEnumerator(((Brackets)b).child);
while (benum.hasMoreElements()) {
Part el = benum.nextPart();
if (OperatorSet.in(el,result)) continue;
// voeg toe
el = (Part)el.clone();
if (result == null) result = el;
else if (result instanceof Identifier && ((Identifier)result).isEmpty())
result = el;
else result = new OperatorComma(result,el);
}
return result;
}
public Part evaluate(Evaluator ev) {
Part l = Brackets.unbracket(left.evaluate(ev));
Part r = Brackets.unbracket(right.evaluate(ev));
if (!(l instanceof Brackets)) return null;
if (((Brackets)l).getKind() != Brackets.CURLY) return null;
if (!(r instanceof Brackets)) return null;
if (((Brackets)r).getKind() != Brackets.CURLY) return null;
Part result = ((Brackets)l).child;
Part rset = ((Brackets)r).child;
CommaEnumerator renum = new CommaEnumerator(rset);
while (renum.hasMoreElements()) {
Part element = renum.nextPart();
if (OperatorSet.in(element,result)) continue;
// add element to result
// Important: add element to front of list
// (new OoperatorComma(element,result) has the priorities bad)
result = new OperatorComma((Part)element.clone(),result);
}
return new Brackets(result,Brackets.CURLY);
}
public static Part read(java.io.BufferedReader r) throws java.io.IOException,
ClassNotFoundException,NoSuchMethodException,
java.lang.reflect.InvocationTargetException,IllegalAccessException{
Part left = Part.read(r);
Part right = Part.read(r);
return new OperatorUnion(left,right);
}
public boolean same(Object o) {
o = Brackets.unbracket(o);
if (!(o instanceof OperatorUnion)) return false;
OperatorUnion obj = (OperatorUnion)o;
return left.same(obj.left) && right.same(obj.right);
}
public Component createView(FormulaView view) {
return new InfixBinaryOpView(this,view,new OperatorUnionSymbolView(getName()));
}
}
class OperatorUnionSymbolView extends TextSymbolView {
public OperatorUnionSymbolView(String txt) { super(txt); }
public Dimension getSymbolSize() {
FontMetrics metrics = getFontMetrics(getFont());
return new Dimension(metrics.charWidth(' ')*2,metrics.getHeight());
}
public void paintSymbol(Graphics g) {
int spatWidth = g.getFontMetrics().charWidth(' ');
int mBase = g.getFontMetrics().getAscent();
int opWidth = spatWidth*2;
// vertical bars of U
g.drawLine(0,0,0,mBase/2);
g.drawLine(opWidth-1,0,opWidth-1,mBase/2);
// half circle
g.drawArc(0,0,spatWidth*2-1,mBase,180,180);
}
}