/******************************************************************************* * Copyright (c) 2004, 2008 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.ui.internal.progress; import java.util.HashSet; import java.util.Iterator; import java.util.Set; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.ui.internal.progress.FinishedJobs.KeptJobsListener; import org.eclipse.ui.progress.WorkbenchJob; /** * The ProgressViewerContentProvider is the content provider progress viewers. */ public class ProgressViewerContentProvider extends ProgressContentProvider { protected AbstractProgressViewer progressViewer; private KeptJobsListener keptJobListener; private boolean showFinished; /** * Create a new instance of the receiver. * * @param structured * The Viewer we are providing content for * @param debug * If true debug information will be shown if the debug flag in * the ProgressManager is true. * @param showFinished * A boolean that indicates whether or not the finished jobs * should be shown. */ public ProgressViewerContentProvider(AbstractProgressViewer structured, boolean debug, boolean showFinished) { super(debug); progressViewer = structured; this.showFinished = showFinished; if (showFinished) { FinishedJobs.getInstance().addListener(getKeptJobListener()); } } /** * Return a listener for kept jobs. * * @return KeptJobsListener */ private KeptJobsListener getKeptJobListener() { keptJobListener = new KeptJobsListener() { /* * (non-Javadoc) * * @see org.eclipse.ui.internal.progress.FinishedJobs.KeptJobsListener#finished(org.eclipse.ui.internal.progress.JobTreeElement) */ public void finished(JobTreeElement jte) { final JobTreeElement element = jte; Job updateJob = new WorkbenchJob("Refresh finished") {//$NON-NLS-1$ /* * (non-Javadoc) * * @see org.eclipse.ui.progress.UIJob#runInUIThread(org.eclipse.core.runtime.IProgressMonitor) */ public IStatus runInUIThread(IProgressMonitor monitor) { refresh(new Object[] { element }); return Status.OK_STATUS; } /* (non-Javadoc) * @see org.eclipse.ui.progress.WorkbenchJob#shouldSchedule() */ public boolean shouldSchedule() { return !progressViewer.getControl().isDisposed(); } /* (non-Javadoc) * @see org.eclipse.ui.progress.WorkbenchJob#shouldRun() */ public boolean shouldRun() { return !progressViewer.getControl().isDisposed(); } }; updateJob.setSystem(true); updateJob.schedule(); } /* * (non-Javadoc) * * @see org.eclipse.ui.internal.progress.FinishedJobs.KeptJobsListener#removed(org.eclipse.ui.internal.progress.JobTreeElement) */ public void removed(JobTreeElement jte) { final JobTreeElement element = jte; Job updateJob = new WorkbenchJob("Remove finished") {//$NON-NLS-1$ /* * (non-Javadoc) * * @see org.eclipse.ui.progress.UIJob#runInUIThread(org.eclipse.core.runtime.IProgressMonitor) */ public IStatus runInUIThread(IProgressMonitor monitor) { if (element == null) { refresh(); } else { ProgressViewerContentProvider.this .remove(new Object[] { element }); } return Status.OK_STATUS; } }; updateJob.setSystem(true); updateJob.schedule(); } }; return keptJobListener; } /* * (non-Javadoc) * * @see org.eclipse.ui.internal.progress.IProgressUpdateCollector#refresh() */ public void refresh() { progressViewer.refresh(true); } /* * (non-Javadoc) * * @see org.eclipse.ui.internal.progress.IProgressUpdateCollector#refresh(org.eclipse.ui.internal.progress.JobTreeElement[]) */ public void refresh(Object[] elements) { Object[] refreshes = getRoots(elements, true); for (int i = 0; i < refreshes.length; i++) { progressViewer.refresh(refreshes[i], true); } } /* * (non-Javadoc) * * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object) */ public Object[] getElements(Object inputElement) { Object[] elements = super.getElements(inputElement); if (!showFinished) return elements; Set kept = FinishedJobs.getInstance().getKeptAsSet(); if (kept.size() == 0) return elements; Set all = new HashSet(); for (int i = 0; i < elements.length; i++) { Object element = elements[i]; all.add(element); } Iterator keptIterator = kept.iterator(); while (keptIterator.hasNext()) { JobTreeElement next = (JobTreeElement) keptIterator.next(); if (next.getParent() != null && all.contains(next.getParent())) continue; all.add(next); } return all.toArray(); } /** * Get the root elements of the passed elements as we only show roots. * Replace the element with its parent if subWithParent is true * * @param elements * the array of elements. * @param subWithParent * sub with parent flag. * @return Object[] */ private Object[] getRoots(Object[] elements, boolean subWithParent) { if (elements.length == 0) { return elements; } HashSet roots = new HashSet(); for (int i = 0; i < elements.length; i++) { JobTreeElement element = (JobTreeElement) elements[i]; if (element.isJobInfo()) { GroupInfo group = ((JobInfo) element).getGroupInfo(); if (group == null) { roots.add(element); } else { if (subWithParent) { roots.add(group); } } } else { roots.add(element); } } return roots.toArray(); } public void add(Object[] elements) { progressViewer.add(elements); } public void remove(Object[] elements) { progressViewer.remove(elements); } /* * (non-Javadoc) * * @see org.eclipse.jface.viewers.IContentProvider#dispose() */ public void dispose() { super.dispose(); if (keptJobListener != null) { FinishedJobs.getInstance().removeListener(keptJobListener); } } }