/*
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
.
*/
/*
* PrimitivePriorityQueueElement.java
*
* Created on March 8, 2008, 2:23 AM
*
* 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.JLabel;
import javax.swing.JPanel;
/**
*
* @author Brandon
*/
public class PrimitivePriorityQueueElement extends Primitive implements Comparable {
private PrimitivePointer pq;
private PrimitivePointer priority;
private PrimitivePointer value;
String name;
public static String pseudocodeTypeName() {
return "PriorityQueueElement";
}
public String getType() {
return pseudocodeTypeName();
}
/** Creates a new instance of PrimitivePriorityQueueElement */
public PrimitivePriorityQueueElement() {
super();
PrimitivePointer priority = PrimitiveFactory.create(PrimitiveInteger.pseudocodeTypeName(), "priority");
((PrimitiveInteger)priority.dereference()).setValue(Integer.MAX_VALUE);
setPriority(priority);
setValue(null);
name = "";
setPq(null);
}
public PrimitivePriorityQueueElement(PrimitivePointer value, PrimitivePointer priority, String name, PrimitivePointer pq) {
super();
this.setPriority(priority);
this.setValue(value);
this.name = name;
this.setPq(pq);
}
public JComponent getReadOnlyComponent(){
// wrap everything in a panel
JPanel wrapper = new JPanel();
wrapper.setName(getEditComponentWrapperName());
// create a label to display the priority and the value
//String valueName = getValue().dereference().getName();
String valueName = getValue().getName();
getValue().setName(getValue().dereference().getType());
wrapper.add(getPriority().getReadOnlyComponent());
wrapper.add(getValue().getReadOnlyComponent());
getValue().setName(valueName);
return wrapper;
}
public JComponent getEditComponent(){
// wrap everything in a panel
JPanel wrapper = new JPanel();
wrapper.setName(getEditComponentWrapperName());
wrapper.add(getPriority().getEditComponent());
// value could be null
if (getValue() != null) {
wrapper.add(getValue().getEditComponent());
} else {
// also, add a button to allow new inputs
JLabel l = new JLabel();
l.setText("Select the data type of the value and press 'Add'.");
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(l);
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();
String itemName = "value";
PrimitivePointer p = PrimitiveFactory.create(dataType, itemName);
setValue(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
if (getValue() == null) {
throw new DynamicMVCException("Please pick a data type for the queue element.");
}
//String priorityName = ((PrimitiveInteger)getPriority().dereference()).getEditComponentName();
//String valueName = getValue().dereference().getEditComponentWrapperName();
String priorityName = getPriority().getEditComponentName();
String valueName = getValue().getEditComponentName();
JComponent priorityChild = (JComponent)View.getComponent(editComponentWrapper, priorityName);
JComponent valueChild = (JComponent)View.getComponent(editComponentWrapper, valueName);
if(priorityChild != null) {
//getPriority().dereference().populateFromEditComponentWrapper(priorityChild);
getPriority().populateFromEditComponentWrapper(priorityChild);
}
if(valueChild != null) {
//getValue().dereference().populateFromEditComponentWrapper(valueChild);
getValue().populateFromEditComponentWrapper(valueChild);
}
}
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
public Primitive copy() throws DynamicMVCException {
PrimitivePriorityQueueElement e = new PrimitivePriorityQueueElement();
e.name = name;
e.setPriority(getPriority().copy());
e.setValue(getValue().copy());
for(PrimitivePointer p : getDefinedProperties().values()) {
e.set(p.getName(), p.copy());
}
return e;
}
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());
PrimitivePriorityQueueElement e = (PrimitivePriorityQueueElement)pp.dereference();
e.name = name;
e.setPriority(getPriority().deepCopy(alreadyCopiedAddresses));
e.setValue(getValue().deepCopy(alreadyCopiedAddresses));
super.deepCopyDefinedProperties(e, alreadyCopiedAddresses);
return e;
}
public boolean deepEquals(Primitive p) throws DynamicMVCException {
if (!(p instanceof PrimitivePriorityQueueElement)) {
DynamicController.errorMessage = "Expecting Priority Queue Element, but found " + p.getType();
return false;
}
PrimitivePriorityQueueElement e = (PrimitivePriorityQueueElement)p;
if (!value.deepEquals(e.getValue())) {
return false;
}
if(!priority.deepEquals(e.getPriority())) {
return false;
}
return super.deepEqualsDefinedProperties(p);
}
public Object execute(String methodName, ArrayList arguments) throws DynamicMVCException{
if (methodName.equalsIgnoreCase("equals")) {
return equals(arguments);
} else if (methodName.equalsIgnoreCase("notEqual")) {
return !equals(arguments);
} else if (methodName.equalsIgnoreCase("compareTo")) {
return compareTo(arguments);
}
throw new DynamicMVCException ("Object: '" + name + "' does not support method '" + methodName + "'.");
}
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(name + ": ");
sb.append(getPriority().toString());
sb.append("; ");
sb.append(getValue().toString());
sb.append(";");
return sb.toString();
}
public int compareTo(Comparable other) throws DynamicMVCException {
if (other instanceof PrimitivePriorityQueueElement) {
return compareTo((PrimitivePriorityQueueElement)other);
} else {
throw new DynamicMVCException("Invalid type comparison.");
}
}
public int compareTo(PrimitivePriorityQueueElement other) {
try {
return ((PrimitiveInteger)getPriority().dereference()).compareTo(other.getPriority());
} catch (DynamicMVCException ex) {
ex.printStackTrace();
}
return -1;
}
public int compareTo(PrimitivePointer other) {
return compareTo((PrimitivePriorityQueueElement)other.dereference());
}
public boolean equals(ArrayList arguments) throws DynamicMVCException {
if (arguments.size() == 1) {
PrimitivePointer i = arguments.get(0);
return equals(i);
}
throw new DynamicMVCException("Wrong number of arguments.");
}
public boolean equals(PrimitivePointer i) {
return name.equals(i.getName());
}
public int compareTo(ArrayList arguments) throws DynamicMVCException {
if (arguments.size() == 1) {
PrimitivePointer i = arguments.get(0);
return compareTo(i);
}
throw new DynamicMVCException("Wrong number of arguments.");
}
public PrimitivePointer getPq() {
return pq;
}
public void setPq(PrimitivePointer pq) {
this.pq = pq;
}
public PrimitivePointer getPriority() {
return priority;
}
public void setPriority(PrimitivePointer priority) {
this.priority = priority;
}
public PrimitivePointer getValue() {
return value;
}
public void setValue(PrimitivePointer value) {
this.value = value;
}
public PrimitiveString toPrimitiveString() {
PrimitiveString s = (PrimitiveString)(PrimitiveFactory.create(PrimitiveString.pseudocodeTypeName(), "s").dereference());
s.setValue(toString());
return s;
}
}