/*
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);
}
}