JAL-2587 Keep progress bar panel in position regardless of visibility
[jalview.git] / src / jalview / gui / ProgressPanel.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3  * Copyright (C) $$Year-Rel$$ The Jalview Authors
4  * 
5  * This file is part of Jalview.
6  * 
7  * Jalview is free software: you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License 
9  * as published by the Free Software Foundation, either version 3
10  * of the License, or (at your option) any later version.
11  *  
12  * Jalview is distributed in the hope that it will be useful, but 
13  * WITHOUT ANY WARRANTY; without even the implied warranty 
14  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
15  * PURPOSE.  See the GNU General Public License for more details.
16  * 
17  * You should have received a copy of the GNU General Public License
18  * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
19  * The Jalview Authors are detailed in the 'AUTHORS' file.
20  */
21 package jalview.gui;
22
23 import jalview.api.RendererListenerI;
24
25 import java.awt.BorderLayout;
26 import java.awt.CardLayout;
27 import java.beans.PropertyChangeEvent;
28
29 import javax.swing.JLabel;
30 import javax.swing.JPanel;
31 import javax.swing.JProgressBar;
32 import javax.swing.border.EmptyBorder;
33
34 /**
35  * A class to manage a panel containing a label and progress bar updated by an
36  * event firing
37  * 
38  * @author kmourao
39  *
40  */
41 public class ProgressPanel extends JPanel implements RendererListenerI
42 {
43   // max value of progress bar: values expected to be %s
44   private final int MAXVALUE = 100;
45
46   private final String VISIBLE = "VISIBLE";
47
48   private final String INVISIBLE = "INVISIBLE";
49
50   // name of event property which updates the progress bar
51   private String eventName;
52
53   private JProgressBar progressBar;
54
55   private JLabel progressLabel;
56
57   private JPanel labelPanel = new JPanel();
58
59   private CardLayout labelLayout = new CardLayout();
60
61   private JPanel barPanel = new JPanel();
62
63   private CardLayout barLayout = new CardLayout();
64
65   /**
66    * Construct a JPanel containing a progress bar and a label.
67    * 
68    * @param eventPropertyName
69    *          The name of the event property to update the progress bar
70    * @param label
71    *          The label to place next to the progress bar
72    */
73   public ProgressPanel(String eventPropertyName, String label)
74   {
75     super(new BorderLayout(10, 0));
76     setBorder(new EmptyBorder(0, 3, 0, 20));
77
78     eventName = eventPropertyName;
79     String labelText = label;
80
81     progressBar = new JProgressBar();
82     progressBar.setMinimum(0);
83     progressLabel = new JLabel(labelText);
84
85     // Use a CardLayout to stop the progress bar panel moving around when
86     // changing visibility
87     labelPanel.setLayout(labelLayout);
88     barPanel.setLayout(barLayout);
89   
90     labelPanel.add(progressLabel, VISIBLE);
91     labelPanel.add(new JPanel(), INVISIBLE);
92     barPanel.add(progressBar, VISIBLE);
93     barPanel.add(new JPanel(), INVISIBLE);
94
95     labelLayout.show(labelPanel, VISIBLE);
96     barLayout.show(barPanel, VISIBLE);
97
98     add(labelPanel, BorderLayout.WEST);
99     add(barPanel, BorderLayout.CENTER);
100   }
101
102   @Override
103   /**
104    * Update the progress bar in response to the event. Expects the value
105    * supplied by the event to be in the range 0-100 i.e. a percentage
106    */
107   public void propertyChange(PropertyChangeEvent evt)
108   {
109     if (evt.getPropertyName().equals(eventName))
110     {
111       int progress = (int) evt.getNewValue();
112       progressBar.setValue(progress);
113
114       // switch progress bar to visible if it is not visible and current
115       // progress is less than MAXVALUE
116       // switch progress bar to invisible if it is visible and we reached
117       // MAXVALUE
118       if (progress < MAXVALUE && !progressBar.isVisible())
119       {
120         labelLayout.show(labelPanel, VISIBLE);
121         barLayout.show(barPanel, VISIBLE);
122       }
123       else if (progress >= MAXVALUE)
124       {
125         labelLayout.show(labelPanel, INVISIBLE);
126         barLayout.show(barPanel, INVISIBLE);
127       }
128     }
129   }
130 }