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 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 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 Renderer renderer() {
104 return new TableRenderer(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 }