001    /*
002     * Created on Feb 2, 2008
003     *
004     * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
005     * 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 is distributed on
010     * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
011     * specific language governing permissions and limitations under the License.
012     *
013     * Copyright @2008-2010 the original author or authors.
014     */
015    package org.fest.swing.driver;
016    
017    import java.awt.Point;
018    import java.awt.Rectangle;
019    
020    import javax.swing.JTable;
021    
022    import org.fest.swing.annotation.RunsInCurrentThread;
023    import org.fest.swing.data.TableCell;
024    
025    /**
026     * Understands a visible location on a <code>{@link JTable}</code>.
027     *
028     * @author Yvonne Wang
029     * @author Alex Ruiz
030     */
031    public final class JTableLocation {
032    
033      /**
034       * Converts the given row and column into a coordinate pair. It is assumed that the row and column indices are
035       * in the <code>{@link JTable}</code>'s bounds.
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 given row.
042       * @param column the given column.
043       * @return the coordinates of the given row and column.
044       */
045      @RunsInCurrentThread
046      public Point pointAt(JTable table, int row, int column) {
047        Rectangle cellBounds = cellBounds(table, row, column);
048        return new Point(cellBounds.x + cellBounds.width / 2, cellBounds.y + cellBounds.height / 2);
049      }
050    
051      /**
052       * Returns the bounds of the given cell.
053       * <p>
054       * <b>Note:</b> This method is <b>not</b> guaranteed to be executed in the event dispatch thread (EDT.) Clients are
055       * responsible for calling this method from the EDT.
056       * </p>
057       * @param table the target <code>JTable</code>.
058       * @param cell the given cell.
059       * @return the bounds of the given cell.
060       */
061      @RunsInCurrentThread
062      public Rectangle cellBounds(JTable table, TableCell cell) {
063        return cellBounds(table, cell.row, cell.column);
064      }
065    
066      /**
067       * Returns the bounds of the given row and column.
068       * <p>
069       * <b>Note:</b> This method is <b>not</b> guaranteed to be executed in the event dispatch thread (EDT.) Clients are
070       * responsible for calling this method from the EDT.
071       * </p>
072       * @param table the target <code>JTable</code>.
073       * @param row the given row.
074       * @param column the given column.
075       * @return the bounds of the given row and column.
076       */
077      @RunsInCurrentThread
078      public Rectangle cellBounds(JTable table, int row, int column) {
079        return table.getCellRect(row, column, false);
080      }
081    
082    }