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