blob: 773dd58bf094970ff581f8e34bb1c239182f79e2 [file] [log] [blame]
/*=============================================================================#
# Copyright (c) 2008, 2020 Stephan Wahlbrink and others.
#
# This program and the accompanying materials are made available under the
# terms of the Eclipse Public License 2.0 which is available at
# https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
# which is available at https://www.apache.org/licenses/LICENSE-2.0.
#
# SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
#
# Contributors:
# Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
#=============================================================================*/
package org.eclipse.statet.ltk.ui.sourceediting.assist;
import java.util.Objects;
import org.eclipse.jface.text.contentassist.BoldStylerProvider;
import org.eclipse.jface.text.contentassist.ICompletionProposalExtension3;
import org.eclipse.jface.text.contentassist.ICompletionProposalExtension6;
import org.eclipse.jface.viewers.StyledString;
import org.eclipse.swt.graphics.Image;
import org.eclipse.statet.jcommons.lang.NonNullByDefault;
import org.eclipse.statet.jcommons.lang.Nullable;
import org.eclipse.statet.ecommons.ui.viewers.ViewerLabelUtils;
import org.eclipse.statet.ltk.core.ElementName;
import org.eclipse.statet.ltk.model.core.elements.IModelElement;
import org.eclipse.statet.ltk.ui.ElementLabelProvider;
/**
* Proposal completing a given {@link ElementName} of a element.
*/
@NonNullByDefault
public abstract class ElementNameCompletionProposal<
TContext extends AssistInvocationContext, TElement extends IModelElement>
extends SourceProposal<TContext>
implements ICompletionProposalExtension3, ICompletionProposalExtension6 {
private final ElementName replacementName;
private final TElement element;
private final ElementLabelProvider labelProvider;
public ElementNameCompletionProposal(final ProposalParameters<? extends TContext> parameters,
final ElementName replacementName, final TElement element,
final ElementLabelProvider labelProvider) {
super(parameters);
this.replacementName= replacementName;
this.element= element;
this.labelProvider= labelProvider;
}
public final TElement getElement() {
return this.element;
}
public ElementName getReplacementName() {
return this.replacementName;
}
@Override
protected String getName() {
return getReplacementName().getDisplayName();
}
@Override
protected String getValidationName() {
return getReplacementName().getSegmentName();
}
@Override
public String getSortingString() {
return getReplacementName().getSegmentName();
}
//-- Item Label --
protected final ElementLabelProvider getLabelProvider() {
return this.labelProvider;
}
@Override
public String getDisplayString() {
return (this.element != null) ?
this.labelProvider.getText(this.element) :
getReplacementName().getDisplayName();
}
@Override
public StyledString computeStyledText() {
return (this.element != null) ?
this.labelProvider.getStyledText(this.element) :
new StyledString(getDisplayString());
}
@Override
protected void styleMatchingRegions(final StyledString styledText,
final int matchRule, int[] matchingRegions,
final BoldStylerProvider boldStylerProvider) {
matchingRegions= (this.element != null) ?
this.labelProvider.getStyledTextRegions(this.element, 0, matchingRegions) :
getReplacementName().correctDisplayNameRegions(matchingRegions, 0);
ViewerLabelUtils.setStyle(styledText, matchingRegions, boldStylerProvider.getBoldStyler());
}
@Override
public Image getImage() {
return (this.element != null) ?
this.labelProvider.getImage(this.element) :
super.getImage();
}
@Override
public int hashCode() {
return getClass().hashCode() * Objects.hashCode(getReplacementName());
}
@Override
public boolean equals(final @Nullable Object obj) {
if (this == obj) {
return true;
}
if (obj != null && getClass() == obj.getClass()) {
final ElementNameCompletionProposal<?, ?> other= (ElementNameCompletionProposal<?, ?>) obj;
return (Objects.equals(getReplacementName(), other.getReplacementName())
&& Objects.equals(getElement(), other.getElement()) );
}
return false;
}
}