/* * Copyright 2003-2016 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.editor.runtime; import jetbrains.mps.openapi.editor.TextBuilder; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; /** * User: shatalin * Date: 03/03/16 */ public class TextBuilderImpl implements TextBuilder { private List<StringBuilder> myLines = new ArrayList<StringBuilder>(); private int myWidth; public TextBuilderImpl() { } public TextBuilderImpl(String text) { myLines.add(new StringBuilder(text)); myWidth = text.length(); } @Override public String getText() { if (myLines.isEmpty()) { return ""; } StringBuilder builder = new StringBuilder(myLines.get(0)); for (int i = 1; i < myLines.size(); ++i) { builder.append('\n'); builder.append(myLines.get(i)); } return builder.toString(); } @Override public Iterable<CharSequence> getLines() { return Collections.<CharSequence>unmodifiableCollection(myLines); } @Override public int getSize() { return myLines.size(); } @Override public int getWidth() { return myWidth; } @Override public TextBuilder appendToTheBottom(TextBuilder builder) { if (builder.getSize() == 0) { return this; } for (CharSequence nextLine : builder.getLines()) { myLines.add(new StringBuilder(nextLine)); } myWidth = Math.max(this.myWidth, builder.getWidth()); normalizeWidth(); return this; } @Override public TextBuilder appendToTheRight(TextBuilder builder, boolean insertSpace) { if (builder.getSize() == 0 || builder.getWidth() == 0) { return this; } String delim = getWidth() != 0 && insertSpace ? " " : ""; int delimWidth = delim.length(); int newWidth = myWidth + builder.getWidth() + delimWidth; Iterator<CharSequence> builderIterator = builder.getLines().iterator(); for (StringBuilder nextLine : myLines) { nextLine.append(delim); if (builderIterator.hasNext()) { nextLine.append(builderIterator.next()); } } while (builderIterator.hasNext()) { StringBuilder nextLine = new StringBuilder(newWidth); for (int i = 0; i < myWidth + delimWidth; i++) { nextLine.append(" "); } nextLine.append(builderIterator.next()); myLines.add(nextLine); } myWidth = newWidth; normalizeWidth(); return this; } private void normalizeWidth() { for (StringBuilder line : myLines) { while (line.length() < myWidth) { line.append(' '); } } } }