/* 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 . */ /* * PrimitivePriorityQueue.java * * Created on March 8, 2008, 2:05 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.Arrays; import java.util.HashMap; import java.util.Iterator; import java.util.PriorityQueue; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JPanel; /** * * @author Brandon */ public class PrimitivePriorityQueue extends Primitive { public static String pseudocodeTypeName() { return "PriorityQueue"; } public String getType() { return pseudocodeTypeName(); } private String name; private PriorityQueue pq; public PriorityQueue getPq() { return pq; } /** Creates a new instance of PrimitiveStructure */ public PrimitivePriorityQueue() { super(); pq = new PriorityQueue(5, PrimitivePriorityQueueElementComparator.getInstance()); } public JComponent getReadOnlyComponent(){ // wrap everything in a panel JPanel wrapper = new JPanel(); wrapper.setName(getEditComponentWrapperName()); int i = 0; PriorityQueue newPQ = new PriorityQueue(5, PrimitivePriorityQueueElementComparator.getInstance()); while(!pq.isEmpty()) { PrimitivePointer p = pq.poll(); String name = p.getName(); p.setName(String.valueOf(i)); wrapper.add(p.getReadOnlyComponent()); p.setName(name); i++; newPQ.offer(p); } this.pq = newPQ; return wrapper; } public JComponent getEditComponent(){ // wrap everything in a panel JPanel wrapper = new JPanel(); wrapper.setName(getEditComponentWrapperName()); // and the remove button for this element JButton removeButton = new JButton(); removeButton.setText("Pop"); removeButton.addActionListener(new RemoveHandler()); wrapper.add(removeButton); int i = 0; PriorityQueue newPQ = new PriorityQueue(5, PrimitivePriorityQueueElementComparator.getInstance()); while(!pq.isEmpty()) { PrimitivePointer p = pq.poll(); String name = p.getName(); p.setName(String.valueOf(i)); wrapper.add(p.getEditComponent()); p.setName(name); i++; newPQ.offer(p); } this.pq = newPQ; dataTypes = new javax.swing.JComboBox(); dataTypes.setModel(new javax.swing.DefaultComboBoxModel(PrimitiveFactory.getTypeNames().toArray())); JButton addButton = new JButton(); addButton.setText("Push"); addButton.setName(getAddButtonName()); addButton.addActionListener(new AddHandler()); wrapper.add(dataTypes); wrapper.add(addButton); return wrapper; } javax.swing.JComboBox dataTypes; public PrimitivePriorityQueue getThis() { return this; } class RemoveHandler implements ActionListener { public void actionPerformed(ActionEvent e) { getThis().pop(); View.updateAsk(); } } class AddHandler implements ActionListener { public void actionPerformed(ActionEvent e) { String itemName = String.valueOf(pq.size()); String dataType = (String)dataTypes.getSelectedItem(); PrimitivePointer p = PrimitiveFactory.create(dataType, "value"); PrimitivePointer el = PrimitiveFactory.create(PrimitivePriorityQueueElement.pseudocodeTypeName(), "priority"); try { ((PrimitivePriorityQueueElement)el.dereference()).setPq(getPointer()); } catch (DynamicMVCException ex) { ex.printStackTrace(); } el.setName(itemName); ((PrimitivePriorityQueueElement)el.dereference()).setValue(p); pq.add(el); View.updateAsk(); } } public String getEditComponentWrapperName(){ return "pnl" + name; } public String getAddButtonName() { return "btnAdd"; } public void populateFromEditComponentWrapper(JComponent editComponentWrapper) throws DynamicMVCException{ PriorityQueue newPQ = new PriorityQueue(5, PrimitivePriorityQueueElementComparator.getInstance()); // just populate each of the array values for(PrimitivePointer p : pq) { String name = p.getEditComponentName(); JComponent child = (JComponent)View.getComponent(editComponentWrapper, name); p.populateFromEditComponentWrapper(child); newPQ.offer(p); } this.pq = newPQ; } public void setName(String name){ this.name = name; } public String getName(){ return name; } public Primitive copy() throws DynamicMVCException { PrimitivePriorityQueue q = new PrimitivePriorityQueue(); q.setName(name); for(PrimitivePointer p : pq) { q.push(p); } for(PrimitivePointer p : getDefinedProperties().values()) { q.set(p.getName(), p.copy()); } return q; } 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()); PrimitivePriorityQueue q = (PrimitivePriorityQueue)pp.dereference(); q.setName(name); for(PrimitivePointer qe : pq) { q.push(qe.deepCopy(alreadyCopiedAddresses)); } super.deepCopyDefinedProperties(q, alreadyCopiedAddresses); return q; } public boolean deepEquals(Primitive p) throws DynamicMVCException { if (!(p instanceof PrimitivePriorityQueue)) { DynamicController.errorMessage = "Expecting Priority Queue, but found " + p.getType(); return false; } PrimitivePriorityQueue o = (PrimitivePriorityQueue)p; if (pq.size() != o.getPq().size()) { DynamicController.errorMessage = "Wrong priority queue size. Expecting '" + pq.size() + "', but found '" + o.getPq().size() + "'."; return false; } PrimitivePointer[] me = (PrimitivePointer[]) pq.toArray(new PrimitivePointer[0]); PrimitivePointer[] him = (PrimitivePointer[]) o.getPq().toArray(new PrimitivePointer[0]); Arrays.sort(me, PrimitivePriorityQueueElementComparator.getInstance()); Arrays.sort(him, PrimitivePriorityQueueElementComparator.getInstance()); for(int i = 0; i < pq.size(); i++) { PrimitivePointer myP = me[i]; PrimitivePointer otherP = him[i]; if (!myP.deepEquals(otherP)) { return false; } } return super.deepEqualsDefinedProperties(p); } public PrimitivePointer execute(String methodName, ArrayList arguments) throws DynamicMVCException{ if (methodName.equalsIgnoreCase("push")) { push(arguments); return null; } else if (methodName.equalsIgnoreCase("pop")) { return pop(arguments); } else if (methodName.equalsIgnoreCase("remove")) { remove(arguments); return null; } else if (methodName.equalsIgnoreCase("length")) { return length(arguments); } else if (methodName.equalsIgnoreCase("contains")) { return contains(arguments); } else if (methodName.equalsIgnoreCase("isEmpty")) { return isEmpty(arguments); } throw new DynamicMVCException ("Object: '" + name + "' does not support method '" + methodName + "'."); } public PrimitivePointer isEmpty(ArrayList arguments) throws DynamicMVCException { if (arguments.size() == 0) { return isEmpty(); } else { throw new DynamicMVCException("Wrong number of arguments."); } } public PrimitivePointer isEmpty() throws DynamicMVCException { PrimitivePointer pb = PrimitiveFactory.create(PrimitiveBoolean.pseudocodeTypeName(), "isEmpty"); PrimitiveBoolean b = (PrimitiveBoolean)pb.dereference(); b.setValue(this.pq.isEmpty()); return pb; } 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 index) throws DynamicMVCException { Primitive value = index.dereference(); return contains(value); } public PrimitivePointer contains(Primitive value) throws DynamicMVCException { PrimitivePointer retValue = PrimitiveFactory.create(PrimitiveBoolean.pseudocodeTypeName(), "retValue"); PrimitiveBoolean r = (PrimitiveBoolean)retValue.dereference(); r.setValue(false); for(PrimitivePointer pqe : pq.toArray(new PrimitivePointer[0])) { PrimitivePriorityQueueElement element = (PrimitivePriorityQueueElement)pqe.dereference(); if(element.getValue().deepEquals(value)) { r.setValue(true); break; } } return retValue; } public void push(ArrayList arguments) throws DynamicMVCException { if (arguments.size() == 2) { // reverse order PrimitivePointer priority = arguments.get(1); PrimitivePointer value = arguments.get(0); if (priority.dereference() instanceof PrimitiveInteger) { push(value, priority); } else { push(value, (PrimitiveString)priority.dereference()); } } else if (arguments.size() == 1) { PrimitivePointer e = arguments.get(0); push(e); } else { throw new DynamicMVCException("Wrong number of arguments."); } } public void push(PrimitivePointer e) { pq.add(e); updateNames(); } public void push (PrimitivePointer value, PrimitivePointer priority) { PrimitivePointer p = priority.copy(); p.setName("priority"); String itemName = String.valueOf(pq.size()); PrimitivePointer pp = PrimitiveFactory.create(PrimitivePriorityQueueElement.pseudocodeTypeName(), itemName); ((PrimitivePriorityQueueElement)pp.dereference()).setPriority(p); ((PrimitivePriorityQueueElement)pp.dereference()).setValue(value); pq.add(pp); updateNames(); } public void push (PrimitivePointer value, PrimitiveString property) throws DynamicMVCException { PrimitivePointer priority = value.dereference().get(property.getValue()); push(value, priority); } public PrimitivePointer pop(ArrayList arguments) throws DynamicMVCException { if (arguments.size() == 0) { PrimitivePointer p = pop(); return p; } else if (arguments.size() == 1) { PrimitivePointer retVal = arguments.get(0); PrimitivePointer p = pop(retVal); return p; } else { throw new DynamicMVCException("Wrong number of arguments."); } } public PrimitivePointer pop() { PrimitivePointer p = ((PrimitivePriorityQueueElement)pq.poll().dereference()).getValue(); updateNames(); return p; } public PrimitivePointer pop(PrimitivePointer retVal) { PrimitivePriorityQueueElement e = (PrimitivePriorityQueueElement)pq.poll().dereference(); updateNames(); ((PrimitiveInteger)retVal.dereference()).setValue(((PrimitiveInteger)e.getPriority().dereference()).getValue()); return e.getValue(); } public void remove(ArrayList arguments) throws DynamicMVCException { if (arguments.size() == 1) { PrimitivePointer i = arguments.get(0); remove(i); updateNames(); } else { throw new DynamicMVCException("Wrong number of arguments."); } } public void remove(PrimitivePointer index) throws DynamicMVCException { int i = ((PrimitiveInteger)index.dereference()).getValue(); pq.remove(i); updateNames(); } public void remove(int index) { pq.remove(index); updateNames(); } 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 p = PrimitiveFactory.create(PrimitiveInteger.pseudocodeTypeName(), ""); ((PrimitiveInteger)p.dereference()).setValue(pq.size()); return p; } public String toString() { StringBuilder sb = new StringBuilder(); sb.append(name + ": [ "); for(PrimitivePointer p : pq) { sb.append(p.toString()); sb.append(" , "); } // remove the last 3 characters " , " sb.replace(sb.length() - 3, sb.length(), ""); sb.append(" ]"); return sb.toString(); } public void updateNames() { int i = 0; for(PrimitivePointer e : pq) { e.setName(String.valueOf(i)); i++; } } public PrimitiveString toPrimitiveString() { PrimitiveString s = (PrimitiveString)(PrimitiveFactory.create(PrimitiveString.pseudocodeTypeName(), "s").dereference()); s.setValue(toString()); return s; } }