KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > net > sf > panoptes > swing > panels > MultiStatusBar


1 /*
2  * Created on Sep 3, 2003
3  *
4  */

5 package net.sf.panoptes.swing.panels;
6
7 import java.awt.BorderLayout JavaDoc;
8 import java.awt.Dimension JavaDoc;
9 import java.awt.event.ActionEvent JavaDoc;
10 import java.awt.event.ActionListener JavaDoc;
11 import java.util.ArrayList JavaDoc;
12 import java.util.HashMap JavaDoc;
13 import java.util.Iterator JavaDoc;
14
15 import javax.swing.BorderFactory JavaDoc;
16 import javax.swing.BoxLayout JavaDoc;
17 import javax.swing.JButton JavaDoc;
18 import javax.swing.JFrame JavaDoc;
19 import javax.swing.JLabel JavaDoc;
20 import javax.swing.JPanel JavaDoc;
21 import javax.swing.JProgressBar JavaDoc;
22 import javax.swing.SwingUtilities JavaDoc;
23 import javax.swing.Timer JavaDoc;
24 import javax.swing.UIManager JavaDoc;
25 import javax.swing.border.BevelBorder JavaDoc;
26
27 import net.sf.panoptes.swing.Operation;
28 import net.sf.panoptes.swing.OperationFactory;
29
30 import foxtrot.Job;
31 import foxtrot.Worker;
32
33 /**
34  *
35  *
36  * @author Dag Liodden
37  * @version 0.1
38  */

39 public class MultiStatusBar extends JPanel JavaDoc {
40
41     JPanel JavaDoc operationsContainer;
42     JPanel JavaDoc progressPanel;
43     JPanel JavaDoc operationPanel;
44     JPanel JavaDoc statusPanel;
45     private long defaultTimeToLive = 2000;
46     private ArrayList JavaDoc messages = new ArrayList JavaDoc();
47     private ArrayList JavaDoc operations = new ArrayList JavaDoc();
48     private Timer JavaDoc timer;
49     private Factory JavaDoc factory;
50     
51     public MultiStatusBar() {
52         factory = new Factory JavaDoc(this);
53         setLayout(new BorderLayout JavaDoc(5, 5));
54         setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
55
56         operationPanel = new JPanel JavaDoc();
57         operationPanel.setBorder(BorderFactory.createTitledBorder(operationPanel.getBorder()));
58         operationPanel.setLayout(new BoxLayout JavaDoc(operationPanel, BoxLayout.Y_AXIS));
59         add(operationPanel, BorderLayout.EAST);
60         operationPanel.setPreferredSize(new Dimension JavaDoc(200, 22));
61
62         statusPanel = new JPanel JavaDoc();
63         statusPanel.setBorder(BorderFactory.createTitledBorder(statusPanel.getBorder()));
64         statusPanel.setLayout(new BoxLayout JavaDoc(statusPanel, BoxLayout.Y_AXIS));
65         add(statusPanel, BorderLayout.CENTER);
66         
67         statusPanel.setPreferredSize(new Dimension JavaDoc(0, 22));
68     }
69
70     public void removeNotify() {
71         super.removeNotify();
72         timer.stop();
73     }
74
75     public void addNotify() {
76         super.addNotify();
77         timer = new Timer JavaDoc(100, new ActionListener JavaDoc() {
78             public void actionPerformed(ActionEvent JavaDoc e) {
79                 
80                 /** Remove expired messages **/
81                 long currentTime = System.currentTimeMillis();
82                 for (Iterator JavaDoc i = new ArrayList JavaDoc(messages).iterator(); i.hasNext();) {
83                     final StatusMessage m = (StatusMessage) i.next();
84                     if (m.getExpiresAt() < currentTime) {
85                         removeStatusMessage(m);
86                     }
87                 }
88                 
89                 /** Update any indefinite progress bars **/
90                 for (Iterator JavaDoc i = new ArrayList JavaDoc(operations).iterator(); i.hasNext(); ) {
91                     TaskBarOperation op = (TaskBarOperation) i.next();
92                     if (op.isIndefinite()) {
93                         int progress = op.getProgress();
94                         if (progress >= 5) op.setProgress(0, 5);
95                         else op.setProgress(++progress, 5);
96                     }
97                 }
98                 
99             }
100         });
101         timer.start();
102     }
103     public void setDefaultStatusMessageTimeToLive(long timeToLive) {
104         this.defaultTimeToLive = timeToLive;
105     }
106
107     public long getDefaultStatusMessageTimeToLive() {
108         return defaultTimeToLive;
109     }
110
111     public void addStatusMessage(String JavaDoc message, long timeToLive) {
112         StatusMessage msg = new StatusMessage(this, message, timeToLive);
113         messages.add(msg);
114         statusPanel.add(msg.getLabel());
115         statusPanel.revalidate();
116     }
117
118     public void addStatusMessage(String JavaDoc message) {
119         addStatusMessage(message, defaultTimeToLive);
120     }
121
122     private void removeStatusMessage(StatusMessage message) {
123         messages.remove(message);
124         statusPanel.remove(message.getLabel());
125         revalidate();
126     }
127
128     public Operation createOperation(String JavaDoc operationName, boolean indefinite) {
129         TaskBarOperation op = new TaskBarOperation(this, operationName);
130         op.setIndefinite(indefinite);
131         if (operations.size() == 0) {
132             //operationPanel.setVisible(true);
133
}
134         operations.add(op);
135         operationPanel.add(op.getPanel());
136         operationPanel.revalidate();
137         return op;
138     }
139     
140     public OperationFactory getFactory() {
141         return factory;
142     }
143
144     private void removeOperation(TaskBarOperation op) {
145         operations.remove(op.getName());
146         operationPanel.remove(op.getPanel());
147         if (operations.size() == 0) {
148             //operationPanel.setVisible(false);
149
}
150         operationPanel.revalidate();
151     }
152
153     private static class StatusMessage {
154         private String JavaDoc message;
155         private long expires;
156         private MultiStatusBar taskBar;
157         private JLabel JavaDoc text;
158
159         private StatusMessage(MultiStatusBar taskBar, String JavaDoc message, long timeToLive) {
160             this.taskBar = taskBar;
161             this.message = message;
162             this.expires = System.currentTimeMillis() + timeToLive;
163             this.text = new JLabel JavaDoc(message);
164         }
165
166         private JLabel JavaDoc getLabel() {
167             return text;
168         }
169
170         private long getExpiresAt() {
171             return expires;
172         }
173     }
174
175     public static class TaskBarOperation implements net.sf.panoptes.swing.Operation {
176         private String JavaDoc operationName;
177         private JLabel JavaDoc text;
178         private MultiStatusBar taskBar;
179         private JProgressBar JavaDoc progressBar;
180         private JPanel JavaDoc panel;
181         private int progress = -1;
182         private boolean indefinite = false;
183
184         private TaskBarOperation(MultiStatusBar taskBar, String JavaDoc operationName) {
185             this.taskBar = taskBar;
186             this.operationName = operationName;
187             this.progressBar = new JProgressBar JavaDoc();
188
189             panel = new JPanel JavaDoc(new BorderLayout JavaDoc(10, 1));
190             text = new JLabel JavaDoc("");
191             newTask(null);
192             panel.add(text, BorderLayout.WEST);
193             panel.add(progressBar, BorderLayout.EAST);
194         }
195
196         private JPanel JavaDoc getPanel() {
197             return panel;
198         }
199
200         public String JavaDoc getName() {
201             return operationName;
202         }
203
204         public void newTask(String JavaDoc taskName) {
205             if (taskName == null) {
206                 text.setText(operationName + ":");
207             } else {
208                 text.setText(operationName + " (" + taskName + "):");
209             }
210         }
211
212         public void setProgress(int currentProgress, int total) {
213             if (total != progressBar.getMaximum())
214                 progressBar.setMaximum(total);
215             progressBar.setValue(currentProgress);
216             progress = currentProgress;
217         }
218         
219         public int getProgress() {
220             return progress;
221         }
222
223         public void operationFinished() {
224             taskBar.removeOperation(this);
225         }
226
227         public void setIndefinite(boolean indefinite) {
228             this.indefinite = indefinite;
229             if (indefinite) progress = 0;
230         }
231         
232         public boolean isIndefinite() {
233             return indefinite;
234         }
235
236     }
237     
238     public static class Factory extends OperationFactory {
239         private MultiStatusBar statusBar;
240         public Factory(MultiStatusBar statusBar) {
241             this.statusBar = statusBar;
242         }
243         
244         public Operation createOperation(String JavaDoc name, boolean indefinite) {
245             return statusBar.createOperation(name, indefinite);
246         }
247
248         public void createStatusMessage(String JavaDoc message, long timeToLive) {
249             statusBar.addStatusMessage(message, timeToLive);
250         }
251
252         public void createStatusMessage(String JavaDoc message) {
253             statusBar.addStatusMessage(message);
254         }
255         
256         
257     }
258
259     public static void main(String JavaDoc[] args) {
260         try {
261             UIManager.setLookAndFeel("com.jgoodies.plaf.plastic.PlasticXPLookAndFeel");
262         } catch (Exception JavaDoc e) {
263             e.printStackTrace();
264         }
265         JFrame JavaDoc f = new JFrame JavaDoc("ProgressTest");
266         f.setContentPane(new JPanel JavaDoc(new BorderLayout JavaDoc()));
267
268         final MultiStatusBar taskBar = new MultiStatusBar();
269         f.getContentPane().add(taskBar, BorderLayout.SOUTH);
270
271         JButton JavaDoc btnTest = new JButton JavaDoc("Add some messages");
272         btnTest.addActionListener(new ActionListener JavaDoc() {
273             public void actionPerformed(ActionEvent JavaDoc e) {
274                 new Thread JavaDoc(new Runnable JavaDoc() {
275                     public void run() {
276                         for (int i = 0; i < 10; i++) {
277                             StringBuffer JavaDoc buf = new StringBuffer JavaDoc();
278                             for (int j = 10 - i; j > 0; j--)
279                                 buf.append("dag");
280                             taskBar.addStatusMessage(buf.toString());
281                             try {
282                                 Thread.sleep(200);
283                             } catch (InterruptedException JavaDoc ex) {
284
285                             }
286                         }
287
288                     }
289                 }).start();
290             }
291         });
292
293         f.getContentPane().add(btnTest, BorderLayout.NORTH);
294
295         f.pack();
296         f.setSize(new Dimension JavaDoc(400, 400));
297         f.show();
298             
299         Operation indef = taskBar.createOperation("Indefinite", true);
300         indef.setIndefinite(true);
301     
302         final Operation op1 = taskBar.createOperation("Operation 1", false);
303         new Thread JavaDoc(new Runnable JavaDoc() {
304             public void run() {
305                 taskBar.addStatusMessage("Operation 1 started");
306                 op1.setProgress(0, 100);
307                 for (int i = 0; i < 100; i++) {
308                     try {
309                         Thread.sleep(500);
310                     } catch (InterruptedException JavaDoc e) {
311                         break;
312                     }
313                     op1.setProgress(i, 100);
314                 }
315                 taskBar.addStatusMessage("Operation 1 finished");
316                 op1.operationFinished();
317             }
318         }).start();
319
320         final Operation op2 = taskBar.createOperation("Operation 2", false);
321         new Thread JavaDoc(new Runnable JavaDoc() {
322             public void run() {
323                 op2.newTask("Initializing");
324                 op2.setProgress(0, 100);
325                 for (int i = 0; i < 100;) {
326                     i += 5;
327                     try {
328                         Thread.sleep(500);
329                     } catch (InterruptedException JavaDoc e) {
330                         break;
331                     }
332                     op2.setProgress(i, 100);
333                 }
334                 taskBar.addStatusMessage("Done initializing");
335                 op2.newTask("Loading");
336                 op2.setProgress(0, 100);
337                 for (int i = 0; i < 100;) {
338                     i += 5;
339                     try {
340                         Thread.sleep(500);
341                     } catch (InterruptedException JavaDoc e) {
342                         break;
343                     }
344                     op2.setProgress(i, 100);
345                 }
346                 op2.operationFinished();
347             }
348         }).start();
349     }
350 }
351
Popular Tags