Version 1.3.5: better ProgressBar
[nikiroo-utils.git] / src / be / nikiroo / utils / ui / ProgressBar.java
1 package be.nikiroo.utils.ui;
2
3 import java.awt.GridLayout;
4 import java.awt.event.ActionEvent;
5 import java.awt.event.ActionListener;
6 import java.util.ArrayList;
7 import java.util.HashMap;
8 import java.util.List;
9 import java.util.Map;
10
11 import javax.swing.JPanel;
12 import javax.swing.JProgressBar;
13 import javax.swing.SwingUtilities;
14
15 import be.nikiroo.utils.Progress;
16
17 public class ProgressBar extends JPanel {
18 private static final long serialVersionUID = 1L;
19
20 private Map<Progress, JProgressBar> bars;
21 private List<ActionListener> listeners;
22 private Progress pg;
23
24 public ProgressBar() {
25 bars = new HashMap<Progress, JProgressBar>();
26 listeners = new ArrayList<ActionListener>();
27 }
28
29 public void setProgress(final Progress pg) {
30 this.pg = pg;
31
32 if (pg == null) {
33 setPresent(false);
34 } else {
35 final JProgressBar bar = new JProgressBar();
36 bar.setStringPainted(true);
37
38 bars.clear();
39 bars.put(pg, bar);
40
41 bar.setMinimum(pg.getMin());
42 bar.setMaximum(pg.getMax());
43 bar.setValue(pg.getProgress());
44 bar.setString(pg.getName());
45
46 pg.addProgressListener(new Progress.ProgressListener() {
47 public void progress(Progress progress, String name) {
48
49 SwingUtilities.invokeLater(new Runnable() {
50 public void run() {
51 Map<Progress, JProgressBar> newBars = new HashMap<Progress, JProgressBar>();
52 newBars.put(pg, bar);
53
54 bar.setMinimum(pg.getMin());
55 bar.setMaximum(pg.getMax());
56 bar.setValue(pg.getProgress());
57 bar.setString(pg.getName());
58
59 for (Progress pg : getChildrenAsOrderedList(pg)) {
60 JProgressBar bar = bars.get(pg);
61 if (bar == null) {
62 bar = new JProgressBar();
63 bar.setStringPainted(true);
64 }
65
66 newBars.put(pg, bar);
67
68 bar.setMinimum(pg.getMin());
69 bar.setMaximum(pg.getMax());
70 bar.setValue(pg.getProgress());
71 bar.setString(pg.getName());
72 }
73
74 bars = newBars;
75
76 if (pg.isDone()) {
77 for (ActionListener listener : listeners) {
78 listener.actionPerformed(new ActionEvent(
79 ProgressBar.this, 0, "done"));
80 }
81 }
82
83 setPresent(true);
84 }
85 });
86 }
87 });
88
89 setPresent(true);
90 }
91 }
92
93 public void addActioListener(ActionListener l) {
94 listeners.add(l);
95 }
96
97 public void clearActionListeners() {
98 listeners.clear();
99 }
100
101 private List<Progress> getChildrenAsOrderedList(Progress pg) {
102 List<Progress> children = new ArrayList<Progress>();
103 for (Progress child : pg.getChildren()) {
104 children.add(child);
105 children.addAll(getChildrenAsOrderedList(child));
106 }
107
108 return children;
109 }
110
111 private void setPresent(boolean present) {
112 removeAll();
113
114 if (present) {
115 setLayout(new GridLayout(bars.size(), 1));
116 add(bars.get(pg), 0);
117 for (Progress child : getChildrenAsOrderedList(pg)) {
118 add(bars.get(child));
119 }
120 }
121
122 revalidate();
123 repaint();
124 }
125 }