package org.eclipse.xtext.xdoc.ui.autoedit; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.DocumentCommand; import org.eclipse.jface.text.IAutoEditStrategy; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.IDocumentExtension4; import org.eclipse.jface.text.IRegion; import org.eclipse.swt.custom.StyledText; import org.eclipse.swt.events.VerifyEvent; import org.eclipse.swt.widgets.Widget; import org.eclipse.xtext.ui.editor.autoedit.AbstractEditStrategy; import org.eclipse.xtext.ui.editor.autoedit.DefaultAutoEditStrategyProvider; public class AutoEditProvider extends DefaultAutoEditStrategyProvider { protected static class LineBreakInserter extends AbstractEditStrategy { private Widget widget; private final IAutoEditStrategy defaultStrategy; protected LineBreakInserter(IAutoEditStrategy defaultStrategy) { this.defaultStrategy = defaultStrategy; } @Override public void verifyKey(VerifyEvent event) { super.verifyKey(event); widget = event.widget; } @Override protected void internalCustomizeDocumentCommand(IDocument document, DocumentCommand command) throws BadLocationException { if (command.text.equals(" ") && command.length == 0) { if (widget instanceof StyledText) { StyledText text = (StyledText) widget; IRegion region = document.getLineInformationOfOffset(command.offset); String line = document.get(region.getOffset(), region.getLength()); String subLine = line.substring(0, command.offset - region.getOffset()); int tabCount = count("\t", subLine); int spacesForTabs = text.getTabs() * tabCount; int visibleOffset = subLine.length() - tabCount + spacesForTabs; if (visibleOffset >= 100) { command.text = ((IDocumentExtension4)document).getDefaultLineDelimiter(); defaultStrategy.customizeDocumentCommand(document, command); if (document.getLineOfOffset(region.getOffset()) - text.getTopIndex() > 10) text.setTopIndex(text.getTopIndex() + 1); } } } widget = null; } } @Override protected void configure(IEditStrategyAcceptor acceptor) { super.configure(acceptor); configureAutoLinebreakStrategy(acceptor); } protected void configureAutoLinebreakStrategy(IEditStrategyAcceptor acceptor) { acceptor.accept(new LineBreakInserter(defaultIndentLineAutoEditStrategy.get()), IDocument.DEFAULT_CONTENT_TYPE); } @Override protected void configureMultilineComments(IEditStrategyAcceptor acceptor) { } @Override protected void configureCompoundBracesBlocks(IEditStrategyAcceptor acceptor) { } @Override protected void configureCurlyBracesBlock(IEditStrategyAcceptor acceptor) { } @Override protected void configureSquareBrackets(IEditStrategyAcceptor acceptor) { acceptor.accept(singleLineTerminals.newInstance("[", "]"),IDocument.DEFAULT_CONTENT_TYPE); // MultiLineTerminalsEditStrategy newInstance = multiLineTerminals.newInstance("[", null, "]"); // newInstance.setDocumentUtil(new DocumentUtil(){ // @Override // protected String preProcessSearchString(String string) { // return string.replace("\\[", " ").replace("\\]", " "); // } // }); // acceptor.accept(newInstance,IDocument.DEFAULT_CONTENT_TYPE); } @Override protected void configureParenthesis(IEditStrategyAcceptor acceptor) { } @Override protected void configureStringLiteral(IEditStrategyAcceptor acceptor) { } }