/******************************************************************************* * Copyright (c) 2011 Sierra Wireless and others. * 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: * Sierra Wireless - initial API and implementation *******************************************************************************/ package org.eclipse.koneki.ldt.ui.internal.editor.text; import java.text.MessageFormat; import org.eclipse.dltk.internal.ui.editor.BracketInserter; import org.eclipse.dltk.internal.ui.editor.ScriptEditor; import org.eclipse.dltk.ui.PreferenceConstants; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.BadPositionCategoryException; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.source.ISourceViewer; import org.eclipse.koneki.ldt.core.internal.Activator; import org.eclipse.swt.events.VerifyEvent; import org.eclipse.swt.graphics.Point; /** * Auto insert convenient closing characters during typing, close open strings or brackets. */ public class LuaBracketInserter extends BracketInserter { /** <strong>Must</strong> contain auto insert related preferences */ private IPreferenceStore preferences; /** * Will apply auto insert policy defined from preference page * * @param editor * Where auto insert will be performed * @param preferenceStore * <strong>Must</strong> contain auto insert related preferences */ public LuaBracketInserter(final ScriptEditor editor, final IPreferenceStore preferenceStore) { super(editor); preferences = preferenceStore; } /** * Will apply or ignore auto insertion depending on typed character and preferences from {@link #getPreferenceStore()} * * @see BracketInserter#verifyKey(VerifyEvent) */ @Override public void verifyKey(final VerifyEvent event) { // Early pruning to slow down normal typing as little as possible if (!event.doit || this.editor.getInsertMode() != ScriptEditor.SMART_INSERT) return; // Do not process if character is not handled or if auto insert has been disabled from preference switch (event.character) { case '(': if (!isClosingBrackets()) { return; } break; case '[': if (!isClosingBrackets()) { return; } break; case '{': if (!isClosingBraces()) { return; } break; case '\'': if (!isClosingStrings()) { return; } break; case '\"': if (!isClosingStrings()) { return; } break; default: return; } if (!this.editor.validateEditorInputState()) return; /** * Retrieve insertion information */ final ISourceViewer sourceViewer = this.editor.getScriptSourceViewer(); final IDocument document = sourceViewer.getDocument(); final Point selection = sourceViewer.getSelectedRange(); final int offset = selection.x; final int length = selection.y; try { if (!validatePartitioning(document, offset, ILuaPartitions.LUA_PARTITIONING)) { return; } insertBrackets(document, offset, length, event.character, getPeerCharacter(event.character)); } catch (BadLocationException e) { Activator.logWarning(MessageFormat.format("Problem when trying to do autoclose for char {0}", event.character), e); //$NON-NLS-1$ return; } catch (BadPositionCategoryException e) { Activator.logWarning(MessageFormat.format("Problem when trying to do autoclose for char {0}", event.character), e); //$NON-NLS-1$ return; } event.doit = false; } private IPreferenceStore getPreferenceStore() { return preferences; } /** * Indicates if brackets should be auto closed from <strong>preferences</strong>. Is not affected by {@link #setCloseBracketsEnabled(boolean)} . * * @return <code>true</code> if preference indicates that brackets should be auto closed */ private boolean isClosingBrackets() { return getPreferenceStore().getBoolean(PreferenceConstants.EDITOR_CLOSE_BRACKETS); } /** * Indicates if brackets should be auto closed from <strong>preferences</strong>. Is not affected by {@link #setCloseStringsEnabled(boolean)} . * * @return <code>true</code> if preference indicates that strings should be auto closed */ private boolean isClosingStrings() { return getPreferenceStore().getBoolean(PreferenceConstants.EDITOR_CLOSE_STRINGS); } /** * Indicates if braces should be auto closed from <strong>preferences</strong>. Is not affected by * {@link #setCloseAngularBracketsEnabled(boolean)} . * * @return <code>true</code> if preference indicates that braces should be auto closed */ private boolean isClosingBraces() { return getPreferenceStore().getBoolean(PreferenceConstants.EDITOR_CLOSE_BRACES); } }