package sk.stuba.fiit.perconik.core.resources;
import org.eclipse.jface.text.quickassist.IQuickAssistAssistant;
import org.eclipse.jface.text.source.ContentAssistantFacade;
import org.eclipse.jface.text.source.ISourceViewer;
import org.eclipse.jface.text.source.ISourceViewerExtension3;
import org.eclipse.jface.text.source.ISourceViewerExtension4;
import org.eclipse.ui.IWorkbenchPartReference;
import sk.stuba.fiit.perconik.core.listeners.CompletionListener;
import sk.stuba.fiit.perconik.core.listeners.PartListener;
import sk.stuba.fiit.perconik.eclipse.ui.Parts;
import static sk.stuba.fiit.perconik.core.resources.Ui.dereferencePart;
final class CompletionHook extends InternalHook<ISourceViewer, CompletionListener> implements PartListener {
CompletionHook(final CompletionListener listener) {
super(new SourceViewerHandler(listener));
}
static final class Support extends AbstractHookSupport<CompletionHook, ISourceViewer, CompletionListener> {
public Hook<ISourceViewer, CompletionListener> create(final CompletionListener listener) {
return new CompletionHook(listener);
}
}
private static final class SourceViewerHandler extends InternalHandler<ISourceViewer, CompletionListener> {
SourceViewerHandler(final CompletionListener listener) {
super(ISourceViewer.class, listener);
}
private static IQuickAssistAssistant assistant(final ISourceViewer viewer) {
if (viewer instanceof ISourceViewerExtension3) {
return ((ISourceViewerExtension3) viewer).getQuickAssistAssistant();
}
return null;
}
private static ContentAssistantFacade facade(final ISourceViewer viewer) {
if (viewer instanceof ISourceViewerExtension4) {
return ((ISourceViewerExtension4) viewer).getContentAssistantFacade();
}
return null;
}
public void register(final ISourceViewer viewer) {
IQuickAssistAssistant assistant = assistant(viewer);
ContentAssistantFacade facade = facade(viewer);
if (assistant != null) {
assistant.addCompletionListener(this.listener);
}
if (facade != null) {
facade.addCompletionListener(this.listener);
}
}
public void unregister(final ISourceViewer viewer) {
IQuickAssistAssistant assistant = assistant(viewer);
ContentAssistantFacade facade = facade(viewer);
if (assistant != null) {
assistant.removeCompletionListener(this.listener);
}
if (facade != null) {
facade.removeCompletionListener(this.listener);
}
}
}
@Override
void preRegisterInternal() {
Hooks.addSourceViewersAsynchronouslyTo(this);
}
private static ISourceViewer filter(final ISourceViewer viewer) {
if (viewer instanceof ISourceViewerExtension3) {
return viewer;
}
if (viewer instanceof ISourceViewerExtension4) {
return viewer;
}
return null;
}
public void partOpened(final IWorkbenchPartReference reference) {
Hooks.addNonNull(this, filter(Parts.getSourceViewer(dereferencePart(reference))));
}
public final void partClosed(final IWorkbenchPartReference reference) {
Hooks.removeNonNull(this, filter(Parts.getSourceViewer(dereferencePart(reference))));
}
public void partActivated(final IWorkbenchPartReference reference) {}
public void partDeactivated(final IWorkbenchPartReference reference) {}
public void partVisible(final IWorkbenchPartReference reference) {}
public void partHidden(final IWorkbenchPartReference reference) {}
public void partBroughtToTop(final IWorkbenchPartReference reference) {}
public void partInputChanged(final IWorkbenchPartReference reference) {}
}