ProgressPanel.java
001 /*
002  * ProgressPanel.java
003  
004  * Copyright (c) 2011, The University of Sheffield. See the file COPYRIGHT.txt
005  * in the software or at http://gate.ac.uk/gate/COPYRIGHT.txt
006  
007  * This file is part of GATE (see http://gate.ac.uk/), and is free software,
008  * licenced under the GNU Library General Public License, Version 2, June 1991
009  * (in the distribution as file licence.html, and also available at
010  * http://gate.ac.uk/gate/licence.html).
011  
012  * Mark A. Greenwood, 30/10/2011
013  */
014 
015 package gate.gui.creole.manager;
016 
017 import gate.Gate;
018 
019 import gate.resources.img.svg.DownloadIcon;
020 import gate.resources.img.svg.ProgressIcon;
021 
022 import java.awt.Dimension;
023 import java.awt.event.ComponentEvent;
024 import java.awt.event.ComponentListener;
025 
026 import javax.swing.Box;
027 import javax.swing.BoxLayout;
028 import javax.swing.JLabel;
029 import javax.swing.JPanel;
030 import javax.swing.JProgressBar;
031 import javax.swing.SwingConstants;
032 import javax.swing.SwingUtilities;
033 import javax.swing.UIManager;
034 
035 @SuppressWarnings("serial")
036 public class ProgressPanel extends JPanel implements ComponentListener {
037   private static class SafeJProgressBar extends JProgressBar {
038     @Override
039     public void setIndeterminate(boolean indeterminate) {
040       // workaround for bug in some versions of Aqua L&F that prevents GATE
041       // from exiting if indeterminate progress bars are used
042       if(Gate.runningOnMac() && (UIManager.getLookAndFeel() == null
043           || UIManager.getLookAndFeel().getClass().getName().equals(
044             UIManager.getSystemLookAndFeelClassName()))) {
045         return;
046       else {
047         super.setIndeterminate(indeterminate);
048       }
049     }
050   }
051 
052   private JProgressBar progressTotal, progressSingle;
053 
054   private JLabel message, dlMsg;
055 
056   public ProgressPanel() {
057     super();
058 
059     setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
060 
061     progressTotal = new SafeJProgressBar();
062     progressTotal.setAlignmentX(CENTER_ALIGNMENT);
063     progressTotal.setMaximumSize(new Dimension(250, progressTotal
064             .getPreferredSize().height));
065     progressTotal.setIndeterminate(true);
066 
067     progressSingle = new SafeJProgressBar();
068     progressSingle.setAlignmentX(CENTER_ALIGNMENT);
069     progressSingle.setMaximumSize(new Dimension(250, progressTotal
070             .getPreferredSize().height));
071     progressSingle.setIndeterminate(true);
072     progressSingle.setVisible(false);
073     progressSingle.setMinimum(0);
074     progressSingle.setMaximum(100);
075 
076     message = new JLabel("");
077     message.setIcon(new ProgressIcon(4848));
078     message.setHorizontalTextPosition(SwingConstants.RIGHT);
079     message.setHorizontalAlignment(SwingConstants.CENTER);
080     message.setAlignmentX(CENTER_ALIGNMENT);
081 
082     dlMsg = new JLabel("Downloading CREOLE Plugin...");
083     dlMsg.setIcon(new DownloadIcon(4848));
084     dlMsg.setHorizontalTextPosition(SwingConstants.RIGHT);
085     dlMsg.setHorizontalAlignment(SwingConstants.CENTER);
086     dlMsg.setAlignmentX(CENTER_ALIGNMENT);
087     dlMsg.setVisible(false);
088 
089     add(Box.createVerticalGlue());
090     add(message);
091     add(Box.createVerticalStrut(5));
092     add(progressTotal);
093     add(Box.createVerticalStrut(10));
094     add(dlMsg);
095     add(Box.createVerticalStrut(5));
096     add(progressSingle);
097     add(Box.createVerticalGlue());
098 
099     addComponentListener(this);
100   }
101 
102   public void downloadStarting(final String name, final boolean sizeUnknown) {
103     SwingUtilities.invokeLater(new Thread() {
104       @Override
105       public void run() {
106         progressSingle.setValue(0);
107         progressSingle.setIndeterminate(sizeUnknown);
108         dlMsg.setText("Downloading " + name + " CREOLE Plugin...");
109         dlMsg.setVisible(true);
110         progressSingle.setVisible(true);
111       }
112     });
113   }
114 
115   public void downloadFinished() {
116     SwingUtilities.invokeLater(new Thread() {
117       @Override
118       public void run() {
119         dlMsg.setVisible(false);
120         progressSingle.setVisible(false);
121       }
122     });
123   }
124 
125   public void downloadProgress(final int progress) {
126     SwingUtilities.invokeLater(new Thread() {
127       @Override
128       public void run() {
129         progressSingle.setValue(progress);
130       }
131     });
132   }
133 
134   public void valueIncrement() {
135     SwingUtilities.invokeLater(new Thread() {
136       @Override
137       public void run() {
138         progressTotal.setValue(progressTotal.getValue() 1);
139       }
140     });
141   }
142 
143   public void valueChanged(final int value) {
144     SwingUtilities.invokeLater(new Thread() {
145       @Override
146       public void run() {
147         progressTotal.setValue(value);
148       }
149     });
150   }
151 
152   public void rangeChanged(final int min, final int max) {
153     SwingUtilities.invokeLater(new Thread() {
154       @Override
155       public void run() {
156         progressTotal.setMinimum(min);
157         progressTotal.setMaximum(max);
158         progressTotal.setIndeterminate(min == max);
159       }
160     });
161   }
162 
163   public void messageChanged(final String newMessage) {
164     SwingUtilities.invokeLater(new Thread() {
165       @Override
166       public void run() {
167         message.setText("<html><body>" + newMessage + "</body></html>");
168       }
169     });
170   }
171 
172   @Override
173   public void componentHidden(ComponentEvent e) {
174     // we don't currently need this
175   }
176 
177   @Override
178   public void componentMoved(ComponentEvent e) {
179     // we don't currently need this
180   }
181 
182   @Override
183   public void componentResized(ComponentEvent e) {
184     int width = Math.min(400(int)(getSize().width * (2f 3)));
185     progressTotal.setMaximumSize(new Dimension(width, progressTotal
186             .getPreferredSize().height));
187     progressSingle.setMaximumSize(new Dimension(width, progressSingle
188             .getPreferredSize().height));
189   }
190 
191   @Override
192   public void componentShown(ComponentEvent e) {
193     valueChanged(0);
194     componentResized(e);
195   }
196 }