package org.robotframework.swing.combobox; import java.awt.Component; import java.util.ArrayList; import java.util.List; import org.netbeans.jemmy.Waiter; import org.netbeans.jemmy.operators.JComboBoxOperator; import org.robotframework.swing.common.IdentifierSupport; import org.robotframework.swing.common.TimeoutCopier; import org.robotframework.swing.common.TimeoutName; import org.robotframework.swing.operator.ComponentWrapper; import org.robotframework.swing.util.SwingWaiter; public class ComboBoxOperator extends IdentifierSupport implements ComponentWrapper { private final JComboBoxOperator comboboxOperator; private final ItemTextExtractor itemTextExtractor; public ComboBoxOperator(JComboBoxOperator jComboboxOperator) { comboboxOperator = jComboboxOperator; itemTextExtractor = new ItemTextExtractor(jComboboxOperator); } ComboBoxOperator(JComboBoxOperator jComboboxOperator, ItemTextExtractor itemTextExtractor) { this.comboboxOperator = jComboboxOperator; this.itemTextExtractor = itemTextExtractor; } public void disableVerification() { comboboxOperator.setVerification(false); } @Override public Component getSource() { return comboboxOperator.getSource(); } public void selectItem(final String comboItemIdentifier) { new ComboboxAction() { @Override protected Object executeWhenComboBoxOpen() { int itemIndex = findItemIndex(comboItemIdentifier); boolean verificationEnabled = comboboxOperator .getVerification(); comboboxOperator.setVerification(false); comboboxOperator.selectItem(itemIndex); if (verificationEnabled) verifyItemSelection(comboItemIdentifier); return null; } }.execute(); } private void verifyItemSelection(String comboItemIdentifier) { try { Waiter waiter = comboboxSelectedItemWaiter(this, comboItemIdentifier); Object selectedItem = waiter.waitAction(null); if (selectedItem == null) throw new RuntimeException("Expected selection to be '" + comboItemIdentifier + "' but no selection found"); if (!comboItemIdentifier.equals(selectedItem.toString())) throw new RuntimeException("Expected selection to be '" + comboItemIdentifier + "' but was '" + selectedItem + "'"); } catch (InterruptedException e) { throw new RuntimeException(e); } } private Waiter comboboxSelectedItemWaiter( ComboBoxOperator comboboxOperator, String itemIdentifier) { Waiter waiter = new Waiter(new ComboboxSelectedItemWaitable( comboboxOperator, itemIdentifier)); waiter.setTimeouts(new TimeoutCopier(comboboxOperator .getComboboxOperator(), TimeoutName.J_COMBOBOX_OPERATOR_WAIT_GET_SELECTED_ITEM_TIMEOUT) .getTimeouts()); return waiter; } private int findItemIndex(String comboItemIdentifier) { if (isIndex(comboItemIdentifier)) return asIndex(comboItemIdentifier); return findItemIndexWithRenderer(comboItemIdentifier); } private int findItemIndexWithRenderer(String expectedText) { for (int itemIndex = 0, itemCount = itemTextExtractor.itemCount(); itemIndex < itemCount; itemIndex++) { String text = itemTextExtractor .getTextFromRenderedComponent(itemIndex); if (expectedText.equals(text)) return itemIndex; } throw new RuntimeException("Couldn't find text '" + expectedText + "'"); } public Object getSelectedItem() { return new ComboboxAction() { @Override protected Object executeWhenComboBoxOpen() { return itemTextExtractor .getTextFromRenderedComponent(comboboxOperator .getSelectedIndex()); } }.execute(); } public Object getSelectedItemFromDisabledComboBox() { return comboboxOperator.getSelectedItem(); } public boolean isEnabled() { return comboboxOperator.isEnabled(); } public void typeText(String text) { comboboxOperator.clearText(); comboboxOperator.typeText(text); } public String[] getValues() { return (String[]) new ComboboxAction() { @Override protected Object executeWhenComboBoxOpen() { List<String> values = new ArrayList<String>(); for (int i = 0, itemCount = itemTextExtractor.itemCount(); i < itemCount; i++) values.add(itemTextExtractor .getTextFromRenderedComponent(i)); return values.toArray(new String[0]); } }.execute(); } private abstract class ComboboxAction { public Object execute() { boolean isOpenWhenWeStart = comboboxOperator.isPopupVisible(); try { if (!isOpenWhenWeStart) { comboboxOperator.pushComboButton(); } return executeWhenComboBoxOpen(); } finally { if (!isOpenWhenWeStart) { comboboxOperator.hidePopup(); } SwingWaiter.waitToAvoidInstability(200); } } protected abstract Object executeWhenComboBoxOpen(); } public JComboBoxOperator getComboboxOperator() { return comboboxOperator; } }