package org.codemap.mapview;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import org.codemap.CodemapCore;
import org.codemap.util.Adaptables;
import org.codemap.util.Log;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IMember;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.ui.ISelectionListener;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
public class SelectionTracker {
/**
* Tracks the global selection provided by eclipse.
*/
private ISelectionListener selectionListener = new ISelectionListener() {
@Override
public void selectionChanged(IWorkbenchPart part, ISelection selection) {
if (part == theController.getView()) return;
if (! (selection instanceof IStructuredSelection)) return;
try {
SelectionTracker.this.selectionChanged((IStructuredSelection) selection);
} catch (CoreException e) {
Log.error(e);
}
}
};
private boolean enabled;
MapController theController;
private EditorPartListener partListener;
public SelectionTracker(MapController controller) {
theController = controller;
partListener = new EditorPartListener(
CodemapCore.getPlugin().getOpenFilesSelection(),
CodemapCore.getPlugin().getYouAreHereSelection(),
theController);
addListeners();
}
private void addListeners() {
IWorkbenchPage page = getWorkbenchPage();
page.addSelectionListener(selectionListener);
page.addPartListener(partListener);
}
private IWorkbenchPage getWorkbenchPage() {
return theController.getView().getSite().getPage();
}
public void dispose() {
removeListeners();
}
private void removeListeners() {
IWorkbenchPage page = getWorkbenchPage();
page.removePostSelectionListener(selectionListener);
page.removePartListener(partListener);
}
public boolean isEnabled() {
return enabled;
}
public void setEnabled(boolean checked) {
enabled = checked;
}
/**
* Filters selected IJavaProject and ICompilationUnit.
*
* @param selection
* @throws CoreException
*/
private void selectionChanged(IStructuredSelection selection) throws CoreException {
IJavaProject javaProject = null;
Collection<ICompilationUnit> units = new HashSet<ICompilationUnit>();
for (Object each: selection.toList()) {
IJavaElement javaElement = Adaptables.adapt(each, IJavaElement.class);
if (javaElement == null) continue;
// we can't handle binaries as their project usually contains no sources and is not
// visible in the navigation
if (javaElement instanceof IMember){
IMember member = (IMember) javaElement;
if (member.isBinary()) return;
}
if (javaProject == null) {
javaProject = javaElement.getJavaProject();
}
if (!javaProject.equals(javaElement.getJavaProject()) && javaElement.getJavaProject() != null) {
multipleProjectsSelected();
return;
}
if (javaElement instanceof ICompilationUnit) {
units.add((ICompilationUnit) javaElement);
}
if (javaElement instanceof IPackageFragment) {
ICompilationUnit[] children = ((IPackageFragment) javaElement).getCompilationUnits();
units.addAll(Arrays.asList(children));
}
if (javaElement instanceof IMember) {
javaElement = javaElement.getAncestor(IJavaElement.COMPILATION_UNIT);
if (javaElement != null) {
units.add((ICompilationUnit) javaElement);
}
}
}
if (javaProject == null) return;
projectSelected(javaProject);
if (isEnabled()) {
compilationUnitsSelected(units);
}
}
private void projectSelected(IJavaProject javaProject) {
theController.onProjectSelected(javaProject);
}
private void multipleProjectsSelected() {
System.out.println("!!! multiple projects selected !!!");
}
private void compilationUnitsSelected(Collection<ICompilationUnit> units) {
theController.onSelectionChanged(units);
}
public EditorPartListener getEditorPartListener() {
return partListener;
}
}