/* * Copyright 2008-2011 Nokia Siemens Networks Oyj * * 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. */ package org.robotframework.swing.combobox; import java.awt.Component; import javax.swing.ComboBoxModel; import javax.swing.JList; import javax.swing.ListCellRenderer; import org.jretrofit.AllMethodsNotImplementedException; import org.jretrofit.Retrofit; import org.netbeans.jemmy.operators.JComboBoxOperator; import org.robotframework.swing.chooser.WithText; import org.robotframework.swing.common.SmoothInvoker; public class ItemTextExtractor { private final JComboBoxOperator comboboxOperator; public ItemTextExtractor(JComboBoxOperator comboboxOperator) { this.comboboxOperator = comboboxOperator; } public int itemCount() { return comboboxModel().getSize(); } public String getTextFromRenderedComponent(int itemIndex) { WithText textElement = getComponentWithText(itemIndex); return textElement.getText(); } private ComboBoxModel comboboxModel() { return comboboxOperator.getModel(); } private WithText getComponentWithText(int itemIndex) { try { return coerceToWithText(getRenderedComponent(itemIndex)); } catch (AllMethodsNotImplementedException e) { return wrapElementToWithText(itemIndex); } } private Component getRenderedComponent(final int itemIndex) { final JList popupList = comboboxOperator.waitList(); final Object element = comboboxModel().getElementAt(itemIndex); final boolean isSelected = comboboxOperator.getSelectedIndex() == itemIndex; final boolean hasFocus = comboboxOperator.hasFocus(); final ListCellRenderer cellRenderer = comboboxOperator.getRenderer(); return new SmoothInvoker<Component>() { public Object work() { return cellRenderer.getListCellRendererComponent(popupList, element, itemIndex, isSelected, hasFocus); } }.invoke(); } private WithText coerceToWithText(Object element) { return (WithText) Retrofit.complete(element, WithText.class); } private WithText wrapElementToWithText(final int itemIndex) { return new WithText() { public String getText() { return comboboxModel().getElementAt(itemIndex).toString(); } }; } }