001    /*
002     * Created on Jun 8, 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 java.awt.Component;
019    
020    import javax.swing.*;
021    import javax.swing.text.JTextComponent;
022    
023    import org.fest.swing.cell.JTableCellWriter;
024    import org.fest.swing.core.Robot;
025    import org.fest.swing.exception.ActionFailedException;
026    
027    /**
028     * Understands the default implementation of <code>{@link JTableCellWriter}</code>.
029     *
030     * @author Yvonne Wang
031     * @author Alex Ruiz
032     */
033    public class BasicJTableCellWriter extends AbstractJTableCellWriter {
034    
035      private final JTableCheckBoxEditorCellWriter checkBoxWriter;
036      private final JTableComboBoxEditorCellWriter comboBoxWriter;
037      private final JTableTextComponentEditorCellWriter textComponentWriter;
038    
039      public BasicJTableCellWriter(Robot robot) {
040        super(robot);
041        checkBoxWriter = new JTableCheckBoxEditorCellWriter(robot);
042        comboBoxWriter = new JTableComboBoxEditorCellWriter(robot);
043        textComponentWriter = new JTableTextComponentEditorCellWriter(robot);
044      }
045    
046      /**
047       * Enters the given value at the given cell of the <code>JTable</code>. This method only supports the following GUI
048       * components as cell editors:
049       * <ul>
050       * <li><code>{@link JCheckBox}</code>: valid values for the property "selected" (a boolean) are "true" and "yes",
051       * other values are considered <code>false</code>.</li>
052       * <li><code>{@link JComboBox}</code>: this writer will select the element which <code>String</code> representation
053       * matches the given value.</li>
054       * <li><code>{@link JTextComponent}</code>: any value will be entered in the cell.</li>
055       * </ul>
056       * @param table the target <code>JTable</code>.
057       * @param row the row index of the cell.
058       * @param column the column index of the cell.
059       * @param value the value to enter.
060       * @throws ActionFailedException if this writer is unable to handle the underlying cell editor.
061       */
062      public void enterValue(JTable table, int row, int column, String value) {
063        cellWriterFor(table, row, column).enterValue(table, row, column, value);
064      }
065    
066      /**
067       * Starts editing the given cell of the <code>{@link JTable}</code>. This method only supports the following GUI
068       * components as cell editors:
069       * <ul>
070       * <li><code>{@link JCheckBox}</code></li>
071       * <li><code>{@link JComboBox}</code></li>
072       * <li><code>{@link JTextComponent}</code></li>
073       * </ul>
074       * @param row the row index of the cell.
075       * @param column the column index of the cell.
076       * @throws ActionFailedException if this writer is unable to handle the underlying cell editor.
077       * @see JTableCellWriter#startCellEditing(JTable, int, int)
078       */
079      public void startCellEditing(JTable table, int row, int column) {
080        cellWriterFor(table, row, column).startCellEditing(table, row, column);
081      }
082      
083      /**
084       * Stops editing the given cell of the <code>{@link JTable}</code>. This method only supports the following GUI
085       * components as cell editors:
086       * <ul>
087       * <li><code>{@link JCheckBox}</code></li>
088       * <li><code>{@link JComboBox}</code></li>
089       * <li><code>{@link JTextComponent}</code></li>
090       * </ul>
091       * @param row the row index of the cell.
092       * @param column the column index of the cell.
093       * @throws ActionFailedException if this writer is unable to handle the underlying cell editor.
094       * @see JTableCellWriter#stopCellEditing(JTable, int, int)
095       */
096      public void stopCellEditing(JTable table, int row, int column) {
097        cellWriterFor(table, row, column).stopCellEditing(table, row, column);
098      }
099      
100      /**
101       * Cancels editing the given cell of the <code>{@link JTable}</code>. This method only supports the following GUI
102       * components as cell editors:
103       * <ul>
104       * <li><code>{@link JCheckBox}</code></li>
105       * <li><code>{@link JComboBox}</code></li>
106       * <li><code>{@link JTextComponent}</code></li>
107       * </ul>
108       * @param row the row index of the cell.
109       * @param column the column index of the cell.
110       * @throws ActionFailedException if this writer is unable to handle the underlying cell editor.
111       * @see JTableCellWriter#cancelCellEditing(JTable, int, int)
112       */
113      public void cancelCellEditing(JTable table, int row, int column) {
114        cellWriterFor(table, row, column).cancelCellEditing(table, row, column);
115      }
116    
117      private JTableCellWriter cellWriterFor(JTable table, int row, int column) {
118        Component editor = editorForCell(table, row, column);
119        if (editor instanceof JCheckBox) return checkBoxWriter;
120        if (editor instanceof JComboBox) return comboBoxWriter;
121        if (editor instanceof JTextComponent) return textComponentWriter;
122        throw cannotFindOrActivateEditor(row, column);
123      }
124    }