/*
* SoapUI, Copyright (C) 2004-2016 SmartBear Software
*
* Licensed under the EUPL, Version 1.1 or - as soon as they will be approved by the European Commission - subsequent
* versions of the EUPL (the "Licence");
* You may not use this work except in compliance with the Licence.
* You may obtain a copy of the Licence at:
*
* http://ec.europa.eu/idabc/eupl
*
* Unless required by applicable law or agreed to in writing, software distributed under the Licence is
* distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied. See the Licence for the specific language governing permissions and limitations
* under the Licence.
*/
package com.eviware.soapui.utils;
import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
import org.apache.commons.lang.StringUtils;
import javax.annotation.Nullable;
import javax.swing.AbstractButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.text.JTextComponent;
import java.awt.Component;
import java.awt.Container;
import java.util.ArrayList;
import java.util.NoSuchElementException;
/**
* Helper to find Swing/AWT components in a Container.
*/
public class ContainerWalker {
private final Container container;
private java.util.List<Component> containedComponents;
public ContainerWalker(Container container) {
this.container = container;
rebuildIndex();
}
public AbstractButton findButtonWithIcon(String iconFile) {
AbstractButton returnedButton = (AbstractButton) Iterables.find(containedComponents, new ButtonWithIconPredicate(iconFile));
if (returnedButton == null) {
throw new NoSuchElementException("No button found with icon file " + iconFile);
}
return returnedButton;
}
// Currently unused, but probably useful
public <T> JComboBox findComboBoxWithValue(T value) {
for (Component component : containedComponents) {
if (component instanceof JComboBox) {
JComboBox comboBox = (JComboBox) component;
for (int i = 0; i < comboBox.getItemCount(); i++) {
if (comboBox.getItemAt(i).equals(value)) {
return comboBox;
}
}
}
}
throw new NoSuchElementException("No combo box found with item " + value);
}
// Currently unused, but probably useful
public AbstractButton findCheckBoxWithLabel(String labelText) {
for (Component component : containedComponents) {
if (component instanceof JCheckBox) {
JCheckBox checkBox = (JCheckBox) component;
if (String.valueOf(checkBox.getText()).equals(labelText)) {
return checkBox;
}
}
}
throw new NoSuchElementException("No checkbox found with label " + labelText);
}
private java.util.List<Component> findAllComponentsIn(Container container) {
java.util.List<Component> components = new ArrayList<Component>();
for (Component component : container.getComponents()) {
components.add(component);
if (component instanceof Container) {
components.addAll(findAllComponentsIn((Container) component));
}
}
return components;
}
public AbstractButton findButtonWithName(String buttonName) {
return (AbstractButton) Iterables.find(containedComponents,
new ComponentClassAndNamePredicate(AbstractButton.class, buttonName));
}
public JLabel findLabelWithName(String labelName) {
return (JLabel) Iterables.find(containedComponents,
new ComponentClassAndNamePredicate(JLabel.class, labelName));
}
public JTextComponent findTextComponent(String componentName) {
JTextComponent component = (JTextComponent) Iterables.find(containedComponents,
new ComponentClassAndNamePredicate(JTextComponent.class, componentName));
if (component == null) {
throw new NoSuchElementException("No text component with name '" + componentName + "' found");
}
return component;
}
public void rebuildIndex() {
containedComponents = findAllComponentsIn(container);
}
public <T extends Component> T findComponent(String name, Class<? extends T> componentClass) {
return (T) Iterables.find(containedComponents, new ComponentClassAndNamePredicate(componentClass, name));
}
private class ComponentClassAndNamePredicate implements Predicate<Component> {
private Class<? extends Component> componentClass;
private String name;
private ComponentClassAndNamePredicate(Class<? extends Component> componentClass, String name) {
this.componentClass = componentClass;
this.name = name;
}
@Override
public boolean apply(@Nullable Component component) {
return component != null && componentClass.isAssignableFrom(component.getClass()) &&
StringUtils.equals(name, component.getName());
}
}
private class ButtonWithIconPredicate implements Predicate<Component> {
private String iconFile;
private ButtonWithIconPredicate(String iconFile) {
this.iconFile = iconFile;
}
@Override
public boolean apply(@Nullable Component component) {
if (!(component instanceof AbstractButton)) {
return false;
}
AbstractButton button = (AbstractButton) component;
return String.valueOf(button.getIcon()).endsWith("/" + iconFile);
}
}
}