/******************************************************************************* * Copyright (c) 2008 Ketan Padegaonkar and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Ketan Padegaonkar - initial API and implementation *******************************************************************************/ package org.eclipse.swtbot.swt.finder; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences; import org.eclipse.swtbot.swt.finder.utils.StringUtils; /** * @since 2.0 */ public enum ReferenceBy { TEXT(100) { public boolean isCompatibleWith(ReferenceBy other) { return other != LABEL && other != TOOLTIP && other != MNEMONIC && other != MESSAGE; } public String matcherMethod() { return "withText(" + argumentName() + ")"; //$NON-NLS-1$ //$NON-NLS-2$ } public String methodNameSuffix() { return ""; //$NON-NLS-1$ } }, MNEMONIC(100) { public boolean isCompatibleWith(ReferenceBy other) { return other != LABEL && other != TOOLTIP && other != TEXT && other != MESSAGE; } public String matcherMethod() { return "withMnemonic(" + argumentName() + ")"; //$NON-NLS-1$ //$NON-NLS-2$ } public String methodNameSuffix() { return ""; //$NON-NLS-1$ } public String argumentName() { return "mnemonicText"; //$NON-NLS-1$ } }, LABEL(100) { public boolean isCompatibleWith(ReferenceBy other) { return other != TEXT && other != TOOLTIP && other != MNEMONIC && other != MESSAGE; } public String matcherMethod() { return "withLabel(" + argumentName() + ")"; //$NON-NLS-1$ //$NON-NLS-2$ } }, TOOLTIP(90) { public boolean isCompatibleWith(ReferenceBy other) { return other != TEXT && other != LABEL && other != MNEMONIC && other != MESSAGE; } public String matcherMethod() { return "withTooltip(" + argumentName() + ")"; //$NON-NLS-1$ //$NON-NLS-2$ } }, MESSAGE(90) { public boolean isCompatibleWith(ReferenceBy other) { return other != TEXT && other != LABEL && other != MNEMONIC && other != TOOLTIP && other != IN_GROUP; } public String matcherMethod() { return "withMessage(" + argumentName() + ")"; //$NON-NLS-1$ //$NON-NLS-2$ } }, ID_KEY_VALUE(100) { public boolean isCompatibleWith(ReferenceBy other) { return false; } public String methodArgument() { return "String key, String value"; //$NON-NLS-1$ } public String matcherMethod() { return "withId(key, value)"; //$NON-NLS-1$ } public String paramJavaDoc() { return "@param key the key set on the widget.\n" + "@param value the value for the key.\n"; //$NON-NLS-1$ //$NON-NLS-2$ } public String methodNameSuffix() { return "WithId"; //$NON-NLS-1$ } public String argumentName() { return "key/value"; //$NON-NLS-1$ } }, ID_VALUE(100) { public boolean isCompatibleWith(ReferenceBy other) { return false; } public String methodArgument() { return "String value"; //$NON-NLS-1$ } public String matcherMethod() { return "withId(value)"; //$NON-NLS-1$ } public String paramJavaDoc() { return "@param value the value for the key {@link " + SWTBotPreferences.class.getName() + "#DEFAULT_KEY}.\n"; //$NON-NLS-1$ //$NON-NLS-2$ } public String methodNameSuffix() { return "WithId"; //$NON-NLS-1$ } public String argumentName() { return "value"; //$NON-NLS-1$ } }, NONE(100) { public boolean isCompatibleWith(ReferenceBy other) { return false; } public String methodArgument() { return ""; //$NON-NLS-1$ } public String methodNameSuffix() { return ""; //$NON-NLS-1$ } public String matcherMethod() { return ""; //$NON-NLS-1$ } public String paramJavaDoc() { return ""; //$NON-NLS-1$ } }, IN_GROUP(80) { public String methodNameSuffix() { return "InGroup"; //$NON-NLS-1$ } public String matcherMethod() { return "inGroup(inGroup)"; //$NON-NLS-1$ } }; private final int priority; private ReferenceBy(int priority) { this.priority = priority; } public boolean isCompatibleWith(ReferenceBy other) { return true; } protected boolean canExistByItself() { return true; } public String describeJavaDoc() { return "with the specified <code>" + argumentName() + "</code>"; //$NON-NLS-1$ //$NON-NLS-2$ } public String methodArgument() { return "String " + argumentName(); //$NON-NLS-1$ } public String argumentName() { return StringUtils.toCamelCase(name().toLowerCase()); } public String methodNameSuffix() { return "With" + StringUtils.capitalize(name().toLowerCase()); //$NON-NLS-1$ } public abstract String matcherMethod(); protected static Comparator<ReferenceBy> comparator() { return new Comparator<ReferenceBy>() { public int compare(ReferenceBy o1, ReferenceBy o2) { return o2.priority - o1.priority; } }; } /** * @param references the references * @return all possible combinations of the specified combinations */ public static List<List<ReferenceBy>> getCombinations(ReferenceBy... references) { return sort(filter(new CombinationGenerator<ReferenceBy>(references.length, references))); } private static List<List<ReferenceBy>> sort(List<List<ReferenceBy>> combinations) { for (List<ReferenceBy> list : combinations) { Collections.sort(list, ReferenceBy.comparator()); } return combinations; } private static List<List<ReferenceBy>> filter(CombinationGenerator<ReferenceBy> uptoCombinationGenerator) { ArrayList<List<ReferenceBy>> result = new ArrayList<List<ReferenceBy>>(); for (List<ReferenceBy> list : uptoCombinationGenerator) { if (list.size() == 1) { if (list.get(0).canExistByItself()) result.add(list); } else if (isCompatible(list)) result.add(list); } return result; } private static boolean isCompatible(List<ReferenceBy> list) { for (ReferenceBy aReference : list) { for (ReferenceBy otherReference : list) { if (aReference != otherReference) if (!aReference.isCompatibleWith(otherReference)) return false; } } return true; } public String javadoc() { return "the " + argumentName() + " on the widget."; //$NON-NLS-1$ //$NON-NLS-2$ } public String paramJavaDoc() { return "@param " + argumentName() + " " + javadoc() + "\n"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ } }