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.Renderer;
023
024 import java.util.List;
025
026 class TableRowRenderer {
027
028 /** . */
029 final TableRenderer table;
030
031 /** . */
032 final RowRenderer row;
033
034 /** . */
035 final boolean header;
036
037 /** . */
038 private TableRowRenderer previous;
039
040 /** . */
041 private TableRowRenderer next;
042
043 /** . */
044 private int index;
045
046 TableRowRenderer(TableRenderer table, RowElement row) {
047 this.table = table;
048 this.row = new RowRenderer(row, table.separator, table.leftCellPadding, table.rightCellPadding);
049 this.header = row.header;
050 this.index = 0;
051 }
052
053 TableRowRenderer add(TableRowRenderer next) {
054 next.previous = this;
055 next.index = index + 1;
056 this.next = next;
057 return next;
058 }
059
060 boolean hasTop() {
061 return header && previous != null;
062 }
063
064 boolean hasBottom() {
065 return header && next != null && !next.header;
066 }
067
068 int getIndex() {
069 return index;
070 }
071
072 int getSize() {
073 return index + 1;
074 }
075
076 TableRowRenderer previous() {
077 return previous;
078 }
079
080 TableRowRenderer next() {
081 return next;
082 }
083
084 boolean isHeader() {
085 return header;
086 }
087
088 int getColsSize() {
089 return row.getSize();
090 }
091
092 List<Renderer> getCols() {
093 return row.getCols();
094 }
095
096 int getActualWidth() {
097 return row.getActualWidth();
098 }
099
100 int getMinWidth() {
101 return row.getMinWidth();
102 }
103
104 int getActualHeight(int width) {
105 int actualHeight;
106 switch (table.overflow) {
107 case HIDDEN:
108 actualHeight = 1;
109 break;
110 case WRAP:
111 actualHeight = row.getActualHeight(width);
112 break;
113 default:
114 throw new AssertionError();
115 }
116 if (hasTop()) {
117 actualHeight++;
118 }
119 if (hasBottom()) {
120 actualHeight++;
121 }
122 return actualHeight;
123 }
124
125 int getActualHeight(int[] widths) {
126 int actualHeight;
127 switch (table.overflow) {
128 case HIDDEN:
129 actualHeight = 1;
130 break;
131 case WRAP:
132 actualHeight = 0;
133 for (int i = 0;i < widths.length;i++) {
134 Renderer col = row.getCols().get(i);
135 actualHeight = Math.max(actualHeight, col.getActualHeight(widths[i]));
136 }
137 break;
138 default:
139 throw new AssertionError();
140 }
141 if (hasTop()) {
142 actualHeight++;
143 }
144 if (hasBottom()) {
145 actualHeight++;
146 }
147 return actualHeight;
148 }
149
150 int getMinHeight(int[] widths) {
151 int minHeight;
152 switch (table.overflow) {
153 case HIDDEN:
154 minHeight = 1;
155 break;
156 case WRAP:
157 minHeight = 0;
158 for (int i = 0;i < widths.length;i++) {
159 Renderer col = row.getCols().get(i);
160 minHeight = Math.max(minHeight, col.getMinHeight(widths[i]));
161 }
162 break;
163 default:
164 throw new AssertionError();
165 }
166 if (hasTop()) {
167 minHeight++;
168 }
169 if (hasBottom()) {
170 minHeight++;
171 }
172 return minHeight;
173 }
174
175 TableRowReader renderer(int[] widths, int height) {
176 return new TableRowReader(this, row, widths, height);
177 }
178 }