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    import org.crsh.text.Style;
024    
025    import java.util.ArrayList;
026    import java.util.List;
027    
028    public class TableElement extends Element {
029    
030      /** . */
031      ArrayList<RowElement> rows = new ArrayList<RowElement>();
032    
033      /** . */
034      protected BorderStyle border;
035    
036      /** . */
037      protected BorderStyle separator;
038    
039      /** . */
040      private Overflow overflow;
041    
042      /** The column layout. */
043      protected Layout columnLayout;
044    
045      /** The optional row row layout. */
046      protected Layout rowLayout;
047    
048      /** Cell padding left. */
049      private int leftCellPadding;
050    
051      /** Cell padding right. */
052      private int rightCellPadding;
053    
054      public TableElement() {
055        this(Layout.flow(), Layout.flow());
056      }
057    
058      public TableElement(int ... columns) {
059        this(Layout.flow(), Layout.weighted(columns));
060      }
061    
062      public TableElement(int[] rows, int[] columns) {
063        this(Layout.weighted(rows), Layout.weighted(columns));
064      }
065    
066      private TableElement(Layout rowLayout, Layout columnLayout) {
067        this.rowLayout = rowLayout;
068        this.columnLayout = columnLayout;
069        this.border = null;
070        this.separator = null;
071        this.overflow = Overflow.WRAP;
072        this.leftCellPadding = 0;
073        this.rightCellPadding = 0;
074      }
075    
076      public TableElement add(RowElement row) {
077        rows.add(row);
078        return this;
079      }
080    
081      public TableElement add(RowElement... rows) {
082        for (RowElement row : rows) {
083          add(row);
084        }
085        return this;
086      }
087    
088      public TableElement header(Element... cols) {
089        return row(true, cols);
090      }
091    
092      public TableElement row(Element... cols) {
093        return row(false, cols);
094      }
095    
096      public TableElement row(String... cols) {
097        return row(false, cols);
098      }
099    
100      public TableElement row(boolean header, Element... cols) {
101        return add(new RowElement(header).add(cols));
102      }
103    
104      public TableElement row(boolean header, String... cols) {
105        return add(new RowElement(header).add(cols));
106      }
107    
108      public Layout getColumnLayout() {
109        return columnLayout;
110      }
111    
112      public void setColumnLayout(Layout columnLayout) {
113        if (columnLayout == null) {
114          throw new NullPointerException("Column layout cannot be null");
115        }
116        this.columnLayout = columnLayout;
117      }
118    
119      public Layout getRowLayout() {
120        return rowLayout;
121      }
122    
123      public void setRowLayout(Layout rowLayout) {
124        if (rowLayout == null) {
125          throw new NullPointerException("Row layout cannot be null");
126        }
127        this.rowLayout = rowLayout;
128      }
129    
130      public LineRenderer renderer() {
131        return new TableLineRenderer(this);
132      }
133    
134      public TableElement withColumnLayout(Layout columnLayout) {
135        setColumnLayout(columnLayout);
136        return this;
137      }
138    
139      public TableElement withRowLayout(Layout rowLayout) {
140        setRowLayout(rowLayout);
141        return this;
142      }
143    
144      public List<RowElement> getRows() {
145        return rows;
146      }
147    
148      public BorderStyle getBorder() {
149        return border;
150      }
151    
152      public void setBorder(BorderStyle border) {
153        this.border = border;
154      }
155    
156      public TableElement border(BorderStyle border) {
157        setBorder(border);
158        return this;
159      }
160    
161      public BorderStyle getSeparator() {
162        return separator;
163      }
164    
165      public void setSeparator(BorderStyle separator) {
166        this.separator = separator;
167      }
168    
169      public TableElement collapse() {
170        setSeparator(null);
171        return this;
172      }
173    
174      public TableElement separator(BorderStyle separator) {
175        setSeparator(separator);
176        return this;
177      }
178    
179      public void setOverflow(Overflow overflow) {
180        this.overflow = overflow;
181      }
182    
183      public final Overflow getOverflow() {
184        return overflow;
185      }
186    
187      public TableElement overflow(Overflow overflow) {
188        setOverflow(overflow);
189        return this;
190      }
191    
192      public int getLeftCellPadding() {
193        return leftCellPadding;
194      }
195    
196      public void setLeftCellPadding(int leftCellPadding) {
197        if (leftCellPadding < 0) {
198          throw new IllegalArgumentException("No negative cell padding left accepted");
199        }
200        this.leftCellPadding = leftCellPadding;
201      }
202    
203      public TableElement leftCellPadding(int leftCellPadding) {
204        setLeftCellPadding(leftCellPadding);
205        return this;
206      }
207    
208      public int getRightCellPadding() {
209        return rightCellPadding;
210      }
211    
212      public void setRightCellPadding(int rightCellPadding) {
213        if (rightCellPadding < 0) {
214          throw new IllegalArgumentException("No negative cell padding right accepted");
215        }
216        this.rightCellPadding = rightCellPadding;
217      }
218    
219      public TableElement rightCellPadding(int rightCellPadding) {
220        setRightCellPadding(rightCellPadding);
221        return this;
222      }
223    
224      @Override
225      public TableElement style(Style.Composite style) {
226        return (TableElement)super.style(style);
227      }
228    }