/** * 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. * * Copyright 2012-2015 the original author or authors. */ package org.assertj.swing.driver; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.swing.edt.GuiActionRunner.execute; import java.awt.Dimension; import javax.swing.DefaultCellEditor; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JTextField; import javax.swing.table.AbstractTableModel; import org.assertj.swing.annotation.RunsInEDT; import org.assertj.swing.test.core.RobotBasedTestCase; import org.assertj.swing.test.swing.TestWindow; /** * Base test case for tasks related to editing {@code JTable} cells. * * @author Alex Ruiz */ public abstract class JTableCellEditingTask_TestCase extends RobotBasedTestCase { MyWindow window; @Override protected final void onSetUp() { window = MyWindow.createNew(getClass()); } @RunsInEDT final void editTableCellAt(final int row, final int col) { execute(() -> window.table.editCellAt(row, col)); robot.waitForIdle(); assertThat(isTableEditing()).isTrue(); } @RunsInEDT final boolean isTableEditing() { return execute(() -> window.table.isEditing()); } final void assertCellEditingStopped() { assertThat(isTableEditing()).isFalse(); MyCellEditor cellEditor = window.table.cellEditor(); assertThat(cellEditor.cellEditingCanceled()).isFalse(); assertThat(cellEditor.cellEditingStopped()).isTrue(); } static class MyWindow extends TestWindow { final MyTable table = new MyTable(); static MyWindow createNew(final Class<?> testClass) { return execute(() -> new MyWindow(testClass)); } private MyWindow(Class<?> testClass) { super(testClass); addComponents(new JScrollPane(table)); } } static class MyTable extends JTable { private final MyCellEditor cellEditor = new MyCellEditor(); MyTable() { super(new MyTableModel()); setDefaultEditor(String.class, cellEditor); setPreferredScrollableViewportSize(new Dimension(200, 70)); } MyCellEditor cellEditor() { return cellEditor; } } static class MyCellEditor extends DefaultCellEditor { private boolean cellEditingCanceled; private boolean cellEditingStopped; MyCellEditor() { super(new JTextField()); } @Override public void cancelCellEditing() { cellEditingCanceled = true; super.cancelCellEditing(); } @Override public boolean stopCellEditing() { cellEditingStopped = true; return super.stopCellEditing(); } boolean cellEditingCanceled() { return cellEditingCanceled; } boolean cellEditingStopped() { return cellEditingStopped; } } static class MyTableModel extends AbstractTableModel { private final String[] columnNames = { "First Name", "Sport" }; private final Object[][] data = { { "Mary", "Snowboarding" }, { "Alison", "Rowing" }, { "Kathy", "Knitting" }, { "Sharon", "Speed reading" }, { "Philip", "Pool" } }; @Override public int getColumnCount() { return columnNames.length; } @Override public int getRowCount() { return data.length; } @Override public Class<?> getColumnClass(int columnIndex) { return getValueAt(0, columnIndex).getClass(); } @Override public String getColumnName(int col) { return columnNames[col]; } @Override public Object getValueAt(int row, int col) { return data[row][col]; } @Override public boolean isCellEditable(int row, int col) { if (col < 1) { return false; } return true; } @Override public void setValueAt(Object value, int row, int col) { data[row][col] = value; fireTableCellUpdated(row, col); } } }