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.LineRenderer;
023import org.crsh.text.Style;
024
025import java.util.ArrayList;
026import java.util.List;
027
028public 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 Layout getColumnLayout() {
082    return columnLayout;
083  }
084
085  public void setColumnLayout(Layout columnLayout) {
086    if (columnLayout == null) {
087      throw new NullPointerException("Column layout cannot be null");
088    }
089    this.columnLayout = columnLayout;
090  }
091
092  public Layout getRowLayout() {
093    return rowLayout;
094  }
095
096  public void setRowLayout(Layout rowLayout) {
097    if (rowLayout == null) {
098      throw new NullPointerException("Row layout cannot be null");
099    }
100    this.rowLayout = rowLayout;
101  }
102
103  public LineRenderer renderer() {
104    return new TableLineRenderer(this);
105  }
106
107  public TableElement withColumnLayout(Layout columnLayout) {
108    setColumnLayout(columnLayout);
109    return this;
110  }
111
112  public TableElement withRowLayout(Layout rowLayout) {
113    setRowLayout(rowLayout);
114    return this;
115  }
116
117  public List<RowElement> getRows() {
118    return rows;
119  }
120
121  public BorderStyle getBorder() {
122    return border;
123  }
124
125  public void setBorder(BorderStyle border) {
126    this.border = border;
127  }
128
129  public TableElement border(BorderStyle border) {
130    setBorder(border);
131    return this;
132  }
133
134  public BorderStyle getSeparator() {
135    return separator;
136  }
137
138  public void setSeparator(BorderStyle separator) {
139    this.separator = separator;
140  }
141
142  public TableElement collapse() {
143    setSeparator(null);
144    return this;
145  }
146
147  public TableElement separator(BorderStyle separator) {
148    setSeparator(separator);
149    return this;
150  }
151
152  public void setOverflow(Overflow overflow) {
153    this.overflow = overflow;
154  }
155
156  public final Overflow getOverflow() {
157    return overflow;
158  }
159
160  public TableElement overflow(Overflow overflow) {
161    setOverflow(overflow);
162    return this;
163  }
164
165  public int getLeftCellPadding() {
166    return leftCellPadding;
167  }
168
169  public void setLeftCellPadding(int leftCellPadding) {
170    if (leftCellPadding < 0) {
171      throw new IllegalArgumentException("No negative cell padding left accepted");
172    }
173    this.leftCellPadding = leftCellPadding;
174  }
175
176  public TableElement leftCellPadding(int leftCellPadding) {
177    setLeftCellPadding(leftCellPadding);
178    return this;
179  }
180
181  public int getRightCellPadding() {
182    return rightCellPadding;
183  }
184
185  public void setRightCellPadding(int rightCellPadding) {
186    if (rightCellPadding < 0) {
187      throw new IllegalArgumentException("No negative cell padding right accepted");
188    }
189    this.rightCellPadding = rightCellPadding;
190  }
191
192  public TableElement rightCellPadding(int rightCellPadding) {
193    setRightCellPadding(rightCellPadding);
194    return this;
195  }
196
197  @Override
198  public TableElement style(Style.Composite style) {
199    return (TableElement)super.style(style);
200  }
201}