package com.link_intersystems.swing; import java.awt.event.ActionEvent; import javax.swing.AbstractAction; import javax.swing.Action; public abstract class ProgressAction extends AbstractAction { private static final long serialVersionUID = -4286176570489467961L; private ProgressMonitor progressMonitor = NullProgressMonitor.INSTANCE; public static final String PROP_RUNNING = "running"; private ProgressActionMediator actionMediator = new ProgressActionMediator( this); private boolean running; public void addDisabledActionWhileRunning(Action action) { actionMediator.addDisabledActionWhileRunning(action); } public void addEnabledActionWhileRunning(Action action) { actionMediator.addEnabledActionWhileRunning(action); } private boolean disableWhileRunning; public void setDisableWhileRunning(boolean disableWhileRunning) { this.disableWhileRunning = disableWhileRunning; } @Override public final void actionPerformed(ActionEvent e) { try { setRunning(true); doActionPerformed(e, progressMonitor); } finally { setRunning(false); progressMonitor.end(); } } public void setProgressMonitor(ProgressMonitor progressMonitor) { if (progressMonitor == null) { progressMonitor = NullProgressMonitor.INSTANCE; } this.progressMonitor = progressMonitor; } protected void doActionPerformed(ActionEvent e, ProgressMonitor progressMonitor) { } public boolean isRunning() { return running; } protected void setRunning(boolean running) { if (running) { if (disableWhileRunning) { setEnabled(false); } } else { setEnabled(true); } firePropertyChange(PROP_RUNNING, this.running, this.running = running); } }