/* 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 . */ /* * PrimitivePointer.java * * Created on March 12, 2008, 1:38 AM * * To change this template, choose Tools | Template Manager * and open the template in the editor. */ package dynamicmvc; import java.awt.BorderLayout; import java.awt.Component; import java.io.Serializable; import java.util.ArrayList; import java.util.HashMap; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JPanel; /** * * @author Brandon */ public class PrimitivePointer implements Serializable { public static long currentID = -1; public static long getNextID() { currentID++; return currentID; } private int address; public long id; /** Creates a new instance of PrimitivePointer */ public PrimitivePointer(int address) { this.setAddress(address); this.id = getNextID(); } public PrimitivePointer(int address, String name) { this.setAddress(address); setName(name); this.id = getNextID(); } public int getAddress() { return address; } public void setAddress(int address) { this.address = address; } public Primitive dereference() { return PrimitiveFactory.memory.get(address); } public PrimitivePointer copy() { return new PrimitivePointer(address, name); } public PrimitivePointer deepCopy(HashMap alreadyCopiedAddresses) throws DynamicMVCException { return PrimitiveFactory.deepCopy(this, alreadyCopiedAddresses); } public boolean deepEquals(PrimitivePointer o) throws DynamicMVCException { // just ignore system properties if (name.startsWith("__")) { return true; } boolean result = dereference().deepEquals(o.dereference()); if (!result && !name.equals("actualDifferences")) { // prepend the variable name DynamicController.errorMessage = this.name + ": " + DynamicController.errorMessage; } return result; } public boolean deepEquals(Primitive o) throws DynamicMVCException { if (name.startsWith("__")) { return true; } return dereference().deepEquals(o); } @Override public boolean equals(Object o) { if (o instanceof PrimitivePointer) { return equals((PrimitivePointer)o); } if (o instanceof Primitive) { return equals((Primitive)o); } return false; } public boolean equals(PrimitivePointer p) { try { return deepEquals(p); } catch (DynamicMVCException ex) { System.out.println(); return false; } } public boolean equals(Primitive p) { try { return deepEquals(p); } catch (DynamicMVCException ex) { System.out.println(); return false; } } public boolean valueEquals(PrimitivePointer p) { return dereference().valueEquals(p.dereference()); } public boolean valueEquals(Primitive p) { return dereference().valueEquals(p); } @Override public String toString() { return "{ '" + name + "' : '" + address + "' <" + dereference().toString() + "> }"; } protected String name; public void setName(String name) { this.name = name; } public String getName() { return name; } public JComponent getReadOnlyComponent() { // make sure to ignore system properties if (name.startsWith("__")) { return new JPanel(); } // wrap everything in a panel JPanel wrapper = new JPanel(); /* if (dereference().isResizable()) { wrapper = new ResizablePanel(this); } else { wrapper = new JPanel(); } **/ wrapper.setBorder(javax.swing.BorderFactory.createTitledBorder(getName())); wrapper.add(dereference().getReadOnlyComponent()); return wrapper; } public JComponent getEditComponent() { // make sure to ignore system properties if (name.startsWith("__")) { return new JPanel(); } // wrap everything in a panel JPanel wrapper; if (dereference().isResizable()) { wrapper = new ResizablePanel(this); } else { wrapper = new JPanel(); } wrapper.setBorder(javax.swing.BorderFactory.createTitledBorder(getName())); wrapper.setName(getEditComponentName()); if (dereference().getUpdateVariableName() == null || dereference().getUpdateVariableName().length() == 0) { dereference().setUpdateVariableName(name); wrapper.add(dereference().getEditComponent()); } else { wrapper.setLayout(new BorderLayout()); JLabel l = new JLabel(); l.setText("Please update this variable using: " + dereference().getUpdateVariableName()); wrapper.add(l, BorderLayout.NORTH); wrapper.add(dereference().getReadOnlyComponent(), BorderLayout.CENTER); } return wrapper; } public String getEditComponentName() { return "pnl" + id; } public void populateFromEditComponentWrapper(JComponent editComponentWrapper) throws DynamicMVCException { if (editComponentWrapper == null) { return; } if (dereference().getUpdateVariableName().length() == 0) { dereference().setUpdateVariableName(name); Component comp = View.getComponent(editComponentWrapper, getEditComponentName()); dereference().populateFromEditComponentWrapper((JComponent)comp); } } public Object execute(String methodName, ArrayList arguments) throws DynamicMVCException { return dereference().execute(methodName, arguments); } public void set(String name, PrimitivePointer value) { dereference().set(name, value); } public PrimitivePointer get(String name) throws DynamicMVCException { return dereference().get(name); } public void setEmptyProperties(PrimitivePointer other) throws DynamicMVCException { setEmptyProperties(other.dereference()); } public void setEmptyProperties(Primitive other) throws DynamicMVCException { dereference().setEmptyProperties(other); } }