| package com.google.dart.tools.ui.internal.text.correction.proposals; |
| |
| import org.eclipse.jface.text.IDocument; |
| import org.eclipse.jface.text.link.LinkedModeModel; |
| import org.eclipse.jface.text.link.LinkedModeUI.ExitFlags; |
| import org.eclipse.jface.text.link.LinkedModeUI.IExitPolicy; |
| import org.eclipse.jface.text.link.LinkedPosition; |
| import org.eclipse.jface.text.link.LinkedPositionGroup; |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.events.VerifyEvent; |
| |
| /** |
| * An exit policy that skips Backspace and Delete at the beginning and at the end of a linked |
| * position, respectively. See https://bugs.eclipse.org/bugs/show_bug.cgi?id=183925 . |
| */ |
| public class DeleteBlockingExitPolicy implements IExitPolicy { |
| private final IDocument fDocument; |
| |
| public DeleteBlockingExitPolicy(IDocument document) { |
| fDocument = document; |
| } |
| |
| @Override |
| public ExitFlags doExit(LinkedModeModel model, VerifyEvent event, int offset, int length) { |
| if (length == 0 && (event.character == SWT.BS || event.character == SWT.DEL)) { |
| LinkedPosition position = model.findPosition(new LinkedPosition( |
| fDocument, |
| offset, |
| 0, |
| LinkedPositionGroup.NO_STOP)); |
| if (position != null) { |
| if (event.character == SWT.BS) { |
| if (offset - 1 < position.getOffset()) { |
| //skip backspace at beginning of linked position |
| event.doit = false; |
| } |
| } else /* event.character == SWT.DEL */{ |
| if (offset + 1 > position.getOffset() + position.getLength()) { |
| //skip delete at end of linked position |
| event.doit = false; |
| } |
| } |
| } |
| } |
| |
| return null; // don't change behavior |
| } |
| } |