JHViewSelectionProvider.java
/*******************************************************************************
* Copyright (c) 2020 Carsten Hammer.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Carsten Hammer - initial API and implementation
*******************************************************************************/
package org.sandbox.jdt.ui.helper.views;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.runtime.ListenerList;
import org.eclipse.jdt.core.IJavaElement;
//import org.eclipse.jdt.jeview.views.JEAttribute;
//import org.eclipse.jdt.jeview.views.JEResource;
//import org.eclipse.jdt.jeview.views.JavaElement;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
class JHViewSelectionProvider implements ISelectionProvider {
private final TableViewer fViewer;
ListenerList<ISelectionChangedListener> fSelectionChangedListeners= new ListenerList<>();
private IStructuredSelection fLastSelection;
public JHViewSelectionProvider(TableViewer viewer) {
fViewer= viewer;
fViewer.addSelectionChangedListener(event -> fireSelectionChanged());
}
void fireSelectionChanged() {
if (fSelectionChangedListeners != null) {
IStructuredSelection selection= getSelection();
if (fLastSelection != null) {
List<?> newSelection= selection.toList();
List<?> oldSelection= fLastSelection.toList();
int size= newSelection.size();
if (size == oldSelection.size()) {
for (int i= 0; i < size; i++) {
Object newElement= newSelection.get(i);
Object oldElement= oldSelection.get(i);
if (newElement != oldElement && newElement.equals(oldElement)
&& newElement instanceof IJavaElement) {
// send out a fake selection event to make the Properties view update getKey():
SelectionChangedEvent event= new SelectionChangedEvent(this, StructuredSelection.EMPTY);
for (ISelectionChangedListener listener : fSelectionChangedListeners) {
listener.selectionChanged(event);
}
break;
}
}
}
}
fLastSelection= selection;
SelectionChangedEvent event= new SelectionChangedEvent(this, selection);
for (ISelectionChangedListener listener : fSelectionChangedListeners) {
listener.selectionChanged(event);
}
}
}
@Override
public void addSelectionChangedListener(ISelectionChangedListener listener) {
fSelectionChangedListeners.add(listener);
}
@Override
public IStructuredSelection getSelection() {
IStructuredSelection selection= (IStructuredSelection) fViewer.getSelection();
System.out.println("out:" + selection); //$NON-NLS-1$
ArrayList<Object> externalSelection= new ArrayList<>();
for (Object element : selection) {
// if (element instanceof JavaElement) {
// IJavaElement javaElement = ((JavaElement) element).getJavaElement();
// if (javaElement != null && !(javaElement instanceof IJavaModel)) {
// // assume getJavaProject() is
// // non-null
// externalSelection.add(javaElement);
// }
// } else if (element instanceof JEResource) {
// IResource resource = ((JEResource) element).getResource();
// if (resource != null && !(resource instanceof IWorkspaceRoot)) {
// // getProject() is non-null
// externalSelection.add(resource);
// }
// } else if (element instanceof JEAttribute) {
// Object wrappedObject = ((JEAttribute) element).getWrappedObject();
// if (wrappedObject != null) {
// externalSelection.add(wrappedObject);
// }
// }
}
return new StructuredSelection(externalSelection);
}
@Override
public void removeSelectionChangedListener(ISelectionChangedListener listener) {
fSelectionChangedListeners.remove(listener);
}
@Override
public void setSelection(ISelection selection) {
// not supported
}
}