X-Git-Url: http://git.nikiroo.be/?p=nikiroo-utils.git;a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Futils%2Fui%2FProgressBar.java;h=6e1e7cef151c5fd561c953a58bf3bf7565667e1e;hp=2abd2b7dc25d1a868a781e5ce9fbcae55fb585e2;hb=88b36f83bb4bb9201339432c97e6d826aa9e1903;hpb=48f207400b264bfb3621a5da740ee3857f142d72 diff --git a/src/be/nikiroo/utils/ui/ProgressBar.java b/src/be/nikiroo/utils/ui/ProgressBar.java index 2abd2b7..6e1e7ce 100644 --- a/src/be/nikiroo/utils/ui/ProgressBar.java +++ b/src/be/nikiroo/utils/ui/ProgressBar.java @@ -1,12 +1,13 @@ package be.nikiroo.utils.ui; -import java.awt.BorderLayout; +import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; -import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JProgressBar; import javax.swing.SwingUtilities; @@ -16,40 +17,70 @@ import be.nikiroo.utils.Progress; public class ProgressBar extends JPanel { private static final long serialVersionUID = 1L; - private JProgressBar bar; - private JLabel label; + private Map bars; private List listeners; + private Progress pg; public ProgressBar() { - bar = new JProgressBar(); - label = new JLabel(); + bars = new HashMap(); listeners = new ArrayList(); - - setLayout(new BorderLayout()); } - public void setProgress(Progress pg) { + public void setProgress(final Progress pg) { + this.pg = pg; + if (pg == null) { setPresent(false); } else { - label.setText(pg.getName()); + final JProgressBar bar = new JProgressBar(); + bar.setStringPainted(true); + + bars.clear(); + bars.put(pg, bar); + bar.setMinimum(pg.getMin()); bar.setMaximum(pg.getMax()); bar.setValue(pg.getProgress()); + bar.setString(pg.getName()); pg.addProgressListener(new Progress.ProgressListener() { - public void progress(final Progress progress, final String name) { + public void progress(Progress progress, String name) { + SwingUtilities.invokeLater(new Runnable() { public void run() { - label.setText(name); - bar.setValue(progress.getProgress()); + Map newBars = new HashMap(); + newBars.put(pg, bar); + + bar.setMinimum(pg.getMin()); + bar.setMaximum(pg.getMax()); + bar.setValue(pg.getProgress()); + bar.setString(pg.getName()); + + for (Progress pg : getChildrenAsOrderedList(pg)) { + JProgressBar bar = bars.get(pg); + if (bar == null) { + bar = new JProgressBar(); + bar.setStringPainted(true); + } - if (progress.isDone()) { + newBars.put(pg, bar); + + bar.setMinimum(pg.getMin()); + bar.setMaximum(pg.getMax()); + bar.setValue(pg.getProgress()); + bar.setString(pg.getName()); + } + + bars = newBars; + + if (pg.isDone()) { for (ActionListener listener : listeners) { listener.actionPerformed(new ActionEvent( ProgressBar.this, 0, "done")); } } + + setPresent(true); } }); } @@ -67,15 +98,28 @@ public class ProgressBar extends JPanel { listeners.clear(); } + private List getChildrenAsOrderedList(Progress pg) { + List children = new ArrayList(); + for (Progress child : pg.getChildren()) { + children.add(child); + children.addAll(getChildrenAsOrderedList(child)); + } + + return children; + } + private void setPresent(boolean present) { removeAll(); if (present) { - add(label, BorderLayout.NORTH); - add(bar, BorderLayout.CENTER); + setLayout(new GridLayout(bars.size(), 1)); + add(bars.get(pg), 0); + for (Progress child : getChildrenAsOrderedList(pg)) { + add(bars.get(child)); + } } - validate(); + revalidate(); repaint(); } }