/* * 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 com.google.gwt.gen2.table.client.ColumnResizer.ColumnWidthInfo; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; /** * A static version of the {@link AbstractScrollTable} that combines a header, * data, and footer section. */ public class ScrollTable extends AbstractScrollTable { /** * A mapping of column indexes to their associated {@link ColumnWidthInfo}. */ private Map<Integer, ColumnWidthInfo> columnWidthInfos = new HashMap<Integer, ColumnWidthInfo>(); /** * A set of untruncatable column indexes. */ private Set<Integer> untruncatableColumns = new HashSet<Integer>(); /** * A set of untruncatable footer column indexes. */ private Set<Integer> untruncatableFooters = new HashSet<Integer>(); /** * A set of untruncatable header column indexes. */ private Set<Integer> untruncatableHeaders = new HashSet<Integer>(); /** * A set of unsortable column indexes. */ private Set<Integer> unsortableColumns = new HashSet<Integer>(); /** * Construct a new {@link ScrollTable}. * * @param dataTable the data table * @param headerTable the header table */ public ScrollTable(FixedWidthGrid dataTable, FixedWidthFlexTable headerTable) { super(dataTable, headerTable); } /** * Construct a new {@link ScrollTable}. * * @param dataTable the data table * @param headerTable the header table * @param images the images to use in the table */ public ScrollTable(FixedWidthGrid dataTable, FixedWidthFlexTable headerTable, ScrollTableImages images) { super(dataTable, headerTable, images); } @Override public int getMaximumColumnWidth(int column) { return getColumnWidthInfo(column).getMaximumWidth(); } @Override public int getMinimumColumnWidth(int column) { return getColumnWidthInfo(column).getMinimumWidth(); } @Override public int getPreferredColumnWidth(int column) { return getColumnWidthInfo(column).getPreferredWidth(); } @Override public boolean isColumnSortable(int column) { return (getSortPolicy() != SortPolicy.DISABLED && !unsortableColumns.contains(column)); } @Override public boolean isColumnTruncatable(int column) { return !untruncatableColumns.contains(column); } @Override public boolean isFooterColumnTruncatable(int column) { return !untruncatableFooters.contains(column); } @Override public boolean isHeaderColumnTruncatable(int column) { return !untruncatableHeaders.contains(column); } /** * Enable or disable sorting on a specific column. All columns are sortable by * default. Use {@link #setSortPolicy(SortPolicy)} to disable sorting on all * columns. * * @param column the index of the column * @param sortable true to enable sorting for this column, false to disable */ public void setColumnSortable(int column, boolean sortable) { if (sortable) { unsortableColumns.remove(column); } else { unsortableColumns.add(column); } } /** * Enable or disable truncation on a specific column. When enabled, the column * width will be adjusted to fit the content. All columns are truncatable by * default. * * @param column the index of the column * @param truncatable true to enable truncation, false to disable */ public void setColumnTruncatable(int column, boolean truncatable) { if (truncatable) { untruncatableColumns.remove(column); } else { untruncatableColumns.add(column); } } /** * Enable or disable truncation on a specific footer column. When enabled, the * column width will be adjusted to fit the content. All columns are * truncatable by default. * * @param column the index of the column * @param truncatable true to enable truncation, false to disable */ public void setFooterColumnTruncatable(int column, boolean truncatable) { if (truncatable) { untruncatableFooters.remove(column); } else { untruncatableFooters.add(column); } } /** * Enable or disable truncation on a specific header column. When enabled, the * column width will be adjusted to fit the content. All columns are * truncatable by default. * * @param column the index of the column * @param truncatable true to enable truncation, false to disable */ public void setHeaderColumnTruncatable(int column, boolean truncatable) { if (truncatable) { untruncatableHeaders.remove(column); } else { untruncatableHeaders.add(column); } } /** * Set the maximum width of the column. * * @param column the column index * @param maxWidth the maximum width */ public void setMaximumColumnWidth(int column, int maxWidth) { getColumnWidthInfo(column).setMaximumWidth(maxWidth); } /** * Set the minimum width of the column. * * @param column the column index * @param minWidth the minimum width */ public void setMinimumColumnWidth(int column, int minWidth) { minWidth = Math.max(minWidth, FixedWidthGrid.MIN_COLUMN_WIDTH); getColumnWidthInfo(column).setMinimumWidth(minWidth); } /** * Set the preferred width of a column. The table will attempt maintain the * preferred width of the column. If it cannot, the preferred widths will * serve as relative weights when distributing available width. * * @param column the column index * @param preferredWidth the preferred width */ public void setPreferredColumnWidth(int column, int preferredWidth) { getColumnWidthInfo(column).setPreferredWidth(preferredWidth); } /** * Get info about the width of a column. * * @param column the column index * @return the info about the column width */ private ColumnWidthInfo getColumnWidthInfo(int column) { int curWidth = getColumnWidth(column); ColumnWidthInfo info = columnWidthInfos.get(new Integer(column)); if (info == null) { info = new ColumnWidthInfo(FixedWidthGrid.MIN_COLUMN_WIDTH, -1, FixedWidthGrid.DEFAULT_COLUMN_WIDTH, curWidth); columnWidthInfos.put(new Integer(column), info); } else { info.setCurrentWidth(curWidth); } return info; } }