/* PseudoCode Interpreted Language (PCIL): Part of the algoviz@vt collection of algorithm visualizations. Copyright (C) 2008 Brandon Malone, Frank Hadlock This file is part of the PseudoCode Interpreted Language. PseudoCode Interpreted Language is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. PseudoCode Interpreted Language is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with PseudoCode Interpreted Language. If not, see . */ /* * PrimitiveVertex.java * * Created on March 6, 2008, 6:35 PM * * To change this template, choose Tools | Template Manager * and open the template in the editor. */ package dynamicmvc; import java.awt.Color; import java.awt.Graphics; import java.awt.geom.Ellipse2D; import java.util.ArrayList; import java.util.HashMap; import javax.swing.JComponent; import javax.swing.JPanel; /** * * @author Brandon */ public class PrimitiveVertex extends Primitive { public static String pseudocodeTypeName() { return "Vertex"; } public String getType() { return pseudocodeTypeName(); } private static int radius = 10; // private PrimitivePointer value; private String name; private PrimitivePointer color; private Color c; private PrimitivePointer x; private PrimitivePointer y; private PrimitivePointer edges; // // public Primitive copy() throws DynamicMVCException { PrimitiveVertex v = new PrimitiveVertex(name, getValue(), getColor(), getX(), getY(), getEdges()); v.setDefinedProperties(getDefinedPropertiesCopy()); return v; } public Primitive deepCopy(HashMap alreadyCopiedAddresses) throws DynamicMVCException { PrimitivePointer p = getPointer(); if (alreadyCopiedAddresses.containsKey(Integer.valueOf(p.getAddress()))) { return PrimitiveFactory.getFromMemory(alreadyCopiedAddresses.get(p.getAddress())); } PrimitivePointer pp = PrimitiveFactory.create(pseudocodeTypeName(), name); alreadyCopiedAddresses.put(p.getAddress(), pp.getAddress()); PrimitiveVertex v = (PrimitiveVertex)pp.dereference(); v.setName(name); v.setValue(value.deepCopy(alreadyCopiedAddresses)); v.setC(c); v.setColor(color.deepCopy(alreadyCopiedAddresses)); v.setX(x.deepCopy(alreadyCopiedAddresses)); v.setY(y.deepCopy(alreadyCopiedAddresses)); v.setEdges(edges.deepCopy(alreadyCopiedAddresses)); super.deepCopyDefinedProperties(v, alreadyCopiedAddresses); return v; } public boolean deepEquals(Primitive p) throws DynamicMVCException { if (!(p instanceof PrimitiveVertex)) { DynamicController.errorMessage = "Expecting Vertex, but found " + p.getType(); return false; } PrimitiveVertex v = (PrimitiveVertex)p; if(!value.deepEquals(v.getValue())) { return false; } // LIMITATIONS OF TESTING /* if (!color.deepEquals(v.getColor())) { return false; } if (!x.deepEquals(v.getX())) { return false; } if(!y.deepEquals(v.getY())) { return false; } if (!edges.deepEquals(v.getEdges())) { return false; } */ return super.deepEqualsDefinedProperties(p); } public void set(Primitive other) throws DynamicMVCException { throw new DynamicMVCException("Vertex set."); //this.reset(other); // if other is an integer, copy its values /*if (other instanceof PrimitiveVertex) { assign((PrimitiveVertex)other); } else { // otherwise, throw an DynamicMVCException throw new DynamicMVCException("Invalid assignment."); }*/ } public PrimitiveVertex(String name, PrimitivePointer value, PrimitivePointer color, PrimitivePointer x, PrimitivePointer y, PrimitivePointer edges) throws DynamicMVCException { setName(name); setValue(value); setColor(color); setX(x); setY(y); setEdges(edges); getEdges().setName("edges"); getValue().setName("Value"); } public PrimitiveVertex(String name, PrimitivePointer x, PrimitivePointer y) { PrimitivePointer color = PrimitiveFactory.create(PrimitiveString.pseudocodeTypeName(), "color"); PrimitivePointer edges = PrimitiveFactory.create(PrimitiveList.pseudocodeTypeName(), "edges"); PrimitivePointer value = PrimitiveFactory.create(PrimitiveString.pseudocodeTypeName(), "value"); ((PrimitiveString)value.dereference()).setValue(name); setName(name); setValue(value); setColor(color); setX(x); setY(y); setEdges(edges); getEdges().setName("edges"); } public PrimitiveVertex() { super(); PrimitivePointer name = PrimitiveFactory.create(PrimitiveString.pseudocodeTypeName(), "name"); PrimitivePointer value = PrimitiveFactory.create(PrimitiveString.pseudocodeTypeName(), "value"); PrimitivePointer color = PrimitiveFactory.create(PrimitiveString.pseudocodeTypeName(), "color"); PrimitivePointer x = PrimitiveFactory.create(PrimitiveInteger.pseudocodeTypeName(), "x"); PrimitivePointer y = PrimitiveFactory.create(PrimitiveInteger.pseudocodeTypeName(), "y"); PrimitivePointer edges = PrimitiveFactory.create(PrimitiveList.pseudocodeTypeName(), "edges"); setName(((PrimitiveString)name.dereference()).getValue()); setValue(value); setColor(color); setX(x); setY(y); setEdges(edges); } // // public PrimitivePointer getValue() { return value; } public void setValue(PrimitivePointer value) { this.value = value; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Color getC() { return c; } public void setC(Color c) { this.c = c; } public PrimitivePointer getColor() { return color; } public void setColor(PrimitivePointer color) { this.color = color; } // // public void populateFromEditComponentWrapper(JComponent editComponentWrapper) throws DynamicMVCException { String valueName = value.getEditComponentName(); JComponent valueChild = (JComponent)View.getComponent(editComponentWrapper, valueName); value.populateFromEditComponentWrapper(valueChild); // need to populate properties JComponent propertiesComponent = (JComponent)View.getComponent(editComponentWrapper, this.getPropertiesComponentName()); super.populateDefinedProperties(propertiesComponent); } public String getEditComponentWrapperName() { return "pnl" + getName(); } public String getEditComponentValue() { return "txt" + getName() + "value"; } public JComponent getEditComponent() { // wrap everything in a panel JPanel wrapper = new JPanel(); wrapper.setName(getEditComponentWrapperName()); // create a label to display the number wrapper.add(value.getEditComponent()); super.addEditDefinedProperties(wrapper); return wrapper; } public JComponent getReadOnlyComponent() { // wrap everything in a panel JPanel wrapper = new JPanel(); // create a label to display the number wrapper.add(value.getReadOnlyComponent()); addDefinedProperties(wrapper); return wrapper; } // public PrimitivePointer get(String name) throws DynamicMVCException { if (name.equalsIgnoreCase("value")) { return value; } else if (name.equalsIgnoreCase("color")) { return color; } else if (name.equalsIgnoreCase("x")) { return x; } else if (name.equalsIgnoreCase("y")) { return y; } else if (name.equalsIgnoreCase("color")) { return color; } else if (name.equalsIgnoreCase("neighbors")) { return getNeighbors(); } else if (name.equalsIgnoreCase("edges")) { return getEdges(); } PrimitivePointer p = super.get(name); if (p == null) { PrimitivePointer var = PrimitiveFactory.create(PrimitiveString.pseudocodeTypeName(), name); super.set(name, var); p = super.get(name); } return p; //throw new DynamicMVCException(this.getName() + " does not contain a property named:'" + name + "'."); } public PrimitivePointer getNeighbors() throws DynamicMVCException { PrimitivePointer np = PrimitiveFactory.create(PrimitiveList.pseudocodeTypeName(), "neighbors"); PrimitiveList neighbors = (PrimitiveList)np.dereference(); for(PrimitivePointer p : ((PrimitiveList)edges.dereference()).getList()) { PrimitiveEdge e = (PrimitiveEdge)p.dereference(); neighbors.add(e.findOtherVertex(this)); } return np; } public Object execute(String methodName, ArrayList arguments) throws DynamicMVCException { // is this a method of mine? if (methodName.equalsIgnoreCase("equals")) { return equals(arguments); } else if (methodName.equalsIgnoreCase("notEqual")) { return !equals(arguments); } else if (methodName.equalsIgnoreCase("addEdge")) { addEdge(arguments); return null; } else if (methodName.equalsIgnoreCase("distance")) { return distance(arguments); } else { throw new DynamicMVCException("Invalid method name:'" + methodName + "' on object '" + getName() + "'."); } } public PrimitivePointer distance(ArrayList arguments) throws DynamicMVCException { if (arguments.size() == 1) { PrimitivePointer v = arguments.get(0); return distance(v); } else { throw new DynamicMVCException("Wrong number of arguments."); } } public PrimitivePointer distance(PrimitivePointer v) { PrimitiveInteger myX = ((PrimitiveInteger)getX().dereference()); PrimitiveInteger myY = ((PrimitiveInteger)getY().dereference()); PrimitivePointer otherX = ((PrimitiveVertex)v.dereference()).getX(); PrimitivePointer otherY = ((PrimitiveVertex)v.dereference()).getY(); PrimitivePointer dx = myX.subtract(otherX); PrimitivePointer dy = myY.subtract(otherY); PrimitiveInteger iDX = (PrimitiveInteger)dx.dereference(); PrimitiveInteger iDY = (PrimitiveInteger)dy.dereference(); PrimitivePointer underRadical = ((PrimitiveInteger)iDX.multiply(dx).dereference()).add(iDY.multiply(dy)); int result = (int)Math.sqrt(((PrimitiveInteger)underRadical.dereference()).getValue()); PrimitivePointer res = PrimitiveFactory.create(PrimitiveInteger.pseudocodeTypeName(), ""); ((PrimitiveInteger)res.dereference()).setValue(result); return res; } public int compareTo(Object o) throws DynamicMVCException { if (o instanceof PrimitiveVertex) { PrimitiveVertex i = (PrimitiveVertex)o; return compareTo(i); } throw new DynamicMVCException("Invalid comparison"); } public boolean equals(ArrayList arguments) throws DynamicMVCException { if (arguments.size() == 1) { PrimitiveVertex i = (PrimitiveVertex)arguments.get(0); return equals(i); } throw new DynamicMVCException("Wrong number of arguments."); } public boolean equals(PrimitiveVertex i) throws DynamicMVCException { return (compareTo(i) == 0); } public int compareTo(ArrayList arguments) throws DynamicMVCException { if (arguments.size() == 1) { PrimitiveVertex i = (PrimitiveVertex)arguments.get(0); return compareTo(i); } throw new DynamicMVCException("Wrong number of arguments."); } public int compareTo(PrimitiveVertex i) throws DynamicMVCException { PrimitiveString otherValue = (PrimitiveString)i.getValue().dereference(); return ((PrimitiveString)getValue().dereference()).compareTo(otherValue); } public int compareTo(Primitive p) throws DynamicMVCException { if (p instanceof PrimitiveVertex) { return compareTo((PrimitiveVertex)p); } else { throw new DynamicMVCException("Invalid type."); } } public void addEdge(ArrayList arguments) throws DynamicMVCException { if (arguments.size() == 1) { PrimitivePointer e = arguments.get(0); addEdge(e); } throw new DynamicMVCException("Wrong number of arguments."); } public void addEdge(PrimitivePointer e) { ((PrimitiveList)getEdges().dereference()).add(e); } public String toString() { return getName() + ": " + getValue() + ": " + getColor(); } public boolean contains(int x, int y) { int thisX = ((PrimitiveInteger)getX().dereference()).getValue(); int thisY = ((PrimitiveInteger)getY().dereference()).getValue(); Ellipse2D.Double oval = new java.awt.geom.Ellipse2D.Double(thisX - getRadius(),thisY - getRadius(), (int)(2 * getRadius()), (int)(2 * getRadius())); return oval.contains(x, y); } public void draw(Graphics g, PrimitiveVertex v) { paintOval(g, v); paintText(g); } private void paintOval(Graphics g, PrimitiveVertex v) { int thisX = ((PrimitiveInteger)getX().dereference()).getValue(); int thisY = ((PrimitiveInteger)getY().dereference()).getValue(); g.setColor(c); if (this == v) { g.setColor(Color.green); } g.fillOval(thisX - getRadius(),thisY - getRadius(), (int)(2 * getRadius()), (int)(2 * getRadius())); } private void paintText(Graphics g) { int thisX = ((PrimitiveInteger)getX().dereference()).getValue(); int thisY = ((PrimitiveInteger)getY().dereference()).getValue(); g.setColor(java.awt.Color.WHITE); g.drawString(getName(), thisX, thisY + getRadius()/2); } public static int getRadius() { return radius; } public static void setRadius(int aRadius) { radius = aRadius; } public PrimitivePointer getX() { return x; } public void setX(PrimitivePointer x) { this.x = x; } public PrimitivePointer getY() { return y; } public void setY(PrimitivePointer y) { this.y = y; } public PrimitivePointer getEdges() { return edges; } public void setEdges(PrimitivePointer edges) { this.edges = edges; } public PrimitiveString toPrimitiveString() { PrimitiveString s = (PrimitiveString)(PrimitiveFactory.create(PrimitiveString.pseudocodeTypeName(), "s").dereference()); s.setValue(toString()); return s; } }