/*
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
.
*/
/*
* PrimitiveList.java
*
* Created on March 4, 2008, 8:02 PM
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package dynamicmvc;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.HashMap;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JPanel;
/**
*
* @author Brandon
*/
public class PrimitiveList extends Primitive {
public static String pseudocodeTypeName() {
return "List";
}
public String getType() {
return pseudocodeTypeName();
}
private String name;
private ArrayList list;
public ArrayList getList() {
return list;
}
/** Creates a new instance of PrimitiveStructure */
public PrimitiveList() {
super();
list = new ArrayList();
}
public JComponent getReadOnlyComponent(){
// wrap everything in a panel
JPanel wrapper = new JPanel();
wrapper.setName(getEditComponentWrapperName());
// for each thing in the list
int i = 0;
for(PrimitivePointer p : list) {
String name = p.getName();
p.setName(String.valueOf(i));
wrapper.add(p.getReadOnlyComponent());
p.setName(name);
i++;
}
return wrapper;
}
public JComponent getEditComponent(){
// wrap everything in a panel
JPanel wrapper = new JPanel();
wrapper.setName(getEditComponentWrapperName());
// for each thing in the list
int i = 0;
for(PrimitivePointer p : list) {
String name = p.getName();
p.setName(String.valueOf(i));
wrapper.add(p.getEditComponent());
p.setName(name);
i++;
}
// also, add a button to allow new inputs
dataTypes = new javax.swing.JComboBox();
dataTypes.setModel(new javax.swing.DefaultComboBoxModel(PrimitiveFactory.getTypeNames().toArray()));
JButton addButton = new JButton();
addButton.setText("Add");
addButton.setName(getAddButtonName());
addButton.addActionListener(new AddHandler());
wrapper.add(dataTypes);
wrapper.add(addButton);
return wrapper;
}
javax.swing.JComboBox dataTypes;
class AddHandler implements ActionListener {
public void actionPerformed(ActionEvent e) {
// assume the actionCommand tells what type of item to add
String dataType = (String)dataTypes.getSelectedItem();
PrimitivePointer p = PrimitiveFactory.create(dataType, "");
add(p);
View.updateAsk();
}
}
public String getEditComponentWrapperName(){
return "pnl" + name;
}
public String getAddButtonName() {
return "btnAdd";
}
public void populateFromEditComponentWrapper(JComponent editComponentWrapper) throws DynamicMVCException {
// just populate each of the array values
for(PrimitivePointer p : list) {
String name = p.getEditComponentName();
JComponent child = (JComponent)View.getComponent(editComponentWrapper, name);
p.populateFromEditComponentWrapper(child);
}
}
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
public Primitive copy() throws DynamicMVCException {
PrimitiveList l = new PrimitiveList();
l.name = name;
for(PrimitivePointer p : list) {
l.add(p.copy());
}
for(PrimitivePointer p : getDefinedProperties().values()) {
l.set(p.dereference().getName(), p.copy());
}
return l;
}
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);
PrimitiveList l = (PrimitiveList)pp.dereference();
l.name = name;
alreadyCopiedAddresses.put(p.getAddress(), pp.getAddress());
for(PrimitivePointer lp : list) {
l.add(lp.deepCopy(alreadyCopiedAddresses));
}
super.deepCopyDefinedProperties(l, alreadyCopiedAddresses);
return l;
}
public boolean deepEquals(Primitive p) throws DynamicMVCException {
if (!(p instanceof PrimitiveList)) {
DynamicController.errorMessage = "Expecting List, but found " + p.getType();
return false;
}
PrimitiveList l = (PrimitiveList)p;
if (list.size() != l.getList().size()) {
DynamicController.errorMessage = "Wrong list size. Expecting '" + list.size() + "', but found '" + l.getList().size() + "'.";
return false;
}
for(int i = 0; i < list.size(); i++) {
PrimitivePointer myP = list.get(i);
PrimitivePointer otherP = l.get(i);
if (!myP.deepEquals(otherP)) {
return false;
}
}
return super.deepEqualsDefinedProperties(p);
}
public PrimitivePointer execute(String methodName, ArrayList arguments) throws DynamicMVCException{
if (methodName.equals("add")) {
add(arguments);
return null;
} else if (methodName.equals("get")) {
return get(arguments);
} else if (methodName.equals("remove")) {
remove(arguments);
return null;
} else if (methodName.equals("length")) {
return length(arguments);
}else if (methodName.equals("contains")) {
return contains(arguments);
}else if (methodName.equals("doesNotContain")) {
return doesNotContain(arguments);
} else if (methodName.equals("set")) {
return set(arguments);
}
throw new DynamicMVCException ("Object: '" + name + "' does not support method '" + methodName + "'.");
}
public PrimitivePointer set(ArrayList arguments) throws DynamicMVCException {
if (arguments.size() == 2) {
return set(arguments.get(0), arguments.get(1));
} else {
throw new DynamicMVCException("Wrong number of arguments.");
}
}
public PrimitivePointer set(PrimitivePointer index, PrimitivePointer value) throws DynamicMVCException {
if(!index.dereference().getType().equals(PrimitiveInteger.pseudocodeTypeName())) {
throw new DynamicMVCException("Invalid argument: " + index.toString());
}
PrimitiveInteger i = (PrimitiveInteger)index.dereference();
return set(i, value);
}
public PrimitivePointer set(PrimitiveInteger index, PrimitivePointer value) {
int i = index.getValue();
while(list.size() <= i) {
list.add(PrimitiveFactory.create(PrimitiveNull.pseudocodeTypeName(), "null"));
}
list.set(i, value);
return PrimitiveFactory.create(PrimitiveNull.pseudocodeTypeName(), "return");
}
public PrimitivePointer doesNotContain(ArrayList arguments) throws DynamicMVCException {
if (arguments.size() == 1) {
return doesNotContain(arguments.get(0));
} else {
throw new DynamicMVCException("Wrong number of arguments.");
}
}
public PrimitivePointer contains(ArrayList arguments) throws DynamicMVCException {
if (arguments.size() == 1) {
return contains(arguments.get(0));
} else {
throw new DynamicMVCException("Wrong number of arguments.");
}
}
public PrimitivePointer contains(PrimitivePointer p) {
PrimitivePointer result = PrimitiveFactory.create(PrimitiveBoolean.pseudocodeTypeName(), "");
PrimitiveBoolean pb = (PrimitiveBoolean)result.dereference();
for(PrimitivePointer pp : list) {
if (pp.valueEquals(p)) {
pb.setValue(true);
return result;
}
}
pb.setValue(false);
return result;
}
public PrimitivePointer doesNotContain(PrimitivePointer p) {
PrimitivePointer result = PrimitiveFactory.create(PrimitiveBoolean.pseudocodeTypeName(), "");
PrimitiveBoolean pb = (PrimitiveBoolean)result.dereference();
for(PrimitivePointer pp : list) {
if (pp.valueEquals(p)) {
pb.setValue(false);
return result;
}
}
pb.setValue(true);
return result;
}
public void add(ArrayList arguments) throws DynamicMVCException {
if (arguments.size() == 1) {
PrimitivePointer p = arguments.get(0);
add(p);
} else {
throw new DynamicMVCException("Wrong number of arguments.");
}
}
public void add(PrimitivePointer p) {
// assign the name to be
//p.setName(name + list.size());
// create a new pointer, and set its name
PrimitivePointer pp = p.copy();
pp.setName(String.valueOf(list.size()));
list.add(pp);
}
public PrimitivePointer get(String name) throws DynamicMVCException {
if (name.equalsIgnoreCase("length")) {
PrimitivePointer p = PrimitiveFactory.create(PrimitiveInteger.pseudocodeTypeName(), "length");
((PrimitiveInteger)p.dereference()).setValue(list.size());
return p;
} else {
return super.get(name);
}
}
public PrimitivePointer get(ArrayList arguments) throws DynamicMVCException {
if (arguments.size() == 1) {
PrimitiveInteger i = (PrimitiveInteger)arguments.get(0).dereference();
return get(i);
} else {
throw new DynamicMVCException("Wrong number of arguments.");
}
}
public PrimitivePointer get(PrimitiveInteger index) {
return list.get(index.getValue());
}
public PrimitivePointer get(int index) {
return list.get(index);
}
public void remove(ArrayList arguments) throws DynamicMVCException {
if (arguments.size() == 1) {
// this could either be the index or the actual thing to remove
if(!remove(arguments.get(0))) {
PrimitiveInteger i = (PrimitiveInteger)arguments.get(0).dereference();
remove(i);
}
} else {
throw new DynamicMVCException("Wrong number of arguments.");
}
}
public boolean remove(PrimitivePointer item) throws DynamicMVCException {
for(int i = 0; i < list.size(); i++) {
if(list.get(i).deepEquals(item)) {
list.remove(i);
return true;
}
}
return false;
}
public void remove(PrimitiveInteger index) throws DynamicMVCException {
int i = index.getValue();
list.remove(i);
}
public void remove(int index) {
list.remove(index);
}
public PrimitivePointer length(ArrayList arguments) throws DynamicMVCException {
if (arguments.size() == 0) {
return length();
} else {
throw new DynamicMVCException("Wrong number of arguments.");
}
}
public PrimitivePointer length() {
PrimitivePointer l = PrimitiveFactory.create(PrimitiveInteger.pseudocodeTypeName(), "");
((PrimitiveInteger)l.dereference()).setValue(list.size());
return l;
}
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(name + ": [ ");
for(PrimitivePointer p : list) {
sb.append(p.toString());
sb.append(" , ");
}
// remove the last 3 characters " , "
if (list.size() > 0) {
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;
}
}