blob: 457490d969d2b85559c8cff73a7b83b489045001 [file] [log] [blame]
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
}
}