/******************************************************************************* * Copyright 2005-2007, CHISEL Group, University of Victoria, Victoria, BC, Canada * and IBM Corporation. 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: * The Chisel Group, University of Victoria *******************************************************************************/ package net.sourceforge.tagsea.resources.synchronize.ui; import java.lang.reflect.InvocationTargetException; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.TreeSet; import net.sourceforge.tagsea.resources.ResourceWaypointPlugin; import net.sourceforge.tagsea.resources.synchronize.WaypointSynchronizeObject; import net.sourceforge.tagsea.resources.synchronize.WaypointSynchronizerHelp; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.Path; import org.eclipse.jface.dialogs.ProgressMonitorDialog; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.widgets.Display; class ProjectWaypointContentProvider implements ITreeContentProvider { private HashMap<IPath, List<WaypointSynchronizeObject>> synchronizers; private class SynchronizeLoadRunnable implements IRunnableWithProgress { private List<WaypointSynchronizeObject> synchronizers; private IProject project; public SynchronizeLoadRunnable(IProject project) { this.project = project; } /* (non-Javadoc) * @see org.eclipse.jface.operation.IRunnableWithProgress#run(org.eclipse.core.runtime.IProgressMonitor) */ public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { this.synchronizers = WaypointSynchronizerHelp.INSTANCE.getSynchronizeInfo(project, monitor); } /** * @return the synchronizers */ public List<WaypointSynchronizeObject> getSynchronizers() { return synchronizers; } } ProjectWaypointContentProvider() { synchronizers = new HashMap<IPath, List<WaypointSynchronizeObject>>(); } /* (non-Javadoc) * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object) */ public Object[] getChildren(Object parentElement) { if (parentElement instanceof IProject) { final IProject project = (IProject) parentElement; ProgressMonitorDialog dialog = new ProgressMonitorDialog(Display.getDefault().getActiveShell()); try { SynchronizeLoadRunnable synchronizer = new SynchronizeLoadRunnable(project); dialog.run(true, true, synchronizer); List<WaypointSynchronizeObject> unsorted = synchronizer.getSynchronizers(); List<IPath> keysToRemove = new LinkedList<IPath>(); HashSet<Object> result = new HashSet<Object>(); for (IPath path : synchronizers.keySet()) { if (path.segment(0).equals(project.getName())) { keysToRemove.add(path); } } synchronizers.keySet().removeAll(keysToRemove); for (WaypointSynchronizeObject synch : unsorted) { String resourceString = null; if (synch.getLocal() != null) { resourceString = synch.getLocal().getResource(); } if (resourceString == null && synch.getRemote() != null) { resourceString = synch.getRemote().getResource(); } IPath path = new Path(resourceString); List<WaypointSynchronizeObject> synchs = synchronizers.get(path); if (synchs == null) { synchs = new LinkedList<WaypointSynchronizeObject>(); synchronizers.put(path, synchs); } if (path.equals(project.getFullPath())) { if (synch.getKind() != WaypointSynchronizeObject.EQUAL) result.add(synch); } else { if (synch.getKind() != WaypointSynchronizeObject.EQUAL) { result.add(path); synchs.add(synch); } } } return result.toArray(); } catch (InvocationTargetException e) { ResourceWaypointPlugin.getDefault().log(e); } catch (InterruptedException e) { } } else if (parentElement instanceof IPath) { return (synchronizers.get(parentElement).toArray()); } return new Object[0]; } /* (non-Javadoc) * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object) */ public Object getParent(Object element) { if (element instanceof WaypointSynchronizeObject) { return ((WaypointSynchronizeObject)element).getProject(); } return null; } /* (non-Javadoc) * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object) */ public boolean hasChildren(Object element) { return (element instanceof IProject || element instanceof IPath); } /* (non-Javadoc) * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object) */ public Object[] getElements(Object inputElement) { return ResourcesPlugin.getWorkspace().getRoot().getProjects(); } /* (non-Javadoc) * @see org.eclipse.jface.viewers.IContentProvider#dispose() */ public void dispose() { synchronizers.clear(); } /* (non-Javadoc) * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object) */ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { synchronizers.clear(); } }