package com.redhat.ceylon.eclipse.util; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.IEditingSupport; import org.eclipse.jface.text.IEditingSupportRegistry; import org.eclipse.jface.text.link.LinkedModeModel; import org.eclipse.jface.text.link.LinkedModeUI; import org.eclipse.jface.text.link.LinkedModeUI.ExitFlags; import org.eclipse.jface.text.link.LinkedModeUI.IExitPolicy; import org.eclipse.jface.text.link.LinkedPositionGroup; import org.eclipse.jface.text.link.ProposalPosition; import org.eclipse.swt.events.VerifyEvent; import org.eclipse.ui.texteditor.link.EditorLinkedModeUI; import com.redhat.ceylon.eclipse.code.editor.AbstractLinkedModeListener; import com.redhat.ceylon.eclipse.code.editor.CeylonEditor; import com.redhat.ceylon.eclipse.code.editor.CeylonSourceViewer; import com.redhat.ceylon.eclipse.code.editor.FocusEditingSupport; public class LinkedMode { public static class NullExitPolicy implements IExitPolicy { @Override public ExitFlags doExit(LinkedModeModel model, VerifyEvent event, int offset, int length) { return null; } } public static void installLinkedMode(CeylonEditor editor, LinkedModeModel linkedModeModel, Object linkedModeOwner, int exitSequenceNumber, int exitPosition, IEditingSupport editingSupport, IExitPolicy exitPolicy, AbstractLinkedModeListener linkedModelListener) throws BadLocationException { linkedModeModel.forceInstall(); linkedModeModel.addLinkingListener(linkedModelListener); LinkedMode.registerEditingSupport(editor, editingSupport); editor.setLinkedMode(linkedModeModel, linkedModeOwner); CeylonSourceViewer viewer = editor.getCeylonSourceViewer(); EditorLinkedModeUI ui = new EditorLinkedModeUI(linkedModeModel, viewer); if (exitPosition>=0 && exitSequenceNumber>=0) { ui.setExitPosition(viewer, exitPosition, 0, exitSequenceNumber); } ui.setExitPolicy(exitPolicy); ui.setCyclingMode(LinkedModeUI.CYCLE_WHEN_NO_PARENT); ui.setDoContextInfo(true); ui.enableColoredLabels(true); ui.enter(); } public static void installLinkedMode(final CeylonEditor editor, IDocument document, LinkedModeModel linkedModeModel, Object linkedModeOwner, IExitPolicy exitPolicy, int exitSequenceNumber, int exitPosition) throws BadLocationException { final IEditingSupport editingSupport = new FocusEditingSupport(editor); installLinkedMode(editor, linkedModeModel, linkedModeOwner, exitSequenceNumber, exitPosition, editingSupport, exitPolicy, new AbstractLinkedModeListener(editor, linkedModeOwner) { @Override public void left(LinkedModeModel model, int flags) { editor.clearLinkedMode(); //linkedModeModel.exit(ILinkedModeListener.NONE); unregisterEditingSupport(editor, editingSupport); editor.getSite().getPage().activate(editor); if ((flags&EXTERNAL_MODIFICATION)==0) { CeylonSourceViewer viewer = editor.getCeylonSourceViewer(); if (viewer!=null) { viewer.invalidateTextPresentation(); } } } }); } public static void unregisterEditingSupport(CeylonEditor editor, IEditingSupport editingSupport) { CeylonSourceViewer viewer = editor.getCeylonSourceViewer(); if (viewer!=null) { ((IEditingSupportRegistry) viewer).unregister(editingSupport); } } public static void registerEditingSupport(CeylonEditor editor, IEditingSupport editingSupport) { CeylonSourceViewer viewer = editor.getCeylonSourceViewer(); if (viewer!=null) { ((IEditingSupportRegistry) viewer).register(editingSupport); } } public static void addLinkedPosition(final LinkedModeModel linkedModeModel, ProposalPosition linkedPosition) throws BadLocationException { LinkedPositionGroup linkedPositionGroup = new LinkedPositionGroup(); linkedPositionGroup.addPosition(linkedPosition); linkedModeModel.addGroup(linkedPositionGroup); } }