package name.abuchen.portfolio.ui;
import java.io.IOException;
import javax.annotation.PostConstruct;
import javax.inject.Inject;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.jobs.IJobChangeEvent;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.core.runtime.jobs.JobChangeAdapter;
import org.eclipse.core.runtime.jobs.ProgressProvider;
import org.eclipse.e4.ui.di.UISynchronize;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import name.abuchen.portfolio.model.Client;
import name.abuchen.portfolio.ui.util.ProgressMonitorFactory;
public class ClientProgressProvider extends ProgressProvider
{
private class MonitorImpl implements IProgressMonitor
{
private boolean isCanceled = false;
@Override
public void beginTask(final String name, int totalWork)
{
internalSetText(name);
}
@Override
public void done()
{
internalSetText(""); //$NON-NLS-1$
}
@Override
public void internalWorked(double work)
{}
@Override
public boolean isCanceled()
{
return isCanceled;
}
@Override
public void setCanceled(boolean value)
{
this.isCanceled = value;
}
@Override
public void setTaskName(String name)
{
internalSetText(name);
}
@Override
public void subTask(final String name)
{
internalSetText(name);
}
@Override
public void worked(int work)
{}
private void internalSetText(final String text)
{
sync.asyncExec(() -> {
if (!label.isDisposed())
label.setText(text);
});
}
}
@Inject
private Client client;
@Inject
private ProgressMonitorFactory factory;
@Inject
private UISynchronize sync;
private Label label;
@PostConstruct
public void setup()
{
factory.addProgressProvider(this);
}
protected void disposed()
{
factory.removeProgressProvider(this);
}
@PostConstruct
public void createComposite(Composite parent) throws IOException
{
label = new Label(parent, SWT.LEFT);
label.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_DARK_GRAY));
label.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_WHITE));
label.setText(""); //$NON-NLS-1$
parent.addDisposeListener(e -> disposed());
}
@Override
public IProgressMonitor createMonitor(Job job)
{
if (job.belongsTo(client))
{
final MonitorImpl monitor = new MonitorImpl();
job.addJobChangeListener(new JobChangeAdapter()
{
@Override
public void done(IJobChangeEvent event)
{
monitor.done();
}
});
return monitor;
}
else
{
return null;
}
}
public Control getControl()
{
return label;
}
}