package plp.sort; import java.lang.reflect.*; import javax.swing.*; import javax.swing.event.*; import java.awt.*; import java.awt.event.*; import java.util.*; public class TestSort { private static Sort getSort(String name) throws ClassNotFoundException { Class sortClass = Class.forName(name); Method getInstance = null; try { getInstance = sortClass.getMethod("getInstance", null); } catch (NoSuchMethodException e) { System.err.println("Your Sort class has no static method getInstance()"); System.exit(1); } Sort sort = null; try { // First parameter is null because the method // Sort.getInstance() is static. sort = (Sort) getInstance.invoke(null, null); } catch (InvocationTargetException e) { throw new Error(e.getMessage()); } catch (IllegalAccessException e) { throw new Error(e.getMessage()); } return sort; } public static void main(String [] args) { java.util.List sorts = new ArrayList(); for (int i = 0; i < args.length; ++i) { try { sorts.add(getSort(args[i])); } catch (ClassNotFoundException e) { break; } } int nsorts = sorts.size(); int ndata = args.length - nsorts; String [] toSort = new String[ndata]; System.arraycopy(args, nsorts, toSort, 0, ndata); final JFrame f = new JFrame("Sort"); JPanel mainPane = new JPanel(new BorderLayout()); JSlider slider = new JSlider(); f.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); f.addWindowListener(new WindowAdapter() { public void windowClosed(WindowEvent e) { System.exit(0); } }); JPanel namesPane = new JPanel(new GridLayout(nsorts, 1, 5, 5)); JPanel dataPane = new JPanel(new GridLayout(nsorts, 1, 5, 5)); mainPane.add(namesPane, BorderLayout.WEST); mainPane.add(dataPane, BorderLayout.EAST); mainPane.add(slider, BorderLayout.SOUTH); f.setContentPane(mainPane); java.util.List tracers = new ArrayList(); Iterator sortIterator = sorts.iterator(); while (sortIterator.hasNext()) { Sort sort = (Sort) sortIterator.next(); String [] toSortCopy = new String[ndata]; System.arraycopy(toSort, 0, toSortCopy, 0, ndata); SortableData data = new SortableArray(toSortCopy); SortableDataTracer tracer = new SortableDataTracer(data); tracers.add(tracer); WinTracer winTracer = new WinTracer(tracer, data, slider); tracer.addObserver(winTracer); namesPane.add(new JLabel(sort.getClass().getName())); dataPane.add(winTracer); } f.pack(); f.setVisible(true); Iterator tracersIterator = tracers.iterator(); Iterator sortsIterator = sorts.iterator(); while (sortsIterator.hasNext()) ((Sort) sortsIterator.next()).doSort((SortableData) tracersIterator.next()); } }