/**
*
*/
package goko.dialog;
import java.util.HashMap;
import java.util.Map;
import javax.inject.Inject;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.e4.ui.di.UISynchronize;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
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 org.eclipse.swt.widgets.Shell;
import org.eclipse.wb.swt.SWTResourceManager;
/**
* @author PsyKo
*
*/
public class GokoProgressDialog extends Dialog {
private int runningTasks;
@Inject
private UISynchronize sync;
private Label lblOperationInProgress;
private Map<Job, JobProgressElement> mapProgressElement;
private ScrolledComposite scrolledComposite;
private Composite composite;
private Label lblNewLabel;
/**
* Create the dialog.
* @param shell
*
* @param parentShell
*/
public GokoProgressDialog() {
super((Shell)null);
setShellStyle(SWT.BORDER | SWT.RESIZE | SWT.TITLE | SWT.ON_TOP | SWT.MODELESS);
setBlockOnOpen(false);
mapProgressElement = new HashMap<Job, JobProgressElement>();
}
/**
* Create contents of the dialog.
*
* @param parent
*/
@Override
protected Control createDialogArea(Composite parent) {
Composite container = (Composite) super.createDialogArea(parent);
lblOperationInProgress = new Label(container, SWT.SMOOTH);
lblOperationInProgress.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false, 1, 1));
lblOperationInProgress.setText("Operation in progress...");
scrolledComposite = new ScrolledComposite(container, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
scrolledComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
scrolledComposite.setExpandHorizontal(true);
scrolledComposite.setExpandVertical(true);
composite = new Composite(scrolledComposite, SWT.NONE);
composite.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE));
composite.setLayout(new GridLayout(1, false));
scrolledComposite.setContent(composite);
scrolledComposite.setMinSize(composite.computeSize(SWT.DEFAULT, SWT.DEFAULT));
return container;
}
/** (inheritDoc)
* @see org.eclipse.jface.dialogs.Dialog#okPressed()
*/
@Override
protected void okPressed() {
this.getShell().setVisible(false);
}
/**
* Create contents of the button bar.
*
* @param parent
*/
@Override
protected void createButtonsForButtonBar(Composite parent) {
createButton(parent, IDialogConstants.OK_ID, "Hide", true);
}
/**
* Return the initial size of the dialog.
*/
@Override
protected Point getInitialSize() {
return new Point(419, 402);
}
/**
* @return the runningTasks
*/
public int getRunningTasks() {
return runningTasks;
}
/**
* @param runningTasks the runningTasks to set
*/
public void setRunningTasks(int runningTasks) {
this.runningTasks = runningTasks;
}
public void requestShow(){
Display.getCurrent().timerExec(500, new Runnable() {
@Override
public void run() {
if(!mapProgressElement.isEmpty()){
if(!GokoProgressDialog.this.getShell().isDisposed()){
GokoProgressDialog.this.getShell().setVisible(true);
}
}
}
});
//sync.asyncExec();
}
public IProgressMonitor addJob(final Job job) {
if (job != null && job.isUser()) {
sync.syncExec(new Runnable() {
@Override
public void run() {
if(!GokoProgressDialog.this.getShell().isDisposed()){
JobProgressElement progressElement = new JobProgressElement(composite, SWT.NONE, sync, job, GokoProgressDialog.this);
progressElement.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
mapProgressElement.put(job, progressElement);
composite.pack();
requestShow();
}
}
});
}
return mapProgressElement.get(job);
}
public void remove(final JobProgressElement elt){
mapProgressElement.remove(elt.getJob());
sync.syncExec(new Runnable() {
@Override
public void run() {
elt.dispose();
if(mapProgressElement.isEmpty()){
if(!GokoProgressDialog.this.getShell().isDisposed()){
GokoProgressDialog.this.getShell().setVisible(false);
}
}
if(!composite.isDisposed()){
composite.pack(true);
}
}
});
}
}