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 020 package org.crsh.text.ui; 021 022 import org.crsh.text.LineReader; 023 import org.crsh.text.RenderAppendable; 024 import org.crsh.text.Style; 025 import org.crsh.util.BlankSequence; 026 import org.crsh.util.Pair; 027 028 class 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 }