/* * 10/08/2011 * FoldManager.java - Manages code folding in an RSyntaxTextArea instance. * This library is distributed under a modified BSD license. See the included * RSyntaxTextArea.License.txt file for details. */ package org.fife.ui.rsyntaxtextarea.folding; import java.beans.PropertyChangeListener; import java.util.List; /** * Manages code folding in an instance of RSyntaxTextArea. *

* * By default, {@code RSyntaxTextArea} uses a {@link DefaultFoldManager}, which * is sufficient for almost all applications. * * @author Robert Futrell * @version 1.0 * @see DefaultFoldManager */ public interface FoldManager { /** * Property fired when folds have been updated. */ String PROPERTY_FOLDS_UPDATED = "FoldsUpdated"; /** * Adds a property change listener to this fold manager. * * @param l The new listener. * @see #removePropertyChangeListener(PropertyChangeListener) */ void addPropertyChangeListener(PropertyChangeListener l); /** * Removes all folds. */ void clear(); /** * Ensures that the specified offset is not hidden in a collapsed fold. Any * folds containing this offset that are collapsed will be expanded. * * @param offs The offset. * @return Whether any folds had to be opened. * @see #getDeepestFoldContaining(int) */ boolean ensureOffsetNotInClosedFold(int offs); /** * Returns the "deepest" nested fold containing the specified offset. * * @param offs The offset. * @return The deepest fold containing the offset, or null if no * fold contains the offset. */ Fold getDeepestFoldContaining(int offs); /** * Returns the "deepest" open fold containing the specified offset. * * @param offs The offset. * @return The fold, or null if no open fold contains the offset. */ Fold getDeepestOpenFoldContaining(int offs); /** * Returns a specific top-level fold, which may have child folds. * * @param index The index of the fold. * @return The fold. * @see #getFoldCount() */ Fold getFold(int index); /** * Returns the number of top-level folds. * * @return The number of top-level folds. * @see #getFold(int) */ int getFoldCount(); /** * Returns the fold region that starts at the specified line. * * @param line The line number. * @return The fold, or null if the line is not the start of a fold * region. * @see #isFoldStartLine(int) */ Fold getFoldForLine(int line); /** * Returns the total number of hidden (folded) lines. * * @return The total number of hidden (folded) lines. * @see #getHiddenLineCountAbove(int) */ int getHiddenLineCount(); /** * Returns the number of lines "hidden" by collapsed folds above the specified * line. * * @param line The line. This is the line number for a logical line. For the * line number of a physical line (i.e. visible, not folded), use * getHiddenLineCountAbove(int, true). * @return The number of lines hidden in folds above line. * @see #getHiddenLineCountAbove(int, boolean) */ int getHiddenLineCountAbove(int line); /** * Returns the number of lines "hidden" by collapsed folds above the specified * line. * * @param line The line. * @param physical Whether line is the number of a physical line * (i.e. visible, not code-folded), or a logical one (i.e. any * line from the model). If line was determined by * a raw line calculation (i.e. * (visibleTopY / lineHeight)), this value should * be true. It should be false when it * was calculated from an offset in the document (for example). * @return The number of lines hidden in folds above line. */ int getHiddenLineCountAbove(int line, boolean physical); /** * Returns the last visible line in the text area, taking into account folds. * * @return The last visible line. */ int getLastVisibleLine(); int getVisibleLineAbove(int line); int getVisibleLineBelow(int line); /** * Returns whether code folding is enabled. Note that only certain languages * support code folding; those that do not will ignore this property. * * @return Whether code folding is enabled. * @see #setCodeFoldingEnabled(boolean) */ boolean isCodeFoldingEnabled(); /** * Returns true if and only if code folding is enabled for this * text area, AND folding is supported for the language it is editing. Whether * or not folding is supported for a language depends on whether a fold parser * is registered for that language with the FoldParserManager. * * @return Whether folding is supported and enabled for this text area. * @see FoldParserManager */ boolean isCodeFoldingSupportedAndEnabled(); /** * Returns whether the specified line contains the start of a fold region. * * @param line The line. * @return Whether the line contains the start of a fold region. * @see #getFoldForLine(int) */ boolean isFoldStartLine(int line); /** * Returns whether a line is hidden in a collapsed fold. * * @param line The line to check. * @return Whether the line is hidden in a collapsed fold. */ boolean isLineHidden(int line); /** * Removes a property change listener from this fold manager. * * @param l The listener to remove. * @see #addPropertyChangeListener(PropertyChangeListener) */ void removePropertyChangeListener(PropertyChangeListener l); /** * Forces an immediate reparsing for folds, if folding is enabled. This usually * does not need to be called by the programmer, since fold parsing is done * automatically by RSTA. */ void reparse(); /** * Sets whether code folding is enabled. Note that only certain languages will * support code folding out of the box. Those languages which do not support * folding will ignore this property. * * @param enabled Whether code folding should be enabled. * @see #isCodeFoldingEnabled() */ void setCodeFoldingEnabled(boolean enabled); /** * Sets the folds for this fold manager. * * @param folds The new folds. This should not be null. */ void setFolds(List folds); }