/* * IndentAction.java * :tabSize=4:indentSize=4:noTabs=false: * :folding=explicit:collapseFolds=1: * * Copyright (C) 2005 Slava Pestov * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ package org.gjt.sp.jedit.indent; import org.gjt.sp.jedit.buffer.JEditBuffer; import org.gjt.sp.util.StandardUtilities; /** Abstract Indentation Action * @author Slava Pestov * @version $Id: IndentAction.java 21831 2012-06-18 22:54:17Z ezust $ */ public interface IndentAction { /** * @param buffer The buffer * @param line The line number that matched the rule; not necessarily * the line being indented. * @param oldIndent Original indent. * @param newIndent The new indent -- ie, indent returned by previous * indent action. */ int calculateIndent(JEditBuffer buffer, int line, int oldIndent, int newIndent); /** * @return true if the indent engine should keep processing after * this rule. */ boolean keepChecking(); /** See comments for each instance of this class below. */ class Collapse implements IndentAction { /** * This does nothing; it is merely a sentinel for the * <code>OpenBracketIndentRule</code>. */ public int calculateIndent(JEditBuffer buffer, int line, int oldIndent, int newIndent) { return newIndent; } public boolean keepChecking() { return true; } private Collapse() { } } class Reset implements IndentAction { public int calculateIndent(JEditBuffer buffer, int line, int oldIndent, int newIndent) { return oldIndent; } public boolean keepChecking() { return true; } } class Increase implements IndentAction { private int amount; public Increase() { amount = 1; } public Increase(int amount) { this.amount = amount; } public int calculateIndent(JEditBuffer buffer, int line, int oldIndent, int newIndent) { return newIndent + buffer.getIndentSize() * amount; } public boolean keepChecking() { return true; } public boolean equals(Object o) { if(o instanceof Increase) return ((Increase)o).amount == amount; else return false; } } class Decrease implements IndentAction { public int calculateIndent(JEditBuffer buffer, int line, int oldIndent, int newIndent) { return newIndent - buffer.getIndentSize(); } public boolean keepChecking() { return true; } } /** * @author Matthieu Casanova */ class AlignOffset implements IndentAction { private int offset; public AlignOffset(int offset) { this.offset = offset; } public int calculateIndent(JEditBuffer buffer, int line, int oldIndent, int newIndent) { return offset; } public boolean keepChecking() { return false; } } /** * Indent action used for deep indent. * @author Matthieu Casanova */ class AlignParameter implements IndentAction { private int openParensColumn; public AlignParameter(int openParensColumn) { this.openParensColumn = openParensColumn; } public int calculateIndent(JEditBuffer buffer, int line, int oldIndent, int newIndent) { return openParensColumn + 1; } public boolean keepChecking() { return false; } } /** * Used to cancel increases in indentation. * * @author Marcelo Vanzin */ class NoIncrease implements IndentAction { public int calculateIndent(JEditBuffer buffer, int line, int oldIndent, int newIndent) { int current = StandardUtilities.getLeadingWhiteSpaceWidth( buffer.getLineSegment(line),buffer.getTabSize()); return (current < newIndent) ? current : newIndent; } public boolean keepChecking() { return true; } } /** * This handles the following Java code: * if(something) * { // no indentation on this line, even though previous matches a rule */ Collapse PrevCollapse = new Collapse(); /** * This handles cases like: * if (foo) * bar; * for (something; condition; action) { * } * Without this the "for" line would be incorrectly indented. */ Collapse PrevPrevCollapse = new Collapse(); }