/******************************************************************************* * Copyright (c) 2009 xored software, Inc. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * xored software, Inc. - initial API and Implementation (Alex Panchenko) *******************************************************************************/ package org.eclipse.dltk.tcl.internal.ui.editor; import org.eclipse.dltk.internal.ui.editor.BracketInserter; import org.eclipse.dltk.internal.ui.editor.ScriptEditor; import org.eclipse.dltk.tcl.internal.ui.TclUI; import org.eclipse.dltk.tcl.ui.text.TclPartitions; import org.eclipse.dltk.ui.PreferenceConstants; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.BadPositionCategoryException; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.IRegion; import org.eclipse.jface.text.source.ISourceViewer; import org.eclipse.swt.events.VerifyEvent; import org.eclipse.swt.graphics.Point; import org.eclipse.ui.texteditor.ITextEditorExtension3; public class TclBracketInserter extends BracketInserter { TclBracketInserter(ScriptEditor scriptEditor) { super(scriptEditor); } private boolean isCloseStrings() { return TclUI.getDefault().getPreferenceStore().getBoolean( PreferenceConstants.EDITOR_CLOSE_STRINGS); } @Override public void verifyKey(VerifyEvent event) { // early pruning to slow down normal typing as little as possible if (!event.doit || editor.getInsertMode() != ITextEditorExtension3.SMART_INSERT) return; switch (event.character) { case '\"': break; default: return; } final ISourceViewer sourceViewer = this.editor.getScriptSourceViewer(); IDocument document = sourceViewer.getDocument(); final Point selection = sourceViewer.getSelectedRange(); final int offset = selection.x; final int length = selection.y; try { final IRegion startLine = document .getLineInformationOfOffset(offset); final IRegion endLine = document.getLineInformationOfOffset(offset + length); final char nextToken = offset + length < endLine.getOffset() + endLine.getLength() ? document.getChar(offset + length) : 0; final char prevToken = offset > startLine.getOffset() ? document .getChar(offset - 1) : 0; // RubyHeuristicScanner scanner = new // RubyHeuristicScanner(document); // int nextToken = scanner.nextToken(offset + length, endLine // .getOffset() // + endLine.getLength()); // String next = nextToken == ISymbols.TokenEOF ? null : // document.get( // offset, scanner.getPosition() - offset).trim(); // int prevToken = scanner.previousToken(offset - 1, startLine // .getOffset()); // int prevTokenOffset = scanner.getPosition(); // if (prevTokenOffset < 0) // prevTokenOffset = 0; // String previous = offset > 1 && prevToken == ISymbols.TokenEOF ? // null // : document.get(prevTokenOffset, offset - prevTokenOffset) // .trim(); switch (event.character) { case '"': if (!isCloseStrings() || (nextToken != 0 && !Character .isWhitespace(nextToken)) || (prevToken != 0 && !Character .isWhitespace(prevToken))) return; break; default: return; } int correctedOffset = (document.getLength() > 0 && document .getLength() == offset) ? offset - 1 : offset; if (!validatePartitioning(document, correctedOffset, TclPartitions.TCL_PARTITIONING)) { return; } if (!this.editor.validateEditorInputState()) return; insertBrackets(document, offset, length, event.character, getPeerCharacter(event.character)); event.doit = false; } catch (BadLocationException e) { TclUI.error(e); } catch (BadPositionCategoryException e) { TclUI.error(e); } } }