001 /* 002 * Created on Oct 13, 2008 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 005 * in compliance with the License. You may obtain a copy of the License at 006 * 007 * http://www.apache.org/licenses/LICENSE-2.0 008 * 009 * Unless required by applicable law or agreed to in writing, software distributed under the License 010 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 011 * or implied. See the License for the specific language governing permissions and limitations under 012 * the License. 013 * 014 * Copyright @2008-2010 the original author or authors. 015 */ 016 package org.fest.swing.driver; 017 018 import static java.lang.String.valueOf; 019 import static org.fest.util.Strings.concat; 020 import static org.fest.util.Strings.quote; 021 022 import javax.swing.JTable; 023 024 import org.fest.swing.annotation.RunsInCurrentThread; 025 import org.fest.swing.data.TableCell; 026 027 /** 028 * Understands validation of <code>{@link JTable}</code>-related information. 029 * 030 * @author Alex Ruiz 031 */ 032 public final class JTableCellValidator { 033 034 /** 035 * Validates that the table cell in the given coordinates is editable. 036 * <p> 037 * <b>Note:</b> This method is <b>not</b> guaranteed to be executed in the event dispatch thread (EDT.) Clients are 038 * responsible for calling this method from the EDT. 039 * </p> 040 * @param table the target <code>JTable</code>. 041 * @param row the row index of the cell to validate. 042 * @param column the column index of the cell to validate. 043 * @throws IllegalStateException if the table cell in the given coordinates is not editable. 044 */ 045 @RunsInCurrentThread 046 public static void validateCellIsEditable(JTable table, int row, int column) { 047 if (!table.isCellEditable(row, column)) 048 throw new IllegalStateException( 049 concat("Expecting the cell [", valueOf(row), ",", valueOf(column), "] to be editable")); 050 } 051 052 /** 053 * Validates that the given table cell is non <code>null</code> and its indices are not out of bounds. 054 * <p> 055 * <b>Note:</b> This method is <b>not</b> guaranteed to be executed in the event dispatch thread (EDT.) Clients are 056 * responsible for calling this method from the EDT. 057 * </p> 058 * @param table the target <code>JTable</code>. 059 * @param cell the cell to validate. 060 * @throws NullPointerException if the cell is <code>null</code>. 061 * @throws IndexOutOfBoundsException if any of the indices (row and column) is out of bounds. 062 */ 063 @RunsInCurrentThread 064 public static void validateCellIndices(JTable table, TableCell cell) { 065 validateNotNull(cell); 066 validateIndices(table, cell.row, cell.column); 067 } 068 069 /** 070 * Validates that the given table cell is not <code>null</code>. 071 * @param cell the cell to validate. 072 * @throws NullPointerException if the cell is <code>null</code>. 073 */ 074 public static void validateNotNull(TableCell cell) { 075 if (cell == null) throw new NullPointerException("Table cell cannot be null"); 076 } 077 078 /** 079 * Validates the given indices regarding the given table. 080 * <p> 081 * <b>Note:</b> This method is <b>not</b> guaranteed to be executed in the event dispatch thread (EDT.) Clients are 082 * responsible for calling this method from the EDT. 083 * </p> 084 * @param table the <code>JTable</code> to use to validate the given indices. 085 * @param row the row index to validate. 086 * @param column the column index to validate. 087 * @throws IndexOutOfBoundsException if any of the indices is out of bounds or if the <code>JTable</code> does not 088 * have any rows. 089 */ 090 @RunsInCurrentThread 091 public static void validateIndices(JTable table, int row, int column) { 092 if (table.getRowCount() == 0) throw new IndexOutOfBoundsException("Table does not contain any rows"); 093 validateRowIndex(table, row); 094 validateColumnIndex(table, column); 095 } 096 097 /** 098 * Validates that the given row index exists in the given table. 099 * <p> 100 * <b>Note:</b> This method is <b>not</b> guaranteed to be executed in the event dispatch thread (EDT.) Clients are 101 * responsible for calling this method from the EDT. 102 * </p> 103 * @param table the table the given table. 104 * @param row the row to validate. 105 * @throws IndexOutOfBoundsException if the row index is out of bounds. 106 */ 107 @RunsInCurrentThread 108 public static void validateRowIndex(JTable table, int row) { 109 validateIndex(row, table.getRowCount(), "row"); 110 } 111 112 /** 113 * Validates that the given column index exists in the given table. 114 * <p> 115 * <b>Note:</b> This method is <b>not</b> guaranteed to be executed in the event dispatch thread (EDT.) Clients are 116 * responsible for calling this method from the EDT. 117 * </p> 118 * @param table the table the given table. 119 * @param column the column to validate. 120 * @throws IndexOutOfBoundsException if the column index is out of bounds. 121 */ 122 @RunsInCurrentThread 123 public static void validateColumnIndex(JTable table, int column) { 124 validateIndex(column, table.getColumnCount(), "column"); 125 } 126 127 @RunsInCurrentThread 128 private static void validateIndex(int index, int itemCount, String indexName) { 129 if (index >= 0 && index < itemCount) return; 130 throw new IndexOutOfBoundsException(concat( 131 indexName, " ", quote(valueOf(index)), " should be between <0> and <", valueOf(itemCount - 1), ">")); 132 } 133 134 private JTableCellValidator() {} 135 }