Commit | Line | Data |
---|---|---|
b3aad1f9 NR |
1 | package be.nikiroo.utils.ui; |
2 | ||
88b36f83 | 3 | import java.awt.GridLayout; |
b3aad1f9 NR |
4 | import java.awt.event.ActionEvent; |
5 | import java.awt.event.ActionListener; | |
6 | import java.util.ArrayList; | |
88b36f83 | 7 | import java.util.HashMap; |
b3aad1f9 | 8 | import java.util.List; |
88b36f83 | 9 | import java.util.Map; |
b3aad1f9 | 10 | |
b3aad1f9 NR |
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 | ||
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 | } |