/* GanttProject is an opensource project management tool. Copyright (C) 2004-2011 Alexandre Thomas, GanttProject Team This program 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. This program 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 this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ package net.sourceforge.ganttproject.gui; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.event.ActionEvent; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JProgressBar; import javax.swing.SwingUtilities; import net.sourceforge.ganttproject.GPLogger; import net.sourceforge.ganttproject.action.CancelAction; import net.sourceforge.ganttproject.font.Fonts; import org.eclipse.core.runtime.IProgressMonitor; /** * Status bar (located below the main frame) * * @author athomas */ public class GanttStatusBar extends JPanel { boolean bRunning = false; private JFrame myMainFrame; private static IProgressMonitor ourMonitor; public GanttStatusBar(JFrame mainFrame) { super(new BorderLayout()); myMainFrame = mainFrame; add(new JPanel(), BorderLayout.CENTER); } public IProgressMonitor createProgressMonitor() { if (ourMonitor == null) { ourMonitor = new ProgressMonitorImpl(); } return ourMonitor; } public void setFirstText(String text) { } public void setSecondText(String text) { } /** * Show the given text in the first message area for the given amount of * milliseconds * * @param text * to show * @param milliseconds * amount of milliseconds to show the text */ public void setFirstText(String text, int milliseconds) { } /** * Show the given text in the second message area for the given amount of * milliseconds * * @param text * to show * @param milliseconds * amount of milliseconds to show the text */ public void setSecondText(String text, int milliseconds) { } private class ProgressBarDialog extends JDialog { private JProgressBar myProgressBar; private JLabel myLabel; private String myTask; private String mySubTask; private IProgressMonitor myProgressMonitor; private int myWorked; private int myTotalWork; private ProgressBarDialog(IProgressMonitor progressMonitor) { super(myMainFrame, true); myProgressMonitor = progressMonitor; } @Override protected void dialogInit() { super.dialogInit(); myProgressBar = new JProgressBar(); myProgressBar.setMinimumSize(new Dimension(400, 50)); myProgressBar.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); myLabel = new JLabel(); myLabel.setFont(Fonts.GENERAL_DIALOG_FONT.deriveFont(14)); myLabel.setBorder(BorderFactory.createEmptyBorder(0, 5, 5, 5)); getContentPane().setLayout(new BorderLayout()); getContentPane().add(myProgressBar, BorderLayout.CENTER); JPanel labelAndButton = new JPanel(new BorderLayout()); labelAndButton.add(myLabel, BorderLayout.CENTER); JButton cancelButton = new JButton(new CancelAction() { @Override public void actionPerformed(ActionEvent e) { myProgressMonitor.setCanceled(true); // System.err.println("\n\n"+Platform.getJobManager().currentJob().getName()+"\n\n"); // Platform.getJobManager().currentJob().cancel(); } }); labelAndButton.add(cancelButton, BorderLayout.EAST); getContentPane().add(labelAndButton, BorderLayout.SOUTH); setResizable(false); this.setUndecorated(true); pack(); setSize(400, 60); DialogAligner.center(this, myMainFrame); } void start(String task, int totalWork) { myTask = task; myWorked = 0; myTotalWork = totalWork; myProgressBar.setMinimum(0); myProgressBar.setMaximum(totalWork); myLabel.setText(getLabelText()); setVisible(true); } void setSubTask(String subTask) { mySubTask = subTask; myLabel.setText(getLabelText()); } void setProgress(int work) { assert myWorked <= myTotalWork; myWorked = work; myProgressBar.setValue(work); myLabel.setText(getLabelText()); } void done() { // Reset bar to 0, otherwise it is briefly at 100% for a next job myProgressBar.setValue(0); dispose(); } private String getLabelText() { return "<html><body><b>" + (mySubTask == null ? myTask : mySubTask) + " ... " + myWorked * 100 / myTotalWork + "%</b></body></html>"; } } private class ProgressMonitorImpl implements IProgressMonitor { private int myWorked; ProgressBarDialog myProgressDialog; private boolean isCanceled; ProgressMonitorImpl() { myProgressDialog = new ProgressBarDialog(this); } @Override public void beginTask(final String name, final int totalWork) { isCanceled = false; myWorked = 0; GPLogger.log("[ProgressMonitorImpl] begin Task: name=" + name); SwingUtilities.invokeLater(new Runnable() { @Override public void run() { myProgressDialog.start(name, totalWork); } }); } @Override public void done() { GPLogger.log("[ProgressMonitorImpl] finished Task"); SwingUtilities.invokeLater(new Runnable() { @Override public void run() { myProgressDialog.done(); } }); } @Override public void internalWorked(double work) { } @Override public boolean isCanceled() { return isCanceled; } @Override public void setCanceled(boolean value) { myProgressDialog.done(); isCanceled = value; } @Override public void setTaskName(String name) { } @Override public void subTask(final String name) { if (name == null) { GPLogger.log("[ProgressMonitorImpl] finished subTask"); } else { GPLogger.log("[ProgressMonitorImpl] begin subTask: name=" + name); } SwingUtilities.invokeLater(new Runnable() { @Override public void run() { myProgressDialog.setSubTask(name); } }); } @Override public void worked(final int work) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { myWorked += work; myProgressDialog.setProgress(myWorked); } }); } } public void setNotificationManager(NotificationManagerImpl notificationManager) { add(notificationManager.getChannelButtons(), BorderLayout.EAST); } }