X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fjalview%2Fgui%2FProgressPanel.java;fp=src%2Fjalview%2Fgui%2FProgressPanel.java;h=170e9eb3987f6883c71d8f2097a033f03511e563;hb=b5a209613f14ad6e75f43aa537a96484d847ce0a;hp=0000000000000000000000000000000000000000;hpb=0ca13d2d06bf5ee99eb7dc123ee7ffcea016f733;p=jalview.git diff --git a/src/jalview/gui/ProgressPanel.java b/src/jalview/gui/ProgressPanel.java new file mode 100644 index 0000000..170e9eb --- /dev/null +++ b/src/jalview/gui/ProgressPanel.java @@ -0,0 +1,148 @@ +/* + * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) + * Copyright (C) $$Year-Rel$$ The Jalview Authors + * + * This file is part of Jalview. + * + * Jalview is free software: you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 + * of the License, or (at your option) any later version. + * + * Jalview is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Jalview. If not, see . + * The Jalview Authors are detailed in the 'AUTHORS' file. + */ +package jalview.gui; + +import jalview.api.RendererListenerI; + +import java.awt.BorderLayout; +import java.awt.CardLayout; +import java.awt.Color; +import java.awt.Dimension; +import java.beans.PropertyChangeEvent; + +import javax.swing.BorderFactory; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JProgressBar; +import javax.swing.border.EmptyBorder; + +/** + * A class to manage a panel containing a label and progress bar updated by an + * event firing + * + * @author kmourao + * + */ +public class ProgressPanel extends JPanel implements RendererListenerI +{ + // max value of progress bar: values expected to be %s + private final int MAXVALUE = 100; + + private final String VISIBLE = "VISIBLE"; + + private final String INVISIBLE = "INVISIBLE"; + + // name of event property which updates the progress bar + private String eventName; + + private JProgressBar progressBar; + + private JLabel progressLabel; + + private JPanel labelPanel = new JPanel(); + + private CardLayout labelLayout = new CardLayout(); + + private JPanel barPanel = new JPanel(); + + private CardLayout barLayout = new CardLayout(); + + /** + * Construct a JPanel containing a progress bar and a label. + * + * @param eventPropertyName + * The name of the event property to update the progress bar + * @param label + * The label to place next to the progress bar + */ + public ProgressPanel(String eventPropertyName, String label, int maxwidth) + { + super(new BorderLayout(10, 0)); + setBorder(new EmptyBorder(0, 3, 0, 0)); + + eventName = eventPropertyName; + String labelText = label; + + final int w = maxwidth; + + progressBar = new JProgressBar() + { + @Override + public Dimension getMaximumSize() + { + return new Dimension(w, 1); + } + }; + progressBar.setMinimum(0); + progressBar.setPreferredSize(progressBar.getMaximumSize()); + progressLabel = new JLabel(labelText); + progressLabel.setFont(new java.awt.Font("Verdana", 0, 11)); + + // Use a CardLayout to stop the progress bar panel moving around when + // changing visibility + labelPanel.setLayout(labelLayout); + barPanel.setLayout(barLayout); + + labelPanel.add(progressLabel, VISIBLE); + labelPanel.add(new JPanel(), INVISIBLE); + barPanel.add(progressBar, VISIBLE); + barPanel.add(new JPanel(), INVISIBLE); + + labelLayout.show(labelPanel, VISIBLE); + barLayout.show(barPanel, VISIBLE); + + add(labelPanel, BorderLayout.WEST); + add(barPanel, BorderLayout.CENTER); + add(new JLabel(" "), BorderLayout.EAST); + + setBorder(BorderFactory.createLineBorder(Color.black)); + // setBorder(BorderFactory.createEtchedBorder(EtchedBorder.LOWERED)); + } + + @Override + /** + * Update the progress bar in response to the event. Expects the value + * supplied by the event to be in the range 0-100 i.e. a percentage + */ + public void propertyChange(PropertyChangeEvent evt) + { + if (evt.getPropertyName().equals(eventName)) + { + int progress = (int) evt.getNewValue(); + progressBar.setValue(progress); + + // switch progress bar to visible if it is not visible and current + // progress is less than MAXVALUE + // switch progress bar to invisible if it is visible and we reached + // MAXVALUE + if (progress < MAXVALUE && !progressBar.isVisible()) + { + labelLayout.show(labelPanel, VISIBLE); + barLayout.show(barPanel, VISIBLE); + } + if (progress >= MAXVALUE) + { + labelLayout.show(labelPanel, INVISIBLE); + barLayout.show(barPanel, INVISIBLE); + } + } + } +}