package sk.stuba.fiit.perconik.core.resources;
import org.eclipse.jface.text.ITextPresentationListener;
import org.eclipse.jface.text.ITextViewer;
import org.eclipse.jface.text.ITextViewerExtension4;
import org.eclipse.jface.text.TextPresentation;
import org.eclipse.ui.IWorkbenchPartReference;
import sk.stuba.fiit.perconik.core.listeners.PartListener;
import sk.stuba.fiit.perconik.core.listeners.TextPresentationListener;
import sk.stuba.fiit.perconik.eclipse.ui.Parts;
import static com.google.common.base.Preconditions.checkNotNull;
import static sk.stuba.fiit.perconik.core.resources.Ui.dereferencePart;
final class TextPresentationHook extends InternalHook<ITextViewer, TextPresentationListener> implements PartListener {
TextPresentationHook(final TextPresentationListener listener) {
super(new TextViewerHandler(listener));
}
static final class Support extends AbstractHookSupport<TextPresentationHook, ITextViewer, TextPresentationListener> {
public Hook<ITextViewer, TextPresentationListener> create(final TextPresentationListener listener) {
return new TextPresentationHook(listener);
}
}
private static final class TextPresentationListenerProxy extends AbstractListenerProxy<TextPresentationListener> implements ITextPresentationListener {
final ITextViewer viewer;
TextPresentationListenerProxy(final TextPresentationListener listener, final ITextViewer viewer) {
super(listener);
this.viewer = checkNotNull(viewer);
}
public void applyTextPresentation(final TextPresentation textPresentation) {
this.listener.applyTextPresentation(this.viewer, textPresentation);
}
}
private static final class TextViewerHandler extends InternalHandler<ITextViewer, TextPresentationListener> {
TextViewerHandler(final TextPresentationListener listener) {
super(ITextViewer.class, listener);
}
public void register(final ITextViewer viewer) {
if (viewer instanceof ITextViewerExtension4) {
((ITextViewerExtension4) viewer).addTextPresentationListener(new TextPresentationListenerProxy(this.listener, viewer));
}
}
public void unregister(final ITextViewer viewer) {
if (viewer instanceof ITextViewerExtension4) {
((ITextViewerExtension4) viewer).removeTextPresentationListener(new TextPresentationListenerProxy(this.listener, viewer));
}
}
}
@Override
void preRegisterInternal() {
Hooks.addTextViewersAsynchronouslyTo(this);
}
private static ITextViewer filter(final ITextViewer viewer) {
if (viewer instanceof ITextViewerExtension4) {
return viewer;
}
return null;
}
public void partOpened(final IWorkbenchPartReference reference) {
Hooks.addNonNull(this, filter(Parts.getTextViewer(dereferencePart(reference))));
}
public final void partClosed(final IWorkbenchPartReference reference) {
Hooks.removeNonNull(this, filter(Parts.getTextViewer(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) {}
}