package com.netifera.platform.host.processes.ui; import java.util.ArrayList; import java.util.List; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import com.netifera.platform.host.internal.processes.ui.Activator; import com.netifera.platform.host.processes.IProcessManager; import com.netifera.platform.host.processes.Process; ;public class ProcessListContentProvider implements ITreeContentProvider { private TreeViewer viewer; private IProcessManager processManager; private Process[] roots; private boolean treeMode = false; public Object[] getChildren(Object o) { if (!treeMode || !(o instanceof Process) || (roots == null)) return new Object[0]; Process parent = (Process) o; List<Process> children = new ArrayList<Process>(); for (Process process: roots) { if (process.getPPID() == parent.getPID()) children.add(process); } return children.toArray(new Process[children.size()]); } public Process getParent(Object o) { if (!treeMode || !(o instanceof Process) || (roots == null)) return null; for (Process process: roots) if (process.getPID() == ((Process)o).getPPID()) return process; return null; } public boolean hasChildren(Object o) { if (!treeMode || !(o instanceof Process) || (roots == null)) return false; for (Process process: roots) if (process.getPPID() == ((Process)o).getPID()) return true; return false; } public Object[] getElements(final Object input) { if(input != processManager) { throw new IllegalArgumentException(); } if (roots == null) { new Thread(new Runnable() { public void run() { try { final Process[] children = processManager.getProcessList(); viewer.getControl().getDisplay().syncExec(new Runnable() { public void run() { if (processManager != input) return; roots = children; viewer.refresh(true); } }); } catch (Exception e) { showException(e); } } }).start(); return new String[] {"Loading..."}; } if (!treeMode) return roots.clone(); List<Process> elements = new ArrayList<Process>(); for (Process process: roots) { if (getParent(process) == null) elements.add(process); } return elements.toArray(new Process[elements.size()]); } public void dispose() { // TODO Auto-generated method stub } public void clear() { roots = null; } public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { this.viewer = (TreeViewer) viewer; processManager = (IProcessManager) newInput; clear(); } public void setTreeMode(boolean enabled) { treeMode = enabled; } public boolean isTreeMode() { return treeMode; } private void showException(Exception e) { final String message = e.getMessage() != null ? e.getMessage() : e.toString(); /* if (view != null) viewer.getControl().getDisplay().syncExec(new Runnable() { public void run() { if (view != null) view.showMessage("Error: "+message); else Activator.getInstance().getBalloonManager().error(message); } }); else */ Activator.getInstance().getBalloonManager().error(message); } }