001/*
002 * Copyright (C) 2012 eXo Platform SAS.
003 *
004 * This is free software; you can redistribute it and/or modify it
005 * under the terms of the GNU Lesser General Public License as
006 * published by the Free Software Foundation; either version 2.1 of
007 * the License, or (at your option) any later version.
008 *
009 * This software is distributed in the hope that it will be useful,
010 * but WITHOUT ANY WARRANTY; without even the implied warranty of
011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
012 * Lesser General Public License for more details.
013 *
014 * You should have received a copy of the GNU Lesser General Public
015 * License along with this software; if not, write to the Free
016 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
017 * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
018 */
019
020package org.crsh.text.ui;
021
022import org.crsh.text.LineReader;
023import org.crsh.text.RenderAppendable;
024import org.crsh.text.Style;
025import org.crsh.util.BlankSequence;
026import org.crsh.util.Pair;
027
028class LabelReader implements LineReader {
029
030  /** . */
031  private final LabelElement element;
032
033  /** . */
034  private final Pair<Integer, Integer>[] lines;
035
036  /** . */
037  private final int width;
038
039  /** . */
040  private final int height;
041
042  LabelReader(LabelElement element, Pair<Integer, Integer>[] lines, int width, int height) {
043    this.element = element;
044    this.lines = lines;
045    this.height = height;
046    this.width = width;
047  }
048
049  /** . */
050  private int index = 0;
051
052  public boolean hasLine() {
053    return index < height;
054  }
055
056  public void renderLine(RenderAppendable to) {
057    if (index >= height) {
058      throw new IllegalStateException();
059    } else {
060      Style.Composite style = element.getStyle();
061      if (style != null) {
062        to.enterStyle(style);
063      }
064      if (index < lines.length) {
065        Pair<Integer, Integer> a = lines[index];
066        to.append(element.value, a.getFirst(), a.getSecond());
067        int missing = width - (a.getSecond() - a.getFirst());
068        if (missing > 0) {
069          to.append(BlankSequence.create(missing));
070        }
071      } else {
072        for (int i = 0;i < width;i++) {
073          to.append(' ');
074        }
075      }
076      index++;
077      if (style != null) {
078        to.leaveStyle();
079      }
080    }
081  }
082}