/* * This file is part of muCommander, http://www.mucommander.com * Copyright (C) 2002-2016 Maxence Bernard * * muCommander 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. * * muCommander 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, see <http://www.gnu.org/licenses/>. */ package com.mucommander.ui.main; import java.awt.Insets; import javax.swing.JMenuItem; import javax.swing.JPopupMenu; import com.mucommander.job.FileJob; import com.mucommander.job.JobListener; import com.mucommander.job.JobsManager; import com.mucommander.ui.button.PopupButton; import com.mucommander.ui.button.RolloverButtonAdapter; import com.mucommander.ui.icon.IconManager; /** * JobsPopupButton is a button that allows to interact with {@link FileJob}s that are running in the background. * When the button is clicked, a popup menu is displayed, showing the operations that are currently running * int the background. Clicking on a job displays its progress dialog and removes it from the list of jobs * that are running in the background (the job switches to blocking mode). * Note that this button will only be functional when there are jobs running in the background. * * @author Arik Hadas */ class JobsPopupButton extends PopupButton implements JobListener { /** Holds a reference to the RolloverButtonAdapter instance so that it doesn't get garbage-collected */ private RolloverButtonAdapter rolloverButtonAdapter; JobsPopupButton() { setContentAreaFilled(false); setIcon(IconManager.getIcon(IconManager.STATUS_BAR_ICON_SET, "waiting.png")); // Rollover-enable the button and hold a reference to the RolloverButtonAdapter instance so that it doesn't // get garbage-collected rolloverButtonAdapter = new RolloverButtonAdapter(); RolloverButtonAdapter.setButtonDecoration(this); addMouseListener(rolloverButtonAdapter); setVisible(false); JobsManager.getInstance().addJobListener(this); } @Override public Insets getInsets() { return new Insets(2, 2, 2, 2); } @Override public void jobAdded(FileJob source) { int nbBackgroundJobs = JobsManager.getInstance().getBackgroundJobs().size(); setVisible(nbBackgroundJobs != 0); } @Override public void jobRemoved(FileJob source) { int nbBackgroundJobs = JobsManager.getInstance().getBackgroundJobs().size(); setVisible(nbBackgroundJobs != 0); if (!isVisible() && isPopupMenuVisible()) popupMenu.setVisible(false); } @Override public JPopupMenu getPopupMenu() { JPopupMenu popupMenu = new JPopupMenu(); JobsManager jobsManager = JobsManager.getInstance(); for (FileJob job : jobsManager.getBackgroundJobs()) { JMenuItem jobItem = new JMenuItem(); jobItem.setText(String.format("%s (%s%%)", job.getProgressDialog().getTitle(), job.getJobProgress().getTotalPercentInt())); jobItem.addActionListener(e -> { job.setRunInBackground(false); job.getProgressDialog().showDialog(); }); jobsManager.addJobListener(new JobListener() { @Override public void jobProgress(FileJob source, boolean fullUpdate) { if (source == job) { jobItem.setText(String.format("%s (%s%%)", job.getProgressDialog().getTitle(), job.getJobProgress().getTotalPercentInt())); } } }); popupMenu.add(jobItem); } return popupMenu; } }