package winterwell.markdown.editors;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IRegion;
import org.eclipse.jface.text.ITextHover;
import org.eclipse.jface.text.presentation.IPresentationReconciler;
import org.eclipse.jface.text.presentation.PresentationReconciler;
import org.eclipse.jface.text.reconciler.DirtyRegion;
import org.eclipse.jface.text.reconciler.IReconciler;
import org.eclipse.jface.text.reconciler.IReconcilingStrategy;
import org.eclipse.jface.text.reconciler.MonoReconciler;
import org.eclipse.jface.text.rules.DefaultDamagerRepairer;
import org.eclipse.jface.text.source.ISourceViewer;
import org.eclipse.ui.editors.text.TextSourceViewerConfiguration;
public class MDConfiguration extends TextSourceViewerConfiguration {
private ColorManager colorManager;
public MDConfiguration(ColorManager colorManager, IPreferenceStore prefStore) {
super(prefStore);
this.colorManager = colorManager;
}
@Override
public IPresentationReconciler getPresentationReconciler(ISourceViewer sourceViewer) {
MDScanner scanner = new MDScanner(colorManager);
PresentationReconciler pr = (PresentationReconciler) super.getPresentationReconciler(sourceViewer); // FIXME
DefaultDamagerRepairer ddr = new DefaultDamagerRepairer(scanner);
pr.setRepairer(ddr, IDocument.DEFAULT_CONTENT_TYPE);
pr.setDamager(ddr, IDocument.DEFAULT_CONTENT_TYPE);
return pr;
}
@Override
public IReconciler getReconciler(ISourceViewer sourceViewer) {
// This awful mess adds in update support
// Get super strategy
IReconciler rs = super.getReconciler(sourceViewer);
if (true) return rs; // Seems to work fine?!
final IReconcilingStrategy fsuperStrategy = rs==null? null : rs.getReconcilingStrategy("text");
// Add our own
IReconcilingStrategy strategy = new IReconcilingStrategy() {
private IDocument doc;
public void reconcile(IRegion partition) {
MarkdownEditor ed = MarkdownEditor.getEditor(doc);
if (ed != null) ed.updatePage(partition);
if (fsuperStrategy!=null) fsuperStrategy.reconcile(partition);
}
public void reconcile(DirtyRegion dirtyRegion, IRegion subRegion) {
MarkdownEditor ed = MarkdownEditor.getEditor(doc);
if (ed != null) ed.updatePage(subRegion);
if (fsuperStrategy!=null) fsuperStrategy.reconcile(dirtyRegion, subRegion);
}
public void setDocument(IDocument document) {
this.doc = document;
if (fsuperStrategy!=null) fsuperStrategy.setDocument(document);
}
};
// Make a reconciler
MonoReconciler m2 = new MonoReconciler(strategy, true);
m2.setIsIncrementalReconciler(true);
m2.setProgressMonitor(new NullProgressMonitor());
m2.setDelay(500);
// Done
return m2;
}
@SuppressWarnings("unused")
@Override
public ITextHover getTextHover(ISourceViewer sourceViewer,
String contentType) {
if (true) return super.getTextHover(sourceViewer, contentType);
// Add hover support for images
return new MDTextHover();
}
}