Version 1.3.5: better ProgressBar
[nikiroo-utils.git] / src / be / nikiroo / utils / ui / ProgressBar.java
CommitLineData
b3aad1f9
NR
1package be.nikiroo.utils.ui;
2
88b36f83 3import java.awt.GridLayout;
b3aad1f9
NR
4import java.awt.event.ActionEvent;
5import java.awt.event.ActionListener;
6import java.util.ArrayList;
88b36f83 7import java.util.HashMap;
b3aad1f9 8import java.util.List;
88b36f83 9import java.util.Map;
b3aad1f9 10
b3aad1f9
NR
11import javax.swing.JPanel;
12import javax.swing.JProgressBar;
13import javax.swing.SwingUtilities;
14
15import be.nikiroo.utils.Progress;
16
17public class ProgressBar extends JPanel {
18 private static final long serialVersionUID = 1L;
19
88b36f83 20 private Map<Progress, JProgressBar> bars;
b3aad1f9 21 private List<ActionListener> listeners;
88b36f83 22 private Progress pg;
b3aad1f9
NR
23
24 public ProgressBar() {
88b36f83 25 bars = new HashMap<Progress, JProgressBar>();
b3aad1f9 26 listeners = new ArrayList<ActionListener>();
b3aad1f9
NR
27 }
28
88b36f83
NR
29 public void setProgress(final Progress pg) {
30 this.pg = pg;
31
b3aad1f9
NR
32 if (pg == null) {
33 setPresent(false);
34 } else {
88b36f83
NR
35 final JProgressBar bar = new JProgressBar();
36 bar.setStringPainted(true);
37
38 bars.clear();
39 bars.put(pg, bar);
40
b3aad1f9
NR
41 bar.setMinimum(pg.getMin());
42 bar.setMaximum(pg.getMax());
43 bar.setValue(pg.getProgress());
88b36f83 44 bar.setString(pg.getName());
b3aad1f9
NR
45
46 pg.addProgressListener(new Progress.ProgressListener() {
88b36f83
NR
47 public void progress(Progress progress, String name) {
48
b3aad1f9
NR
49 SwingUtilities.invokeLater(new Runnable() {
50 public void run() {
88b36f83
NR
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 }
b3aad1f9 65
88b36f83
NR
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()) {
b3aad1f9
NR
77 for (ActionListener listener : listeners) {
78 listener.actionPerformed(new ActionEvent(
79 ProgressBar.this, 0, "done"));
80 }
81 }
88b36f83
NR
82
83 setPresent(true);
b3aad1f9
NR
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
88b36f83
NR
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
b3aad1f9
NR
111 private void setPresent(boolean present) {
112 removeAll();
113
114 if (present) {
88b36f83
NR
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 }
b3aad1f9
NR
120 }
121
88b36f83 122 revalidate();
b3aad1f9
NR
123 repaint();
124 }
125}