/** * Copyright (c) 2009 by JP Moresmau * This code is made available under the terms of the Eclipse Public License, * version 1.0 (EPL). See http://www.eclipse.org/legal/epl-v10.html */ package net.sf.eclipsefp.haskell.ui.internal.editors.cabal; import java.util.Arrays; import net.sf.eclipsefp.haskell.core.cabalmodel.CabalSyntax; import net.sf.eclipsefp.haskell.ui.HaskellUIPlugin; import net.sf.eclipsefp.haskell.ui.internal.preferences.editor.IEditorPreferenceNames; import net.sf.eclipsefp.haskell.util.LangUtil; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.DefaultIndentLineAutoEditStrategy; import org.eclipse.jface.text.DocumentCommand; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.IRegion; import org.eclipse.jface.text.TextUtilities; /** * Indent strategy: indent after section name * * @author JP Moresmau */ public class CabalAutoIndentStrategy extends DefaultIndentLineAutoEditStrategy { @Override public void customizeDocumentCommand( final IDocument d, final DocumentCommand c ) { // end of line if (c.length == 0 && c.text != null && TextUtilities.endsWith(d.getLegalLineDelimiters(), c.text) != -1){ // add indent level after a cabal section (e.g., global, executable, library) try { IRegion r = d.getLineInformation( d.getLineOfOffset( c.offset )); String s =LangUtil.ltrim(d.get( r.getOffset(), r.getLength() ).toLowerCase()); // Superclass takes care of autoindentation super.customizeDocumentCommand( d, c ); for (String section:CabalSyntax.sections.keySet()){ if (s.equals( section ) || s.startsWith( section + " " )){ //$NON-NLS-1$ char[] ch = new char[getTabWidth()]; Arrays.fill( ch, ' ' ); c.text = c.text + new String(ch); return; } } } catch (BadLocationException ble) { // ignore } } } private int getTabWidth() { IPreferenceStore prefStore = HaskellUIPlugin.getDefault().getPreferenceStore(); return prefStore.getInt( IEditorPreferenceNames.EDITOR_CABAL_TAB_WIDTH ); } }