import java.awt.*; import java.awt.event.*; // for ActionListener, ActionEvent import java.lang.Thread; import java.io.*; import java.util.Stack; public class MenuLoader extends Thread { Menu m; // root menu to be loaded ActionListener l; // will be called when a menu is clicked ActionListener doneListener; // will be called when the loading is done BookmarkParser p; // used to parse an HTML bookmark file public MenuLoader(Menu m, Reader r, ActionListener l) throws IOException { this.m = m; this.p = new BookmarkParser(r); this.l = l; } public void addActionListener(ActionListener l){ this.doneListener = l; } public void run() { MenuBuilder b = new MenuBuilder(m, l); try{ while( p.next() != BookmarkParser.EOF ){ switch(p.getType()){ case p.BOOKMARK: b.addBookmark(p.getName(), p.getLink()); break; case p.FOLDER: b.startSubmenu(p.getName()); break; case p.FOLDER_END: b.endSubmenu(); break; case p.SEPARATOR: b.addSeparator(); break; default: break; } }//while notifyListener("done"); }catch(IOException e){ notifyListener("error"); } } void notifyListener(String command){ if( doneListener != null ) { doneListener.actionPerformed( new ActionEvent(this, 0, command) ); } } }; class MenuBuilder{ Stack s = new Stack(); ActionListener l; public MenuBuilder(Menu m, ActionListener l){ s.push(m); this.l = l; } public void addBookmark(String name, String link){ MenuItem i = new MenuItem(name); i.setActionCommand(link); i.addActionListener(l); getCurrentMenu().add(i); } public void addSeparator(){ getCurrentMenu().addSeparator(); } public void startSubmenu(String name){ Menu sub = new Menu(name); getCurrentMenu().add(sub); s.push(sub); } public void endSubmenu() { s.pop(); } Menu getCurrentMenu(){ return (Menu)(s.peek()); } }