--- /dev/null
+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();
+ }
+}
+
+