import java.applet.*; import java.awt.*; import java.util.*; public class ListTest extends Applet { LinkedList integerList; ListIterator cursor; int count; TextField messageArea; Button insertAfter, insertBefore, remove, clear, next, previous, enumerate, find; Panel buttons; int fontsize; // default: 12 pt Font font; // Helvetica Bold FontMetrics fm; Color bgColor, fgColor, cursorColor; // defaults: white, black, red public void init () { // read parameters from HTML String str; try { str = getParameter("backgroundcolor"); bgColor = (str != null) ? new Color(Integer.parseInt(str,16)) : getBackground(); setBackground(bgColor); str = getParameter("foregroundcolor"); fgColor = (str != null) ? new Color(Integer.parseInt(str,16)) : Color.black; setForeground(fgColor); str = getParameter("cursorcolor"); cursorColor = (str != null) ? new Color(Integer.parseInt(str,16)) : Color.red; str = getParameter("fontsize"); fontsize = (str != null) ? Integer.parseInt(str) : 12; font = new Font("Helvetica", Font.BOLD, fontsize); setFont(font); fm = getFontMetrics(font); } catch(Exception e) { System.out.println(e); } // integerList = new LinkedList(); cursor = integerList.head(); count = 1; messageArea = new TextField(""); messageArea.setEditable(false); setLayout(new BorderLayout()); buttons = new Panel(); buttons.setLayout(new FlowLayout()); insertAfter = new Button("insertAfter"); insertBefore = new Button("InsertBefore"); remove = new Button("Remove"); clear = new Button("Clear"); next = new Button("Next"); previous = new Button("Previous"); enumerate = new Button("Enumerate"); find = new Button("Find"); buttons.add(insertAfter); buttons.add(insertBefore); buttons.add(remove); buttons.add(clear); buttons.add(new Label(" ")); buttons.add(next); buttons.add(previous); buttons.add(new Label(" ")); buttons.add(enumerate); buttons.add(find); add("North", buttons); add("South", messageArea); } public boolean action(Event evt, Object arg) { messageArea.setText(""); if (evt.target == insertAfter) { try { integerList.insertAfter(new Integer(count), cursor); count++; } catch(Exception e) { messageArea.setText(e.getMessage()); } } else if (evt.target == insertBefore) { try { integerList.insertBefore(new Integer(count), cursor); count++; } catch(Exception e) { messageArea.setText(e.getMessage()); } } else if (evt.target == remove) { try { integerList.remove(cursor); cursor.previous(); } catch(Exception e) { messageArea.setText(e.getMessage()); } } else if (evt.target == clear) { integerList.clear(); cursor.head(); count = 1; } else if (evt.target == next) { cursor.next(); } else if (evt.target == previous) { cursor.previous(); } else if (evt.target == enumerate) { String str = "Current list: empty"; Enumeration e = integerList.elements(); // get all list elements if (e.hasMoreElements()) { str = "Current list: "; } while (e.hasMoreElements()) { // step through all list elements Integer obj = (Integer) e.nextElement(); str = str + obj.toString() + " "; } messageArea.setText(str); } else if (evt.target == find) { FindFrame ff = new FindFrame(this, "Find List Item"); ff.show(); } else { return super.action(evt, arg); } repaint(); return true; } public void paint(Graphics g) { int size = fm.stringWidth("1234"); int x = 2*size; int y = 3*size; g.setColor(fgColor); if (cursor.pos == integerList.head) { g.setColor(cursorColor); g.fillRect(x+1, y+1, size-1, size-1); g.setColor(fgColor); } g.drawRect(x, y, size, size); g.drawString("H", x + size/3, y + 2*size/3); x += size; // Enumeration e = integerList.elements(); while (e.hasMoreElements()) { Integer i = (Integer) e.nextElement(); // draw right arrow g.drawLine(x, y + size/3, x + size, y + size/3); g.drawLine(x + size, y + size/3, x + 5*size/6, y + size/2); g.drawLine(x + size, y + size/3, x + 5*size/6, y + size/6); // draw left arrow g.drawLine(x + size, y + 2*size/3, x, y + 2*size/3); g.drawLine(x, y + 2*size/3, x + size/6, y + size/2); g.drawLine(x, y + 2*size/3, x + size/6, y + 5*size/6); // draw box if (i.equals(cursor.pos.obj)) { g.setColor(cursorColor); g.fillRect(x+size+1, y+1, size-1, size-1); g.setColor(fgColor); } g.drawRect(x+size, y, size, size); x +=size; g.drawString(i.toString(), x + size/4, y + 2*size/3); x +=size; } // draw right arrow int[] xcoordsR = {x, x+size , x+size, size, size, 2*size}; int[] ycoordsR = {y+size/3, y+size/3, y+5*size/3, y+5*size/3, y+size/3, y+size/3}; g.drawPolygon(xcoordsR, ycoordsR, 6); g.drawLine(2*size, y+size/3, 11*size/6, y+size/6); g.drawLine(2*size, y+size/3, 11*size/6, y+size/2); // draw left arrow int[] xcoordsL = {x, x+2*size/3, x+2*size/3, 4*size/3, 4*size/3, 2*size}; int[] ycoordsL = {y+2*size/3, y+2*size/3, y+4*size/3, y+4*size/3, y+2*size/3, y+2*size/3}; g.drawPolygon(xcoordsL, ycoordsL, 6); g.drawLine(x, y+2*size/3, x+size/6, y+size/2); g.drawLine(x, y+2*size/3, x+size/6, y+5*size/6); } }