/* * Copyright 2003-2015 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package jetbrains.mps.text; import org.jetbrains.annotations.NotNull; /** * Contents of a {@link TextUnit} being edited/populated. * <p/> * Consists of text areas. Active text chunk/area could be switched with {@link #pushTextArea(TextAreaToken)} and {@link #popTextArea()}. * There's default, top-most text area that can't be removed, i.e. one can treat fresh <code>TextBuffer</code> as being initialized like * <pre> * TextBuffer tb; * tb.pushTextArea(defaultAreaToken); * </pre> * <p/> * Supports (nested) text markers, see {@link #pushMark()}. * * FIXME Perhaps, shall introduce either BinaryBuffer or BinaryArea to support binary (or partly binary) files * * @author Artem Tikhomirov * @since 3.3 */ public interface TextBuffer { /** * @return active area within the buffer */ @NotNull TextArea area(); /** * Switch active area. * FIXME describe whether nested push with the same token is allowed (present impl does allow, is it smth we'd like to use?) * @param areaIdentity identifies text chunk to become active for output * @return <code>this</code> for convenience */ TextBuffer pushTextArea(@NotNull TextAreaToken areaIdentity); /** * Revert to previous active area * @return <code>this</code> for convenience */ TextBuffer popTextArea(); /** * Indicate start location of a marker, which is retrieved with {@link #popMark()} * At the moment, as the name (push/pop) indicates, nested marks are supported. * Nested means m1 starts, m2 starts, m2 ends, m1 ends. * Intersecting marks, m1 starts, m2 starts, m1 ends, m2 ends are not supported, if there's need to, * API shall get extended with mark identity. */ TextBuffer pushMark(); /** * @return text location marker within the buffer */ @NotNull TextMark popMark(); /** * Factory method to instantiate a layout capable to deal with this buffer instance. * @return new instance suitable for subsequent argument to {@link #snapshot(BufferLayout)} */ @NotNull BufferLayout newLayout(); /** * Capture actual state of the buffer, text chunks positioned in accordance with supplied {@link BufferLayout layout}. * @param layout describes how text chunks of the buffer shall be ordered. * @return snapshot of the text in the buffer. The value is independent from subsequent buffer modifications */ @NotNull BufferSnapshot snapshot(@NotNull BufferLayout layout); }