/** * @author tdanford */ package org.seqcode.viz.utils; import java.util.*; import java.io.*; import javax.swing.*; import javax.swing.event.*; import org.seqcode.gseutils.*; import org.seqcode.viz.paintable.*; import java.awt.*; import java.awt.event.*; /** * @author Timothy Danford */ public class ProgressPanel extends JPanel implements ProgressListener, PaintableChangedListener { private ProgressPaintable pp; public ProgressPanel() { super(); setLayout(new FlowLayout()); pp = new ProgressPaintable(); add(new PaintablePanel(pp)); pp.addPaintableChangedListener(this); } public Dimension getPreferredSize() { return new Dimension(300, 100); } public void progressMade(ProgressEvent pe) { pp.progressMade(pe); } public void registerEventMax(String key, int max) { pp.registerEventMax(key, max); } public void paintableChanged(PaintableChangedEvent pce) { repaint(); } public static class Frame extends JFrame implements ProgressListener { private ProgressPanel pp; public Frame() { super("Progress"); Container c = (Container)getContentPane(); c.setLayout(new BorderLayout()); c.add(pp = new ProgressPanel()); setLocation(100, 100); setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); setVisible(true); pack(); } public ProgressPanel getPanel() { return pp; } public void progressMade(ProgressEvent pe) { pp.progressMade(pe); } public void registerEventMax(String key, int max) { pp.registerEventMax(key, max); } } } class ProgressPaintable extends AbstractPaintable implements ProgressListener { private Color c; private Map<String,Integer> maxima; private Map<String,Integer> values; public ProgressPaintable() { c = Color.blue; maxima = new LinkedHashMap<String,Integer>(); values = new LinkedHashMap<String,Integer>(); } public void paintItem(Graphics g, int x1, int y1, int x2, int y2) { int rows = maxima.size(); int w = x2-x1, h = y2-y1; int rowHeight = h/(rows*2+1); int barWidth = 4*w/5; int barOffset = (w-barWidth)/2; g.setColor(Color.white); g.fillRect(x1, y1, w, h); Vector<String> keys = new Vector<String>(maxima.keySet()); for(int i = 0; i < keys.size(); i++) { String key = keys.get(i); int y = y1 + rowHeight*(i*2+1); double f = Math.min(1.0, (double)values.get(key) / (double)maxima.get(key)); int bar = (int)Math.round(f * (double)barWidth); g.setColor(c); g.fillRect(barOffset, y, bar, rowHeight); g.setColor(Color.black); g.drawRect(barOffset, y, barWidth, rowHeight); g.drawString(key, barOffset+1, y-1); } } public void progressMade(ProgressEvent e) { String key = e.getKey(); if(maxima.containsKey(key)) { values.put(key, e.getValue()); } dispatchChangedEvent(); } public void registerEventMax(String key, int max) { maxima.put(key, max); values.put(key, 0); dispatchChangedEvent(); } }