/*
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
.
*/
/*
* PrimitiveDictionary.java
*
* Created on August 19, 2008, 9:27 PM
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package dynamicmvc;
import java.util.ArrayList;
import java.util.HashMap;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JPanel;
/**
*
* @author Brandon
*/
public class PrimitiveDictionary extends Primitive {
public static String pseudocodeTypeName() {
return "Dictionary";
}
public String getType() {
return pseudocodeTypeName();
}
private String name;
HashMap dictionary;
/** Creates a new instance of PrimitiveDictionary */
public PrimitiveDictionary() {
super();
dictionary = new HashMap();
}
public JComponent getReadOnlyComponent(){
// wrap everything in a panel
JPanel wrapper = new JPanel();
wrapper.setName(getEditComponentWrapperName());
// for each thing in the pq
for(PrimitivePointer key : dictionary.keySet()) {
JPanel w = new JPanel();
w.setBorder(BorderFactory.createEtchedBorder());
PrimitivePointer value = dictionary.get(key);
String keyName = key.getName();
String valueName = value.getName();
key.setName("key");
value.setName("value");
w.add(key.getReadOnlyComponent());
w.add(value.getReadOnlyComponent());
key.setName(keyName);
value.setName(valueName);
wrapper.add(w);
}
return wrapper;
}
public JComponent getEditComponent(){
// wrap everything in a panel
JPanel wrapper = new JPanel();
wrapper.setName(getEditComponentWrapperName());
// for each thing in the pq
for(PrimitivePointer key : dictionary.keySet()) {
JPanel w = new JPanel();
PrimitivePointer value = dictionary.get(key);
String keyName = key.getName();
String valueName = value.getName();
key.setName("key");
value.setName("value");
w.add(key.getReadOnlyComponent());
w.add(value.getReadOnlyComponent());
key.setName(keyName);
value.setName(valueName);
wrapper.add(w);
}
JButton addButton = new JButton();
addButton.setText("Add Entry");
//addButton.addActionListener(new AddHandler());
wrapper.add(addButton);
return wrapper;
}
public String getEditComponentWrapperName(){
return "pnl" + name;
}
public void populateFromEditComponentWrapper(JComponent editComponentWrapper) throws DynamicMVCException{
// just populate each of the array values
for(PrimitivePointer key : dictionary.keySet()) {
PrimitivePointer value = dictionary.get(key);
String keyName = key.getEditComponentName();
String valueName = value.getEditComponentName();
JComponent keyChild = (JComponent)View.getComponent(editComponentWrapper, keyName);
JComponent valueChild = (JComponent)View.getComponent(editComponentWrapper, valueName);
key.populateFromEditComponentWrapper(keyChild);
value.populateFromEditComponentWrapper(valueChild);
}
}
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
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());
PrimitiveDictionary d = (PrimitiveDictionary)pp.dereference();
d.setName(name);
for(PrimitivePointer key : dictionary.keySet()) {
PrimitivePointer value = dictionary.get(key);
d.put(key.deepCopy(alreadyCopiedAddresses), value.deepCopy(alreadyCopiedAddresses));
}
super.deepCopyDefinedProperties(d, alreadyCopiedAddresses);
return d;
}
public boolean deepEquals(Primitive p) throws DynamicMVCException {
if (!(p instanceof PrimitiveDictionary)) {
DynamicController.errorMessage = "Expecting Dictionary, but found " + p.getType();
return false;
}
PrimitiveDictionary o = (PrimitiveDictionary)p;
/*
if (pq.size() != o.getPq().size()) {
DynamicController.errorMessage = "Wrong priority queue size. Expecting '" + pq.size() + "', but found '" + o.getPq().size() + "'.";
return false;
}
Iterator me = pq.iterator();
Iterator him = o.getPq().iterator();
for(int i = 0; i < pq.size(); i++) {
PrimitivePointer myP = me.next();
PrimitivePointer otherP = him.next();
if (!myP.deepEquals(otherP)) {
return false;
}
}
**/
return super.deepEqualsDefinedProperties(p);
}
public PrimitivePointer execute(String methodName, ArrayList arguments) throws DynamicMVCException{
if (methodName.equalsIgnoreCase("elements")) {
return elements(arguments);
} else if (methodName.equalsIgnoreCase("get")) {
return get(arguments);
} else if (methodName.equalsIgnoreCase("isEmpty")) {
return isEmpty(arguments);
} else if (methodName.equalsIgnoreCase("keys")) {
return keys(arguments);
} else if (methodName.equalsIgnoreCase("put")) {
return put(arguments);
} else if (methodName.equalsIgnoreCase("remove")) {
return remove(arguments);
} else if (methodName.equalsIgnoreCase("size")) {
return size(arguments);
} else if (methodName.equalsIgnoreCase("contains")) {
return contains(arguments);
}
throw new DynamicMVCException ("Object: '" + name + "' does not support method '" + methodName + "'.");
}
public PrimitivePointer remove(ArrayList arguments) throws DynamicMVCException {
if (arguments.size() == 1) {
PrimitivePointer i = arguments.get(0);
return remove(i);
} else {
throw new DynamicMVCException("Wrong number of arguments.");
}
}
public PrimitivePointer remove(PrimitivePointer key) throws DynamicMVCException {
for(PrimitivePointer k : dictionary.keySet()) {
if (k.deepEquals(key)) {
return dictionary.remove(k);
}
}
PrimitivePointer n = PrimitiveFactory.create(PrimitiveNull.pseudocodeTypeName(), "null");
return n;
}
public PrimitivePointer size(ArrayList arguments) throws DynamicMVCException {
if (arguments.size() == 0) {
return size();
} else {
throw new DynamicMVCException("Wrong number of arguments.");
}
}
public PrimitivePointer size() {
PrimitivePointer p = PrimitiveFactory.create(PrimitiveInteger.pseudocodeTypeName(), "");
((PrimitiveInteger)p.dereference()).setValue(dictionary.size());
return p;
}
public PrimitivePointer isEmpty(ArrayList arguments) throws DynamicMVCException {
if (arguments.size() == 0) {
return isEmpty();
} else {
throw new DynamicMVCException("Wrong number of arguments.");
}
}
public PrimitivePointer isEmpty() {
PrimitivePointer p = PrimitiveFactory.create(PrimitiveBoolean.pseudocodeTypeName(), "");
((PrimitiveBoolean)p.dereference()).setValue(dictionary.isEmpty());
return p;
}
public PrimitivePointer put(ArrayList arguments) throws DynamicMVCException {
if (arguments.size() == 2) {
// reverse order
PrimitivePointer value = arguments.get(1);
PrimitivePointer key = arguments.get(0);
put(key, value);
return null;
} else if (arguments.size() == 1) {
PrimitivePointer e = arguments.get(0);
put(e);
return null;
} else {
throw new DynamicMVCException("Wrong number of arguments.");
}
}
public void put(PrimitivePointer p) throws DynamicMVCException {
PrimitiveStructure e = (PrimitiveStructure)p.dereference();
PrimitivePointer key = e.get("key");
PrimitivePointer value = e.get("value");
put(key, value);
}
public void put (PrimitivePointer key, PrimitivePointer value) throws DynamicMVCException {
PrimitivePointer k = key.copy();
PrimitivePointer v = value.copy();
k.setName("key");
v.setName("value");
PrimitiveBoolean c = (PrimitiveBoolean)contains(key).dereference();
if (c.getValue()) {
remove(key);
}
dictionary.put(key, value);
}
public PrimitivePointer get(ArrayList arguments) throws DynamicMVCException {
if (arguments.size() == 1) {
PrimitivePointer i = arguments.get(0);
return get(i);
} else {
throw new DynamicMVCException("Wrong number of arguments.");
}
}
public PrimitivePointer get(PrimitivePointer key) throws DynamicMVCException {
for(PrimitivePointer k : dictionary.keySet()) {
if (k.deepEquals(key)) {
return dictionary.get(k);
}
}
PrimitivePointer n = PrimitiveFactory.create(PrimitiveNull.pseudocodeTypeName(), "null");
return n;
}
public PrimitivePointer keys(ArrayList arguments) throws DynamicMVCException {
if (arguments.size() == 0) {
return keys();
} else {
throw new DynamicMVCException("Wrong number of arguments.");
}
}
public PrimitivePointer keys() {
PrimitivePointer p = PrimitiveFactory.create(PrimitiveList.pseudocodeTypeName(), "");
PrimitiveList l = (PrimitiveList)p.dereference();
for(PrimitivePointer key : dictionary.keySet()) {
l.add(key);
}
return p;
}
public PrimitivePointer elements(ArrayList arguments) throws DynamicMVCException {
if (arguments.size() == 0) {
return keys();
} else {
throw new DynamicMVCException("Wrong number of arguments.");
}
}
public PrimitivePointer elements() {
PrimitivePointer p = PrimitiveFactory.create(PrimitiveList.pseudocodeTypeName(), "");
PrimitiveList l = (PrimitiveList)p.dereference();
for(PrimitivePointer key : dictionary.values()) {
l.add(key);
}
return p;
}
public PrimitivePointer contains(ArrayList arguments) throws DynamicMVCException {
if (arguments.size() == 1) {
PrimitivePointer i = arguments.get(0);
return contains(i);
} else {
throw new DynamicMVCException("Wrong number of arguments.");
}
}
public PrimitivePointer contains(PrimitivePointer key) throws DynamicMVCException {
PrimitivePointer p = PrimitiveFactory.create(PrimitiveBoolean.pseudocodeTypeName(), "");
PrimitivePointer value = get(key);
((PrimitiveBoolean)p.dereference()).setValue(!(value.dereference() instanceof PrimitiveNull));
return p;
}
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(name + ": [ ");
for(PrimitivePointer key : dictionary.keySet()) {
PrimitivePointer value = dictionary.get(key);
sb.append(key.toString());
sb.append(" => ");
sb.append(value.toString());
sb.append(" , ");
}
// remove the last 3 characters " , "
sb.replace(sb.length() - 3, sb.length(), "");
sb.append(" ]");
return sb.toString();
}
public PrimitiveString toPrimitiveString() {
PrimitiveString s = (PrimitiveString)(PrimitiveFactory.create(PrimitiveString.pseudocodeTypeName(), "s").dereference());
s.setValue(toString());
return s;
}
}