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.LineRenderer;
023    
024    import java.util.List;
025    
026    class TableRowLineRenderer {
027    
028      /** . */
029      final TableLineRenderer table;
030    
031      /** . */
032      final RowLineRenderer row;
033    
034      /** . */
035      final boolean header;
036    
037      /** . */
038      private TableRowLineRenderer previous;
039    
040      /** . */
041      private TableRowLineRenderer next;
042    
043      /** . */
044      private int index;
045    
046      TableRowLineRenderer(TableLineRenderer table, RowElement row) {
047        this.table = table;
048        this.row = new RowLineRenderer(row, table.separator, table.leftCellPadding, table.rightCellPadding);
049        this.header = row.header;
050        this.index = 0;
051      }
052    
053      TableRowLineRenderer add(TableRowLineRenderer 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      TableRowLineRenderer previous() {
077        return previous;
078      }
079    
080      TableRowLineRenderer 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<LineRenderer> 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              LineRenderer 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              LineRenderer 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    }