/* * Copyright 2008 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.gen2.table.client; import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; /** * A collection of {@link ColumnDefinition ColumnDefinitions} that define a * table. * * @param <RowType> the type of the row values */ public class DefaultTableDefinition<RowType> implements TableDefinition<RowType> { /** * The default {@link RowRenderer} to use when the * {@link DefaultTableDefinition} does not specify one. */ private static final RowRenderer DEFAULT_ROW_RENDERER = new DefaultRowRenderer(); /** * The ordered list of {@link ColumnDefinition ColumnDefinitions} used by this * renderer. */ private List<ColumnDefinition<RowType, ?>> columnDefs; /** * A list of visible columns. */ private Set<ColumnDefinition<RowType, ?>> hiddenColumnDefs; /** * The renderer used to render rows. */ private RowRenderer<RowType> rowRenderer = DEFAULT_ROW_RENDERER; /** * Create a new {@link TableDefinition}. */ public DefaultTableDefinition() { this(new ArrayList<ColumnDefinition<RowType, ?>>()); } /** * Create a new {@link TableDefinition} with a list of * {@link ColumnDefinition ColumnDefinitions}. * * @param columnDefs the {@link ColumnDefinition ColumnDefinitions} to render */ public DefaultTableDefinition(List<ColumnDefinition<RowType, ?>> columnDefs) { this.columnDefs = columnDefs; hiddenColumnDefs = new HashSet<ColumnDefinition<RowType, ?>>(); } /** * Add a {@link ColumnDefinition}. * * @param columnDef the {@link ColumnDefinition} to add */ public void addColumnDefinition(ColumnDefinition<RowType, ?> columnDef) { columnDefs.add(columnDef); } /** * Insert a {@link ColumnDefinition} at a specific index. * * @param index the index to place the {@link ColumnDefinition} * @param columnDef the {@link ColumnDefinition} to add */ public void addColumnDefinition(int index, ColumnDefinition<RowType, ?> columnDef) { columnDefs.add(index, columnDef); } /** * Get the {@link ColumnDefinition} for a given column. * * @param column the column index * @return the {@link ColumnDefinition} for the column * @throws IndexOutOfBoundsException if the column is not defined */ public ColumnDefinition<RowType, ?> getColumnDefinition(int column) throws IndexOutOfBoundsException { return columnDefs.get(column); } /** * @return the number of {@link ColumnDefinition ColumnDefinitions}. */ public int getColumnDefinitionCount() { return columnDefs.size(); } public RowRenderer<RowType> getRowRenderer() { return rowRenderer; } public List<ColumnDefinition<RowType, ?>> getVisibleColumnDefinitions() { List<ColumnDefinition<RowType, ?>> visibleColumns = new ArrayList<ColumnDefinition<RowType, ?>>(); for (ColumnDefinition<RowType, ?> columnDef : columnDefs) { if (isColumnVisible(columnDef)) { visibleColumns.add(columnDef); } } return visibleColumns; } /** * Check if a column is visible or not. * * @param colDef the {@link ColumnDefinition} * @return true if visible, false if hidden */ public boolean isColumnVisible(ColumnDefinition<RowType, ?> colDef) { return !hiddenColumnDefs.contains(colDef); } /** * Remove a {@link ColumnDefinition}. * * @param columnDef the {@link ColumnDefinition} to remove */ public void removeColumnDefinition(ColumnDefinition<RowType, ?> columnDef) { columnDefs.remove(columnDef); } public void renderRows(int startRowIndex, Iterator<RowType> rowValues, AbstractRowView<RowType> view) { List<ColumnDefinition<RowType, ?>> visibleColumns = getVisibleColumnDefinitions(); view.renderRowsImpl(startRowIndex, rowValues, rowRenderer, visibleColumns); } /** * Hide or show a column. * * @param colDef the {@link ColumnDefinition} * @param visible true to show it, false to hide */ public void setColumnVisible(ColumnDefinition<RowType, ?> colDef, boolean visible) { if (visible) { hiddenColumnDefs.remove(colDef); } else { hiddenColumnDefs.add(colDef); } } /** * Set the {@link RowRenderer} used to render rows. */ public void setRowRenderer(RowRenderer<RowType> rowRenderer) { assert rowRenderer != null : "rowRenderer cannot be null"; this.rowRenderer = rowRenderer; } }