package org.codemap.communication.util;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import org.codemap.communication.SelectionShare;
import org.codemap.util.Resources;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IEditorReference;
import org.eclipse.ui.IPartListener2;
import org.eclipse.ui.IPathEditorInput;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchPartReference;
import org.eclipse.ui.PlatformUI;
public class EditorPartListener implements IPartListener2 {
private SelectionShare callback;
private Collection<String> currentSelection;
public EditorPartListener(SelectionShare callback) {
this.callback = callback;
this.currentSelection = Collections.emptySet();
findInitialSelection();
}
private void findInitialSelection() {
Display.getDefault().asyncExec(new Runnable() {
@Override
public void run() {
IEditorReference[] references = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getEditorReferences();
updateEditorSelection(references);
}
});
}
@Override
public void partActivated(IWorkbenchPartReference partRef) {
// we don't care about this event
}
@Override
public void partBroughtToTop(IWorkbenchPartReference partRef) {
updateEditorSelection(partRef);
}
@Override
public void partClosed(IWorkbenchPartReference partRef) {
updateEditorSelection(partRef);
}
@Override
public void partDeactivated(IWorkbenchPartReference partRef) {
updateEditorSelection(partRef);
}
@Override
public void partHidden(IWorkbenchPartReference partRef) {
updateEditorSelection(partRef);
}
@Override
public void partInputChanged(IWorkbenchPartReference partRef) {
updateEditorSelection(partRef);
}
@Override
public void partOpened(IWorkbenchPartReference partRef) {
updateEditorSelection(partRef);
}
@Override
public void partVisible(IWorkbenchPartReference partRef) {
updateEditorSelection(partRef);
}
private void updateEditorSelection(IWorkbenchPartReference partRef) {
IWorkbenchPart part = partRef.getPart(true);
if (!(part instanceof IEditorPart)) return;
updateEditorSelection(part.getSite().getPage().getEditorReferences());
}
private void updateEditorSelection(IEditorReference[] iEditorReferences) {
Collection<String> newSelection = new HashSet<String>();
for (IEditorReference each: iEditorReferences) {
//restore the editor parts to be able to access the content.
for (IFile file: getFiles(each.getPart(true))) {
newSelection.add(Resources.asPath(file));
}
}
checkUpdate(newSelection);
}
private void checkUpdate(Collection<String> newSelection) {
if (currentSelection.size() == newSelection.size() &&
currentSelection.containsAll(newSelection)) return;
currentSelection = newSelection;
callback.onLocalSelectionChanged(currentSelection);
System.out.println("triggering update" + newSelection);
}
@SuppressWarnings("deprecation")
private IFile[] getFiles(IWorkbenchPart each) {
if (!(each instanceof IEditorPart)) return new IFile[] {};
IEditorInput input = ((IEditorPart) each).getEditorInput();
if (!(input instanceof IPathEditorInput)) return new IFile[] {};
IPathEditorInput pathInput = (IPathEditorInput) input;
// System.out.println(pathInput.getPath());
IWorkspace workspace = ResourcesPlugin.getWorkspace();
return workspace.getRoot().findFilesForLocation(pathInput.getPath());
}
}