blob: 4445d72b244c6ae99a8b61f055d5532c53f7af6a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 2018 xored software, Inc. and others.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* xored software, Inc. - initial API and Implementation (Alex Panchenko)
*******************************************************************************/
package org.eclipse.dltk.ui.infoviews;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.eclipse.core.runtime.Assert;
import org.eclipse.dltk.core.IModelElement;
import org.eclipse.dltk.internal.ui.DelegatedOpen;
import org.eclipse.dltk.ui.ScriptElementLabels;
import org.eclipse.dltk.utils.TextUtils;
import org.eclipse.osgi.util.NLS;
public class ModelElementArray {
private final Object[] elements;
/**
* @since 3.0
*/
public ModelElementArray(Object[] elements) {
Assert.isLegal(elements != null && elements.length > 1);
this.elements = elements;
}
/**
* @since 5.0
*/
public ModelElementArray(Collection<?> elements) {
Assert.isLegal(elements != null && elements.size() > 1);
this.elements = elements.toArray();
}
@Override
public boolean equals(Object obj) {
if (obj instanceof ModelElementArray) {
final ModelElementArray other = (ModelElementArray) obj;
return Arrays.equals(elements, other.elements);
}
return false;
}
/**
* @return the elements
* @since 3.0
*/
public Object[] getElements() {
return elements;
}
/**
* Checks that all elements are {@link IModelElement#METHOD} and have the
* same name.
*
* @return
*/
private boolean isSingleMethodName() {
if (elements[0] instanceof IModelElement) {
final IModelElement element0 = (IModelElement) elements[0];
if (element0.getElementType() == IModelElement.METHOD) {
final String methodName = element0.getElementName();
for (int i = 1; i < elements.length; ++i) {
if (!(elements[i] instanceof IModelElement))
return false;
final IModelElement element = (IModelElement) elements[i];
if (element.getElementType() != IModelElement.METHOD
|| !methodName.equals(element.getElementName())) {
return false;
}
}
return true;
}
}
return false;
}
private static final long NAME_FLAGS = ScriptElementLabels.T_FULLY_QUALIFIED
| ScriptElementLabels.T_CONTAINER_QUALIFIED;
/**
* @return
*/
public String getContentDescription() {
if (isSingleMethodName()) {
return NLS.bind(
InfoViewMessages.ContentDescription_multipleMethodsWithSameName,
((IModelElement) elements[0]).getElementName());
}
final ScriptElementLabels labels = ScriptElementLabels.getDefault();
final Set<String> names = new HashSet<>();
for (int i = 0; i < elements.length; ++i) {
if (elements[i] instanceof IModelElement) {
names.add(labels.getElementLabel((IModelElement) elements[i],
NAME_FLAGS));
} else if (elements[i] instanceof DelegatedOpen) {
names.add(((DelegatedOpen) elements[i]).getName());
}
}
return sortAndJoin(names, ", ");//$NON-NLS-1$
}
private String sortAndJoin(final Set<String> names,
final String separator) {
final List<String> nameList = new ArrayList<>(names);
Collections.sort(nameList);
return join(nameList, separator);
}
private static final long TOOLTIP_FLAGS = ScriptElementLabels.T_FULLY_QUALIFIED
| ScriptElementLabels.T_CONTAINER_QUALIFIED
| ScriptElementLabels.M_APP_RETURNTYPE
| ScriptElementLabels.F_APP_TYPE_SIGNATURE
| ScriptElementLabels.M_PARAMETER_TYPES
| ScriptElementLabels.M_PARAMETER_NAMES
| ScriptElementLabels.M_EXCEPTIONS
| ScriptElementLabels.F_PRE_TYPE_SIGNATURE
| ScriptElementLabels.T_TYPE_PARAMETERS
| ScriptElementLabels.APPEND_FILE
| ScriptElementLabels.CU_QUALIFIED;
/**
* @return
*/
public String getTitleTooltip() {
final ScriptElementLabels labels = ScriptElementLabels.getDefault();
final Set<String> names = new HashSet<>();
for (int i = 0; i < elements.length; ++i) {
if (elements[i] instanceof IModelElement) {
names.add(labels.getElementLabel((IModelElement) elements[i],
TOOLTIP_FLAGS));
} else if (elements[i] instanceof DelegatedOpen) {
names.add(((DelegatedOpen) elements[i]).getName());
}
}
return sortAndJoin(names, "\n");//$NON-NLS-1$
}
/**
* <p>
* Joins the elements of the provided <code>Collection</code> into a single
* String containing the provided elements.
* </p>
*
* <p>
* No delimiter is added before or after the list. A <code>null</code>
* separator is the same as an empty String ("").
* </p>
*
* @param collection
* the <code>Collection</code> of values to join
* together, may be null
* @param separator
* the separator character to use, null treated as ""
* @return the joined String, <code>null</code> if null collection input
*/
private static String join(Collection<?> collection, String separator) {
return TextUtils.join(collection, separator);
}
}