package com.deepnighttwo.resourceresolver.ui.views.utils; import java.io.File; import java.util.ArrayList; import java.util.List; 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.jface.preference.IPreferenceStore; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.Viewer; import com.deepnighttwo.resourceresolver.ui.Activator; import com.deepnighttwo.resourceresolver.ui.resolver.ResourceResolverType; import com.deepnighttwo.resourceresolver.ui.views.ResourceDetailsView; public class ResourceContentProvider implements IStructuredContentProvider { private Object[] data; private static Object[][] refreshingData; private static Object[][] emptyData; private static IPreferenceStore prefs = Activator.getDefault() .getPreferenceStore(); private ResourceDetailsView view; public ResourceContentProvider(ResourceDetailsView view) { this.view = view; refreshingData = new String[1][view.getColumnCount()]; emptyData = new String[1][view.getColumnCount()]; for (int i = 0; i < view.getColumnCount(); i++) { refreshingData[0][i] = ""; emptyData[0][i] = ""; } refreshingData[0][0] = "Refreshing..."; } private volatile Job currentJob = null; public synchronized void refreshData() { data = refreshingData; Job runner = new Job("Update Resource content") { @Override protected IStatus run(IProgressMonitor monitor) { List<Object> dataList = new ArrayList<Object>(); String path = prefs .getString(ResourceDetailsView.SOURCE_PATH_PREF); File dir = new File(path); int currIdx = 0; File[] allFiles = dir.listFiles(); if (allFiles == null) { if (shouldContinue() == true) { data = emptyData; pushDataToView(); } return Status.CANCEL_STATUS; } monitor.beginTask("Update resource content", allFiles.length); long lastPush = System.currentTimeMillis(); int lastSize = 0; ResourceResolverType[] types = view.getResourceResolverTypes(); for (File file : dir.listFiles()) { if (shouldContinue() == false) { return Status.CANCEL_STATUS; } Object[] rowData = new Object[view.getColumnCount()]; for (ResourceResolverType type : types) { if (shouldContinue() == false) { return Status.CANCEL_STATUS; } if (type.isEnabled() == false) { continue; } Object[] partData = type.getResolver().getResolvedData( file); int partLen = partData.length; System.arraycopy(partData, 0, rowData, currIdx, partLen); currIdx += partLen; } monitor.worked(1); dataList.add(rowData); currIdx = 0; // addtional operation long currentTime = System.currentTimeMillis(); int currentSize = dataList.size(); if (shouldContinue() == true && (((currentTime - lastPush) / 1000 > 1) || (currentSize - lastSize > 5))) { data = dataList.toArray(); pushDataToView(); lastPush = currentTime; lastSize = currentSize; } } if (shouldContinue() == true) { data = dataList.toArray(); pushDataToView(); return Status.OK_STATUS; } else { return Status.CANCEL_STATUS; } } private boolean shouldContinue() { return (this == currentJob) && (view.viewIsDisposed() == false) && (Activator.getDefault() != null); } }; currentJob = runner; runner.schedule(); } private void pushDataToView() { view.refreshViewTable(); } @Override public void dispose() { data = null; } @Override public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { refreshData(); } @Override public Object[] getElements(Object inputElement) { return data; } }